index.js 5.2 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742367433674436745367463674736748367493675036751367523675336754367553675636757367583675936760367613676236763367643676536766367673676836769367703677136772367733677436775367763677736778367793678036781367823678336784367853678636787367883678936790367913679236793367943679536796367973679836799368003680136802368033680436805368063680736808368093681036811368123681336814368153681636817368183681936820368213682236823368243682536826368273682836829368303683136832368333683436835368363683736838368393684036841368423684336844368453684636847368483684936850368513685236853368543685536856368573685836859368603686136862368633686436865368663686736868368693687036871368723687336874368753687636877368783687936880368813688236883368843688536886368873688836889368903689136892368933689436895368963689736898368993690036901369023690336904369053690636907369083690936910369113691236913369143691536916369173691836919369203692136922369233692436925369263692736928369293693036931369323693336934369353693636937369383693936940369413694236943369443694536946369473694836949369503695136952369533695436955369563695736958369593696036961369623696336964369653696636967369683696936970369713697236973369743697536976369773697836979369803698136982369833698436985369863698736988369893699036991369923699336994369953699636997369983699937000370013700237003370043700537006370073700837009370103701137012370133701437015370163701737018370193702037021370223702337024370253702637027370283702937030370313703237033370343703537036370373703837039370403704137042370433704437045370463704737048370493705037051370523705337054370553705637057370583705937060370613706237063370643706537066370673706837069370703707137072370733707437075370763707737078370793708037081370823708337084370853708637087370883708937090370913709237093370943709537096370973709837099371003710137102371033710437105371063710737108371093711037111371123711337114371153711637117371183711937120371213712237123371243712537126371273712837129371303713137132371333713437135371363713737138371393714037141371423714337144371453714637147371483714937150371513715237153371543715537156371573715837159371603716137162371633716437165371663716737168371693717037171371723717337174371753717637177371783717937180371813718237183371843718537186371873718837189371903719137192371933719437195371963719737198371993720037201372023720337204372053720637207372083720937210372113721237213372143721537216372173721837219372203722137222372233722437225372263722737228372293723037231372323723337234372353723637237372383723937240372413724237243372443724537246372473724837249372503725137252372533725437255372563725737258372593726037261372623726337264372653726637267372683726937270372713727237273372743727537276372773727837279372803728137282372833728437285372863728737288372893729037291372923729337294372953729637297372983729937300373013730237303373043730537306373073730837309373103731137312373133731437315373163731737318373193732037321373223732337324373253732637327373283732937330373313733237333373343733537336373373733837339373403734137342373433734437345373463734737348373493735037351373523735337354373553735637357373583735937360373613736237363373643736537366373673736837369373703737137372373733737437375373763737737378373793738037381373823738337384373853738637387373883738937390373913739237393373943739537396373973739837399374003740137402374033740437405374063740737408374093741037411374123741337414374153741637417374183741937420374213742237423374243742537426374273742837429374303743137432374333743437435374363743737438374393744037441374423744337444374453744637447374483744937450374513745237453374543745537456374573745837459374603746137462374633746437465374663746737468374693747037471374723747337474374753747637477374783747937480374813748237483374843748537486374873748837489374903749137492374933749437495374963749737498374993750037501375023750337504375053750637507375083750937510375113751237513375143751537516375173751837519375203752137522375233752437525375263752737528375293753037531375323753337534375353753637537375383753937540375413754237543375443754537546375473754837549375503755137552375533755437555375563755737558375593756037561375623756337564375653756637567375683756937570375713757237573375743757537576375773757837579375803758137582375833758437585375863758737588375893759037591375923759337594375953759637597375983759937600376013760237603376043760537606376073760837609376103761137612376133761437615376163761737618376193762037621376223762337624376253762637627376283762937630376313763237633376343763537636376373763837639376403764137642376433764437645376463764737648376493765037651376523765337654376553765637657376583765937660376613766237663376643766537666376673766837669376703767137672376733767437675376763767737678376793768037681376823768337684376853768637687376883768937690376913769237693376943769537696376973769837699377003770137702377033770437705377063770737708377093771037711377123771337714377153771637717377183771937720377213772237723377243772537726377273772837729377303773137732377333773437735377363773737738377393774037741377423774337744377453774637747377483774937750377513775237753377543775537756377573775837759377603776137762377633776437765377663776737768377693777037771377723777337774377753777637777377783777937780377813778237783377843778537786377873778837789377903779137792377933779437795377963779737798377993780037801378023780337804378053780637807378083780937810378113781237813378143781537816378173781837819378203782137822378233782437825378263782737828378293783037831378323783337834378353783637837378383783937840378413784237843378443784537846378473784837849378503785137852378533785437855378563785737858378593786037861378623786337864378653786637867378683786937870378713787237873378743787537876378773787837879378803788137882378833788437885378863788737888378893789037891378923789337894378953789637897378983789937900379013790237903379043790537906379073790837909379103791137912379133791437915379163791737918379193792037921379223792337924379253792637927379283792937930379313793237933379343793537936379373793837939379403794137942379433794437945379463794737948379493795037951379523795337954379553795637957379583795937960379613796237963379643796537966379673796837969379703797137972379733797437975379763797737978379793798037981379823798337984379853798637987379883798937990379913799237993379943799537996379973799837999380003800138002380033800438005380063800738008380093801038011380123801338014380153801638017380183801938020380213802238023380243802538026380273802838029380303803138032380333803438035380363803738038380393804038041380423804338044380453804638047380483804938050380513805238053380543805538056380573805838059380603806138062380633806438065380663806738068380693807038071380723807338074380753807638077380783807938080380813808238083380843808538086380873808838089380903809138092380933809438095380963809738098380993810038101381023810338104381053810638107381083810938110381113811238113381143811538116381173811838119381203812138122381233812438125381263812738128381293813038131381323813338134381353813638137381383813938140381413814238143381443814538146381473814838149381503815138152381533815438155381563815738158381593816038161381623816338164381653816638167381683816938170381713817238173381743817538176381773817838179381803818138182381833818438185381863818738188381893819038191381923819338194381953819638197381983819938200382013820238203382043820538206382073820838209382103821138212382133821438215382163821738218382193822038221382223822338224382253822638227382283822938230382313823238233382343823538236382373823838239382403824138242382433824438245382463824738248382493825038251382523825338254382553825638257382583825938260382613826238263382643826538266382673826838269382703827138272382733827438275382763827738278382793828038281382823828338284382853828638287382883828938290382913829238293382943829538296382973829838299383003830138302383033830438305383063830738308383093831038311383123831338314383153831638317383183831938320383213832238323383243832538326383273832838329383303833138332383333833438335383363833738338383393834038341383423834338344383453834638347383483834938350383513835238353383543835538356383573835838359383603836138362383633836438365383663836738368383693837038371383723837338374383753837638377383783837938380383813838238383383843838538386383873838838389383903839138392383933839438395383963839738398383993840038401384023840338404384053840638407384083840938410384113841238413384143841538416384173841838419384203842138422384233842438425384263842738428384293843038431384323843338434384353843638437384383843938440384413844238443384443844538446384473844838449384503845138452384533845438455384563845738458384593846038461384623846338464384653846638467384683846938470384713847238473384743847538476384773847838479384803848138482384833848438485384863848738488384893849038491384923849338494384953849638497384983849938500385013850238503385043850538506385073850838509385103851138512385133851438515385163851738518385193852038521385223852338524385253852638527385283852938530385313853238533385343853538536385373853838539385403854138542385433854438545385463854738548385493855038551385523855338554385553855638557385583855938560385613856238563385643856538566385673856838569385703857138572385733857438575385763857738578385793858038581385823858338584385853858638587385883858938590385913859238593385943859538596385973859838599386003860138602386033860438605386063860738608386093861038611386123861338614386153861638617386183861938620386213862238623386243862538626386273862838629386303863138632386333863438635386363863738638386393864038641386423864338644386453864638647386483864938650386513865238653386543865538656386573865838659386603866138662386633866438665386663866738668386693867038671386723867338674386753867638677386783867938680386813868238683386843868538686386873868838689386903869138692386933869438695386963869738698386993870038701387023870338704387053870638707387083870938710387113871238713387143871538716387173871838719387203872138722387233872438725387263872738728387293873038731387323873338734387353873638737387383873938740387413874238743387443874538746387473874838749387503875138752387533875438755387563875738758387593876038761387623876338764387653876638767387683876938770387713877238773387743877538776387773877838779387803878138782387833878438785387863878738788387893879038791387923879338794387953879638797387983879938800388013880238803388043880538806388073880838809388103881138812388133881438815388163881738818388193882038821388223882338824388253882638827388283882938830388313883238833388343883538836388373883838839388403884138842388433884438845388463884738848388493885038851388523885338854388553885638857388583885938860388613886238863388643886538866388673886838869388703887138872388733887438875388763887738878388793888038881388823888338884388853888638887388883888938890388913889238893388943889538896388973889838899389003890138902389033890438905389063890738908389093891038911389123891338914389153891638917389183891938920389213892238923389243892538926389273892838929389303893138932389333893438935389363893738938389393894038941389423894338944389453894638947389483894938950389513895238953389543895538956389573895838959389603896138962389633896438965389663896738968389693897038971389723897338974389753897638977389783897938980389813898238983389843898538986389873898838989389903899138992389933899438995389963899738998389993900039001390023900339004390053900639007390083900939010390113901239013390143901539016390173901839019390203902139022390233902439025390263902739028390293903039031390323903339034390353903639037390383903939040390413904239043390443904539046390473904839049390503905139052390533905439055390563905739058390593906039061390623906339064390653906639067390683906939070390713907239073390743907539076390773907839079390803908139082390833908439085390863908739088390893909039091390923909339094390953909639097390983909939100391013910239103391043910539106391073910839109391103911139112391133911439115391163911739118391193912039121391223912339124391253912639127391283912939130391313913239133391343913539136391373913839139391403914139142391433914439145391463914739148391493915039151391523915339154391553915639157391583915939160391613916239163391643916539166391673916839169391703917139172391733917439175391763917739178391793918039181391823918339184391853918639187391883918939190391913919239193391943919539196391973919839199392003920139202392033920439205392063920739208392093921039211392123921339214392153921639217392183921939220392213922239223392243922539226392273922839229392303923139232392333923439235392363923739238392393924039241392423924339244392453924639247392483924939250392513925239253392543925539256392573925839259392603926139262392633926439265392663926739268392693927039271392723927339274392753927639277392783927939280392813928239283392843928539286392873928839289392903929139292392933929439295392963929739298392993930039301393023930339304393053930639307393083930939310393113931239313393143931539316393173931839319393203932139322393233932439325393263932739328393293933039331393323933339334393353933639337393383933939340393413934239343393443934539346393473934839349393503935139352393533935439355393563935739358393593936039361393623936339364393653936639367393683936939370393713937239373393743937539376393773937839379393803938139382393833938439385393863938739388393893939039391393923939339394393953939639397393983939939400394013940239403394043940539406394073940839409394103941139412394133941439415394163941739418394193942039421394223942339424394253942639427394283942939430394313943239433394343943539436394373943839439394403944139442394433944439445394463944739448394493945039451394523945339454394553945639457394583945939460394613946239463394643946539466394673946839469394703947139472394733947439475394763947739478394793948039481394823948339484394853948639487394883948939490394913949239493394943949539496394973949839499395003950139502395033950439505395063950739508395093951039511395123951339514395153951639517395183951939520395213952239523395243952539526395273952839529395303953139532395333953439535395363953739538395393954039541395423954339544395453954639547395483954939550395513955239553395543955539556395573955839559395603956139562395633956439565395663956739568395693957039571395723957339574395753957639577395783957939580395813958239583395843958539586395873958839589395903959139592395933959439595395963959739598395993960039601396023960339604396053960639607396083960939610396113961239613396143961539616396173961839619396203962139622396233962439625396263962739628396293963039631396323963339634396353963639637396383963939640396413964239643396443964539646396473964839649396503965139652396533965439655396563965739658396593966039661396623966339664396653966639667396683966939670396713967239673396743967539676396773967839679396803968139682396833968439685396863968739688396893969039691396923969339694396953969639697396983969939700397013970239703397043970539706397073970839709397103971139712397133971439715397163971739718397193972039721397223972339724397253972639727397283972939730397313973239733397343973539736397373973839739397403974139742397433974439745397463974739748397493975039751397523975339754397553975639757397583975939760397613976239763397643976539766397673976839769397703977139772397733977439775397763977739778397793978039781397823978339784397853978639787397883978939790397913979239793397943979539796397973979839799398003980139802398033980439805398063980739808398093981039811398123981339814398153981639817398183981939820398213982239823398243982539826398273982839829398303983139832398333983439835398363983739838398393984039841398423984339844398453984639847398483984939850398513985239853398543985539856398573985839859398603986139862398633986439865398663986739868398693987039871398723987339874398753987639877398783987939880398813988239883398843988539886398873988839889398903989139892398933989439895398963989739898398993990039901399023990339904399053990639907399083990939910399113991239913399143991539916399173991839919399203992139922399233992439925399263992739928399293993039931399323993339934399353993639937399383993939940399413994239943399443994539946399473994839949399503995139952399533995439955399563995739958399593996039961399623996339964399653996639967399683996939970399713997239973399743997539976399773997839979399803998139982399833998439985399863998739988399893999039991399923999339994399953999639997399983999940000400014000240003400044000540006400074000840009400104001140012400134001440015400164001740018400194002040021400224002340024400254002640027400284002940030400314003240033400344003540036400374003840039400404004140042400434004440045400464004740048400494005040051400524005340054400554005640057400584005940060400614006240063400644006540066400674006840069400704007140072400734007440075400764007740078400794008040081400824008340084400854008640087400884008940090400914009240093400944009540096400974009840099401004010140102401034010440105401064010740108401094011040111401124011340114401154011640117401184011940120401214012240123401244012540126401274012840129401304013140132401334013440135401364013740138401394014040141401424014340144401454014640147401484014940150401514015240153401544015540156401574015840159401604016140162401634016440165401664016740168401694017040171401724017340174401754017640177401784017940180401814018240183401844018540186401874018840189401904019140192401934019440195401964019740198401994020040201402024020340204402054020640207402084020940210402114021240213402144021540216402174021840219402204022140222402234022440225402264022740228402294023040231402324023340234402354023640237402384023940240402414024240243402444024540246402474024840249402504025140252402534025440255402564025740258402594026040261402624026340264402654026640267402684026940270402714027240273402744027540276402774027840279402804028140282402834028440285402864028740288402894029040291402924029340294402954029640297402984029940300403014030240303403044030540306403074030840309403104031140312403134031440315403164031740318403194032040321403224032340324403254032640327403284032940330403314033240333403344033540336403374033840339403404034140342403434034440345403464034740348403494035040351403524035340354403554035640357403584035940360403614036240363403644036540366403674036840369403704037140372403734037440375403764037740378403794038040381403824038340384403854038640387403884038940390403914039240393403944039540396403974039840399404004040140402404034040440405404064040740408404094041040411404124041340414404154041640417404184041940420404214042240423404244042540426404274042840429404304043140432404334043440435404364043740438404394044040441404424044340444404454044640447404484044940450404514045240453404544045540456404574045840459404604046140462404634046440465404664046740468404694047040471404724047340474404754047640477404784047940480404814048240483404844048540486404874048840489404904049140492404934049440495404964049740498404994050040501405024050340504405054050640507405084050940510405114051240513405144051540516405174051840519405204052140522405234052440525405264052740528405294053040531405324053340534405354053640537405384053940540405414054240543405444054540546405474054840549405504055140552405534055440555405564055740558405594056040561405624056340564405654056640567405684056940570405714057240573405744057540576405774057840579405804058140582405834058440585405864058740588405894059040591405924059340594405954059640597405984059940600406014060240603406044060540606406074060840609406104061140612406134061440615406164061740618406194062040621406224062340624406254062640627406284062940630406314063240633406344063540636406374063840639406404064140642406434064440645406464064740648406494065040651406524065340654406554065640657406584065940660406614066240663406644066540666406674066840669406704067140672406734067440675406764067740678406794068040681406824068340684406854068640687406884068940690406914069240693406944069540696406974069840699407004070140702407034070440705407064070740708407094071040711407124071340714407154071640717407184071940720407214072240723407244072540726407274072840729407304073140732407334073440735407364073740738407394074040741407424074340744407454074640747407484074940750407514075240753407544075540756407574075840759407604076140762407634076440765407664076740768407694077040771407724077340774407754077640777407784077940780407814078240783407844078540786407874078840789407904079140792407934079440795407964079740798407994080040801408024080340804408054080640807408084080940810408114081240813408144081540816408174081840819408204082140822408234082440825408264082740828408294083040831408324083340834408354083640837408384083940840408414084240843408444084540846408474084840849408504085140852408534085440855408564085740858408594086040861408624086340864408654086640867408684086940870408714087240873408744087540876408774087840879408804088140882408834088440885408864088740888408894089040891408924089340894408954089640897408984089940900409014090240903409044090540906409074090840909409104091140912409134091440915409164091740918409194092040921409224092340924409254092640927409284092940930409314093240933409344093540936409374093840939409404094140942409434094440945409464094740948409494095040951409524095340954409554095640957409584095940960409614096240963409644096540966409674096840969409704097140972409734097440975409764097740978409794098040981409824098340984409854098640987409884098940990409914099240993409944099540996409974099840999410004100141002410034100441005410064100741008410094101041011410124101341014410154101641017410184101941020410214102241023410244102541026410274102841029410304103141032410334103441035410364103741038410394104041041410424104341044410454104641047410484104941050410514105241053410544105541056410574105841059410604106141062410634106441065410664106741068410694107041071410724107341074410754107641077410784107941080410814108241083410844108541086410874108841089410904109141092410934109441095410964109741098410994110041101411024110341104411054110641107411084110941110411114111241113411144111541116411174111841119411204112141122411234112441125411264112741128411294113041131411324113341134411354113641137411384113941140411414114241143411444114541146411474114841149411504115141152411534115441155411564115741158411594116041161411624116341164411654116641167411684116941170411714117241173411744117541176411774117841179411804118141182411834118441185411864118741188411894119041191411924119341194411954119641197411984119941200412014120241203412044120541206412074120841209412104121141212412134121441215412164121741218412194122041221412224122341224412254122641227412284122941230412314123241233412344123541236412374123841239412404124141242412434124441245412464124741248412494125041251412524125341254412554125641257412584125941260412614126241263412644126541266412674126841269412704127141272412734127441275412764127741278412794128041281412824128341284412854128641287412884128941290412914129241293412944129541296412974129841299413004130141302413034130441305413064130741308413094131041311413124131341314413154131641317413184131941320413214132241323413244132541326413274132841329413304133141332413334133441335413364133741338413394134041341413424134341344413454134641347413484134941350413514135241353413544135541356413574135841359413604136141362413634136441365413664136741368413694137041371413724137341374413754137641377413784137941380413814138241383413844138541386413874138841389413904139141392413934139441395413964139741398413994140041401414024140341404414054140641407414084140941410414114141241413414144141541416414174141841419414204142141422414234142441425414264142741428414294143041431414324143341434414354143641437414384143941440414414144241443414444144541446414474144841449414504145141452414534145441455414564145741458414594146041461414624146341464414654146641467414684146941470414714147241473414744147541476414774147841479414804148141482414834148441485414864148741488414894149041491414924149341494414954149641497414984149941500415014150241503415044150541506415074150841509415104151141512415134151441515415164151741518415194152041521415224152341524415254152641527415284152941530415314153241533415344153541536415374153841539415404154141542415434154441545415464154741548415494155041551415524155341554415554155641557415584155941560415614156241563415644156541566415674156841569415704157141572415734157441575415764157741578415794158041581415824158341584415854158641587415884158941590415914159241593415944159541596415974159841599416004160141602416034160441605416064160741608416094161041611416124161341614416154161641617416184161941620416214162241623416244162541626416274162841629416304163141632416334163441635416364163741638416394164041641416424164341644416454164641647416484164941650416514165241653416544165541656416574165841659416604166141662416634166441665416664166741668416694167041671416724167341674416754167641677416784167941680416814168241683416844168541686416874168841689416904169141692416934169441695416964169741698416994170041701417024170341704417054170641707417084170941710417114171241713417144171541716417174171841719417204172141722417234172441725417264172741728417294173041731417324173341734417354173641737417384173941740417414174241743417444174541746417474174841749417504175141752417534175441755417564175741758417594176041761417624176341764417654176641767417684176941770417714177241773417744177541776417774177841779417804178141782417834178441785417864178741788417894179041791417924179341794417954179641797417984179941800418014180241803418044180541806418074180841809418104181141812418134181441815418164181741818418194182041821418224182341824418254182641827418284182941830418314183241833418344183541836418374183841839418404184141842418434184441845418464184741848418494185041851418524185341854418554185641857418584185941860418614186241863418644186541866418674186841869418704187141872418734187441875418764187741878418794188041881418824188341884418854188641887418884188941890418914189241893418944189541896418974189841899419004190141902419034190441905419064190741908419094191041911419124191341914419154191641917419184191941920419214192241923419244192541926419274192841929419304193141932419334193441935419364193741938419394194041941419424194341944419454194641947419484194941950419514195241953419544195541956419574195841959419604196141962419634196441965419664196741968419694197041971419724197341974419754197641977419784197941980419814198241983419844198541986419874198841989419904199141992419934199441995419964199741998419994200042001420024200342004420054200642007420084200942010420114201242013420144201542016420174201842019420204202142022420234202442025420264202742028420294203042031420324203342034420354203642037420384203942040420414204242043420444204542046420474204842049420504205142052420534205442055420564205742058420594206042061420624206342064420654206642067420684206942070420714207242073420744207542076420774207842079420804208142082420834208442085420864208742088420894209042091420924209342094420954209642097420984209942100421014210242103421044210542106421074210842109421104211142112421134211442115421164211742118421194212042121421224212342124421254212642127421284212942130421314213242133421344213542136421374213842139421404214142142421434214442145421464214742148421494215042151421524215342154421554215642157421584215942160421614216242163421644216542166421674216842169421704217142172421734217442175421764217742178421794218042181421824218342184421854218642187421884218942190421914219242193421944219542196421974219842199422004220142202422034220442205422064220742208422094221042211422124221342214422154221642217422184221942220422214222242223422244222542226422274222842229422304223142232422334223442235422364223742238422394224042241422424224342244422454224642247422484224942250422514225242253422544225542256422574225842259422604226142262422634226442265422664226742268422694227042271422724227342274422754227642277422784227942280422814228242283422844228542286422874228842289422904229142292422934229442295422964229742298422994230042301423024230342304423054230642307423084230942310423114231242313423144231542316423174231842319423204232142322423234232442325423264232742328423294233042331423324233342334423354233642337423384233942340423414234242343423444234542346423474234842349423504235142352423534235442355423564235742358423594236042361423624236342364423654236642367423684236942370423714237242373423744237542376423774237842379423804238142382423834238442385423864238742388423894239042391423924239342394423954239642397423984239942400424014240242403424044240542406424074240842409424104241142412424134241442415424164241742418424194242042421424224242342424424254242642427424284242942430424314243242433424344243542436424374243842439424404244142442424434244442445424464244742448424494245042451424524245342454424554245642457424584245942460424614246242463424644246542466424674246842469424704247142472424734247442475424764247742478424794248042481424824248342484424854248642487424884248942490424914249242493424944249542496424974249842499425004250142502425034250442505425064250742508425094251042511425124251342514425154251642517425184251942520425214252242523425244252542526425274252842529425304253142532425334253442535425364253742538425394254042541425424254342544425454254642547425484254942550425514255242553425544255542556425574255842559425604256142562425634256442565425664256742568425694257042571425724257342574425754257642577425784257942580425814258242583425844258542586425874258842589425904259142592425934259442595425964259742598425994260042601426024260342604426054260642607426084260942610426114261242613426144261542616426174261842619426204262142622426234262442625426264262742628426294263042631426324263342634426354263642637426384263942640426414264242643426444264542646426474264842649426504265142652426534265442655426564265742658426594266042661426624266342664426654266642667426684266942670426714267242673426744267542676426774267842679426804268142682426834268442685426864268742688426894269042691426924269342694426954269642697426984269942700427014270242703427044270542706427074270842709427104271142712427134271442715427164271742718427194272042721427224272342724427254272642727427284272942730427314273242733427344273542736427374273842739427404274142742427434274442745427464274742748427494275042751427524275342754427554275642757427584275942760427614276242763427644276542766427674276842769427704277142772427734277442775427764277742778427794278042781427824278342784427854278642787427884278942790427914279242793427944279542796427974279842799428004280142802428034280442805428064280742808428094281042811428124281342814428154281642817428184281942820428214282242823428244282542826428274282842829428304283142832428334283442835428364283742838428394284042841428424284342844428454284642847428484284942850428514285242853428544285542856428574285842859428604286142862428634286442865428664286742868428694287042871428724287342874428754287642877428784287942880428814288242883428844288542886428874288842889428904289142892428934289442895428964289742898428994290042901429024290342904429054290642907429084290942910429114291242913429144291542916429174291842919429204292142922429234292442925429264292742928429294293042931429324293342934429354293642937429384293942940429414294242943429444294542946429474294842949429504295142952429534295442955429564295742958429594296042961429624296342964429654296642967429684296942970429714297242973429744297542976429774297842979429804298142982429834298442985429864298742988429894299042991429924299342994429954299642997429984299943000430014300243003430044300543006430074300843009430104301143012430134301443015430164301743018430194302043021430224302343024430254302643027430284302943030430314303243033430344303543036430374303843039430404304143042430434304443045430464304743048430494305043051430524305343054430554305643057430584305943060430614306243063430644306543066430674306843069430704307143072430734307443075430764307743078430794308043081430824308343084430854308643087430884308943090430914309243093430944309543096430974309843099431004310143102431034310443105431064310743108431094311043111431124311343114431154311643117431184311943120431214312243123431244312543126431274312843129431304313143132431334313443135431364313743138431394314043141431424314343144431454314643147431484314943150431514315243153431544315543156431574315843159431604316143162431634316443165431664316743168431694317043171431724317343174431754317643177431784317943180431814318243183431844318543186431874318843189431904319143192431934319443195431964319743198431994320043201432024320343204432054320643207432084320943210432114321243213432144321543216432174321843219432204322143222432234322443225432264322743228432294323043231432324323343234432354323643237432384323943240432414324243243432444324543246432474324843249432504325143252432534325443255432564325743258432594326043261432624326343264432654326643267432684326943270432714327243273432744327543276432774327843279432804328143282432834328443285432864328743288432894329043291432924329343294432954329643297432984329943300433014330243303433044330543306433074330843309433104331143312433134331443315433164331743318433194332043321433224332343324433254332643327433284332943330433314333243333433344333543336433374333843339433404334143342433434334443345433464334743348433494335043351433524335343354433554335643357433584335943360433614336243363433644336543366433674336843369433704337143372433734337443375433764337743378433794338043381433824338343384433854338643387433884338943390433914339243393433944339543396433974339843399434004340143402434034340443405434064340743408434094341043411434124341343414434154341643417434184341943420434214342243423434244342543426434274342843429434304343143432434334343443435434364343743438434394344043441434424344343444434454344643447434484344943450434514345243453434544345543456434574345843459434604346143462434634346443465434664346743468434694347043471434724347343474434754347643477434784347943480434814348243483434844348543486434874348843489434904349143492434934349443495434964349743498434994350043501435024350343504435054350643507435084350943510435114351243513435144351543516435174351843519435204352143522435234352443525435264352743528435294353043531435324353343534435354353643537435384353943540435414354243543435444354543546435474354843549435504355143552435534355443555435564355743558435594356043561435624356343564435654356643567435684356943570435714357243573435744357543576435774357843579435804358143582435834358443585435864358743588435894359043591435924359343594435954359643597435984359943600436014360243603436044360543606436074360843609436104361143612436134361443615436164361743618436194362043621436224362343624436254362643627436284362943630436314363243633436344363543636436374363843639436404364143642436434364443645436464364743648436494365043651436524365343654436554365643657436584365943660436614366243663436644366543666436674366843669436704367143672436734367443675436764367743678436794368043681436824368343684436854368643687436884368943690436914369243693436944369543696436974369843699437004370143702437034370443705437064370743708437094371043711437124371343714437154371643717437184371943720437214372243723437244372543726437274372843729437304373143732437334373443735437364373743738437394374043741437424374343744437454374643747437484374943750437514375243753437544375543756437574375843759437604376143762437634376443765437664376743768437694377043771437724377343774437754377643777437784377943780437814378243783437844378543786437874378843789437904379143792437934379443795437964379743798437994380043801438024380343804438054380643807438084380943810438114381243813438144381543816438174381843819438204382143822438234382443825438264382743828438294383043831438324383343834438354383643837438384383943840438414384243843438444384543846438474384843849438504385143852438534385443855438564385743858438594386043861438624386343864438654386643867438684386943870438714387243873438744387543876438774387843879438804388143882438834388443885438864388743888438894389043891438924389343894438954389643897438984389943900439014390243903439044390543906439074390843909439104391143912439134391443915439164391743918439194392043921439224392343924439254392643927439284392943930439314393243933439344393543936439374393843939439404394143942439434394443945439464394743948439494395043951439524395343954439554395643957439584395943960439614396243963439644396543966439674396843969439704397143972439734397443975439764397743978439794398043981439824398343984439854398643987439884398943990439914399243993439944399543996439974399843999440004400144002440034400444005440064400744008440094401044011440124401344014440154401644017440184401944020440214402244023440244402544026440274402844029440304403144032440334403444035440364403744038440394404044041440424404344044440454404644047440484404944050440514405244053440544405544056440574405844059440604406144062440634406444065440664406744068440694407044071440724407344074440754407644077440784407944080440814408244083440844408544086440874408844089440904409144092440934409444095440964409744098440994410044101441024410344104441054410644107441084410944110441114411244113441144411544116441174411844119441204412144122441234412444125441264412744128441294413044131441324413344134441354413644137441384413944140441414414244143441444414544146441474414844149441504415144152441534415444155441564415744158441594416044161441624416344164441654416644167441684416944170441714417244173441744417544176441774417844179441804418144182441834418444185441864418744188441894419044191441924419344194441954419644197441984419944200442014420244203442044420544206442074420844209442104421144212442134421444215442164421744218442194422044221442224422344224442254422644227442284422944230442314423244233442344423544236442374423844239442404424144242442434424444245442464424744248442494425044251442524425344254442554425644257442584425944260442614426244263442644426544266442674426844269442704427144272442734427444275442764427744278442794428044281442824428344284442854428644287442884428944290442914429244293442944429544296442974429844299443004430144302443034430444305443064430744308443094431044311443124431344314443154431644317443184431944320443214432244323443244432544326443274432844329443304433144332443334433444335443364433744338443394434044341443424434344344443454434644347443484434944350443514435244353443544435544356443574435844359443604436144362443634436444365443664436744368443694437044371443724437344374443754437644377443784437944380443814438244383443844438544386443874438844389443904439144392443934439444395443964439744398443994440044401444024440344404444054440644407444084440944410444114441244413444144441544416444174441844419444204442144422444234442444425444264442744428444294443044431444324443344434444354443644437444384443944440444414444244443444444444544446444474444844449444504445144452444534445444455444564445744458444594446044461444624446344464444654446644467444684446944470444714447244473444744447544476444774447844479444804448144482444834448444485444864448744488444894449044491444924449344494444954449644497444984449944500445014450244503445044450544506445074450844509445104451144512445134451444515445164451744518445194452044521445224452344524445254452644527445284452944530445314453244533445344453544536445374453844539445404454144542445434454444545445464454744548445494455044551445524455344554445554455644557445584455944560445614456244563445644456544566445674456844569445704457144572445734457444575445764457744578445794458044581445824458344584445854458644587445884458944590445914459244593445944459544596445974459844599446004460144602446034460444605446064460744608446094461044611446124461344614446154461644617446184461944620446214462244623446244462544626446274462844629446304463144632446334463444635446364463744638446394464044641446424464344644446454464644647446484464944650446514465244653446544465544656446574465844659446604466144662446634466444665446664466744668446694467044671446724467344674446754467644677446784467944680446814468244683446844468544686446874468844689446904469144692446934469444695446964469744698446994470044701447024470344704447054470644707447084470944710447114471244713447144471544716447174471844719447204472144722447234472444725447264472744728447294473044731447324473344734447354473644737447384473944740447414474244743447444474544746447474474844749447504475144752447534475444755447564475744758447594476044761447624476344764447654476644767447684476944770447714477244773447744477544776447774477844779447804478144782447834478444785447864478744788447894479044791447924479344794447954479644797447984479944800448014480244803448044480544806448074480844809448104481144812448134481444815448164481744818448194482044821448224482344824448254482644827448284482944830448314483244833448344483544836448374483844839448404484144842448434484444845448464484744848448494485044851448524485344854448554485644857448584485944860448614486244863448644486544866448674486844869448704487144872448734487444875448764487744878448794488044881448824488344884448854488644887448884488944890448914489244893448944489544896448974489844899449004490144902449034490444905449064490744908449094491044911449124491344914449154491644917449184491944920449214492244923449244492544926449274492844929449304493144932449334493444935449364493744938449394494044941449424494344944449454494644947449484494944950449514495244953449544495544956449574495844959449604496144962449634496444965449664496744968449694497044971449724497344974449754497644977449784497944980449814498244983449844498544986449874498844989449904499144992449934499444995449964499744998449994500045001450024500345004450054500645007450084500945010450114501245013450144501545016450174501845019450204502145022450234502445025450264502745028450294503045031450324503345034450354503645037450384503945040450414504245043450444504545046450474504845049450504505145052450534505445055450564505745058450594506045061450624506345064450654506645067450684506945070450714507245073450744507545076450774507845079450804508145082450834508445085450864508745088450894509045091450924509345094450954509645097450984509945100451014510245103451044510545106451074510845109451104511145112451134511445115451164511745118451194512045121451224512345124451254512645127451284512945130451314513245133451344513545136451374513845139451404514145142451434514445145451464514745148451494515045151451524515345154451554515645157451584515945160451614516245163451644516545166451674516845169451704517145172451734517445175451764517745178451794518045181451824518345184451854518645187451884518945190451914519245193451944519545196451974519845199452004520145202452034520445205452064520745208452094521045211452124521345214452154521645217452184521945220452214522245223452244522545226452274522845229452304523145232452334523445235452364523745238452394524045241452424524345244452454524645247452484524945250452514525245253452544525545256452574525845259452604526145262452634526445265452664526745268452694527045271452724527345274452754527645277452784527945280452814528245283452844528545286452874528845289452904529145292452934529445295452964529745298452994530045301453024530345304453054530645307453084530945310453114531245313453144531545316453174531845319453204532145322453234532445325453264532745328453294533045331453324533345334453354533645337453384533945340453414534245343453444534545346453474534845349453504535145352453534535445355453564535745358453594536045361453624536345364453654536645367453684536945370453714537245373453744537545376453774537845379453804538145382453834538445385453864538745388453894539045391453924539345394453954539645397453984539945400454014540245403454044540545406454074540845409454104541145412454134541445415454164541745418454194542045421454224542345424454254542645427454284542945430454314543245433454344543545436454374543845439454404544145442454434544445445454464544745448454494545045451454524545345454454554545645457454584545945460454614546245463454644546545466454674546845469454704547145472454734547445475454764547745478454794548045481454824548345484454854548645487454884548945490454914549245493454944549545496454974549845499455004550145502455034550445505455064550745508455094551045511455124551345514455154551645517455184551945520455214552245523455244552545526455274552845529455304553145532455334553445535455364553745538455394554045541455424554345544455454554645547455484554945550455514555245553455544555545556455574555845559455604556145562455634556445565455664556745568455694557045571455724557345574455754557645577455784557945580455814558245583455844558545586455874558845589455904559145592455934559445595455964559745598455994560045601456024560345604456054560645607456084560945610456114561245613456144561545616456174561845619456204562145622456234562445625456264562745628456294563045631456324563345634456354563645637456384563945640456414564245643456444564545646456474564845649456504565145652456534565445655456564565745658456594566045661456624566345664456654566645667456684566945670456714567245673456744567545676456774567845679456804568145682456834568445685456864568745688456894569045691456924569345694456954569645697456984569945700457014570245703457044570545706457074570845709457104571145712457134571445715457164571745718457194572045721457224572345724457254572645727457284572945730457314573245733457344573545736457374573845739457404574145742457434574445745457464574745748457494575045751457524575345754457554575645757457584575945760457614576245763457644576545766457674576845769457704577145772457734577445775457764577745778457794578045781457824578345784457854578645787457884578945790457914579245793457944579545796457974579845799458004580145802458034580445805458064580745808458094581045811458124581345814458154581645817458184581945820458214582245823458244582545826458274582845829458304583145832458334583445835458364583745838458394584045841458424584345844458454584645847458484584945850458514585245853458544585545856458574585845859458604586145862458634586445865458664586745868458694587045871458724587345874458754587645877458784587945880458814588245883458844588545886458874588845889458904589145892458934589445895458964589745898458994590045901459024590345904459054590645907459084590945910459114591245913459144591545916459174591845919459204592145922459234592445925459264592745928459294593045931459324593345934459354593645937459384593945940459414594245943459444594545946459474594845949459504595145952459534595445955459564595745958459594596045961459624596345964459654596645967459684596945970459714597245973459744597545976459774597845979459804598145982459834598445985459864598745988459894599045991459924599345994459954599645997459984599946000460014600246003460044600546006460074600846009460104601146012460134601446015460164601746018460194602046021460224602346024460254602646027460284602946030460314603246033460344603546036460374603846039460404604146042460434604446045460464604746048460494605046051460524605346054460554605646057460584605946060460614606246063460644606546066460674606846069460704607146072460734607446075460764607746078460794608046081460824608346084460854608646087460884608946090460914609246093460944609546096460974609846099461004610146102461034610446105461064610746108461094611046111461124611346114461154611646117461184611946120461214612246123461244612546126461274612846129461304613146132461334613446135461364613746138461394614046141461424614346144461454614646147461484614946150461514615246153461544615546156461574615846159461604616146162461634616446165461664616746168461694617046171461724617346174461754617646177461784617946180461814618246183461844618546186461874618846189461904619146192461934619446195461964619746198461994620046201462024620346204462054620646207462084620946210462114621246213462144621546216462174621846219462204622146222462234622446225462264622746228462294623046231462324623346234462354623646237462384623946240462414624246243462444624546246462474624846249462504625146252462534625446255462564625746258462594626046261462624626346264462654626646267462684626946270462714627246273462744627546276462774627846279462804628146282462834628446285462864628746288462894629046291462924629346294462954629646297462984629946300463014630246303463044630546306463074630846309463104631146312463134631446315463164631746318463194632046321463224632346324463254632646327463284632946330463314633246333463344633546336463374633846339463404634146342463434634446345463464634746348463494635046351463524635346354463554635646357463584635946360463614636246363463644636546366463674636846369463704637146372463734637446375463764637746378463794638046381463824638346384463854638646387463884638946390463914639246393463944639546396463974639846399464004640146402464034640446405464064640746408464094641046411464124641346414464154641646417464184641946420464214642246423464244642546426464274642846429464304643146432464334643446435464364643746438464394644046441464424644346444464454644646447464484644946450464514645246453464544645546456464574645846459464604646146462464634646446465464664646746468464694647046471464724647346474464754647646477464784647946480464814648246483464844648546486464874648846489464904649146492464934649446495464964649746498464994650046501465024650346504465054650646507465084650946510465114651246513465144651546516465174651846519465204652146522465234652446525465264652746528465294653046531465324653346534465354653646537465384653946540465414654246543465444654546546465474654846549465504655146552465534655446555465564655746558465594656046561465624656346564465654656646567465684656946570465714657246573465744657546576465774657846579465804658146582465834658446585465864658746588465894659046591465924659346594465954659646597465984659946600466014660246603466044660546606466074660846609466104661146612466134661446615466164661746618466194662046621466224662346624466254662646627466284662946630466314663246633466344663546636466374663846639466404664146642466434664446645466464664746648466494665046651466524665346654466554665646657466584665946660466614666246663466644666546666466674666846669466704667146672466734667446675466764667746678466794668046681466824668346684466854668646687466884668946690466914669246693466944669546696466974669846699467004670146702467034670446705467064670746708467094671046711467124671346714467154671646717467184671946720467214672246723467244672546726467274672846729467304673146732467334673446735467364673746738467394674046741467424674346744467454674646747467484674946750467514675246753467544675546756467574675846759467604676146762467634676446765467664676746768467694677046771467724677346774467754677646777467784677946780467814678246783467844678546786467874678846789467904679146792467934679446795467964679746798467994680046801468024680346804468054680646807468084680946810468114681246813468144681546816468174681846819468204682146822468234682446825468264682746828468294683046831468324683346834468354683646837468384683946840468414684246843468444684546846468474684846849468504685146852468534685446855468564685746858468594686046861468624686346864468654686646867468684686946870468714687246873468744687546876468774687846879468804688146882468834688446885468864688746888468894689046891468924689346894468954689646897468984689946900469014690246903469044690546906469074690846909469104691146912469134691446915469164691746918469194692046921469224692346924469254692646927469284692946930469314693246933469344693546936469374693846939469404694146942469434694446945469464694746948469494695046951469524695346954469554695646957469584695946960469614696246963469644696546966469674696846969469704697146972469734697446975469764697746978469794698046981469824698346984469854698646987469884698946990469914699246993469944699546996469974699846999470004700147002470034700447005470064700747008470094701047011470124701347014470154701647017470184701947020470214702247023470244702547026470274702847029470304703147032470334703447035470364703747038470394704047041470424704347044470454704647047470484704947050470514705247053470544705547056470574705847059470604706147062470634706447065470664706747068470694707047071470724707347074470754707647077470784707947080470814708247083470844708547086470874708847089470904709147092470934709447095470964709747098470994710047101471024710347104471054710647107471084710947110471114711247113471144711547116471174711847119471204712147122471234712447125471264712747128471294713047131471324713347134471354713647137471384713947140471414714247143471444714547146471474714847149471504715147152471534715447155471564715747158471594716047161471624716347164471654716647167471684716947170471714717247173471744717547176471774717847179471804718147182471834718447185471864718747188471894719047191471924719347194471954719647197471984719947200472014720247203472044720547206472074720847209472104721147212472134721447215472164721747218472194722047221472224722347224472254722647227472284722947230472314723247233472344723547236472374723847239472404724147242472434724447245472464724747248472494725047251472524725347254472554725647257472584725947260472614726247263472644726547266472674726847269472704727147272472734727447275472764727747278472794728047281472824728347284472854728647287472884728947290472914729247293472944729547296472974729847299473004730147302473034730447305473064730747308473094731047311473124731347314473154731647317473184731947320473214732247323473244732547326473274732847329473304733147332473334733447335473364733747338473394734047341473424734347344473454734647347473484734947350473514735247353473544735547356473574735847359473604736147362473634736447365473664736747368473694737047371473724737347374473754737647377473784737947380473814738247383473844738547386473874738847389473904739147392473934739447395473964739747398473994740047401474024740347404474054740647407474084740947410474114741247413474144741547416474174741847419474204742147422474234742447425474264742747428474294743047431474324743347434474354743647437474384743947440474414744247443474444744547446474474744847449474504745147452474534745447455474564745747458474594746047461474624746347464474654746647467474684746947470474714747247473474744747547476474774747847479474804748147482474834748447485474864748747488474894749047491474924749347494474954749647497474984749947500475014750247503475044750547506475074750847509475104751147512475134751447515475164751747518475194752047521475224752347524475254752647527475284752947530475314753247533475344753547536475374753847539475404754147542475434754447545475464754747548475494755047551475524755347554475554755647557475584755947560475614756247563475644756547566475674756847569475704757147572475734757447575475764757747578475794758047581475824758347584475854758647587475884758947590475914759247593475944759547596475974759847599476004760147602476034760447605476064760747608476094761047611476124761347614476154761647617476184761947620476214762247623476244762547626476274762847629476304763147632476334763447635476364763747638476394764047641476424764347644476454764647647476484764947650476514765247653476544765547656476574765847659476604766147662476634766447665476664766747668476694767047671476724767347674476754767647677476784767947680476814768247683476844768547686476874768847689476904769147692476934769447695476964769747698476994770047701477024770347704477054770647707477084770947710477114771247713477144771547716477174771847719477204772147722477234772447725477264772747728477294773047731477324773347734477354773647737477384773947740477414774247743477444774547746477474774847749477504775147752477534775447755477564775747758477594776047761477624776347764477654776647767477684776947770477714777247773477744777547776477774777847779477804778147782477834778447785477864778747788477894779047791477924779347794477954779647797477984779947800478014780247803478044780547806478074780847809478104781147812478134781447815478164781747818478194782047821478224782347824478254782647827478284782947830478314783247833478344783547836478374783847839478404784147842478434784447845478464784747848478494785047851478524785347854478554785647857478584785947860478614786247863478644786547866478674786847869478704787147872478734787447875478764787747878478794788047881478824788347884478854788647887478884788947890478914789247893478944789547896478974789847899479004790147902479034790447905479064790747908479094791047911479124791347914479154791647917479184791947920479214792247923479244792547926479274792847929479304793147932479334793447935479364793747938479394794047941479424794347944479454794647947479484794947950479514795247953479544795547956479574795847959479604796147962479634796447965479664796747968479694797047971479724797347974479754797647977479784797947980479814798247983479844798547986479874798847989479904799147992479934799447995479964799747998479994800048001480024800348004480054800648007480084800948010480114801248013480144801548016480174801848019480204802148022480234802448025480264802748028480294803048031480324803348034480354803648037480384803948040480414804248043480444804548046480474804848049480504805148052480534805448055480564805748058480594806048061480624806348064480654806648067480684806948070480714807248073480744807548076480774807848079480804808148082480834808448085480864808748088480894809048091480924809348094480954809648097480984809948100481014810248103481044810548106481074810848109481104811148112481134811448115481164811748118481194812048121481224812348124481254812648127481284812948130481314813248133481344813548136481374813848139481404814148142481434814448145481464814748148481494815048151481524815348154481554815648157481584815948160481614816248163481644816548166481674816848169481704817148172481734817448175481764817748178481794818048181481824818348184481854818648187481884818948190481914819248193481944819548196481974819848199482004820148202482034820448205482064820748208482094821048211482124821348214482154821648217482184821948220482214822248223482244822548226482274822848229482304823148232482334823448235482364823748238482394824048241482424824348244482454824648247482484824948250482514825248253482544825548256482574825848259482604826148262482634826448265482664826748268482694827048271482724827348274482754827648277482784827948280482814828248283482844828548286482874828848289482904829148292482934829448295482964829748298482994830048301483024830348304483054830648307483084830948310483114831248313483144831548316483174831848319483204832148322483234832448325483264832748328483294833048331483324833348334483354833648337483384833948340483414834248343483444834548346483474834848349483504835148352483534835448355483564835748358483594836048361483624836348364483654836648367483684836948370483714837248373483744837548376483774837848379483804838148382483834838448385483864838748388483894839048391483924839348394483954839648397483984839948400484014840248403484044840548406484074840848409484104841148412484134841448415484164841748418484194842048421484224842348424484254842648427484284842948430484314843248433484344843548436484374843848439484404844148442484434844448445484464844748448484494845048451484524845348454484554845648457484584845948460484614846248463484644846548466484674846848469484704847148472484734847448475484764847748478484794848048481484824848348484484854848648487484884848948490484914849248493484944849548496484974849848499485004850148502485034850448505485064850748508485094851048511485124851348514485154851648517485184851948520485214852248523485244852548526485274852848529485304853148532485334853448535485364853748538485394854048541485424854348544485454854648547485484854948550485514855248553485544855548556485574855848559485604856148562485634856448565485664856748568485694857048571485724857348574485754857648577485784857948580485814858248583485844858548586485874858848589485904859148592485934859448595485964859748598485994860048601486024860348604486054860648607486084860948610486114861248613486144861548616486174861848619486204862148622486234862448625486264862748628486294863048631486324863348634486354863648637486384863948640486414864248643486444864548646486474864848649486504865148652486534865448655486564865748658486594866048661486624866348664486654866648667486684866948670486714867248673486744867548676486774867848679486804868148682486834868448685486864868748688486894869048691486924869348694486954869648697486984869948700487014870248703487044870548706487074870848709487104871148712487134871448715487164871748718487194872048721487224872348724487254872648727487284872948730487314873248733487344873548736487374873848739487404874148742487434874448745487464874748748487494875048751487524875348754487554875648757487584875948760487614876248763487644876548766487674876848769487704877148772487734877448775487764877748778487794878048781487824878348784487854878648787487884878948790487914879248793487944879548796487974879848799488004880148802488034880448805488064880748808488094881048811488124881348814488154881648817488184881948820488214882248823488244882548826488274882848829488304883148832488334883448835488364883748838488394884048841488424884348844488454884648847488484884948850488514885248853488544885548856488574885848859488604886148862488634886448865488664886748868488694887048871488724887348874488754887648877488784887948880488814888248883488844888548886488874888848889488904889148892488934889448895488964889748898488994890048901489024890348904489054890648907489084890948910489114891248913489144891548916489174891848919489204892148922489234892448925489264892748928489294893048931489324893348934489354893648937489384893948940489414894248943489444894548946489474894848949489504895148952489534895448955489564895748958489594896048961489624896348964489654896648967489684896948970489714897248973489744897548976489774897848979489804898148982489834898448985489864898748988489894899048991489924899348994489954899648997489984899949000490014900249003490044900549006490074900849009490104901149012490134901449015490164901749018490194902049021490224902349024490254902649027490284902949030490314903249033490344903549036490374903849039490404904149042490434904449045490464904749048490494905049051490524905349054490554905649057490584905949060490614906249063490644906549066490674906849069490704907149072490734907449075490764907749078490794908049081490824908349084490854908649087490884908949090490914909249093490944909549096490974909849099491004910149102491034910449105491064910749108491094911049111491124911349114491154911649117491184911949120491214912249123491244912549126491274912849129491304913149132491334913449135491364913749138491394914049141491424914349144491454914649147491484914949150491514915249153491544915549156491574915849159491604916149162491634916449165491664916749168491694917049171491724917349174491754917649177491784917949180491814918249183491844918549186491874918849189491904919149192491934919449195491964919749198491994920049201492024920349204492054920649207492084920949210492114921249213492144921549216492174921849219492204922149222492234922449225492264922749228492294923049231492324923349234492354923649237492384923949240492414924249243492444924549246492474924849249492504925149252492534925449255492564925749258492594926049261492624926349264492654926649267492684926949270492714927249273492744927549276492774927849279492804928149282492834928449285492864928749288492894929049291492924929349294492954929649297492984929949300493014930249303493044930549306493074930849309493104931149312493134931449315493164931749318493194932049321493224932349324493254932649327493284932949330493314933249333493344933549336493374933849339493404934149342493434934449345493464934749348493494935049351493524935349354493554935649357493584935949360493614936249363493644936549366493674936849369493704937149372493734937449375493764937749378493794938049381493824938349384493854938649387493884938949390493914939249393493944939549396493974939849399494004940149402494034940449405494064940749408494094941049411494124941349414494154941649417494184941949420494214942249423494244942549426494274942849429494304943149432494334943449435494364943749438494394944049441494424944349444494454944649447494484944949450494514945249453494544945549456494574945849459494604946149462494634946449465494664946749468494694947049471494724947349474494754947649477494784947949480494814948249483494844948549486494874948849489494904949149492494934949449495494964949749498494994950049501495024950349504495054950649507495084950949510495114951249513495144951549516495174951849519495204952149522495234952449525495264952749528495294953049531495324953349534495354953649537495384953949540495414954249543495444954549546495474954849549495504955149552495534955449555495564955749558495594956049561495624956349564495654956649567495684956949570495714957249573495744957549576495774957849579495804958149582495834958449585495864958749588495894959049591495924959349594495954959649597495984959949600496014960249603496044960549606496074960849609496104961149612496134961449615496164961749618496194962049621496224962349624496254962649627496284962949630496314963249633496344963549636496374963849639496404964149642496434964449645496464964749648496494965049651496524965349654496554965649657496584965949660496614966249663496644966549666496674966849669496704967149672496734967449675496764967749678496794968049681496824968349684496854968649687496884968949690496914969249693496944969549696496974969849699497004970149702497034970449705497064970749708497094971049711497124971349714497154971649717497184971949720497214972249723497244972549726497274972849729497304973149732497334973449735497364973749738497394974049741497424974349744497454974649747497484974949750497514975249753497544975549756497574975849759497604976149762497634976449765497664976749768497694977049771497724977349774497754977649777497784977949780497814978249783497844978549786497874978849789497904979149792497934979449795497964979749798497994980049801498024980349804498054980649807498084980949810498114981249813498144981549816498174981849819498204982149822498234982449825498264982749828498294983049831498324983349834498354983649837498384983949840498414984249843498444984549846498474984849849498504985149852498534985449855498564985749858498594986049861498624986349864498654986649867498684986949870498714987249873498744987549876498774987849879498804988149882498834988449885498864988749888498894989049891498924989349894498954989649897498984989949900499014990249903499044990549906499074990849909499104991149912499134991449915499164991749918499194992049921499224992349924499254992649927499284992949930499314993249933499344993549936499374993849939499404994149942499434994449945499464994749948499494995049951499524995349954499554995649957499584995949960499614996249963499644996549966499674996849969499704997149972499734997449975499764997749978499794998049981499824998349984499854998649987499884998949990499914999249993499944999549996499974999849999500005000150002500035000450005500065000750008500095001050011500125001350014500155001650017500185001950020500215002250023500245002550026500275002850029500305003150032500335003450035500365003750038500395004050041500425004350044500455004650047500485004950050500515005250053500545005550056500575005850059500605006150062500635006450065500665006750068500695007050071500725007350074500755007650077500785007950080500815008250083500845008550086500875008850089500905009150092500935009450095500965009750098500995010050101501025010350104501055010650107501085010950110501115011250113501145011550116501175011850119501205012150122501235012450125501265012750128501295013050131501325013350134501355013650137501385013950140501415014250143501445014550146501475014850149501505015150152501535015450155501565015750158501595016050161501625016350164501655016650167501685016950170501715017250173501745017550176501775017850179501805018150182501835018450185501865018750188501895019050191501925019350194501955019650197501985019950200502015020250203502045020550206502075020850209502105021150212502135021450215502165021750218502195022050221502225022350224502255022650227502285022950230502315023250233502345023550236502375023850239502405024150242502435024450245502465024750248502495025050251502525025350254502555025650257502585025950260502615026250263502645026550266502675026850269502705027150272502735027450275502765027750278502795028050281502825028350284502855028650287502885028950290502915029250293502945029550296502975029850299503005030150302503035030450305503065030750308503095031050311503125031350314503155031650317503185031950320503215032250323503245032550326503275032850329503305033150332503335033450335503365033750338503395034050341503425034350344503455034650347503485034950350503515035250353503545035550356503575035850359503605036150362503635036450365503665036750368503695037050371503725037350374503755037650377503785037950380503815038250383503845038550386503875038850389503905039150392503935039450395503965039750398503995040050401504025040350404504055040650407504085040950410504115041250413504145041550416504175041850419504205042150422504235042450425504265042750428504295043050431504325043350434504355043650437504385043950440504415044250443504445044550446504475044850449504505045150452504535045450455504565045750458504595046050461504625046350464504655046650467504685046950470504715047250473504745047550476504775047850479504805048150482504835048450485504865048750488504895049050491504925049350494504955049650497504985049950500505015050250503505045050550506505075050850509505105051150512505135051450515505165051750518505195052050521505225052350524505255052650527505285052950530505315053250533505345053550536505375053850539505405054150542505435054450545505465054750548505495055050551505525055350554505555055650557505585055950560505615056250563505645056550566505675056850569505705057150572505735057450575505765057750578505795058050581505825058350584505855058650587505885058950590505915059250593505945059550596505975059850599506005060150602506035060450605506065060750608506095061050611506125061350614506155061650617506185061950620506215062250623506245062550626506275062850629506305063150632506335063450635506365063750638506395064050641506425064350644506455064650647506485064950650506515065250653506545065550656506575065850659506605066150662506635066450665506665066750668506695067050671506725067350674506755067650677506785067950680506815068250683506845068550686506875068850689506905069150692506935069450695506965069750698506995070050701507025070350704507055070650707507085070950710507115071250713507145071550716507175071850719507205072150722507235072450725507265072750728507295073050731507325073350734507355073650737507385073950740507415074250743507445074550746507475074850749507505075150752507535075450755507565075750758507595076050761507625076350764507655076650767507685076950770507715077250773507745077550776507775077850779507805078150782507835078450785507865078750788507895079050791507925079350794507955079650797507985079950800508015080250803508045080550806508075080850809508105081150812508135081450815508165081750818508195082050821508225082350824508255082650827508285082950830508315083250833508345083550836508375083850839508405084150842508435084450845508465084750848508495085050851508525085350854508555085650857508585085950860508615086250863508645086550866508675086850869508705087150872508735087450875508765087750878508795088050881508825088350884508855088650887508885088950890508915089250893508945089550896508975089850899509005090150902509035090450905509065090750908509095091050911509125091350914509155091650917509185091950920509215092250923509245092550926509275092850929509305093150932509335093450935509365093750938509395094050941509425094350944509455094650947509485094950950509515095250953509545095550956509575095850959509605096150962509635096450965509665096750968509695097050971509725097350974509755097650977509785097950980509815098250983509845098550986509875098850989509905099150992509935099450995509965099750998509995100051001510025100351004510055100651007510085100951010510115101251013510145101551016510175101851019510205102151022510235102451025510265102751028510295103051031510325103351034510355103651037510385103951040510415104251043510445104551046510475104851049510505105151052510535105451055510565105751058510595106051061510625106351064510655106651067510685106951070510715107251073510745107551076510775107851079510805108151082510835108451085510865108751088510895109051091510925109351094510955109651097510985109951100511015110251103511045110551106511075110851109511105111151112511135111451115511165111751118511195112051121511225112351124511255112651127511285112951130511315113251133511345113551136511375113851139511405114151142511435114451145511465114751148511495115051151511525115351154511555115651157511585115951160511615116251163511645116551166511675116851169511705117151172511735117451175511765117751178511795118051181511825118351184511855118651187511885118951190511915119251193511945119551196511975119851199512005120151202512035120451205512065120751208512095121051211512125121351214512155121651217512185121951220512215122251223512245122551226512275122851229512305123151232512335123451235512365123751238512395124051241512425124351244512455124651247512485124951250512515125251253512545125551256512575125851259512605126151262512635126451265512665126751268512695127051271512725127351274512755127651277512785127951280512815128251283512845128551286512875128851289512905129151292512935129451295512965129751298512995130051301513025130351304513055130651307513085130951310513115131251313513145131551316513175131851319513205132151322513235132451325513265132751328513295133051331513325133351334513355133651337513385133951340513415134251343513445134551346513475134851349513505135151352513535135451355513565135751358513595136051361513625136351364513655136651367513685136951370513715137251373513745137551376513775137851379513805138151382513835138451385513865138751388513895139051391513925139351394513955139651397513985139951400514015140251403514045140551406514075140851409514105141151412514135141451415514165141751418514195142051421514225142351424514255142651427514285142951430514315143251433514345143551436514375143851439514405144151442514435144451445514465144751448514495145051451514525145351454514555145651457514585145951460514615146251463514645146551466514675146851469514705147151472514735147451475514765147751478514795148051481514825148351484514855148651487514885148951490514915149251493514945149551496514975149851499515005150151502515035150451505515065150751508515095151051511515125151351514515155151651517515185151951520515215152251523515245152551526515275152851529515305153151532515335153451535515365153751538515395154051541515425154351544515455154651547515485154951550515515155251553515545155551556515575155851559515605156151562515635156451565515665156751568515695157051571515725157351574515755157651577515785157951580515815158251583515845158551586515875158851589515905159151592515935159451595515965159751598515995160051601516025160351604516055160651607516085160951610516115161251613516145161551616516175161851619516205162151622516235162451625516265162751628516295163051631516325163351634516355163651637516385163951640516415164251643516445164551646516475164851649516505165151652516535165451655516565165751658516595166051661516625166351664516655166651667516685166951670516715167251673516745167551676516775167851679516805168151682516835168451685516865168751688516895169051691516925169351694516955169651697516985169951700517015170251703517045170551706517075170851709517105171151712517135171451715517165171751718517195172051721517225172351724517255172651727517285172951730517315173251733517345173551736517375173851739517405174151742517435174451745517465174751748517495175051751517525175351754517555175651757517585175951760517615176251763517645176551766517675176851769517705177151772517735177451775517765177751778517795178051781517825178351784517855178651787517885178951790517915179251793517945179551796517975179851799518005180151802518035180451805518065180751808518095181051811518125181351814518155181651817518185181951820518215182251823518245182551826518275182851829518305183151832518335183451835518365183751838518395184051841518425184351844518455184651847518485184951850518515185251853518545185551856518575185851859518605186151862518635186451865518665186751868518695187051871518725187351874518755187651877518785187951880518815188251883518845188551886518875188851889518905189151892518935189451895518965189751898518995190051901519025190351904519055190651907519085190951910519115191251913519145191551916519175191851919519205192151922519235192451925519265192751928519295193051931519325193351934519355193651937519385193951940519415194251943519445194551946519475194851949519505195151952519535195451955519565195751958519595196051961519625196351964519655196651967519685196951970519715197251973519745197551976519775197851979519805198151982519835198451985519865198751988519895199051991519925199351994519955199651997519985199952000520015200252003520045200552006520075200852009520105201152012520135201452015520165201752018520195202052021520225202352024520255202652027520285202952030520315203252033520345203552036520375203852039520405204152042520435204452045520465204752048520495205052051520525205352054520555205652057520585205952060520615206252063520645206552066520675206852069520705207152072520735207452075520765207752078520795208052081520825208352084520855208652087520885208952090520915209252093520945209552096520975209852099521005210152102521035210452105521065210752108521095211052111521125211352114521155211652117521185211952120521215212252123521245212552126521275212852129521305213152132521335213452135521365213752138521395214052141521425214352144521455214652147521485214952150521515215252153521545215552156521575215852159521605216152162521635216452165521665216752168521695217052171521725217352174521755217652177521785217952180521815218252183521845218552186521875218852189521905219152192521935219452195521965219752198521995220052201522025220352204522055220652207522085220952210522115221252213522145221552216522175221852219522205222152222522235222452225522265222752228522295223052231522325223352234522355223652237522385223952240522415224252243522445224552246522475224852249522505225152252522535225452255522565225752258522595226052261522625226352264522655226652267522685226952270522715227252273522745227552276522775227852279522805228152282522835228452285522865228752288522895229052291522925229352294522955229652297522985229952300523015230252303523045230552306523075230852309523105231152312523135231452315523165231752318523195232052321523225232352324523255232652327523285232952330523315233252333523345233552336523375233852339523405234152342523435234452345523465234752348523495235052351523525235352354523555235652357523585235952360523615236252363523645236552366523675236852369523705237152372523735237452375523765237752378523795238052381523825238352384523855238652387523885238952390523915239252393523945239552396523975239852399524005240152402524035240452405524065240752408524095241052411524125241352414524155241652417524185241952420524215242252423524245242552426524275242852429524305243152432524335243452435524365243752438524395244052441524425244352444524455244652447524485244952450524515245252453524545245552456524575245852459524605246152462524635246452465524665246752468524695247052471524725247352474524755247652477524785247952480524815248252483524845248552486524875248852489524905249152492524935249452495524965249752498524995250052501525025250352504525055250652507525085250952510525115251252513525145251552516525175251852519525205252152522525235252452525525265252752528525295253052531525325253352534525355253652537525385253952540525415254252543525445254552546525475254852549525505255152552525535255452555525565255752558525595256052561525625256352564525655256652567525685256952570525715257252573525745257552576525775257852579525805258152582525835258452585525865258752588525895259052591525925259352594525955259652597525985259952600526015260252603526045260552606526075260852609526105261152612526135261452615526165261752618526195262052621526225262352624526255262652627526285262952630526315263252633526345263552636526375263852639526405264152642526435264452645526465264752648526495265052651526525265352654526555265652657526585265952660526615266252663526645266552666526675266852669526705267152672526735267452675526765267752678526795268052681526825268352684526855268652687526885268952690526915269252693526945269552696526975269852699527005270152702527035270452705527065270752708527095271052711527125271352714527155271652717527185271952720527215272252723527245272552726527275272852729527305273152732527335273452735527365273752738527395274052741527425274352744527455274652747527485274952750527515275252753527545275552756527575275852759527605276152762527635276452765527665276752768527695277052771527725277352774527755277652777527785277952780527815278252783527845278552786527875278852789527905279152792527935279452795527965279752798527995280052801528025280352804528055280652807528085280952810528115281252813528145281552816528175281852819528205282152822528235282452825528265282752828528295283052831528325283352834528355283652837528385283952840528415284252843528445284552846528475284852849528505285152852528535285452855528565285752858528595286052861528625286352864528655286652867528685286952870528715287252873528745287552876528775287852879528805288152882528835288452885528865288752888528895289052891528925289352894528955289652897528985289952900529015290252903529045290552906529075290852909529105291152912529135291452915529165291752918529195292052921529225292352924529255292652927529285292952930529315293252933529345293552936529375293852939529405294152942529435294452945529465294752948529495295052951529525295352954529555295652957529585295952960529615296252963529645296552966529675296852969529705297152972529735297452975529765297752978529795298052981529825298352984529855298652987529885298952990529915299252993529945299552996529975299852999530005300153002530035300453005530065300753008530095301053011530125301353014530155301653017530185301953020530215302253023530245302553026530275302853029530305303153032530335303453035530365303753038530395304053041530425304353044530455304653047530485304953050530515305253053530545305553056530575305853059530605306153062530635306453065530665306753068530695307053071530725307353074530755307653077530785307953080530815308253083530845308553086530875308853089530905309153092530935309453095530965309753098530995310053101531025310353104531055310653107531085310953110531115311253113531145311553116531175311853119531205312153122531235312453125531265312753128531295313053131531325313353134531355313653137531385313953140531415314253143531445314553146531475314853149531505315153152531535315453155531565315753158531595316053161531625316353164531655316653167531685316953170531715317253173531745317553176531775317853179531805318153182531835318453185531865318753188531895319053191531925319353194531955319653197531985319953200532015320253203532045320553206532075320853209532105321153212532135321453215532165321753218532195322053221532225322353224532255322653227532285322953230532315323253233532345323553236532375323853239532405324153242532435324453245532465324753248532495325053251532525325353254532555325653257532585325953260532615326253263532645326553266532675326853269532705327153272532735327453275532765327753278532795328053281532825328353284532855328653287532885328953290532915329253293532945329553296532975329853299533005330153302533035330453305533065330753308533095331053311533125331353314533155331653317533185331953320533215332253323533245332553326533275332853329533305333153332533335333453335533365333753338533395334053341533425334353344533455334653347533485334953350533515335253353533545335553356533575335853359533605336153362533635336453365533665336753368533695337053371533725337353374533755337653377533785337953380533815338253383533845338553386533875338853389533905339153392533935339453395533965339753398533995340053401534025340353404534055340653407534085340953410534115341253413534145341553416534175341853419534205342153422534235342453425534265342753428534295343053431534325343353434534355343653437534385343953440534415344253443534445344553446534475344853449534505345153452534535345453455534565345753458534595346053461534625346353464534655346653467534685346953470534715347253473534745347553476534775347853479534805348153482534835348453485534865348753488534895349053491534925349353494534955349653497534985349953500535015350253503535045350553506535075350853509535105351153512535135351453515535165351753518535195352053521535225352353524535255352653527535285352953530535315353253533535345353553536535375353853539535405354153542535435354453545535465354753548535495355053551535525355353554535555355653557535585355953560535615356253563535645356553566535675356853569535705357153572535735357453575535765357753578535795358053581535825358353584535855358653587535885358953590535915359253593535945359553596535975359853599536005360153602536035360453605536065360753608536095361053611536125361353614536155361653617536185361953620536215362253623536245362553626536275362853629536305363153632536335363453635536365363753638536395364053641536425364353644536455364653647536485364953650536515365253653536545365553656536575365853659536605366153662536635366453665536665366753668536695367053671536725367353674536755367653677536785367953680536815368253683536845368553686536875368853689536905369153692536935369453695536965369753698536995370053701537025370353704537055370653707537085370953710537115371253713537145371553716537175371853719537205372153722537235372453725537265372753728537295373053731537325373353734537355373653737537385373953740537415374253743537445374553746537475374853749537505375153752537535375453755537565375753758537595376053761537625376353764537655376653767537685376953770537715377253773537745377553776537775377853779537805378153782537835378453785537865378753788537895379053791537925379353794537955379653797537985379953800538015380253803538045380553806538075380853809538105381153812538135381453815538165381753818538195382053821538225382353824538255382653827538285382953830538315383253833538345383553836538375383853839538405384153842538435384453845538465384753848538495385053851538525385353854538555385653857538585385953860538615386253863538645386553866538675386853869538705387153872538735387453875538765387753878538795388053881538825388353884538855388653887538885388953890538915389253893538945389553896538975389853899539005390153902539035390453905539065390753908539095391053911539125391353914539155391653917539185391953920539215392253923539245392553926539275392853929539305393153932539335393453935539365393753938539395394053941539425394353944539455394653947539485394953950539515395253953539545395553956539575395853959539605396153962539635396453965539665396753968539695397053971539725397353974539755397653977539785397953980539815398253983539845398553986539875398853989539905399153992539935399453995539965399753998539995400054001540025400354004540055400654007540085400954010540115401254013540145401554016540175401854019540205402154022540235402454025540265402754028540295403054031540325403354034540355403654037540385403954040540415404254043540445404554046540475404854049540505405154052540535405454055540565405754058540595406054061540625406354064540655406654067540685406954070540715407254073540745407554076540775407854079540805408154082540835408454085540865408754088540895409054091540925409354094540955409654097540985409954100541015410254103541045410554106541075410854109541105411154112541135411454115541165411754118541195412054121541225412354124541255412654127541285412954130541315413254133541345413554136541375413854139541405414154142541435414454145541465414754148541495415054151541525415354154541555415654157541585415954160541615416254163541645416554166541675416854169541705417154172541735417454175541765417754178541795418054181541825418354184541855418654187541885418954190541915419254193541945419554196541975419854199542005420154202542035420454205542065420754208542095421054211542125421354214542155421654217542185421954220542215422254223542245422554226542275422854229542305423154232542335423454235542365423754238542395424054241542425424354244542455424654247542485424954250542515425254253542545425554256542575425854259542605426154262542635426454265542665426754268542695427054271542725427354274542755427654277542785427954280542815428254283542845428554286542875428854289542905429154292542935429454295542965429754298542995430054301543025430354304543055430654307543085430954310543115431254313543145431554316543175431854319543205432154322543235432454325543265432754328543295433054331543325433354334543355433654337543385433954340543415434254343543445434554346543475434854349543505435154352543535435454355543565435754358543595436054361543625436354364543655436654367543685436954370543715437254373543745437554376543775437854379543805438154382543835438454385543865438754388543895439054391543925439354394543955439654397543985439954400544015440254403544045440554406544075440854409544105441154412544135441454415544165441754418544195442054421544225442354424544255442654427544285442954430544315443254433544345443554436544375443854439544405444154442544435444454445544465444754448544495445054451544525445354454544555445654457544585445954460544615446254463544645446554466544675446854469544705447154472544735447454475544765447754478544795448054481544825448354484544855448654487544885448954490544915449254493544945449554496544975449854499545005450154502545035450454505545065450754508545095451054511545125451354514545155451654517545185451954520545215452254523545245452554526545275452854529545305453154532545335453454535545365453754538545395454054541545425454354544545455454654547545485454954550545515455254553545545455554556545575455854559545605456154562545635456454565545665456754568545695457054571545725457354574545755457654577545785457954580545815458254583545845458554586545875458854589545905459154592545935459454595545965459754598545995460054601546025460354604546055460654607546085460954610546115461254613546145461554616546175461854619546205462154622546235462454625546265462754628546295463054631546325463354634546355463654637546385463954640546415464254643546445464554646546475464854649546505465154652546535465454655546565465754658546595466054661546625466354664546655466654667546685466954670546715467254673546745467554676546775467854679546805468154682546835468454685546865468754688546895469054691546925469354694546955469654697546985469954700547015470254703547045470554706547075470854709547105471154712547135471454715547165471754718547195472054721547225472354724547255472654727547285472954730547315473254733547345473554736547375473854739547405474154742547435474454745547465474754748547495475054751547525475354754547555475654757547585475954760547615476254763547645476554766547675476854769547705477154772547735477454775547765477754778547795478054781547825478354784547855478654787547885478954790547915479254793547945479554796547975479854799548005480154802548035480454805548065480754808548095481054811548125481354814548155481654817548185481954820548215482254823548245482554826548275482854829548305483154832548335483454835548365483754838548395484054841548425484354844548455484654847548485484954850548515485254853548545485554856548575485854859548605486154862548635486454865548665486754868548695487054871548725487354874548755487654877548785487954880548815488254883548845488554886548875488854889548905489154892548935489454895548965489754898548995490054901549025490354904549055490654907549085490954910549115491254913549145491554916549175491854919549205492154922549235492454925549265492754928549295493054931549325493354934549355493654937549385493954940549415494254943549445494554946549475494854949549505495154952549535495454955549565495754958549595496054961549625496354964549655496654967549685496954970549715497254973549745497554976549775497854979549805498154982549835498454985549865498754988549895499054991549925499354994549955499654997549985499955000550015500255003550045500555006550075500855009550105501155012550135501455015550165501755018550195502055021550225502355024550255502655027550285502955030550315503255033550345503555036550375503855039550405504155042550435504455045550465504755048550495505055051550525505355054550555505655057550585505955060550615506255063550645506555066550675506855069550705507155072550735507455075550765507755078550795508055081550825508355084550855508655087550885508955090550915509255093550945509555096550975509855099551005510155102551035510455105551065510755108551095511055111551125511355114551155511655117551185511955120551215512255123551245512555126551275512855129551305513155132551335513455135551365513755138551395514055141551425514355144551455514655147551485514955150551515515255153551545515555156551575515855159551605516155162551635516455165551665516755168551695517055171551725517355174551755517655177551785517955180551815518255183551845518555186551875518855189551905519155192551935519455195551965519755198551995520055201552025520355204552055520655207552085520955210552115521255213552145521555216552175521855219552205522155222552235522455225552265522755228552295523055231552325523355234552355523655237552385523955240552415524255243552445524555246552475524855249552505525155252552535525455255552565525755258552595526055261552625526355264552655526655267552685526955270552715527255273552745527555276552775527855279552805528155282552835528455285552865528755288552895529055291552925529355294552955529655297552985529955300553015530255303553045530555306553075530855309553105531155312553135531455315553165531755318553195532055321553225532355324553255532655327553285532955330553315533255333553345533555336553375533855339553405534155342553435534455345553465534755348553495535055351553525535355354553555535655357553585535955360553615536255363553645536555366553675536855369553705537155372553735537455375553765537755378553795538055381553825538355384553855538655387553885538955390553915539255393553945539555396553975539855399554005540155402554035540455405554065540755408554095541055411554125541355414554155541655417554185541955420554215542255423554245542555426554275542855429554305543155432554335543455435554365543755438554395544055441554425544355444554455544655447554485544955450554515545255453554545545555456554575545855459554605546155462554635546455465554665546755468554695547055471554725547355474554755547655477554785547955480554815548255483554845548555486554875548855489554905549155492554935549455495554965549755498554995550055501555025550355504555055550655507555085550955510555115551255513555145551555516555175551855519555205552155522555235552455525555265552755528555295553055531555325553355534555355553655537555385553955540555415554255543555445554555546555475554855549555505555155552555535555455555555565555755558555595556055561555625556355564555655556655567555685556955570555715557255573555745557555576555775557855579555805558155582555835558455585555865558755588555895559055591555925559355594555955559655597555985559955600556015560255603556045560555606556075560855609556105561155612556135561455615556165561755618556195562055621556225562355624556255562655627556285562955630556315563255633556345563555636556375563855639556405564155642556435564455645556465564755648556495565055651556525565355654556555565655657556585565955660556615566255663556645566555666556675566855669556705567155672556735567455675556765567755678556795568055681556825568355684556855568655687556885568955690556915569255693556945569555696556975569855699557005570155702557035570455705557065570755708557095571055711557125571355714557155571655717557185571955720557215572255723557245572555726557275572855729557305573155732557335573455735557365573755738557395574055741557425574355744557455574655747557485574955750557515575255753557545575555756557575575855759557605576155762557635576455765557665576755768557695577055771557725577355774557755577655777557785577955780557815578255783557845578555786557875578855789557905579155792557935579455795557965579755798557995580055801558025580355804558055580655807558085580955810558115581255813558145581555816558175581855819558205582155822558235582455825558265582755828558295583055831558325583355834558355583655837558385583955840558415584255843558445584555846558475584855849558505585155852558535585455855558565585755858558595586055861558625586355864558655586655867558685586955870558715587255873558745587555876558775587855879558805588155882558835588455885558865588755888558895589055891558925589355894558955589655897558985589955900559015590255903559045590555906559075590855909559105591155912559135591455915559165591755918559195592055921559225592355924559255592655927559285592955930559315593255933559345593555936559375593855939559405594155942559435594455945559465594755948559495595055951559525595355954559555595655957559585595955960559615596255963559645596555966559675596855969559705597155972559735597455975559765597755978559795598055981559825598355984559855598655987559885598955990559915599255993559945599555996559975599855999560005600156002560035600456005560065600756008560095601056011560125601356014560155601656017560185601956020560215602256023560245602556026560275602856029560305603156032560335603456035560365603756038560395604056041560425604356044560455604656047560485604956050560515605256053560545605556056560575605856059560605606156062560635606456065560665606756068560695607056071560725607356074560755607656077560785607956080560815608256083560845608556086560875608856089560905609156092560935609456095560965609756098560995610056101561025610356104561055610656107561085610956110561115611256113561145611556116561175611856119561205612156122561235612456125561265612756128561295613056131561325613356134561355613656137561385613956140561415614256143561445614556146561475614856149561505615156152561535615456155561565615756158561595616056161561625616356164561655616656167561685616956170561715617256173561745617556176561775617856179561805618156182561835618456185561865618756188561895619056191561925619356194561955619656197561985619956200562015620256203562045620556206562075620856209562105621156212562135621456215562165621756218562195622056221562225622356224562255622656227562285622956230562315623256233562345623556236562375623856239562405624156242562435624456245562465624756248562495625056251562525625356254562555625656257562585625956260562615626256263562645626556266562675626856269562705627156272562735627456275562765627756278562795628056281562825628356284562855628656287562885628956290562915629256293562945629556296562975629856299563005630156302563035630456305563065630756308563095631056311563125631356314563155631656317563185631956320563215632256323563245632556326563275632856329563305633156332563335633456335563365633756338563395634056341563425634356344563455634656347563485634956350563515635256353563545635556356563575635856359563605636156362563635636456365563665636756368563695637056371563725637356374563755637656377563785637956380563815638256383563845638556386563875638856389563905639156392563935639456395563965639756398563995640056401564025640356404564055640656407564085640956410564115641256413564145641556416564175641856419564205642156422564235642456425564265642756428564295643056431564325643356434564355643656437564385643956440564415644256443564445644556446564475644856449564505645156452564535645456455564565645756458564595646056461564625646356464564655646656467564685646956470564715647256473564745647556476564775647856479564805648156482564835648456485564865648756488564895649056491564925649356494564955649656497564985649956500565015650256503565045650556506565075650856509565105651156512565135651456515565165651756518565195652056521565225652356524565255652656527565285652956530565315653256533565345653556536565375653856539565405654156542565435654456545565465654756548565495655056551565525655356554565555655656557565585655956560565615656256563565645656556566565675656856569565705657156572565735657456575565765657756578565795658056581565825658356584565855658656587565885658956590565915659256593565945659556596565975659856599566005660156602566035660456605566065660756608566095661056611566125661356614566155661656617566185661956620566215662256623566245662556626566275662856629566305663156632566335663456635566365663756638566395664056641566425664356644566455664656647566485664956650566515665256653566545665556656566575665856659566605666156662566635666456665566665666756668566695667056671566725667356674566755667656677566785667956680566815668256683566845668556686566875668856689566905669156692566935669456695566965669756698566995670056701567025670356704567055670656707567085670956710567115671256713567145671556716567175671856719567205672156722567235672456725567265672756728567295673056731567325673356734567355673656737567385673956740567415674256743567445674556746567475674856749567505675156752567535675456755567565675756758567595676056761567625676356764567655676656767567685676956770567715677256773567745677556776567775677856779567805678156782567835678456785567865678756788567895679056791567925679356794567955679656797567985679956800568015680256803568045680556806568075680856809568105681156812568135681456815568165681756818568195682056821568225682356824568255682656827568285682956830568315683256833568345683556836568375683856839568405684156842568435684456845568465684756848568495685056851568525685356854568555685656857568585685956860568615686256863568645686556866568675686856869568705687156872568735687456875568765687756878568795688056881568825688356884568855688656887568885688956890568915689256893568945689556896568975689856899569005690156902569035690456905569065690756908569095691056911569125691356914569155691656917569185691956920569215692256923569245692556926569275692856929569305693156932569335693456935569365693756938569395694056941569425694356944569455694656947569485694956950569515695256953569545695556956569575695856959569605696156962569635696456965569665696756968569695697056971569725697356974569755697656977569785697956980569815698256983569845698556986569875698856989569905699156992569935699456995569965699756998569995700057001570025700357004570055700657007570085700957010570115701257013570145701557016570175701857019570205702157022570235702457025570265702757028570295703057031570325703357034570355703657037570385703957040570415704257043570445704557046570475704857049570505705157052570535705457055570565705757058570595706057061570625706357064570655706657067570685706957070570715707257073570745707557076570775707857079570805708157082570835708457085570865708757088570895709057091570925709357094570955709657097570985709957100571015710257103571045710557106571075710857109571105711157112571135711457115571165711757118571195712057121571225712357124571255712657127571285712957130571315713257133571345713557136571375713857139571405714157142571435714457145571465714757148571495715057151571525715357154571555715657157571585715957160571615716257163571645716557166571675716857169571705717157172571735717457175571765717757178571795718057181571825718357184571855718657187571885718957190571915719257193571945719557196571975719857199572005720157202572035720457205572065720757208572095721057211572125721357214572155721657217572185721957220572215722257223572245722557226572275722857229572305723157232572335723457235572365723757238572395724057241572425724357244572455724657247572485724957250572515725257253572545725557256572575725857259572605726157262572635726457265572665726757268572695727057271572725727357274572755727657277572785727957280572815728257283572845728557286572875728857289572905729157292572935729457295572965729757298572995730057301573025730357304573055730657307573085730957310573115731257313573145731557316573175731857319573205732157322573235732457325573265732757328573295733057331573325733357334573355733657337573385733957340573415734257343573445734557346573475734857349573505735157352573535735457355573565735757358573595736057361573625736357364573655736657367573685736957370573715737257373573745737557376573775737857379573805738157382573835738457385573865738757388573895739057391573925739357394573955739657397573985739957400574015740257403574045740557406574075740857409574105741157412574135741457415574165741757418574195742057421574225742357424574255742657427574285742957430574315743257433574345743557436574375743857439574405744157442574435744457445574465744757448574495745057451574525745357454574555745657457574585745957460574615746257463574645746557466574675746857469574705747157472574735747457475574765747757478574795748057481574825748357484574855748657487574885748957490574915749257493574945749557496574975749857499575005750157502575035750457505575065750757508575095751057511575125751357514575155751657517575185751957520575215752257523575245752557526575275752857529575305753157532575335753457535575365753757538575395754057541575425754357544575455754657547575485754957550575515755257553575545755557556575575755857559575605756157562575635756457565575665756757568575695757057571575725757357574575755757657577575785757957580575815758257583575845758557586575875758857589575905759157592575935759457595575965759757598575995760057601576025760357604576055760657607576085760957610576115761257613576145761557616576175761857619576205762157622576235762457625576265762757628576295763057631576325763357634576355763657637576385763957640576415764257643576445764557646576475764857649576505765157652576535765457655576565765757658576595766057661576625766357664576655766657667576685766957670576715767257673576745767557676576775767857679576805768157682576835768457685576865768757688576895769057691576925769357694576955769657697576985769957700577015770257703577045770557706577075770857709577105771157712577135771457715577165771757718577195772057721577225772357724577255772657727577285772957730577315773257733577345773557736577375773857739577405774157742577435774457745577465774757748577495775057751577525775357754577555775657757577585775957760577615776257763577645776557766577675776857769577705777157772577735777457775577765777757778577795778057781577825778357784577855778657787577885778957790577915779257793577945779557796577975779857799578005780157802578035780457805578065780757808578095781057811578125781357814578155781657817578185781957820578215782257823578245782557826578275782857829578305783157832578335783457835578365783757838578395784057841578425784357844578455784657847578485784957850578515785257853578545785557856578575785857859578605786157862578635786457865578665786757868578695787057871578725787357874578755787657877578785787957880578815788257883578845788557886578875788857889578905789157892578935789457895578965789757898578995790057901579025790357904579055790657907579085790957910579115791257913579145791557916579175791857919579205792157922579235792457925579265792757928579295793057931579325793357934579355793657937579385793957940579415794257943579445794557946579475794857949579505795157952579535795457955579565795757958579595796057961579625796357964579655796657967579685796957970579715797257973579745797557976579775797857979579805798157982579835798457985579865798757988579895799057991579925799357994579955799657997579985799958000580015800258003580045800558006580075800858009580105801158012580135801458015580165801758018580195802058021580225802358024580255802658027580285802958030580315803258033580345803558036580375803858039580405804158042580435804458045580465804758048580495805058051580525805358054580555805658057580585805958060580615806258063580645806558066580675806858069580705807158072580735807458075580765807758078580795808058081580825808358084580855808658087580885808958090580915809258093580945809558096580975809858099581005810158102581035810458105581065810758108581095811058111581125811358114581155811658117581185811958120581215812258123581245812558126581275812858129581305813158132581335813458135581365813758138581395814058141581425814358144581455814658147581485814958150581515815258153581545815558156581575815858159581605816158162581635816458165581665816758168581695817058171581725817358174581755817658177581785817958180581815818258183581845818558186581875818858189581905819158192581935819458195581965819758198581995820058201582025820358204582055820658207582085820958210582115821258213582145821558216582175821858219582205822158222582235822458225582265822758228582295823058231582325823358234582355823658237582385823958240582415824258243582445824558246582475824858249582505825158252582535825458255582565825758258582595826058261582625826358264582655826658267582685826958270582715827258273582745827558276582775827858279582805828158282582835828458285582865828758288582895829058291582925829358294582955829658297582985829958300583015830258303583045830558306583075830858309583105831158312583135831458315583165831758318583195832058321583225832358324583255832658327583285832958330583315833258333583345833558336583375833858339583405834158342583435834458345583465834758348583495835058351583525835358354583555835658357583585835958360583615836258363583645836558366583675836858369583705837158372583735837458375583765837758378583795838058381583825838358384583855838658387583885838958390583915839258393583945839558396583975839858399584005840158402584035840458405584065840758408584095841058411584125841358414584155841658417584185841958420584215842258423584245842558426584275842858429584305843158432584335843458435584365843758438584395844058441584425844358444584455844658447584485844958450584515845258453584545845558456584575845858459584605846158462584635846458465584665846758468584695847058471584725847358474584755847658477584785847958480584815848258483584845848558486584875848858489584905849158492584935849458495584965849758498584995850058501585025850358504585055850658507585085850958510585115851258513585145851558516585175851858519585205852158522585235852458525585265852758528585295853058531585325853358534585355853658537585385853958540585415854258543585445854558546585475854858549585505855158552585535855458555585565855758558585595856058561585625856358564585655856658567585685856958570585715857258573585745857558576585775857858579585805858158582585835858458585585865858758588585895859058591585925859358594585955859658597585985859958600586015860258603586045860558606586075860858609586105861158612586135861458615586165861758618586195862058621586225862358624586255862658627586285862958630586315863258633586345863558636586375863858639586405864158642586435864458645586465864758648586495865058651586525865358654586555865658657586585865958660586615866258663586645866558666586675866858669586705867158672586735867458675586765867758678586795868058681586825868358684586855868658687586885868958690586915869258693586945869558696586975869858699587005870158702587035870458705587065870758708587095871058711587125871358714587155871658717587185871958720587215872258723587245872558726587275872858729587305873158732587335873458735587365873758738587395874058741587425874358744587455874658747587485874958750587515875258753587545875558756587575875858759587605876158762587635876458765587665876758768587695877058771587725877358774587755877658777587785877958780587815878258783587845878558786587875878858789587905879158792587935879458795587965879758798587995880058801588025880358804588055880658807588085880958810588115881258813588145881558816588175881858819588205882158822588235882458825588265882758828588295883058831588325883358834588355883658837588385883958840588415884258843588445884558846588475884858849588505885158852588535885458855588565885758858588595886058861588625886358864588655886658867588685886958870588715887258873588745887558876588775887858879588805888158882588835888458885588865888758888588895889058891588925889358894588955889658897588985889958900589015890258903589045890558906589075890858909589105891158912589135891458915589165891758918589195892058921589225892358924589255892658927589285892958930589315893258933589345893558936589375893858939589405894158942589435894458945589465894758948589495895058951589525895358954589555895658957589585895958960589615896258963589645896558966589675896858969589705897158972589735897458975589765897758978589795898058981589825898358984589855898658987589885898958990589915899258993589945899558996589975899858999590005900159002590035900459005590065900759008590095901059011590125901359014590155901659017590185901959020590215902259023590245902559026590275902859029590305903159032590335903459035590365903759038590395904059041590425904359044590455904659047590485904959050590515905259053590545905559056590575905859059590605906159062590635906459065590665906759068590695907059071590725907359074590755907659077590785907959080590815908259083590845908559086590875908859089590905909159092590935909459095590965909759098590995910059101591025910359104591055910659107591085910959110591115911259113591145911559116591175911859119591205912159122591235912459125591265912759128591295913059131591325913359134591355913659137591385913959140591415914259143591445914559146591475914859149591505915159152591535915459155591565915759158591595916059161591625916359164591655916659167591685916959170591715917259173591745917559176591775917859179591805918159182591835918459185591865918759188591895919059191591925919359194591955919659197591985919959200592015920259203592045920559206592075920859209592105921159212592135921459215592165921759218592195922059221592225922359224592255922659227592285922959230592315923259233592345923559236592375923859239592405924159242592435924459245592465924759248592495925059251592525925359254592555925659257592585925959260592615926259263592645926559266592675926859269592705927159272592735927459275592765927759278592795928059281592825928359284592855928659287592885928959290592915929259293592945929559296592975929859299593005930159302593035930459305593065930759308593095931059311593125931359314593155931659317593185931959320593215932259323593245932559326593275932859329593305933159332593335933459335593365933759338593395934059341593425934359344593455934659347593485934959350593515935259353593545935559356593575935859359593605936159362593635936459365593665936759368593695937059371593725937359374593755937659377593785937959380593815938259383593845938559386593875938859389593905939159392593935939459395593965939759398593995940059401594025940359404594055940659407594085940959410594115941259413594145941559416594175941859419594205942159422594235942459425594265942759428594295943059431594325943359434594355943659437594385943959440594415944259443594445944559446594475944859449594505945159452594535945459455594565945759458594595946059461594625946359464594655946659467594685946959470594715947259473594745947559476594775947859479594805948159482594835948459485594865948759488594895949059491594925949359494594955949659497594985949959500595015950259503595045950559506595075950859509595105951159512595135951459515595165951759518595195952059521595225952359524595255952659527595285952959530595315953259533595345953559536595375953859539595405954159542595435954459545595465954759548595495955059551595525955359554595555955659557595585955959560595615956259563595645956559566595675956859569595705957159572595735957459575595765957759578595795958059581595825958359584595855958659587595885958959590595915959259593595945959559596595975959859599596005960159602596035960459605596065960759608596095961059611596125961359614596155961659617596185961959620596215962259623596245962559626596275962859629596305963159632596335963459635596365963759638596395964059641596425964359644596455964659647596485964959650596515965259653596545965559656596575965859659596605966159662596635966459665596665966759668596695967059671596725967359674596755967659677596785967959680596815968259683596845968559686596875968859689596905969159692596935969459695596965969759698596995970059701597025970359704597055970659707597085970959710597115971259713597145971559716597175971859719597205972159722597235972459725597265972759728597295973059731597325973359734597355973659737597385973959740597415974259743597445974559746597475974859749597505975159752597535975459755597565975759758597595976059761597625976359764597655976659767597685976959770597715977259773597745977559776597775977859779597805978159782597835978459785597865978759788597895979059791597925979359794597955979659797597985979959800598015980259803598045980559806598075980859809598105981159812598135981459815598165981759818598195982059821598225982359824598255982659827598285982959830598315983259833598345983559836598375983859839598405984159842598435984459845598465984759848598495985059851598525985359854598555985659857598585985959860598615986259863598645986559866598675986859869598705987159872598735987459875598765987759878598795988059881598825988359884598855988659887598885988959890598915989259893598945989559896598975989859899599005990159902599035990459905599065990759908599095991059911599125991359914599155991659917599185991959920599215992259923599245992559926599275992859929599305993159932599335993459935599365993759938599395994059941599425994359944599455994659947599485994959950599515995259953599545995559956599575995859959599605996159962599635996459965599665996759968599695997059971599725997359974599755997659977599785997959980599815998259983599845998559986599875998859989599905999159992599935999459995599965999759998599996000060001600026000360004600056000660007600086000960010600116001260013600146001560016600176001860019600206002160022600236002460025600266002760028600296003060031600326003360034600356003660037600386003960040600416004260043600446004560046600476004860049600506005160052600536005460055600566005760058600596006060061600626006360064600656006660067600686006960070600716007260073600746007560076600776007860079600806008160082600836008460085600866008760088600896009060091600926009360094600956009660097600986009960100601016010260103601046010560106601076010860109601106011160112601136011460115601166011760118601196012060121601226012360124601256012660127601286012960130601316013260133601346013560136601376013860139601406014160142601436014460145601466014760148601496015060151601526015360154601556015660157601586015960160601616016260163601646016560166601676016860169601706017160172601736017460175601766017760178601796018060181601826018360184601856018660187601886018960190601916019260193601946019560196601976019860199602006020160202602036020460205602066020760208602096021060211602126021360214602156021660217602186021960220602216022260223602246022560226602276022860229602306023160232602336023460235602366023760238602396024060241602426024360244602456024660247602486024960250602516025260253602546025560256602576025860259602606026160262602636026460265602666026760268602696027060271602726027360274602756027660277602786027960280602816028260283602846028560286602876028860289602906029160292602936029460295602966029760298602996030060301603026030360304603056030660307603086030960310603116031260313603146031560316603176031860319603206032160322603236032460325603266032760328603296033060331603326033360334603356033660337603386033960340603416034260343603446034560346603476034860349603506035160352603536035460355603566035760358603596036060361603626036360364603656036660367603686036960370603716037260373603746037560376603776037860379603806038160382603836038460385603866038760388603896039060391603926039360394603956039660397603986039960400604016040260403604046040560406604076040860409604106041160412604136041460415604166041760418604196042060421604226042360424604256042660427604286042960430604316043260433604346043560436604376043860439604406044160442604436044460445604466044760448604496045060451604526045360454604556045660457604586045960460604616046260463604646046560466604676046860469604706047160472604736047460475604766047760478604796048060481604826048360484604856048660487604886048960490604916049260493604946049560496604976049860499605006050160502605036050460505605066050760508605096051060511605126051360514605156051660517605186051960520605216052260523605246052560526605276052860529605306053160532605336053460535605366053760538605396054060541605426054360544605456054660547605486054960550605516055260553605546055560556605576055860559605606056160562605636056460565605666056760568605696057060571605726057360574605756057660577605786057960580605816058260583605846058560586605876058860589605906059160592605936059460595605966059760598605996060060601606026060360604606056060660607606086060960610606116061260613606146061560616606176061860619606206062160622606236062460625606266062760628606296063060631606326063360634606356063660637606386063960640606416064260643606446064560646606476064860649606506065160652606536065460655606566065760658606596066060661606626066360664606656066660667606686066960670606716067260673606746067560676606776067860679606806068160682606836068460685606866068760688606896069060691606926069360694606956069660697606986069960700607016070260703607046070560706607076070860709607106071160712607136071460715607166071760718607196072060721607226072360724607256072660727607286072960730607316073260733607346073560736607376073860739607406074160742607436074460745607466074760748607496075060751607526075360754607556075660757607586075960760607616076260763607646076560766607676076860769607706077160772607736077460775607766077760778607796078060781607826078360784607856078660787607886078960790607916079260793607946079560796607976079860799608006080160802608036080460805608066080760808608096081060811608126081360814608156081660817608186081960820608216082260823608246082560826608276082860829608306083160832608336083460835608366083760838608396084060841608426084360844608456084660847608486084960850608516085260853608546085560856608576085860859608606086160862608636086460865608666086760868608696087060871608726087360874608756087660877608786087960880608816088260883608846088560886608876088860889608906089160892608936089460895608966089760898608996090060901609026090360904609056090660907609086090960910609116091260913609146091560916609176091860919609206092160922609236092460925609266092760928609296093060931609326093360934609356093660937609386093960940609416094260943609446094560946609476094860949609506095160952609536095460955609566095760958609596096060961609626096360964609656096660967609686096960970609716097260973609746097560976609776097860979609806098160982609836098460985609866098760988609896099060991609926099360994609956099660997609986099961000610016100261003610046100561006610076100861009610106101161012610136101461015610166101761018610196102061021610226102361024610256102661027610286102961030610316103261033610346103561036610376103861039610406104161042610436104461045610466104761048610496105061051610526105361054610556105661057610586105961060610616106261063610646106561066610676106861069610706107161072610736107461075610766107761078610796108061081610826108361084610856108661087610886108961090610916109261093610946109561096610976109861099611006110161102611036110461105611066110761108611096111061111611126111361114611156111661117611186111961120611216112261123611246112561126611276112861129611306113161132611336113461135611366113761138611396114061141611426114361144611456114661147611486114961150611516115261153611546115561156611576115861159611606116161162611636116461165611666116761168611696117061171611726117361174611756117661177611786117961180611816118261183611846118561186611876118861189611906119161192611936119461195611966119761198611996120061201612026120361204612056120661207612086120961210612116121261213612146121561216612176121861219612206122161222612236122461225612266122761228612296123061231612326123361234612356123661237612386123961240612416124261243612446124561246612476124861249612506125161252612536125461255612566125761258612596126061261612626126361264612656126661267612686126961270612716127261273612746127561276612776127861279612806128161282612836128461285612866128761288612896129061291612926129361294612956129661297612986129961300613016130261303613046130561306613076130861309613106131161312613136131461315613166131761318613196132061321613226132361324613256132661327613286132961330613316133261333613346133561336613376133861339613406134161342613436134461345613466134761348613496135061351613526135361354613556135661357613586135961360613616136261363613646136561366613676136861369613706137161372613736137461375613766137761378613796138061381613826138361384613856138661387613886138961390613916139261393613946139561396613976139861399614006140161402614036140461405614066140761408614096141061411614126141361414614156141661417614186141961420614216142261423614246142561426614276142861429614306143161432614336143461435614366143761438614396144061441614426144361444614456144661447614486144961450614516145261453614546145561456614576145861459614606146161462614636146461465614666146761468614696147061471614726147361474614756147661477614786147961480614816148261483614846148561486614876148861489614906149161492614936149461495614966149761498614996150061501615026150361504615056150661507615086150961510615116151261513615146151561516615176151861519615206152161522615236152461525615266152761528615296153061531615326153361534615356153661537615386153961540615416154261543615446154561546615476154861549615506155161552615536155461555615566155761558615596156061561615626156361564615656156661567615686156961570615716157261573615746157561576615776157861579615806158161582615836158461585615866158761588615896159061591615926159361594615956159661597615986159961600616016160261603616046160561606616076160861609616106161161612616136161461615616166161761618616196162061621616226162361624616256162661627616286162961630616316163261633616346163561636616376163861639616406164161642616436164461645616466164761648616496165061651616526165361654616556165661657616586165961660616616166261663616646166561666616676166861669616706167161672616736167461675616766167761678616796168061681616826168361684616856168661687616886168961690616916169261693616946169561696616976169861699617006170161702617036170461705617066170761708617096171061711617126171361714617156171661717617186171961720617216172261723617246172561726617276172861729617306173161732617336173461735617366173761738617396174061741617426174361744617456174661747617486174961750617516175261753617546175561756617576175861759617606176161762617636176461765617666176761768617696177061771617726177361774617756177661777617786177961780617816178261783617846178561786617876178861789617906179161792617936179461795617966179761798617996180061801618026180361804618056180661807618086180961810618116181261813618146181561816618176181861819618206182161822618236182461825618266182761828618296183061831618326183361834618356183661837618386183961840618416184261843618446184561846618476184861849618506185161852618536185461855618566185761858618596186061861618626186361864618656186661867618686186961870618716187261873618746187561876618776187861879618806188161882618836188461885618866188761888618896189061891618926189361894618956189661897618986189961900619016190261903619046190561906619076190861909619106191161912619136191461915619166191761918619196192061921619226192361924619256192661927619286192961930619316193261933619346193561936619376193861939619406194161942619436194461945619466194761948619496195061951619526195361954619556195661957619586195961960619616196261963619646196561966619676196861969619706197161972619736197461975619766197761978619796198061981619826198361984619856198661987619886198961990619916199261993619946199561996619976199861999620006200162002620036200462005620066200762008620096201062011620126201362014620156201662017620186201962020620216202262023620246202562026620276202862029620306203162032620336203462035620366203762038620396204062041620426204362044620456204662047620486204962050620516205262053620546205562056620576205862059620606206162062620636206462065620666206762068620696207062071620726207362074620756207662077620786207962080620816208262083620846208562086620876208862089620906209162092620936209462095620966209762098620996210062101621026210362104621056210662107621086210962110621116211262113621146211562116621176211862119621206212162122621236212462125621266212762128621296213062131621326213362134621356213662137621386213962140621416214262143621446214562146621476214862149621506215162152621536215462155621566215762158621596216062161621626216362164621656216662167621686216962170621716217262173621746217562176621776217862179621806218162182621836218462185621866218762188621896219062191621926219362194621956219662197621986219962200622016220262203622046220562206622076220862209622106221162212622136221462215622166221762218622196222062221622226222362224622256222662227622286222962230622316223262233622346223562236622376223862239622406224162242622436224462245622466224762248622496225062251622526225362254622556225662257622586225962260622616226262263622646226562266622676226862269622706227162272622736227462275622766227762278622796228062281622826228362284622856228662287622886228962290622916229262293622946229562296622976229862299623006230162302623036230462305623066230762308623096231062311623126231362314623156231662317623186231962320623216232262323623246232562326623276232862329623306233162332623336233462335623366233762338623396234062341623426234362344623456234662347623486234962350623516235262353623546235562356623576235862359623606236162362623636236462365623666236762368623696237062371623726237362374623756237662377623786237962380623816238262383623846238562386623876238862389623906239162392623936239462395623966239762398623996240062401624026240362404624056240662407624086240962410624116241262413624146241562416624176241862419624206242162422624236242462425624266242762428624296243062431624326243362434624356243662437624386243962440624416244262443624446244562446624476244862449624506245162452624536245462455624566245762458624596246062461624626246362464624656246662467624686246962470624716247262473624746247562476624776247862479624806248162482624836248462485624866248762488624896249062491624926249362494624956249662497624986249962500625016250262503625046250562506625076250862509625106251162512625136251462515625166251762518625196252062521625226252362524625256252662527625286252962530625316253262533625346253562536625376253862539625406254162542625436254462545625466254762548625496255062551625526255362554625556255662557625586255962560625616256262563625646256562566625676256862569625706257162572625736257462575625766257762578625796258062581625826258362584625856258662587625886258962590625916259262593625946259562596625976259862599626006260162602626036260462605626066260762608626096261062611626126261362614626156261662617626186261962620
  1. var Aag = Object.defineProperty;
  2. var J6 = (t) => {
  3. throw TypeError(t);
  4. };
  5. var sag = (t, I, g) => I in t ? Aag(t, I, { enumerable: !0, configurable: !0, writable: !0, value: g }) : t[I] = g;
  6. var iI = (t, I, g) => sag(t, typeof I != "symbol" ? I + "" : I, g), KH = (t, I, g) => I.has(t) || J6("Cannot " + g);
  7. var M = (t, I, g) => (KH(t, I, "read from private field"), g ? g.call(t) : I.get(t)), tg = (t, I, g) => I.has(t) ? J6("Cannot add the same private member more than once") : I instanceof WeakSet ? I.add(t) : I.set(t, g), $ = (t, I, g, C) => (KH(t, I, "write to private field"), C ? C.call(t, g) : I.set(t, g), g), ig = (t, I, g) => (KH(t, I, "access private method"), g);
  8. var Wi = (t, I, g, C) => ({
  9. set _(i) {
  10. $(t, I, i, g);
  11. },
  12. get _() {
  13. return M(t, I, C);
  14. }
  15. });
  16. import { ref as wi, onMounted as tG, createElementBlock as Pg, openBlock as Ug, createElementVNode as tC, normalizeStyle as Ae, Fragment as ct, renderList as vi, createApp as iG, computed as DA, onBeforeUnmount as s9, renderSlot as d$, createCommentVNode as Yt, withModifiers as ah, toDisplayString as um, defineComponent as r$, h as yI, unref as Dg, createBlock as h$, watch as b$, resolveComponent as lag, createTextVNode as nag, createVNode as aag, withCtx as oag, nextTick as cag, withDirectives as SY, vShow as DY } from "vue";
  17. var JI = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
  18. function u$(t) {
  19. return t && t.__esModule && Object.prototype.hasOwnProperty.call(t, "default") ? t.default : t;
  20. }
  21. function Qa(t) {
  22. throw new Error('Could not dynamically require "' + t + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
  23. }
  24. var FH = { exports: {} };
  25. /*!
  26. JSZip v3.10.1 - A JavaScript class for generating and reading zip files
  27. <http://stuartk.com/jszip>
  28. (c) 2009-2016 Stuart Knightley <stuart [at] stuartk.com>
  29. Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.
  30. JSZip uses the library pako released under the MIT license :
  31. https://github.com/nodeca/pako/blob/main/LICENSE
  32. */
  33. var L6;
  34. function dag() {
  35. return L6 || (L6 = 1, function(t, I) {
  36. (function(g) {
  37. t.exports = g();
  38. })(function() {
  39. return function g(C, i, e) {
  40. function A(n, a) {
  41. if (!i[n]) {
  42. if (!C[n]) {
  43. var d = typeof Qa == "function" && Qa;
  44. if (!a && d) return d(n, !0);
  45. if (s) return s(n, !0);
  46. var o = new Error("Cannot find module '" + n + "'");
  47. throw o.code = "MODULE_NOT_FOUND", o;
  48. }
  49. var c = i[n] = { exports: {} };
  50. C[n][0].call(c.exports, function(r) {
  51. var h = C[n][1][r];
  52. return A(h || r);
  53. }, c, c.exports, g, C, i, e);
  54. }
  55. return i[n].exports;
  56. }
  57. for (var s = typeof Qa == "function" && Qa, l = 0; l < e.length; l++) A(e[l]);
  58. return A;
  59. }({ 1: [function(g, C, i) {
  60. var e = g("./utils"), A = g("./support"), s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  61. i.encode = function(l) {
  62. for (var n, a, d, o, c, r, h, b = [], u = 0, m = l.length, Z = m, p = e.getTypeOf(l) !== "string"; u < l.length; ) Z = m - u, d = p ? (n = l[u++], a = u < m ? l[u++] : 0, u < m ? l[u++] : 0) : (n = l.charCodeAt(u++), a = u < m ? l.charCodeAt(u++) : 0, u < m ? l.charCodeAt(u++) : 0), o = n >> 2, c = (3 & n) << 4 | a >> 4, r = 1 < Z ? (15 & a) << 2 | d >> 6 : 64, h = 2 < Z ? 63 & d : 64, b.push(s.charAt(o) + s.charAt(c) + s.charAt(r) + s.charAt(h));
  63. return b.join("");
  64. }, i.decode = function(l) {
  65. var n, a, d, o, c, r, h = 0, b = 0, u = "data:";
  66. if (l.substr(0, u.length) === u) throw new Error("Invalid base64 input, it looks like a data url.");
  67. var m, Z = 3 * (l = l.replace(/[^A-Za-z0-9+/=]/g, "")).length / 4;
  68. if (l.charAt(l.length - 1) === s.charAt(64) && Z--, l.charAt(l.length - 2) === s.charAt(64) && Z--, Z % 1 != 0) throw new Error("Invalid base64 input, bad content length.");
  69. for (m = A.uint8array ? new Uint8Array(0 | Z) : new Array(0 | Z); h < l.length; ) n = s.indexOf(l.charAt(h++)) << 2 | (o = s.indexOf(l.charAt(h++))) >> 4, a = (15 & o) << 4 | (c = s.indexOf(l.charAt(h++))) >> 2, d = (3 & c) << 6 | (r = s.indexOf(l.charAt(h++))), m[b++] = n, c !== 64 && (m[b++] = a), r !== 64 && (m[b++] = d);
  70. return m;
  71. };
  72. }, { "./support": 30, "./utils": 32 }], 2: [function(g, C, i) {
  73. var e = g("./external"), A = g("./stream/DataWorker"), s = g("./stream/Crc32Probe"), l = g("./stream/DataLengthProbe");
  74. function n(a, d, o, c, r) {
  75. this.compressedSize = a, this.uncompressedSize = d, this.crc32 = o, this.compression = c, this.compressedContent = r;
  76. }
  77. n.prototype = { getContentWorker: function() {
  78. var a = new A(e.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new l("data_length")), d = this;
  79. return a.on("end", function() {
  80. if (this.streamInfo.data_length !== d.uncompressedSize) throw new Error("Bug : uncompressed data size mismatch");
  81. }), a;
  82. }, getCompressedWorker: function() {
  83. return new A(e.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize", this.compressedSize).withStreamInfo("uncompressedSize", this.uncompressedSize).withStreamInfo("crc32", this.crc32).withStreamInfo("compression", this.compression);
  84. } }, n.createWorkerFrom = function(a, d, o) {
  85. return a.pipe(new s()).pipe(new l("uncompressedSize")).pipe(d.compressWorker(o)).pipe(new l("compressedSize")).withStreamInfo("compression", d);
  86. }, C.exports = n;
  87. }, { "./external": 6, "./stream/Crc32Probe": 25, "./stream/DataLengthProbe": 26, "./stream/DataWorker": 27 }], 3: [function(g, C, i) {
  88. var e = g("./stream/GenericWorker");
  89. i.STORE = { magic: "\0\0", compressWorker: function() {
  90. return new e("STORE compression");
  91. }, uncompressWorker: function() {
  92. return new e("STORE decompression");
  93. } }, i.DEFLATE = g("./flate");
  94. }, { "./flate": 7, "./stream/GenericWorker": 28 }], 4: [function(g, C, i) {
  95. var e = g("./utils"), A = function() {
  96. for (var s, l = [], n = 0; n < 256; n++) {
  97. s = n;
  98. for (var a = 0; a < 8; a++) s = 1 & s ? 3988292384 ^ s >>> 1 : s >>> 1;
  99. l[n] = s;
  100. }
  101. return l;
  102. }();
  103. C.exports = function(s, l) {
  104. return s !== void 0 && s.length ? e.getTypeOf(s) !== "string" ? function(n, a, d, o) {
  105. var c = A, r = o + d;
  106. n ^= -1;
  107. for (var h = o; h < r; h++) n = n >>> 8 ^ c[255 & (n ^ a[h])];
  108. return -1 ^ n;
  109. }(0 | l, s, s.length, 0) : function(n, a, d, o) {
  110. var c = A, r = o + d;
  111. n ^= -1;
  112. for (var h = o; h < r; h++) n = n >>> 8 ^ c[255 & (n ^ a.charCodeAt(h))];
  113. return -1 ^ n;
  114. }(0 | l, s, s.length, 0) : 0;
  115. };
  116. }, { "./utils": 32 }], 5: [function(g, C, i) {
  117. i.base64 = !1, i.binary = !1, i.dir = !1, i.createFolders = !0, i.date = null, i.compression = null, i.compressionOptions = null, i.comment = null, i.unixPermissions = null, i.dosPermissions = null;
  118. }, {}], 6: [function(g, C, i) {
  119. var e = null;
  120. e = typeof Promise < "u" ? Promise : g("lie"), C.exports = { Promise: e };
  121. }, { lie: 37 }], 7: [function(g, C, i) {
  122. var e = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Uint32Array < "u", A = g("pako"), s = g("./utils"), l = g("./stream/GenericWorker"), n = e ? "uint8array" : "array";
  123. function a(d, o) {
  124. l.call(this, "FlateWorker/" + d), this._pako = null, this._pakoAction = d, this._pakoOptions = o, this.meta = {};
  125. }
  126. i.magic = "\b\0", s.inherits(a, l), a.prototype.processChunk = function(d) {
  127. this.meta = d.meta, this._pako === null && this._createPako(), this._pako.push(s.transformTo(n, d.data), !1);
  128. }, a.prototype.flush = function() {
  129. l.prototype.flush.call(this), this._pako === null && this._createPako(), this._pako.push([], !0);
  130. }, a.prototype.cleanUp = function() {
  131. l.prototype.cleanUp.call(this), this._pako = null;
  132. }, a.prototype._createPako = function() {
  133. this._pako = new A[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });
  134. var d = this;
  135. this._pako.onData = function(o) {
  136. d.push({ data: o, meta: d.meta });
  137. };
  138. }, i.compressWorker = function(d) {
  139. return new a("Deflate", d);
  140. }, i.uncompressWorker = function() {
  141. return new a("Inflate", {});
  142. };
  143. }, { "./stream/GenericWorker": 28, "./utils": 32, pako: 38 }], 8: [function(g, C, i) {
  144. function e(c, r) {
  145. var h, b = "";
  146. for (h = 0; h < r; h++) b += String.fromCharCode(255 & c), c >>>= 8;
  147. return b;
  148. }
  149. function A(c, r, h, b, u, m) {
  150. var Z, p, Y = c.file, R = c.compression, X = m !== n.utf8encode, H = s.transformTo("string", m(Y.name)), S = s.transformTo("string", n.utf8encode(Y.name)), z = Y.comment, v = s.transformTo("string", m(z)), K = s.transformTo("string", n.utf8encode(z)), V = S.length !== Y.name.length, N = K.length !== z.length, B = "", G = "", w = "", W = Y.dir, y = Y.date, f = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };
  151. r && !h || (f.crc32 = c.crc32, f.compressedSize = c.compressedSize, f.uncompressedSize = c.uncompressedSize);
  152. var D = 0;
  153. r && (D |= 8), X || !V && !N || (D |= 2048);
  154. var F = 0, T = 0;
  155. W && (F |= 16), u === "UNIX" ? (T = 798, F |= function(P, L) {
  156. var E = P;
  157. return P || (E = L ? 16893 : 33204), (65535 & E) << 16;
  158. }(Y.unixPermissions, W)) : (T = 20, F |= function(P) {
  159. return 63 & (P || 0);
  160. }(Y.dosPermissions)), Z = y.getUTCHours(), Z <<= 6, Z |= y.getUTCMinutes(), Z <<= 5, Z |= y.getUTCSeconds() / 2, p = y.getUTCFullYear() - 1980, p <<= 4, p |= y.getUTCMonth() + 1, p <<= 5, p |= y.getUTCDate(), V && (G = e(1, 1) + e(a(H), 4) + S, B += "up" + e(G.length, 2) + G), N && (w = e(1, 1) + e(a(v), 4) + K, B += "uc" + e(w.length, 2) + w);
  161. var Q = "";
  162. return Q += `
  163. \0`, Q += e(D, 2), Q += R.magic, Q += e(Z, 2), Q += e(p, 2), Q += e(f.crc32, 4), Q += e(f.compressedSize, 4), Q += e(f.uncompressedSize, 4), Q += e(H.length, 2), Q += e(B.length, 2), { fileRecord: d.LOCAL_FILE_HEADER + Q + H + B, dirRecord: d.CENTRAL_FILE_HEADER + e(T, 2) + Q + e(v.length, 2) + "\0\0\0\0" + e(F, 4) + e(b, 4) + H + B + v };
  164. }
  165. var s = g("../utils"), l = g("../stream/GenericWorker"), n = g("../utf8"), a = g("../crc32"), d = g("../signature");
  166. function o(c, r, h, b) {
  167. l.call(this, "ZipFileWorker"), this.bytesWritten = 0, this.zipComment = r, this.zipPlatform = h, this.encodeFileName = b, this.streamFiles = c, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];
  168. }
  169. s.inherits(o, l), o.prototype.push = function(c) {
  170. var r = c.meta.percent || 0, h = this.entriesCount, b = this._sources.length;
  171. this.accumulate ? this.contentBuffer.push(c) : (this.bytesWritten += c.data.length, l.prototype.push.call(this, { data: c.data, meta: { currentFile: this.currentFile, percent: h ? (r + 100 * (h - b - 1)) / h : 100 } }));
  172. }, o.prototype.openedSource = function(c) {
  173. this.currentSourceOffset = this.bytesWritten, this.currentFile = c.file.name;
  174. var r = this.streamFiles && !c.file.dir;
  175. if (r) {
  176. var h = A(c, r, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
  177. this.push({ data: h.fileRecord, meta: { percent: 0 } });
  178. } else this.accumulate = !0;
  179. }, o.prototype.closedSource = function(c) {
  180. this.accumulate = !1;
  181. var r = this.streamFiles && !c.file.dir, h = A(c, r, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
  182. if (this.dirRecords.push(h.dirRecord), r) this.push({ data: function(b) {
  183. return d.DATA_DESCRIPTOR + e(b.crc32, 4) + e(b.compressedSize, 4) + e(b.uncompressedSize, 4);
  184. }(c), meta: { percent: 100 } });
  185. else for (this.push({ data: h.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length; ) this.push(this.contentBuffer.shift());
  186. this.currentFile = null;
  187. }, o.prototype.flush = function() {
  188. for (var c = this.bytesWritten, r = 0; r < this.dirRecords.length; r++) this.push({ data: this.dirRecords[r], meta: { percent: 100 } });
  189. var h = this.bytesWritten - c, b = function(u, m, Z, p, Y) {
  190. var R = s.transformTo("string", Y(p));
  191. return d.CENTRAL_DIRECTORY_END + "\0\0\0\0" + e(u, 2) + e(u, 2) + e(m, 4) + e(Z, 4) + e(R.length, 2) + R;
  192. }(this.dirRecords.length, h, c, this.zipComment, this.encodeFileName);
  193. this.push({ data: b, meta: { percent: 100 } });
  194. }, o.prototype.prepareNextSource = function() {
  195. this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();
  196. }, o.prototype.registerPrevious = function(c) {
  197. this._sources.push(c);
  198. var r = this;
  199. return c.on("data", function(h) {
  200. r.processChunk(h);
  201. }), c.on("end", function() {
  202. r.closedSource(r.previous.streamInfo), r._sources.length ? r.prepareNextSource() : r.end();
  203. }), c.on("error", function(h) {
  204. r.error(h);
  205. }), this;
  206. }, o.prototype.resume = function() {
  207. return !!l.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));
  208. }, o.prototype.error = function(c) {
  209. var r = this._sources;
  210. if (!l.prototype.error.call(this, c)) return !1;
  211. for (var h = 0; h < r.length; h++) try {
  212. r[h].error(c);
  213. } catch {
  214. }
  215. return !0;
  216. }, o.prototype.lock = function() {
  217. l.prototype.lock.call(this);
  218. for (var c = this._sources, r = 0; r < c.length; r++) c[r].lock();
  219. }, C.exports = o;
  220. }, { "../crc32": 4, "../signature": 23, "../stream/GenericWorker": 28, "../utf8": 31, "../utils": 32 }], 9: [function(g, C, i) {
  221. var e = g("../compressions"), A = g("./ZipFileWorker");
  222. i.generateWorker = function(s, l, n) {
  223. var a = new A(l.streamFiles, n, l.platform, l.encodeFileName), d = 0;
  224. try {
  225. s.forEach(function(o, c) {
  226. d++;
  227. var r = function(m, Z) {
  228. var p = m || Z, Y = e[p];
  229. if (!Y) throw new Error(p + " is not a valid compression method !");
  230. return Y;
  231. }(c.options.compression, l.compression), h = c.options.compressionOptions || l.compressionOptions || {}, b = c.dir, u = c.date;
  232. c._compressWorker(r, h).withStreamInfo("file", { name: o, dir: b, date: u, comment: c.comment || "", unixPermissions: c.unixPermissions, dosPermissions: c.dosPermissions }).pipe(a);
  233. }), a.entriesCount = d;
  234. } catch (o) {
  235. a.error(o);
  236. }
  237. return a;
  238. };
  239. }, { "../compressions": 3, "./ZipFileWorker": 8 }], 10: [function(g, C, i) {
  240. function e() {
  241. if (!(this instanceof e)) return new e();
  242. if (arguments.length) throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");
  243. this.files = /* @__PURE__ */ Object.create(null), this.comment = null, this.root = "", this.clone = function() {
  244. var A = new e();
  245. for (var s in this) typeof this[s] != "function" && (A[s] = this[s]);
  246. return A;
  247. };
  248. }
  249. (e.prototype = g("./object")).loadAsync = g("./load"), e.support = g("./support"), e.defaults = g("./defaults"), e.version = "3.10.1", e.loadAsync = function(A, s) {
  250. return new e().loadAsync(A, s);
  251. }, e.external = g("./external"), C.exports = e;
  252. }, { "./defaults": 5, "./external": 6, "./load": 11, "./object": 15, "./support": 30 }], 11: [function(g, C, i) {
  253. var e = g("./utils"), A = g("./external"), s = g("./utf8"), l = g("./zipEntries"), n = g("./stream/Crc32Probe"), a = g("./nodejsUtils");
  254. function d(o) {
  255. return new A.Promise(function(c, r) {
  256. var h = o.decompressed.getContentWorker().pipe(new n());
  257. h.on("error", function(b) {
  258. r(b);
  259. }).on("end", function() {
  260. h.streamInfo.crc32 !== o.decompressed.crc32 ? r(new Error("Corrupted zip : CRC32 mismatch")) : c();
  261. }).resume();
  262. });
  263. }
  264. C.exports = function(o, c) {
  265. var r = this;
  266. return c = e.extend(c || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: s.utf8decode }), a.isNode && a.isStream(o) ? A.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")) : e.prepareContent("the loaded zip file", o, !0, c.optimizedBinaryString, c.base64).then(function(h) {
  267. var b = new l(c);
  268. return b.load(h), b;
  269. }).then(function(h) {
  270. var b = [A.Promise.resolve(h)], u = h.files;
  271. if (c.checkCRC32) for (var m = 0; m < u.length; m++) b.push(d(u[m]));
  272. return A.Promise.all(b);
  273. }).then(function(h) {
  274. for (var b = h.shift(), u = b.files, m = 0; m < u.length; m++) {
  275. var Z = u[m], p = Z.fileNameStr, Y = e.resolve(Z.fileNameStr);
  276. r.file(Y, Z.decompressed, { binary: !0, optimizedBinaryString: !0, date: Z.date, dir: Z.dir, comment: Z.fileCommentStr.length ? Z.fileCommentStr : null, unixPermissions: Z.unixPermissions, dosPermissions: Z.dosPermissions, createFolders: c.createFolders }), Z.dir || (r.file(Y).unsafeOriginalName = p);
  277. }
  278. return b.zipComment.length && (r.comment = b.zipComment), r;
  279. });
  280. };
  281. }, { "./external": 6, "./nodejsUtils": 14, "./stream/Crc32Probe": 25, "./utf8": 31, "./utils": 32, "./zipEntries": 33 }], 12: [function(g, C, i) {
  282. var e = g("../utils"), A = g("../stream/GenericWorker");
  283. function s(l, n) {
  284. A.call(this, "Nodejs stream input adapter for " + l), this._upstreamEnded = !1, this._bindStream(n);
  285. }
  286. e.inherits(s, A), s.prototype._bindStream = function(l) {
  287. var n = this;
  288. (this._stream = l).pause(), l.on("data", function(a) {
  289. n.push({ data: a, meta: { percent: 0 } });
  290. }).on("error", function(a) {
  291. n.isPaused ? this.generatedError = a : n.error(a);
  292. }).on("end", function() {
  293. n.isPaused ? n._upstreamEnded = !0 : n.end();
  294. });
  295. }, s.prototype.pause = function() {
  296. return !!A.prototype.pause.call(this) && (this._stream.pause(), !0);
  297. }, s.prototype.resume = function() {
  298. return !!A.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);
  299. }, C.exports = s;
  300. }, { "../stream/GenericWorker": 28, "../utils": 32 }], 13: [function(g, C, i) {
  301. var e = g("readable-stream").Readable;
  302. function A(s, l, n) {
  303. e.call(this, l), this._helper = s;
  304. var a = this;
  305. s.on("data", function(d, o) {
  306. a.push(d) || a._helper.pause(), n && n(o);
  307. }).on("error", function(d) {
  308. a.emit("error", d);
  309. }).on("end", function() {
  310. a.push(null);
  311. });
  312. }
  313. g("../utils").inherits(A, e), A.prototype._read = function() {
  314. this._helper.resume();
  315. }, C.exports = A;
  316. }, { "../utils": 32, "readable-stream": 16 }], 14: [function(g, C, i) {
  317. C.exports = { isNode: typeof Buffer < "u", newBufferFrom: function(e, A) {
  318. if (Buffer.from && Buffer.from !== Uint8Array.from) return Buffer.from(e, A);
  319. if (typeof e == "number") throw new Error('The "data" argument must not be a number');
  320. return new Buffer(e, A);
  321. }, allocBuffer: function(e) {
  322. if (Buffer.alloc) return Buffer.alloc(e);
  323. var A = new Buffer(e);
  324. return A.fill(0), A;
  325. }, isBuffer: function(e) {
  326. return Buffer.isBuffer(e);
  327. }, isStream: function(e) {
  328. return e && typeof e.on == "function" && typeof e.pause == "function" && typeof e.resume == "function";
  329. } };
  330. }, {}], 15: [function(g, C, i) {
  331. function e(Y, R, X) {
  332. var H, S = s.getTypeOf(R), z = s.extend(X || {}, a);
  333. z.date = z.date || /* @__PURE__ */ new Date(), z.compression !== null && (z.compression = z.compression.toUpperCase()), typeof z.unixPermissions == "string" && (z.unixPermissions = parseInt(z.unixPermissions, 8)), z.unixPermissions && 16384 & z.unixPermissions && (z.dir = !0), z.dosPermissions && 16 & z.dosPermissions && (z.dir = !0), z.dir && (Y = u(Y)), z.createFolders && (H = b(Y)) && m.call(this, H, !0);
  334. var v = S === "string" && z.binary === !1 && z.base64 === !1;
  335. X && X.binary !== void 0 || (z.binary = !v), (R instanceof d && R.uncompressedSize === 0 || z.dir || !R || R.length === 0) && (z.base64 = !1, z.binary = !0, R = "", z.compression = "STORE", S = "string");
  336. var K = null;
  337. K = R instanceof d || R instanceof l ? R : r.isNode && r.isStream(R) ? new h(Y, R) : s.prepareContent(Y, R, z.binary, z.optimizedBinaryString, z.base64);
  338. var V = new o(Y, K, z);
  339. this.files[Y] = V;
  340. }
  341. var A = g("./utf8"), s = g("./utils"), l = g("./stream/GenericWorker"), n = g("./stream/StreamHelper"), a = g("./defaults"), d = g("./compressedObject"), o = g("./zipObject"), c = g("./generate"), r = g("./nodejsUtils"), h = g("./nodejs/NodejsStreamInputAdapter"), b = function(Y) {
  342. Y.slice(-1) === "/" && (Y = Y.substring(0, Y.length - 1));
  343. var R = Y.lastIndexOf("/");
  344. return 0 < R ? Y.substring(0, R) : "";
  345. }, u = function(Y) {
  346. return Y.slice(-1) !== "/" && (Y += "/"), Y;
  347. }, m = function(Y, R) {
  348. return R = R !== void 0 ? R : a.createFolders, Y = u(Y), this.files[Y] || e.call(this, Y, null, { dir: !0, createFolders: R }), this.files[Y];
  349. };
  350. function Z(Y) {
  351. return Object.prototype.toString.call(Y) === "[object RegExp]";
  352. }
  353. var p = { load: function() {
  354. throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
  355. }, forEach: function(Y) {
  356. var R, X, H;
  357. for (R in this.files) H = this.files[R], (X = R.slice(this.root.length, R.length)) && R.slice(0, this.root.length) === this.root && Y(X, H);
  358. }, filter: function(Y) {
  359. var R = [];
  360. return this.forEach(function(X, H) {
  361. Y(X, H) && R.push(H);
  362. }), R;
  363. }, file: function(Y, R, X) {
  364. if (arguments.length !== 1) return Y = this.root + Y, e.call(this, Y, R, X), this;
  365. if (Z(Y)) {
  366. var H = Y;
  367. return this.filter(function(z, v) {
  368. return !v.dir && H.test(z);
  369. });
  370. }
  371. var S = this.files[this.root + Y];
  372. return S && !S.dir ? S : null;
  373. }, folder: function(Y) {
  374. if (!Y) return this;
  375. if (Z(Y)) return this.filter(function(S, z) {
  376. return z.dir && Y.test(S);
  377. });
  378. var R = this.root + Y, X = m.call(this, R), H = this.clone();
  379. return H.root = X.name, H;
  380. }, remove: function(Y) {
  381. Y = this.root + Y;
  382. var R = this.files[Y];
  383. if (R || (Y.slice(-1) !== "/" && (Y += "/"), R = this.files[Y]), R && !R.dir) delete this.files[Y];
  384. else for (var X = this.filter(function(S, z) {
  385. return z.name.slice(0, Y.length) === Y;
  386. }), H = 0; H < X.length; H++) delete this.files[X[H].name];
  387. return this;
  388. }, generate: function() {
  389. throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
  390. }, generateInternalStream: function(Y) {
  391. var R, X = {};
  392. try {
  393. if ((X = s.extend(Y || {}, { streamFiles: !1, compression: "STORE", compressionOptions: null, type: "", platform: "DOS", comment: null, mimeType: "application/zip", encodeFileName: A.utf8encode })).type = X.type.toLowerCase(), X.compression = X.compression.toUpperCase(), X.type === "binarystring" && (X.type = "string"), !X.type) throw new Error("No output type specified.");
  394. s.checkSupport(X.type), X.platform !== "darwin" && X.platform !== "freebsd" && X.platform !== "linux" && X.platform !== "sunos" || (X.platform = "UNIX"), X.platform === "win32" && (X.platform = "DOS");
  395. var H = X.comment || this.comment || "";
  396. R = c.generateWorker(this, X, H);
  397. } catch (S) {
  398. (R = new l("error")).error(S);
  399. }
  400. return new n(R, X.type || "string", X.mimeType);
  401. }, generateAsync: function(Y, R) {
  402. return this.generateInternalStream(Y).accumulate(R);
  403. }, generateNodeStream: function(Y, R) {
  404. return (Y = Y || {}).type || (Y.type = "nodebuffer"), this.generateInternalStream(Y).toNodejsStream(R);
  405. } };
  406. C.exports = p;
  407. }, { "./compressedObject": 2, "./defaults": 5, "./generate": 9, "./nodejs/NodejsStreamInputAdapter": 12, "./nodejsUtils": 14, "./stream/GenericWorker": 28, "./stream/StreamHelper": 29, "./utf8": 31, "./utils": 32, "./zipObject": 35 }], 16: [function(g, C, i) {
  408. C.exports = g("stream");
  409. }, { stream: void 0 }], 17: [function(g, C, i) {
  410. var e = g("./DataReader");
  411. function A(s) {
  412. e.call(this, s);
  413. for (var l = 0; l < this.data.length; l++) s[l] = 255 & s[l];
  414. }
  415. g("../utils").inherits(A, e), A.prototype.byteAt = function(s) {
  416. return this.data[this.zero + s];
  417. }, A.prototype.lastIndexOfSignature = function(s) {
  418. for (var l = s.charCodeAt(0), n = s.charCodeAt(1), a = s.charCodeAt(2), d = s.charCodeAt(3), o = this.length - 4; 0 <= o; --o) if (this.data[o] === l && this.data[o + 1] === n && this.data[o + 2] === a && this.data[o + 3] === d) return o - this.zero;
  419. return -1;
  420. }, A.prototype.readAndCheckSignature = function(s) {
  421. var l = s.charCodeAt(0), n = s.charCodeAt(1), a = s.charCodeAt(2), d = s.charCodeAt(3), o = this.readData(4);
  422. return l === o[0] && n === o[1] && a === o[2] && d === o[3];
  423. }, A.prototype.readData = function(s) {
  424. if (this.checkOffset(s), s === 0) return [];
  425. var l = this.data.slice(this.zero + this.index, this.zero + this.index + s);
  426. return this.index += s, l;
  427. }, C.exports = A;
  428. }, { "../utils": 32, "./DataReader": 18 }], 18: [function(g, C, i) {
  429. var e = g("../utils");
  430. function A(s) {
  431. this.data = s, this.length = s.length, this.index = 0, this.zero = 0;
  432. }
  433. A.prototype = { checkOffset: function(s) {
  434. this.checkIndex(this.index + s);
  435. }, checkIndex: function(s) {
  436. if (this.length < this.zero + s || s < 0) throw new Error("End of data reached (data length = " + this.length + ", asked index = " + s + "). Corrupted zip ?");
  437. }, setIndex: function(s) {
  438. this.checkIndex(s), this.index = s;
  439. }, skip: function(s) {
  440. this.setIndex(this.index + s);
  441. }, byteAt: function() {
  442. }, readInt: function(s) {
  443. var l, n = 0;
  444. for (this.checkOffset(s), l = this.index + s - 1; l >= this.index; l--) n = (n << 8) + this.byteAt(l);
  445. return this.index += s, n;
  446. }, readString: function(s) {
  447. return e.transformTo("string", this.readData(s));
  448. }, readData: function() {
  449. }, lastIndexOfSignature: function() {
  450. }, readAndCheckSignature: function() {
  451. }, readDate: function() {
  452. var s = this.readInt(4);
  453. return new Date(Date.UTC(1980 + (s >> 25 & 127), (s >> 21 & 15) - 1, s >> 16 & 31, s >> 11 & 31, s >> 5 & 63, (31 & s) << 1));
  454. } }, C.exports = A;
  455. }, { "../utils": 32 }], 19: [function(g, C, i) {
  456. var e = g("./Uint8ArrayReader");
  457. function A(s) {
  458. e.call(this, s);
  459. }
  460. g("../utils").inherits(A, e), A.prototype.readData = function(s) {
  461. this.checkOffset(s);
  462. var l = this.data.slice(this.zero + this.index, this.zero + this.index + s);
  463. return this.index += s, l;
  464. }, C.exports = A;
  465. }, { "../utils": 32, "./Uint8ArrayReader": 21 }], 20: [function(g, C, i) {
  466. var e = g("./DataReader");
  467. function A(s) {
  468. e.call(this, s);
  469. }
  470. g("../utils").inherits(A, e), A.prototype.byteAt = function(s) {
  471. return this.data.charCodeAt(this.zero + s);
  472. }, A.prototype.lastIndexOfSignature = function(s) {
  473. return this.data.lastIndexOf(s) - this.zero;
  474. }, A.prototype.readAndCheckSignature = function(s) {
  475. return s === this.readData(4);
  476. }, A.prototype.readData = function(s) {
  477. this.checkOffset(s);
  478. var l = this.data.slice(this.zero + this.index, this.zero + this.index + s);
  479. return this.index += s, l;
  480. }, C.exports = A;
  481. }, { "../utils": 32, "./DataReader": 18 }], 21: [function(g, C, i) {
  482. var e = g("./ArrayReader");
  483. function A(s) {
  484. e.call(this, s);
  485. }
  486. g("../utils").inherits(A, e), A.prototype.readData = function(s) {
  487. if (this.checkOffset(s), s === 0) return new Uint8Array(0);
  488. var l = this.data.subarray(this.zero + this.index, this.zero + this.index + s);
  489. return this.index += s, l;
  490. }, C.exports = A;
  491. }, { "../utils": 32, "./ArrayReader": 17 }], 22: [function(g, C, i) {
  492. var e = g("../utils"), A = g("../support"), s = g("./ArrayReader"), l = g("./StringReader"), n = g("./NodeBufferReader"), a = g("./Uint8ArrayReader");
  493. C.exports = function(d) {
  494. var o = e.getTypeOf(d);
  495. return e.checkSupport(o), o !== "string" || A.uint8array ? o === "nodebuffer" ? new n(d) : A.uint8array ? new a(e.transformTo("uint8array", d)) : new s(e.transformTo("array", d)) : new l(d);
  496. };
  497. }, { "../support": 30, "../utils": 32, "./ArrayReader": 17, "./NodeBufferReader": 19, "./StringReader": 20, "./Uint8ArrayReader": 21 }], 23: [function(g, C, i) {
  498. i.LOCAL_FILE_HEADER = "PK", i.CENTRAL_FILE_HEADER = "PK", i.CENTRAL_DIRECTORY_END = "PK", i.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x07", i.ZIP64_CENTRAL_DIRECTORY_END = "PK", i.DATA_DESCRIPTOR = "PK\x07\b";
  499. }, {}], 24: [function(g, C, i) {
  500. var e = g("./GenericWorker"), A = g("../utils");
  501. function s(l) {
  502. e.call(this, "ConvertWorker to " + l), this.destType = l;
  503. }
  504. A.inherits(s, e), s.prototype.processChunk = function(l) {
  505. this.push({ data: A.transformTo(this.destType, l.data), meta: l.meta });
  506. }, C.exports = s;
  507. }, { "../utils": 32, "./GenericWorker": 28 }], 25: [function(g, C, i) {
  508. var e = g("./GenericWorker"), A = g("../crc32");
  509. function s() {
  510. e.call(this, "Crc32Probe"), this.withStreamInfo("crc32", 0);
  511. }
  512. g("../utils").inherits(s, e), s.prototype.processChunk = function(l) {
  513. this.streamInfo.crc32 = A(l.data, this.streamInfo.crc32 || 0), this.push(l);
  514. }, C.exports = s;
  515. }, { "../crc32": 4, "../utils": 32, "./GenericWorker": 28 }], 26: [function(g, C, i) {
  516. var e = g("../utils"), A = g("./GenericWorker");
  517. function s(l) {
  518. A.call(this, "DataLengthProbe for " + l), this.propName = l, this.withStreamInfo(l, 0);
  519. }
  520. e.inherits(s, A), s.prototype.processChunk = function(l) {
  521. if (l) {
  522. var n = this.streamInfo[this.propName] || 0;
  523. this.streamInfo[this.propName] = n + l.data.length;
  524. }
  525. A.prototype.processChunk.call(this, l);
  526. }, C.exports = s;
  527. }, { "../utils": 32, "./GenericWorker": 28 }], 27: [function(g, C, i) {
  528. var e = g("../utils"), A = g("./GenericWorker");
  529. function s(l) {
  530. A.call(this, "DataWorker");
  531. var n = this;
  532. this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = "", this._tickScheduled = !1, l.then(function(a) {
  533. n.dataIsReady = !0, n.data = a, n.max = a && a.length || 0, n.type = e.getTypeOf(a), n.isPaused || n._tickAndRepeat();
  534. }, function(a) {
  535. n.error(a);
  536. });
  537. }
  538. e.inherits(s, A), s.prototype.cleanUp = function() {
  539. A.prototype.cleanUp.call(this), this.data = null;
  540. }, s.prototype.resume = function() {
  541. return !!A.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, e.delay(this._tickAndRepeat, [], this)), !0);
  542. }, s.prototype._tickAndRepeat = function() {
  543. this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (e.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));
  544. }, s.prototype._tick = function() {
  545. if (this.isPaused || this.isFinished) return !1;
  546. var l = null, n = Math.min(this.max, this.index + 16384);
  547. if (this.index >= this.max) return this.end();
  548. switch (this.type) {
  549. case "string":
  550. l = this.data.substring(this.index, n);
  551. break;
  552. case "uint8array":
  553. l = this.data.subarray(this.index, n);
  554. break;
  555. case "array":
  556. case "nodebuffer":
  557. l = this.data.slice(this.index, n);
  558. }
  559. return this.index = n, this.push({ data: l, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });
  560. }, C.exports = s;
  561. }, { "../utils": 32, "./GenericWorker": 28 }], 28: [function(g, C, i) {
  562. function e(A) {
  563. this.name = A || "default", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;
  564. }
  565. e.prototype = { push: function(A) {
  566. this.emit("data", A);
  567. }, end: function() {
  568. if (this.isFinished) return !1;
  569. this.flush();
  570. try {
  571. this.emit("end"), this.cleanUp(), this.isFinished = !0;
  572. } catch (A) {
  573. this.emit("error", A);
  574. }
  575. return !0;
  576. }, error: function(A) {
  577. return !this.isFinished && (this.isPaused ? this.generatedError = A : (this.isFinished = !0, this.emit("error", A), this.previous && this.previous.error(A), this.cleanUp()), !0);
  578. }, on: function(A, s) {
  579. return this._listeners[A].push(s), this;
  580. }, cleanUp: function() {
  581. this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];
  582. }, emit: function(A, s) {
  583. if (this._listeners[A]) for (var l = 0; l < this._listeners[A].length; l++) this._listeners[A][l].call(this, s);
  584. }, pipe: function(A) {
  585. return A.registerPrevious(this);
  586. }, registerPrevious: function(A) {
  587. if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
  588. this.streamInfo = A.streamInfo, this.mergeStreamInfo(), this.previous = A;
  589. var s = this;
  590. return A.on("data", function(l) {
  591. s.processChunk(l);
  592. }), A.on("end", function() {
  593. s.end();
  594. }), A.on("error", function(l) {
  595. s.error(l);
  596. }), this;
  597. }, pause: function() {
  598. return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);
  599. }, resume: function() {
  600. if (!this.isPaused || this.isFinished) return !1;
  601. var A = this.isPaused = !1;
  602. return this.generatedError && (this.error(this.generatedError), A = !0), this.previous && this.previous.resume(), !A;
  603. }, flush: function() {
  604. }, processChunk: function(A) {
  605. this.push(A);
  606. }, withStreamInfo: function(A, s) {
  607. return this.extraStreamInfo[A] = s, this.mergeStreamInfo(), this;
  608. }, mergeStreamInfo: function() {
  609. for (var A in this.extraStreamInfo) Object.prototype.hasOwnProperty.call(this.extraStreamInfo, A) && (this.streamInfo[A] = this.extraStreamInfo[A]);
  610. }, lock: function() {
  611. if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
  612. this.isLocked = !0, this.previous && this.previous.lock();
  613. }, toString: function() {
  614. var A = "Worker " + this.name;
  615. return this.previous ? this.previous + " -> " + A : A;
  616. } }, C.exports = e;
  617. }, {}], 29: [function(g, C, i) {
  618. var e = g("../utils"), A = g("./ConvertWorker"), s = g("./GenericWorker"), l = g("../base64"), n = g("../support"), a = g("../external"), d = null;
  619. if (n.nodestream) try {
  620. d = g("../nodejs/NodejsStreamOutputAdapter");
  621. } catch {
  622. }
  623. function o(r, h) {
  624. return new a.Promise(function(b, u) {
  625. var m = [], Z = r._internalType, p = r._outputType, Y = r._mimeType;
  626. r.on("data", function(R, X) {
  627. m.push(R), h && h(X);
  628. }).on("error", function(R) {
  629. m = [], u(R);
  630. }).on("end", function() {
  631. try {
  632. var R = function(X, H, S) {
  633. switch (X) {
  634. case "blob":
  635. return e.newBlob(e.transformTo("arraybuffer", H), S);
  636. case "base64":
  637. return l.encode(H);
  638. default:
  639. return e.transformTo(X, H);
  640. }
  641. }(p, function(X, H) {
  642. var S, z = 0, v = null, K = 0;
  643. for (S = 0; S < H.length; S++) K += H[S].length;
  644. switch (X) {
  645. case "string":
  646. return H.join("");
  647. case "array":
  648. return Array.prototype.concat.apply([], H);
  649. case "uint8array":
  650. for (v = new Uint8Array(K), S = 0; S < H.length; S++) v.set(H[S], z), z += H[S].length;
  651. return v;
  652. case "nodebuffer":
  653. return Buffer.concat(H);
  654. default:
  655. throw new Error("concat : unsupported type '" + X + "'");
  656. }
  657. }(Z, m), Y);
  658. b(R);
  659. } catch (X) {
  660. u(X);
  661. }
  662. m = [];
  663. }).resume();
  664. });
  665. }
  666. function c(r, h, b) {
  667. var u = h;
  668. switch (h) {
  669. case "blob":
  670. case "arraybuffer":
  671. u = "uint8array";
  672. break;
  673. case "base64":
  674. u = "string";
  675. }
  676. try {
  677. this._internalType = u, this._outputType = h, this._mimeType = b, e.checkSupport(u), this._worker = r.pipe(new A(u)), r.lock();
  678. } catch (m) {
  679. this._worker = new s("error"), this._worker.error(m);
  680. }
  681. }
  682. c.prototype = { accumulate: function(r) {
  683. return o(this, r);
  684. }, on: function(r, h) {
  685. var b = this;
  686. return r === "data" ? this._worker.on(r, function(u) {
  687. h.call(b, u.data, u.meta);
  688. }) : this._worker.on(r, function() {
  689. e.delay(h, arguments, b);
  690. }), this;
  691. }, resume: function() {
  692. return e.delay(this._worker.resume, [], this._worker), this;
  693. }, pause: function() {
  694. return this._worker.pause(), this;
  695. }, toNodejsStream: function(r) {
  696. if (e.checkSupport("nodestream"), this._outputType !== "nodebuffer") throw new Error(this._outputType + " is not supported by this method");
  697. return new d(this, { objectMode: this._outputType !== "nodebuffer" }, r);
  698. } }, C.exports = c;
  699. }, { "../base64": 1, "../external": 6, "../nodejs/NodejsStreamOutputAdapter": 13, "../support": 30, "../utils": 32, "./ConvertWorker": 24, "./GenericWorker": 28 }], 30: [function(g, C, i) {
  700. if (i.base64 = !0, i.array = !0, i.string = !0, i.arraybuffer = typeof ArrayBuffer < "u" && typeof Uint8Array < "u", i.nodebuffer = typeof Buffer < "u", i.uint8array = typeof Uint8Array < "u", typeof ArrayBuffer > "u") i.blob = !1;
  701. else {
  702. var e = new ArrayBuffer(0);
  703. try {
  704. i.blob = new Blob([e], { type: "application/zip" }).size === 0;
  705. } catch {
  706. try {
  707. var A = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
  708. A.append(e), i.blob = A.getBlob("application/zip").size === 0;
  709. } catch {
  710. i.blob = !1;
  711. }
  712. }
  713. }
  714. try {
  715. i.nodestream = !!g("readable-stream").Readable;
  716. } catch {
  717. i.nodestream = !1;
  718. }
  719. }, { "readable-stream": 16 }], 31: [function(g, C, i) {
  720. for (var e = g("./utils"), A = g("./support"), s = g("./nodejsUtils"), l = g("./stream/GenericWorker"), n = new Array(256), a = 0; a < 256; a++) n[a] = 252 <= a ? 6 : 248 <= a ? 5 : 240 <= a ? 4 : 224 <= a ? 3 : 192 <= a ? 2 : 1;
  721. n[254] = n[254] = 1;
  722. function d() {
  723. l.call(this, "utf-8 decode"), this.leftOver = null;
  724. }
  725. function o() {
  726. l.call(this, "utf-8 encode");
  727. }
  728. i.utf8encode = function(c) {
  729. return A.nodebuffer ? s.newBufferFrom(c, "utf-8") : function(r) {
  730. var h, b, u, m, Z, p = r.length, Y = 0;
  731. for (m = 0; m < p; m++) (64512 & (b = r.charCodeAt(m))) == 55296 && m + 1 < p && (64512 & (u = r.charCodeAt(m + 1))) == 56320 && (b = 65536 + (b - 55296 << 10) + (u - 56320), m++), Y += b < 128 ? 1 : b < 2048 ? 2 : b < 65536 ? 3 : 4;
  732. for (h = A.uint8array ? new Uint8Array(Y) : new Array(Y), m = Z = 0; Z < Y; m++) (64512 & (b = r.charCodeAt(m))) == 55296 && m + 1 < p && (64512 & (u = r.charCodeAt(m + 1))) == 56320 && (b = 65536 + (b - 55296 << 10) + (u - 56320), m++), b < 128 ? h[Z++] = b : (b < 2048 ? h[Z++] = 192 | b >>> 6 : (b < 65536 ? h[Z++] = 224 | b >>> 12 : (h[Z++] = 240 | b >>> 18, h[Z++] = 128 | b >>> 12 & 63), h[Z++] = 128 | b >>> 6 & 63), h[Z++] = 128 | 63 & b);
  733. return h;
  734. }(c);
  735. }, i.utf8decode = function(c) {
  736. return A.nodebuffer ? e.transformTo("nodebuffer", c).toString("utf-8") : function(r) {
  737. var h, b, u, m, Z = r.length, p = new Array(2 * Z);
  738. for (h = b = 0; h < Z; ) if ((u = r[h++]) < 128) p[b++] = u;
  739. else if (4 < (m = n[u])) p[b++] = 65533, h += m - 1;
  740. else {
  741. for (u &= m === 2 ? 31 : m === 3 ? 15 : 7; 1 < m && h < Z; ) u = u << 6 | 63 & r[h++], m--;
  742. 1 < m ? p[b++] = 65533 : u < 65536 ? p[b++] = u : (u -= 65536, p[b++] = 55296 | u >> 10 & 1023, p[b++] = 56320 | 1023 & u);
  743. }
  744. return p.length !== b && (p.subarray ? p = p.subarray(0, b) : p.length = b), e.applyFromCharCode(p);
  745. }(c = e.transformTo(A.uint8array ? "uint8array" : "array", c));
  746. }, e.inherits(d, l), d.prototype.processChunk = function(c) {
  747. var r = e.transformTo(A.uint8array ? "uint8array" : "array", c.data);
  748. if (this.leftOver && this.leftOver.length) {
  749. if (A.uint8array) {
  750. var h = r;
  751. (r = new Uint8Array(h.length + this.leftOver.length)).set(this.leftOver, 0), r.set(h, this.leftOver.length);
  752. } else r = this.leftOver.concat(r);
  753. this.leftOver = null;
  754. }
  755. var b = function(m, Z) {
  756. var p;
  757. for ((Z = Z || m.length) > m.length && (Z = m.length), p = Z - 1; 0 <= p && (192 & m[p]) == 128; ) p--;
  758. return p < 0 || p === 0 ? Z : p + n[m[p]] > Z ? p : Z;
  759. }(r), u = r;
  760. b !== r.length && (A.uint8array ? (u = r.subarray(0, b), this.leftOver = r.subarray(b, r.length)) : (u = r.slice(0, b), this.leftOver = r.slice(b, r.length))), this.push({ data: i.utf8decode(u), meta: c.meta });
  761. }, d.prototype.flush = function() {
  762. this.leftOver && this.leftOver.length && (this.push({ data: i.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);
  763. }, i.Utf8DecodeWorker = d, e.inherits(o, l), o.prototype.processChunk = function(c) {
  764. this.push({ data: i.utf8encode(c.data), meta: c.meta });
  765. }, i.Utf8EncodeWorker = o;
  766. }, { "./nodejsUtils": 14, "./stream/GenericWorker": 28, "./support": 30, "./utils": 32 }], 32: [function(g, C, i) {
  767. var e = g("./support"), A = g("./base64"), s = g("./nodejsUtils"), l = g("./external");
  768. function n(h) {
  769. return h;
  770. }
  771. function a(h, b) {
  772. for (var u = 0; u < h.length; ++u) b[u] = 255 & h.charCodeAt(u);
  773. return b;
  774. }
  775. g("setimmediate"), i.newBlob = function(h, b) {
  776. i.checkSupport("blob");
  777. try {
  778. return new Blob([h], { type: b });
  779. } catch {
  780. try {
  781. var u = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
  782. return u.append(h), u.getBlob(b);
  783. } catch {
  784. throw new Error("Bug : can't construct the Blob.");
  785. }
  786. }
  787. };
  788. var d = { stringifyByChunk: function(h, b, u) {
  789. var m = [], Z = 0, p = h.length;
  790. if (p <= u) return String.fromCharCode.apply(null, h);
  791. for (; Z < p; ) b === "array" || b === "nodebuffer" ? m.push(String.fromCharCode.apply(null, h.slice(Z, Math.min(Z + u, p)))) : m.push(String.fromCharCode.apply(null, h.subarray(Z, Math.min(Z + u, p)))), Z += u;
  792. return m.join("");
  793. }, stringifyByChar: function(h) {
  794. for (var b = "", u = 0; u < h.length; u++) b += String.fromCharCode(h[u]);
  795. return b;
  796. }, applyCanBeUsed: { uint8array: function() {
  797. try {
  798. return e.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;
  799. } catch {
  800. return !1;
  801. }
  802. }(), nodebuffer: function() {
  803. try {
  804. return e.nodebuffer && String.fromCharCode.apply(null, s.allocBuffer(1)).length === 1;
  805. } catch {
  806. return !1;
  807. }
  808. }() } };
  809. function o(h) {
  810. var b = 65536, u = i.getTypeOf(h), m = !0;
  811. if (u === "uint8array" ? m = d.applyCanBeUsed.uint8array : u === "nodebuffer" && (m = d.applyCanBeUsed.nodebuffer), m) for (; 1 < b; ) try {
  812. return d.stringifyByChunk(h, u, b);
  813. } catch {
  814. b = Math.floor(b / 2);
  815. }
  816. return d.stringifyByChar(h);
  817. }
  818. function c(h, b) {
  819. for (var u = 0; u < h.length; u++) b[u] = h[u];
  820. return b;
  821. }
  822. i.applyFromCharCode = o;
  823. var r = {};
  824. r.string = { string: n, array: function(h) {
  825. return a(h, new Array(h.length));
  826. }, arraybuffer: function(h) {
  827. return r.string.uint8array(h).buffer;
  828. }, uint8array: function(h) {
  829. return a(h, new Uint8Array(h.length));
  830. }, nodebuffer: function(h) {
  831. return a(h, s.allocBuffer(h.length));
  832. } }, r.array = { string: o, array: n, arraybuffer: function(h) {
  833. return new Uint8Array(h).buffer;
  834. }, uint8array: function(h) {
  835. return new Uint8Array(h);
  836. }, nodebuffer: function(h) {
  837. return s.newBufferFrom(h);
  838. } }, r.arraybuffer = { string: function(h) {
  839. return o(new Uint8Array(h));
  840. }, array: function(h) {
  841. return c(new Uint8Array(h), new Array(h.byteLength));
  842. }, arraybuffer: n, uint8array: function(h) {
  843. return new Uint8Array(h);
  844. }, nodebuffer: function(h) {
  845. return s.newBufferFrom(new Uint8Array(h));
  846. } }, r.uint8array = { string: o, array: function(h) {
  847. return c(h, new Array(h.length));
  848. }, arraybuffer: function(h) {
  849. return h.buffer;
  850. }, uint8array: n, nodebuffer: function(h) {
  851. return s.newBufferFrom(h);
  852. } }, r.nodebuffer = { string: o, array: function(h) {
  853. return c(h, new Array(h.length));
  854. }, arraybuffer: function(h) {
  855. return r.nodebuffer.uint8array(h).buffer;
  856. }, uint8array: function(h) {
  857. return c(h, new Uint8Array(h.length));
  858. }, nodebuffer: n }, i.transformTo = function(h, b) {
  859. if (b = b || "", !h) return b;
  860. i.checkSupport(h);
  861. var u = i.getTypeOf(b);
  862. return r[u][h](b);
  863. }, i.resolve = function(h) {
  864. for (var b = h.split("/"), u = [], m = 0; m < b.length; m++) {
  865. var Z = b[m];
  866. Z === "." || Z === "" && m !== 0 && m !== b.length - 1 || (Z === ".." ? u.pop() : u.push(Z));
  867. }
  868. return u.join("/");
  869. }, i.getTypeOf = function(h) {
  870. return typeof h == "string" ? "string" : Object.prototype.toString.call(h) === "[object Array]" ? "array" : e.nodebuffer && s.isBuffer(h) ? "nodebuffer" : e.uint8array && h instanceof Uint8Array ? "uint8array" : e.arraybuffer && h instanceof ArrayBuffer ? "arraybuffer" : void 0;
  871. }, i.checkSupport = function(h) {
  872. if (!e[h.toLowerCase()]) throw new Error(h + " is not supported by this platform");
  873. }, i.MAX_VALUE_16BITS = 65535, i.MAX_VALUE_32BITS = -1, i.pretty = function(h) {
  874. var b, u, m = "";
  875. for (u = 0; u < (h || "").length; u++) m += "\\x" + ((b = h.charCodeAt(u)) < 16 ? "0" : "") + b.toString(16).toUpperCase();
  876. return m;
  877. }, i.delay = function(h, b, u) {
  878. setImmediate(function() {
  879. h.apply(u || null, b || []);
  880. });
  881. }, i.inherits = function(h, b) {
  882. function u() {
  883. }
  884. u.prototype = b.prototype, h.prototype = new u();
  885. }, i.extend = function() {
  886. var h, b, u = {};
  887. for (h = 0; h < arguments.length; h++) for (b in arguments[h]) Object.prototype.hasOwnProperty.call(arguments[h], b) && u[b] === void 0 && (u[b] = arguments[h][b]);
  888. return u;
  889. }, i.prepareContent = function(h, b, u, m, Z) {
  890. return l.Promise.resolve(b).then(function(p) {
  891. return e.blob && (p instanceof Blob || ["[object File]", "[object Blob]"].indexOf(Object.prototype.toString.call(p)) !== -1) && typeof FileReader < "u" ? new l.Promise(function(Y, R) {
  892. var X = new FileReader();
  893. X.onload = function(H) {
  894. Y(H.target.result);
  895. }, X.onerror = function(H) {
  896. R(H.target.error);
  897. }, X.readAsArrayBuffer(p);
  898. }) : p;
  899. }).then(function(p) {
  900. var Y = i.getTypeOf(p);
  901. return Y ? (Y === "arraybuffer" ? p = i.transformTo("uint8array", p) : Y === "string" && (Z ? p = A.decode(p) : u && m !== !0 && (p = function(R) {
  902. return a(R, e.uint8array ? new Uint8Array(R.length) : new Array(R.length));
  903. }(p))), p) : l.Promise.reject(new Error("Can't read the data of '" + h + "'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?"));
  904. });
  905. };
  906. }, { "./base64": 1, "./external": 6, "./nodejsUtils": 14, "./support": 30, setimmediate: 54 }], 33: [function(g, C, i) {
  907. var e = g("./reader/readerFor"), A = g("./utils"), s = g("./signature"), l = g("./zipEntry"), n = g("./support");
  908. function a(d) {
  909. this.files = [], this.loadOptions = d;
  910. }
  911. a.prototype = { checkSignature: function(d) {
  912. if (!this.reader.readAndCheckSignature(d)) {
  913. this.reader.index -= 4;
  914. var o = this.reader.readString(4);
  915. throw new Error("Corrupted zip or bug: unexpected signature (" + A.pretty(o) + ", expected " + A.pretty(d) + ")");
  916. }
  917. }, isSignature: function(d, o) {
  918. var c = this.reader.index;
  919. this.reader.setIndex(d);
  920. var r = this.reader.readString(4) === o;
  921. return this.reader.setIndex(c), r;
  922. }, readBlockEndOfCentral: function() {
  923. this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);
  924. var d = this.reader.readData(this.zipCommentLength), o = n.uint8array ? "uint8array" : "array", c = A.transformTo(o, d);
  925. this.zipComment = this.loadOptions.decodeFileName(c);
  926. }, readBlockZip64EndOfCentral: function() {
  927. this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};
  928. for (var d, o, c, r = this.zip64EndOfCentralSize - 44; 0 < r; ) d = this.reader.readInt(2), o = this.reader.readInt(4), c = this.reader.readData(o), this.zip64ExtensibleData[d] = { id: d, length: o, value: c };
  929. }, readBlockZip64EndOfCentralLocator: function() {
  930. if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), 1 < this.disksCount) throw new Error("Multi-volumes zip are not supported");
  931. }, readLocalFiles: function() {
  932. var d, o;
  933. for (d = 0; d < this.files.length; d++) o = this.files[d], this.reader.setIndex(o.localHeaderOffset), this.checkSignature(s.LOCAL_FILE_HEADER), o.readLocalPart(this.reader), o.handleUTF8(), o.processAttributes();
  934. }, readCentralDir: function() {
  935. var d;
  936. for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(s.CENTRAL_FILE_HEADER); ) (d = new l({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(d);
  937. if (this.centralDirRecords !== this.files.length && this.centralDirRecords !== 0 && this.files.length === 0) throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length);
  938. }, readEndOfCentral: function() {
  939. var d = this.reader.lastIndexOfSignature(s.CENTRAL_DIRECTORY_END);
  940. if (d < 0) throw this.isSignature(0, s.LOCAL_FILE_HEADER) ? new Error("Corrupted zip: can't find end of central directory") : new Error("Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html");
  941. this.reader.setIndex(d);
  942. var o = d;
  943. if (this.checkSignature(s.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === A.MAX_VALUE_16BITS || this.diskWithCentralDirStart === A.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === A.MAX_VALUE_16BITS || this.centralDirRecords === A.MAX_VALUE_16BITS || this.centralDirSize === A.MAX_VALUE_32BITS || this.centralDirOffset === A.MAX_VALUE_32BITS) {
  944. if (this.zip64 = !0, (d = this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");
  945. if (this.reader.setIndex(d), this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, s.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");
  946. this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();
  947. }
  948. var c = this.centralDirOffset + this.centralDirSize;
  949. this.zip64 && (c += 20, c += 12 + this.zip64EndOfCentralSize);
  950. var r = o - c;
  951. if (0 < r) this.isSignature(o, s.CENTRAL_FILE_HEADER) || (this.reader.zero = r);
  952. else if (r < 0) throw new Error("Corrupted zip: missing " + Math.abs(r) + " bytes.");
  953. }, prepareReader: function(d) {
  954. this.reader = e(d);
  955. }, load: function(d) {
  956. this.prepareReader(d), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();
  957. } }, C.exports = a;
  958. }, { "./reader/readerFor": 22, "./signature": 23, "./support": 30, "./utils": 32, "./zipEntry": 34 }], 34: [function(g, C, i) {
  959. var e = g("./reader/readerFor"), A = g("./utils"), s = g("./compressedObject"), l = g("./crc32"), n = g("./utf8"), a = g("./compressions"), d = g("./support");
  960. function o(c, r) {
  961. this.options = c, this.loadOptions = r;
  962. }
  963. o.prototype = { isEncrypted: function() {
  964. return (1 & this.bitFlag) == 1;
  965. }, useUTF8: function() {
  966. return (2048 & this.bitFlag) == 2048;
  967. }, readLocalPart: function(c) {
  968. var r, h;
  969. if (c.skip(22), this.fileNameLength = c.readInt(2), h = c.readInt(2), this.fileName = c.readData(this.fileNameLength), c.skip(h), this.compressedSize === -1 || this.uncompressedSize === -1) throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");
  970. if ((r = function(b) {
  971. for (var u in a) if (Object.prototype.hasOwnProperty.call(a, u) && a[u].magic === b) return a[u];
  972. return null;
  973. }(this.compressionMethod)) === null) throw new Error("Corrupted zip : compression " + A.pretty(this.compressionMethod) + " unknown (inner file : " + A.transformTo("string", this.fileName) + ")");
  974. this.decompressed = new s(this.compressedSize, this.uncompressedSize, this.crc32, r, c.readData(this.compressedSize));
  975. }, readCentralPart: function(c) {
  976. this.versionMadeBy = c.readInt(2), c.skip(2), this.bitFlag = c.readInt(2), this.compressionMethod = c.readString(2), this.date = c.readDate(), this.crc32 = c.readInt(4), this.compressedSize = c.readInt(4), this.uncompressedSize = c.readInt(4);
  977. var r = c.readInt(2);
  978. if (this.extraFieldsLength = c.readInt(2), this.fileCommentLength = c.readInt(2), this.diskNumberStart = c.readInt(2), this.internalFileAttributes = c.readInt(2), this.externalFileAttributes = c.readInt(4), this.localHeaderOffset = c.readInt(4), this.isEncrypted()) throw new Error("Encrypted zip are not supported");
  979. c.skip(r), this.readExtraFields(c), this.parseZIP64ExtraField(c), this.fileComment = c.readData(this.fileCommentLength);
  980. }, processAttributes: function() {
  981. this.unixPermissions = null, this.dosPermissions = null;
  982. var c = this.versionMadeBy >> 8;
  983. this.dir = !!(16 & this.externalFileAttributes), c == 0 && (this.dosPermissions = 63 & this.externalFileAttributes), c == 3 && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || this.fileNameStr.slice(-1) !== "/" || (this.dir = !0);
  984. }, parseZIP64ExtraField: function() {
  985. if (this.extraFields[1]) {
  986. var c = e(this.extraFields[1].value);
  987. this.uncompressedSize === A.MAX_VALUE_32BITS && (this.uncompressedSize = c.readInt(8)), this.compressedSize === A.MAX_VALUE_32BITS && (this.compressedSize = c.readInt(8)), this.localHeaderOffset === A.MAX_VALUE_32BITS && (this.localHeaderOffset = c.readInt(8)), this.diskNumberStart === A.MAX_VALUE_32BITS && (this.diskNumberStart = c.readInt(4));
  988. }
  989. }, readExtraFields: function(c) {
  990. var r, h, b, u = c.index + this.extraFieldsLength;
  991. for (this.extraFields || (this.extraFields = {}); c.index + 4 < u; ) r = c.readInt(2), h = c.readInt(2), b = c.readData(h), this.extraFields[r] = { id: r, length: h, value: b };
  992. c.setIndex(u);
  993. }, handleUTF8: function() {
  994. var c = d.uint8array ? "uint8array" : "array";
  995. if (this.useUTF8()) this.fileNameStr = n.utf8decode(this.fileName), this.fileCommentStr = n.utf8decode(this.fileComment);
  996. else {
  997. var r = this.findExtraFieldUnicodePath();
  998. if (r !== null) this.fileNameStr = r;
  999. else {
  1000. var h = A.transformTo(c, this.fileName);
  1001. this.fileNameStr = this.loadOptions.decodeFileName(h);
  1002. }
  1003. var b = this.findExtraFieldUnicodeComment();
  1004. if (b !== null) this.fileCommentStr = b;
  1005. else {
  1006. var u = A.transformTo(c, this.fileComment);
  1007. this.fileCommentStr = this.loadOptions.decodeFileName(u);
  1008. }
  1009. }
  1010. }, findExtraFieldUnicodePath: function() {
  1011. var c = this.extraFields[28789];
  1012. if (c) {
  1013. var r = e(c.value);
  1014. return r.readInt(1) !== 1 || l(this.fileName) !== r.readInt(4) ? null : n.utf8decode(r.readData(c.length - 5));
  1015. }
  1016. return null;
  1017. }, findExtraFieldUnicodeComment: function() {
  1018. var c = this.extraFields[25461];
  1019. if (c) {
  1020. var r = e(c.value);
  1021. return r.readInt(1) !== 1 || l(this.fileComment) !== r.readInt(4) ? null : n.utf8decode(r.readData(c.length - 5));
  1022. }
  1023. return null;
  1024. } }, C.exports = o;
  1025. }, { "./compressedObject": 2, "./compressions": 3, "./crc32": 4, "./reader/readerFor": 22, "./support": 30, "./utf8": 31, "./utils": 32 }], 35: [function(g, C, i) {
  1026. function e(r, h, b) {
  1027. this.name = r, this.dir = b.dir, this.date = b.date, this.comment = b.comment, this.unixPermissions = b.unixPermissions, this.dosPermissions = b.dosPermissions, this._data = h, this._dataBinary = b.binary, this.options = { compression: b.compression, compressionOptions: b.compressionOptions };
  1028. }
  1029. var A = g("./stream/StreamHelper"), s = g("./stream/DataWorker"), l = g("./utf8"), n = g("./compressedObject"), a = g("./stream/GenericWorker");
  1030. e.prototype = { internalStream: function(r) {
  1031. var h = null, b = "string";
  1032. try {
  1033. if (!r) throw new Error("No output type specified.");
  1034. var u = (b = r.toLowerCase()) === "string" || b === "text";
  1035. b !== "binarystring" && b !== "text" || (b = "string"), h = this._decompressWorker();
  1036. var m = !this._dataBinary;
  1037. m && !u && (h = h.pipe(new l.Utf8EncodeWorker())), !m && u && (h = h.pipe(new l.Utf8DecodeWorker()));
  1038. } catch (Z) {
  1039. (h = new a("error")).error(Z);
  1040. }
  1041. return new A(h, b, "");
  1042. }, async: function(r, h) {
  1043. return this.internalStream(r).accumulate(h);
  1044. }, nodeStream: function(r, h) {
  1045. return this.internalStream(r || "nodebuffer").toNodejsStream(h);
  1046. }, _compressWorker: function(r, h) {
  1047. if (this._data instanceof n && this._data.compression.magic === r.magic) return this._data.getCompressedWorker();
  1048. var b = this._decompressWorker();
  1049. return this._dataBinary || (b = b.pipe(new l.Utf8EncodeWorker())), n.createWorkerFrom(b, r, h);
  1050. }, _decompressWorker: function() {
  1051. return this._data instanceof n ? this._data.getContentWorker() : this._data instanceof a ? this._data : new s(this._data);
  1052. } };
  1053. for (var d = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"], o = function() {
  1054. throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
  1055. }, c = 0; c < d.length; c++) e.prototype[d[c]] = o;
  1056. C.exports = e;
  1057. }, { "./compressedObject": 2, "./stream/DataWorker": 27, "./stream/GenericWorker": 28, "./stream/StreamHelper": 29, "./utf8": 31 }], 36: [function(g, C, i) {
  1058. (function(e) {
  1059. var A, s, l = e.MutationObserver || e.WebKitMutationObserver;
  1060. if (l) {
  1061. var n = 0, a = new l(r), d = e.document.createTextNode("");
  1062. a.observe(d, { characterData: !0 }), A = function() {
  1063. d.data = n = ++n % 2;
  1064. };
  1065. } else if (e.setImmediate || e.MessageChannel === void 0) A = "document" in e && "onreadystatechange" in e.document.createElement("script") ? function() {
  1066. var h = e.document.createElement("script");
  1067. h.onreadystatechange = function() {
  1068. r(), h.onreadystatechange = null, h.parentNode.removeChild(h), h = null;
  1069. }, e.document.documentElement.appendChild(h);
  1070. } : function() {
  1071. setTimeout(r, 0);
  1072. };
  1073. else {
  1074. var o = new e.MessageChannel();
  1075. o.port1.onmessage = r, A = function() {
  1076. o.port2.postMessage(0);
  1077. };
  1078. }
  1079. var c = [];
  1080. function r() {
  1081. var h, b;
  1082. s = !0;
  1083. for (var u = c.length; u; ) {
  1084. for (b = c, c = [], h = -1; ++h < u; ) b[h]();
  1085. u = c.length;
  1086. }
  1087. s = !1;
  1088. }
  1089. C.exports = function(h) {
  1090. c.push(h) !== 1 || s || A();
  1091. };
  1092. }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  1093. }, {}], 37: [function(g, C, i) {
  1094. var e = g("immediate");
  1095. function A() {
  1096. }
  1097. var s = {}, l = ["REJECTED"], n = ["FULFILLED"], a = ["PENDING"];
  1098. function d(u) {
  1099. if (typeof u != "function") throw new TypeError("resolver must be a function");
  1100. this.state = a, this.queue = [], this.outcome = void 0, u !== A && h(this, u);
  1101. }
  1102. function o(u, m, Z) {
  1103. this.promise = u, typeof m == "function" && (this.onFulfilled = m, this.callFulfilled = this.otherCallFulfilled), typeof Z == "function" && (this.onRejected = Z, this.callRejected = this.otherCallRejected);
  1104. }
  1105. function c(u, m, Z) {
  1106. e(function() {
  1107. var p;
  1108. try {
  1109. p = m(Z);
  1110. } catch (Y) {
  1111. return s.reject(u, Y);
  1112. }
  1113. p === u ? s.reject(u, new TypeError("Cannot resolve promise with itself")) : s.resolve(u, p);
  1114. });
  1115. }
  1116. function r(u) {
  1117. var m = u && u.then;
  1118. if (u && (typeof u == "object" || typeof u == "function") && typeof m == "function") return function() {
  1119. m.apply(u, arguments);
  1120. };
  1121. }
  1122. function h(u, m) {
  1123. var Z = !1;
  1124. function p(X) {
  1125. Z || (Z = !0, s.reject(u, X));
  1126. }
  1127. function Y(X) {
  1128. Z || (Z = !0, s.resolve(u, X));
  1129. }
  1130. var R = b(function() {
  1131. m(Y, p);
  1132. });
  1133. R.status === "error" && p(R.value);
  1134. }
  1135. function b(u, m) {
  1136. var Z = {};
  1137. try {
  1138. Z.value = u(m), Z.status = "success";
  1139. } catch (p) {
  1140. Z.status = "error", Z.value = p;
  1141. }
  1142. return Z;
  1143. }
  1144. (C.exports = d).prototype.finally = function(u) {
  1145. if (typeof u != "function") return this;
  1146. var m = this.constructor;
  1147. return this.then(function(Z) {
  1148. return m.resolve(u()).then(function() {
  1149. return Z;
  1150. });
  1151. }, function(Z) {
  1152. return m.resolve(u()).then(function() {
  1153. throw Z;
  1154. });
  1155. });
  1156. }, d.prototype.catch = function(u) {
  1157. return this.then(null, u);
  1158. }, d.prototype.then = function(u, m) {
  1159. if (typeof u != "function" && this.state === n || typeof m != "function" && this.state === l) return this;
  1160. var Z = new this.constructor(A);
  1161. return this.state !== a ? c(Z, this.state === n ? u : m, this.outcome) : this.queue.push(new o(Z, u, m)), Z;
  1162. }, o.prototype.callFulfilled = function(u) {
  1163. s.resolve(this.promise, u);
  1164. }, o.prototype.otherCallFulfilled = function(u) {
  1165. c(this.promise, this.onFulfilled, u);
  1166. }, o.prototype.callRejected = function(u) {
  1167. s.reject(this.promise, u);
  1168. }, o.prototype.otherCallRejected = function(u) {
  1169. c(this.promise, this.onRejected, u);
  1170. }, s.resolve = function(u, m) {
  1171. var Z = b(r, m);
  1172. if (Z.status === "error") return s.reject(u, Z.value);
  1173. var p = Z.value;
  1174. if (p) h(u, p);
  1175. else {
  1176. u.state = n, u.outcome = m;
  1177. for (var Y = -1, R = u.queue.length; ++Y < R; ) u.queue[Y].callFulfilled(m);
  1178. }
  1179. return u;
  1180. }, s.reject = function(u, m) {
  1181. u.state = l, u.outcome = m;
  1182. for (var Z = -1, p = u.queue.length; ++Z < p; ) u.queue[Z].callRejected(m);
  1183. return u;
  1184. }, d.resolve = function(u) {
  1185. return u instanceof this ? u : s.resolve(new this(A), u);
  1186. }, d.reject = function(u) {
  1187. var m = new this(A);
  1188. return s.reject(m, u);
  1189. }, d.all = function(u) {
  1190. var m = this;
  1191. if (Object.prototype.toString.call(u) !== "[object Array]") return this.reject(new TypeError("must be an array"));
  1192. var Z = u.length, p = !1;
  1193. if (!Z) return this.resolve([]);
  1194. for (var Y = new Array(Z), R = 0, X = -1, H = new this(A); ++X < Z; ) S(u[X], X);
  1195. return H;
  1196. function S(z, v) {
  1197. m.resolve(z).then(function(K) {
  1198. Y[v] = K, ++R !== Z || p || (p = !0, s.resolve(H, Y));
  1199. }, function(K) {
  1200. p || (p = !0, s.reject(H, K));
  1201. });
  1202. }
  1203. }, d.race = function(u) {
  1204. var m = this;
  1205. if (Object.prototype.toString.call(u) !== "[object Array]") return this.reject(new TypeError("must be an array"));
  1206. var Z = u.length, p = !1;
  1207. if (!Z) return this.resolve([]);
  1208. for (var Y = -1, R = new this(A); ++Y < Z; ) X = u[Y], m.resolve(X).then(function(H) {
  1209. p || (p = !0, s.resolve(R, H));
  1210. }, function(H) {
  1211. p || (p = !0, s.reject(R, H));
  1212. });
  1213. var X;
  1214. return R;
  1215. };
  1216. }, { immediate: 36 }], 38: [function(g, C, i) {
  1217. var e = {};
  1218. (0, g("./lib/utils/common").assign)(e, g("./lib/deflate"), g("./lib/inflate"), g("./lib/zlib/constants")), C.exports = e;
  1219. }, { "./lib/deflate": 39, "./lib/inflate": 40, "./lib/utils/common": 41, "./lib/zlib/constants": 44 }], 39: [function(g, C, i) {
  1220. var e = g("./zlib/deflate"), A = g("./utils/common"), s = g("./utils/strings"), l = g("./zlib/messages"), n = g("./zlib/zstream"), a = Object.prototype.toString, d = 0, o = -1, c = 0, r = 8;
  1221. function h(u) {
  1222. if (!(this instanceof h)) return new h(u);
  1223. this.options = A.assign({ level: o, method: r, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: c, to: "" }, u || {});
  1224. var m = this.options;
  1225. m.raw && 0 < m.windowBits ? m.windowBits = -m.windowBits : m.gzip && 0 < m.windowBits && m.windowBits < 16 && (m.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new n(), this.strm.avail_out = 0;
  1226. var Z = e.deflateInit2(this.strm, m.level, m.method, m.windowBits, m.memLevel, m.strategy);
  1227. if (Z !== d) throw new Error(l[Z]);
  1228. if (m.header && e.deflateSetHeader(this.strm, m.header), m.dictionary) {
  1229. var p;
  1230. if (p = typeof m.dictionary == "string" ? s.string2buf(m.dictionary) : a.call(m.dictionary) === "[object ArrayBuffer]" ? new Uint8Array(m.dictionary) : m.dictionary, (Z = e.deflateSetDictionary(this.strm, p)) !== d) throw new Error(l[Z]);
  1231. this._dict_set = !0;
  1232. }
  1233. }
  1234. function b(u, m) {
  1235. var Z = new h(m);
  1236. if (Z.push(u, !0), Z.err) throw Z.msg || l[Z.err];
  1237. return Z.result;
  1238. }
  1239. h.prototype.push = function(u, m) {
  1240. var Z, p, Y = this.strm, R = this.options.chunkSize;
  1241. if (this.ended) return !1;
  1242. p = m === ~~m ? m : m === !0 ? 4 : 0, typeof u == "string" ? Y.input = s.string2buf(u) : a.call(u) === "[object ArrayBuffer]" ? Y.input = new Uint8Array(u) : Y.input = u, Y.next_in = 0, Y.avail_in = Y.input.length;
  1243. do {
  1244. if (Y.avail_out === 0 && (Y.output = new A.Buf8(R), Y.next_out = 0, Y.avail_out = R), (Z = e.deflate(Y, p)) !== 1 && Z !== d) return this.onEnd(Z), !(this.ended = !0);
  1245. Y.avail_out !== 0 && (Y.avail_in !== 0 || p !== 4 && p !== 2) || (this.options.to === "string" ? this.onData(s.buf2binstring(A.shrinkBuf(Y.output, Y.next_out))) : this.onData(A.shrinkBuf(Y.output, Y.next_out)));
  1246. } while ((0 < Y.avail_in || Y.avail_out === 0) && Z !== 1);
  1247. return p === 4 ? (Z = e.deflateEnd(this.strm), this.onEnd(Z), this.ended = !0, Z === d) : p !== 2 || (this.onEnd(d), !(Y.avail_out = 0));
  1248. }, h.prototype.onData = function(u) {
  1249. this.chunks.push(u);
  1250. }, h.prototype.onEnd = function(u) {
  1251. u === d && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = A.flattenChunks(this.chunks)), this.chunks = [], this.err = u, this.msg = this.strm.msg;
  1252. }, i.Deflate = h, i.deflate = b, i.deflateRaw = function(u, m) {
  1253. return (m = m || {}).raw = !0, b(u, m);
  1254. }, i.gzip = function(u, m) {
  1255. return (m = m || {}).gzip = !0, b(u, m);
  1256. };
  1257. }, { "./utils/common": 41, "./utils/strings": 42, "./zlib/deflate": 46, "./zlib/messages": 51, "./zlib/zstream": 53 }], 40: [function(g, C, i) {
  1258. var e = g("./zlib/inflate"), A = g("./utils/common"), s = g("./utils/strings"), l = g("./zlib/constants"), n = g("./zlib/messages"), a = g("./zlib/zstream"), d = g("./zlib/gzheader"), o = Object.prototype.toString;
  1259. function c(h) {
  1260. if (!(this instanceof c)) return new c(h);
  1261. this.options = A.assign({ chunkSize: 16384, windowBits: 0, to: "" }, h || {});
  1262. var b = this.options;
  1263. b.raw && 0 <= b.windowBits && b.windowBits < 16 && (b.windowBits = -b.windowBits, b.windowBits === 0 && (b.windowBits = -15)), !(0 <= b.windowBits && b.windowBits < 16) || h && h.windowBits || (b.windowBits += 32), 15 < b.windowBits && b.windowBits < 48 && (15 & b.windowBits) == 0 && (b.windowBits |= 15), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new a(), this.strm.avail_out = 0;
  1264. var u = e.inflateInit2(this.strm, b.windowBits);
  1265. if (u !== l.Z_OK) throw new Error(n[u]);
  1266. this.header = new d(), e.inflateGetHeader(this.strm, this.header);
  1267. }
  1268. function r(h, b) {
  1269. var u = new c(b);
  1270. if (u.push(h, !0), u.err) throw u.msg || n[u.err];
  1271. return u.result;
  1272. }
  1273. c.prototype.push = function(h, b) {
  1274. var u, m, Z, p, Y, R, X = this.strm, H = this.options.chunkSize, S = this.options.dictionary, z = !1;
  1275. if (this.ended) return !1;
  1276. m = b === ~~b ? b : b === !0 ? l.Z_FINISH : l.Z_NO_FLUSH, typeof h == "string" ? X.input = s.binstring2buf(h) : o.call(h) === "[object ArrayBuffer]" ? X.input = new Uint8Array(h) : X.input = h, X.next_in = 0, X.avail_in = X.input.length;
  1277. do {
  1278. if (X.avail_out === 0 && (X.output = new A.Buf8(H), X.next_out = 0, X.avail_out = H), (u = e.inflate(X, l.Z_NO_FLUSH)) === l.Z_NEED_DICT && S && (R = typeof S == "string" ? s.string2buf(S) : o.call(S) === "[object ArrayBuffer]" ? new Uint8Array(S) : S, u = e.inflateSetDictionary(this.strm, R)), u === l.Z_BUF_ERROR && z === !0 && (u = l.Z_OK, z = !1), u !== l.Z_STREAM_END && u !== l.Z_OK) return this.onEnd(u), !(this.ended = !0);
  1279. X.next_out && (X.avail_out !== 0 && u !== l.Z_STREAM_END && (X.avail_in !== 0 || m !== l.Z_FINISH && m !== l.Z_SYNC_FLUSH) || (this.options.to === "string" ? (Z = s.utf8border(X.output, X.next_out), p = X.next_out - Z, Y = s.buf2string(X.output, Z), X.next_out = p, X.avail_out = H - p, p && A.arraySet(X.output, X.output, Z, p, 0), this.onData(Y)) : this.onData(A.shrinkBuf(X.output, X.next_out)))), X.avail_in === 0 && X.avail_out === 0 && (z = !0);
  1280. } while ((0 < X.avail_in || X.avail_out === 0) && u !== l.Z_STREAM_END);
  1281. return u === l.Z_STREAM_END && (m = l.Z_FINISH), m === l.Z_FINISH ? (u = e.inflateEnd(this.strm), this.onEnd(u), this.ended = !0, u === l.Z_OK) : m !== l.Z_SYNC_FLUSH || (this.onEnd(l.Z_OK), !(X.avail_out = 0));
  1282. }, c.prototype.onData = function(h) {
  1283. this.chunks.push(h);
  1284. }, c.prototype.onEnd = function(h) {
  1285. h === l.Z_OK && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = A.flattenChunks(this.chunks)), this.chunks = [], this.err = h, this.msg = this.strm.msg;
  1286. }, i.Inflate = c, i.inflate = r, i.inflateRaw = function(h, b) {
  1287. return (b = b || {}).raw = !0, r(h, b);
  1288. }, i.ungzip = r;
  1289. }, { "./utils/common": 41, "./utils/strings": 42, "./zlib/constants": 44, "./zlib/gzheader": 47, "./zlib/inflate": 49, "./zlib/messages": 51, "./zlib/zstream": 53 }], 41: [function(g, C, i) {
  1290. var e = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Int32Array < "u";
  1291. i.assign = function(l) {
  1292. for (var n = Array.prototype.slice.call(arguments, 1); n.length; ) {
  1293. var a = n.shift();
  1294. if (a) {
  1295. if (typeof a != "object") throw new TypeError(a + "must be non-object");
  1296. for (var d in a) a.hasOwnProperty(d) && (l[d] = a[d]);
  1297. }
  1298. }
  1299. return l;
  1300. }, i.shrinkBuf = function(l, n) {
  1301. return l.length === n ? l : l.subarray ? l.subarray(0, n) : (l.length = n, l);
  1302. };
  1303. var A = { arraySet: function(l, n, a, d, o) {
  1304. if (n.subarray && l.subarray) l.set(n.subarray(a, a + d), o);
  1305. else for (var c = 0; c < d; c++) l[o + c] = n[a + c];
  1306. }, flattenChunks: function(l) {
  1307. var n, a, d, o, c, r;
  1308. for (n = d = 0, a = l.length; n < a; n++) d += l[n].length;
  1309. for (r = new Uint8Array(d), n = o = 0, a = l.length; n < a; n++) c = l[n], r.set(c, o), o += c.length;
  1310. return r;
  1311. } }, s = { arraySet: function(l, n, a, d, o) {
  1312. for (var c = 0; c < d; c++) l[o + c] = n[a + c];
  1313. }, flattenChunks: function(l) {
  1314. return [].concat.apply([], l);
  1315. } };
  1316. i.setTyped = function(l) {
  1317. l ? (i.Buf8 = Uint8Array, i.Buf16 = Uint16Array, i.Buf32 = Int32Array, i.assign(i, A)) : (i.Buf8 = Array, i.Buf16 = Array, i.Buf32 = Array, i.assign(i, s));
  1318. }, i.setTyped(e);
  1319. }, {}], 42: [function(g, C, i) {
  1320. var e = g("./common"), A = !0, s = !0;
  1321. try {
  1322. String.fromCharCode.apply(null, [0]);
  1323. } catch {
  1324. A = !1;
  1325. }
  1326. try {
  1327. String.fromCharCode.apply(null, new Uint8Array(1));
  1328. } catch {
  1329. s = !1;
  1330. }
  1331. for (var l = new e.Buf8(256), n = 0; n < 256; n++) l[n] = 252 <= n ? 6 : 248 <= n ? 5 : 240 <= n ? 4 : 224 <= n ? 3 : 192 <= n ? 2 : 1;
  1332. function a(d, o) {
  1333. if (o < 65537 && (d.subarray && s || !d.subarray && A)) return String.fromCharCode.apply(null, e.shrinkBuf(d, o));
  1334. for (var c = "", r = 0; r < o; r++) c += String.fromCharCode(d[r]);
  1335. return c;
  1336. }
  1337. l[254] = l[254] = 1, i.string2buf = function(d) {
  1338. var o, c, r, h, b, u = d.length, m = 0;
  1339. for (h = 0; h < u; h++) (64512 & (c = d.charCodeAt(h))) == 55296 && h + 1 < u && (64512 & (r = d.charCodeAt(h + 1))) == 56320 && (c = 65536 + (c - 55296 << 10) + (r - 56320), h++), m += c < 128 ? 1 : c < 2048 ? 2 : c < 65536 ? 3 : 4;
  1340. for (o = new e.Buf8(m), h = b = 0; b < m; h++) (64512 & (c = d.charCodeAt(h))) == 55296 && h + 1 < u && (64512 & (r = d.charCodeAt(h + 1))) == 56320 && (c = 65536 + (c - 55296 << 10) + (r - 56320), h++), c < 128 ? o[b++] = c : (c < 2048 ? o[b++] = 192 | c >>> 6 : (c < 65536 ? o[b++] = 224 | c >>> 12 : (o[b++] = 240 | c >>> 18, o[b++] = 128 | c >>> 12 & 63), o[b++] = 128 | c >>> 6 & 63), o[b++] = 128 | 63 & c);
  1341. return o;
  1342. }, i.buf2binstring = function(d) {
  1343. return a(d, d.length);
  1344. }, i.binstring2buf = function(d) {
  1345. for (var o = new e.Buf8(d.length), c = 0, r = o.length; c < r; c++) o[c] = d.charCodeAt(c);
  1346. return o;
  1347. }, i.buf2string = function(d, o) {
  1348. var c, r, h, b, u = o || d.length, m = new Array(2 * u);
  1349. for (c = r = 0; c < u; ) if ((h = d[c++]) < 128) m[r++] = h;
  1350. else if (4 < (b = l[h])) m[r++] = 65533, c += b - 1;
  1351. else {
  1352. for (h &= b === 2 ? 31 : b === 3 ? 15 : 7; 1 < b && c < u; ) h = h << 6 | 63 & d[c++], b--;
  1353. 1 < b ? m[r++] = 65533 : h < 65536 ? m[r++] = h : (h -= 65536, m[r++] = 55296 | h >> 10 & 1023, m[r++] = 56320 | 1023 & h);
  1354. }
  1355. return a(m, r);
  1356. }, i.utf8border = function(d, o) {
  1357. var c;
  1358. for ((o = o || d.length) > d.length && (o = d.length), c = o - 1; 0 <= c && (192 & d[c]) == 128; ) c--;
  1359. return c < 0 || c === 0 ? o : c + l[d[c]] > o ? c : o;
  1360. };
  1361. }, { "./common": 41 }], 43: [function(g, C, i) {
  1362. C.exports = function(e, A, s, l) {
  1363. for (var n = 65535 & e | 0, a = e >>> 16 & 65535 | 0, d = 0; s !== 0; ) {
  1364. for (s -= d = 2e3 < s ? 2e3 : s; a = a + (n = n + A[l++] | 0) | 0, --d; ) ;
  1365. n %= 65521, a %= 65521;
  1366. }
  1367. return n | a << 16 | 0;
  1368. };
  1369. }, {}], 44: [function(g, C, i) {
  1370. C.exports = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 };
  1371. }, {}], 45: [function(g, C, i) {
  1372. var e = function() {
  1373. for (var A, s = [], l = 0; l < 256; l++) {
  1374. A = l;
  1375. for (var n = 0; n < 8; n++) A = 1 & A ? 3988292384 ^ A >>> 1 : A >>> 1;
  1376. s[l] = A;
  1377. }
  1378. return s;
  1379. }();
  1380. C.exports = function(A, s, l, n) {
  1381. var a = e, d = n + l;
  1382. A ^= -1;
  1383. for (var o = n; o < d; o++) A = A >>> 8 ^ a[255 & (A ^ s[o])];
  1384. return -1 ^ A;
  1385. };
  1386. }, {}], 46: [function(g, C, i) {
  1387. var e, A = g("../utils/common"), s = g("./trees"), l = g("./adler32"), n = g("./crc32"), a = g("./messages"), d = 0, o = 4, c = 0, r = -2, h = -1, b = 4, u = 2, m = 8, Z = 9, p = 286, Y = 30, R = 19, X = 2 * p + 1, H = 15, S = 3, z = 258, v = z + S + 1, K = 42, V = 113, N = 1, B = 2, G = 3, w = 4;
  1388. function W(x, Ag) {
  1389. return x.msg = a[Ag], Ag;
  1390. }
  1391. function y(x) {
  1392. return (x << 1) - (4 < x ? 9 : 0);
  1393. }
  1394. function f(x) {
  1395. for (var Ag = x.length; 0 <= --Ag; ) x[Ag] = 0;
  1396. }
  1397. function D(x) {
  1398. var Ag = x.state, eg = Ag.pending;
  1399. eg > x.avail_out && (eg = x.avail_out), eg !== 0 && (A.arraySet(x.output, Ag.pending_buf, Ag.pending_out, eg, x.next_out), x.next_out += eg, Ag.pending_out += eg, x.total_out += eg, x.avail_out -= eg, Ag.pending -= eg, Ag.pending === 0 && (Ag.pending_out = 0));
  1400. }
  1401. function F(x, Ag) {
  1402. s._tr_flush_block(x, 0 <= x.block_start ? x.block_start : -1, x.strstart - x.block_start, Ag), x.block_start = x.strstart, D(x.strm);
  1403. }
  1404. function T(x, Ag) {
  1405. x.pending_buf[x.pending++] = Ag;
  1406. }
  1407. function Q(x, Ag) {
  1408. x.pending_buf[x.pending++] = Ag >>> 8 & 255, x.pending_buf[x.pending++] = 255 & Ag;
  1409. }
  1410. function P(x, Ag) {
  1411. var eg, O, _ = x.max_chain_length, gg = x.strstart, lg = x.prev_length, ng = x.nice_match, sg = x.strstart > x.w_size - v ? x.strstart - (x.w_size - v) : 0, og = x.window, cg = x.w_mask, rg = x.prev, dg = x.strstart + z, Bg = og[gg + lg - 1], Zg = og[gg + lg];
  1412. x.prev_length >= x.good_match && (_ >>= 2), ng > x.lookahead && (ng = x.lookahead);
  1413. do
  1414. if (og[(eg = Ag) + lg] === Zg && og[eg + lg - 1] === Bg && og[eg] === og[gg] && og[++eg] === og[gg + 1]) {
  1415. gg += 2, eg++;
  1416. do
  1417. ;
  1418. while (og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && gg < dg);
  1419. if (O = z - (dg - gg), gg = dg - z, lg < O) {
  1420. if (x.match_start = Ag, ng <= (lg = O)) break;
  1421. Bg = og[gg + lg - 1], Zg = og[gg + lg];
  1422. }
  1423. }
  1424. while ((Ag = rg[Ag & cg]) > sg && --_ != 0);
  1425. return lg <= x.lookahead ? lg : x.lookahead;
  1426. }
  1427. function L(x) {
  1428. var Ag, eg, O, _, gg, lg, ng, sg, og, cg, rg = x.w_size;
  1429. do {
  1430. if (_ = x.window_size - x.lookahead - x.strstart, x.strstart >= rg + (rg - v)) {
  1431. for (A.arraySet(x.window, x.window, rg, rg, 0), x.match_start -= rg, x.strstart -= rg, x.block_start -= rg, Ag = eg = x.hash_size; O = x.head[--Ag], x.head[Ag] = rg <= O ? O - rg : 0, --eg; ) ;
  1432. for (Ag = eg = rg; O = x.prev[--Ag], x.prev[Ag] = rg <= O ? O - rg : 0, --eg; ) ;
  1433. _ += rg;
  1434. }
  1435. if (x.strm.avail_in === 0) break;
  1436. if (lg = x.strm, ng = x.window, sg = x.strstart + x.lookahead, og = _, cg = void 0, cg = lg.avail_in, og < cg && (cg = og), eg = cg === 0 ? 0 : (lg.avail_in -= cg, A.arraySet(ng, lg.input, lg.next_in, cg, sg), lg.state.wrap === 1 ? lg.adler = l(lg.adler, ng, cg, sg) : lg.state.wrap === 2 && (lg.adler = n(lg.adler, ng, cg, sg)), lg.next_in += cg, lg.total_in += cg, cg), x.lookahead += eg, x.lookahead + x.insert >= S) for (gg = x.strstart - x.insert, x.ins_h = x.window[gg], x.ins_h = (x.ins_h << x.hash_shift ^ x.window[gg + 1]) & x.hash_mask; x.insert && (x.ins_h = (x.ins_h << x.hash_shift ^ x.window[gg + S - 1]) & x.hash_mask, x.prev[gg & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = gg, gg++, x.insert--, !(x.lookahead + x.insert < S)); ) ;
  1437. } while (x.lookahead < v && x.strm.avail_in !== 0);
  1438. }
  1439. function E(x, Ag) {
  1440. for (var eg, O; ; ) {
  1441. if (x.lookahead < v) {
  1442. if (L(x), x.lookahead < v && Ag === d) return N;
  1443. if (x.lookahead === 0) break;
  1444. }
  1445. if (eg = 0, x.lookahead >= S && (x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + S - 1]) & x.hash_mask, eg = x.prev[x.strstart & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = x.strstart), eg !== 0 && x.strstart - eg <= x.w_size - v && (x.match_length = P(x, eg)), x.match_length >= S) if (O = s._tr_tally(x, x.strstart - x.match_start, x.match_length - S), x.lookahead -= x.match_length, x.match_length <= x.max_lazy_match && x.lookahead >= S) {
  1446. for (x.match_length--; x.strstart++, x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + S - 1]) & x.hash_mask, eg = x.prev[x.strstart & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = x.strstart, --x.match_length != 0; ) ;
  1447. x.strstart++;
  1448. } else x.strstart += x.match_length, x.match_length = 0, x.ins_h = x.window[x.strstart], x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + 1]) & x.hash_mask;
  1449. else O = s._tr_tally(x, 0, x.window[x.strstart]), x.lookahead--, x.strstart++;
  1450. if (O && (F(x, !1), x.strm.avail_out === 0)) return N;
  1451. }
  1452. return x.insert = x.strstart < S - 1 ? x.strstart : S - 1, Ag === o ? (F(x, !0), x.strm.avail_out === 0 ? G : w) : x.last_lit && (F(x, !1), x.strm.avail_out === 0) ? N : B;
  1453. }
  1454. function J(x, Ag) {
  1455. for (var eg, O, _; ; ) {
  1456. if (x.lookahead < v) {
  1457. if (L(x), x.lookahead < v && Ag === d) return N;
  1458. if (x.lookahead === 0) break;
  1459. }
  1460. if (eg = 0, x.lookahead >= S && (x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + S - 1]) & x.hash_mask, eg = x.prev[x.strstart & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = x.strstart), x.prev_length = x.match_length, x.prev_match = x.match_start, x.match_length = S - 1, eg !== 0 && x.prev_length < x.max_lazy_match && x.strstart - eg <= x.w_size - v && (x.match_length = P(x, eg), x.match_length <= 5 && (x.strategy === 1 || x.match_length === S && 4096 < x.strstart - x.match_start) && (x.match_length = S - 1)), x.prev_length >= S && x.match_length <= x.prev_length) {
  1461. for (_ = x.strstart + x.lookahead - S, O = s._tr_tally(x, x.strstart - 1 - x.prev_match, x.prev_length - S), x.lookahead -= x.prev_length - 1, x.prev_length -= 2; ++x.strstart <= _ && (x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + S - 1]) & x.hash_mask, eg = x.prev[x.strstart & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = x.strstart), --x.prev_length != 0; ) ;
  1462. if (x.match_available = 0, x.match_length = S - 1, x.strstart++, O && (F(x, !1), x.strm.avail_out === 0)) return N;
  1463. } else if (x.match_available) {
  1464. if ((O = s._tr_tally(x, 0, x.window[x.strstart - 1])) && F(x, !1), x.strstart++, x.lookahead--, x.strm.avail_out === 0) return N;
  1465. } else x.match_available = 1, x.strstart++, x.lookahead--;
  1466. }
  1467. return x.match_available && (O = s._tr_tally(x, 0, x.window[x.strstart - 1]), x.match_available = 0), x.insert = x.strstart < S - 1 ? x.strstart : S - 1, Ag === o ? (F(x, !0), x.strm.avail_out === 0 ? G : w) : x.last_lit && (F(x, !1), x.strm.avail_out === 0) ? N : B;
  1468. }
  1469. function k(x, Ag, eg, O, _) {
  1470. this.good_length = x, this.max_lazy = Ag, this.nice_length = eg, this.max_chain = O, this.func = _;
  1471. }
  1472. function j() {
  1473. this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = m, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new A.Buf16(2 * X), this.dyn_dtree = new A.Buf16(2 * (2 * Y + 1)), this.bl_tree = new A.Buf16(2 * (2 * R + 1)), f(this.dyn_ltree), f(this.dyn_dtree), f(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new A.Buf16(H + 1), this.heap = new A.Buf16(2 * p + 1), f(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new A.Buf16(2 * p + 1), f(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;
  1474. }
  1475. function q(x) {
  1476. var Ag;
  1477. return x && x.state ? (x.total_in = x.total_out = 0, x.data_type = u, (Ag = x.state).pending = 0, Ag.pending_out = 0, Ag.wrap < 0 && (Ag.wrap = -Ag.wrap), Ag.status = Ag.wrap ? K : V, x.adler = Ag.wrap === 2 ? 0 : 1, Ag.last_flush = d, s._tr_init(Ag), c) : W(x, r);
  1478. }
  1479. function Cg(x) {
  1480. var Ag = q(x);
  1481. return Ag === c && function(eg) {
  1482. eg.window_size = 2 * eg.w_size, f(eg.head), eg.max_lazy_match = e[eg.level].max_lazy, eg.good_match = e[eg.level].good_length, eg.nice_match = e[eg.level].nice_length, eg.max_chain_length = e[eg.level].max_chain, eg.strstart = 0, eg.block_start = 0, eg.lookahead = 0, eg.insert = 0, eg.match_length = eg.prev_length = S - 1, eg.match_available = 0, eg.ins_h = 0;
  1483. }(x.state), Ag;
  1484. }
  1485. function Ig(x, Ag, eg, O, _, gg) {
  1486. if (!x) return r;
  1487. var lg = 1;
  1488. if (Ag === h && (Ag = 6), O < 0 ? (lg = 0, O = -O) : 15 < O && (lg = 2, O -= 16), _ < 1 || Z < _ || eg !== m || O < 8 || 15 < O || Ag < 0 || 9 < Ag || gg < 0 || b < gg) return W(x, r);
  1489. O === 8 && (O = 9);
  1490. var ng = new j();
  1491. return (x.state = ng).strm = x, ng.wrap = lg, ng.gzhead = null, ng.w_bits = O, ng.w_size = 1 << ng.w_bits, ng.w_mask = ng.w_size - 1, ng.hash_bits = _ + 7, ng.hash_size = 1 << ng.hash_bits, ng.hash_mask = ng.hash_size - 1, ng.hash_shift = ~~((ng.hash_bits + S - 1) / S), ng.window = new A.Buf8(2 * ng.w_size), ng.head = new A.Buf16(ng.hash_size), ng.prev = new A.Buf16(ng.w_size), ng.lit_bufsize = 1 << _ + 6, ng.pending_buf_size = 4 * ng.lit_bufsize, ng.pending_buf = new A.Buf8(ng.pending_buf_size), ng.d_buf = 1 * ng.lit_bufsize, ng.l_buf = 3 * ng.lit_bufsize, ng.level = Ag, ng.strategy = gg, ng.method = eg, Cg(x);
  1492. }
  1493. e = [new k(0, 0, 0, 0, function(x, Ag) {
  1494. var eg = 65535;
  1495. for (eg > x.pending_buf_size - 5 && (eg = x.pending_buf_size - 5); ; ) {
  1496. if (x.lookahead <= 1) {
  1497. if (L(x), x.lookahead === 0 && Ag === d) return N;
  1498. if (x.lookahead === 0) break;
  1499. }
  1500. x.strstart += x.lookahead, x.lookahead = 0;
  1501. var O = x.block_start + eg;
  1502. if ((x.strstart === 0 || x.strstart >= O) && (x.lookahead = x.strstart - O, x.strstart = O, F(x, !1), x.strm.avail_out === 0) || x.strstart - x.block_start >= x.w_size - v && (F(x, !1), x.strm.avail_out === 0)) return N;
  1503. }
  1504. return x.insert = 0, Ag === o ? (F(x, !0), x.strm.avail_out === 0 ? G : w) : (x.strstart > x.block_start && (F(x, !1), x.strm.avail_out), N);
  1505. }), new k(4, 4, 8, 4, E), new k(4, 5, 16, 8, E), new k(4, 6, 32, 32, E), new k(4, 4, 16, 16, J), new k(8, 16, 32, 32, J), new k(8, 16, 128, 128, J), new k(8, 32, 128, 256, J), new k(32, 128, 258, 1024, J), new k(32, 258, 258, 4096, J)], i.deflateInit = function(x, Ag) {
  1506. return Ig(x, Ag, m, 15, 8, 0);
  1507. }, i.deflateInit2 = Ig, i.deflateReset = Cg, i.deflateResetKeep = q, i.deflateSetHeader = function(x, Ag) {
  1508. return x && x.state ? x.state.wrap !== 2 ? r : (x.state.gzhead = Ag, c) : r;
  1509. }, i.deflate = function(x, Ag) {
  1510. var eg, O, _, gg;
  1511. if (!x || !x.state || 5 < Ag || Ag < 0) return x ? W(x, r) : r;
  1512. if (O = x.state, !x.output || !x.input && x.avail_in !== 0 || O.status === 666 && Ag !== o) return W(x, x.avail_out === 0 ? -5 : r);
  1513. if (O.strm = x, eg = O.last_flush, O.last_flush = Ag, O.status === K) if (O.wrap === 2) x.adler = 0, T(O, 31), T(O, 139), T(O, 8), O.gzhead ? (T(O, (O.gzhead.text ? 1 : 0) + (O.gzhead.hcrc ? 2 : 0) + (O.gzhead.extra ? 4 : 0) + (O.gzhead.name ? 8 : 0) + (O.gzhead.comment ? 16 : 0)), T(O, 255 & O.gzhead.time), T(O, O.gzhead.time >> 8 & 255), T(O, O.gzhead.time >> 16 & 255), T(O, O.gzhead.time >> 24 & 255), T(O, O.level === 9 ? 2 : 2 <= O.strategy || O.level < 2 ? 4 : 0), T(O, 255 & O.gzhead.os), O.gzhead.extra && O.gzhead.extra.length && (T(O, 255 & O.gzhead.extra.length), T(O, O.gzhead.extra.length >> 8 & 255)), O.gzhead.hcrc && (x.adler = n(x.adler, O.pending_buf, O.pending, 0)), O.gzindex = 0, O.status = 69) : (T(O, 0), T(O, 0), T(O, 0), T(O, 0), T(O, 0), T(O, O.level === 9 ? 2 : 2 <= O.strategy || O.level < 2 ? 4 : 0), T(O, 3), O.status = V);
  1514. else {
  1515. var lg = m + (O.w_bits - 8 << 4) << 8;
  1516. lg |= (2 <= O.strategy || O.level < 2 ? 0 : O.level < 6 ? 1 : O.level === 6 ? 2 : 3) << 6, O.strstart !== 0 && (lg |= 32), lg += 31 - lg % 31, O.status = V, Q(O, lg), O.strstart !== 0 && (Q(O, x.adler >>> 16), Q(O, 65535 & x.adler)), x.adler = 1;
  1517. }
  1518. if (O.status === 69) if (O.gzhead.extra) {
  1519. for (_ = O.pending; O.gzindex < (65535 & O.gzhead.extra.length) && (O.pending !== O.pending_buf_size || (O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), D(x), _ = O.pending, O.pending !== O.pending_buf_size)); ) T(O, 255 & O.gzhead.extra[O.gzindex]), O.gzindex++;
  1520. O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), O.gzindex === O.gzhead.extra.length && (O.gzindex = 0, O.status = 73);
  1521. } else O.status = 73;
  1522. if (O.status === 73) if (O.gzhead.name) {
  1523. _ = O.pending;
  1524. do {
  1525. if (O.pending === O.pending_buf_size && (O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), D(x), _ = O.pending, O.pending === O.pending_buf_size)) {
  1526. gg = 1;
  1527. break;
  1528. }
  1529. gg = O.gzindex < O.gzhead.name.length ? 255 & O.gzhead.name.charCodeAt(O.gzindex++) : 0, T(O, gg);
  1530. } while (gg !== 0);
  1531. O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), gg === 0 && (O.gzindex = 0, O.status = 91);
  1532. } else O.status = 91;
  1533. if (O.status === 91) if (O.gzhead.comment) {
  1534. _ = O.pending;
  1535. do {
  1536. if (O.pending === O.pending_buf_size && (O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), D(x), _ = O.pending, O.pending === O.pending_buf_size)) {
  1537. gg = 1;
  1538. break;
  1539. }
  1540. gg = O.gzindex < O.gzhead.comment.length ? 255 & O.gzhead.comment.charCodeAt(O.gzindex++) : 0, T(O, gg);
  1541. } while (gg !== 0);
  1542. O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), gg === 0 && (O.status = 103);
  1543. } else O.status = 103;
  1544. if (O.status === 103 && (O.gzhead.hcrc ? (O.pending + 2 > O.pending_buf_size && D(x), O.pending + 2 <= O.pending_buf_size && (T(O, 255 & x.adler), T(O, x.adler >> 8 & 255), x.adler = 0, O.status = V)) : O.status = V), O.pending !== 0) {
  1545. if (D(x), x.avail_out === 0) return O.last_flush = -1, c;
  1546. } else if (x.avail_in === 0 && y(Ag) <= y(eg) && Ag !== o) return W(x, -5);
  1547. if (O.status === 666 && x.avail_in !== 0) return W(x, -5);
  1548. if (x.avail_in !== 0 || O.lookahead !== 0 || Ag !== d && O.status !== 666) {
  1549. var ng = O.strategy === 2 ? function(sg, og) {
  1550. for (var cg; ; ) {
  1551. if (sg.lookahead === 0 && (L(sg), sg.lookahead === 0)) {
  1552. if (og === d) return N;
  1553. break;
  1554. }
  1555. if (sg.match_length = 0, cg = s._tr_tally(sg, 0, sg.window[sg.strstart]), sg.lookahead--, sg.strstart++, cg && (F(sg, !1), sg.strm.avail_out === 0)) return N;
  1556. }
  1557. return sg.insert = 0, og === o ? (F(sg, !0), sg.strm.avail_out === 0 ? G : w) : sg.last_lit && (F(sg, !1), sg.strm.avail_out === 0) ? N : B;
  1558. }(O, Ag) : O.strategy === 3 ? function(sg, og) {
  1559. for (var cg, rg, dg, Bg, Zg = sg.window; ; ) {
  1560. if (sg.lookahead <= z) {
  1561. if (L(sg), sg.lookahead <= z && og === d) return N;
  1562. if (sg.lookahead === 0) break;
  1563. }
  1564. if (sg.match_length = 0, sg.lookahead >= S && 0 < sg.strstart && (rg = Zg[dg = sg.strstart - 1]) === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg]) {
  1565. Bg = sg.strstart + z;
  1566. do
  1567. ;
  1568. while (rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && dg < Bg);
  1569. sg.match_length = z - (Bg - dg), sg.match_length > sg.lookahead && (sg.match_length = sg.lookahead);
  1570. }
  1571. if (sg.match_length >= S ? (cg = s._tr_tally(sg, 1, sg.match_length - S), sg.lookahead -= sg.match_length, sg.strstart += sg.match_length, sg.match_length = 0) : (cg = s._tr_tally(sg, 0, sg.window[sg.strstart]), sg.lookahead--, sg.strstart++), cg && (F(sg, !1), sg.strm.avail_out === 0)) return N;
  1572. }
  1573. return sg.insert = 0, og === o ? (F(sg, !0), sg.strm.avail_out === 0 ? G : w) : sg.last_lit && (F(sg, !1), sg.strm.avail_out === 0) ? N : B;
  1574. }(O, Ag) : e[O.level].func(O, Ag);
  1575. if (ng !== G && ng !== w || (O.status = 666), ng === N || ng === G) return x.avail_out === 0 && (O.last_flush = -1), c;
  1576. if (ng === B && (Ag === 1 ? s._tr_align(O) : Ag !== 5 && (s._tr_stored_block(O, 0, 0, !1), Ag === 3 && (f(O.head), O.lookahead === 0 && (O.strstart = 0, O.block_start = 0, O.insert = 0))), D(x), x.avail_out === 0)) return O.last_flush = -1, c;
  1577. }
  1578. return Ag !== o ? c : O.wrap <= 0 ? 1 : (O.wrap === 2 ? (T(O, 255 & x.adler), T(O, x.adler >> 8 & 255), T(O, x.adler >> 16 & 255), T(O, x.adler >> 24 & 255), T(O, 255 & x.total_in), T(O, x.total_in >> 8 & 255), T(O, x.total_in >> 16 & 255), T(O, x.total_in >> 24 & 255)) : (Q(O, x.adler >>> 16), Q(O, 65535 & x.adler)), D(x), 0 < O.wrap && (O.wrap = -O.wrap), O.pending !== 0 ? c : 1);
  1579. }, i.deflateEnd = function(x) {
  1580. var Ag;
  1581. return x && x.state ? (Ag = x.state.status) !== K && Ag !== 69 && Ag !== 73 && Ag !== 91 && Ag !== 103 && Ag !== V && Ag !== 666 ? W(x, r) : (x.state = null, Ag === V ? W(x, -3) : c) : r;
  1582. }, i.deflateSetDictionary = function(x, Ag) {
  1583. var eg, O, _, gg, lg, ng, sg, og, cg = Ag.length;
  1584. if (!x || !x.state || (gg = (eg = x.state).wrap) === 2 || gg === 1 && eg.status !== K || eg.lookahead) return r;
  1585. for (gg === 1 && (x.adler = l(x.adler, Ag, cg, 0)), eg.wrap = 0, cg >= eg.w_size && (gg === 0 && (f(eg.head), eg.strstart = 0, eg.block_start = 0, eg.insert = 0), og = new A.Buf8(eg.w_size), A.arraySet(og, Ag, cg - eg.w_size, eg.w_size, 0), Ag = og, cg = eg.w_size), lg = x.avail_in, ng = x.next_in, sg = x.input, x.avail_in = cg, x.next_in = 0, x.input = Ag, L(eg); eg.lookahead >= S; ) {
  1586. for (O = eg.strstart, _ = eg.lookahead - (S - 1); eg.ins_h = (eg.ins_h << eg.hash_shift ^ eg.window[O + S - 1]) & eg.hash_mask, eg.prev[O & eg.w_mask] = eg.head[eg.ins_h], eg.head[eg.ins_h] = O, O++, --_; ) ;
  1587. eg.strstart = O, eg.lookahead = S - 1, L(eg);
  1588. }
  1589. return eg.strstart += eg.lookahead, eg.block_start = eg.strstart, eg.insert = eg.lookahead, eg.lookahead = 0, eg.match_length = eg.prev_length = S - 1, eg.match_available = 0, x.next_in = ng, x.input = sg, x.avail_in = lg, eg.wrap = gg, c;
  1590. }, i.deflateInfo = "pako deflate (from Nodeca project)";
  1591. }, { "../utils/common": 41, "./adler32": 43, "./crc32": 45, "./messages": 51, "./trees": 52 }], 47: [function(g, C, i) {
  1592. C.exports = function() {
  1593. this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = "", this.comment = "", this.hcrc = 0, this.done = !1;
  1594. };
  1595. }, {}], 48: [function(g, C, i) {
  1596. C.exports = function(e, A) {
  1597. var s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B;
  1598. s = e.state, l = e.next_in, N = e.input, n = l + (e.avail_in - 5), a = e.next_out, B = e.output, d = a - (A - e.avail_out), o = a + (e.avail_out - 257), c = s.dmax, r = s.wsize, h = s.whave, b = s.wnext, u = s.window, m = s.hold, Z = s.bits, p = s.lencode, Y = s.distcode, R = (1 << s.lenbits) - 1, X = (1 << s.distbits) - 1;
  1599. g: do {
  1600. Z < 15 && (m += N[l++] << Z, Z += 8, m += N[l++] << Z, Z += 8), H = p[m & R];
  1601. I: for (; ; ) {
  1602. if (m >>>= S = H >>> 24, Z -= S, (S = H >>> 16 & 255) === 0) B[a++] = 65535 & H;
  1603. else {
  1604. if (!(16 & S)) {
  1605. if ((64 & S) == 0) {
  1606. H = p[(65535 & H) + (m & (1 << S) - 1)];
  1607. continue I;
  1608. }
  1609. if (32 & S) {
  1610. s.mode = 12;
  1611. break g;
  1612. }
  1613. e.msg = "invalid literal/length code", s.mode = 30;
  1614. break g;
  1615. }
  1616. z = 65535 & H, (S &= 15) && (Z < S && (m += N[l++] << Z, Z += 8), z += m & (1 << S) - 1, m >>>= S, Z -= S), Z < 15 && (m += N[l++] << Z, Z += 8, m += N[l++] << Z, Z += 8), H = Y[m & X];
  1617. C: for (; ; ) {
  1618. if (m >>>= S = H >>> 24, Z -= S, !(16 & (S = H >>> 16 & 255))) {
  1619. if ((64 & S) == 0) {
  1620. H = Y[(65535 & H) + (m & (1 << S) - 1)];
  1621. continue C;
  1622. }
  1623. e.msg = "invalid distance code", s.mode = 30;
  1624. break g;
  1625. }
  1626. if (v = 65535 & H, Z < (S &= 15) && (m += N[l++] << Z, (Z += 8) < S && (m += N[l++] << Z, Z += 8)), c < (v += m & (1 << S) - 1)) {
  1627. e.msg = "invalid distance too far back", s.mode = 30;
  1628. break g;
  1629. }
  1630. if (m >>>= S, Z -= S, (S = a - d) < v) {
  1631. if (h < (S = v - S) && s.sane) {
  1632. e.msg = "invalid distance too far back", s.mode = 30;
  1633. break g;
  1634. }
  1635. if (V = u, (K = 0) === b) {
  1636. if (K += r - S, S < z) {
  1637. for (z -= S; B[a++] = u[K++], --S; ) ;
  1638. K = a - v, V = B;
  1639. }
  1640. } else if (b < S) {
  1641. if (K += r + b - S, (S -= b) < z) {
  1642. for (z -= S; B[a++] = u[K++], --S; ) ;
  1643. if (K = 0, b < z) {
  1644. for (z -= S = b; B[a++] = u[K++], --S; ) ;
  1645. K = a - v, V = B;
  1646. }
  1647. }
  1648. } else if (K += b - S, S < z) {
  1649. for (z -= S; B[a++] = u[K++], --S; ) ;
  1650. K = a - v, V = B;
  1651. }
  1652. for (; 2 < z; ) B[a++] = V[K++], B[a++] = V[K++], B[a++] = V[K++], z -= 3;
  1653. z && (B[a++] = V[K++], 1 < z && (B[a++] = V[K++]));
  1654. } else {
  1655. for (K = a - v; B[a++] = B[K++], B[a++] = B[K++], B[a++] = B[K++], 2 < (z -= 3); ) ;
  1656. z && (B[a++] = B[K++], 1 < z && (B[a++] = B[K++]));
  1657. }
  1658. break;
  1659. }
  1660. }
  1661. break;
  1662. }
  1663. } while (l < n && a < o);
  1664. l -= z = Z >> 3, m &= (1 << (Z -= z << 3)) - 1, e.next_in = l, e.next_out = a, e.avail_in = l < n ? n - l + 5 : 5 - (l - n), e.avail_out = a < o ? o - a + 257 : 257 - (a - o), s.hold = m, s.bits = Z;
  1665. };
  1666. }, {}], 49: [function(g, C, i) {
  1667. var e = g("../utils/common"), A = g("./adler32"), s = g("./crc32"), l = g("./inffast"), n = g("./inftrees"), a = 1, d = 2, o = 0, c = -2, r = 1, h = 852, b = 592;
  1668. function u(K) {
  1669. return (K >>> 24 & 255) + (K >>> 8 & 65280) + ((65280 & K) << 8) + ((255 & K) << 24);
  1670. }
  1671. function m() {
  1672. this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new e.Buf16(320), this.work = new e.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;
  1673. }
  1674. function Z(K) {
  1675. var V;
  1676. return K && K.state ? (V = K.state, K.total_in = K.total_out = V.total = 0, K.msg = "", V.wrap && (K.adler = 1 & V.wrap), V.mode = r, V.last = 0, V.havedict = 0, V.dmax = 32768, V.head = null, V.hold = 0, V.bits = 0, V.lencode = V.lendyn = new e.Buf32(h), V.distcode = V.distdyn = new e.Buf32(b), V.sane = 1, V.back = -1, o) : c;
  1677. }
  1678. function p(K) {
  1679. var V;
  1680. return K && K.state ? ((V = K.state).wsize = 0, V.whave = 0, V.wnext = 0, Z(K)) : c;
  1681. }
  1682. function Y(K, V) {
  1683. var N, B;
  1684. return K && K.state ? (B = K.state, V < 0 ? (N = 0, V = -V) : (N = 1 + (V >> 4), V < 48 && (V &= 15)), V && (V < 8 || 15 < V) ? c : (B.window !== null && B.wbits !== V && (B.window = null), B.wrap = N, B.wbits = V, p(K))) : c;
  1685. }
  1686. function R(K, V) {
  1687. var N, B;
  1688. return K ? (B = new m(), (K.state = B).window = null, (N = Y(K, V)) !== o && (K.state = null), N) : c;
  1689. }
  1690. var X, H, S = !0;
  1691. function z(K) {
  1692. if (S) {
  1693. var V;
  1694. for (X = new e.Buf32(512), H = new e.Buf32(32), V = 0; V < 144; ) K.lens[V++] = 8;
  1695. for (; V < 256; ) K.lens[V++] = 9;
  1696. for (; V < 280; ) K.lens[V++] = 7;
  1697. for (; V < 288; ) K.lens[V++] = 8;
  1698. for (n(a, K.lens, 0, 288, X, 0, K.work, { bits: 9 }), V = 0; V < 32; ) K.lens[V++] = 5;
  1699. n(d, K.lens, 0, 32, H, 0, K.work, { bits: 5 }), S = !1;
  1700. }
  1701. K.lencode = X, K.lenbits = 9, K.distcode = H, K.distbits = 5;
  1702. }
  1703. function v(K, V, N, B) {
  1704. var G, w = K.state;
  1705. return w.window === null && (w.wsize = 1 << w.wbits, w.wnext = 0, w.whave = 0, w.window = new e.Buf8(w.wsize)), B >= w.wsize ? (e.arraySet(w.window, V, N - w.wsize, w.wsize, 0), w.wnext = 0, w.whave = w.wsize) : (B < (G = w.wsize - w.wnext) && (G = B), e.arraySet(w.window, V, N - B, G, w.wnext), (B -= G) ? (e.arraySet(w.window, V, N - B, B, 0), w.wnext = B, w.whave = w.wsize) : (w.wnext += G, w.wnext === w.wsize && (w.wnext = 0), w.whave < w.wsize && (w.whave += G))), 0;
  1706. }
  1707. i.inflateReset = p, i.inflateReset2 = Y, i.inflateResetKeep = Z, i.inflateInit = function(K) {
  1708. return R(K, 15);
  1709. }, i.inflateInit2 = R, i.inflate = function(K, V) {
  1710. var N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _ = 0, gg = new e.Buf8(4), lg = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
  1711. if (!K || !K.state || !K.output || !K.input && K.avail_in !== 0) return c;
  1712. (N = K.state).mode === 12 && (N.mode = 13), W = K.next_out, G = K.output, f = K.avail_out, w = K.next_in, B = K.input, y = K.avail_in, D = N.hold, F = N.bits, T = y, Q = f, Ag = o;
  1713. g: for (; ; ) switch (N.mode) {
  1714. case r:
  1715. if (N.wrap === 0) {
  1716. N.mode = 13;
  1717. break;
  1718. }
  1719. for (; F < 16; ) {
  1720. if (y === 0) break g;
  1721. y--, D += B[w++] << F, F += 8;
  1722. }
  1723. if (2 & N.wrap && D === 35615) {
  1724. gg[N.check = 0] = 255 & D, gg[1] = D >>> 8 & 255, N.check = s(N.check, gg, 2, 0), F = D = 0, N.mode = 2;
  1725. break;
  1726. }
  1727. if (N.flags = 0, N.head && (N.head.done = !1), !(1 & N.wrap) || (((255 & D) << 8) + (D >> 8)) % 31) {
  1728. K.msg = "incorrect header check", N.mode = 30;
  1729. break;
  1730. }
  1731. if ((15 & D) != 8) {
  1732. K.msg = "unknown compression method", N.mode = 30;
  1733. break;
  1734. }
  1735. if (F -= 4, x = 8 + (15 & (D >>>= 4)), N.wbits === 0) N.wbits = x;
  1736. else if (x > N.wbits) {
  1737. K.msg = "invalid window size", N.mode = 30;
  1738. break;
  1739. }
  1740. N.dmax = 1 << x, K.adler = N.check = 1, N.mode = 512 & D ? 10 : 12, F = D = 0;
  1741. break;
  1742. case 2:
  1743. for (; F < 16; ) {
  1744. if (y === 0) break g;
  1745. y--, D += B[w++] << F, F += 8;
  1746. }
  1747. if (N.flags = D, (255 & N.flags) != 8) {
  1748. K.msg = "unknown compression method", N.mode = 30;
  1749. break;
  1750. }
  1751. if (57344 & N.flags) {
  1752. K.msg = "unknown header flags set", N.mode = 30;
  1753. break;
  1754. }
  1755. N.head && (N.head.text = D >> 8 & 1), 512 & N.flags && (gg[0] = 255 & D, gg[1] = D >>> 8 & 255, N.check = s(N.check, gg, 2, 0)), F = D = 0, N.mode = 3;
  1756. case 3:
  1757. for (; F < 32; ) {
  1758. if (y === 0) break g;
  1759. y--, D += B[w++] << F, F += 8;
  1760. }
  1761. N.head && (N.head.time = D), 512 & N.flags && (gg[0] = 255 & D, gg[1] = D >>> 8 & 255, gg[2] = D >>> 16 & 255, gg[3] = D >>> 24 & 255, N.check = s(N.check, gg, 4, 0)), F = D = 0, N.mode = 4;
  1762. case 4:
  1763. for (; F < 16; ) {
  1764. if (y === 0) break g;
  1765. y--, D += B[w++] << F, F += 8;
  1766. }
  1767. N.head && (N.head.xflags = 255 & D, N.head.os = D >> 8), 512 & N.flags && (gg[0] = 255 & D, gg[1] = D >>> 8 & 255, N.check = s(N.check, gg, 2, 0)), F = D = 0, N.mode = 5;
  1768. case 5:
  1769. if (1024 & N.flags) {
  1770. for (; F < 16; ) {
  1771. if (y === 0) break g;
  1772. y--, D += B[w++] << F, F += 8;
  1773. }
  1774. N.length = D, N.head && (N.head.extra_len = D), 512 & N.flags && (gg[0] = 255 & D, gg[1] = D >>> 8 & 255, N.check = s(N.check, gg, 2, 0)), F = D = 0;
  1775. } else N.head && (N.head.extra = null);
  1776. N.mode = 6;
  1777. case 6:
  1778. if (1024 & N.flags && (y < (P = N.length) && (P = y), P && (N.head && (x = N.head.extra_len - N.length, N.head.extra || (N.head.extra = new Array(N.head.extra_len)), e.arraySet(N.head.extra, B, w, P, x)), 512 & N.flags && (N.check = s(N.check, B, P, w)), y -= P, w += P, N.length -= P), N.length)) break g;
  1779. N.length = 0, N.mode = 7;
  1780. case 7:
  1781. if (2048 & N.flags) {
  1782. if (y === 0) break g;
  1783. for (P = 0; x = B[w + P++], N.head && x && N.length < 65536 && (N.head.name += String.fromCharCode(x)), x && P < y; ) ;
  1784. if (512 & N.flags && (N.check = s(N.check, B, P, w)), y -= P, w += P, x) break g;
  1785. } else N.head && (N.head.name = null);
  1786. N.length = 0, N.mode = 8;
  1787. case 8:
  1788. if (4096 & N.flags) {
  1789. if (y === 0) break g;
  1790. for (P = 0; x = B[w + P++], N.head && x && N.length < 65536 && (N.head.comment += String.fromCharCode(x)), x && P < y; ) ;
  1791. if (512 & N.flags && (N.check = s(N.check, B, P, w)), y -= P, w += P, x) break g;
  1792. } else N.head && (N.head.comment = null);
  1793. N.mode = 9;
  1794. case 9:
  1795. if (512 & N.flags) {
  1796. for (; F < 16; ) {
  1797. if (y === 0) break g;
  1798. y--, D += B[w++] << F, F += 8;
  1799. }
  1800. if (D !== (65535 & N.check)) {
  1801. K.msg = "header crc mismatch", N.mode = 30;
  1802. break;
  1803. }
  1804. F = D = 0;
  1805. }
  1806. N.head && (N.head.hcrc = N.flags >> 9 & 1, N.head.done = !0), K.adler = N.check = 0, N.mode = 12;
  1807. break;
  1808. case 10:
  1809. for (; F < 32; ) {
  1810. if (y === 0) break g;
  1811. y--, D += B[w++] << F, F += 8;
  1812. }
  1813. K.adler = N.check = u(D), F = D = 0, N.mode = 11;
  1814. case 11:
  1815. if (N.havedict === 0) return K.next_out = W, K.avail_out = f, K.next_in = w, K.avail_in = y, N.hold = D, N.bits = F, 2;
  1816. K.adler = N.check = 1, N.mode = 12;
  1817. case 12:
  1818. if (V === 5 || V === 6) break g;
  1819. case 13:
  1820. if (N.last) {
  1821. D >>>= 7 & F, F -= 7 & F, N.mode = 27;
  1822. break;
  1823. }
  1824. for (; F < 3; ) {
  1825. if (y === 0) break g;
  1826. y--, D += B[w++] << F, F += 8;
  1827. }
  1828. switch (N.last = 1 & D, F -= 1, 3 & (D >>>= 1)) {
  1829. case 0:
  1830. N.mode = 14;
  1831. break;
  1832. case 1:
  1833. if (z(N), N.mode = 20, V !== 6) break;
  1834. D >>>= 2, F -= 2;
  1835. break g;
  1836. case 2:
  1837. N.mode = 17;
  1838. break;
  1839. case 3:
  1840. K.msg = "invalid block type", N.mode = 30;
  1841. }
  1842. D >>>= 2, F -= 2;
  1843. break;
  1844. case 14:
  1845. for (D >>>= 7 & F, F -= 7 & F; F < 32; ) {
  1846. if (y === 0) break g;
  1847. y--, D += B[w++] << F, F += 8;
  1848. }
  1849. if ((65535 & D) != (D >>> 16 ^ 65535)) {
  1850. K.msg = "invalid stored block lengths", N.mode = 30;
  1851. break;
  1852. }
  1853. if (N.length = 65535 & D, F = D = 0, N.mode = 15, V === 6) break g;
  1854. case 15:
  1855. N.mode = 16;
  1856. case 16:
  1857. if (P = N.length) {
  1858. if (y < P && (P = y), f < P && (P = f), P === 0) break g;
  1859. e.arraySet(G, B, w, P, W), y -= P, w += P, f -= P, W += P, N.length -= P;
  1860. break;
  1861. }
  1862. N.mode = 12;
  1863. break;
  1864. case 17:
  1865. for (; F < 14; ) {
  1866. if (y === 0) break g;
  1867. y--, D += B[w++] << F, F += 8;
  1868. }
  1869. if (N.nlen = 257 + (31 & D), D >>>= 5, F -= 5, N.ndist = 1 + (31 & D), D >>>= 5, F -= 5, N.ncode = 4 + (15 & D), D >>>= 4, F -= 4, 286 < N.nlen || 30 < N.ndist) {
  1870. K.msg = "too many length or distance symbols", N.mode = 30;
  1871. break;
  1872. }
  1873. N.have = 0, N.mode = 18;
  1874. case 18:
  1875. for (; N.have < N.ncode; ) {
  1876. for (; F < 3; ) {
  1877. if (y === 0) break g;
  1878. y--, D += B[w++] << F, F += 8;
  1879. }
  1880. N.lens[lg[N.have++]] = 7 & D, D >>>= 3, F -= 3;
  1881. }
  1882. for (; N.have < 19; ) N.lens[lg[N.have++]] = 0;
  1883. if (N.lencode = N.lendyn, N.lenbits = 7, eg = { bits: N.lenbits }, Ag = n(0, N.lens, 0, 19, N.lencode, 0, N.work, eg), N.lenbits = eg.bits, Ag) {
  1884. K.msg = "invalid code lengths set", N.mode = 30;
  1885. break;
  1886. }
  1887. N.have = 0, N.mode = 19;
  1888. case 19:
  1889. for (; N.have < N.nlen + N.ndist; ) {
  1890. for (; k = (_ = N.lencode[D & (1 << N.lenbits) - 1]) >>> 16 & 255, j = 65535 & _, !((J = _ >>> 24) <= F); ) {
  1891. if (y === 0) break g;
  1892. y--, D += B[w++] << F, F += 8;
  1893. }
  1894. if (j < 16) D >>>= J, F -= J, N.lens[N.have++] = j;
  1895. else {
  1896. if (j === 16) {
  1897. for (O = J + 2; F < O; ) {
  1898. if (y === 0) break g;
  1899. y--, D += B[w++] << F, F += 8;
  1900. }
  1901. if (D >>>= J, F -= J, N.have === 0) {
  1902. K.msg = "invalid bit length repeat", N.mode = 30;
  1903. break;
  1904. }
  1905. x = N.lens[N.have - 1], P = 3 + (3 & D), D >>>= 2, F -= 2;
  1906. } else if (j === 17) {
  1907. for (O = J + 3; F < O; ) {
  1908. if (y === 0) break g;
  1909. y--, D += B[w++] << F, F += 8;
  1910. }
  1911. F -= J, x = 0, P = 3 + (7 & (D >>>= J)), D >>>= 3, F -= 3;
  1912. } else {
  1913. for (O = J + 7; F < O; ) {
  1914. if (y === 0) break g;
  1915. y--, D += B[w++] << F, F += 8;
  1916. }
  1917. F -= J, x = 0, P = 11 + (127 & (D >>>= J)), D >>>= 7, F -= 7;
  1918. }
  1919. if (N.have + P > N.nlen + N.ndist) {
  1920. K.msg = "invalid bit length repeat", N.mode = 30;
  1921. break;
  1922. }
  1923. for (; P--; ) N.lens[N.have++] = x;
  1924. }
  1925. }
  1926. if (N.mode === 30) break;
  1927. if (N.lens[256] === 0) {
  1928. K.msg = "invalid code -- missing end-of-block", N.mode = 30;
  1929. break;
  1930. }
  1931. if (N.lenbits = 9, eg = { bits: N.lenbits }, Ag = n(a, N.lens, 0, N.nlen, N.lencode, 0, N.work, eg), N.lenbits = eg.bits, Ag) {
  1932. K.msg = "invalid literal/lengths set", N.mode = 30;
  1933. break;
  1934. }
  1935. if (N.distbits = 6, N.distcode = N.distdyn, eg = { bits: N.distbits }, Ag = n(d, N.lens, N.nlen, N.ndist, N.distcode, 0, N.work, eg), N.distbits = eg.bits, Ag) {
  1936. K.msg = "invalid distances set", N.mode = 30;
  1937. break;
  1938. }
  1939. if (N.mode = 20, V === 6) break g;
  1940. case 20:
  1941. N.mode = 21;
  1942. case 21:
  1943. if (6 <= y && 258 <= f) {
  1944. K.next_out = W, K.avail_out = f, K.next_in = w, K.avail_in = y, N.hold = D, N.bits = F, l(K, Q), W = K.next_out, G = K.output, f = K.avail_out, w = K.next_in, B = K.input, y = K.avail_in, D = N.hold, F = N.bits, N.mode === 12 && (N.back = -1);
  1945. break;
  1946. }
  1947. for (N.back = 0; k = (_ = N.lencode[D & (1 << N.lenbits) - 1]) >>> 16 & 255, j = 65535 & _, !((J = _ >>> 24) <= F); ) {
  1948. if (y === 0) break g;
  1949. y--, D += B[w++] << F, F += 8;
  1950. }
  1951. if (k && (240 & k) == 0) {
  1952. for (q = J, Cg = k, Ig = j; k = (_ = N.lencode[Ig + ((D & (1 << q + Cg) - 1) >> q)]) >>> 16 & 255, j = 65535 & _, !(q + (J = _ >>> 24) <= F); ) {
  1953. if (y === 0) break g;
  1954. y--, D += B[w++] << F, F += 8;
  1955. }
  1956. D >>>= q, F -= q, N.back += q;
  1957. }
  1958. if (D >>>= J, F -= J, N.back += J, N.length = j, k === 0) {
  1959. N.mode = 26;
  1960. break;
  1961. }
  1962. if (32 & k) {
  1963. N.back = -1, N.mode = 12;
  1964. break;
  1965. }
  1966. if (64 & k) {
  1967. K.msg = "invalid literal/length code", N.mode = 30;
  1968. break;
  1969. }
  1970. N.extra = 15 & k, N.mode = 22;
  1971. case 22:
  1972. if (N.extra) {
  1973. for (O = N.extra; F < O; ) {
  1974. if (y === 0) break g;
  1975. y--, D += B[w++] << F, F += 8;
  1976. }
  1977. N.length += D & (1 << N.extra) - 1, D >>>= N.extra, F -= N.extra, N.back += N.extra;
  1978. }
  1979. N.was = N.length, N.mode = 23;
  1980. case 23:
  1981. for (; k = (_ = N.distcode[D & (1 << N.distbits) - 1]) >>> 16 & 255, j = 65535 & _, !((J = _ >>> 24) <= F); ) {
  1982. if (y === 0) break g;
  1983. y--, D += B[w++] << F, F += 8;
  1984. }
  1985. if ((240 & k) == 0) {
  1986. for (q = J, Cg = k, Ig = j; k = (_ = N.distcode[Ig + ((D & (1 << q + Cg) - 1) >> q)]) >>> 16 & 255, j = 65535 & _, !(q + (J = _ >>> 24) <= F); ) {
  1987. if (y === 0) break g;
  1988. y--, D += B[w++] << F, F += 8;
  1989. }
  1990. D >>>= q, F -= q, N.back += q;
  1991. }
  1992. if (D >>>= J, F -= J, N.back += J, 64 & k) {
  1993. K.msg = "invalid distance code", N.mode = 30;
  1994. break;
  1995. }
  1996. N.offset = j, N.extra = 15 & k, N.mode = 24;
  1997. case 24:
  1998. if (N.extra) {
  1999. for (O = N.extra; F < O; ) {
  2000. if (y === 0) break g;
  2001. y--, D += B[w++] << F, F += 8;
  2002. }
  2003. N.offset += D & (1 << N.extra) - 1, D >>>= N.extra, F -= N.extra, N.back += N.extra;
  2004. }
  2005. if (N.offset > N.dmax) {
  2006. K.msg = "invalid distance too far back", N.mode = 30;
  2007. break;
  2008. }
  2009. N.mode = 25;
  2010. case 25:
  2011. if (f === 0) break g;
  2012. if (P = Q - f, N.offset > P) {
  2013. if ((P = N.offset - P) > N.whave && N.sane) {
  2014. K.msg = "invalid distance too far back", N.mode = 30;
  2015. break;
  2016. }
  2017. L = P > N.wnext ? (P -= N.wnext, N.wsize - P) : N.wnext - P, P > N.length && (P = N.length), E = N.window;
  2018. } else E = G, L = W - N.offset, P = N.length;
  2019. for (f < P && (P = f), f -= P, N.length -= P; G[W++] = E[L++], --P; ) ;
  2020. N.length === 0 && (N.mode = 21);
  2021. break;
  2022. case 26:
  2023. if (f === 0) break g;
  2024. G[W++] = N.length, f--, N.mode = 21;
  2025. break;
  2026. case 27:
  2027. if (N.wrap) {
  2028. for (; F < 32; ) {
  2029. if (y === 0) break g;
  2030. y--, D |= B[w++] << F, F += 8;
  2031. }
  2032. if (Q -= f, K.total_out += Q, N.total += Q, Q && (K.adler = N.check = N.flags ? s(N.check, G, Q, W - Q) : A(N.check, G, Q, W - Q)), Q = f, (N.flags ? D : u(D)) !== N.check) {
  2033. K.msg = "incorrect data check", N.mode = 30;
  2034. break;
  2035. }
  2036. F = D = 0;
  2037. }
  2038. N.mode = 28;
  2039. case 28:
  2040. if (N.wrap && N.flags) {
  2041. for (; F < 32; ) {
  2042. if (y === 0) break g;
  2043. y--, D += B[w++] << F, F += 8;
  2044. }
  2045. if (D !== (4294967295 & N.total)) {
  2046. K.msg = "incorrect length check", N.mode = 30;
  2047. break;
  2048. }
  2049. F = D = 0;
  2050. }
  2051. N.mode = 29;
  2052. case 29:
  2053. Ag = 1;
  2054. break g;
  2055. case 30:
  2056. Ag = -3;
  2057. break g;
  2058. case 31:
  2059. return -4;
  2060. case 32:
  2061. default:
  2062. return c;
  2063. }
  2064. return K.next_out = W, K.avail_out = f, K.next_in = w, K.avail_in = y, N.hold = D, N.bits = F, (N.wsize || Q !== K.avail_out && N.mode < 30 && (N.mode < 27 || V !== 4)) && v(K, K.output, K.next_out, Q - K.avail_out) ? (N.mode = 31, -4) : (T -= K.avail_in, Q -= K.avail_out, K.total_in += T, K.total_out += Q, N.total += Q, N.wrap && Q && (K.adler = N.check = N.flags ? s(N.check, G, Q, K.next_out - Q) : A(N.check, G, Q, K.next_out - Q)), K.data_type = N.bits + (N.last ? 64 : 0) + (N.mode === 12 ? 128 : 0) + (N.mode === 20 || N.mode === 15 ? 256 : 0), (T == 0 && Q === 0 || V === 4) && Ag === o && (Ag = -5), Ag);
  2065. }, i.inflateEnd = function(K) {
  2066. if (!K || !K.state) return c;
  2067. var V = K.state;
  2068. return V.window && (V.window = null), K.state = null, o;
  2069. }, i.inflateGetHeader = function(K, V) {
  2070. var N;
  2071. return K && K.state ? (2 & (N = K.state).wrap) == 0 ? c : ((N.head = V).done = !1, o) : c;
  2072. }, i.inflateSetDictionary = function(K, V) {
  2073. var N, B = V.length;
  2074. return K && K.state ? (N = K.state).wrap !== 0 && N.mode !== 11 ? c : N.mode === 11 && A(1, V, B, 0) !== N.check ? -3 : v(K, V, B, B) ? (N.mode = 31, -4) : (N.havedict = 1, o) : c;
  2075. }, i.inflateInfo = "pako inflate (from Nodeca project)";
  2076. }, { "../utils/common": 41, "./adler32": 43, "./crc32": 45, "./inffast": 48, "./inftrees": 50 }], 50: [function(g, C, i) {
  2077. var e = g("../utils/common"), A = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], s = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], l = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], n = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];
  2078. C.exports = function(a, d, o, c, r, h, b, u) {
  2079. var m, Z, p, Y, R, X, H, S, z, v = u.bits, K = 0, V = 0, N = 0, B = 0, G = 0, w = 0, W = 0, y = 0, f = 0, D = 0, F = null, T = 0, Q = new e.Buf16(16), P = new e.Buf16(16), L = null, E = 0;
  2080. for (K = 0; K <= 15; K++) Q[K] = 0;
  2081. for (V = 0; V < c; V++) Q[d[o + V]]++;
  2082. for (G = v, B = 15; 1 <= B && Q[B] === 0; B--) ;
  2083. if (B < G && (G = B), B === 0) return r[h++] = 20971520, r[h++] = 20971520, u.bits = 1, 0;
  2084. for (N = 1; N < B && Q[N] === 0; N++) ;
  2085. for (G < N && (G = N), K = y = 1; K <= 15; K++) if (y <<= 1, (y -= Q[K]) < 0) return -1;
  2086. if (0 < y && (a === 0 || B !== 1)) return -1;
  2087. for (P[1] = 0, K = 1; K < 15; K++) P[K + 1] = P[K] + Q[K];
  2088. for (V = 0; V < c; V++) d[o + V] !== 0 && (b[P[d[o + V]]++] = V);
  2089. if (X = a === 0 ? (F = L = b, 19) : a === 1 ? (F = A, T -= 257, L = s, E -= 257, 256) : (F = l, L = n, -1), K = N, R = h, W = V = D = 0, p = -1, Y = (f = 1 << (w = G)) - 1, a === 1 && 852 < f || a === 2 && 592 < f) return 1;
  2090. for (; ; ) {
  2091. for (H = K - W, z = b[V] < X ? (S = 0, b[V]) : b[V] > X ? (S = L[E + b[V]], F[T + b[V]]) : (S = 96, 0), m = 1 << K - W, N = Z = 1 << w; r[R + (D >> W) + (Z -= m)] = H << 24 | S << 16 | z | 0, Z !== 0; ) ;
  2092. for (m = 1 << K - 1; D & m; ) m >>= 1;
  2093. if (m !== 0 ? (D &= m - 1, D += m) : D = 0, V++, --Q[K] == 0) {
  2094. if (K === B) break;
  2095. K = d[o + b[V]];
  2096. }
  2097. if (G < K && (D & Y) !== p) {
  2098. for (W === 0 && (W = G), R += N, y = 1 << (w = K - W); w + W < B && !((y -= Q[w + W]) <= 0); ) w++, y <<= 1;
  2099. if (f += 1 << w, a === 1 && 852 < f || a === 2 && 592 < f) return 1;
  2100. r[p = D & Y] = G << 24 | w << 16 | R - h | 0;
  2101. }
  2102. }
  2103. return D !== 0 && (r[R + D] = K - W << 24 | 64 << 16 | 0), u.bits = G, 0;
  2104. };
  2105. }, { "../utils/common": 41 }], 51: [function(g, C, i) {
  2106. C.exports = { 2: "need dictionary", 1: "stream end", 0: "", "-1": "file error", "-2": "stream error", "-3": "data error", "-4": "insufficient memory", "-5": "buffer error", "-6": "incompatible version" };
  2107. }, {}], 52: [function(g, C, i) {
  2108. var e = g("../utils/common"), A = 0, s = 1;
  2109. function l(_) {
  2110. for (var gg = _.length; 0 <= --gg; ) _[gg] = 0;
  2111. }
  2112. var n = 0, a = 29, d = 256, o = d + 1 + a, c = 30, r = 19, h = 2 * o + 1, b = 15, u = 16, m = 7, Z = 256, p = 16, Y = 17, R = 18, X = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], H = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], S = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], z = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], v = new Array(2 * (o + 2));
  2113. l(v);
  2114. var K = new Array(2 * c);
  2115. l(K);
  2116. var V = new Array(512);
  2117. l(V);
  2118. var N = new Array(256);
  2119. l(N);
  2120. var B = new Array(a);
  2121. l(B);
  2122. var G, w, W, y = new Array(c);
  2123. function f(_, gg, lg, ng, sg) {
  2124. this.static_tree = _, this.extra_bits = gg, this.extra_base = lg, this.elems = ng, this.max_length = sg, this.has_stree = _ && _.length;
  2125. }
  2126. function D(_, gg) {
  2127. this.dyn_tree = _, this.max_code = 0, this.stat_desc = gg;
  2128. }
  2129. function F(_) {
  2130. return _ < 256 ? V[_] : V[256 + (_ >>> 7)];
  2131. }
  2132. function T(_, gg) {
  2133. _.pending_buf[_.pending++] = 255 & gg, _.pending_buf[_.pending++] = gg >>> 8 & 255;
  2134. }
  2135. function Q(_, gg, lg) {
  2136. _.bi_valid > u - lg ? (_.bi_buf |= gg << _.bi_valid & 65535, T(_, _.bi_buf), _.bi_buf = gg >> u - _.bi_valid, _.bi_valid += lg - u) : (_.bi_buf |= gg << _.bi_valid & 65535, _.bi_valid += lg);
  2137. }
  2138. function P(_, gg, lg) {
  2139. Q(_, lg[2 * gg], lg[2 * gg + 1]);
  2140. }
  2141. function L(_, gg) {
  2142. for (var lg = 0; lg |= 1 & _, _ >>>= 1, lg <<= 1, 0 < --gg; ) ;
  2143. return lg >>> 1;
  2144. }
  2145. function E(_, gg, lg) {
  2146. var ng, sg, og = new Array(b + 1), cg = 0;
  2147. for (ng = 1; ng <= b; ng++) og[ng] = cg = cg + lg[ng - 1] << 1;
  2148. for (sg = 0; sg <= gg; sg++) {
  2149. var rg = _[2 * sg + 1];
  2150. rg !== 0 && (_[2 * sg] = L(og[rg]++, rg));
  2151. }
  2152. }
  2153. function J(_) {
  2154. var gg;
  2155. for (gg = 0; gg < o; gg++) _.dyn_ltree[2 * gg] = 0;
  2156. for (gg = 0; gg < c; gg++) _.dyn_dtree[2 * gg] = 0;
  2157. for (gg = 0; gg < r; gg++) _.bl_tree[2 * gg] = 0;
  2158. _.dyn_ltree[2 * Z] = 1, _.opt_len = _.static_len = 0, _.last_lit = _.matches = 0;
  2159. }
  2160. function k(_) {
  2161. 8 < _.bi_valid ? T(_, _.bi_buf) : 0 < _.bi_valid && (_.pending_buf[_.pending++] = _.bi_buf), _.bi_buf = 0, _.bi_valid = 0;
  2162. }
  2163. function j(_, gg, lg, ng) {
  2164. var sg = 2 * gg, og = 2 * lg;
  2165. return _[sg] < _[og] || _[sg] === _[og] && ng[gg] <= ng[lg];
  2166. }
  2167. function q(_, gg, lg) {
  2168. for (var ng = _.heap[lg], sg = lg << 1; sg <= _.heap_len && (sg < _.heap_len && j(gg, _.heap[sg + 1], _.heap[sg], _.depth) && sg++, !j(gg, ng, _.heap[sg], _.depth)); ) _.heap[lg] = _.heap[sg], lg = sg, sg <<= 1;
  2169. _.heap[lg] = ng;
  2170. }
  2171. function Cg(_, gg, lg) {
  2172. var ng, sg, og, cg, rg = 0;
  2173. if (_.last_lit !== 0) for (; ng = _.pending_buf[_.d_buf + 2 * rg] << 8 | _.pending_buf[_.d_buf + 2 * rg + 1], sg = _.pending_buf[_.l_buf + rg], rg++, ng === 0 ? P(_, sg, gg) : (P(_, (og = N[sg]) + d + 1, gg), (cg = X[og]) !== 0 && Q(_, sg -= B[og], cg), P(_, og = F(--ng), lg), (cg = H[og]) !== 0 && Q(_, ng -= y[og], cg)), rg < _.last_lit; ) ;
  2174. P(_, Z, gg);
  2175. }
  2176. function Ig(_, gg) {
  2177. var lg, ng, sg, og = gg.dyn_tree, cg = gg.stat_desc.static_tree, rg = gg.stat_desc.has_stree, dg = gg.stat_desc.elems, Bg = -1;
  2178. for (_.heap_len = 0, _.heap_max = h, lg = 0; lg < dg; lg++) og[2 * lg] !== 0 ? (_.heap[++_.heap_len] = Bg = lg, _.depth[lg] = 0) : og[2 * lg + 1] = 0;
  2179. for (; _.heap_len < 2; ) og[2 * (sg = _.heap[++_.heap_len] = Bg < 2 ? ++Bg : 0)] = 1, _.depth[sg] = 0, _.opt_len--, rg && (_.static_len -= cg[2 * sg + 1]);
  2180. for (gg.max_code = Bg, lg = _.heap_len >> 1; 1 <= lg; lg--) q(_, og, lg);
  2181. for (sg = dg; lg = _.heap[1], _.heap[1] = _.heap[_.heap_len--], q(_, og, 1), ng = _.heap[1], _.heap[--_.heap_max] = lg, _.heap[--_.heap_max] = ng, og[2 * sg] = og[2 * lg] + og[2 * ng], _.depth[sg] = (_.depth[lg] >= _.depth[ng] ? _.depth[lg] : _.depth[ng]) + 1, og[2 * lg + 1] = og[2 * ng + 1] = sg, _.heap[1] = sg++, q(_, og, 1), 2 <= _.heap_len; ) ;
  2182. _.heap[--_.heap_max] = _.heap[1], function(Zg, Xg) {
  2183. var Kg, kg, Wg, Ng, wg, fg, Jg = Xg.dyn_tree, zg = Xg.max_code, cI = Xg.stat_desc.static_tree, YI = Xg.stat_desc.has_stree, Eg = Xg.stat_desc.extra_bits, aI = Xg.stat_desc.extra_base, dI = Xg.stat_desc.max_length, _g = 0;
  2184. for (Ng = 0; Ng <= b; Ng++) Zg.bl_count[Ng] = 0;
  2185. for (Jg[2 * Zg.heap[Zg.heap_max] + 1] = 0, Kg = Zg.heap_max + 1; Kg < h; Kg++) dI < (Ng = Jg[2 * Jg[2 * (kg = Zg.heap[Kg]) + 1] + 1] + 1) && (Ng = dI, _g++), Jg[2 * kg + 1] = Ng, zg < kg || (Zg.bl_count[Ng]++, wg = 0, aI <= kg && (wg = Eg[kg - aI]), fg = Jg[2 * kg], Zg.opt_len += fg * (Ng + wg), YI && (Zg.static_len += fg * (cI[2 * kg + 1] + wg)));
  2186. if (_g !== 0) {
  2187. do {
  2188. for (Ng = dI - 1; Zg.bl_count[Ng] === 0; ) Ng--;
  2189. Zg.bl_count[Ng]--, Zg.bl_count[Ng + 1] += 2, Zg.bl_count[dI]--, _g -= 2;
  2190. } while (0 < _g);
  2191. for (Ng = dI; Ng !== 0; Ng--) for (kg = Zg.bl_count[Ng]; kg !== 0; ) zg < (Wg = Zg.heap[--Kg]) || (Jg[2 * Wg + 1] !== Ng && (Zg.opt_len += (Ng - Jg[2 * Wg + 1]) * Jg[2 * Wg], Jg[2 * Wg + 1] = Ng), kg--);
  2192. }
  2193. }(_, gg), E(og, Bg, _.bl_count);
  2194. }
  2195. function x(_, gg, lg) {
  2196. var ng, sg, og = -1, cg = gg[1], rg = 0, dg = 7, Bg = 4;
  2197. for (cg === 0 && (dg = 138, Bg = 3), gg[2 * (lg + 1) + 1] = 65535, ng = 0; ng <= lg; ng++) sg = cg, cg = gg[2 * (ng + 1) + 1], ++rg < dg && sg === cg || (rg < Bg ? _.bl_tree[2 * sg] += rg : sg !== 0 ? (sg !== og && _.bl_tree[2 * sg]++, _.bl_tree[2 * p]++) : rg <= 10 ? _.bl_tree[2 * Y]++ : _.bl_tree[2 * R]++, og = sg, Bg = (rg = 0) === cg ? (dg = 138, 3) : sg === cg ? (dg = 6, 3) : (dg = 7, 4));
  2198. }
  2199. function Ag(_, gg, lg) {
  2200. var ng, sg, og = -1, cg = gg[1], rg = 0, dg = 7, Bg = 4;
  2201. for (cg === 0 && (dg = 138, Bg = 3), ng = 0; ng <= lg; ng++) if (sg = cg, cg = gg[2 * (ng + 1) + 1], !(++rg < dg && sg === cg)) {
  2202. if (rg < Bg) for (; P(_, sg, _.bl_tree), --rg != 0; ) ;
  2203. else sg !== 0 ? (sg !== og && (P(_, sg, _.bl_tree), rg--), P(_, p, _.bl_tree), Q(_, rg - 3, 2)) : rg <= 10 ? (P(_, Y, _.bl_tree), Q(_, rg - 3, 3)) : (P(_, R, _.bl_tree), Q(_, rg - 11, 7));
  2204. og = sg, Bg = (rg = 0) === cg ? (dg = 138, 3) : sg === cg ? (dg = 6, 3) : (dg = 7, 4);
  2205. }
  2206. }
  2207. l(y);
  2208. var eg = !1;
  2209. function O(_, gg, lg, ng) {
  2210. Q(_, (n << 1) + (ng ? 1 : 0), 3), function(sg, og, cg, rg) {
  2211. k(sg), T(sg, cg), T(sg, ~cg), e.arraySet(sg.pending_buf, sg.window, og, cg, sg.pending), sg.pending += cg;
  2212. }(_, gg, lg);
  2213. }
  2214. i._tr_init = function(_) {
  2215. eg || (function() {
  2216. var gg, lg, ng, sg, og, cg = new Array(b + 1);
  2217. for (sg = ng = 0; sg < a - 1; sg++) for (B[sg] = ng, gg = 0; gg < 1 << X[sg]; gg++) N[ng++] = sg;
  2218. for (N[ng - 1] = sg, sg = og = 0; sg < 16; sg++) for (y[sg] = og, gg = 0; gg < 1 << H[sg]; gg++) V[og++] = sg;
  2219. for (og >>= 7; sg < c; sg++) for (y[sg] = og << 7, gg = 0; gg < 1 << H[sg] - 7; gg++) V[256 + og++] = sg;
  2220. for (lg = 0; lg <= b; lg++) cg[lg] = 0;
  2221. for (gg = 0; gg <= 143; ) v[2 * gg + 1] = 8, gg++, cg[8]++;
  2222. for (; gg <= 255; ) v[2 * gg + 1] = 9, gg++, cg[9]++;
  2223. for (; gg <= 279; ) v[2 * gg + 1] = 7, gg++, cg[7]++;
  2224. for (; gg <= 287; ) v[2 * gg + 1] = 8, gg++, cg[8]++;
  2225. for (E(v, o + 1, cg), gg = 0; gg < c; gg++) K[2 * gg + 1] = 5, K[2 * gg] = L(gg, 5);
  2226. G = new f(v, X, d + 1, o, b), w = new f(K, H, 0, c, b), W = new f(new Array(0), S, 0, r, m);
  2227. }(), eg = !0), _.l_desc = new D(_.dyn_ltree, G), _.d_desc = new D(_.dyn_dtree, w), _.bl_desc = new D(_.bl_tree, W), _.bi_buf = 0, _.bi_valid = 0, J(_);
  2228. }, i._tr_stored_block = O, i._tr_flush_block = function(_, gg, lg, ng) {
  2229. var sg, og, cg = 0;
  2230. 0 < _.level ? (_.strm.data_type === 2 && (_.strm.data_type = function(rg) {
  2231. var dg, Bg = 4093624447;
  2232. for (dg = 0; dg <= 31; dg++, Bg >>>= 1) if (1 & Bg && rg.dyn_ltree[2 * dg] !== 0) return A;
  2233. if (rg.dyn_ltree[18] !== 0 || rg.dyn_ltree[20] !== 0 || rg.dyn_ltree[26] !== 0) return s;
  2234. for (dg = 32; dg < d; dg++) if (rg.dyn_ltree[2 * dg] !== 0) return s;
  2235. return A;
  2236. }(_)), Ig(_, _.l_desc), Ig(_, _.d_desc), cg = function(rg) {
  2237. var dg;
  2238. for (x(rg, rg.dyn_ltree, rg.l_desc.max_code), x(rg, rg.dyn_dtree, rg.d_desc.max_code), Ig(rg, rg.bl_desc), dg = r - 1; 3 <= dg && rg.bl_tree[2 * z[dg] + 1] === 0; dg--) ;
  2239. return rg.opt_len += 3 * (dg + 1) + 5 + 5 + 4, dg;
  2240. }(_), sg = _.opt_len + 3 + 7 >>> 3, (og = _.static_len + 3 + 7 >>> 3) <= sg && (sg = og)) : sg = og = lg + 5, lg + 4 <= sg && gg !== -1 ? O(_, gg, lg, ng) : _.strategy === 4 || og === sg ? (Q(_, 2 + (ng ? 1 : 0), 3), Cg(_, v, K)) : (Q(_, 4 + (ng ? 1 : 0), 3), function(rg, dg, Bg, Zg) {
  2241. var Xg;
  2242. for (Q(rg, dg - 257, 5), Q(rg, Bg - 1, 5), Q(rg, Zg - 4, 4), Xg = 0; Xg < Zg; Xg++) Q(rg, rg.bl_tree[2 * z[Xg] + 1], 3);
  2243. Ag(rg, rg.dyn_ltree, dg - 1), Ag(rg, rg.dyn_dtree, Bg - 1);
  2244. }(_, _.l_desc.max_code + 1, _.d_desc.max_code + 1, cg + 1), Cg(_, _.dyn_ltree, _.dyn_dtree)), J(_), ng && k(_);
  2245. }, i._tr_tally = function(_, gg, lg) {
  2246. return _.pending_buf[_.d_buf + 2 * _.last_lit] = gg >>> 8 & 255, _.pending_buf[_.d_buf + 2 * _.last_lit + 1] = 255 & gg, _.pending_buf[_.l_buf + _.last_lit] = 255 & lg, _.last_lit++, gg === 0 ? _.dyn_ltree[2 * lg]++ : (_.matches++, gg--, _.dyn_ltree[2 * (N[lg] + d + 1)]++, _.dyn_dtree[2 * F(gg)]++), _.last_lit === _.lit_bufsize - 1;
  2247. }, i._tr_align = function(_) {
  2248. Q(_, 2, 3), P(_, Z, v), function(gg) {
  2249. gg.bi_valid === 16 ? (T(gg, gg.bi_buf), gg.bi_buf = 0, gg.bi_valid = 0) : 8 <= gg.bi_valid && (gg.pending_buf[gg.pending++] = 255 & gg.bi_buf, gg.bi_buf >>= 8, gg.bi_valid -= 8);
  2250. }(_);
  2251. };
  2252. }, { "../utils/common": 41 }], 53: [function(g, C, i) {
  2253. C.exports = function() {
  2254. this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler = 0;
  2255. };
  2256. }, {}], 54: [function(g, C, i) {
  2257. (function(e) {
  2258. (function(A, s) {
  2259. if (!A.setImmediate) {
  2260. var l, n, a, d, o = 1, c = {}, r = !1, h = A.document, b = Object.getPrototypeOf && Object.getPrototypeOf(A);
  2261. b = b && b.setTimeout ? b : A, l = {}.toString.call(A.process) === "[object process]" ? function(p) {
  2262. process.nextTick(function() {
  2263. m(p);
  2264. });
  2265. } : function() {
  2266. if (A.postMessage && !A.importScripts) {
  2267. var p = !0, Y = A.onmessage;
  2268. return A.onmessage = function() {
  2269. p = !1;
  2270. }, A.postMessage("", "*"), A.onmessage = Y, p;
  2271. }
  2272. }() ? (d = "setImmediate$" + Math.random() + "$", A.addEventListener ? A.addEventListener("message", Z, !1) : A.attachEvent("onmessage", Z), function(p) {
  2273. A.postMessage(d + p, "*");
  2274. }) : A.MessageChannel ? ((a = new MessageChannel()).port1.onmessage = function(p) {
  2275. m(p.data);
  2276. }, function(p) {
  2277. a.port2.postMessage(p);
  2278. }) : h && "onreadystatechange" in h.createElement("script") ? (n = h.documentElement, function(p) {
  2279. var Y = h.createElement("script");
  2280. Y.onreadystatechange = function() {
  2281. m(p), Y.onreadystatechange = null, n.removeChild(Y), Y = null;
  2282. }, n.appendChild(Y);
  2283. }) : function(p) {
  2284. setTimeout(m, 0, p);
  2285. }, b.setImmediate = function(p) {
  2286. typeof p != "function" && (p = new Function("" + p));
  2287. for (var Y = new Array(arguments.length - 1), R = 0; R < Y.length; R++) Y[R] = arguments[R + 1];
  2288. var X = { callback: p, args: Y };
  2289. return c[o] = X, l(o), o++;
  2290. }, b.clearImmediate = u;
  2291. }
  2292. function u(p) {
  2293. delete c[p];
  2294. }
  2295. function m(p) {
  2296. if (r) setTimeout(m, 0, p);
  2297. else {
  2298. var Y = c[p];
  2299. if (Y) {
  2300. r = !0;
  2301. try {
  2302. (function(R) {
  2303. var X = R.callback, H = R.args;
  2304. switch (H.length) {
  2305. case 0:
  2306. X();
  2307. break;
  2308. case 1:
  2309. X(H[0]);
  2310. break;
  2311. case 2:
  2312. X(H[0], H[1]);
  2313. break;
  2314. case 3:
  2315. X(H[0], H[1], H[2]);
  2316. break;
  2317. default:
  2318. X.apply(s, H);
  2319. }
  2320. })(Y);
  2321. } finally {
  2322. u(p), r = !1;
  2323. }
  2324. }
  2325. }
  2326. }
  2327. function Z(p) {
  2328. p.source === A && typeof p.data == "string" && p.data.indexOf(d) === 0 && m(+p.data.slice(d.length));
  2329. }
  2330. })(typeof self > "u" ? e === void 0 ? this : e : self);
  2331. }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  2332. }, {}] }, {}, [10])(10);
  2333. });
  2334. }(FH)), FH.exports;
  2335. }
  2336. var rag = dag();
  2337. const hag = /* @__PURE__ */ u$(rag);
  2338. var At;
  2339. (function(t) {
  2340. t.OfficeDocument = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", t.FontTable = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable", t.Image = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", t.Numbering = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering", t.Styles = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles", t.StylesWithEffects = "http://schemas.microsoft.com/office/2007/relationships/stylesWithEffects", t.Theme = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme", t.Settings = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings", t.WebSettings = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings", t.Hyperlink = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", t.Footnotes = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes", t.Endnotes = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes", t.Footer = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", t.Header = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", t.ExtendedProperties = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties", t.CoreProperties = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties", t.CustomProperties = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/custom-properties", t.Comments = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments", t.CommentsExtended = "http://schemas.microsoft.com/office/2011/relationships/commentsExtended", t.AltChunk = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk";
  2341. })(At || (At = {}));
  2342. function bag(t, I) {
  2343. return I.elements(t).map((g) => ({
  2344. id: I.attr(g, "Id"),
  2345. type: I.attr(g, "Type"),
  2346. target: I.attr(g, "Target"),
  2347. targetMode: I.attr(g, "TargetMode")
  2348. }));
  2349. }
  2350. function uag(t) {
  2351. return t == null ? void 0 : t.replace(/[ .]+/g, "-").replace(/[&]+/g, "and").toLowerCase();
  2352. }
  2353. function xX(t) {
  2354. return /^[^"'].*\s.*[^"']$/.test(t) ? `'${t}'` : t;
  2355. }
  2356. function lN(t) {
  2357. let I = t.lastIndexOf("/") + 1, g = I == 0 ? "" : t.substring(0, I), C = I == 0 ? t : t.substring(I);
  2358. return [g, C];
  2359. }
  2360. function kH(t, I) {
  2361. try {
  2362. const g = "http://docx/";
  2363. return new URL(t, g + I).toString().substring(g.length);
  2364. } catch {
  2365. return `${I}${t}`;
  2366. }
  2367. }
  2368. function ea(t, I) {
  2369. return t.reduce((g, C) => (g[I(C)] = C, g), {});
  2370. }
  2371. function mag(t) {
  2372. return new Promise((I, g) => {
  2373. const C = new FileReader();
  2374. C.onloadend = () => I(C.result), C.onerror = () => g(), C.readAsDataURL(t);
  2375. });
  2376. }
  2377. function zH(t) {
  2378. return t && typeof t == "object" && !Array.isArray(t);
  2379. }
  2380. function Zag(t) {
  2381. return typeof t == "string" || t instanceof String;
  2382. }
  2383. function gV(t, ...I) {
  2384. if (!I.length)
  2385. return t;
  2386. const g = I.shift();
  2387. if (zH(t) && zH(g))
  2388. for (const C in g)
  2389. if (zH(g[C])) {
  2390. const i = t[C] ?? (t[C] = {});
  2391. gV(i, g[C]);
  2392. } else
  2393. t[C] = g[C];
  2394. return gV(t, ...I);
  2395. }
  2396. function Ru(t) {
  2397. return Array.isArray(t) ? t : [t];
  2398. }
  2399. function Gag(t, I, g) {
  2400. return I > t ? I : g < t ? g : t;
  2401. }
  2402. const m$ = {
  2403. wordml: "http://schemas.openxmlformats.org/wordprocessingml/2006/main"
  2404. }, st = {
  2405. Dxa: { mul: 0.05, unit: "pt" },
  2406. Emu: { mul: 1 / 12700, unit: "pt" },
  2407. FontSize: { mul: 0.5, unit: "pt" },
  2408. Border: { mul: 0.125, unit: "pt", min: 0.25, max: 12 },
  2409. Point: { mul: 1, unit: "pt" },
  2410. Percent: { mul: 0.02, unit: "%" }
  2411. };
  2412. function Z$(t, I = st.Dxa) {
  2413. if (t == null || /.+(p[xt]|[%])$/.test(t))
  2414. return t;
  2415. var g = parseInt(t) * I.mul;
  2416. return I.min && I.max && (g = Gag(g, I.min, I.max)), `${g.toFixed(2)}${I.unit}`;
  2417. }
  2418. function wag(t, I = !1) {
  2419. switch (t) {
  2420. case "1":
  2421. return !0;
  2422. case "0":
  2423. return !1;
  2424. case "on":
  2425. return !0;
  2426. case "off":
  2427. return !1;
  2428. case "true":
  2429. return !0;
  2430. case "false":
  2431. return !1;
  2432. default:
  2433. return I;
  2434. }
  2435. }
  2436. function G$(t, I, g) {
  2437. if (t.namespaceURI != m$.wordml)
  2438. return !1;
  2439. switch (t.localName) {
  2440. case "color":
  2441. I.color = g.attr(t, "val");
  2442. break;
  2443. case "sz":
  2444. I.fontSize = g.lengthAttr(t, "val", st.FontSize);
  2445. break;
  2446. default:
  2447. return !1;
  2448. }
  2449. return !0;
  2450. }
  2451. function pag(t, I = !1) {
  2452. I && (t = t.replace(/<[?].*[?]>/, "")), t = Wag(t);
  2453. const g = new DOMParser().parseFromString(t, "application/xml"), C = Bag(g);
  2454. if (C)
  2455. throw new Error(C);
  2456. return g;
  2457. }
  2458. function Bag(t) {
  2459. var I;
  2460. return (I = t.getElementsByTagName("parsererror")[0]) == null ? void 0 : I.textContent;
  2461. }
  2462. function Wag(t) {
  2463. return t.charCodeAt(0) === 65279 ? t.substring(1) : t;
  2464. }
  2465. function yag(t) {
  2466. return new XMLSerializer().serializeToString(t);
  2467. }
  2468. class w$ {
  2469. elements(I, g = null) {
  2470. const C = [];
  2471. for (let i = 0, e = I.childNodes.length; i < e; i++) {
  2472. let A = I.childNodes.item(i);
  2473. A.nodeType == 1 && (g == null || A.localName == g) && C.push(A);
  2474. }
  2475. return C;
  2476. }
  2477. element(I, g) {
  2478. for (let C = 0, i = I.childNodes.length; C < i; C++) {
  2479. let e = I.childNodes.item(C);
  2480. if (e.nodeType == 1 && e.localName == g)
  2481. return e;
  2482. }
  2483. return null;
  2484. }
  2485. elementAttr(I, g, C) {
  2486. var i = this.element(I, g);
  2487. return i ? this.attr(i, C) : void 0;
  2488. }
  2489. attrs(I) {
  2490. return Array.from(I.attributes);
  2491. }
  2492. attr(I, g) {
  2493. for (let C = 0, i = I.attributes.length; C < i; C++) {
  2494. let e = I.attributes.item(C);
  2495. if (e.localName == g)
  2496. return e.value;
  2497. }
  2498. return null;
  2499. }
  2500. intAttr(I, g, C = null) {
  2501. var i = this.attr(I, g);
  2502. return i ? parseInt(i) : C;
  2503. }
  2504. hexAttr(I, g, C = null) {
  2505. var i = this.attr(I, g);
  2506. return i ? parseInt(i, 16) : C;
  2507. }
  2508. floatAttr(I, g, C = null) {
  2509. var i = this.attr(I, g);
  2510. return i ? parseFloat(i) : C;
  2511. }
  2512. boolAttr(I, g, C = null) {
  2513. return wag(this.attr(I, g), C);
  2514. }
  2515. lengthAttr(I, g, C = st.Dxa) {
  2516. return Z$(this.attr(I, g), C);
  2517. }
  2518. }
  2519. const ug = new w$();
  2520. class Re {
  2521. constructor(I, g) {
  2522. this._package = I, this.path = g;
  2523. }
  2524. async load() {
  2525. this.rels = await this._package.loadRelationships(this.path);
  2526. const I = await this._package.load(this.path), g = this._package.parseXmlDocument(I);
  2527. this._package.options.keepOrigin && (this._xmlDocument = g), this.parseXml(g.firstElementChild);
  2528. }
  2529. save() {
  2530. this._package.update(this.path, yag(this._xmlDocument));
  2531. }
  2532. parseXml(I) {
  2533. }
  2534. }
  2535. const Yag = {
  2536. embedRegular: "regular",
  2537. embedBold: "bold",
  2538. embedItalic: "italic",
  2539. embedBoldItalic: "boldItalic"
  2540. };
  2541. function Nag(t, I) {
  2542. return I.elements(t).map((g) => Vag(g, I));
  2543. }
  2544. function Vag(t, I) {
  2545. let g = {
  2546. name: I.attr(t, "name"),
  2547. embedFontRefs: []
  2548. };
  2549. for (let C of I.elements(t))
  2550. switch (C.localName) {
  2551. case "family":
  2552. g.family = I.attr(C, "val");
  2553. break;
  2554. case "altName":
  2555. g.altName = I.attr(C, "val");
  2556. break;
  2557. case "embedRegular":
  2558. case "embedBold":
  2559. case "embedItalic":
  2560. case "embedBoldItalic":
  2561. g.embedFontRefs.push(Mag(C, I));
  2562. break;
  2563. }
  2564. return g;
  2565. }
  2566. function Mag(t, I) {
  2567. return {
  2568. id: I.attr(t, "id"),
  2569. key: I.attr(t, "fontKey"),
  2570. type: Yag[t.localName]
  2571. };
  2572. }
  2573. class Rag extends Re {
  2574. parseXml(I) {
  2575. this.fonts = Nag(I, this._package.xmlParser);
  2576. }
  2577. }
  2578. class l9 {
  2579. constructor(I, g) {
  2580. this._zip = I, this.options = g, this.xmlParser = new w$();
  2581. }
  2582. get(I) {
  2583. const g = fag(I);
  2584. return this._zip.files[g] ?? this._zip.files[g.replace(/\//g, "\\")];
  2585. }
  2586. update(I, g) {
  2587. this._zip.file(I, g);
  2588. }
  2589. static async load(I, g) {
  2590. const C = await hag.loadAsync(I);
  2591. return new l9(C, g);
  2592. }
  2593. save(I = "blob") {
  2594. return this._zip.generateAsync({ type: I });
  2595. }
  2596. load(I, g = "string") {
  2597. var C;
  2598. return ((C = this.get(I)) == null ? void 0 : C.async(g)) ?? Promise.resolve(null);
  2599. }
  2600. async loadRelationships(I = null) {
  2601. let g = "_rels/.rels";
  2602. if (I != null) {
  2603. const [i, e] = lN(I);
  2604. g = `${i}_rels/${e}.rels`;
  2605. }
  2606. const C = await this.load(g);
  2607. return C ? bag(this.parseXmlDocument(C).firstElementChild, this.xmlParser) : null;
  2608. }
  2609. parseXmlDocument(I) {
  2610. return pag(I, this.options.trimXmlDeclaration);
  2611. }
  2612. }
  2613. function fag(t) {
  2614. return t.startsWith("/") ? t.substr(1) : t;
  2615. }
  2616. class Hag extends Re {
  2617. constructor(I, g, C) {
  2618. super(I, g), this._documentParser = C;
  2619. }
  2620. parseXml(I) {
  2621. this.body = this._documentParser.parseDocumentFile(I);
  2622. }
  2623. }
  2624. function KY(t, I) {
  2625. return {
  2626. type: I.attr(t, "val"),
  2627. color: I.attr(t, "color"),
  2628. size: I.lengthAttr(t, "sz", st.Border),
  2629. offset: I.lengthAttr(t, "space", st.Point),
  2630. frame: I.boolAttr(t, "frame"),
  2631. shadow: I.boolAttr(t, "shadow")
  2632. };
  2633. }
  2634. function Xag(t, I) {
  2635. var g = {};
  2636. for (let C of I.elements(t))
  2637. switch (C.localName) {
  2638. case "left":
  2639. g.left = KY(C, I);
  2640. break;
  2641. case "top":
  2642. g.top = KY(C, I);
  2643. break;
  2644. case "right":
  2645. g.right = KY(C, I);
  2646. break;
  2647. case "bottom":
  2648. g.bottom = KY(C, I);
  2649. break;
  2650. }
  2651. return g;
  2652. }
  2653. var v6;
  2654. (function(t) {
  2655. t.Continuous = "continuous", t.NextPage = "nextPage", t.NextColumn = "nextColumn", t.EvenPage = "evenPage", t.OddPage = "oddPage";
  2656. })(v6 || (v6 = {}));
  2657. function p$(t, I = ug) {
  2658. var g = {};
  2659. for (let C of I.elements(t))
  2660. switch (C.localName) {
  2661. case "pgSz":
  2662. g.pageSize = {
  2663. width: I.lengthAttr(C, "w"),
  2664. height: I.lengthAttr(C, "h"),
  2665. orientation: I.attr(C, "orient")
  2666. };
  2667. break;
  2668. case "type":
  2669. g.type = I.attr(C, "val");
  2670. break;
  2671. case "pgMar":
  2672. g.pageMargins = {
  2673. left: I.lengthAttr(C, "left"),
  2674. right: I.lengthAttr(C, "right"),
  2675. top: I.lengthAttr(C, "top"),
  2676. bottom: I.lengthAttr(C, "bottom"),
  2677. header: I.lengthAttr(C, "header"),
  2678. footer: I.lengthAttr(C, "footer"),
  2679. gutter: I.lengthAttr(C, "gutter")
  2680. };
  2681. break;
  2682. case "cols":
  2683. g.columns = Sag(C, I);
  2684. break;
  2685. case "headerReference":
  2686. (g.headerRefs ?? (g.headerRefs = [])).push(T6(C, I));
  2687. break;
  2688. case "footerReference":
  2689. (g.footerRefs ?? (g.footerRefs = [])).push(T6(C, I));
  2690. break;
  2691. case "titlePg":
  2692. g.titlePage = I.boolAttr(C, "val", !0);
  2693. break;
  2694. case "pgBorders":
  2695. g.pageBorders = Xag(C, I);
  2696. break;
  2697. case "pgNumType":
  2698. g.pageNumber = Dag(C, I);
  2699. break;
  2700. }
  2701. return g;
  2702. }
  2703. function Sag(t, I) {
  2704. return {
  2705. numberOfColumns: I.intAttr(t, "num"),
  2706. space: I.lengthAttr(t, "space"),
  2707. separator: I.boolAttr(t, "sep"),
  2708. equalWidth: I.boolAttr(t, "equalWidth", !0),
  2709. columns: I.elements(t, "col").map((g) => ({
  2710. width: I.lengthAttr(g, "w"),
  2711. space: I.lengthAttr(g, "space")
  2712. }))
  2713. };
  2714. }
  2715. function Dag(t, I) {
  2716. return {
  2717. chapSep: I.attr(t, "chapSep"),
  2718. chapStyle: I.attr(t, "chapStyle"),
  2719. format: I.attr(t, "fmt"),
  2720. start: I.intAttr(t, "start")
  2721. };
  2722. }
  2723. function T6(t, I) {
  2724. return {
  2725. id: I.attr(t, "id"),
  2726. type: I.attr(t, "type")
  2727. };
  2728. }
  2729. function Kag(t, I) {
  2730. return {
  2731. before: I.lengthAttr(t, "before"),
  2732. after: I.lengthAttr(t, "after"),
  2733. line: I.intAttr(t, "line"),
  2734. lineRule: I.attr(t, "lineRule")
  2735. };
  2736. }
  2737. function n9(t, I) {
  2738. let g = {};
  2739. for (let C of I.elements(t))
  2740. Fag(C, g, I);
  2741. return g;
  2742. }
  2743. function Fag(t, I, g) {
  2744. return !!G$(t, I, g);
  2745. }
  2746. function B$(t, I) {
  2747. let g = {};
  2748. for (let C of I.elements(t))
  2749. W$(C, g, I);
  2750. return g;
  2751. }
  2752. function W$(t, I, g) {
  2753. if (t.namespaceURI != m$.wordml)
  2754. return !1;
  2755. if (G$(t, I, g))
  2756. return !0;
  2757. switch (t.localName) {
  2758. case "tabs":
  2759. I.tabs = kag(t, g);
  2760. break;
  2761. case "sectPr":
  2762. I.sectionProps = p$(t, g);
  2763. break;
  2764. case "numPr":
  2765. I.numbering = zag(t, g);
  2766. break;
  2767. case "spacing":
  2768. return I.lineSpacing = Kag(t, g), !1;
  2769. case "textAlignment":
  2770. return I.textAlignment = g.attr(t, "val"), !1;
  2771. case "keepLines":
  2772. I.keepLines = g.boolAttr(t, "val", !0);
  2773. break;
  2774. case "keepNext":
  2775. I.keepNext = g.boolAttr(t, "val", !0);
  2776. break;
  2777. case "pageBreakBefore":
  2778. I.pageBreakBefore = g.boolAttr(t, "val", !0);
  2779. break;
  2780. case "outlineLvl":
  2781. I.outlineLevel = g.intAttr(t, "val");
  2782. break;
  2783. case "pStyle":
  2784. I.styleName = g.attr(t, "val");
  2785. break;
  2786. case "rPr":
  2787. I.runProps = n9(t, g);
  2788. break;
  2789. default:
  2790. return !1;
  2791. }
  2792. return !0;
  2793. }
  2794. function kag(t, I) {
  2795. return I.elements(t, "tab").map((g) => ({
  2796. position: I.lengthAttr(g, "pos"),
  2797. leader: I.attr(g, "leader"),
  2798. style: I.attr(g, "val")
  2799. }));
  2800. }
  2801. function zag(t, I) {
  2802. var g = {};
  2803. for (let C of I.elements(t))
  2804. switch (C.localName) {
  2805. case "numId":
  2806. g.id = I.attr(C, "val");
  2807. break;
  2808. case "ilvl":
  2809. g.level = I.intAttr(C, "val");
  2810. break;
  2811. }
  2812. return g;
  2813. }
  2814. function Jag(t, I) {
  2815. let g = {
  2816. numberings: [],
  2817. abstractNumberings: [],
  2818. bulletPictures: []
  2819. };
  2820. for (let C of I.elements(t))
  2821. switch (C.localName) {
  2822. case "num":
  2823. g.numberings.push(Lag(C, I));
  2824. break;
  2825. case "abstractNum":
  2826. g.abstractNumberings.push(vag(C, I));
  2827. break;
  2828. case "numPicBullet":
  2829. g.bulletPictures.push(xag(C, I));
  2830. break;
  2831. }
  2832. return g;
  2833. }
  2834. function Lag(t, I) {
  2835. let g = {
  2836. id: I.attr(t, "numId"),
  2837. overrides: []
  2838. };
  2839. for (let C of I.elements(t))
  2840. switch (C.localName) {
  2841. case "abstractNumId":
  2842. g.abstractId = I.attr(C, "val");
  2843. break;
  2844. case "lvlOverride":
  2845. g.overrides.push(Tag(C, I));
  2846. break;
  2847. }
  2848. return g;
  2849. }
  2850. function vag(t, I) {
  2851. let g = {
  2852. id: I.attr(t, "abstractNumId"),
  2853. levels: []
  2854. };
  2855. for (let C of I.elements(t))
  2856. switch (C.localName) {
  2857. case "name":
  2858. g.name = I.attr(C, "val");
  2859. break;
  2860. case "multiLevelType":
  2861. g.multiLevelType = I.attr(C, "val");
  2862. break;
  2863. case "numStyleLink":
  2864. g.numberingStyleLink = I.attr(C, "val");
  2865. break;
  2866. case "styleLink":
  2867. g.styleLink = I.attr(C, "val");
  2868. break;
  2869. case "lvl":
  2870. g.levels.push(y$(C, I));
  2871. break;
  2872. }
  2873. return g;
  2874. }
  2875. function y$(t, I) {
  2876. let g = {
  2877. level: I.intAttr(t, "ilvl")
  2878. };
  2879. for (let C of I.elements(t))
  2880. switch (C.localName) {
  2881. case "start":
  2882. g.start = I.attr(C, "val");
  2883. break;
  2884. case "lvlRestart":
  2885. g.restart = I.intAttr(C, "val");
  2886. break;
  2887. case "numFmt":
  2888. g.format = I.attr(C, "val");
  2889. break;
  2890. case "lvlText":
  2891. g.text = I.attr(C, "val");
  2892. break;
  2893. case "lvlJc":
  2894. g.justification = I.attr(C, "val");
  2895. break;
  2896. case "lvlPicBulletId":
  2897. g.bulletPictureId = I.attr(C, "val");
  2898. break;
  2899. case "pStyle":
  2900. g.paragraphStyle = I.attr(C, "val");
  2901. break;
  2902. case "pPr":
  2903. g.paragraphProps = B$(C, I);
  2904. break;
  2905. case "rPr":
  2906. g.runProps = n9(C, I);
  2907. break;
  2908. }
  2909. return g;
  2910. }
  2911. function Tag(t, I) {
  2912. let g = {
  2913. level: I.intAttr(t, "ilvl")
  2914. };
  2915. for (let C of I.elements(t))
  2916. switch (C.localName) {
  2917. case "startOverride":
  2918. g.start = I.intAttr(C, "val");
  2919. break;
  2920. case "lvl":
  2921. g.numberingLevel = y$(C, I);
  2922. break;
  2923. }
  2924. return g;
  2925. }
  2926. function xag(t, I) {
  2927. var g = I.element(t, "pict"), C = g && I.element(g, "shape"), i = C && I.element(C, "imagedata");
  2928. return i ? {
  2929. id: I.attr(t, "numPicBulletId"),
  2930. referenceId: I.attr(i, "id"),
  2931. style: I.attr(C, "style")
  2932. } : null;
  2933. }
  2934. class jag extends Re {
  2935. constructor(I, g, C) {
  2936. super(I, g), this._documentParser = C;
  2937. }
  2938. parseXml(I) {
  2939. Object.assign(this, Jag(I, this._package.xmlParser)), this.domNumberings = this._documentParser.parseNumberingFile(I);
  2940. }
  2941. }
  2942. class Qag extends Re {
  2943. constructor(I, g, C) {
  2944. super(I, g), this._documentParser = C;
  2945. }
  2946. parseXml(I) {
  2947. this.styles = this._documentParser.parseStylesFile(I);
  2948. }
  2949. }
  2950. var Yg;
  2951. (function(t) {
  2952. t.Document = "document", t.Paragraph = "paragraph", t.Run = "run", t.Break = "break", t.NoBreakHyphen = "noBreakHyphen", t.Table = "table", t.Row = "row", t.Cell = "cell", t.Hyperlink = "hyperlink", t.SmartTag = "smartTag", t.Drawing = "drawing", t.Image = "image", t.Text = "text", t.Tab = "tab", t.Symbol = "symbol", t.BookmarkStart = "bookmarkStart", t.BookmarkEnd = "bookmarkEnd", t.Footer = "footer", t.Header = "header", t.FootnoteReference = "footnoteReference", t.EndnoteReference = "endnoteReference", t.Footnote = "footnote", t.Endnote = "endnote", t.SimpleField = "simpleField", t.ComplexField = "complexField", t.Instruction = "instruction", t.VmlPicture = "vmlPicture", t.MmlMath = "mmlMath", t.MmlMathParagraph = "mmlMathParagraph", t.MmlFraction = "mmlFraction", t.MmlFunction = "mmlFunction", t.MmlFunctionName = "mmlFunctionName", t.MmlNumerator = "mmlNumerator", t.MmlDenominator = "mmlDenominator", t.MmlRadical = "mmlRadical", t.MmlBase = "mmlBase", t.MmlDegree = "mmlDegree", t.MmlSuperscript = "mmlSuperscript", t.MmlSubscript = "mmlSubscript", t.MmlPreSubSuper = "mmlPreSubSuper", t.MmlSubArgument = "mmlSubArgument", t.MmlSuperArgument = "mmlSuperArgument", t.MmlNary = "mmlNary", t.MmlDelimiter = "mmlDelimiter", t.MmlRun = "mmlRun", t.MmlEquationArray = "mmlEquationArray", t.MmlLimit = "mmlLimit", t.MmlLimitLower = "mmlLimitLower", t.MmlMatrix = "mmlMatrix", t.MmlMatrixRow = "mmlMatrixRow", t.MmlBox = "mmlBox", t.MmlBar = "mmlBar", t.MmlGroupChar = "mmlGroupChar", t.VmlElement = "vmlElement", t.Inserted = "inserted", t.Deleted = "deleted", t.DeletedText = "deletedText", t.Comment = "comment", t.CommentReference = "commentReference", t.CommentRangeStart = "commentRangeStart", t.CommentRangeEnd = "commentRangeEnd", t.AltChunk = "altChunk";
  2953. })(Yg || (Yg = {}));
  2954. class bd {
  2955. constructor() {
  2956. this.children = [], this.cssStyle = {};
  2957. }
  2958. }
  2959. class Oag extends bd {
  2960. constructor() {
  2961. super(...arguments), this.type = Yg.Header;
  2962. }
  2963. }
  2964. class Uag extends bd {
  2965. constructor() {
  2966. super(...arguments), this.type = Yg.Footer;
  2967. }
  2968. }
  2969. class Y$ extends Re {
  2970. constructor(I, g, C) {
  2971. super(I, g), this._documentParser = C;
  2972. }
  2973. parseXml(I) {
  2974. this.rootElement = this.createRootElement(), this.rootElement.children = this._documentParser.parseBodyElements(I);
  2975. }
  2976. }
  2977. class Eag extends Y$ {
  2978. createRootElement() {
  2979. return new Oag();
  2980. }
  2981. }
  2982. class Pag extends Y$ {
  2983. createRootElement() {
  2984. return new Uag();
  2985. }
  2986. }
  2987. function _ag(t, I) {
  2988. const g = {};
  2989. for (let C of I.elements(t))
  2990. switch (C.localName) {
  2991. case "Template":
  2992. g.template = C.textContent;
  2993. break;
  2994. case "Pages":
  2995. g.pages = fu(C.textContent);
  2996. break;
  2997. case "Words":
  2998. g.words = fu(C.textContent);
  2999. break;
  3000. case "Characters":
  3001. g.characters = fu(C.textContent);
  3002. break;
  3003. case "Application":
  3004. g.application = C.textContent;
  3005. break;
  3006. case "Lines":
  3007. g.lines = fu(C.textContent);
  3008. break;
  3009. case "Paragraphs":
  3010. g.paragraphs = fu(C.textContent);
  3011. break;
  3012. case "Company":
  3013. g.company = C.textContent;
  3014. break;
  3015. case "AppVersion":
  3016. g.appVersion = C.textContent;
  3017. break;
  3018. }
  3019. return g;
  3020. }
  3021. function fu(t) {
  3022. if (!(typeof t > "u"))
  3023. return parseInt(t);
  3024. }
  3025. class qag extends Re {
  3026. parseXml(I) {
  3027. this.props = _ag(I, this._package.xmlParser);
  3028. }
  3029. }
  3030. function $ag(t, I) {
  3031. const g = {};
  3032. for (let C of I.elements(t))
  3033. switch (C.localName) {
  3034. case "title":
  3035. g.title = C.textContent;
  3036. break;
  3037. case "description":
  3038. g.description = C.textContent;
  3039. break;
  3040. case "subject":
  3041. g.subject = C.textContent;
  3042. break;
  3043. case "creator":
  3044. g.creator = C.textContent;
  3045. break;
  3046. case "keywords":
  3047. g.keywords = C.textContent;
  3048. break;
  3049. case "language":
  3050. g.language = C.textContent;
  3051. break;
  3052. case "lastModifiedBy":
  3053. g.lastModifiedBy = C.textContent;
  3054. break;
  3055. case "revision":
  3056. C.textContent && (g.revision = parseInt(C.textContent));
  3057. break;
  3058. }
  3059. return g;
  3060. }
  3061. class gog extends Re {
  3062. parseXml(I) {
  3063. this.props = $ag(I, this._package.xmlParser);
  3064. }
  3065. }
  3066. class Iog {
  3067. }
  3068. function Cog(t, I) {
  3069. var g = new Iog(), C = I.element(t, "themeElements");
  3070. for (let i of I.elements(C))
  3071. switch (i.localName) {
  3072. case "clrScheme":
  3073. g.colorScheme = tog(i, I);
  3074. break;
  3075. case "fontScheme":
  3076. g.fontScheme = iog(i, I);
  3077. break;
  3078. }
  3079. return g;
  3080. }
  3081. function tog(t, I) {
  3082. var g = {
  3083. name: I.attr(t, "name"),
  3084. colors: {}
  3085. };
  3086. for (let e of I.elements(t)) {
  3087. var C = I.element(e, "srgbClr"), i = I.element(e, "sysClr");
  3088. C ? g.colors[e.localName] = I.attr(C, "val") : i && (g.colors[e.localName] = I.attr(i, "lastClr"));
  3089. }
  3090. return g;
  3091. }
  3092. function iog(t, I) {
  3093. var g = {
  3094. name: I.attr(t, "name")
  3095. };
  3096. for (let C of I.elements(t))
  3097. switch (C.localName) {
  3098. case "majorFont":
  3099. g.majorFont = x6(C, I);
  3100. break;
  3101. case "minorFont":
  3102. g.minorFont = x6(C, I);
  3103. break;
  3104. }
  3105. return g;
  3106. }
  3107. function x6(t, I) {
  3108. return {
  3109. latinTypeface: I.elementAttr(t, "latin", "typeface"),
  3110. eaTypeface: I.elementAttr(t, "ea", "typeface"),
  3111. csTypeface: I.elementAttr(t, "cs", "typeface")
  3112. };
  3113. }
  3114. class eog extends Re {
  3115. constructor(I, g) {
  3116. super(I, g);
  3117. }
  3118. parseXml(I) {
  3119. this.theme = Cog(I, this._package.xmlParser);
  3120. }
  3121. }
  3122. class N$ {
  3123. }
  3124. class Aog extends N$ {
  3125. constructor() {
  3126. super(...arguments), this.type = Yg.Footnote;
  3127. }
  3128. }
  3129. class sog extends N$ {
  3130. constructor() {
  3131. super(...arguments), this.type = Yg.Endnote;
  3132. }
  3133. }
  3134. class V$ extends Re {
  3135. constructor(I, g, C) {
  3136. super(I, g), this._documentParser = C;
  3137. }
  3138. }
  3139. class log extends V$ {
  3140. constructor(I, g, C) {
  3141. super(I, g, C);
  3142. }
  3143. parseXml(I) {
  3144. this.notes = this._documentParser.parseNotes(I, "footnote", Aog);
  3145. }
  3146. }
  3147. class nog extends V$ {
  3148. constructor(I, g, C) {
  3149. super(I, g, C);
  3150. }
  3151. parseXml(I) {
  3152. this.notes = this._documentParser.parseNotes(I, "endnote", sog);
  3153. }
  3154. }
  3155. function aog(t, I) {
  3156. var g = {};
  3157. for (let C of I.elements(t))
  3158. switch (C.localName) {
  3159. case "defaultTabStop":
  3160. g.defaultTabStop = I.lengthAttr(C, "val");
  3161. break;
  3162. case "footnotePr":
  3163. g.footnoteProps = j6(C, I);
  3164. break;
  3165. case "endnotePr":
  3166. g.endnoteProps = j6(C, I);
  3167. break;
  3168. case "autoHyphenation":
  3169. g.autoHyphenation = I.boolAttr(C, "val");
  3170. break;
  3171. }
  3172. return g;
  3173. }
  3174. function j6(t, I) {
  3175. var g = {
  3176. defaultNoteIds: []
  3177. };
  3178. for (let C of I.elements(t))
  3179. switch (C.localName) {
  3180. case "numFmt":
  3181. g.nummeringFormat = I.attr(C, "val");
  3182. break;
  3183. case "footnote":
  3184. case "endnote":
  3185. g.defaultNoteIds.push(I.attr(C, "id"));
  3186. break;
  3187. }
  3188. return g;
  3189. }
  3190. class oog extends Re {
  3191. constructor(I, g) {
  3192. super(I, g);
  3193. }
  3194. parseXml(I) {
  3195. this.settings = aog(I, this._package.xmlParser);
  3196. }
  3197. }
  3198. function cog(t, I) {
  3199. return I.elements(t, "property").map((g) => {
  3200. const C = g.firstChild;
  3201. return {
  3202. formatId: I.attr(g, "fmtid"),
  3203. name: I.attr(g, "name"),
  3204. type: C.nodeName,
  3205. value: C.textContent
  3206. };
  3207. });
  3208. }
  3209. class dog extends Re {
  3210. parseXml(I) {
  3211. this.props = cog(I, this._package.xmlParser);
  3212. }
  3213. }
  3214. class rog extends Re {
  3215. constructor(I, g, C) {
  3216. super(I, g), this._documentParser = C;
  3217. }
  3218. parseXml(I) {
  3219. this.comments = this._documentParser.parseComments(I), this.commentMap = ea(this.comments, (g) => g.id);
  3220. }
  3221. }
  3222. class hog extends Re {
  3223. constructor(I, g) {
  3224. super(I, g), this.comments = [];
  3225. }
  3226. parseXml(I) {
  3227. const g = this._package.xmlParser;
  3228. for (let C of g.elements(I, "commentEx"))
  3229. this.comments.push({
  3230. paraId: g.attr(C, "paraId"),
  3231. paraIdParent: g.attr(C, "paraIdParent"),
  3232. done: g.boolAttr(C, "done")
  3233. });
  3234. this.commentMap = ea(this.comments, (C) => C.paraId);
  3235. }
  3236. }
  3237. const bog = [
  3238. { type: At.OfficeDocument, target: "word/document.xml" },
  3239. { type: At.ExtendedProperties, target: "docProps/app.xml" },
  3240. { type: At.CoreProperties, target: "docProps/core.xml" },
  3241. { type: At.CustomProperties, target: "docProps/custom.xml" }
  3242. ];
  3243. class a9 {
  3244. constructor() {
  3245. this.parts = [], this.partsMap = {};
  3246. }
  3247. static async load(I, g, C) {
  3248. var i = new a9();
  3249. return i._options = C, i._parser = g, i._package = await l9.load(I, C), i.rels = await i._package.loadRelationships(), await Promise.all(bog.map((e) => {
  3250. const A = i.rels.find((s) => s.type === e.type) ?? e;
  3251. return i.loadRelationshipPart(A.target, A.type);
  3252. })), i;
  3253. }
  3254. save(I = "blob") {
  3255. return this._package.save(I);
  3256. }
  3257. async loadRelationshipPart(I, g) {
  3258. var i;
  3259. if (this.partsMap[I])
  3260. return this.partsMap[I];
  3261. if (!this._package.get(I))
  3262. return null;
  3263. let C = null;
  3264. switch (g) {
  3265. case At.OfficeDocument:
  3266. this.documentPart = C = new Hag(this._package, I, this._parser);
  3267. break;
  3268. case At.FontTable:
  3269. this.fontTablePart = C = new Rag(this._package, I);
  3270. break;
  3271. case At.Numbering:
  3272. this.numberingPart = C = new jag(this._package, I, this._parser);
  3273. break;
  3274. case At.Styles:
  3275. this.stylesPart = C = new Qag(this._package, I, this._parser);
  3276. break;
  3277. case At.Theme:
  3278. this.themePart = C = new eog(this._package, I);
  3279. break;
  3280. case At.Footnotes:
  3281. this.footnotesPart = C = new log(this._package, I, this._parser);
  3282. break;
  3283. case At.Endnotes:
  3284. this.endnotesPart = C = new nog(this._package, I, this._parser);
  3285. break;
  3286. case At.Footer:
  3287. C = new Pag(this._package, I, this._parser);
  3288. break;
  3289. case At.Header:
  3290. C = new Eag(this._package, I, this._parser);
  3291. break;
  3292. case At.CoreProperties:
  3293. this.corePropsPart = C = new gog(this._package, I);
  3294. break;
  3295. case At.ExtendedProperties:
  3296. this.extendedPropsPart = C = new qag(this._package, I);
  3297. break;
  3298. case At.CustomProperties:
  3299. C = new dog(this._package, I);
  3300. break;
  3301. case At.Settings:
  3302. this.settingsPart = C = new oog(this._package, I);
  3303. break;
  3304. case At.Comments:
  3305. this.commentsPart = C = new rog(this._package, I, this._parser);
  3306. break;
  3307. case At.CommentsExtended:
  3308. this.commentsExtendedPart = C = new hog(this._package, I);
  3309. break;
  3310. }
  3311. if (C == null)
  3312. return Promise.resolve(null);
  3313. if (this.partsMap[I] = C, this.parts.push(C), await C.load(), ((i = C.rels) == null ? void 0 : i.length) > 0) {
  3314. const [e] = lN(C.path);
  3315. await Promise.all(C.rels.map((A) => this.loadRelationshipPart(kH(A.target, e), A.type)));
  3316. }
  3317. return C;
  3318. }
  3319. async loadDocumentImage(I, g) {
  3320. const C = await this.loadResource(g ?? this.documentPart, I, "blob");
  3321. return this.blobToURL(C);
  3322. }
  3323. async loadNumberingImage(I) {
  3324. const g = await this.loadResource(this.numberingPart, I, "blob");
  3325. return this.blobToURL(g);
  3326. }
  3327. async loadFont(I, g) {
  3328. const C = await this.loadResource(this.fontTablePart, I, "uint8array");
  3329. return C && this.blobToURL(new Blob([uog(C, g)]));
  3330. }
  3331. async loadAltChunk(I, g) {
  3332. return await this.loadResource(g ?? this.documentPart, I, "string");
  3333. }
  3334. blobToURL(I) {
  3335. return I ? this._options.useBase64URL ? mag(I) : URL.createObjectURL(I) : null;
  3336. }
  3337. findPartByRelId(I, g = null) {
  3338. var C = (g.rels ?? this.rels).find((e) => e.id == I);
  3339. const i = g ? lN(g.path)[0] : "";
  3340. return C ? this.partsMap[kH(C.target, i)] : null;
  3341. }
  3342. getPathById(I, g) {
  3343. const C = I.rels.find((e) => e.id == g), [i] = lN(I.path);
  3344. return C ? kH(C.target, i) : null;
  3345. }
  3346. loadResource(I, g, C) {
  3347. const i = this.getPathById(I, g);
  3348. return i ? this._package.load(i, C) : Promise.resolve(null);
  3349. }
  3350. }
  3351. function uog(t, I) {
  3352. const C = I.replace(/{|}|-/g, ""), i = new Array(16);
  3353. for (let e = 0; e < 16; e++)
  3354. i[16 - e - 1] = parseInt(C.substr(e * 2, 2), 16);
  3355. for (let e = 0; e < 32; e++)
  3356. t[e] = t[e] ^ i[e % 16];
  3357. return t;
  3358. }
  3359. function mog(t, I) {
  3360. return {
  3361. type: Yg.BookmarkStart,
  3362. id: I.attr(t, "id"),
  3363. name: I.attr(t, "name"),
  3364. colFirst: I.intAttr(t, "colFirst"),
  3365. colLast: I.intAttr(t, "colLast")
  3366. };
  3367. }
  3368. function Zog(t, I) {
  3369. return {
  3370. type: Yg.BookmarkEnd,
  3371. id: I.attr(t, "id")
  3372. };
  3373. }
  3374. class Gog extends bd {
  3375. constructor() {
  3376. super(...arguments), this.type = Yg.VmlElement, this.attrs = {};
  3377. }
  3378. }
  3379. function M$(t, I) {
  3380. var g = new Gog();
  3381. switch (t.localName) {
  3382. case "rect":
  3383. g.tagName = "rect", Object.assign(g.attrs, { width: "100%", height: "100%" });
  3384. break;
  3385. case "oval":
  3386. g.tagName = "ellipse", Object.assign(g.attrs, { cx: "50%", cy: "50%", rx: "50%", ry: "50%" });
  3387. break;
  3388. case "line":
  3389. g.tagName = "line";
  3390. break;
  3391. case "shape":
  3392. g.tagName = "g";
  3393. break;
  3394. case "textbox":
  3395. g.tagName = "foreignObject", Object.assign(g.attrs, { width: "100%", height: "100%" });
  3396. break;
  3397. default:
  3398. return null;
  3399. }
  3400. for (const C of ug.attrs(t))
  3401. switch (C.localName) {
  3402. case "style":
  3403. g.cssStyleText = C.value;
  3404. break;
  3405. case "fillcolor":
  3406. g.attrs.fill = C.value;
  3407. break;
  3408. case "from":
  3409. const [i, e] = Q6(C.value);
  3410. Object.assign(g.attrs, { x1: i, y1: e });
  3411. break;
  3412. case "to":
  3413. const [A, s] = Q6(C.value);
  3414. Object.assign(g.attrs, { x2: A, y2: s });
  3415. break;
  3416. }
  3417. for (const C of ug.elements(t))
  3418. switch (C.localName) {
  3419. case "stroke":
  3420. Object.assign(g.attrs, wog(C));
  3421. break;
  3422. case "fill":
  3423. Object.assign(g.attrs, pog());
  3424. break;
  3425. case "imagedata":
  3426. g.tagName = "image", Object.assign(g.attrs, { width: "100%", height: "100%" }), g.imageHref = {
  3427. id: ug.attr(C, "id"),
  3428. title: ug.attr(C, "title")
  3429. };
  3430. break;
  3431. case "txbxContent":
  3432. g.children.push(...I.parseBodyElements(C));
  3433. break;
  3434. default:
  3435. const i = M$(C, I);
  3436. i && g.children.push(i);
  3437. break;
  3438. }
  3439. return g;
  3440. }
  3441. function wog(t) {
  3442. return {
  3443. stroke: ug.attr(t, "color"),
  3444. "stroke-width": ug.lengthAttr(t, "weight", st.Emu) ?? "1px"
  3445. };
  3446. }
  3447. function pog(t) {
  3448. return {};
  3449. }
  3450. function Q6(t) {
  3451. return t.split(",");
  3452. }
  3453. class Bog extends bd {
  3454. constructor() {
  3455. super(...arguments), this.type = Yg.Comment;
  3456. }
  3457. }
  3458. class Wog extends bd {
  3459. constructor(I) {
  3460. super(), this.id = I, this.type = Yg.CommentReference;
  3461. }
  3462. }
  3463. class yog extends bd {
  3464. constructor(I) {
  3465. super(), this.id = I, this.type = Yg.CommentRangeStart;
  3466. }
  3467. }
  3468. class Yog extends bd {
  3469. constructor(I) {
  3470. super(), this.id = I, this.type = Yg.CommentRangeEnd;
  3471. }
  3472. }
  3473. var nN = {
  3474. shd: "inherit",
  3475. color: "black",
  3476. borderColor: "black",
  3477. highlight: "transparent"
  3478. };
  3479. const Nog = [], O6 = {
  3480. oMath: Yg.MmlMath,
  3481. oMathPara: Yg.MmlMathParagraph,
  3482. f: Yg.MmlFraction,
  3483. func: Yg.MmlFunction,
  3484. fName: Yg.MmlFunctionName,
  3485. num: Yg.MmlNumerator,
  3486. den: Yg.MmlDenominator,
  3487. rad: Yg.MmlRadical,
  3488. deg: Yg.MmlDegree,
  3489. e: Yg.MmlBase,
  3490. sSup: Yg.MmlSuperscript,
  3491. sSub: Yg.MmlSubscript,
  3492. sPre: Yg.MmlPreSubSuper,
  3493. sup: Yg.MmlSuperArgument,
  3494. sub: Yg.MmlSubArgument,
  3495. d: Yg.MmlDelimiter,
  3496. nary: Yg.MmlNary,
  3497. eqArr: Yg.MmlEquationArray,
  3498. lim: Yg.MmlLimit,
  3499. limLow: Yg.MmlLimitLower,
  3500. m: Yg.MmlMatrix,
  3501. mr: Yg.MmlMatrixRow,
  3502. box: Yg.MmlBox,
  3503. bar: Yg.MmlBar,
  3504. groupChr: Yg.MmlGroupChar
  3505. };
  3506. class Vog {
  3507. constructor(I) {
  3508. this.options = {
  3509. ignoreWidth: !1,
  3510. debug: !1,
  3511. ...I
  3512. };
  3513. }
  3514. parseNotes(I, g, C) {
  3515. var i = [];
  3516. for (let e of ug.elements(I, g)) {
  3517. const A = new C();
  3518. A.id = ug.attr(e, "id"), A.noteType = ug.attr(e, "type"), A.children = this.parseBodyElements(e), i.push(A);
  3519. }
  3520. return i;
  3521. }
  3522. parseComments(I) {
  3523. var g = [];
  3524. for (let C of ug.elements(I, "comment")) {
  3525. const i = new Bog();
  3526. i.id = ug.attr(C, "id"), i.author = ug.attr(C, "author"), i.initials = ug.attr(C, "initials"), i.date = ug.attr(C, "date"), i.children = this.parseBodyElements(C), g.push(i);
  3527. }
  3528. return g;
  3529. }
  3530. parseDocumentFile(I) {
  3531. var g = ug.element(I, "body"), C = ug.element(I, "background"), i = ug.element(g, "sectPr");
  3532. return {
  3533. type: Yg.Document,
  3534. children: this.parseBodyElements(g),
  3535. props: i ? p$(i, ug) : {},
  3536. cssStyle: C ? this.parseBackground(C) : {}
  3537. };
  3538. }
  3539. parseBackground(I) {
  3540. var g = {}, C = fC.colorAttr(I, "color");
  3541. return C && (g["background-color"] = C), g;
  3542. }
  3543. parseBodyElements(I) {
  3544. var g = [];
  3545. for (let C of ug.elements(I))
  3546. switch (C.localName) {
  3547. case "p":
  3548. g.push(this.parseParagraph(C));
  3549. break;
  3550. case "altChunk":
  3551. g.push(this.parseAltChunk(C));
  3552. break;
  3553. case "tbl":
  3554. g.push(this.parseTable(C));
  3555. break;
  3556. case "sdt":
  3557. g.push(...this.parseSdt(C, (i) => this.parseBodyElements(i)));
  3558. break;
  3559. }
  3560. return g;
  3561. }
  3562. parseStylesFile(I) {
  3563. var g = [];
  3564. return fC.foreach(I, (C) => {
  3565. switch (C.localName) {
  3566. case "style":
  3567. g.push(this.parseStyle(C));
  3568. break;
  3569. case "docDefaults":
  3570. g.push(this.parseDefaultStyles(C));
  3571. break;
  3572. }
  3573. }), g;
  3574. }
  3575. parseDefaultStyles(I) {
  3576. var g = {
  3577. id: null,
  3578. name: null,
  3579. target: null,
  3580. basedOn: null,
  3581. styles: []
  3582. };
  3583. return fC.foreach(I, (C) => {
  3584. switch (C.localName) {
  3585. case "rPrDefault":
  3586. var i = ug.element(C, "rPr");
  3587. i && g.styles.push({
  3588. target: "span",
  3589. values: this.parseDefaultProperties(i, {})
  3590. });
  3591. break;
  3592. case "pPrDefault":
  3593. var e = ug.element(C, "pPr");
  3594. e && g.styles.push({
  3595. target: "p",
  3596. values: this.parseDefaultProperties(e, {})
  3597. });
  3598. break;
  3599. }
  3600. }), g;
  3601. }
  3602. parseStyle(I) {
  3603. var g = {
  3604. id: ug.attr(I, "styleId"),
  3605. isDefault: ug.boolAttr(I, "default"),
  3606. name: null,
  3607. target: null,
  3608. basedOn: null,
  3609. styles: [],
  3610. linked: null
  3611. };
  3612. switch (ug.attr(I, "type")) {
  3613. case "paragraph":
  3614. g.target = "p";
  3615. break;
  3616. case "table":
  3617. g.target = "table";
  3618. break;
  3619. case "character":
  3620. g.target = "span";
  3621. break;
  3622. }
  3623. return fC.foreach(I, (C) => {
  3624. switch (C.localName) {
  3625. case "basedOn":
  3626. g.basedOn = ug.attr(C, "val");
  3627. break;
  3628. case "name":
  3629. g.name = ug.attr(C, "val");
  3630. break;
  3631. case "link":
  3632. g.linked = ug.attr(C, "val");
  3633. break;
  3634. case "next":
  3635. g.next = ug.attr(C, "val");
  3636. break;
  3637. case "aliases":
  3638. g.aliases = ug.attr(C, "val").split(",");
  3639. break;
  3640. case "pPr":
  3641. g.styles.push({
  3642. target: "p",
  3643. values: this.parseDefaultProperties(C, {})
  3644. }), g.paragraphProps = B$(C, ug);
  3645. break;
  3646. case "rPr":
  3647. g.styles.push({
  3648. target: "span",
  3649. values: this.parseDefaultProperties(C, {})
  3650. }), g.runProps = n9(C, ug);
  3651. break;
  3652. case "tblPr":
  3653. case "tcPr":
  3654. g.styles.push({
  3655. target: "td",
  3656. values: this.parseDefaultProperties(C, {})
  3657. });
  3658. break;
  3659. case "tblStylePr":
  3660. for (let i of this.parseTableStyle(C))
  3661. g.styles.push(i);
  3662. break;
  3663. case "rsid":
  3664. case "qFormat":
  3665. case "hidden":
  3666. case "semiHidden":
  3667. case "unhideWhenUsed":
  3668. case "autoRedefine":
  3669. case "uiPriority":
  3670. break;
  3671. default:
  3672. this.options.debug && console.warn(`DOCX: Unknown style element: ${C.localName}`);
  3673. }
  3674. }), g;
  3675. }
  3676. parseTableStyle(I) {
  3677. var g = [], C = ug.attr(I, "type"), i = "", e = "";
  3678. switch (C) {
  3679. case "firstRow":
  3680. e = ".first-row", i = "tr.first-row td";
  3681. break;
  3682. case "lastRow":
  3683. e = ".last-row", i = "tr.last-row td";
  3684. break;
  3685. case "firstCol":
  3686. e = ".first-col", i = "td.first-col";
  3687. break;
  3688. case "lastCol":
  3689. e = ".last-col", i = "td.last-col";
  3690. break;
  3691. case "band1Vert":
  3692. e = ":not(.no-vband)", i = "td.odd-col";
  3693. break;
  3694. case "band2Vert":
  3695. e = ":not(.no-vband)", i = "td.even-col";
  3696. break;
  3697. case "band1Horz":
  3698. e = ":not(.no-hband)", i = "tr.odd-row";
  3699. break;
  3700. case "band2Horz":
  3701. e = ":not(.no-hband)", i = "tr.even-row";
  3702. break;
  3703. default:
  3704. return [];
  3705. }
  3706. return fC.foreach(I, (A) => {
  3707. switch (A.localName) {
  3708. case "pPr":
  3709. g.push({
  3710. target: `${i} p`,
  3711. mod: e,
  3712. values: this.parseDefaultProperties(A, {})
  3713. });
  3714. break;
  3715. case "rPr":
  3716. g.push({
  3717. target: `${i} span`,
  3718. mod: e,
  3719. values: this.parseDefaultProperties(A, {})
  3720. });
  3721. break;
  3722. case "tblPr":
  3723. case "tcPr":
  3724. g.push({
  3725. target: i,
  3726. mod: e,
  3727. values: this.parseDefaultProperties(A, {})
  3728. });
  3729. break;
  3730. }
  3731. }), g;
  3732. }
  3733. parseNumberingFile(I) {
  3734. var g = [], C = {}, i = [];
  3735. return fC.foreach(I, (e) => {
  3736. switch (e.localName) {
  3737. case "abstractNum":
  3738. this.parseAbstractNumbering(e, i).forEach((l) => g.push(l));
  3739. break;
  3740. case "numPicBullet":
  3741. i.push(this.parseNumberingPicBullet(e));
  3742. break;
  3743. case "num":
  3744. var A = ug.attr(e, "numId"), s = ug.elementAttr(e, "abstractNumId", "val");
  3745. C[s] = A;
  3746. break;
  3747. }
  3748. }), g.forEach((e) => e.id = C[e.id]), g;
  3749. }
  3750. parseNumberingPicBullet(I) {
  3751. var g = ug.element(I, "pict"), C = g && ug.element(g, "shape"), i = C && ug.element(C, "imagedata");
  3752. return i ? {
  3753. id: ug.intAttr(I, "numPicBulletId"),
  3754. src: ug.attr(i, "id"),
  3755. style: ug.attr(C, "style")
  3756. } : null;
  3757. }
  3758. parseAbstractNumbering(I, g) {
  3759. var C = [], i = ug.attr(I, "abstractNumId");
  3760. return fC.foreach(I, (e) => {
  3761. switch (e.localName) {
  3762. case "lvl":
  3763. C.push(this.parseNumberingLevel(i, e, g));
  3764. break;
  3765. }
  3766. }), C;
  3767. }
  3768. parseNumberingLevel(I, g, C) {
  3769. var i = {
  3770. id: I,
  3771. level: ug.intAttr(g, "ilvl"),
  3772. start: 1,
  3773. pStyleName: void 0,
  3774. pStyle: {},
  3775. rStyle: {},
  3776. suff: "tab"
  3777. };
  3778. return fC.foreach(g, (e) => {
  3779. switch (e.localName) {
  3780. case "start":
  3781. i.start = ug.intAttr(e, "val");
  3782. break;
  3783. case "pPr":
  3784. this.parseDefaultProperties(e, i.pStyle);
  3785. break;
  3786. case "rPr":
  3787. this.parseDefaultProperties(e, i.rStyle);
  3788. break;
  3789. case "lvlPicBulletId":
  3790. var A = ug.intAttr(e, "val");
  3791. i.bullet = C.find((s) => (s == null ? void 0 : s.id) == A);
  3792. break;
  3793. case "lvlText":
  3794. i.levelText = ug.attr(e, "val");
  3795. break;
  3796. case "pStyle":
  3797. i.pStyleName = ug.attr(e, "val");
  3798. break;
  3799. case "numFmt":
  3800. i.format = ug.attr(e, "val");
  3801. break;
  3802. case "suff":
  3803. i.suff = ug.attr(e, "val");
  3804. break;
  3805. }
  3806. }), i;
  3807. }
  3808. parseSdt(I, g) {
  3809. const C = ug.element(I, "sdtContent");
  3810. return C ? g(C) : [];
  3811. }
  3812. parseInserted(I, g) {
  3813. var C;
  3814. return {
  3815. type: Yg.Inserted,
  3816. children: ((C = g(I)) == null ? void 0 : C.children) ?? []
  3817. };
  3818. }
  3819. parseDeleted(I, g) {
  3820. var C;
  3821. return {
  3822. type: Yg.Deleted,
  3823. children: ((C = g(I)) == null ? void 0 : C.children) ?? []
  3824. };
  3825. }
  3826. parseAltChunk(I) {
  3827. return { type: Yg.AltChunk, children: [], id: ug.attr(I, "id") };
  3828. }
  3829. parseParagraph(I) {
  3830. var g = { type: Yg.Paragraph, children: [] };
  3831. for (let C of ug.elements(I))
  3832. switch (C.localName) {
  3833. case "pPr":
  3834. this.parseParagraphProperties(C, g);
  3835. break;
  3836. case "r":
  3837. g.children.push(this.parseRun(C, g));
  3838. break;
  3839. case "hyperlink":
  3840. g.children.push(this.parseHyperlink(C, g));
  3841. break;
  3842. case "smartTag":
  3843. g.children.push(this.parseSmartTag(C, g));
  3844. break;
  3845. case "bookmarkStart":
  3846. g.children.push(mog(C, ug));
  3847. break;
  3848. case "bookmarkEnd":
  3849. g.children.push(Zog(C, ug));
  3850. break;
  3851. case "commentRangeStart":
  3852. g.children.push(new yog(ug.attr(C, "id")));
  3853. break;
  3854. case "commentRangeEnd":
  3855. g.children.push(new Yog(ug.attr(C, "id")));
  3856. break;
  3857. case "oMath":
  3858. case "oMathPara":
  3859. g.children.push(this.parseMathElement(C));
  3860. break;
  3861. case "sdt":
  3862. g.children.push(...this.parseSdt(C, (i) => this.parseParagraph(i).children));
  3863. break;
  3864. case "ins":
  3865. g.children.push(this.parseInserted(C, (i) => this.parseParagraph(i)));
  3866. break;
  3867. case "del":
  3868. g.children.push(this.parseDeleted(C, (i) => this.parseParagraph(i)));
  3869. break;
  3870. }
  3871. return g;
  3872. }
  3873. parseParagraphProperties(I, g) {
  3874. this.parseDefaultProperties(I, g.cssStyle = {}, null, (C) => {
  3875. if (W$(C, g, ug))
  3876. return !0;
  3877. switch (C.localName) {
  3878. case "pStyle":
  3879. g.styleName = ug.attr(C, "val");
  3880. break;
  3881. case "cnfStyle":
  3882. g.className = RC.classNameOfCnfStyle(C);
  3883. break;
  3884. case "framePr":
  3885. this.parseFrame(C, g);
  3886. break;
  3887. case "rPr":
  3888. break;
  3889. default:
  3890. return !1;
  3891. }
  3892. return !0;
  3893. });
  3894. }
  3895. parseFrame(I, g) {
  3896. var C = ug.attr(I, "dropCap");
  3897. C == "drop" && (g.cssStyle.float = "left");
  3898. }
  3899. parseHyperlink(I, g) {
  3900. var C = { type: Yg.Hyperlink, parent: g, children: [] };
  3901. return C.anchor = ug.attr(I, "anchor"), C.id = ug.attr(I, "id"), fC.foreach(I, (i) => {
  3902. switch (i.localName) {
  3903. case "r":
  3904. C.children.push(this.parseRun(i, C));
  3905. break;
  3906. }
  3907. }), C;
  3908. }
  3909. parseSmartTag(I, g) {
  3910. var C = { type: Yg.SmartTag, parent: g, children: [] }, i = ug.attr(I, "uri"), e = ug.attr(I, "element");
  3911. return i && (C.uri = i), e && (C.element = e), fC.foreach(I, (A) => {
  3912. switch (A.localName) {
  3913. case "r":
  3914. C.children.push(this.parseRun(A, C));
  3915. break;
  3916. }
  3917. }), C;
  3918. }
  3919. parseRun(I, g) {
  3920. var C = { type: Yg.Run, parent: g, children: [] };
  3921. return fC.foreach(I, (i) => {
  3922. switch (i = this.checkAlternateContent(i), i.localName) {
  3923. case "t":
  3924. C.children.push({
  3925. type: Yg.Text,
  3926. text: i.textContent
  3927. });
  3928. break;
  3929. case "delText":
  3930. C.children.push({
  3931. type: Yg.DeletedText,
  3932. text: i.textContent
  3933. });
  3934. break;
  3935. case "commentReference":
  3936. C.children.push(new Wog(ug.attr(i, "id")));
  3937. break;
  3938. case "fldSimple":
  3939. C.children.push({
  3940. type: Yg.SimpleField,
  3941. instruction: ug.attr(i, "instr"),
  3942. lock: ug.boolAttr(i, "lock", !1),
  3943. dirty: ug.boolAttr(i, "dirty", !1)
  3944. });
  3945. break;
  3946. case "instrText":
  3947. C.fieldRun = !0, C.children.push({
  3948. type: Yg.Instruction,
  3949. text: i.textContent
  3950. });
  3951. break;
  3952. case "fldChar":
  3953. C.fieldRun = !0, C.children.push({
  3954. type: Yg.ComplexField,
  3955. charType: ug.attr(i, "fldCharType"),
  3956. lock: ug.boolAttr(i, "lock", !1),
  3957. dirty: ug.boolAttr(i, "dirty", !1)
  3958. });
  3959. break;
  3960. case "noBreakHyphen":
  3961. C.children.push({ type: Yg.NoBreakHyphen });
  3962. break;
  3963. case "br":
  3964. C.children.push({
  3965. type: Yg.Break,
  3966. break: ug.attr(i, "type") || "textWrapping"
  3967. });
  3968. break;
  3969. case "lastRenderedPageBreak":
  3970. C.children.push({
  3971. type: Yg.Break,
  3972. break: "lastRenderedPageBreak"
  3973. });
  3974. break;
  3975. case "sym":
  3976. C.children.push({
  3977. type: Yg.Symbol,
  3978. font: xX(ug.attr(i, "font")),
  3979. char: ug.attr(i, "char")
  3980. });
  3981. break;
  3982. case "tab":
  3983. C.children.push({ type: Yg.Tab });
  3984. break;
  3985. case "footnoteReference":
  3986. C.children.push({
  3987. type: Yg.FootnoteReference,
  3988. id: ug.attr(i, "id")
  3989. });
  3990. break;
  3991. case "endnoteReference":
  3992. C.children.push({
  3993. type: Yg.EndnoteReference,
  3994. id: ug.attr(i, "id")
  3995. });
  3996. break;
  3997. case "drawing":
  3998. let e = this.parseDrawing(i);
  3999. e && (C.children = [e]);
  4000. break;
  4001. case "pict":
  4002. C.children.push(this.parseVmlPicture(i));
  4003. break;
  4004. case "rPr":
  4005. this.parseRunProperties(i, C);
  4006. break;
  4007. }
  4008. }), C;
  4009. }
  4010. parseMathElement(I) {
  4011. const g = `${I.localName}Pr`, C = { type: O6[I.localName], children: [] };
  4012. for (const e of ug.elements(I))
  4013. if (O6[e.localName])
  4014. C.children.push(this.parseMathElement(e));
  4015. else if (e.localName == "r") {
  4016. var i = this.parseRun(e);
  4017. i.type = Yg.MmlRun, C.children.push(i);
  4018. } else e.localName == g && (C.props = this.parseMathProperies(e));
  4019. return C;
  4020. }
  4021. parseMathProperies(I) {
  4022. const g = {};
  4023. for (const C of ug.elements(I))
  4024. switch (C.localName) {
  4025. case "chr":
  4026. g.char = ug.attr(C, "val");
  4027. break;
  4028. case "vertJc":
  4029. g.verticalJustification = ug.attr(C, "val");
  4030. break;
  4031. case "pos":
  4032. g.position = ug.attr(C, "val");
  4033. break;
  4034. case "degHide":
  4035. g.hideDegree = ug.boolAttr(C, "val");
  4036. break;
  4037. case "begChr":
  4038. g.beginChar = ug.attr(C, "val");
  4039. break;
  4040. case "endChr":
  4041. g.endChar = ug.attr(C, "val");
  4042. break;
  4043. }
  4044. return g;
  4045. }
  4046. parseRunProperties(I, g) {
  4047. this.parseDefaultProperties(I, g.cssStyle = {}, null, (C) => {
  4048. switch (C.localName) {
  4049. case "rStyle":
  4050. g.styleName = ug.attr(C, "val");
  4051. break;
  4052. case "vertAlign":
  4053. g.verticalAlign = RC.valueOfVertAlign(C, !0);
  4054. break;
  4055. default:
  4056. return !1;
  4057. }
  4058. return !0;
  4059. });
  4060. }
  4061. parseVmlPicture(I) {
  4062. const g = { type: Yg.VmlPicture, children: [] };
  4063. for (const C of ug.elements(I)) {
  4064. const i = M$(C, this);
  4065. i && g.children.push(i);
  4066. }
  4067. return g;
  4068. }
  4069. checkAlternateContent(I) {
  4070. var e;
  4071. if (I.localName != "AlternateContent")
  4072. return I;
  4073. var g = ug.element(I, "Choice");
  4074. if (g) {
  4075. var C = ug.attr(g, "Requires"), i = I.lookupNamespaceURI(C);
  4076. if (Nog.includes(i))
  4077. return g.firstElementChild;
  4078. }
  4079. return (e = ug.element(I, "Fallback")) == null ? void 0 : e.firstElementChild;
  4080. }
  4081. parseDrawing(I) {
  4082. for (var g of ug.elements(I))
  4083. switch (g.localName) {
  4084. case "inline":
  4085. case "anchor":
  4086. return this.parseDrawingWrapper(g);
  4087. }
  4088. }
  4089. parseDrawingWrapper(I) {
  4090. var g = { type: Yg.Drawing, children: [], cssStyle: {} }, C = I.localName == "anchor";
  4091. let i = null, e = ug.boolAttr(I, "simplePos");
  4092. ug.boolAttr(I, "behindDoc");
  4093. let A = { relative: "page", align: "left", offset: "0" }, s = { relative: "page", align: "top", offset: "0" };
  4094. for (var l of ug.elements(I))
  4095. switch (l.localName) {
  4096. case "simplePos":
  4097. e && (A.offset = ug.lengthAttr(l, "x", st.Emu), s.offset = ug.lengthAttr(l, "y", st.Emu));
  4098. break;
  4099. case "extent":
  4100. g.cssStyle.width = ug.lengthAttr(l, "cx", st.Emu), g.cssStyle.height = ug.lengthAttr(l, "cy", st.Emu);
  4101. break;
  4102. case "positionH":
  4103. case "positionV":
  4104. if (!e) {
  4105. let o = l.localName == "positionH" ? A : s;
  4106. var n = ug.element(l, "align"), a = ug.element(l, "posOffset");
  4107. o.relative = ug.attr(l, "relativeFrom") ?? o.relative, n && (o.align = n.textContent), a && (o.offset = fC.sizeValue(a, st.Emu));
  4108. }
  4109. break;
  4110. case "wrapTopAndBottom":
  4111. i = "wrapTopAndBottom";
  4112. break;
  4113. case "wrapNone":
  4114. i = "wrapNone";
  4115. break;
  4116. case "graphic":
  4117. var d = this.parseGraphic(l);
  4118. d && g.children.push(d);
  4119. break;
  4120. }
  4121. return i == "wrapTopAndBottom" ? (g.cssStyle.display = "block", A.align && (g.cssStyle["text-align"] = A.align, g.cssStyle.width = "100%")) : i == "wrapNone" ? (g.cssStyle.display = "block", g.cssStyle.position = "relative", g.cssStyle.width = "0px", g.cssStyle.height = "0px", A.offset && (g.cssStyle.left = A.offset), s.offset && (g.cssStyle.top = s.offset)) : C && (A.align == "left" || A.align == "right") && (g.cssStyle.float = A.align), g;
  4122. }
  4123. parseGraphic(I) {
  4124. var g = ug.element(I, "graphicData");
  4125. for (let C of ug.elements(g))
  4126. switch (C.localName) {
  4127. case "pic":
  4128. return this.parsePicture(C);
  4129. }
  4130. return null;
  4131. }
  4132. parsePicture(I) {
  4133. var g = { type: Yg.Image, src: "", cssStyle: {} }, C = ug.element(I, "blipFill"), i = ug.element(C, "blip");
  4134. g.src = ug.attr(i, "embed");
  4135. var e = ug.element(I, "spPr"), A = ug.element(e, "xfrm");
  4136. g.cssStyle.position = "relative";
  4137. for (var s of ug.elements(A))
  4138. switch (s.localName) {
  4139. case "ext":
  4140. g.cssStyle.width = ug.lengthAttr(s, "cx", st.Emu), g.cssStyle.height = ug.lengthAttr(s, "cy", st.Emu);
  4141. break;
  4142. case "off":
  4143. g.cssStyle.left = ug.lengthAttr(s, "x", st.Emu), g.cssStyle.top = ug.lengthAttr(s, "y", st.Emu);
  4144. break;
  4145. }
  4146. return g;
  4147. }
  4148. parseTable(I) {
  4149. var g = { type: Yg.Table, children: [] };
  4150. return fC.foreach(I, (C) => {
  4151. switch (C.localName) {
  4152. case "tr":
  4153. g.children.push(this.parseTableRow(C));
  4154. break;
  4155. case "tblGrid":
  4156. g.columns = this.parseTableColumns(C);
  4157. break;
  4158. case "tblPr":
  4159. this.parseTableProperties(C, g);
  4160. break;
  4161. }
  4162. }), g;
  4163. }
  4164. parseTableColumns(I) {
  4165. var g = [];
  4166. return fC.foreach(I, (C) => {
  4167. switch (C.localName) {
  4168. case "gridCol":
  4169. g.push({ width: ug.lengthAttr(C, "w") });
  4170. break;
  4171. }
  4172. }), g;
  4173. }
  4174. parseTableProperties(I, g) {
  4175. switch (g.cssStyle = {}, g.cellStyle = {}, this.parseDefaultProperties(I, g.cssStyle, g.cellStyle, (C) => {
  4176. switch (C.localName) {
  4177. case "tblStyle":
  4178. g.styleName = ug.attr(C, "val");
  4179. break;
  4180. case "tblLook":
  4181. g.className = RC.classNameOftblLook(C);
  4182. break;
  4183. case "tblpPr":
  4184. this.parseTablePosition(C, g);
  4185. break;
  4186. case "tblStyleColBandSize":
  4187. g.colBandSize = ug.intAttr(C, "val");
  4188. break;
  4189. case "tblStyleRowBandSize":
  4190. g.rowBandSize = ug.intAttr(C, "val");
  4191. break;
  4192. default:
  4193. return !1;
  4194. }
  4195. return !0;
  4196. }), g.cssStyle["text-align"]) {
  4197. case "center":
  4198. delete g.cssStyle["text-align"], g.cssStyle["margin-left"] = "auto", g.cssStyle["margin-right"] = "auto";
  4199. break;
  4200. case "right":
  4201. delete g.cssStyle["text-align"], g.cssStyle["margin-left"] = "auto";
  4202. break;
  4203. }
  4204. }
  4205. parseTablePosition(I, g) {
  4206. var C = ug.lengthAttr(I, "topFromText"), i = ug.lengthAttr(I, "bottomFromText"), e = ug.lengthAttr(I, "rightFromText"), A = ug.lengthAttr(I, "leftFromText");
  4207. g.cssStyle.float = "left", g.cssStyle["margin-bottom"] = RC.addSize(g.cssStyle["margin-bottom"], i), g.cssStyle["margin-left"] = RC.addSize(g.cssStyle["margin-left"], A), g.cssStyle["margin-right"] = RC.addSize(g.cssStyle["margin-right"], e), g.cssStyle["margin-top"] = RC.addSize(g.cssStyle["margin-top"], C);
  4208. }
  4209. parseTableRow(I) {
  4210. var g = { type: Yg.Row, children: [] };
  4211. return fC.foreach(I, (C) => {
  4212. switch (C.localName) {
  4213. case "tc":
  4214. g.children.push(this.parseTableCell(C));
  4215. break;
  4216. case "trPr":
  4217. this.parseTableRowProperties(C, g);
  4218. break;
  4219. }
  4220. }), g;
  4221. }
  4222. parseTableRowProperties(I, g) {
  4223. g.cssStyle = this.parseDefaultProperties(I, {}, null, (C) => {
  4224. switch (C.localName) {
  4225. case "cnfStyle":
  4226. g.className = RC.classNameOfCnfStyle(C);
  4227. break;
  4228. case "tblHeader":
  4229. g.isHeader = ug.boolAttr(C, "val");
  4230. break;
  4231. default:
  4232. return !1;
  4233. }
  4234. return !0;
  4235. });
  4236. }
  4237. parseTableCell(I) {
  4238. var g = { type: Yg.Cell, children: [] };
  4239. return fC.foreach(I, (C) => {
  4240. switch (C.localName) {
  4241. case "tbl":
  4242. g.children.push(this.parseTable(C));
  4243. break;
  4244. case "p":
  4245. g.children.push(this.parseParagraph(C));
  4246. break;
  4247. case "tcPr":
  4248. this.parseTableCellProperties(C, g);
  4249. break;
  4250. }
  4251. }), g;
  4252. }
  4253. parseTableCellProperties(I, g) {
  4254. g.cssStyle = this.parseDefaultProperties(I, {}, null, (C) => {
  4255. switch (C.localName) {
  4256. case "gridSpan":
  4257. g.span = ug.intAttr(C, "val", null);
  4258. break;
  4259. case "vMerge":
  4260. g.verticalMerge = ug.attr(C, "val") ?? "continue";
  4261. break;
  4262. case "cnfStyle":
  4263. g.className = RC.classNameOfCnfStyle(C);
  4264. break;
  4265. default:
  4266. return !1;
  4267. }
  4268. return !0;
  4269. }), this.parseTableCellVerticalText(I, g);
  4270. }
  4271. parseTableCellVerticalText(I, g) {
  4272. const C = {
  4273. btLr: {
  4274. writingMode: "vertical-rl",
  4275. transform: "rotate(180deg)"
  4276. },
  4277. lrTb: {
  4278. writingMode: "vertical-lr",
  4279. transform: "none"
  4280. },
  4281. tbRl: {
  4282. writingMode: "vertical-rl",
  4283. transform: "none"
  4284. }
  4285. };
  4286. fC.foreach(I, (i) => {
  4287. if (i.localName === "textDirection") {
  4288. const e = ug.attr(i, "val"), A = C[e] || { writingMode: "horizontal-tb" };
  4289. g.cssStyle["writing-mode"] = A.writingMode, g.cssStyle.transform = A.transform;
  4290. }
  4291. });
  4292. }
  4293. parseDefaultProperties(I, g = null, C = null, i = null) {
  4294. return g = g || {}, fC.foreach(I, (e) => {
  4295. if (!(i != null && i(e)))
  4296. switch (e.localName) {
  4297. case "jc":
  4298. g["text-align"] = RC.valueOfJc(e);
  4299. break;
  4300. case "textAlignment":
  4301. g["vertical-align"] = RC.valueOfTextAlignment(e);
  4302. break;
  4303. case "color":
  4304. g.color = fC.colorAttr(e, "val", null, nN.color);
  4305. break;
  4306. case "sz":
  4307. g["font-size"] = g["min-height"] = ug.lengthAttr(e, "val", st.FontSize);
  4308. break;
  4309. case "shd":
  4310. g["background-color"] = fC.colorAttr(e, "fill", null, nN.shd);
  4311. break;
  4312. case "highlight":
  4313. g["background-color"] = fC.colorAttr(e, "val", null, nN.highlight);
  4314. break;
  4315. case "vertAlign":
  4316. break;
  4317. case "position":
  4318. g.verticalAlign = ug.lengthAttr(e, "val", st.FontSize);
  4319. break;
  4320. case "tcW":
  4321. if (this.options.ignoreWidth)
  4322. break;
  4323. case "tblW":
  4324. g.width = RC.valueOfSize(e, "w");
  4325. break;
  4326. case "trHeight":
  4327. this.parseTrHeight(e, g);
  4328. break;
  4329. case "strike":
  4330. g["text-decoration"] = ug.boolAttr(e, "val", !0) ? "line-through" : "none";
  4331. break;
  4332. case "b":
  4333. g["font-weight"] = ug.boolAttr(e, "val", !0) ? "bold" : "normal";
  4334. break;
  4335. case "i":
  4336. g["font-style"] = ug.boolAttr(e, "val", !0) ? "italic" : "normal";
  4337. break;
  4338. case "caps":
  4339. g["text-transform"] = ug.boolAttr(e, "val", !0) ? "uppercase" : "none";
  4340. break;
  4341. case "smallCaps":
  4342. g["font-variant"] = ug.boolAttr(e, "val", !0) ? "small-caps" : "none";
  4343. break;
  4344. case "u":
  4345. this.parseUnderline(e, g);
  4346. break;
  4347. case "ind":
  4348. case "tblInd":
  4349. this.parseIndentation(e, g);
  4350. break;
  4351. case "rFonts":
  4352. this.parseFont(e, g);
  4353. break;
  4354. case "tblBorders":
  4355. this.parseBorderProperties(e, C || g);
  4356. break;
  4357. case "tblCellSpacing":
  4358. g["border-spacing"] = RC.valueOfMargin(e), g["border-collapse"] = "separate";
  4359. break;
  4360. case "pBdr":
  4361. this.parseBorderProperties(e, g);
  4362. break;
  4363. case "bdr":
  4364. g.border = RC.valueOfBorder(e);
  4365. break;
  4366. case "tcBorders":
  4367. this.parseBorderProperties(e, g);
  4368. break;
  4369. case "vanish":
  4370. ug.boolAttr(e, "val", !0) && (g.display = "none");
  4371. break;
  4372. case "kern":
  4373. break;
  4374. case "noWrap":
  4375. break;
  4376. case "tblCellMar":
  4377. case "tcMar":
  4378. this.parseMarginProperties(e, C || g);
  4379. break;
  4380. case "tblLayout":
  4381. g["table-layout"] = RC.valueOfTblLayout(e);
  4382. break;
  4383. case "vAlign":
  4384. g["vertical-align"] = RC.valueOfTextAlignment(e);
  4385. break;
  4386. case "spacing":
  4387. I.localName == "pPr" && this.parseSpacing(e, g);
  4388. break;
  4389. case "wordWrap":
  4390. ug.boolAttr(e, "val") && (g["overflow-wrap"] = "break-word");
  4391. break;
  4392. case "suppressAutoHyphens":
  4393. g.hyphens = ug.boolAttr(e, "val", !0) ? "none" : "auto";
  4394. break;
  4395. case "lang":
  4396. g.$lang = ug.attr(e, "val");
  4397. break;
  4398. case "bCs":
  4399. case "iCs":
  4400. case "szCs":
  4401. case "tabs":
  4402. case "outlineLvl":
  4403. case "contextualSpacing":
  4404. case "tblStyleColBandSize":
  4405. case "tblStyleRowBandSize":
  4406. case "webHidden":
  4407. case "pageBreakBefore":
  4408. case "suppressLineNumbers":
  4409. case "keepLines":
  4410. case "keepNext":
  4411. case "widowControl":
  4412. case "bidi":
  4413. case "rtl":
  4414. case "noProof":
  4415. break;
  4416. default:
  4417. this.options.debug && console.warn(`DOCX: Unknown document element: ${I.localName}.${e.localName}`);
  4418. break;
  4419. }
  4420. }), g;
  4421. }
  4422. parseUnderline(I, g) {
  4423. var C = ug.attr(I, "val");
  4424. if (C != null) {
  4425. switch (C) {
  4426. case "dash":
  4427. case "dashDotDotHeavy":
  4428. case "dashDotHeavy":
  4429. case "dashedHeavy":
  4430. case "dashLong":
  4431. case "dashLongHeavy":
  4432. case "dotDash":
  4433. case "dotDotDash":
  4434. g["text-decoration"] = "underline dashed";
  4435. break;
  4436. case "dotted":
  4437. case "dottedHeavy":
  4438. g["text-decoration"] = "underline dotted";
  4439. break;
  4440. case "double":
  4441. g["text-decoration"] = "underline double";
  4442. break;
  4443. case "single":
  4444. case "thick":
  4445. g["text-decoration"] = "underline";
  4446. break;
  4447. case "wave":
  4448. case "wavyDouble":
  4449. case "wavyHeavy":
  4450. g["text-decoration"] = "underline wavy";
  4451. break;
  4452. case "words":
  4453. g["text-decoration"] = "underline";
  4454. break;
  4455. case "none":
  4456. g["text-decoration"] = "none";
  4457. break;
  4458. }
  4459. var i = fC.colorAttr(I, "color");
  4460. i && (g["text-decoration-color"] = i);
  4461. }
  4462. }
  4463. parseFont(I, g) {
  4464. var C = ug.attr(I, "ascii"), i = RC.themeValue(I, "asciiTheme"), e = ug.attr(I, "eastAsia"), A = [C, i, e].filter((s) => s).map((s) => xX(s));
  4465. A.length > 0 && (g["font-family"] = [...new Set(A)].join(", "));
  4466. }
  4467. parseIndentation(I, g) {
  4468. var C = ug.lengthAttr(I, "firstLine"), i = ug.lengthAttr(I, "hanging"), e = ug.lengthAttr(I, "left"), A = ug.lengthAttr(I, "start"), s = ug.lengthAttr(I, "right"), l = ug.lengthAttr(I, "end");
  4469. C && (g["text-indent"] = C), i && (g["text-indent"] = `-${i}`), (e || A) && (g["margin-left"] = e || A), (s || l) && (g["margin-right"] = s || l);
  4470. }
  4471. parseSpacing(I, g) {
  4472. var C = ug.lengthAttr(I, "before"), i = ug.lengthAttr(I, "after"), e = ug.intAttr(I, "line", null), A = ug.attr(I, "lineRule");
  4473. if (C && (g["margin-top"] = C), i && (g["margin-bottom"] = i), e !== null)
  4474. switch (A) {
  4475. case "auto":
  4476. g["line-height"] = `${(e / 240).toFixed(2)}`;
  4477. break;
  4478. case "atLeast":
  4479. g["line-height"] = `calc(100% + ${e / 20}pt)`;
  4480. break;
  4481. default:
  4482. g["line-height"] = g["min-height"] = `${e / 20}pt`;
  4483. break;
  4484. }
  4485. }
  4486. parseMarginProperties(I, g) {
  4487. fC.foreach(I, (C) => {
  4488. switch (C.localName) {
  4489. case "left":
  4490. g["padding-left"] = RC.valueOfMargin(C);
  4491. break;
  4492. case "right":
  4493. g["padding-right"] = RC.valueOfMargin(C);
  4494. break;
  4495. case "top":
  4496. g["padding-top"] = RC.valueOfMargin(C);
  4497. break;
  4498. case "bottom":
  4499. g["padding-bottom"] = RC.valueOfMargin(C);
  4500. break;
  4501. }
  4502. });
  4503. }
  4504. parseTrHeight(I, g) {
  4505. switch (ug.attr(I, "hRule")) {
  4506. case "exact":
  4507. g.height = ug.lengthAttr(I, "val");
  4508. break;
  4509. case "atLeast":
  4510. default:
  4511. g.height = ug.lengthAttr(I, "val");
  4512. break;
  4513. }
  4514. }
  4515. parseBorderProperties(I, g) {
  4516. fC.foreach(I, (C) => {
  4517. switch (C.localName) {
  4518. case "start":
  4519. case "left":
  4520. g["border-left"] = RC.valueOfBorder(C);
  4521. break;
  4522. case "end":
  4523. case "right":
  4524. g["border-right"] = RC.valueOfBorder(C);
  4525. break;
  4526. case "top":
  4527. g["border-top"] = RC.valueOfBorder(C);
  4528. break;
  4529. case "bottom":
  4530. g["border-bottom"] = RC.valueOfBorder(C);
  4531. break;
  4532. }
  4533. });
  4534. }
  4535. }
  4536. const Mog = ["black", "blue", "cyan", "darkBlue", "darkCyan", "darkGray", "darkGreen", "darkMagenta", "darkRed", "darkYellow", "green", "lightGray", "magenta", "none", "red", "white", "yellow"];
  4537. class fC {
  4538. static foreach(I, g) {
  4539. for (var C = 0; C < I.childNodes.length; C++) {
  4540. let i = I.childNodes[C];
  4541. i.nodeType == Node.ELEMENT_NODE && g(i);
  4542. }
  4543. }
  4544. static colorAttr(I, g, C = null, i = "black") {
  4545. var e = ug.attr(I, g);
  4546. if (e)
  4547. return e == "auto" ? i : Mog.includes(e) ? e : `#${e}`;
  4548. var A = ug.attr(I, "themeColor");
  4549. return A ? `var(--docx-${A}-color)` : C;
  4550. }
  4551. static sizeValue(I, g = st.Dxa) {
  4552. return Z$(I.textContent, g);
  4553. }
  4554. }
  4555. class RC {
  4556. static themeValue(I, g) {
  4557. var C = ug.attr(I, g);
  4558. return C ? `var(--docx-${C}-font)` : null;
  4559. }
  4560. static valueOfSize(I, g) {
  4561. var C = st.Dxa;
  4562. switch (ug.attr(I, "type")) {
  4563. case "dxa":
  4564. break;
  4565. case "pct":
  4566. C = st.Percent;
  4567. break;
  4568. case "auto":
  4569. return "auto";
  4570. }
  4571. return ug.lengthAttr(I, g, C);
  4572. }
  4573. static valueOfMargin(I) {
  4574. return ug.lengthAttr(I, "w");
  4575. }
  4576. static valueOfBorder(I) {
  4577. var g = ug.attr(I, "val");
  4578. if (g == "nil")
  4579. return "none";
  4580. var C = fC.colorAttr(I, "color"), i = ug.lengthAttr(I, "sz", st.Border);
  4581. return `${i} solid ${C == "auto" ? nN.borderColor : C}`;
  4582. }
  4583. static valueOfTblLayout(I) {
  4584. var g = ug.attr(I, "val");
  4585. return g == "fixed" ? "fixed" : "auto";
  4586. }
  4587. static classNameOfCnfStyle(I) {
  4588. const g = ug.attr(I, "val");
  4589. return [
  4590. "first-row",
  4591. "last-row",
  4592. "first-col",
  4593. "last-col",
  4594. "odd-col",
  4595. "even-col",
  4596. "odd-row",
  4597. "even-row",
  4598. "ne-cell",
  4599. "nw-cell",
  4600. "se-cell",
  4601. "sw-cell"
  4602. ].filter((i, e) => g[e] == "1").join(" ");
  4603. }
  4604. static valueOfJc(I) {
  4605. var g = ug.attr(I, "val");
  4606. switch (g) {
  4607. case "start":
  4608. case "left":
  4609. return "left";
  4610. case "center":
  4611. return "center";
  4612. case "end":
  4613. case "right":
  4614. return "right";
  4615. case "both":
  4616. return "justify";
  4617. }
  4618. return g;
  4619. }
  4620. static valueOfVertAlign(I, g = !1) {
  4621. var C = ug.attr(I, "val");
  4622. switch (C) {
  4623. case "subscript":
  4624. return "sub";
  4625. case "superscript":
  4626. return g ? "sup" : "super";
  4627. }
  4628. return g ? null : C;
  4629. }
  4630. static valueOfTextAlignment(I) {
  4631. var g = ug.attr(I, "val");
  4632. switch (g) {
  4633. case "auto":
  4634. case "baseline":
  4635. return "baseline";
  4636. case "top":
  4637. return "top";
  4638. case "center":
  4639. return "middle";
  4640. case "bottom":
  4641. return "bottom";
  4642. }
  4643. return g;
  4644. }
  4645. static addSize(I, g) {
  4646. return I == null ? g : g == null ? I : `calc(${I} + ${g})`;
  4647. }
  4648. static classNameOftblLook(I) {
  4649. const g = ug.hexAttr(I, "val", 0);
  4650. let C = "";
  4651. return (ug.boolAttr(I, "firstRow") || g & 32) && (C += " first-row"), (ug.boolAttr(I, "lastRow") || g & 64) && (C += " last-row"), (ug.boolAttr(I, "firstColumn") || g & 128) && (C += " first-col"), (ug.boolAttr(I, "lastColumn") || g & 256) && (C += " last-col"), (ug.boolAttr(I, "noHBand") || g & 512) && (C += " no-hband"), (ug.boolAttr(I, "noVBand") || g & 1024) && (C += " no-vband"), C.trim();
  4652. }
  4653. }
  4654. const U6 = { pos: 0, leader: "none", style: "left" }, Rog = 50;
  4655. function fog(t = document.body) {
  4656. const I = document.createElement("div");
  4657. I.style.width = "100pt", t.appendChild(I);
  4658. const g = 100 / I.offsetWidth;
  4659. return t.removeChild(I), g;
  4660. }
  4661. function Hog(t, I, g, C = 72 / 96) {
  4662. const i = t.closest("p"), e = t.getBoundingClientRect(), A = i.getBoundingClientRect(), s = getComputedStyle(i), l = (I == null ? void 0 : I.length) > 0 ? I.map((m) => ({
  4663. pos: E6(m.position),
  4664. leader: m.leader,
  4665. style: m.style
  4666. })).sort((m, Z) => m.pos - Z.pos) : [U6], n = l[l.length - 1], a = A.width * C, d = E6(g);
  4667. let o = n.pos + d;
  4668. if (o < a)
  4669. for (; o < a && l.length < Rog; o += d)
  4670. l.push({ ...U6, pos: o });
  4671. const c = parseFloat(s.marginLeft), r = A.left + c, h = (e.left - r) * C, b = l.find((m) => m.style != "clear" && m.pos > h);
  4672. if (b == null)
  4673. return;
  4674. let u = 1;
  4675. if (b.style == "right" || b.style == "center") {
  4676. const m = Array.from(i.querySelectorAll(`.${t.className}`)), Z = m.indexOf(t) + 1, p = document.createRange();
  4677. p.setStart(t, 1), Z < m.length ? p.setEndBefore(m[Z]) : p.setEndAfter(i);
  4678. const Y = b.style == "center" ? 0.5 : 1, R = p.getBoundingClientRect(), X = R.left + Y * R.width - (A.left - c);
  4679. u = b.pos - X * C;
  4680. } else
  4681. u = b.pos - h;
  4682. switch (t.innerHTML = "&nbsp;", t.style.textDecoration = "inherit", t.style.wordSpacing = `${u.toFixed(0)}pt`, b.leader) {
  4683. case "dot":
  4684. case "middleDot":
  4685. t.style.textDecoration = "underline", t.style.textDecorationStyle = "dotted";
  4686. break;
  4687. case "hyphen":
  4688. case "heavy":
  4689. case "underscore":
  4690. t.style.textDecoration = "underline";
  4691. break;
  4692. }
  4693. }
  4694. function E6(t) {
  4695. return parseFloat(t);
  4696. }
  4697. const OI = {
  4698. svg: "http://www.w3.org/2000/svg",
  4699. mathML: "http://www.w3.org/1998/Math/MathML"
  4700. };
  4701. class Xog {
  4702. constructor(I) {
  4703. this.htmlDocument = I, this.className = "docx", this.styleMap = {}, this.currentPart = null, this.tableVerticalMerges = [], this.currentVerticalMerge = null, this.tableCellPositions = [], this.currentCellPosition = null, this.footnoteMap = {}, this.endnoteMap = {}, this.currentEndnoteIds = [], this.usedHederFooterParts = [], this.currentTabs = [], this.commentMap = {}, this.tasks = [], this.postRenderTasks = [];
  4704. }
  4705. async render(I, g, C = null, i) {
  4706. var A;
  4707. this.document = I, this.options = i, this.className = i.className, this.rootSelector = i.inWrapper ? `.${this.className}-wrapper` : ":root", this.styleMap = null, this.tasks = [], this.options.renderComments && globalThis.Highlight && (this.commentHighlight = new Highlight()), C = C || g, P6(C), P6(g), C.appendChild(this.createComment("docxjs library predefined styles")), C.appendChild(this.renderDefaultStyle()), I.themePart && (C.appendChild(this.createComment("docxjs document theme values")), this.renderTheme(I.themePart, C)), I.stylesPart != null && (this.styleMap = this.processStyles(I.stylesPart.styles), C.appendChild(this.createComment("docxjs document styles")), C.appendChild(this.renderStyles(I.stylesPart.styles))), I.numberingPart && (this.prodessNumberings(I.numberingPart.domNumberings), C.appendChild(this.createComment("docxjs document numbering styles")), C.appendChild(this.renderNumbering(I.numberingPart.domNumberings, C))), I.footnotesPart && (this.footnoteMap = ea(I.footnotesPart.notes, (s) => s.id)), I.endnotesPart && (this.endnoteMap = ea(I.endnotesPart.notes, (s) => s.id)), I.settingsPart && (this.defaultTabSize = (A = I.settingsPart.settings) == null ? void 0 : A.defaultTabStop), !i.ignoreFonts && I.fontTablePart && this.renderFontTable(I.fontTablePart, C);
  4708. var e = this.renderSections(I.documentPart.body);
  4709. this.options.inWrapper ? g.appendChild(this.renderWrapper(e)) : JH(g, e), this.commentHighlight && i.renderComments && CSS.highlights.set(`${this.className}-comments`, this.commentHighlight), this.postRenderTasks.forEach((s) => s()), await Promise.allSettled(this.tasks), this.refreshTabStops();
  4710. }
  4711. renderTheme(I, g) {
  4712. var s, l;
  4713. const C = {}, i = (s = I.theme) == null ? void 0 : s.fontScheme;
  4714. i && (i.majorFont && (C["--docx-majorHAnsi-font"] = i.majorFont.latinTypeface), i.minorFont && (C["--docx-minorHAnsi-font"] = i.minorFont.latinTypeface));
  4715. const e = (l = I.theme) == null ? void 0 : l.colorScheme;
  4716. if (e)
  4717. for (let [n, a] of Object.entries(e.colors))
  4718. C[`--docx-${n}-color`] = `#${a}`;
  4719. const A = this.styleToString(`.${this.className}`, C);
  4720. g.appendChild(this.createStyleElement(A));
  4721. }
  4722. renderFontTable(I, g) {
  4723. for (let C of I.fonts)
  4724. for (let i of C.embedFontRefs)
  4725. this.tasks.push(this.document.loadFont(i.id, i.key).then((e) => {
  4726. const A = {
  4727. "font-family": xX(C.name),
  4728. src: `url(${e})`
  4729. };
  4730. (i.type == "bold" || i.type == "boldItalic") && (A["font-weight"] = "bold"), (i.type == "italic" || i.type == "boldItalic") && (A["font-style"] = "italic");
  4731. const s = this.styleToString("@font-face", A);
  4732. g.appendChild(this.createComment(`docxjs ${C.name} font`)), g.appendChild(this.createStyleElement(s));
  4733. }));
  4734. }
  4735. processStyleName(I) {
  4736. return I ? `${this.className}_${uag(I)}` : this.className;
  4737. }
  4738. processStyles(I) {
  4739. const g = ea(I.filter((i) => i.id != null), (i) => i.id);
  4740. for (const i of I.filter((e) => e.basedOn)) {
  4741. var C = g[i.basedOn];
  4742. if (C) {
  4743. i.paragraphProps = gV(i.paragraphProps, C.paragraphProps), i.runProps = gV(i.runProps, C.runProps);
  4744. for (const e of C.styles) {
  4745. const A = i.styles.find((s) => s.target == e.target);
  4746. A ? this.copyStyleProperties(e.values, A.values) : i.styles.push({ ...e, values: { ...e.values } });
  4747. }
  4748. } else this.options.debug && console.warn(`Can't find base style ${i.basedOn}`);
  4749. }
  4750. for (let i of I)
  4751. i.cssName = this.processStyleName(i.id);
  4752. return g;
  4753. }
  4754. prodessNumberings(I) {
  4755. var g;
  4756. for (let C of I.filter((i) => i.pStyleName)) {
  4757. const i = this.findStyle(C.pStyleName);
  4758. (g = i == null ? void 0 : i.paragraphProps) != null && g.numbering && (i.paragraphProps.numbering.level = C.level);
  4759. }
  4760. }
  4761. processElement(I) {
  4762. if (I.children)
  4763. for (var g of I.children)
  4764. g.parent = I, g.type == Yg.Table ? this.processTable(g) : this.processElement(g);
  4765. }
  4766. processTable(I) {
  4767. for (var g of I.children)
  4768. for (var C of g.children)
  4769. C.cssStyle = this.copyStyleProperties(I.cellStyle, C.cssStyle, [
  4770. "border-left",
  4771. "border-right",
  4772. "border-top",
  4773. "border-bottom",
  4774. "padding-left",
  4775. "padding-right",
  4776. "padding-top",
  4777. "padding-bottom"
  4778. ]), this.processElement(C);
  4779. }
  4780. copyStyleProperties(I, g, C = null) {
  4781. if (!I)
  4782. return g;
  4783. g == null && (g = {}), C == null && (C = Object.getOwnPropertyNames(I));
  4784. for (var i of C)
  4785. I.hasOwnProperty(i) && !g.hasOwnProperty(i) && (g[i] = I[i]);
  4786. return g;
  4787. }
  4788. createPageElement(I, g) {
  4789. var C = this.createElement("section", { className: I });
  4790. return g && (g.pageMargins && (C.style.paddingLeft = g.pageMargins.left, C.style.paddingRight = g.pageMargins.right, C.style.paddingTop = g.pageMargins.top, C.style.paddingBottom = g.pageMargins.bottom), g.pageSize && (this.options.ignoreWidth || (C.style.width = g.pageSize.width), this.options.ignoreHeight || (C.style.minHeight = g.pageSize.height))), C;
  4791. }
  4792. createSectionContent(I) {
  4793. var g = this.createElement("article");
  4794. return I.columns && I.columns.numberOfColumns && (g.style.columnCount = `${I.columns.numberOfColumns}`, g.style.columnGap = I.columns.space, I.columns.separator && (g.style.columnRule = "1px solid black")), g;
  4795. }
  4796. renderSections(I) {
  4797. const g = [];
  4798. this.processElement(I);
  4799. const C = this.splitBySection(I.children, I.props), i = this.groupByPageBreaks(C);
  4800. let e = null;
  4801. for (let s = 0, l = i.length; s < l; s++) {
  4802. this.currentFootnoteIds = [];
  4803. let a = i[s][0].sectProps;
  4804. const d = this.createPageElement(this.className, a);
  4805. this.renderStyleValues(I.cssStyle, d), this.options.renderHeaders && this.renderHeaderFooter(a.headerRefs, a, g.length, e != a, d);
  4806. for (const o of i[s]) {
  4807. var A = this.createSectionContent(o.sectProps);
  4808. this.renderElements(o.elements, A), d.appendChild(A), a = o.sectProps;
  4809. }
  4810. this.options.renderFootnotes && this.renderNotes(this.currentFootnoteIds, this.footnoteMap, d), this.options.renderEndnotes && s == l - 1 && this.renderNotes(this.currentEndnoteIds, this.endnoteMap, d), this.options.renderFooters && this.renderHeaderFooter(a.footerRefs, a, g.length, e != a, d), g.push(d), e = a;
  4811. }
  4812. return g;
  4813. }
  4814. renderHeaderFooter(I, g, C, i, e) {
  4815. if (I) {
  4816. var A = (g.titlePage && i ? I.find((l) => l.type == "first") : null) ?? (C % 2 == 1 ? I.find((l) => l.type == "even") : null) ?? I.find((l) => l.type == "default"), s = A && this.document.findPartByRelId(A.id, this.document.documentPart);
  4817. if (s) {
  4818. this.currentPart = s, this.usedHederFooterParts.includes(s.path) || (this.processElement(s.rootElement), this.usedHederFooterParts.push(s.path));
  4819. const [l] = this.renderElements([s.rootElement], e);
  4820. g != null && g.pageMargins && (s.rootElement.type === Yg.Header ? (l.style.marginTop = `calc(${g.pageMargins.header} - ${g.pageMargins.top})`, l.style.minHeight = `calc(${g.pageMargins.top} - ${g.pageMargins.header})`) : s.rootElement.type === Yg.Footer && (l.style.marginBottom = `calc(${g.pageMargins.footer} - ${g.pageMargins.bottom})`, l.style.minHeight = `calc(${g.pageMargins.bottom} - ${g.pageMargins.footer})`)), this.currentPart = null;
  4821. }
  4822. }
  4823. }
  4824. isPageBreakElement(I) {
  4825. return I.type != Yg.Break ? !1 : I.break == "lastRenderedPageBreak" ? !this.options.ignoreLastRenderedPageBreak : I.break == "page";
  4826. }
  4827. isPageBreakSection(I, g) {
  4828. var C, i, e, A, s, l;
  4829. return !I || !g ? !1 : ((C = I.pageSize) == null ? void 0 : C.orientation) != ((i = g.pageSize) == null ? void 0 : i.orientation) || ((e = I.pageSize) == null ? void 0 : e.width) != ((A = g.pageSize) == null ? void 0 : A.width) || ((s = I.pageSize) == null ? void 0 : s.height) != ((l = g.pageSize) == null ? void 0 : l.height);
  4830. }
  4831. splitBySection(I, g) {
  4832. var d;
  4833. var C = { sectProps: null, elements: [], pageBreak: !1 }, i = [C];
  4834. for (let o of I) {
  4835. if (o.type == Yg.Paragraph) {
  4836. const c = this.findStyle(o.styleName);
  4837. (d = c == null ? void 0 : c.paragraphProps) != null && d.pageBreakBefore && (C.sectProps = e, C.pageBreak = !0, C = { sectProps: null, elements: [], pageBreak: !1 }, i.push(C));
  4838. }
  4839. if (C.elements.push(o), o.type == Yg.Paragraph) {
  4840. const c = o;
  4841. var e = c.sectionProps, A = -1, s = -1;
  4842. if (this.options.breakPages && c.children && (A = c.children.findIndex((r) => {
  4843. var h;
  4844. return s = ((h = r.children) == null ? void 0 : h.findIndex(this.isPageBreakElement.bind(this))) ?? -1, s != -1;
  4845. })), (e || A != -1) && (C.sectProps = e, C.pageBreak = A != -1, C = { sectProps: null, elements: [], pageBreak: !1 }, i.push(C)), A != -1) {
  4846. let r = c.children[A], h = s < r.children.length - 1;
  4847. if (A < c.children.length - 1 || h) {
  4848. var l = o.children, n = { ...o, children: l.slice(A) };
  4849. if (o.children = l.slice(0, A), C.elements.push(n), h) {
  4850. let b = r.children, u = { ...r, children: b.slice(0, s) };
  4851. o.children.push(u), r.children = b.slice(s);
  4852. }
  4853. }
  4854. }
  4855. }
  4856. }
  4857. let a = null;
  4858. for (let o = i.length - 1; o >= 0; o--)
  4859. i[o].sectProps == null ? i[o].sectProps = a ?? g : a = i[o].sectProps;
  4860. return i;
  4861. }
  4862. groupByPageBreaks(I) {
  4863. let g = [], C;
  4864. const i = [g];
  4865. for (let e of I)
  4866. g.push(e), (this.options.ignoreLastRenderedPageBreak || e.pageBreak || this.isPageBreakSection(C, e.sectProps)) && i.push(g = []), C = e.sectProps;
  4867. return i.filter((e) => e.length > 0);
  4868. }
  4869. renderWrapper(I) {
  4870. return this.createElement("div", { className: `${this.className}-wrapper` }, I);
  4871. }
  4872. renderDefaultStyle() {
  4873. var I = this.className, g = `
  4874. .${I}-wrapper { background: gray; padding: 30px; padding-bottom: 0px; display: flex; flex-flow: column; align-items: center; }
  4875. .${I}-wrapper>section.${I} { background: white; box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); margin-bottom: 30px; }`;
  4876. this.options.hideWrapperOnPrint && (g = `@media not print { ${g} }`);
  4877. var C = `${g}
  4878. .${I} { color: black; hyphens: auto; text-underline-position: from-font; }
  4879. section.${I} { box-sizing: border-box; display: flex; flex-flow: column nowrap; position: relative; overflow: hidden; }
  4880. section.${I}>article { margin-bottom: auto; z-index: 1; }
  4881. section.${I}>footer { z-index: 1; }
  4882. .${I} table { border-collapse: collapse; }
  4883. .${I} table td, .${I} table th { vertical-align: top; }
  4884. .${I} p { margin: 0pt; min-height: 1em; }
  4885. .${I} span { white-space: pre-wrap; overflow-wrap: break-word; }
  4886. .${I} a { color: inherit; text-decoration: inherit; }
  4887. .${I} svg { fill: transparent; }
  4888. `;
  4889. return this.options.renderComments && (C += `
  4890. .${I}-comment-ref { cursor: default; }
  4891. .${I}-comment-popover { display: none; z-index: 1000; padding: 0.5rem; background: white; position: absolute; box-shadow: 0 0 0.25rem rgba(0, 0, 0, 0.25); width: 30ch; }
  4892. .${I}-comment-ref:hover~.${I}-comment-popover { display: block; }
  4893. .${I}-comment-author,.${I}-comment-date { font-size: 0.875rem; color: #888; }
  4894. `), this.createStyleElement(C);
  4895. }
  4896. renderNumbering(I, g) {
  4897. var C = "", i = [];
  4898. for (var e of I) {
  4899. var A = `p.${this.numberingClass(e.id, e.level)}`, s = "none";
  4900. if (e.bullet) {
  4901. let l = `--${this.className}-${e.bullet.src}`.toLowerCase();
  4902. C += this.styleToString(`${A}:before`, {
  4903. content: "' '",
  4904. display: "inline-block",
  4905. background: `var(${l})`
  4906. }, e.bullet.style), this.tasks.push(this.document.loadNumberingImage(e.bullet.src).then((n) => {
  4907. var a = `${this.rootSelector} { ${l}: url(${n}) }`;
  4908. g.appendChild(this.createStyleElement(a));
  4909. }));
  4910. } else if (e.levelText) {
  4911. let l = this.numberingCounter(e.id, e.level);
  4912. const n = l + " " + (e.start - 1);
  4913. e.level > 0 && (C += this.styleToString(`p.${this.numberingClass(e.id, e.level - 1)}`, {
  4914. "counter-set": n
  4915. })), i.push(n), C += this.styleToString(`${A}:before`, {
  4916. content: this.levelTextToContent(e.levelText, e.suff, e.id, this.numFormatToCssValue(e.format)),
  4917. "counter-increment": l,
  4918. ...e.rStyle
  4919. });
  4920. } else
  4921. s = this.numFormatToCssValue(e.format);
  4922. C += this.styleToString(A, {
  4923. display: "list-item",
  4924. "list-style-position": "inside",
  4925. "list-style-type": s,
  4926. ...e.pStyle
  4927. });
  4928. }
  4929. return i.length > 0 && (C += this.styleToString(this.rootSelector, {
  4930. "counter-reset": i.join(" ")
  4931. })), this.createStyleElement(C);
  4932. }
  4933. renderStyles(I) {
  4934. var g = "";
  4935. const C = this.styleMap, i = ea(I.filter((l) => l.isDefault), (l) => l.target);
  4936. for (const l of I) {
  4937. var e = l.styles;
  4938. if (l.linked) {
  4939. var A = l.linked && C[l.linked];
  4940. A ? e = e.concat(A.styles) : this.options.debug && console.warn(`Can't find linked style ${l.linked}`);
  4941. }
  4942. for (const n of e) {
  4943. var s = `${l.target ?? ""}.${l.cssName}`;
  4944. l.target != n.target && (s += ` ${n.target}`), i[l.target] == l && (s = `.${this.className} ${l.target}, ` + s), g += this.styleToString(s, n.values);
  4945. }
  4946. }
  4947. return this.createStyleElement(g);
  4948. }
  4949. renderNotes(I, g, C) {
  4950. var i = I.map((A) => g[A]).filter((A) => A);
  4951. if (i.length > 0) {
  4952. var e = this.createElement("ol", null, this.renderElements(i));
  4953. C.appendChild(e);
  4954. }
  4955. }
  4956. renderElement(I) {
  4957. switch (I.type) {
  4958. case Yg.Paragraph:
  4959. return this.renderParagraph(I);
  4960. case Yg.BookmarkStart:
  4961. return this.renderBookmarkStart(I);
  4962. case Yg.BookmarkEnd:
  4963. return null;
  4964. case Yg.Run:
  4965. return this.renderRun(I);
  4966. case Yg.Table:
  4967. return this.renderTable(I);
  4968. case Yg.Row:
  4969. return this.renderTableRow(I);
  4970. case Yg.Cell:
  4971. return this.renderTableCell(I);
  4972. case Yg.Hyperlink:
  4973. return this.renderHyperlink(I);
  4974. case Yg.SmartTag:
  4975. return this.renderSmartTag(I);
  4976. case Yg.Drawing:
  4977. return this.renderDrawing(I);
  4978. case Yg.Image:
  4979. return this.renderImage(I);
  4980. case Yg.Text:
  4981. return this.renderText(I);
  4982. case Yg.Text:
  4983. return this.renderText(I);
  4984. case Yg.DeletedText:
  4985. return this.renderDeletedText(I);
  4986. case Yg.Tab:
  4987. return this.renderTab(I);
  4988. case Yg.Symbol:
  4989. return this.renderSymbol(I);
  4990. case Yg.Break:
  4991. return this.renderBreak(I);
  4992. case Yg.Footer:
  4993. return this.renderContainer(I, "footer");
  4994. case Yg.Header:
  4995. return this.renderContainer(I, "header");
  4996. case Yg.Footnote:
  4997. case Yg.Endnote:
  4998. return this.renderContainer(I, "li");
  4999. case Yg.FootnoteReference:
  5000. return this.renderFootnoteReference(I);
  5001. case Yg.EndnoteReference:
  5002. return this.renderEndnoteReference(I);
  5003. case Yg.NoBreakHyphen:
  5004. return this.createElement("wbr");
  5005. case Yg.VmlPicture:
  5006. return this.renderVmlPicture(I);
  5007. case Yg.VmlElement:
  5008. return this.renderVmlElement(I);
  5009. case Yg.MmlMath:
  5010. return this.renderContainerNS(I, OI.mathML, "math", { xmlns: OI.mathML });
  5011. case Yg.MmlMathParagraph:
  5012. return this.renderContainer(I, "span");
  5013. case Yg.MmlFraction:
  5014. return this.renderContainerNS(I, OI.mathML, "mfrac");
  5015. case Yg.MmlBase:
  5016. return this.renderContainerNS(I, OI.mathML, I.parent.type == Yg.MmlMatrixRow ? "mtd" : "mrow");
  5017. case Yg.MmlNumerator:
  5018. case Yg.MmlDenominator:
  5019. case Yg.MmlFunction:
  5020. case Yg.MmlLimit:
  5021. case Yg.MmlBox:
  5022. return this.renderContainerNS(I, OI.mathML, "mrow");
  5023. case Yg.MmlGroupChar:
  5024. return this.renderMmlGroupChar(I);
  5025. case Yg.MmlLimitLower:
  5026. return this.renderContainerNS(I, OI.mathML, "munder");
  5027. case Yg.MmlMatrix:
  5028. return this.renderContainerNS(I, OI.mathML, "mtable");
  5029. case Yg.MmlMatrixRow:
  5030. return this.renderContainerNS(I, OI.mathML, "mtr");
  5031. case Yg.MmlRadical:
  5032. return this.renderMmlRadical(I);
  5033. case Yg.MmlSuperscript:
  5034. return this.renderContainerNS(I, OI.mathML, "msup");
  5035. case Yg.MmlSubscript:
  5036. return this.renderContainerNS(I, OI.mathML, "msub");
  5037. case Yg.MmlDegree:
  5038. case Yg.MmlSuperArgument:
  5039. case Yg.MmlSubArgument:
  5040. return this.renderContainerNS(I, OI.mathML, "mn");
  5041. case Yg.MmlFunctionName:
  5042. return this.renderContainerNS(I, OI.mathML, "ms");
  5043. case Yg.MmlDelimiter:
  5044. return this.renderMmlDelimiter(I);
  5045. case Yg.MmlRun:
  5046. return this.renderMmlRun(I);
  5047. case Yg.MmlNary:
  5048. return this.renderMmlNary(I);
  5049. case Yg.MmlPreSubSuper:
  5050. return this.renderMmlPreSubSuper(I);
  5051. case Yg.MmlBar:
  5052. return this.renderMmlBar(I);
  5053. case Yg.MmlEquationArray:
  5054. return this.renderMllList(I);
  5055. case Yg.Inserted:
  5056. return this.renderInserted(I);
  5057. case Yg.Deleted:
  5058. return this.renderDeleted(I);
  5059. case Yg.CommentRangeStart:
  5060. return this.renderCommentRangeStart(I);
  5061. case Yg.CommentRangeEnd:
  5062. return this.renderCommentRangeEnd(I);
  5063. case Yg.CommentReference:
  5064. return this.renderCommentReference(I);
  5065. case Yg.AltChunk:
  5066. return this.renderAltChunk(I);
  5067. }
  5068. return null;
  5069. }
  5070. renderElements(I, g) {
  5071. if (I == null)
  5072. return null;
  5073. var C = I.flatMap((i) => this.renderElement(i)).filter((i) => i != null);
  5074. return g && JH(g, C), C;
  5075. }
  5076. renderContainer(I, g, C) {
  5077. return this.createElement(g, C, this.renderElements(I.children));
  5078. }
  5079. renderContainerNS(I, g, C, i) {
  5080. return this.createElementNS(g, C, i, this.renderElements(I.children));
  5081. }
  5082. renderParagraph(I) {
  5083. var e, A;
  5084. var g = this.renderContainer(I, "p");
  5085. const C = this.findStyle(I.styleName);
  5086. I.tabs ?? (I.tabs = (e = C == null ? void 0 : C.paragraphProps) == null ? void 0 : e.tabs), this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), this.renderCommonProperties(g.style, I);
  5087. const i = I.numbering ?? ((A = C == null ? void 0 : C.paragraphProps) == null ? void 0 : A.numbering);
  5088. return i && g.classList.add(this.numberingClass(i.id, i.level)), g;
  5089. }
  5090. renderRunProperties(I, g) {
  5091. this.renderCommonProperties(I, g);
  5092. }
  5093. renderCommonProperties(I, g) {
  5094. g != null && (g.color && (I.color = g.color), g.fontSize && (I["font-size"] = g.fontSize));
  5095. }
  5096. renderHyperlink(I) {
  5097. var g = this.renderContainer(I, "a");
  5098. this.renderStyleValues(I.cssStyle, g);
  5099. let C = "";
  5100. if (I.id) {
  5101. const i = this.document.documentPart.rels.find((e) => e.id == I.id && e.targetMode === "External");
  5102. C = (i == null ? void 0 : i.target) ?? C;
  5103. }
  5104. return I.anchor && (C += `#${I.anchor}`), g.href = C, g;
  5105. }
  5106. renderSmartTag(I) {
  5107. return this.renderContainer(I, "span");
  5108. }
  5109. renderCommentRangeStart(I) {
  5110. var i;
  5111. if (!this.options.renderComments)
  5112. return null;
  5113. const g = new Range();
  5114. (i = this.commentHighlight) == null || i.add(g);
  5115. const C = this.htmlDocument.createComment(`start of comment #${I.id}`);
  5116. return this.later(() => g.setStart(C, 0)), this.commentMap[I.id] = g, C;
  5117. }
  5118. renderCommentRangeEnd(I) {
  5119. if (!this.options.renderComments)
  5120. return null;
  5121. const g = this.commentMap[I.id], C = this.htmlDocument.createComment(`end of comment #${I.id}`);
  5122. return this.later(() => g == null ? void 0 : g.setEnd(C, 0)), C;
  5123. }
  5124. renderCommentReference(I) {
  5125. var A;
  5126. if (!this.options.renderComments)
  5127. return null;
  5128. var g = (A = this.document.commentsPart) == null ? void 0 : A.commentMap[I.id];
  5129. if (!g)
  5130. return null;
  5131. const C = new DocumentFragment(), i = this.createElement("span", { className: `${this.className}-comment-ref` }, ["💬"]), e = this.createElement("div", { className: `${this.className}-comment-popover` });
  5132. return this.renderCommentContent(g, e), C.appendChild(this.htmlDocument.createComment(`comment #${g.id} by ${g.author} on ${g.date}`)), C.appendChild(i), C.appendChild(e), C;
  5133. }
  5134. renderAltChunk(I) {
  5135. if (!this.options.renderAltChunks)
  5136. return null;
  5137. var g = this.createElement("iframe");
  5138. return this.tasks.push(this.document.loadAltChunk(I.id, this.currentPart).then((C) => {
  5139. g.srcdoc = C;
  5140. })), g;
  5141. }
  5142. renderCommentContent(I, g) {
  5143. g.appendChild(this.createElement("div", { className: `${this.className}-comment-author` }, [I.author])), g.appendChild(this.createElement("div", { className: `${this.className}-comment-date` }, [new Date(I.date).toLocaleString()])), this.renderElements(I.children, g);
  5144. }
  5145. renderDrawing(I) {
  5146. var g = this.renderContainer(I, "div");
  5147. return g.style.display = "inline-block", g.style.position = "relative", g.style.textIndent = "0px", this.renderStyleValues(I.cssStyle, g), g;
  5148. }
  5149. renderImage(I) {
  5150. let g = this.createElement("img");
  5151. return this.renderStyleValues(I.cssStyle, g), this.document && this.tasks.push(this.document.loadDocumentImage(I.src, this.currentPart).then((C) => {
  5152. g.src = C;
  5153. })), g;
  5154. }
  5155. renderText(I) {
  5156. return this.htmlDocument.createTextNode(I.text);
  5157. }
  5158. renderDeletedText(I) {
  5159. return this.options.renderEndnotes ? this.htmlDocument.createTextNode(I.text) : null;
  5160. }
  5161. renderBreak(I) {
  5162. return I.break == "textWrapping" ? this.createElement("br") : null;
  5163. }
  5164. renderInserted(I) {
  5165. return this.options.renderChanges ? this.renderContainer(I, "ins") : this.renderElements(I.children);
  5166. }
  5167. renderDeleted(I) {
  5168. return this.options.renderChanges ? this.renderContainer(I, "del") : null;
  5169. }
  5170. renderSymbol(I) {
  5171. var g = this.createElement("span");
  5172. return g.style.fontFamily = I.font, g.innerHTML = `&#x${I.char};`, g;
  5173. }
  5174. renderFootnoteReference(I) {
  5175. var g = this.createElement("sup");
  5176. return this.currentFootnoteIds.push(I.id), g.textContent = `${this.currentFootnoteIds.length}`, g;
  5177. }
  5178. renderEndnoteReference(I) {
  5179. var g = this.createElement("sup");
  5180. return this.currentEndnoteIds.push(I.id), g.textContent = `${this.currentEndnoteIds.length}`, g;
  5181. }
  5182. renderTab(I) {
  5183. var i;
  5184. var g = this.createElement("span");
  5185. if (g.innerHTML = "&emsp;", this.options.experimental) {
  5186. g.className = this.tabStopClass();
  5187. var C = (i = Sog(I, Yg.Paragraph)) == null ? void 0 : i.tabs;
  5188. this.currentTabs.push({ stops: C, span: g });
  5189. }
  5190. return g;
  5191. }
  5192. renderBookmarkStart(I) {
  5193. return this.createElement("span", { id: I.name });
  5194. }
  5195. renderRun(I) {
  5196. if (I.fieldRun)
  5197. return null;
  5198. const g = this.createElement("span");
  5199. if (I.id && (g.id = I.id), this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), I.verticalAlign) {
  5200. const C = this.createElement(I.verticalAlign);
  5201. this.renderElements(I.children, C), g.appendChild(C);
  5202. } else
  5203. this.renderElements(I.children, g);
  5204. return g;
  5205. }
  5206. renderTable(I) {
  5207. let g = this.createElement("table");
  5208. return this.tableCellPositions.push(this.currentCellPosition), this.tableVerticalMerges.push(this.currentVerticalMerge), this.currentVerticalMerge = {}, this.currentCellPosition = { col: 0, row: 0 }, I.columns && g.appendChild(this.renderTableColumns(I.columns)), this.renderClass(I, g), this.renderElements(I.children, g), this.renderStyleValues(I.cssStyle, g), this.currentVerticalMerge = this.tableVerticalMerges.pop(), this.currentCellPosition = this.tableCellPositions.pop(), g;
  5209. }
  5210. renderTableColumns(I) {
  5211. let g = this.createElement("colgroup");
  5212. for (let C of I) {
  5213. let i = this.createElement("col");
  5214. C.width && (i.style.width = C.width), g.appendChild(i);
  5215. }
  5216. return g;
  5217. }
  5218. renderTableRow(I) {
  5219. let g = this.renderContainer(I, "tr");
  5220. return this.currentCellPosition.col = 0, this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), this.currentCellPosition.row++, g;
  5221. }
  5222. renderTableCell(I) {
  5223. let g = this.renderContainer(I, "td");
  5224. const C = this.currentCellPosition.col;
  5225. return I.verticalMerge ? I.verticalMerge == "restart" ? (this.currentVerticalMerge[C] = g, g.rowSpan = 1) : this.currentVerticalMerge[C] && (this.currentVerticalMerge[C].rowSpan += 1, g.style.display = "none") : this.currentVerticalMerge[C] = null, this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), I.span && (g.colSpan = I.span), this.currentCellPosition.col += g.colSpan, g;
  5226. }
  5227. renderVmlPicture(I) {
  5228. return this.renderContainer(I, "div");
  5229. }
  5230. renderVmlElement(I) {
  5231. var i, e;
  5232. var g = this.createSvgElement("svg");
  5233. g.setAttribute("style", I.cssStyleText);
  5234. const C = this.renderVmlChildElement(I);
  5235. return (i = I.imageHref) != null && i.id && this.tasks.push((e = this.document) == null ? void 0 : e.loadDocumentImage(I.imageHref.id, this.currentPart).then((A) => C.setAttribute("href", A))), g.appendChild(C), requestAnimationFrame(() => {
  5236. const A = g.firstElementChild.getBBox();
  5237. g.setAttribute("width", `${Math.ceil(A.x + A.width)}`), g.setAttribute("height", `${Math.ceil(A.y + A.height)}`);
  5238. }), g;
  5239. }
  5240. renderVmlChildElement(I) {
  5241. const g = this.createSvgElement(I.tagName);
  5242. Object.entries(I.attrs).forEach(([C, i]) => g.setAttribute(C, i));
  5243. for (let C of I.children)
  5244. C.type == Yg.VmlElement ? g.appendChild(this.renderVmlChildElement(C)) : g.appendChild(...Ru(this.renderElement(C)));
  5245. return g;
  5246. }
  5247. renderMmlRadical(I) {
  5248. var i;
  5249. const g = I.children.find((e) => e.type == Yg.MmlBase);
  5250. if ((i = I.props) != null && i.hideDegree)
  5251. return this.createElementNS(OI.mathML, "msqrt", null, this.renderElements([g]));
  5252. const C = I.children.find((e) => e.type == Yg.MmlDegree);
  5253. return this.createElementNS(OI.mathML, "mroot", null, this.renderElements([g, C]));
  5254. }
  5255. renderMmlDelimiter(I) {
  5256. const g = [];
  5257. return g.push(this.createElementNS(OI.mathML, "mo", null, [I.props.beginChar ?? "("])), g.push(...this.renderElements(I.children)), g.push(this.createElementNS(OI.mathML, "mo", null, [I.props.endChar ?? ")"])), this.createElementNS(OI.mathML, "mrow", null, g);
  5258. }
  5259. renderMmlNary(I) {
  5260. var n;
  5261. const g = [], C = ea(I.children, (a) => a.type), i = C[Yg.MmlSuperArgument], e = C[Yg.MmlSubArgument], A = i ? this.createElementNS(OI.mathML, "mo", null, Ru(this.renderElement(i))) : null, s = e ? this.createElementNS(OI.mathML, "mo", null, Ru(this.renderElement(e))) : null, l = this.createElementNS(OI.mathML, "mo", null, [((n = I.props) == null ? void 0 : n.char) ?? "∫"]);
  5262. return A || s ? g.push(this.createElementNS(OI.mathML, "munderover", null, [l, s, A])) : A ? g.push(this.createElementNS(OI.mathML, "mover", null, [l, A])) : s ? g.push(this.createElementNS(OI.mathML, "munder", null, [l, s])) : g.push(l), g.push(...this.renderElements(C[Yg.MmlBase].children)), this.createElementNS(OI.mathML, "mrow", null, g);
  5263. }
  5264. renderMmlPreSubSuper(I) {
  5265. const g = [], C = ea(I.children, (n) => n.type), i = C[Yg.MmlSuperArgument], e = C[Yg.MmlSubArgument], A = i ? this.createElementNS(OI.mathML, "mo", null, Ru(this.renderElement(i))) : null, s = e ? this.createElementNS(OI.mathML, "mo", null, Ru(this.renderElement(e))) : null, l = this.createElementNS(OI.mathML, "mo", null);
  5266. return g.push(this.createElementNS(OI.mathML, "msubsup", null, [l, s, A])), g.push(...this.renderElements(C[Yg.MmlBase].children)), this.createElementNS(OI.mathML, "mrow", null, g);
  5267. }
  5268. renderMmlGroupChar(I) {
  5269. const g = I.props.verticalJustification === "bot" ? "mover" : "munder", C = this.renderContainerNS(I, OI.mathML, g);
  5270. return I.props.char && C.appendChild(this.createElementNS(OI.mathML, "mo", null, [I.props.char])), C;
  5271. }
  5272. renderMmlBar(I) {
  5273. const g = this.renderContainerNS(I, OI.mathML, "mrow");
  5274. switch (I.props.position) {
  5275. case "top":
  5276. g.style.textDecoration = "overline";
  5277. break;
  5278. case "bottom":
  5279. g.style.textDecoration = "underline";
  5280. break;
  5281. }
  5282. return g;
  5283. }
  5284. renderMmlRun(I) {
  5285. const g = this.createElementNS(OI.mathML, "ms", null, this.renderElements(I.children));
  5286. return this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), g;
  5287. }
  5288. renderMllList(I) {
  5289. const g = this.createElementNS(OI.mathML, "mtable");
  5290. this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g);
  5291. for (let C of this.renderElements(I.children))
  5292. g.appendChild(this.createElementNS(OI.mathML, "mtr", null, [
  5293. this.createElementNS(OI.mathML, "mtd", null, [C])
  5294. ]));
  5295. return g;
  5296. }
  5297. renderStyleValues(I, g) {
  5298. for (let C in I)
  5299. C.startsWith("$") ? g.setAttribute(C.slice(1), I[C]) : g.style[C] = I[C];
  5300. }
  5301. renderClass(I, g) {
  5302. I.className && (g.className = I.className), I.styleName && g.classList.add(this.processStyleName(I.styleName));
  5303. }
  5304. findStyle(I) {
  5305. var g;
  5306. return I && ((g = this.styleMap) == null ? void 0 : g[I]);
  5307. }
  5308. numberingClass(I, g) {
  5309. return `${this.className}-num-${I}-${g}`;
  5310. }
  5311. tabStopClass() {
  5312. return `${this.className}-tab-stop`;
  5313. }
  5314. styleToString(I, g, C = null) {
  5315. let i = `${I} {\r
  5316. `;
  5317. for (const e in g)
  5318. e.startsWith("$") || (i += ` ${e}: ${g[e]};\r
  5319. `);
  5320. return C && (i += C), i + `}\r
  5321. `;
  5322. }
  5323. numberingCounter(I, g) {
  5324. return `${this.className}-num-${I}-${g}`;
  5325. }
  5326. levelTextToContent(I, g, C, i) {
  5327. const e = {
  5328. tab: "\\9",
  5329. space: "\\a0"
  5330. };
  5331. var A = I.replace(/%\d*/g, (s) => {
  5332. let l = parseInt(s.substring(1), 10) - 1;
  5333. return `"counter(${this.numberingCounter(C, l)}, ${i})"`;
  5334. });
  5335. return `"${A}${e[g] ?? ""}"`;
  5336. }
  5337. numFormatToCssValue(I) {
  5338. var g = {
  5339. none: "none",
  5340. bullet: "disc",
  5341. decimal: "decimal",
  5342. lowerLetter: "lower-alpha",
  5343. upperLetter: "upper-alpha",
  5344. lowerRoman: "lower-roman",
  5345. upperRoman: "upper-roman",
  5346. decimalZero: "decimal-leading-zero",
  5347. aiueo: "katakana",
  5348. aiueoFullWidth: "katakana",
  5349. chineseCounting: "simp-chinese-informal",
  5350. chineseCountingThousand: "simp-chinese-informal",
  5351. chineseLegalSimplified: "simp-chinese-formal",
  5352. chosung: "hangul-consonant",
  5353. ideographDigital: "cjk-ideographic",
  5354. ideographTraditional: "cjk-heavenly-stem",
  5355. ideographLegalTraditional: "trad-chinese-formal",
  5356. ideographZodiac: "cjk-earthly-branch",
  5357. iroha: "katakana-iroha",
  5358. irohaFullWidth: "katakana-iroha",
  5359. japaneseCounting: "japanese-informal",
  5360. japaneseDigitalTenThousand: "cjk-decimal",
  5361. japaneseLegal: "japanese-formal",
  5362. thaiNumbers: "thai",
  5363. koreanCounting: "korean-hangul-formal",
  5364. koreanDigital: "korean-hangul-formal",
  5365. koreanDigital2: "korean-hanja-informal",
  5366. hebrew1: "hebrew",
  5367. hebrew2: "hebrew",
  5368. hindiNumbers: "devanagari",
  5369. ganada: "hangul",
  5370. taiwaneseCounting: "cjk-ideographic",
  5371. taiwaneseCountingThousand: "cjk-ideographic",
  5372. taiwaneseDigital: "cjk-decimal"
  5373. };
  5374. return g[I] ?? I;
  5375. }
  5376. refreshTabStops() {
  5377. this.options.experimental && setTimeout(() => {
  5378. const I = fog();
  5379. for (let g of this.currentTabs)
  5380. Hog(g.span, g.stops, this.defaultTabSize, I);
  5381. }, 500);
  5382. }
  5383. createElementNS(I, g, C, i) {
  5384. var e = I ? this.htmlDocument.createElementNS(I, g) : this.htmlDocument.createElement(g);
  5385. return Object.assign(e, C), i && JH(e, i), e;
  5386. }
  5387. createElement(I, g, C) {
  5388. return this.createElementNS(void 0, I, g, C);
  5389. }
  5390. createSvgElement(I, g, C) {
  5391. return this.createElementNS(OI.svg, I, g, C);
  5392. }
  5393. createStyleElement(I) {
  5394. return this.createElement("style", { innerHTML: I });
  5395. }
  5396. createComment(I) {
  5397. return this.htmlDocument.createComment(I);
  5398. }
  5399. later(I) {
  5400. this.postRenderTasks.push(I);
  5401. }
  5402. }
  5403. function P6(t) {
  5404. t.innerHTML = "";
  5405. }
  5406. function JH(t, I) {
  5407. I.forEach((g) => t.appendChild(Zag(g) ? document.createTextNode(g) : g));
  5408. }
  5409. function Sog(t, I) {
  5410. for (var g = t.parent; g != null && g.type != I; )
  5411. g = g.parent;
  5412. return g;
  5413. }
  5414. const o9 = {
  5415. ignoreHeight: !1,
  5416. ignoreWidth: !1,
  5417. ignoreFonts: !1,
  5418. breakPages: !0,
  5419. debug: !1,
  5420. experimental: !1,
  5421. className: "docx",
  5422. inWrapper: !0,
  5423. hideWrapperOnPrint: !1,
  5424. trimXmlDeclaration: !0,
  5425. ignoreLastRenderedPageBreak: !0,
  5426. renderHeaders: !0,
  5427. renderFooters: !0,
  5428. renderFootnotes: !0,
  5429. renderEndnotes: !0,
  5430. useBase64URL: !1,
  5431. renderChanges: !1,
  5432. renderComments: !1,
  5433. renderAltChunks: !0
  5434. };
  5435. function Dog(t, I) {
  5436. const g = { ...o9, ...I };
  5437. return a9.load(t, new Vog(g), g);
  5438. }
  5439. async function Kog(t, I, g, C) {
  5440. const i = { ...o9, ...C };
  5441. return await new Xog(window.document).render(t, I, g, i);
  5442. }
  5443. async function Fog(t, I, g, C) {
  5444. const i = await Dog(t, C);
  5445. return await Kog(i, I, g, C), i;
  5446. }
  5447. var mm = {};
  5448. mm.d = (t, I) => {
  5449. for (var g in I)
  5450. mm.o(I, g) && !mm.o(t, g) && Object.defineProperty(t, g, { enumerable: !0, get: I[g] });
  5451. };
  5452. mm.o = (t, I) => Object.prototype.hasOwnProperty.call(t, I);
  5453. var pI = globalThis.pdfjsLib = {};
  5454. mm.d(pI, {
  5455. AbortException: () => (
  5456. /* reexport */
  5457. Ea
  5458. ),
  5459. AnnotationEditorLayer: () => (
  5460. /* reexport */
  5461. tD
  5462. ),
  5463. AnnotationEditorParamsType: () => (
  5464. /* reexport */
  5465. iC
  5466. ),
  5467. AnnotationEditorType: () => (
  5468. /* reexport */
  5469. XI
  5470. ),
  5471. AnnotationEditorUIManager: () => (
  5472. /* reexport */
  5473. dd
  5474. ),
  5475. AnnotationLayer: () => (
  5476. /* reexport */
  5477. HS
  5478. ),
  5479. AnnotationMode: () => (
  5480. /* reexport */
  5481. la
  5482. ),
  5483. AnnotationType: () => (
  5484. /* reexport */
  5485. dt
  5486. ),
  5487. ColorPicker: () => (
  5488. /* reexport */
  5489. sV
  5490. ),
  5491. DOMSVGFactory: () => (
  5492. /* reexport */
  5493. eV
  5494. ),
  5495. DrawLayer: () => (
  5496. /* reexport */
  5497. AD
  5498. ),
  5499. FeatureTest: () => (
  5500. /* reexport */
  5501. Ai
  5502. ),
  5503. GlobalWorkerOptions: () => (
  5504. /* reexport */
  5505. Ql
  5506. ),
  5507. ImageKind: () => (
  5508. /* reexport */
  5509. aN
  5510. ),
  5511. InvalidPDFException: () => (
  5512. /* reexport */
  5513. QX
  5514. ),
  5515. MathClamp: () => (
  5516. /* reexport */
  5517. fi
  5518. ),
  5519. OPS: () => (
  5520. /* reexport */
  5521. IV
  5522. ),
  5523. OutputScale: () => (
  5524. /* reexport */
  5525. In
  5526. ),
  5527. PDFDataRangeTransport: () => (
  5528. /* reexport */
  5529. Hgg
  5530. ),
  5531. PDFDateString: () => (
  5532. /* reexport */
  5533. b9
  5534. ),
  5535. PDFWorker: () => (
  5536. /* reexport */
  5537. ch
  5538. ),
  5539. PasswordResponses: () => (
  5540. /* reexport */
  5541. Jog
  5542. ),
  5543. PermissionFlag: () => (
  5544. /* reexport */
  5545. zog
  5546. ),
  5547. PixelsPerInch: () => (
  5548. /* reexport */
  5549. Pa
  5550. ),
  5551. RenderingCancelledException: () => (
  5552. /* reexport */
  5553. r9
  5554. ),
  5555. ResponseException: () => (
  5556. /* reexport */
  5557. CV
  5558. ),
  5559. SignatureExtractor: () => (
  5560. /* reexport */
  5561. Ol
  5562. ),
  5563. SupportedImageMimeTypes: () => (
  5564. /* reexport */
  5565. UX
  5566. ),
  5567. TextLayer: () => (
  5568. /* reexport */
  5569. Mm
  5570. ),
  5571. TouchManager: () => (
  5572. /* reexport */
  5573. iV
  5574. ),
  5575. Util: () => (
  5576. /* reexport */
  5577. AI
  5578. ),
  5579. VerbosityLevel: () => (
  5580. /* reexport */
  5581. PV
  5582. ),
  5583. XfaLayer: () => (
  5584. /* reexport */
  5585. Sgg
  5586. ),
  5587. build: () => (
  5588. /* reexport */
  5589. ldg
  5590. ),
  5591. createValidAbsoluteUrl: () => (
  5592. /* reexport */
  5593. xog
  5594. ),
  5595. fetchData: () => (
  5596. /* reexport */
  5597. AG
  5598. ),
  5599. getDocument: () => (
  5600. /* reexport */
  5601. _cg
  5602. ),
  5603. getFilenameFromUrl: () => (
  5604. /* reexport */
  5605. $og
  5606. ),
  5607. getPdfFilenameFromUrl: () => (
  5608. /* reexport */
  5609. gcg
  5610. ),
  5611. getUuid: () => (
  5612. /* reexport */
  5613. H$
  5614. ),
  5615. getXfaPageViewport: () => (
  5616. /* reexport */
  5617. Icg
  5618. ),
  5619. isDataScheme: () => (
  5620. /* reexport */
  5621. $V
  5622. ),
  5623. isPdfFile: () => (
  5624. /* reexport */
  5625. h9
  5626. ),
  5627. isValidExplicitDest: () => (
  5628. /* reexport */
  5629. Idg
  5630. ),
  5631. noContextMenu: () => (
  5632. /* reexport */
  5633. zA
  5634. ),
  5635. normalizeUnicode: () => (
  5636. /* reexport */
  5637. Pog
  5638. ),
  5639. setLayerDimensions: () => (
  5640. /* reexport */
  5641. cd
  5642. ),
  5643. shadow: () => (
  5644. /* reexport */
  5645. UI
  5646. ),
  5647. stopEvent: () => (
  5648. /* reexport */
  5649. ht
  5650. ),
  5651. version: () => (
  5652. /* reexport */
  5653. sdg
  5654. )
  5655. });
  5656. const $t = typeof process == "object" && process + "" == "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"), R$ = [1, 0, 0, 1, 0, 0], jX = [1e-3, 0, 0, 1e-3, 0, 0], LH = 1.35, ye = {
  5657. ANY: 1,
  5658. DISPLAY: 2,
  5659. PRINT: 4,
  5660. ANNOTATIONS_FORMS: 16,
  5661. ANNOTATIONS_STORAGE: 32,
  5662. ANNOTATIONS_DISABLE: 64,
  5663. IS_EDITING: 128,
  5664. OPLIST: 256
  5665. }, la = {
  5666. DISABLE: 0,
  5667. ENABLE: 1,
  5668. ENABLE_FORMS: 2,
  5669. ENABLE_STORAGE: 3
  5670. }, kog = "pdfjs_internal_editor_", XI = {
  5671. DISABLE: -1,
  5672. NONE: 0,
  5673. FREETEXT: 3,
  5674. HIGHLIGHT: 9,
  5675. STAMP: 13,
  5676. INK: 15,
  5677. SIGNATURE: 101
  5678. }, iC = {
  5679. RESIZE: 1,
  5680. CREATE: 2,
  5681. FREETEXT_SIZE: 11,
  5682. FREETEXT_COLOR: 12,
  5683. FREETEXT_OPACITY: 13,
  5684. INK_COLOR: 21,
  5685. INK_THICKNESS: 22,
  5686. INK_OPACITY: 23,
  5687. HIGHLIGHT_COLOR: 31,
  5688. HIGHLIGHT_DEFAULT_COLOR: 32,
  5689. HIGHLIGHT_THICKNESS: 33,
  5690. HIGHLIGHT_FREE: 34,
  5691. HIGHLIGHT_SHOW_ALL: 35,
  5692. DRAW_STEP: 41
  5693. }, zog = {
  5694. PRINT: 4,
  5695. MODIFY_CONTENTS: 8,
  5696. COPY: 16,
  5697. MODIFY_ANNOTATIONS: 32,
  5698. FILL_INTERACTIVE_FORMS: 256,
  5699. COPY_FOR_ACCESSIBILITY: 512,
  5700. ASSEMBLE: 1024,
  5701. PRINT_HIGH_QUALITY: 2048
  5702. }, hi = {
  5703. FILL: 0,
  5704. STROKE: 1,
  5705. FILL_STROKE: 2,
  5706. INVISIBLE: 3,
  5707. FILL_STROKE_MASK: 3,
  5708. ADD_TO_PATH_FLAG: 4
  5709. }, aN = {
  5710. GRAYSCALE_1BPP: 1,
  5711. RGB_24BPP: 2,
  5712. RGBA_32BPP: 3
  5713. }, dt = {
  5714. TEXT: 1,
  5715. LINK: 2,
  5716. FREETEXT: 3,
  5717. LINE: 4,
  5718. SQUARE: 5,
  5719. CIRCLE: 6,
  5720. POLYGON: 7,
  5721. POLYLINE: 8,
  5722. HIGHLIGHT: 9,
  5723. UNDERLINE: 10,
  5724. SQUIGGLY: 11,
  5725. STRIKEOUT: 12,
  5726. STAMP: 13,
  5727. CARET: 14,
  5728. INK: 15,
  5729. POPUP: 16,
  5730. FILEATTACHMENT: 17,
  5731. SOUND: 18,
  5732. MOVIE: 19,
  5733. WIDGET: 20,
  5734. SCREEN: 21,
  5735. PRINTERMARK: 22,
  5736. TRAPNET: 23,
  5737. WATERMARK: 24,
  5738. THREED: 25,
  5739. REDACT: 26
  5740. }, Qr = {
  5741. SOLID: 1,
  5742. DASHED: 2,
  5743. BEVELED: 3,
  5744. INSET: 4,
  5745. UNDERLINE: 5
  5746. }, PV = {
  5747. ERRORS: 0,
  5748. WARNINGS: 1,
  5749. INFOS: 5
  5750. }, IV = {
  5751. dependency: 1,
  5752. setLineWidth: 2,
  5753. setLineCap: 3,
  5754. setLineJoin: 4,
  5755. setMiterLimit: 5,
  5756. setDash: 6,
  5757. setRenderingIntent: 7,
  5758. setFlatness: 8,
  5759. setGState: 9,
  5760. save: 10,
  5761. restore: 11,
  5762. transform: 12,
  5763. moveTo: 13,
  5764. lineTo: 14,
  5765. curveTo: 15,
  5766. curveTo2: 16,
  5767. curveTo3: 17,
  5768. closePath: 18,
  5769. rectangle: 19,
  5770. stroke: 20,
  5771. closeStroke: 21,
  5772. fill: 22,
  5773. eoFill: 23,
  5774. fillStroke: 24,
  5775. eoFillStroke: 25,
  5776. closeFillStroke: 26,
  5777. closeEOFillStroke: 27,
  5778. endPath: 28,
  5779. clip: 29,
  5780. eoClip: 30,
  5781. beginText: 31,
  5782. endText: 32,
  5783. setCharSpacing: 33,
  5784. setWordSpacing: 34,
  5785. setHScale: 35,
  5786. setLeading: 36,
  5787. setFont: 37,
  5788. setTextRenderingMode: 38,
  5789. setTextRise: 39,
  5790. moveText: 40,
  5791. setLeadingMoveText: 41,
  5792. setTextMatrix: 42,
  5793. nextLine: 43,
  5794. showText: 44,
  5795. showSpacedText: 45,
  5796. nextLineShowText: 46,
  5797. nextLineSetSpacingShowText: 47,
  5798. setCharWidth: 48,
  5799. setCharWidthAndBounds: 49,
  5800. setStrokeColorSpace: 50,
  5801. setFillColorSpace: 51,
  5802. setStrokeColor: 52,
  5803. setStrokeColorN: 53,
  5804. setFillColor: 54,
  5805. setFillColorN: 55,
  5806. setStrokeGray: 56,
  5807. setFillGray: 57,
  5808. setStrokeRGBColor: 58,
  5809. setFillRGBColor: 59,
  5810. setStrokeCMYKColor: 60,
  5811. setFillCMYKColor: 61,
  5812. shadingFill: 62,
  5813. beginInlineImage: 63,
  5814. beginImageData: 64,
  5815. endInlineImage: 65,
  5816. paintXObject: 66,
  5817. markPoint: 67,
  5818. markPointProps: 68,
  5819. beginMarkedContent: 69,
  5820. beginMarkedContentProps: 70,
  5821. endMarkedContent: 71,
  5822. beginCompat: 72,
  5823. endCompat: 73,
  5824. paintFormXObjectBegin: 74,
  5825. paintFormXObjectEnd: 75,
  5826. beginGroup: 76,
  5827. endGroup: 77,
  5828. beginAnnotation: 80,
  5829. endAnnotation: 81,
  5830. paintImageMaskXObject: 83,
  5831. paintImageMaskXObjectGroup: 84,
  5832. paintImageXObject: 85,
  5833. paintInlineImageXObject: 86,
  5834. paintInlineImageXObjectGroup: 87,
  5835. paintImageXObjectRepeat: 88,
  5836. paintImageMaskXObjectRepeat: 89,
  5837. paintSolidColorImageMask: 90,
  5838. constructPath: 91,
  5839. setStrokeTransparent: 92,
  5840. setFillTransparent: 93
  5841. }, FY = {
  5842. moveTo: 0,
  5843. lineTo: 1,
  5844. curveTo: 2,
  5845. closePath: 3
  5846. }, Jog = {
  5847. NEED_PASSWORD: 1,
  5848. INCORRECT_PASSWORD: 2
  5849. };
  5850. let _V = PV.WARNINGS;
  5851. function Log(t) {
  5852. Number.isInteger(t) && (_V = t);
  5853. }
  5854. function vog() {
  5855. return _V;
  5856. }
  5857. function qV(t) {
  5858. _V >= PV.INFOS && console.log(`Info: ${t}`);
  5859. }
  5860. function DI(t) {
  5861. _V >= PV.WARNINGS && console.log(`Warning: ${t}`);
  5862. }
  5863. function BC(t) {
  5864. throw new Error(t);
  5865. }
  5866. function ut(t, I) {
  5867. t || BC(I);
  5868. }
  5869. function Tog(t) {
  5870. switch (t == null ? void 0 : t.protocol) {
  5871. case "http:":
  5872. case "https:":
  5873. case "ftp:":
  5874. case "mailto:":
  5875. case "tel:":
  5876. return !0;
  5877. default:
  5878. return !1;
  5879. }
  5880. }
  5881. function xog(t, I = null, g = null) {
  5882. if (!t)
  5883. return null;
  5884. if (g && typeof t == "string") {
  5885. if (g.addDefaultProtocol && t.startsWith("www.")) {
  5886. const i = t.match(/\./g);
  5887. (i == null ? void 0 : i.length) >= 2 && (t = `http://${t}`);
  5888. }
  5889. if (g.tryConvertEncoding)
  5890. try {
  5891. t = Eog(t);
  5892. } catch {
  5893. }
  5894. }
  5895. const C = I ? URL.parse(t, I) : URL.parse(t);
  5896. return Tog(C) ? C : null;
  5897. }
  5898. function UI(t, I, g, C = !1) {
  5899. return Object.defineProperty(t, I, {
  5900. value: g,
  5901. enumerable: !C,
  5902. configurable: !0,
  5903. writable: !1
  5904. }), g;
  5905. }
  5906. const ud = function() {
  5907. function I(g, C) {
  5908. this.message = g, this.name = C;
  5909. }
  5910. return I.prototype = new Error(), I.constructor = I, I;
  5911. }();
  5912. class _6 extends ud {
  5913. constructor(I, g) {
  5914. super(I, "PasswordException"), this.code = g;
  5915. }
  5916. }
  5917. class vH extends ud {
  5918. constructor(I, g) {
  5919. super(I, "UnknownErrorException"), this.details = g;
  5920. }
  5921. }
  5922. class QX extends ud {
  5923. constructor(I) {
  5924. super(I, "InvalidPDFException");
  5925. }
  5926. }
  5927. class CV extends ud {
  5928. constructor(I, g, C) {
  5929. super(I, "ResponseException"), this.status = g, this.missing = C;
  5930. }
  5931. }
  5932. class jog extends ud {
  5933. constructor(I) {
  5934. super(I, "FormatError");
  5935. }
  5936. }
  5937. class Ea extends ud {
  5938. constructor(I) {
  5939. super(I, "AbortException");
  5940. }
  5941. }
  5942. function f$(t) {
  5943. (typeof t != "object" || (t == null ? void 0 : t.length) === void 0) && BC("Invalid argument for bytesToString");
  5944. const I = t.length, g = 8192;
  5945. if (I < g)
  5946. return String.fromCharCode.apply(null, t);
  5947. const C = [];
  5948. for (let i = 0; i < I; i += g) {
  5949. const e = Math.min(i + g, I), A = t.subarray(i, e);
  5950. C.push(String.fromCharCode.apply(null, A));
  5951. }
  5952. return C.join("");
  5953. }
  5954. function eG(t) {
  5955. typeof t != "string" && BC("Invalid argument for stringToBytes");
  5956. const I = t.length, g = new Uint8Array(I);
  5957. for (let C = 0; C < I; ++C)
  5958. g[C] = t.charCodeAt(C) & 255;
  5959. return g;
  5960. }
  5961. function Qog(t) {
  5962. return String.fromCharCode(t >> 24 & 255, t >> 16 & 255, t >> 8 & 255, t & 255);
  5963. }
  5964. function c9(t) {
  5965. const I = /* @__PURE__ */ Object.create(null);
  5966. for (const [g, C] of t)
  5967. I[g] = C;
  5968. return I;
  5969. }
  5970. function Oog() {
  5971. const t = new Uint8Array(4);
  5972. return t[0] = 1, new Uint32Array(t.buffer, 0, 1)[0] === 1;
  5973. }
  5974. function Uog() {
  5975. try {
  5976. return new Function(""), !0;
  5977. } catch {
  5978. return !1;
  5979. }
  5980. }
  5981. class Ai {
  5982. static get isLittleEndian() {
  5983. return UI(this, "isLittleEndian", Oog());
  5984. }
  5985. static get isEvalSupported() {
  5986. return UI(this, "isEvalSupported", Uog());
  5987. }
  5988. static get isOffscreenCanvasSupported() {
  5989. return UI(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas < "u");
  5990. }
  5991. static get isImageDecoderSupported() {
  5992. return UI(this, "isImageDecoderSupported", typeof ImageDecoder < "u");
  5993. }
  5994. static get platform() {
  5995. if (typeof navigator < "u" && typeof (navigator == null ? void 0 : navigator.platform) == "string" && typeof (navigator == null ? void 0 : navigator.userAgent) == "string") {
  5996. const {
  5997. platform: I,
  5998. userAgent: g
  5999. } = navigator;
  6000. return UI(this, "platform", {
  6001. isAndroid: g.includes("Android"),
  6002. isLinux: I.includes("Linux"),
  6003. isMac: I.includes("Mac"),
  6004. isWindows: I.includes("Win"),
  6005. isFirefox: g.includes("Firefox")
  6006. });
  6007. }
  6008. return UI(this, "platform", {
  6009. isAndroid: !1,
  6010. isLinux: !1,
  6011. isMac: !1,
  6012. isWindows: !1,
  6013. isFirefox: !1
  6014. });
  6015. }
  6016. static get isCSSRoundSupported() {
  6017. var I, g;
  6018. return UI(this, "isCSSRoundSupported", (g = (I = globalThis.CSS) == null ? void 0 : I.supports) == null ? void 0 : g.call(I, "width: round(1.5px, 1px)"));
  6019. }
  6020. }
  6021. const TH = Array.from(Array(256).keys(), (t) => t.toString(16).padStart(2, "0"));
  6022. var $l, oN, OX;
  6023. class AI {
  6024. static makeHexColor(I, g, C) {
  6025. return `#${TH[I]}${TH[g]}${TH[C]}`;
  6026. }
  6027. static transform(I, g) {
  6028. return [I[0] * g[0] + I[2] * g[1], I[1] * g[0] + I[3] * g[1], I[0] * g[2] + I[2] * g[3], I[1] * g[2] + I[3] * g[3], I[0] * g[4] + I[2] * g[5] + I[4], I[1] * g[4] + I[3] * g[5] + I[5]];
  6029. }
  6030. static applyTransform(I, g) {
  6031. const C = I[0] * g[0] + I[1] * g[2] + g[4], i = I[0] * g[1] + I[1] * g[3] + g[5];
  6032. return [C, i];
  6033. }
  6034. static applyInverseTransform(I, g) {
  6035. const C = g[0] * g[3] - g[1] * g[2], i = (I[0] * g[3] - I[1] * g[2] + g[2] * g[5] - g[4] * g[3]) / C, e = (-I[0] * g[1] + I[1] * g[0] + g[4] * g[1] - g[5] * g[0]) / C;
  6036. return [i, e];
  6037. }
  6038. static getAxialAlignedBoundingBox(I, g) {
  6039. const C = this.applyTransform(I, g), i = this.applyTransform(I.slice(2, 4), g), e = this.applyTransform([I[0], I[3]], g), A = this.applyTransform([I[2], I[1]], g);
  6040. return [Math.min(C[0], i[0], e[0], A[0]), Math.min(C[1], i[1], e[1], A[1]), Math.max(C[0], i[0], e[0], A[0]), Math.max(C[1], i[1], e[1], A[1])];
  6041. }
  6042. static inverseTransform(I) {
  6043. const g = I[0] * I[3] - I[1] * I[2];
  6044. return [I[3] / g, -I[1] / g, -I[2] / g, I[0] / g, (I[2] * I[5] - I[4] * I[3]) / g, (I[4] * I[1] - I[5] * I[0]) / g];
  6045. }
  6046. static singularValueDecompose2dScale(I) {
  6047. const g = [I[0], I[2], I[1], I[3]], C = I[0] * g[0] + I[1] * g[2], i = I[0] * g[1] + I[1] * g[3], e = I[2] * g[0] + I[3] * g[2], A = I[2] * g[1] + I[3] * g[3], s = (C + A) / 2, l = Math.sqrt((C + A) ** 2 - 4 * (C * A - e * i)) / 2, n = s + l || 1, a = s - l || 1;
  6048. return [Math.sqrt(n), Math.sqrt(a)];
  6049. }
  6050. static normalizeRect(I) {
  6051. const g = I.slice(0);
  6052. return I[0] > I[2] && (g[0] = I[2], g[2] = I[0]), I[1] > I[3] && (g[1] = I[3], g[3] = I[1]), g;
  6053. }
  6054. static intersect(I, g) {
  6055. const C = Math.max(Math.min(I[0], I[2]), Math.min(g[0], g[2])), i = Math.min(Math.max(I[0], I[2]), Math.max(g[0], g[2]));
  6056. if (C > i)
  6057. return null;
  6058. const e = Math.max(Math.min(I[1], I[3]), Math.min(g[1], g[3])), A = Math.min(Math.max(I[1], I[3]), Math.max(g[1], g[3]));
  6059. return e > A ? null : [C, e, i, A];
  6060. }
  6061. static pointBoundingBox(I, g, C) {
  6062. C[0] = Math.min(C[0], I), C[1] = Math.min(C[1], g), C[2] = Math.max(C[2], I), C[3] = Math.max(C[3], g);
  6063. }
  6064. static rectBoundingBox(I, g, C, i, e) {
  6065. e[0] = Math.min(e[0], I, C), e[1] = Math.min(e[1], g, i), e[2] = Math.max(e[2], I, C), e[3] = Math.max(e[3], g, i);
  6066. }
  6067. static bezierBoundingBox(I, g, C, i, e, A, s, l, n) {
  6068. n[0] = Math.min(n[0], I, s), n[1] = Math.min(n[1], g, l), n[2] = Math.max(n[2], I, s), n[3] = Math.max(n[3], g, l), ig(this, $l, OX).call(this, I, C, e, s, g, i, A, l, 3 * (-I + 3 * (C - e) + s), 6 * (I - 2 * C + e), 3 * (C - I), n), ig(this, $l, OX).call(this, I, C, e, s, g, i, A, l, 3 * (-g + 3 * (i - A) + l), 6 * (g - 2 * i + A), 3 * (i - g), n);
  6069. }
  6070. }
  6071. $l = new WeakSet(), oN = function(I, g, C, i, e, A, s, l, n, a) {
  6072. if (n <= 0 || n >= 1)
  6073. return;
  6074. const d = 1 - n, o = n * n, c = o * n, r = d * (d * (d * I + 3 * n * g) + 3 * o * C) + c * i, h = d * (d * (d * e + 3 * n * A) + 3 * o * s) + c * l;
  6075. a[0] = Math.min(a[0], r), a[1] = Math.min(a[1], h), a[2] = Math.max(a[2], r), a[3] = Math.max(a[3], h);
  6076. }, OX = function(I, g, C, i, e, A, s, l, n, a, d, o) {
  6077. if (Math.abs(n) < 1e-12) {
  6078. Math.abs(a) >= 1e-12 && ig(this, $l, oN).call(this, I, g, C, i, e, A, s, l, -d / a, o);
  6079. return;
  6080. }
  6081. const c = a ** 2 - 4 * d * n;
  6082. if (c < 0)
  6083. return;
  6084. const r = Math.sqrt(c), h = 2 * n;
  6085. ig(this, $l, oN).call(this, I, g, C, i, e, A, s, l, (-a + r) / h, o), ig(this, $l, oN).call(this, I, g, C, i, e, A, s, l, (-a - r) / h, o);
  6086. }, tg(AI, $l);
  6087. function Eog(t) {
  6088. return decodeURIComponent(escape(t));
  6089. }
  6090. let xH = null, q6 = null;
  6091. function Pog(t) {
  6092. return xH || (xH = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu, q6 = /* @__PURE__ */ new Map([["ſt", "ſt"]])), t.replaceAll(xH, (I, g, C) => g ? g.normalize("NFKC") : q6.get(C));
  6093. }
  6094. function H$() {
  6095. if (typeof crypto.randomUUID == "function")
  6096. return crypto.randomUUID();
  6097. const t = new Uint8Array(32);
  6098. return crypto.getRandomValues(t), f$(t);
  6099. }
  6100. const d9 = "pdfjs_internal_id_";
  6101. function _og(t, I, g) {
  6102. if (!Array.isArray(g) || g.length < 2)
  6103. return !1;
  6104. const [C, i, ...e] = g;
  6105. if (!t(C) && !Number.isInteger(C) || !I(i))
  6106. return !1;
  6107. const A = e.length;
  6108. let s = !0;
  6109. switch (i.name) {
  6110. case "XYZ":
  6111. if (A < 2 || A > 3)
  6112. return !1;
  6113. break;
  6114. case "Fit":
  6115. case "FitB":
  6116. return A === 0;
  6117. case "FitH":
  6118. case "FitBH":
  6119. case "FitV":
  6120. case "FitBV":
  6121. if (A > 1)
  6122. return !1;
  6123. break;
  6124. case "FitR":
  6125. if (A !== 4)
  6126. return !1;
  6127. s = !1;
  6128. break;
  6129. default:
  6130. return !1;
  6131. }
  6132. for (const l of e)
  6133. if (!(typeof l == "number" || s && l === null))
  6134. return !1;
  6135. return !0;
  6136. }
  6137. function fi(t, I, g) {
  6138. return Math.min(Math.max(t, I), g);
  6139. }
  6140. function X$(t) {
  6141. return Uint8Array.prototype.toBase64 ? t.toBase64() : btoa(f$(t));
  6142. }
  6143. function qog(t) {
  6144. return Uint8Array.fromBase64 ? Uint8Array.fromBase64(t) : eG(atob(t));
  6145. }
  6146. typeof Promise.try != "function" && (Promise.try = function(t, ...I) {
  6147. return new Promise((g) => {
  6148. g(t(...I));
  6149. });
  6150. });
  6151. typeof Math.sumPrecise != "function" && (Math.sumPrecise = function(t) {
  6152. return t.reduce((I, g) => I + g, 0);
  6153. });
  6154. const dl = "http://www.w3.org/2000/svg", _o = class _o {
  6155. };
  6156. iI(_o, "CSS", 96), iI(_o, "PDF", 72), iI(_o, "PDF_TO_CSS_UNITS", _o.CSS / _o.PDF);
  6157. let Pa = _o;
  6158. async function AG(t, I = "text") {
  6159. if (Or(t, document.baseURI)) {
  6160. const g = await fetch(t);
  6161. if (!g.ok)
  6162. throw new Error(g.statusText);
  6163. switch (I) {
  6164. case "arraybuffer":
  6165. return g.arrayBuffer();
  6166. case "blob":
  6167. return g.blob();
  6168. case "json":
  6169. return g.json();
  6170. }
  6171. return g.text();
  6172. }
  6173. return new Promise((g, C) => {
  6174. const i = new XMLHttpRequest();
  6175. i.open("GET", t, !0), i.responseType = I, i.onreadystatechange = () => {
  6176. if (i.readyState === XMLHttpRequest.DONE) {
  6177. if (i.status === 200 || i.status === 0) {
  6178. switch (I) {
  6179. case "arraybuffer":
  6180. case "blob":
  6181. case "json":
  6182. g(i.response);
  6183. return;
  6184. }
  6185. g(i.responseText);
  6186. return;
  6187. }
  6188. C(new Error(i.statusText));
  6189. }
  6190. }, i.send(null);
  6191. });
  6192. }
  6193. class sG {
  6194. constructor({
  6195. viewBox: I,
  6196. userUnit: g,
  6197. scale: C,
  6198. rotation: i,
  6199. offsetX: e = 0,
  6200. offsetY: A = 0,
  6201. dontFlip: s = !1
  6202. }) {
  6203. this.viewBox = I, this.userUnit = g, this.scale = C, this.rotation = i, this.offsetX = e, this.offsetY = A, C *= g;
  6204. const l = (I[2] + I[0]) / 2, n = (I[3] + I[1]) / 2;
  6205. let a, d, o, c;
  6206. switch (i %= 360, i < 0 && (i += 360), i) {
  6207. case 180:
  6208. a = -1, d = 0, o = 0, c = 1;
  6209. break;
  6210. case 90:
  6211. a = 0, d = 1, o = 1, c = 0;
  6212. break;
  6213. case 270:
  6214. a = 0, d = -1, o = -1, c = 0;
  6215. break;
  6216. case 0:
  6217. a = 1, d = 0, o = 0, c = -1;
  6218. break;
  6219. default:
  6220. throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees.");
  6221. }
  6222. s && (o = -o, c = -c);
  6223. let r, h, b, u;
  6224. a === 0 ? (r = Math.abs(n - I[1]) * C + e, h = Math.abs(l - I[0]) * C + A, b = (I[3] - I[1]) * C, u = (I[2] - I[0]) * C) : (r = Math.abs(l - I[0]) * C + e, h = Math.abs(n - I[1]) * C + A, b = (I[2] - I[0]) * C, u = (I[3] - I[1]) * C), this.transform = [a * C, d * C, o * C, c * C, r - a * C * l - o * C * n, h - d * C * l - c * C * n], this.width = b, this.height = u;
  6225. }
  6226. get rawDims() {
  6227. const I = this.viewBox;
  6228. return UI(this, "rawDims", {
  6229. pageWidth: I[2] - I[0],
  6230. pageHeight: I[3] - I[1],
  6231. pageX: I[0],
  6232. pageY: I[1]
  6233. });
  6234. }
  6235. clone({
  6236. scale: I = this.scale,
  6237. rotation: g = this.rotation,
  6238. offsetX: C = this.offsetX,
  6239. offsetY: i = this.offsetY,
  6240. dontFlip: e = !1
  6241. } = {}) {
  6242. return new sG({
  6243. viewBox: this.viewBox.slice(),
  6244. userUnit: this.userUnit,
  6245. scale: I,
  6246. rotation: g,
  6247. offsetX: C,
  6248. offsetY: i,
  6249. dontFlip: e
  6250. });
  6251. }
  6252. convertToViewportPoint(I, g) {
  6253. return AI.applyTransform([I, g], this.transform);
  6254. }
  6255. convertToViewportRectangle(I) {
  6256. const g = AI.applyTransform([I[0], I[1]], this.transform), C = AI.applyTransform([I[2], I[3]], this.transform);
  6257. return [g[0], g[1], C[0], C[1]];
  6258. }
  6259. convertToPdfPoint(I, g) {
  6260. return AI.applyInverseTransform([I, g], this.transform);
  6261. }
  6262. }
  6263. class r9 extends ud {
  6264. constructor(I, g = 0) {
  6265. super(I, "RenderingCancelledException"), this.extraDelay = g;
  6266. }
  6267. }
  6268. function $V(t) {
  6269. const I = t.length;
  6270. let g = 0;
  6271. for (; g < I && t[g].trim() === ""; )
  6272. g++;
  6273. return t.substring(g, g + 5).toLowerCase() === "data:";
  6274. }
  6275. function h9(t) {
  6276. return typeof t == "string" && /\.pdf$/i.test(t);
  6277. }
  6278. function $og(t) {
  6279. return [t] = t.split(/[#?]/, 1), t.substring(t.lastIndexOf("/") + 1);
  6280. }
  6281. function gcg(t, I = "document.pdf") {
  6282. if (typeof t != "string")
  6283. return I;
  6284. if ($V(t))
  6285. return DI('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'), I;
  6286. const g = /^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/, C = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i, i = g.exec(t);
  6287. let e = C.exec(i[1]) || C.exec(i[2]) || C.exec(i[3]);
  6288. if (e && (e = e[0], e.includes("%")))
  6289. try {
  6290. e = C.exec(decodeURIComponent(e))[0];
  6291. } catch {
  6292. }
  6293. return e || I;
  6294. }
  6295. class $6 {
  6296. constructor() {
  6297. iI(this, "started", /* @__PURE__ */ Object.create(null));
  6298. iI(this, "times", []);
  6299. }
  6300. time(I) {
  6301. I in this.started && DI(`Timer is already running for ${I}`), this.started[I] = Date.now();
  6302. }
  6303. timeEnd(I) {
  6304. I in this.started || DI(`Timer has not been started for ${I}`), this.times.push({
  6305. name: I,
  6306. start: this.started[I],
  6307. end: Date.now()
  6308. }), delete this.started[I];
  6309. }
  6310. toString() {
  6311. const I = [];
  6312. let g = 0;
  6313. for (const {
  6314. name: C
  6315. } of this.times)
  6316. g = Math.max(C.length, g);
  6317. for (const {
  6318. name: C,
  6319. start: i,
  6320. end: e
  6321. } of this.times)
  6322. I.push(`${C.padEnd(g)} ${e - i}ms
  6323. `);
  6324. return I.join("");
  6325. }
  6326. }
  6327. function Or(t, I) {
  6328. const g = I ? URL.parse(t, I) : URL.parse(t);
  6329. return (g == null ? void 0 : g.protocol) === "http:" || (g == null ? void 0 : g.protocol) === "https:";
  6330. }
  6331. function zA(t) {
  6332. t.preventDefault();
  6333. }
  6334. function ht(t) {
  6335. t.preventDefault(), t.stopPropagation();
  6336. }
  6337. var Sm;
  6338. class b9 {
  6339. static toDateObject(I) {
  6340. if (!I || typeof I != "string")
  6341. return null;
  6342. M(this, Sm) || $(this, Sm, new RegExp("^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([Z|+|-])?(\\d{2})?'?(\\d{2})?'?"));
  6343. const g = M(this, Sm).exec(I);
  6344. if (!g)
  6345. return null;
  6346. const C = parseInt(g[1], 10);
  6347. let i = parseInt(g[2], 10);
  6348. i = i >= 1 && i <= 12 ? i - 1 : 0;
  6349. let e = parseInt(g[3], 10);
  6350. e = e >= 1 && e <= 31 ? e : 1;
  6351. let A = parseInt(g[4], 10);
  6352. A = A >= 0 && A <= 23 ? A : 0;
  6353. let s = parseInt(g[5], 10);
  6354. s = s >= 0 && s <= 59 ? s : 0;
  6355. let l = parseInt(g[6], 10);
  6356. l = l >= 0 && l <= 59 ? l : 0;
  6357. const n = g[7] || "Z";
  6358. let a = parseInt(g[8], 10);
  6359. a = a >= 0 && a <= 23 ? a : 0;
  6360. let d = parseInt(g[9], 10) || 0;
  6361. return d = d >= 0 && d <= 59 ? d : 0, n === "-" ? (A += a, s += d) : n === "+" && (A -= a, s -= d), new Date(Date.UTC(C, i, e, A, s, l));
  6362. }
  6363. }
  6364. Sm = new WeakMap(), tg(b9, Sm);
  6365. function Icg(t, {
  6366. scale: I = 1,
  6367. rotation: g = 0
  6368. }) {
  6369. const {
  6370. width: C,
  6371. height: i
  6372. } = t.attributes.style, e = [0, 0, parseInt(C), parseInt(i)];
  6373. return new sG({
  6374. viewBox: e,
  6375. userUnit: 1,
  6376. scale: I,
  6377. rotation: g
  6378. });
  6379. }
  6380. function u9(t) {
  6381. if (t.startsWith("#")) {
  6382. const I = parseInt(t.slice(1), 16);
  6383. return [(I & 16711680) >> 16, (I & 65280) >> 8, I & 255];
  6384. }
  6385. return t.startsWith("rgb(") ? t.slice(4, -1).split(",").map((I) => parseInt(I)) : t.startsWith("rgba(") ? t.slice(5, -1).split(",").map((I) => parseInt(I)).slice(0, 3) : (DI(`Not a valid color format: "${t}"`), [0, 0, 0]);
  6386. }
  6387. function Ccg(t) {
  6388. const I = document.createElement("span");
  6389. I.style.visibility = "hidden", document.body.append(I);
  6390. for (const g of t.keys()) {
  6391. I.style.color = g;
  6392. const C = window.getComputedStyle(I).color;
  6393. t.set(g, u9(C));
  6394. }
  6395. I.remove();
  6396. }
  6397. function zC(t) {
  6398. const {
  6399. a: I,
  6400. b: g,
  6401. c: C,
  6402. d: i,
  6403. e,
  6404. f: A
  6405. } = t.getTransform();
  6406. return [I, g, C, i, e, A];
  6407. }
  6408. function ss(t) {
  6409. const {
  6410. a: I,
  6411. b: g,
  6412. c: C,
  6413. d: i,
  6414. e,
  6415. f: A
  6416. } = t.getTransform().invertSelf();
  6417. return [I, g, C, i, e, A];
  6418. }
  6419. function cd(t, I, g = !1, C = !0) {
  6420. if (I instanceof sG) {
  6421. const {
  6422. pageWidth: i,
  6423. pageHeight: e
  6424. } = I.rawDims, {
  6425. style: A
  6426. } = t, s = Ai.isCSSRoundSupported, l = `var(--total-scale-factor) * ${i}px`, n = `var(--total-scale-factor) * ${e}px`, a = s ? `round(down, ${l}, var(--scale-round-x))` : `calc(${l})`, d = s ? `round(down, ${n}, var(--scale-round-y))` : `calc(${n})`;
  6427. !g || I.rotation % 180 === 0 ? (A.width = a, A.height = d) : (A.width = d, A.height = a);
  6428. }
  6429. C && t.setAttribute("data-main-rotation", I.rotation);
  6430. }
  6431. class In {
  6432. constructor() {
  6433. const {
  6434. pixelRatio: I
  6435. } = In;
  6436. this.sx = I, this.sy = I;
  6437. }
  6438. get scaled() {
  6439. return this.sx !== 1 || this.sy !== 1;
  6440. }
  6441. get symmetric() {
  6442. return this.sx === this.sy;
  6443. }
  6444. limitCanvas(I, g, C, i) {
  6445. let e = 1 / 0, A = 1 / 0, s = 1 / 0;
  6446. C > 0 && (e = Math.sqrt(C / (I * g))), i !== -1 && (A = i / I, s = i / g);
  6447. const l = Math.min(e, A, s);
  6448. return this.sx > l || this.sy > l ? (this.sx = l, this.sy = l, !0) : !1;
  6449. }
  6450. static get pixelRatio() {
  6451. return globalThis.devicePixelRatio || 1;
  6452. }
  6453. }
  6454. const UX = ["image/apng", "image/avif", "image/bmp", "image/gif", "image/jpeg", "image/png", "image/svg+xml", "image/webp", "image/x-icon"];
  6455. var aa, Cc, je, oa, Dm, mh, Km, fV, S$, ei, D$, K$, vu, F$, cN;
  6456. const ul = class ul {
  6457. constructor(I) {
  6458. tg(this, ei);
  6459. tg(this, aa, null);
  6460. tg(this, Cc, null);
  6461. tg(this, je);
  6462. tg(this, oa, null);
  6463. tg(this, Dm, null);
  6464. tg(this, mh, null);
  6465. $(this, je, I), M(ul, Km) || $(ul, Km, Object.freeze({
  6466. freetext: "pdfjs-editor-remove-freetext-button",
  6467. highlight: "pdfjs-editor-remove-highlight-button",
  6468. ink: "pdfjs-editor-remove-ink-button",
  6469. stamp: "pdfjs-editor-remove-stamp-button",
  6470. signature: "pdfjs-editor-remove-signature-button"
  6471. }));
  6472. }
  6473. render() {
  6474. const I = $(this, aa, document.createElement("div"));
  6475. I.classList.add("editToolbar", "hidden"), I.setAttribute("role", "toolbar");
  6476. const g = M(this, je)._uiManager._signal;
  6477. I.addEventListener("contextmenu", zA, {
  6478. signal: g
  6479. }), I.addEventListener("pointerdown", ig(ul, fV, S$), {
  6480. signal: g
  6481. });
  6482. const C = $(this, oa, document.createElement("div"));
  6483. C.className = "buttons", I.append(C);
  6484. const i = M(this, je).toolbarPosition;
  6485. if (i) {
  6486. const {
  6487. style: e
  6488. } = I, A = M(this, je)._uiManager.direction === "ltr" ? 1 - i[0] : i[0];
  6489. e.insetInlineEnd = `${100 * A}%`, e.top = `calc(${100 * i[1]}% + var(--editor-toolbar-vert-offset))`;
  6490. }
  6491. return ig(this, ei, F$).call(this), I;
  6492. }
  6493. get div() {
  6494. return M(this, aa);
  6495. }
  6496. hide() {
  6497. var I;
  6498. M(this, aa).classList.add("hidden"), (I = M(this, Cc)) == null || I.hideDropdown();
  6499. }
  6500. show() {
  6501. var I;
  6502. M(this, aa).classList.remove("hidden"), (I = M(this, Dm)) == null || I.shown();
  6503. }
  6504. async addAltText(I) {
  6505. const g = await I.render();
  6506. ig(this, ei, vu).call(this, g), M(this, oa).prepend(g, M(this, ei, cN)), $(this, Dm, I);
  6507. }
  6508. addColorPicker(I) {
  6509. $(this, Cc, I);
  6510. const g = I.renderButton();
  6511. ig(this, ei, vu).call(this, g), M(this, oa).prepend(g, M(this, ei, cN));
  6512. }
  6513. async addEditSignatureButton(I) {
  6514. const g = $(this, mh, await I.renderEditButton(M(this, je)));
  6515. ig(this, ei, vu).call(this, g), M(this, oa).prepend(g, M(this, ei, cN));
  6516. }
  6517. updateEditSignatureButton(I) {
  6518. M(this, mh) && (M(this, mh).title = I);
  6519. }
  6520. remove() {
  6521. var I;
  6522. M(this, aa).remove(), (I = M(this, Cc)) == null || I.destroy(), $(this, Cc, null);
  6523. }
  6524. };
  6525. aa = new WeakMap(), Cc = new WeakMap(), je = new WeakMap(), oa = new WeakMap(), Dm = new WeakMap(), mh = new WeakMap(), Km = new WeakMap(), fV = new WeakSet(), S$ = function(I) {
  6526. I.stopPropagation();
  6527. }, ei = new WeakSet(), D$ = function(I) {
  6528. M(this, je)._focusEventsAllowed = !1, ht(I);
  6529. }, K$ = function(I) {
  6530. M(this, je)._focusEventsAllowed = !0, ht(I);
  6531. }, vu = function(I) {
  6532. const g = M(this, je)._uiManager._signal;
  6533. I.addEventListener("focusin", ig(this, ei, D$).bind(this), {
  6534. capture: !0,
  6535. signal: g
  6536. }), I.addEventListener("focusout", ig(this, ei, K$).bind(this), {
  6537. capture: !0,
  6538. signal: g
  6539. }), I.addEventListener("contextmenu", zA, {
  6540. signal: g
  6541. });
  6542. }, F$ = function() {
  6543. const {
  6544. editorType: I,
  6545. _uiManager: g
  6546. } = M(this, je), C = document.createElement("button");
  6547. C.className = "delete", C.tabIndex = 0, C.setAttribute("data-l10n-id", M(ul, Km)[I]), ig(this, ei, vu).call(this, C), C.addEventListener("click", (i) => {
  6548. g.delete();
  6549. }, {
  6550. signal: g._signal
  6551. }), M(this, oa).append(C);
  6552. }, cN = function() {
  6553. const I = document.createElement("div");
  6554. return I.className = "divider", I;
  6555. }, tg(ul, fV), tg(ul, Km, null);
  6556. let EX = ul;
  6557. var Fm, tc, ic, qa, k$, z$, J$;
  6558. class tcg {
  6559. constructor(I) {
  6560. tg(this, qa);
  6561. tg(this, Fm, null);
  6562. tg(this, tc, null);
  6563. tg(this, ic);
  6564. $(this, ic, I);
  6565. }
  6566. show(I, g, C) {
  6567. const [i, e] = ig(this, qa, z$).call(this, g, C), {
  6568. style: A
  6569. } = M(this, tc) || $(this, tc, ig(this, qa, k$).call(this));
  6570. I.append(M(this, tc)), A.insetInlineEnd = `${100 * i}%`, A.top = `calc(${100 * e}% + var(--editor-toolbar-vert-offset))`;
  6571. }
  6572. hide() {
  6573. M(this, tc).remove();
  6574. }
  6575. }
  6576. Fm = new WeakMap(), tc = new WeakMap(), ic = new WeakMap(), qa = new WeakSet(), k$ = function() {
  6577. const I = $(this, tc, document.createElement("div"));
  6578. I.className = "editToolbar", I.setAttribute("role", "toolbar"), I.addEventListener("contextmenu", zA, {
  6579. signal: M(this, ic)._signal
  6580. });
  6581. const g = $(this, Fm, document.createElement("div"));
  6582. return g.className = "buttons", I.append(g), ig(this, qa, J$).call(this), I;
  6583. }, z$ = function(I, g) {
  6584. let C = 0, i = 0;
  6585. for (const e of I) {
  6586. const A = e.y + e.height;
  6587. if (A < C)
  6588. continue;
  6589. const s = e.x + (g ? e.width : 0);
  6590. if (A > C) {
  6591. i = s, C = A;
  6592. continue;
  6593. }
  6594. g ? s > i && (i = s) : s < i && (i = s);
  6595. }
  6596. return [g ? 1 - i : i, C];
  6597. }, J$ = function() {
  6598. const I = document.createElement("button");
  6599. I.className = "highlightButton", I.tabIndex = 0, I.setAttribute("data-l10n-id", "pdfjs-highlight-floating-button1");
  6600. const g = document.createElement("span");
  6601. I.append(g), g.className = "visuallyHidden", g.setAttribute("data-l10n-id", "pdfjs-highlight-floating-button-label");
  6602. const C = M(this, ic)._signal;
  6603. I.addEventListener("contextmenu", zA, {
  6604. signal: C
  6605. }), I.addEventListener("click", () => {
  6606. M(this, ic).highlightSelection("floating_button");
  6607. }, {
  6608. signal: C
  6609. }), M(this, Fm).append(I);
  6610. };
  6611. function m9(t, I, g) {
  6612. for (const C of g)
  6613. I.addEventListener(C, t[C].bind(t));
  6614. }
  6615. var HV;
  6616. class icg {
  6617. constructor() {
  6618. tg(this, HV, 0);
  6619. }
  6620. get id() {
  6621. return `${kog}${Wi(this, HV)._++}`;
  6622. }
  6623. }
  6624. HV = new WeakMap();
  6625. var Zh, km, ui, Gh, dN;
  6626. const C1 = class C1 {
  6627. constructor() {
  6628. tg(this, Gh);
  6629. tg(this, Zh, H$());
  6630. tg(this, km, 0);
  6631. tg(this, ui, null);
  6632. }
  6633. static get _isSVGFittingCanvas() {
  6634. const I = 'data:image/svg+xml;charset=UTF-8,<svg viewBox="0 0 1 1" width="1" height="1" xmlns="http://www.w3.org/2000/svg"><rect width="1" height="1" style="fill:red;"/></svg>', C = new OffscreenCanvas(1, 3).getContext("2d", {
  6635. willReadFrequently: !0
  6636. }), i = new Image();
  6637. i.src = I;
  6638. const e = i.decode().then(() => (C.drawImage(i, 0, 0, 1, 1, 0, 0, 1, 3), new Uint32Array(C.getImageData(0, 0, 1, 1).data.buffer)[0] === 0));
  6639. return UI(this, "_isSVGFittingCanvas", e);
  6640. }
  6641. async getFromFile(I) {
  6642. const {
  6643. lastModified: g,
  6644. name: C,
  6645. size: i,
  6646. type: e
  6647. } = I;
  6648. return ig(this, Gh, dN).call(this, `${g}_${C}_${i}_${e}`, I);
  6649. }
  6650. async getFromUrl(I) {
  6651. return ig(this, Gh, dN).call(this, I, I);
  6652. }
  6653. async getFromBlob(I, g) {
  6654. const C = await g;
  6655. return ig(this, Gh, dN).call(this, I, C);
  6656. }
  6657. async getFromId(I) {
  6658. M(this, ui) || $(this, ui, /* @__PURE__ */ new Map());
  6659. const g = M(this, ui).get(I);
  6660. if (!g)
  6661. return null;
  6662. if (g.bitmap)
  6663. return g.refCounter += 1, g;
  6664. if (g.file)
  6665. return this.getFromFile(g.file);
  6666. if (g.blobPromise) {
  6667. const {
  6668. blobPromise: C
  6669. } = g;
  6670. return delete g.blobPromise, this.getFromBlob(g.id, C);
  6671. }
  6672. return this.getFromUrl(g.url);
  6673. }
  6674. getFromCanvas(I, g) {
  6675. M(this, ui) || $(this, ui, /* @__PURE__ */ new Map());
  6676. let C = M(this, ui).get(I);
  6677. if (C != null && C.bitmap)
  6678. return C.refCounter += 1, C;
  6679. const i = new OffscreenCanvas(g.width, g.height);
  6680. return i.getContext("2d").drawImage(g, 0, 0), C = {
  6681. bitmap: i.transferToImageBitmap(),
  6682. id: `image_${M(this, Zh)}_${Wi(this, km)._++}`,
  6683. refCounter: 1,
  6684. isSvg: !1
  6685. }, M(this, ui).set(I, C), M(this, ui).set(C.id, C), C;
  6686. }
  6687. getSvgUrl(I) {
  6688. const g = M(this, ui).get(I);
  6689. return g != null && g.isSvg ? g.svgUrl : null;
  6690. }
  6691. deleteId(I) {
  6692. var i;
  6693. M(this, ui) || $(this, ui, /* @__PURE__ */ new Map());
  6694. const g = M(this, ui).get(I);
  6695. if (!g || (g.refCounter -= 1, g.refCounter !== 0))
  6696. return;
  6697. const {
  6698. bitmap: C
  6699. } = g;
  6700. if (!g.url && !g.file) {
  6701. const e = new OffscreenCanvas(C.width, C.height);
  6702. e.getContext("bitmaprenderer").transferFromImageBitmap(C), g.blobPromise = e.convertToBlob();
  6703. }
  6704. (i = C.close) == null || i.call(C), g.bitmap = null;
  6705. }
  6706. isValidId(I) {
  6707. return I.startsWith(`image_${M(this, Zh)}_`);
  6708. }
  6709. };
  6710. Zh = new WeakMap(), km = new WeakMap(), ui = new WeakMap(), Gh = new WeakSet(), dN = async function(I, g) {
  6711. M(this, ui) || $(this, ui, /* @__PURE__ */ new Map());
  6712. let C = M(this, ui).get(I);
  6713. if (C === null)
  6714. return null;
  6715. if (C != null && C.bitmap)
  6716. return C.refCounter += 1, C;
  6717. try {
  6718. C || (C = {
  6719. bitmap: null,
  6720. id: `image_${M(this, Zh)}_${Wi(this, km)._++}`,
  6721. refCounter: 0,
  6722. isSvg: !1
  6723. });
  6724. let i;
  6725. if (typeof g == "string" ? (C.url = g, i = await AG(g, "blob")) : g instanceof File ? i = C.file = g : g instanceof Blob && (i = g), i.type === "image/svg+xml") {
  6726. const e = C1._isSVGFittingCanvas, A = new FileReader(), s = new Image(), l = new Promise((n, a) => {
  6727. s.onload = () => {
  6728. C.bitmap = s, C.isSvg = !0, n();
  6729. }, A.onload = async () => {
  6730. const d = C.svgUrl = A.result;
  6731. s.src = await e ? `${d}#svgView(preserveAspectRatio(none))` : d;
  6732. }, s.onerror = A.onerror = a;
  6733. });
  6734. A.readAsDataURL(i), await l;
  6735. } else
  6736. C.bitmap = await createImageBitmap(i);
  6737. C.refCounter = 1;
  6738. } catch (i) {
  6739. DI(i), C = null;
  6740. }
  6741. return M(this, ui).set(I, C), C && M(this, ui).set(C.id, C), C;
  6742. };
  6743. let PX = C1;
  6744. var it, ca, zm, EC;
  6745. class ecg {
  6746. constructor(I = 128) {
  6747. tg(this, it, []);
  6748. tg(this, ca, !1);
  6749. tg(this, zm);
  6750. tg(this, EC, -1);
  6751. $(this, zm, I);
  6752. }
  6753. add({
  6754. cmd: I,
  6755. undo: g,
  6756. post: C,
  6757. mustExec: i,
  6758. type: e = NaN,
  6759. overwriteIfSameType: A = !1,
  6760. keepUndo: s = !1
  6761. }) {
  6762. if (i && I(), M(this, ca))
  6763. return;
  6764. const l = {
  6765. cmd: I,
  6766. undo: g,
  6767. post: C,
  6768. type: e
  6769. };
  6770. if (M(this, EC) === -1) {
  6771. M(this, it).length > 0 && (M(this, it).length = 0), $(this, EC, 0), M(this, it).push(l);
  6772. return;
  6773. }
  6774. if (A && M(this, it)[M(this, EC)].type === e) {
  6775. s && (l.undo = M(this, it)[M(this, EC)].undo), M(this, it)[M(this, EC)] = l;
  6776. return;
  6777. }
  6778. const n = M(this, EC) + 1;
  6779. n === M(this, zm) ? M(this, it).splice(0, 1) : ($(this, EC, n), n < M(this, it).length && M(this, it).splice(n)), M(this, it).push(l);
  6780. }
  6781. undo() {
  6782. if (M(this, EC) === -1)
  6783. return;
  6784. $(this, ca, !0);
  6785. const {
  6786. undo: I,
  6787. post: g
  6788. } = M(this, it)[M(this, EC)];
  6789. I(), g == null || g(), $(this, ca, !1), $(this, EC, M(this, EC) - 1);
  6790. }
  6791. redo() {
  6792. if (M(this, EC) < M(this, it).length - 1) {
  6793. $(this, EC, M(this, EC) + 1), $(this, ca, !0);
  6794. const {
  6795. cmd: I,
  6796. post: g
  6797. } = M(this, it)[M(this, EC)];
  6798. I(), g == null || g(), $(this, ca, !1);
  6799. }
  6800. }
  6801. hasSomethingToUndo() {
  6802. return M(this, EC) !== -1;
  6803. }
  6804. hasSomethingToRedo() {
  6805. return M(this, EC) < M(this, it).length - 1;
  6806. }
  6807. cleanType(I) {
  6808. if (M(this, EC) !== -1) {
  6809. for (let g = M(this, EC); g >= 0; g--)
  6810. if (M(this, it)[g].type !== I) {
  6811. M(this, it).splice(g + 1, M(this, EC) - g), $(this, EC, g);
  6812. return;
  6813. }
  6814. M(this, it).length = 0, $(this, EC, -1);
  6815. }
  6816. }
  6817. destroy() {
  6818. $(this, it, null);
  6819. }
  6820. }
  6821. it = new WeakMap(), ca = new WeakMap(), zm = new WeakMap(), EC = new WeakMap();
  6822. var XV, L$;
  6823. class lG {
  6824. constructor(I) {
  6825. tg(this, XV);
  6826. this.buffer = [], this.callbacks = /* @__PURE__ */ new Map(), this.allKeys = /* @__PURE__ */ new Set();
  6827. const {
  6828. isMac: g
  6829. } = Ai.platform;
  6830. for (const [C, i, e = {}] of I)
  6831. for (const A of C) {
  6832. const s = A.startsWith("mac+");
  6833. g && s ? (this.callbacks.set(A.slice(4), {
  6834. callback: i,
  6835. options: e
  6836. }), this.allKeys.add(A.split("+").at(-1))) : !g && !s && (this.callbacks.set(A, {
  6837. callback: i,
  6838. options: e
  6839. }), this.allKeys.add(A.split("+").at(-1)));
  6840. }
  6841. }
  6842. exec(I, g) {
  6843. if (!this.allKeys.has(g.key))
  6844. return;
  6845. const C = this.callbacks.get(ig(this, XV, L$).call(this, g));
  6846. if (!C)
  6847. return;
  6848. const {
  6849. callback: i,
  6850. options: {
  6851. bubbles: e = !1,
  6852. args: A = [],
  6853. checker: s = null
  6854. }
  6855. } = C;
  6856. s && !s(I, g) || (i.bind(I, ...A, g)(), e || ht(g));
  6857. }
  6858. }
  6859. XV = new WeakSet(), L$ = function(I) {
  6860. I.altKey && this.buffer.push("alt"), I.ctrlKey && this.buffer.push("ctrl"), I.metaKey && this.buffer.push("meta"), I.shiftKey && this.buffer.push("shift"), this.buffer.push(I.key);
  6861. const g = this.buffer.join("+");
  6862. return this.buffer.length = 0, g;
  6863. };
  6864. const SV = class SV {
  6865. get _colors() {
  6866. const I = /* @__PURE__ */ new Map([["CanvasText", null], ["Canvas", null]]);
  6867. return Ccg(I), UI(this, "_colors", I);
  6868. }
  6869. convert(I) {
  6870. const g = u9(I);
  6871. if (!window.matchMedia("(forced-colors: active)").matches)
  6872. return g;
  6873. for (const [C, i] of this._colors)
  6874. if (i.every((e, A) => e === g[A]))
  6875. return SV._colorsMapping.get(C);
  6876. return g;
  6877. }
  6878. getHexCode(I) {
  6879. const g = this._colors.get(I);
  6880. return g ? AI.makeHexColor(...g) : I;
  6881. }
  6882. };
  6883. iI(SV, "_colorsMapping", /* @__PURE__ */ new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]));
  6884. let _X = SV;
  6885. var wh, ce, Bt, Et, ph, Zl, Bh, Qe, da, ec, Wh, Ac, bs, pA, sc, Jm, Lm, yh, vm, us, ra, Yh, ha, ms, DV, ba, Tm, ua, lc, nc, ma, xm, St, hC, Gl, Za, ac, jm, Qm, Ga, Zs, wl, Om, Oe, Og, rN, qX, v$, T$, hN, x$, j$, Q$, $X, O$, gS, IS, U$, Yi, rl, E$, P$, CS, _$, Tu, tS;
  6886. const lh = class lh {
  6887. constructor(I, g, C, i, e, A, s, l, n, a, d, o, c, r) {
  6888. tg(this, Og);
  6889. tg(this, wh, new AbortController());
  6890. tg(this, ce, null);
  6891. tg(this, Bt, /* @__PURE__ */ new Map());
  6892. tg(this, Et, /* @__PURE__ */ new Map());
  6893. tg(this, ph, null);
  6894. tg(this, Zl, null);
  6895. tg(this, Bh, null);
  6896. tg(this, Qe, new ecg());
  6897. tg(this, da, null);
  6898. tg(this, ec, null);
  6899. tg(this, Wh, 0);
  6900. tg(this, Ac, /* @__PURE__ */ new Set());
  6901. tg(this, bs, null);
  6902. tg(this, pA, null);
  6903. tg(this, sc, /* @__PURE__ */ new Set());
  6904. iI(this, "_editorUndoBar", null);
  6905. tg(this, Jm, !1);
  6906. tg(this, Lm, !1);
  6907. tg(this, yh, !1);
  6908. tg(this, vm, null);
  6909. tg(this, us, null);
  6910. tg(this, ra, null);
  6911. tg(this, Yh, null);
  6912. tg(this, ha, !1);
  6913. tg(this, ms, null);
  6914. tg(this, DV, new icg());
  6915. tg(this, ba, !1);
  6916. tg(this, Tm, !1);
  6917. tg(this, ua, null);
  6918. tg(this, lc, null);
  6919. tg(this, nc, null);
  6920. tg(this, ma, null);
  6921. tg(this, xm, null);
  6922. tg(this, St, XI.NONE);
  6923. tg(this, hC, /* @__PURE__ */ new Set());
  6924. tg(this, Gl, null);
  6925. tg(this, Za, null);
  6926. tg(this, ac, null);
  6927. tg(this, jm, null);
  6928. tg(this, Qm, {
  6929. isEditing: !1,
  6930. isEmpty: !0,
  6931. hasSomethingToUndo: !1,
  6932. hasSomethingToRedo: !1,
  6933. hasSelectedEditor: !1,
  6934. hasSelectedText: !1
  6935. });
  6936. tg(this, Ga, [0, 0]);
  6937. tg(this, Zs, null);
  6938. tg(this, wl, null);
  6939. tg(this, Om, null);
  6940. tg(this, Oe, null);
  6941. const h = this._signal = M(this, wh).signal;
  6942. $(this, wl, I), $(this, Om, g), $(this, ph, C), $(this, Za, i), this._eventBus = e, e._on("editingaction", this.onEditingAction.bind(this), {
  6943. signal: h
  6944. }), e._on("pagechanging", this.onPageChanging.bind(this), {
  6945. signal: h
  6946. }), e._on("scalechanging", this.onScaleChanging.bind(this), {
  6947. signal: h
  6948. }), e._on("rotationchanging", this.onRotationChanging.bind(this), {
  6949. signal: h
  6950. }), e._on("setpreference", this.onSetPreference.bind(this), {
  6951. signal: h
  6952. }), e._on("switchannotationeditorparams", (b) => this.updateParams(b.type, b.value), {
  6953. signal: h
  6954. }), ig(this, Og, x$).call(this), ig(this, Og, U$).call(this), ig(this, Og, $X).call(this), $(this, Zl, A.annotationStorage), $(this, vm, A.filterFactory), $(this, ac, s), $(this, Yh, l || null), $(this, Jm, n), $(this, Lm, a), $(this, yh, d), $(this, xm, o || null), this.viewParameters = {
  6955. realScale: Pa.PDF_TO_CSS_UNITS,
  6956. rotation: 0
  6957. }, this.isShiftKeyDown = !1, this._editorUndoBar = c || null, this._supportsPinchToZoom = r !== !1;
  6958. }
  6959. static get _keyboardManager() {
  6960. const I = lh.prototype, g = (A) => M(A, wl).contains(document.activeElement) && document.activeElement.tagName !== "BUTTON" && A.hasSomethingToControl(), C = (A, {
  6961. target: s
  6962. }) => {
  6963. if (s instanceof HTMLInputElement) {
  6964. const {
  6965. type: l
  6966. } = s;
  6967. return l !== "text" && l !== "number";
  6968. }
  6969. return !0;
  6970. }, i = this.TRANSLATE_SMALL, e = this.TRANSLATE_BIG;
  6971. return UI(this, "_keyboardManager", new lG([[["ctrl+a", "mac+meta+a"], I.selectAll, {
  6972. checker: C
  6973. }], [["ctrl+z", "mac+meta+z"], I.undo, {
  6974. checker: C
  6975. }], [["ctrl+y", "ctrl+shift+z", "mac+meta+shift+z", "ctrl+shift+Z", "mac+meta+shift+Z"], I.redo, {
  6976. checker: C
  6977. }], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete", "mac+Delete"], I.delete, {
  6978. checker: C
  6979. }], [["Enter", "mac+Enter"], I.addNewEditorFromKeyboard, {
  6980. checker: (A, {
  6981. target: s
  6982. }) => !(s instanceof HTMLButtonElement) && M(A, wl).contains(s) && !A.isEnterHandled
  6983. }], [[" ", "mac+ "], I.addNewEditorFromKeyboard, {
  6984. checker: (A, {
  6985. target: s
  6986. }) => !(s instanceof HTMLButtonElement) && M(A, wl).contains(document.activeElement)
  6987. }], [["Escape", "mac+Escape"], I.unselectAll], [["ArrowLeft", "mac+ArrowLeft"], I.translateSelectedEditors, {
  6988. args: [-i, 0],
  6989. checker: g
  6990. }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], I.translateSelectedEditors, {
  6991. args: [-e, 0],
  6992. checker: g
  6993. }], [["ArrowRight", "mac+ArrowRight"], I.translateSelectedEditors, {
  6994. args: [i, 0],
  6995. checker: g
  6996. }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], I.translateSelectedEditors, {
  6997. args: [e, 0],
  6998. checker: g
  6999. }], [["ArrowUp", "mac+ArrowUp"], I.translateSelectedEditors, {
  7000. args: [0, -i],
  7001. checker: g
  7002. }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], I.translateSelectedEditors, {
  7003. args: [0, -e],
  7004. checker: g
  7005. }], [["ArrowDown", "mac+ArrowDown"], I.translateSelectedEditors, {
  7006. args: [0, i],
  7007. checker: g
  7008. }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], I.translateSelectedEditors, {
  7009. args: [0, e],
  7010. checker: g
  7011. }]]));
  7012. }
  7013. destroy() {
  7014. var I, g, C, i, e, A, s, l;
  7015. (I = M(this, Oe)) == null || I.resolve(), $(this, Oe, null), (g = M(this, wh)) == null || g.abort(), $(this, wh, null), this._signal = null;
  7016. for (const n of M(this, Et).values())
  7017. n.destroy();
  7018. M(this, Et).clear(), M(this, Bt).clear(), M(this, sc).clear(), (C = M(this, ma)) == null || C.clear(), $(this, ce, null), M(this, hC).clear(), M(this, Qe).destroy(), (i = M(this, ph)) == null || i.destroy(), (e = M(this, Za)) == null || e.destroy(), (A = M(this, ms)) == null || A.hide(), $(this, ms, null), (s = M(this, nc)) == null || s.destroy(), $(this, nc, null), M(this, us) && (clearTimeout(M(this, us)), $(this, us, null)), M(this, Zs) && (clearTimeout(M(this, Zs)), $(this, Zs, null)), (l = this._editorUndoBar) == null || l.destroy();
  7019. }
  7020. combinedSignal(I) {
  7021. return AbortSignal.any([this._signal, I.signal]);
  7022. }
  7023. get mlManager() {
  7024. return M(this, xm);
  7025. }
  7026. get useNewAltTextFlow() {
  7027. return M(this, Lm);
  7028. }
  7029. get useNewAltTextWhenAddingImage() {
  7030. return M(this, yh);
  7031. }
  7032. get hcmFilter() {
  7033. return UI(this, "hcmFilter", M(this, ac) ? M(this, vm).addHCMFilter(M(this, ac).foreground, M(this, ac).background) : "none");
  7034. }
  7035. get direction() {
  7036. return UI(this, "direction", getComputedStyle(M(this, wl)).direction);
  7037. }
  7038. get highlightColors() {
  7039. return UI(this, "highlightColors", M(this, Yh) ? new Map(M(this, Yh).split(",").map((I) => I.split("=").map((g) => g.trim()))) : null);
  7040. }
  7041. get highlightColorNames() {
  7042. return UI(this, "highlightColorNames", this.highlightColors ? new Map(Array.from(this.highlightColors, (I) => I.reverse())) : null);
  7043. }
  7044. setCurrentDrawingSession(I) {
  7045. I ? (this.unselectAll(), this.disableUserSelect(!0)) : this.disableUserSelect(!1), $(this, ec, I);
  7046. }
  7047. setMainHighlightColorPicker(I) {
  7048. $(this, nc, I);
  7049. }
  7050. editAltText(I, g = !1) {
  7051. var C;
  7052. (C = M(this, ph)) == null || C.editAltText(this, I, g);
  7053. }
  7054. getSignature(I) {
  7055. var g;
  7056. (g = M(this, Za)) == null || g.getSignature({
  7057. uiManager: this,
  7058. editor: I
  7059. });
  7060. }
  7061. get signatureManager() {
  7062. return M(this, Za);
  7063. }
  7064. switchToMode(I, g) {
  7065. this._eventBus.on("annotationeditormodechanged", g, {
  7066. once: !0,
  7067. signal: this._signal
  7068. }), this._eventBus.dispatch("showannotationeditorui", {
  7069. source: this,
  7070. mode: I
  7071. });
  7072. }
  7073. setPreference(I, g) {
  7074. this._eventBus.dispatch("setpreference", {
  7075. source: this,
  7076. name: I,
  7077. value: g
  7078. });
  7079. }
  7080. onSetPreference({
  7081. name: I,
  7082. value: g
  7083. }) {
  7084. switch (I) {
  7085. case "enableNewAltTextWhenAddingImage":
  7086. $(this, yh, g);
  7087. break;
  7088. }
  7089. }
  7090. onPageChanging({
  7091. pageNumber: I
  7092. }) {
  7093. $(this, Wh, I - 1);
  7094. }
  7095. focusMainContainer() {
  7096. M(this, wl).focus();
  7097. }
  7098. findParent(I, g) {
  7099. for (const C of M(this, Et).values()) {
  7100. const {
  7101. x: i,
  7102. y: e,
  7103. width: A,
  7104. height: s
  7105. } = C.div.getBoundingClientRect();
  7106. if (I >= i && I <= i + A && g >= e && g <= e + s)
  7107. return C;
  7108. }
  7109. return null;
  7110. }
  7111. disableUserSelect(I = !1) {
  7112. M(this, Om).classList.toggle("noUserSelect", I);
  7113. }
  7114. addShouldRescale(I) {
  7115. M(this, sc).add(I);
  7116. }
  7117. removeShouldRescale(I) {
  7118. M(this, sc).delete(I);
  7119. }
  7120. onScaleChanging({
  7121. scale: I
  7122. }) {
  7123. var g;
  7124. this.commitOrRemove(), this.viewParameters.realScale = I * Pa.PDF_TO_CSS_UNITS;
  7125. for (const C of M(this, sc))
  7126. C.onScaleChanging();
  7127. (g = M(this, ec)) == null || g.onScaleChanging();
  7128. }
  7129. onRotationChanging({
  7130. pagesRotation: I
  7131. }) {
  7132. this.commitOrRemove(), this.viewParameters.rotation = I;
  7133. }
  7134. highlightSelection(I = "") {
  7135. const g = document.getSelection();
  7136. if (!g || g.isCollapsed)
  7137. return;
  7138. const {
  7139. anchorNode: C,
  7140. anchorOffset: i,
  7141. focusNode: e,
  7142. focusOffset: A
  7143. } = g, s = g.toString(), n = ig(this, Og, rN).call(this, g).closest(".textLayer"), a = this.getSelectionBoxes(n);
  7144. if (!a)
  7145. return;
  7146. g.empty();
  7147. const d = ig(this, Og, qX).call(this, n), o = M(this, St) === XI.NONE, c = () => {
  7148. d == null || d.createAndAddNewEditor({
  7149. x: 0,
  7150. y: 0
  7151. }, !1, {
  7152. methodOfCreation: I,
  7153. boxes: a,
  7154. anchorNode: C,
  7155. anchorOffset: i,
  7156. focusNode: e,
  7157. focusOffset: A,
  7158. text: s
  7159. }), o && this.showAllEditors("highlight", !0, !0);
  7160. };
  7161. if (o) {
  7162. this.switchToMode(XI.HIGHLIGHT, c);
  7163. return;
  7164. }
  7165. c();
  7166. }
  7167. addToAnnotationStorage(I) {
  7168. !I.isEmpty() && M(this, Zl) && !M(this, Zl).has(I.id) && M(this, Zl).setValue(I.id, I);
  7169. }
  7170. blur() {
  7171. if (this.isShiftKeyDown = !1, M(this, ha) && ($(this, ha, !1), ig(this, Og, hN).call(this, "main_toolbar")), !this.hasSelection)
  7172. return;
  7173. const {
  7174. activeElement: I
  7175. } = document;
  7176. for (const g of M(this, hC))
  7177. if (g.div.contains(I)) {
  7178. $(this, lc, [g, I]), g._focusEventsAllowed = !1;
  7179. break;
  7180. }
  7181. }
  7182. focus() {
  7183. if (!M(this, lc))
  7184. return;
  7185. const [I, g] = M(this, lc);
  7186. $(this, lc, null), g.addEventListener("focusin", () => {
  7187. I._focusEventsAllowed = !0;
  7188. }, {
  7189. once: !0,
  7190. signal: this._signal
  7191. }), g.focus();
  7192. }
  7193. addEditListeners() {
  7194. ig(this, Og, $X).call(this), ig(this, Og, gS).call(this);
  7195. }
  7196. removeEditListeners() {
  7197. ig(this, Og, O$).call(this), ig(this, Og, IS).call(this);
  7198. }
  7199. dragOver(I) {
  7200. for (const {
  7201. type: g
  7202. } of I.dataTransfer.items)
  7203. for (const C of M(this, pA))
  7204. if (C.isHandlingMimeForPasting(g)) {
  7205. I.dataTransfer.dropEffect = "copy", I.preventDefault();
  7206. return;
  7207. }
  7208. }
  7209. drop(I) {
  7210. for (const g of I.dataTransfer.items)
  7211. for (const C of M(this, pA))
  7212. if (C.isHandlingMimeForPasting(g.type)) {
  7213. C.paste(g, this.currentLayer), I.preventDefault();
  7214. return;
  7215. }
  7216. }
  7217. copy(I) {
  7218. var C;
  7219. if (I.preventDefault(), (C = M(this, ce)) == null || C.commitOrRemove(), !this.hasSelection)
  7220. return;
  7221. const g = [];
  7222. for (const i of M(this, hC)) {
  7223. const e = i.serialize(!0);
  7224. e && g.push(e);
  7225. }
  7226. g.length !== 0 && I.clipboardData.setData("application/pdfjs", JSON.stringify(g));
  7227. }
  7228. cut(I) {
  7229. this.copy(I), this.delete();
  7230. }
  7231. async paste(I) {
  7232. I.preventDefault();
  7233. const {
  7234. clipboardData: g
  7235. } = I;
  7236. for (const e of g.items)
  7237. for (const A of M(this, pA))
  7238. if (A.isHandlingMimeForPasting(e.type)) {
  7239. A.paste(e, this.currentLayer);
  7240. return;
  7241. }
  7242. let C = g.getData("application/pdfjs");
  7243. if (!C)
  7244. return;
  7245. try {
  7246. C = JSON.parse(C);
  7247. } catch (e) {
  7248. DI(`paste: "${e.message}".`);
  7249. return;
  7250. }
  7251. if (!Array.isArray(C))
  7252. return;
  7253. this.unselectAll();
  7254. const i = this.currentLayer;
  7255. try {
  7256. const e = [];
  7257. for (const l of C) {
  7258. const n = await i.deserialize(l);
  7259. if (!n)
  7260. return;
  7261. e.push(n);
  7262. }
  7263. const A = () => {
  7264. for (const l of e)
  7265. ig(this, Og, CS).call(this, l);
  7266. ig(this, Og, tS).call(this, e);
  7267. }, s = () => {
  7268. for (const l of e)
  7269. l.remove();
  7270. };
  7271. this.addCommands({
  7272. cmd: A,
  7273. undo: s,
  7274. mustExec: !0
  7275. });
  7276. } catch (e) {
  7277. DI(`paste: "${e.message}".`);
  7278. }
  7279. }
  7280. keydown(I) {
  7281. !this.isShiftKeyDown && I.key === "Shift" && (this.isShiftKeyDown = !0), M(this, St) !== XI.NONE && !this.isEditorHandlingKeyboard && lh._keyboardManager.exec(this, I);
  7282. }
  7283. keyup(I) {
  7284. this.isShiftKeyDown && I.key === "Shift" && (this.isShiftKeyDown = !1, M(this, ha) && ($(this, ha, !1), ig(this, Og, hN).call(this, "main_toolbar")));
  7285. }
  7286. onEditingAction({
  7287. name: I
  7288. }) {
  7289. switch (I) {
  7290. case "undo":
  7291. case "redo":
  7292. case "delete":
  7293. case "selectAll":
  7294. this[I]();
  7295. break;
  7296. case "highlightSelection":
  7297. this.highlightSelection("context_menu");
  7298. break;
  7299. }
  7300. }
  7301. setEditingState(I) {
  7302. I ? (ig(this, Og, j$).call(this), ig(this, Og, gS).call(this), ig(this, Og, Yi).call(this, {
  7303. isEditing: M(this, St) !== XI.NONE,
  7304. isEmpty: ig(this, Og, Tu).call(this),
  7305. hasSomethingToUndo: M(this, Qe).hasSomethingToUndo(),
  7306. hasSomethingToRedo: M(this, Qe).hasSomethingToRedo(),
  7307. hasSelectedEditor: !1
  7308. })) : (ig(this, Og, Q$).call(this), ig(this, Og, IS).call(this), ig(this, Og, Yi).call(this, {
  7309. isEditing: !1
  7310. }), this.disableUserSelect(!1));
  7311. }
  7312. registerEditorTypes(I) {
  7313. if (!M(this, pA)) {
  7314. $(this, pA, I);
  7315. for (const g of M(this, pA))
  7316. ig(this, Og, rl).call(this, g.defaultPropertiesToUpdate);
  7317. }
  7318. }
  7319. getId() {
  7320. return M(this, DV).id;
  7321. }
  7322. get currentLayer() {
  7323. return M(this, Et).get(M(this, Wh));
  7324. }
  7325. getLayer(I) {
  7326. return M(this, Et).get(I);
  7327. }
  7328. get currentPageIndex() {
  7329. return M(this, Wh);
  7330. }
  7331. addLayer(I) {
  7332. M(this, Et).set(I.pageIndex, I), M(this, ba) ? I.enable() : I.disable();
  7333. }
  7334. removeLayer(I) {
  7335. M(this, Et).delete(I.pageIndex);
  7336. }
  7337. async updateMode(I, g = null, C = !1) {
  7338. var i, e;
  7339. if (M(this, St) !== I && !(M(this, Oe) && (await M(this, Oe).promise, !M(this, Oe)))) {
  7340. if ($(this, Oe, Promise.withResolvers()), $(this, St, I), I === XI.NONE) {
  7341. this.setEditingState(!1), ig(this, Og, P$).call(this), (i = this._editorUndoBar) == null || i.hide(), M(this, Oe).resolve();
  7342. return;
  7343. }
  7344. I === XI.SIGNATURE && await ((e = M(this, Za)) == null ? void 0 : e.loadSignatures()), this.setEditingState(!0), await ig(this, Og, E$).call(this), this.unselectAll();
  7345. for (const A of M(this, Et).values())
  7346. A.updateMode(I);
  7347. if (!g) {
  7348. C && this.addNewEditorFromKeyboard(), M(this, Oe).resolve();
  7349. return;
  7350. }
  7351. for (const A of M(this, Bt).values())
  7352. A.annotationElementId === g ? (this.setSelected(A), A.enterInEditMode()) : A.unselect();
  7353. M(this, Oe).resolve();
  7354. }
  7355. }
  7356. addNewEditorFromKeyboard() {
  7357. this.currentLayer.canCreateNewEmptyEditor() && this.currentLayer.addNewEditor();
  7358. }
  7359. updateToolbar(I) {
  7360. I !== M(this, St) && this._eventBus.dispatch("switchannotationeditormode", {
  7361. source: this,
  7362. mode: I
  7363. });
  7364. }
  7365. updateParams(I, g) {
  7366. var C;
  7367. if (M(this, pA)) {
  7368. switch (I) {
  7369. case iC.CREATE:
  7370. this.currentLayer.addNewEditor(g);
  7371. return;
  7372. case iC.HIGHLIGHT_DEFAULT_COLOR:
  7373. (C = M(this, nc)) == null || C.updateColor(g);
  7374. break;
  7375. case iC.HIGHLIGHT_SHOW_ALL:
  7376. this._eventBus.dispatch("reporttelemetry", {
  7377. source: this,
  7378. details: {
  7379. type: "editing",
  7380. data: {
  7381. type: "highlight",
  7382. action: "toggle_visibility"
  7383. }
  7384. }
  7385. }), (M(this, jm) || $(this, jm, /* @__PURE__ */ new Map())).set(I, g), this.showAllEditors("highlight", g);
  7386. break;
  7387. }
  7388. for (const i of M(this, hC))
  7389. i.updateParams(I, g);
  7390. for (const i of M(this, pA))
  7391. i.updateDefaultParams(I, g);
  7392. }
  7393. }
  7394. showAllEditors(I, g, C = !1) {
  7395. var e;
  7396. for (const A of M(this, Bt).values())
  7397. A.editorType === I && A.show(g);
  7398. (((e = M(this, jm)) == null ? void 0 : e.get(iC.HIGHLIGHT_SHOW_ALL)) ?? !0) !== g && ig(this, Og, rl).call(this, [[iC.HIGHLIGHT_SHOW_ALL, g]]);
  7399. }
  7400. enableWaiting(I = !1) {
  7401. if (M(this, Tm) !== I) {
  7402. $(this, Tm, I);
  7403. for (const g of M(this, Et).values())
  7404. I ? g.disableClick() : g.enableClick(), g.div.classList.toggle("waiting", I);
  7405. }
  7406. }
  7407. getEditors(I) {
  7408. const g = [];
  7409. for (const C of M(this, Bt).values())
  7410. C.pageIndex === I && g.push(C);
  7411. return g;
  7412. }
  7413. getEditor(I) {
  7414. return M(this, Bt).get(I);
  7415. }
  7416. addEditor(I) {
  7417. M(this, Bt).set(I.id, I);
  7418. }
  7419. removeEditor(I) {
  7420. var g, C;
  7421. I.div.contains(document.activeElement) && (M(this, us) && clearTimeout(M(this, us)), $(this, us, setTimeout(() => {
  7422. this.focusMainContainer(), $(this, us, null);
  7423. }, 0))), M(this, Bt).delete(I.id), I.annotationElementId && ((g = M(this, ma)) == null || g.delete(I.annotationElementId)), this.unselect(I), (!I.annotationElementId || !M(this, Ac).has(I.annotationElementId)) && ((C = M(this, Zl)) == null || C.remove(I.id));
  7424. }
  7425. addDeletedAnnotationElement(I) {
  7426. M(this, Ac).add(I.annotationElementId), this.addChangedExistingAnnotation(I), I.deleted = !0;
  7427. }
  7428. isDeletedAnnotationElement(I) {
  7429. return M(this, Ac).has(I);
  7430. }
  7431. removeDeletedAnnotationElement(I) {
  7432. M(this, Ac).delete(I.annotationElementId), this.removeChangedExistingAnnotation(I), I.deleted = !1;
  7433. }
  7434. setActiveEditor(I) {
  7435. M(this, ce) !== I && ($(this, ce, I), I && ig(this, Og, rl).call(this, I.propertiesToUpdate));
  7436. }
  7437. updateUI(I) {
  7438. M(this, Og, _$) === I && ig(this, Og, rl).call(this, I.propertiesToUpdate);
  7439. }
  7440. updateUIForDefaultProperties(I) {
  7441. ig(this, Og, rl).call(this, I.defaultPropertiesToUpdate);
  7442. }
  7443. toggleSelected(I) {
  7444. if (M(this, hC).has(I)) {
  7445. M(this, hC).delete(I), I.unselect(), ig(this, Og, Yi).call(this, {
  7446. hasSelectedEditor: this.hasSelection
  7447. });
  7448. return;
  7449. }
  7450. M(this, hC).add(I), I.select(), ig(this, Og, rl).call(this, I.propertiesToUpdate), ig(this, Og, Yi).call(this, {
  7451. hasSelectedEditor: !0
  7452. });
  7453. }
  7454. setSelected(I) {
  7455. var g;
  7456. (g = M(this, ec)) == null || g.commitOrRemove();
  7457. for (const C of M(this, hC))
  7458. C !== I && C.unselect();
  7459. M(this, hC).clear(), M(this, hC).add(I), I.select(), ig(this, Og, rl).call(this, I.propertiesToUpdate), ig(this, Og, Yi).call(this, {
  7460. hasSelectedEditor: !0
  7461. });
  7462. }
  7463. isSelected(I) {
  7464. return M(this, hC).has(I);
  7465. }
  7466. get firstSelectedEditor() {
  7467. return M(this, hC).values().next().value;
  7468. }
  7469. unselect(I) {
  7470. I.unselect(), M(this, hC).delete(I), ig(this, Og, Yi).call(this, {
  7471. hasSelectedEditor: this.hasSelection
  7472. });
  7473. }
  7474. get hasSelection() {
  7475. return M(this, hC).size !== 0;
  7476. }
  7477. get isEnterHandled() {
  7478. return M(this, hC).size === 1 && this.firstSelectedEditor.isEnterHandled;
  7479. }
  7480. undo() {
  7481. var I;
  7482. M(this, Qe).undo(), ig(this, Og, Yi).call(this, {
  7483. hasSomethingToUndo: M(this, Qe).hasSomethingToUndo(),
  7484. hasSomethingToRedo: !0,
  7485. isEmpty: ig(this, Og, Tu).call(this)
  7486. }), (I = this._editorUndoBar) == null || I.hide();
  7487. }
  7488. redo() {
  7489. M(this, Qe).redo(), ig(this, Og, Yi).call(this, {
  7490. hasSomethingToUndo: !0,
  7491. hasSomethingToRedo: M(this, Qe).hasSomethingToRedo(),
  7492. isEmpty: ig(this, Og, Tu).call(this)
  7493. });
  7494. }
  7495. addCommands(I) {
  7496. M(this, Qe).add(I), ig(this, Og, Yi).call(this, {
  7497. hasSomethingToUndo: !0,
  7498. hasSomethingToRedo: !1,
  7499. isEmpty: ig(this, Og, Tu).call(this)
  7500. });
  7501. }
  7502. cleanUndoStack(I) {
  7503. M(this, Qe).cleanType(I);
  7504. }
  7505. delete() {
  7506. var e;
  7507. this.commitOrRemove();
  7508. const I = (e = this.currentLayer) == null ? void 0 : e.endDrawingSession(!0);
  7509. if (!this.hasSelection && !I)
  7510. return;
  7511. const g = I ? [I] : [...M(this, hC)], C = () => {
  7512. var A;
  7513. (A = this._editorUndoBar) == null || A.show(i, g.length === 1 ? g[0].editorType : g.length);
  7514. for (const s of g)
  7515. s.remove();
  7516. }, i = () => {
  7517. for (const A of g)
  7518. ig(this, Og, CS).call(this, A);
  7519. };
  7520. this.addCommands({
  7521. cmd: C,
  7522. undo: i,
  7523. mustExec: !0
  7524. });
  7525. }
  7526. commitOrRemove() {
  7527. var I;
  7528. (I = M(this, ce)) == null || I.commitOrRemove();
  7529. }
  7530. hasSomethingToControl() {
  7531. return M(this, ce) || this.hasSelection;
  7532. }
  7533. selectAll() {
  7534. for (const I of M(this, hC))
  7535. I.commit();
  7536. ig(this, Og, tS).call(this, M(this, Bt).values());
  7537. }
  7538. unselectAll() {
  7539. var I;
  7540. if (!(M(this, ce) && (M(this, ce).commitOrRemove(), M(this, St) !== XI.NONE)) && !((I = M(this, ec)) != null && I.commitOrRemove()) && this.hasSelection) {
  7541. for (const g of M(this, hC))
  7542. g.unselect();
  7543. M(this, hC).clear(), ig(this, Og, Yi).call(this, {
  7544. hasSelectedEditor: !1
  7545. });
  7546. }
  7547. }
  7548. translateSelectedEditors(I, g, C = !1) {
  7549. if (C || this.commitOrRemove(), !this.hasSelection)
  7550. return;
  7551. M(this, Ga)[0] += I, M(this, Ga)[1] += g;
  7552. const [i, e] = M(this, Ga), A = [...M(this, hC)], s = 1e3;
  7553. M(this, Zs) && clearTimeout(M(this, Zs)), $(this, Zs, setTimeout(() => {
  7554. $(this, Zs, null), M(this, Ga)[0] = M(this, Ga)[1] = 0, this.addCommands({
  7555. cmd: () => {
  7556. for (const l of A)
  7557. M(this, Bt).has(l.id) && (l.translateInPage(i, e), l.translationDone());
  7558. },
  7559. undo: () => {
  7560. for (const l of A)
  7561. M(this, Bt).has(l.id) && (l.translateInPage(-i, -e), l.translationDone());
  7562. },
  7563. mustExec: !1
  7564. });
  7565. }, s));
  7566. for (const l of A)
  7567. l.translateInPage(I, g), l.translationDone();
  7568. }
  7569. setUpDragSession() {
  7570. if (this.hasSelection) {
  7571. this.disableUserSelect(!0), $(this, bs, /* @__PURE__ */ new Map());
  7572. for (const I of M(this, hC))
  7573. M(this, bs).set(I, {
  7574. savedX: I.x,
  7575. savedY: I.y,
  7576. savedPageIndex: I.pageIndex,
  7577. newX: 0,
  7578. newY: 0,
  7579. newPageIndex: -1
  7580. });
  7581. }
  7582. }
  7583. endDragSession() {
  7584. if (!M(this, bs))
  7585. return !1;
  7586. this.disableUserSelect(!1);
  7587. const I = M(this, bs);
  7588. $(this, bs, null);
  7589. let g = !1;
  7590. for (const [{
  7591. x: i,
  7592. y: e,
  7593. pageIndex: A
  7594. }, s] of I)
  7595. s.newX = i, s.newY = e, s.newPageIndex = A, g || (g = i !== s.savedX || e !== s.savedY || A !== s.savedPageIndex);
  7596. if (!g)
  7597. return !1;
  7598. const C = (i, e, A, s) => {
  7599. if (M(this, Bt).has(i.id)) {
  7600. const l = M(this, Et).get(s);
  7601. l ? i._setParentAndPosition(l, e, A) : (i.pageIndex = s, i.x = e, i.y = A);
  7602. }
  7603. };
  7604. return this.addCommands({
  7605. cmd: () => {
  7606. for (const [i, {
  7607. newX: e,
  7608. newY: A,
  7609. newPageIndex: s
  7610. }] of I)
  7611. C(i, e, A, s);
  7612. },
  7613. undo: () => {
  7614. for (const [i, {
  7615. savedX: e,
  7616. savedY: A,
  7617. savedPageIndex: s
  7618. }] of I)
  7619. C(i, e, A, s);
  7620. },
  7621. mustExec: !0
  7622. }), !0;
  7623. }
  7624. dragSelectedEditors(I, g) {
  7625. if (M(this, bs))
  7626. for (const C of M(this, bs).keys())
  7627. C.drag(I, g);
  7628. }
  7629. rebuild(I) {
  7630. if (I.parent === null) {
  7631. const g = this.getLayer(I.pageIndex);
  7632. g ? (g.changeParent(I), g.addOrRebuild(I)) : (this.addEditor(I), this.addToAnnotationStorage(I), I.rebuild());
  7633. } else
  7634. I.parent.addOrRebuild(I);
  7635. }
  7636. get isEditorHandlingKeyboard() {
  7637. var I;
  7638. return ((I = this.getActive()) == null ? void 0 : I.shouldGetKeyboardEvents()) || M(this, hC).size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents();
  7639. }
  7640. isActive(I) {
  7641. return M(this, ce) === I;
  7642. }
  7643. getActive() {
  7644. return M(this, ce);
  7645. }
  7646. getMode() {
  7647. return M(this, St);
  7648. }
  7649. get imageManager() {
  7650. return UI(this, "imageManager", new PX());
  7651. }
  7652. getSelectionBoxes(I) {
  7653. if (!I)
  7654. return null;
  7655. const g = document.getSelection();
  7656. for (let n = 0, a = g.rangeCount; n < a; n++)
  7657. if (!I.contains(g.getRangeAt(n).commonAncestorContainer))
  7658. return null;
  7659. const {
  7660. x: C,
  7661. y: i,
  7662. width: e,
  7663. height: A
  7664. } = I.getBoundingClientRect();
  7665. let s;
  7666. switch (I.getAttribute("data-main-rotation")) {
  7667. case "90":
  7668. s = (n, a, d, o) => ({
  7669. x: (a - i) / A,
  7670. y: 1 - (n + d - C) / e,
  7671. width: o / A,
  7672. height: d / e
  7673. });
  7674. break;
  7675. case "180":
  7676. s = (n, a, d, o) => ({
  7677. x: 1 - (n + d - C) / e,
  7678. y: 1 - (a + o - i) / A,
  7679. width: d / e,
  7680. height: o / A
  7681. });
  7682. break;
  7683. case "270":
  7684. s = (n, a, d, o) => ({
  7685. x: 1 - (a + o - i) / A,
  7686. y: (n - C) / e,
  7687. width: o / A,
  7688. height: d / e
  7689. });
  7690. break;
  7691. default:
  7692. s = (n, a, d, o) => ({
  7693. x: (n - C) / e,
  7694. y: (a - i) / A,
  7695. width: d / e,
  7696. height: o / A
  7697. });
  7698. break;
  7699. }
  7700. const l = [];
  7701. for (let n = 0, a = g.rangeCount; n < a; n++) {
  7702. const d = g.getRangeAt(n);
  7703. if (!d.collapsed)
  7704. for (const {
  7705. x: o,
  7706. y: c,
  7707. width: r,
  7708. height: h
  7709. } of d.getClientRects())
  7710. r === 0 || h === 0 || l.push(s(o, c, r, h));
  7711. }
  7712. return l.length === 0 ? null : l;
  7713. }
  7714. addChangedExistingAnnotation({
  7715. annotationElementId: I,
  7716. id: g
  7717. }) {
  7718. (M(this, Bh) || $(this, Bh, /* @__PURE__ */ new Map())).set(I, g);
  7719. }
  7720. removeChangedExistingAnnotation({
  7721. annotationElementId: I
  7722. }) {
  7723. var g;
  7724. (g = M(this, Bh)) == null || g.delete(I);
  7725. }
  7726. renderAnnotationElement(I) {
  7727. var i;
  7728. const g = (i = M(this, Bh)) == null ? void 0 : i.get(I.data.id);
  7729. if (!g)
  7730. return;
  7731. const C = M(this, Zl).getRawValue(g);
  7732. C && (M(this, St) === XI.NONE && !C.hasBeenModified || C.renderAnnotationElement(I));
  7733. }
  7734. setMissingCanvas(I, g, C) {
  7735. var e;
  7736. const i = (e = M(this, ma)) == null ? void 0 : e.get(I);
  7737. i && (i.setCanvas(g, C), M(this, ma).delete(I));
  7738. }
  7739. addMissingCanvas(I, g) {
  7740. (M(this, ma) || $(this, ma, /* @__PURE__ */ new Map())).set(I, g);
  7741. }
  7742. };
  7743. wh = new WeakMap(), ce = new WeakMap(), Bt = new WeakMap(), Et = new WeakMap(), ph = new WeakMap(), Zl = new WeakMap(), Bh = new WeakMap(), Qe = new WeakMap(), da = new WeakMap(), ec = new WeakMap(), Wh = new WeakMap(), Ac = new WeakMap(), bs = new WeakMap(), pA = new WeakMap(), sc = new WeakMap(), Jm = new WeakMap(), Lm = new WeakMap(), yh = new WeakMap(), vm = new WeakMap(), us = new WeakMap(), ra = new WeakMap(), Yh = new WeakMap(), ha = new WeakMap(), ms = new WeakMap(), DV = new WeakMap(), ba = new WeakMap(), Tm = new WeakMap(), ua = new WeakMap(), lc = new WeakMap(), nc = new WeakMap(), ma = new WeakMap(), xm = new WeakMap(), St = new WeakMap(), hC = new WeakMap(), Gl = new WeakMap(), Za = new WeakMap(), ac = new WeakMap(), jm = new WeakMap(), Qm = new WeakMap(), Ga = new WeakMap(), Zs = new WeakMap(), wl = new WeakMap(), Om = new WeakMap(), Oe = new WeakMap(), Og = new WeakSet(), rN = function({
  7744. anchorNode: I
  7745. }) {
  7746. return I.nodeType === Node.TEXT_NODE ? I.parentElement : I;
  7747. }, qX = function(I) {
  7748. const {
  7749. currentLayer: g
  7750. } = this;
  7751. if (g.hasTextLayer(I))
  7752. return g;
  7753. for (const C of M(this, Et).values())
  7754. if (C.hasTextLayer(I))
  7755. return C;
  7756. return null;
  7757. }, v$ = function() {
  7758. const I = document.getSelection();
  7759. if (!I || I.isCollapsed)
  7760. return;
  7761. const C = ig(this, Og, rN).call(this, I).closest(".textLayer"), i = this.getSelectionBoxes(C);
  7762. i && (M(this, ms) || $(this, ms, new tcg(this)), M(this, ms).show(C, i, this.direction === "ltr"));
  7763. }, T$ = function() {
  7764. var e, A, s;
  7765. const I = document.getSelection();
  7766. if (!I || I.isCollapsed) {
  7767. M(this, Gl) && ((e = M(this, ms)) == null || e.hide(), $(this, Gl, null), ig(this, Og, Yi).call(this, {
  7768. hasSelectedText: !1
  7769. }));
  7770. return;
  7771. }
  7772. const {
  7773. anchorNode: g
  7774. } = I;
  7775. if (g === M(this, Gl))
  7776. return;
  7777. const i = ig(this, Og, rN).call(this, I).closest(".textLayer");
  7778. if (!i) {
  7779. M(this, Gl) && ((A = M(this, ms)) == null || A.hide(), $(this, Gl, null), ig(this, Og, Yi).call(this, {
  7780. hasSelectedText: !1
  7781. }));
  7782. return;
  7783. }
  7784. if ((s = M(this, ms)) == null || s.hide(), $(this, Gl, g), ig(this, Og, Yi).call(this, {
  7785. hasSelectedText: !0
  7786. }), !(M(this, St) !== XI.HIGHLIGHT && M(this, St) !== XI.NONE) && (M(this, St) === XI.HIGHLIGHT && this.showAllEditors("highlight", !0, !0), $(this, ha, this.isShiftKeyDown), !this.isShiftKeyDown)) {
  7787. const l = M(this, St) === XI.HIGHLIGHT ? ig(this, Og, qX).call(this, i) : null;
  7788. l == null || l.toggleDrawing();
  7789. const n = new AbortController(), a = this.combinedSignal(n), d = (o) => {
  7790. o.type === "pointerup" && o.button !== 0 || (n.abort(), l == null || l.toggleDrawing(!0), o.type === "pointerup" && ig(this, Og, hN).call(this, "main_toolbar"));
  7791. };
  7792. window.addEventListener("pointerup", d, {
  7793. signal: a
  7794. }), window.addEventListener("blur", d, {
  7795. signal: a
  7796. });
  7797. }
  7798. }, hN = function(I = "") {
  7799. M(this, St) === XI.HIGHLIGHT ? this.highlightSelection(I) : M(this, Jm) && ig(this, Og, v$).call(this);
  7800. }, x$ = function() {
  7801. document.addEventListener("selectionchange", ig(this, Og, T$).bind(this), {
  7802. signal: this._signal
  7803. });
  7804. }, j$ = function() {
  7805. if (M(this, ra))
  7806. return;
  7807. $(this, ra, new AbortController());
  7808. const I = this.combinedSignal(M(this, ra));
  7809. window.addEventListener("focus", this.focus.bind(this), {
  7810. signal: I
  7811. }), window.addEventListener("blur", this.blur.bind(this), {
  7812. signal: I
  7813. });
  7814. }, Q$ = function() {
  7815. var I;
  7816. (I = M(this, ra)) == null || I.abort(), $(this, ra, null);
  7817. }, $X = function() {
  7818. if (M(this, ua))
  7819. return;
  7820. $(this, ua, new AbortController());
  7821. const I = this.combinedSignal(M(this, ua));
  7822. window.addEventListener("keydown", this.keydown.bind(this), {
  7823. signal: I
  7824. }), window.addEventListener("keyup", this.keyup.bind(this), {
  7825. signal: I
  7826. });
  7827. }, O$ = function() {
  7828. var I;
  7829. (I = M(this, ua)) == null || I.abort(), $(this, ua, null);
  7830. }, gS = function() {
  7831. if (M(this, da))
  7832. return;
  7833. $(this, da, new AbortController());
  7834. const I = this.combinedSignal(M(this, da));
  7835. document.addEventListener("copy", this.copy.bind(this), {
  7836. signal: I
  7837. }), document.addEventListener("cut", this.cut.bind(this), {
  7838. signal: I
  7839. }), document.addEventListener("paste", this.paste.bind(this), {
  7840. signal: I
  7841. });
  7842. }, IS = function() {
  7843. var I;
  7844. (I = M(this, da)) == null || I.abort(), $(this, da, null);
  7845. }, U$ = function() {
  7846. const I = this._signal;
  7847. document.addEventListener("dragover", this.dragOver.bind(this), {
  7848. signal: I
  7849. }), document.addEventListener("drop", this.drop.bind(this), {
  7850. signal: I
  7851. });
  7852. }, Yi = function(I) {
  7853. Object.entries(I).some(([C, i]) => M(this, Qm)[C] !== i) && (this._eventBus.dispatch("annotationeditorstateschanged", {
  7854. source: this,
  7855. details: Object.assign(M(this, Qm), I)
  7856. }), M(this, St) === XI.HIGHLIGHT && I.hasSelectedEditor === !1 && ig(this, Og, rl).call(this, [[iC.HIGHLIGHT_FREE, !0]]));
  7857. }, rl = function(I) {
  7858. this._eventBus.dispatch("annotationeditorparamschanged", {
  7859. source: this,
  7860. details: I
  7861. });
  7862. }, E$ = async function() {
  7863. if (!M(this, ba)) {
  7864. $(this, ba, !0);
  7865. const I = [];
  7866. for (const g of M(this, Et).values())
  7867. I.push(g.enable());
  7868. await Promise.all(I);
  7869. for (const g of M(this, Bt).values())
  7870. g.enable();
  7871. }
  7872. }, P$ = function() {
  7873. if (this.unselectAll(), M(this, ba)) {
  7874. $(this, ba, !1);
  7875. for (const I of M(this, Et).values())
  7876. I.disable();
  7877. for (const I of M(this, Bt).values())
  7878. I.disable();
  7879. }
  7880. }, CS = function(I) {
  7881. const g = M(this, Et).get(I.pageIndex);
  7882. g ? g.addOrRebuild(I) : (this.addEditor(I), this.addToAnnotationStorage(I));
  7883. }, _$ = function() {
  7884. let I = null;
  7885. for (I of M(this, hC))
  7886. ;
  7887. return I;
  7888. }, Tu = function() {
  7889. if (M(this, Bt).size === 0)
  7890. return !0;
  7891. if (M(this, Bt).size === 1)
  7892. for (const I of M(this, Bt).values())
  7893. return I.isEmpty();
  7894. return !1;
  7895. }, tS = function(I) {
  7896. for (const g of M(this, hC))
  7897. g.unselect();
  7898. M(this, hC).clear();
  7899. for (const g of I)
  7900. g.isEmpty() || (M(this, hC).add(g), g.select());
  7901. ig(this, Og, Yi).call(this, {
  7902. hasSelectedEditor: this.hasSelection
  7903. });
  7904. }, iI(lh, "TRANSLATE_SMALL", 1), iI(lh, "TRANSLATE_BIG", 10);
  7905. let dd = lh;
  7906. var Dt, Gs, BA, Nh, ws, de, Vh, ps, Qi, pl, oc, Bs, wa, kA, xu, bN;
  7907. const Ni = class Ni {
  7908. constructor(I) {
  7909. tg(this, kA);
  7910. tg(this, Dt, null);
  7911. tg(this, Gs, !1);
  7912. tg(this, BA, null);
  7913. tg(this, Nh, null);
  7914. tg(this, ws, null);
  7915. tg(this, de, null);
  7916. tg(this, Vh, !1);
  7917. tg(this, ps, null);
  7918. tg(this, Qi, null);
  7919. tg(this, pl, null);
  7920. tg(this, oc, null);
  7921. tg(this, Bs, !1);
  7922. $(this, Qi, I), $(this, Bs, I._uiManager.useNewAltTextFlow), M(Ni, wa) || $(Ni, wa, Object.freeze({
  7923. added: "pdfjs-editor-new-alt-text-added-button",
  7924. "added-label": "pdfjs-editor-new-alt-text-added-button-label",
  7925. missing: "pdfjs-editor-new-alt-text-missing-button",
  7926. "missing-label": "pdfjs-editor-new-alt-text-missing-button-label",
  7927. review: "pdfjs-editor-new-alt-text-to-review-button",
  7928. "review-label": "pdfjs-editor-new-alt-text-to-review-button-label"
  7929. }));
  7930. }
  7931. static initialize(I) {
  7932. Ni._l10n ?? (Ni._l10n = I);
  7933. }
  7934. async render() {
  7935. const I = $(this, BA, document.createElement("button"));
  7936. I.className = "altText", I.tabIndex = "0";
  7937. const g = $(this, Nh, document.createElement("span"));
  7938. I.append(g), M(this, Bs) ? (I.classList.add("new"), I.setAttribute("data-l10n-id", M(Ni, wa).missing), g.setAttribute("data-l10n-id", M(Ni, wa)["missing-label"])) : (I.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button"), g.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button-label"));
  7939. const C = M(this, Qi)._uiManager._signal;
  7940. I.addEventListener("contextmenu", zA, {
  7941. signal: C
  7942. }), I.addEventListener("pointerdown", (e) => e.stopPropagation(), {
  7943. signal: C
  7944. });
  7945. const i = (e) => {
  7946. e.preventDefault(), M(this, Qi)._uiManager.editAltText(M(this, Qi)), M(this, Bs) && M(this, Qi)._reportTelemetry({
  7947. action: "pdfjs.image.alt_text.image_status_label_clicked",
  7948. data: {
  7949. label: M(this, kA, xu)
  7950. }
  7951. });
  7952. };
  7953. return I.addEventListener("click", i, {
  7954. capture: !0,
  7955. signal: C
  7956. }), I.addEventListener("keydown", (e) => {
  7957. e.target === I && e.key === "Enter" && ($(this, Vh, !0), i(e));
  7958. }, {
  7959. signal: C
  7960. }), await ig(this, kA, bN).call(this), I;
  7961. }
  7962. finish() {
  7963. M(this, BA) && (M(this, BA).focus({
  7964. focusVisible: M(this, Vh)
  7965. }), $(this, Vh, !1));
  7966. }
  7967. isEmpty() {
  7968. return M(this, Bs) ? M(this, Dt) === null : !M(this, Dt) && !M(this, Gs);
  7969. }
  7970. hasData() {
  7971. return M(this, Bs) ? M(this, Dt) !== null || !!M(this, pl) : this.isEmpty();
  7972. }
  7973. get guessedText() {
  7974. return M(this, pl);
  7975. }
  7976. async setGuessedText(I) {
  7977. M(this, Dt) === null && ($(this, pl, I), $(this, oc, await Ni._l10n.get("pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer", {
  7978. generatedAltText: I
  7979. })), ig(this, kA, bN).call(this));
  7980. }
  7981. toggleAltTextBadge(I = !1) {
  7982. var g;
  7983. if (!M(this, Bs) || M(this, Dt)) {
  7984. (g = M(this, ps)) == null || g.remove(), $(this, ps, null);
  7985. return;
  7986. }
  7987. if (!M(this, ps)) {
  7988. const C = $(this, ps, document.createElement("div"));
  7989. C.className = "noAltTextBadge", M(this, Qi).div.append(C);
  7990. }
  7991. M(this, ps).classList.toggle("hidden", !I);
  7992. }
  7993. serialize(I) {
  7994. let g = M(this, Dt);
  7995. return !I && M(this, pl) === g && (g = M(this, oc)), {
  7996. altText: g,
  7997. decorative: M(this, Gs),
  7998. guessedText: M(this, pl),
  7999. textWithDisclaimer: M(this, oc)
  8000. };
  8001. }
  8002. get data() {
  8003. return {
  8004. altText: M(this, Dt),
  8005. decorative: M(this, Gs)
  8006. };
  8007. }
  8008. set data({
  8009. altText: I,
  8010. decorative: g,
  8011. guessedText: C,
  8012. textWithDisclaimer: i,
  8013. cancel: e = !1
  8014. }) {
  8015. C && ($(this, pl, C), $(this, oc, i)), !(M(this, Dt) === I && M(this, Gs) === g) && (e || ($(this, Dt, I), $(this, Gs, g)), ig(this, kA, bN).call(this));
  8016. }
  8017. toggle(I = !1) {
  8018. M(this, BA) && (!I && M(this, de) && (clearTimeout(M(this, de)), $(this, de, null)), M(this, BA).disabled = !I);
  8019. }
  8020. shown() {
  8021. M(this, Qi)._reportTelemetry({
  8022. action: "pdfjs.image.alt_text.image_status_label_displayed",
  8023. data: {
  8024. label: M(this, kA, xu)
  8025. }
  8026. });
  8027. }
  8028. destroy() {
  8029. var I, g;
  8030. (I = M(this, BA)) == null || I.remove(), $(this, BA, null), $(this, Nh, null), $(this, ws, null), (g = M(this, ps)) == null || g.remove(), $(this, ps, null);
  8031. }
  8032. };
  8033. Dt = new WeakMap(), Gs = new WeakMap(), BA = new WeakMap(), Nh = new WeakMap(), ws = new WeakMap(), de = new WeakMap(), Vh = new WeakMap(), ps = new WeakMap(), Qi = new WeakMap(), pl = new WeakMap(), oc = new WeakMap(), Bs = new WeakMap(), wa = new WeakMap(), kA = new WeakSet(), xu = function() {
  8034. return M(this, Dt) && "added" || M(this, Dt) === null && this.guessedText && "review" || "missing";
  8035. }, bN = async function() {
  8036. var i, e, A;
  8037. const I = M(this, BA);
  8038. if (!I)
  8039. return;
  8040. if (M(this, Bs)) {
  8041. if (I.classList.toggle("done", !!M(this, Dt)), I.setAttribute("data-l10n-id", M(Ni, wa)[M(this, kA, xu)]), (i = M(this, Nh)) == null || i.setAttribute("data-l10n-id", M(Ni, wa)[`${M(this, kA, xu)}-label`]), !M(this, Dt)) {
  8042. (e = M(this, ws)) == null || e.remove();
  8043. return;
  8044. }
  8045. } else {
  8046. if (!M(this, Dt) && !M(this, Gs)) {
  8047. I.classList.remove("done"), (A = M(this, ws)) == null || A.remove();
  8048. return;
  8049. }
  8050. I.classList.add("done"), I.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-edit-button");
  8051. }
  8052. let g = M(this, ws);
  8053. if (!g) {
  8054. $(this, ws, g = document.createElement("span")), g.className = "tooltip", g.setAttribute("role", "tooltip"), g.id = `alt-text-tooltip-${M(this, Qi).id}`;
  8055. const s = 100, l = M(this, Qi)._uiManager._signal;
  8056. l.addEventListener("abort", () => {
  8057. clearTimeout(M(this, de)), $(this, de, null);
  8058. }, {
  8059. once: !0
  8060. }), I.addEventListener("mouseenter", () => {
  8061. $(this, de, setTimeout(() => {
  8062. $(this, de, null), M(this, ws).classList.add("show"), M(this, Qi)._reportTelemetry({
  8063. action: "alt_text_tooltip"
  8064. });
  8065. }, s));
  8066. }, {
  8067. signal: l
  8068. }), I.addEventListener("mouseleave", () => {
  8069. var n;
  8070. M(this, de) && (clearTimeout(M(this, de)), $(this, de, null)), (n = M(this, ws)) == null || n.classList.remove("show");
  8071. }, {
  8072. signal: l
  8073. });
  8074. }
  8075. M(this, Gs) ? g.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-decorative-tooltip") : (g.removeAttribute("data-l10n-id"), g.textContent = M(this, Dt)), g.parentNode || I.append(g);
  8076. const C = M(this, Qi).getElementForAltText();
  8077. C == null || C.setAttribute("aria-describedby", g.id);
  8078. }, tg(Ni, wa, null), iI(Ni, "_l10n", null);
  8079. let tV = Ni;
  8080. var Mh, cc, Um, Em, Pm, _m, qm, Bl, dc, Wl, rc, pa, $a, q$, $$, ggg;
  8081. const t1 = class t1 {
  8082. constructor({
  8083. container: I,
  8084. isPinchingDisabled: g = null,
  8085. isPinchingStopped: C = null,
  8086. onPinchStart: i = null,
  8087. onPinching: e = null,
  8088. onPinchEnd: A = null,
  8089. signal: s
  8090. }) {
  8091. tg(this, $a);
  8092. tg(this, Mh);
  8093. tg(this, cc, !1);
  8094. tg(this, Um, null);
  8095. tg(this, Em);
  8096. tg(this, Pm);
  8097. tg(this, _m);
  8098. tg(this, qm);
  8099. tg(this, Bl, null);
  8100. tg(this, dc);
  8101. tg(this, Wl, null);
  8102. tg(this, rc);
  8103. tg(this, pa, null);
  8104. $(this, Mh, I), $(this, Um, C), $(this, Em, g), $(this, Pm, i), $(this, _m, e), $(this, qm, A), $(this, rc, new AbortController()), $(this, dc, AbortSignal.any([s, M(this, rc).signal])), I.addEventListener("touchstart", ig(this, $a, q$).bind(this), {
  8105. passive: !1,
  8106. signal: M(this, dc)
  8107. });
  8108. }
  8109. get MIN_TOUCH_DISTANCE_TO_PINCH() {
  8110. return 35 / In.pixelRatio;
  8111. }
  8112. destroy() {
  8113. var I, g;
  8114. (I = M(this, rc)) == null || I.abort(), $(this, rc, null), (g = M(this, Bl)) == null || g.abort(), $(this, Bl, null);
  8115. }
  8116. };
  8117. Mh = new WeakMap(), cc = new WeakMap(), Um = new WeakMap(), Em = new WeakMap(), Pm = new WeakMap(), _m = new WeakMap(), qm = new WeakMap(), Bl = new WeakMap(), dc = new WeakMap(), Wl = new WeakMap(), rc = new WeakMap(), pa = new WeakMap(), $a = new WeakSet(), q$ = function(I) {
  8118. var i, e, A;
  8119. if ((i = M(this, Em)) != null && i.call(this))
  8120. return;
  8121. if (I.touches.length === 1) {
  8122. if (M(this, Bl))
  8123. return;
  8124. const s = $(this, Bl, new AbortController()), l = AbortSignal.any([M(this, dc), s.signal]), n = M(this, Mh), a = {
  8125. capture: !0,
  8126. signal: l,
  8127. passive: !1
  8128. }, d = (o) => {
  8129. var c;
  8130. o.pointerType === "touch" && ((c = M(this, Bl)) == null || c.abort(), $(this, Bl, null));
  8131. };
  8132. n.addEventListener("pointerdown", (o) => {
  8133. o.pointerType === "touch" && (ht(o), d(o));
  8134. }, a), n.addEventListener("pointerup", d, a), n.addEventListener("pointercancel", d, a);
  8135. return;
  8136. }
  8137. if (!M(this, pa)) {
  8138. $(this, pa, new AbortController());
  8139. const s = AbortSignal.any([M(this, dc), M(this, pa).signal]), l = M(this, Mh), n = {
  8140. signal: s,
  8141. capture: !1,
  8142. passive: !1
  8143. };
  8144. l.addEventListener("touchmove", ig(this, $a, $$).bind(this), n);
  8145. const a = ig(this, $a, ggg).bind(this);
  8146. l.addEventListener("touchend", a, n), l.addEventListener("touchcancel", a, n), n.capture = !0, l.addEventListener("pointerdown", ht, n), l.addEventListener("pointermove", ht, n), l.addEventListener("pointercancel", ht, n), l.addEventListener("pointerup", ht, n), (e = M(this, Pm)) == null || e.call(this);
  8147. }
  8148. if (ht(I), I.touches.length !== 2 || (A = M(this, Um)) != null && A.call(this)) {
  8149. $(this, Wl, null);
  8150. return;
  8151. }
  8152. let [g, C] = I.touches;
  8153. g.identifier > C.identifier && ([g, C] = [C, g]), $(this, Wl, {
  8154. touch0X: g.screenX,
  8155. touch0Y: g.screenY,
  8156. touch1X: C.screenX,
  8157. touch1Y: C.screenY
  8158. });
  8159. }, $$ = function(I) {
  8160. var p;
  8161. if (!M(this, Wl) || I.touches.length !== 2)
  8162. return;
  8163. ht(I);
  8164. let [g, C] = I.touches;
  8165. g.identifier > C.identifier && ([g, C] = [C, g]);
  8166. const {
  8167. screenX: i,
  8168. screenY: e
  8169. } = g, {
  8170. screenX: A,
  8171. screenY: s
  8172. } = C, l = M(this, Wl), {
  8173. touch0X: n,
  8174. touch0Y: a,
  8175. touch1X: d,
  8176. touch1Y: o
  8177. } = l, c = d - n, r = o - a, h = A - i, b = s - e, u = Math.hypot(h, b) || 1, m = Math.hypot(c, r) || 1;
  8178. if (!M(this, cc) && Math.abs(m - u) <= t1.MIN_TOUCH_DISTANCE_TO_PINCH)
  8179. return;
  8180. if (l.touch0X = i, l.touch0Y = e, l.touch1X = A, l.touch1Y = s, !M(this, cc)) {
  8181. $(this, cc, !0);
  8182. return;
  8183. }
  8184. const Z = [(i + A) / 2, (e + s) / 2];
  8185. (p = M(this, _m)) == null || p.call(this, Z, m, u);
  8186. }, ggg = function(I) {
  8187. var g;
  8188. I.touches.length >= 2 || (M(this, pa).abort(), $(this, pa, null), (g = M(this, qm)) == null || g.call(this), M(this, Wl) && (ht(I), $(this, Wl, null), $(this, cc, !1)));
  8189. };
  8190. let iV = t1;
  8191. var hc, WA, XC, Rh, Ba, $m, bc, Pt, uc, yl, Wa, gZ, mc, re, IZ, Zc, Yl, Ws, fh, Hh, Ue, Gc, CZ, KV, wI, iS, tZ, eS, uN, Igg, Cgg, AS, mN, sS, tgg, igg, egg, lS, Agg, nS, sgg, lgg, ngg, aS, ju;
  8192. const zI = class zI {
  8193. constructor(I) {
  8194. tg(this, wI);
  8195. tg(this, hc, null);
  8196. tg(this, WA, null);
  8197. tg(this, XC, null);
  8198. tg(this, Rh, !1);
  8199. tg(this, Ba, null);
  8200. tg(this, $m, "");
  8201. tg(this, bc, !1);
  8202. tg(this, Pt, null);
  8203. tg(this, uc, null);
  8204. tg(this, yl, null);
  8205. tg(this, Wa, null);
  8206. tg(this, gZ, "");
  8207. tg(this, mc, !1);
  8208. tg(this, re, null);
  8209. tg(this, IZ, !1);
  8210. tg(this, Zc, !1);
  8211. tg(this, Yl, !1);
  8212. tg(this, Ws, null);
  8213. tg(this, fh, 0);
  8214. tg(this, Hh, 0);
  8215. tg(this, Ue, null);
  8216. tg(this, Gc, null);
  8217. iI(this, "_isCopy", !1);
  8218. iI(this, "_editToolbar", null);
  8219. iI(this, "_initialOptions", /* @__PURE__ */ Object.create(null));
  8220. iI(this, "_initialData", null);
  8221. iI(this, "_isVisible", !0);
  8222. iI(this, "_uiManager", null);
  8223. iI(this, "_focusEventsAllowed", !0);
  8224. tg(this, CZ, !1);
  8225. tg(this, KV, zI._zIndex++);
  8226. this.parent = I.parent, this.id = I.id, this.width = this.height = null, this.pageIndex = I.parent.pageIndex, this.name = I.name, this.div = null, this._uiManager = I.uiManager, this.annotationElementId = null, this._willKeepAspectRatio = !1, this._initialOptions.isCentered = I.isCentered, this._structTreeParentId = null;
  8227. const {
  8228. rotation: g,
  8229. rawDims: {
  8230. pageWidth: C,
  8231. pageHeight: i,
  8232. pageX: e,
  8233. pageY: A
  8234. }
  8235. } = this.parent.viewport;
  8236. this.rotation = g, this.pageRotation = (360 + g - this._uiManager.viewParameters.rotation) % 360, this.pageDimensions = [C, i], this.pageTranslation = [e, A];
  8237. const [s, l] = this.parentDimensions;
  8238. this.x = I.x / s, this.y = I.y / l, this.isAttachedToDOM = !1, this.deleted = !1;
  8239. }
  8240. static get _resizerKeyboardManager() {
  8241. const I = zI.prototype._resizeWithKeyboard, g = dd.TRANSLATE_SMALL, C = dd.TRANSLATE_BIG;
  8242. return UI(this, "_resizerKeyboardManager", new lG([[["ArrowLeft", "mac+ArrowLeft"], I, {
  8243. args: [-g, 0]
  8244. }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], I, {
  8245. args: [-C, 0]
  8246. }], [["ArrowRight", "mac+ArrowRight"], I, {
  8247. args: [g, 0]
  8248. }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], I, {
  8249. args: [C, 0]
  8250. }], [["ArrowUp", "mac+ArrowUp"], I, {
  8251. args: [0, -g]
  8252. }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], I, {
  8253. args: [0, -C]
  8254. }], [["ArrowDown", "mac+ArrowDown"], I, {
  8255. args: [0, g]
  8256. }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], I, {
  8257. args: [0, C]
  8258. }], [["Escape", "mac+Escape"], zI.prototype._stopResizingWithKeyboard]]));
  8259. }
  8260. get editorType() {
  8261. return Object.getPrototypeOf(this).constructor._type;
  8262. }
  8263. static get isDrawer() {
  8264. return !1;
  8265. }
  8266. static get _defaultLineColor() {
  8267. return UI(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText"));
  8268. }
  8269. static deleteAnnotationElement(I) {
  8270. const g = new Acg({
  8271. id: I.parent.getNextId(),
  8272. parent: I.parent,
  8273. uiManager: I._uiManager
  8274. });
  8275. g.annotationElementId = I.annotationElementId, g.deleted = !0, g._uiManager.addToAnnotationStorage(g);
  8276. }
  8277. static initialize(I, g) {
  8278. if (zI._l10n ?? (zI._l10n = I), zI._l10nResizer || (zI._l10nResizer = Object.freeze({
  8279. topLeft: "pdfjs-editor-resizer-top-left",
  8280. topMiddle: "pdfjs-editor-resizer-top-middle",
  8281. topRight: "pdfjs-editor-resizer-top-right",
  8282. middleRight: "pdfjs-editor-resizer-middle-right",
  8283. bottomRight: "pdfjs-editor-resizer-bottom-right",
  8284. bottomMiddle: "pdfjs-editor-resizer-bottom-middle",
  8285. bottomLeft: "pdfjs-editor-resizer-bottom-left",
  8286. middleLeft: "pdfjs-editor-resizer-middle-left"
  8287. })), zI._borderLineWidth !== -1)
  8288. return;
  8289. const C = getComputedStyle(document.documentElement);
  8290. zI._borderLineWidth = parseFloat(C.getPropertyValue("--outline-width")) || 0;
  8291. }
  8292. static updateDefaultParams(I, g) {
  8293. }
  8294. static get defaultPropertiesToUpdate() {
  8295. return [];
  8296. }
  8297. static isHandlingMimeForPasting(I) {
  8298. return !1;
  8299. }
  8300. static paste(I, g) {
  8301. BC("Not implemented");
  8302. }
  8303. get propertiesToUpdate() {
  8304. return [];
  8305. }
  8306. get _isDraggable() {
  8307. return M(this, CZ);
  8308. }
  8309. set _isDraggable(I) {
  8310. var g;
  8311. $(this, CZ, I), (g = this.div) == null || g.classList.toggle("draggable", I);
  8312. }
  8313. get isEnterHandled() {
  8314. return !0;
  8315. }
  8316. center() {
  8317. const [I, g] = this.pageDimensions;
  8318. switch (this.parentRotation) {
  8319. case 90:
  8320. this.x -= this.height * g / (I * 2), this.y += this.width * I / (g * 2);
  8321. break;
  8322. case 180:
  8323. this.x += this.width / 2, this.y += this.height / 2;
  8324. break;
  8325. case 270:
  8326. this.x += this.height * g / (I * 2), this.y -= this.width * I / (g * 2);
  8327. break;
  8328. default:
  8329. this.x -= this.width / 2, this.y -= this.height / 2;
  8330. break;
  8331. }
  8332. this.fixAndSetPosition();
  8333. }
  8334. addCommands(I) {
  8335. this._uiManager.addCommands(I);
  8336. }
  8337. get currentLayer() {
  8338. return this._uiManager.currentLayer;
  8339. }
  8340. setInBackground() {
  8341. this.div.style.zIndex = 0;
  8342. }
  8343. setInForeground() {
  8344. this.div.style.zIndex = M(this, KV);
  8345. }
  8346. setParent(I) {
  8347. I !== null ? (this.pageIndex = I.pageIndex, this.pageDimensions = I.pageDimensions) : ig(this, wI, ju).call(this), this.parent = I;
  8348. }
  8349. focusin(I) {
  8350. this._focusEventsAllowed && (M(this, mc) ? $(this, mc, !1) : this.parent.setSelected(this));
  8351. }
  8352. focusout(I) {
  8353. var C;
  8354. if (!this._focusEventsAllowed || !this.isAttachedToDOM)
  8355. return;
  8356. const g = I.relatedTarget;
  8357. g != null && g.closest(`#${this.id}`) || (I.preventDefault(), (C = this.parent) != null && C.isMultipleSelection || this.commitOrRemove());
  8358. }
  8359. commitOrRemove() {
  8360. this.isEmpty() ? this.remove() : this.commit();
  8361. }
  8362. commit() {
  8363. this.addToAnnotationStorage();
  8364. }
  8365. addToAnnotationStorage() {
  8366. this._uiManager.addToAnnotationStorage(this);
  8367. }
  8368. setAt(I, g, C, i) {
  8369. const [e, A] = this.parentDimensions;
  8370. [C, i] = this.screenToPageTranslation(C, i), this.x = (I + C) / e, this.y = (g + i) / A, this.fixAndSetPosition();
  8371. }
  8372. _moveAfterPaste(I, g) {
  8373. const [C, i] = this.parentDimensions;
  8374. this.setAt(I * C, g * i, this.width * C, this.height * i), this._onTranslated();
  8375. }
  8376. translate(I, g) {
  8377. ig(this, wI, iS).call(this, this.parentDimensions, I, g);
  8378. }
  8379. translateInPage(I, g) {
  8380. M(this, re) || $(this, re, [this.x, this.y, this.width, this.height]), ig(this, wI, iS).call(this, this.pageDimensions, I, g), this.div.scrollIntoView({
  8381. block: "nearest"
  8382. });
  8383. }
  8384. translationDone() {
  8385. this._onTranslated(this.x, this.y);
  8386. }
  8387. drag(I, g) {
  8388. M(this, re) || $(this, re, [this.x, this.y, this.width, this.height]);
  8389. const {
  8390. div: C,
  8391. parentDimensions: [i, e]
  8392. } = this;
  8393. if (this.x += I / i, this.y += g / e, this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) {
  8394. const {
  8395. x: d,
  8396. y: o
  8397. } = this.div.getBoundingClientRect();
  8398. this.parent.findNewParent(this, d, o) && (this.x -= Math.floor(this.x), this.y -= Math.floor(this.y));
  8399. }
  8400. let {
  8401. x: A,
  8402. y: s
  8403. } = this;
  8404. const [l, n] = this.getBaseTranslation();
  8405. A += l, s += n;
  8406. const {
  8407. style: a
  8408. } = C;
  8409. a.left = `${(100 * A).toFixed(2)}%`, a.top = `${(100 * s).toFixed(2)}%`, this._onTranslating(A, s), C.scrollIntoView({
  8410. block: "nearest"
  8411. });
  8412. }
  8413. _onTranslating(I, g) {
  8414. }
  8415. _onTranslated(I, g) {
  8416. }
  8417. get _hasBeenMoved() {
  8418. return !!M(this, re) && (M(this, re)[0] !== this.x || M(this, re)[1] !== this.y);
  8419. }
  8420. get _hasBeenResized() {
  8421. return !!M(this, re) && (M(this, re)[2] !== this.width || M(this, re)[3] !== this.height);
  8422. }
  8423. getBaseTranslation() {
  8424. const [I, g] = this.parentDimensions, {
  8425. _borderLineWidth: C
  8426. } = zI, i = C / I, e = C / g;
  8427. switch (this.rotation) {
  8428. case 90:
  8429. return [-i, e];
  8430. case 180:
  8431. return [i, e];
  8432. case 270:
  8433. return [i, -e];
  8434. default:
  8435. return [-i, -e];
  8436. }
  8437. }
  8438. get _mustFixPosition() {
  8439. return !0;
  8440. }
  8441. fixAndSetPosition(I = this.rotation) {
  8442. const {
  8443. div: {
  8444. style: g
  8445. },
  8446. pageDimensions: [C, i]
  8447. } = this;
  8448. let {
  8449. x: e,
  8450. y: A,
  8451. width: s,
  8452. height: l
  8453. } = this;
  8454. if (s *= C, l *= i, e *= C, A *= i, this._mustFixPosition)
  8455. switch (I) {
  8456. case 0:
  8457. e = fi(e, 0, C - s), A = fi(A, 0, i - l);
  8458. break;
  8459. case 90:
  8460. e = fi(e, 0, C - l), A = fi(A, s, i);
  8461. break;
  8462. case 180:
  8463. e = fi(e, s, C), A = fi(A, l, i);
  8464. break;
  8465. case 270:
  8466. e = fi(e, l, C), A = fi(A, 0, i - s);
  8467. break;
  8468. }
  8469. this.x = e /= C, this.y = A /= i;
  8470. const [n, a] = this.getBaseTranslation();
  8471. e += n, A += a, g.left = `${(100 * e).toFixed(2)}%`, g.top = `${(100 * A).toFixed(2)}%`, this.moveInDOM();
  8472. }
  8473. screenToPageTranslation(I, g) {
  8474. var C;
  8475. return ig(C = zI, tZ, eS).call(C, I, g, this.parentRotation);
  8476. }
  8477. pageTranslationToScreen(I, g) {
  8478. var C;
  8479. return ig(C = zI, tZ, eS).call(C, I, g, 360 - this.parentRotation);
  8480. }
  8481. get parentScale() {
  8482. return this._uiManager.viewParameters.realScale;
  8483. }
  8484. get parentRotation() {
  8485. return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360;
  8486. }
  8487. get parentDimensions() {
  8488. const {
  8489. parentScale: I,
  8490. pageDimensions: [g, C]
  8491. } = this;
  8492. return [g * I, C * I];
  8493. }
  8494. setDims(I, g) {
  8495. const [C, i] = this.parentDimensions, {
  8496. style: e
  8497. } = this.div;
  8498. e.width = `${(100 * I / C).toFixed(2)}%`, M(this, bc) || (e.height = `${(100 * g / i).toFixed(2)}%`);
  8499. }
  8500. fixDims() {
  8501. const {
  8502. style: I
  8503. } = this.div, {
  8504. height: g,
  8505. width: C
  8506. } = I, i = C.endsWith("%"), e = !M(this, bc) && g.endsWith("%");
  8507. if (i && e)
  8508. return;
  8509. const [A, s] = this.parentDimensions;
  8510. i || (I.width = `${(100 * parseFloat(C) / A).toFixed(2)}%`), !M(this, bc) && !e && (I.height = `${(100 * parseFloat(g) / s).toFixed(2)}%`);
  8511. }
  8512. getInitialTranslation() {
  8513. return [0, 0];
  8514. }
  8515. _onResized() {
  8516. }
  8517. static _round(I) {
  8518. return Math.round(I * 1e4) / 1e4;
  8519. }
  8520. _onResizing() {
  8521. }
  8522. altTextFinish() {
  8523. var I;
  8524. (I = M(this, XC)) == null || I.finish();
  8525. }
  8526. async addEditToolbar() {
  8527. return this._editToolbar || M(this, Zc) ? this._editToolbar : (this._editToolbar = new EX(this), this.div.append(this._editToolbar.render()), M(this, XC) && await this._editToolbar.addAltText(M(this, XC)), this._editToolbar);
  8528. }
  8529. removeEditToolbar() {
  8530. var I;
  8531. this._editToolbar && (this._editToolbar.remove(), this._editToolbar = null, (I = M(this, XC)) == null || I.destroy());
  8532. }
  8533. addContainer(I) {
  8534. var C;
  8535. const g = (C = this._editToolbar) == null ? void 0 : C.div;
  8536. g ? g.before(I) : this.div.append(I);
  8537. }
  8538. getClientDimensions() {
  8539. return this.div.getBoundingClientRect();
  8540. }
  8541. async addAltTextButton() {
  8542. M(this, XC) || (tV.initialize(zI._l10n), $(this, XC, new tV(this)), M(this, hc) && (M(this, XC).data = M(this, hc), $(this, hc, null)), await this.addEditToolbar());
  8543. }
  8544. get altTextData() {
  8545. var I;
  8546. return (I = M(this, XC)) == null ? void 0 : I.data;
  8547. }
  8548. set altTextData(I) {
  8549. M(this, XC) && (M(this, XC).data = I);
  8550. }
  8551. get guessedAltText() {
  8552. var I;
  8553. return (I = M(this, XC)) == null ? void 0 : I.guessedText;
  8554. }
  8555. async setGuessedAltText(I) {
  8556. var g;
  8557. await ((g = M(this, XC)) == null ? void 0 : g.setGuessedText(I));
  8558. }
  8559. serializeAltText(I) {
  8560. var g;
  8561. return (g = M(this, XC)) == null ? void 0 : g.serialize(I);
  8562. }
  8563. hasAltText() {
  8564. return !!M(this, XC) && !M(this, XC).isEmpty();
  8565. }
  8566. hasAltTextData() {
  8567. var I;
  8568. return ((I = M(this, XC)) == null ? void 0 : I.hasData()) ?? !1;
  8569. }
  8570. render() {
  8571. var A;
  8572. const I = this.div = document.createElement("div");
  8573. I.setAttribute("data-editor-rotation", (360 - this.rotation) % 360), I.className = this.name, I.setAttribute("id", this.id), I.tabIndex = M(this, Rh) ? -1 : 0, I.setAttribute("role", "application"), this.defaultL10nId && I.setAttribute("data-l10n-id", this.defaultL10nId), this._isVisible || I.classList.add("hidden"), this.setInForeground(), ig(this, wI, nS).call(this);
  8574. const [g, C] = this.parentDimensions;
  8575. this.parentRotation % 180 !== 0 && (I.style.maxWidth = `${(100 * C / g).toFixed(2)}%`, I.style.maxHeight = `${(100 * g / C).toFixed(2)}%`);
  8576. const [i, e] = this.getInitialTranslation();
  8577. return this.translate(i, e), m9(this, I, ["keydown", "pointerdown"]), this.isResizable && this._uiManager._supportsPinchToZoom && (M(this, Gc) || $(this, Gc, new iV({
  8578. container: I,
  8579. isPinchingDisabled: () => !this.isSelected,
  8580. onPinchStart: ig(this, wI, tgg).bind(this),
  8581. onPinching: ig(this, wI, igg).bind(this),
  8582. onPinchEnd: ig(this, wI, egg).bind(this),
  8583. signal: this._uiManager._signal
  8584. }))), (A = this._uiManager._editorUndoBar) == null || A.hide(), I;
  8585. }
  8586. pointerdown(I) {
  8587. const {
  8588. isMac: g
  8589. } = Ai.platform;
  8590. if (I.button !== 0 || I.ctrlKey && g) {
  8591. I.preventDefault();
  8592. return;
  8593. }
  8594. if ($(this, mc, !0), this._isDraggable) {
  8595. ig(this, wI, Agg).call(this, I);
  8596. return;
  8597. }
  8598. ig(this, wI, lS).call(this, I);
  8599. }
  8600. get isSelected() {
  8601. return this._uiManager.isSelected(this);
  8602. }
  8603. _onStartDragging() {
  8604. }
  8605. _onStopDragging() {
  8606. }
  8607. moveInDOM() {
  8608. M(this, Ws) && clearTimeout(M(this, Ws)), $(this, Ws, setTimeout(() => {
  8609. var I;
  8610. $(this, Ws, null), (I = this.parent) == null || I.moveEditorInDOM(this);
  8611. }, 0));
  8612. }
  8613. _setParentAndPosition(I, g, C) {
  8614. I.changeParent(this), this.x = g, this.y = C, this.fixAndSetPosition(), this._onTranslated();
  8615. }
  8616. getRect(I, g, C = this.rotation) {
  8617. const i = this.parentScale, [e, A] = this.pageDimensions, [s, l] = this.pageTranslation, n = I / i, a = g / i, d = this.x * e, o = this.y * A, c = this.width * e, r = this.height * A;
  8618. switch (C) {
  8619. case 0:
  8620. return [d + n + s, A - o - a - r + l, d + n + c + s, A - o - a + l];
  8621. case 90:
  8622. return [d + a + s, A - o + n + l, d + a + r + s, A - o + n + c + l];
  8623. case 180:
  8624. return [d - n - c + s, A - o + a + l, d - n + s, A - o + a + r + l];
  8625. case 270:
  8626. return [d - a - r + s, A - o - n - c + l, d - a + s, A - o - n + l];
  8627. default:
  8628. throw new Error("Invalid rotation");
  8629. }
  8630. }
  8631. getRectInCurrentCoords(I, g) {
  8632. const [C, i, e, A] = I, s = e - C, l = A - i;
  8633. switch (this.rotation) {
  8634. case 0:
  8635. return [C, g - A, s, l];
  8636. case 90:
  8637. return [C, g - i, l, s];
  8638. case 180:
  8639. return [e, g - i, s, l];
  8640. case 270:
  8641. return [e, g - A, l, s];
  8642. default:
  8643. throw new Error("Invalid rotation");
  8644. }
  8645. }
  8646. onceAdded(I) {
  8647. }
  8648. isEmpty() {
  8649. return !1;
  8650. }
  8651. enableEditMode() {
  8652. $(this, Zc, !0);
  8653. }
  8654. disableEditMode() {
  8655. $(this, Zc, !1);
  8656. }
  8657. isInEditMode() {
  8658. return M(this, Zc);
  8659. }
  8660. shouldGetKeyboardEvents() {
  8661. return M(this, Yl);
  8662. }
  8663. needsToBeRebuilt() {
  8664. return this.div && !this.isAttachedToDOM;
  8665. }
  8666. get isOnScreen() {
  8667. const {
  8668. top: I,
  8669. left: g,
  8670. bottom: C,
  8671. right: i
  8672. } = this.getClientDimensions(), {
  8673. innerHeight: e,
  8674. innerWidth: A
  8675. } = window;
  8676. return g < A && i > 0 && I < e && C > 0;
  8677. }
  8678. rebuild() {
  8679. ig(this, wI, nS).call(this);
  8680. }
  8681. rotate(I) {
  8682. }
  8683. resize() {
  8684. }
  8685. serializeDeleted() {
  8686. var I;
  8687. return {
  8688. id: this.annotationElementId,
  8689. deleted: !0,
  8690. pageIndex: this.pageIndex,
  8691. popupRef: ((I = this._initialData) == null ? void 0 : I.popupRef) || ""
  8692. };
  8693. }
  8694. serialize(I = !1, g = null) {
  8695. BC("An editor must be serializable");
  8696. }
  8697. static async deserialize(I, g, C) {
  8698. const i = new this.prototype.constructor({
  8699. parent: g,
  8700. id: g.getNextId(),
  8701. uiManager: C
  8702. });
  8703. i.rotation = I.rotation, $(i, hc, I.accessibilityData), i._isCopy = I.isCopy || !1;
  8704. const [e, A] = i.pageDimensions, [s, l, n, a] = i.getRectInCurrentCoords(I.rect, A);
  8705. return i.x = s / e, i.y = l / A, i.width = n / e, i.height = a / A, i;
  8706. }
  8707. get hasBeenModified() {
  8708. return !!this.annotationElementId && (this.deleted || this.serialize() !== null);
  8709. }
  8710. remove() {
  8711. var I, g;
  8712. if ((I = M(this, Wa)) == null || I.abort(), $(this, Wa, null), this.isEmpty() || this.commit(), this.parent ? this.parent.remove(this) : this._uiManager.removeEditor(this), M(this, Ws) && (clearTimeout(M(this, Ws)), $(this, Ws, null)), ig(this, wI, ju).call(this), this.removeEditToolbar(), M(this, Ue)) {
  8713. for (const C of M(this, Ue).values())
  8714. clearTimeout(C);
  8715. $(this, Ue, null);
  8716. }
  8717. this.parent = null, (g = M(this, Gc)) == null || g.destroy(), $(this, Gc, null);
  8718. }
  8719. get isResizable() {
  8720. return !1;
  8721. }
  8722. makeResizable() {
  8723. this.isResizable && (ig(this, wI, Igg).call(this), M(this, Pt).classList.remove("hidden"));
  8724. }
  8725. get toolbarPosition() {
  8726. return null;
  8727. }
  8728. keydown(I) {
  8729. if (!this.isResizable || I.target !== this.div || I.key !== "Enter")
  8730. return;
  8731. this._uiManager.setSelected(this), $(this, yl, {
  8732. savedX: this.x,
  8733. savedY: this.y,
  8734. savedWidth: this.width,
  8735. savedHeight: this.height
  8736. });
  8737. const g = M(this, Pt).children;
  8738. if (!M(this, WA)) {
  8739. $(this, WA, Array.from(g));
  8740. const A = ig(this, wI, sgg).bind(this), s = ig(this, wI, lgg).bind(this), l = this._uiManager._signal;
  8741. for (const n of M(this, WA)) {
  8742. const a = n.getAttribute("data-resizer-name");
  8743. n.setAttribute("role", "spinbutton"), n.addEventListener("keydown", A, {
  8744. signal: l
  8745. }), n.addEventListener("blur", s, {
  8746. signal: l
  8747. }), n.addEventListener("focus", ig(this, wI, ngg).bind(this, a), {
  8748. signal: l
  8749. }), n.setAttribute("data-l10n-id", zI._l10nResizer[a]);
  8750. }
  8751. }
  8752. const C = M(this, WA)[0];
  8753. let i = 0;
  8754. for (const A of g) {
  8755. if (A === C)
  8756. break;
  8757. i++;
  8758. }
  8759. const e = (360 - this.rotation + this.parentRotation) % 360 / 90 * (M(this, WA).length / 4);
  8760. if (e !== i) {
  8761. if (e < i)
  8762. for (let s = 0; s < i - e; s++)
  8763. M(this, Pt).append(M(this, Pt).firstChild);
  8764. else if (e > i)
  8765. for (let s = 0; s < e - i; s++)
  8766. M(this, Pt).firstChild.before(M(this, Pt).lastChild);
  8767. let A = 0;
  8768. for (const s of g) {
  8769. const n = M(this, WA)[A++].getAttribute("data-resizer-name");
  8770. s.setAttribute("data-l10n-id", zI._l10nResizer[n]);
  8771. }
  8772. }
  8773. ig(this, wI, aS).call(this, 0), $(this, Yl, !0), M(this, Pt).firstChild.focus({
  8774. focusVisible: !0
  8775. }), I.preventDefault(), I.stopImmediatePropagation();
  8776. }
  8777. _resizeWithKeyboard(I, g) {
  8778. M(this, Yl) && ig(this, wI, sS).call(this, M(this, gZ), {
  8779. deltaX: I,
  8780. deltaY: g,
  8781. fromKeyboard: !0
  8782. });
  8783. }
  8784. _stopResizingWithKeyboard() {
  8785. ig(this, wI, ju).call(this), this.div.focus();
  8786. }
  8787. select() {
  8788. var I, g, C;
  8789. if (this.makeResizable(), (I = this.div) == null || I.classList.add("selectedEditor"), !this._editToolbar) {
  8790. this.addEditToolbar().then(() => {
  8791. var i, e;
  8792. (i = this.div) != null && i.classList.contains("selectedEditor") && ((e = this._editToolbar) == null || e.show());
  8793. });
  8794. return;
  8795. }
  8796. (g = this._editToolbar) == null || g.show(), (C = M(this, XC)) == null || C.toggleAltTextBadge(!1);
  8797. }
  8798. unselect() {
  8799. var I, g, C, i, e;
  8800. (I = M(this, Pt)) == null || I.classList.add("hidden"), (g = this.div) == null || g.classList.remove("selectedEditor"), (C = this.div) != null && C.contains(document.activeElement) && this._uiManager.currentLayer.div.focus({
  8801. preventScroll: !0
  8802. }), (i = this._editToolbar) == null || i.hide(), (e = M(this, XC)) == null || e.toggleAltTextBadge(!0);
  8803. }
  8804. updateParams(I, g) {
  8805. }
  8806. disableEditing() {
  8807. }
  8808. enableEditing() {
  8809. }
  8810. enterInEditMode() {
  8811. }
  8812. getElementForAltText() {
  8813. return this.div;
  8814. }
  8815. get contentDiv() {
  8816. return this.div;
  8817. }
  8818. get isEditing() {
  8819. return M(this, IZ);
  8820. }
  8821. set isEditing(I) {
  8822. $(this, IZ, I), this.parent && (I ? (this.parent.setSelected(this), this.parent.setActiveEditor(this)) : this.parent.setActiveEditor(null));
  8823. }
  8824. setAspectRatio(I, g) {
  8825. $(this, bc, !0);
  8826. const C = I / g, {
  8827. style: i
  8828. } = this.div;
  8829. i.aspectRatio = C, i.height = "auto";
  8830. }
  8831. static get MIN_SIZE() {
  8832. return 16;
  8833. }
  8834. static canCreateNewEmptyEditor() {
  8835. return !0;
  8836. }
  8837. get telemetryInitialData() {
  8838. return {
  8839. action: "added"
  8840. };
  8841. }
  8842. get telemetryFinalData() {
  8843. return null;
  8844. }
  8845. _reportTelemetry(I, g = !1) {
  8846. if (g) {
  8847. M(this, Ue) || $(this, Ue, /* @__PURE__ */ new Map());
  8848. const {
  8849. action: C
  8850. } = I;
  8851. let i = M(this, Ue).get(C);
  8852. i && clearTimeout(i), i = setTimeout(() => {
  8853. this._reportTelemetry(I), M(this, Ue).delete(C), M(this, Ue).size === 0 && $(this, Ue, null);
  8854. }, zI._telemetryTimeout), M(this, Ue).set(C, i);
  8855. return;
  8856. }
  8857. I.type || (I.type = this.editorType), this._uiManager._eventBus.dispatch("reporttelemetry", {
  8858. source: this,
  8859. details: {
  8860. type: "editing",
  8861. data: I
  8862. }
  8863. });
  8864. }
  8865. show(I = this._isVisible) {
  8866. this.div.classList.toggle("hidden", !I), this._isVisible = I;
  8867. }
  8868. enable() {
  8869. this.div && (this.div.tabIndex = 0), $(this, Rh, !1);
  8870. }
  8871. disable() {
  8872. this.div && (this.div.tabIndex = -1), $(this, Rh, !0);
  8873. }
  8874. renderAnnotationElement(I) {
  8875. let g = I.container.querySelector(".annotationContent");
  8876. if (!g)
  8877. g = document.createElement("div"), g.classList.add("annotationContent", this.editorType), I.container.prepend(g);
  8878. else if (g.nodeName === "CANVAS") {
  8879. const C = g;
  8880. g = document.createElement("div"), g.classList.add("annotationContent", this.editorType), C.before(g);
  8881. }
  8882. return g;
  8883. }
  8884. resetAnnotationElement(I) {
  8885. const {
  8886. firstChild: g
  8887. } = I.container;
  8888. (g == null ? void 0 : g.nodeName) === "DIV" && g.classList.contains("annotationContent") && g.remove();
  8889. }
  8890. };
  8891. hc = new WeakMap(), WA = new WeakMap(), XC = new WeakMap(), Rh = new WeakMap(), Ba = new WeakMap(), $m = new WeakMap(), bc = new WeakMap(), Pt = new WeakMap(), uc = new WeakMap(), yl = new WeakMap(), Wa = new WeakMap(), gZ = new WeakMap(), mc = new WeakMap(), re = new WeakMap(), IZ = new WeakMap(), Zc = new WeakMap(), Yl = new WeakMap(), Ws = new WeakMap(), fh = new WeakMap(), Hh = new WeakMap(), Ue = new WeakMap(), Gc = new WeakMap(), CZ = new WeakMap(), KV = new WeakMap(), wI = new WeakSet(), iS = function([I, g], C, i) {
  8892. [C, i] = this.screenToPageTranslation(C, i), this.x += C / I, this.y += i / g, this._onTranslating(this.x, this.y), this.fixAndSetPosition();
  8893. }, tZ = new WeakSet(), eS = function(I, g, C) {
  8894. switch (C) {
  8895. case 90:
  8896. return [g, -I];
  8897. case 180:
  8898. return [-I, -g];
  8899. case 270:
  8900. return [-g, I];
  8901. default:
  8902. return [I, g];
  8903. }
  8904. }, uN = function(I) {
  8905. switch (I) {
  8906. case 90: {
  8907. const [g, C] = this.pageDimensions;
  8908. return [0, -g / C, C / g, 0];
  8909. }
  8910. case 180:
  8911. return [-1, 0, 0, -1];
  8912. case 270: {
  8913. const [g, C] = this.pageDimensions;
  8914. return [0, g / C, -C / g, 0];
  8915. }
  8916. default:
  8917. return [1, 0, 0, 1];
  8918. }
  8919. }, Igg = function() {
  8920. if (M(this, Pt))
  8921. return;
  8922. $(this, Pt, document.createElement("div")), M(this, Pt).classList.add("resizers");
  8923. const I = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"], g = this._uiManager._signal;
  8924. for (const C of I) {
  8925. const i = document.createElement("div");
  8926. M(this, Pt).append(i), i.classList.add("resizer", C), i.setAttribute("data-resizer-name", C), i.addEventListener("pointerdown", ig(this, wI, Cgg).bind(this, C), {
  8927. signal: g
  8928. }), i.addEventListener("contextmenu", zA, {
  8929. signal: g
  8930. }), i.tabIndex = -1;
  8931. }
  8932. this.div.prepend(M(this, Pt));
  8933. }, Cgg = function(I, g) {
  8934. var a;
  8935. g.preventDefault();
  8936. const {
  8937. isMac: C
  8938. } = Ai.platform;
  8939. if (g.button !== 0 || g.ctrlKey && C)
  8940. return;
  8941. (a = M(this, XC)) == null || a.toggle(!1);
  8942. const i = this._isDraggable;
  8943. this._isDraggable = !1, $(this, uc, [g.screenX, g.screenY]);
  8944. const e = new AbortController(), A = this._uiManager.combinedSignal(e);
  8945. this.parent.togglePointerEvents(!1), window.addEventListener("pointermove", ig(this, wI, sS).bind(this, I), {
  8946. passive: !0,
  8947. capture: !0,
  8948. signal: A
  8949. }), window.addEventListener("touchmove", ht, {
  8950. passive: !1,
  8951. signal: A
  8952. }), window.addEventListener("contextmenu", zA, {
  8953. signal: A
  8954. }), $(this, yl, {
  8955. savedX: this.x,
  8956. savedY: this.y,
  8957. savedWidth: this.width,
  8958. savedHeight: this.height
  8959. });
  8960. const s = this.parent.div.style.cursor, l = this.div.style.cursor;
  8961. this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(g.target).cursor;
  8962. const n = () => {
  8963. var d;
  8964. e.abort(), this.parent.togglePointerEvents(!0), (d = M(this, XC)) == null || d.toggle(!0), this._isDraggable = i, this.parent.div.style.cursor = s, this.div.style.cursor = l, ig(this, wI, mN).call(this);
  8965. };
  8966. window.addEventListener("pointerup", n, {
  8967. signal: A
  8968. }), window.addEventListener("blur", n, {
  8969. signal: A
  8970. });
  8971. }, AS = function(I, g, C, i) {
  8972. this.width = C, this.height = i, this.x = I, this.y = g;
  8973. const [e, A] = this.parentDimensions;
  8974. this.setDims(e * C, A * i), this.fixAndSetPosition(), this._onResized();
  8975. }, mN = function() {
  8976. if (!M(this, yl))
  8977. return;
  8978. const {
  8979. savedX: I,
  8980. savedY: g,
  8981. savedWidth: C,
  8982. savedHeight: i
  8983. } = M(this, yl);
  8984. $(this, yl, null);
  8985. const e = this.x, A = this.y, s = this.width, l = this.height;
  8986. e === I && A === g && s === C && l === i || this.addCommands({
  8987. cmd: ig(this, wI, AS).bind(this, e, A, s, l),
  8988. undo: ig(this, wI, AS).bind(this, I, g, C, i),
  8989. mustExec: !0
  8990. });
  8991. }, sS = function(I, g) {
  8992. const [C, i] = this.parentDimensions, e = this.x, A = this.y, s = this.width, l = this.height, n = zI.MIN_SIZE / C, a = zI.MIN_SIZE / i, d = ig(this, wI, uN).call(this, this.rotation), o = (G, w) => [d[0] * G + d[2] * w, d[1] * G + d[3] * w], c = ig(this, wI, uN).call(this, 360 - this.rotation), r = (G, w) => [c[0] * G + c[2] * w, c[1] * G + c[3] * w];
  8993. let h, b, u = !1, m = !1;
  8994. switch (I) {
  8995. case "topLeft":
  8996. u = !0, h = (G, w) => [0, 0], b = (G, w) => [G, w];
  8997. break;
  8998. case "topMiddle":
  8999. h = (G, w) => [G / 2, 0], b = (G, w) => [G / 2, w];
  9000. break;
  9001. case "topRight":
  9002. u = !0, h = (G, w) => [G, 0], b = (G, w) => [0, w];
  9003. break;
  9004. case "middleRight":
  9005. m = !0, h = (G, w) => [G, w / 2], b = (G, w) => [0, w / 2];
  9006. break;
  9007. case "bottomRight":
  9008. u = !0, h = (G, w) => [G, w], b = (G, w) => [0, 0];
  9009. break;
  9010. case "bottomMiddle":
  9011. h = (G, w) => [G / 2, w], b = (G, w) => [G / 2, 0];
  9012. break;
  9013. case "bottomLeft":
  9014. u = !0, h = (G, w) => [0, w], b = (G, w) => [G, 0];
  9015. break;
  9016. case "middleLeft":
  9017. m = !0, h = (G, w) => [0, w / 2], b = (G, w) => [G, w / 2];
  9018. break;
  9019. }
  9020. const Z = h(s, l), p = b(s, l);
  9021. let Y = o(...p);
  9022. const R = zI._round(e + Y[0]), X = zI._round(A + Y[1]);
  9023. let H = 1, S = 1, z, v;
  9024. if (g.fromKeyboard)
  9025. ({
  9026. deltaX: z,
  9027. deltaY: v
  9028. } = g);
  9029. else {
  9030. const {
  9031. screenX: G,
  9032. screenY: w
  9033. } = g, [W, y] = M(this, uc);
  9034. [z, v] = this.screenToPageTranslation(G - W, w - y), M(this, uc)[0] = G, M(this, uc)[1] = w;
  9035. }
  9036. if ([z, v] = r(z / C, v / i), u) {
  9037. const G = Math.hypot(s, l);
  9038. H = S = Math.max(Math.min(Math.hypot(p[0] - Z[0] - z, p[1] - Z[1] - v) / G, 1 / s, 1 / l), n / s, a / l);
  9039. } else m ? H = fi(Math.abs(p[0] - Z[0] - z), n, 1) / s : S = fi(Math.abs(p[1] - Z[1] - v), a, 1) / l;
  9040. const K = zI._round(s * H), V = zI._round(l * S);
  9041. Y = o(...b(K, V));
  9042. const N = R - Y[0], B = X - Y[1];
  9043. M(this, re) || $(this, re, [this.x, this.y, this.width, this.height]), this.width = K, this.height = V, this.x = N, this.y = B, this.setDims(C * K, i * V), this.fixAndSetPosition(), this._onResizing();
  9044. }, tgg = function() {
  9045. var I;
  9046. $(this, yl, {
  9047. savedX: this.x,
  9048. savedY: this.y,
  9049. savedWidth: this.width,
  9050. savedHeight: this.height
  9051. }), (I = M(this, XC)) == null || I.toggle(!1), this.parent.togglePointerEvents(!1);
  9052. }, igg = function(I, g, C) {
  9053. let e = 0.7 * (C / g) + 1 - 0.7;
  9054. if (e === 1)
  9055. return;
  9056. const A = ig(this, wI, uN).call(this, this.rotation), s = (R, X) => [A[0] * R + A[2] * X, A[1] * R + A[3] * X], [l, n] = this.parentDimensions, a = this.x, d = this.y, o = this.width, c = this.height, r = zI.MIN_SIZE / l, h = zI.MIN_SIZE / n;
  9057. e = Math.max(Math.min(e, 1 / o, 1 / c), r / o, h / c);
  9058. const b = zI._round(o * e), u = zI._round(c * e);
  9059. if (b === o && u === c)
  9060. return;
  9061. M(this, re) || $(this, re, [a, d, o, c]);
  9062. const m = s(o / 2, c / 2), Z = zI._round(a + m[0]), p = zI._round(d + m[1]), Y = s(b / 2, u / 2);
  9063. this.x = Z - Y[0], this.y = p - Y[1], this.width = b, this.height = u, this.setDims(l * b, n * u), this.fixAndSetPosition(), this._onResizing();
  9064. }, egg = function() {
  9065. var I;
  9066. (I = M(this, XC)) == null || I.toggle(!0), this.parent.togglePointerEvents(!0), ig(this, wI, mN).call(this);
  9067. }, lS = function(I) {
  9068. const {
  9069. isMac: g
  9070. } = Ai.platform;
  9071. I.ctrlKey && !g || I.shiftKey || I.metaKey && g ? this.parent.toggleSelected(this) : this.parent.setSelected(this);
  9072. }, Agg = function(I) {
  9073. const {
  9074. isSelected: g
  9075. } = this;
  9076. this._uiManager.setUpDragSession();
  9077. let C = !1;
  9078. const i = new AbortController(), e = this._uiManager.combinedSignal(i), A = {
  9079. capture: !0,
  9080. passive: !1,
  9081. signal: e
  9082. }, s = (n) => {
  9083. i.abort(), $(this, Ba, null), $(this, mc, !1), this._uiManager.endDragSession() || ig(this, wI, lS).call(this, n), C && this._onStopDragging();
  9084. };
  9085. g && ($(this, fh, I.clientX), $(this, Hh, I.clientY), $(this, Ba, I.pointerId), $(this, $m, I.pointerType), window.addEventListener("pointermove", (n) => {
  9086. C || (C = !0, this._onStartDragging());
  9087. const {
  9088. clientX: a,
  9089. clientY: d,
  9090. pointerId: o
  9091. } = n;
  9092. if (o !== M(this, Ba)) {
  9093. ht(n);
  9094. return;
  9095. }
  9096. const [c, r] = this.screenToPageTranslation(a - M(this, fh), d - M(this, Hh));
  9097. $(this, fh, a), $(this, Hh, d), this._uiManager.dragSelectedEditors(c, r);
  9098. }, A), window.addEventListener("touchmove", ht, A), window.addEventListener("pointerdown", (n) => {
  9099. n.pointerType === M(this, $m) && (M(this, Gc) || n.isPrimary) && s(n), ht(n);
  9100. }, A));
  9101. const l = (n) => {
  9102. if (!M(this, Ba) || M(this, Ba) === n.pointerId) {
  9103. s(n);
  9104. return;
  9105. }
  9106. ht(n);
  9107. };
  9108. window.addEventListener("pointerup", l, {
  9109. signal: e
  9110. }), window.addEventListener("blur", l, {
  9111. signal: e
  9112. });
  9113. }, nS = function() {
  9114. if (M(this, Wa) || !this.div)
  9115. return;
  9116. $(this, Wa, new AbortController());
  9117. const I = this._uiManager.combinedSignal(M(this, Wa));
  9118. this.div.addEventListener("focusin", this.focusin.bind(this), {
  9119. signal: I
  9120. }), this.div.addEventListener("focusout", this.focusout.bind(this), {
  9121. signal: I
  9122. });
  9123. }, sgg = function(I) {
  9124. zI._resizerKeyboardManager.exec(this, I);
  9125. }, lgg = function(I) {
  9126. var g;
  9127. M(this, Yl) && ((g = I.relatedTarget) == null ? void 0 : g.parentNode) !== M(this, Pt) && ig(this, wI, ju).call(this);
  9128. }, ngg = function(I) {
  9129. $(this, gZ, M(this, Yl) ? I : "");
  9130. }, aS = function(I) {
  9131. if (M(this, WA))
  9132. for (const g of M(this, WA))
  9133. g.tabIndex = I;
  9134. }, ju = function() {
  9135. $(this, Yl, !1), ig(this, wI, aS).call(this, -1), ig(this, wI, mN).call(this);
  9136. }, tg(zI, tZ), iI(zI, "_l10n", null), iI(zI, "_l10nResizer", null), iI(zI, "_borderLineWidth", -1), iI(zI, "_colorManager", new _X()), iI(zI, "_zIndex", 1), iI(zI, "_telemetryTimeout", 1e3);
  9137. let TC = zI;
  9138. class Acg extends TC {
  9139. constructor(I) {
  9140. super(I), this.annotationElementId = I.annotationElementId, this.deleted = !0;
  9141. }
  9142. serialize() {
  9143. return this.serializeDeleted();
  9144. }
  9145. }
  9146. const g8 = 3285377520, Te = 4294901760, ls = 65535;
  9147. class agg {
  9148. constructor(I) {
  9149. this.h1 = I ? I & 4294967295 : g8, this.h2 = I ? I & 4294967295 : g8;
  9150. }
  9151. update(I) {
  9152. let g, C;
  9153. if (typeof I == "string") {
  9154. g = new Uint8Array(I.length * 2), C = 0;
  9155. for (let h = 0, b = I.length; h < b; h++) {
  9156. const u = I.charCodeAt(h);
  9157. u <= 255 ? g[C++] = u : (g[C++] = u >>> 8, g[C++] = u & 255);
  9158. }
  9159. } else if (ArrayBuffer.isView(I))
  9160. g = I.slice(), C = g.byteLength;
  9161. else
  9162. throw new Error("Invalid data format, must be a string or TypedArray.");
  9163. const i = C >> 2, e = C - i * 4, A = new Uint32Array(g.buffer, 0, i);
  9164. let s = 0, l = 0, n = this.h1, a = this.h2;
  9165. const d = 3432918353, o = 461845907, c = d & ls, r = o & ls;
  9166. for (let h = 0; h < i; h++)
  9167. h & 1 ? (s = A[h], s = s * d & Te | s * c & ls, s = s << 15 | s >>> 17, s = s * o & Te | s * r & ls, n ^= s, n = n << 13 | n >>> 19, n = n * 5 + 3864292196) : (l = A[h], l = l * d & Te | l * c & ls, l = l << 15 | l >>> 17, l = l * o & Te | l * r & ls, a ^= l, a = a << 13 | a >>> 19, a = a * 5 + 3864292196);
  9168. switch (s = 0, e) {
  9169. case 3:
  9170. s ^= g[i * 4 + 2] << 16;
  9171. case 2:
  9172. s ^= g[i * 4 + 1] << 8;
  9173. case 1:
  9174. s ^= g[i * 4], s = s * d & Te | s * c & ls, s = s << 15 | s >>> 17, s = s * o & Te | s * r & ls, i & 1 ? n ^= s : a ^= s;
  9175. }
  9176. this.h1 = n, this.h2 = a;
  9177. }
  9178. hexdigest() {
  9179. let I = this.h1, g = this.h2;
  9180. return I ^= g >>> 1, I = I * 3981806797 & Te | I * 36045 & ls, g = g * 4283543511 & Te | ((g << 16 | I >>> 16) * 2950163797 & Te) >>> 16, I ^= g >>> 1, I = I * 444984403 & Te | I * 60499 & ls, g = g * 3301882366 & Te | ((g << 16 | I >>> 16) * 3120437893 & Te) >>> 16, I ^= g >>> 1, (I >>> 0).toString(16).padStart(8, "0") + (g >>> 0).toString(16).padStart(8, "0");
  9181. }
  9182. }
  9183. const oS = Object.freeze({
  9184. map: null,
  9185. hash: "",
  9186. transfer: void 0
  9187. });
  9188. var wc, pc, Kt, FV, ogg;
  9189. class Z9 {
  9190. constructor() {
  9191. tg(this, FV);
  9192. tg(this, wc, !1);
  9193. tg(this, pc, null);
  9194. tg(this, Kt, /* @__PURE__ */ new Map());
  9195. this.onSetModified = null, this.onResetModified = null, this.onAnnotationEditor = null;
  9196. }
  9197. getValue(I, g) {
  9198. const C = M(this, Kt).get(I);
  9199. return C === void 0 ? g : Object.assign(g, C);
  9200. }
  9201. getRawValue(I) {
  9202. return M(this, Kt).get(I);
  9203. }
  9204. remove(I) {
  9205. if (M(this, Kt).delete(I), M(this, Kt).size === 0 && this.resetModified(), typeof this.onAnnotationEditor == "function") {
  9206. for (const g of M(this, Kt).values())
  9207. if (g instanceof TC)
  9208. return;
  9209. this.onAnnotationEditor(null);
  9210. }
  9211. }
  9212. setValue(I, g) {
  9213. const C = M(this, Kt).get(I);
  9214. let i = !1;
  9215. if (C !== void 0)
  9216. for (const [e, A] of Object.entries(g))
  9217. C[e] !== A && (i = !0, C[e] = A);
  9218. else
  9219. i = !0, M(this, Kt).set(I, g);
  9220. i && ig(this, FV, ogg).call(this), g instanceof TC && typeof this.onAnnotationEditor == "function" && this.onAnnotationEditor(g.constructor._type);
  9221. }
  9222. has(I) {
  9223. return M(this, Kt).has(I);
  9224. }
  9225. getAll() {
  9226. return M(this, Kt).size > 0 ? c9(M(this, Kt)) : null;
  9227. }
  9228. setAll(I) {
  9229. for (const [g, C] of Object.entries(I))
  9230. this.setValue(g, C);
  9231. }
  9232. get size() {
  9233. return M(this, Kt).size;
  9234. }
  9235. resetModified() {
  9236. M(this, wc) && ($(this, wc, !1), typeof this.onResetModified == "function" && this.onResetModified());
  9237. }
  9238. get print() {
  9239. return new cgg(this);
  9240. }
  9241. get serializable() {
  9242. if (M(this, Kt).size === 0)
  9243. return oS;
  9244. const I = /* @__PURE__ */ new Map(), g = new agg(), C = [], i = /* @__PURE__ */ Object.create(null);
  9245. let e = !1;
  9246. for (const [A, s] of M(this, Kt)) {
  9247. const l = s instanceof TC ? s.serialize(!1, i) : s;
  9248. l && (I.set(A, l), g.update(`${A}:${JSON.stringify(l)}`), e || (e = !!l.bitmap));
  9249. }
  9250. if (e)
  9251. for (const A of I.values())
  9252. A.bitmap && C.push(A.bitmap);
  9253. return I.size > 0 ? {
  9254. map: I,
  9255. hash: g.hexdigest(),
  9256. transfer: C
  9257. } : oS;
  9258. }
  9259. get editorStats() {
  9260. let I = null;
  9261. const g = /* @__PURE__ */ new Map();
  9262. for (const C of M(this, Kt).values()) {
  9263. if (!(C instanceof TC))
  9264. continue;
  9265. const i = C.telemetryFinalData;
  9266. if (!i)
  9267. continue;
  9268. const {
  9269. type: e
  9270. } = i;
  9271. g.has(e) || g.set(e, Object.getPrototypeOf(C).constructor), I || (I = /* @__PURE__ */ Object.create(null));
  9272. const A = I[e] || (I[e] = /* @__PURE__ */ new Map());
  9273. for (const [s, l] of Object.entries(i)) {
  9274. if (s === "type")
  9275. continue;
  9276. let n = A.get(s);
  9277. n || (n = /* @__PURE__ */ new Map(), A.set(s, n));
  9278. const a = n.get(l) ?? 0;
  9279. n.set(l, a + 1);
  9280. }
  9281. }
  9282. for (const [C, i] of g)
  9283. I[C] = i.computeTelemetryFinalData(I[C]);
  9284. return I;
  9285. }
  9286. resetModifiedIds() {
  9287. $(this, pc, null);
  9288. }
  9289. get modifiedIds() {
  9290. if (M(this, pc))
  9291. return M(this, pc);
  9292. const I = [];
  9293. for (const g of M(this, Kt).values())
  9294. !(g instanceof TC) || !g.annotationElementId || !g.serialize() || I.push(g.annotationElementId);
  9295. return $(this, pc, {
  9296. ids: new Set(I),
  9297. hash: I.join(",")
  9298. });
  9299. }
  9300. }
  9301. wc = new WeakMap(), pc = new WeakMap(), Kt = new WeakMap(), FV = new WeakSet(), ogg = function() {
  9302. M(this, wc) || ($(this, wc, !0), typeof this.onSetModified == "function" && this.onSetModified());
  9303. };
  9304. var iZ;
  9305. class cgg extends Z9 {
  9306. constructor(g) {
  9307. super();
  9308. tg(this, iZ);
  9309. const {
  9310. map: C,
  9311. hash: i,
  9312. transfer: e
  9313. } = g.serializable, A = structuredClone(C, e ? {
  9314. transfer: e
  9315. } : null);
  9316. $(this, iZ, {
  9317. map: A,
  9318. hash: i,
  9319. transfer: e
  9320. });
  9321. }
  9322. get print() {
  9323. BC("Should not call PrintAnnotationStorage.print");
  9324. }
  9325. get serializable() {
  9326. return M(this, iZ);
  9327. }
  9328. get modifiedIds() {
  9329. return UI(this, "modifiedIds", {
  9330. ids: /* @__PURE__ */ new Set(),
  9331. hash: ""
  9332. });
  9333. }
  9334. }
  9335. iZ = new WeakMap();
  9336. var Xh;
  9337. class scg {
  9338. constructor({
  9339. ownerDocument: I = globalThis.document,
  9340. styleElement: g = null
  9341. }) {
  9342. tg(this, Xh, /* @__PURE__ */ new Set());
  9343. this._document = I, this.nativeFontFaces = /* @__PURE__ */ new Set(), this.styleElement = null, this.loadingRequests = [], this.loadTestFontId = 0;
  9344. }
  9345. addNativeFontFace(I) {
  9346. this.nativeFontFaces.add(I), this._document.fonts.add(I);
  9347. }
  9348. removeNativeFontFace(I) {
  9349. this.nativeFontFaces.delete(I), this._document.fonts.delete(I);
  9350. }
  9351. insertRule(I) {
  9352. this.styleElement || (this.styleElement = this._document.createElement("style"), this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement));
  9353. const g = this.styleElement.sheet;
  9354. g.insertRule(I, g.cssRules.length);
  9355. }
  9356. clear() {
  9357. for (const I of this.nativeFontFaces)
  9358. this._document.fonts.delete(I);
  9359. this.nativeFontFaces.clear(), M(this, Xh).clear(), this.styleElement && (this.styleElement.remove(), this.styleElement = null);
  9360. }
  9361. async loadSystemFont({
  9362. systemFontInfo: I,
  9363. disableFontFace: g,
  9364. _inspectFont: C
  9365. }) {
  9366. if (!(!I || M(this, Xh).has(I.loadedName))) {
  9367. if (ut(!g, "loadSystemFont shouldn't be called when `disableFontFace` is set."), this.isFontLoadingAPISupported) {
  9368. const {
  9369. loadedName: i,
  9370. src: e,
  9371. style: A
  9372. } = I, s = new FontFace(i, e, A);
  9373. this.addNativeFontFace(s);
  9374. try {
  9375. await s.load(), M(this, Xh).add(i), C == null || C(I);
  9376. } catch {
  9377. DI(`Cannot load system font: ${I.baseFontName}, installing it could help to improve PDF rendering.`), this.removeNativeFontFace(s);
  9378. }
  9379. return;
  9380. }
  9381. BC("Not implemented: loadSystemFont without the Font Loading API.");
  9382. }
  9383. }
  9384. async bind(I) {
  9385. if (I.attached || I.missingFile && !I.systemFontInfo)
  9386. return;
  9387. if (I.attached = !0, I.systemFontInfo) {
  9388. await this.loadSystemFont(I);
  9389. return;
  9390. }
  9391. if (this.isFontLoadingAPISupported) {
  9392. const C = I.createNativeFontFace();
  9393. if (C) {
  9394. this.addNativeFontFace(C);
  9395. try {
  9396. await C.loaded;
  9397. } catch (i) {
  9398. throw DI(`Failed to load font '${C.family}': '${i}'.`), I.disableFontFace = !0, i;
  9399. }
  9400. }
  9401. return;
  9402. }
  9403. const g = I.createFontFaceRule();
  9404. if (g) {
  9405. if (this.insertRule(g), this.isSyncFontLoadingSupported)
  9406. return;
  9407. await new Promise((C) => {
  9408. const i = this._queueLoadingCallback(C);
  9409. this._prepareFontLoadEvent(I, i);
  9410. });
  9411. }
  9412. }
  9413. get isFontLoadingAPISupported() {
  9414. var g;
  9415. const I = !!((g = this._document) != null && g.fonts);
  9416. return UI(this, "isFontLoadingAPISupported", I);
  9417. }
  9418. get isSyncFontLoadingSupported() {
  9419. return UI(this, "isSyncFontLoadingSupported", $t || Ai.platform.isFirefox);
  9420. }
  9421. _queueLoadingCallback(I) {
  9422. function g() {
  9423. for (ut(!i.done, "completeRequest() cannot be called twice."), i.done = !0; C.length > 0 && C[0].done; ) {
  9424. const e = C.shift();
  9425. setTimeout(e.callback, 0);
  9426. }
  9427. }
  9428. const {
  9429. loadingRequests: C
  9430. } = this, i = {
  9431. done: !1,
  9432. complete: g,
  9433. callback: I
  9434. };
  9435. return C.push(i), i;
  9436. }
  9437. get _loadTestFont() {
  9438. const I = atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==");
  9439. return UI(this, "_loadTestFont", I);
  9440. }
  9441. _prepareFontLoadEvent(I, g) {
  9442. function C(p, Y) {
  9443. return p.charCodeAt(Y) << 24 | p.charCodeAt(Y + 1) << 16 | p.charCodeAt(Y + 2) << 8 | p.charCodeAt(Y + 3) & 255;
  9444. }
  9445. function i(p, Y, R, X) {
  9446. const H = p.substring(0, Y), S = p.substring(Y + R);
  9447. return H + X + S;
  9448. }
  9449. let e, A;
  9450. const s = this._document.createElement("canvas");
  9451. s.width = 1, s.height = 1;
  9452. const l = s.getContext("2d");
  9453. let n = 0;
  9454. function a(p, Y) {
  9455. if (++n > 30) {
  9456. DI("Load test font never loaded."), Y();
  9457. return;
  9458. }
  9459. if (l.font = "30px " + p, l.fillText(".", 0, 20), l.getImageData(0, 0, 1, 1).data[3] > 0) {
  9460. Y();
  9461. return;
  9462. }
  9463. setTimeout(a.bind(null, p, Y));
  9464. }
  9465. const d = `lt${Date.now()}${this.loadTestFontId++}`;
  9466. let o = this._loadTestFont;
  9467. o = i(o, 976, d.length, d);
  9468. const r = 16, h = 1482184792;
  9469. let b = C(o, r);
  9470. for (e = 0, A = d.length - 3; e < A; e += 4)
  9471. b = b - h + C(d, e) | 0;
  9472. e < d.length && (b = b - h + C(d + "XXX", e) | 0), o = i(o, r, 4, Qog(b));
  9473. const u = `url(data:font/opentype;base64,${btoa(o)});`, m = `@font-face {font-family:"${d}";src:${u}}`;
  9474. this.insertRule(m);
  9475. const Z = this._document.createElement("div");
  9476. Z.style.visibility = "hidden", Z.style.width = Z.style.height = "10px", Z.style.position = "absolute", Z.style.top = Z.style.left = "0px";
  9477. for (const p of [I.loadedName, d]) {
  9478. const Y = this._document.createElement("span");
  9479. Y.textContent = "Hi", Y.style.fontFamily = p, Z.append(Y);
  9480. }
  9481. this._document.body.append(Z), a(d, () => {
  9482. Z.remove(), g.complete();
  9483. });
  9484. }
  9485. }
  9486. Xh = new WeakMap();
  9487. class lcg {
  9488. constructor(I, g = null) {
  9489. this.compiledGlyphs = /* @__PURE__ */ Object.create(null);
  9490. for (const C in I)
  9491. this[C] = I[C];
  9492. this._inspectFont = g;
  9493. }
  9494. createNativeFontFace() {
  9495. var g;
  9496. if (!this.data || this.disableFontFace)
  9497. return null;
  9498. let I;
  9499. if (!this.cssFontInfo)
  9500. I = new FontFace(this.loadedName, this.data, {});
  9501. else {
  9502. const C = {
  9503. weight: this.cssFontInfo.fontWeight
  9504. };
  9505. this.cssFontInfo.italicAngle && (C.style = `oblique ${this.cssFontInfo.italicAngle}deg`), I = new FontFace(this.cssFontInfo.fontFamily, this.data, C);
  9506. }
  9507. return (g = this._inspectFont) == null || g.call(this, this), I;
  9508. }
  9509. createFontFaceRule() {
  9510. var C;
  9511. if (!this.data || this.disableFontFace)
  9512. return null;
  9513. const I = `url(data:${this.mimetype};base64,${X$(this.data)});`;
  9514. let g;
  9515. if (!this.cssFontInfo)
  9516. g = `@font-face {font-family:"${this.loadedName}";src:${I}}`;
  9517. else {
  9518. let i = `font-weight: ${this.cssFontInfo.fontWeight};`;
  9519. this.cssFontInfo.italicAngle && (i += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`), g = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${i}src:${I}}`;
  9520. }
  9521. return (C = this._inspectFont) == null || C.call(this, this, I), g;
  9522. }
  9523. getPathGenerator(I, g) {
  9524. if (this.compiledGlyphs[g] !== void 0)
  9525. return this.compiledGlyphs[g];
  9526. const C = this.loadedName + "_path_" + g;
  9527. let i;
  9528. try {
  9529. i = I.get(C);
  9530. } catch (A) {
  9531. DI(`getPathGenerator - ignoring character: "${A}".`);
  9532. }
  9533. const e = new Path2D(i || "");
  9534. return this.fontExtraProperties || I.delete(C), this.compiledGlyphs[g] = e;
  9535. }
  9536. }
  9537. const kY = {
  9538. DATA: 1,
  9539. ERROR: 2
  9540. }, ot = {
  9541. CANCEL: 1,
  9542. CANCEL_COMPLETE: 2,
  9543. CLOSE: 3,
  9544. ENQUEUE: 4,
  9545. ERROR: 5,
  9546. PULL: 6,
  9547. PULL_COMPLETE: 7,
  9548. START_COMPLETE: 8
  9549. };
  9550. function I8() {
  9551. }
  9552. function xi(t) {
  9553. if (t instanceof Ea || t instanceof QX || t instanceof _6 || t instanceof CV || t instanceof vH)
  9554. return t;
  9555. switch (t instanceof Error || typeof t == "object" && t !== null || BC('wrapReason: Expected "reason" to be a (possibly cloned) Error.'), t.name) {
  9556. case "AbortException":
  9557. return new Ea(t.message);
  9558. case "InvalidPDFException":
  9559. return new QX(t.message);
  9560. case "PasswordException":
  9561. return new _6(t.message, t.code);
  9562. case "ResponseException":
  9563. return new CV(t.message, t.status, t.missing);
  9564. case "UnknownErrorException":
  9565. return new vH(t.message, t.details);
  9566. }
  9567. return new vH(t.message, t.toString());
  9568. }
  9569. var Sh, iA, dgg, rgg, hgg, ZN;
  9570. class Qu {
  9571. constructor(I, g, C) {
  9572. tg(this, iA);
  9573. tg(this, Sh, new AbortController());
  9574. this.sourceName = I, this.targetName = g, this.comObj = C, this.callbackId = 1, this.streamId = 1, this.streamSinks = /* @__PURE__ */ Object.create(null), this.streamControllers = /* @__PURE__ */ Object.create(null), this.callbackCapabilities = /* @__PURE__ */ Object.create(null), this.actionHandler = /* @__PURE__ */ Object.create(null), C.addEventListener("message", ig(this, iA, dgg).bind(this), {
  9575. signal: M(this, Sh).signal
  9576. });
  9577. }
  9578. on(I, g) {
  9579. const C = this.actionHandler;
  9580. if (C[I])
  9581. throw new Error(`There is already an actionName called "${I}"`);
  9582. C[I] = g;
  9583. }
  9584. send(I, g, C) {
  9585. this.comObj.postMessage({
  9586. sourceName: this.sourceName,
  9587. targetName: this.targetName,
  9588. action: I,
  9589. data: g
  9590. }, C);
  9591. }
  9592. sendWithPromise(I, g, C) {
  9593. const i = this.callbackId++, e = Promise.withResolvers();
  9594. this.callbackCapabilities[i] = e;
  9595. try {
  9596. this.comObj.postMessage({
  9597. sourceName: this.sourceName,
  9598. targetName: this.targetName,
  9599. action: I,
  9600. callbackId: i,
  9601. data: g
  9602. }, C);
  9603. } catch (A) {
  9604. e.reject(A);
  9605. }
  9606. return e.promise;
  9607. }
  9608. sendWithStream(I, g, C, i) {
  9609. const e = this.streamId++, A = this.sourceName, s = this.targetName, l = this.comObj;
  9610. return new ReadableStream({
  9611. start: (n) => {
  9612. const a = Promise.withResolvers();
  9613. return this.streamControllers[e] = {
  9614. controller: n,
  9615. startCall: a,
  9616. pullCall: null,
  9617. cancelCall: null,
  9618. isClosed: !1
  9619. }, l.postMessage({
  9620. sourceName: A,
  9621. targetName: s,
  9622. action: I,
  9623. streamId: e,
  9624. data: g,
  9625. desiredSize: n.desiredSize
  9626. }, i), a.promise;
  9627. },
  9628. pull: (n) => {
  9629. const a = Promise.withResolvers();
  9630. return this.streamControllers[e].pullCall = a, l.postMessage({
  9631. sourceName: A,
  9632. targetName: s,
  9633. stream: ot.PULL,
  9634. streamId: e,
  9635. desiredSize: n.desiredSize
  9636. }), a.promise;
  9637. },
  9638. cancel: (n) => {
  9639. ut(n instanceof Error, "cancel must have a valid reason");
  9640. const a = Promise.withResolvers();
  9641. return this.streamControllers[e].cancelCall = a, this.streamControllers[e].isClosed = !0, l.postMessage({
  9642. sourceName: A,
  9643. targetName: s,
  9644. stream: ot.CANCEL,
  9645. streamId: e,
  9646. reason: xi(n)
  9647. }), a.promise;
  9648. }
  9649. }, C);
  9650. }
  9651. destroy() {
  9652. var I;
  9653. (I = M(this, Sh)) == null || I.abort(), $(this, Sh, null);
  9654. }
  9655. }
  9656. Sh = new WeakMap(), iA = new WeakSet(), dgg = function({
  9657. data: I
  9658. }) {
  9659. if (I.targetName !== this.sourceName)
  9660. return;
  9661. if (I.stream) {
  9662. ig(this, iA, hgg).call(this, I);
  9663. return;
  9664. }
  9665. if (I.callback) {
  9666. const C = I.callbackId, i = this.callbackCapabilities[C];
  9667. if (!i)
  9668. throw new Error(`Cannot resolve callback ${C}`);
  9669. if (delete this.callbackCapabilities[C], I.callback === kY.DATA)
  9670. i.resolve(I.data);
  9671. else if (I.callback === kY.ERROR)
  9672. i.reject(xi(I.reason));
  9673. else
  9674. throw new Error("Unexpected callback case");
  9675. return;
  9676. }
  9677. const g = this.actionHandler[I.action];
  9678. if (!g)
  9679. throw new Error(`Unknown action from worker: ${I.action}`);
  9680. if (I.callbackId) {
  9681. const C = this.sourceName, i = I.sourceName, e = this.comObj;
  9682. Promise.try(g, I.data).then(function(A) {
  9683. e.postMessage({
  9684. sourceName: C,
  9685. targetName: i,
  9686. callback: kY.DATA,
  9687. callbackId: I.callbackId,
  9688. data: A
  9689. });
  9690. }, function(A) {
  9691. e.postMessage({
  9692. sourceName: C,
  9693. targetName: i,
  9694. callback: kY.ERROR,
  9695. callbackId: I.callbackId,
  9696. reason: xi(A)
  9697. });
  9698. });
  9699. return;
  9700. }
  9701. if (I.streamId) {
  9702. ig(this, iA, rgg).call(this, I);
  9703. return;
  9704. }
  9705. g(I.data);
  9706. }, rgg = function(I) {
  9707. const g = I.streamId, C = this.sourceName, i = I.sourceName, e = this.comObj, A = this, s = this.actionHandler[I.action], l = {
  9708. enqueue(n, a = 1, d) {
  9709. if (this.isCancelled)
  9710. return;
  9711. const o = this.desiredSize;
  9712. this.desiredSize -= a, o > 0 && this.desiredSize <= 0 && (this.sinkCapability = Promise.withResolvers(), this.ready = this.sinkCapability.promise), e.postMessage({
  9713. sourceName: C,
  9714. targetName: i,
  9715. stream: ot.ENQUEUE,
  9716. streamId: g,
  9717. chunk: n
  9718. }, d);
  9719. },
  9720. close() {
  9721. this.isCancelled || (this.isCancelled = !0, e.postMessage({
  9722. sourceName: C,
  9723. targetName: i,
  9724. stream: ot.CLOSE,
  9725. streamId: g
  9726. }), delete A.streamSinks[g]);
  9727. },
  9728. error(n) {
  9729. ut(n instanceof Error, "error must have a valid reason"), !this.isCancelled && (this.isCancelled = !0, e.postMessage({
  9730. sourceName: C,
  9731. targetName: i,
  9732. stream: ot.ERROR,
  9733. streamId: g,
  9734. reason: xi(n)
  9735. }));
  9736. },
  9737. sinkCapability: Promise.withResolvers(),
  9738. onPull: null,
  9739. onCancel: null,
  9740. isCancelled: !1,
  9741. desiredSize: I.desiredSize,
  9742. ready: null
  9743. };
  9744. l.sinkCapability.resolve(), l.ready = l.sinkCapability.promise, this.streamSinks[g] = l, Promise.try(s, I.data, l).then(function() {
  9745. e.postMessage({
  9746. sourceName: C,
  9747. targetName: i,
  9748. stream: ot.START_COMPLETE,
  9749. streamId: g,
  9750. success: !0
  9751. });
  9752. }, function(n) {
  9753. e.postMessage({
  9754. sourceName: C,
  9755. targetName: i,
  9756. stream: ot.START_COMPLETE,
  9757. streamId: g,
  9758. reason: xi(n)
  9759. });
  9760. });
  9761. }, hgg = function(I) {
  9762. const g = I.streamId, C = this.sourceName, i = I.sourceName, e = this.comObj, A = this.streamControllers[g], s = this.streamSinks[g];
  9763. switch (I.stream) {
  9764. case ot.START_COMPLETE:
  9765. I.success ? A.startCall.resolve() : A.startCall.reject(xi(I.reason));
  9766. break;
  9767. case ot.PULL_COMPLETE:
  9768. I.success ? A.pullCall.resolve() : A.pullCall.reject(xi(I.reason));
  9769. break;
  9770. case ot.PULL:
  9771. if (!s) {
  9772. e.postMessage({
  9773. sourceName: C,
  9774. targetName: i,
  9775. stream: ot.PULL_COMPLETE,
  9776. streamId: g,
  9777. success: !0
  9778. });
  9779. break;
  9780. }
  9781. s.desiredSize <= 0 && I.desiredSize > 0 && s.sinkCapability.resolve(), s.desiredSize = I.desiredSize, Promise.try(s.onPull || I8).then(function() {
  9782. e.postMessage({
  9783. sourceName: C,
  9784. targetName: i,
  9785. stream: ot.PULL_COMPLETE,
  9786. streamId: g,
  9787. success: !0
  9788. });
  9789. }, function(n) {
  9790. e.postMessage({
  9791. sourceName: C,
  9792. targetName: i,
  9793. stream: ot.PULL_COMPLETE,
  9794. streamId: g,
  9795. reason: xi(n)
  9796. });
  9797. });
  9798. break;
  9799. case ot.ENQUEUE:
  9800. if (ut(A, "enqueue should have stream controller"), A.isClosed)
  9801. break;
  9802. A.controller.enqueue(I.chunk);
  9803. break;
  9804. case ot.CLOSE:
  9805. if (ut(A, "close should have stream controller"), A.isClosed)
  9806. break;
  9807. A.isClosed = !0, A.controller.close(), ig(this, iA, ZN).call(this, A, g);
  9808. break;
  9809. case ot.ERROR:
  9810. ut(A, "error should have stream controller"), A.controller.error(xi(I.reason)), ig(this, iA, ZN).call(this, A, g);
  9811. break;
  9812. case ot.CANCEL_COMPLETE:
  9813. I.success ? A.cancelCall.resolve() : A.cancelCall.reject(xi(I.reason)), ig(this, iA, ZN).call(this, A, g);
  9814. break;
  9815. case ot.CANCEL:
  9816. if (!s)
  9817. break;
  9818. const l = xi(I.reason);
  9819. Promise.try(s.onCancel || I8, l).then(function() {
  9820. e.postMessage({
  9821. sourceName: C,
  9822. targetName: i,
  9823. stream: ot.CANCEL_COMPLETE,
  9824. streamId: g,
  9825. success: !0
  9826. });
  9827. }, function(n) {
  9828. e.postMessage({
  9829. sourceName: C,
  9830. targetName: i,
  9831. stream: ot.CANCEL_COMPLETE,
  9832. streamId: g,
  9833. reason: xi(n)
  9834. });
  9835. }), s.sinkCapability.reject(l), s.isCancelled = !0, delete this.streamSinks[g];
  9836. break;
  9837. default:
  9838. throw new Error("Unexpected stream case");
  9839. }
  9840. }, ZN = async function(I, g) {
  9841. var C, i, e;
  9842. await Promise.allSettled([(C = I.startCall) == null ? void 0 : C.promise, (i = I.pullCall) == null ? void 0 : i.promise, (e = I.cancelCall) == null ? void 0 : e.promise]), delete this.streamControllers[g];
  9843. };
  9844. var eZ;
  9845. class bgg {
  9846. constructor({
  9847. enableHWA: I = !1
  9848. }) {
  9849. tg(this, eZ, !1);
  9850. $(this, eZ, I);
  9851. }
  9852. create(I, g) {
  9853. if (I <= 0 || g <= 0)
  9854. throw new Error("Invalid canvas size");
  9855. const C = this._createCanvas(I, g);
  9856. return {
  9857. canvas: C,
  9858. context: C.getContext("2d", {
  9859. willReadFrequently: !M(this, eZ)
  9860. })
  9861. };
  9862. }
  9863. reset(I, g, C) {
  9864. if (!I.canvas)
  9865. throw new Error("Canvas is not specified");
  9866. if (g <= 0 || C <= 0)
  9867. throw new Error("Invalid canvas size");
  9868. I.canvas.width = g, I.canvas.height = C;
  9869. }
  9870. destroy(I) {
  9871. if (!I.canvas)
  9872. throw new Error("Canvas is not specified");
  9873. I.canvas.width = 0, I.canvas.height = 0, I.canvas = null, I.context = null;
  9874. }
  9875. _createCanvas(I, g) {
  9876. BC("Abstract method `_createCanvas` called.");
  9877. }
  9878. }
  9879. eZ = new WeakMap();
  9880. class ncg extends bgg {
  9881. constructor({
  9882. ownerDocument: I = globalThis.document,
  9883. enableHWA: g = !1
  9884. }) {
  9885. super({
  9886. enableHWA: g
  9887. }), this._document = I;
  9888. }
  9889. _createCanvas(I, g) {
  9890. const C = this._document.createElement("canvas");
  9891. return C.width = I, C.height = g, C;
  9892. }
  9893. }
  9894. class ugg {
  9895. constructor({
  9896. baseUrl: I = null,
  9897. isCompressed: g = !0
  9898. }) {
  9899. this.baseUrl = I, this.isCompressed = g;
  9900. }
  9901. async fetch({
  9902. name: I
  9903. }) {
  9904. if (!this.baseUrl)
  9905. throw new Error("Ensure that the `cMapUrl` and `cMapPacked` API parameters are provided.");
  9906. if (!I)
  9907. throw new Error("CMap name must be specified.");
  9908. const g = this.baseUrl + I + (this.isCompressed ? ".bcmap" : "");
  9909. return this._fetch(g).then((C) => ({
  9910. cMapData: C,
  9911. isCompressed: this.isCompressed
  9912. })).catch((C) => {
  9913. throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${g}`);
  9914. });
  9915. }
  9916. async _fetch(I) {
  9917. BC("Abstract method `_fetch` called.");
  9918. }
  9919. }
  9920. class C8 extends ugg {
  9921. async _fetch(I) {
  9922. const g = await AG(I, this.isCompressed ? "arraybuffer" : "text");
  9923. return g instanceof ArrayBuffer ? new Uint8Array(g) : eG(g);
  9924. }
  9925. }
  9926. class mgg {
  9927. addFilter(I) {
  9928. return "none";
  9929. }
  9930. addHCMFilter(I, g) {
  9931. return "none";
  9932. }
  9933. addAlphaFilter(I) {
  9934. return "none";
  9935. }
  9936. addLuminosityFilter(I) {
  9937. return "none";
  9938. }
  9939. addHighlightHCMFilter(I, g, C, i, e) {
  9940. return "none";
  9941. }
  9942. destroy(I = !1) {
  9943. }
  9944. }
  9945. var Bc, Dh, Nl, Vl, mi, Wc, yc, qg, bi, Ou, Ur, GN, Er, Zgg, cS, Pr, Uu, Eu, dS, Pu;
  9946. class acg extends mgg {
  9947. constructor({
  9948. docId: g,
  9949. ownerDocument: C = globalThis.document
  9950. }) {
  9951. super();
  9952. tg(this, qg);
  9953. tg(this, Bc);
  9954. tg(this, Dh);
  9955. tg(this, Nl);
  9956. tg(this, Vl);
  9957. tg(this, mi);
  9958. tg(this, Wc);
  9959. tg(this, yc, 0);
  9960. $(this, Vl, g), $(this, mi, C);
  9961. }
  9962. addFilter(g) {
  9963. if (!g)
  9964. return "none";
  9965. let C = M(this, qg, bi).get(g);
  9966. if (C)
  9967. return C;
  9968. const [i, e, A] = ig(this, qg, GN).call(this, g), s = g.length === 1 ? i : `${i}${e}${A}`;
  9969. if (C = M(this, qg, bi).get(s), C)
  9970. return M(this, qg, bi).set(g, C), C;
  9971. const l = `g_${M(this, Vl)}_transfer_map_${Wi(this, yc)._++}`, n = ig(this, qg, Er).call(this, l);
  9972. M(this, qg, bi).set(g, n), M(this, qg, bi).set(s, n);
  9973. const a = ig(this, qg, Pr).call(this, l);
  9974. return ig(this, qg, Eu).call(this, i, e, A, a), n;
  9975. }
  9976. addHCMFilter(g, C) {
  9977. var r;
  9978. const i = `${g}-${C}`, e = "base";
  9979. let A = M(this, qg, Ou).get(e);
  9980. if ((A == null ? void 0 : A.key) === i || (A ? ((r = A.filter) == null || r.remove(), A.key = i, A.url = "none", A.filter = null) : (A = {
  9981. key: i,
  9982. url: "none",
  9983. filter: null
  9984. }, M(this, qg, Ou).set(e, A)), !g || !C))
  9985. return A.url;
  9986. const s = ig(this, qg, Pu).call(this, g);
  9987. g = AI.makeHexColor(...s);
  9988. const l = ig(this, qg, Pu).call(this, C);
  9989. if (C = AI.makeHexColor(...l), M(this, qg, Ur).style.color = "", g === "#000000" && C === "#ffffff" || g === C)
  9990. return A.url;
  9991. const n = new Array(256);
  9992. for (let h = 0; h <= 255; h++) {
  9993. const b = h / 255;
  9994. n[h] = b <= 0.03928 ? b / 12.92 : ((b + 0.055) / 1.055) ** 2.4;
  9995. }
  9996. const a = n.join(","), d = `g_${M(this, Vl)}_hcm_filter`, o = A.filter = ig(this, qg, Pr).call(this, d);
  9997. ig(this, qg, Eu).call(this, a, a, a, o), ig(this, qg, cS).call(this, o);
  9998. const c = (h, b) => {
  9999. const u = s[h] / 255, m = l[h] / 255, Z = new Array(b + 1);
  10000. for (let p = 0; p <= b; p++)
  10001. Z[p] = u + p / b * (m - u);
  10002. return Z.join(",");
  10003. };
  10004. return ig(this, qg, Eu).call(this, c(0, 5), c(1, 5), c(2, 5), o), A.url = ig(this, qg, Er).call(this, d), A.url;
  10005. }
  10006. addAlphaFilter(g) {
  10007. let C = M(this, qg, bi).get(g);
  10008. if (C)
  10009. return C;
  10010. const [i] = ig(this, qg, GN).call(this, [g]), e = `alpha_${i}`;
  10011. if (C = M(this, qg, bi).get(e), C)
  10012. return M(this, qg, bi).set(g, C), C;
  10013. const A = `g_${M(this, Vl)}_alpha_map_${Wi(this, yc)._++}`, s = ig(this, qg, Er).call(this, A);
  10014. M(this, qg, bi).set(g, s), M(this, qg, bi).set(e, s);
  10015. const l = ig(this, qg, Pr).call(this, A);
  10016. return ig(this, qg, dS).call(this, i, l), s;
  10017. }
  10018. addLuminosityFilter(g) {
  10019. let C = M(this, qg, bi).get(g || "luminosity");
  10020. if (C)
  10021. return C;
  10022. let i, e;
  10023. if (g ? ([i] = ig(this, qg, GN).call(this, [g]), e = `luminosity_${i}`) : e = "luminosity", C = M(this, qg, bi).get(e), C)
  10024. return M(this, qg, bi).set(g, C), C;
  10025. const A = `g_${M(this, Vl)}_luminosity_map_${Wi(this, yc)._++}`, s = ig(this, qg, Er).call(this, A);
  10026. M(this, qg, bi).set(g, s), M(this, qg, bi).set(e, s);
  10027. const l = ig(this, qg, Pr).call(this, A);
  10028. return ig(this, qg, Zgg).call(this, l), g && ig(this, qg, dS).call(this, i, l), s;
  10029. }
  10030. addHighlightHCMFilter(g, C, i, e, A) {
  10031. var m;
  10032. const s = `${C}-${i}-${e}-${A}`;
  10033. let l = M(this, qg, Ou).get(g);
  10034. if ((l == null ? void 0 : l.key) === s || (l ? ((m = l.filter) == null || m.remove(), l.key = s, l.url = "none", l.filter = null) : (l = {
  10035. key: s,
  10036. url: "none",
  10037. filter: null
  10038. }, M(this, qg, Ou).set(g, l)), !C || !i))
  10039. return l.url;
  10040. const [n, a] = [C, i].map(ig(this, qg, Pu).bind(this));
  10041. let d = Math.round(0.2126 * n[0] + 0.7152 * n[1] + 0.0722 * n[2]), o = Math.round(0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2]), [c, r] = [e, A].map(ig(this, qg, Pu).bind(this));
  10042. o < d && ([d, o, c, r] = [o, d, r, c]), M(this, qg, Ur).style.color = "";
  10043. const h = (Z, p, Y) => {
  10044. const R = new Array(256), X = (o - d) / Y, H = Z / 255, S = (p - Z) / (255 * Y);
  10045. let z = 0;
  10046. for (let v = 0; v <= Y; v++) {
  10047. const K = Math.round(d + v * X), V = H + v * S;
  10048. for (let N = z; N <= K; N++)
  10049. R[N] = V;
  10050. z = K + 1;
  10051. }
  10052. for (let v = z; v < 256; v++)
  10053. R[v] = R[z - 1];
  10054. return R.join(",");
  10055. }, b = `g_${M(this, Vl)}_hcm_${g}_filter`, u = l.filter = ig(this, qg, Pr).call(this, b);
  10056. return ig(this, qg, cS).call(this, u), ig(this, qg, Eu).call(this, h(c[0], r[0], 5), h(c[1], r[1], 5), h(c[2], r[2], 5), u), l.url = ig(this, qg, Er).call(this, b), l.url;
  10057. }
  10058. destroy(g = !1) {
  10059. var C, i, e, A;
  10060. g && ((C = M(this, Wc)) != null && C.size) || ((i = M(this, Nl)) == null || i.parentNode.parentNode.remove(), $(this, Nl, null), (e = M(this, Dh)) == null || e.clear(), $(this, Dh, null), (A = M(this, Wc)) == null || A.clear(), $(this, Wc, null), $(this, yc, 0));
  10061. }
  10062. }
  10063. Bc = new WeakMap(), Dh = new WeakMap(), Nl = new WeakMap(), Vl = new WeakMap(), mi = new WeakMap(), Wc = new WeakMap(), yc = new WeakMap(), qg = new WeakSet(), bi = function() {
  10064. return M(this, Dh) || $(this, Dh, /* @__PURE__ */ new Map());
  10065. }, Ou = function() {
  10066. return M(this, Wc) || $(this, Wc, /* @__PURE__ */ new Map());
  10067. }, Ur = function() {
  10068. if (!M(this, Nl)) {
  10069. const g = M(this, mi).createElement("div"), {
  10070. style: C
  10071. } = g;
  10072. C.visibility = "hidden", C.contain = "strict", C.width = C.height = 0, C.position = "absolute", C.top = C.left = 0, C.zIndex = -1;
  10073. const i = M(this, mi).createElementNS(dl, "svg");
  10074. i.setAttribute("width", 0), i.setAttribute("height", 0), $(this, Nl, M(this, mi).createElementNS(dl, "defs")), g.append(i), i.append(M(this, Nl)), M(this, mi).body.append(g);
  10075. }
  10076. return M(this, Nl);
  10077. }, GN = function(g) {
  10078. if (g.length === 1) {
  10079. const n = g[0], a = new Array(256);
  10080. for (let o = 0; o < 256; o++)
  10081. a[o] = n[o] / 255;
  10082. const d = a.join(",");
  10083. return [d, d, d];
  10084. }
  10085. const [C, i, e] = g, A = new Array(256), s = new Array(256), l = new Array(256);
  10086. for (let n = 0; n < 256; n++)
  10087. A[n] = C[n] / 255, s[n] = i[n] / 255, l[n] = e[n] / 255;
  10088. return [A.join(","), s.join(","), l.join(",")];
  10089. }, Er = function(g) {
  10090. if (M(this, Bc) === void 0) {
  10091. $(this, Bc, "");
  10092. const C = M(this, mi).URL;
  10093. C !== M(this, mi).baseURI && ($V(C) ? DI('#createUrl: ignore "data:"-URL for performance reasons.') : $(this, Bc, C.split("#", 1)[0]));
  10094. }
  10095. return `url(${M(this, Bc)}#${g})`;
  10096. }, Zgg = function(g) {
  10097. const C = M(this, mi).createElementNS(dl, "feColorMatrix");
  10098. C.setAttribute("type", "matrix"), C.setAttribute("values", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0"), g.append(C);
  10099. }, cS = function(g) {
  10100. const C = M(this, mi).createElementNS(dl, "feColorMatrix");
  10101. C.setAttribute("type", "matrix"), C.setAttribute("values", "0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"), g.append(C);
  10102. }, Pr = function(g) {
  10103. const C = M(this, mi).createElementNS(dl, "filter");
  10104. return C.setAttribute("color-interpolation-filters", "sRGB"), C.setAttribute("id", g), M(this, qg, Ur).append(C), C;
  10105. }, Uu = function(g, C, i) {
  10106. const e = M(this, mi).createElementNS(dl, C);
  10107. e.setAttribute("type", "discrete"), e.setAttribute("tableValues", i), g.append(e);
  10108. }, Eu = function(g, C, i, e) {
  10109. const A = M(this, mi).createElementNS(dl, "feComponentTransfer");
  10110. e.append(A), ig(this, qg, Uu).call(this, A, "feFuncR", g), ig(this, qg, Uu).call(this, A, "feFuncG", C), ig(this, qg, Uu).call(this, A, "feFuncB", i);
  10111. }, dS = function(g, C) {
  10112. const i = M(this, mi).createElementNS(dl, "feComponentTransfer");
  10113. C.append(i), ig(this, qg, Uu).call(this, i, "feFuncA", g);
  10114. }, Pu = function(g) {
  10115. return M(this, qg, Ur).style.color = g, u9(getComputedStyle(M(this, qg, Ur)).getPropertyValue("color"));
  10116. };
  10117. class Ggg {
  10118. constructor({
  10119. baseUrl: I = null
  10120. }) {
  10121. this.baseUrl = I;
  10122. }
  10123. async fetch({
  10124. filename: I
  10125. }) {
  10126. if (!this.baseUrl)
  10127. throw new Error("Ensure that the `standardFontDataUrl` API parameter is provided.");
  10128. if (!I)
  10129. throw new Error("Font filename must be specified.");
  10130. const g = `${this.baseUrl}${I}`;
  10131. return this._fetch(g).catch((C) => {
  10132. throw new Error(`Unable to load font data at: ${g}`);
  10133. });
  10134. }
  10135. async _fetch(I) {
  10136. BC("Abstract method `_fetch` called.");
  10137. }
  10138. }
  10139. class t8 extends Ggg {
  10140. async _fetch(I) {
  10141. const g = await AG(I, "arraybuffer");
  10142. return new Uint8Array(g);
  10143. }
  10144. }
  10145. class wgg {
  10146. constructor({
  10147. baseUrl: I = null
  10148. }) {
  10149. this.baseUrl = I;
  10150. }
  10151. async fetch({
  10152. filename: I
  10153. }) {
  10154. if (!this.baseUrl)
  10155. throw new Error("Ensure that the `wasmUrl` API parameter is provided.");
  10156. if (!I)
  10157. throw new Error("Wasm filename must be specified.");
  10158. const g = `${this.baseUrl}${I}`;
  10159. return this._fetch(g).catch((C) => {
  10160. throw new Error(`Unable to load wasm data at: ${g}`);
  10161. });
  10162. }
  10163. async _fetch(I) {
  10164. BC("Abstract method `_fetch` called.");
  10165. }
  10166. }
  10167. class i8 extends wgg {
  10168. async _fetch(I) {
  10169. const g = await AG(I, "arraybuffer");
  10170. return new Uint8Array(g);
  10171. }
  10172. }
  10173. $t && DI("Please use the `legacy` build in Node.js environments.");
  10174. async function G9(t) {
  10175. const g = await process.getBuiltinModule("fs").promises.readFile(t);
  10176. return new Uint8Array(g);
  10177. }
  10178. class ocg extends mgg {
  10179. }
  10180. class ccg extends bgg {
  10181. _createCanvas(I, g) {
  10182. return process.getBuiltinModule("module").createRequire(import.meta.url)("@napi-rs/canvas").createCanvas(I, g);
  10183. }
  10184. }
  10185. class dcg extends ugg {
  10186. async _fetch(I) {
  10187. return G9(I);
  10188. }
  10189. }
  10190. class rcg extends Ggg {
  10191. async _fetch(I) {
  10192. return G9(I);
  10193. }
  10194. }
  10195. class hcg extends wgg {
  10196. async _fetch(I) {
  10197. return G9(I);
  10198. }
  10199. }
  10200. const Ci = {
  10201. FILL: "Fill",
  10202. STROKE: "Stroke",
  10203. SHADING: "Shading"
  10204. };
  10205. function rS(t, I) {
  10206. if (!I)
  10207. return;
  10208. const g = I[2] - I[0], C = I[3] - I[1], i = new Path2D();
  10209. i.rect(I[0], I[1], g, C), t.clip(i);
  10210. }
  10211. class w9 {
  10212. isModifyingCurrentTransform() {
  10213. return !1;
  10214. }
  10215. getPattern() {
  10216. BC("Abstract method `getPattern` called.");
  10217. }
  10218. }
  10219. class bcg extends w9 {
  10220. constructor(I) {
  10221. super(), this._type = I[1], this._bbox = I[2], this._colorStops = I[3], this._p0 = I[4], this._p1 = I[5], this._r0 = I[6], this._r1 = I[7], this.matrix = null;
  10222. }
  10223. _createGradient(I) {
  10224. let g;
  10225. this._type === "axial" ? g = I.createLinearGradient(this._p0[0], this._p0[1], this._p1[0], this._p1[1]) : this._type === "radial" && (g = I.createRadialGradient(this._p0[0], this._p0[1], this._r0, this._p1[0], this._p1[1], this._r1));
  10226. for (const C of this._colorStops)
  10227. g.addColorStop(C[0], C[1]);
  10228. return g;
  10229. }
  10230. getPattern(I, g, C, i) {
  10231. let e;
  10232. if (i === Ci.STROKE || i === Ci.FILL) {
  10233. const A = g.current.getClippedPathBoundingBox(i, zC(I)) || [0, 0, 0, 0], s = Math.ceil(A[2] - A[0]) || 1, l = Math.ceil(A[3] - A[1]) || 1, n = g.cachedCanvases.getCanvas("pattern", s, l), a = n.context;
  10234. a.clearRect(0, 0, a.canvas.width, a.canvas.height), a.beginPath(), a.rect(0, 0, a.canvas.width, a.canvas.height), a.translate(-A[0], -A[1]), C = AI.transform(C, [1, 0, 0, 1, A[0], A[1]]), a.transform(...g.baseTransform), this.matrix && a.transform(...this.matrix), rS(a, this._bbox), a.fillStyle = this._createGradient(a), a.fill(), e = I.createPattern(n.canvas, "no-repeat");
  10235. const d = new DOMMatrix(C);
  10236. e.setTransform(d);
  10237. } else
  10238. rS(I, this._bbox), e = this._createGradient(I);
  10239. return e;
  10240. }
  10241. }
  10242. function jH(t, I, g, C, i, e, A, s) {
  10243. const l = I.coords, n = I.colors, a = t.data, d = t.width * 4;
  10244. let o;
  10245. l[g + 1] > l[C + 1] && (o = g, g = C, C = o, o = e, e = A, A = o), l[C + 1] > l[i + 1] && (o = C, C = i, i = o, o = A, A = s, s = o), l[g + 1] > l[C + 1] && (o = g, g = C, C = o, o = e, e = A, A = o);
  10246. const c = (l[g] + I.offsetX) * I.scaleX, r = (l[g + 1] + I.offsetY) * I.scaleY, h = (l[C] + I.offsetX) * I.scaleX, b = (l[C + 1] + I.offsetY) * I.scaleY, u = (l[i] + I.offsetX) * I.scaleX, m = (l[i + 1] + I.offsetY) * I.scaleY;
  10247. if (r >= m)
  10248. return;
  10249. const Z = n[e], p = n[e + 1], Y = n[e + 2], R = n[A], X = n[A + 1], H = n[A + 2], S = n[s], z = n[s + 1], v = n[s + 2], K = Math.round(r), V = Math.round(m);
  10250. let N, B, G, w, W, y, f, D;
  10251. for (let F = K; F <= V; F++) {
  10252. if (F < b) {
  10253. const E = F < r ? 0 : (r - F) / (r - b);
  10254. N = c - (c - h) * E, B = Z - (Z - R) * E, G = p - (p - X) * E, w = Y - (Y - H) * E;
  10255. } else {
  10256. let E;
  10257. F > m ? E = 1 : b === m ? E = 0 : E = (b - F) / (b - m), N = h - (h - u) * E, B = R - (R - S) * E, G = X - (X - z) * E, w = H - (H - v) * E;
  10258. }
  10259. let T;
  10260. F < r ? T = 0 : F > m ? T = 1 : T = (r - F) / (r - m), W = c - (c - u) * T, y = Z - (Z - S) * T, f = p - (p - z) * T, D = Y - (Y - v) * T;
  10261. const Q = Math.round(Math.min(N, W)), P = Math.round(Math.max(N, W));
  10262. let L = d * F + Q * 4;
  10263. for (let E = Q; E <= P; E++)
  10264. T = (N - E) / (N - W), T < 0 ? T = 0 : T > 1 && (T = 1), a[L++] = B - (B - y) * T | 0, a[L++] = G - (G - f) * T | 0, a[L++] = w - (w - D) * T | 0, a[L++] = 255;
  10265. }
  10266. }
  10267. function ucg(t, I, g) {
  10268. const C = I.coords, i = I.colors;
  10269. let e, A;
  10270. switch (I.type) {
  10271. case "lattice":
  10272. const s = I.verticesPerRow, l = Math.floor(C.length / s) - 1, n = s - 1;
  10273. for (e = 0; e < l; e++) {
  10274. let a = e * s;
  10275. for (let d = 0; d < n; d++, a++)
  10276. jH(t, g, C[a], C[a + 1], C[a + s], i[a], i[a + 1], i[a + s]), jH(t, g, C[a + s + 1], C[a + 1], C[a + s], i[a + s + 1], i[a + 1], i[a + s]);
  10277. }
  10278. break;
  10279. case "triangles":
  10280. for (e = 0, A = C.length; e < A; e += 3)
  10281. jH(t, g, C[e], C[e + 1], C[e + 2], i[e], i[e + 1], i[e + 2]);
  10282. break;
  10283. default:
  10284. throw new Error("illegal figure");
  10285. }
  10286. }
  10287. class mcg extends w9 {
  10288. constructor(I) {
  10289. super(), this._coords = I[2], this._colors = I[3], this._figures = I[4], this._bounds = I[5], this._bbox = I[6], this._background = I[7], this.matrix = null;
  10290. }
  10291. _createMeshCanvas(I, g, C) {
  10292. const s = Math.floor(this._bounds[0]), l = Math.floor(this._bounds[1]), n = Math.ceil(this._bounds[2]) - s, a = Math.ceil(this._bounds[3]) - l, d = Math.min(Math.ceil(Math.abs(n * I[0] * 1.1)), 3e3), o = Math.min(Math.ceil(Math.abs(a * I[1] * 1.1)), 3e3), c = n / d, r = a / o, h = {
  10293. coords: this._coords,
  10294. colors: this._colors,
  10295. offsetX: -s,
  10296. offsetY: -l,
  10297. scaleX: 1 / c,
  10298. scaleY: 1 / r
  10299. }, b = d + 2 * 2, u = o + 2 * 2, m = C.getCanvas("mesh", b, u), Z = m.context, p = Z.createImageData(d, o);
  10300. if (g) {
  10301. const R = p.data;
  10302. for (let X = 0, H = R.length; X < H; X += 4)
  10303. R[X] = g[0], R[X + 1] = g[1], R[X + 2] = g[2], R[X + 3] = 255;
  10304. }
  10305. for (const R of this._figures)
  10306. ucg(p, R, h);
  10307. return Z.putImageData(p, 2, 2), {
  10308. canvas: m.canvas,
  10309. offsetX: s - 2 * c,
  10310. offsetY: l - 2 * r,
  10311. scaleX: c,
  10312. scaleY: r
  10313. };
  10314. }
  10315. isModifyingCurrentTransform() {
  10316. return !0;
  10317. }
  10318. getPattern(I, g, C, i) {
  10319. rS(I, this._bbox);
  10320. let e;
  10321. if (i === Ci.SHADING)
  10322. e = AI.singularValueDecompose2dScale(zC(I));
  10323. else if (e = AI.singularValueDecompose2dScale(g.baseTransform), this.matrix) {
  10324. const s = AI.singularValueDecompose2dScale(this.matrix);
  10325. e = [e[0] * s[0], e[1] * s[1]];
  10326. }
  10327. const A = this._createMeshCanvas(e, i === Ci.SHADING ? null : this._background, g.cachedCanvases);
  10328. return i !== Ci.SHADING && (I.setTransform(...g.baseTransform), this.matrix && I.transform(...this.matrix)), I.translate(A.offsetX, A.offsetY), I.scale(A.scaleX, A.scaleY), I.createPattern(A.canvas, "no-repeat");
  10329. }
  10330. }
  10331. class Zcg extends w9 {
  10332. getPattern() {
  10333. return "hotpink";
  10334. }
  10335. }
  10336. function Gcg(t) {
  10337. switch (t[0]) {
  10338. case "RadialAxial":
  10339. return new bcg(t);
  10340. case "Mesh":
  10341. return new mcg(t);
  10342. case "Dummy":
  10343. return new Zcg();
  10344. }
  10345. throw new Error(`Unknown IR type: ${t[0]}`);
  10346. }
  10347. const e8 = {
  10348. COLORED: 1,
  10349. UNCOLORED: 2
  10350. }, kV = class kV {
  10351. constructor(I, g, C, i) {
  10352. this.color = I[1], this.operatorList = I[2], this.matrix = I[3], this.bbox = I[4], this.xstep = I[5], this.ystep = I[6], this.paintType = I[7], this.tilingType = I[8], this.ctx = g, this.canvasGraphicsFactory = C, this.baseTransform = i;
  10353. }
  10354. createPatternCanvas(I) {
  10355. const {
  10356. bbox: g,
  10357. operatorList: C,
  10358. paintType: i,
  10359. tilingType: e,
  10360. color: A,
  10361. canvasGraphicsFactory: s
  10362. } = this;
  10363. let {
  10364. xstep: l,
  10365. ystep: n
  10366. } = this;
  10367. l = Math.abs(l), n = Math.abs(n), qV("TilingType: " + e);
  10368. const a = g[0], d = g[1], o = g[2], c = g[3], r = o - a, h = c - d, b = AI.singularValueDecompose2dScale(this.matrix), u = AI.singularValueDecompose2dScale(this.baseTransform), m = b[0] * u[0], Z = b[1] * u[1];
  10369. let p = r, Y = h, R = !1, X = !1;
  10370. const H = Math.ceil(l * m), S = Math.ceil(n * Z), z = Math.ceil(r * m), v = Math.ceil(h * Z);
  10371. H >= z ? p = l : R = !0, S >= v ? Y = n : X = !0;
  10372. const K = this.getSizeAndScale(p, this.ctx.canvas.width, m), V = this.getSizeAndScale(Y, this.ctx.canvas.height, Z), N = I.cachedCanvases.getCanvas("pattern", K.size, V.size), B = N.context, G = s.createCanvasGraphics(B);
  10373. if (G.groupLevel = I.groupLevel, this.setFillAndStrokeStyleToContext(G, i, A), B.translate(-K.scale * a, -V.scale * d), G.transform(K.scale, 0, 0, V.scale, 0, 0), B.save(), this.clipBbox(G, a, d, o, c), G.baseTransform = zC(G.ctx), G.executeOperatorList(C), G.endDrawing(), B.restore(), R || X) {
  10374. const w = N.canvas;
  10375. R && (p = l), X && (Y = n);
  10376. const W = this.getSizeAndScale(p, this.ctx.canvas.width, m), y = this.getSizeAndScale(Y, this.ctx.canvas.height, Z), f = W.size, D = y.size, F = I.cachedCanvases.getCanvas("pattern-workaround", f, D), T = F.context, Q = R ? Math.floor(r / l) : 0, P = X ? Math.floor(h / n) : 0;
  10377. for (let L = 0; L <= Q; L++)
  10378. for (let E = 0; E <= P; E++)
  10379. T.drawImage(w, f * L, D * E, f, D, 0, 0, f, D);
  10380. return {
  10381. canvas: F.canvas,
  10382. scaleX: W.scale,
  10383. scaleY: y.scale,
  10384. offsetX: a,
  10385. offsetY: d
  10386. };
  10387. }
  10388. return {
  10389. canvas: N.canvas,
  10390. scaleX: K.scale,
  10391. scaleY: V.scale,
  10392. offsetX: a,
  10393. offsetY: d
  10394. };
  10395. }
  10396. getSizeAndScale(I, g, C) {
  10397. const i = Math.max(kV.MAX_PATTERN_SIZE, g);
  10398. let e = Math.ceil(I * C);
  10399. return e >= i ? e = i : C = e / I, {
  10400. scale: C,
  10401. size: e
  10402. };
  10403. }
  10404. clipBbox(I, g, C, i, e) {
  10405. const A = i - g, s = e - C;
  10406. I.ctx.rect(g, C, A, s), I.current.updateRectMinMax(zC(I.ctx), [g, C, i, e]), I.clip(), I.endPath();
  10407. }
  10408. setFillAndStrokeStyleToContext(I, g, C) {
  10409. const i = I.ctx, e = I.current;
  10410. switch (g) {
  10411. case e8.COLORED:
  10412. const A = this.ctx;
  10413. i.fillStyle = A.fillStyle, i.strokeStyle = A.strokeStyle, e.fillColor = A.fillStyle, e.strokeColor = A.strokeStyle;
  10414. break;
  10415. case e8.UNCOLORED:
  10416. const s = AI.makeHexColor(C[0], C[1], C[2]);
  10417. i.fillStyle = s, i.strokeStyle = s, e.fillColor = s, e.strokeColor = s;
  10418. break;
  10419. default:
  10420. throw new jog(`Unsupported paint type: ${g}`);
  10421. }
  10422. }
  10423. isModifyingCurrentTransform() {
  10424. return !1;
  10425. }
  10426. getPattern(I, g, C, i) {
  10427. let e = C;
  10428. i !== Ci.SHADING && (e = AI.transform(e, g.baseTransform), this.matrix && (e = AI.transform(e, this.matrix)));
  10429. const A = this.createPatternCanvas(g);
  10430. let s = new DOMMatrix(e);
  10431. s = s.translate(A.offsetX, A.offsetY), s = s.scale(1 / A.scaleX, 1 / A.scaleY);
  10432. const l = I.createPattern(A.canvas, "repeat");
  10433. return l.setTransform(s), l;
  10434. }
  10435. };
  10436. iI(kV, "MAX_PATTERN_SIZE", 3e3);
  10437. let hS = kV;
  10438. function wcg({
  10439. src: t,
  10440. srcPos: I = 0,
  10441. dest: g,
  10442. width: C,
  10443. height: i,
  10444. nonBlackColor: e = 4294967295,
  10445. inverseDecode: A = !1
  10446. }) {
  10447. const s = Ai.isLittleEndian ? 4278190080 : 255, [l, n] = A ? [e, s] : [s, e], a = C >> 3, d = C & 7, o = t.length;
  10448. g = new Uint32Array(g.buffer);
  10449. let c = 0;
  10450. for (let r = 0; r < i; r++) {
  10451. for (const b = I + a; I < b; I++) {
  10452. const u = I < o ? t[I] : 255;
  10453. g[c++] = u & 128 ? n : l, g[c++] = u & 64 ? n : l, g[c++] = u & 32 ? n : l, g[c++] = u & 16 ? n : l, g[c++] = u & 8 ? n : l, g[c++] = u & 4 ? n : l, g[c++] = u & 2 ? n : l, g[c++] = u & 1 ? n : l;
  10454. }
  10455. if (d === 0)
  10456. continue;
  10457. const h = I < o ? t[I++] : 255;
  10458. for (let b = 0; b < d; b++)
  10459. g[c++] = h & 1 << 7 - b ? n : l;
  10460. }
  10461. return {
  10462. srcPos: I,
  10463. destPos: c
  10464. };
  10465. }
  10466. const A8 = 16, s8 = 100, pcg = 15, l8 = 10, n8 = 1e3, Ei = 16, QH = new DOMMatrix();
  10467. function Bcg(t, I) {
  10468. if (t._removeMirroring)
  10469. throw new Error("Context is already forwarding operations.");
  10470. t.__originalSave = t.save, t.__originalRestore = t.restore, t.__originalRotate = t.rotate, t.__originalScale = t.scale, t.__originalTranslate = t.translate, t.__originalTransform = t.transform, t.__originalSetTransform = t.setTransform, t.__originalResetTransform = t.resetTransform, t.__originalClip = t.clip, t.__originalMoveTo = t.moveTo, t.__originalLineTo = t.lineTo, t.__originalBezierCurveTo = t.bezierCurveTo, t.__originalRect = t.rect, t.__originalClosePath = t.closePath, t.__originalBeginPath = t.beginPath, t._removeMirroring = () => {
  10471. t.save = t.__originalSave, t.restore = t.__originalRestore, t.rotate = t.__originalRotate, t.scale = t.__originalScale, t.translate = t.__originalTranslate, t.transform = t.__originalTransform, t.setTransform = t.__originalSetTransform, t.resetTransform = t.__originalResetTransform, t.clip = t.__originalClip, t.moveTo = t.__originalMoveTo, t.lineTo = t.__originalLineTo, t.bezierCurveTo = t.__originalBezierCurveTo, t.rect = t.__originalRect, t.closePath = t.__originalClosePath, t.beginPath = t.__originalBeginPath, delete t._removeMirroring;
  10472. }, t.save = function() {
  10473. I.save(), this.__originalSave();
  10474. }, t.restore = function() {
  10475. I.restore(), this.__originalRestore();
  10476. }, t.translate = function(C, i) {
  10477. I.translate(C, i), this.__originalTranslate(C, i);
  10478. }, t.scale = function(C, i) {
  10479. I.scale(C, i), this.__originalScale(C, i);
  10480. }, t.transform = function(C, i, e, A, s, l) {
  10481. I.transform(C, i, e, A, s, l), this.__originalTransform(C, i, e, A, s, l);
  10482. }, t.setTransform = function(C, i, e, A, s, l) {
  10483. I.setTransform(C, i, e, A, s, l), this.__originalSetTransform(C, i, e, A, s, l);
  10484. }, t.resetTransform = function() {
  10485. I.resetTransform(), this.__originalResetTransform();
  10486. }, t.rotate = function(C) {
  10487. I.rotate(C), this.__originalRotate(C);
  10488. }, t.clip = function(C) {
  10489. I.clip(C), this.__originalClip(C);
  10490. }, t.moveTo = function(g, C) {
  10491. I.moveTo(g, C), this.__originalMoveTo(g, C);
  10492. }, t.lineTo = function(g, C) {
  10493. I.lineTo(g, C), this.__originalLineTo(g, C);
  10494. }, t.bezierCurveTo = function(g, C, i, e, A, s) {
  10495. I.bezierCurveTo(g, C, i, e, A, s), this.__originalBezierCurveTo(g, C, i, e, A, s);
  10496. }, t.rect = function(g, C, i, e) {
  10497. I.rect(g, C, i, e), this.__originalRect(g, C, i, e);
  10498. }, t.closePath = function() {
  10499. I.closePath(), this.__originalClosePath();
  10500. }, t.beginPath = function() {
  10501. I.beginPath(), this.__originalBeginPath();
  10502. };
  10503. }
  10504. class Wcg {
  10505. constructor(I) {
  10506. this.canvasFactory = I, this.cache = /* @__PURE__ */ Object.create(null);
  10507. }
  10508. getCanvas(I, g, C) {
  10509. let i;
  10510. return this.cache[I] !== void 0 ? (i = this.cache[I], this.canvasFactory.reset(i, g, C)) : (i = this.canvasFactory.create(g, C), this.cache[I] = i), i;
  10511. }
  10512. delete(I) {
  10513. delete this.cache[I];
  10514. }
  10515. clear() {
  10516. for (const I in this.cache) {
  10517. const g = this.cache[I];
  10518. this.canvasFactory.destroy(g), delete this.cache[I];
  10519. }
  10520. }
  10521. }
  10522. function zY(t, I, g, C, i, e, A, s, l, n) {
  10523. const [a, d, o, c, r, h] = zC(t);
  10524. if (d === 0 && o === 0) {
  10525. const m = A * a + r, Z = Math.round(m), p = s * c + h, Y = Math.round(p), R = (A + l) * a + r, X = Math.abs(Math.round(R) - Z) || 1, H = (s + n) * c + h, S = Math.abs(Math.round(H) - Y) || 1;
  10526. return t.setTransform(Math.sign(a), 0, 0, Math.sign(c), Z, Y), t.drawImage(I, g, C, i, e, 0, 0, X, S), t.setTransform(a, d, o, c, r, h), [X, S];
  10527. }
  10528. if (a === 0 && c === 0) {
  10529. const m = s * o + r, Z = Math.round(m), p = A * d + h, Y = Math.round(p), R = (s + n) * o + r, X = Math.abs(Math.round(R) - Z) || 1, H = (A + l) * d + h, S = Math.abs(Math.round(H) - Y) || 1;
  10530. return t.setTransform(0, Math.sign(d), Math.sign(o), 0, Z, Y), t.drawImage(I, g, C, i, e, 0, 0, S, X), t.setTransform(a, d, o, c, r, h), [S, X];
  10531. }
  10532. t.drawImage(I, g, C, i, e, A, s, l, n);
  10533. const b = Math.hypot(a, d), u = Math.hypot(o, c);
  10534. return [b * l, u * n];
  10535. }
  10536. function ycg(t) {
  10537. const {
  10538. width: I,
  10539. height: g
  10540. } = t;
  10541. if (I > n8 || g > n8)
  10542. return null;
  10543. const C = 1e3, i = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]), e = I + 1, A = new Uint8Array(e * (g + 1));
  10544. let s, l, n;
  10545. const a = I + 7 & -8, d = new Uint8Array(a * g);
  10546. let o = 0;
  10547. for (const R of t.data) {
  10548. let X = 128;
  10549. for (; X > 0; )
  10550. d[o++] = R & X ? 0 : 255, X >>= 1;
  10551. }
  10552. let c = 0;
  10553. for (o = 0, d[o] !== 0 && (A[0] = 1, ++c), l = 1; l < I; l++)
  10554. d[o] !== d[o + 1] && (A[l] = d[o] ? 2 : 1, ++c), o++;
  10555. for (d[o] !== 0 && (A[l] = 2, ++c), s = 1; s < g; s++) {
  10556. o = s * a, n = s * e, d[o - a] !== d[o] && (A[n] = d[o] ? 1 : 8, ++c);
  10557. let R = (d[o] ? 4 : 0) + (d[o - a] ? 8 : 0);
  10558. for (l = 1; l < I; l++)
  10559. R = (R >> 2) + (d[o + 1] ? 4 : 0) + (d[o - a + 1] ? 8 : 0), i[R] && (A[n + l] = i[R], ++c), o++;
  10560. if (d[o - a] !== d[o] && (A[n + l] = d[o] ? 2 : 4, ++c), c > C)
  10561. return null;
  10562. }
  10563. for (o = a * (g - 1), n = s * e, d[o] !== 0 && (A[n] = 8, ++c), l = 1; l < I; l++)
  10564. d[o] !== d[o + 1] && (A[n + l] = d[o] ? 4 : 8, ++c), o++;
  10565. if (d[o] !== 0 && (A[n + l] = 4, ++c), c > C)
  10566. return null;
  10567. const r = new Int32Array([0, e, -1, 0, -e, 0, 0, 0, 1]), h = new Path2D(), {
  10568. a: b,
  10569. b: u,
  10570. c: m,
  10571. d: Z,
  10572. e: p,
  10573. f: Y
  10574. } = new DOMMatrix().scaleSelf(1 / I, -1 / g).translateSelf(0, -g);
  10575. for (s = 0; c && s <= g; s++) {
  10576. let R = s * e;
  10577. const X = R + I;
  10578. for (; R < X && !A[R]; )
  10579. R++;
  10580. if (R === X)
  10581. continue;
  10582. let H = R % e, S = s;
  10583. h.moveTo(b * H + m * S + p, u * H + Z * S + Y);
  10584. const z = R;
  10585. let v = A[R];
  10586. do {
  10587. const K = r[v];
  10588. do
  10589. R += K;
  10590. while (!A[R]);
  10591. const V = A[R];
  10592. V !== 5 && V !== 10 ? (v = V, A[R] = 0) : (v = V & 51 * v >> 4, A[R] &= v >> 2 | v << 2), H = R % e, S = R / e | 0, h.lineTo(b * H + m * S + p, u * H + Z * S + Y), A[R] || --c;
  10593. } while (z !== R);
  10594. --s;
  10595. }
  10596. return h;
  10597. }
  10598. class a8 {
  10599. constructor(I, g) {
  10600. this.alphaIsShape = !1, this.fontSize = 0, this.fontSizeScale = 1, this.textMatrix = R$, this.textMatrixScale = 1, this.fontMatrix = jX, this.leading = 0, this.x = 0, this.y = 0, this.lineX = 0, this.lineY = 0, this.charSpacing = 0, this.wordSpacing = 0, this.textHScale = 1, this.textRenderingMode = hi.FILL, this.textRise = 0, this.fillColor = "#000000", this.strokeColor = "#000000", this.patternFill = !1, this.patternStroke = !1, this.fillAlpha = 1, this.strokeAlpha = 1, this.lineWidth = 1, this.activeSMask = null, this.transferMaps = "none", this.startNewPathAndClipBox([0, 0, I, g]);
  10601. }
  10602. clone() {
  10603. const I = Object.create(this);
  10604. return I.clipBox = this.clipBox.slice(), I;
  10605. }
  10606. updateRectMinMax(I, g) {
  10607. const C = AI.applyTransform(g, I), i = AI.applyTransform(g.slice(2), I), e = AI.applyTransform([g[0], g[3]], I), A = AI.applyTransform([g[2], g[1]], I);
  10608. this.minX = Math.min(this.minX, C[0], i[0], e[0], A[0]), this.minY = Math.min(this.minY, C[1], i[1], e[1], A[1]), this.maxX = Math.max(this.maxX, C[0], i[0], e[0], A[0]), this.maxY = Math.max(this.maxY, C[1], i[1], e[1], A[1]);
  10609. }
  10610. getPathBoundingBox(I = Ci.FILL, g = null) {
  10611. const C = [this.minX, this.minY, this.maxX, this.maxY];
  10612. if (I === Ci.STROKE) {
  10613. g || BC("Stroke bounding box must include transform.");
  10614. const i = AI.singularValueDecompose2dScale(g), e = i[0] * this.lineWidth / 2, A = i[1] * this.lineWidth / 2;
  10615. C[0] -= e, C[1] -= A, C[2] += e, C[3] += A;
  10616. }
  10617. return C;
  10618. }
  10619. updateClipFromPath() {
  10620. const I = AI.intersect(this.clipBox, this.getPathBoundingBox());
  10621. this.startNewPathAndClipBox(I || [0, 0, 0, 0]);
  10622. }
  10623. isEmptyClip() {
  10624. return this.minX === 1 / 0;
  10625. }
  10626. startNewPathAndClipBox(I) {
  10627. this.clipBox = I, this.minX = 1 / 0, this.minY = 1 / 0, this.maxX = 0, this.maxY = 0;
  10628. }
  10629. getClippedPathBoundingBox(I = Ci.FILL, g = null) {
  10630. return AI.intersect(this.clipBox, this.getPathBoundingBox(I, g));
  10631. }
  10632. }
  10633. function o8(t, I) {
  10634. if (I instanceof ImageData) {
  10635. t.putImageData(I, 0, 0);
  10636. return;
  10637. }
  10638. const g = I.height, C = I.width, i = g % Ei, e = (g - i) / Ei, A = i === 0 ? e : e + 1, s = t.createImageData(C, Ei);
  10639. let l = 0, n;
  10640. const a = I.data, d = s.data;
  10641. let o, c, r, h;
  10642. if (I.kind === aN.GRAYSCALE_1BPP) {
  10643. const b = a.byteLength, u = new Uint32Array(d.buffer, 0, d.byteLength >> 2), m = u.length, Z = C + 7 >> 3, p = 4294967295, Y = Ai.isLittleEndian ? 4278190080 : 255;
  10644. for (o = 0; o < A; o++) {
  10645. for (r = o < e ? Ei : i, n = 0, c = 0; c < r; c++) {
  10646. const R = b - l;
  10647. let X = 0;
  10648. const H = R > Z ? C : R * 8 - 7, S = H & -8;
  10649. let z = 0, v = 0;
  10650. for (; X < S; X += 8)
  10651. v = a[l++], u[n++] = v & 128 ? p : Y, u[n++] = v & 64 ? p : Y, u[n++] = v & 32 ? p : Y, u[n++] = v & 16 ? p : Y, u[n++] = v & 8 ? p : Y, u[n++] = v & 4 ? p : Y, u[n++] = v & 2 ? p : Y, u[n++] = v & 1 ? p : Y;
  10652. for (; X < H; X++)
  10653. z === 0 && (v = a[l++], z = 128), u[n++] = v & z ? p : Y, z >>= 1;
  10654. }
  10655. for (; n < m; )
  10656. u[n++] = 0;
  10657. t.putImageData(s, 0, o * Ei);
  10658. }
  10659. } else if (I.kind === aN.RGBA_32BPP) {
  10660. for (c = 0, h = C * Ei * 4, o = 0; o < e; o++)
  10661. d.set(a.subarray(l, l + h)), l += h, t.putImageData(s, 0, c), c += Ei;
  10662. o < A && (h = C * i * 4, d.set(a.subarray(l, l + h)), t.putImageData(s, 0, c));
  10663. } else if (I.kind === aN.RGB_24BPP)
  10664. for (r = Ei, h = C * r, o = 0; o < A; o++) {
  10665. for (o >= e && (r = i, h = C * r), n = 0, c = h; c--; )
  10666. d[n++] = a[l++], d[n++] = a[l++], d[n++] = a[l++], d[n++] = 255;
  10667. t.putImageData(s, 0, o * Ei);
  10668. }
  10669. else
  10670. throw new Error(`bad image kind: ${I.kind}`);
  10671. }
  10672. function c8(t, I) {
  10673. if (I.bitmap) {
  10674. t.drawImage(I.bitmap, 0, 0);
  10675. return;
  10676. }
  10677. const g = I.height, C = I.width, i = g % Ei, e = (g - i) / Ei, A = i === 0 ? e : e + 1, s = t.createImageData(C, Ei);
  10678. let l = 0;
  10679. const n = I.data, a = s.data;
  10680. for (let d = 0; d < A; d++) {
  10681. const o = d < e ? Ei : i;
  10682. ({
  10683. srcPos: l
  10684. } = wcg({
  10685. src: n,
  10686. srcPos: l,
  10687. dest: a,
  10688. width: C,
  10689. height: o,
  10690. nonBlackColor: 0
  10691. })), t.putImageData(s, 0, d * Ei);
  10692. }
  10693. }
  10694. function Hu(t, I) {
  10695. const g = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font", "filter"];
  10696. for (const C of g)
  10697. t[C] !== void 0 && (I[C] = t[C]);
  10698. t.setLineDash !== void 0 && (I.setLineDash(t.getLineDash()), I.lineDashOffset = t.lineDashOffset);
  10699. }
  10700. function JY(t) {
  10701. if (t.strokeStyle = t.fillStyle = "#000000", t.fillRule = "nonzero", t.globalAlpha = 1, t.lineWidth = 1, t.lineCap = "butt", t.lineJoin = "miter", t.miterLimit = 10, t.globalCompositeOperation = "source-over", t.font = "10px sans-serif", t.setLineDash !== void 0 && (t.setLineDash([]), t.lineDashOffset = 0), !$t) {
  10702. const {
  10703. filter: I
  10704. } = t;
  10705. I !== "none" && I !== "" && (t.filter = "none");
  10706. }
  10707. }
  10708. function d8(t, I) {
  10709. if (I)
  10710. return !0;
  10711. const g = AI.singularValueDecompose2dScale(t);
  10712. g[0] = Math.fround(g[0]), g[1] = Math.fround(g[1]);
  10713. const C = Math.fround(In.pixelRatio * Pa.PDF_TO_CSS_UNITS);
  10714. return g[0] <= C && g[1] <= C;
  10715. }
  10716. const Ycg = ["butt", "round", "square"], Ncg = ["miter", "round", "bevel"], Vcg = {}, r8 = {};
  10717. var JA, bS, uS, mS;
  10718. const i1 = class i1 {
  10719. constructor(I, g, C, i, e, {
  10720. optionalContentConfig: A,
  10721. markedContentStack: s = null
  10722. }, l, n) {
  10723. tg(this, JA);
  10724. this.ctx = I, this.current = new a8(this.ctx.canvas.width, this.ctx.canvas.height), this.stateStack = [], this.pendingClip = null, this.pendingEOFill = !1, this.res = null, this.xobjs = null, this.commonObjs = g, this.objs = C, this.canvasFactory = i, this.filterFactory = e, this.groupStack = [], this.processingType3 = null, this.baseTransform = null, this.baseTransformStack = [], this.groupLevel = 0, this.smaskStack = [], this.smaskCounter = 0, this.tempSMask = null, this.suspendedCtx = null, this.contentVisible = !0, this.markedContentStack = s || [], this.optionalContentConfig = A, this.cachedCanvases = new Wcg(this.canvasFactory), this.cachedPatterns = /* @__PURE__ */ new Map(), this.annotationCanvasMap = l, this.viewportScale = 1, this.outputScaleX = 1, this.outputScaleY = 1, this.pageColors = n, this._cachedScaleForStroking = [-1, 0], this._cachedGetSinglePixelWidth = null, this._cachedBitmapsMap = /* @__PURE__ */ new Map();
  10725. }
  10726. getObject(I, g = null) {
  10727. return typeof I == "string" ? I.startsWith("g_") ? this.commonObjs.get(I) : this.objs.get(I) : g;
  10728. }
  10729. beginDrawing({
  10730. transform: I,
  10731. viewport: g,
  10732. transparency: C = !1,
  10733. background: i = null
  10734. }) {
  10735. const e = this.ctx.canvas.width, A = this.ctx.canvas.height, s = this.ctx.fillStyle;
  10736. if (this.ctx.fillStyle = i || "#ffffff", this.ctx.fillRect(0, 0, e, A), this.ctx.fillStyle = s, C) {
  10737. const l = this.cachedCanvases.getCanvas("transparent", e, A);
  10738. this.compositeCtx = this.ctx, this.transparentCanvas = l.canvas, this.ctx = l.context, this.ctx.save(), this.ctx.transform(...zC(this.compositeCtx));
  10739. }
  10740. this.ctx.save(), JY(this.ctx), I && (this.ctx.transform(...I), this.outputScaleX = I[0], this.outputScaleY = I[0]), this.ctx.transform(...g.transform), this.viewportScale = g.scale, this.baseTransform = zC(this.ctx);
  10741. }
  10742. executeOperatorList(I, g, C, i) {
  10743. const e = I.argsArray, A = I.fnArray;
  10744. let s = g || 0;
  10745. const l = e.length;
  10746. if (l === s)
  10747. return s;
  10748. const n = l - s > l8 && typeof C == "function", a = n ? Date.now() + pcg : 0;
  10749. let d = 0;
  10750. const o = this.commonObjs, c = this.objs;
  10751. let r;
  10752. for (; ; ) {
  10753. if (i !== void 0 && s === i.nextBreakPoint)
  10754. return i.breakIt(s, C), s;
  10755. if (r = A[s], r !== IV.dependency)
  10756. this[r].apply(this, e[s]);
  10757. else
  10758. for (const h of e[s]) {
  10759. const b = h.startsWith("g_") ? o : c;
  10760. if (!b.has(h))
  10761. return b.get(h, C), s;
  10762. }
  10763. if (s++, s === l)
  10764. return s;
  10765. if (n && ++d > l8) {
  10766. if (Date.now() > a)
  10767. return C(), s;
  10768. d = 0;
  10769. }
  10770. }
  10771. }
  10772. endDrawing() {
  10773. ig(this, JA, bS).call(this), this.cachedCanvases.clear(), this.cachedPatterns.clear();
  10774. for (const I of this._cachedBitmapsMap.values()) {
  10775. for (const g of I.values())
  10776. typeof HTMLCanvasElement < "u" && g instanceof HTMLCanvasElement && (g.width = g.height = 0);
  10777. I.clear();
  10778. }
  10779. this._cachedBitmapsMap.clear(), ig(this, JA, uS).call(this);
  10780. }
  10781. _scaleImage(I, g) {
  10782. const C = I.width ?? I.displayWidth, i = I.height ?? I.displayHeight;
  10783. let e = Math.max(Math.hypot(g[0], g[1]), 1), A = Math.max(Math.hypot(g[2], g[3]), 1), s = C, l = i, n = "prescale1", a, d;
  10784. for (; e > 2 && s > 1 || A > 2 && l > 1; ) {
  10785. let o = s, c = l;
  10786. e > 2 && s > 1 && (o = s >= 16384 ? Math.floor(s / 2) - 1 || 1 : Math.ceil(s / 2), e /= s / o), A > 2 && l > 1 && (c = l >= 16384 ? Math.floor(l / 2) - 1 || 1 : Math.ceil(l) / 2, A /= l / c), a = this.cachedCanvases.getCanvas(n, o, c), d = a.context, d.clearRect(0, 0, o, c), d.drawImage(I, 0, 0, s, l, 0, 0, o, c), I = a.canvas, s = o, l = c, n = n === "prescale1" ? "prescale2" : "prescale1";
  10787. }
  10788. return {
  10789. img: I,
  10790. paintWidth: s,
  10791. paintHeight: l
  10792. };
  10793. }
  10794. _createMaskCanvas(I) {
  10795. const g = this.ctx, {
  10796. width: C,
  10797. height: i
  10798. } = I, e = this.current.fillColor, A = this.current.patternFill, s = zC(g);
  10799. let l, n, a, d;
  10800. if ((I.bitmap || I.data) && I.count > 1) {
  10801. const H = I.bitmap || I.data.buffer;
  10802. n = JSON.stringify(A ? s : [s.slice(0, 4), e]), l = this._cachedBitmapsMap.get(H), l || (l = /* @__PURE__ */ new Map(), this._cachedBitmapsMap.set(H, l));
  10803. const S = l.get(n);
  10804. if (S && !A) {
  10805. const z = Math.round(Math.min(s[0], s[2]) + s[4]), v = Math.round(Math.min(s[1], s[3]) + s[5]);
  10806. return {
  10807. canvas: S,
  10808. offsetX: z,
  10809. offsetY: v
  10810. };
  10811. }
  10812. a = S;
  10813. }
  10814. a || (d = this.cachedCanvases.getCanvas("maskCanvas", C, i), c8(d.context, I));
  10815. let o = AI.transform(s, [1 / C, 0, 0, -1 / i, 0, 0]);
  10816. o = AI.transform(o, [1, 0, 0, 1, 0, -i]);
  10817. const [c, r, h, b] = AI.getAxialAlignedBoundingBox([0, 0, C, i], o), u = Math.round(h - c) || 1, m = Math.round(b - r) || 1, Z = this.cachedCanvases.getCanvas("fillCanvas", u, m), p = Z.context, Y = c, R = r;
  10818. p.translate(-Y, -R), p.transform(...o), a || (a = this._scaleImage(d.canvas, ss(p)), a = a.img, l && A && l.set(n, a)), p.imageSmoothingEnabled = d8(zC(p), I.interpolate), zY(p, a, 0, 0, a.width, a.height, 0, 0, C, i), p.globalCompositeOperation = "source-in";
  10819. const X = AI.transform(ss(p), [1, 0, 0, 1, -Y, -R]);
  10820. return p.fillStyle = A ? e.getPattern(g, this, X, Ci.FILL) : e, p.fillRect(0, 0, C, i), l && !A && (this.cachedCanvases.delete("fillCanvas"), l.set(n, Z.canvas)), {
  10821. canvas: Z.canvas,
  10822. offsetX: Math.round(Y),
  10823. offsetY: Math.round(R)
  10824. };
  10825. }
  10826. setLineWidth(I) {
  10827. I !== this.current.lineWidth && (this._cachedScaleForStroking[0] = -1), this.current.lineWidth = I, this.ctx.lineWidth = I;
  10828. }
  10829. setLineCap(I) {
  10830. this.ctx.lineCap = Ycg[I];
  10831. }
  10832. setLineJoin(I) {
  10833. this.ctx.lineJoin = Ncg[I];
  10834. }
  10835. setMiterLimit(I) {
  10836. this.ctx.miterLimit = I;
  10837. }
  10838. setDash(I, g) {
  10839. const C = this.ctx;
  10840. C.setLineDash !== void 0 && (C.setLineDash(I), C.lineDashOffset = g);
  10841. }
  10842. setRenderingIntent(I) {
  10843. }
  10844. setFlatness(I) {
  10845. }
  10846. setGState(I) {
  10847. for (const [g, C] of I)
  10848. switch (g) {
  10849. case "LW":
  10850. this.setLineWidth(C);
  10851. break;
  10852. case "LC":
  10853. this.setLineCap(C);
  10854. break;
  10855. case "LJ":
  10856. this.setLineJoin(C);
  10857. break;
  10858. case "ML":
  10859. this.setMiterLimit(C);
  10860. break;
  10861. case "D":
  10862. this.setDash(C[0], C[1]);
  10863. break;
  10864. case "RI":
  10865. this.setRenderingIntent(C);
  10866. break;
  10867. case "FL":
  10868. this.setFlatness(C);
  10869. break;
  10870. case "Font":
  10871. this.setFont(C[0], C[1]);
  10872. break;
  10873. case "CA":
  10874. this.current.strokeAlpha = C;
  10875. break;
  10876. case "ca":
  10877. this.ctx.globalAlpha = this.current.fillAlpha = C;
  10878. break;
  10879. case "BM":
  10880. this.ctx.globalCompositeOperation = C;
  10881. break;
  10882. case "SMask":
  10883. this.current.activeSMask = C ? this.tempSMask : null, this.tempSMask = null, this.checkSMaskState();
  10884. break;
  10885. case "TR":
  10886. this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(C);
  10887. break;
  10888. }
  10889. }
  10890. get inSMaskMode() {
  10891. return !!this.suspendedCtx;
  10892. }
  10893. checkSMaskState() {
  10894. const I = this.inSMaskMode;
  10895. this.current.activeSMask && !I ? this.beginSMaskMode() : !this.current.activeSMask && I && this.endSMaskMode();
  10896. }
  10897. beginSMaskMode() {
  10898. if (this.inSMaskMode)
  10899. throw new Error("beginSMaskMode called while already in smask mode");
  10900. const I = this.ctx.canvas.width, g = this.ctx.canvas.height, C = "smaskGroupAt" + this.groupLevel, i = this.cachedCanvases.getCanvas(C, I, g);
  10901. this.suspendedCtx = this.ctx;
  10902. const e = this.ctx = i.context;
  10903. e.setTransform(this.suspendedCtx.getTransform()), Hu(this.suspendedCtx, e), Bcg(e, this.suspendedCtx), this.setGState([["BM", "source-over"]]);
  10904. }
  10905. endSMaskMode() {
  10906. if (!this.inSMaskMode)
  10907. throw new Error("endSMaskMode called while not in smask mode");
  10908. this.ctx._removeMirroring(), Hu(this.ctx, this.suspendedCtx), this.ctx = this.suspendedCtx, this.suspendedCtx = null;
  10909. }
  10910. compose(I) {
  10911. if (!this.current.activeSMask)
  10912. return;
  10913. I ? (I[0] = Math.floor(I[0]), I[1] = Math.floor(I[1]), I[2] = Math.ceil(I[2]), I[3] = Math.ceil(I[3])) : I = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height];
  10914. const g = this.current.activeSMask, C = this.suspendedCtx;
  10915. this.composeSMask(C, g, this.ctx, I), this.ctx.save(), this.ctx.setTransform(1, 0, 0, 1, 0, 0), this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height), this.ctx.restore();
  10916. }
  10917. composeSMask(I, g, C, i) {
  10918. const e = i[0], A = i[1], s = i[2] - e, l = i[3] - A;
  10919. s === 0 || l === 0 || (this.genericComposeSMask(g.context, C, s, l, g.subtype, g.backdrop, g.transferMap, e, A, g.offsetX, g.offsetY), I.save(), I.globalAlpha = 1, I.globalCompositeOperation = "source-over", I.setTransform(1, 0, 0, 1, 0, 0), I.drawImage(C.canvas, 0, 0), I.restore());
  10920. }
  10921. genericComposeSMask(I, g, C, i, e, A, s, l, n, a, d) {
  10922. let o = I.canvas, c = l - a, r = n - d;
  10923. if (A) {
  10924. const b = AI.makeHexColor(...A);
  10925. if (c < 0 || r < 0 || c + C > o.width || r + i > o.height) {
  10926. const u = this.cachedCanvases.getCanvas("maskExtension", C, i), m = u.context;
  10927. m.drawImage(o, -c, -r), m.globalCompositeOperation = "destination-atop", m.fillStyle = b, m.fillRect(0, 0, C, i), m.globalCompositeOperation = "source-over", o = u.canvas, c = r = 0;
  10928. } else {
  10929. I.save(), I.globalAlpha = 1, I.setTransform(1, 0, 0, 1, 0, 0);
  10930. const u = new Path2D();
  10931. u.rect(c, r, C, i), I.clip(u), I.globalCompositeOperation = "destination-atop", I.fillStyle = b, I.fillRect(c, r, C, i), I.restore();
  10932. }
  10933. }
  10934. g.save(), g.globalAlpha = 1, g.setTransform(1, 0, 0, 1, 0, 0), e === "Alpha" && s ? g.filter = this.filterFactory.addAlphaFilter(s) : e === "Luminosity" && (g.filter = this.filterFactory.addLuminosityFilter(s));
  10935. const h = new Path2D();
  10936. h.rect(l, n, C, i), g.clip(h), g.globalCompositeOperation = "destination-in", g.drawImage(o, c, r, C, i, l, n, C, i), g.restore();
  10937. }
  10938. save() {
  10939. this.inSMaskMode && Hu(this.ctx, this.suspendedCtx), this.ctx.save();
  10940. const I = this.current;
  10941. this.stateStack.push(I), this.current = I.clone();
  10942. }
  10943. restore() {
  10944. if (this.stateStack.length === 0) {
  10945. this.inSMaskMode && this.endSMaskMode();
  10946. return;
  10947. }
  10948. this.current = this.stateStack.pop(), this.ctx.restore(), this.inSMaskMode && Hu(this.suspendedCtx, this.ctx), this.checkSMaskState(), this.pendingClip = null, this._cachedScaleForStroking[0] = -1, this._cachedGetSinglePixelWidth = null;
  10949. }
  10950. transform(I, g, C, i, e, A) {
  10951. this.ctx.transform(I, g, C, i, e, A), this._cachedScaleForStroking[0] = -1, this._cachedGetSinglePixelWidth = null;
  10952. }
  10953. constructPath(I, g, C) {
  10954. let [i] = g;
  10955. if (!C) {
  10956. i || (i = g[0] = new Path2D()), this[I](i);
  10957. return;
  10958. }
  10959. if (!(i instanceof Path2D)) {
  10960. const e = g[0] = new Path2D();
  10961. for (let A = 0, s = i.length; A < s; )
  10962. switch (i[A++]) {
  10963. case FY.moveTo:
  10964. e.moveTo(i[A++], i[A++]);
  10965. break;
  10966. case FY.lineTo:
  10967. e.lineTo(i[A++], i[A++]);
  10968. break;
  10969. case FY.curveTo:
  10970. e.bezierCurveTo(i[A++], i[A++], i[A++], i[A++], i[A++], i[A++]);
  10971. break;
  10972. case FY.closePath:
  10973. e.closePath();
  10974. break;
  10975. default:
  10976. DI(`Unrecognized drawing path operator: ${i[A - 1]}`);
  10977. break;
  10978. }
  10979. i = e;
  10980. }
  10981. this.current.updateRectMinMax(zC(this.ctx), C), this[I](i);
  10982. }
  10983. closePath() {
  10984. this.ctx.closePath();
  10985. }
  10986. stroke(I, g = !0) {
  10987. const C = this.ctx, i = this.current.strokeColor;
  10988. if (C.globalAlpha = this.current.strokeAlpha, this.contentVisible)
  10989. if (typeof i == "object" && (i != null && i.getPattern)) {
  10990. const e = i.isModifyingCurrentTransform() ? C.getTransform() : null;
  10991. if (C.save(), C.strokeStyle = i.getPattern(C, this, ss(C), Ci.STROKE), e) {
  10992. const A = new Path2D();
  10993. A.addPath(I, C.getTransform().invertSelf().multiplySelf(e)), I = A;
  10994. }
  10995. this.rescaleAndStroke(I, !1), C.restore();
  10996. } else
  10997. this.rescaleAndStroke(I, !0);
  10998. g && this.consumePath(I, this.current.getClippedPathBoundingBox(Ci.STROKE, zC(this.ctx))), C.globalAlpha = this.current.fillAlpha;
  10999. }
  11000. closeStroke(I) {
  11001. this.stroke(I);
  11002. }
  11003. fill(I, g = !0) {
  11004. const C = this.ctx, i = this.current.fillColor, e = this.current.patternFill;
  11005. let A = !1;
  11006. if (e) {
  11007. const l = i.isModifyingCurrentTransform() ? C.getTransform() : null;
  11008. if (C.save(), C.fillStyle = i.getPattern(C, this, ss(C), Ci.FILL), l) {
  11009. const n = new Path2D();
  11010. n.addPath(I, C.getTransform().invertSelf().multiplySelf(l)), I = n;
  11011. }
  11012. A = !0;
  11013. }
  11014. const s = this.current.getClippedPathBoundingBox();
  11015. this.contentVisible && s !== null && (this.pendingEOFill ? (C.fill(I, "evenodd"), this.pendingEOFill = !1) : C.fill(I)), A && C.restore(), g && this.consumePath(I, s);
  11016. }
  11017. eoFill(I) {
  11018. this.pendingEOFill = !0, this.fill(I);
  11019. }
  11020. fillStroke(I) {
  11021. this.fill(I, !1), this.stroke(I, !1), this.consumePath(I);
  11022. }
  11023. eoFillStroke(I) {
  11024. this.pendingEOFill = !0, this.fillStroke(I);
  11025. }
  11026. closeFillStroke(I) {
  11027. this.fillStroke(I);
  11028. }
  11029. closeEOFillStroke(I) {
  11030. this.pendingEOFill = !0, this.fillStroke(I);
  11031. }
  11032. endPath(I) {
  11033. this.consumePath(I);
  11034. }
  11035. clip() {
  11036. this.pendingClip = Vcg;
  11037. }
  11038. eoClip() {
  11039. this.pendingClip = r8;
  11040. }
  11041. beginText() {
  11042. this.current.textMatrix = R$, this.current.textMatrixScale = 1, this.current.x = this.current.lineX = 0, this.current.y = this.current.lineY = 0;
  11043. }
  11044. endText() {
  11045. const I = this.pendingTextPaths, g = this.ctx;
  11046. if (I === void 0) {
  11047. g.beginPath();
  11048. return;
  11049. }
  11050. const C = new Path2D(), i = g.getTransform().invertSelf();
  11051. for (const {
  11052. transform: e,
  11053. x: A,
  11054. y: s,
  11055. fontSize: l,
  11056. path: n
  11057. } of I)
  11058. C.addPath(n, new DOMMatrix(e).preMultiplySelf(i).translate(A, s).scale(l, -l));
  11059. g.clip(C), g.beginPath(), delete this.pendingTextPaths;
  11060. }
  11061. setCharSpacing(I) {
  11062. this.current.charSpacing = I;
  11063. }
  11064. setWordSpacing(I) {
  11065. this.current.wordSpacing = I;
  11066. }
  11067. setHScale(I) {
  11068. this.current.textHScale = I / 100;
  11069. }
  11070. setLeading(I) {
  11071. this.current.leading = -I;
  11072. }
  11073. setFont(I, g) {
  11074. var a;
  11075. const C = this.commonObjs.get(I), i = this.current;
  11076. if (!C)
  11077. throw new Error(`Can't find font for ${I}`);
  11078. if (i.fontMatrix = C.fontMatrix || jX, (i.fontMatrix[0] === 0 || i.fontMatrix[3] === 0) && DI("Invalid font matrix for font " + I), g < 0 ? (g = -g, i.fontDirection = -1) : i.fontDirection = 1, this.current.font = C, this.current.fontSize = g, C.isType3Font)
  11079. return;
  11080. const e = C.loadedName || "sans-serif", A = ((a = C.systemFontInfo) == null ? void 0 : a.css) || `"${e}", ${C.fallbackName}`;
  11081. let s = "normal";
  11082. C.black ? s = "900" : C.bold && (s = "bold");
  11083. const l = C.italic ? "italic" : "normal";
  11084. let n = g;
  11085. g < A8 ? n = A8 : g > s8 && (n = s8), this.current.fontSizeScale = g / n, this.ctx.font = `${l} ${s} ${n}px ${A}`;
  11086. }
  11087. setTextRenderingMode(I) {
  11088. this.current.textRenderingMode = I;
  11089. }
  11090. setTextRise(I) {
  11091. this.current.textRise = I;
  11092. }
  11093. moveText(I, g) {
  11094. this.current.x = this.current.lineX += I, this.current.y = this.current.lineY += g;
  11095. }
  11096. setLeadingMoveText(I, g) {
  11097. this.setLeading(-g), this.moveText(I, g);
  11098. }
  11099. setTextMatrix(I, g, C, i, e, A) {
  11100. this.current.textMatrix = [I, g, C, i, e, A], this.current.textMatrixScale = Math.hypot(I, g), this.current.x = this.current.lineX = 0, this.current.y = this.current.lineY = 0;
  11101. }
  11102. nextLine() {
  11103. this.moveText(0, this.current.leading);
  11104. }
  11105. paintChar(I, g, C, i, e) {
  11106. const A = this.ctx, s = this.current, l = s.font, n = s.textRenderingMode, a = s.fontSize / s.fontSizeScale, d = n & hi.FILL_STROKE_MASK, o = !!(n & hi.ADD_TO_PATH_FLAG), c = s.patternFill && !l.missingFile, r = s.patternStroke && !l.missingFile;
  11107. let h;
  11108. if ((l.disableFontFace || o || c || r) && (h = l.getPathGenerator(this.commonObjs, I)), l.disableFontFace || c || r) {
  11109. A.save(), A.translate(g, C), A.scale(a, -a);
  11110. let b;
  11111. if ((d === hi.FILL || d === hi.FILL_STROKE) && (i ? (b = A.getTransform(), A.setTransform(...i), A.fill(ig(this, JA, mS).call(this, h, b, i))) : A.fill(h)), d === hi.STROKE || d === hi.FILL_STROKE)
  11112. if (e) {
  11113. b || (b = A.getTransform()), A.setTransform(...e);
  11114. const {
  11115. a: u,
  11116. b: m,
  11117. c: Z,
  11118. d: p
  11119. } = b, Y = AI.inverseTransform(e), R = AI.transform([u, m, Z, p, 0, 0], Y), [X, H] = AI.singularValueDecompose2dScale(R);
  11120. A.lineWidth *= Math.max(X, H) / a, A.stroke(ig(this, JA, mS).call(this, h, b, e));
  11121. } else
  11122. A.lineWidth /= a, A.stroke(h);
  11123. A.restore();
  11124. } else
  11125. (d === hi.FILL || d === hi.FILL_STROKE) && A.fillText(I, g, C), (d === hi.STROKE || d === hi.FILL_STROKE) && A.strokeText(I, g, C);
  11126. o && (this.pendingTextPaths || (this.pendingTextPaths = [])).push({
  11127. transform: zC(A),
  11128. x: g,
  11129. y: C,
  11130. fontSize: a,
  11131. path: h
  11132. });
  11133. }
  11134. get isFontSubpixelAAEnabled() {
  11135. const {
  11136. context: I
  11137. } = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10);
  11138. I.scale(1.5, 1), I.fillText("I", 0, 10);
  11139. const g = I.getImageData(0, 0, 10, 10).data;
  11140. let C = !1;
  11141. for (let i = 3; i < g.length; i += 4)
  11142. if (g[i] > 0 && g[i] < 255) {
  11143. C = !0;
  11144. break;
  11145. }
  11146. return UI(this, "isFontSubpixelAAEnabled", C);
  11147. }
  11148. showText(I) {
  11149. const g = this.current, C = g.font;
  11150. if (C.isType3Font)
  11151. return this.showType3Text(I);
  11152. const i = g.fontSize;
  11153. if (i === 0)
  11154. return;
  11155. const e = this.ctx, A = g.fontSizeScale, s = g.charSpacing, l = g.wordSpacing, n = g.fontDirection, a = g.textHScale * n, d = I.length, o = C.vertical, c = o ? 1 : -1, r = C.defaultVMetrics, h = i * g.fontMatrix[0], b = g.textRenderingMode === hi.FILL && !C.disableFontFace && !g.patternFill;
  11156. e.save(), e.transform(...g.textMatrix), e.translate(g.x, g.y + g.textRise), n > 0 ? e.scale(a, -1) : e.scale(a, 1);
  11157. let u, m;
  11158. if (g.patternFill) {
  11159. e.save();
  11160. const X = g.fillColor.getPattern(e, this, ss(e), Ci.FILL);
  11161. u = zC(e), e.restore(), e.fillStyle = X;
  11162. }
  11163. if (g.patternStroke) {
  11164. e.save();
  11165. const X = g.strokeColor.getPattern(e, this, ss(e), Ci.STROKE);
  11166. m = zC(e), e.restore(), e.strokeStyle = X;
  11167. }
  11168. let Z = g.lineWidth;
  11169. const p = g.textMatrixScale;
  11170. if (p === 0 || Z === 0) {
  11171. const X = g.textRenderingMode & hi.FILL_STROKE_MASK;
  11172. (X === hi.STROKE || X === hi.FILL_STROKE) && (Z = this.getSinglePixelWidth());
  11173. } else
  11174. Z /= p;
  11175. if (A !== 1 && (e.scale(A, A), Z /= A), e.lineWidth = Z, C.isInvalidPDFjsFont) {
  11176. const X = [];
  11177. let H = 0;
  11178. for (const S of I)
  11179. X.push(S.unicode), H += S.width;
  11180. e.fillText(X.join(""), 0, 0), g.x += H * h * a, e.restore(), this.compose();
  11181. return;
  11182. }
  11183. let Y = 0, R;
  11184. for (R = 0; R < d; ++R) {
  11185. const X = I[R];
  11186. if (typeof X == "number") {
  11187. Y += c * X * i / 1e3;
  11188. continue;
  11189. }
  11190. let H = !1;
  11191. const S = (X.isSpace ? l : 0) + s, z = X.fontChar, v = X.accent;
  11192. let K, V, N = X.width;
  11193. if (o) {
  11194. const G = X.vmetric || r, w = -(X.vmetric ? G[1] : N * 0.5) * h, W = G[2] * h;
  11195. N = G ? -G[0] : N, K = w / A, V = (Y + W) / A;
  11196. } else
  11197. K = Y / A, V = 0;
  11198. if (C.remeasure && N > 0) {
  11199. const G = e.measureText(z).width * 1e3 / i * A;
  11200. if (N < G && this.isFontSubpixelAAEnabled) {
  11201. const w = N / G;
  11202. H = !0, e.save(), e.scale(w, 1), K /= w;
  11203. } else N !== G && (K += (N - G) / 2e3 * i / A);
  11204. }
  11205. if (this.contentVisible && (X.isInFont || C.missingFile)) {
  11206. if (b && !v)
  11207. e.fillText(z, K, V);
  11208. else if (this.paintChar(z, K, V, u, m), v) {
  11209. const G = K + i * v.offset.x / A, w = V - i * v.offset.y / A;
  11210. this.paintChar(v.fontChar, G, w, u, m);
  11211. }
  11212. }
  11213. const B = o ? N * h - S * n : N * h + S * n;
  11214. Y += B, H && e.restore();
  11215. }
  11216. o ? g.y -= Y : g.x += Y * a, e.restore(), this.compose();
  11217. }
  11218. showType3Text(I) {
  11219. const g = this.ctx, C = this.current, i = C.font, e = C.fontSize, A = C.fontDirection, s = i.vertical ? 1 : -1, l = C.charSpacing, n = C.wordSpacing, a = C.textHScale * A, d = C.fontMatrix || jX, o = I.length, c = C.textRenderingMode === hi.INVISIBLE;
  11220. let r, h, b, u;
  11221. if (!(c || e === 0)) {
  11222. for (this._cachedScaleForStroking[0] = -1, this._cachedGetSinglePixelWidth = null, g.save(), g.transform(...C.textMatrix), g.translate(C.x, C.y + C.textRise), g.scale(a, A), r = 0; r < o; ++r) {
  11223. if (h = I[r], typeof h == "number") {
  11224. u = s * h * e / 1e3, this.ctx.translate(u, 0), C.x += u * a;
  11225. continue;
  11226. }
  11227. const m = (h.isSpace ? n : 0) + l, Z = i.charProcOperatorList[h.operatorListId];
  11228. Z ? this.contentVisible && (this.processingType3 = h, this.save(), g.scale(e, e), g.transform(...d), this.executeOperatorList(Z), this.restore()) : DI(`Type3 character "${h.operatorListId}" is not available.`), b = AI.applyTransform([h.width, 0], d)[0] * e + m, g.translate(b, 0), C.x += b * a;
  11229. }
  11230. g.restore(), this.processingType3 = null;
  11231. }
  11232. }
  11233. setCharWidth(I, g) {
  11234. }
  11235. setCharWidthAndBounds(I, g, C, i, e, A) {
  11236. this.ctx.rect(C, i, e - C, A - i), this.ctx.clip(), this.endPath();
  11237. }
  11238. getColorN_Pattern(I) {
  11239. let g;
  11240. if (I[0] === "TilingPattern") {
  11241. const C = this.baseTransform || zC(this.ctx), i = {
  11242. createCanvasGraphics: (e) => new i1(e, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {
  11243. optionalContentConfig: this.optionalContentConfig,
  11244. markedContentStack: this.markedContentStack
  11245. })
  11246. };
  11247. g = new hS(I, this.ctx, i, C);
  11248. } else
  11249. g = this._getPattern(I[1], I[2]);
  11250. return g;
  11251. }
  11252. setStrokeColorN() {
  11253. this.current.strokeColor = this.getColorN_Pattern(arguments), this.current.patternStroke = !0;
  11254. }
  11255. setFillColorN() {
  11256. this.current.fillColor = this.getColorN_Pattern(arguments), this.current.patternFill = !0;
  11257. }
  11258. setStrokeRGBColor(I, g, C) {
  11259. this.ctx.strokeStyle = this.current.strokeColor = AI.makeHexColor(I, g, C), this.current.patternStroke = !1;
  11260. }
  11261. setStrokeTransparent() {
  11262. this.ctx.strokeStyle = this.current.strokeColor = "transparent", this.current.patternStroke = !1;
  11263. }
  11264. setFillRGBColor(I, g, C) {
  11265. this.ctx.fillStyle = this.current.fillColor = AI.makeHexColor(I, g, C), this.current.patternFill = !1;
  11266. }
  11267. setFillTransparent() {
  11268. this.ctx.fillStyle = this.current.fillColor = "transparent", this.current.patternFill = !1;
  11269. }
  11270. _getPattern(I, g = null) {
  11271. let C;
  11272. return this.cachedPatterns.has(I) ? C = this.cachedPatterns.get(I) : (C = Gcg(this.getObject(I)), this.cachedPatterns.set(I, C)), g && (C.matrix = g), C;
  11273. }
  11274. shadingFill(I) {
  11275. if (!this.contentVisible)
  11276. return;
  11277. const g = this.ctx;
  11278. this.save();
  11279. const C = this._getPattern(I);
  11280. g.fillStyle = C.getPattern(g, this, ss(g), Ci.SHADING);
  11281. const i = ss(g);
  11282. if (i) {
  11283. const {
  11284. width: e,
  11285. height: A
  11286. } = g.canvas, [s, l, n, a] = AI.getAxialAlignedBoundingBox([0, 0, e, A], i);
  11287. this.ctx.fillRect(s, l, n - s, a - l);
  11288. } else
  11289. this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
  11290. this.compose(this.current.getClippedPathBoundingBox()), this.restore();
  11291. }
  11292. beginInlineImage() {
  11293. BC("Should not call beginInlineImage");
  11294. }
  11295. beginImageData() {
  11296. BC("Should not call beginImageData");
  11297. }
  11298. paintFormXObjectBegin(I, g) {
  11299. if (this.contentVisible && (this.save(), this.baseTransformStack.push(this.baseTransform), I && this.transform(...I), this.baseTransform = zC(this.ctx), g)) {
  11300. const C = g[2] - g[0], i = g[3] - g[1];
  11301. this.ctx.rect(g[0], g[1], C, i), this.current.updateRectMinMax(zC(this.ctx), g), this.clip(), this.endPath();
  11302. }
  11303. }
  11304. paintFormXObjectEnd() {
  11305. this.contentVisible && (this.restore(), this.baseTransform = this.baseTransformStack.pop());
  11306. }
  11307. beginGroup(I) {
  11308. if (!this.contentVisible)
  11309. return;
  11310. this.save(), this.inSMaskMode && (this.endSMaskMode(), this.current.activeSMask = null);
  11311. const g = this.ctx;
  11312. I.isolated || qV("TODO: Support non-isolated groups."), I.knockout && DI("Knockout groups not supported.");
  11313. const C = zC(g);
  11314. if (I.matrix && g.transform(...I.matrix), !I.bbox)
  11315. throw new Error("Bounding box is required.");
  11316. let i = AI.getAxialAlignedBoundingBox(I.bbox, zC(g));
  11317. const e = [0, 0, g.canvas.width, g.canvas.height];
  11318. i = AI.intersect(i, e) || [0, 0, 0, 0];
  11319. const A = Math.floor(i[0]), s = Math.floor(i[1]), l = Math.max(Math.ceil(i[2]) - A, 1), n = Math.max(Math.ceil(i[3]) - s, 1);
  11320. this.current.startNewPathAndClipBox([0, 0, l, n]);
  11321. let a = "groupAt" + this.groupLevel;
  11322. I.smask && (a += "_smask_" + this.smaskCounter++ % 2);
  11323. const d = this.cachedCanvases.getCanvas(a, l, n), o = d.context;
  11324. o.translate(-A, -s), o.transform(...C);
  11325. let c = new Path2D();
  11326. const [r, h, b, u] = I.bbox;
  11327. if (c.rect(r, h, b - r, u - h), I.matrix) {
  11328. const m = new Path2D();
  11329. m.addPath(c, new DOMMatrix(I.matrix)), c = m;
  11330. }
  11331. o.clip(c), I.smask ? this.smaskStack.push({
  11332. canvas: d.canvas,
  11333. context: o,
  11334. offsetX: A,
  11335. offsetY: s,
  11336. subtype: I.smask.subtype,
  11337. backdrop: I.smask.backdrop,
  11338. transferMap: I.smask.transferMap || null,
  11339. startTransformInverse: null
  11340. }) : (g.setTransform(1, 0, 0, 1, 0, 0), g.translate(A, s), g.save()), Hu(g, o), this.ctx = o, this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]), this.groupStack.push(g), this.groupLevel++;
  11341. }
  11342. endGroup(I) {
  11343. if (!this.contentVisible)
  11344. return;
  11345. this.groupLevel--;
  11346. const g = this.ctx, C = this.groupStack.pop();
  11347. if (this.ctx = C, this.ctx.imageSmoothingEnabled = !1, I.smask)
  11348. this.tempSMask = this.smaskStack.pop(), this.restore();
  11349. else {
  11350. this.ctx.restore();
  11351. const i = zC(this.ctx);
  11352. this.restore(), this.ctx.save(), this.ctx.setTransform(...i);
  11353. const e = AI.getAxialAlignedBoundingBox([0, 0, g.canvas.width, g.canvas.height], i);
  11354. this.ctx.drawImage(g.canvas, 0, 0), this.ctx.restore(), this.compose(e);
  11355. }
  11356. }
  11357. beginAnnotation(I, g, C, i, e) {
  11358. if (ig(this, JA, bS).call(this), JY(this.ctx), this.ctx.save(), this.save(), this.baseTransform && this.ctx.setTransform(...this.baseTransform), g) {
  11359. const A = g[2] - g[0], s = g[3] - g[1];
  11360. if (e && this.annotationCanvasMap) {
  11361. C = C.slice(), C[4] -= g[0], C[5] -= g[1], g = g.slice(), g[0] = g[1] = 0, g[2] = A, g[3] = s;
  11362. const [l, n] = AI.singularValueDecompose2dScale(zC(this.ctx)), {
  11363. viewportScale: a
  11364. } = this, d = Math.ceil(A * this.outputScaleX * a), o = Math.ceil(s * this.outputScaleY * a);
  11365. this.annotationCanvas = this.canvasFactory.create(d, o);
  11366. const {
  11367. canvas: c,
  11368. context: r
  11369. } = this.annotationCanvas;
  11370. this.annotationCanvasMap.set(I, c), this.annotationCanvas.savedCtx = this.ctx, this.ctx = r, this.ctx.save(), this.ctx.setTransform(l, 0, 0, -n, 0, s * n), JY(this.ctx);
  11371. } else
  11372. JY(this.ctx), this.endPath(), this.ctx.rect(g[0], g[1], A, s), this.ctx.clip(), this.ctx.beginPath();
  11373. }
  11374. this.current = new a8(this.ctx.canvas.width, this.ctx.canvas.height), this.transform(...C), this.transform(...i);
  11375. }
  11376. endAnnotation() {
  11377. this.annotationCanvas && (this.ctx.restore(), ig(this, JA, uS).call(this), this.ctx = this.annotationCanvas.savedCtx, delete this.annotationCanvas.savedCtx, delete this.annotationCanvas);
  11378. }
  11379. paintImageMaskXObject(I) {
  11380. if (!this.contentVisible)
  11381. return;
  11382. const g = I.count;
  11383. I = this.getObject(I.data, I), I.count = g;
  11384. const C = this.ctx, i = this.processingType3;
  11385. if (i && (i.compiled === void 0 && (i.compiled = ycg(I)), i.compiled)) {
  11386. C.fill(i.compiled);
  11387. return;
  11388. }
  11389. const e = this._createMaskCanvas(I), A = e.canvas;
  11390. C.save(), C.setTransform(1, 0, 0, 1, 0, 0), C.drawImage(A, e.offsetX, e.offsetY), C.restore(), this.compose();
  11391. }
  11392. paintImageMaskXObjectRepeat(I, g, C = 0, i = 0, e, A) {
  11393. if (!this.contentVisible)
  11394. return;
  11395. I = this.getObject(I.data, I);
  11396. const s = this.ctx;
  11397. s.save();
  11398. const l = zC(s);
  11399. s.transform(g, C, i, e, 0, 0);
  11400. const n = this._createMaskCanvas(I);
  11401. s.setTransform(1, 0, 0, 1, n.offsetX - l[4], n.offsetY - l[5]);
  11402. for (let a = 0, d = A.length; a < d; a += 2) {
  11403. const o = AI.transform(l, [g, C, i, e, A[a], A[a + 1]]), [c, r] = AI.applyTransform([0, 0], o);
  11404. s.drawImage(n.canvas, c, r);
  11405. }
  11406. s.restore(), this.compose();
  11407. }
  11408. paintImageMaskXObjectGroup(I) {
  11409. if (!this.contentVisible)
  11410. return;
  11411. const g = this.ctx, C = this.current.fillColor, i = this.current.patternFill;
  11412. for (const e of I) {
  11413. const {
  11414. data: A,
  11415. width: s,
  11416. height: l,
  11417. transform: n
  11418. } = e, a = this.cachedCanvases.getCanvas("maskCanvas", s, l), d = a.context;
  11419. d.save();
  11420. const o = this.getObject(A, e);
  11421. c8(d, o), d.globalCompositeOperation = "source-in", d.fillStyle = i ? C.getPattern(d, this, ss(g), Ci.FILL) : C, d.fillRect(0, 0, s, l), d.restore(), g.save(), g.transform(...n), g.scale(1, -1), zY(g, a.canvas, 0, 0, s, l, 0, -1, 1, 1), g.restore();
  11422. }
  11423. this.compose();
  11424. }
  11425. paintImageXObject(I) {
  11426. if (!this.contentVisible)
  11427. return;
  11428. const g = this.getObject(I);
  11429. if (!g) {
  11430. DI("Dependent image isn't ready yet");
  11431. return;
  11432. }
  11433. this.paintInlineImageXObject(g);
  11434. }
  11435. paintImageXObjectRepeat(I, g, C, i) {
  11436. if (!this.contentVisible)
  11437. return;
  11438. const e = this.getObject(I);
  11439. if (!e) {
  11440. DI("Dependent image isn't ready yet");
  11441. return;
  11442. }
  11443. const A = e.width, s = e.height, l = [];
  11444. for (let n = 0, a = i.length; n < a; n += 2)
  11445. l.push({
  11446. transform: [g, 0, 0, C, i[n], i[n + 1]],
  11447. x: 0,
  11448. y: 0,
  11449. w: A,
  11450. h: s
  11451. });
  11452. this.paintInlineImageXObjectGroup(e, l);
  11453. }
  11454. applyTransferMapsToCanvas(I) {
  11455. return this.current.transferMaps !== "none" && (I.filter = this.current.transferMaps, I.drawImage(I.canvas, 0, 0), I.filter = "none"), I.canvas;
  11456. }
  11457. applyTransferMapsToBitmap(I) {
  11458. if (this.current.transferMaps === "none")
  11459. return I.bitmap;
  11460. const {
  11461. bitmap: g,
  11462. width: C,
  11463. height: i
  11464. } = I, e = this.cachedCanvases.getCanvas("inlineImage", C, i), A = e.context;
  11465. return A.filter = this.current.transferMaps, A.drawImage(g, 0, 0), A.filter = "none", e.canvas;
  11466. }
  11467. paintInlineImageXObject(I) {
  11468. if (!this.contentVisible)
  11469. return;
  11470. const g = I.width, C = I.height, i = this.ctx;
  11471. if (this.save(), !$t) {
  11472. const {
  11473. filter: s
  11474. } = i;
  11475. s !== "none" && s !== "" && (i.filter = "none");
  11476. }
  11477. i.scale(1 / g, -1 / C);
  11478. let e;
  11479. if (I.bitmap)
  11480. e = this.applyTransferMapsToBitmap(I);
  11481. else if (typeof HTMLElement == "function" && I instanceof HTMLElement || !I.data)
  11482. e = I;
  11483. else {
  11484. const l = this.cachedCanvases.getCanvas("inlineImage", g, C).context;
  11485. o8(l, I), e = this.applyTransferMapsToCanvas(l);
  11486. }
  11487. const A = this._scaleImage(e, ss(i));
  11488. i.imageSmoothingEnabled = d8(zC(i), I.interpolate), zY(i, A.img, 0, 0, A.paintWidth, A.paintHeight, 0, -C, g, C), this.compose(), this.restore();
  11489. }
  11490. paintInlineImageXObjectGroup(I, g) {
  11491. if (!this.contentVisible)
  11492. return;
  11493. const C = this.ctx;
  11494. let i;
  11495. if (I.bitmap)
  11496. i = I.bitmap;
  11497. else {
  11498. const e = I.width, A = I.height, l = this.cachedCanvases.getCanvas("inlineImage", e, A).context;
  11499. o8(l, I), i = this.applyTransferMapsToCanvas(l);
  11500. }
  11501. for (const e of g)
  11502. C.save(), C.transform(...e.transform), C.scale(1, -1), zY(C, i, e.x, e.y, e.w, e.h, 0, -1, 1, 1), C.restore();
  11503. this.compose();
  11504. }
  11505. paintSolidColorImageMask() {
  11506. this.contentVisible && (this.ctx.fillRect(0, 0, 1, 1), this.compose());
  11507. }
  11508. markPoint(I) {
  11509. }
  11510. markPointProps(I, g) {
  11511. }
  11512. beginMarkedContent(I) {
  11513. this.markedContentStack.push({
  11514. visible: !0
  11515. });
  11516. }
  11517. beginMarkedContentProps(I, g) {
  11518. I === "OC" ? this.markedContentStack.push({
  11519. visible: this.optionalContentConfig.isVisible(g)
  11520. }) : this.markedContentStack.push({
  11521. visible: !0
  11522. }), this.contentVisible = this.isContentVisible();
  11523. }
  11524. endMarkedContent() {
  11525. this.markedContentStack.pop(), this.contentVisible = this.isContentVisible();
  11526. }
  11527. beginCompat() {
  11528. }
  11529. endCompat() {
  11530. }
  11531. consumePath(I, g) {
  11532. const C = this.current.isEmptyClip();
  11533. this.pendingClip && this.current.updateClipFromPath(), this.pendingClip || this.compose(g);
  11534. const i = this.ctx;
  11535. this.pendingClip && (C || (this.pendingClip === r8 ? i.clip(I, "evenodd") : i.clip(I)), this.pendingClip = null), this.current.startNewPathAndClipBox(this.current.clipBox), i.beginPath();
  11536. }
  11537. getSinglePixelWidth() {
  11538. if (!this._cachedGetSinglePixelWidth) {
  11539. const I = zC(this.ctx);
  11540. if (I[1] === 0 && I[2] === 0)
  11541. this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(I[0]), Math.abs(I[3]));
  11542. else {
  11543. const g = Math.abs(I[0] * I[3] - I[2] * I[1]), C = Math.hypot(I[0], I[2]), i = Math.hypot(I[1], I[3]);
  11544. this._cachedGetSinglePixelWidth = Math.max(C, i) / g;
  11545. }
  11546. }
  11547. return this._cachedGetSinglePixelWidth;
  11548. }
  11549. getScaleForStroking() {
  11550. if (this._cachedScaleForStroking[0] === -1) {
  11551. const {
  11552. lineWidth: I
  11553. } = this.current, {
  11554. a: g,
  11555. b: C,
  11556. c: i,
  11557. d: e
  11558. } = this.ctx.getTransform();
  11559. let A, s;
  11560. if (C === 0 && i === 0) {
  11561. const l = Math.abs(g), n = Math.abs(e);
  11562. if (l === n)
  11563. if (I === 0)
  11564. A = s = 1 / l;
  11565. else {
  11566. const a = l * I;
  11567. A = s = a < 1 ? 1 / a : 1;
  11568. }
  11569. else if (I === 0)
  11570. A = 1 / l, s = 1 / n;
  11571. else {
  11572. const a = l * I, d = n * I;
  11573. A = a < 1 ? 1 / a : 1, s = d < 1 ? 1 / d : 1;
  11574. }
  11575. } else {
  11576. const l = Math.abs(g * e - C * i), n = Math.hypot(g, C), a = Math.hypot(i, e);
  11577. if (I === 0)
  11578. A = a / l, s = n / l;
  11579. else {
  11580. const d = I * l;
  11581. A = a > d ? a / d : 1, s = n > d ? n / d : 1;
  11582. }
  11583. }
  11584. this._cachedScaleForStroking[0] = A, this._cachedScaleForStroking[1] = s;
  11585. }
  11586. return this._cachedScaleForStroking;
  11587. }
  11588. rescaleAndStroke(I, g) {
  11589. const {
  11590. ctx: C,
  11591. current: {
  11592. lineWidth: i
  11593. }
  11594. } = this, [e, A] = this.getScaleForStroking();
  11595. if (e === A) {
  11596. C.lineWidth = (i || 1) * e, C.stroke(I);
  11597. return;
  11598. }
  11599. const s = C.getLineDash();
  11600. g && C.save(), C.scale(e, A), QH.a = 1 / e, QH.d = 1 / A;
  11601. const l = new Path2D();
  11602. if (l.addPath(I, QH), s.length > 0) {
  11603. const n = Math.max(e, A);
  11604. C.setLineDash(s.map((a) => a / n)), C.lineDashOffset /= n;
  11605. }
  11606. C.lineWidth = i || 1, C.stroke(l), g && C.restore();
  11607. }
  11608. isContentVisible() {
  11609. for (let I = this.markedContentStack.length - 1; I >= 0; I--)
  11610. if (!this.markedContentStack[I].visible)
  11611. return !1;
  11612. return !0;
  11613. }
  11614. };
  11615. JA = new WeakSet(), bS = function() {
  11616. for (; this.stateStack.length || this.inSMaskMode; )
  11617. this.restore();
  11618. this.current.activeSMask = null, this.ctx.restore(), this.transparentCanvas && (this.ctx = this.compositeCtx, this.ctx.save(), this.ctx.setTransform(1, 0, 0, 1, 0, 0), this.ctx.drawImage(this.transparentCanvas, 0, 0), this.ctx.restore(), this.transparentCanvas = null);
  11619. }, uS = function() {
  11620. if (this.pageColors) {
  11621. const I = this.filterFactory.addHCMFilter(this.pageColors.foreground, this.pageColors.background);
  11622. if (I !== "none") {
  11623. const g = this.ctx.filter;
  11624. this.ctx.filter = I, this.ctx.drawImage(this.ctx.canvas, 0, 0), this.ctx.filter = g;
  11625. }
  11626. }
  11627. }, mS = function(I, g, C) {
  11628. const i = new Path2D();
  11629. return i.addPath(I, new DOMMatrix(C).invertSelf().multiplySelf(g)), i;
  11630. };
  11631. let oh = i1;
  11632. for (const t in IV)
  11633. oh.prototype[t] !== void 0 && (oh.prototype[IV[t]] = oh.prototype[t]);
  11634. var AZ, sZ;
  11635. class Ql {
  11636. static get workerPort() {
  11637. return M(this, AZ);
  11638. }
  11639. static set workerPort(I) {
  11640. if (!(typeof Worker < "u" && I instanceof Worker) && I !== null)
  11641. throw new Error("Invalid `workerPort` type.");
  11642. $(this, AZ, I);
  11643. }
  11644. static get workerSrc() {
  11645. return M(this, sZ);
  11646. }
  11647. static set workerSrc(I) {
  11648. if (typeof I != "string")
  11649. throw new Error("Invalid `workerSrc` type.");
  11650. $(this, sZ, I);
  11651. }
  11652. }
  11653. AZ = new WeakMap(), sZ = new WeakMap(), tg(Ql, AZ, null), tg(Ql, sZ, "");
  11654. var Yc, lZ;
  11655. class Mcg {
  11656. constructor({
  11657. parsedData: I,
  11658. rawData: g
  11659. }) {
  11660. tg(this, Yc);
  11661. tg(this, lZ);
  11662. $(this, Yc, I), $(this, lZ, g);
  11663. }
  11664. getRaw() {
  11665. return M(this, lZ);
  11666. }
  11667. get(I) {
  11668. return M(this, Yc).get(I) ?? null;
  11669. }
  11670. getAll() {
  11671. return c9(M(this, Yc));
  11672. }
  11673. has(I) {
  11674. return M(this, Yc).has(I);
  11675. }
  11676. }
  11677. Yc = new WeakMap(), lZ = new WeakMap();
  11678. const _r = Symbol("INTERNAL");
  11679. var nZ, aZ, oZ, Kh;
  11680. class Rcg {
  11681. constructor(I, {
  11682. name: g,
  11683. intent: C,
  11684. usage: i,
  11685. rbGroups: e
  11686. }) {
  11687. tg(this, nZ, !1);
  11688. tg(this, aZ, !1);
  11689. tg(this, oZ, !1);
  11690. tg(this, Kh, !0);
  11691. $(this, nZ, !!(I & ye.DISPLAY)), $(this, aZ, !!(I & ye.PRINT)), this.name = g, this.intent = C, this.usage = i, this.rbGroups = e;
  11692. }
  11693. get visible() {
  11694. if (M(this, oZ))
  11695. return M(this, Kh);
  11696. if (!M(this, Kh))
  11697. return !1;
  11698. const {
  11699. print: I,
  11700. view: g
  11701. } = this.usage;
  11702. return M(this, nZ) ? (g == null ? void 0 : g.viewState) !== "OFF" : M(this, aZ) ? (I == null ? void 0 : I.printState) !== "OFF" : !0;
  11703. }
  11704. _setVisible(I, g, C = !1) {
  11705. I !== _r && BC("Internal method `_setVisible` called."), $(this, oZ, C), $(this, Kh, g);
  11706. }
  11707. }
  11708. nZ = new WeakMap(), aZ = new WeakMap(), oZ = new WeakMap(), Kh = new WeakMap();
  11709. var ya, bC, Fh, kh, cZ, ZS;
  11710. class fcg {
  11711. constructor(I, g = ye.DISPLAY) {
  11712. tg(this, cZ);
  11713. tg(this, ya, null);
  11714. tg(this, bC, /* @__PURE__ */ new Map());
  11715. tg(this, Fh, null);
  11716. tg(this, kh, null);
  11717. if (this.renderingIntent = g, this.name = null, this.creator = null, I !== null) {
  11718. this.name = I.name, this.creator = I.creator, $(this, kh, I.order);
  11719. for (const C of I.groups)
  11720. M(this, bC).set(C.id, new Rcg(g, C));
  11721. if (I.baseState === "OFF")
  11722. for (const C of M(this, bC).values())
  11723. C._setVisible(_r, !1);
  11724. for (const C of I.on)
  11725. M(this, bC).get(C)._setVisible(_r, !0);
  11726. for (const C of I.off)
  11727. M(this, bC).get(C)._setVisible(_r, !1);
  11728. $(this, Fh, this.getHash());
  11729. }
  11730. }
  11731. isVisible(I) {
  11732. if (M(this, bC).size === 0)
  11733. return !0;
  11734. if (!I)
  11735. return qV("Optional content group not defined."), !0;
  11736. if (I.type === "OCG")
  11737. return M(this, bC).has(I.id) ? M(this, bC).get(I.id).visible : (DI(`Optional content group not found: ${I.id}`), !0);
  11738. if (I.type === "OCMD") {
  11739. if (I.expression)
  11740. return ig(this, cZ, ZS).call(this, I.expression);
  11741. if (!I.policy || I.policy === "AnyOn") {
  11742. for (const g of I.ids) {
  11743. if (!M(this, bC).has(g))
  11744. return DI(`Optional content group not found: ${g}`), !0;
  11745. if (M(this, bC).get(g).visible)
  11746. return !0;
  11747. }
  11748. return !1;
  11749. } else if (I.policy === "AllOn") {
  11750. for (const g of I.ids) {
  11751. if (!M(this, bC).has(g))
  11752. return DI(`Optional content group not found: ${g}`), !0;
  11753. if (!M(this, bC).get(g).visible)
  11754. return !1;
  11755. }
  11756. return !0;
  11757. } else if (I.policy === "AnyOff") {
  11758. for (const g of I.ids) {
  11759. if (!M(this, bC).has(g))
  11760. return DI(`Optional content group not found: ${g}`), !0;
  11761. if (!M(this, bC).get(g).visible)
  11762. return !0;
  11763. }
  11764. return !1;
  11765. } else if (I.policy === "AllOff") {
  11766. for (const g of I.ids) {
  11767. if (!M(this, bC).has(g))
  11768. return DI(`Optional content group not found: ${g}`), !0;
  11769. if (M(this, bC).get(g).visible)
  11770. return !1;
  11771. }
  11772. return !0;
  11773. }
  11774. return DI(`Unknown optional content policy ${I.policy}.`), !0;
  11775. }
  11776. return DI(`Unknown group type ${I.type}.`), !0;
  11777. }
  11778. setVisibility(I, g = !0, C = !0) {
  11779. var e;
  11780. const i = M(this, bC).get(I);
  11781. if (!i) {
  11782. DI(`Optional content group not found: ${I}`);
  11783. return;
  11784. }
  11785. if (C && g && i.rbGroups.length)
  11786. for (const A of i.rbGroups)
  11787. for (const s of A)
  11788. s !== I && ((e = M(this, bC).get(s)) == null || e._setVisible(_r, !1, !0));
  11789. i._setVisible(_r, !!g, !0), $(this, ya, null);
  11790. }
  11791. setOCGState({
  11792. state: I,
  11793. preserveRB: g
  11794. }) {
  11795. let C;
  11796. for (const i of I) {
  11797. switch (i) {
  11798. case "ON":
  11799. case "OFF":
  11800. case "Toggle":
  11801. C = i;
  11802. continue;
  11803. }
  11804. const e = M(this, bC).get(i);
  11805. if (e)
  11806. switch (C) {
  11807. case "ON":
  11808. this.setVisibility(i, !0, g);
  11809. break;
  11810. case "OFF":
  11811. this.setVisibility(i, !1, g);
  11812. break;
  11813. case "Toggle":
  11814. this.setVisibility(i, !e.visible, g);
  11815. break;
  11816. }
  11817. }
  11818. $(this, ya, null);
  11819. }
  11820. get hasInitialVisibility() {
  11821. return M(this, Fh) === null || this.getHash() === M(this, Fh);
  11822. }
  11823. getOrder() {
  11824. return M(this, bC).size ? M(this, kh) ? M(this, kh).slice() : [...M(this, bC).keys()] : null;
  11825. }
  11826. getGroups() {
  11827. return M(this, bC).size > 0 ? c9(M(this, bC)) : null;
  11828. }
  11829. getGroup(I) {
  11830. return M(this, bC).get(I) || null;
  11831. }
  11832. getHash() {
  11833. if (M(this, ya) !== null)
  11834. return M(this, ya);
  11835. const I = new agg();
  11836. for (const [g, C] of M(this, bC))
  11837. I.update(`${g}:${C.visible}`);
  11838. return $(this, ya, I.hexdigest());
  11839. }
  11840. }
  11841. ya = new WeakMap(), bC = new WeakMap(), Fh = new WeakMap(), kh = new WeakMap(), cZ = new WeakSet(), ZS = function(I) {
  11842. const g = I.length;
  11843. if (g < 2)
  11844. return !0;
  11845. const C = I[0];
  11846. for (let i = 1; i < g; i++) {
  11847. const e = I[i];
  11848. let A;
  11849. if (Array.isArray(e))
  11850. A = ig(this, cZ, ZS).call(this, e);
  11851. else if (M(this, bC).has(e))
  11852. A = M(this, bC).get(e).visible;
  11853. else
  11854. return DI(`Optional content group not found: ${e}`), !0;
  11855. switch (C) {
  11856. case "And":
  11857. if (!A)
  11858. return !1;
  11859. break;
  11860. case "Or":
  11861. if (A)
  11862. return !0;
  11863. break;
  11864. case "Not":
  11865. return !A;
  11866. default:
  11867. return !0;
  11868. }
  11869. }
  11870. return C === "And";
  11871. };
  11872. class Hcg {
  11873. constructor(I, {
  11874. disableRange: g = !1,
  11875. disableStream: C = !1
  11876. }) {
  11877. ut(I, 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.');
  11878. const {
  11879. length: i,
  11880. initialData: e,
  11881. progressiveDone: A,
  11882. contentDispositionFilename: s
  11883. } = I;
  11884. if (this._queuedChunks = [], this._progressiveDone = A, this._contentDispositionFilename = s, (e == null ? void 0 : e.length) > 0) {
  11885. const l = e instanceof Uint8Array && e.byteLength === e.buffer.byteLength ? e.buffer : new Uint8Array(e).buffer;
  11886. this._queuedChunks.push(l);
  11887. }
  11888. this._pdfDataRangeTransport = I, this._isStreamingSupported = !C, this._isRangeSupported = !g, this._contentLength = i, this._fullRequestReader = null, this._rangeReaders = [], I.addRangeListener((l, n) => {
  11889. this._onReceiveData({
  11890. begin: l,
  11891. chunk: n
  11892. });
  11893. }), I.addProgressListener((l, n) => {
  11894. this._onProgress({
  11895. loaded: l,
  11896. total: n
  11897. });
  11898. }), I.addProgressiveReadListener((l) => {
  11899. this._onReceiveData({
  11900. chunk: l
  11901. });
  11902. }), I.addProgressiveDoneListener(() => {
  11903. this._onProgressiveDone();
  11904. }), I.transportReady();
  11905. }
  11906. _onReceiveData({
  11907. begin: I,
  11908. chunk: g
  11909. }) {
  11910. const C = g instanceof Uint8Array && g.byteLength === g.buffer.byteLength ? g.buffer : new Uint8Array(g).buffer;
  11911. if (I === void 0)
  11912. this._fullRequestReader ? this._fullRequestReader._enqueue(C) : this._queuedChunks.push(C);
  11913. else {
  11914. const i = this._rangeReaders.some(function(e) {
  11915. return e._begin !== I ? !1 : (e._enqueue(C), !0);
  11916. });
  11917. ut(i, "_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.");
  11918. }
  11919. }
  11920. get _progressiveDataLength() {
  11921. var I;
  11922. return ((I = this._fullRequestReader) == null ? void 0 : I._loaded) ?? 0;
  11923. }
  11924. _onProgress(I) {
  11925. var g, C, i, e;
  11926. I.total === void 0 ? (C = (g = this._rangeReaders[0]) == null ? void 0 : g.onProgress) == null || C.call(g, {
  11927. loaded: I.loaded
  11928. }) : (e = (i = this._fullRequestReader) == null ? void 0 : i.onProgress) == null || e.call(i, {
  11929. loaded: I.loaded,
  11930. total: I.total
  11931. });
  11932. }
  11933. _onProgressiveDone() {
  11934. var I;
  11935. (I = this._fullRequestReader) == null || I.progressiveDone(), this._progressiveDone = !0;
  11936. }
  11937. _removeRangeReader(I) {
  11938. const g = this._rangeReaders.indexOf(I);
  11939. g >= 0 && this._rangeReaders.splice(g, 1);
  11940. }
  11941. getFullReader() {
  11942. ut(!this._fullRequestReader, "PDFDataTransportStream.getFullReader can only be called once.");
  11943. const I = this._queuedChunks;
  11944. return this._queuedChunks = null, new Xcg(this, I, this._progressiveDone, this._contentDispositionFilename);
  11945. }
  11946. getRangeReader(I, g) {
  11947. if (g <= this._progressiveDataLength)
  11948. return null;
  11949. const C = new Scg(this, I, g);
  11950. return this._pdfDataRangeTransport.requestDataRange(I, g), this._rangeReaders.push(C), C;
  11951. }
  11952. cancelAllRequests(I) {
  11953. var g;
  11954. (g = this._fullRequestReader) == null || g.cancel(I);
  11955. for (const C of this._rangeReaders.slice(0))
  11956. C.cancel(I);
  11957. this._pdfDataRangeTransport.abort();
  11958. }
  11959. }
  11960. class Xcg {
  11961. constructor(I, g, C = !1, i = null) {
  11962. this._stream = I, this._done = C || !1, this._filename = h9(i) ? i : null, this._queuedChunks = g || [], this._loaded = 0;
  11963. for (const e of this._queuedChunks)
  11964. this._loaded += e.byteLength;
  11965. this._requests = [], this._headersReady = Promise.resolve(), I._fullRequestReader = this, this.onProgress = null;
  11966. }
  11967. _enqueue(I) {
  11968. this._done || (this._requests.length > 0 ? this._requests.shift().resolve({
  11969. value: I,
  11970. done: !1
  11971. }) : this._queuedChunks.push(I), this._loaded += I.byteLength);
  11972. }
  11973. get headersReady() {
  11974. return this._headersReady;
  11975. }
  11976. get filename() {
  11977. return this._filename;
  11978. }
  11979. get isRangeSupported() {
  11980. return this._stream._isRangeSupported;
  11981. }
  11982. get isStreamingSupported() {
  11983. return this._stream._isStreamingSupported;
  11984. }
  11985. get contentLength() {
  11986. return this._stream._contentLength;
  11987. }
  11988. async read() {
  11989. if (this._queuedChunks.length > 0)
  11990. return {
  11991. value: this._queuedChunks.shift(),
  11992. done: !1
  11993. };
  11994. if (this._done)
  11995. return {
  11996. value: void 0,
  11997. done: !0
  11998. };
  11999. const I = Promise.withResolvers();
  12000. return this._requests.push(I), I.promise;
  12001. }
  12002. cancel(I) {
  12003. this._done = !0;
  12004. for (const g of this._requests)
  12005. g.resolve({
  12006. value: void 0,
  12007. done: !0
  12008. });
  12009. this._requests.length = 0;
  12010. }
  12011. progressiveDone() {
  12012. this._done || (this._done = !0);
  12013. }
  12014. }
  12015. class Scg {
  12016. constructor(I, g, C) {
  12017. this._stream = I, this._begin = g, this._end = C, this._queuedChunk = null, this._requests = [], this._done = !1, this.onProgress = null;
  12018. }
  12019. _enqueue(I) {
  12020. if (!this._done) {
  12021. if (this._requests.length === 0)
  12022. this._queuedChunk = I;
  12023. else {
  12024. this._requests.shift().resolve({
  12025. value: I,
  12026. done: !1
  12027. });
  12028. for (const C of this._requests)
  12029. C.resolve({
  12030. value: void 0,
  12031. done: !0
  12032. });
  12033. this._requests.length = 0;
  12034. }
  12035. this._done = !0, this._stream._removeRangeReader(this);
  12036. }
  12037. }
  12038. get isStreamingSupported() {
  12039. return !1;
  12040. }
  12041. async read() {
  12042. if (this._queuedChunk) {
  12043. const g = this._queuedChunk;
  12044. return this._queuedChunk = null, {
  12045. value: g,
  12046. done: !1
  12047. };
  12048. }
  12049. if (this._done)
  12050. return {
  12051. value: void 0,
  12052. done: !0
  12053. };
  12054. const I = Promise.withResolvers();
  12055. return this._requests.push(I), I.promise;
  12056. }
  12057. cancel(I) {
  12058. this._done = !0;
  12059. for (const g of this._requests)
  12060. g.resolve({
  12061. value: void 0,
  12062. done: !0
  12063. });
  12064. this._requests.length = 0, this._stream._removeRangeReader(this);
  12065. }
  12066. }
  12067. function Dcg(t) {
  12068. let I = !0, g = C("filename\\*", "i").exec(t);
  12069. if (g) {
  12070. g = g[1];
  12071. let a = s(g);
  12072. return a = unescape(a), a = l(a), a = n(a), e(a);
  12073. }
  12074. if (g = A(t), g) {
  12075. const a = n(g);
  12076. return e(a);
  12077. }
  12078. if (g = C("filename", "i").exec(t), g) {
  12079. g = g[1];
  12080. let a = s(g);
  12081. return a = n(a), e(a);
  12082. }
  12083. function C(a, d) {
  12084. return new RegExp("(?:^|;)\\s*" + a + '\\s*=\\s*([^";\\s][^;\\s]*|"(?:[^"\\\\]|\\\\"?)+"?)', d);
  12085. }
  12086. function i(a, d) {
  12087. if (a) {
  12088. if (!/^[\x00-\xFF]+$/.test(d))
  12089. return d;
  12090. try {
  12091. const o = new TextDecoder(a, {
  12092. fatal: !0
  12093. }), c = eG(d);
  12094. d = o.decode(c), I = !1;
  12095. } catch {
  12096. }
  12097. }
  12098. return d;
  12099. }
  12100. function e(a) {
  12101. return I && /[\x80-\xff]/.test(a) && (a = i("utf-8", a), I && (a = i("iso-8859-1", a))), a;
  12102. }
  12103. function A(a) {
  12104. const d = [];
  12105. let o;
  12106. const c = C("filename\\*((?!0\\d)\\d+)(\\*?)", "ig");
  12107. for (; (o = c.exec(a)) !== null; ) {
  12108. let [, h, b, u] = o;
  12109. if (h = parseInt(h, 10), h in d) {
  12110. if (h === 0)
  12111. break;
  12112. continue;
  12113. }
  12114. d[h] = [b, u];
  12115. }
  12116. const r = [];
  12117. for (let h = 0; h < d.length && h in d; ++h) {
  12118. let [b, u] = d[h];
  12119. u = s(u), b && (u = unescape(u), h === 0 && (u = l(u))), r.push(u);
  12120. }
  12121. return r.join("");
  12122. }
  12123. function s(a) {
  12124. if (a.startsWith('"')) {
  12125. const d = a.slice(1).split('\\"');
  12126. for (let o = 0; o < d.length; ++o) {
  12127. const c = d[o].indexOf('"');
  12128. c !== -1 && (d[o] = d[o].slice(0, c), d.length = o + 1), d[o] = d[o].replaceAll(/\\(.)/g, "$1");
  12129. }
  12130. a = d.join('"');
  12131. }
  12132. return a;
  12133. }
  12134. function l(a) {
  12135. const d = a.indexOf("'");
  12136. if (d === -1)
  12137. return a;
  12138. const o = a.slice(0, d), r = a.slice(d + 1).replace(/^[^']*'/, "");
  12139. return i(o, r);
  12140. }
  12141. function n(a) {
  12142. return !a.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(a) ? a : a.replaceAll(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function(d, o, c, r) {
  12143. if (c === "q" || c === "Q")
  12144. return r = r.replaceAll("_", " "), r = r.replaceAll(/=([0-9a-fA-F]{2})/g, function(h, b) {
  12145. return String.fromCharCode(parseInt(b, 16));
  12146. }), i(o, r);
  12147. try {
  12148. r = atob(r);
  12149. } catch {
  12150. }
  12151. return i(o, r);
  12152. });
  12153. }
  12154. return "";
  12155. }
  12156. function pgg(t, I) {
  12157. const g = new Headers();
  12158. if (!t || !I || typeof I != "object")
  12159. return g;
  12160. for (const C in I) {
  12161. const i = I[C];
  12162. i !== void 0 && g.append(C, i);
  12163. }
  12164. return g;
  12165. }
  12166. function gM(t) {
  12167. var I;
  12168. return ((I = URL.parse(t)) == null ? void 0 : I.origin) ?? null;
  12169. }
  12170. function Bgg({
  12171. responseHeaders: t,
  12172. isHttp: I,
  12173. rangeChunkSize: g,
  12174. disableRange: C
  12175. }) {
  12176. const i = {
  12177. allowRangeRequests: !1,
  12178. suggestedLength: void 0
  12179. }, e = parseInt(t.get("Content-Length"), 10);
  12180. return !Number.isInteger(e) || (i.suggestedLength = e, e <= 2 * g) || C || !I || t.get("Accept-Ranges") !== "bytes" || (t.get("Content-Encoding") || "identity") !== "identity" || (i.allowRangeRequests = !0), i;
  12181. }
  12182. function Wgg(t) {
  12183. const I = t.get("Content-Disposition");
  12184. if (I) {
  12185. let g = Dcg(I);
  12186. if (g.includes("%"))
  12187. try {
  12188. g = decodeURIComponent(g);
  12189. } catch {
  12190. }
  12191. if (h9(g))
  12192. return g;
  12193. }
  12194. return null;
  12195. }
  12196. function nG(t, I) {
  12197. return new CV(`Unexpected server response (${t}) while retrieving PDF "${I}".`, t, t === 404 || t === 0 && I.startsWith("file:"));
  12198. }
  12199. function ygg(t) {
  12200. return t === 200 || t === 206;
  12201. }
  12202. function Ygg(t, I, g) {
  12203. return {
  12204. method: "GET",
  12205. headers: t,
  12206. signal: g.signal,
  12207. mode: "cors",
  12208. credentials: I ? "include" : "same-origin",
  12209. redirect: "follow"
  12210. };
  12211. }
  12212. function Ngg(t) {
  12213. return t instanceof Uint8Array ? t.buffer : t instanceof ArrayBuffer ? t : (DI(`getArrayBuffer - unexpected data format: ${t}`), new Uint8Array(t).buffer);
  12214. }
  12215. class h8 {
  12216. constructor(I) {
  12217. iI(this, "_responseOrigin", null);
  12218. this.source = I, this.isHttp = /^https?:/i.test(I.url), this.headers = pgg(this.isHttp, I.httpHeaders), this._fullRequestReader = null, this._rangeRequestReaders = [];
  12219. }
  12220. get _progressiveDataLength() {
  12221. var I;
  12222. return ((I = this._fullRequestReader) == null ? void 0 : I._loaded) ?? 0;
  12223. }
  12224. getFullReader() {
  12225. return ut(!this._fullRequestReader, "PDFFetchStream.getFullReader can only be called once."), this._fullRequestReader = new Kcg(this), this._fullRequestReader;
  12226. }
  12227. getRangeReader(I, g) {
  12228. if (g <= this._progressiveDataLength)
  12229. return null;
  12230. const C = new Fcg(this, I, g);
  12231. return this._rangeRequestReaders.push(C), C;
  12232. }
  12233. cancelAllRequests(I) {
  12234. var g;
  12235. (g = this._fullRequestReader) == null || g.cancel(I);
  12236. for (const C of this._rangeRequestReaders.slice(0))
  12237. C.cancel(I);
  12238. }
  12239. }
  12240. class Kcg {
  12241. constructor(I) {
  12242. this._stream = I, this._reader = null, this._loaded = 0, this._filename = null;
  12243. const g = I.source;
  12244. this._withCredentials = g.withCredentials || !1, this._contentLength = g.length, this._headersCapability = Promise.withResolvers(), this._disableRange = g.disableRange || !1, this._rangeChunkSize = g.rangeChunkSize, !this._rangeChunkSize && !this._disableRange && (this._disableRange = !0), this._abortController = new AbortController(), this._isStreamingSupported = !g.disableStream, this._isRangeSupported = !g.disableRange;
  12245. const C = new Headers(I.headers), i = g.url;
  12246. fetch(i, Ygg(C, this._withCredentials, this._abortController)).then((e) => {
  12247. if (I._responseOrigin = gM(e.url), !ygg(e.status))
  12248. throw nG(e.status, i);
  12249. this._reader = e.body.getReader(), this._headersCapability.resolve();
  12250. const A = e.headers, {
  12251. allowRangeRequests: s,
  12252. suggestedLength: l
  12253. } = Bgg({
  12254. responseHeaders: A,
  12255. isHttp: I.isHttp,
  12256. rangeChunkSize: this._rangeChunkSize,
  12257. disableRange: this._disableRange
  12258. });
  12259. this._isRangeSupported = s, this._contentLength = l || this._contentLength, this._filename = Wgg(A), !this._isStreamingSupported && this._isRangeSupported && this.cancel(new Ea("Streaming is disabled."));
  12260. }).catch(this._headersCapability.reject), this.onProgress = null;
  12261. }
  12262. get headersReady() {
  12263. return this._headersCapability.promise;
  12264. }
  12265. get filename() {
  12266. return this._filename;
  12267. }
  12268. get contentLength() {
  12269. return this._contentLength;
  12270. }
  12271. get isRangeSupported() {
  12272. return this._isRangeSupported;
  12273. }
  12274. get isStreamingSupported() {
  12275. return this._isStreamingSupported;
  12276. }
  12277. async read() {
  12278. var C;
  12279. await this._headersCapability.promise;
  12280. const {
  12281. value: I,
  12282. done: g
  12283. } = await this._reader.read();
  12284. return g ? {
  12285. value: I,
  12286. done: g
  12287. } : (this._loaded += I.byteLength, (C = this.onProgress) == null || C.call(this, {
  12288. loaded: this._loaded,
  12289. total: this._contentLength
  12290. }), {
  12291. value: Ngg(I),
  12292. done: !1
  12293. });
  12294. }
  12295. cancel(I) {
  12296. var g;
  12297. (g = this._reader) == null || g.cancel(I), this._abortController.abort();
  12298. }
  12299. }
  12300. class Fcg {
  12301. constructor(I, g, C) {
  12302. this._stream = I, this._reader = null, this._loaded = 0;
  12303. const i = I.source;
  12304. this._withCredentials = i.withCredentials || !1, this._readCapability = Promise.withResolvers(), this._isStreamingSupported = !i.disableStream, this._abortController = new AbortController();
  12305. const e = new Headers(I.headers);
  12306. e.append("Range", `bytes=${g}-${C - 1}`);
  12307. const A = i.url;
  12308. fetch(A, Ygg(e, this._withCredentials, this._abortController)).then((s) => {
  12309. const l = gM(s.url);
  12310. if (l !== I._responseOrigin)
  12311. throw new Error(`Expected range response-origin "${l}" to match "${I._responseOrigin}".`);
  12312. if (!ygg(s.status))
  12313. throw nG(s.status, A);
  12314. this._readCapability.resolve(), this._reader = s.body.getReader();
  12315. }).catch(this._readCapability.reject), this.onProgress = null;
  12316. }
  12317. get isStreamingSupported() {
  12318. return this._isStreamingSupported;
  12319. }
  12320. async read() {
  12321. var C;
  12322. await this._readCapability.promise;
  12323. const {
  12324. value: I,
  12325. done: g
  12326. } = await this._reader.read();
  12327. return g ? {
  12328. value: I,
  12329. done: g
  12330. } : (this._loaded += I.byteLength, (C = this.onProgress) == null || C.call(this, {
  12331. loaded: this._loaded
  12332. }), {
  12333. value: Ngg(I),
  12334. done: !1
  12335. });
  12336. }
  12337. cancel(I) {
  12338. var g;
  12339. (g = this._reader) == null || g.cancel(I), this._abortController.abort();
  12340. }
  12341. }
  12342. const OH = 200, UH = 206;
  12343. function kcg(t) {
  12344. const I = t.response;
  12345. return typeof I != "string" ? I : eG(I).buffer;
  12346. }
  12347. class zcg {
  12348. constructor({
  12349. url: I,
  12350. httpHeaders: g,
  12351. withCredentials: C
  12352. }) {
  12353. iI(this, "_responseOrigin", null);
  12354. this.url = I, this.isHttp = /^https?:/i.test(I), this.headers = pgg(this.isHttp, g), this.withCredentials = C || !1, this.currXhrId = 0, this.pendingRequests = /* @__PURE__ */ Object.create(null);
  12355. }
  12356. request(I) {
  12357. const g = new XMLHttpRequest(), C = this.currXhrId++, i = this.pendingRequests[C] = {
  12358. xhr: g
  12359. };
  12360. g.open("GET", this.url), g.withCredentials = this.withCredentials;
  12361. for (const [e, A] of this.headers)
  12362. g.setRequestHeader(e, A);
  12363. return this.isHttp && "begin" in I && "end" in I ? (g.setRequestHeader("Range", `bytes=${I.begin}-${I.end - 1}`), i.expectedStatus = UH) : i.expectedStatus = OH, g.responseType = "arraybuffer", ut(I.onError, "Expected `onError` callback to be provided."), g.onerror = () => {
  12364. I.onError(g.status);
  12365. }, g.onreadystatechange = this.onStateChange.bind(this, C), g.onprogress = this.onProgress.bind(this, C), i.onHeadersReceived = I.onHeadersReceived, i.onDone = I.onDone, i.onError = I.onError, i.onProgress = I.onProgress, g.send(null), C;
  12366. }
  12367. onProgress(I, g) {
  12368. var i;
  12369. const C = this.pendingRequests[I];
  12370. C && ((i = C.onProgress) == null || i.call(C, g));
  12371. }
  12372. onStateChange(I, g) {
  12373. const C = this.pendingRequests[I];
  12374. if (!C)
  12375. return;
  12376. const i = C.xhr;
  12377. if (i.readyState >= 2 && C.onHeadersReceived && (C.onHeadersReceived(), delete C.onHeadersReceived), i.readyState !== 4 || !(I in this.pendingRequests))
  12378. return;
  12379. if (delete this.pendingRequests[I], i.status === 0 && this.isHttp) {
  12380. C.onError(i.status);
  12381. return;
  12382. }
  12383. const e = i.status || OH;
  12384. if (!(e === OH && C.expectedStatus === UH) && e !== C.expectedStatus) {
  12385. C.onError(i.status);
  12386. return;
  12387. }
  12388. const s = kcg(i);
  12389. if (e === UH) {
  12390. const l = i.getResponseHeader("Content-Range"), n = /bytes (\d+)-(\d+)\/(\d+)/.exec(l);
  12391. n ? C.onDone({
  12392. begin: parseInt(n[1], 10),
  12393. chunk: s
  12394. }) : (DI('Missing or invalid "Content-Range" header.'), C.onError(0));
  12395. } else s ? C.onDone({
  12396. begin: 0,
  12397. chunk: s
  12398. }) : C.onError(i.status);
  12399. }
  12400. getRequestXhr(I) {
  12401. return this.pendingRequests[I].xhr;
  12402. }
  12403. isPendingRequest(I) {
  12404. return I in this.pendingRequests;
  12405. }
  12406. abortRequest(I) {
  12407. const g = this.pendingRequests[I].xhr;
  12408. delete this.pendingRequests[I], g.abort();
  12409. }
  12410. }
  12411. class Jcg {
  12412. constructor(I) {
  12413. this._source = I, this._manager = new zcg(I), this._rangeChunkSize = I.rangeChunkSize, this._fullRequestReader = null, this._rangeRequestReaders = [];
  12414. }
  12415. _onRangeRequestReaderClosed(I) {
  12416. const g = this._rangeRequestReaders.indexOf(I);
  12417. g >= 0 && this._rangeRequestReaders.splice(g, 1);
  12418. }
  12419. getFullReader() {
  12420. return ut(!this._fullRequestReader, "PDFNetworkStream.getFullReader can only be called once."), this._fullRequestReader = new Lcg(this._manager, this._source), this._fullRequestReader;
  12421. }
  12422. getRangeReader(I, g) {
  12423. const C = new vcg(this._manager, I, g);
  12424. return C.onClosed = this._onRangeRequestReaderClosed.bind(this), this._rangeRequestReaders.push(C), C;
  12425. }
  12426. cancelAllRequests(I) {
  12427. var g;
  12428. (g = this._fullRequestReader) == null || g.cancel(I);
  12429. for (const C of this._rangeRequestReaders.slice(0))
  12430. C.cancel(I);
  12431. }
  12432. }
  12433. class Lcg {
  12434. constructor(I, g) {
  12435. this._manager = I, this._url = g.url, this._fullRequestId = I.request({
  12436. onHeadersReceived: this._onHeadersReceived.bind(this),
  12437. onDone: this._onDone.bind(this),
  12438. onError: this._onError.bind(this),
  12439. onProgress: this._onProgress.bind(this)
  12440. }), this._headersCapability = Promise.withResolvers(), this._disableRange = g.disableRange || !1, this._contentLength = g.length, this._rangeChunkSize = g.rangeChunkSize, !this._rangeChunkSize && !this._disableRange && (this._disableRange = !0), this._isStreamingSupported = !1, this._isRangeSupported = !1, this._cachedChunks = [], this._requests = [], this._done = !1, this._storedError = void 0, this._filename = null, this.onProgress = null;
  12441. }
  12442. _onHeadersReceived() {
  12443. const I = this._fullRequestId, g = this._manager.getRequestXhr(I);
  12444. this._manager._responseOrigin = gM(g.responseURL);
  12445. const C = g.getAllResponseHeaders(), i = new Headers(C ? C.trimStart().replace(/[^\S ]+$/, "").split(/[\r\n]+/).map((s) => {
  12446. const [l, ...n] = s.split(": ");
  12447. return [l, n.join(": ")];
  12448. }) : []), {
  12449. allowRangeRequests: e,
  12450. suggestedLength: A
  12451. } = Bgg({
  12452. responseHeaders: i,
  12453. isHttp: this._manager.isHttp,
  12454. rangeChunkSize: this._rangeChunkSize,
  12455. disableRange: this._disableRange
  12456. });
  12457. e && (this._isRangeSupported = !0), this._contentLength = A || this._contentLength, this._filename = Wgg(i), this._isRangeSupported && this._manager.abortRequest(I), this._headersCapability.resolve();
  12458. }
  12459. _onDone(I) {
  12460. if (I && (this._requests.length > 0 ? this._requests.shift().resolve({
  12461. value: I.chunk,
  12462. done: !1
  12463. }) : this._cachedChunks.push(I.chunk)), this._done = !0, !(this._cachedChunks.length > 0)) {
  12464. for (const g of this._requests)
  12465. g.resolve({
  12466. value: void 0,
  12467. done: !0
  12468. });
  12469. this._requests.length = 0;
  12470. }
  12471. }
  12472. _onError(I) {
  12473. this._storedError = nG(I, this._url), this._headersCapability.reject(this._storedError);
  12474. for (const g of this._requests)
  12475. g.reject(this._storedError);
  12476. this._requests.length = 0, this._cachedChunks.length = 0;
  12477. }
  12478. _onProgress(I) {
  12479. var g;
  12480. (g = this.onProgress) == null || g.call(this, {
  12481. loaded: I.loaded,
  12482. total: I.lengthComputable ? I.total : this._contentLength
  12483. });
  12484. }
  12485. get filename() {
  12486. return this._filename;
  12487. }
  12488. get isRangeSupported() {
  12489. return this._isRangeSupported;
  12490. }
  12491. get isStreamingSupported() {
  12492. return this._isStreamingSupported;
  12493. }
  12494. get contentLength() {
  12495. return this._contentLength;
  12496. }
  12497. get headersReady() {
  12498. return this._headersCapability.promise;
  12499. }
  12500. async read() {
  12501. if (await this._headersCapability.promise, this._storedError)
  12502. throw this._storedError;
  12503. if (this._cachedChunks.length > 0)
  12504. return {
  12505. value: this._cachedChunks.shift(),
  12506. done: !1
  12507. };
  12508. if (this._done)
  12509. return {
  12510. value: void 0,
  12511. done: !0
  12512. };
  12513. const I = Promise.withResolvers();
  12514. return this._requests.push(I), I.promise;
  12515. }
  12516. cancel(I) {
  12517. this._done = !0, this._headersCapability.reject(I);
  12518. for (const g of this._requests)
  12519. g.resolve({
  12520. value: void 0,
  12521. done: !0
  12522. });
  12523. this._requests.length = 0, this._manager.isPendingRequest(this._fullRequestId) && this._manager.abortRequest(this._fullRequestId), this._fullRequestReader = null;
  12524. }
  12525. }
  12526. class vcg {
  12527. constructor(I, g, C) {
  12528. this._manager = I, this._url = I.url, this._requestId = I.request({
  12529. begin: g,
  12530. end: C,
  12531. onHeadersReceived: this._onHeadersReceived.bind(this),
  12532. onDone: this._onDone.bind(this),
  12533. onError: this._onError.bind(this),
  12534. onProgress: this._onProgress.bind(this)
  12535. }), this._requests = [], this._queuedChunk = null, this._done = !1, this._storedError = void 0, this.onProgress = null, this.onClosed = null;
  12536. }
  12537. _onHeadersReceived() {
  12538. var g;
  12539. const I = gM((g = this._manager.getRequestXhr(this._requestId)) == null ? void 0 : g.responseURL);
  12540. I !== this._manager._responseOrigin && (this._storedError = new Error(`Expected range response-origin "${I}" to match "${this._manager._responseOrigin}".`), this._onError(0));
  12541. }
  12542. _close() {
  12543. var I;
  12544. (I = this.onClosed) == null || I.call(this, this);
  12545. }
  12546. _onDone(I) {
  12547. const g = I.chunk;
  12548. this._requests.length > 0 ? this._requests.shift().resolve({
  12549. value: g,
  12550. done: !1
  12551. }) : this._queuedChunk = g, this._done = !0;
  12552. for (const C of this._requests)
  12553. C.resolve({
  12554. value: void 0,
  12555. done: !0
  12556. });
  12557. this._requests.length = 0, this._close();
  12558. }
  12559. _onError(I) {
  12560. this._storedError ?? (this._storedError = nG(I, this._url));
  12561. for (const g of this._requests)
  12562. g.reject(this._storedError);
  12563. this._requests.length = 0, this._queuedChunk = null;
  12564. }
  12565. _onProgress(I) {
  12566. var g;
  12567. this.isStreamingSupported || (g = this.onProgress) == null || g.call(this, {
  12568. loaded: I.loaded
  12569. });
  12570. }
  12571. get isStreamingSupported() {
  12572. return !1;
  12573. }
  12574. async read() {
  12575. if (this._storedError)
  12576. throw this._storedError;
  12577. if (this._queuedChunk !== null) {
  12578. const g = this._queuedChunk;
  12579. return this._queuedChunk = null, {
  12580. value: g,
  12581. done: !1
  12582. };
  12583. }
  12584. if (this._done)
  12585. return {
  12586. value: void 0,
  12587. done: !0
  12588. };
  12589. const I = Promise.withResolvers();
  12590. return this._requests.push(I), I.promise;
  12591. }
  12592. cancel(I) {
  12593. this._done = !0;
  12594. for (const g of this._requests)
  12595. g.resolve({
  12596. value: void 0,
  12597. done: !0
  12598. });
  12599. this._requests.length = 0, this._manager.isPendingRequest(this._requestId) && this._manager.abortRequest(this._requestId), this._close();
  12600. }
  12601. }
  12602. const Tcg = /^[a-z][a-z0-9\-+.]+:/i;
  12603. function xcg(t) {
  12604. if (Tcg.test(t))
  12605. return new URL(t);
  12606. const I = process.getBuiltinModule("url");
  12607. return new URL(I.pathToFileURL(t));
  12608. }
  12609. class jcg {
  12610. constructor(I) {
  12611. this.source = I, this.url = xcg(I.url), ut(this.url.protocol === "file:", "PDFNodeStream only supports file:// URLs."), this._fullRequestReader = null, this._rangeRequestReaders = [];
  12612. }
  12613. get _progressiveDataLength() {
  12614. var I;
  12615. return ((I = this._fullRequestReader) == null ? void 0 : I._loaded) ?? 0;
  12616. }
  12617. getFullReader() {
  12618. return ut(!this._fullRequestReader, "PDFNodeStream.getFullReader can only be called once."), this._fullRequestReader = new Qcg(this), this._fullRequestReader;
  12619. }
  12620. getRangeReader(I, g) {
  12621. if (g <= this._progressiveDataLength)
  12622. return null;
  12623. const C = new Ocg(this, I, g);
  12624. return this._rangeRequestReaders.push(C), C;
  12625. }
  12626. cancelAllRequests(I) {
  12627. var g;
  12628. (g = this._fullRequestReader) == null || g.cancel(I);
  12629. for (const C of this._rangeRequestReaders.slice(0))
  12630. C.cancel(I);
  12631. }
  12632. }
  12633. class Qcg {
  12634. constructor(I) {
  12635. this._url = I.url, this._done = !1, this._storedError = null, this.onProgress = null;
  12636. const g = I.source;
  12637. this._contentLength = g.length, this._loaded = 0, this._filename = null, this._disableRange = g.disableRange || !1, this._rangeChunkSize = g.rangeChunkSize, !this._rangeChunkSize && !this._disableRange && (this._disableRange = !0), this._isStreamingSupported = !g.disableStream, this._isRangeSupported = !g.disableRange, this._readableStream = null, this._readCapability = Promise.withResolvers(), this._headersCapability = Promise.withResolvers();
  12638. const C = process.getBuiltinModule("fs");
  12639. C.promises.lstat(this._url).then((i) => {
  12640. this._contentLength = i.size, this._setReadableStream(C.createReadStream(this._url)), this._headersCapability.resolve();
  12641. }, (i) => {
  12642. i.code === "ENOENT" && (i = nG(0, this._url.href)), this._storedError = i, this._headersCapability.reject(i);
  12643. });
  12644. }
  12645. get headersReady() {
  12646. return this._headersCapability.promise;
  12647. }
  12648. get filename() {
  12649. return this._filename;
  12650. }
  12651. get contentLength() {
  12652. return this._contentLength;
  12653. }
  12654. get isRangeSupported() {
  12655. return this._isRangeSupported;
  12656. }
  12657. get isStreamingSupported() {
  12658. return this._isStreamingSupported;
  12659. }
  12660. async read() {
  12661. var C;
  12662. if (await this._readCapability.promise, this._done)
  12663. return {
  12664. value: void 0,
  12665. done: !0
  12666. };
  12667. if (this._storedError)
  12668. throw this._storedError;
  12669. const I = this._readableStream.read();
  12670. return I === null ? (this._readCapability = Promise.withResolvers(), this.read()) : (this._loaded += I.length, (C = this.onProgress) == null || C.call(this, {
  12671. loaded: this._loaded,
  12672. total: this._contentLength
  12673. }), {
  12674. value: new Uint8Array(I).buffer,
  12675. done: !1
  12676. });
  12677. }
  12678. cancel(I) {
  12679. if (!this._readableStream) {
  12680. this._error(I);
  12681. return;
  12682. }
  12683. this._readableStream.destroy(I);
  12684. }
  12685. _error(I) {
  12686. this._storedError = I, this._readCapability.resolve();
  12687. }
  12688. _setReadableStream(I) {
  12689. this._readableStream = I, I.on("readable", () => {
  12690. this._readCapability.resolve();
  12691. }), I.on("end", () => {
  12692. I.destroy(), this._done = !0, this._readCapability.resolve();
  12693. }), I.on("error", (g) => {
  12694. this._error(g);
  12695. }), !this._isStreamingSupported && this._isRangeSupported && this._error(new Ea("streaming is disabled")), this._storedError && this._readableStream.destroy(this._storedError);
  12696. }
  12697. }
  12698. class Ocg {
  12699. constructor(I, g, C) {
  12700. this._url = I.url, this._done = !1, this._storedError = null, this.onProgress = null, this._loaded = 0, this._readableStream = null, this._readCapability = Promise.withResolvers();
  12701. const i = I.source;
  12702. this._isStreamingSupported = !i.disableStream;
  12703. const e = process.getBuiltinModule("fs");
  12704. this._setReadableStream(e.createReadStream(this._url, {
  12705. start: g,
  12706. end: C - 1
  12707. }));
  12708. }
  12709. get isStreamingSupported() {
  12710. return this._isStreamingSupported;
  12711. }
  12712. async read() {
  12713. var C;
  12714. if (await this._readCapability.promise, this._done)
  12715. return {
  12716. value: void 0,
  12717. done: !0
  12718. };
  12719. if (this._storedError)
  12720. throw this._storedError;
  12721. const I = this._readableStream.read();
  12722. return I === null ? (this._readCapability = Promise.withResolvers(), this.read()) : (this._loaded += I.length, (C = this.onProgress) == null || C.call(this, {
  12723. loaded: this._loaded
  12724. }), {
  12725. value: new Uint8Array(I).buffer,
  12726. done: !1
  12727. });
  12728. }
  12729. cancel(I) {
  12730. if (!this._readableStream) {
  12731. this._error(I);
  12732. return;
  12733. }
  12734. this._readableStream.destroy(I);
  12735. }
  12736. _error(I) {
  12737. this._storedError = I, this._readCapability.resolve();
  12738. }
  12739. _setReadableStream(I) {
  12740. this._readableStream = I, I.on("readable", () => {
  12741. this._readCapability.resolve();
  12742. }), I.on("end", () => {
  12743. I.destroy(), this._done = !0, this._readCapability.resolve();
  12744. }), I.on("error", (g) => {
  12745. this._error(g);
  12746. }), this._storedError && this._readableStream.destroy(this._storedError);
  12747. }
  12748. }
  12749. const Ucg = 1e5, b8 = 30;
  12750. var c$, Ya, Oi, dZ, rZ, Nc, Ml, hZ, bZ, Vc, zh, Jh, Na, Lh, uZ, vh, Mc, mZ, ZZ, Th, Rc, GZ, Va, xh, Cn, Vgg, Mgg, GS, Me, wN, wS, Rgg, fgg;
  12751. const wt = class wt {
  12752. constructor({
  12753. textContentSource: I,
  12754. container: g,
  12755. viewport: C
  12756. }) {
  12757. tg(this, Cn);
  12758. tg(this, Ya, Promise.withResolvers());
  12759. tg(this, Oi, null);
  12760. tg(this, dZ, !1);
  12761. tg(this, rZ, !!((c$ = globalThis.FontInspector) != null && c$.enabled));
  12762. tg(this, Nc, null);
  12763. tg(this, Ml, null);
  12764. tg(this, hZ, 0);
  12765. tg(this, bZ, 0);
  12766. tg(this, Vc, null);
  12767. tg(this, zh, null);
  12768. tg(this, Jh, 0);
  12769. tg(this, Na, 0);
  12770. tg(this, Lh, /* @__PURE__ */ Object.create(null));
  12771. tg(this, uZ, []);
  12772. tg(this, vh, null);
  12773. tg(this, Mc, []);
  12774. tg(this, mZ, /* @__PURE__ */ new WeakMap());
  12775. tg(this, ZZ, null);
  12776. var l;
  12777. if (I instanceof ReadableStream)
  12778. $(this, vh, I);
  12779. else if (typeof I == "object")
  12780. $(this, vh, new ReadableStream({
  12781. start(n) {
  12782. n.enqueue(I), n.close();
  12783. }
  12784. }));
  12785. else
  12786. throw new Error('No "textContentSource" parameter specified.');
  12787. $(this, Oi, $(this, zh, g)), $(this, Na, C.scale * In.pixelRatio), $(this, Jh, C.rotation), $(this, Ml, {
  12788. div: null,
  12789. properties: null,
  12790. ctx: null
  12791. });
  12792. const {
  12793. pageWidth: i,
  12794. pageHeight: e,
  12795. pageX: A,
  12796. pageY: s
  12797. } = C.rawDims;
  12798. $(this, ZZ, [1, 0, 0, -1, -A, s + e]), $(this, bZ, i), $(this, hZ, e), ig(l = wt, Me, Rgg).call(l), cd(g, C), M(this, Ya).promise.finally(() => {
  12799. M(wt, xh).delete(this), $(this, Ml, null), $(this, Lh, null);
  12800. }).catch(() => {
  12801. });
  12802. }
  12803. static get fontFamilyMap() {
  12804. const {
  12805. isWindows: I,
  12806. isFirefox: g
  12807. } = Ai.platform;
  12808. return UI(this, "fontFamilyMap", /* @__PURE__ */ new Map([["sans-serif", `${I && g ? "Calibri, " : ""}sans-serif`], ["monospace", `${I && g ? "Lucida Console, " : ""}monospace`]]));
  12809. }
  12810. render() {
  12811. const I = () => {
  12812. M(this, Vc).read().then(({
  12813. value: g,
  12814. done: C
  12815. }) => {
  12816. if (C) {
  12817. M(this, Ya).resolve();
  12818. return;
  12819. }
  12820. M(this, Nc) ?? $(this, Nc, g.lang), Object.assign(M(this, Lh), g.styles), ig(this, Cn, Vgg).call(this, g.items), I();
  12821. }, M(this, Ya).reject);
  12822. };
  12823. return $(this, Vc, M(this, vh).getReader()), M(wt, xh).add(this), I(), M(this, Ya).promise;
  12824. }
  12825. update({
  12826. viewport: I,
  12827. onBefore: g = null
  12828. }) {
  12829. var e;
  12830. const C = I.scale * In.pixelRatio, i = I.rotation;
  12831. if (i !== M(this, Jh) && (g == null || g(), $(this, Jh, i), cd(M(this, zh), {
  12832. rotation: i
  12833. })), C !== M(this, Na)) {
  12834. g == null || g(), $(this, Na, C);
  12835. const A = {
  12836. div: null,
  12837. properties: null,
  12838. ctx: ig(e = wt, Me, wN).call(e, M(this, Nc))
  12839. };
  12840. for (const s of M(this, Mc))
  12841. A.properties = M(this, mZ).get(s), A.div = s, ig(this, Cn, GS).call(this, A);
  12842. }
  12843. }
  12844. cancel() {
  12845. var g;
  12846. const I = new Ea("TextLayer task cancelled.");
  12847. (g = M(this, Vc)) == null || g.cancel(I).catch(() => {
  12848. }), $(this, Vc, null), M(this, Ya).reject(I);
  12849. }
  12850. get textDivs() {
  12851. return M(this, Mc);
  12852. }
  12853. get textContentItemsStr() {
  12854. return M(this, uZ);
  12855. }
  12856. static cleanup() {
  12857. if (!(M(this, xh).size > 0)) {
  12858. M(this, Th).clear();
  12859. for (const {
  12860. canvas: I
  12861. } of M(this, Rc).values())
  12862. I.remove();
  12863. M(this, Rc).clear();
  12864. }
  12865. }
  12866. };
  12867. Ya = new WeakMap(), Oi = new WeakMap(), dZ = new WeakMap(), rZ = new WeakMap(), Nc = new WeakMap(), Ml = new WeakMap(), hZ = new WeakMap(), bZ = new WeakMap(), Vc = new WeakMap(), zh = new WeakMap(), Jh = new WeakMap(), Na = new WeakMap(), Lh = new WeakMap(), uZ = new WeakMap(), vh = new WeakMap(), Mc = new WeakMap(), mZ = new WeakMap(), ZZ = new WeakMap(), Th = new WeakMap(), Rc = new WeakMap(), GZ = new WeakMap(), Va = new WeakMap(), xh = new WeakMap(), Cn = new WeakSet(), Vgg = function(I) {
  12868. var i, e;
  12869. if (M(this, dZ))
  12870. return;
  12871. (e = M(this, Ml)).ctx ?? (e.ctx = ig(i = wt, Me, wN).call(i, M(this, Nc)));
  12872. const g = M(this, Mc), C = M(this, uZ);
  12873. for (const A of I) {
  12874. if (g.length > Ucg) {
  12875. DI("Ignoring additional textDivs for performance reasons."), $(this, dZ, !0);
  12876. return;
  12877. }
  12878. if (A.str === void 0) {
  12879. if (A.type === "beginMarkedContentProps" || A.type === "beginMarkedContent") {
  12880. const s = M(this, Oi);
  12881. $(this, Oi, document.createElement("span")), M(this, Oi).classList.add("markedContent"), A.id !== null && M(this, Oi).setAttribute("id", `${A.id}`), s.append(M(this, Oi));
  12882. } else A.type === "endMarkedContent" && $(this, Oi, M(this, Oi).parentNode);
  12883. continue;
  12884. }
  12885. C.push(A.str), ig(this, Cn, Mgg).call(this, A);
  12886. }
  12887. }, Mgg = function(I) {
  12888. var h;
  12889. const g = document.createElement("span"), C = {
  12890. angle: 0,
  12891. canvasWidth: 0,
  12892. hasText: I.str !== "",
  12893. hasEOL: I.hasEOL,
  12894. fontSize: 0
  12895. };
  12896. M(this, Mc).push(g);
  12897. const i = AI.transform(M(this, ZZ), I.transform);
  12898. let e = Math.atan2(i[1], i[0]);
  12899. const A = M(this, Lh)[I.fontName];
  12900. A.vertical && (e += Math.PI / 2);
  12901. let s = M(this, rZ) && A.fontSubstitution || A.fontFamily;
  12902. s = wt.fontFamilyMap.get(s) || s;
  12903. const l = Math.hypot(i[2], i[3]), n = l * ig(h = wt, Me, fgg).call(h, s, A, M(this, Nc));
  12904. let a, d;
  12905. e === 0 ? (a = i[4], d = i[5] - n) : (a = i[4] + n * Math.sin(e), d = i[5] - n * Math.cos(e));
  12906. const o = "calc(var(--total-scale-factor) *", c = g.style;
  12907. M(this, Oi) === M(this, zh) ? (c.left = `${(100 * a / M(this, bZ)).toFixed(2)}%`, c.top = `${(100 * d / M(this, hZ)).toFixed(2)}%`) : (c.left = `${o}${a.toFixed(2)}px)`, c.top = `${o}${d.toFixed(2)}px)`), c.fontSize = `${o}${(M(wt, Va) * l).toFixed(2)}px)`, c.fontFamily = s, C.fontSize = l, g.setAttribute("role", "presentation"), g.textContent = I.str, g.dir = I.dir, M(this, rZ) && (g.dataset.fontName = A.fontSubstitutionLoadedName || I.fontName), e !== 0 && (C.angle = e * (180 / Math.PI));
  12908. let r = !1;
  12909. if (I.str.length > 1)
  12910. r = !0;
  12911. else if (I.str !== " " && I.transform[0] !== I.transform[3]) {
  12912. const b = Math.abs(I.transform[0]), u = Math.abs(I.transform[3]);
  12913. b !== u && Math.max(b, u) / Math.min(b, u) > 1.5 && (r = !0);
  12914. }
  12915. if (r && (C.canvasWidth = A.vertical ? I.height : I.width), M(this, mZ).set(g, C), M(this, Ml).div = g, M(this, Ml).properties = C, ig(this, Cn, GS).call(this, M(this, Ml)), C.hasText && M(this, Oi).append(g), C.hasEOL) {
  12916. const b = document.createElement("br");
  12917. b.setAttribute("role", "presentation"), M(this, Oi).append(b);
  12918. }
  12919. }, GS = function(I) {
  12920. var s;
  12921. const {
  12922. div: g,
  12923. properties: C,
  12924. ctx: i
  12925. } = I, {
  12926. style: e
  12927. } = g;
  12928. let A = "";
  12929. if (M(wt, Va) > 1 && (A = `scale(${1 / M(wt, Va)})`), C.canvasWidth !== 0 && C.hasText) {
  12930. const {
  12931. fontFamily: l
  12932. } = e, {
  12933. canvasWidth: n,
  12934. fontSize: a
  12935. } = C;
  12936. ig(s = wt, Me, wS).call(s, i, a * M(this, Na), l);
  12937. const {
  12938. width: d
  12939. } = i.measureText(g.textContent);
  12940. d > 0 && (A = `scaleX(${n * M(this, Na) / d}) ${A}`);
  12941. }
  12942. C.angle !== 0 && (A = `rotate(${C.angle}deg) ${A}`), A.length > 0 && (e.transform = A);
  12943. }, Me = new WeakSet(), wN = function(I = null) {
  12944. let g = M(this, Rc).get(I || (I = ""));
  12945. if (!g) {
  12946. const C = document.createElement("canvas");
  12947. C.className = "hiddenCanvasElement", C.lang = I, document.body.append(C), g = C.getContext("2d", {
  12948. alpha: !1,
  12949. willReadFrequently: !0
  12950. }), M(this, Rc).set(I, g), M(this, GZ).set(g, {
  12951. size: 0,
  12952. family: ""
  12953. });
  12954. }
  12955. return g;
  12956. }, wS = function(I, g, C) {
  12957. const i = M(this, GZ).get(I);
  12958. g === i.size && C === i.family || (I.font = `${g}px ${C}`, i.size = g, i.family = C);
  12959. }, Rgg = function() {
  12960. if (M(this, Va) !== null)
  12961. return;
  12962. const I = document.createElement("div");
  12963. I.style.opacity = 0, I.style.lineHeight = 1, I.style.fontSize = "1px", I.style.position = "absolute", I.textContent = "X", document.body.append(I), $(this, Va, I.getBoundingClientRect().height), I.remove();
  12964. }, fgg = function(I, g, C) {
  12965. const i = M(this, Th).get(I);
  12966. if (i)
  12967. return i;
  12968. const e = ig(this, Me, wN).call(this, C);
  12969. e.canvas.width = e.canvas.height = b8, ig(this, Me, wS).call(this, e, b8, I);
  12970. const A = e.measureText(""), s = A.fontBoundingBoxAscent, l = Math.abs(A.fontBoundingBoxDescent);
  12971. e.canvas.width = e.canvas.height = 0;
  12972. let n = 0.8;
  12973. return s ? n = s / (s + l) : (Ai.platform.isFirefox && DI("Enable the `dom.textMetrics.fontBoundingBox.enabled` preference in `about:config` to improve TextLayer rendering."), g.ascent ? n = g.ascent : g.descent && (n = 1 + g.descent)), M(this, Th).set(I, n), n;
  12974. }, tg(wt, Me), tg(wt, Th, /* @__PURE__ */ new Map()), tg(wt, Rc, /* @__PURE__ */ new Map()), tg(wt, GZ, /* @__PURE__ */ new WeakMap()), tg(wt, Va, null), tg(wt, xh, /* @__PURE__ */ new Set());
  12975. let Mm = wt;
  12976. class Rm {
  12977. static textContent(I) {
  12978. const g = [], C = {
  12979. items: g,
  12980. styles: /* @__PURE__ */ Object.create(null)
  12981. };
  12982. function i(e) {
  12983. var l;
  12984. if (!e)
  12985. return;
  12986. let A = null;
  12987. const s = e.name;
  12988. if (s === "#text")
  12989. A = e.value;
  12990. else if (Rm.shouldBuildText(s))
  12991. (l = e == null ? void 0 : e.attributes) != null && l.textContent ? A = e.attributes.textContent : e.value && (A = e.value);
  12992. else return;
  12993. if (A !== null && g.push({
  12994. str: A
  12995. }), !!e.children)
  12996. for (const n of e.children)
  12997. i(n);
  12998. }
  12999. return i(I), C;
  13000. }
  13001. static shouldBuildText(I) {
  13002. return !(I === "textarea" || I === "input" || I === "option" || I === "select");
  13003. }
  13004. }
  13005. const Ecg = 65536, Pcg = 100;
  13006. function _cg(t = {}) {
  13007. typeof t == "string" || t instanceof URL ? t = {
  13008. url: t
  13009. } : (t instanceof ArrayBuffer || ArrayBuffer.isView(t)) && (t = {
  13010. data: t
  13011. });
  13012. const I = new BS(), {
  13013. docId: g
  13014. } = I, C = t.url ? qcg(t.url) : null, i = t.data ? $cg(t.data) : null, e = t.httpHeaders || null, A = t.withCredentials === !0, s = t.password ?? null, l = t.range instanceof Hgg ? t.range : null, n = Number.isInteger(t.rangeChunkSize) && t.rangeChunkSize > 0 ? t.rangeChunkSize : Ecg;
  13015. let a = t.worker instanceof ch ? t.worker : null;
  13016. const d = t.verbosity, o = typeof t.docBaseUrl == "string" && !$V(t.docBaseUrl) ? t.docBaseUrl : null, c = LY(t.cMapUrl), r = t.cMapPacked !== !1, h = t.CMapReaderFactory || ($t ? dcg : C8), b = LY(t.iccUrl), u = LY(t.standardFontDataUrl), m = t.StandardFontDataFactory || ($t ? rcg : t8), Z = LY(t.wasmUrl), p = t.WasmFactory || ($t ? hcg : i8), Y = t.stopAtErrors !== !0, R = Number.isInteger(t.maxImageSize) && t.maxImageSize > -1 ? t.maxImageSize : -1, X = t.isEvalSupported !== !1, H = typeof t.isOffscreenCanvasSupported == "boolean" ? t.isOffscreenCanvasSupported : !$t, S = typeof t.isImageDecoderSupported == "boolean" ? t.isImageDecoderSupported : !$t && (Ai.platform.isFirefox || !globalThis.chrome), z = Number.isInteger(t.canvasMaxAreaInBytes) ? t.canvasMaxAreaInBytes : -1, v = typeof t.disableFontFace == "boolean" ? t.disableFontFace : $t, K = t.fontExtraProperties === !0, V = t.enableXfa === !0, N = t.ownerDocument || globalThis.document, B = t.disableRange === !0, G = t.disableStream === !0, w = t.disableAutoFetch === !0, W = t.pdfBug === !0, y = t.CanvasFactory || ($t ? ccg : ncg), f = t.FilterFactory || ($t ? ocg : acg), D = t.enableHWA === !0, F = t.useWasm !== !1, T = l ? l.length : t.length ?? NaN, Q = typeof t.useSystemFonts == "boolean" ? t.useSystemFonts : !$t && !v, P = typeof t.useWorkerFetch == "boolean" ? t.useWorkerFetch : !!(h === C8 && m === t8 && p === i8 && c && u && Z && Or(c, document.baseURI) && Or(u, document.baseURI) && Or(Z, document.baseURI)), L = null;
  13017. Log(d);
  13018. const E = {
  13019. canvasFactory: new y({
  13020. ownerDocument: N,
  13021. enableHWA: D
  13022. }),
  13023. filterFactory: new f({
  13024. docId: g,
  13025. ownerDocument: N
  13026. }),
  13027. cMapReaderFactory: P ? null : new h({
  13028. baseUrl: c,
  13029. isCompressed: r
  13030. }),
  13031. standardFontDataFactory: P ? null : new m({
  13032. baseUrl: u
  13033. }),
  13034. wasmFactory: P ? null : new p({
  13035. baseUrl: Z
  13036. })
  13037. };
  13038. if (!a) {
  13039. const j = {
  13040. verbosity: d,
  13041. port: Ql.workerPort
  13042. };
  13043. a = j.port ? ch.fromPort(j) : new ch(j), I._worker = a;
  13044. }
  13045. const J = {
  13046. docId: g,
  13047. apiVersion: "5.1.91",
  13048. data: i,
  13049. password: s,
  13050. disableAutoFetch: w,
  13051. rangeChunkSize: n,
  13052. length: T,
  13053. docBaseUrl: o,
  13054. enableXfa: V,
  13055. evaluatorOptions: {
  13056. maxImageSize: R,
  13057. disableFontFace: v,
  13058. ignoreErrors: Y,
  13059. isEvalSupported: X,
  13060. isOffscreenCanvasSupported: H,
  13061. isImageDecoderSupported: S,
  13062. canvasMaxAreaInBytes: z,
  13063. fontExtraProperties: K,
  13064. useSystemFonts: Q,
  13065. useWasm: F,
  13066. useWorkerFetch: P,
  13067. cMapUrl: c,
  13068. iccUrl: b,
  13069. standardFontDataUrl: u,
  13070. wasmUrl: Z
  13071. }
  13072. }, k = {
  13073. ownerDocument: N,
  13074. pdfBug: W,
  13075. styleElement: L,
  13076. loadingParams: {
  13077. disableAutoFetch: w,
  13078. enableXfa: V
  13079. }
  13080. };
  13081. return a.promise.then(function() {
  13082. if (I.destroyed)
  13083. throw new Error("Loading aborted");
  13084. if (a.destroyed)
  13085. throw new Error("Worker was destroyed");
  13086. const j = a.messageHandler.sendWithPromise("GetDocRequest", J, i ? [i.buffer] : null);
  13087. let q;
  13088. if (l)
  13089. q = new Hcg(l, {
  13090. disableRange: B,
  13091. disableStream: G
  13092. });
  13093. else if (!i) {
  13094. if (!C)
  13095. throw new Error("getDocument - no `url` parameter provided.");
  13096. let Cg;
  13097. if ($t)
  13098. if (Or(C)) {
  13099. if (typeof fetch > "u" || typeof Response > "u" || !("body" in Response.prototype))
  13100. throw new Error("getDocument - the Fetch API was disabled in Node.js, see `--no-experimental-fetch`.");
  13101. Cg = h8;
  13102. } else
  13103. Cg = jcg;
  13104. else
  13105. Cg = Or(C) ? h8 : Jcg;
  13106. q = new Cg({
  13107. url: C,
  13108. length: T,
  13109. httpHeaders: e,
  13110. withCredentials: A,
  13111. rangeChunkSize: n,
  13112. disableRange: B,
  13113. disableStream: G
  13114. });
  13115. }
  13116. return j.then((Cg) => {
  13117. if (I.destroyed)
  13118. throw new Error("Loading aborted");
  13119. if (a.destroyed)
  13120. throw new Error("Worker was destroyed");
  13121. const Ig = new Qu(g, Cg, a.port), x = new edg(Ig, I, q, k, E);
  13122. I._transport = x, Ig.send("Ready", null);
  13123. });
  13124. }).catch(I._capability.reject), I;
  13125. }
  13126. function qcg(t) {
  13127. if (t instanceof URL)
  13128. return t.href;
  13129. if (typeof t == "string") {
  13130. if ($t)
  13131. return t;
  13132. const I = URL.parse(t, window.location);
  13133. if (I)
  13134. return I.href;
  13135. }
  13136. throw new Error("Invalid PDF url data: either string or URL-object is expected in the url property.");
  13137. }
  13138. function $cg(t) {
  13139. if ($t && typeof Buffer < "u" && t instanceof Buffer)
  13140. throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`.");
  13141. if (t instanceof Uint8Array && t.byteLength === t.buffer.byteLength)
  13142. return t;
  13143. if (typeof t == "string")
  13144. return eG(t);
  13145. if (t instanceof ArrayBuffer || ArrayBuffer.isView(t) || typeof t == "object" && !isNaN(t == null ? void 0 : t.length))
  13146. return new Uint8Array(t);
  13147. throw new Error("Invalid PDF binary data: either TypedArray, string, or array-like object is expected in the data property.");
  13148. }
  13149. function LY(t) {
  13150. if (typeof t != "string")
  13151. return null;
  13152. if (t.endsWith("/"))
  13153. return t;
  13154. throw new Error(`Invalid factory url: "${t}" must include trailing slash.`);
  13155. }
  13156. const pS = (t) => typeof t == "object" && Number.isInteger(t == null ? void 0 : t.num) && t.num >= 0 && Number.isInteger(t == null ? void 0 : t.gen) && t.gen >= 0, gdg = (t) => typeof t == "object" && typeof (t == null ? void 0 : t.name) == "string", Idg = _og.bind(null, pS, gdg);
  13157. var zV;
  13158. const JV = class JV {
  13159. constructor() {
  13160. iI(this, "_capability", Promise.withResolvers());
  13161. iI(this, "_transport", null);
  13162. iI(this, "_worker", null);
  13163. iI(this, "docId", `d${Wi(JV, zV)._++}`);
  13164. iI(this, "destroyed", !1);
  13165. iI(this, "onPassword", null);
  13166. iI(this, "onProgress", null);
  13167. }
  13168. get promise() {
  13169. return this._capability.promise;
  13170. }
  13171. async destroy() {
  13172. var I, g, C, i;
  13173. this.destroyed = !0;
  13174. try {
  13175. (I = this._worker) != null && I.port && (this._worker._pendingDestroy = !0), await ((g = this._transport) == null ? void 0 : g.destroy());
  13176. } catch (e) {
  13177. throw (C = this._worker) != null && C.port && delete this._worker._pendingDestroy, e;
  13178. }
  13179. this._transport = null, (i = this._worker) == null || i.destroy(), this._worker = null;
  13180. }
  13181. async getData() {
  13182. return this._transport.getData();
  13183. }
  13184. };
  13185. zV = new WeakMap(), tg(JV, zV, 0);
  13186. let BS = JV;
  13187. class Hgg {
  13188. constructor(I, g, C = !1, i = null) {
  13189. this.length = I, this.initialData = g, this.progressiveDone = C, this.contentDispositionFilename = i, this._rangeListeners = [], this._progressListeners = [], this._progressiveReadListeners = [], this._progressiveDoneListeners = [], this._readyCapability = Promise.withResolvers();
  13190. }
  13191. addRangeListener(I) {
  13192. this._rangeListeners.push(I);
  13193. }
  13194. addProgressListener(I) {
  13195. this._progressListeners.push(I);
  13196. }
  13197. addProgressiveReadListener(I) {
  13198. this._progressiveReadListeners.push(I);
  13199. }
  13200. addProgressiveDoneListener(I) {
  13201. this._progressiveDoneListeners.push(I);
  13202. }
  13203. onDataRange(I, g) {
  13204. for (const C of this._rangeListeners)
  13205. C(I, g);
  13206. }
  13207. onDataProgress(I, g) {
  13208. this._readyCapability.promise.then(() => {
  13209. for (const C of this._progressListeners)
  13210. C(I, g);
  13211. });
  13212. }
  13213. onDataProgressiveRead(I) {
  13214. this._readyCapability.promise.then(() => {
  13215. for (const g of this._progressiveReadListeners)
  13216. g(I);
  13217. });
  13218. }
  13219. onDataProgressiveDone() {
  13220. this._readyCapability.promise.then(() => {
  13221. for (const I of this._progressiveDoneListeners)
  13222. I();
  13223. });
  13224. }
  13225. transportReady() {
  13226. this._readyCapability.resolve();
  13227. }
  13228. requestDataRange(I, g) {
  13229. BC("Abstract method PDFDataRangeTransport.requestDataRange");
  13230. }
  13231. abort() {
  13232. }
  13233. }
  13234. class Cdg {
  13235. constructor(I, g) {
  13236. this._pdfInfo = I, this._transport = g;
  13237. }
  13238. get annotationStorage() {
  13239. return this._transport.annotationStorage;
  13240. }
  13241. get canvasFactory() {
  13242. return this._transport.canvasFactory;
  13243. }
  13244. get filterFactory() {
  13245. return this._transport.filterFactory;
  13246. }
  13247. get numPages() {
  13248. return this._pdfInfo.numPages;
  13249. }
  13250. get fingerprints() {
  13251. return this._pdfInfo.fingerprints;
  13252. }
  13253. get isPureXfa() {
  13254. return UI(this, "isPureXfa", !!this._transport._htmlForXfa);
  13255. }
  13256. get allXfaHtml() {
  13257. return this._transport._htmlForXfa;
  13258. }
  13259. getPage(I) {
  13260. return this._transport.getPage(I);
  13261. }
  13262. getPageIndex(I) {
  13263. return this._transport.getPageIndex(I);
  13264. }
  13265. getDestinations() {
  13266. return this._transport.getDestinations();
  13267. }
  13268. getDestination(I) {
  13269. return this._transport.getDestination(I);
  13270. }
  13271. getPageLabels() {
  13272. return this._transport.getPageLabels();
  13273. }
  13274. getPageLayout() {
  13275. return this._transport.getPageLayout();
  13276. }
  13277. getPageMode() {
  13278. return this._transport.getPageMode();
  13279. }
  13280. getViewerPreferences() {
  13281. return this._transport.getViewerPreferences();
  13282. }
  13283. getOpenAction() {
  13284. return this._transport.getOpenAction();
  13285. }
  13286. getAttachments() {
  13287. return this._transport.getAttachments();
  13288. }
  13289. getJSActions() {
  13290. return this._transport.getDocJSActions();
  13291. }
  13292. getOutline() {
  13293. return this._transport.getOutline();
  13294. }
  13295. getOptionalContentConfig({
  13296. intent: I = "display"
  13297. } = {}) {
  13298. const {
  13299. renderingIntent: g
  13300. } = this._transport.getRenderingIntent(I);
  13301. return this._transport.getOptionalContentConfig(g);
  13302. }
  13303. getPermissions() {
  13304. return this._transport.getPermissions();
  13305. }
  13306. getMetadata() {
  13307. return this._transport.getMetadata();
  13308. }
  13309. getMarkInfo() {
  13310. return this._transport.getMarkInfo();
  13311. }
  13312. getData() {
  13313. return this._transport.getData();
  13314. }
  13315. saveDocument() {
  13316. return this._transport.saveDocument();
  13317. }
  13318. getDownloadInfo() {
  13319. return this._transport.downloadInfoCapability.promise;
  13320. }
  13321. cleanup(I = !1) {
  13322. return this._transport.startCleanup(I || this.isPureXfa);
  13323. }
  13324. destroy() {
  13325. return this.loadingTask.destroy();
  13326. }
  13327. cachedPageNumber(I) {
  13328. return this._transport.cachedPageNumber(I);
  13329. }
  13330. get loadingParams() {
  13331. return this._transport.loadingParams;
  13332. }
  13333. get loadingTask() {
  13334. return this._transport.loadingTask;
  13335. }
  13336. getFieldObjects() {
  13337. return this._transport.getFieldObjects();
  13338. }
  13339. hasJSActions() {
  13340. return this._transport.hasJSActions();
  13341. }
  13342. getCalculationOrderIds() {
  13343. return this._transport.getCalculationOrderIds();
  13344. }
  13345. }
  13346. var Rl, fc, _u;
  13347. class tdg {
  13348. constructor(I, g, C, i = !1) {
  13349. tg(this, fc);
  13350. tg(this, Rl, !1);
  13351. this._pageIndex = I, this._pageInfo = g, this._transport = C, this._stats = i ? new $6() : null, this._pdfBug = i, this.commonObjs = C.commonObjs, this.objs = new Xgg(), this._intentStates = /* @__PURE__ */ new Map(), this.destroyed = !1;
  13352. }
  13353. get pageNumber() {
  13354. return this._pageIndex + 1;
  13355. }
  13356. get rotate() {
  13357. return this._pageInfo.rotate;
  13358. }
  13359. get ref() {
  13360. return this._pageInfo.ref;
  13361. }
  13362. get userUnit() {
  13363. return this._pageInfo.userUnit;
  13364. }
  13365. get view() {
  13366. return this._pageInfo.view;
  13367. }
  13368. getViewport({
  13369. scale: I,
  13370. rotation: g = this.rotate,
  13371. offsetX: C = 0,
  13372. offsetY: i = 0,
  13373. dontFlip: e = !1
  13374. } = {}) {
  13375. return new sG({
  13376. viewBox: this.view,
  13377. userUnit: this.userUnit,
  13378. scale: I,
  13379. rotation: g,
  13380. offsetX: C,
  13381. offsetY: i,
  13382. dontFlip: e
  13383. });
  13384. }
  13385. getAnnotations({
  13386. intent: I = "display"
  13387. } = {}) {
  13388. const {
  13389. renderingIntent: g
  13390. } = this._transport.getRenderingIntent(I);
  13391. return this._transport.getAnnotations(this._pageIndex, g);
  13392. }
  13393. getJSActions() {
  13394. return this._transport.getPageJSActions(this._pageIndex);
  13395. }
  13396. get filterFactory() {
  13397. return this._transport.filterFactory;
  13398. }
  13399. get isPureXfa() {
  13400. return UI(this, "isPureXfa", !!this._transport._htmlForXfa);
  13401. }
  13402. async getXfa() {
  13403. var I;
  13404. return ((I = this._transport._htmlForXfa) == null ? void 0 : I.children[this._pageIndex]) || null;
  13405. }
  13406. render({
  13407. canvasContext: I,
  13408. viewport: g,
  13409. intent: C = "display",
  13410. annotationMode: i = la.ENABLE,
  13411. transform: e = null,
  13412. background: A = null,
  13413. optionalContentConfigPromise: s = null,
  13414. annotationCanvasMap: l = null,
  13415. pageColors: n = null,
  13416. printAnnotationStorage: a = null,
  13417. isEditing: d = !1
  13418. }) {
  13419. var p, Y;
  13420. (p = this._stats) == null || p.time("Overall");
  13421. const o = this._transport.getRenderingIntent(C, i, a, d), {
  13422. renderingIntent: c,
  13423. cacheKey: r
  13424. } = o;
  13425. $(this, Rl, !1), s || (s = this._transport.getOptionalContentConfig(c));
  13426. let h = this._intentStates.get(r);
  13427. h || (h = /* @__PURE__ */ Object.create(null), this._intentStates.set(r, h)), h.streamReaderCancelTimeout && (clearTimeout(h.streamReaderCancelTimeout), h.streamReaderCancelTimeout = null);
  13428. const b = !!(c & ye.PRINT);
  13429. h.displayReadyCapability || (h.displayReadyCapability = Promise.withResolvers(), h.operatorList = {
  13430. fnArray: [],
  13431. argsArray: [],
  13432. lastChunk: !1,
  13433. separateAnnots: null
  13434. }, (Y = this._stats) == null || Y.time("Page Request"), this._pumpOperatorList(o));
  13435. const u = (R) => {
  13436. var X;
  13437. h.renderTasks.delete(m), b && $(this, Rl, !0), ig(this, fc, _u).call(this), R ? (m.capability.reject(R), this._abortOperatorList({
  13438. intentState: h,
  13439. reason: R instanceof Error ? R : new Error(R)
  13440. })) : m.capability.resolve(), this._stats && (this._stats.timeEnd("Rendering"), this._stats.timeEnd("Overall"), (X = globalThis.Stats) != null && X.enabled && globalThis.Stats.add(this.pageNumber, this._stats));
  13441. }, m = new yS({
  13442. callback: u,
  13443. params: {
  13444. canvasContext: I,
  13445. viewport: g,
  13446. transform: e,
  13447. background: A
  13448. },
  13449. objs: this.objs,
  13450. commonObjs: this.commonObjs,
  13451. annotationCanvasMap: l,
  13452. operatorList: h.operatorList,
  13453. pageIndex: this._pageIndex,
  13454. canvasFactory: this._transport.canvasFactory,
  13455. filterFactory: this._transport.filterFactory,
  13456. useRequestAnimationFrame: !b,
  13457. pdfBug: this._pdfBug,
  13458. pageColors: n
  13459. });
  13460. (h.renderTasks || (h.renderTasks = /* @__PURE__ */ new Set())).add(m);
  13461. const Z = m.task;
  13462. return Promise.all([h.displayReadyCapability.promise, s]).then(([R, X]) => {
  13463. var H;
  13464. if (this.destroyed) {
  13465. u();
  13466. return;
  13467. }
  13468. if ((H = this._stats) == null || H.time("Rendering"), !(X.renderingIntent & c))
  13469. throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` and `PDFDocumentProxy.getOptionalContentConfig` methods.");
  13470. m.initializeGraphics({
  13471. transparency: R,
  13472. optionalContentConfig: X
  13473. }), m.operatorListChanged();
  13474. }).catch(u), Z;
  13475. }
  13476. getOperatorList({
  13477. intent: I = "display",
  13478. annotationMode: g = la.ENABLE,
  13479. printAnnotationStorage: C = null,
  13480. isEditing: i = !1
  13481. } = {}) {
  13482. var n;
  13483. function e() {
  13484. s.operatorList.lastChunk && (s.opListReadCapability.resolve(s.operatorList), s.renderTasks.delete(l));
  13485. }
  13486. const A = this._transport.getRenderingIntent(I, g, C, i, !0);
  13487. let s = this._intentStates.get(A.cacheKey);
  13488. s || (s = /* @__PURE__ */ Object.create(null), this._intentStates.set(A.cacheKey, s));
  13489. let l;
  13490. return s.opListReadCapability || (l = /* @__PURE__ */ Object.create(null), l.operatorListChanged = e, s.opListReadCapability = Promise.withResolvers(), (s.renderTasks || (s.renderTasks = /* @__PURE__ */ new Set())).add(l), s.operatorList = {
  13491. fnArray: [],
  13492. argsArray: [],
  13493. lastChunk: !1,
  13494. separateAnnots: null
  13495. }, (n = this._stats) == null || n.time("Page Request"), this._pumpOperatorList(A)), s.opListReadCapability.promise;
  13496. }
  13497. streamTextContent({
  13498. includeMarkedContent: I = !1,
  13499. disableNormalization: g = !1
  13500. } = {}) {
  13501. return this._transport.messageHandler.sendWithStream("GetTextContent", {
  13502. pageIndex: this._pageIndex,
  13503. includeMarkedContent: I === !0,
  13504. disableNormalization: g === !0
  13505. }, {
  13506. highWaterMark: 100,
  13507. size(i) {
  13508. return i.items.length;
  13509. }
  13510. });
  13511. }
  13512. getTextContent(I = {}) {
  13513. if (this._transport._htmlForXfa)
  13514. return this.getXfa().then((C) => Rm.textContent(C));
  13515. const g = this.streamTextContent(I);
  13516. return new Promise(function(C, i) {
  13517. function e() {
  13518. A.read().then(function({
  13519. value: l,
  13520. done: n
  13521. }) {
  13522. if (n) {
  13523. C(s);
  13524. return;
  13525. }
  13526. s.lang ?? (s.lang = l.lang), Object.assign(s.styles, l.styles), s.items.push(...l.items), e();
  13527. }, i);
  13528. }
  13529. const A = g.getReader(), s = {
  13530. items: [],
  13531. styles: /* @__PURE__ */ Object.create(null),
  13532. lang: null
  13533. };
  13534. e();
  13535. });
  13536. }
  13537. getStructTree() {
  13538. return this._transport.getStructTree(this._pageIndex);
  13539. }
  13540. _destroy() {
  13541. this.destroyed = !0;
  13542. const I = [];
  13543. for (const g of this._intentStates.values())
  13544. if (this._abortOperatorList({
  13545. intentState: g,
  13546. reason: new Error("Page was destroyed."),
  13547. force: !0
  13548. }), !g.opListReadCapability)
  13549. for (const C of g.renderTasks)
  13550. I.push(C.completed), C.cancel();
  13551. return this.objs.clear(), $(this, Rl, !1), Promise.all(I);
  13552. }
  13553. cleanup(I = !1) {
  13554. $(this, Rl, !0);
  13555. const g = ig(this, fc, _u).call(this);
  13556. return I && g && this._stats && (this._stats = new $6()), g;
  13557. }
  13558. _startRenderPage(I, g) {
  13559. var i, e;
  13560. const C = this._intentStates.get(g);
  13561. C && ((i = this._stats) == null || i.timeEnd("Page Request"), (e = C.displayReadyCapability) == null || e.resolve(I));
  13562. }
  13563. _renderPageChunk(I, g) {
  13564. for (let C = 0, i = I.length; C < i; C++)
  13565. g.operatorList.fnArray.push(I.fnArray[C]), g.operatorList.argsArray.push(I.argsArray[C]);
  13566. g.operatorList.lastChunk = I.lastChunk, g.operatorList.separateAnnots = I.separateAnnots;
  13567. for (const C of g.renderTasks)
  13568. C.operatorListChanged();
  13569. I.lastChunk && ig(this, fc, _u).call(this);
  13570. }
  13571. _pumpOperatorList({
  13572. renderingIntent: I,
  13573. cacheKey: g,
  13574. annotationStorageSerializable: C,
  13575. modifiedIds: i
  13576. }) {
  13577. const {
  13578. map: e,
  13579. transfer: A
  13580. } = C, l = this._transport.messageHandler.sendWithStream("GetOperatorList", {
  13581. pageIndex: this._pageIndex,
  13582. intent: I,
  13583. cacheKey: g,
  13584. annotationStorage: e,
  13585. modifiedIds: i
  13586. }, A).getReader(), n = this._intentStates.get(g);
  13587. n.streamReader = l;
  13588. const a = () => {
  13589. l.read().then(({
  13590. value: d,
  13591. done: o
  13592. }) => {
  13593. if (o) {
  13594. n.streamReader = null;
  13595. return;
  13596. }
  13597. this._transport.destroyed || (this._renderPageChunk(d, n), a());
  13598. }, (d) => {
  13599. if (n.streamReader = null, !this._transport.destroyed) {
  13600. if (n.operatorList) {
  13601. n.operatorList.lastChunk = !0;
  13602. for (const o of n.renderTasks)
  13603. o.operatorListChanged();
  13604. ig(this, fc, _u).call(this);
  13605. }
  13606. if (n.displayReadyCapability)
  13607. n.displayReadyCapability.reject(d);
  13608. else if (n.opListReadCapability)
  13609. n.opListReadCapability.reject(d);
  13610. else
  13611. throw d;
  13612. }
  13613. });
  13614. };
  13615. a();
  13616. }
  13617. _abortOperatorList({
  13618. intentState: I,
  13619. reason: g,
  13620. force: C = !1
  13621. }) {
  13622. if (I.streamReader) {
  13623. if (I.streamReaderCancelTimeout && (clearTimeout(I.streamReaderCancelTimeout), I.streamReaderCancelTimeout = null), !C) {
  13624. if (I.renderTasks.size > 0)
  13625. return;
  13626. if (g instanceof r9) {
  13627. let i = Pcg;
  13628. g.extraDelay > 0 && g.extraDelay < 1e3 && (i += g.extraDelay), I.streamReaderCancelTimeout = setTimeout(() => {
  13629. I.streamReaderCancelTimeout = null, this._abortOperatorList({
  13630. intentState: I,
  13631. reason: g,
  13632. force: !0
  13633. });
  13634. }, i);
  13635. return;
  13636. }
  13637. }
  13638. if (I.streamReader.cancel(new Ea(g.message)).catch(() => {
  13639. }), I.streamReader = null, !this._transport.destroyed) {
  13640. for (const [i, e] of this._intentStates)
  13641. if (e === I) {
  13642. this._intentStates.delete(i);
  13643. break;
  13644. }
  13645. this.cleanup();
  13646. }
  13647. }
  13648. }
  13649. get stats() {
  13650. return this._stats;
  13651. }
  13652. }
  13653. Rl = new WeakMap(), fc = new WeakSet(), _u = function() {
  13654. if (!M(this, Rl) || this.destroyed)
  13655. return !1;
  13656. for (const {
  13657. renderTasks: I,
  13658. operatorList: g
  13659. } of this._intentStates.values())
  13660. if (I.size > 0 || !g.lastChunk)
  13661. return !1;
  13662. return this._intentStates.clear(), this.objs.clear(), $(this, Rl, !1), !0;
  13663. };
  13664. var fl, LV;
  13665. class idg {
  13666. constructor() {
  13667. tg(this, fl, /* @__PURE__ */ new Map());
  13668. tg(this, LV, Promise.resolve());
  13669. }
  13670. postMessage(I, g) {
  13671. const C = {
  13672. data: structuredClone(I, g ? {
  13673. transfer: g
  13674. } : null)
  13675. };
  13676. M(this, LV).then(() => {
  13677. for (const [i] of M(this, fl))
  13678. i.call(this, C);
  13679. });
  13680. }
  13681. addEventListener(I, g, C = null) {
  13682. let i = null;
  13683. if ((C == null ? void 0 : C.signal) instanceof AbortSignal) {
  13684. const {
  13685. signal: e
  13686. } = C;
  13687. if (e.aborted) {
  13688. DI("LoopbackPort - cannot use an `aborted` signal.");
  13689. return;
  13690. }
  13691. const A = () => this.removeEventListener(I, g);
  13692. i = () => e.removeEventListener("abort", A), e.addEventListener("abort", A);
  13693. }
  13694. M(this, fl).set(g, i);
  13695. }
  13696. removeEventListener(I, g) {
  13697. const C = M(this, fl).get(g);
  13698. C == null || C(), M(this, fl).delete(g);
  13699. }
  13700. terminate() {
  13701. for (const [, I] of M(this, fl))
  13702. I == null || I();
  13703. M(this, fl).clear();
  13704. }
  13705. }
  13706. fl = new WeakMap(), LV = new WeakMap();
  13707. var vV, Hc, Xc, jh, pN, Qh, BN;
  13708. const FC = class FC {
  13709. constructor({
  13710. name: I = null,
  13711. port: g = null,
  13712. verbosity: C = vog()
  13713. } = {}) {
  13714. tg(this, jh);
  13715. var i;
  13716. if (this.name = I, this.destroyed = !1, this.verbosity = C, this._readyCapability = Promise.withResolvers(), this._port = null, this._webWorker = null, this._messageHandler = null, g) {
  13717. if ((i = M(FC, Xc)) != null && i.has(g))
  13718. throw new Error("Cannot use more than one PDFWorker per port.");
  13719. (M(FC, Xc) || $(FC, Xc, /* @__PURE__ */ new WeakMap())).set(g, this), this._initializeFromPort(g);
  13720. return;
  13721. }
  13722. this._initialize();
  13723. }
  13724. get promise() {
  13725. return this._readyCapability.promise;
  13726. }
  13727. get port() {
  13728. return this._port;
  13729. }
  13730. get messageHandler() {
  13731. return this._messageHandler;
  13732. }
  13733. _initializeFromPort(I) {
  13734. this._port = I, this._messageHandler = new Qu("main", "worker", I), this._messageHandler.on("ready", function() {
  13735. }), ig(this, jh, pN).call(this);
  13736. }
  13737. _initialize() {
  13738. if (M(FC, Hc) || M(FC, Qh, BN)) {
  13739. this._setupFakeWorker();
  13740. return;
  13741. }
  13742. let {
  13743. workerSrc: I
  13744. } = FC;
  13745. try {
  13746. FC._isSameOrigin(window.location, I) || (I = FC._createCDNWrapper(new URL(I, window.location).href));
  13747. const g = new Worker(I, {
  13748. type: "module"
  13749. }), C = new Qu("main", "worker", g), i = () => {
  13750. e.abort(), C.destroy(), g.terminate(), this.destroyed ? this._readyCapability.reject(new Error("Worker was destroyed")) : this._setupFakeWorker();
  13751. }, e = new AbortController();
  13752. g.addEventListener("error", () => {
  13753. this._webWorker || i();
  13754. }, {
  13755. signal: e.signal
  13756. }), C.on("test", (s) => {
  13757. if (e.abort(), this.destroyed || !s) {
  13758. i();
  13759. return;
  13760. }
  13761. this._messageHandler = C, this._port = g, this._webWorker = g, ig(this, jh, pN).call(this);
  13762. }), C.on("ready", (s) => {
  13763. if (e.abort(), this.destroyed) {
  13764. i();
  13765. return;
  13766. }
  13767. try {
  13768. A();
  13769. } catch {
  13770. this._setupFakeWorker();
  13771. }
  13772. });
  13773. const A = () => {
  13774. const s = new Uint8Array();
  13775. C.send("test", s, [s.buffer]);
  13776. };
  13777. A();
  13778. return;
  13779. } catch {
  13780. qV("The worker has been disabled.");
  13781. }
  13782. this._setupFakeWorker();
  13783. }
  13784. _setupFakeWorker() {
  13785. M(FC, Hc) || (DI("Setting up fake worker."), $(FC, Hc, !0)), FC._setupFakeWorkerGlobal.then((I) => {
  13786. if (this.destroyed) {
  13787. this._readyCapability.reject(new Error("Worker was destroyed"));
  13788. return;
  13789. }
  13790. const g = new idg();
  13791. this._port = g;
  13792. const C = `fake${Wi(FC, vV)._++}`, i = new Qu(C + "_worker", C, g);
  13793. I.setup(i, g), this._messageHandler = new Qu(C, C + "_worker", g), ig(this, jh, pN).call(this);
  13794. }).catch((I) => {
  13795. this._readyCapability.reject(new Error(`Setting up fake worker failed: "${I.message}".`));
  13796. });
  13797. }
  13798. destroy() {
  13799. var I, g, C;
  13800. this.destroyed = !0, (I = this._webWorker) == null || I.terminate(), this._webWorker = null, (g = M(FC, Xc)) == null || g.delete(this._port), this._port = null, (C = this._messageHandler) == null || C.destroy(), this._messageHandler = null;
  13801. }
  13802. static fromPort(I) {
  13803. var C;
  13804. if (!(I != null && I.port))
  13805. throw new Error("PDFWorker.fromPort - invalid method signature.");
  13806. const g = (C = M(this, Xc)) == null ? void 0 : C.get(I.port);
  13807. if (g) {
  13808. if (g._pendingDestroy)
  13809. throw new Error("PDFWorker.fromPort - the worker is being destroyed.\nPlease remember to await `PDFDocumentLoadingTask.destroy()`-calls.");
  13810. return g;
  13811. }
  13812. return new FC(I);
  13813. }
  13814. static get workerSrc() {
  13815. if (Ql.workerSrc)
  13816. return Ql.workerSrc;
  13817. throw new Error('No "GlobalWorkerOptions.workerSrc" specified.');
  13818. }
  13819. static get _setupFakeWorkerGlobal() {
  13820. return UI(this, "_setupFakeWorkerGlobal", (async () => M(this, Qh, BN) ? M(this, Qh, BN) : (await import(
  13821. /*webpackIgnore: true*/
  13822. /*@vite-ignore*/
  13823. this.workerSrc
  13824. )).WorkerMessageHandler)());
  13825. }
  13826. };
  13827. vV = new WeakMap(), Hc = new WeakMap(), Xc = new WeakMap(), jh = new WeakSet(), pN = function() {
  13828. this._readyCapability.resolve(), this._messageHandler.send("configure", {
  13829. verbosity: this.verbosity
  13830. });
  13831. }, Qh = new WeakSet(), BN = function() {
  13832. var I;
  13833. try {
  13834. return ((I = globalThis.pdfjsWorker) == null ? void 0 : I.WorkerMessageHandler) || null;
  13835. } catch {
  13836. return null;
  13837. }
  13838. }, tg(FC, Qh), tg(FC, vV, 0), tg(FC, Hc, !1), tg(FC, Xc), $t && ($(FC, Hc, !0), Ql.workerSrc || (Ql.workerSrc = "./pdf.worker.mjs")), FC._isSameOrigin = (I, g) => {
  13839. const C = URL.parse(I);
  13840. if (!(C != null && C.origin) || C.origin === "null")
  13841. return !1;
  13842. const i = new URL(g, C);
  13843. return C.origin === i.origin;
  13844. }, FC._createCDNWrapper = (I) => {
  13845. const g = `await import("${I}");`;
  13846. return URL.createObjectURL(new Blob([g], {
  13847. type: "text/javascript"
  13848. }));
  13849. };
  13850. let ch = FC;
  13851. var Hl, ys, Oh, Uh, Xl, Sc, qu;
  13852. class edg {
  13853. constructor(I, g, C, i, e) {
  13854. tg(this, Sc);
  13855. tg(this, Hl, /* @__PURE__ */ new Map());
  13856. tg(this, ys, /* @__PURE__ */ new Map());
  13857. tg(this, Oh, /* @__PURE__ */ new Map());
  13858. tg(this, Uh, /* @__PURE__ */ new Map());
  13859. tg(this, Xl, null);
  13860. this.messageHandler = I, this.loadingTask = g, this.commonObjs = new Xgg(), this.fontLoader = new scg({
  13861. ownerDocument: i.ownerDocument,
  13862. styleElement: i.styleElement
  13863. }), this.loadingParams = i.loadingParams, this._params = i, this.canvasFactory = e.canvasFactory, this.filterFactory = e.filterFactory, this.cMapReaderFactory = e.cMapReaderFactory, this.standardFontDataFactory = e.standardFontDataFactory, this.wasmFactory = e.wasmFactory, this.destroyed = !1, this.destroyCapability = null, this._networkStream = C, this._fullReader = null, this._lastProgress = null, this.downloadInfoCapability = Promise.withResolvers(), this.setupMessageHandler();
  13864. }
  13865. get annotationStorage() {
  13866. return UI(this, "annotationStorage", new Z9());
  13867. }
  13868. getRenderingIntent(I, g = la.ENABLE, C = null, i = !1, e = !1) {
  13869. let A = ye.DISPLAY, s = oS;
  13870. switch (I) {
  13871. case "any":
  13872. A = ye.ANY;
  13873. break;
  13874. case "display":
  13875. break;
  13876. case "print":
  13877. A = ye.PRINT;
  13878. break;
  13879. default:
  13880. DI(`getRenderingIntent - invalid intent: ${I}`);
  13881. }
  13882. const l = A & ye.PRINT && C instanceof cgg ? C : this.annotationStorage;
  13883. switch (g) {
  13884. case la.DISABLE:
  13885. A += ye.ANNOTATIONS_DISABLE;
  13886. break;
  13887. case la.ENABLE:
  13888. break;
  13889. case la.ENABLE_FORMS:
  13890. A += ye.ANNOTATIONS_FORMS;
  13891. break;
  13892. case la.ENABLE_STORAGE:
  13893. A += ye.ANNOTATIONS_STORAGE, s = l.serializable;
  13894. break;
  13895. default:
  13896. DI(`getRenderingIntent - invalid annotationMode: ${g}`);
  13897. }
  13898. i && (A += ye.IS_EDITING), e && (A += ye.OPLIST);
  13899. const {
  13900. ids: n,
  13901. hash: a
  13902. } = l.modifiedIds, d = [A, s.hash, a];
  13903. return {
  13904. renderingIntent: A,
  13905. cacheKey: d.join("_"),
  13906. annotationStorageSerializable: s,
  13907. modifiedIds: n
  13908. };
  13909. }
  13910. destroy() {
  13911. var C;
  13912. if (this.destroyCapability)
  13913. return this.destroyCapability.promise;
  13914. this.destroyed = !0, this.destroyCapability = Promise.withResolvers(), (C = M(this, Xl)) == null || C.reject(new Error("Worker was destroyed during onPassword callback"));
  13915. const I = [];
  13916. for (const i of M(this, ys).values())
  13917. I.push(i._destroy());
  13918. M(this, ys).clear(), M(this, Oh).clear(), M(this, Uh).clear(), this.hasOwnProperty("annotationStorage") && this.annotationStorage.resetModified();
  13919. const g = this.messageHandler.sendWithPromise("Terminate", null);
  13920. return I.push(g), Promise.all(I).then(() => {
  13921. var i, e;
  13922. this.commonObjs.clear(), this.fontLoader.clear(), M(this, Hl).clear(), this.filterFactory.destroy(), Mm.cleanup(), (i = this._networkStream) == null || i.cancelAllRequests(new Ea("Worker was terminated.")), (e = this.messageHandler) == null || e.destroy(), this.messageHandler = null, this.destroyCapability.resolve();
  13923. }, this.destroyCapability.reject), this.destroyCapability.promise;
  13924. }
  13925. setupMessageHandler() {
  13926. const {
  13927. messageHandler: I,
  13928. loadingTask: g
  13929. } = this;
  13930. I.on("GetReader", (C, i) => {
  13931. ut(this._networkStream, "GetReader - no `IPDFStream` instance available."), this._fullReader = this._networkStream.getFullReader(), this._fullReader.onProgress = (e) => {
  13932. this._lastProgress = {
  13933. loaded: e.loaded,
  13934. total: e.total
  13935. };
  13936. }, i.onPull = () => {
  13937. this._fullReader.read().then(function({
  13938. value: e,
  13939. done: A
  13940. }) {
  13941. if (A) {
  13942. i.close();
  13943. return;
  13944. }
  13945. ut(e instanceof ArrayBuffer, "GetReader - expected an ArrayBuffer."), i.enqueue(new Uint8Array(e), 1, [e]);
  13946. }).catch((e) => {
  13947. i.error(e);
  13948. });
  13949. }, i.onCancel = (e) => {
  13950. this._fullReader.cancel(e), i.ready.catch((A) => {
  13951. if (!this.destroyed)
  13952. throw A;
  13953. });
  13954. };
  13955. }), I.on("ReaderHeadersReady", async (C) => {
  13956. var s;
  13957. await this._fullReader.headersReady;
  13958. const {
  13959. isStreamingSupported: i,
  13960. isRangeSupported: e,
  13961. contentLength: A
  13962. } = this._fullReader;
  13963. return (!i || !e) && (this._lastProgress && ((s = g.onProgress) == null || s.call(g, this._lastProgress)), this._fullReader.onProgress = (l) => {
  13964. var n;
  13965. (n = g.onProgress) == null || n.call(g, {
  13966. loaded: l.loaded,
  13967. total: l.total
  13968. });
  13969. }), {
  13970. isStreamingSupported: i,
  13971. isRangeSupported: e,
  13972. contentLength: A
  13973. };
  13974. }), I.on("GetRangeReader", (C, i) => {
  13975. ut(this._networkStream, "GetRangeReader - no `IPDFStream` instance available.");
  13976. const e = this._networkStream.getRangeReader(C.begin, C.end);
  13977. if (!e) {
  13978. i.close();
  13979. return;
  13980. }
  13981. i.onPull = () => {
  13982. e.read().then(function({
  13983. value: A,
  13984. done: s
  13985. }) {
  13986. if (s) {
  13987. i.close();
  13988. return;
  13989. }
  13990. ut(A instanceof ArrayBuffer, "GetRangeReader - expected an ArrayBuffer."), i.enqueue(new Uint8Array(A), 1, [A]);
  13991. }).catch((A) => {
  13992. i.error(A);
  13993. });
  13994. }, i.onCancel = (A) => {
  13995. e.cancel(A), i.ready.catch((s) => {
  13996. if (!this.destroyed)
  13997. throw s;
  13998. });
  13999. };
  14000. }), I.on("GetDoc", ({
  14001. pdfInfo: C
  14002. }) => {
  14003. this._numPages = C.numPages, this._htmlForXfa = C.htmlForXfa, delete C.htmlForXfa, g._capability.resolve(new Cdg(C, this));
  14004. }), I.on("DocException", (C) => {
  14005. g._capability.reject(xi(C));
  14006. }), I.on("PasswordRequest", (C) => {
  14007. $(this, Xl, Promise.withResolvers());
  14008. try {
  14009. if (!g.onPassword)
  14010. throw xi(C);
  14011. const i = (e) => {
  14012. e instanceof Error ? M(this, Xl).reject(e) : M(this, Xl).resolve({
  14013. password: e
  14014. });
  14015. };
  14016. g.onPassword(i, C.code);
  14017. } catch (i) {
  14018. M(this, Xl).reject(i);
  14019. }
  14020. return M(this, Xl).promise;
  14021. }), I.on("DataLoaded", (C) => {
  14022. var i;
  14023. (i = g.onProgress) == null || i.call(g, {
  14024. loaded: C.length,
  14025. total: C.length
  14026. }), this.downloadInfoCapability.resolve(C);
  14027. }), I.on("StartRenderPage", (C) => {
  14028. if (this.destroyed)
  14029. return;
  14030. M(this, ys).get(C.pageIndex)._startRenderPage(C.transparency, C.cacheKey);
  14031. }), I.on("commonobj", ([C, i, e]) => {
  14032. var A;
  14033. if (this.destroyed || this.commonObjs.has(C))
  14034. return null;
  14035. switch (i) {
  14036. case "Font":
  14037. if ("error" in e) {
  14038. const a = e.error;
  14039. DI(`Error during font loading: ${a}`), this.commonObjs.resolve(C, a);
  14040. break;
  14041. }
  14042. const s = this._params.pdfBug && ((A = globalThis.FontInspector) != null && A.enabled) ? (a, d) => globalThis.FontInspector.fontAdded(a, d) : null, l = new lcg(e, s);
  14043. this.fontLoader.bind(l).catch(() => I.sendWithPromise("FontFallback", {
  14044. id: C
  14045. })).finally(() => {
  14046. !l.fontExtraProperties && l.data && (l.data = null), this.commonObjs.resolve(C, l);
  14047. });
  14048. break;
  14049. case "CopyLocalImage":
  14050. const {
  14051. imageRef: n
  14052. } = e;
  14053. ut(n, "The imageRef must be defined.");
  14054. for (const a of M(this, ys).values())
  14055. for (const [, d] of a.objs)
  14056. if ((d == null ? void 0 : d.ref) === n)
  14057. return d.dataLen ? (this.commonObjs.resolve(C, structuredClone(d)), d.dataLen) : null;
  14058. break;
  14059. case "FontPath":
  14060. case "Image":
  14061. case "Pattern":
  14062. this.commonObjs.resolve(C, e);
  14063. break;
  14064. default:
  14065. throw new Error(`Got unknown common object type ${i}`);
  14066. }
  14067. return null;
  14068. }), I.on("obj", ([C, i, e, A]) => {
  14069. var l;
  14070. if (this.destroyed)
  14071. return;
  14072. const s = M(this, ys).get(i);
  14073. if (!s.objs.has(C)) {
  14074. if (s._intentStates.size === 0) {
  14075. (l = A == null ? void 0 : A.bitmap) == null || l.close();
  14076. return;
  14077. }
  14078. switch (e) {
  14079. case "Image":
  14080. case "Pattern":
  14081. s.objs.resolve(C, A);
  14082. break;
  14083. default:
  14084. throw new Error(`Got unknown object type ${e}`);
  14085. }
  14086. }
  14087. }), I.on("DocProgress", (C) => {
  14088. var i;
  14089. this.destroyed || (i = g.onProgress) == null || i.call(g, {
  14090. loaded: C.loaded,
  14091. total: C.total
  14092. });
  14093. }), I.on("FetchBinaryData", async (C) => {
  14094. if (this.destroyed)
  14095. throw new Error("Worker was destroyed.");
  14096. const i = this[C.type];
  14097. if (!i)
  14098. throw new Error(`${C.type} not initialized, see the \`useWorkerFetch\` parameter.`);
  14099. return i.fetch(C);
  14100. });
  14101. }
  14102. getData() {
  14103. return this.messageHandler.sendWithPromise("GetData", null);
  14104. }
  14105. saveDocument() {
  14106. var C;
  14107. this.annotationStorage.size <= 0 && DI("saveDocument called while `annotationStorage` is empty, please use the getData-method instead.");
  14108. const {
  14109. map: I,
  14110. transfer: g
  14111. } = this.annotationStorage.serializable;
  14112. return this.messageHandler.sendWithPromise("SaveDocument", {
  14113. isPureXfa: !!this._htmlForXfa,
  14114. numPages: this._numPages,
  14115. annotationStorage: I,
  14116. filename: ((C = this._fullReader) == null ? void 0 : C.filename) ?? null
  14117. }, g).finally(() => {
  14118. this.annotationStorage.resetModified();
  14119. });
  14120. }
  14121. getPage(I) {
  14122. if (!Number.isInteger(I) || I <= 0 || I > this._numPages)
  14123. return Promise.reject(new Error("Invalid page request."));
  14124. const g = I - 1, C = M(this, Oh).get(g);
  14125. if (C)
  14126. return C;
  14127. const i = this.messageHandler.sendWithPromise("GetPage", {
  14128. pageIndex: g
  14129. }).then((e) => {
  14130. if (this.destroyed)
  14131. throw new Error("Transport destroyed");
  14132. e.refStr && M(this, Uh).set(e.refStr, I);
  14133. const A = new tdg(g, e, this, this._params.pdfBug);
  14134. return M(this, ys).set(g, A), A;
  14135. });
  14136. return M(this, Oh).set(g, i), i;
  14137. }
  14138. getPageIndex(I) {
  14139. return pS(I) ? this.messageHandler.sendWithPromise("GetPageIndex", {
  14140. num: I.num,
  14141. gen: I.gen
  14142. }) : Promise.reject(new Error("Invalid pageIndex request."));
  14143. }
  14144. getAnnotations(I, g) {
  14145. return this.messageHandler.sendWithPromise("GetAnnotations", {
  14146. pageIndex: I,
  14147. intent: g
  14148. });
  14149. }
  14150. getFieldObjects() {
  14151. return ig(this, Sc, qu).call(this, "GetFieldObjects");
  14152. }
  14153. hasJSActions() {
  14154. return ig(this, Sc, qu).call(this, "HasJSActions");
  14155. }
  14156. getCalculationOrderIds() {
  14157. return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null);
  14158. }
  14159. getDestinations() {
  14160. return this.messageHandler.sendWithPromise("GetDestinations", null);
  14161. }
  14162. getDestination(I) {
  14163. return typeof I != "string" ? Promise.reject(new Error("Invalid destination request.")) : this.messageHandler.sendWithPromise("GetDestination", {
  14164. id: I
  14165. });
  14166. }
  14167. getPageLabels() {
  14168. return this.messageHandler.sendWithPromise("GetPageLabels", null);
  14169. }
  14170. getPageLayout() {
  14171. return this.messageHandler.sendWithPromise("GetPageLayout", null);
  14172. }
  14173. getPageMode() {
  14174. return this.messageHandler.sendWithPromise("GetPageMode", null);
  14175. }
  14176. getViewerPreferences() {
  14177. return this.messageHandler.sendWithPromise("GetViewerPreferences", null);
  14178. }
  14179. getOpenAction() {
  14180. return this.messageHandler.sendWithPromise("GetOpenAction", null);
  14181. }
  14182. getAttachments() {
  14183. return this.messageHandler.sendWithPromise("GetAttachments", null);
  14184. }
  14185. getDocJSActions() {
  14186. return ig(this, Sc, qu).call(this, "GetDocJSActions");
  14187. }
  14188. getPageJSActions(I) {
  14189. return this.messageHandler.sendWithPromise("GetPageJSActions", {
  14190. pageIndex: I
  14191. });
  14192. }
  14193. getStructTree(I) {
  14194. return this.messageHandler.sendWithPromise("GetStructTree", {
  14195. pageIndex: I
  14196. });
  14197. }
  14198. getOutline() {
  14199. return this.messageHandler.sendWithPromise("GetOutline", null);
  14200. }
  14201. getOptionalContentConfig(I) {
  14202. return ig(this, Sc, qu).call(this, "GetOptionalContentConfig").then((g) => new fcg(g, I));
  14203. }
  14204. getPermissions() {
  14205. return this.messageHandler.sendWithPromise("GetPermissions", null);
  14206. }
  14207. getMetadata() {
  14208. const I = "GetMetadata", g = M(this, Hl).get(I);
  14209. if (g)
  14210. return g;
  14211. const C = this.messageHandler.sendWithPromise(I, null).then((i) => {
  14212. var e, A;
  14213. return {
  14214. info: i[0],
  14215. metadata: i[1] ? new Mcg(i[1]) : null,
  14216. contentDispositionFilename: ((e = this._fullReader) == null ? void 0 : e.filename) ?? null,
  14217. contentLength: ((A = this._fullReader) == null ? void 0 : A.contentLength) ?? null
  14218. };
  14219. });
  14220. return M(this, Hl).set(I, C), C;
  14221. }
  14222. getMarkInfo() {
  14223. return this.messageHandler.sendWithPromise("GetMarkInfo", null);
  14224. }
  14225. async startCleanup(I = !1) {
  14226. if (!this.destroyed) {
  14227. await this.messageHandler.sendWithPromise("Cleanup", null);
  14228. for (const g of M(this, ys).values())
  14229. if (!g.cleanup())
  14230. throw new Error(`startCleanup: Page ${g.pageNumber} is currently rendering.`);
  14231. this.commonObjs.clear(), I || this.fontLoader.clear(), M(this, Hl).clear(), this.filterFactory.destroy(!0), Mm.cleanup();
  14232. }
  14233. }
  14234. cachedPageNumber(I) {
  14235. if (!pS(I))
  14236. return null;
  14237. const g = I.gen === 0 ? `${I.num}R` : `${I.num}R${I.gen}`;
  14238. return M(this, Uh).get(g) ?? null;
  14239. }
  14240. }
  14241. Hl = new WeakMap(), ys = new WeakMap(), Oh = new WeakMap(), Uh = new WeakMap(), Xl = new WeakMap(), Sc = new WeakSet(), qu = function(I, g = null) {
  14242. const C = M(this, Hl).get(I);
  14243. if (C)
  14244. return C;
  14245. const i = this.messageHandler.sendWithPromise(I, g);
  14246. return M(this, Hl).set(I, i), i;
  14247. };
  14248. const Xu = Symbol("INITIAL_DATA");
  14249. var he, wZ, WS;
  14250. class Xgg {
  14251. constructor() {
  14252. tg(this, wZ);
  14253. tg(this, he, /* @__PURE__ */ Object.create(null));
  14254. }
  14255. get(I, g = null) {
  14256. if (g) {
  14257. const i = ig(this, wZ, WS).call(this, I);
  14258. return i.promise.then(() => g(i.data)), null;
  14259. }
  14260. const C = M(this, he)[I];
  14261. if (!C || C.data === Xu)
  14262. throw new Error(`Requesting object that isn't resolved yet ${I}.`);
  14263. return C.data;
  14264. }
  14265. has(I) {
  14266. const g = M(this, he)[I];
  14267. return !!g && g.data !== Xu;
  14268. }
  14269. delete(I) {
  14270. const g = M(this, he)[I];
  14271. return !g || g.data === Xu ? !1 : (delete M(this, he)[I], !0);
  14272. }
  14273. resolve(I, g = null) {
  14274. const C = ig(this, wZ, WS).call(this, I);
  14275. C.data = g, C.resolve();
  14276. }
  14277. clear() {
  14278. var I;
  14279. for (const g in M(this, he)) {
  14280. const {
  14281. data: C
  14282. } = M(this, he)[g];
  14283. (I = C == null ? void 0 : C.bitmap) == null || I.close();
  14284. }
  14285. $(this, he, /* @__PURE__ */ Object.create(null));
  14286. }
  14287. *[Symbol.iterator]() {
  14288. for (const I in M(this, he)) {
  14289. const {
  14290. data: g
  14291. } = M(this, he)[I];
  14292. g !== Xu && (yield [I, g]);
  14293. }
  14294. }
  14295. }
  14296. he = new WeakMap(), wZ = new WeakSet(), WS = function(I) {
  14297. var g;
  14298. return (g = M(this, he))[I] || (g[I] = {
  14299. ...Promise.withResolvers(),
  14300. data: Xu
  14301. });
  14302. };
  14303. var Ma;
  14304. class Adg {
  14305. constructor(I) {
  14306. tg(this, Ma, null);
  14307. iI(this, "onContinue", null);
  14308. iI(this, "onError", null);
  14309. $(this, Ma, I);
  14310. }
  14311. get promise() {
  14312. return M(this, Ma).capability.promise;
  14313. }
  14314. cancel(I = 0) {
  14315. M(this, Ma).cancel(null, I);
  14316. }
  14317. get separateAnnots() {
  14318. const {
  14319. separateAnnots: I
  14320. } = M(this, Ma).operatorList;
  14321. if (!I)
  14322. return !1;
  14323. const {
  14324. annotationCanvasMap: g
  14325. } = M(this, Ma);
  14326. return I.form || I.canvas && (g == null ? void 0 : g.size) > 0;
  14327. }
  14328. }
  14329. Ma = new WeakMap();
  14330. var Ra, Dc;
  14331. const qo = class qo {
  14332. constructor({
  14333. callback: I,
  14334. params: g,
  14335. objs: C,
  14336. commonObjs: i,
  14337. annotationCanvasMap: e,
  14338. operatorList: A,
  14339. pageIndex: s,
  14340. canvasFactory: l,
  14341. filterFactory: n,
  14342. useRequestAnimationFrame: a = !1,
  14343. pdfBug: d = !1,
  14344. pageColors: o = null
  14345. }) {
  14346. tg(this, Ra, null);
  14347. this.callback = I, this.params = g, this.objs = C, this.commonObjs = i, this.annotationCanvasMap = e, this.operatorListIdx = null, this.operatorList = A, this._pageIndex = s, this.canvasFactory = l, this.filterFactory = n, this._pdfBug = d, this.pageColors = o, this.running = !1, this.graphicsReadyCallback = null, this.graphicsReady = !1, this._useRequestAnimationFrame = a === !0 && typeof window < "u", this.cancelled = !1, this.capability = Promise.withResolvers(), this.task = new Adg(this), this._cancelBound = this.cancel.bind(this), this._continueBound = this._continue.bind(this), this._scheduleNextBound = this._scheduleNext.bind(this), this._nextBound = this._next.bind(this), this._canvas = g.canvasContext.canvas;
  14348. }
  14349. get completed() {
  14350. return this.capability.promise.catch(function() {
  14351. });
  14352. }
  14353. initializeGraphics({
  14354. transparency: I = !1,
  14355. optionalContentConfig: g
  14356. }) {
  14357. var s, l;
  14358. if (this.cancelled)
  14359. return;
  14360. if (this._canvas) {
  14361. if (M(qo, Dc).has(this._canvas))
  14362. throw new Error("Cannot use the same canvas during multiple render() operations. Use different canvas or ensure previous operations were cancelled or completed.");
  14363. M(qo, Dc).add(this._canvas);
  14364. }
  14365. this._pdfBug && ((s = globalThis.StepperManager) != null && s.enabled) && (this.stepper = globalThis.StepperManager.create(this._pageIndex), this.stepper.init(this.operatorList), this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint());
  14366. const {
  14367. canvasContext: C,
  14368. viewport: i,
  14369. transform: e,
  14370. background: A
  14371. } = this.params;
  14372. this.gfx = new oh(C, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {
  14373. optionalContentConfig: g
  14374. }, this.annotationCanvasMap, this.pageColors), this.gfx.beginDrawing({
  14375. transform: e,
  14376. viewport: i,
  14377. transparency: I,
  14378. background: A
  14379. }), this.operatorListIdx = 0, this.graphicsReady = !0, (l = this.graphicsReadyCallback) == null || l.call(this);
  14380. }
  14381. cancel(I = null, g = 0) {
  14382. var C, i, e;
  14383. this.running = !1, this.cancelled = !0, (C = this.gfx) == null || C.endDrawing(), M(this, Ra) && (window.cancelAnimationFrame(M(this, Ra)), $(this, Ra, null)), M(qo, Dc).delete(this._canvas), I || (I = new r9(`Rendering cancelled, page ${this._pageIndex + 1}`, g)), this.callback(I), (e = (i = this.task).onError) == null || e.call(i, I);
  14384. }
  14385. operatorListChanged() {
  14386. var I;
  14387. if (!this.graphicsReady) {
  14388. this.graphicsReadyCallback || (this.graphicsReadyCallback = this._continueBound);
  14389. return;
  14390. }
  14391. (I = this.stepper) == null || I.updateOperatorList(this.operatorList), !this.running && this._continue();
  14392. }
  14393. _continue() {
  14394. this.running = !0, !this.cancelled && (this.task.onContinue ? this.task.onContinue(this._scheduleNextBound) : this._scheduleNext());
  14395. }
  14396. _scheduleNext() {
  14397. this._useRequestAnimationFrame ? $(this, Ra, window.requestAnimationFrame(() => {
  14398. $(this, Ra, null), this._nextBound().catch(this._cancelBound);
  14399. })) : Promise.resolve().then(this._nextBound).catch(this._cancelBound);
  14400. }
  14401. async _next() {
  14402. this.cancelled || (this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper), this.operatorListIdx === this.operatorList.argsArray.length && (this.running = !1, this.operatorList.lastChunk && (this.gfx.endDrawing(), M(qo, Dc).delete(this._canvas), this.callback())));
  14403. }
  14404. };
  14405. Ra = new WeakMap(), Dc = new WeakMap(), tg(qo, Dc, /* @__PURE__ */ new WeakSet());
  14406. let yS = qo;
  14407. const sdg = "5.1.91", ldg = "45cbe8bb0";
  14408. function u8(t) {
  14409. return Math.floor(Math.max(0, Math.min(1, t)) * 255).toString(16).padStart(2, "0");
  14410. }
  14411. function Su(t) {
  14412. return Math.max(0, Math.min(255, 255 * t));
  14413. }
  14414. class m8 {
  14415. static CMYK_G([I, g, C, i]) {
  14416. return ["G", 1 - Math.min(1, 0.3 * I + 0.59 * C + 0.11 * g + i)];
  14417. }
  14418. static G_CMYK([I]) {
  14419. return ["CMYK", 0, 0, 0, 1 - I];
  14420. }
  14421. static G_RGB([I]) {
  14422. return ["RGB", I, I, I];
  14423. }
  14424. static G_rgb([I]) {
  14425. return I = Su(I), [I, I, I];
  14426. }
  14427. static G_HTML([I]) {
  14428. const g = u8(I);
  14429. return `#${g}${g}${g}`;
  14430. }
  14431. static RGB_G([I, g, C]) {
  14432. return ["G", 0.3 * I + 0.59 * g + 0.11 * C];
  14433. }
  14434. static RGB_rgb(I) {
  14435. return I.map(Su);
  14436. }
  14437. static RGB_HTML(I) {
  14438. return `#${I.map(u8).join("")}`;
  14439. }
  14440. static T_HTML() {
  14441. return "#00000000";
  14442. }
  14443. static T_rgb() {
  14444. return [null];
  14445. }
  14446. static CMYK_RGB([I, g, C, i]) {
  14447. return ["RGB", 1 - Math.min(1, I + i), 1 - Math.min(1, C + i), 1 - Math.min(1, g + i)];
  14448. }
  14449. static CMYK_rgb([I, g, C, i]) {
  14450. return [Su(1 - Math.min(1, I + i)), Su(1 - Math.min(1, C + i)), Su(1 - Math.min(1, g + i))];
  14451. }
  14452. static CMYK_HTML(I) {
  14453. const g = this.CMYK_RGB(I).slice(1);
  14454. return this.RGB_HTML(g);
  14455. }
  14456. static RGB_CMYK([I, g, C]) {
  14457. const i = 1 - I, e = 1 - g, A = 1 - C, s = Math.min(i, e, A);
  14458. return ["CMYK", i, e, A, s];
  14459. }
  14460. }
  14461. class ndg {
  14462. create(I, g, C = !1) {
  14463. if (I <= 0 || g <= 0)
  14464. throw new Error("Invalid SVG dimensions");
  14465. const i = this._createSVG("svg:svg");
  14466. return i.setAttribute("version", "1.1"), C || (i.setAttribute("width", `${I}px`), i.setAttribute("height", `${g}px`)), i.setAttribute("preserveAspectRatio", "none"), i.setAttribute("viewBox", `0 0 ${I} ${g}`), i;
  14467. }
  14468. createElement(I) {
  14469. if (typeof I != "string")
  14470. throw new Error("Invalid SVG element type");
  14471. return this._createSVG(I);
  14472. }
  14473. _createSVG(I) {
  14474. BC("Abstract method `_createSVG` called.");
  14475. }
  14476. }
  14477. class eV extends ndg {
  14478. _createSVG(I) {
  14479. return document.createElementNS(dl, I);
  14480. }
  14481. }
  14482. class Sgg {
  14483. static setupStorage(I, g, C, i, e) {
  14484. const A = i.getValue(g, {
  14485. value: null
  14486. });
  14487. switch (C.name) {
  14488. case "textarea":
  14489. if (A.value !== null && (I.textContent = A.value), e === "print")
  14490. break;
  14491. I.addEventListener("input", (s) => {
  14492. i.setValue(g, {
  14493. value: s.target.value
  14494. });
  14495. });
  14496. break;
  14497. case "input":
  14498. if (C.attributes.type === "radio" || C.attributes.type === "checkbox") {
  14499. if (A.value === C.attributes.xfaOn ? I.setAttribute("checked", !0) : A.value === C.attributes.xfaOff && I.removeAttribute("checked"), e === "print")
  14500. break;
  14501. I.addEventListener("change", (s) => {
  14502. i.setValue(g, {
  14503. value: s.target.checked ? s.target.getAttribute("xfaOn") : s.target.getAttribute("xfaOff")
  14504. });
  14505. });
  14506. } else {
  14507. if (A.value !== null && I.setAttribute("value", A.value), e === "print")
  14508. break;
  14509. I.addEventListener("input", (s) => {
  14510. i.setValue(g, {
  14511. value: s.target.value
  14512. });
  14513. });
  14514. }
  14515. break;
  14516. case "select":
  14517. if (A.value !== null) {
  14518. I.setAttribute("value", A.value);
  14519. for (const s of C.children)
  14520. s.attributes.value === A.value ? s.attributes.selected = !0 : s.attributes.hasOwnProperty("selected") && delete s.attributes.selected;
  14521. }
  14522. I.addEventListener("input", (s) => {
  14523. const l = s.target.options, n = l.selectedIndex === -1 ? "" : l[l.selectedIndex].value;
  14524. i.setValue(g, {
  14525. value: n
  14526. });
  14527. });
  14528. break;
  14529. }
  14530. }
  14531. static setAttributes({
  14532. html: I,
  14533. element: g,
  14534. storage: C = null,
  14535. intent: i,
  14536. linkService: e
  14537. }) {
  14538. const {
  14539. attributes: A
  14540. } = g, s = I instanceof HTMLAnchorElement;
  14541. A.type === "radio" && (A.name = `${A.name}-${i}`);
  14542. for (const [l, n] of Object.entries(A))
  14543. if (n != null)
  14544. switch (l) {
  14545. case "class":
  14546. n.length && I.setAttribute(l, n.join(" "));
  14547. break;
  14548. case "dataId":
  14549. break;
  14550. case "id":
  14551. I.setAttribute("data-element-id", n);
  14552. break;
  14553. case "style":
  14554. Object.assign(I.style, n);
  14555. break;
  14556. case "textContent":
  14557. I.textContent = n;
  14558. break;
  14559. default:
  14560. (!s || l !== "href" && l !== "newWindow") && I.setAttribute(l, n);
  14561. }
  14562. s && e.addLinkAttributes(I, A.href, A.newWindow), C && A.dataId && this.setupStorage(I, A.dataId, g, C);
  14563. }
  14564. static render(I) {
  14565. var d, o;
  14566. const g = I.annotationStorage, C = I.linkService, i = I.xfaHtml, e = I.intent || "display", A = document.createElement(i.name);
  14567. i.attributes && this.setAttributes({
  14568. html: A,
  14569. element: i,
  14570. intent: e,
  14571. linkService: C
  14572. });
  14573. const s = e !== "richText", l = I.div;
  14574. if (l.append(A), I.viewport) {
  14575. const c = `matrix(${I.viewport.transform.join(",")})`;
  14576. l.style.transform = c;
  14577. }
  14578. s && l.setAttribute("class", "xfaLayer xfaFont");
  14579. const n = [];
  14580. if (i.children.length === 0) {
  14581. if (i.value) {
  14582. const c = document.createTextNode(i.value);
  14583. A.append(c), s && Rm.shouldBuildText(i.name) && n.push(c);
  14584. }
  14585. return {
  14586. textDivs: n
  14587. };
  14588. }
  14589. const a = [[i, -1, A]];
  14590. for (; a.length > 0; ) {
  14591. const [c, r, h] = a.at(-1);
  14592. if (r + 1 === c.children.length) {
  14593. a.pop();
  14594. continue;
  14595. }
  14596. const b = c.children[++a.at(-1)[1]];
  14597. if (b === null)
  14598. continue;
  14599. const {
  14600. name: u
  14601. } = b;
  14602. if (u === "#text") {
  14603. const Z = document.createTextNode(b.value);
  14604. n.push(Z), h.append(Z);
  14605. continue;
  14606. }
  14607. const m = (d = b == null ? void 0 : b.attributes) != null && d.xmlns ? document.createElementNS(b.attributes.xmlns, u) : document.createElement(u);
  14608. if (h.append(m), b.attributes && this.setAttributes({
  14609. html: m,
  14610. element: b,
  14611. storage: g,
  14612. intent: e,
  14613. linkService: C
  14614. }), ((o = b.children) == null ? void 0 : o.length) > 0)
  14615. a.push([b, -1, m]);
  14616. else if (b.value) {
  14617. const Z = document.createTextNode(b.value);
  14618. s && Rm.shouldBuildText(u) && n.push(Z), m.append(Z);
  14619. }
  14620. }
  14621. for (const c of l.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea"))
  14622. c.setAttribute("readOnly", !0);
  14623. return {
  14624. textDivs: n
  14625. };
  14626. }
  14627. static update(I) {
  14628. const g = `matrix(${I.viewport.transform.join(",")})`;
  14629. I.div.style.transform = g, I.div.hidden = !1;
  14630. }
  14631. }
  14632. const aG = 1e3, adg = 9, rd = /* @__PURE__ */ new WeakSet();
  14633. class Z8 {
  14634. static create(I) {
  14635. switch (I.data.annotationType) {
  14636. case dt.LINK:
  14637. return new Dgg(I);
  14638. case dt.TEXT:
  14639. return new odg(I);
  14640. case dt.WIDGET:
  14641. switch (I.data.fieldType) {
  14642. case "Tx":
  14643. return new cdg(I);
  14644. case "Btn":
  14645. return I.data.radioButton ? new kgg(I) : I.data.checkBox ? new rdg(I) : new hdg(I);
  14646. case "Ch":
  14647. return new bdg(I);
  14648. case "Sig":
  14649. return new ddg(I);
  14650. }
  14651. return new md(I);
  14652. case dt.POPUP:
  14653. return new NS(I);
  14654. case dt.FREETEXT:
  14655. return new Tgg(I);
  14656. case dt.LINE:
  14657. return new mdg(I);
  14658. case dt.SQUARE:
  14659. return new Zdg(I);
  14660. case dt.CIRCLE:
  14661. return new Gdg(I);
  14662. case dt.POLYLINE:
  14663. return new xgg(I);
  14664. case dt.CARET:
  14665. return new pdg(I);
  14666. case dt.INK:
  14667. return new p9(I);
  14668. case dt.POLYGON:
  14669. return new wdg(I);
  14670. case dt.HIGHLIGHT:
  14671. return new jgg(I);
  14672. case dt.UNDERLINE:
  14673. return new Bdg(I);
  14674. case dt.SQUIGGLY:
  14675. return new Wdg(I);
  14676. case dt.STRIKEOUT:
  14677. return new ydg(I);
  14678. case dt.STAMP:
  14679. return new Qgg(I);
  14680. case dt.FILEATTACHMENT:
  14681. return new Ydg(I);
  14682. default:
  14683. return new nt(I);
  14684. }
  14685. }
  14686. }
  14687. var Kc, Eh, Ph, pZ, YS;
  14688. const e1 = class e1 {
  14689. constructor(I, {
  14690. isRenderable: g = !1,
  14691. ignoreBorder: C = !1,
  14692. createQuadrilaterals: i = !1
  14693. } = {}) {
  14694. tg(this, pZ);
  14695. tg(this, Kc, null);
  14696. tg(this, Eh, !1);
  14697. tg(this, Ph, null);
  14698. this.isRenderable = g, this.data = I.data, this.layer = I.layer, this.linkService = I.linkService, this.downloadManager = I.downloadManager, this.imageResourcesPath = I.imageResourcesPath, this.renderForms = I.renderForms, this.svgFactory = I.svgFactory, this.annotationStorage = I.annotationStorage, this.enableScripting = I.enableScripting, this.hasJSActions = I.hasJSActions, this._fieldObjects = I.fieldObjects, this.parent = I.parent, g && (this.container = this._createContainer(C)), i && this._createQuadrilaterals();
  14699. }
  14700. static _hasPopupData({
  14701. titleObj: I,
  14702. contentsObj: g,
  14703. richText: C
  14704. }) {
  14705. return !!(I != null && I.str || g != null && g.str || C != null && C.str);
  14706. }
  14707. get _isEditable() {
  14708. return this.data.isEditable;
  14709. }
  14710. get hasPopupData() {
  14711. return e1._hasPopupData(this.data);
  14712. }
  14713. updateEdited(I) {
  14714. var C;
  14715. if (!this.container)
  14716. return;
  14717. M(this, Kc) || $(this, Kc, {
  14718. rect: this.data.rect.slice(0)
  14719. });
  14720. const {
  14721. rect: g
  14722. } = I;
  14723. g && ig(this, pZ, YS).call(this, g), (C = M(this, Ph)) == null || C.popup.updateEdited(I);
  14724. }
  14725. resetEdited() {
  14726. var I;
  14727. M(this, Kc) && (ig(this, pZ, YS).call(this, M(this, Kc).rect), (I = M(this, Ph)) == null || I.popup.resetEdited(), $(this, Kc, null));
  14728. }
  14729. _createContainer(I) {
  14730. const {
  14731. data: g,
  14732. parent: {
  14733. page: C,
  14734. viewport: i
  14735. }
  14736. } = this, e = document.createElement("section");
  14737. e.setAttribute("data-annotation-id", g.id), this instanceof md || (e.tabIndex = aG);
  14738. const {
  14739. style: A
  14740. } = e;
  14741. if (A.zIndex = this.parent.zIndex++, g.alternativeText && (e.title = g.alternativeText), g.noRotate && e.classList.add("norotate"), !g.rect || this instanceof NS) {
  14742. const {
  14743. rotation: h
  14744. } = g;
  14745. return !g.hasOwnCanvas && h !== 0 && this.setRotation(h, e), e;
  14746. }
  14747. const {
  14748. width: s,
  14749. height: l
  14750. } = this;
  14751. if (!I && g.borderStyle.width > 0) {
  14752. A.borderWidth = `${g.borderStyle.width}px`;
  14753. const h = g.borderStyle.horizontalCornerRadius, b = g.borderStyle.verticalCornerRadius;
  14754. if (h > 0 || b > 0) {
  14755. const m = `calc(${h}px * var(--total-scale-factor)) / calc(${b}px * var(--total-scale-factor))`;
  14756. A.borderRadius = m;
  14757. } else if (this instanceof kgg) {
  14758. const m = `calc(${s}px * var(--total-scale-factor)) / calc(${l}px * var(--total-scale-factor))`;
  14759. A.borderRadius = m;
  14760. }
  14761. switch (g.borderStyle.style) {
  14762. case Qr.SOLID:
  14763. A.borderStyle = "solid";
  14764. break;
  14765. case Qr.DASHED:
  14766. A.borderStyle = "dashed";
  14767. break;
  14768. case Qr.BEVELED:
  14769. DI("Unimplemented border style: beveled");
  14770. break;
  14771. case Qr.INSET:
  14772. DI("Unimplemented border style: inset");
  14773. break;
  14774. case Qr.UNDERLINE:
  14775. A.borderBottomStyle = "solid";
  14776. break;
  14777. }
  14778. const u = g.borderColor || null;
  14779. u ? ($(this, Eh, !0), A.borderColor = AI.makeHexColor(u[0] | 0, u[1] | 0, u[2] | 0)) : A.borderWidth = 0;
  14780. }
  14781. const n = AI.normalizeRect([g.rect[0], C.view[3] - g.rect[1] + C.view[1], g.rect[2], C.view[3] - g.rect[3] + C.view[1]]), {
  14782. pageWidth: a,
  14783. pageHeight: d,
  14784. pageX: o,
  14785. pageY: c
  14786. } = i.rawDims;
  14787. A.left = `${100 * (n[0] - o) / a}%`, A.top = `${100 * (n[1] - c) / d}%`;
  14788. const {
  14789. rotation: r
  14790. } = g;
  14791. return g.hasOwnCanvas || r === 0 ? (A.width = `${100 * s / a}%`, A.height = `${100 * l / d}%`) : this.setRotation(r, e), e;
  14792. }
  14793. setRotation(I, g = this.container) {
  14794. if (!this.data.rect)
  14795. return;
  14796. const {
  14797. pageWidth: C,
  14798. pageHeight: i
  14799. } = this.parent.viewport.rawDims;
  14800. let {
  14801. width: e,
  14802. height: A
  14803. } = this;
  14804. I % 180 !== 0 && ([e, A] = [A, e]), g.style.width = `${100 * e / C}%`, g.style.height = `${100 * A / i}%`, g.setAttribute("data-main-rotation", (360 - I) % 360);
  14805. }
  14806. get _commonActions() {
  14807. const I = (g, C, i) => {
  14808. const e = i.detail[g], A = e[0], s = e.slice(1);
  14809. i.target.style[C] = m8[`${A}_HTML`](s), this.annotationStorage.setValue(this.data.id, {
  14810. [C]: m8[`${A}_rgb`](s)
  14811. });
  14812. };
  14813. return UI(this, "_commonActions", {
  14814. display: (g) => {
  14815. const {
  14816. display: C
  14817. } = g.detail, i = C % 2 === 1;
  14818. this.container.style.visibility = i ? "hidden" : "visible", this.annotationStorage.setValue(this.data.id, {
  14819. noView: i,
  14820. noPrint: C === 1 || C === 2
  14821. });
  14822. },
  14823. print: (g) => {
  14824. this.annotationStorage.setValue(this.data.id, {
  14825. noPrint: !g.detail.print
  14826. });
  14827. },
  14828. hidden: (g) => {
  14829. const {
  14830. hidden: C
  14831. } = g.detail;
  14832. this.container.style.visibility = C ? "hidden" : "visible", this.annotationStorage.setValue(this.data.id, {
  14833. noPrint: C,
  14834. noView: C
  14835. });
  14836. },
  14837. focus: (g) => {
  14838. setTimeout(() => g.target.focus({
  14839. preventScroll: !1
  14840. }), 0);
  14841. },
  14842. userName: (g) => {
  14843. g.target.title = g.detail.userName;
  14844. },
  14845. readonly: (g) => {
  14846. g.target.disabled = g.detail.readonly;
  14847. },
  14848. required: (g) => {
  14849. this._setRequired(g.target, g.detail.required);
  14850. },
  14851. bgColor: (g) => {
  14852. I("bgColor", "backgroundColor", g);
  14853. },
  14854. fillColor: (g) => {
  14855. I("fillColor", "backgroundColor", g);
  14856. },
  14857. fgColor: (g) => {
  14858. I("fgColor", "color", g);
  14859. },
  14860. textColor: (g) => {
  14861. I("textColor", "color", g);
  14862. },
  14863. borderColor: (g) => {
  14864. I("borderColor", "borderColor", g);
  14865. },
  14866. strokeColor: (g) => {
  14867. I("strokeColor", "borderColor", g);
  14868. },
  14869. rotation: (g) => {
  14870. const C = g.detail.rotation;
  14871. this.setRotation(C), this.annotationStorage.setValue(this.data.id, {
  14872. rotation: C
  14873. });
  14874. }
  14875. });
  14876. }
  14877. _dispatchEventFromSandbox(I, g) {
  14878. const C = this._commonActions;
  14879. for (const i of Object.keys(g.detail)) {
  14880. const e = I[i] || C[i];
  14881. e == null || e(g);
  14882. }
  14883. }
  14884. _setDefaultPropertiesFromJS(I) {
  14885. if (!this.enableScripting)
  14886. return;
  14887. const g = this.annotationStorage.getRawValue(this.data.id);
  14888. if (!g)
  14889. return;
  14890. const C = this._commonActions;
  14891. for (const [i, e] of Object.entries(g)) {
  14892. const A = C[i];
  14893. if (A) {
  14894. const s = {
  14895. detail: {
  14896. [i]: e
  14897. },
  14898. target: I
  14899. };
  14900. A(s), delete g[i];
  14901. }
  14902. }
  14903. }
  14904. _createQuadrilaterals() {
  14905. if (!this.container)
  14906. return;
  14907. const {
  14908. quadPoints: I
  14909. } = this.data;
  14910. if (!I)
  14911. return;
  14912. const [g, C, i, e] = this.data.rect.map((h) => Math.fround(h));
  14913. if (I.length === 8) {
  14914. const [h, b, u, m] = I.subarray(2, 6);
  14915. if (i === h && e === b && g === u && C === m)
  14916. return;
  14917. }
  14918. const {
  14919. style: A
  14920. } = this.container;
  14921. let s;
  14922. if (M(this, Eh)) {
  14923. const {
  14924. borderColor: h,
  14925. borderWidth: b
  14926. } = A;
  14927. A.borderWidth = 0, s = ["url('data:image/svg+xml;utf8,", '<svg xmlns="http://www.w3.org/2000/svg"', ' preserveAspectRatio="none" viewBox="0 0 1 1">', `<g fill="transparent" stroke="${h}" stroke-width="${b}">`], this.container.classList.add("hasBorder");
  14928. }
  14929. const l = i - g, n = e - C, {
  14930. svgFactory: a
  14931. } = this, d = a.createElement("svg");
  14932. d.classList.add("quadrilateralsContainer"), d.setAttribute("width", 0), d.setAttribute("height", 0);
  14933. const o = a.createElement("defs");
  14934. d.append(o);
  14935. const c = a.createElement("clipPath"), r = `clippath_${this.data.id}`;
  14936. c.setAttribute("id", r), c.setAttribute("clipPathUnits", "objectBoundingBox"), o.append(c);
  14937. for (let h = 2, b = I.length; h < b; h += 8) {
  14938. const u = I[h], m = I[h + 1], Z = I[h + 2], p = I[h + 3], Y = a.createElement("rect"), R = (Z - g) / l, X = (e - m) / n, H = (u - Z) / l, S = (m - p) / n;
  14939. Y.setAttribute("x", R), Y.setAttribute("y", X), Y.setAttribute("width", H), Y.setAttribute("height", S), c.append(Y), s == null || s.push(`<rect vector-effect="non-scaling-stroke" x="${R}" y="${X}" width="${H}" height="${S}"/>`);
  14940. }
  14941. M(this, Eh) && (s.push("</g></svg>')"), A.backgroundImage = s.join("")), this.container.append(d), this.container.style.clipPath = `url(#${r})`;
  14942. }
  14943. _createPopup() {
  14944. const {
  14945. data: I
  14946. } = this, g = $(this, Ph, new NS({
  14947. data: {
  14948. color: I.color,
  14949. titleObj: I.titleObj,
  14950. modificationDate: I.modificationDate,
  14951. contentsObj: I.contentsObj,
  14952. richText: I.richText,
  14953. parentRect: I.rect,
  14954. borderStyle: 0,
  14955. id: `popup_${I.id}`,
  14956. rotation: I.rotation
  14957. },
  14958. parent: this.parent,
  14959. elements: [this]
  14960. }));
  14961. this.parent.div.append(g.render());
  14962. }
  14963. render() {
  14964. BC("Abstract method `AnnotationElement.render` called");
  14965. }
  14966. _getElementsByName(I, g = null) {
  14967. const C = [];
  14968. if (this._fieldObjects) {
  14969. const i = this._fieldObjects[I];
  14970. if (i)
  14971. for (const {
  14972. page: e,
  14973. id: A,
  14974. exportValues: s
  14975. } of i) {
  14976. if (e === -1 || A === g)
  14977. continue;
  14978. const l = typeof s == "string" ? s : null, n = document.querySelector(`[data-element-id="${A}"]`);
  14979. if (n && !rd.has(n)) {
  14980. DI(`_getElementsByName - element not allowed: ${A}`);
  14981. continue;
  14982. }
  14983. C.push({
  14984. id: A,
  14985. exportValue: l,
  14986. domElement: n
  14987. });
  14988. }
  14989. return C;
  14990. }
  14991. for (const i of document.getElementsByName(I)) {
  14992. const {
  14993. exportValue: e
  14994. } = i, A = i.getAttribute("data-element-id");
  14995. A !== g && rd.has(i) && C.push({
  14996. id: A,
  14997. exportValue: e,
  14998. domElement: i
  14999. });
  15000. }
  15001. return C;
  15002. }
  15003. show() {
  15004. var I;
  15005. this.container && (this.container.hidden = !1), (I = this.popup) == null || I.maybeShow();
  15006. }
  15007. hide() {
  15008. var I;
  15009. this.container && (this.container.hidden = !0), (I = this.popup) == null || I.forceHide();
  15010. }
  15011. getElementsToTriggerPopup() {
  15012. return this.container;
  15013. }
  15014. addHighlightArea() {
  15015. const I = this.getElementsToTriggerPopup();
  15016. if (Array.isArray(I))
  15017. for (const g of I)
  15018. g.classList.add("highlightArea");
  15019. else
  15020. I.classList.add("highlightArea");
  15021. }
  15022. _editOnDoubleClick() {
  15023. if (!this._isEditable)
  15024. return;
  15025. const {
  15026. annotationEditorType: I,
  15027. data: {
  15028. id: g
  15029. }
  15030. } = this;
  15031. this.container.addEventListener("dblclick", () => {
  15032. var C;
  15033. (C = this.linkService.eventBus) == null || C.dispatch("switchannotationeditormode", {
  15034. source: this,
  15035. mode: I,
  15036. editId: g
  15037. });
  15038. });
  15039. }
  15040. get width() {
  15041. return this.data.rect[2] - this.data.rect[0];
  15042. }
  15043. get height() {
  15044. return this.data.rect[3] - this.data.rect[1];
  15045. }
  15046. };
  15047. Kc = new WeakMap(), Eh = new WeakMap(), Ph = new WeakMap(), pZ = new WeakSet(), YS = function(I) {
  15048. const {
  15049. container: {
  15050. style: g
  15051. },
  15052. data: {
  15053. rect: C,
  15054. rotation: i
  15055. },
  15056. parent: {
  15057. viewport: {
  15058. rawDims: {
  15059. pageWidth: e,
  15060. pageHeight: A,
  15061. pageX: s,
  15062. pageY: l
  15063. }
  15064. }
  15065. }
  15066. } = this;
  15067. C == null || C.splice(0, 4, ...I), g.left = `${100 * (I[0] - s) / e}%`, g.top = `${100 * (A - I[3] + l) / A}%`, i === 0 ? (g.width = `${100 * (I[2] - I[0]) / e}%`, g.height = `${100 * (I[3] - I[1]) / A}%`) : this.setRotation(i);
  15068. };
  15069. let nt = e1;
  15070. var Ye, To, Kgg, Fgg;
  15071. class Dgg extends nt {
  15072. constructor(g, C = null) {
  15073. super(g, {
  15074. isRenderable: !0,
  15075. ignoreBorder: !!(C != null && C.ignoreBorder),
  15076. createQuadrilaterals: !0
  15077. });
  15078. tg(this, Ye);
  15079. this.isTooltipOnly = g.data.isTooltipOnly;
  15080. }
  15081. render() {
  15082. const {
  15083. data: g,
  15084. linkService: C
  15085. } = this, i = document.createElement("a");
  15086. i.setAttribute("data-element-id", g.id);
  15087. let e = !1;
  15088. return g.url ? (C.addLinkAttributes(i, g.url, g.newWindow), e = !0) : g.action ? (this._bindNamedAction(i, g.action), e = !0) : g.attachment ? (ig(this, Ye, Kgg).call(this, i, g.attachment, g.attachmentDest), e = !0) : g.setOCGState ? (ig(this, Ye, Fgg).call(this, i, g.setOCGState), e = !0) : g.dest ? (this._bindLink(i, g.dest), e = !0) : (g.actions && (g.actions.Action || g.actions["Mouse Up"] || g.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions && (this._bindJSAction(i, g), e = !0), g.resetForm ? (this._bindResetFormAction(i, g.resetForm), e = !0) : this.isTooltipOnly && !e && (this._bindLink(i, ""), e = !0)), this.container.classList.add("linkAnnotation"), e && this.container.append(i), this.container;
  15089. }
  15090. _bindLink(g, C) {
  15091. g.href = this.linkService.getDestinationHash(C), g.onclick = () => (C && this.linkService.goToDestination(C), !1), (C || C === "") && ig(this, Ye, To).call(this);
  15092. }
  15093. _bindNamedAction(g, C) {
  15094. g.href = this.linkService.getAnchorUrl(""), g.onclick = () => (this.linkService.executeNamedAction(C), !1), ig(this, Ye, To).call(this);
  15095. }
  15096. _bindJSAction(g, C) {
  15097. g.href = this.linkService.getAnchorUrl("");
  15098. const i = /* @__PURE__ */ new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]);
  15099. for (const e of Object.keys(C.actions)) {
  15100. const A = i.get(e);
  15101. A && (g[A] = () => {
  15102. var s;
  15103. return (s = this.linkService.eventBus) == null || s.dispatch("dispatcheventinsandbox", {
  15104. source: this,
  15105. detail: {
  15106. id: C.id,
  15107. name: e
  15108. }
  15109. }), !1;
  15110. });
  15111. }
  15112. g.onclick || (g.onclick = () => !1), ig(this, Ye, To).call(this);
  15113. }
  15114. _bindResetFormAction(g, C) {
  15115. const i = g.onclick;
  15116. if (i || (g.href = this.linkService.getAnchorUrl("")), ig(this, Ye, To).call(this), !this._fieldObjects) {
  15117. DI('_bindResetFormAction - "resetForm" action not supported, ensure that the `fieldObjects` parameter is provided.'), i || (g.onclick = () => !1);
  15118. return;
  15119. }
  15120. g.onclick = () => {
  15121. var d;
  15122. i == null || i();
  15123. const {
  15124. fields: e,
  15125. refs: A,
  15126. include: s
  15127. } = C, l = [];
  15128. if (e.length !== 0 || A.length !== 0) {
  15129. const o = new Set(A);
  15130. for (const c of e) {
  15131. const r = this._fieldObjects[c] || [];
  15132. for (const {
  15133. id: h
  15134. } of r)
  15135. o.add(h);
  15136. }
  15137. for (const c of Object.values(this._fieldObjects))
  15138. for (const r of c)
  15139. o.has(r.id) === s && l.push(r);
  15140. } else
  15141. for (const o of Object.values(this._fieldObjects))
  15142. l.push(...o);
  15143. const n = this.annotationStorage, a = [];
  15144. for (const o of l) {
  15145. const {
  15146. id: c
  15147. } = o;
  15148. switch (a.push(c), o.type) {
  15149. case "text": {
  15150. const h = o.defaultValue || "";
  15151. n.setValue(c, {
  15152. value: h
  15153. });
  15154. break;
  15155. }
  15156. case "checkbox":
  15157. case "radiobutton": {
  15158. const h = o.defaultValue === o.exportValues;
  15159. n.setValue(c, {
  15160. value: h
  15161. });
  15162. break;
  15163. }
  15164. case "combobox":
  15165. case "listbox": {
  15166. const h = o.defaultValue || "";
  15167. n.setValue(c, {
  15168. value: h
  15169. });
  15170. break;
  15171. }
  15172. default:
  15173. continue;
  15174. }
  15175. const r = document.querySelector(`[data-element-id="${c}"]`);
  15176. if (r) {
  15177. if (!rd.has(r)) {
  15178. DI(`_bindResetFormAction - element not allowed: ${c}`);
  15179. continue;
  15180. }
  15181. } else continue;
  15182. r.dispatchEvent(new Event("resetform"));
  15183. }
  15184. return this.enableScripting && ((d = this.linkService.eventBus) == null || d.dispatch("dispatcheventinsandbox", {
  15185. source: this,
  15186. detail: {
  15187. id: "app",
  15188. ids: a,
  15189. name: "ResetForm"
  15190. }
  15191. })), !1;
  15192. };
  15193. }
  15194. }
  15195. Ye = new WeakSet(), To = function() {
  15196. this.container.setAttribute("data-internal-link", "");
  15197. }, Kgg = function(g, C, i = null) {
  15198. g.href = this.linkService.getAnchorUrl(""), C.description && (g.title = C.description), g.onclick = () => {
  15199. var e;
  15200. return (e = this.downloadManager) == null || e.openOrDownloadData(C.content, C.filename, i), !1;
  15201. }, ig(this, Ye, To).call(this);
  15202. }, Fgg = function(g, C) {
  15203. g.href = this.linkService.getAnchorUrl(""), g.onclick = () => (this.linkService.executeSetOCGState(C), !1), ig(this, Ye, To).call(this);
  15204. };
  15205. class odg extends nt {
  15206. constructor(I) {
  15207. super(I, {
  15208. isRenderable: !0
  15209. });
  15210. }
  15211. render() {
  15212. this.container.classList.add("textAnnotation");
  15213. const I = document.createElement("img");
  15214. return I.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg", I.setAttribute("data-l10n-id", "pdfjs-text-annotation-type"), I.setAttribute("data-l10n-args", JSON.stringify({
  15215. type: this.data.name
  15216. })), !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.append(I), this.container;
  15217. }
  15218. }
  15219. class md extends nt {
  15220. render() {
  15221. return this.container;
  15222. }
  15223. showElementAndHideCanvas(I) {
  15224. var g;
  15225. this.data.hasOwnCanvas && (((g = I.previousSibling) == null ? void 0 : g.nodeName) === "CANVAS" && (I.previousSibling.hidden = !0), I.hidden = !1);
  15226. }
  15227. _getKeyModifier(I) {
  15228. return Ai.platform.isMac ? I.metaKey : I.ctrlKey;
  15229. }
  15230. _setEventListener(I, g, C, i, e) {
  15231. C.includes("mouse") ? I.addEventListener(C, (A) => {
  15232. var s;
  15233. (s = this.linkService.eventBus) == null || s.dispatch("dispatcheventinsandbox", {
  15234. source: this,
  15235. detail: {
  15236. id: this.data.id,
  15237. name: i,
  15238. value: e(A),
  15239. shift: A.shiftKey,
  15240. modifier: this._getKeyModifier(A)
  15241. }
  15242. });
  15243. }) : I.addEventListener(C, (A) => {
  15244. var s;
  15245. if (C === "blur") {
  15246. if (!g.focused || !A.relatedTarget)
  15247. return;
  15248. g.focused = !1;
  15249. } else if (C === "focus") {
  15250. if (g.focused)
  15251. return;
  15252. g.focused = !0;
  15253. }
  15254. e && ((s = this.linkService.eventBus) == null || s.dispatch("dispatcheventinsandbox", {
  15255. source: this,
  15256. detail: {
  15257. id: this.data.id,
  15258. name: i,
  15259. value: e(A)
  15260. }
  15261. }));
  15262. });
  15263. }
  15264. _setEventListeners(I, g, C, i) {
  15265. var e, A, s;
  15266. for (const [l, n] of C)
  15267. (n === "Action" || (e = this.data.actions) != null && e[n]) && ((n === "Focus" || n === "Blur") && (g || (g = {
  15268. focused: !1
  15269. })), this._setEventListener(I, g, l, n, i), n === "Focus" && !((A = this.data.actions) != null && A.Blur) ? this._setEventListener(I, g, "blur", "Blur", null) : n === "Blur" && !((s = this.data.actions) != null && s.Focus) && this._setEventListener(I, g, "focus", "Focus", null));
  15270. }
  15271. _setBackgroundColor(I) {
  15272. const g = this.data.backgroundColor || null;
  15273. I.style.backgroundColor = g === null ? "transparent" : AI.makeHexColor(g[0], g[1], g[2]);
  15274. }
  15275. _setTextStyle(I) {
  15276. const g = ["left", "center", "right"], {
  15277. fontColor: C
  15278. } = this.data.defaultAppearanceData, i = this.data.defaultAppearanceData.fontSize || adg, e = I.style;
  15279. let A;
  15280. const s = 2, l = (n) => Math.round(10 * n) / 10;
  15281. if (this.data.multiLine) {
  15282. const n = Math.abs(this.data.rect[3] - this.data.rect[1] - s), a = Math.round(n / (LH * i)) || 1, d = n / a;
  15283. A = Math.min(i, l(d / LH));
  15284. } else {
  15285. const n = Math.abs(this.data.rect[3] - this.data.rect[1] - s);
  15286. A = Math.min(i, l(n / LH));
  15287. }
  15288. e.fontSize = `calc(${A}px * var(--total-scale-factor))`, e.color = AI.makeHexColor(C[0], C[1], C[2]), this.data.textAlignment !== null && (e.textAlign = g[this.data.textAlignment]);
  15289. }
  15290. _setRequired(I, g) {
  15291. g ? I.setAttribute("required", !0) : I.removeAttribute("required"), I.setAttribute("aria-required", g);
  15292. }
  15293. }
  15294. class cdg extends md {
  15295. constructor(I) {
  15296. const g = I.renderForms || I.data.hasOwnCanvas || !I.data.hasAppearance && !!I.data.fieldValue;
  15297. super(I, {
  15298. isRenderable: g
  15299. });
  15300. }
  15301. setPropertyOnSiblings(I, g, C, i) {
  15302. const e = this.annotationStorage;
  15303. for (const A of this._getElementsByName(I.name, I.id))
  15304. A.domElement && (A.domElement[g] = C), e.setValue(A.id, {
  15305. [i]: C
  15306. });
  15307. }
  15308. render() {
  15309. var i, e;
  15310. const I = this.annotationStorage, g = this.data.id;
  15311. this.container.classList.add("textWidgetAnnotation");
  15312. let C = null;
  15313. if (this.renderForms) {
  15314. const A = I.getValue(g, {
  15315. value: this.data.fieldValue
  15316. });
  15317. let s = A.value || "";
  15318. const l = I.getValue(g, {
  15319. charLimit: this.data.maxLen
  15320. }).charLimit;
  15321. l && s.length > l && (s = s.slice(0, l));
  15322. let n = A.formattedValue || ((i = this.data.textContent) == null ? void 0 : i.join(`
  15323. `)) || null;
  15324. n && this.data.comb && (n = n.replaceAll(/\s+/g, ""));
  15325. const a = {
  15326. userValue: s,
  15327. formattedValue: n,
  15328. lastCommittedValue: null,
  15329. commitKey: 1,
  15330. focused: !1
  15331. };
  15332. this.data.multiLine ? (C = document.createElement("textarea"), C.textContent = n ?? s, this.data.doNotScroll && (C.style.overflowY = "hidden")) : (C = document.createElement("input"), C.type = this.data.password ? "password" : "text", C.setAttribute("value", n ?? s), this.data.doNotScroll && (C.style.overflowX = "hidden")), this.data.hasOwnCanvas && (C.hidden = !0), rd.add(C), C.setAttribute("data-element-id", g), C.disabled = this.data.readOnly, C.name = this.data.fieldName, C.tabIndex = aG, this._setRequired(C, this.data.required), l && (C.maxLength = l), C.addEventListener("input", (o) => {
  15333. I.setValue(g, {
  15334. value: o.target.value
  15335. }), this.setPropertyOnSiblings(C, "value", o.target.value, "value"), a.formattedValue = null;
  15336. }), C.addEventListener("resetform", (o) => {
  15337. const c = this.data.defaultFieldValue ?? "";
  15338. C.value = a.userValue = c, a.formattedValue = null;
  15339. });
  15340. let d = (o) => {
  15341. const {
  15342. formattedValue: c
  15343. } = a;
  15344. c != null && (o.target.value = c), o.target.scrollLeft = 0;
  15345. };
  15346. if (this.enableScripting && this.hasJSActions) {
  15347. C.addEventListener("focus", (c) => {
  15348. var h;
  15349. if (a.focused)
  15350. return;
  15351. const {
  15352. target: r
  15353. } = c;
  15354. a.userValue && (r.value = a.userValue), a.lastCommittedValue = r.value, a.commitKey = 1, (h = this.data.actions) != null && h.Focus || (a.focused = !0);
  15355. }), C.addEventListener("updatefromsandbox", (c) => {
  15356. this.showElementAndHideCanvas(c.target);
  15357. const r = {
  15358. value(h) {
  15359. a.userValue = h.detail.value ?? "", I.setValue(g, {
  15360. value: a.userValue.toString()
  15361. }), h.target.value = a.userValue;
  15362. },
  15363. formattedValue(h) {
  15364. const {
  15365. formattedValue: b
  15366. } = h.detail;
  15367. a.formattedValue = b, b != null && h.target !== document.activeElement && (h.target.value = b), I.setValue(g, {
  15368. formattedValue: b
  15369. });
  15370. },
  15371. selRange(h) {
  15372. h.target.setSelectionRange(...h.detail.selRange);
  15373. },
  15374. charLimit: (h) => {
  15375. var Z;
  15376. const {
  15377. charLimit: b
  15378. } = h.detail, {
  15379. target: u
  15380. } = h;
  15381. if (b === 0) {
  15382. u.removeAttribute("maxLength");
  15383. return;
  15384. }
  15385. u.setAttribute("maxLength", b);
  15386. let m = a.userValue;
  15387. !m || m.length <= b || (m = m.slice(0, b), u.value = a.userValue = m, I.setValue(g, {
  15388. value: m
  15389. }), (Z = this.linkService.eventBus) == null || Z.dispatch("dispatcheventinsandbox", {
  15390. source: this,
  15391. detail: {
  15392. id: g,
  15393. name: "Keystroke",
  15394. value: m,
  15395. willCommit: !0,
  15396. commitKey: 1,
  15397. selStart: u.selectionStart,
  15398. selEnd: u.selectionEnd
  15399. }
  15400. }));
  15401. }
  15402. };
  15403. this._dispatchEventFromSandbox(r, c);
  15404. }), C.addEventListener("keydown", (c) => {
  15405. var b;
  15406. a.commitKey = 1;
  15407. let r = -1;
  15408. if (c.key === "Escape" ? r = 0 : c.key === "Enter" && !this.data.multiLine ? r = 2 : c.key === "Tab" && (a.commitKey = 3), r === -1)
  15409. return;
  15410. const {
  15411. value: h
  15412. } = c.target;
  15413. a.lastCommittedValue !== h && (a.lastCommittedValue = h, a.userValue = h, (b = this.linkService.eventBus) == null || b.dispatch("dispatcheventinsandbox", {
  15414. source: this,
  15415. detail: {
  15416. id: g,
  15417. name: "Keystroke",
  15418. value: h,
  15419. willCommit: !0,
  15420. commitKey: r,
  15421. selStart: c.target.selectionStart,
  15422. selEnd: c.target.selectionEnd
  15423. }
  15424. }));
  15425. });
  15426. const o = d;
  15427. d = null, C.addEventListener("blur", (c) => {
  15428. var h, b;
  15429. if (!a.focused || !c.relatedTarget)
  15430. return;
  15431. (h = this.data.actions) != null && h.Blur || (a.focused = !1);
  15432. const {
  15433. value: r
  15434. } = c.target;
  15435. a.userValue = r, a.lastCommittedValue !== r && ((b = this.linkService.eventBus) == null || b.dispatch("dispatcheventinsandbox", {
  15436. source: this,
  15437. detail: {
  15438. id: g,
  15439. name: "Keystroke",
  15440. value: r,
  15441. willCommit: !0,
  15442. commitKey: a.commitKey,
  15443. selStart: c.target.selectionStart,
  15444. selEnd: c.target.selectionEnd
  15445. }
  15446. })), o(c);
  15447. }), (e = this.data.actions) != null && e.Keystroke && C.addEventListener("beforeinput", (c) => {
  15448. var Y;
  15449. a.lastCommittedValue = null;
  15450. const {
  15451. data: r,
  15452. target: h
  15453. } = c, {
  15454. value: b,
  15455. selectionStart: u,
  15456. selectionEnd: m
  15457. } = h;
  15458. let Z = u, p = m;
  15459. switch (c.inputType) {
  15460. case "deleteWordBackward": {
  15461. const R = b.substring(0, u).match(/\w*[^\w]*$/);
  15462. R && (Z -= R[0].length);
  15463. break;
  15464. }
  15465. case "deleteWordForward": {
  15466. const R = b.substring(u).match(/^[^\w]*\w*/);
  15467. R && (p += R[0].length);
  15468. break;
  15469. }
  15470. case "deleteContentBackward":
  15471. u === m && (Z -= 1);
  15472. break;
  15473. case "deleteContentForward":
  15474. u === m && (p += 1);
  15475. break;
  15476. }
  15477. c.preventDefault(), (Y = this.linkService.eventBus) == null || Y.dispatch("dispatcheventinsandbox", {
  15478. source: this,
  15479. detail: {
  15480. id: g,
  15481. name: "Keystroke",
  15482. value: b,
  15483. change: r || "",
  15484. willCommit: !1,
  15485. selStart: Z,
  15486. selEnd: p
  15487. }
  15488. });
  15489. }), this._setEventListeners(C, a, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], (c) => c.target.value);
  15490. }
  15491. if (d && C.addEventListener("blur", d), this.data.comb) {
  15492. const c = (this.data.rect[2] - this.data.rect[0]) / l;
  15493. C.classList.add("comb"), C.style.letterSpacing = `calc(${c}px * var(--total-scale-factor) - 1ch)`;
  15494. }
  15495. } else
  15496. C = document.createElement("div"), C.textContent = this.data.fieldValue, C.style.verticalAlign = "middle", C.style.display = "table-cell", this.data.hasOwnCanvas && (C.hidden = !0);
  15497. return this._setTextStyle(C), this._setBackgroundColor(C), this._setDefaultPropertiesFromJS(C), this.container.append(C), this.container;
  15498. }
  15499. }
  15500. class ddg extends md {
  15501. constructor(I) {
  15502. super(I, {
  15503. isRenderable: !!I.data.hasOwnCanvas
  15504. });
  15505. }
  15506. }
  15507. class rdg extends md {
  15508. constructor(I) {
  15509. super(I, {
  15510. isRenderable: I.renderForms
  15511. });
  15512. }
  15513. render() {
  15514. const I = this.annotationStorage, g = this.data, C = g.id;
  15515. let i = I.getValue(C, {
  15516. value: g.exportValue === g.fieldValue
  15517. }).value;
  15518. typeof i == "string" && (i = i !== "Off", I.setValue(C, {
  15519. value: i
  15520. })), this.container.classList.add("buttonWidgetAnnotation", "checkBox");
  15521. const e = document.createElement("input");
  15522. return rd.add(e), e.setAttribute("data-element-id", C), e.disabled = g.readOnly, this._setRequired(e, this.data.required), e.type = "checkbox", e.name = g.fieldName, i && e.setAttribute("checked", !0), e.setAttribute("exportValue", g.exportValue), e.tabIndex = aG, e.addEventListener("change", (A) => {
  15523. const {
  15524. name: s,
  15525. checked: l
  15526. } = A.target;
  15527. for (const n of this._getElementsByName(s, C)) {
  15528. const a = l && n.exportValue === g.exportValue;
  15529. n.domElement && (n.domElement.checked = a), I.setValue(n.id, {
  15530. value: a
  15531. });
  15532. }
  15533. I.setValue(C, {
  15534. value: l
  15535. });
  15536. }), e.addEventListener("resetform", (A) => {
  15537. const s = g.defaultFieldValue || "Off";
  15538. A.target.checked = s === g.exportValue;
  15539. }), this.enableScripting && this.hasJSActions && (e.addEventListener("updatefromsandbox", (A) => {
  15540. const s = {
  15541. value(l) {
  15542. l.target.checked = l.detail.value !== "Off", I.setValue(C, {
  15543. value: l.target.checked
  15544. });
  15545. }
  15546. };
  15547. this._dispatchEventFromSandbox(s, A);
  15548. }), this._setEventListeners(e, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], (A) => A.target.checked)), this._setBackgroundColor(e), this._setDefaultPropertiesFromJS(e), this.container.append(e), this.container;
  15549. }
  15550. }
  15551. class kgg extends md {
  15552. constructor(I) {
  15553. super(I, {
  15554. isRenderable: I.renderForms
  15555. });
  15556. }
  15557. render() {
  15558. this.container.classList.add("buttonWidgetAnnotation", "radioButton");
  15559. const I = this.annotationStorage, g = this.data, C = g.id;
  15560. let i = I.getValue(C, {
  15561. value: g.fieldValue === g.buttonValue
  15562. }).value;
  15563. if (typeof i == "string" && (i = i !== g.buttonValue, I.setValue(C, {
  15564. value: i
  15565. })), i)
  15566. for (const A of this._getElementsByName(g.fieldName, C))
  15567. I.setValue(A.id, {
  15568. value: !1
  15569. });
  15570. const e = document.createElement("input");
  15571. if (rd.add(e), e.setAttribute("data-element-id", C), e.disabled = g.readOnly, this._setRequired(e, this.data.required), e.type = "radio", e.name = g.fieldName, i && e.setAttribute("checked", !0), e.tabIndex = aG, e.addEventListener("change", (A) => {
  15572. const {
  15573. name: s,
  15574. checked: l
  15575. } = A.target;
  15576. for (const n of this._getElementsByName(s, C))
  15577. I.setValue(n.id, {
  15578. value: !1
  15579. });
  15580. I.setValue(C, {
  15581. value: l
  15582. });
  15583. }), e.addEventListener("resetform", (A) => {
  15584. const s = g.defaultFieldValue;
  15585. A.target.checked = s != null && s === g.buttonValue;
  15586. }), this.enableScripting && this.hasJSActions) {
  15587. const A = g.buttonValue;
  15588. e.addEventListener("updatefromsandbox", (s) => {
  15589. const l = {
  15590. value: (n) => {
  15591. const a = A === n.detail.value;
  15592. for (const d of this._getElementsByName(n.target.name)) {
  15593. const o = a && d.id === C;
  15594. d.domElement && (d.domElement.checked = o), I.setValue(d.id, {
  15595. value: o
  15596. });
  15597. }
  15598. }
  15599. };
  15600. this._dispatchEventFromSandbox(l, s);
  15601. }), this._setEventListeners(e, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], (s) => s.target.checked);
  15602. }
  15603. return this._setBackgroundColor(e), this._setDefaultPropertiesFromJS(e), this.container.append(e), this.container;
  15604. }
  15605. }
  15606. class hdg extends Dgg {
  15607. constructor(I) {
  15608. super(I, {
  15609. ignoreBorder: I.data.hasAppearance
  15610. });
  15611. }
  15612. render() {
  15613. const I = super.render();
  15614. I.classList.add("buttonWidgetAnnotation", "pushButton");
  15615. const g = I.lastChild;
  15616. return this.enableScripting && this.hasJSActions && g && (this._setDefaultPropertiesFromJS(g), g.addEventListener("updatefromsandbox", (C) => {
  15617. this._dispatchEventFromSandbox({}, C);
  15618. })), I;
  15619. }
  15620. }
  15621. class bdg extends md {
  15622. constructor(I) {
  15623. super(I, {
  15624. isRenderable: I.renderForms
  15625. });
  15626. }
  15627. render() {
  15628. this.container.classList.add("choiceWidgetAnnotation");
  15629. const I = this.annotationStorage, g = this.data.id, C = I.getValue(g, {
  15630. value: this.data.fieldValue
  15631. }), i = document.createElement("select");
  15632. rd.add(i), i.setAttribute("data-element-id", g), i.disabled = this.data.readOnly, this._setRequired(i, this.data.required), i.name = this.data.fieldName, i.tabIndex = aG;
  15633. let e = this.data.combo && this.data.options.length > 0;
  15634. this.data.combo || (i.size = this.data.options.length, this.data.multiSelect && (i.multiple = !0)), i.addEventListener("resetform", (a) => {
  15635. const d = this.data.defaultFieldValue;
  15636. for (const o of i.options)
  15637. o.selected = o.value === d;
  15638. });
  15639. for (const a of this.data.options) {
  15640. const d = document.createElement("option");
  15641. d.textContent = a.displayValue, d.value = a.exportValue, C.value.includes(a.exportValue) && (d.setAttribute("selected", !0), e = !1), i.append(d);
  15642. }
  15643. let A = null;
  15644. if (e) {
  15645. const a = document.createElement("option");
  15646. a.value = " ", a.setAttribute("hidden", !0), a.setAttribute("selected", !0), i.prepend(a), A = () => {
  15647. a.remove(), i.removeEventListener("input", A), A = null;
  15648. }, i.addEventListener("input", A);
  15649. }
  15650. const s = (a) => {
  15651. const d = a ? "value" : "textContent", {
  15652. options: o,
  15653. multiple: c
  15654. } = i;
  15655. return c ? Array.prototype.filter.call(o, (r) => r.selected).map((r) => r[d]) : o.selectedIndex === -1 ? null : o[o.selectedIndex][d];
  15656. };
  15657. let l = s(!1);
  15658. const n = (a) => {
  15659. const d = a.target.options;
  15660. return Array.prototype.map.call(d, (o) => ({
  15661. displayValue: o.textContent,
  15662. exportValue: o.value
  15663. }));
  15664. };
  15665. return this.enableScripting && this.hasJSActions ? (i.addEventListener("updatefromsandbox", (a) => {
  15666. const d = {
  15667. value(o) {
  15668. A == null || A();
  15669. const c = o.detail.value, r = new Set(Array.isArray(c) ? c : [c]);
  15670. for (const h of i.options)
  15671. h.selected = r.has(h.value);
  15672. I.setValue(g, {
  15673. value: s(!0)
  15674. }), l = s(!1);
  15675. },
  15676. multipleSelection(o) {
  15677. i.multiple = !0;
  15678. },
  15679. remove(o) {
  15680. const c = i.options, r = o.detail.remove;
  15681. c[r].selected = !1, i.remove(r), c.length > 0 && Array.prototype.findIndex.call(c, (b) => b.selected) === -1 && (c[0].selected = !0), I.setValue(g, {
  15682. value: s(!0),
  15683. items: n(o)
  15684. }), l = s(!1);
  15685. },
  15686. clear(o) {
  15687. for (; i.length !== 0; )
  15688. i.remove(0);
  15689. I.setValue(g, {
  15690. value: null,
  15691. items: []
  15692. }), l = s(!1);
  15693. },
  15694. insert(o) {
  15695. const {
  15696. index: c,
  15697. displayValue: r,
  15698. exportValue: h
  15699. } = o.detail.insert, b = i.children[c], u = document.createElement("option");
  15700. u.textContent = r, u.value = h, b ? b.before(u) : i.append(u), I.setValue(g, {
  15701. value: s(!0),
  15702. items: n(o)
  15703. }), l = s(!1);
  15704. },
  15705. items(o) {
  15706. const {
  15707. items: c
  15708. } = o.detail;
  15709. for (; i.length !== 0; )
  15710. i.remove(0);
  15711. for (const r of c) {
  15712. const {
  15713. displayValue: h,
  15714. exportValue: b
  15715. } = r, u = document.createElement("option");
  15716. u.textContent = h, u.value = b, i.append(u);
  15717. }
  15718. i.options.length > 0 && (i.options[0].selected = !0), I.setValue(g, {
  15719. value: s(!0),
  15720. items: n(o)
  15721. }), l = s(!1);
  15722. },
  15723. indices(o) {
  15724. const c = new Set(o.detail.indices);
  15725. for (const r of o.target.options)
  15726. r.selected = c.has(r.index);
  15727. I.setValue(g, {
  15728. value: s(!0)
  15729. }), l = s(!1);
  15730. },
  15731. editable(o) {
  15732. o.target.disabled = !o.detail.editable;
  15733. }
  15734. };
  15735. this._dispatchEventFromSandbox(d, a);
  15736. }), i.addEventListener("input", (a) => {
  15737. var c;
  15738. const d = s(!0), o = s(!1);
  15739. I.setValue(g, {
  15740. value: d
  15741. }), a.preventDefault(), (c = this.linkService.eventBus) == null || c.dispatch("dispatcheventinsandbox", {
  15742. source: this,
  15743. detail: {
  15744. id: g,
  15745. name: "Keystroke",
  15746. value: l,
  15747. change: o,
  15748. changeEx: d,
  15749. willCommit: !1,
  15750. commitKey: 1,
  15751. keyDown: !1
  15752. }
  15753. });
  15754. }), this._setEventListeners(i, null, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"], ["input", "Validate"]], (a) => a.target.value)) : i.addEventListener("input", function(a) {
  15755. I.setValue(g, {
  15756. value: s(!0)
  15757. });
  15758. }), this.data.combo && this._setTextStyle(i), this._setBackgroundColor(i), this._setDefaultPropertiesFromJS(i), this.container.append(i), this.container;
  15759. }
  15760. }
  15761. class NS extends nt {
  15762. constructor(I) {
  15763. const {
  15764. data: g,
  15765. elements: C
  15766. } = I;
  15767. super(I, {
  15768. isRenderable: nt._hasPopupData(g)
  15769. }), this.elements = C, this.popup = null;
  15770. }
  15771. render() {
  15772. this.container.classList.add("popupAnnotation");
  15773. const I = this.popup = new udg({
  15774. container: this.container,
  15775. color: this.data.color,
  15776. titleObj: this.data.titleObj,
  15777. modificationDate: this.data.modificationDate,
  15778. contentsObj: this.data.contentsObj,
  15779. richText: this.data.richText,
  15780. rect: this.data.rect,
  15781. parentRect: this.data.parentRect || null,
  15782. parent: this.parent,
  15783. elements: this.elements,
  15784. open: this.data.open
  15785. }), g = [];
  15786. for (const C of this.elements)
  15787. C.popup = I, C.container.ariaHasPopup = "dialog", g.push(C.data.id), C.addHighlightArea();
  15788. return this.container.setAttribute("aria-controls", g.map((C) => `${d9}${C}`).join(",")), this.container;
  15789. }
  15790. }
  15791. var _h, TV, xV, qh, $h, $C, Sl, g0, BZ, WZ, I0, Dl, yA, Kl, yZ, Fl, YZ, Fc, kc, WC, WN, VS, zgg, Jgg, Lgg, vgg, yN, YN, MS;
  15792. class udg {
  15793. constructor({
  15794. container: I,
  15795. color: g,
  15796. elements: C,
  15797. titleObj: i,
  15798. modificationDate: e,
  15799. contentsObj: A,
  15800. richText: s,
  15801. parent: l,
  15802. rect: n,
  15803. parentRect: a,
  15804. open: d
  15805. }) {
  15806. tg(this, WC);
  15807. tg(this, _h, ig(this, WC, Lgg).bind(this));
  15808. tg(this, TV, ig(this, WC, MS).bind(this));
  15809. tg(this, xV, ig(this, WC, YN).bind(this));
  15810. tg(this, qh, ig(this, WC, yN).bind(this));
  15811. tg(this, $h, null);
  15812. tg(this, $C, null);
  15813. tg(this, Sl, null);
  15814. tg(this, g0, null);
  15815. tg(this, BZ, null);
  15816. tg(this, WZ, null);
  15817. tg(this, I0, null);
  15818. tg(this, Dl, !1);
  15819. tg(this, yA, null);
  15820. tg(this, Kl, null);
  15821. tg(this, yZ, null);
  15822. tg(this, Fl, null);
  15823. tg(this, YZ, null);
  15824. tg(this, Fc, null);
  15825. tg(this, kc, !1);
  15826. var o;
  15827. $(this, $C, I), $(this, YZ, i), $(this, Sl, A), $(this, Fl, s), $(this, WZ, l), $(this, $h, g), $(this, yZ, n), $(this, I0, a), $(this, BZ, C), $(this, g0, b9.toDateObject(e)), this.trigger = C.flatMap((c) => c.getElementsToTriggerPopup());
  15828. for (const c of this.trigger)
  15829. c.addEventListener("click", M(this, qh)), c.addEventListener("mouseenter", M(this, xV)), c.addEventListener("mouseleave", M(this, TV)), c.classList.add("popupTriggerArea");
  15830. for (const c of C)
  15831. (o = c.container) == null || o.addEventListener("keydown", M(this, _h));
  15832. M(this, $C).hidden = !0, d && ig(this, WC, yN).call(this);
  15833. }
  15834. render() {
  15835. if (M(this, yA))
  15836. return;
  15837. const I = $(this, yA, document.createElement("div"));
  15838. if (I.className = "popup", M(this, $h)) {
  15839. const e = I.style.outlineColor = AI.makeHexColor(...M(this, $h));
  15840. I.style.backgroundColor = `color-mix(in srgb, ${e} 30%, white)`;
  15841. }
  15842. const g = document.createElement("span");
  15843. g.className = "header";
  15844. const C = document.createElement("h1");
  15845. if (g.append(C), {
  15846. dir: C.dir,
  15847. str: C.textContent
  15848. } = M(this, YZ), I.append(g), M(this, g0)) {
  15849. const e = document.createElement("span");
  15850. e.classList.add("popupDate"), e.setAttribute("data-l10n-id", "pdfjs-annotation-date-time-string"), e.setAttribute("data-l10n-args", JSON.stringify({
  15851. dateObj: M(this, g0).valueOf()
  15852. })), g.append(e);
  15853. }
  15854. const i = M(this, WC, WN);
  15855. if (i)
  15856. Sgg.render({
  15857. xfaHtml: i,
  15858. intent: "richText",
  15859. div: I
  15860. }), I.lastChild.classList.add("richText", "popupContent");
  15861. else {
  15862. const e = this._formatContents(M(this, Sl));
  15863. I.append(e);
  15864. }
  15865. M(this, $C).append(I);
  15866. }
  15867. _formatContents({
  15868. str: I,
  15869. dir: g
  15870. }) {
  15871. const C = document.createElement("p");
  15872. C.classList.add("popupContent"), C.dir = g;
  15873. const i = I.split(/(?:\r\n?|\n)/);
  15874. for (let e = 0, A = i.length; e < A; ++e) {
  15875. const s = i[e];
  15876. C.append(document.createTextNode(s)), e < A - 1 && C.append(document.createElement("br"));
  15877. }
  15878. return C;
  15879. }
  15880. updateEdited({
  15881. rect: I,
  15882. popupContent: g
  15883. }) {
  15884. var C;
  15885. M(this, Fc) || $(this, Fc, {
  15886. contentsObj: M(this, Sl),
  15887. richText: M(this, Fl)
  15888. }), I && $(this, Kl, null), g && ($(this, Fl, ig(this, WC, Jgg).call(this, g)), $(this, Sl, null)), (C = M(this, yA)) == null || C.remove(), $(this, yA, null);
  15889. }
  15890. resetEdited() {
  15891. var I;
  15892. M(this, Fc) && ({
  15893. contentsObj: Wi(this, Sl)._,
  15894. richText: Wi(this, Fl)._
  15895. } = M(this, Fc), $(this, Fc, null), (I = M(this, yA)) == null || I.remove(), $(this, yA, null), $(this, Kl, null));
  15896. }
  15897. forceHide() {
  15898. $(this, kc, this.isVisible), M(this, kc) && (M(this, $C).hidden = !0);
  15899. }
  15900. maybeShow() {
  15901. M(this, kc) && (M(this, yA) || ig(this, WC, YN).call(this), $(this, kc, !1), M(this, $C).hidden = !1);
  15902. }
  15903. get isVisible() {
  15904. return M(this, $C).hidden === !1;
  15905. }
  15906. }
  15907. _h = new WeakMap(), TV = new WeakMap(), xV = new WeakMap(), qh = new WeakMap(), $h = new WeakMap(), $C = new WeakMap(), Sl = new WeakMap(), g0 = new WeakMap(), BZ = new WeakMap(), WZ = new WeakMap(), I0 = new WeakMap(), Dl = new WeakMap(), yA = new WeakMap(), Kl = new WeakMap(), yZ = new WeakMap(), Fl = new WeakMap(), YZ = new WeakMap(), Fc = new WeakMap(), kc = new WeakMap(), WC = new WeakSet(), WN = function() {
  15908. const I = M(this, Fl), g = M(this, Sl);
  15909. return I != null && I.str && (!(g != null && g.str) || g.str === I.str) && M(this, Fl).html || null;
  15910. }, VS = function() {
  15911. var I, g, C;
  15912. return ((C = (g = (I = M(this, WC, WN)) == null ? void 0 : I.attributes) == null ? void 0 : g.style) == null ? void 0 : C.fontSize) || 0;
  15913. }, zgg = function() {
  15914. var I, g, C;
  15915. return ((C = (g = (I = M(this, WC, WN)) == null ? void 0 : I.attributes) == null ? void 0 : g.style) == null ? void 0 : C.color) || null;
  15916. }, Jgg = function(I) {
  15917. const g = [], C = {
  15918. str: I,
  15919. html: {
  15920. name: "div",
  15921. attributes: {
  15922. dir: "auto"
  15923. },
  15924. children: [{
  15925. name: "p",
  15926. children: g
  15927. }]
  15928. }
  15929. }, i = {
  15930. style: {
  15931. color: M(this, WC, zgg),
  15932. fontSize: M(this, WC, VS) ? `calc(${M(this, WC, VS)}px * var(--total-scale-factor))` : ""
  15933. }
  15934. };
  15935. for (const e of I.split(`
  15936. `))
  15937. g.push({
  15938. name: "span",
  15939. value: e,
  15940. attributes: i
  15941. });
  15942. return C;
  15943. }, Lgg = function(I) {
  15944. I.altKey || I.shiftKey || I.ctrlKey || I.metaKey || (I.key === "Enter" || I.key === "Escape" && M(this, Dl)) && ig(this, WC, yN).call(this);
  15945. }, vgg = function() {
  15946. if (M(this, Kl) !== null)
  15947. return;
  15948. const {
  15949. page: {
  15950. view: I
  15951. },
  15952. viewport: {
  15953. rawDims: {
  15954. pageWidth: g,
  15955. pageHeight: C,
  15956. pageX: i,
  15957. pageY: e
  15958. }
  15959. }
  15960. } = M(this, WZ);
  15961. let A = !!M(this, I0), s = A ? M(this, I0) : M(this, yZ);
  15962. for (const r of M(this, BZ))
  15963. if (!s || AI.intersect(r.data.rect, s) !== null) {
  15964. s = r.data.rect, A = !0;
  15965. break;
  15966. }
  15967. const l = AI.normalizeRect([s[0], I[3] - s[1] + I[1], s[2], I[3] - s[3] + I[1]]), a = A ? s[2] - s[0] + 5 : 0, d = l[0] + a, o = l[1];
  15968. $(this, Kl, [100 * (d - i) / g, 100 * (o - e) / C]);
  15969. const {
  15970. style: c
  15971. } = M(this, $C);
  15972. c.left = `${M(this, Kl)[0]}%`, c.top = `${M(this, Kl)[1]}%`;
  15973. }, yN = function() {
  15974. $(this, Dl, !M(this, Dl)), M(this, Dl) ? (ig(this, WC, YN).call(this), M(this, $C).addEventListener("click", M(this, qh)), M(this, $C).addEventListener("keydown", M(this, _h))) : (ig(this, WC, MS).call(this), M(this, $C).removeEventListener("click", M(this, qh)), M(this, $C).removeEventListener("keydown", M(this, _h)));
  15975. }, YN = function() {
  15976. M(this, yA) || this.render(), this.isVisible ? M(this, Dl) && M(this, $C).classList.add("focused") : (ig(this, WC, vgg).call(this), M(this, $C).hidden = !1, M(this, $C).style.zIndex = parseInt(M(this, $C).style.zIndex) + 1e3);
  15977. }, MS = function() {
  15978. M(this, $C).classList.remove("focused"), !(M(this, Dl) || !this.isVisible) && (M(this, $C).hidden = !0, M(this, $C).style.zIndex = parseInt(M(this, $C).style.zIndex) - 1e3);
  15979. };
  15980. class Tgg extends nt {
  15981. constructor(I) {
  15982. super(I, {
  15983. isRenderable: !0,
  15984. ignoreBorder: !0
  15985. }), this.textContent = I.data.textContent, this.textPosition = I.data.textPosition, this.annotationEditorType = XI.FREETEXT;
  15986. }
  15987. render() {
  15988. if (this.container.classList.add("freeTextAnnotation"), this.textContent) {
  15989. const I = document.createElement("div");
  15990. I.classList.add("annotationTextContent"), I.setAttribute("role", "comment");
  15991. for (const g of this.textContent) {
  15992. const C = document.createElement("span");
  15993. C.textContent = g, I.append(C);
  15994. }
  15995. this.container.append(I);
  15996. }
  15997. return !this.data.popupRef && this.hasPopupData && this._createPopup(), this._editOnDoubleClick(), this.container;
  15998. }
  15999. }
  16000. var NZ;
  16001. class mdg extends nt {
  16002. constructor(g) {
  16003. super(g, {
  16004. isRenderable: !0,
  16005. ignoreBorder: !0
  16006. });
  16007. tg(this, NZ, null);
  16008. }
  16009. render() {
  16010. this.container.classList.add("lineAnnotation");
  16011. const {
  16012. data: g,
  16013. width: C,
  16014. height: i
  16015. } = this, e = this.svgFactory.create(C, i, !0), A = $(this, NZ, this.svgFactory.createElement("svg:line"));
  16016. return A.setAttribute("x1", g.rect[2] - g.lineCoordinates[0]), A.setAttribute("y1", g.rect[3] - g.lineCoordinates[1]), A.setAttribute("x2", g.rect[2] - g.lineCoordinates[2]), A.setAttribute("y2", g.rect[3] - g.lineCoordinates[3]), A.setAttribute("stroke-width", g.borderStyle.width || 1), A.setAttribute("stroke", "transparent"), A.setAttribute("fill", "transparent"), e.append(A), this.container.append(e), !g.popupRef && this.hasPopupData && this._createPopup(), this.container;
  16017. }
  16018. getElementsToTriggerPopup() {
  16019. return M(this, NZ);
  16020. }
  16021. addHighlightArea() {
  16022. this.container.classList.add("highlightArea");
  16023. }
  16024. }
  16025. NZ = new WeakMap();
  16026. var VZ;
  16027. class Zdg extends nt {
  16028. constructor(g) {
  16029. super(g, {
  16030. isRenderable: !0,
  16031. ignoreBorder: !0
  16032. });
  16033. tg(this, VZ, null);
  16034. }
  16035. render() {
  16036. this.container.classList.add("squareAnnotation");
  16037. const {
  16038. data: g,
  16039. width: C,
  16040. height: i
  16041. } = this, e = this.svgFactory.create(C, i, !0), A = g.borderStyle.width, s = $(this, VZ, this.svgFactory.createElement("svg:rect"));
  16042. return s.setAttribute("x", A / 2), s.setAttribute("y", A / 2), s.setAttribute("width", C - A), s.setAttribute("height", i - A), s.setAttribute("stroke-width", A || 1), s.setAttribute("stroke", "transparent"), s.setAttribute("fill", "transparent"), e.append(s), this.container.append(e), !g.popupRef && this.hasPopupData && this._createPopup(), this.container;
  16043. }
  16044. getElementsToTriggerPopup() {
  16045. return M(this, VZ);
  16046. }
  16047. addHighlightArea() {
  16048. this.container.classList.add("highlightArea");
  16049. }
  16050. }
  16051. VZ = new WeakMap();
  16052. var MZ;
  16053. class Gdg extends nt {
  16054. constructor(g) {
  16055. super(g, {
  16056. isRenderable: !0,
  16057. ignoreBorder: !0
  16058. });
  16059. tg(this, MZ, null);
  16060. }
  16061. render() {
  16062. this.container.classList.add("circleAnnotation");
  16063. const {
  16064. data: g,
  16065. width: C,
  16066. height: i
  16067. } = this, e = this.svgFactory.create(C, i, !0), A = g.borderStyle.width, s = $(this, MZ, this.svgFactory.createElement("svg:ellipse"));
  16068. return s.setAttribute("cx", C / 2), s.setAttribute("cy", i / 2), s.setAttribute("rx", C / 2 - A / 2), s.setAttribute("ry", i / 2 - A / 2), s.setAttribute("stroke-width", A || 1), s.setAttribute("stroke", "transparent"), s.setAttribute("fill", "transparent"), e.append(s), this.container.append(e), !g.popupRef && this.hasPopupData && this._createPopup(), this.container;
  16069. }
  16070. getElementsToTriggerPopup() {
  16071. return M(this, MZ);
  16072. }
  16073. addHighlightArea() {
  16074. this.container.classList.add("highlightArea");
  16075. }
  16076. }
  16077. MZ = new WeakMap();
  16078. var RZ;
  16079. class xgg extends nt {
  16080. constructor(g) {
  16081. super(g, {
  16082. isRenderable: !0,
  16083. ignoreBorder: !0
  16084. });
  16085. tg(this, RZ, null);
  16086. this.containerClassName = "polylineAnnotation", this.svgElementName = "svg:polyline";
  16087. }
  16088. render() {
  16089. this.container.classList.add(this.containerClassName);
  16090. const {
  16091. data: {
  16092. rect: g,
  16093. vertices: C,
  16094. borderStyle: i,
  16095. popupRef: e
  16096. },
  16097. width: A,
  16098. height: s
  16099. } = this;
  16100. if (!C)
  16101. return this.container;
  16102. const l = this.svgFactory.create(A, s, !0);
  16103. let n = [];
  16104. for (let d = 0, o = C.length; d < o; d += 2) {
  16105. const c = C[d] - g[0], r = g[3] - C[d + 1];
  16106. n.push(`${c},${r}`);
  16107. }
  16108. n = n.join(" ");
  16109. const a = $(this, RZ, this.svgFactory.createElement(this.svgElementName));
  16110. return a.setAttribute("points", n), a.setAttribute("stroke-width", i.width || 1), a.setAttribute("stroke", "transparent"), a.setAttribute("fill", "transparent"), l.append(a), this.container.append(l), !e && this.hasPopupData && this._createPopup(), this.container;
  16111. }
  16112. getElementsToTriggerPopup() {
  16113. return M(this, RZ);
  16114. }
  16115. addHighlightArea() {
  16116. this.container.classList.add("highlightArea");
  16117. }
  16118. }
  16119. RZ = new WeakMap();
  16120. class wdg extends xgg {
  16121. constructor(I) {
  16122. super(I), this.containerClassName = "polygonAnnotation", this.svgElementName = "svg:polygon";
  16123. }
  16124. }
  16125. class pdg extends nt {
  16126. constructor(I) {
  16127. super(I, {
  16128. isRenderable: !0,
  16129. ignoreBorder: !0
  16130. });
  16131. }
  16132. render() {
  16133. return this.container.classList.add("caretAnnotation"), !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container;
  16134. }
  16135. }
  16136. var fZ, zc, HZ, RS;
  16137. class p9 extends nt {
  16138. constructor(g) {
  16139. super(g, {
  16140. isRenderable: !0,
  16141. ignoreBorder: !0
  16142. });
  16143. tg(this, HZ);
  16144. tg(this, fZ, null);
  16145. tg(this, zc, []);
  16146. this.containerClassName = "inkAnnotation", this.svgElementName = "svg:polyline", this.annotationEditorType = this.data.it === "InkHighlight" ? XI.HIGHLIGHT : XI.INK;
  16147. }
  16148. render() {
  16149. this.container.classList.add(this.containerClassName);
  16150. const {
  16151. data: {
  16152. rect: g,
  16153. rotation: C,
  16154. inkLists: i,
  16155. borderStyle: e,
  16156. popupRef: A
  16157. }
  16158. } = this, {
  16159. transform: s,
  16160. width: l,
  16161. height: n
  16162. } = ig(this, HZ, RS).call(this, C, g), a = this.svgFactory.create(l, n, !0), d = $(this, fZ, this.svgFactory.createElement("svg:g"));
  16163. a.append(d), d.setAttribute("stroke-width", e.width || 1), d.setAttribute("stroke-linecap", "round"), d.setAttribute("stroke-linejoin", "round"), d.setAttribute("stroke-miterlimit", 10), d.setAttribute("stroke", "transparent"), d.setAttribute("fill", "transparent"), d.setAttribute("transform", s);
  16164. for (let o = 0, c = i.length; o < c; o++) {
  16165. const r = this.svgFactory.createElement(this.svgElementName);
  16166. M(this, zc).push(r), r.setAttribute("points", i[o].join(",")), d.append(r);
  16167. }
  16168. return !A && this.hasPopupData && this._createPopup(), this.container.append(a), this._editOnDoubleClick(), this.container;
  16169. }
  16170. updateEdited(g) {
  16171. super.updateEdited(g);
  16172. const {
  16173. thickness: C,
  16174. points: i,
  16175. rect: e
  16176. } = g, A = M(this, fZ);
  16177. if (C >= 0 && A.setAttribute("stroke-width", C || 1), i)
  16178. for (let s = 0, l = M(this, zc).length; s < l; s++)
  16179. M(this, zc)[s].setAttribute("points", i[s].join(","));
  16180. if (e) {
  16181. const {
  16182. transform: s,
  16183. width: l,
  16184. height: n
  16185. } = ig(this, HZ, RS).call(this, this.data.rotation, e);
  16186. A.parentElement.setAttribute("viewBox", `0 0 ${l} ${n}`), A.setAttribute("transform", s);
  16187. }
  16188. }
  16189. getElementsToTriggerPopup() {
  16190. return M(this, zc);
  16191. }
  16192. addHighlightArea() {
  16193. this.container.classList.add("highlightArea");
  16194. }
  16195. }
  16196. fZ = new WeakMap(), zc = new WeakMap(), HZ = new WeakSet(), RS = function(g, C) {
  16197. switch (g) {
  16198. case 90:
  16199. return {
  16200. transform: `rotate(90) translate(${-C[0]},${C[1]}) scale(1,-1)`,
  16201. width: C[3] - C[1],
  16202. height: C[2] - C[0]
  16203. };
  16204. case 180:
  16205. return {
  16206. transform: `rotate(180) translate(${-C[2]},${C[1]}) scale(1,-1)`,
  16207. width: C[2] - C[0],
  16208. height: C[3] - C[1]
  16209. };
  16210. case 270:
  16211. return {
  16212. transform: `rotate(270) translate(${-C[2]},${C[3]}) scale(1,-1)`,
  16213. width: C[3] - C[1],
  16214. height: C[2] - C[0]
  16215. };
  16216. default:
  16217. return {
  16218. transform: `translate(${-C[0]},${C[3]}) scale(1,-1)`,
  16219. width: C[2] - C[0],
  16220. height: C[3] - C[1]
  16221. };
  16222. }
  16223. };
  16224. class jgg extends nt {
  16225. constructor(I) {
  16226. super(I, {
  16227. isRenderable: !0,
  16228. ignoreBorder: !0,
  16229. createQuadrilaterals: !0
  16230. }), this.annotationEditorType = XI.HIGHLIGHT;
  16231. }
  16232. render() {
  16233. return !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.classList.add("highlightAnnotation"), this._editOnDoubleClick(), this.container;
  16234. }
  16235. }
  16236. class Bdg extends nt {
  16237. constructor(I) {
  16238. super(I, {
  16239. isRenderable: !0,
  16240. ignoreBorder: !0,
  16241. createQuadrilaterals: !0
  16242. });
  16243. }
  16244. render() {
  16245. return !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.classList.add("underlineAnnotation"), this.container;
  16246. }
  16247. }
  16248. class Wdg extends nt {
  16249. constructor(I) {
  16250. super(I, {
  16251. isRenderable: !0,
  16252. ignoreBorder: !0,
  16253. createQuadrilaterals: !0
  16254. });
  16255. }
  16256. render() {
  16257. return !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.classList.add("squigglyAnnotation"), this.container;
  16258. }
  16259. }
  16260. class ydg extends nt {
  16261. constructor(I) {
  16262. super(I, {
  16263. isRenderable: !0,
  16264. ignoreBorder: !0,
  16265. createQuadrilaterals: !0
  16266. });
  16267. }
  16268. render() {
  16269. return !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.classList.add("strikeoutAnnotation"), this.container;
  16270. }
  16271. }
  16272. class Qgg extends nt {
  16273. constructor(I) {
  16274. super(I, {
  16275. isRenderable: !0,
  16276. ignoreBorder: !0
  16277. }), this.annotationEditorType = XI.STAMP;
  16278. }
  16279. render() {
  16280. return this.container.classList.add("stampAnnotation"), this.container.setAttribute("role", "img"), !this.data.popupRef && this.hasPopupData && this._createPopup(), this._editOnDoubleClick(), this.container;
  16281. }
  16282. }
  16283. var XZ, SZ, fS;
  16284. class Ydg extends nt {
  16285. constructor(g) {
  16286. var i;
  16287. super(g, {
  16288. isRenderable: !0
  16289. });
  16290. tg(this, SZ);
  16291. tg(this, XZ, null);
  16292. const {
  16293. file: C
  16294. } = this.data;
  16295. this.filename = C.filename, this.content = C.content, (i = this.linkService.eventBus) == null || i.dispatch("fileattachmentannotation", {
  16296. source: this,
  16297. ...C
  16298. });
  16299. }
  16300. render() {
  16301. this.container.classList.add("fileAttachmentAnnotation");
  16302. const {
  16303. container: g,
  16304. data: C
  16305. } = this;
  16306. let i;
  16307. C.hasAppearance || C.fillAlpha === 0 ? i = document.createElement("div") : (i = document.createElement("img"), i.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(C.name) ? "paperclip" : "pushpin"}.svg`, C.fillAlpha && C.fillAlpha < 1 && (i.style = `filter: opacity(${Math.round(C.fillAlpha * 100)}%);`)), i.addEventListener("dblclick", ig(this, SZ, fS).bind(this)), $(this, XZ, i);
  16308. const {
  16309. isMac: e
  16310. } = Ai.platform;
  16311. return g.addEventListener("keydown", (A) => {
  16312. A.key === "Enter" && (e ? A.metaKey : A.ctrlKey) && ig(this, SZ, fS).call(this);
  16313. }), !C.popupRef && this.hasPopupData ? this._createPopup() : i.classList.add("popupTriggerArea"), g.append(i), g;
  16314. }
  16315. getElementsToTriggerPopup() {
  16316. return M(this, XZ);
  16317. }
  16318. addHighlightArea() {
  16319. this.container.classList.add("highlightArea");
  16320. }
  16321. }
  16322. XZ = new WeakMap(), SZ = new WeakSet(), fS = function() {
  16323. var g;
  16324. (g = this.downloadManager) == null || g.openOrDownloadData(this.content, this.filename);
  16325. };
  16326. var DZ, Jc, fa, KZ, go, XS, SS;
  16327. const A1 = class A1 {
  16328. constructor({
  16329. div: I,
  16330. accessibilityManager: g,
  16331. annotationCanvasMap: C,
  16332. annotationEditorUIManager: i,
  16333. page: e,
  16334. viewport: A,
  16335. structTreeLayer: s
  16336. }) {
  16337. tg(this, go);
  16338. tg(this, DZ, null);
  16339. tg(this, Jc, null);
  16340. tg(this, fa, /* @__PURE__ */ new Map());
  16341. tg(this, KZ, null);
  16342. this.div = I, $(this, DZ, g), $(this, Jc, C), $(this, KZ, s || null), this.page = e, this.viewport = A, this.zIndex = 0, this._annotationEditorUIManager = i;
  16343. }
  16344. hasEditableAnnotations() {
  16345. return M(this, fa).size > 0;
  16346. }
  16347. async render(I) {
  16348. var A;
  16349. const {
  16350. annotations: g
  16351. } = I, C = this.div;
  16352. cd(C, this.viewport);
  16353. const i = /* @__PURE__ */ new Map(), e = {
  16354. data: null,
  16355. layer: C,
  16356. linkService: I.linkService,
  16357. downloadManager: I.downloadManager,
  16358. imageResourcesPath: I.imageResourcesPath || "",
  16359. renderForms: I.renderForms !== !1,
  16360. svgFactory: new eV(),
  16361. annotationStorage: I.annotationStorage || new Z9(),
  16362. enableScripting: I.enableScripting === !0,
  16363. hasJSActions: I.hasJSActions,
  16364. fieldObjects: I.fieldObjects,
  16365. parent: this,
  16366. elements: null
  16367. };
  16368. for (const s of g) {
  16369. if (s.noHTML)
  16370. continue;
  16371. const l = s.annotationType === dt.POPUP;
  16372. if (l) {
  16373. const d = i.get(s.id);
  16374. if (!d)
  16375. continue;
  16376. e.elements = d;
  16377. } else if (s.rect[2] === s.rect[0] || s.rect[3] === s.rect[1])
  16378. continue;
  16379. e.data = s;
  16380. const n = Z8.create(e);
  16381. if (!n.isRenderable)
  16382. continue;
  16383. if (!l && s.popupRef) {
  16384. const d = i.get(s.popupRef);
  16385. d ? d.push(n) : i.set(s.popupRef, [n]);
  16386. }
  16387. const a = n.render();
  16388. s.hidden && (a.style.visibility = "hidden"), await ig(this, go, XS).call(this, a, s.id), n._isEditable && (M(this, fa).set(n.data.id, n), (A = this._annotationEditorUIManager) == null || A.renderAnnotationElement(n));
  16389. }
  16390. ig(this, go, SS).call(this);
  16391. }
  16392. async addLinkAnnotations(I, g) {
  16393. const C = {
  16394. data: null,
  16395. layer: this.div,
  16396. linkService: g,
  16397. svgFactory: new eV(),
  16398. parent: this
  16399. };
  16400. for (const i of I) {
  16401. i.borderStyle || (i.borderStyle = A1._defaultBorderStyle), C.data = i;
  16402. const e = Z8.create(C);
  16403. if (!e.isRenderable)
  16404. continue;
  16405. const A = e.render();
  16406. await ig(this, go, XS).call(this, A, i.id);
  16407. }
  16408. }
  16409. update({
  16410. viewport: I
  16411. }) {
  16412. const g = this.div;
  16413. this.viewport = I, cd(g, {
  16414. rotation: I.rotation
  16415. }), ig(this, go, SS).call(this), g.hidden = !1;
  16416. }
  16417. getEditableAnnotations() {
  16418. return Array.from(M(this, fa).values());
  16419. }
  16420. getEditableAnnotation(I) {
  16421. return M(this, fa).get(I);
  16422. }
  16423. static get _defaultBorderStyle() {
  16424. return UI(this, "_defaultBorderStyle", Object.freeze({
  16425. width: 1,
  16426. rawWidth: 1,
  16427. style: Qr.SOLID,
  16428. dashArray: [3],
  16429. horizontalCornerRadius: 0,
  16430. verticalCornerRadius: 0
  16431. }));
  16432. }
  16433. };
  16434. DZ = new WeakMap(), Jc = new WeakMap(), fa = new WeakMap(), KZ = new WeakMap(), go = new WeakSet(), XS = async function(I, g) {
  16435. var A, s;
  16436. const C = I.firstChild || I, i = C.id = `${d9}${g}`, e = await ((A = M(this, KZ)) == null ? void 0 : A.getAriaAttributes(i));
  16437. if (e)
  16438. for (const [l, n] of e)
  16439. C.setAttribute(l, n);
  16440. this.div.append(I), (s = M(this, DZ)) == null || s.moveElementInDOM(this.div, I, C, !1);
  16441. }, SS = function() {
  16442. var g;
  16443. if (!M(this, Jc))
  16444. return;
  16445. const I = this.div;
  16446. for (const [C, i] of M(this, Jc)) {
  16447. const e = I.querySelector(`[data-annotation-id="${C}"]`);
  16448. if (!e)
  16449. continue;
  16450. i.className = "annotationContent";
  16451. const {
  16452. firstChild: A
  16453. } = e;
  16454. A ? A.nodeName === "CANVAS" ? A.replaceWith(i) : A.classList.contains("annotationContent") ? A.after(i) : A.before(i) : e.append(i);
  16455. const s = M(this, fa).get(C);
  16456. s && (s._hasNoCanvas ? ((g = this._annotationEditorUIManager) == null || g.setMissingCanvas(C, e.id, i), s._hasNoCanvas = !1) : s.canvas = i);
  16457. }
  16458. M(this, Jc).clear();
  16459. };
  16460. let HS = A1;
  16461. const vY = /\r\n?|\n/g;
  16462. var YA, be, FZ, Lc, ue, mt, Ogg, Ugg, Egg, NN, gn, VN, MN, Pgg, KS, _gg;
  16463. const NC = class NC extends TC {
  16464. constructor(g) {
  16465. super({
  16466. ...g,
  16467. name: "freeTextEditor"
  16468. });
  16469. tg(this, mt);
  16470. tg(this, YA);
  16471. tg(this, be, "");
  16472. tg(this, FZ, `${this.id}-editor`);
  16473. tg(this, Lc, null);
  16474. tg(this, ue);
  16475. $(this, YA, g.color || NC._defaultColor || TC._defaultLineColor), $(this, ue, g.fontSize || NC._defaultFontSize);
  16476. }
  16477. static get _keyboardManager() {
  16478. const g = NC.prototype, C = (A) => A.isEmpty(), i = dd.TRANSLATE_SMALL, e = dd.TRANSLATE_BIG;
  16479. return UI(this, "_keyboardManager", new lG([[["ctrl+s", "mac+meta+s", "ctrl+p", "mac+meta+p"], g.commitOrRemove, {
  16480. bubbles: !0
  16481. }], [["ctrl+Enter", "mac+meta+Enter", "Escape", "mac+Escape"], g.commitOrRemove], [["ArrowLeft", "mac+ArrowLeft"], g._translateEmpty, {
  16482. args: [-i, 0],
  16483. checker: C
  16484. }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], g._translateEmpty, {
  16485. args: [-e, 0],
  16486. checker: C
  16487. }], [["ArrowRight", "mac+ArrowRight"], g._translateEmpty, {
  16488. args: [i, 0],
  16489. checker: C
  16490. }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], g._translateEmpty, {
  16491. args: [e, 0],
  16492. checker: C
  16493. }], [["ArrowUp", "mac+ArrowUp"], g._translateEmpty, {
  16494. args: [0, -i],
  16495. checker: C
  16496. }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], g._translateEmpty, {
  16497. args: [0, -e],
  16498. checker: C
  16499. }], [["ArrowDown", "mac+ArrowDown"], g._translateEmpty, {
  16500. args: [0, i],
  16501. checker: C
  16502. }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], g._translateEmpty, {
  16503. args: [0, e],
  16504. checker: C
  16505. }]]));
  16506. }
  16507. static initialize(g, C) {
  16508. TC.initialize(g, C);
  16509. const i = getComputedStyle(document.documentElement);
  16510. this._internalPadding = parseFloat(i.getPropertyValue("--freetext-padding"));
  16511. }
  16512. static updateDefaultParams(g, C) {
  16513. switch (g) {
  16514. case iC.FREETEXT_SIZE:
  16515. NC._defaultFontSize = C;
  16516. break;
  16517. case iC.FREETEXT_COLOR:
  16518. NC._defaultColor = C;
  16519. break;
  16520. }
  16521. }
  16522. updateParams(g, C) {
  16523. switch (g) {
  16524. case iC.FREETEXT_SIZE:
  16525. ig(this, mt, Ogg).call(this, C);
  16526. break;
  16527. case iC.FREETEXT_COLOR:
  16528. ig(this, mt, Ugg).call(this, C);
  16529. break;
  16530. }
  16531. }
  16532. static get defaultPropertiesToUpdate() {
  16533. return [[iC.FREETEXT_SIZE, NC._defaultFontSize], [iC.FREETEXT_COLOR, NC._defaultColor || TC._defaultLineColor]];
  16534. }
  16535. get propertiesToUpdate() {
  16536. return [[iC.FREETEXT_SIZE, M(this, ue)], [iC.FREETEXT_COLOR, M(this, YA)]];
  16537. }
  16538. _translateEmpty(g, C) {
  16539. this._uiManager.translateSelectedEditors(g, C, !0);
  16540. }
  16541. getInitialTranslation() {
  16542. const g = this.parentScale;
  16543. return [-NC._internalPadding * g, -(NC._internalPadding + M(this, ue)) * g];
  16544. }
  16545. rebuild() {
  16546. this.parent && (super.rebuild(), this.div !== null && (this.isAttachedToDOM || this.parent.add(this)));
  16547. }
  16548. enableEditMode() {
  16549. if (this.isInEditMode())
  16550. return;
  16551. this.parent.setEditingState(!1), this.parent.updateToolbar(XI.FREETEXT), super.enableEditMode(), this.overlayDiv.classList.remove("enabled"), this.editorDiv.contentEditable = !0, this._isDraggable = !1, this.div.removeAttribute("aria-activedescendant"), $(this, Lc, new AbortController());
  16552. const g = this._uiManager.combinedSignal(M(this, Lc));
  16553. this.editorDiv.addEventListener("keydown", this.editorDivKeydown.bind(this), {
  16554. signal: g
  16555. }), this.editorDiv.addEventListener("focus", this.editorDivFocus.bind(this), {
  16556. signal: g
  16557. }), this.editorDiv.addEventListener("blur", this.editorDivBlur.bind(this), {
  16558. signal: g
  16559. }), this.editorDiv.addEventListener("input", this.editorDivInput.bind(this), {
  16560. signal: g
  16561. }), this.editorDiv.addEventListener("paste", this.editorDivPaste.bind(this), {
  16562. signal: g
  16563. });
  16564. }
  16565. disableEditMode() {
  16566. var g;
  16567. this.isInEditMode() && (this.parent.setEditingState(!0), super.disableEditMode(), this.overlayDiv.classList.add("enabled"), this.editorDiv.contentEditable = !1, this.div.setAttribute("aria-activedescendant", M(this, FZ)), this._isDraggable = !0, (g = M(this, Lc)) == null || g.abort(), $(this, Lc, null), this.div.focus({
  16568. preventScroll: !0
  16569. }), this.isEditing = !1, this.parent.div.classList.add("freetextEditing"));
  16570. }
  16571. focusin(g) {
  16572. this._focusEventsAllowed && (super.focusin(g), g.target !== this.editorDiv && this.editorDiv.focus());
  16573. }
  16574. onceAdded(g) {
  16575. var C;
  16576. this.width || (this.enableEditMode(), g && this.editorDiv.focus(), (C = this._initialOptions) != null && C.isCentered && this.center(), this._initialOptions = null);
  16577. }
  16578. isEmpty() {
  16579. return !this.editorDiv || this.editorDiv.innerText.trim() === "";
  16580. }
  16581. remove() {
  16582. this.isEditing = !1, this.parent && (this.parent.setEditingState(!0), this.parent.div.classList.add("freetextEditing")), super.remove();
  16583. }
  16584. commit() {
  16585. if (!this.isInEditMode())
  16586. return;
  16587. super.commit(), this.disableEditMode();
  16588. const g = M(this, be), C = $(this, be, ig(this, mt, Egg).call(this).trimEnd());
  16589. if (g === C)
  16590. return;
  16591. const i = (e) => {
  16592. if ($(this, be, e), !e) {
  16593. this.remove();
  16594. return;
  16595. }
  16596. ig(this, mt, MN).call(this), this._uiManager.rebuild(this), ig(this, mt, NN).call(this);
  16597. };
  16598. this.addCommands({
  16599. cmd: () => {
  16600. i(C);
  16601. },
  16602. undo: () => {
  16603. i(g);
  16604. },
  16605. mustExec: !1
  16606. }), ig(this, mt, NN).call(this);
  16607. }
  16608. shouldGetKeyboardEvents() {
  16609. return this.isInEditMode();
  16610. }
  16611. enterInEditMode() {
  16612. this.enableEditMode(), this.editorDiv.focus();
  16613. }
  16614. dblclick(g) {
  16615. this.enterInEditMode();
  16616. }
  16617. keydown(g) {
  16618. g.target === this.div && g.key === "Enter" && (this.enterInEditMode(), g.preventDefault());
  16619. }
  16620. editorDivKeydown(g) {
  16621. NC._keyboardManager.exec(this, g);
  16622. }
  16623. editorDivFocus(g) {
  16624. this.isEditing = !0;
  16625. }
  16626. editorDivBlur(g) {
  16627. this.isEditing = !1;
  16628. }
  16629. editorDivInput(g) {
  16630. this.parent.div.classList.toggle("freetextEditing", this.isEmpty());
  16631. }
  16632. disableEditing() {
  16633. this.editorDiv.setAttribute("role", "comment"), this.editorDiv.removeAttribute("aria-multiline");
  16634. }
  16635. enableEditing() {
  16636. this.editorDiv.setAttribute("role", "textbox"), this.editorDiv.setAttribute("aria-multiline", !0);
  16637. }
  16638. render() {
  16639. if (this.div)
  16640. return this.div;
  16641. let g, C;
  16642. (this._isCopy || this.annotationElementId) && (g = this.x, C = this.y), super.render(), this.editorDiv = document.createElement("div"), this.editorDiv.className = "internal", this.editorDiv.setAttribute("id", M(this, FZ)), this.editorDiv.setAttribute("data-l10n-id", "pdfjs-free-text2"), this.editorDiv.setAttribute("data-l10n-attrs", "default-content"), this.enableEditing(), this.editorDiv.contentEditable = !0;
  16643. const {
  16644. style: i
  16645. } = this.editorDiv;
  16646. if (i.fontSize = `calc(${M(this, ue)}px * var(--total-scale-factor))`, i.color = M(this, YA), this.div.append(this.editorDiv), this.overlayDiv = document.createElement("div"), this.overlayDiv.classList.add("overlay", "enabled"), this.div.append(this.overlayDiv), m9(this, this.div, ["dblclick", "keydown"]), this._isCopy || this.annotationElementId) {
  16647. const [e, A] = this.parentDimensions;
  16648. if (this.annotationElementId) {
  16649. const {
  16650. position: s
  16651. } = this._initialData;
  16652. let [l, n] = this.getInitialTranslation();
  16653. [l, n] = this.pageTranslationToScreen(l, n);
  16654. const [a, d] = this.pageDimensions, [o, c] = this.pageTranslation;
  16655. let r, h;
  16656. switch (this.rotation) {
  16657. case 0:
  16658. r = g + (s[0] - o) / a, h = C + this.height - (s[1] - c) / d;
  16659. break;
  16660. case 90:
  16661. r = g + (s[0] - o) / a, h = C - (s[1] - c) / d, [l, n] = [n, -l];
  16662. break;
  16663. case 180:
  16664. r = g - this.width + (s[0] - o) / a, h = C - (s[1] - c) / d, [l, n] = [-l, -n];
  16665. break;
  16666. case 270:
  16667. r = g + (s[0] - o - this.height * d) / a, h = C + (s[1] - c - this.width * a) / d, [l, n] = [-n, l];
  16668. break;
  16669. }
  16670. this.setAt(r * e, h * A, l, n);
  16671. } else
  16672. this._moveAfterPaste(g, C);
  16673. ig(this, mt, MN).call(this), this._isDraggable = !0, this.editorDiv.contentEditable = !1;
  16674. } else
  16675. this._isDraggable = !1, this.editorDiv.contentEditable = !0;
  16676. return this.div;
  16677. }
  16678. editorDivPaste(g) {
  16679. var r, h, b;
  16680. const C = g.clipboardData || window.clipboardData, {
  16681. types: i
  16682. } = C;
  16683. if (i.length === 1 && i[0] === "text/plain")
  16684. return;
  16685. g.preventDefault();
  16686. const e = ig(r = NC, gn, KS).call(r, C.getData("text") || "").replaceAll(vY, `
  16687. `);
  16688. if (!e)
  16689. return;
  16690. const A = window.getSelection();
  16691. if (!A.rangeCount)
  16692. return;
  16693. this.editorDiv.normalize(), A.deleteFromDocument();
  16694. const s = A.getRangeAt(0);
  16695. if (!e.includes(`
  16696. `)) {
  16697. s.insertNode(document.createTextNode(e)), this.editorDiv.normalize(), A.collapseToStart();
  16698. return;
  16699. }
  16700. const {
  16701. startContainer: l,
  16702. startOffset: n
  16703. } = s, a = [], d = [];
  16704. if (l.nodeType === Node.TEXT_NODE) {
  16705. const u = l.parentElement;
  16706. if (d.push(l.nodeValue.slice(n).replaceAll(vY, "")), u !== this.editorDiv) {
  16707. let m = a;
  16708. for (const Z of this.editorDiv.childNodes) {
  16709. if (Z === u) {
  16710. m = d;
  16711. continue;
  16712. }
  16713. m.push(ig(h = NC, gn, VN).call(h, Z));
  16714. }
  16715. }
  16716. a.push(l.nodeValue.slice(0, n).replaceAll(vY, ""));
  16717. } else if (l === this.editorDiv) {
  16718. let u = a, m = 0;
  16719. for (const Z of this.editorDiv.childNodes)
  16720. m++ === n && (u = d), u.push(ig(b = NC, gn, VN).call(b, Z));
  16721. }
  16722. $(this, be, `${a.join(`
  16723. `)}${e}${d.join(`
  16724. `)}`), ig(this, mt, MN).call(this);
  16725. const o = new Range();
  16726. let c = Math.sumPrecise(a.map((u) => u.length));
  16727. for (const {
  16728. firstChild: u
  16729. } of this.editorDiv.childNodes)
  16730. if (u.nodeType === Node.TEXT_NODE) {
  16731. const m = u.nodeValue.length;
  16732. if (c <= m) {
  16733. o.setStart(u, c), o.setEnd(u, c);
  16734. break;
  16735. }
  16736. c -= m;
  16737. }
  16738. A.removeAllRanges(), A.addRange(o);
  16739. }
  16740. get contentDiv() {
  16741. return this.editorDiv;
  16742. }
  16743. static async deserialize(g, C, i) {
  16744. var s;
  16745. let e = null;
  16746. if (g instanceof Tgg) {
  16747. const {
  16748. data: {
  16749. defaultAppearanceData: {
  16750. fontSize: l,
  16751. fontColor: n
  16752. },
  16753. rect: a,
  16754. rotation: d,
  16755. id: o,
  16756. popupRef: c
  16757. },
  16758. textContent: r,
  16759. textPosition: h,
  16760. parent: {
  16761. page: {
  16762. pageNumber: b
  16763. }
  16764. }
  16765. } = g;
  16766. if (!r || r.length === 0)
  16767. return null;
  16768. e = g = {
  16769. annotationType: XI.FREETEXT,
  16770. color: Array.from(n),
  16771. fontSize: l,
  16772. value: r.join(`
  16773. `),
  16774. position: h,
  16775. pageIndex: b - 1,
  16776. rect: a.slice(0),
  16777. rotation: d,
  16778. id: o,
  16779. deleted: !1,
  16780. popupRef: c
  16781. };
  16782. }
  16783. const A = await super.deserialize(g, C, i);
  16784. return $(A, ue, g.fontSize), $(A, YA, AI.makeHexColor(...g.color)), $(A, be, ig(s = NC, gn, KS).call(s, g.value)), A.annotationElementId = g.id || null, A._initialData = e, A;
  16785. }
  16786. serialize(g = !1) {
  16787. if (this.isEmpty())
  16788. return null;
  16789. if (this.deleted)
  16790. return this.serializeDeleted();
  16791. const C = NC._internalPadding * this.parentScale, i = this.getRect(C, C), e = TC._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : M(this, YA)), A = {
  16792. annotationType: XI.FREETEXT,
  16793. color: e,
  16794. fontSize: M(this, ue),
  16795. value: ig(this, mt, Pgg).call(this),
  16796. pageIndex: this.pageIndex,
  16797. rect: i,
  16798. rotation: this.rotation,
  16799. structTreeParentId: this._structTreeParentId
  16800. };
  16801. return g ? (A.isCopy = !0, A) : this.annotationElementId && !ig(this, mt, _gg).call(this, A) ? null : (A.id = this.annotationElementId, A);
  16802. }
  16803. renderAnnotationElement(g) {
  16804. const C = super.renderAnnotationElement(g);
  16805. if (this.deleted)
  16806. return C;
  16807. const {
  16808. style: i
  16809. } = C;
  16810. i.fontSize = `calc(${M(this, ue)}px * var(--total-scale-factor))`, i.color = M(this, YA), C.replaceChildren();
  16811. for (const A of M(this, be).split(`
  16812. `)) {
  16813. const s = document.createElement("div");
  16814. s.append(A ? document.createTextNode(A) : document.createElement("br")), C.append(s);
  16815. }
  16816. const e = NC._internalPadding * this.parentScale;
  16817. return g.updateEdited({
  16818. rect: this.getRect(e, e),
  16819. popupContent: M(this, be)
  16820. }), C;
  16821. }
  16822. resetAnnotationElement(g) {
  16823. super.resetAnnotationElement(g), g.resetEdited();
  16824. }
  16825. };
  16826. YA = new WeakMap(), be = new WeakMap(), FZ = new WeakMap(), Lc = new WeakMap(), ue = new WeakMap(), mt = new WeakSet(), Ogg = function(g) {
  16827. const C = (e) => {
  16828. this.editorDiv.style.fontSize = `calc(${e}px * var(--total-scale-factor))`, this.translate(0, -(e - M(this, ue)) * this.parentScale), $(this, ue, e), ig(this, mt, NN).call(this);
  16829. }, i = M(this, ue);
  16830. this.addCommands({
  16831. cmd: C.bind(this, g),
  16832. undo: C.bind(this, i),
  16833. post: this._uiManager.updateUI.bind(this._uiManager, this),
  16834. mustExec: !0,
  16835. type: iC.FREETEXT_SIZE,
  16836. overwriteIfSameType: !0,
  16837. keepUndo: !0
  16838. });
  16839. }, Ugg = function(g) {
  16840. const C = (e) => {
  16841. $(this, YA, this.editorDiv.style.color = e);
  16842. }, i = M(this, YA);
  16843. this.addCommands({
  16844. cmd: C.bind(this, g),
  16845. undo: C.bind(this, i),
  16846. post: this._uiManager.updateUI.bind(this._uiManager, this),
  16847. mustExec: !0,
  16848. type: iC.FREETEXT_COLOR,
  16849. overwriteIfSameType: !0,
  16850. keepUndo: !0
  16851. });
  16852. }, Egg = function() {
  16853. var i;
  16854. const g = [];
  16855. this.editorDiv.normalize();
  16856. let C = null;
  16857. for (const e of this.editorDiv.childNodes)
  16858. (C == null ? void 0 : C.nodeType) === Node.TEXT_NODE && e.nodeName === "BR" || (g.push(ig(i = NC, gn, VN).call(i, e)), C = e);
  16859. return g.join(`
  16860. `);
  16861. }, NN = function() {
  16862. const [g, C] = this.parentDimensions;
  16863. let i;
  16864. if (this.isAttachedToDOM)
  16865. i = this.div.getBoundingClientRect();
  16866. else {
  16867. const {
  16868. currentLayer: e,
  16869. div: A
  16870. } = this, s = A.style.display, l = A.classList.contains("hidden");
  16871. A.classList.remove("hidden"), A.style.display = "hidden", e.div.append(this.div), i = A.getBoundingClientRect(), A.remove(), A.style.display = s, A.classList.toggle("hidden", l);
  16872. }
  16873. this.rotation % 180 === this.parentRotation % 180 ? (this.width = i.width / g, this.height = i.height / C) : (this.width = i.height / g, this.height = i.width / C), this.fixAndSetPosition();
  16874. }, gn = new WeakSet(), VN = function(g) {
  16875. return (g.nodeType === Node.TEXT_NODE ? g.nodeValue : g.innerText).replaceAll(vY, "");
  16876. }, MN = function() {
  16877. if (this.editorDiv.replaceChildren(), !!M(this, be))
  16878. for (const g of M(this, be).split(`
  16879. `)) {
  16880. const C = document.createElement("div");
  16881. C.append(g ? document.createTextNode(g) : document.createElement("br")), this.editorDiv.append(C);
  16882. }
  16883. }, Pgg = function() {
  16884. return M(this, be).replaceAll(" ", " ");
  16885. }, KS = function(g) {
  16886. return g.replaceAll(" ", " ");
  16887. }, _gg = function(g) {
  16888. const {
  16889. value: C,
  16890. fontSize: i,
  16891. color: e,
  16892. pageIndex: A
  16893. } = this._initialData;
  16894. return this._hasBeenMoved || g.value !== C || g.fontSize !== i || g.color.some((s, l) => s !== e[l]) || g.pageIndex !== A;
  16895. }, tg(NC, gn), iI(NC, "_freeTextDefaultContent", ""), iI(NC, "_internalPadding", 0), iI(NC, "_defaultColor", null), iI(NC, "_defaultFontSize", 10), iI(NC, "_type", "freetext"), iI(NC, "_editorType", XI.FREETEXT);
  16896. let DS = NC;
  16897. class $g {
  16898. toSVGPath() {
  16899. BC("Abstract method `toSVGPath` must be implemented.");
  16900. }
  16901. get box() {
  16902. BC("Abstract getter `box` must be implemented.");
  16903. }
  16904. serialize(I, g) {
  16905. BC("Abstract method `serialize` must be implemented.");
  16906. }
  16907. static _rescale(I, g, C, i, e, A) {
  16908. A || (A = new Float32Array(I.length));
  16909. for (let s = 0, l = I.length; s < l; s += 2)
  16910. A[s] = g + I[s] * i, A[s + 1] = C + I[s + 1] * e;
  16911. return A;
  16912. }
  16913. static _rescaleAndSwap(I, g, C, i, e, A) {
  16914. A || (A = new Float32Array(I.length));
  16915. for (let s = 0, l = I.length; s < l; s += 2)
  16916. A[s] = g + I[s + 1] * i, A[s + 1] = C + I[s] * e;
  16917. return A;
  16918. }
  16919. static _translate(I, g, C, i) {
  16920. i || (i = new Float32Array(I.length));
  16921. for (let e = 0, A = I.length; e < A; e += 2)
  16922. i[e] = g + I[e], i[e + 1] = C + I[e + 1];
  16923. return i;
  16924. }
  16925. static svgRound(I) {
  16926. return Math.round(I * 1e4);
  16927. }
  16928. static _normalizePoint(I, g, C, i, e) {
  16929. switch (e) {
  16930. case 90:
  16931. return [1 - g / C, I / i];
  16932. case 180:
  16933. return [1 - I / C, 1 - g / i];
  16934. case 270:
  16935. return [g / C, 1 - I / i];
  16936. default:
  16937. return [I / C, g / i];
  16938. }
  16939. }
  16940. static _normalizePagePoint(I, g, C) {
  16941. switch (C) {
  16942. case 90:
  16943. return [1 - g, I];
  16944. case 180:
  16945. return [1 - I, 1 - g];
  16946. case 270:
  16947. return [g, 1 - I];
  16948. default:
  16949. return [I, g];
  16950. }
  16951. }
  16952. static createBezierPoints(I, g, C, i, e, A) {
  16953. return [(I + 5 * C) / 6, (g + 5 * i) / 6, (5 * C + e) / 6, (5 * i + A) / 6, (C + e) / 2, (i + A) / 2];
  16954. }
  16955. }
  16956. iI($g, "PRECISION", 1e-4);
  16957. var me, NA, C0, t0, Ys, TI, vc, Tc, kZ, zZ, i0, e0, Ha, JZ, jV, QV, Nt, $u, qgg, $gg, gIg, IIg, CIg, tIg;
  16958. const ml = class ml {
  16959. constructor({
  16960. x: I,
  16961. y: g
  16962. }, C, i, e, A, s = 0) {
  16963. tg(this, Nt);
  16964. tg(this, me);
  16965. tg(this, NA, []);
  16966. tg(this, C0);
  16967. tg(this, t0);
  16968. tg(this, Ys, []);
  16969. tg(this, TI, new Float32Array(18));
  16970. tg(this, vc);
  16971. tg(this, Tc);
  16972. tg(this, kZ);
  16973. tg(this, zZ);
  16974. tg(this, i0);
  16975. tg(this, e0);
  16976. tg(this, Ha, []);
  16977. $(this, me, C), $(this, e0, e * i), $(this, t0, A), M(this, TI).set([NaN, NaN, NaN, NaN, I, g], 6), $(this, C0, s), $(this, zZ, M(ml, JZ) * i), $(this, kZ, M(ml, QV) * i), $(this, i0, i), M(this, Ha).push(I, g);
  16978. }
  16979. isEmpty() {
  16980. return isNaN(M(this, TI)[8]);
  16981. }
  16982. add({
  16983. x: I,
  16984. y: g
  16985. }) {
  16986. var S;
  16987. $(this, vc, I), $(this, Tc, g);
  16988. const [C, i, e, A] = M(this, me);
  16989. let [s, l, n, a] = M(this, TI).subarray(8, 12);
  16990. const d = I - n, o = g - a, c = Math.hypot(d, o);
  16991. if (c < M(this, kZ))
  16992. return !1;
  16993. const r = c - M(this, zZ), h = r / c, b = h * d, u = h * o;
  16994. let m = s, Z = l;
  16995. s = n, l = a, n += b, a += u, (S = M(this, Ha)) == null || S.push(I, g);
  16996. const p = -u / r, Y = b / r, R = p * M(this, e0), X = Y * M(this, e0);
  16997. return M(this, TI).set(M(this, TI).subarray(2, 8), 0), M(this, TI).set([n + R, a + X], 4), M(this, TI).set(M(this, TI).subarray(14, 18), 12), M(this, TI).set([n - R, a - X], 16), isNaN(M(this, TI)[6]) ? (M(this, Ys).length === 0 && (M(this, TI).set([s + R, l + X], 2), M(this, Ys).push(NaN, NaN, NaN, NaN, (s + R - C) / e, (l + X - i) / A), M(this, TI).set([s - R, l - X], 14), M(this, NA).push(NaN, NaN, NaN, NaN, (s - R - C) / e, (l - X - i) / A)), M(this, TI).set([m, Z, s, l, n, a], 6), !this.isEmpty()) : (M(this, TI).set([m, Z, s, l, n, a], 6), Math.abs(Math.atan2(Z - l, m - s) - Math.atan2(u, b)) < Math.PI / 2 ? ([s, l, n, a] = M(this, TI).subarray(2, 6), M(this, Ys).push(NaN, NaN, NaN, NaN, ((s + n) / 2 - C) / e, ((l + a) / 2 - i) / A), [s, l, m, Z] = M(this, TI).subarray(14, 18), M(this, NA).push(NaN, NaN, NaN, NaN, ((m + s) / 2 - C) / e, ((Z + l) / 2 - i) / A), !0) : ([m, Z, s, l, n, a] = M(this, TI).subarray(0, 6), M(this, Ys).push(((m + 5 * s) / 6 - C) / e, ((Z + 5 * l) / 6 - i) / A, ((5 * s + n) / 6 - C) / e, ((5 * l + a) / 6 - i) / A, ((s + n) / 2 - C) / e, ((l + a) / 2 - i) / A), [n, a, s, l, m, Z] = M(this, TI).subarray(12, 18), M(this, NA).push(((m + 5 * s) / 6 - C) / e, ((Z + 5 * l) / 6 - i) / A, ((5 * s + n) / 6 - C) / e, ((5 * l + a) / 6 - i) / A, ((s + n) / 2 - C) / e, ((l + a) / 2 - i) / A), !0));
  16998. }
  16999. toSVGPath() {
  17000. if (this.isEmpty())
  17001. return "";
  17002. const I = M(this, Ys), g = M(this, NA);
  17003. if (isNaN(M(this, TI)[6]) && !this.isEmpty())
  17004. return ig(this, Nt, qgg).call(this);
  17005. const C = [];
  17006. C.push(`M${I[4]} ${I[5]}`);
  17007. for (let i = 6; i < I.length; i += 6)
  17008. isNaN(I[i]) ? C.push(`L${I[i + 4]} ${I[i + 5]}`) : C.push(`C${I[i]} ${I[i + 1]} ${I[i + 2]} ${I[i + 3]} ${I[i + 4]} ${I[i + 5]}`);
  17009. ig(this, Nt, gIg).call(this, C);
  17010. for (let i = g.length - 6; i >= 6; i -= 6)
  17011. isNaN(g[i]) ? C.push(`L${g[i + 4]} ${g[i + 5]}`) : C.push(`C${g[i]} ${g[i + 1]} ${g[i + 2]} ${g[i + 3]} ${g[i + 4]} ${g[i + 5]}`);
  17012. return ig(this, Nt, $gg).call(this, C), C.join(" ");
  17013. }
  17014. newFreeDrawOutline(I, g, C, i, e, A) {
  17015. return new iIg(I, g, C, i, e, A);
  17016. }
  17017. getOutlines() {
  17018. var d;
  17019. const I = M(this, Ys), g = M(this, NA), C = M(this, TI), [i, e, A, s] = M(this, me), l = new Float32Array((((d = M(this, Ha)) == null ? void 0 : d.length) ?? 0) + 2);
  17020. for (let o = 0, c = l.length - 2; o < c; o += 2)
  17021. l[o] = (M(this, Ha)[o] - i) / A, l[o + 1] = (M(this, Ha)[o + 1] - e) / s;
  17022. if (l[l.length - 2] = (M(this, vc) - i) / A, l[l.length - 1] = (M(this, Tc) - e) / s, isNaN(C[6]) && !this.isEmpty())
  17023. return ig(this, Nt, IIg).call(this, l);
  17024. const n = new Float32Array(M(this, Ys).length + 24 + M(this, NA).length);
  17025. let a = I.length;
  17026. for (let o = 0; o < a; o += 2) {
  17027. if (isNaN(I[o])) {
  17028. n[o] = n[o + 1] = NaN;
  17029. continue;
  17030. }
  17031. n[o] = I[o], n[o + 1] = I[o + 1];
  17032. }
  17033. a = ig(this, Nt, tIg).call(this, n, a);
  17034. for (let o = g.length - 6; o >= 6; o -= 6)
  17035. for (let c = 0; c < 6; c += 2) {
  17036. if (isNaN(g[o + c])) {
  17037. n[a] = n[a + 1] = NaN, a += 2;
  17038. continue;
  17039. }
  17040. n[a] = g[o + c], n[a + 1] = g[o + c + 1], a += 2;
  17041. }
  17042. return ig(this, Nt, CIg).call(this, n, a), this.newFreeDrawOutline(n, l, M(this, me), M(this, i0), M(this, C0), M(this, t0));
  17043. }
  17044. };
  17045. me = new WeakMap(), NA = new WeakMap(), C0 = new WeakMap(), t0 = new WeakMap(), Ys = new WeakMap(), TI = new WeakMap(), vc = new WeakMap(), Tc = new WeakMap(), kZ = new WeakMap(), zZ = new WeakMap(), i0 = new WeakMap(), e0 = new WeakMap(), Ha = new WeakMap(), JZ = new WeakMap(), jV = new WeakMap(), QV = new WeakMap(), Nt = new WeakSet(), $u = function() {
  17046. const I = M(this, TI).subarray(4, 6), g = M(this, TI).subarray(16, 18), [C, i, e, A] = M(this, me);
  17047. return [(M(this, vc) + (I[0] - g[0]) / 2 - C) / e, (M(this, Tc) + (I[1] - g[1]) / 2 - i) / A, (M(this, vc) + (g[0] - I[0]) / 2 - C) / e, (M(this, Tc) + (g[1] - I[1]) / 2 - i) / A];
  17048. }, qgg = function() {
  17049. const [I, g, C, i] = M(this, me), [e, A, s, l] = ig(this, Nt, $u).call(this);
  17050. return `M${(M(this, TI)[2] - I) / C} ${(M(this, TI)[3] - g) / i} L${(M(this, TI)[4] - I) / C} ${(M(this, TI)[5] - g) / i} L${e} ${A} L${s} ${l} L${(M(this, TI)[16] - I) / C} ${(M(this, TI)[17] - g) / i} L${(M(this, TI)[14] - I) / C} ${(M(this, TI)[15] - g) / i} Z`;
  17051. }, $gg = function(I) {
  17052. const g = M(this, NA);
  17053. I.push(`L${g[4]} ${g[5]} Z`);
  17054. }, gIg = function(I) {
  17055. const [g, C, i, e] = M(this, me), A = M(this, TI).subarray(4, 6), s = M(this, TI).subarray(16, 18), [l, n, a, d] = ig(this, Nt, $u).call(this);
  17056. I.push(`L${(A[0] - g) / i} ${(A[1] - C) / e} L${l} ${n} L${a} ${d} L${(s[0] - g) / i} ${(s[1] - C) / e}`);
  17057. }, IIg = function(I) {
  17058. const g = M(this, TI), [C, i, e, A] = M(this, me), [s, l, n, a] = ig(this, Nt, $u).call(this), d = new Float32Array(36);
  17059. return d.set([NaN, NaN, NaN, NaN, (g[2] - C) / e, (g[3] - i) / A, NaN, NaN, NaN, NaN, (g[4] - C) / e, (g[5] - i) / A, NaN, NaN, NaN, NaN, s, l, NaN, NaN, NaN, NaN, n, a, NaN, NaN, NaN, NaN, (g[16] - C) / e, (g[17] - i) / A, NaN, NaN, NaN, NaN, (g[14] - C) / e, (g[15] - i) / A], 0), this.newFreeDrawOutline(d, I, M(this, me), M(this, i0), M(this, C0), M(this, t0));
  17060. }, CIg = function(I, g) {
  17061. const C = M(this, NA);
  17062. return I.set([NaN, NaN, NaN, NaN, C[4], C[5]], g), g += 6;
  17063. }, tIg = function(I, g) {
  17064. const C = M(this, TI).subarray(4, 6), i = M(this, TI).subarray(16, 18), [e, A, s, l] = M(this, me), [n, a, d, o] = ig(this, Nt, $u).call(this);
  17065. return I.set([NaN, NaN, NaN, NaN, (C[0] - e) / s, (C[1] - A) / l, NaN, NaN, NaN, NaN, n, a, NaN, NaN, NaN, NaN, d, o, NaN, NaN, NaN, NaN, (i[0] - e) / s, (i[1] - A) / l], g), g += 24;
  17066. }, tg(ml, JZ, 8), tg(ml, jV, 2), tg(ml, QV, M(ml, JZ) + M(ml, jV));
  17067. let AV = ml;
  17068. var A0, xc, kl, LZ, Ze, vZ, et, OV, eIg;
  17069. class iIg extends $g {
  17070. constructor(g, C, i, e, A, s) {
  17071. super();
  17072. tg(this, OV);
  17073. tg(this, A0);
  17074. tg(this, xc, new Float32Array(4));
  17075. tg(this, kl);
  17076. tg(this, LZ);
  17077. tg(this, Ze);
  17078. tg(this, vZ);
  17079. tg(this, et);
  17080. $(this, et, g), $(this, Ze, C), $(this, A0, i), $(this, vZ, e), $(this, kl, A), $(this, LZ, s), this.lastPoint = [NaN, NaN], ig(this, OV, eIg).call(this, s);
  17081. const [l, n, a, d] = M(this, xc);
  17082. for (let o = 0, c = g.length; o < c; o += 2)
  17083. g[o] = (g[o] - l) / a, g[o + 1] = (g[o + 1] - n) / d;
  17084. for (let o = 0, c = C.length; o < c; o += 2)
  17085. C[o] = (C[o] - l) / a, C[o + 1] = (C[o + 1] - n) / d;
  17086. }
  17087. toSVGPath() {
  17088. const g = [`M${M(this, et)[4]} ${M(this, et)[5]}`];
  17089. for (let C = 6, i = M(this, et).length; C < i; C += 6) {
  17090. if (isNaN(M(this, et)[C])) {
  17091. g.push(`L${M(this, et)[C + 4]} ${M(this, et)[C + 5]}`);
  17092. continue;
  17093. }
  17094. g.push(`C${M(this, et)[C]} ${M(this, et)[C + 1]} ${M(this, et)[C + 2]} ${M(this, et)[C + 3]} ${M(this, et)[C + 4]} ${M(this, et)[C + 5]}`);
  17095. }
  17096. return g.push("Z"), g.join(" ");
  17097. }
  17098. serialize([g, C, i, e], A) {
  17099. const s = i - g, l = e - C;
  17100. let n, a;
  17101. switch (A) {
  17102. case 0:
  17103. n = $g._rescale(M(this, et), g, e, s, -l), a = $g._rescale(M(this, Ze), g, e, s, -l);
  17104. break;
  17105. case 90:
  17106. n = $g._rescaleAndSwap(M(this, et), g, C, s, l), a = $g._rescaleAndSwap(M(this, Ze), g, C, s, l);
  17107. break;
  17108. case 180:
  17109. n = $g._rescale(M(this, et), i, C, -s, l), a = $g._rescale(M(this, Ze), i, C, -s, l);
  17110. break;
  17111. case 270:
  17112. n = $g._rescaleAndSwap(M(this, et), i, e, -s, -l), a = $g._rescaleAndSwap(M(this, Ze), i, e, -s, -l);
  17113. break;
  17114. }
  17115. return {
  17116. outline: Array.from(n),
  17117. points: [Array.from(a)]
  17118. };
  17119. }
  17120. get box() {
  17121. return M(this, xc);
  17122. }
  17123. newOutliner(g, C, i, e, A, s = 0) {
  17124. return new AV(g, C, i, e, A, s);
  17125. }
  17126. getNewOutline(g, C) {
  17127. const [i, e, A, s] = M(this, xc), [l, n, a, d] = M(this, A0), o = A * a, c = s * d, r = i * a + l, h = e * d + n, b = this.newOutliner({
  17128. x: M(this, Ze)[0] * o + r,
  17129. y: M(this, Ze)[1] * c + h
  17130. }, M(this, A0), M(this, vZ), g, M(this, LZ), C ?? M(this, kl));
  17131. for (let u = 2; u < M(this, Ze).length; u += 2)
  17132. b.add({
  17133. x: M(this, Ze)[u] * o + r,
  17134. y: M(this, Ze)[u + 1] * c + h
  17135. });
  17136. return b.getOutlines();
  17137. }
  17138. }
  17139. A0 = new WeakMap(), xc = new WeakMap(), kl = new WeakMap(), LZ = new WeakMap(), Ze = new WeakMap(), vZ = new WeakMap(), et = new WeakMap(), OV = new WeakSet(), eIg = function(g) {
  17140. const C = M(this, et);
  17141. let i = C[4], e = C[5];
  17142. const A = [i, e, i, e];
  17143. let s = i, l = e;
  17144. const n = g ? Math.max : Math.min;
  17145. for (let d = 6, o = C.length; d < o; d += 6) {
  17146. const c = C[d + 4], r = C[d + 5];
  17147. if (isNaN(C[d]))
  17148. AI.pointBoundingBox(c, r, A), l < r ? (s = c, l = r) : l === r && (s = n(s, c));
  17149. else {
  17150. const h = [1 / 0, 1 / 0, -1 / 0, -1 / 0];
  17151. AI.bezierBoundingBox(i, e, ...C.slice(d, d + 6), h), AI.rectBoundingBox(...h, A), l < h[3] ? (s = h[2], l = h[3]) : l === h[3] && (s = n(s, h[2]));
  17152. }
  17153. i = c, e = r;
  17154. }
  17155. const a = M(this, xc);
  17156. a[0] = A[0] - M(this, kl), a[1] = A[1] - M(this, kl), a[2] = A[2] - A[0] + 2 * M(this, kl), a[3] = A[3] - A[1] + 2 * M(this, kl), this.lastPoint = [s, l];
  17157. };
  17158. var TZ, xZ, Xa, VA, Xi, AIg, RN, sIg, lIg, kS;
  17159. class FS {
  17160. constructor(I, g = 0, C = 0, i = !0) {
  17161. tg(this, Xi);
  17162. tg(this, TZ);
  17163. tg(this, xZ);
  17164. tg(this, Xa, []);
  17165. tg(this, VA, []);
  17166. const e = [1 / 0, 1 / 0, -1 / 0, -1 / 0], A = 10 ** -4;
  17167. for (const {
  17168. x: c,
  17169. y: r,
  17170. width: h,
  17171. height: b
  17172. } of I) {
  17173. const u = Math.floor((c - g) / A) * A, m = Math.ceil((c + h + g) / A) * A, Z = Math.floor((r - g) / A) * A, p = Math.ceil((r + b + g) / A) * A, Y = [u, Z, p, !0], R = [m, Z, p, !1];
  17174. M(this, Xa).push(Y, R), AI.rectBoundingBox(u, Z, m, p, e);
  17175. }
  17176. const s = e[2] - e[0] + 2 * C, l = e[3] - e[1] + 2 * C, n = e[0] - C, a = e[1] - C, d = M(this, Xa).at(i ? -1 : -2), o = [d[0], d[2]];
  17177. for (const c of M(this, Xa)) {
  17178. const [r, h, b] = c;
  17179. c[0] = (r - n) / s, c[1] = (h - a) / l, c[2] = (b - a) / l;
  17180. }
  17181. $(this, TZ, new Float32Array([n, a, s, l])), $(this, xZ, o);
  17182. }
  17183. getOutlines() {
  17184. M(this, Xa).sort((g, C) => g[0] - C[0] || g[1] - C[1] || g[2] - C[2]);
  17185. const I = [];
  17186. for (const g of M(this, Xa))
  17187. g[3] ? (I.push(...ig(this, Xi, kS).call(this, g)), ig(this, Xi, sIg).call(this, g)) : (ig(this, Xi, lIg).call(this, g), I.push(...ig(this, Xi, kS).call(this, g)));
  17188. return ig(this, Xi, AIg).call(this, I);
  17189. }
  17190. }
  17191. TZ = new WeakMap(), xZ = new WeakMap(), Xa = new WeakMap(), VA = new WeakMap(), Xi = new WeakSet(), AIg = function(I) {
  17192. const g = [], C = /* @__PURE__ */ new Set();
  17193. for (const A of I) {
  17194. const [s, l, n] = A;
  17195. g.push([s, l, A], [s, n, A]);
  17196. }
  17197. g.sort((A, s) => A[1] - s[1] || A[0] - s[0]);
  17198. for (let A = 0, s = g.length; A < s; A += 2) {
  17199. const l = g[A][2], n = g[A + 1][2];
  17200. l.push(n), n.push(l), C.add(l), C.add(n);
  17201. }
  17202. const i = [];
  17203. let e;
  17204. for (; C.size > 0; ) {
  17205. const A = C.values().next().value;
  17206. let [s, l, n, a, d] = A;
  17207. C.delete(A);
  17208. let o = s, c = l;
  17209. for (e = [s, n], i.push(e); ; ) {
  17210. let r;
  17211. if (C.has(a))
  17212. r = a;
  17213. else if (C.has(d))
  17214. r = d;
  17215. else
  17216. break;
  17217. C.delete(r), [s, l, n, a, d] = r, o !== s && (e.push(o, c, s, c === l ? l : n), o = s), c = c === l ? n : l;
  17218. }
  17219. e.push(o, c);
  17220. }
  17221. return new Ndg(i, M(this, TZ), M(this, xZ));
  17222. }, RN = function(I) {
  17223. const g = M(this, VA);
  17224. let C = 0, i = g.length - 1;
  17225. for (; C <= i; ) {
  17226. const e = C + i >> 1, A = g[e][0];
  17227. if (A === I)
  17228. return e;
  17229. A < I ? C = e + 1 : i = e - 1;
  17230. }
  17231. return i + 1;
  17232. }, sIg = function([, I, g]) {
  17233. const C = ig(this, Xi, RN).call(this, I);
  17234. M(this, VA).splice(C, 0, [I, g]);
  17235. }, lIg = function([, I, g]) {
  17236. const C = ig(this, Xi, RN).call(this, I);
  17237. for (let i = C; i < M(this, VA).length; i++) {
  17238. const [e, A] = M(this, VA)[i];
  17239. if (e !== I)
  17240. break;
  17241. if (e === I && A === g) {
  17242. M(this, VA).splice(i, 1);
  17243. return;
  17244. }
  17245. }
  17246. for (let i = C - 1; i >= 0; i--) {
  17247. const [e, A] = M(this, VA)[i];
  17248. if (e !== I)
  17249. break;
  17250. if (e === I && A === g) {
  17251. M(this, VA).splice(i, 1);
  17252. return;
  17253. }
  17254. }
  17255. }, kS = function(I) {
  17256. const [g, C, i] = I, e = [[g, C, i]], A = ig(this, Xi, RN).call(this, i);
  17257. for (let s = 0; s < A; s++) {
  17258. const [l, n] = M(this, VA)[s];
  17259. for (let a = 0, d = e.length; a < d; a++) {
  17260. const [, o, c] = e[a];
  17261. if (!(n <= o || c <= l)) {
  17262. if (o >= l) {
  17263. if (c > n)
  17264. e[a][1] = n;
  17265. else {
  17266. if (d === 1)
  17267. return [];
  17268. e.splice(a, 1), a--, d--;
  17269. }
  17270. continue;
  17271. }
  17272. e[a][2] = l, c > n && e.push([g, n, c]);
  17273. }
  17274. }
  17275. }
  17276. return e;
  17277. };
  17278. var jZ, s0;
  17279. class Ndg extends $g {
  17280. constructor(g, C, i) {
  17281. super();
  17282. tg(this, jZ);
  17283. tg(this, s0);
  17284. $(this, s0, g), $(this, jZ, C), this.lastPoint = i;
  17285. }
  17286. toSVGPath() {
  17287. const g = [];
  17288. for (const C of M(this, s0)) {
  17289. let [i, e] = C;
  17290. g.push(`M${i} ${e}`);
  17291. for (let A = 2; A < C.length; A += 2) {
  17292. const s = C[A], l = C[A + 1];
  17293. s === i ? (g.push(`V${l}`), e = l) : l === e && (g.push(`H${s}`), i = s);
  17294. }
  17295. g.push("Z");
  17296. }
  17297. return g.join(" ");
  17298. }
  17299. serialize([g, C, i, e], A) {
  17300. const s = [], l = i - g, n = e - C;
  17301. for (const a of M(this, s0)) {
  17302. const d = new Array(a.length);
  17303. for (let o = 0; o < a.length; o += 2)
  17304. d[o] = g + a[o] * l, d[o + 1] = e - a[o + 1] * n;
  17305. s.push(d);
  17306. }
  17307. return s;
  17308. }
  17309. get box() {
  17310. return M(this, jZ);
  17311. }
  17312. get classNamesForOutlining() {
  17313. return ["highlightOutline"];
  17314. }
  17315. }
  17316. jZ = new WeakMap(), s0 = new WeakMap();
  17317. class zS extends AV {
  17318. newFreeDrawOutline(I, g, C, i, e, A) {
  17319. return new Vdg(I, g, C, i, e, A);
  17320. }
  17321. }
  17322. class Vdg extends iIg {
  17323. newOutliner(I, g, C, i, e, A = 0) {
  17324. return new zS(I, g, C, i, e, A);
  17325. }
  17326. }
  17327. var MA, jc, l0, Wt, QZ, n0, OZ, UZ, Sa, RA, a0, EZ, pC, JS, LS, vS, xo, nIg, $n;
  17328. const ji = class ji {
  17329. constructor({
  17330. editor: I = null,
  17331. uiManager: g = null
  17332. }) {
  17333. tg(this, pC);
  17334. tg(this, MA, null);
  17335. tg(this, jc, null);
  17336. tg(this, l0);
  17337. tg(this, Wt, null);
  17338. tg(this, QZ, !1);
  17339. tg(this, n0, !1);
  17340. tg(this, OZ, null);
  17341. tg(this, UZ);
  17342. tg(this, Sa, null);
  17343. tg(this, RA, null);
  17344. tg(this, a0);
  17345. var C;
  17346. I ? ($(this, n0, !1), $(this, a0, iC.HIGHLIGHT_COLOR), $(this, OZ, I)) : ($(this, n0, !0), $(this, a0, iC.HIGHLIGHT_DEFAULT_COLOR)), $(this, RA, (I == null ? void 0 : I._uiManager) || g), $(this, UZ, M(this, RA)._eventBus), $(this, l0, (I == null ? void 0 : I.color) || ((C = M(this, RA)) == null ? void 0 : C.highlightColors.values().next().value) || "#FFFF98"), M(ji, EZ) || $(ji, EZ, Object.freeze({
  17347. blue: "pdfjs-editor-colorpicker-blue",
  17348. green: "pdfjs-editor-colorpicker-green",
  17349. pink: "pdfjs-editor-colorpicker-pink",
  17350. red: "pdfjs-editor-colorpicker-red",
  17351. yellow: "pdfjs-editor-colorpicker-yellow"
  17352. }));
  17353. }
  17354. static get _keyboardManager() {
  17355. return UI(this, "_keyboardManager", new lG([[["Escape", "mac+Escape"], ji.prototype._hideDropdownFromKeyboard], [[" ", "mac+ "], ji.prototype._colorSelectFromKeyboard], [["ArrowDown", "ArrowRight", "mac+ArrowDown", "mac+ArrowRight"], ji.prototype._moveToNext], [["ArrowUp", "ArrowLeft", "mac+ArrowUp", "mac+ArrowLeft"], ji.prototype._moveToPrevious], [["Home", "mac+Home"], ji.prototype._moveToBeginning], [["End", "mac+End"], ji.prototype._moveToEnd]]));
  17356. }
  17357. renderButton() {
  17358. const I = $(this, MA, document.createElement("button"));
  17359. I.className = "colorPicker", I.tabIndex = "0", I.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-button"), I.setAttribute("aria-haspopup", !0);
  17360. const g = M(this, RA)._signal;
  17361. I.addEventListener("click", ig(this, pC, xo).bind(this), {
  17362. signal: g
  17363. }), I.addEventListener("keydown", ig(this, pC, vS).bind(this), {
  17364. signal: g
  17365. });
  17366. const C = $(this, jc, document.createElement("span"));
  17367. return C.className = "swatch", C.setAttribute("aria-hidden", !0), C.style.backgroundColor = M(this, l0), I.append(C), I;
  17368. }
  17369. renderMainDropdown() {
  17370. const I = $(this, Wt, ig(this, pC, JS).call(this));
  17371. return I.setAttribute("aria-orientation", "horizontal"), I.setAttribute("aria-labelledby", "highlightColorPickerLabel"), I;
  17372. }
  17373. _colorSelectFromKeyboard(I) {
  17374. if (I.target === M(this, MA)) {
  17375. ig(this, pC, xo).call(this, I);
  17376. return;
  17377. }
  17378. const g = I.target.getAttribute("data-color");
  17379. g && ig(this, pC, LS).call(this, g, I);
  17380. }
  17381. _moveToNext(I) {
  17382. var g, C;
  17383. if (!M(this, pC, $n)) {
  17384. ig(this, pC, xo).call(this, I);
  17385. return;
  17386. }
  17387. if (I.target === M(this, MA)) {
  17388. (g = M(this, Wt).firstChild) == null || g.focus();
  17389. return;
  17390. }
  17391. (C = I.target.nextSibling) == null || C.focus();
  17392. }
  17393. _moveToPrevious(I) {
  17394. var g, C;
  17395. if (I.target === ((g = M(this, Wt)) == null ? void 0 : g.firstChild) || I.target === M(this, MA)) {
  17396. M(this, pC, $n) && this._hideDropdownFromKeyboard();
  17397. return;
  17398. }
  17399. M(this, pC, $n) || ig(this, pC, xo).call(this, I), (C = I.target.previousSibling) == null || C.focus();
  17400. }
  17401. _moveToBeginning(I) {
  17402. var g;
  17403. if (!M(this, pC, $n)) {
  17404. ig(this, pC, xo).call(this, I);
  17405. return;
  17406. }
  17407. (g = M(this, Wt).firstChild) == null || g.focus();
  17408. }
  17409. _moveToEnd(I) {
  17410. var g;
  17411. if (!M(this, pC, $n)) {
  17412. ig(this, pC, xo).call(this, I);
  17413. return;
  17414. }
  17415. (g = M(this, Wt).lastChild) == null || g.focus();
  17416. }
  17417. hideDropdown() {
  17418. var I, g;
  17419. (I = M(this, Wt)) == null || I.classList.add("hidden"), (g = M(this, Sa)) == null || g.abort(), $(this, Sa, null);
  17420. }
  17421. _hideDropdownFromKeyboard() {
  17422. var I;
  17423. if (!M(this, n0)) {
  17424. if (!M(this, pC, $n)) {
  17425. (I = M(this, OZ)) == null || I.unselect();
  17426. return;
  17427. }
  17428. this.hideDropdown(), M(this, MA).focus({
  17429. preventScroll: !0,
  17430. focusVisible: M(this, QZ)
  17431. });
  17432. }
  17433. }
  17434. updateColor(I) {
  17435. if (M(this, jc) && (M(this, jc).style.backgroundColor = I), !M(this, Wt))
  17436. return;
  17437. const g = M(this, RA).highlightColors.values();
  17438. for (const C of M(this, Wt).children)
  17439. C.setAttribute("aria-selected", g.next().value === I);
  17440. }
  17441. destroy() {
  17442. var I, g;
  17443. (I = M(this, MA)) == null || I.remove(), $(this, MA, null), $(this, jc, null), (g = M(this, Wt)) == null || g.remove(), $(this, Wt, null);
  17444. }
  17445. };
  17446. MA = new WeakMap(), jc = new WeakMap(), l0 = new WeakMap(), Wt = new WeakMap(), QZ = new WeakMap(), n0 = new WeakMap(), OZ = new WeakMap(), UZ = new WeakMap(), Sa = new WeakMap(), RA = new WeakMap(), a0 = new WeakMap(), EZ = new WeakMap(), pC = new WeakSet(), JS = function() {
  17447. const I = document.createElement("div"), g = M(this, RA)._signal;
  17448. I.addEventListener("contextmenu", zA, {
  17449. signal: g
  17450. }), I.className = "dropdown", I.role = "listbox", I.setAttribute("aria-multiselectable", !1), I.setAttribute("aria-orientation", "vertical"), I.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-dropdown");
  17451. for (const [C, i] of M(this, RA).highlightColors) {
  17452. const e = document.createElement("button");
  17453. e.tabIndex = "0", e.role = "option", e.setAttribute("data-color", i), e.title = C, e.setAttribute("data-l10n-id", M(ji, EZ)[C]);
  17454. const A = document.createElement("span");
  17455. e.append(A), A.className = "swatch", A.style.backgroundColor = i, e.setAttribute("aria-selected", i === M(this, l0)), e.addEventListener("click", ig(this, pC, LS).bind(this, i), {
  17456. signal: g
  17457. }), I.append(e);
  17458. }
  17459. return I.addEventListener("keydown", ig(this, pC, vS).bind(this), {
  17460. signal: g
  17461. }), I;
  17462. }, LS = function(I, g) {
  17463. g.stopPropagation(), M(this, UZ).dispatch("switchannotationeditorparams", {
  17464. source: this,
  17465. type: M(this, a0),
  17466. value: I
  17467. });
  17468. }, vS = function(I) {
  17469. ji._keyboardManager.exec(this, I);
  17470. }, xo = function(I) {
  17471. if (M(this, pC, $n)) {
  17472. this.hideDropdown();
  17473. return;
  17474. }
  17475. if ($(this, QZ, I.detail === 0), M(this, Sa) || ($(this, Sa, new AbortController()), window.addEventListener("pointerdown", ig(this, pC, nIg).bind(this), {
  17476. signal: M(this, RA).combinedSignal(M(this, Sa))
  17477. })), M(this, Wt)) {
  17478. M(this, Wt).classList.remove("hidden");
  17479. return;
  17480. }
  17481. const g = $(this, Wt, ig(this, pC, JS).call(this));
  17482. M(this, MA).append(g);
  17483. }, nIg = function(I) {
  17484. var g;
  17485. (g = M(this, Wt)) != null && g.contains(I.target) || this.hideDropdown();
  17486. }, $n = function() {
  17487. return M(this, Wt) && !M(this, Wt).classList.contains("hidden");
  17488. }, tg(ji, EZ, null);
  17489. let sV = ji;
  17490. var o0, PZ, zl, Qc, c0, Ui, _Z, qZ, Oc, Ee, Ge, _t, d0, Jl, Zi, r0, Pe, $Z, kI, TS, fN, aIg, oIg, cIg, xS, jo, CA, qr, dIg, HN, gm, rIg, hIg, bIg, uIg, mIg;
  17491. const cC = class cC extends TC {
  17492. constructor(g) {
  17493. super({
  17494. ...g,
  17495. name: "highlightEditor"
  17496. });
  17497. tg(this, kI);
  17498. tg(this, o0, null);
  17499. tg(this, PZ, 0);
  17500. tg(this, zl);
  17501. tg(this, Qc, null);
  17502. tg(this, c0, null);
  17503. tg(this, Ui, null);
  17504. tg(this, _Z, null);
  17505. tg(this, qZ, 0);
  17506. tg(this, Oc, null);
  17507. tg(this, Ee, null);
  17508. tg(this, Ge, null);
  17509. tg(this, _t, !1);
  17510. tg(this, d0, null);
  17511. tg(this, Jl);
  17512. tg(this, Zi, null);
  17513. tg(this, r0, "");
  17514. tg(this, Pe);
  17515. tg(this, $Z, "");
  17516. this.color = g.color || cC._defaultColor, $(this, Pe, g.thickness || cC._defaultThickness), $(this, Jl, g.opacity || cC._defaultOpacity), $(this, zl, g.boxes || null), $(this, $Z, g.methodOfCreation || ""), $(this, r0, g.text || ""), this._isDraggable = !1, this.defaultL10nId = "pdfjs-editor-highlight-editor", g.highlightId > -1 ? ($(this, _t, !0), ig(this, kI, fN).call(this, g), ig(this, kI, jo).call(this)) : M(this, zl) && ($(this, o0, g.anchorNode), $(this, PZ, g.anchorOffset), $(this, _Z, g.focusNode), $(this, qZ, g.focusOffset), ig(this, kI, TS).call(this), ig(this, kI, jo).call(this), this.rotate(this.rotation));
  17517. }
  17518. static get _keyboardManager() {
  17519. const g = cC.prototype;
  17520. return UI(this, "_keyboardManager", new lG([[["ArrowLeft", "mac+ArrowLeft"], g._moveCaret, {
  17521. args: [0]
  17522. }], [["ArrowRight", "mac+ArrowRight"], g._moveCaret, {
  17523. args: [1]
  17524. }], [["ArrowUp", "mac+ArrowUp"], g._moveCaret, {
  17525. args: [2]
  17526. }], [["ArrowDown", "mac+ArrowDown"], g._moveCaret, {
  17527. args: [3]
  17528. }]]));
  17529. }
  17530. get telemetryInitialData() {
  17531. return {
  17532. action: "added",
  17533. type: M(this, _t) ? "free_highlight" : "highlight",
  17534. color: this._uiManager.highlightColorNames.get(this.color),
  17535. thickness: M(this, Pe),
  17536. methodOfCreation: M(this, $Z)
  17537. };
  17538. }
  17539. get telemetryFinalData() {
  17540. return {
  17541. type: "highlight",
  17542. color: this._uiManager.highlightColorNames.get(this.color)
  17543. };
  17544. }
  17545. static computeTelemetryFinalData(g) {
  17546. return {
  17547. numberOfColors: g.get("color").size
  17548. };
  17549. }
  17550. static initialize(g, C) {
  17551. var i;
  17552. TC.initialize(g, C), cC._defaultColor || (cC._defaultColor = ((i = C.highlightColors) == null ? void 0 : i.values().next().value) || "#fff066");
  17553. }
  17554. static updateDefaultParams(g, C) {
  17555. switch (g) {
  17556. case iC.HIGHLIGHT_DEFAULT_COLOR:
  17557. cC._defaultColor = C;
  17558. break;
  17559. case iC.HIGHLIGHT_THICKNESS:
  17560. cC._defaultThickness = C;
  17561. break;
  17562. }
  17563. }
  17564. translateInPage(g, C) {
  17565. }
  17566. get toolbarPosition() {
  17567. return M(this, d0);
  17568. }
  17569. updateParams(g, C) {
  17570. switch (g) {
  17571. case iC.HIGHLIGHT_COLOR:
  17572. ig(this, kI, aIg).call(this, C);
  17573. break;
  17574. case iC.HIGHLIGHT_THICKNESS:
  17575. ig(this, kI, oIg).call(this, C);
  17576. break;
  17577. }
  17578. }
  17579. static get defaultPropertiesToUpdate() {
  17580. return [[iC.HIGHLIGHT_DEFAULT_COLOR, cC._defaultColor], [iC.HIGHLIGHT_THICKNESS, cC._defaultThickness]];
  17581. }
  17582. get propertiesToUpdate() {
  17583. return [[iC.HIGHLIGHT_COLOR, this.color || cC._defaultColor], [iC.HIGHLIGHT_THICKNESS, M(this, Pe) || cC._defaultThickness], [iC.HIGHLIGHT_FREE, M(this, _t)]];
  17584. }
  17585. async addEditToolbar() {
  17586. const g = await super.addEditToolbar();
  17587. return g ? (this._uiManager.highlightColors && ($(this, c0, new sV({
  17588. editor: this
  17589. })), g.addColorPicker(M(this, c0))), g) : null;
  17590. }
  17591. disableEditing() {
  17592. super.disableEditing(), this.div.classList.toggle("disabled", !0);
  17593. }
  17594. enableEditing() {
  17595. super.enableEditing(), this.div.classList.toggle("disabled", !1);
  17596. }
  17597. fixAndSetPosition() {
  17598. return super.fixAndSetPosition(ig(this, kI, gm).call(this));
  17599. }
  17600. getBaseTranslation() {
  17601. return [0, 0];
  17602. }
  17603. getRect(g, C) {
  17604. return super.getRect(g, C, ig(this, kI, gm).call(this));
  17605. }
  17606. onceAdded(g) {
  17607. this.annotationElementId || this.parent.addUndoableEditor(this), g && this.div.focus();
  17608. }
  17609. remove() {
  17610. ig(this, kI, xS).call(this), this._reportTelemetry({
  17611. action: "deleted"
  17612. }), super.remove();
  17613. }
  17614. rebuild() {
  17615. this.parent && (super.rebuild(), this.div !== null && (ig(this, kI, jo).call(this), this.isAttachedToDOM || this.parent.add(this)));
  17616. }
  17617. setParent(g) {
  17618. var i;
  17619. let C = !1;
  17620. this.parent && !g ? ig(this, kI, xS).call(this) : g && (ig(this, kI, jo).call(this, g), C = !this.parent && ((i = this.div) == null ? void 0 : i.classList.contains("selectedEditor"))), super.setParent(g), this.show(this._isVisible), C && this.select();
  17621. }
  17622. rotate(g) {
  17623. var e, A, s;
  17624. const {
  17625. drawLayer: C
  17626. } = this.parent;
  17627. let i;
  17628. M(this, _t) ? (g = (g - this.rotation + 360) % 360, i = ig(e = cC, CA, qr).call(e, M(this, Ee).box, g)) : i = ig(A = cC, CA, qr).call(A, [this.x, this.y, this.width, this.height], g), C.updateProperties(M(this, Ge), {
  17629. bbox: i,
  17630. root: {
  17631. "data-main-rotation": g
  17632. }
  17633. }), C.updateProperties(M(this, Zi), {
  17634. bbox: ig(s = cC, CA, qr).call(s, M(this, Ui).box, g),
  17635. root: {
  17636. "data-main-rotation": g
  17637. }
  17638. });
  17639. }
  17640. render() {
  17641. if (this.div)
  17642. return this.div;
  17643. const g = super.render();
  17644. M(this, r0) && (g.setAttribute("aria-label", M(this, r0)), g.setAttribute("role", "mark")), M(this, _t) ? g.classList.add("free") : this.div.addEventListener("keydown", ig(this, kI, dIg).bind(this), {
  17645. signal: this._uiManager._signal
  17646. });
  17647. const C = $(this, Oc, document.createElement("div"));
  17648. g.append(C), C.setAttribute("aria-hidden", "true"), C.className = "internal", C.style.clipPath = M(this, Qc);
  17649. const [i, e] = this.parentDimensions;
  17650. return this.setDims(this.width * i, this.height * e), m9(this, M(this, Oc), ["pointerover", "pointerleave"]), this.enableEditing(), g;
  17651. }
  17652. pointerover() {
  17653. var g;
  17654. this.isSelected || (g = this.parent) == null || g.drawLayer.updateProperties(M(this, Zi), {
  17655. rootClass: {
  17656. hovered: !0
  17657. }
  17658. });
  17659. }
  17660. pointerleave() {
  17661. var g;
  17662. this.isSelected || (g = this.parent) == null || g.drawLayer.updateProperties(M(this, Zi), {
  17663. rootClass: {
  17664. hovered: !1
  17665. }
  17666. });
  17667. }
  17668. _moveCaret(g) {
  17669. switch (this.parent.unselect(this), g) {
  17670. case 0:
  17671. case 2:
  17672. ig(this, kI, HN).call(this, !0);
  17673. break;
  17674. case 1:
  17675. case 3:
  17676. ig(this, kI, HN).call(this, !1);
  17677. break;
  17678. }
  17679. }
  17680. select() {
  17681. var g;
  17682. super.select(), M(this, Zi) && ((g = this.parent) == null || g.drawLayer.updateProperties(M(this, Zi), {
  17683. rootClass: {
  17684. hovered: !1,
  17685. selected: !0
  17686. }
  17687. }));
  17688. }
  17689. unselect() {
  17690. var g;
  17691. super.unselect(), M(this, Zi) && ((g = this.parent) == null || g.drawLayer.updateProperties(M(this, Zi), {
  17692. rootClass: {
  17693. selected: !1
  17694. }
  17695. }), M(this, _t) || ig(this, kI, HN).call(this, !1));
  17696. }
  17697. get _mustFixPosition() {
  17698. return !M(this, _t);
  17699. }
  17700. show(g = this._isVisible) {
  17701. super.show(g), this.parent && (this.parent.drawLayer.updateProperties(M(this, Ge), {
  17702. rootClass: {
  17703. hidden: !g
  17704. }
  17705. }), this.parent.drawLayer.updateProperties(M(this, Zi), {
  17706. rootClass: {
  17707. hidden: !g
  17708. }
  17709. }));
  17710. }
  17711. static startHighlighting(g, C, {
  17712. target: i,
  17713. x: e,
  17714. y: A
  17715. }) {
  17716. const {
  17717. x: s,
  17718. y: l,
  17719. width: n,
  17720. height: a
  17721. } = i.getBoundingClientRect(), d = new AbortController(), o = g.combinedSignal(d), c = (r) => {
  17722. d.abort(), ig(this, CA, uIg).call(this, g, r);
  17723. };
  17724. window.addEventListener("blur", c, {
  17725. signal: o
  17726. }), window.addEventListener("pointerup", c, {
  17727. signal: o
  17728. }), window.addEventListener("pointerdown", ht, {
  17729. capture: !0,
  17730. passive: !1,
  17731. signal: o
  17732. }), window.addEventListener("contextmenu", zA, {
  17733. signal: o
  17734. }), i.addEventListener("pointermove", ig(this, CA, bIg).bind(this, g), {
  17735. signal: o
  17736. }), this._freeHighlight = new zS({
  17737. x: e,
  17738. y: A
  17739. }, [s, l, n, a], g.scale, this._defaultThickness / 2, C, 1e-3), {
  17740. id: this._freeHighlightId,
  17741. clipPathId: this._freeHighlightClipId
  17742. } = g.drawLayer.draw({
  17743. bbox: [0, 0, 1, 1],
  17744. root: {
  17745. viewBox: "0 0 1 1",
  17746. fill: this._defaultColor,
  17747. "fill-opacity": this._defaultOpacity
  17748. },
  17749. rootClass: {
  17750. highlight: !0,
  17751. free: !0
  17752. },
  17753. path: {
  17754. d: this._freeHighlight.toSVGPath()
  17755. }
  17756. }, !0, !0);
  17757. }
  17758. static async deserialize(g, C, i) {
  17759. var h, b, u, m;
  17760. let e = null;
  17761. if (g instanceof jgg) {
  17762. const {
  17763. data: {
  17764. quadPoints: Z,
  17765. rect: p,
  17766. rotation: Y,
  17767. id: R,
  17768. color: X,
  17769. opacity: H,
  17770. popupRef: S
  17771. },
  17772. parent: {
  17773. page: {
  17774. pageNumber: z
  17775. }
  17776. }
  17777. } = g;
  17778. e = g = {
  17779. annotationType: XI.HIGHLIGHT,
  17780. color: Array.from(X),
  17781. opacity: H,
  17782. quadPoints: Z,
  17783. boxes: null,
  17784. pageIndex: z - 1,
  17785. rect: p.slice(0),
  17786. rotation: Y,
  17787. id: R,
  17788. deleted: !1,
  17789. popupRef: S
  17790. };
  17791. } else if (g instanceof p9) {
  17792. const {
  17793. data: {
  17794. inkLists: Z,
  17795. rect: p,
  17796. rotation: Y,
  17797. id: R,
  17798. color: X,
  17799. borderStyle: {
  17800. rawWidth: H
  17801. },
  17802. popupRef: S
  17803. },
  17804. parent: {
  17805. page: {
  17806. pageNumber: z
  17807. }
  17808. }
  17809. } = g;
  17810. e = g = {
  17811. annotationType: XI.HIGHLIGHT,
  17812. color: Array.from(X),
  17813. thickness: H,
  17814. inkLists: Z,
  17815. boxes: null,
  17816. pageIndex: z - 1,
  17817. rect: p.slice(0),
  17818. rotation: Y,
  17819. id: R,
  17820. deleted: !1,
  17821. popupRef: S
  17822. };
  17823. }
  17824. const {
  17825. color: A,
  17826. quadPoints: s,
  17827. inkLists: l,
  17828. opacity: n
  17829. } = g, a = await super.deserialize(g, C, i);
  17830. a.color = AI.makeHexColor(...A), $(a, Jl, n || 1), l && $(a, Pe, g.thickness), a.annotationElementId = g.id || null, a._initialData = e;
  17831. const [d, o] = a.pageDimensions, [c, r] = a.pageTranslation;
  17832. if (s) {
  17833. const Z = $(a, zl, []);
  17834. for (let p = 0; p < s.length; p += 8)
  17835. Z.push({
  17836. x: (s[p] - c) / d,
  17837. y: 1 - (s[p + 1] - r) / o,
  17838. width: (s[p + 2] - s[p]) / d,
  17839. height: (s[p + 1] - s[p + 5]) / o
  17840. });
  17841. ig(h = a, kI, TS).call(h), ig(b = a, kI, jo).call(b), a.rotate(a.rotation);
  17842. } else if (l) {
  17843. $(a, _t, !0);
  17844. const Z = l[0], p = {
  17845. x: Z[0] - c,
  17846. y: o - (Z[1] - r)
  17847. }, Y = new zS(p, [0, 0, d, o], 1, M(a, Pe) / 2, !0, 1e-3);
  17848. for (let H = 0, S = Z.length; H < S; H += 2)
  17849. p.x = Z[H] - c, p.y = o - (Z[H + 1] - r), Y.add(p);
  17850. const {
  17851. id: R,
  17852. clipPathId: X
  17853. } = C.drawLayer.draw({
  17854. bbox: [0, 0, 1, 1],
  17855. root: {
  17856. viewBox: "0 0 1 1",
  17857. fill: a.color,
  17858. "fill-opacity": a._defaultOpacity
  17859. },
  17860. rootClass: {
  17861. highlight: !0,
  17862. free: !0
  17863. },
  17864. path: {
  17865. d: Y.toSVGPath()
  17866. }
  17867. }, !0, !0);
  17868. ig(u = a, kI, fN).call(u, {
  17869. highlightOutlines: Y.getOutlines(),
  17870. highlightId: R,
  17871. clipPathId: X
  17872. }), ig(m = a, kI, jo).call(m), a.rotate(a.parentRotation);
  17873. }
  17874. return a;
  17875. }
  17876. serialize(g = !1) {
  17877. if (this.isEmpty() || g)
  17878. return null;
  17879. if (this.deleted)
  17880. return this.serializeDeleted();
  17881. const C = this.getRect(0, 0), i = TC._colorManager.convert(this.color), e = {
  17882. annotationType: XI.HIGHLIGHT,
  17883. color: i,
  17884. opacity: M(this, Jl),
  17885. thickness: M(this, Pe),
  17886. quadPoints: ig(this, kI, rIg).call(this),
  17887. outlines: ig(this, kI, hIg).call(this, C),
  17888. pageIndex: this.pageIndex,
  17889. rect: C,
  17890. rotation: ig(this, kI, gm).call(this),
  17891. structTreeParentId: this._structTreeParentId
  17892. };
  17893. return this.annotationElementId && !ig(this, kI, mIg).call(this, e) ? null : (e.id = this.annotationElementId, e);
  17894. }
  17895. renderAnnotationElement(g) {
  17896. return g.updateEdited({
  17897. rect: this.getRect(0, 0)
  17898. }), null;
  17899. }
  17900. static canCreateNewEmptyEditor() {
  17901. return !1;
  17902. }
  17903. };
  17904. o0 = new WeakMap(), PZ = new WeakMap(), zl = new WeakMap(), Qc = new WeakMap(), c0 = new WeakMap(), Ui = new WeakMap(), _Z = new WeakMap(), qZ = new WeakMap(), Oc = new WeakMap(), Ee = new WeakMap(), Ge = new WeakMap(), _t = new WeakMap(), d0 = new WeakMap(), Jl = new WeakMap(), Zi = new WeakMap(), r0 = new WeakMap(), Pe = new WeakMap(), $Z = new WeakMap(), kI = new WeakSet(), TS = function() {
  17905. const g = new FS(M(this, zl), 1e-3);
  17906. $(this, Ee, g.getOutlines()), [this.x, this.y, this.width, this.height] = M(this, Ee).box;
  17907. const C = new FS(M(this, zl), 25e-4, 1e-3, this._uiManager.direction === "ltr");
  17908. $(this, Ui, C.getOutlines());
  17909. const {
  17910. lastPoint: i
  17911. } = M(this, Ui);
  17912. $(this, d0, [(i[0] - this.x) / this.width, (i[1] - this.y) / this.height]);
  17913. }, fN = function({
  17914. highlightOutlines: g,
  17915. highlightId: C,
  17916. clipPathId: i
  17917. }) {
  17918. var d, o;
  17919. if ($(this, Ee, g), $(this, Ui, g.getNewOutline(M(this, Pe) / 2 + 1.5, 25e-4)), C >= 0)
  17920. $(this, Ge, C), $(this, Qc, i), this.parent.drawLayer.finalizeDraw(C, {
  17921. bbox: g.box,
  17922. path: {
  17923. d: g.toSVGPath()
  17924. }
  17925. }), $(this, Zi, this.parent.drawLayer.drawOutline({
  17926. rootClass: {
  17927. highlightOutline: !0,
  17928. free: !0
  17929. },
  17930. bbox: M(this, Ui).box,
  17931. path: {
  17932. d: M(this, Ui).toSVGPath()
  17933. }
  17934. }, !0));
  17935. else if (this.parent) {
  17936. const c = this.parent.viewport.rotation;
  17937. this.parent.drawLayer.updateProperties(M(this, Ge), {
  17938. bbox: ig(d = cC, CA, qr).call(d, M(this, Ee).box, (c - this.rotation + 360) % 360),
  17939. path: {
  17940. d: g.toSVGPath()
  17941. }
  17942. }), this.parent.drawLayer.updateProperties(M(this, Zi), {
  17943. bbox: ig(o = cC, CA, qr).call(o, M(this, Ui).box, c),
  17944. path: {
  17945. d: M(this, Ui).toSVGPath()
  17946. }
  17947. });
  17948. }
  17949. const [A, s, l, n] = g.box;
  17950. switch (this.rotation) {
  17951. case 0:
  17952. this.x = A, this.y = s, this.width = l, this.height = n;
  17953. break;
  17954. case 90: {
  17955. const [c, r] = this.parentDimensions;
  17956. this.x = s, this.y = 1 - A, this.width = l * r / c, this.height = n * c / r;
  17957. break;
  17958. }
  17959. case 180:
  17960. this.x = 1 - A, this.y = 1 - s, this.width = l, this.height = n;
  17961. break;
  17962. case 270: {
  17963. const [c, r] = this.parentDimensions;
  17964. this.x = 1 - s, this.y = A, this.width = l * r / c, this.height = n * c / r;
  17965. break;
  17966. }
  17967. }
  17968. const {
  17969. lastPoint: a
  17970. } = M(this, Ui);
  17971. $(this, d0, [(a[0] - A) / l, (a[1] - s) / n]);
  17972. }, aIg = function(g) {
  17973. const C = (A, s) => {
  17974. var l, n;
  17975. this.color = A, $(this, Jl, s), (l = this.parent) == null || l.drawLayer.updateProperties(M(this, Ge), {
  17976. root: {
  17977. fill: A,
  17978. "fill-opacity": s
  17979. }
  17980. }), (n = M(this, c0)) == null || n.updateColor(A);
  17981. }, i = this.color, e = M(this, Jl);
  17982. this.addCommands({
  17983. cmd: C.bind(this, g, cC._defaultOpacity),
  17984. undo: C.bind(this, i, e),
  17985. post: this._uiManager.updateUI.bind(this._uiManager, this),
  17986. mustExec: !0,
  17987. type: iC.HIGHLIGHT_COLOR,
  17988. overwriteIfSameType: !0,
  17989. keepUndo: !0
  17990. }), this._reportTelemetry({
  17991. action: "color_changed",
  17992. color: this._uiManager.highlightColorNames.get(g)
  17993. }, !0);
  17994. }, oIg = function(g) {
  17995. const C = M(this, Pe), i = (e) => {
  17996. $(this, Pe, e), ig(this, kI, cIg).call(this, e);
  17997. };
  17998. this.addCommands({
  17999. cmd: i.bind(this, g),
  18000. undo: i.bind(this, C),
  18001. post: this._uiManager.updateUI.bind(this._uiManager, this),
  18002. mustExec: !0,
  18003. type: iC.INK_THICKNESS,
  18004. overwriteIfSameType: !0,
  18005. keepUndo: !0
  18006. }), this._reportTelemetry({
  18007. action: "thickness_changed",
  18008. thickness: g
  18009. }, !0);
  18010. }, cIg = function(g) {
  18011. if (!M(this, _t))
  18012. return;
  18013. ig(this, kI, fN).call(this, {
  18014. highlightOutlines: M(this, Ee).getNewOutline(g / 2)
  18015. }), this.fixAndSetPosition();
  18016. const [C, i] = this.parentDimensions;
  18017. this.setDims(this.width * C, this.height * i);
  18018. }, xS = function() {
  18019. M(this, Ge) === null || !this.parent || (this.parent.drawLayer.remove(M(this, Ge)), $(this, Ge, null), this.parent.drawLayer.remove(M(this, Zi)), $(this, Zi, null));
  18020. }, jo = function(g = this.parent) {
  18021. M(this, Ge) === null && ({
  18022. id: Wi(this, Ge)._,
  18023. clipPathId: Wi(this, Qc)._
  18024. } = g.drawLayer.draw({
  18025. bbox: M(this, Ee).box,
  18026. root: {
  18027. viewBox: "0 0 1 1",
  18028. fill: this.color,
  18029. "fill-opacity": M(this, Jl)
  18030. },
  18031. rootClass: {
  18032. highlight: !0,
  18033. free: M(this, _t)
  18034. },
  18035. path: {
  18036. d: M(this, Ee).toSVGPath()
  18037. }
  18038. }, !1, !0), $(this, Zi, g.drawLayer.drawOutline({
  18039. rootClass: {
  18040. highlightOutline: !0,
  18041. free: M(this, _t)
  18042. },
  18043. bbox: M(this, Ui).box,
  18044. path: {
  18045. d: M(this, Ui).toSVGPath()
  18046. }
  18047. }, M(this, _t))), M(this, Oc) && (M(this, Oc).style.clipPath = M(this, Qc)));
  18048. }, CA = new WeakSet(), qr = function([g, C, i, e], A) {
  18049. switch (A) {
  18050. case 90:
  18051. return [1 - C - e, g, e, i];
  18052. case 180:
  18053. return [1 - g - i, 1 - C - e, i, e];
  18054. case 270:
  18055. return [C, 1 - g - i, e, i];
  18056. }
  18057. return [g, C, i, e];
  18058. }, dIg = function(g) {
  18059. cC._keyboardManager.exec(this, g);
  18060. }, HN = function(g) {
  18061. if (!M(this, o0))
  18062. return;
  18063. const C = window.getSelection();
  18064. g ? C.setPosition(M(this, o0), M(this, PZ)) : C.setPosition(M(this, _Z), M(this, qZ));
  18065. }, gm = function() {
  18066. return M(this, _t) ? this.rotation : 0;
  18067. }, rIg = function() {
  18068. if (M(this, _t))
  18069. return null;
  18070. const [g, C] = this.pageDimensions, [i, e] = this.pageTranslation, A = M(this, zl), s = new Float32Array(A.length * 8);
  18071. let l = 0;
  18072. for (const {
  18073. x: n,
  18074. y: a,
  18075. width: d,
  18076. height: o
  18077. } of A) {
  18078. const c = n * g + i, r = (1 - a) * C + e;
  18079. s[l] = s[l + 4] = c, s[l + 1] = s[l + 3] = r, s[l + 2] = s[l + 6] = c + d * g, s[l + 5] = s[l + 7] = r - o * C, l += 8;
  18080. }
  18081. return s;
  18082. }, hIg = function(g) {
  18083. return M(this, Ee).serialize(g, ig(this, kI, gm).call(this));
  18084. }, bIg = function(g, C) {
  18085. this._freeHighlight.add(C) && g.drawLayer.updateProperties(this._freeHighlightId, {
  18086. path: {
  18087. d: this._freeHighlight.toSVGPath()
  18088. }
  18089. });
  18090. }, uIg = function(g, C) {
  18091. this._freeHighlight.isEmpty() ? g.drawLayer.remove(this._freeHighlightId) : g.createAndAddNewEditor(C, !1, {
  18092. highlightId: this._freeHighlightId,
  18093. highlightOutlines: this._freeHighlight.getOutlines(),
  18094. clipPathId: this._freeHighlightClipId,
  18095. methodOfCreation: "main_toolbar"
  18096. }), this._freeHighlightId = -1, this._freeHighlight = null, this._freeHighlightClipId = "";
  18097. }, mIg = function(g) {
  18098. const {
  18099. color: C
  18100. } = this._initialData;
  18101. return g.color.some((i, e) => i !== C[e]);
  18102. }, tg(cC, CA), iI(cC, "_defaultColor", null), iI(cC, "_defaultOpacity", 1), iI(cC, "_defaultThickness", 12), iI(cC, "_type", "highlight"), iI(cC, "_editorType", XI.HIGHLIGHT), iI(cC, "_freeHighlightId", -1), iI(cC, "_freeHighlight", null), iI(cC, "_freeHighlightClipId", "");
  18103. let lV = cC;
  18104. var Uc;
  18105. class ZIg {
  18106. constructor() {
  18107. tg(this, Uc, /* @__PURE__ */ Object.create(null));
  18108. }
  18109. updateProperty(I, g) {
  18110. this[I] = g, this.updateSVGProperty(I, g);
  18111. }
  18112. updateProperties(I) {
  18113. if (I)
  18114. for (const [g, C] of Object.entries(I))
  18115. g.startsWith("_") || this.updateProperty(g, C);
  18116. }
  18117. updateSVGProperty(I, g) {
  18118. M(this, Uc)[I] = g;
  18119. }
  18120. toSVGProperties() {
  18121. const I = M(this, Uc);
  18122. return $(this, Uc, /* @__PURE__ */ Object.create(null)), {
  18123. root: I
  18124. };
  18125. }
  18126. reset() {
  18127. $(this, Uc, /* @__PURE__ */ Object.create(null));
  18128. }
  18129. updateAll(I = this) {
  18130. this.updateProperties(I);
  18131. }
  18132. clone() {
  18133. BC("Not implemented");
  18134. }
  18135. }
  18136. Uc = new WeakMap();
  18137. var we, h0, Ft, Ec, Pc, Da, Ka, Fa, _c, sC, jS, QS, OS, Im, GIg, XN, Cm, $r;
  18138. const II = class II extends TC {
  18139. constructor(g) {
  18140. super(g);
  18141. tg(this, sC);
  18142. tg(this, we, null);
  18143. tg(this, h0);
  18144. iI(this, "_drawId", null);
  18145. $(this, h0, g.mustBeCommitted || !1), this._addOutlines(g);
  18146. }
  18147. _addOutlines(g) {
  18148. g.drawOutlines && (ig(this, sC, jS).call(this, g), ig(this, sC, Im).call(this));
  18149. }
  18150. static _mergeSVGProperties(g, C) {
  18151. const i = new Set(Object.keys(g));
  18152. for (const [e, A] of Object.entries(C))
  18153. i.has(e) ? Object.assign(g[e], A) : g[e] = A;
  18154. return g;
  18155. }
  18156. static getDefaultDrawingOptions(g) {
  18157. BC("Not implemented");
  18158. }
  18159. static get typesMap() {
  18160. BC("Not implemented");
  18161. }
  18162. static get isDrawer() {
  18163. return !0;
  18164. }
  18165. static get supportMultipleDrawings() {
  18166. return !1;
  18167. }
  18168. static updateDefaultParams(g, C) {
  18169. const i = this.typesMap.get(g);
  18170. i && this._defaultDrawingOptions.updateProperty(i, C), this._currentParent && (M(II, Ft).updateProperty(i, C), this._currentParent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()));
  18171. }
  18172. updateParams(g, C) {
  18173. const i = this.constructor.typesMap.get(g);
  18174. i && this._updateProperty(g, i, C);
  18175. }
  18176. static get defaultPropertiesToUpdate() {
  18177. const g = [], C = this._defaultDrawingOptions;
  18178. for (const [i, e] of this.typesMap)
  18179. g.push([i, C[e]]);
  18180. return g;
  18181. }
  18182. get propertiesToUpdate() {
  18183. const g = [], {
  18184. _drawingOptions: C
  18185. } = this;
  18186. for (const [i, e] of this.constructor.typesMap)
  18187. g.push([i, C[e]]);
  18188. return g;
  18189. }
  18190. _updateProperty(g, C, i) {
  18191. const e = this._drawingOptions, A = e[C], s = (l) => {
  18192. var a;
  18193. e.updateProperty(C, l);
  18194. const n = M(this, we).updateProperty(C, l);
  18195. n && ig(this, sC, Cm).call(this, n), (a = this.parent) == null || a.drawLayer.updateProperties(this._drawId, e.toSVGProperties());
  18196. };
  18197. this.addCommands({
  18198. cmd: s.bind(this, i),
  18199. undo: s.bind(this, A),
  18200. post: this._uiManager.updateUI.bind(this._uiManager, this),
  18201. mustExec: !0,
  18202. type: g,
  18203. overwriteIfSameType: !0,
  18204. keepUndo: !0
  18205. });
  18206. }
  18207. _onResizing() {
  18208. var g;
  18209. (g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, II._mergeSVGProperties(M(this, we).getPathResizingSVGProperties(ig(this, sC, XN).call(this)), {
  18210. bbox: ig(this, sC, $r).call(this)
  18211. }));
  18212. }
  18213. _onResized() {
  18214. var g;
  18215. (g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, II._mergeSVGProperties(M(this, we).getPathResizedSVGProperties(ig(this, sC, XN).call(this)), {
  18216. bbox: ig(this, sC, $r).call(this)
  18217. }));
  18218. }
  18219. _onTranslating(g, C) {
  18220. var i;
  18221. (i = this.parent) == null || i.drawLayer.updateProperties(this._drawId, {
  18222. bbox: ig(this, sC, $r).call(this)
  18223. });
  18224. }
  18225. _onTranslated() {
  18226. var g;
  18227. (g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, II._mergeSVGProperties(M(this, we).getPathTranslatedSVGProperties(ig(this, sC, XN).call(this), this.parentDimensions), {
  18228. bbox: ig(this, sC, $r).call(this)
  18229. }));
  18230. }
  18231. _onStartDragging() {
  18232. var g;
  18233. (g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, {
  18234. rootClass: {
  18235. moving: !0
  18236. }
  18237. });
  18238. }
  18239. _onStopDragging() {
  18240. var g;
  18241. (g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, {
  18242. rootClass: {
  18243. moving: !1
  18244. }
  18245. });
  18246. }
  18247. commit() {
  18248. super.commit(), this.disableEditMode(), this.disableEditing();
  18249. }
  18250. disableEditing() {
  18251. super.disableEditing(), this.div.classList.toggle("disabled", !0);
  18252. }
  18253. enableEditing() {
  18254. super.enableEditing(), this.div.classList.toggle("disabled", !1);
  18255. }
  18256. getBaseTranslation() {
  18257. return [0, 0];
  18258. }
  18259. get isResizable() {
  18260. return !0;
  18261. }
  18262. onceAdded(g) {
  18263. this.annotationElementId || this.parent.addUndoableEditor(this), this._isDraggable = !0, M(this, h0) && ($(this, h0, !1), this.commit(), this.parent.setSelected(this), g && this.isOnScreen && this.div.focus());
  18264. }
  18265. remove() {
  18266. ig(this, sC, OS).call(this), super.remove();
  18267. }
  18268. rebuild() {
  18269. this.parent && (super.rebuild(), this.div !== null && (ig(this, sC, Im).call(this), ig(this, sC, Cm).call(this, M(this, we).box), this.isAttachedToDOM || this.parent.add(this)));
  18270. }
  18271. setParent(g) {
  18272. var i;
  18273. let C = !1;
  18274. this.parent && !g ? (this._uiManager.removeShouldRescale(this), ig(this, sC, OS).call(this)) : g && (this._uiManager.addShouldRescale(this), ig(this, sC, Im).call(this, g), C = !this.parent && ((i = this.div) == null ? void 0 : i.classList.contains("selectedEditor"))), super.setParent(g), C && this.select();
  18275. }
  18276. rotate() {
  18277. this.parent && this.parent.drawLayer.updateProperties(this._drawId, II._mergeSVGProperties({
  18278. bbox: ig(this, sC, $r).call(this)
  18279. }, M(this, we).updateRotation((this.parentRotation - this.rotation + 360) % 360)));
  18280. }
  18281. onScaleChanging() {
  18282. this.parent && ig(this, sC, Cm).call(this, M(this, we).updateParentDimensions(this.parentDimensions, this.parent.scale));
  18283. }
  18284. static onScaleChangingWhenDrawing() {
  18285. }
  18286. render() {
  18287. if (this.div)
  18288. return this.div;
  18289. let g, C;
  18290. this._isCopy && (g = this.x, C = this.y);
  18291. const i = super.render();
  18292. i.classList.add("draw");
  18293. const e = document.createElement("div");
  18294. i.append(e), e.setAttribute("aria-hidden", "true"), e.className = "internal";
  18295. const [A, s] = this.parentDimensions;
  18296. return this.setDims(this.width * A, this.height * s), this._uiManager.addShouldRescale(this), this.disableEditing(), this._isCopy && this._moveAfterPaste(g, C), i;
  18297. }
  18298. static createDrawerInstance(g, C, i, e, A) {
  18299. BC("Not implemented");
  18300. }
  18301. static startDrawing(g, C, i, e) {
  18302. var b;
  18303. const {
  18304. target: A,
  18305. offsetX: s,
  18306. offsetY: l,
  18307. pointerId: n,
  18308. pointerType: a
  18309. } = e;
  18310. if (M(II, Ka) && M(II, Ka) !== a)
  18311. return;
  18312. const {
  18313. viewport: {
  18314. rotation: d
  18315. }
  18316. } = g, {
  18317. width: o,
  18318. height: c
  18319. } = A.getBoundingClientRect(), r = $(II, Ec, new AbortController()), h = g.combinedSignal(r);
  18320. if (M(II, Da) || $(II, Da, n), M(II, Ka) ?? $(II, Ka, a), window.addEventListener("pointerup", (u) => {
  18321. var m;
  18322. M(II, Da) === u.pointerId ? this._endDraw(u) : (m = M(II, Fa)) == null || m.delete(u.pointerId);
  18323. }, {
  18324. signal: h
  18325. }), window.addEventListener("pointercancel", (u) => {
  18326. var m;
  18327. M(II, Da) === u.pointerId ? this._currentParent.endDrawingSession() : (m = M(II, Fa)) == null || m.delete(u.pointerId);
  18328. }, {
  18329. signal: h
  18330. }), window.addEventListener("pointerdown", (u) => {
  18331. M(II, Ka) === u.pointerType && ((M(II, Fa) || $(II, Fa, /* @__PURE__ */ new Set())).add(u.pointerId), M(II, Ft).isCancellable() && (M(II, Ft).removeLastElement(), M(II, Ft).isEmpty() ? this._currentParent.endDrawingSession(!0) : this._endDraw(null)));
  18332. }, {
  18333. capture: !0,
  18334. passive: !1,
  18335. signal: h
  18336. }), window.addEventListener("contextmenu", zA, {
  18337. signal: h
  18338. }), A.addEventListener("pointermove", this._drawMove.bind(this), {
  18339. signal: h
  18340. }), A.addEventListener("touchmove", (u) => {
  18341. u.timeStamp === M(II, _c) && ht(u);
  18342. }, {
  18343. signal: h
  18344. }), g.toggleDrawing(), (b = C._editorUndoBar) == null || b.hide(), M(II, Ft)) {
  18345. g.drawLayer.updateProperties(this._currentDrawId, M(II, Ft).startNew(s, l, o, c, d));
  18346. return;
  18347. }
  18348. C.updateUIForDefaultProperties(this), $(II, Ft, this.createDrawerInstance(s, l, o, c, d)), $(II, Pc, this.getDefaultDrawingOptions()), this._currentParent = g, {
  18349. id: this._currentDrawId
  18350. } = g.drawLayer.draw(this._mergeSVGProperties(M(II, Pc).toSVGProperties(), M(II, Ft).defaultSVGProperties), !0, !1);
  18351. }
  18352. static _drawMove(g) {
  18353. var A;
  18354. if ($(II, _c, -1), !M(II, Ft))
  18355. return;
  18356. const {
  18357. offsetX: C,
  18358. offsetY: i,
  18359. pointerId: e
  18360. } = g;
  18361. if (M(II, Da) === e) {
  18362. if (((A = M(II, Fa)) == null ? void 0 : A.size) >= 1) {
  18363. this._endDraw(g);
  18364. return;
  18365. }
  18366. this._currentParent.drawLayer.updateProperties(this._currentDrawId, M(II, Ft).add(C, i)), $(II, _c, g.timeStamp), ht(g);
  18367. }
  18368. }
  18369. static _cleanup(g) {
  18370. g && (this._currentDrawId = -1, this._currentParent = null, $(II, Ft, null), $(II, Pc, null), $(II, Ka, null), $(II, _c, NaN)), M(II, Ec) && (M(II, Ec).abort(), $(II, Ec, null), $(II, Da, NaN), $(II, Fa, null));
  18371. }
  18372. static _endDraw(g) {
  18373. const C = this._currentParent;
  18374. if (C) {
  18375. if (C.toggleDrawing(!0), this._cleanup(!1), (g == null ? void 0 : g.target) === C.div && C.drawLayer.updateProperties(this._currentDrawId, M(II, Ft).end(g.offsetX, g.offsetY)), this.supportMultipleDrawings) {
  18376. const i = M(II, Ft), e = this._currentDrawId, A = i.getLastElement();
  18377. C.addCommands({
  18378. cmd: () => {
  18379. C.drawLayer.updateProperties(e, i.setLastElement(A));
  18380. },
  18381. undo: () => {
  18382. C.drawLayer.updateProperties(e, i.removeLastElement());
  18383. },
  18384. mustExec: !1,
  18385. type: iC.DRAW_STEP
  18386. });
  18387. return;
  18388. }
  18389. this.endDrawing(!1);
  18390. }
  18391. }
  18392. static endDrawing(g) {
  18393. const C = this._currentParent;
  18394. if (!C)
  18395. return null;
  18396. if (C.toggleDrawing(!0), C.cleanUndoStack(iC.DRAW_STEP), !M(II, Ft).isEmpty()) {
  18397. const {
  18398. pageDimensions: [i, e],
  18399. scale: A
  18400. } = C, s = C.createAndAddNewEditor({
  18401. offsetX: 0,
  18402. offsetY: 0
  18403. }, !1, {
  18404. drawId: this._currentDrawId,
  18405. drawOutlines: M(II, Ft).getOutlines(i * A, e * A, A, this._INNER_MARGIN),
  18406. drawingOptions: M(II, Pc),
  18407. mustBeCommitted: !g
  18408. });
  18409. return this._cleanup(!0), s;
  18410. }
  18411. return C.drawLayer.remove(this._currentDrawId), this._cleanup(!0), null;
  18412. }
  18413. createDrawingOptions(g) {
  18414. }
  18415. static deserializeDraw(g, C, i, e, A, s) {
  18416. BC("Not implemented");
  18417. }
  18418. static async deserialize(g, C, i) {
  18419. var d, o;
  18420. const {
  18421. rawDims: {
  18422. pageWidth: e,
  18423. pageHeight: A,
  18424. pageX: s,
  18425. pageY: l
  18426. }
  18427. } = C.viewport, n = this.deserializeDraw(s, l, e, A, this._INNER_MARGIN, g), a = await super.deserialize(g, C, i);
  18428. return a.createDrawingOptions(g), ig(d = a, sC, jS).call(d, {
  18429. drawOutlines: n
  18430. }), ig(o = a, sC, Im).call(o), a.onScaleChanging(), a.rotate(), a;
  18431. }
  18432. serializeDraw(g) {
  18433. const [C, i] = this.pageTranslation, [e, A] = this.pageDimensions;
  18434. return M(this, we).serialize([C, i, e, A], g);
  18435. }
  18436. renderAnnotationElement(g) {
  18437. return g.updateEdited({
  18438. rect: this.getRect(0, 0)
  18439. }), null;
  18440. }
  18441. static canCreateNewEmptyEditor() {
  18442. return !1;
  18443. }
  18444. };
  18445. we = new WeakMap(), h0 = new WeakMap(), Ft = new WeakMap(), Ec = new WeakMap(), Pc = new WeakMap(), Da = new WeakMap(), Ka = new WeakMap(), Fa = new WeakMap(), _c = new WeakMap(), sC = new WeakSet(), jS = function({
  18446. drawOutlines: g,
  18447. drawId: C,
  18448. drawingOptions: i
  18449. }) {
  18450. $(this, we, g), this._drawingOptions || (this._drawingOptions = i), C >= 0 ? (this._drawId = C, this.parent.drawLayer.finalizeDraw(C, g.defaultProperties)) : this._drawId = ig(this, sC, QS).call(this, g, this.parent), ig(this, sC, Cm).call(this, g.box);
  18451. }, QS = function(g, C) {
  18452. const {
  18453. id: i
  18454. } = C.drawLayer.draw(II._mergeSVGProperties(this._drawingOptions.toSVGProperties(), g.defaultSVGProperties), !1, !1);
  18455. return i;
  18456. }, OS = function() {
  18457. this._drawId === null || !this.parent || (this.parent.drawLayer.remove(this._drawId), this._drawId = null, this._drawingOptions.reset());
  18458. }, Im = function(g = this.parent) {
  18459. if (!(this._drawId !== null && this.parent === g)) {
  18460. if (this._drawId !== null) {
  18461. this.parent.drawLayer.updateParent(this._drawId, g.drawLayer);
  18462. return;
  18463. }
  18464. this._drawingOptions.updateAll(), this._drawId = ig(this, sC, QS).call(this, M(this, we), g);
  18465. }
  18466. }, GIg = function([g, C, i, e]) {
  18467. const {
  18468. parentDimensions: [A, s],
  18469. rotation: l
  18470. } = this;
  18471. switch (l) {
  18472. case 90:
  18473. return [C, 1 - g, i * (s / A), e * (A / s)];
  18474. case 180:
  18475. return [1 - g, 1 - C, i, e];
  18476. case 270:
  18477. return [1 - C, g, i * (s / A), e * (A / s)];
  18478. default:
  18479. return [g, C, i, e];
  18480. }
  18481. }, XN = function() {
  18482. const {
  18483. x: g,
  18484. y: C,
  18485. width: i,
  18486. height: e,
  18487. parentDimensions: [A, s],
  18488. rotation: l
  18489. } = this;
  18490. switch (l) {
  18491. case 90:
  18492. return [1 - C, g, i * (A / s), e * (s / A)];
  18493. case 180:
  18494. return [1 - g, 1 - C, i, e];
  18495. case 270:
  18496. return [C, 1 - g, i * (A / s), e * (s / A)];
  18497. default:
  18498. return [g, C, i, e];
  18499. }
  18500. }, Cm = function(g) {
  18501. if ([this.x, this.y, this.width, this.height] = ig(this, sC, GIg).call(this, g), this.div) {
  18502. this.fixAndSetPosition();
  18503. const [C, i] = this.parentDimensions;
  18504. this.setDims(this.width * C, this.height * i);
  18505. }
  18506. this._onResized();
  18507. }, $r = function() {
  18508. const {
  18509. x: g,
  18510. y: C,
  18511. width: i,
  18512. height: e,
  18513. rotation: A,
  18514. parentRotation: s,
  18515. parentDimensions: [l, n]
  18516. } = this;
  18517. switch ((A * 4 + s) / 90) {
  18518. case 1:
  18519. return [1 - C - e, g, e, i];
  18520. case 2:
  18521. return [1 - g - i, 1 - C - e, i, e];
  18522. case 3:
  18523. return [C, 1 - g - i, e, i];
  18524. case 4:
  18525. return [g, C - i * (l / n), e * (n / l), i * (l / n)];
  18526. case 5:
  18527. return [1 - C, g, i * (l / n), e * (n / l)];
  18528. case 6:
  18529. return [1 - g - e * (n / l), 1 - C, e * (n / l), i * (l / n)];
  18530. case 7:
  18531. return [C - i * (l / n), 1 - g - e * (n / l), i * (l / n), e * (n / l)];
  18532. case 8:
  18533. return [g - i, C - e, i, e];
  18534. case 9:
  18535. return [1 - C, g - i, e, i];
  18536. case 10:
  18537. return [1 - g, 1 - C, i, e];
  18538. case 11:
  18539. return [C - e, 1 - g, e, i];
  18540. case 12:
  18541. return [g - e * (n / l), C, e * (n / l), i * (l / n)];
  18542. case 13:
  18543. return [1 - C - i * (l / n), g - e * (n / l), i * (l / n), e * (n / l)];
  18544. case 14:
  18545. return [1 - g, 1 - C - i * (l / n), e * (n / l), i * (l / n)];
  18546. case 15:
  18547. return [C, 1 - g, i * (l / n), e * (n / l)];
  18548. default:
  18549. return [g, C, i, e];
  18550. }
  18551. }, iI(II, "_currentDrawId", -1), iI(II, "_currentParent", null), tg(II, Ft, null), tg(II, Ec, null), tg(II, Pc, null), tg(II, Da, NaN), tg(II, Ka, null), tg(II, Fa, null), tg(II, _c, NaN), iI(II, "_INNER_MARGIN", 3);
  18552. let nV = II;
  18553. var Ns, kt, zt, qc, b0, Vi, qt, _e, $c, gd, Id, u0, SN;
  18554. class Mdg {
  18555. constructor(I, g, C, i, e, A) {
  18556. tg(this, u0);
  18557. tg(this, Ns, new Float64Array(6));
  18558. tg(this, kt);
  18559. tg(this, zt);
  18560. tg(this, qc);
  18561. tg(this, b0);
  18562. tg(this, Vi);
  18563. tg(this, qt, "");
  18564. tg(this, _e, 0);
  18565. tg(this, $c, new oG());
  18566. tg(this, gd);
  18567. tg(this, Id);
  18568. $(this, gd, C), $(this, Id, i), $(this, qc, e), $(this, b0, A), [I, g] = ig(this, u0, SN).call(this, I, g);
  18569. const s = $(this, kt, [NaN, NaN, NaN, NaN, I, g]);
  18570. $(this, Vi, [I, g]), $(this, zt, [{
  18571. line: s,
  18572. points: M(this, Vi)
  18573. }]), M(this, Ns).set(s, 0);
  18574. }
  18575. updateProperty(I, g) {
  18576. I === "stroke-width" && $(this, b0, g);
  18577. }
  18578. isEmpty() {
  18579. return !M(this, zt) || M(this, zt).length === 0;
  18580. }
  18581. isCancellable() {
  18582. return M(this, Vi).length <= 10;
  18583. }
  18584. add(I, g) {
  18585. [I, g] = ig(this, u0, SN).call(this, I, g);
  18586. const [C, i, e, A] = M(this, Ns).subarray(2, 6), s = I - e, l = g - A;
  18587. return Math.hypot(M(this, gd) * s, M(this, Id) * l) <= 2 ? null : (M(this, Vi).push(I, g), isNaN(C) ? (M(this, Ns).set([e, A, I, g], 2), M(this, kt).push(NaN, NaN, NaN, NaN, I, g), {
  18588. path: {
  18589. d: this.toSVGPath()
  18590. }
  18591. }) : (isNaN(M(this, Ns)[0]) && M(this, kt).splice(6, 6), M(this, Ns).set([C, i, e, A, I, g], 0), M(this, kt).push(...$g.createBezierPoints(C, i, e, A, I, g)), {
  18592. path: {
  18593. d: this.toSVGPath()
  18594. }
  18595. }));
  18596. }
  18597. end(I, g) {
  18598. const C = this.add(I, g);
  18599. return C || (M(this, Vi).length === 2 ? {
  18600. path: {
  18601. d: this.toSVGPath()
  18602. }
  18603. } : null);
  18604. }
  18605. startNew(I, g, C, i, e) {
  18606. $(this, gd, C), $(this, Id, i), $(this, qc, e), [I, g] = ig(this, u0, SN).call(this, I, g);
  18607. const A = $(this, kt, [NaN, NaN, NaN, NaN, I, g]);
  18608. $(this, Vi, [I, g]);
  18609. const s = M(this, zt).at(-1);
  18610. return s && (s.line = new Float32Array(s.line), s.points = new Float32Array(s.points)), M(this, zt).push({
  18611. line: A,
  18612. points: M(this, Vi)
  18613. }), M(this, Ns).set(A, 0), $(this, _e, 0), this.toSVGPath(), null;
  18614. }
  18615. getLastElement() {
  18616. return M(this, zt).at(-1);
  18617. }
  18618. setLastElement(I) {
  18619. return M(this, zt) ? (M(this, zt).push(I), $(this, kt, I.line), $(this, Vi, I.points), $(this, _e, 0), {
  18620. path: {
  18621. d: this.toSVGPath()
  18622. }
  18623. }) : M(this, $c).setLastElement(I);
  18624. }
  18625. removeLastElement() {
  18626. if (!M(this, zt))
  18627. return M(this, $c).removeLastElement();
  18628. M(this, zt).pop(), $(this, qt, "");
  18629. for (let I = 0, g = M(this, zt).length; I < g; I++) {
  18630. const {
  18631. line: C,
  18632. points: i
  18633. } = M(this, zt)[I];
  18634. $(this, kt, C), $(this, Vi, i), $(this, _e, 0), this.toSVGPath();
  18635. }
  18636. return {
  18637. path: {
  18638. d: M(this, qt)
  18639. }
  18640. };
  18641. }
  18642. toSVGPath() {
  18643. const I = $g.svgRound(M(this, kt)[4]), g = $g.svgRound(M(this, kt)[5]);
  18644. if (M(this, Vi).length === 2)
  18645. return $(this, qt, `${M(this, qt)} M ${I} ${g} Z`), M(this, qt);
  18646. if (M(this, Vi).length <= 6) {
  18647. const i = M(this, qt).lastIndexOf("M");
  18648. $(this, qt, `${M(this, qt).slice(0, i)} M ${I} ${g}`), $(this, _e, 6);
  18649. }
  18650. if (M(this, Vi).length === 4) {
  18651. const i = $g.svgRound(M(this, kt)[10]), e = $g.svgRound(M(this, kt)[11]);
  18652. return $(this, qt, `${M(this, qt)} L ${i} ${e}`), $(this, _e, 12), M(this, qt);
  18653. }
  18654. const C = [];
  18655. M(this, _e) === 0 && (C.push(`M ${I} ${g}`), $(this, _e, 6));
  18656. for (let i = M(this, _e), e = M(this, kt).length; i < e; i += 6) {
  18657. const [A, s, l, n, a, d] = M(this, kt).slice(i, i + 6).map($g.svgRound);
  18658. C.push(`C${A} ${s} ${l} ${n} ${a} ${d}`);
  18659. }
  18660. return $(this, qt, M(this, qt) + C.join(" ")), $(this, _e, M(this, kt).length), M(this, qt);
  18661. }
  18662. getOutlines(I, g, C, i) {
  18663. const e = M(this, zt).at(-1);
  18664. return e.line = new Float32Array(e.line), e.points = new Float32Array(e.points), M(this, $c).build(M(this, zt), I, g, C, M(this, qc), M(this, b0), i), $(this, Ns, null), $(this, kt, null), $(this, zt, null), $(this, qt, null), M(this, $c);
  18665. }
  18666. get defaultSVGProperties() {
  18667. return {
  18668. root: {
  18669. viewBox: "0 0 10000 10000"
  18670. },
  18671. rootClass: {
  18672. draw: !0
  18673. },
  18674. bbox: [0, 0, 1, 1]
  18675. };
  18676. }
  18677. }
  18678. Ns = new WeakMap(), kt = new WeakMap(), zt = new WeakMap(), qc = new WeakMap(), b0 = new WeakMap(), Vi = new WeakMap(), qt = new WeakMap(), _e = new WeakMap(), $c = new WeakMap(), gd = new WeakMap(), Id = new WeakMap(), u0 = new WeakSet(), SN = function(I, g) {
  18679. return $g._normalizePoint(I, g, M(this, gd), M(this, Id), M(this, qc));
  18680. };
  18681. var Mi, gG, IG, pe, Vs, Ms, m0, Z0, Cd, ii, hl, wIg, pIg, BIg;
  18682. class oG extends $g {
  18683. constructor() {
  18684. super(...arguments);
  18685. tg(this, ii);
  18686. tg(this, Mi);
  18687. tg(this, gG, 0);
  18688. tg(this, IG);
  18689. tg(this, pe);
  18690. tg(this, Vs);
  18691. tg(this, Ms);
  18692. tg(this, m0);
  18693. tg(this, Z0);
  18694. tg(this, Cd);
  18695. }
  18696. build(g, C, i, e, A, s, l) {
  18697. $(this, Vs, C), $(this, Ms, i), $(this, m0, e), $(this, Z0, A), $(this, Cd, s), $(this, IG, l ?? 0), $(this, pe, g), ig(this, ii, pIg).call(this);
  18698. }
  18699. get thickness() {
  18700. return M(this, Cd);
  18701. }
  18702. setLastElement(g) {
  18703. return M(this, pe).push(g), {
  18704. path: {
  18705. d: this.toSVGPath()
  18706. }
  18707. };
  18708. }
  18709. removeLastElement() {
  18710. return M(this, pe).pop(), {
  18711. path: {
  18712. d: this.toSVGPath()
  18713. }
  18714. };
  18715. }
  18716. toSVGPath() {
  18717. const g = [];
  18718. for (const {
  18719. line: C
  18720. } of M(this, pe)) {
  18721. if (g.push(`M${$g.svgRound(C[4])} ${$g.svgRound(C[5])}`), C.length === 6) {
  18722. g.push("Z");
  18723. continue;
  18724. }
  18725. if (C.length === 12 && isNaN(C[6])) {
  18726. g.push(`L${$g.svgRound(C[10])} ${$g.svgRound(C[11])}`);
  18727. continue;
  18728. }
  18729. for (let i = 6, e = C.length; i < e; i += 6) {
  18730. const [A, s, l, n, a, d] = C.subarray(i, i + 6).map($g.svgRound);
  18731. g.push(`C${A} ${s} ${l} ${n} ${a} ${d}`);
  18732. }
  18733. }
  18734. return g.join("");
  18735. }
  18736. serialize([g, C, i, e], A) {
  18737. const s = [], l = [], [n, a, d, o] = ig(this, ii, wIg).call(this);
  18738. let c, r, h, b, u, m, Z, p, Y;
  18739. switch (M(this, Z0)) {
  18740. case 0:
  18741. Y = $g._rescale, c = g, r = C + e, h = i, b = -e, u = g + n * i, m = C + (1 - a - o) * e, Z = g + (n + d) * i, p = C + (1 - a) * e;
  18742. break;
  18743. case 90:
  18744. Y = $g._rescaleAndSwap, c = g, r = C, h = i, b = e, u = g + a * i, m = C + n * e, Z = g + (a + o) * i, p = C + (n + d) * e;
  18745. break;
  18746. case 180:
  18747. Y = $g._rescale, c = g + i, r = C, h = -i, b = e, u = g + (1 - n - d) * i, m = C + a * e, Z = g + (1 - n) * i, p = C + (a + o) * e;
  18748. break;
  18749. case 270:
  18750. Y = $g._rescaleAndSwap, c = g + i, r = C + e, h = -i, b = -e, u = g + (1 - a - o) * i, m = C + (1 - n - d) * e, Z = g + (1 - a) * i, p = C + (1 - n) * e;
  18751. break;
  18752. }
  18753. for (const {
  18754. line: R,
  18755. points: X
  18756. } of M(this, pe))
  18757. s.push(Y(R, c, r, h, b, A ? new Array(R.length) : null)), l.push(Y(X, c, r, h, b, A ? new Array(X.length) : null));
  18758. return {
  18759. lines: s,
  18760. points: l,
  18761. rect: [u, m, Z, p]
  18762. };
  18763. }
  18764. static deserialize(g, C, i, e, A, {
  18765. paths: {
  18766. lines: s,
  18767. points: l
  18768. },
  18769. rotation: n,
  18770. thickness: a
  18771. }) {
  18772. const d = [];
  18773. let o, c, r, h, b;
  18774. switch (n) {
  18775. case 0:
  18776. b = $g._rescale, o = -g / i, c = C / e + 1, r = 1 / i, h = -1 / e;
  18777. break;
  18778. case 90:
  18779. b = $g._rescaleAndSwap, o = -C / e, c = -g / i, r = 1 / e, h = 1 / i;
  18780. break;
  18781. case 180:
  18782. b = $g._rescale, o = g / i + 1, c = -C / e, r = -1 / i, h = 1 / e;
  18783. break;
  18784. case 270:
  18785. b = $g._rescaleAndSwap, o = C / e + 1, c = g / i + 1, r = -1 / e, h = -1 / i;
  18786. break;
  18787. }
  18788. if (!s) {
  18789. s = [];
  18790. for (const m of l) {
  18791. const Z = m.length;
  18792. if (Z === 2) {
  18793. s.push(new Float32Array([NaN, NaN, NaN, NaN, m[0], m[1]]));
  18794. continue;
  18795. }
  18796. if (Z === 4) {
  18797. s.push(new Float32Array([NaN, NaN, NaN, NaN, m[0], m[1], NaN, NaN, NaN, NaN, m[2], m[3]]));
  18798. continue;
  18799. }
  18800. const p = new Float32Array(3 * (Z - 2));
  18801. s.push(p);
  18802. let [Y, R, X, H] = m.subarray(0, 4);
  18803. p.set([NaN, NaN, NaN, NaN, Y, R], 0);
  18804. for (let S = 4; S < Z; S += 2) {
  18805. const z = m[S], v = m[S + 1];
  18806. p.set($g.createBezierPoints(Y, R, X, H, z, v), (S - 2) * 3), [Y, R, X, H] = [X, H, z, v];
  18807. }
  18808. }
  18809. }
  18810. for (let m = 0, Z = s.length; m < Z; m++)
  18811. d.push({
  18812. line: b(s[m].map((p) => p ?? NaN), o, c, r, h),
  18813. points: b(l[m].map((p) => p ?? NaN), o, c, r, h)
  18814. });
  18815. const u = new this.prototype.constructor();
  18816. return u.build(d, i, e, 1, n, a, A), u;
  18817. }
  18818. get box() {
  18819. return M(this, Mi);
  18820. }
  18821. updateProperty(g, C) {
  18822. return g === "stroke-width" ? ig(this, ii, BIg).call(this, C) : null;
  18823. }
  18824. updateParentDimensions([g, C], i) {
  18825. const [e, A] = ig(this, ii, hl).call(this);
  18826. $(this, Vs, g), $(this, Ms, C), $(this, m0, i);
  18827. const [s, l] = ig(this, ii, hl).call(this), n = s - e, a = l - A, d = M(this, Mi);
  18828. return d[0] -= n, d[1] -= a, d[2] += 2 * n, d[3] += 2 * a, d;
  18829. }
  18830. updateRotation(g) {
  18831. return $(this, gG, g), {
  18832. path: {
  18833. transform: this.rotationTransform
  18834. }
  18835. };
  18836. }
  18837. get viewBox() {
  18838. return M(this, Mi).map($g.svgRound).join(" ");
  18839. }
  18840. get defaultProperties() {
  18841. const [g, C] = M(this, Mi);
  18842. return {
  18843. root: {
  18844. viewBox: this.viewBox
  18845. },
  18846. path: {
  18847. "transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`
  18848. }
  18849. };
  18850. }
  18851. get rotationTransform() {
  18852. const [, , g, C] = M(this, Mi);
  18853. let i = 0, e = 0, A = 0, s = 0, l = 0, n = 0;
  18854. switch (M(this, gG)) {
  18855. case 90:
  18856. e = C / g, A = -g / C, l = g;
  18857. break;
  18858. case 180:
  18859. i = -1, s = -1, l = g, n = C;
  18860. break;
  18861. case 270:
  18862. e = -C / g, A = g / C, n = C;
  18863. break;
  18864. default:
  18865. return "";
  18866. }
  18867. return `matrix(${i} ${e} ${A} ${s} ${$g.svgRound(l)} ${$g.svgRound(n)})`;
  18868. }
  18869. getPathResizingSVGProperties([g, C, i, e]) {
  18870. const [A, s] = ig(this, ii, hl).call(this), [l, n, a, d] = M(this, Mi);
  18871. if (Math.abs(a - A) <= $g.PRECISION || Math.abs(d - s) <= $g.PRECISION) {
  18872. const b = g + i / 2 - (l + a / 2), u = C + e / 2 - (n + d / 2);
  18873. return {
  18874. path: {
  18875. "transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`,
  18876. transform: `${this.rotationTransform} translate(${b} ${u})`
  18877. }
  18878. };
  18879. }
  18880. const o = (i - 2 * A) / (a - 2 * A), c = (e - 2 * s) / (d - 2 * s), r = a / i, h = d / e;
  18881. return {
  18882. path: {
  18883. "transform-origin": `${$g.svgRound(l)} ${$g.svgRound(n)}`,
  18884. transform: `${this.rotationTransform} scale(${r} ${h}) translate(${$g.svgRound(A)} ${$g.svgRound(s)}) scale(${o} ${c}) translate(${$g.svgRound(-A)} ${$g.svgRound(-s)})`
  18885. }
  18886. };
  18887. }
  18888. getPathResizedSVGProperties([g, C, i, e]) {
  18889. const [A, s] = ig(this, ii, hl).call(this), l = M(this, Mi), [n, a, d, o] = l;
  18890. if (l[0] = g, l[1] = C, l[2] = i, l[3] = e, Math.abs(d - A) <= $g.PRECISION || Math.abs(o - s) <= $g.PRECISION) {
  18891. const u = g + i / 2 - (n + d / 2), m = C + e / 2 - (a + o / 2);
  18892. for (const {
  18893. line: Z,
  18894. points: p
  18895. } of M(this, pe))
  18896. $g._translate(Z, u, m, Z), $g._translate(p, u, m, p);
  18897. return {
  18898. root: {
  18899. viewBox: this.viewBox
  18900. },
  18901. path: {
  18902. "transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`,
  18903. transform: this.rotationTransform || null,
  18904. d: this.toSVGPath()
  18905. }
  18906. };
  18907. }
  18908. const c = (i - 2 * A) / (d - 2 * A), r = (e - 2 * s) / (o - 2 * s), h = -c * (n + A) + g + A, b = -r * (a + s) + C + s;
  18909. if (c !== 1 || r !== 1 || h !== 0 || b !== 0)
  18910. for (const {
  18911. line: u,
  18912. points: m
  18913. } of M(this, pe))
  18914. $g._rescale(u, h, b, c, r, u), $g._rescale(m, h, b, c, r, m);
  18915. return {
  18916. root: {
  18917. viewBox: this.viewBox
  18918. },
  18919. path: {
  18920. "transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`,
  18921. transform: this.rotationTransform || null,
  18922. d: this.toSVGPath()
  18923. }
  18924. };
  18925. }
  18926. getPathTranslatedSVGProperties([g, C], i) {
  18927. const [e, A] = i, s = M(this, Mi), l = g - s[0], n = C - s[1];
  18928. if (M(this, Vs) === e && M(this, Ms) === A)
  18929. for (const {
  18930. line: a,
  18931. points: d
  18932. } of M(this, pe))
  18933. $g._translate(a, l, n, a), $g._translate(d, l, n, d);
  18934. else {
  18935. const a = M(this, Vs) / e, d = M(this, Ms) / A;
  18936. $(this, Vs, e), $(this, Ms, A);
  18937. for (const {
  18938. line: o,
  18939. points: c
  18940. } of M(this, pe))
  18941. $g._rescale(o, l, n, a, d, o), $g._rescale(c, l, n, a, d, c);
  18942. s[2] *= a, s[3] *= d;
  18943. }
  18944. return s[0] = g, s[1] = C, {
  18945. root: {
  18946. viewBox: this.viewBox
  18947. },
  18948. path: {
  18949. d: this.toSVGPath(),
  18950. "transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`
  18951. }
  18952. };
  18953. }
  18954. get defaultSVGProperties() {
  18955. const g = M(this, Mi);
  18956. return {
  18957. root: {
  18958. viewBox: this.viewBox
  18959. },
  18960. rootClass: {
  18961. draw: !0
  18962. },
  18963. path: {
  18964. d: this.toSVGPath(),
  18965. "transform-origin": `${$g.svgRound(g[0])} ${$g.svgRound(g[1])}`,
  18966. transform: this.rotationTransform || null
  18967. },
  18968. bbox: g
  18969. };
  18970. }
  18971. }
  18972. Mi = new WeakMap(), gG = new WeakMap(), IG = new WeakMap(), pe = new WeakMap(), Vs = new WeakMap(), Ms = new WeakMap(), m0 = new WeakMap(), Z0 = new WeakMap(), Cd = new WeakMap(), ii = new WeakSet(), hl = function(g = M(this, Cd)) {
  18973. const C = M(this, IG) + g / 2 * M(this, m0);
  18974. return M(this, Z0) % 180 === 0 ? [C / M(this, Vs), C / M(this, Ms)] : [C / M(this, Ms), C / M(this, Vs)];
  18975. }, wIg = function() {
  18976. const [g, C, i, e] = M(this, Mi), [A, s] = ig(this, ii, hl).call(this, 0);
  18977. return [g + A, C + s, i - 2 * A, e - 2 * s];
  18978. }, pIg = function() {
  18979. const g = $(this, Mi, new Float32Array([1 / 0, 1 / 0, -1 / 0, -1 / 0]));
  18980. for (const {
  18981. line: e
  18982. } of M(this, pe)) {
  18983. if (e.length <= 12) {
  18984. for (let l = 4, n = e.length; l < n; l += 6)
  18985. AI.pointBoundingBox(e[l], e[l + 1], g);
  18986. continue;
  18987. }
  18988. let A = e[4], s = e[5];
  18989. for (let l = 6, n = e.length; l < n; l += 6) {
  18990. const [a, d, o, c, r, h] = e.subarray(l, l + 6);
  18991. AI.bezierBoundingBox(A, s, a, d, o, c, r, h, g), A = r, s = h;
  18992. }
  18993. }
  18994. const [C, i] = ig(this, ii, hl).call(this);
  18995. g[0] = fi(g[0] - C, 0, 1), g[1] = fi(g[1] - i, 0, 1), g[2] = fi(g[2] + C, 0, 1), g[3] = fi(g[3] + i, 0, 1), g[2] -= g[0], g[3] -= g[1];
  18996. }, BIg = function(g) {
  18997. const [C, i] = ig(this, ii, hl).call(this);
  18998. $(this, Cd, g);
  18999. const [e, A] = ig(this, ii, hl).call(this), [s, l] = [e - C, A - i], n = M(this, Mi);
  19000. return n[0] -= s, n[1] -= l, n[2] += 2 * s, n[3] += 2 * l, n;
  19001. };
  19002. class IM extends ZIg {
  19003. constructor(I) {
  19004. super(), this._viewParameters = I, super.updateProperties({
  19005. fill: "none",
  19006. stroke: TC._defaultLineColor,
  19007. "stroke-opacity": 1,
  19008. "stroke-width": 1,
  19009. "stroke-linecap": "round",
  19010. "stroke-linejoin": "round",
  19011. "stroke-miterlimit": 10
  19012. });
  19013. }
  19014. updateSVGProperty(I, g) {
  19015. I === "stroke-width" && (g ?? (g = this["stroke-width"]), g *= this._viewParameters.realScale), super.updateSVGProperty(I, g);
  19016. }
  19017. clone() {
  19018. const I = new IM(this._viewParameters);
  19019. return I.updateAll(this), I;
  19020. }
  19021. }
  19022. var UV, WIg;
  19023. const nh = class nh extends nV {
  19024. constructor(g) {
  19025. super({
  19026. ...g,
  19027. name: "inkEditor"
  19028. });
  19029. tg(this, UV);
  19030. this._willKeepAspectRatio = !0, this.defaultL10nId = "pdfjs-editor-ink-editor";
  19031. }
  19032. static initialize(g, C) {
  19033. TC.initialize(g, C), this._defaultDrawingOptions = new IM(C.viewParameters);
  19034. }
  19035. static getDefaultDrawingOptions(g) {
  19036. const C = this._defaultDrawingOptions.clone();
  19037. return C.updateProperties(g), C;
  19038. }
  19039. static get supportMultipleDrawings() {
  19040. return !0;
  19041. }
  19042. static get typesMap() {
  19043. return UI(this, "typesMap", /* @__PURE__ */ new Map([[iC.INK_THICKNESS, "stroke-width"], [iC.INK_COLOR, "stroke"], [iC.INK_OPACITY, "stroke-opacity"]]));
  19044. }
  19045. static createDrawerInstance(g, C, i, e, A) {
  19046. return new Mdg(g, C, i, e, A, this._defaultDrawingOptions["stroke-width"]);
  19047. }
  19048. static deserializeDraw(g, C, i, e, A, s) {
  19049. return oG.deserialize(g, C, i, e, A, s);
  19050. }
  19051. static async deserialize(g, C, i) {
  19052. let e = null;
  19053. if (g instanceof p9) {
  19054. const {
  19055. data: {
  19056. inkLists: s,
  19057. rect: l,
  19058. rotation: n,
  19059. id: a,
  19060. color: d,
  19061. opacity: o,
  19062. borderStyle: {
  19063. rawWidth: c
  19064. },
  19065. popupRef: r
  19066. },
  19067. parent: {
  19068. page: {
  19069. pageNumber: h
  19070. }
  19071. }
  19072. } = g;
  19073. e = g = {
  19074. annotationType: XI.INK,
  19075. color: Array.from(d),
  19076. thickness: c,
  19077. opacity: o,
  19078. paths: {
  19079. points: s
  19080. },
  19081. boxes: null,
  19082. pageIndex: h - 1,
  19083. rect: l.slice(0),
  19084. rotation: n,
  19085. id: a,
  19086. deleted: !1,
  19087. popupRef: r
  19088. };
  19089. }
  19090. const A = await super.deserialize(g, C, i);
  19091. return A.annotationElementId = g.id || null, A._initialData = e, A;
  19092. }
  19093. onScaleChanging() {
  19094. if (!this.parent)
  19095. return;
  19096. super.onScaleChanging();
  19097. const {
  19098. _drawId: g,
  19099. _drawingOptions: C,
  19100. parent: i
  19101. } = this;
  19102. C.updateSVGProperty("stroke-width"), i.drawLayer.updateProperties(g, C.toSVGProperties());
  19103. }
  19104. static onScaleChangingWhenDrawing() {
  19105. const g = this._currentParent;
  19106. g && (super.onScaleChangingWhenDrawing(), this._defaultDrawingOptions.updateSVGProperty("stroke-width"), g.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()));
  19107. }
  19108. createDrawingOptions({
  19109. color: g,
  19110. thickness: C,
  19111. opacity: i
  19112. }) {
  19113. this._drawingOptions = nh.getDefaultDrawingOptions({
  19114. stroke: AI.makeHexColor(...g),
  19115. "stroke-width": C,
  19116. "stroke-opacity": i
  19117. });
  19118. }
  19119. serialize(g = !1) {
  19120. if (this.isEmpty())
  19121. return null;
  19122. if (this.deleted)
  19123. return this.serializeDeleted();
  19124. const {
  19125. lines: C,
  19126. points: i,
  19127. rect: e
  19128. } = this.serializeDraw(g), {
  19129. _drawingOptions: {
  19130. stroke: A,
  19131. "stroke-opacity": s,
  19132. "stroke-width": l
  19133. }
  19134. } = this, n = {
  19135. annotationType: XI.INK,
  19136. color: TC._colorManager.convert(A),
  19137. opacity: s,
  19138. thickness: l,
  19139. paths: {
  19140. lines: C,
  19141. points: i
  19142. },
  19143. pageIndex: this.pageIndex,
  19144. rect: e,
  19145. rotation: this.rotation,
  19146. structTreeParentId: this._structTreeParentId
  19147. };
  19148. return g ? (n.isCopy = !0, n) : this.annotationElementId && !ig(this, UV, WIg).call(this, n) ? null : (n.id = this.annotationElementId, n);
  19149. }
  19150. renderAnnotationElement(g) {
  19151. const {
  19152. points: C,
  19153. rect: i
  19154. } = this.serializeDraw(!1);
  19155. return g.updateEdited({
  19156. rect: i,
  19157. thickness: this._drawingOptions["stroke-width"],
  19158. points: C
  19159. }), null;
  19160. }
  19161. };
  19162. UV = new WeakSet(), WIg = function(g) {
  19163. const {
  19164. color: C,
  19165. thickness: i,
  19166. opacity: e,
  19167. pageIndex: A
  19168. } = this._initialData;
  19169. return this._hasBeenMoved || this._hasBeenResized || g.color.some((s, l) => s !== C[l]) || g.thickness !== i || g.opacity !== e || g.pageIndex !== A;
  19170. }, iI(nh, "_type", "ink"), iI(nh, "_editorType", XI.INK), iI(nh, "_defaultDrawingOptions", null);
  19171. let US = nh;
  19172. class ES extends oG {
  19173. toSVGPath() {
  19174. let I = super.toSVGPath();
  19175. return I.endsWith("Z") || (I += "Z"), I;
  19176. }
  19177. }
  19178. const TY = 8, Du = 3;
  19179. var td, rC, PS, fA, yIg, YIg, _S, DN, NIg, VIg, MIg, qS, $S, RIg;
  19180. class Ol {
  19181. static extractContoursFromText(I, {
  19182. fontFamily: g,
  19183. fontStyle: C,
  19184. fontWeight: i
  19185. }, e, A, s, l) {
  19186. let n = new OffscreenCanvas(1, 1), a = n.getContext("2d", {
  19187. alpha: !1
  19188. });
  19189. const d = 200, o = a.font = `${C} ${i} ${d}px ${g}`, {
  19190. actualBoundingBoxLeft: c,
  19191. actualBoundingBoxRight: r,
  19192. actualBoundingBoxAscent: h,
  19193. actualBoundingBoxDescent: b,
  19194. fontBoundingBoxAscent: u,
  19195. fontBoundingBoxDescent: m,
  19196. width: Z
  19197. } = a.measureText(I), p = 1.5, Y = Math.ceil(Math.max(Math.abs(c) + Math.abs(r) || 0, Z) * p), R = Math.ceil(Math.max(Math.abs(h) + Math.abs(b) || d, Math.abs(u) + Math.abs(m) || d) * p);
  19198. n = new OffscreenCanvas(Y, R), a = n.getContext("2d", {
  19199. alpha: !0,
  19200. willReadFrequently: !0
  19201. }), a.font = o, a.filter = "grayscale(1)", a.fillStyle = "white", a.fillRect(0, 0, Y, R), a.fillStyle = "black", a.fillText(I, Y * (p - 1) / 2, R * (3 - p) / 2);
  19202. const X = ig(this, rC, qS).call(this, a.getImageData(0, 0, Y, R).data), H = ig(this, rC, MIg).call(this, X), S = ig(this, rC, $S).call(this, H), z = ig(this, rC, _S).call(this, X, Y, R, S);
  19203. return this.processDrawnLines({
  19204. lines: {
  19205. curves: z,
  19206. width: Y,
  19207. height: R
  19208. },
  19209. pageWidth: e,
  19210. pageHeight: A,
  19211. rotation: s,
  19212. innerMargin: l,
  19213. mustSmooth: !0,
  19214. areContours: !0
  19215. });
  19216. }
  19217. static process(I, g, C, i, e) {
  19218. const [A, s, l] = ig(this, rC, RIg).call(this, I), [n, a] = ig(this, rC, VIg).call(this, A, s, l, Math.hypot(s, l) * M(this, td).sigmaSFactor, M(this, td).sigmaR, M(this, td).kernelSize), d = ig(this, rC, $S).call(this, a), o = ig(this, rC, _S).call(this, n, s, l, d);
  19219. return this.processDrawnLines({
  19220. lines: {
  19221. curves: o,
  19222. width: s,
  19223. height: l
  19224. },
  19225. pageWidth: g,
  19226. pageHeight: C,
  19227. rotation: i,
  19228. innerMargin: e,
  19229. mustSmooth: !0,
  19230. areContours: !0
  19231. });
  19232. }
  19233. static processDrawnLines({
  19234. lines: I,
  19235. pageWidth: g,
  19236. pageHeight: C,
  19237. rotation: i,
  19238. innerMargin: e,
  19239. mustSmooth: A,
  19240. areContours: s
  19241. }) {
  19242. i % 180 !== 0 && ([g, C] = [C, g]);
  19243. const {
  19244. curves: l,
  19245. width: n,
  19246. height: a
  19247. } = I, d = I.thickness ?? 0, o = [], c = Math.min(g / n, C / a), r = c / g, h = c / C, b = [];
  19248. for (const {
  19249. points: m
  19250. } of l) {
  19251. const Z = A ? ig(this, rC, NIg).call(this, m) : m;
  19252. if (!Z)
  19253. continue;
  19254. b.push(Z);
  19255. const p = Z.length, Y = new Float32Array(p), R = new Float32Array(3 * (p === 2 ? 2 : p - 2));
  19256. if (o.push({
  19257. line: R,
  19258. points: Y
  19259. }), p === 2) {
  19260. Y[0] = Z[0] * r, Y[1] = Z[1] * h, R.set([NaN, NaN, NaN, NaN, Y[0], Y[1]], 0);
  19261. continue;
  19262. }
  19263. let [X, H, S, z] = Z;
  19264. X *= r, H *= h, S *= r, z *= h, Y.set([X, H, S, z], 0), R.set([NaN, NaN, NaN, NaN, X, H], 0);
  19265. for (let v = 4; v < p; v += 2) {
  19266. const K = Y[v] = Z[v] * r, V = Y[v + 1] = Z[v + 1] * h;
  19267. R.set($g.createBezierPoints(X, H, S, z, K, V), (v - 2) * 3), [X, H, S, z] = [S, z, K, V];
  19268. }
  19269. }
  19270. if (o.length === 0)
  19271. return null;
  19272. const u = s ? new ES() : new oG();
  19273. return u.build(o, g, C, 1, i, s ? 0 : d, e), {
  19274. outline: u,
  19275. newCurves: b,
  19276. areContours: s,
  19277. thickness: d,
  19278. width: n,
  19279. height: a
  19280. };
  19281. }
  19282. static async compressSignature({
  19283. outlines: I,
  19284. areContours: g,
  19285. thickness: C,
  19286. width: i,
  19287. height: e
  19288. }) {
  19289. let A = 1 / 0, s = -1 / 0, l = 0;
  19290. for (const Z of I) {
  19291. l += Z.length;
  19292. for (let p = 2, Y = Z.length; p < Y; p++) {
  19293. const R = Z[p] - Z[p - 2];
  19294. A = Math.min(A, R), s = Math.max(s, R);
  19295. }
  19296. }
  19297. let n;
  19298. A >= -128 && s <= 127 ? n = Int8Array : A >= -32768 && s <= 32767 ? n = Int16Array : n = Int32Array;
  19299. const a = I.length, d = TY + Du * a, o = new Uint32Array(d);
  19300. let c = 0;
  19301. o[c++] = d * Uint32Array.BYTES_PER_ELEMENT + (l - 2 * a) * n.BYTES_PER_ELEMENT, o[c++] = 0, o[c++] = i, o[c++] = e, o[c++] = g ? 0 : 1, o[c++] = Math.max(0, Math.floor(C ?? 0)), o[c++] = a, o[c++] = n.BYTES_PER_ELEMENT;
  19302. for (const Z of I)
  19303. o[c++] = Z.length - 2, o[c++] = Z[0], o[c++] = Z[1];
  19304. const r = new CompressionStream("deflate-raw"), h = r.writable.getWriter();
  19305. await h.ready, h.write(o);
  19306. const b = n.prototype.constructor;
  19307. for (const Z of I) {
  19308. const p = new b(Z.length - 2);
  19309. for (let Y = 2, R = Z.length; Y < R; Y++)
  19310. p[Y - 2] = Z[Y] - Z[Y - 2];
  19311. h.write(p);
  19312. }
  19313. h.close();
  19314. const u = await new Response(r.readable).arrayBuffer(), m = new Uint8Array(u);
  19315. return X$(m);
  19316. }
  19317. static async decompressSignature(I) {
  19318. try {
  19319. const g = qog(I), {
  19320. readable: C,
  19321. writable: i
  19322. } = new DecompressionStream("deflate-raw"), e = i.getWriter();
  19323. await e.ready, e.write(g).then(async () => {
  19324. await e.ready, await e.close();
  19325. }).catch(() => {
  19326. });
  19327. let A = null, s = 0;
  19328. for await (const Z of C)
  19329. A || (A = new Uint8Array(new Uint32Array(Z.buffer, 0, 4)[0])), A.set(Z, s), s += Z.length;
  19330. const l = new Uint32Array(A.buffer, 0, A.length >> 2), n = l[1];
  19331. if (n !== 0)
  19332. throw new Error(`Invalid version: ${n}`);
  19333. const a = l[2], d = l[3], o = l[4] === 0, c = l[5], r = l[6], h = l[7], b = [], u = (TY + Du * r) * Uint32Array.BYTES_PER_ELEMENT;
  19334. let m;
  19335. switch (h) {
  19336. case Int8Array.BYTES_PER_ELEMENT:
  19337. m = new Int8Array(A.buffer, u);
  19338. break;
  19339. case Int16Array.BYTES_PER_ELEMENT:
  19340. m = new Int16Array(A.buffer, u);
  19341. break;
  19342. case Int32Array.BYTES_PER_ELEMENT:
  19343. m = new Int32Array(A.buffer, u);
  19344. break;
  19345. }
  19346. s = 0;
  19347. for (let Z = 0; Z < r; Z++) {
  19348. const p = l[Du * Z + TY], Y = new Float32Array(p + 2);
  19349. b.push(Y);
  19350. for (let R = 0; R < Du - 1; R++)
  19351. Y[R] = l[Du * Z + TY + R + 1];
  19352. for (let R = 0; R < p; R++)
  19353. Y[R + 2] = Y[R] + m[s++];
  19354. }
  19355. return {
  19356. areContours: o,
  19357. thickness: c,
  19358. outlines: b,
  19359. width: a,
  19360. height: d
  19361. };
  19362. } catch (g) {
  19363. return DI(`decompressSignature: ${g}`), null;
  19364. }
  19365. }
  19366. }
  19367. td = new WeakMap(), rC = new WeakSet(), PS = function(I, g, C, i) {
  19368. return C -= I, i -= g, C === 0 ? i > 0 ? 0 : 4 : C === 1 ? i + 6 : 2 - i;
  19369. }, fA = new WeakMap(), yIg = function(I, g, C, i, e, A, s) {
  19370. const l = ig(this, rC, PS).call(this, C, i, e, A);
  19371. for (let n = 0; n < 8; n++) {
  19372. const a = (-n + l - s + 16) % 8, d = M(this, fA)[2 * a], o = M(this, fA)[2 * a + 1];
  19373. if (I[(C + d) * g + (i + o)] !== 0)
  19374. return a;
  19375. }
  19376. return -1;
  19377. }, YIg = function(I, g, C, i, e, A, s) {
  19378. const l = ig(this, rC, PS).call(this, C, i, e, A);
  19379. for (let n = 0; n < 8; n++) {
  19380. const a = (n + l + s + 16) % 8, d = M(this, fA)[2 * a], o = M(this, fA)[2 * a + 1];
  19381. if (I[(C + d) * g + (i + o)] !== 0)
  19382. return a;
  19383. }
  19384. return -1;
  19385. }, _S = function(I, g, C, i) {
  19386. const e = I.length, A = new Int32Array(e);
  19387. for (let a = 0; a < e; a++)
  19388. A[a] = I[a] <= i ? 1 : 0;
  19389. for (let a = 1; a < C - 1; a++)
  19390. A[a * g] = A[a * g + g - 1] = 0;
  19391. for (let a = 0; a < g; a++)
  19392. A[a] = A[g * C - 1 - a] = 0;
  19393. let s = 1, l;
  19394. const n = [];
  19395. for (let a = 1; a < C - 1; a++) {
  19396. l = 1;
  19397. for (let d = 1; d < g - 1; d++) {
  19398. const o = a * g + d, c = A[o];
  19399. if (c === 0)
  19400. continue;
  19401. let r = a, h = d;
  19402. if (c === 1 && A[o - 1] === 0)
  19403. s += 1, h -= 1;
  19404. else if (c >= 1 && A[o + 1] === 0)
  19405. s += 1, h += 1, c > 1 && (l = c);
  19406. else {
  19407. c !== 1 && (l = Math.abs(c));
  19408. continue;
  19409. }
  19410. const b = [d, a], u = h === d + 1, m = {
  19411. isHole: u,
  19412. points: b,
  19413. id: s,
  19414. parent: 0
  19415. };
  19416. n.push(m);
  19417. let Z;
  19418. for (const v of n)
  19419. if (v.id === l) {
  19420. Z = v;
  19421. break;
  19422. }
  19423. Z ? Z.isHole ? m.parent = u ? Z.parent : l : m.parent = u ? l : Z.parent : m.parent = u ? l : 0;
  19424. const p = ig(this, rC, yIg).call(this, A, g, a, d, r, h, 0);
  19425. if (p === -1) {
  19426. A[o] = -s, A[o] !== 1 && (l = Math.abs(A[o]));
  19427. continue;
  19428. }
  19429. let Y = M(this, fA)[2 * p], R = M(this, fA)[2 * p + 1];
  19430. const X = a + Y, H = d + R;
  19431. r = X, h = H;
  19432. let S = a, z = d;
  19433. for (; ; ) {
  19434. const v = ig(this, rC, YIg).call(this, A, g, S, z, r, h, 1);
  19435. Y = M(this, fA)[2 * v], R = M(this, fA)[2 * v + 1];
  19436. const K = S + Y, V = z + R;
  19437. b.push(V, K);
  19438. const N = S * g + z;
  19439. if (A[N + 1] === 0 ? A[N] = -s : A[N] === 1 && (A[N] = s), K === a && V === d && S === X && z === H) {
  19440. A[o] !== 1 && (l = Math.abs(A[o]));
  19441. break;
  19442. } else
  19443. r = S, h = z, S = K, z = V;
  19444. }
  19445. }
  19446. }
  19447. return n;
  19448. }, DN = function(I, g, C, i) {
  19449. if (C - g <= 4) {
  19450. for (let X = g; X < C - 2; X += 2)
  19451. i.push(I[X], I[X + 1]);
  19452. return;
  19453. }
  19454. const e = I[g], A = I[g + 1], s = I[C - 4] - e, l = I[C - 3] - A, n = Math.hypot(s, l), a = s / n, d = l / n, o = a * A - d * e, c = l / s, r = 1 / n, h = Math.atan(c), b = Math.cos(h), u = Math.sin(h), m = r * (Math.abs(b) + Math.abs(u)), Z = r * (1 - m + m ** 2), p = Math.max(Math.atan(Math.abs(u + b) * Z), Math.atan(Math.abs(u - b) * Z));
  19455. let Y = 0, R = g;
  19456. for (let X = g + 2; X < C - 2; X += 2) {
  19457. const H = Math.abs(o - a * I[X + 1] + d * I[X]);
  19458. H > Y && (R = X, Y = H);
  19459. }
  19460. Y > (n * p) ** 2 ? (ig(this, rC, DN).call(this, I, g, R + 2, i), ig(this, rC, DN).call(this, I, R, C, i)) : i.push(e, A);
  19461. }, NIg = function(I) {
  19462. const g = [], C = I.length;
  19463. return ig(this, rC, DN).call(this, I, 0, C, g), g.push(I[C - 2], I[C - 1]), g.length <= 4 ? null : g;
  19464. }, VIg = function(I, g, C, i, e, A) {
  19465. const s = new Float32Array(A ** 2), l = -2 * i ** 2, n = A >> 1;
  19466. for (let h = 0; h < A; h++) {
  19467. const b = (h - n) ** 2;
  19468. for (let u = 0; u < A; u++)
  19469. s[h * A + u] = Math.exp((b + (u - n) ** 2) / l);
  19470. }
  19471. const a = new Float32Array(256), d = -2 * e ** 2;
  19472. for (let h = 0; h < 256; h++)
  19473. a[h] = Math.exp(h ** 2 / d);
  19474. const o = I.length, c = new Uint8Array(o), r = new Uint32Array(256);
  19475. for (let h = 0; h < C; h++)
  19476. for (let b = 0; b < g; b++) {
  19477. const u = h * g + b, m = I[u];
  19478. let Z = 0, p = 0;
  19479. for (let R = 0; R < A; R++) {
  19480. const X = h + R - n;
  19481. if (!(X < 0 || X >= C))
  19482. for (let H = 0; H < A; H++) {
  19483. const S = b + H - n;
  19484. if (S < 0 || S >= g)
  19485. continue;
  19486. const z = I[X * g + S], v = s[R * A + H] * a[Math.abs(z - m)];
  19487. Z += z * v, p += v;
  19488. }
  19489. }
  19490. const Y = c[u] = Math.round(Z / p);
  19491. r[Y]++;
  19492. }
  19493. return [c, r];
  19494. }, MIg = function(I) {
  19495. const g = new Uint32Array(256);
  19496. for (const C of I)
  19497. g[C]++;
  19498. return g;
  19499. }, qS = function(I) {
  19500. const g = I.length, C = new Uint8ClampedArray(g >> 2);
  19501. let i = -1 / 0, e = 1 / 0;
  19502. for (let s = 0, l = C.length; s < l; s++) {
  19503. if (I[(s << 2) + 3] === 0) {
  19504. i = C[s] = 255;
  19505. continue;
  19506. }
  19507. const a = C[s] = I[s << 2];
  19508. a > i && (i = a), a < e && (e = a);
  19509. }
  19510. const A = 255 / (i - e);
  19511. for (let s = 0; s < g; s++)
  19512. C[s] = (C[s] - e) * A;
  19513. return C;
  19514. }, $S = function(I) {
  19515. let g, C = -1 / 0, i = -1 / 0;
  19516. const e = I.findIndex((l) => l !== 0);
  19517. let A = e, s = e;
  19518. for (g = e; g < 256; g++) {
  19519. const l = I[g];
  19520. l > C && (g - A > i && (i = g - A, s = g - 1), C = l, A = g);
  19521. }
  19522. for (g = s - 1; g >= 0 && !(I[g] > I[g + 1]); g--)
  19523. ;
  19524. return g;
  19525. }, RIg = function(I) {
  19526. const g = I, {
  19527. width: C,
  19528. height: i
  19529. } = I, {
  19530. maxDim: e
  19531. } = M(this, td);
  19532. let A = C, s = i;
  19533. if (C > e || i > e) {
  19534. let o = C, c = i, r = Math.log2(Math.max(C, i) / e);
  19535. const h = Math.floor(r);
  19536. r = r === h ? h - 1 : h;
  19537. for (let u = 0; u < r; u++) {
  19538. A = o, s = c, A > e && (A = Math.ceil(A / 2)), s > e && (s = Math.ceil(s / 2));
  19539. const m = new OffscreenCanvas(A, s);
  19540. m.getContext("2d").drawImage(I, 0, 0, o, c, 0, 0, A, s), o = A, c = s, I !== g && I.close(), I = m.transferToImageBitmap();
  19541. }
  19542. const b = Math.min(e / A, e / s);
  19543. A = Math.round(A * b), s = Math.round(s * b);
  19544. }
  19545. const n = new OffscreenCanvas(A, s).getContext("2d", {
  19546. willReadFrequently: !0
  19547. });
  19548. n.filter = "grayscale(1)", n.drawImage(I, 0, 0, I.width, I.height, 0, 0, A, s);
  19549. const a = n.getImageData(0, 0, A, s).data;
  19550. return [ig(this, rC, qS).call(this, a), A, s];
  19551. }, tg(Ol, rC), tg(Ol, td, {
  19552. maxDim: 512,
  19553. sigmaSFactor: 0.02,
  19554. sigmaR: 25,
  19555. kernelSize: 16
  19556. }), tg(Ol, fA, new Int32Array([0, 1, -1, 1, -1, 0, -1, -1, 0, -1, 1, -1, 1, 0, 1, 1]));
  19557. class B9 extends ZIg {
  19558. constructor() {
  19559. super(), super.updateProperties({
  19560. fill: "CanvasText",
  19561. "stroke-width": 0
  19562. });
  19563. }
  19564. clone() {
  19565. const I = new B9();
  19566. return I.updateAll(this), I;
  19567. }
  19568. }
  19569. class W9 extends IM {
  19570. constructor(I) {
  19571. super(I), super.updateProperties({
  19572. stroke: "CanvasText",
  19573. "stroke-width": 1
  19574. });
  19575. }
  19576. clone() {
  19577. const I = new W9(this._viewParameters);
  19578. return I.updateAll(this), I;
  19579. }
  19580. }
  19581. var ka, Be, za, Ja;
  19582. const ne = class ne extends nV {
  19583. constructor(g) {
  19584. super({
  19585. ...g,
  19586. mustBeCommitted: !0,
  19587. name: "signatureEditor"
  19588. });
  19589. tg(this, ka, !1);
  19590. tg(this, Be, null);
  19591. tg(this, za, null);
  19592. tg(this, Ja, null);
  19593. this._willKeepAspectRatio = !0, $(this, za, g.signatureData || null), $(this, Be, null), this.defaultL10nId = "pdfjs-editor-signature-editor1";
  19594. }
  19595. static initialize(g, C) {
  19596. TC.initialize(g, C), this._defaultDrawingOptions = new B9(), this._defaultDrawnSignatureOptions = new W9(C.viewParameters);
  19597. }
  19598. static getDefaultDrawingOptions(g) {
  19599. const C = this._defaultDrawingOptions.clone();
  19600. return C.updateProperties(g), C;
  19601. }
  19602. static get supportMultipleDrawings() {
  19603. return !1;
  19604. }
  19605. static get typesMap() {
  19606. return UI(this, "typesMap", /* @__PURE__ */ new Map());
  19607. }
  19608. static get isDrawer() {
  19609. return !1;
  19610. }
  19611. get telemetryFinalData() {
  19612. return {
  19613. type: "signature",
  19614. hasDescription: !!M(this, Be)
  19615. };
  19616. }
  19617. static computeTelemetryFinalData(g) {
  19618. const C = g.get("hasDescription");
  19619. return {
  19620. hasAltText: C.get(!0) ?? 0,
  19621. hasNoAltText: C.get(!1) ?? 0
  19622. };
  19623. }
  19624. get isResizable() {
  19625. return !0;
  19626. }
  19627. onScaleChanging() {
  19628. this._drawId !== null && super.onScaleChanging();
  19629. }
  19630. render() {
  19631. if (this.div)
  19632. return this.div;
  19633. let g, C;
  19634. const {
  19635. _isCopy: i
  19636. } = this;
  19637. if (i && (this._isCopy = !1, g = this.x, C = this.y), super.render(), this._drawId === null)
  19638. if (M(this, za)) {
  19639. const {
  19640. lines: e,
  19641. mustSmooth: A,
  19642. areContours: s,
  19643. description: l,
  19644. uuid: n,
  19645. heightInPage: a
  19646. } = M(this, za), {
  19647. rawDims: {
  19648. pageWidth: d,
  19649. pageHeight: o
  19650. },
  19651. rotation: c
  19652. } = this.parent.viewport, r = Ol.processDrawnLines({
  19653. lines: e,
  19654. pageWidth: d,
  19655. pageHeight: o,
  19656. rotation: c,
  19657. innerMargin: ne._INNER_MARGIN,
  19658. mustSmooth: A,
  19659. areContours: s
  19660. });
  19661. this.addSignature(r, a, l, n);
  19662. } else
  19663. this.div.setAttribute("data-l10n-args", JSON.stringify({
  19664. description: ""
  19665. })), this.div.hidden = !0, this._uiManager.getSignature(this);
  19666. return i && (this._isCopy = !0, this._moveAfterPaste(g, C)), this.div;
  19667. }
  19668. setUuid(g) {
  19669. $(this, Ja, g), this.addEditToolbar();
  19670. }
  19671. getUuid() {
  19672. return M(this, Ja);
  19673. }
  19674. get description() {
  19675. return M(this, Be);
  19676. }
  19677. set description(g) {
  19678. $(this, Be, g), super.addEditToolbar().then((C) => {
  19679. C == null || C.updateEditSignatureButton(g);
  19680. });
  19681. }
  19682. getSignaturePreview() {
  19683. const {
  19684. newCurves: g,
  19685. areContours: C,
  19686. thickness: i,
  19687. width: e,
  19688. height: A
  19689. } = M(this, za), s = Math.max(e, A), l = Ol.processDrawnLines({
  19690. lines: {
  19691. curves: g.map((n) => ({
  19692. points: n
  19693. })),
  19694. thickness: i,
  19695. width: e,
  19696. height: A
  19697. },
  19698. pageWidth: s,
  19699. pageHeight: s,
  19700. rotation: 0,
  19701. innerMargin: 0,
  19702. mustSmooth: !1,
  19703. areContours: C
  19704. });
  19705. return {
  19706. areContours: C,
  19707. outline: l.outline
  19708. };
  19709. }
  19710. async addEditToolbar() {
  19711. const g = await super.addEditToolbar();
  19712. return g ? (this._uiManager.signatureManager && M(this, Be) !== null && (await g.addEditSignatureButton(this._uiManager.signatureManager, M(this, Ja), M(this, Be)), g.show()), g) : null;
  19713. }
  19714. addSignature(g, C, i, e) {
  19715. const {
  19716. x: A,
  19717. y: s
  19718. } = this, {
  19719. outline: l
  19720. } = $(this, za, g);
  19721. $(this, ka, l instanceof ES), $(this, Be, i), this.div.setAttribute("data-l10n-args", JSON.stringify({
  19722. description: i
  19723. }));
  19724. let n;
  19725. M(this, ka) ? n = ne.getDefaultDrawingOptions() : (n = ne._defaultDrawnSignatureOptions.clone(), n.updateProperties({
  19726. "stroke-width": l.thickness
  19727. })), this._addOutlines({
  19728. drawOutlines: l,
  19729. drawingOptions: n
  19730. });
  19731. const [a, d] = this.parentDimensions, [, o] = this.pageDimensions;
  19732. let c = C / o;
  19733. c = c >= 1 ? 0.5 : c, this.width *= c / this.height, this.width >= 1 && (c *= 0.9 / this.width, this.width = 0.9), this.height = c, this.setDims(a * this.width, d * this.height), this.x = A, this.y = s, this.center(), this._onResized(), this.onScaleChanging(), this.rotate(), this._uiManager.addToAnnotationStorage(this), this.setUuid(e), this._reportTelemetry({
  19734. action: "pdfjs.signature.inserted",
  19735. data: {
  19736. hasBeenSaved: !!e,
  19737. hasDescription: !!i
  19738. }
  19739. }), this.div.hidden = !1;
  19740. }
  19741. getFromImage(g) {
  19742. const {
  19743. rawDims: {
  19744. pageWidth: C,
  19745. pageHeight: i
  19746. },
  19747. rotation: e
  19748. } = this.parent.viewport;
  19749. return Ol.process(g, C, i, e, ne._INNER_MARGIN);
  19750. }
  19751. getFromText(g, C) {
  19752. const {
  19753. rawDims: {
  19754. pageWidth: i,
  19755. pageHeight: e
  19756. },
  19757. rotation: A
  19758. } = this.parent.viewport;
  19759. return Ol.extractContoursFromText(g, C, i, e, A, ne._INNER_MARGIN);
  19760. }
  19761. getDrawnSignature(g) {
  19762. const {
  19763. rawDims: {
  19764. pageWidth: C,
  19765. pageHeight: i
  19766. },
  19767. rotation: e
  19768. } = this.parent.viewport;
  19769. return Ol.processDrawnLines({
  19770. lines: g,
  19771. pageWidth: C,
  19772. pageHeight: i,
  19773. rotation: e,
  19774. innerMargin: ne._INNER_MARGIN,
  19775. mustSmooth: !1,
  19776. areContours: !1
  19777. });
  19778. }
  19779. createDrawingOptions({
  19780. areContours: g,
  19781. thickness: C
  19782. }) {
  19783. g ? this._drawingOptions = ne.getDefaultDrawingOptions() : (this._drawingOptions = ne._defaultDrawnSignatureOptions.clone(), this._drawingOptions.updateProperties({
  19784. "stroke-width": C
  19785. }));
  19786. }
  19787. serialize(g = !1) {
  19788. if (this.isEmpty())
  19789. return null;
  19790. const {
  19791. lines: C,
  19792. points: i,
  19793. rect: e
  19794. } = this.serializeDraw(g), {
  19795. _drawingOptions: {
  19796. "stroke-width": A
  19797. }
  19798. } = this, s = {
  19799. annotationType: XI.SIGNATURE,
  19800. isSignature: !0,
  19801. areContours: M(this, ka),
  19802. color: [0, 0, 0],
  19803. thickness: M(this, ka) ? 0 : A,
  19804. pageIndex: this.pageIndex,
  19805. rect: e,
  19806. rotation: this.rotation,
  19807. structTreeParentId: this._structTreeParentId
  19808. };
  19809. return g ? (s.paths = {
  19810. lines: C,
  19811. points: i
  19812. }, s.uuid = M(this, Ja), s.isCopy = !0) : s.lines = C, M(this, Be) && (s.accessibilityData = {
  19813. type: "Figure",
  19814. alt: M(this, Be)
  19815. }), s;
  19816. }
  19817. static deserializeDraw(g, C, i, e, A, s) {
  19818. return s.areContours ? ES.deserialize(g, C, i, e, A, s) : oG.deserialize(g, C, i, e, A, s);
  19819. }
  19820. static async deserialize(g, C, i) {
  19821. var A;
  19822. const e = await super.deserialize(g, C, i);
  19823. return $(e, ka, g.areContours), $(e, Be, ((A = g.accessibilityData) == null ? void 0 : A.alt) || ""), $(e, Ja, g.uuid), e;
  19824. }
  19825. };
  19826. ka = new WeakMap(), Be = new WeakMap(), za = new WeakMap(), Ja = new WeakMap(), iI(ne, "_type", "signature"), iI(ne, "_editorType", XI.SIGNATURE), iI(ne, "_defaultDrawingOptions", null);
  19827. let gD = ne;
  19828. var kC, Jt, La, Ll, va, G0, vl, id, Rs, We, w0, lC, tm, im, KN, FN, kN, CD, zN, fIg;
  19829. class ID extends TC {
  19830. constructor(g) {
  19831. super({
  19832. ...g,
  19833. name: "stampEditor"
  19834. });
  19835. tg(this, lC);
  19836. tg(this, kC, null);
  19837. tg(this, Jt, null);
  19838. tg(this, La, null);
  19839. tg(this, Ll, null);
  19840. tg(this, va, null);
  19841. tg(this, G0, "");
  19842. tg(this, vl, null);
  19843. tg(this, id, !1);
  19844. tg(this, Rs, null);
  19845. tg(this, We, !1);
  19846. tg(this, w0, !1);
  19847. $(this, Ll, g.bitmapUrl), $(this, va, g.bitmapFile), this.defaultL10nId = "pdfjs-editor-stamp-editor";
  19848. }
  19849. static initialize(g, C) {
  19850. TC.initialize(g, C);
  19851. }
  19852. static isHandlingMimeForPasting(g) {
  19853. return UX.includes(g);
  19854. }
  19855. static paste(g, C) {
  19856. C.pasteEditor(XI.STAMP, {
  19857. bitmapFile: g.getAsFile()
  19858. });
  19859. }
  19860. altTextFinish() {
  19861. this._uiManager.useNewAltTextFlow && (this.div.hidden = !1), super.altTextFinish();
  19862. }
  19863. get telemetryFinalData() {
  19864. var g;
  19865. return {
  19866. type: "stamp",
  19867. hasAltText: !!((g = this.altTextData) != null && g.altText)
  19868. };
  19869. }
  19870. static computeTelemetryFinalData(g) {
  19871. const C = g.get("hasAltText");
  19872. return {
  19873. hasAltText: C.get(!0) ?? 0,
  19874. hasNoAltText: C.get(!1) ?? 0
  19875. };
  19876. }
  19877. async mlGuessAltText(g = null, C = !0) {
  19878. if (this.hasAltTextData())
  19879. return null;
  19880. const {
  19881. mlManager: i
  19882. } = this._uiManager;
  19883. if (!i)
  19884. throw new Error("No ML.");
  19885. if (!await i.isEnabledFor("altText"))
  19886. throw new Error("ML isn't enabled for alt text.");
  19887. const {
  19888. data: e,
  19889. width: A,
  19890. height: s
  19891. } = g || this.copyCanvas(null, null, !0).imageData, l = await i.guess({
  19892. name: "altText",
  19893. request: {
  19894. data: e,
  19895. width: A,
  19896. height: s,
  19897. channels: e.length / (A * s)
  19898. }
  19899. });
  19900. if (!l)
  19901. throw new Error("No response from the AI service.");
  19902. if (l.error)
  19903. throw new Error("Error from the AI service.");
  19904. if (l.cancel)
  19905. return null;
  19906. if (!l.output)
  19907. throw new Error("No valid response from the AI service.");
  19908. const n = l.output;
  19909. return await this.setGuessedAltText(n), C && !this.hasAltTextData() && (this.altTextData = {
  19910. alt: n,
  19911. decorative: !1
  19912. }), n;
  19913. }
  19914. remove() {
  19915. var g;
  19916. M(this, Jt) && ($(this, kC, null), this._uiManager.imageManager.deleteId(M(this, Jt)), (g = M(this, vl)) == null || g.remove(), $(this, vl, null), M(this, Rs) && (clearTimeout(M(this, Rs)), $(this, Rs, null))), super.remove();
  19917. }
  19918. rebuild() {
  19919. if (!this.parent) {
  19920. M(this, Jt) && ig(this, lC, KN).call(this);
  19921. return;
  19922. }
  19923. super.rebuild(), this.div !== null && (M(this, Jt) && M(this, vl) === null && ig(this, lC, KN).call(this), this.isAttachedToDOM || this.parent.add(this));
  19924. }
  19925. onceAdded(g) {
  19926. this._isDraggable = !0, g && this.div.focus();
  19927. }
  19928. isEmpty() {
  19929. return !(M(this, La) || M(this, kC) || M(this, Ll) || M(this, va) || M(this, Jt) || M(this, id));
  19930. }
  19931. get isResizable() {
  19932. return !0;
  19933. }
  19934. render() {
  19935. if (this.div)
  19936. return this.div;
  19937. let g, C;
  19938. return this._isCopy && (g = this.x, C = this.y), super.render(), this.div.hidden = !0, this.addAltTextButton(), M(this, id) || (M(this, kC) ? ig(this, lC, FN).call(this) : ig(this, lC, KN).call(this)), this._isCopy && this._moveAfterPaste(g, C), this._uiManager.addShouldRescale(this), this.div;
  19939. }
  19940. setCanvas(g, C) {
  19941. const {
  19942. id: i,
  19943. bitmap: e
  19944. } = this._uiManager.imageManager.getFromCanvas(g, C);
  19945. C.remove(), i && this._uiManager.imageManager.isValidId(i) && ($(this, Jt, i), e && $(this, kC, e), $(this, id, !1), ig(this, lC, FN).call(this));
  19946. }
  19947. _onResized() {
  19948. this.onScaleChanging();
  19949. }
  19950. onScaleChanging() {
  19951. if (!this.parent)
  19952. return;
  19953. M(this, Rs) !== null && clearTimeout(M(this, Rs)), $(this, Rs, setTimeout(() => {
  19954. $(this, Rs, null), ig(this, lC, CD).call(this);
  19955. }, 200));
  19956. }
  19957. copyCanvas(g, C, i = !1) {
  19958. var c;
  19959. g || (g = 224);
  19960. const {
  19961. width: e,
  19962. height: A
  19963. } = M(this, kC), s = new In();
  19964. let l = M(this, kC), n = e, a = A, d = null;
  19965. if (C) {
  19966. if (e > C || A > C) {
  19967. const H = Math.min(C / e, C / A);
  19968. n = Math.floor(e * H), a = Math.floor(A * H);
  19969. }
  19970. d = document.createElement("canvas");
  19971. const r = d.width = Math.ceil(n * s.sx), h = d.height = Math.ceil(a * s.sy);
  19972. M(this, We) || (l = ig(this, lC, kN).call(this, r, h));
  19973. const b = d.getContext("2d");
  19974. b.filter = this._uiManager.hcmFilter;
  19975. let u = "white", m = "#cfcfd8";
  19976. this._uiManager.hcmFilter !== "none" ? m = "black" : (c = window.matchMedia) != null && c.call(window, "(prefers-color-scheme: dark)").matches && (u = "#8f8f9d", m = "#42414d");
  19977. const Z = 15, p = Z * s.sx, Y = Z * s.sy, R = new OffscreenCanvas(p * 2, Y * 2), X = R.getContext("2d");
  19978. X.fillStyle = u, X.fillRect(0, 0, p * 2, Y * 2), X.fillStyle = m, X.fillRect(0, 0, p, Y), X.fillRect(p, Y, p, Y), b.fillStyle = b.createPattern(R, "repeat"), b.fillRect(0, 0, r, h), b.drawImage(l, 0, 0, l.width, l.height, 0, 0, r, h);
  19979. }
  19980. let o = null;
  19981. if (i) {
  19982. let r, h;
  19983. if (s.symmetric && l.width < g && l.height < g)
  19984. r = l.width, h = l.height;
  19985. else if (l = M(this, kC), e > g || A > g) {
  19986. const m = Math.min(g / e, g / A);
  19987. r = Math.floor(e * m), h = Math.floor(A * m), M(this, We) || (l = ig(this, lC, kN).call(this, r, h));
  19988. }
  19989. const u = new OffscreenCanvas(r, h).getContext("2d", {
  19990. willReadFrequently: !0
  19991. });
  19992. u.drawImage(l, 0, 0, l.width, l.height, 0, 0, r, h), o = {
  19993. width: r,
  19994. height: h,
  19995. data: u.getImageData(0, 0, r, h).data
  19996. };
  19997. }
  19998. return {
  19999. canvas: d,
  20000. width: n,
  20001. height: a,
  20002. imageData: o
  20003. };
  20004. }
  20005. static async deserialize(g, C, i) {
  20006. var b;
  20007. let e = null, A = !1;
  20008. if (g instanceof Qgg) {
  20009. const {
  20010. data: {
  20011. rect: u,
  20012. rotation: m,
  20013. id: Z,
  20014. structParent: p,
  20015. popupRef: Y
  20016. },
  20017. container: R,
  20018. parent: {
  20019. page: {
  20020. pageNumber: X
  20021. }
  20022. },
  20023. canvas: H
  20024. } = g;
  20025. let S, z;
  20026. H ? (delete g.canvas, {
  20027. id: S,
  20028. bitmap: z
  20029. } = i.imageManager.getFromCanvas(R.id, H), H.remove()) : (A = !0, g._hasNoCanvas = !0);
  20030. const v = ((b = await C._structTree.getAriaAttributes(`${d9}${Z}`)) == null ? void 0 : b.get("aria-label")) || "";
  20031. e = g = {
  20032. annotationType: XI.STAMP,
  20033. bitmapId: S,
  20034. bitmap: z,
  20035. pageIndex: X - 1,
  20036. rect: u.slice(0),
  20037. rotation: m,
  20038. id: Z,
  20039. deleted: !1,
  20040. accessibilityData: {
  20041. decorative: !1,
  20042. altText: v
  20043. },
  20044. isSvg: !1,
  20045. structParent: p,
  20046. popupRef: Y
  20047. };
  20048. }
  20049. const s = await super.deserialize(g, C, i), {
  20050. rect: l,
  20051. bitmap: n,
  20052. bitmapUrl: a,
  20053. bitmapId: d,
  20054. isSvg: o,
  20055. accessibilityData: c
  20056. } = g;
  20057. A ? (i.addMissingCanvas(g.id, s), $(s, id, !0)) : d && i.imageManager.isValidId(d) ? ($(s, Jt, d), n && $(s, kC, n)) : $(s, Ll, a), $(s, We, o);
  20058. const [r, h] = s.pageDimensions;
  20059. return s.width = (l[2] - l[0]) / r, s.height = (l[3] - l[1]) / h, s.annotationElementId = g.id || null, c && (s.altTextData = c), s._initialData = e, $(s, w0, !!e), s;
  20060. }
  20061. serialize(g = !1, C = null) {
  20062. if (this.isEmpty())
  20063. return null;
  20064. if (this.deleted)
  20065. return this.serializeDeleted();
  20066. const i = {
  20067. annotationType: XI.STAMP,
  20068. bitmapId: M(this, Jt),
  20069. pageIndex: this.pageIndex,
  20070. rect: this.getRect(0, 0),
  20071. rotation: this.rotation,
  20072. isSvg: M(this, We),
  20073. structTreeParentId: this._structTreeParentId
  20074. };
  20075. if (g)
  20076. return i.bitmapUrl = ig(this, lC, zN).call(this, !0), i.accessibilityData = this.serializeAltText(!0), i.isCopy = !0, i;
  20077. const {
  20078. decorative: e,
  20079. altText: A
  20080. } = this.serializeAltText(!1);
  20081. if (!e && A && (i.accessibilityData = {
  20082. type: "Figure",
  20083. alt: A
  20084. }), this.annotationElementId) {
  20085. const l = ig(this, lC, fIg).call(this, i);
  20086. if (l.isSame)
  20087. return null;
  20088. l.isSameAltText ? delete i.accessibilityData : i.accessibilityData.structParent = this._initialData.structParent ?? -1;
  20089. }
  20090. if (i.id = this.annotationElementId, C === null)
  20091. return i;
  20092. C.stamps || (C.stamps = /* @__PURE__ */ new Map());
  20093. const s = M(this, We) ? (i.rect[2] - i.rect[0]) * (i.rect[3] - i.rect[1]) : null;
  20094. if (!C.stamps.has(M(this, Jt)))
  20095. C.stamps.set(M(this, Jt), {
  20096. area: s,
  20097. serialized: i
  20098. }), i.bitmap = ig(this, lC, zN).call(this, !1);
  20099. else if (M(this, We)) {
  20100. const l = C.stamps.get(M(this, Jt));
  20101. s > l.area && (l.area = s, l.serialized.bitmap.close(), l.serialized.bitmap = ig(this, lC, zN).call(this, !1));
  20102. }
  20103. return i;
  20104. }
  20105. renderAnnotationElement(g) {
  20106. return g.updateEdited({
  20107. rect: this.getRect(0, 0)
  20108. }), null;
  20109. }
  20110. }
  20111. kC = new WeakMap(), Jt = new WeakMap(), La = new WeakMap(), Ll = new WeakMap(), va = new WeakMap(), G0 = new WeakMap(), vl = new WeakMap(), id = new WeakMap(), Rs = new WeakMap(), We = new WeakMap(), w0 = new WeakMap(), lC = new WeakSet(), tm = function(g, C = !1) {
  20112. if (!g) {
  20113. this.remove();
  20114. return;
  20115. }
  20116. $(this, kC, g.bitmap), C || ($(this, Jt, g.id), $(this, We, g.isSvg)), g.file && $(this, G0, g.file.name), ig(this, lC, FN).call(this);
  20117. }, im = function() {
  20118. if ($(this, La, null), this._uiManager.enableWaiting(!1), !!M(this, vl)) {
  20119. if (this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && M(this, kC)) {
  20120. this._editToolbar.hide(), this._uiManager.editAltText(this, !0);
  20121. return;
  20122. }
  20123. if (!this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && M(this, kC)) {
  20124. this._reportTelemetry({
  20125. action: "pdfjs.image.image_added",
  20126. data: {
  20127. alt_text_modal: !1,
  20128. alt_text_type: "empty"
  20129. }
  20130. });
  20131. try {
  20132. this.mlGuessAltText();
  20133. } catch {
  20134. }
  20135. }
  20136. this.div.focus();
  20137. }
  20138. }, KN = function() {
  20139. if (M(this, Jt)) {
  20140. this._uiManager.enableWaiting(!0), this._uiManager.imageManager.getFromId(M(this, Jt)).then((i) => ig(this, lC, tm).call(this, i, !0)).finally(() => ig(this, lC, im).call(this));
  20141. return;
  20142. }
  20143. if (M(this, Ll)) {
  20144. const i = M(this, Ll);
  20145. $(this, Ll, null), this._uiManager.enableWaiting(!0), $(this, La, this._uiManager.imageManager.getFromUrl(i).then((e) => ig(this, lC, tm).call(this, e)).finally(() => ig(this, lC, im).call(this)));
  20146. return;
  20147. }
  20148. if (M(this, va)) {
  20149. const i = M(this, va);
  20150. $(this, va, null), this._uiManager.enableWaiting(!0), $(this, La, this._uiManager.imageManager.getFromFile(i).then((e) => ig(this, lC, tm).call(this, e)).finally(() => ig(this, lC, im).call(this)));
  20151. return;
  20152. }
  20153. const g = document.createElement("input");
  20154. g.type = "file", g.accept = UX.join(",");
  20155. const C = this._uiManager._signal;
  20156. $(this, La, new Promise((i) => {
  20157. g.addEventListener("change", async () => {
  20158. if (!g.files || g.files.length === 0)
  20159. this.remove();
  20160. else {
  20161. this._uiManager.enableWaiting(!0);
  20162. const e = await this._uiManager.imageManager.getFromFile(g.files[0]);
  20163. this._reportTelemetry({
  20164. action: "pdfjs.image.image_selected",
  20165. data: {
  20166. alt_text_modal: this._uiManager.useNewAltTextFlow
  20167. }
  20168. }), ig(this, lC, tm).call(this, e);
  20169. }
  20170. i();
  20171. }, {
  20172. signal: C
  20173. }), g.addEventListener("cancel", () => {
  20174. this.remove(), i();
  20175. }, {
  20176. signal: C
  20177. });
  20178. }).finally(() => ig(this, lC, im).call(this))), g.click();
  20179. }, FN = function() {
  20180. var d;
  20181. const {
  20182. div: g
  20183. } = this;
  20184. let {
  20185. width: C,
  20186. height: i
  20187. } = M(this, kC);
  20188. const [e, A] = this.pageDimensions, s = 0.75;
  20189. if (this.width)
  20190. C = this.width * e, i = this.height * A;
  20191. else if (C > s * e || i > s * A) {
  20192. const o = Math.min(s * e / C, s * A / i);
  20193. C *= o, i *= o;
  20194. }
  20195. const [l, n] = this.parentDimensions;
  20196. this.setDims(C * l / e, i * n / A), this._uiManager.enableWaiting(!1);
  20197. const a = $(this, vl, document.createElement("canvas"));
  20198. a.setAttribute("role", "img"), this.addContainer(a), this.width = C / e, this.height = i / A, (d = this._initialOptions) != null && d.isCentered ? this.center() : this.fixAndSetPosition(), this._initialOptions = null, (!this._uiManager.useNewAltTextWhenAddingImage || !this._uiManager.useNewAltTextFlow || this.annotationElementId) && (g.hidden = !1), ig(this, lC, CD).call(this), M(this, w0) || (this.parent.addUndoableEditor(this), $(this, w0, !0)), this._reportTelemetry({
  20199. action: "inserted_image"
  20200. }), M(this, G0) && this.div.setAttribute("aria-description", M(this, G0));
  20201. }, kN = function(g, C) {
  20202. const {
  20203. width: i,
  20204. height: e
  20205. } = M(this, kC);
  20206. let A = i, s = e, l = M(this, kC);
  20207. for (; A > 2 * g || s > 2 * C; ) {
  20208. const n = A, a = s;
  20209. A > 2 * g && (A = A >= 16384 ? Math.floor(A / 2) - 1 : Math.ceil(A / 2)), s > 2 * C && (s = s >= 16384 ? Math.floor(s / 2) - 1 : Math.ceil(s / 2));
  20210. const d = new OffscreenCanvas(A, s);
  20211. d.getContext("2d").drawImage(l, 0, 0, n, a, 0, 0, A, s), l = d.transferToImageBitmap();
  20212. }
  20213. return l;
  20214. }, CD = function() {
  20215. const [g, C] = this.parentDimensions, {
  20216. width: i,
  20217. height: e
  20218. } = this, A = new In(), s = Math.ceil(i * g * A.sx), l = Math.ceil(e * C * A.sy), n = M(this, vl);
  20219. if (!n || n.width === s && n.height === l)
  20220. return;
  20221. n.width = s, n.height = l;
  20222. const a = M(this, We) ? M(this, kC) : ig(this, lC, kN).call(this, s, l), d = n.getContext("2d");
  20223. d.filter = this._uiManager.hcmFilter, d.drawImage(a, 0, 0, a.width, a.height, 0, 0, s, l);
  20224. }, zN = function(g) {
  20225. if (g) {
  20226. if (M(this, We)) {
  20227. const e = this._uiManager.imageManager.getSvgUrl(M(this, Jt));
  20228. if (e)
  20229. return e;
  20230. }
  20231. const C = document.createElement("canvas");
  20232. return {
  20233. width: C.width,
  20234. height: C.height
  20235. } = M(this, kC), C.getContext("2d").drawImage(M(this, kC), 0, 0), C.toDataURL();
  20236. }
  20237. if (M(this, We)) {
  20238. const [C, i] = this.pageDimensions, e = Math.round(this.width * C * Pa.PDF_TO_CSS_UNITS), A = Math.round(this.height * i * Pa.PDF_TO_CSS_UNITS), s = new OffscreenCanvas(e, A);
  20239. return s.getContext("2d").drawImage(M(this, kC), 0, 0, M(this, kC).width, M(this, kC).height, 0, 0, e, A), s.transferToImageBitmap();
  20240. }
  20241. return structuredClone(M(this, kC));
  20242. }, fIg = function(g) {
  20243. var s;
  20244. const {
  20245. pageIndex: C,
  20246. accessibilityData: {
  20247. altText: i
  20248. }
  20249. } = this._initialData, e = g.pageIndex === C, A = (((s = g.accessibilityData) == null ? void 0 : s.alt) || "") === i;
  20250. return {
  20251. isSame: !this._hasBeenMoved && !this._hasBeenResized && e && A,
  20252. isSameAltText: A
  20253. };
  20254. }, iI(ID, "_type", "stamp"), iI(ID, "_editorType", XI.STAMP);
  20255. var ed, p0, fs, Ta, Tl, qe, xa, B0, Ad, HA, xl, Gi, jl, sI, ja, vC, HIg, ds, iD, eD, JN;
  20256. const wA = class wA {
  20257. constructor({
  20258. uiManager: I,
  20259. pageIndex: g,
  20260. div: C,
  20261. structTreeLayer: i,
  20262. accessibilityManager: e,
  20263. annotationLayer: A,
  20264. drawLayer: s,
  20265. textLayer: l,
  20266. viewport: n,
  20267. l10n: a
  20268. }) {
  20269. tg(this, vC);
  20270. tg(this, ed);
  20271. tg(this, p0, !1);
  20272. tg(this, fs, null);
  20273. tg(this, Ta, null);
  20274. tg(this, Tl, null);
  20275. tg(this, qe, /* @__PURE__ */ new Map());
  20276. tg(this, xa, !1);
  20277. tg(this, B0, !1);
  20278. tg(this, Ad, !1);
  20279. tg(this, HA, null);
  20280. tg(this, xl, null);
  20281. tg(this, Gi, null);
  20282. tg(this, jl, null);
  20283. tg(this, sI);
  20284. const d = [...M(wA, ja).values()];
  20285. if (!wA._initialized) {
  20286. wA._initialized = !0;
  20287. for (const o of d)
  20288. o.initialize(a, I);
  20289. }
  20290. I.registerEditorTypes(d), $(this, sI, I), this.pageIndex = g, this.div = C, $(this, ed, e), $(this, fs, A), this.viewport = n, $(this, Gi, l), this.drawLayer = s, this._structTree = i, M(this, sI).addLayer(this);
  20291. }
  20292. get isEmpty() {
  20293. return M(this, qe).size === 0;
  20294. }
  20295. get isInvisible() {
  20296. return this.isEmpty && M(this, sI).getMode() === XI.NONE;
  20297. }
  20298. updateToolbar(I) {
  20299. M(this, sI).updateToolbar(I);
  20300. }
  20301. updateMode(I = M(this, sI).getMode()) {
  20302. switch (ig(this, vC, JN).call(this), I) {
  20303. case XI.NONE:
  20304. this.disableTextSelection(), this.togglePointerEvents(!1), this.toggleAnnotationLayerPointerEvents(!0), this.disableClick();
  20305. return;
  20306. case XI.INK:
  20307. this.disableTextSelection(), this.togglePointerEvents(!0), this.enableClick();
  20308. break;
  20309. case XI.HIGHLIGHT:
  20310. this.enableTextSelection(), this.togglePointerEvents(!1), this.disableClick();
  20311. break;
  20312. default:
  20313. this.disableTextSelection(), this.togglePointerEvents(!0), this.enableClick();
  20314. }
  20315. this.toggleAnnotationLayerPointerEvents(!1);
  20316. const {
  20317. classList: g
  20318. } = this.div;
  20319. for (const C of M(wA, ja).values())
  20320. g.toggle(`${C._type}Editing`, I === C._editorType);
  20321. this.div.hidden = !1;
  20322. }
  20323. hasTextLayer(I) {
  20324. var g;
  20325. return I === ((g = M(this, Gi)) == null ? void 0 : g.div);
  20326. }
  20327. setEditingState(I) {
  20328. M(this, sI).setEditingState(I);
  20329. }
  20330. addCommands(I) {
  20331. M(this, sI).addCommands(I);
  20332. }
  20333. cleanUndoStack(I) {
  20334. M(this, sI).cleanUndoStack(I);
  20335. }
  20336. toggleDrawing(I = !1) {
  20337. this.div.classList.toggle("drawing", !I);
  20338. }
  20339. togglePointerEvents(I = !1) {
  20340. this.div.classList.toggle("disabled", !I);
  20341. }
  20342. toggleAnnotationLayerPointerEvents(I = !1) {
  20343. var g;
  20344. (g = M(this, fs)) == null || g.div.classList.toggle("disabled", !I);
  20345. }
  20346. async enable() {
  20347. $(this, Ad, !0), this.div.tabIndex = 0, this.togglePointerEvents(!0);
  20348. const I = /* @__PURE__ */ new Set();
  20349. for (const C of M(this, qe).values())
  20350. C.enableEditing(), C.show(!0), C.annotationElementId && (M(this, sI).removeChangedExistingAnnotation(C), I.add(C.annotationElementId));
  20351. if (!M(this, fs)) {
  20352. $(this, Ad, !1);
  20353. return;
  20354. }
  20355. const g = M(this, fs).getEditableAnnotations();
  20356. for (const C of g) {
  20357. if (C.hide(), M(this, sI).isDeletedAnnotationElement(C.data.id) || I.has(C.data.id))
  20358. continue;
  20359. const i = await this.deserialize(C);
  20360. i && (this.addOrRebuild(i), i.enableEditing());
  20361. }
  20362. $(this, Ad, !1);
  20363. }
  20364. disable() {
  20365. var i;
  20366. $(this, B0, !0), this.div.tabIndex = -1, this.togglePointerEvents(!1);
  20367. const I = /* @__PURE__ */ new Map(), g = /* @__PURE__ */ new Map();
  20368. for (const e of M(this, qe).values())
  20369. if (e.disableEditing(), !!e.annotationElementId) {
  20370. if (e.serialize() !== null) {
  20371. I.set(e.annotationElementId, e);
  20372. continue;
  20373. } else
  20374. g.set(e.annotationElementId, e);
  20375. (i = this.getEditableAnnotation(e.annotationElementId)) == null || i.show(), e.remove();
  20376. }
  20377. if (M(this, fs)) {
  20378. const e = M(this, fs).getEditableAnnotations();
  20379. for (const A of e) {
  20380. const {
  20381. id: s
  20382. } = A.data;
  20383. if (M(this, sI).isDeletedAnnotationElement(s))
  20384. continue;
  20385. let l = g.get(s);
  20386. if (l) {
  20387. l.resetAnnotationElement(A), l.show(!1), A.show();
  20388. continue;
  20389. }
  20390. l = I.get(s), l && (M(this, sI).addChangedExistingAnnotation(l), l.renderAnnotationElement(A) && l.show(!1)), A.show();
  20391. }
  20392. }
  20393. ig(this, vC, JN).call(this), this.isEmpty && (this.div.hidden = !0);
  20394. const {
  20395. classList: C
  20396. } = this.div;
  20397. for (const e of M(wA, ja).values())
  20398. C.remove(`${e._type}Editing`);
  20399. this.disableTextSelection(), this.toggleAnnotationLayerPointerEvents(!0), $(this, B0, !1);
  20400. }
  20401. getEditableAnnotation(I) {
  20402. var g;
  20403. return ((g = M(this, fs)) == null ? void 0 : g.getEditableAnnotation(I)) || null;
  20404. }
  20405. setActiveEditor(I) {
  20406. M(this, sI).getActive() !== I && M(this, sI).setActiveEditor(I);
  20407. }
  20408. enableTextSelection() {
  20409. var I;
  20410. if (this.div.tabIndex = -1, (I = M(this, Gi)) != null && I.div && !M(this, jl)) {
  20411. $(this, jl, new AbortController());
  20412. const g = M(this, sI).combinedSignal(M(this, jl));
  20413. M(this, Gi).div.addEventListener("pointerdown", ig(this, vC, HIg).bind(this), {
  20414. signal: g
  20415. }), M(this, Gi).div.classList.add("highlighting");
  20416. }
  20417. }
  20418. disableTextSelection() {
  20419. var I;
  20420. this.div.tabIndex = 0, (I = M(this, Gi)) != null && I.div && M(this, jl) && (M(this, jl).abort(), $(this, jl, null), M(this, Gi).div.classList.remove("highlighting"));
  20421. }
  20422. enableClick() {
  20423. if (M(this, Ta))
  20424. return;
  20425. $(this, Ta, new AbortController());
  20426. const I = M(this, sI).combinedSignal(M(this, Ta));
  20427. this.div.addEventListener("pointerdown", this.pointerdown.bind(this), {
  20428. signal: I
  20429. });
  20430. const g = this.pointerup.bind(this);
  20431. this.div.addEventListener("pointerup", g, {
  20432. signal: I
  20433. }), this.div.addEventListener("pointercancel", g, {
  20434. signal: I
  20435. });
  20436. }
  20437. disableClick() {
  20438. var I;
  20439. (I = M(this, Ta)) == null || I.abort(), $(this, Ta, null);
  20440. }
  20441. attach(I) {
  20442. M(this, qe).set(I.id, I);
  20443. const {
  20444. annotationElementId: g
  20445. } = I;
  20446. g && M(this, sI).isDeletedAnnotationElement(g) && M(this, sI).removeDeletedAnnotationElement(I);
  20447. }
  20448. detach(I) {
  20449. var g;
  20450. M(this, qe).delete(I.id), (g = M(this, ed)) == null || g.removePointerInTextLayer(I.contentDiv), !M(this, B0) && I.annotationElementId && M(this, sI).addDeletedAnnotationElement(I);
  20451. }
  20452. remove(I) {
  20453. this.detach(I), M(this, sI).removeEditor(I), I.div.remove(), I.isAttachedToDOM = !1;
  20454. }
  20455. changeParent(I) {
  20456. var g;
  20457. I.parent !== this && (I.parent && I.annotationElementId && (M(this, sI).addDeletedAnnotationElement(I.annotationElementId), TC.deleteAnnotationElement(I), I.annotationElementId = null), this.attach(I), (g = I.parent) == null || g.detach(I), I.setParent(this), I.div && I.isAttachedToDOM && (I.div.remove(), this.div.append(I.div)));
  20458. }
  20459. add(I) {
  20460. if (!(I.parent === this && I.isAttachedToDOM)) {
  20461. if (this.changeParent(I), M(this, sI).addEditor(I), this.attach(I), !I.isAttachedToDOM) {
  20462. const g = I.render();
  20463. this.div.append(g), I.isAttachedToDOM = !0;
  20464. }
  20465. I.fixAndSetPosition(), I.onceAdded(!M(this, Ad)), M(this, sI).addToAnnotationStorage(I), I._reportTelemetry(I.telemetryInitialData);
  20466. }
  20467. }
  20468. moveEditorInDOM(I) {
  20469. var C;
  20470. if (!I.isAttachedToDOM)
  20471. return;
  20472. const {
  20473. activeElement: g
  20474. } = document;
  20475. I.div.contains(g) && !M(this, Tl) && (I._focusEventsAllowed = !1, $(this, Tl, setTimeout(() => {
  20476. $(this, Tl, null), I.div.contains(document.activeElement) ? I._focusEventsAllowed = !0 : (I.div.addEventListener("focusin", () => {
  20477. I._focusEventsAllowed = !0;
  20478. }, {
  20479. once: !0,
  20480. signal: M(this, sI)._signal
  20481. }), g.focus());
  20482. }, 0))), I._structTreeParentId = (C = M(this, ed)) == null ? void 0 : C.moveElementInDOM(this.div, I.div, I.contentDiv, !0);
  20483. }
  20484. addOrRebuild(I) {
  20485. I.needsToBeRebuilt() ? (I.parent || (I.parent = this), I.rebuild(), I.show()) : this.add(I);
  20486. }
  20487. addUndoableEditor(I) {
  20488. const g = () => I._uiManager.rebuild(I), C = () => {
  20489. I.remove();
  20490. };
  20491. this.addCommands({
  20492. cmd: g,
  20493. undo: C,
  20494. mustExec: !1
  20495. });
  20496. }
  20497. getNextId() {
  20498. return M(this, sI).getId();
  20499. }
  20500. combinedSignal(I) {
  20501. return M(this, sI).combinedSignal(I);
  20502. }
  20503. canCreateNewEmptyEditor() {
  20504. var I;
  20505. return (I = M(this, vC, ds)) == null ? void 0 : I.canCreateNewEmptyEditor();
  20506. }
  20507. async pasteEditor(I, g) {
  20508. M(this, sI).updateToolbar(I), await M(this, sI).updateMode(I);
  20509. const {
  20510. offsetX: C,
  20511. offsetY: i
  20512. } = ig(this, vC, eD).call(this), e = this.getNextId(), A = ig(this, vC, iD).call(this, {
  20513. parent: this,
  20514. id: e,
  20515. x: C,
  20516. y: i,
  20517. uiManager: M(this, sI),
  20518. isCentered: !0,
  20519. ...g
  20520. });
  20521. A && this.add(A);
  20522. }
  20523. async deserialize(I) {
  20524. var g;
  20525. return await ((g = M(wA, ja).get(I.annotationType ?? I.annotationEditorType)) == null ? void 0 : g.deserialize(I, this, M(this, sI))) || null;
  20526. }
  20527. createAndAddNewEditor(I, g, C = {}) {
  20528. const i = this.getNextId(), e = ig(this, vC, iD).call(this, {
  20529. parent: this,
  20530. id: i,
  20531. x: I.offsetX,
  20532. y: I.offsetY,
  20533. uiManager: M(this, sI),
  20534. isCentered: g,
  20535. ...C
  20536. });
  20537. return e && this.add(e), e;
  20538. }
  20539. addNewEditor(I = {}) {
  20540. this.createAndAddNewEditor(ig(this, vC, eD).call(this), !0, I);
  20541. }
  20542. setSelected(I) {
  20543. M(this, sI).setSelected(I);
  20544. }
  20545. toggleSelected(I) {
  20546. M(this, sI).toggleSelected(I);
  20547. }
  20548. unselect(I) {
  20549. M(this, sI).unselect(I);
  20550. }
  20551. pointerup(I) {
  20552. var i;
  20553. const {
  20554. isMac: g
  20555. } = Ai.platform;
  20556. if (I.button !== 0 || I.ctrlKey && g || I.target !== this.div || !M(this, xa) || ($(this, xa, !1), (i = M(this, vC, ds)) != null && i.isDrawer && M(this, vC, ds).supportMultipleDrawings))
  20557. return;
  20558. if (!M(this, p0)) {
  20559. $(this, p0, !0);
  20560. return;
  20561. }
  20562. const C = M(this, sI).getMode();
  20563. if (C === XI.STAMP || C === XI.SIGNATURE) {
  20564. M(this, sI).unselectAll();
  20565. return;
  20566. }
  20567. this.createAndAddNewEditor(I, !1);
  20568. }
  20569. pointerdown(I) {
  20570. var i;
  20571. if (M(this, sI).getMode() === XI.HIGHLIGHT && this.enableTextSelection(), M(this, xa)) {
  20572. $(this, xa, !1);
  20573. return;
  20574. }
  20575. const {
  20576. isMac: g
  20577. } = Ai.platform;
  20578. if (I.button !== 0 || I.ctrlKey && g || I.target !== this.div)
  20579. return;
  20580. if ($(this, xa, !0), (i = M(this, vC, ds)) != null && i.isDrawer) {
  20581. this.startDrawingSession(I);
  20582. return;
  20583. }
  20584. const C = M(this, sI).getActive();
  20585. $(this, p0, !C || C.isEmpty());
  20586. }
  20587. startDrawingSession(I) {
  20588. if (this.div.focus({
  20589. preventScroll: !0
  20590. }), M(this, HA)) {
  20591. M(this, vC, ds).startDrawing(this, M(this, sI), !1, I);
  20592. return;
  20593. }
  20594. M(this, sI).setCurrentDrawingSession(this), $(this, HA, new AbortController());
  20595. const g = M(this, sI).combinedSignal(M(this, HA));
  20596. this.div.addEventListener("blur", ({
  20597. relatedTarget: C
  20598. }) => {
  20599. C && !this.div.contains(C) && ($(this, xl, null), this.commitOrRemove());
  20600. }, {
  20601. signal: g
  20602. }), M(this, vC, ds).startDrawing(this, M(this, sI), !1, I);
  20603. }
  20604. pause(I) {
  20605. if (I) {
  20606. const {
  20607. activeElement: g
  20608. } = document;
  20609. this.div.contains(g) && $(this, xl, g);
  20610. return;
  20611. }
  20612. M(this, xl) && setTimeout(() => {
  20613. var g;
  20614. (g = M(this, xl)) == null || g.focus(), $(this, xl, null);
  20615. }, 0);
  20616. }
  20617. endDrawingSession(I = !1) {
  20618. return M(this, HA) ? (M(this, sI).setCurrentDrawingSession(null), M(this, HA).abort(), $(this, HA, null), $(this, xl, null), M(this, vC, ds).endDrawing(I)) : null;
  20619. }
  20620. findNewParent(I, g, C) {
  20621. const i = M(this, sI).findParent(g, C);
  20622. return i === null || i === this ? !1 : (i.changeParent(I), !0);
  20623. }
  20624. commitOrRemove() {
  20625. return M(this, HA) ? (this.endDrawingSession(), !0) : !1;
  20626. }
  20627. onScaleChanging() {
  20628. M(this, HA) && M(this, vC, ds).onScaleChangingWhenDrawing(this);
  20629. }
  20630. destroy() {
  20631. var I, g;
  20632. this.commitOrRemove(), ((I = M(this, sI).getActive()) == null ? void 0 : I.parent) === this && (M(this, sI).commitOrRemove(), M(this, sI).setActiveEditor(null)), M(this, Tl) && (clearTimeout(M(this, Tl)), $(this, Tl, null));
  20633. for (const C of M(this, qe).values())
  20634. (g = M(this, ed)) == null || g.removePointerInTextLayer(C.contentDiv), C.setParent(null), C.isAttachedToDOM = !1, C.div.remove();
  20635. this.div = null, M(this, qe).clear(), M(this, sI).removeLayer(this);
  20636. }
  20637. render({
  20638. viewport: I
  20639. }) {
  20640. this.viewport = I, cd(this.div, I);
  20641. for (const g of M(this, sI).getEditors(this.pageIndex))
  20642. this.add(g), g.rebuild();
  20643. this.updateMode();
  20644. }
  20645. update({
  20646. viewport: I
  20647. }) {
  20648. M(this, sI).commitOrRemove(), ig(this, vC, JN).call(this);
  20649. const g = this.viewport.rotation, C = I.rotation;
  20650. if (this.viewport = I, cd(this.div, {
  20651. rotation: C
  20652. }), g !== C)
  20653. for (const i of M(this, qe).values())
  20654. i.rotate(C);
  20655. }
  20656. get pageDimensions() {
  20657. const {
  20658. pageWidth: I,
  20659. pageHeight: g
  20660. } = this.viewport.rawDims;
  20661. return [I, g];
  20662. }
  20663. get scale() {
  20664. return M(this, sI).viewParameters.realScale;
  20665. }
  20666. };
  20667. ed = new WeakMap(), p0 = new WeakMap(), fs = new WeakMap(), Ta = new WeakMap(), Tl = new WeakMap(), qe = new WeakMap(), xa = new WeakMap(), B0 = new WeakMap(), Ad = new WeakMap(), HA = new WeakMap(), xl = new WeakMap(), Gi = new WeakMap(), jl = new WeakMap(), sI = new WeakMap(), ja = new WeakMap(), vC = new WeakSet(), HIg = function(I) {
  20668. M(this, sI).unselectAll();
  20669. const {
  20670. target: g
  20671. } = I;
  20672. if (g === M(this, Gi).div || (g.getAttribute("role") === "img" || g.classList.contains("endOfContent")) && M(this, Gi).div.contains(g)) {
  20673. const {
  20674. isMac: C
  20675. } = Ai.platform;
  20676. if (I.button !== 0 || I.ctrlKey && C)
  20677. return;
  20678. M(this, sI).showAllEditors("highlight", !0, !0), M(this, Gi).div.classList.add("free"), this.toggleDrawing(), lV.startHighlighting(this, M(this, sI).direction === "ltr", {
  20679. target: M(this, Gi).div,
  20680. x: I.x,
  20681. y: I.y
  20682. }), M(this, Gi).div.addEventListener("pointerup", () => {
  20683. M(this, Gi).div.classList.remove("free"), this.toggleDrawing(!0);
  20684. }, {
  20685. once: !0,
  20686. signal: M(this, sI)._signal
  20687. }), I.preventDefault();
  20688. }
  20689. }, ds = function() {
  20690. return M(wA, ja).get(M(this, sI).getMode());
  20691. }, iD = function(I) {
  20692. const g = M(this, vC, ds);
  20693. return g ? new g.prototype.constructor(I) : null;
  20694. }, eD = function() {
  20695. const {
  20696. x: I,
  20697. y: g,
  20698. width: C,
  20699. height: i
  20700. } = this.div.getBoundingClientRect(), e = Math.max(0, I), A = Math.max(0, g), s = Math.min(window.innerWidth, I + C), l = Math.min(window.innerHeight, g + i), n = (e + s) / 2 - I, a = (A + l) / 2 - g, [d, o] = this.viewport.rotation % 180 === 0 ? [n, a] : [a, n];
  20701. return {
  20702. offsetX: d,
  20703. offsetY: o
  20704. };
  20705. }, JN = function() {
  20706. for (const I of M(this, qe).values())
  20707. I.isEmpty() && I.remove();
  20708. }, iI(wA, "_initialized", !1), tg(wA, ja, new Map([DS, US, ID, lV, gD].map((I) => [I._editorType, I])));
  20709. let tD = wA;
  20710. var XA, Ri, sd, CG, EV, XIg, zs, sD, SIg, lD;
  20711. const pt = class pt {
  20712. constructor({
  20713. pageIndex: I
  20714. }) {
  20715. tg(this, zs);
  20716. tg(this, XA, null);
  20717. tg(this, Ri, /* @__PURE__ */ new Map());
  20718. tg(this, sd, /* @__PURE__ */ new Map());
  20719. this.pageIndex = I;
  20720. }
  20721. setParent(I) {
  20722. if (!M(this, XA)) {
  20723. $(this, XA, I);
  20724. return;
  20725. }
  20726. if (M(this, XA) !== I) {
  20727. if (M(this, Ri).size > 0)
  20728. for (const g of M(this, Ri).values())
  20729. g.remove(), I.append(g);
  20730. $(this, XA, I);
  20731. }
  20732. }
  20733. static get _svgFactory() {
  20734. return UI(this, "_svgFactory", new eV());
  20735. }
  20736. draw(I, g = !1, C = !1) {
  20737. const i = Wi(pt, CG)._++, e = ig(this, zs, sD).call(this), A = pt._svgFactory.createElement("defs");
  20738. e.append(A);
  20739. const s = pt._svgFactory.createElement("path");
  20740. A.append(s);
  20741. const l = `path_p${this.pageIndex}_${i}`;
  20742. s.setAttribute("id", l), s.setAttribute("vector-effect", "non-scaling-stroke"), g && M(this, sd).set(i, s);
  20743. const n = C ? ig(this, zs, SIg).call(this, A, l) : null, a = pt._svgFactory.createElement("use");
  20744. return e.append(a), a.setAttribute("href", `#${l}`), this.updateProperties(e, I), M(this, Ri).set(i, e), {
  20745. id: i,
  20746. clipPathId: `url(#${n})`
  20747. };
  20748. }
  20749. drawOutline(I, g) {
  20750. const C = Wi(pt, CG)._++, i = ig(this, zs, sD).call(this), e = pt._svgFactory.createElement("defs");
  20751. i.append(e);
  20752. const A = pt._svgFactory.createElement("path");
  20753. e.append(A);
  20754. const s = `path_p${this.pageIndex}_${C}`;
  20755. A.setAttribute("id", s), A.setAttribute("vector-effect", "non-scaling-stroke");
  20756. let l;
  20757. if (g) {
  20758. const d = pt._svgFactory.createElement("mask");
  20759. e.append(d), l = `mask_p${this.pageIndex}_${C}`, d.setAttribute("id", l), d.setAttribute("maskUnits", "objectBoundingBox");
  20760. const o = pt._svgFactory.createElement("rect");
  20761. d.append(o), o.setAttribute("width", "1"), o.setAttribute("height", "1"), o.setAttribute("fill", "white");
  20762. const c = pt._svgFactory.createElement("use");
  20763. d.append(c), c.setAttribute("href", `#${s}`), c.setAttribute("stroke", "none"), c.setAttribute("fill", "black"), c.setAttribute("fill-rule", "nonzero"), c.classList.add("mask");
  20764. }
  20765. const n = pt._svgFactory.createElement("use");
  20766. i.append(n), n.setAttribute("href", `#${s}`), l && n.setAttribute("mask", `url(#${l})`);
  20767. const a = n.cloneNode();
  20768. return i.append(a), n.classList.add("mainOutline"), a.classList.add("secondaryOutline"), this.updateProperties(i, I), M(this, Ri).set(C, i), C;
  20769. }
  20770. finalizeDraw(I, g) {
  20771. M(this, sd).delete(I), this.updateProperties(I, g);
  20772. }
  20773. updateProperties(I, g) {
  20774. var l;
  20775. if (!g)
  20776. return;
  20777. const {
  20778. root: C,
  20779. bbox: i,
  20780. rootClass: e,
  20781. path: A
  20782. } = g, s = typeof I == "number" ? M(this, Ri).get(I) : I;
  20783. if (s) {
  20784. if (C && ig(this, zs, lD).call(this, s, C), i && ig(l = pt, EV, XIg).call(l, s, i), e) {
  20785. const {
  20786. classList: n
  20787. } = s;
  20788. for (const [a, d] of Object.entries(e))
  20789. n.toggle(a, d);
  20790. }
  20791. if (A) {
  20792. const a = s.firstChild.firstChild;
  20793. ig(this, zs, lD).call(this, a, A);
  20794. }
  20795. }
  20796. }
  20797. updateParent(I, g) {
  20798. if (g === this)
  20799. return;
  20800. const C = M(this, Ri).get(I);
  20801. C && (M(g, XA).append(C), M(this, Ri).delete(I), M(g, Ri).set(I, C));
  20802. }
  20803. remove(I) {
  20804. M(this, sd).delete(I), M(this, XA) !== null && (M(this, Ri).get(I).remove(), M(this, Ri).delete(I));
  20805. }
  20806. destroy() {
  20807. $(this, XA, null);
  20808. for (const I of M(this, Ri).values())
  20809. I.remove();
  20810. M(this, Ri).clear(), M(this, sd).clear();
  20811. }
  20812. };
  20813. XA = new WeakMap(), Ri = new WeakMap(), sd = new WeakMap(), CG = new WeakMap(), EV = new WeakSet(), XIg = function(I, [g, C, i, e]) {
  20814. const {
  20815. style: A
  20816. } = I;
  20817. A.top = `${100 * C}%`, A.left = `${100 * g}%`, A.width = `${100 * i}%`, A.height = `${100 * e}%`;
  20818. }, zs = new WeakSet(), sD = function() {
  20819. const I = pt._svgFactory.create(1, 1, !0);
  20820. return M(this, XA).append(I), I.setAttribute("aria-hidden", !0), I;
  20821. }, SIg = function(I, g) {
  20822. const C = pt._svgFactory.createElement("clipPath");
  20823. I.append(C);
  20824. const i = `clip_${g}`;
  20825. C.setAttribute("id", i), C.setAttribute("clipPathUnits", "objectBoundingBox");
  20826. const e = pt._svgFactory.createElement("use");
  20827. return C.append(e), e.setAttribute("href", `#${g}`), e.classList.add("clip"), i;
  20828. }, lD = function(I, g) {
  20829. for (const [C, i] of Object.entries(g))
  20830. i === null ? I.removeAttribute(C) : I.setAttribute(C, i);
  20831. }, tg(pt, EV), tg(pt, CG, 0);
  20832. let AD = pt;
  20833. globalThis.pdfjsTestingUtils = {
  20834. HighlightOutliner: FS
  20835. };
  20836. pI.AbortException;
  20837. pI.AnnotationEditorLayer;
  20838. pI.AnnotationEditorParamsType;
  20839. pI.AnnotationEditorType;
  20840. pI.AnnotationEditorUIManager;
  20841. pI.AnnotationLayer;
  20842. pI.AnnotationMode;
  20843. pI.AnnotationType;
  20844. pI.ColorPicker;
  20845. pI.DOMSVGFactory;
  20846. pI.DrawLayer;
  20847. pI.FeatureTest;
  20848. var Rdg = pI.GlobalWorkerOptions;
  20849. pI.ImageKind;
  20850. pI.InvalidPDFException;
  20851. pI.MathClamp;
  20852. pI.OPS;
  20853. pI.OutputScale;
  20854. pI.PDFDataRangeTransport;
  20855. pI.PDFDateString;
  20856. pI.PDFWorker;
  20857. pI.PasswordResponses;
  20858. pI.PermissionFlag;
  20859. pI.PixelsPerInch;
  20860. pI.RenderingCancelledException;
  20861. pI.ResponseException;
  20862. pI.SignatureExtractor;
  20863. pI.SupportedImageMimeTypes;
  20864. pI.TextLayer;
  20865. pI.TouchManager;
  20866. pI.Util;
  20867. pI.VerbosityLevel;
  20868. pI.XfaLayer;
  20869. pI.build;
  20870. pI.createValidAbsoluteUrl;
  20871. pI.fetchData;
  20872. var fdg = pI.getDocument;
  20873. pI.getFilenameFromUrl;
  20874. pI.getPdfFilenameFromUrl;
  20875. pI.getUuid;
  20876. pI.getXfaPageViewport;
  20877. pI.isDataScheme;
  20878. pI.isPdfFile;
  20879. pI.isValidExplicitDest;
  20880. pI.noContextMenu;
  20881. pI.normalizeUnicode;
  20882. pI.setLayerDimensions;
  20883. pI.shadow;
  20884. pI.stopEvent;
  20885. pI.version;
  20886. const V0 = (t, I) => {
  20887. const g = t.__vccOpts || t;
  20888. for (const [C, i] of I)
  20889. g[C] = i;
  20890. return g;
  20891. }, Hdg = { class: "home_wrap" }, Xdg = ["id"], Sdg = {
  20892. __name: "PdfView",
  20893. props: {
  20894. data: Array
  20895. },
  20896. setup(t) {
  20897. Rdg.workerSrc = new URL("data:text/javascript;base64,LyoqCiAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQogKiBKYXZhU2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCiAqCiAqIENvcHlyaWdodCAyMDI0IE1vemlsbGEgRm91bmRhdGlvbgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKICogSmF2YVNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQogKi8KCi8qKioqKiovIC8vIFRoZSByZXF1aXJlIHNjb3BlCi8qKioqKiovIHZhciBfX3dlYnBhY2tfcmVxdWlyZV9fID0ge307Ci8qKioqKiovIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAvKiB3ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMgKi8KLyoqKioqKi8gKCgpID0+IHsKLyoqKioqKi8gCS8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHMKLyoqKioqKi8gCV9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7Ci8qKioqKiovIAkJZm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgewovKioqKioqLyAJCQlpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHsKLyoqKioqKi8gCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7Ci8qKioqKiovIAkJCX0KLyoqKioqKi8gCQl9Ci8qKioqKiovIAl9OwovKioqKioqLyB9KSgpOwovKioqKioqLyAKLyoqKioqKi8gLyogd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCAqLwovKioqKioqLyAoKCkgPT4gewovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKQovKioqKioqLyB9KSgpOwovKioqKioqLyAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdmFyIF9fd2VicGFja19leHBvcnRzX18gPSBnbG9iYWxUaGlzLnBkZmpzV29ya2VyID0ge307CgovLyBFWFBPUlRTCl9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7CiAgV29ya2VyTWVzc2FnZUhhbmRsZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBXb3JrZXJNZXNzYWdlSGFuZGxlcikKfSk7Cgo7Ly8gLi9zcmMvc2hhcmVkL3V0aWwuanMKY29uc3QgaXNOb2RlSlMgPSB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYgcHJvY2VzcyArICIiID09PSAiW29iamVjdCBwcm9jZXNzXSIgJiYgIXByb2Nlc3MudmVyc2lvbnMubncgJiYgIShwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uICYmIHByb2Nlc3MudHlwZSAmJiBwcm9jZXNzLnR5cGUgIT09ICJicm93c2VyIik7CmNvbnN0IElERU5USVRZX01BVFJJWCA9IFsxLCAwLCAwLCAxLCAwLCAwXTsKY29uc3QgRk9OVF9JREVOVElUWV9NQVRSSVggPSBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXTsKY29uc3QgTElORV9GQUNUT1IgPSAxLjM1Owpjb25zdCBMSU5FX0RFU0NFTlRfRkFDVE9SID0gMC4zNTsKY29uc3QgQkFTRUxJTkVfRkFDVE9SID0gTElORV9ERVNDRU5UX0ZBQ1RPUiAvIExJTkVfRkFDVE9SOwpjb25zdCBSZW5kZXJpbmdJbnRlbnRGbGFnID0gewogIEFOWTogMHgwMSwKICBESVNQTEFZOiAweDAyLAogIFBSSU5UOiAweDA0LAogIFNBVkU6IDB4MDgsCiAgQU5OT1RBVElPTlNfRk9STVM6IDB4MTAsCiAgQU5OT1RBVElPTlNfU1RPUkFHRTogMHgyMCwKICBBTk5PVEFUSU9OU19ESVNBQkxFOiAweDQwLAogIElTX0VESVRJTkc6IDB4ODAsCiAgT1BMSVNUOiAweDEwMAp9Owpjb25zdCBBbm5vdGF0aW9uTW9kZSA9IHsKICBESVNBQkxFOiAwLAogIEVOQUJMRTogMSwKICBFTkFCTEVfRk9STVM6IDIsCiAgRU5BQkxFX1NUT1JBR0U6IDMKfTsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclByZWZpeCA9ICJwZGZqc19pbnRlcm5hbF9lZGl0b3JfIjsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclR5cGUgPSB7CiAgRElTQUJMRTogLTEsCiAgTk9ORTogMCwKICBGUkVFVEVYVDogMywKICBISUdITElHSFQ6IDksCiAgU1RBTVA6IDEzLAogIElOSzogMTUsCiAgU0lHTkFUVVJFOiAxMDEKfTsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSB7CiAgUkVTSVpFOiAxLAogIENSRUFURTogMiwKICBGUkVFVEVYVF9TSVpFOiAxMSwKICBGUkVFVEVYVF9DT0xPUjogMTIsCiAgRlJFRVRFWFRfT1BBQ0lUWTogMTMsCiAgSU5LX0NPTE9SOiAyMSwKICBJTktfVEhJQ0tORVNTOiAyMiwKICBJTktfT1BBQ0lUWTogMjMsCiAgSElHSExJR0hUX0NPTE9SOiAzMSwKICBISUdITElHSFRfREVGQVVMVF9DT0xPUjogMzIsCiAgSElHSExJR0hUX1RISUNLTkVTUzogMzMsCiAgSElHSExJR0hUX0ZSRUU6IDM0LAogIEhJR0hMSUdIVF9TSE9XX0FMTDogMzUsCiAgRFJBV19TVEVQOiA0MQp9Owpjb25zdCBQZXJtaXNzaW9uRmxhZyA9IHsKICBQUklOVDogMHgwNCwKICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsCiAgQ09QWTogMHgxMCwKICBNT0RJRllfQU5OT1RBVElPTlM6IDB4MjAsCiAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsCiAgQ09QWV9GT1JfQUNDRVNTSUJJTElUWTogMHgyMDAsCiAgQVNTRU1CTEU6IDB4NDAwLAogIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDAKfTsKY29uc3QgVGV4dFJlbmRlcmluZ01vZGUgPSB7CiAgRklMTDogMCwKICBTVFJPS0U6IDEsCiAgRklMTF9TVFJPS0U6IDIsCiAgSU5WSVNJQkxFOiAzLAogIEZJTExfQUREX1RPX1BBVEg6IDQsCiAgU1RST0tFX0FERF9UT19QQVRIOiA1LAogIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LAogIEFERF9UT19QQVRIOiA3LAogIEZJTExfU1RST0tFX01BU0s6IDMsCiAgQUREX1RPX1BBVEhfRkxBRzogNAp9Owpjb25zdCBJbWFnZUtpbmQgPSB7CiAgR1JBWVNDQUxFXzFCUFA6IDEsCiAgUkdCXzI0QlBQOiAyLAogIFJHQkFfMzJCUFA6IDMKfTsKY29uc3QgQW5ub3RhdGlvblR5cGUgPSB7CiAgVEVYVDogMSwKICBMSU5LOiAyLAogIEZSRUVURVhUOiAzLAogIExJTkU6IDQsCiAgU1FVQVJFOiA1LAogIENJUkNMRTogNiwKICBQT0xZR09OOiA3LAogIFBPTFlMSU5FOiA4LAogIEhJR0hMSUdIVDogOSwKICBVTkRFUkxJTkU6IDEwLAogIFNRVUlHR0xZOiAxMSwKICBTVFJJS0VPVVQ6IDEyLAogIFNUQU1QOiAxMywKICBDQVJFVDogMTQsCiAgSU5LOiAxNSwKICBQT1BVUDogMTYsCiAgRklMRUFUVEFDSE1FTlQ6IDE3LAogIFNPVU5EOiAxOCwKICBNT1ZJRTogMTksCiAgV0lER0VUOiAyMCwKICBTQ1JFRU46IDIxLAogIFBSSU5URVJNQVJLOiAyMiwKICBUUkFQTkVUOiAyMywKICBXQVRFUk1BUks6IDI0LAogIFRIUkVFRDogMjUsCiAgUkVEQUNUOiAyNgp9Owpjb25zdCBBbm5vdGF0aW9uUmVwbHlUeXBlID0gewogIEdST1VQOiAiR3JvdXAiLAogIFJFUExZOiAiUiIKfTsKY29uc3QgQW5ub3RhdGlvbkZsYWcgPSB7CiAgSU5WSVNJQkxFOiAweDAxLAogIEhJRERFTjogMHgwMiwKICBQUklOVDogMHgwNCwKICBOT1pPT006IDB4MDgsCiAgTk9ST1RBVEU6IDB4MTAsCiAgTk9WSUVXOiAweDIwLAogIFJFQURPTkxZOiAweDQwLAogIExPQ0tFRDogMHg4MCwKICBUT0dHTEVOT1ZJRVc6IDB4MTAwLAogIExPQ0tFRENPTlRFTlRTOiAweDIwMAp9Owpjb25zdCBBbm5vdGF0aW9uRmllbGRGbGFnID0gewogIFJFQURPTkxZOiAweDAwMDAwMDEsCiAgUkVRVUlSRUQ6IDB4MDAwMDAwMiwKICBOT0VYUE9SVDogMHgwMDAwMDA0LAogIE1VTFRJTElORTogMHgwMDAxMDAwLAogIFBBU1NXT1JEOiAweDAwMDIwMDAsCiAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLAogIFJBRElPOiAweDAwMDgwMDAsCiAgUFVTSEJVVFRPTjogMHgwMDEwMDAwLAogIENPTUJPOiAweDAwMjAwMDAsCiAgRURJVDogMHgwMDQwMDAwLAogIFNPUlQ6IDB4MDA4MDAwMCwKICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsCiAgTVVMVElTRUxFQ1Q6IDB4MDIwMDAwMCwKICBET05PVFNQRUxMQ0hFQ0s6IDB4MDQwMDAwMCwKICBET05PVFNDUk9MTDogMHgwODAwMDAwLAogIENPTUI6IDB4MTAwMDAwMCwKICBSSUNIVEVYVDogMHgyMDAwMDAwLAogIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsCiAgQ09NTUlUT05TRUxDSEFOR0U6IDB4NDAwMDAwMAp9Owpjb25zdCBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gewogIFNPTElEOiAxLAogIERBU0hFRDogMiwKICBCRVZFTEVEOiAzLAogIElOU0VUOiA0LAogIFVOREVSTElORTogNQp9Owpjb25zdCBBbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlID0gewogIEU6ICJNb3VzZSBFbnRlciIsCiAgWDogIk1vdXNlIEV4aXQiLAogIEQ6ICJNb3VzZSBEb3duIiwKICBVOiAiTW91c2UgVXAiLAogIEZvOiAiRm9jdXMiLAogIEJsOiAiQmx1ciIsCiAgUE86ICJQYWdlT3BlbiIsCiAgUEM6ICJQYWdlQ2xvc2UiLAogIFBWOiAiUGFnZVZpc2libGUiLAogIFBJOiAiUGFnZUludmlzaWJsZSIsCiAgSzogIktleXN0cm9rZSIsCiAgRjogIkZvcm1hdCIsCiAgVjogIlZhbGlkYXRlIiwKICBDOiAiQ2FsY3VsYXRlIgp9Owpjb25zdCBEb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IHsKICBXQzogIldpbGxDbG9zZSIsCiAgV1M6ICJXaWxsU2F2ZSIsCiAgRFM6ICJEaWRTYXZlIiwKICBXUDogIldpbGxQcmludCIsCiAgRFA6ICJEaWRQcmludCIKfTsKY29uc3QgUGFnZUFjdGlvbkV2ZW50VHlwZSA9IHsKICBPOiAiUGFnZU9wZW4iLAogIEM6ICJQYWdlQ2xvc2UiCn07CmNvbnN0IFZlcmJvc2l0eUxldmVsID0gewogIEVSUk9SUzogMCwKICBXQVJOSU5HUzogMSwKICBJTkZPUzogNQp9Owpjb25zdCBPUFMgPSB7CiAgZGVwZW5kZW5jeTogMSwKICBzZXRMaW5lV2lkdGg6IDIsCiAgc2V0TGluZUNhcDogMywKICBzZXRMaW5lSm9pbjogNCwKICBzZXRNaXRlckxpbWl0OiA1LAogIHNldERhc2g6IDYsCiAgc2V0UmVuZGVyaW5nSW50ZW50OiA3LAogIHNldEZsYXRuZXNzOiA4LAogIHNldEdTdGF0ZTogOSwKICBzYXZlOiAxMCwKICByZXN0b3JlOiAxMSwKICB0cmFuc2Zvcm06IDEyLAogIG1vdmVUbzogMTMsCiAgbGluZVRvOiAxNCwKICBjdXJ2ZVRvOiAxNSwKICBjdXJ2ZVRvMjogMTYsCiAgY3VydmVUbzM6IDE3LAogIGNsb3NlUGF0aDogMTgsCiAgcmVjdGFuZ2xlOiAxOSwKICBzdHJva2U6IDIwLAogIGNsb3NlU3Ryb2tlOiAyMSwKICBmaWxsOiAyMiwKICBlb0ZpbGw6IDIzLAogIGZpbGxTdHJva2U6IDI0LAogIGVvRmlsbFN0cm9rZTogMjUsCiAgY2xvc2VGaWxsU3Ryb2tlOiAyNiwKICBjbG9zZUVPRmlsbFN0cm9rZTogMjcsCiAgZW5kUGF0aDogMjgsCiAgY2xpcDogMjksCiAgZW9DbGlwOiAzMCwKICBiZWdpblRleHQ6IDMxLAogIGVuZFRleHQ6IDMyLAogIHNldENoYXJTcGFjaW5nOiAzMywKICBzZXRXb3JkU3BhY2luZzogMzQsCiAgc2V0SFNjYWxlOiAzNSwKICBzZXRMZWFkaW5nOiAzNiwKICBzZXRGb250OiAzNywKICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsCiAgc2V0VGV4dFJpc2U6IDM5LAogIG1vdmVUZXh0OiA0MCwKICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLAogIHNldFRleHRNYXRyaXg6IDQyLAogIG5leHRMaW5lOiA0MywKICBzaG93VGV4dDogNDQsCiAgc2hvd1NwYWNlZFRleHQ6IDQ1LAogIG5leHRMaW5lU2hvd1RleHQ6IDQ2LAogIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NywKICBzZXRDaGFyV2lkdGg6IDQ4LAogIHNldENoYXJXaWR0aEFuZEJvdW5kczogNDksCiAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsCiAgc2V0RmlsbENvbG9yU3BhY2U6IDUxLAogIHNldFN0cm9rZUNvbG9yOiA1MiwKICBzZXRTdHJva2VDb2xvck46IDUzLAogIHNldEZpbGxDb2xvcjogNTQsCiAgc2V0RmlsbENvbG9yTjogNTUsCiAgc2V0U3Ryb2tlR3JheTogNTYsCiAgc2V0RmlsbEdyYXk6IDU3LAogIHNldFN0cm9rZVJHQkNvbG9yOiA1OCwKICBzZXRGaWxsUkdCQ29sb3I6IDU5LAogIHNldFN0cm9rZUNNWUtDb2xvcjogNjAsCiAgc2V0RmlsbENNWUtDb2xvcjogNjEsCiAgc2hhZGluZ0ZpbGw6IDYyLAogIGJlZ2luSW5saW5lSW1hZ2U6IDYzLAogIGJlZ2luSW1hZ2VEYXRhOiA2NCwKICBlbmRJbmxpbmVJbWFnZTogNjUsCiAgcGFpbnRYT2JqZWN0OiA2NiwKICBtYXJrUG9pbnQ6IDY3LAogIG1hcmtQb2ludFByb3BzOiA2OCwKICBiZWdpbk1hcmtlZENvbnRlbnQ6IDY5LAogIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiA3MCwKICBlbmRNYXJrZWRDb250ZW50OiA3MSwKICBiZWdpbkNvbXBhdDogNzIsCiAgZW5kQ29tcGF0OiA3MywKICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LAogIHBhaW50Rm9ybVhPYmplY3RFbmQ6IDc1LAogIGJlZ2luR3JvdXA6IDc2LAogIGVuZEdyb3VwOiA3NywKICBiZWdpbkFubm90YXRpb246IDgwLAogIGVuZEFubm90YXRpb246IDgxLAogIHBhaW50SW1hZ2VNYXNrWE9iamVjdDogODMsCiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6IDg0LAogIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSwKICBwYWludElubGluZUltYWdlWE9iamVjdDogODYsCiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDogODcsCiAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LAogIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDogODksCiAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiA5MCwKICBjb25zdHJ1Y3RQYXRoOiA5MSwKICBzZXRTdHJva2VUcmFuc3BhcmVudDogOTIsCiAgc2V0RmlsbFRyYW5zcGFyZW50OiA5Mwp9Owpjb25zdCBEcmF3T1BTID0gewogIG1vdmVUbzogMCwKICBsaW5lVG86IDEsCiAgY3VydmVUbzogMiwKICBjbG9zZVBhdGg6IDMKfTsKY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7CiAgTkVFRF9QQVNTV09SRDogMSwKICBJTkNPUlJFQ1RfUEFTU1dPUkQ6IDIKfTsKbGV0IHZlcmJvc2l0eSA9IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTOwpmdW5jdGlvbiBzZXRWZXJib3NpdHlMZXZlbChsZXZlbCkgewogIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGxldmVsKSkgewogICAgdmVyYm9zaXR5ID0gbGV2ZWw7CiAgfQp9CmZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCkgewogIHJldHVybiB2ZXJib3NpdHk7Cn0KZnVuY3Rpb24gaW5mbyhtc2cpIHsKICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLklORk9TKSB7CiAgICBjb25zb2xlLmxvZyhgSW5mbzogJHttc2d9YCk7CiAgfQp9CmZ1bmN0aW9uIHdhcm4obXNnKSB7CiAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUykgewogICAgY29uc29sZS5sb2coYFdhcm5pbmc6ICR7bXNnfWApOwogIH0KfQpmdW5jdGlvbiB1bnJlYWNoYWJsZShtc2cpIHsKICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKfQpmdW5jdGlvbiBhc3NlcnQoY29uZCwgbXNnKSB7CiAgaWYgKCFjb25kKSB7CiAgICB1bnJlYWNoYWJsZShtc2cpOwogIH0KfQpmdW5jdGlvbiBfaXNWYWxpZFByb3RvY29sKHVybCkgewogIHN3aXRjaCAodXJsPy5wcm90b2NvbCkgewogICAgY2FzZSAiaHR0cDoiOgogICAgY2FzZSAiaHR0cHM6IjoKICAgIGNhc2UgImZ0cDoiOgogICAgY2FzZSAibWFpbHRvOiI6CiAgICBjYXNlICJ0ZWw6IjoKICAgICAgcmV0dXJuIHRydWU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmZ1bmN0aW9uIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwodXJsLCBiYXNlVXJsID0gbnVsbCwgb3B0aW9ucyA9IG51bGwpIHsKICBpZiAoIXVybCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGlmIChvcHRpb25zICYmIHR5cGVvZiB1cmwgPT09ICJzdHJpbmciKSB7CiAgICBpZiAob3B0aW9ucy5hZGREZWZhdWx0UHJvdG9jb2wgJiYgdXJsLnN0YXJ0c1dpdGgoInd3dy4iKSkgewogICAgICBjb25zdCBkb3RzID0gdXJsLm1hdGNoKC9cLi9nKTsKICAgICAgaWYgKGRvdHM/Lmxlbmd0aCA+PSAyKSB7CiAgICAgICAgdXJsID0gYGh0dHA6Ly8ke3VybH1gOwogICAgICB9CiAgICB9CiAgICBpZiAob3B0aW9ucy50cnlDb252ZXJ0RW5jb2RpbmcpIHsKICAgICAgdHJ5IHsKICAgICAgICB1cmwgPSBzdHJpbmdUb1VURjhTdHJpbmcodXJsKTsKICAgICAgfSBjYXRjaCB7fQogICAgfQogIH0KICBjb25zdCBhYnNvbHV0ZVVybCA9IGJhc2VVcmwgPyBVUkwucGFyc2UodXJsLCBiYXNlVXJsKSA6IFVSTC5wYXJzZSh1cmwpOwogIHJldHVybiBfaXNWYWxpZFByb3RvY29sKGFic29sdXRlVXJsKSA/IGFic29sdXRlVXJsIDogbnVsbDsKfQpmdW5jdGlvbiBzaGFkb3cob2JqLCBwcm9wLCB2YWx1ZSwgbm9uU2VyaWFsaXphYmxlID0gZmFsc2UpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7CiAgICB2YWx1ZSwKICAgIGVudW1lcmFibGU6ICFub25TZXJpYWxpemFibGUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICB3cml0YWJsZTogZmFsc2UKICB9KTsKICByZXR1cm4gdmFsdWU7Cn0KY29uc3QgQmFzZUV4Y2VwdGlvbiA9IGZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCkgewogIGZ1bmN0aW9uIEJhc2VFeGNlcHRpb24obWVzc2FnZSwgbmFtZSkgewogICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgfQogIEJhc2VFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7CiAgQmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciA9IEJhc2VFeGNlcHRpb247CiAgcmV0dXJuIEJhc2VFeGNlcHRpb247Cn0oKTsKY2xhc3MgUGFzc3dvcmRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2csIGNvZGUpIHsKICAgIHN1cGVyKG1zZywgIlBhc3N3b3JkRXhjZXB0aW9uIik7CiAgICB0aGlzLmNvZGUgPSBjb2RlOwogIH0KfQpjbGFzcyBVbmtub3duRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2csIGRldGFpbHMpIHsKICAgIHN1cGVyKG1zZywgIlVua25vd25FcnJvckV4Y2VwdGlvbiIpOwogICAgdGhpcy5kZXRhaWxzID0gZGV0YWlsczsKICB9Cn0KY2xhc3MgSW52YWxpZFBERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiSW52YWxpZFBERkV4Y2VwdGlvbiIpOwogIH0KfQpjbGFzcyBSZXNwb25zZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZywgc3RhdHVzLCBtaXNzaW5nKSB7CiAgICBzdXBlcihtc2csICJSZXNwb25zZUV4Y2VwdGlvbiIpOwogICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgICB0aGlzLm1pc3NpbmcgPSBtaXNzaW5nOwogIH0KfQpjbGFzcyBGb3JtYXRFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiRm9ybWF0RXJyb3IiKTsKICB9Cn0KY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIkFib3J0RXhjZXB0aW9uIik7CiAgfQp9CmZ1bmN0aW9uIGJ5dGVzVG9TdHJpbmcoYnl0ZXMpIHsKICBpZiAodHlwZW9mIGJ5dGVzICE9PSAib2JqZWN0IiB8fCBieXRlcz8ubGVuZ3RoID09PSB1bmRlZmluZWQpIHsKICAgIHVucmVhY2hhYmxlKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIik7CiAgfQogIGNvbnN0IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKICBjb25zdCBNQVhfQVJHVU1FTlRfQ09VTlQgPSA4MTkyOwogIGlmIChsZW5ndGggPCBNQVhfQVJHVU1FTlRfQ09VTlQpIHsKICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGJ5dGVzKTsKICB9CiAgY29uc3Qgc3RyQnVmID0gW107CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gTUFYX0FSR1VNRU5UX0NPVU5UKSB7CiAgICBjb25zdCBjaHVua0VuZCA9IE1hdGgubWluKGkgKyBNQVhfQVJHVU1FTlRfQ09VTlQsIGxlbmd0aCk7CiAgICBjb25zdCBjaHVuayA9IGJ5dGVzLnN1YmFycmF5KGksIGNodW5rRW5kKTsKICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKICB9CiAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKfQpmdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikgewogIGlmICh0eXBlb2Ygc3RyICE9PSAic3RyaW5nIikgewogICAgdW5yZWFjaGFibGUoIkludmFsaWQgYXJndW1lbnQgZm9yIHN0cmluZ1RvQnl0ZXMiKTsKICB9CiAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDsKICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgYnl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmY7CiAgfQogIHJldHVybiBieXRlczsKfQpmdW5jdGlvbiBzdHJpbmczMih2YWx1ZSkgewogIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlID4+IDI0ICYgMHhmZiwgdmFsdWUgPj4gMTYgJiAweGZmLCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKfQpmdW5jdGlvbiBvYmplY3RTaXplKG9iaikgewogIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aDsKfQpmdW5jdGlvbiBvYmplY3RGcm9tTWFwKG1hcCkgewogIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbWFwKSB7CiAgICBvYmpba2V5XSA9IHZhbHVlOwogIH0KICByZXR1cm4gb2JqOwp9CmZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCkgewogIGNvbnN0IGJ1ZmZlcjggPSBuZXcgVWludDhBcnJheSg0KTsKICBidWZmZXI4WzBdID0gMTsKICBjb25zdCB2aWV3MzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyOC5idWZmZXIsIDAsIDEpOwogIHJldHVybiB2aWV3MzJbMF0gPT09IDE7Cn0KZnVuY3Rpb24gaXNFdmFsU3VwcG9ydGVkKCkgewogIHRyeSB7CiAgICBuZXcgRnVuY3Rpb24oIiIpOwogICAgcmV0dXJuIHRydWU7CiAgfSBjYXRjaCB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmNsYXNzIEZlYXR1cmVUZXN0IHsKICBzdGF0aWMgZ2V0IGlzTGl0dGxlRW5kaWFuKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiaXNMaXR0bGVFbmRpYW4iLCBpc0xpdHRsZUVuZGlhbigpKTsKICB9CiAgc3RhdGljIGdldCBpc0V2YWxTdXBwb3J0ZWQoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc0V2YWxTdXBwb3J0ZWQiLCBpc0V2YWxTdXBwb3J0ZWQoKSk7CiAgfQogIHN0YXRpYyBnZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCIsIHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICJ1bmRlZmluZWQiKTsKICB9CiAgc3RhdGljIGdldCBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImlzSW1hZ2VEZWNvZGVyU3VwcG9ydGVkIiwgdHlwZW9mIEltYWdlRGVjb2RlciAhPT0gInVuZGVmaW5lZCIpOwogIH0KICBzdGF0aWMgZ2V0IHBsYXRmb3JtKCkgewogICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBuYXZpZ2F0b3I/LnBsYXRmb3JtID09PSAic3RyaW5nIiAmJiB0eXBlb2YgbmF2aWdhdG9yPy51c2VyQWdlbnQgPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBwbGF0Zm9ybSwKICAgICAgICB1c2VyQWdlbnQKICAgICAgfSA9IG5hdmlnYXRvcjsKICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicGxhdGZvcm0iLCB7CiAgICAgICAgaXNBbmRyb2lkOiB1c2VyQWdlbnQuaW5jbHVkZXMoIkFuZHJvaWQiKSwKICAgICAgICBpc0xpbnV4OiBwbGF0Zm9ybS5pbmNsdWRlcygiTGludXgiKSwKICAgICAgICBpc01hYzogcGxhdGZvcm0uaW5jbHVkZXMoIk1hYyIpLAogICAgICAgIGlzV2luZG93czogcGxhdGZvcm0uaW5jbHVkZXMoIldpbiIpLAogICAgICAgIGlzRmlyZWZveDogdXNlckFnZW50LmluY2x1ZGVzKCJGaXJlZm94IikKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJwbGF0Zm9ybSIsIHsKICAgICAgaXNBbmRyb2lkOiBmYWxzZSwKICAgICAgaXNMaW51eDogZmFsc2UsCiAgICAgIGlzTWFjOiBmYWxzZSwKICAgICAgaXNXaW5kb3dzOiBmYWxzZSwKICAgICAgaXNGaXJlZm94OiBmYWxzZQogICAgfSk7CiAgfQogIHN0YXRpYyBnZXQgaXNDU1NSb3VuZFN1cHBvcnRlZCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImlzQ1NTUm91bmRTdXBwb3J0ZWQiLCBnbG9iYWxUaGlzLkNTUz8uc3VwcG9ydHM/Ligid2lkdGg6IHJvdW5kKDEuNXB4LCAxcHgpIikpOwogIH0KfQpjb25zdCBoZXhOdW1iZXJzID0gQXJyYXkuZnJvbShBcnJheSgyNTYpLmtleXMoKSwgbiA9PiBuLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAiMCIpKTsKY2xhc3MgVXRpbCB7CiAgc3RhdGljIG1ha2VIZXhDb2xvcihyLCBnLCBiKSB7CiAgICByZXR1cm4gYCMke2hleE51bWJlcnNbcl19JHtoZXhOdW1iZXJzW2ddfSR7aGV4TnVtYmVyc1tiXX1gOwogIH0KICBzdGF0aWMgdHJhbnNmb3JtKG0xLCBtMikgewogICAgcmV0dXJuIFttMVswXSAqIG0yWzBdICsgbTFbMl0gKiBtMlsxXSwgbTFbMV0gKiBtMlswXSArIG0xWzNdICogbTJbMV0sIG0xWzBdICogbTJbMl0gKyBtMVsyXSAqIG0yWzNdLCBtMVsxXSAqIG0yWzJdICsgbTFbM10gKiBtMlszXSwgbTFbMF0gKiBtMls0XSArIG0xWzJdICogbTJbNV0gKyBtMVs0XSwgbTFbMV0gKiBtMls0XSArIG0xWzNdICogbTJbNV0gKyBtMVs1XV07CiAgfQogIHN0YXRpYyBhcHBseVRyYW5zZm9ybShwLCBtKSB7CiAgICBjb25zdCB4dCA9IHBbMF0gKiBtWzBdICsgcFsxXSAqIG1bMl0gKyBtWzRdOwogICAgY29uc3QgeXQgPSBwWzBdICogbVsxXSArIHBbMV0gKiBtWzNdICsgbVs1XTsKICAgIHJldHVybiBbeHQsIHl0XTsKICB9CiAgc3RhdGljIGFwcGx5SW52ZXJzZVRyYW5zZm9ybShwLCBtKSB7CiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTsKICAgIGNvbnN0IHh0ID0gKHBbMF0gKiBtWzNdIC0gcFsxXSAqIG1bMl0gKyBtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQ7CiAgICBjb25zdCB5dCA9ICgtcFswXSAqIG1bMV0gKyBwWzFdICogbVswXSArIG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZDsKICAgIHJldHVybiBbeHQsIHl0XTsKICB9CiAgc3RhdGljIGdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KHIsIG0pIHsKICAgIGNvbnN0IHAxID0gdGhpcy5hcHBseVRyYW5zZm9ybShyLCBtKTsKICAgIGNvbnN0IHAyID0gdGhpcy5hcHBseVRyYW5zZm9ybShyLnNsaWNlKDIsIDQpLCBtKTsKICAgIGNvbnN0IHAzID0gdGhpcy5hcHBseVRyYW5zZm9ybShbclswXSwgclszXV0sIG0pOwogICAgY29uc3QgcDQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFtyWzJdLCByWzFdXSwgbSk7CiAgICByZXR1cm4gW01hdGgubWluKHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSwgTWF0aC5taW4ocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pLCBNYXRoLm1heChwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksIE1hdGgubWF4KHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKV07CiAgfQogIHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKG0pIHsKICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdOwogICAgcmV0dXJuIFttWzNdIC8gZCwgLW1bMV0gLyBkLCAtbVsyXSAvIGQsIG1bMF0gLyBkLCAobVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkLCAobVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkXTsKICB9CiAgc3RhdGljIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG0pIHsKICAgIGNvbnN0IHRyYW5zcG9zZSA9IFttWzBdLCBtWzJdLCBtWzFdLCBtWzNdXTsKICAgIGNvbnN0IGEgPSBtWzBdICogdHJhbnNwb3NlWzBdICsgbVsxXSAqIHRyYW5zcG9zZVsyXTsKICAgIGNvbnN0IGIgPSBtWzBdICogdHJhbnNwb3NlWzFdICsgbVsxXSAqIHRyYW5zcG9zZVszXTsKICAgIGNvbnN0IGMgPSBtWzJdICogdHJhbnNwb3NlWzBdICsgbVszXSAqIHRyYW5zcG9zZVsyXTsKICAgIGNvbnN0IGQgPSBtWzJdICogdHJhbnNwb3NlWzFdICsgbVszXSAqIHRyYW5zcG9zZVszXTsKICAgIGNvbnN0IGZpcnN0ID0gKGEgKyBkKSAvIDI7CiAgICBjb25zdCBzZWNvbmQgPSBNYXRoLnNxcnQoKGEgKyBkKSAqKiAyIC0gNCAqIChhICogZCAtIGMgKiBiKSkgLyAyOwogICAgY29uc3Qgc3ggPSBmaXJzdCArIHNlY29uZCB8fCAxOwogICAgY29uc3Qgc3kgPSBmaXJzdCAtIHNlY29uZCB8fCAxOwogICAgcmV0dXJuIFtNYXRoLnNxcnQoc3gpLCBNYXRoLnNxcnQoc3kpXTsKICB9CiAgc3RhdGljIG5vcm1hbGl6ZVJlY3QocmVjdCkgewogICAgY29uc3QgciA9IHJlY3Quc2xpY2UoMCk7CiAgICBpZiAocmVjdFswXSA+IHJlY3RbMl0pIHsKICAgICAgclswXSA9IHJlY3RbMl07CiAgICAgIHJbMl0gPSByZWN0WzBdOwogICAgfQogICAgaWYgKHJlY3RbMV0gPiByZWN0WzNdKSB7CiAgICAgIHJbMV0gPSByZWN0WzNdOwogICAgICByWzNdID0gcmVjdFsxXTsKICAgIH0KICAgIHJldHVybiByOwogIH0KICBzdGF0aWMgaW50ZXJzZWN0KHJlY3QxLCByZWN0MikgewogICAgY29uc3QgeExvdyA9IE1hdGgubWF4KE1hdGgubWluKHJlY3QxWzBdLCByZWN0MVsyXSksIE1hdGgubWluKHJlY3QyWzBdLCByZWN0MlsyXSkpOwogICAgY29uc3QgeEhpZ2ggPSBNYXRoLm1pbihNYXRoLm1heChyZWN0MVswXSwgcmVjdDFbMl0pLCBNYXRoLm1heChyZWN0MlswXSwgcmVjdDJbMl0pKTsKICAgIGlmICh4TG93ID4geEhpZ2gpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB5TG93ID0gTWF0aC5tYXgoTWF0aC5taW4ocmVjdDFbMV0sIHJlY3QxWzNdKSwgTWF0aC5taW4ocmVjdDJbMV0sIHJlY3QyWzNdKSk7CiAgICBjb25zdCB5SGlnaCA9IE1hdGgubWluKE1hdGgubWF4KHJlY3QxWzFdLCByZWN0MVszXSksIE1hdGgubWF4KHJlY3QyWzFdLCByZWN0MlszXSkpOwogICAgaWYgKHlMb3cgPiB5SGlnaCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBbeExvdywgeUxvdywgeEhpZ2gsIHlIaWdoXTsKICB9CiAgc3RhdGljIHBvaW50Qm91bmRpbmdCb3goeCwgeSwgbWluTWF4KSB7CiAgICBtaW5NYXhbMF0gPSBNYXRoLm1pbihtaW5NYXhbMF0sIHgpOwogICAgbWluTWF4WzFdID0gTWF0aC5taW4obWluTWF4WzFdLCB5KTsKICAgIG1pbk1heFsyXSA9IE1hdGgubWF4KG1pbk1heFsyXSwgeCk7CiAgICBtaW5NYXhbM10gPSBNYXRoLm1heChtaW5NYXhbM10sIHkpOwogIH0KICBzdGF0aWMgcmVjdEJvdW5kaW5nQm94KHgwLCB5MCwgeDEsIHkxLCBtaW5NYXgpIHsKICAgIG1pbk1heFswXSA9IE1hdGgubWluKG1pbk1heFswXSwgeDAsIHgxKTsKICAgIG1pbk1heFsxXSA9IE1hdGgubWluKG1pbk1heFsxXSwgeTAsIHkxKTsKICAgIG1pbk1heFsyXSA9IE1hdGgubWF4KG1pbk1heFsyXSwgeDAsIHgxKTsKICAgIG1pbk1heFszXSA9IE1hdGgubWF4KG1pbk1heFszXSwgeTAsIHkxKTsKICB9CiAgc3RhdGljICNnZXRFeHRyZW11bU9uQ3VydmUoeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCB0LCBtaW5NYXgpIHsKICAgIGlmICh0IDw9IDAgfHwgdCA+PSAxKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG10ID0gMSAtIHQ7CiAgICBjb25zdCB0dCA9IHQgKiB0OwogICAgY29uc3QgdHR0ID0gdHQgKiB0OwogICAgY29uc3QgeCA9IG10ICogKG10ICogKG10ICogeDAgKyAzICogdCAqIHgxKSArIDMgKiB0dCAqIHgyKSArIHR0dCAqIHgzOwogICAgY29uc3QgeSA9IG10ICogKG10ICogKG10ICogeTAgKyAzICogdCAqIHkxKSArIDMgKiB0dCAqIHkyKSArIHR0dCAqIHkzOwogICAgbWluTWF4WzBdID0gTWF0aC5taW4obWluTWF4WzBdLCB4KTsKICAgIG1pbk1heFsxXSA9IE1hdGgubWluKG1pbk1heFsxXSwgeSk7CiAgICBtaW5NYXhbMl0gPSBNYXRoLm1heChtaW5NYXhbMl0sIHgpOwogICAgbWluTWF4WzNdID0gTWF0aC5tYXgobWluTWF4WzNdLCB5KTsKICB9CiAgc3RhdGljICNnZXRFeHRyZW11bSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsIGEsIGIsIGMsIG1pbk1heCkgewogICAgaWYgKE1hdGguYWJzKGEpIDwgMWUtMTIpIHsKICAgICAgaWYgKE1hdGguYWJzKGIpID49IDFlLTEyKSB7CiAgICAgICAgdGhpcy4jZ2V0RXh0cmVtdW1PbkN1cnZlKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgLWMgLyBiLCBtaW5NYXgpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGRlbHRhID0gYiAqKiAyIC0gNCAqIGMgKiBhOwogICAgaWYgKGRlbHRhIDwgMCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzcXJ0RGVsdGEgPSBNYXRoLnNxcnQoZGVsdGEpOwogICAgY29uc3QgYTIgPSAyICogYTsKICAgIHRoaXMuI2dldEV4dHJlbXVtT25DdXJ2ZSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsICgtYiArIHNxcnREZWx0YSkgLyBhMiwgbWluTWF4KTsKICAgIHRoaXMuI2dldEV4dHJlbXVtT25DdXJ2ZSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsICgtYiAtIHNxcnREZWx0YSkgLyBhMiwgbWluTWF4KTsKICB9CiAgc3RhdGljIGJlemllckJvdW5kaW5nQm94KHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgbWluTWF4KSB7CiAgICBtaW5NYXhbMF0gPSBNYXRoLm1pbihtaW5NYXhbMF0sIHgwLCB4Myk7CiAgICBtaW5NYXhbMV0gPSBNYXRoLm1pbihtaW5NYXhbMV0sIHkwLCB5Myk7CiAgICBtaW5NYXhbMl0gPSBNYXRoLm1heChtaW5NYXhbMl0sIHgwLCB4Myk7CiAgICBtaW5NYXhbM10gPSBNYXRoLm1heChtaW5NYXhbM10sIHkwLCB5Myk7CiAgICB0aGlzLiNnZXRFeHRyZW11bSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsIDMgKiAoLXgwICsgMyAqICh4MSAtIHgyKSArIHgzKSwgNiAqICh4MCAtIDIgKiB4MSArIHgyKSwgMyAqICh4MSAtIHgwKSwgbWluTWF4KTsKICAgIHRoaXMuI2dldEV4dHJlbXVtKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgMyAqICgteTAgKyAzICogKHkxIC0geTIpICsgeTMpLCA2ICogKHkwIC0gMiAqIHkxICsgeTIpLCAzICogKHkxIC0geTApLCBtaW5NYXgpOwogIH0KfQpjb25zdCBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZSA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDJkOCwgMHgyYzcsIDB4MmM2LCAweDJkOSwgMHgyZGQsIDB4MmRiLCAweDJkYSwgMHgyZGMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LCAweDIwMTMsIDB4MTkyLCAweDIwNDQsIDB4MjAzOSwgMHgyMDNhLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFlLCAweDIwMWMsIDB4MjAxZCwgMHgyMDE4LCAweDIwMTksIDB4MjAxYSwgMHgyMTIyLCAweGZiMDEsIDB4ZmIwMiwgMHgxNDEsIDB4MTUyLCAweDE2MCwgMHgxNzgsIDB4MTdkLCAweDEzMSwgMHgxNDIsIDB4MTUzLCAweDE2MSwgMHgxN2UsIDAsIDB4MjBhY107CmZ1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKHN0cikgewogIGlmIChzdHJbMF0gPj0gIlx4RUYiKSB7CiAgICBsZXQgZW5jb2Rpbmc7CiAgICBpZiAoc3RyWzBdID09PSAiXHhGRSIgJiYgc3RyWzFdID09PSAiXHhGRiIpIHsKICAgICAgZW5jb2RpbmcgPSAidXRmLTE2YmUiOwogICAgICBpZiAoc3RyLmxlbmd0aCAlIDIgPT09IDEpIHsKICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMCwgLTEpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHN0clswXSA9PT0gIlx4RkYiICYmIHN0clsxXSA9PT0gIlx4RkUiKSB7CiAgICAgIGVuY29kaW5nID0gInV0Zi0xNmxlIjsKICAgICAgaWYgKHN0ci5sZW5ndGggJSAyID09PSAxKSB7CiAgICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIC0xKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzdHJbMF0gPT09ICJceEVGIiAmJiBzdHJbMV0gPT09ICJceEJCIiAmJiBzdHJbMl0gPT09ICJceEJGIikgewogICAgICBlbmNvZGluZyA9ICJ1dGYtOCI7CiAgICB9CiAgICBpZiAoZW5jb2RpbmcpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nLCB7CiAgICAgICAgICBmYXRhbDogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmluZ1RvQnl0ZXMoc3RyKTsKICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyKTsKICAgICAgICBpZiAoIWRlY29kZWQuaW5jbHVkZXMoIlx4MWIiKSkgewogICAgICAgICAgcmV0dXJuIGRlY29kZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZWNvZGVkLnJlcGxhY2VBbGwoL1x4MWJbXlx4MWJdKig/Olx4MWJ8JCkvZywgIiIpOwogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIHdhcm4oYHN0cmluZ1RvUERGU3RyaW5nOiAiJHtleH0iLmApOwogICAgICB9CiAgICB9CiAgfQogIGNvbnN0IHN0ckJ1ZiA9IFtdOwogIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgaWYgKGNoYXJDb2RlID09PSAweDFiKSB7CiAgICAgIHdoaWxlICgrK2kgPCBpaSAmJiBzdHIuY2hhckNvZGVBdChpKSAhPT0gMHgxYikge30KICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25zdCBjb2RlID0gUERGU3RyaW5nVHJhbnNsYXRlVGFibGVbY2hhckNvZGVdOwogICAgc3RyQnVmLnB1c2goY29kZSA/IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkgOiBzdHIuY2hhckF0KGkpKTsKICB9CiAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKfQpmdW5jdGlvbiBzdHJpbmdUb1VURjhTdHJpbmcoc3RyKSB7CiAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoc3RyKSk7Cn0KZnVuY3Rpb24gdXRmOFN0cmluZ1RvU3RyaW5nKHN0cikgewogIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7Cn0KZnVuY3Rpb24gaXNBcnJheUVxdWFsKGFycjEsIGFycjIpIHsKICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGZvciAobGV0IGkgPSAwLCBpaSA9IGFycjEubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgaWYgKGFycjFbaV0gIT09IGFycjJbaV0pIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKGRhdGUgPSBuZXcgRGF0ZSgpKSB7CiAgY29uc3QgYnVmZmVyID0gW2RhdGUuZ2V0VVRDRnVsbFllYXIoKS50b1N0cmluZygpLCAoZGF0ZS5nZXRVVENNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCBkYXRlLmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpXTsKICByZXR1cm4gYnVmZmVyLmpvaW4oIiIpOwp9CmxldCBOb3JtYWxpemVSZWdleCA9IG51bGw7CmxldCBOb3JtYWxpemF0aW9uTWFwID0gbnVsbDsKZnVuY3Rpb24gbm9ybWFsaXplVW5pY29kZShzdHIpIHsKICBpZiAoIU5vcm1hbGl6ZVJlZ2V4KSB7CiAgICBOb3JtYWxpemVSZWdleCA9IC8oW1x1MDBhMFx1MDBiNVx1MDM3ZVx1MGViM1x1MjAwMC1cdTIwMGFcdTIwMmZcdTIxMjZcdWZiMDAtXHVmYjA0XHVmYjA2XHVmYjIwLVx1ZmIzNlx1ZmIzOC1cdWZiM2NcdWZiM2VcdWZiNDAtXHVmYjQxXHVmYjQzLVx1ZmI0NFx1ZmI0Ni1cdWZiYTFcdWZiYTQtXHVmYmE5XHVmYmFlLVx1ZmJiMVx1ZmJkMy1cdWZiZGNcdWZiZGUtXHVmYmU3XHVmYmVhLVx1ZmJmOFx1ZmJmYy1cdWZiZmRcdWZjMDAtXHVmYzVkXHVmYzY0LVx1ZmNmMVx1ZmNmNS1cdWZkM2RcdWZkODhcdWZkZjRcdWZkZmEtXHVmZGZiXHVmZTcxXHVmZTc3XHVmZTc5XHVmZTdiXHVmZTdkXSspfChcdWZiMDUrKS9ndTsKICAgIE5vcm1hbGl6YXRpb25NYXAgPSBuZXcgTWFwKFtbIu+shSIsICLFv3QiXV0pOwogIH0KICByZXR1cm4gc3RyLnJlcGxhY2VBbGwoTm9ybWFsaXplUmVnZXgsIChfLCBwMSwgcDIpID0+IHAxID8gcDEubm9ybWFsaXplKCJORktDIikgOiBOb3JtYWxpemF0aW9uTWFwLmdldChwMikpOwp9CmZ1bmN0aW9uIGdldFV1aWQoKSB7CiAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gImZ1bmN0aW9uIikgewogICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7CiAgfQogIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KDMyKTsKICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ1Zik7CiAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoYnVmKTsKfQpjb25zdCBBbm5vdGF0aW9uUHJlZml4ID0gInBkZmpzX2ludGVybmFsX2lkXyI7CmZ1bmN0aW9uIF9pc1ZhbGlkRXhwbGljaXREZXN0KHZhbGlkUmVmLCB2YWxpZE5hbWUsIGRlc3QpIHsKICBpZiAoIUFycmF5LmlzQXJyYXkoZGVzdCkgfHwgZGVzdC5sZW5ndGggPCAyKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvbnN0IFtwYWdlLCB6b29tLCAuLi5hcmdzXSA9IGRlc3Q7CiAgaWYgKCF2YWxpZFJlZihwYWdlKSAmJiAhTnVtYmVyLmlzSW50ZWdlcihwYWdlKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAoIXZhbGlkTmFtZSh6b29tKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCBhcmdzTGVuID0gYXJncy5sZW5ndGg7CiAgbGV0IGFsbG93TnVsbCA9IHRydWU7CiAgc3dpdGNoICh6b29tLm5hbWUpIHsKICAgIGNhc2UgIlhZWiI6CiAgICAgIGlmIChhcmdzTGVuIDwgMiB8fCBhcmdzTGVuID4gMykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgIkZpdCI6CiAgICBjYXNlICJGaXRCIjoKICAgICAgcmV0dXJuIGFyZ3NMZW4gPT09IDA7CiAgICBjYXNlICJGaXRIIjoKICAgIGNhc2UgIkZpdEJIIjoKICAgIGNhc2UgIkZpdFYiOgogICAgY2FzZSAiRml0QlYiOgogICAgICBpZiAoYXJnc0xlbiA+IDEpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICJGaXRSIjoKICAgICAgaWYgKGFyZ3NMZW4gIT09IDQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgYWxsb3dOdWxsID0gZmFsc2U7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogIH0KICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7CiAgICBpZiAodHlwZW9mIGFyZyA9PT0gIm51bWJlciIgfHwgYWxsb3dOdWxsICYmIGFyZyA9PT0gbnVsbCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gTWF0aENsYW1wKHYsIG1pbiwgbWF4KSB7CiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHYsIG1pbiksIG1heCk7Cn0KZnVuY3Rpb24gdG9IZXhVdGlsKGFycikgewogIGlmIChVaW50OEFycmF5LnByb3RvdHlwZS50b0hleCkgewogICAgcmV0dXJuIGFyci50b0hleCgpOwogIH0KICByZXR1cm4gQXJyYXkuZnJvbShhcnIsIG51bSA9PiBoZXhOdW1iZXJzW251bV0pLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIHRvQmFzZTY0VXRpbChhcnIpIHsKICBpZiAoVWludDhBcnJheS5wcm90b3R5cGUudG9CYXNlNjQpIHsKICAgIHJldHVybiBhcnIudG9CYXNlNjQoKTsKICB9CiAgcmV0dXJuIGJ0b2EoYnl0ZXNUb1N0cmluZyhhcnIpKTsKfQpmdW5jdGlvbiBmcm9tQmFzZTY0VXRpbChzdHIpIHsKICBpZiAoVWludDhBcnJheS5mcm9tQmFzZTY0KSB7CiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tQmFzZTY0KHN0cik7CiAgfQogIHJldHVybiBzdHJpbmdUb0J5dGVzKGF0b2Ioc3RyKSk7Cn0KaWYgKHR5cGVvZiBQcm9taXNlLnRyeSAhPT0gImZ1bmN0aW9uIikgewogIFByb21pc2UudHJ5ID0gZnVuY3Rpb24gKGZuLCAuLi5hcmdzKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7CiAgICAgIHJlc29sdmUoZm4oLi4uYXJncykpOwogICAgfSk7CiAgfTsKfQppZiAodHlwZW9mIE1hdGguc3VtUHJlY2lzZSAhPT0gImZ1bmN0aW9uIikgewogIE1hdGguc3VtUHJlY2lzZSA9IGZ1bmN0aW9uIChudW1iZXJzKSB7CiAgICByZXR1cm4gbnVtYmVycy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTsKICB9Owp9Cgo7Ly8gLi9zcmMvY29yZS9wcmltaXRpdmVzLmpzCgpjb25zdCBDSVJDVUxBUl9SRUYgPSBTeW1ib2woIkNJUkNVTEFSX1JFRiIpOwpjb25zdCBFT0YgPSBTeW1ib2woIkVPRiIpOwpsZXQgQ21kQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpsZXQgTmFtZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKbGV0IFJlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKZnVuY3Rpb24gY2xlYXJQcmltaXRpdmVDYWNoZXMoKSB7CiAgQ21kQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIE5hbWVDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgUmVmQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwp9CmNsYXNzIE5hbWUgewogIGNvbnN0cnVjdG9yKG5hbWUpIHsKICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgfQogIHN0YXRpYyBnZXQobmFtZSkgewogICAgcmV0dXJuIE5hbWVDYWNoZVtuYW1lXSB8fD0gbmV3IE5hbWUobmFtZSk7CiAgfQp9CmNsYXNzIENtZCB7CiAgY29uc3RydWN0b3IoY21kKSB7CiAgICB0aGlzLmNtZCA9IGNtZDsKICB9CiAgc3RhdGljIGdldChjbWQpIHsKICAgIHJldHVybiBDbWRDYWNoZVtjbWRdIHx8PSBuZXcgQ21kKGNtZCk7CiAgfQp9CmNvbnN0IG5vblNlcmlhbGl6YWJsZSA9IGZ1bmN0aW9uIG5vblNlcmlhbGl6YWJsZUNsb3N1cmUoKSB7CiAgcmV0dXJuIG5vblNlcmlhbGl6YWJsZTsKfTsKY2xhc3MgRGljdCB7CiAgY29uc3RydWN0b3IoeHJlZiA9IG51bGwpIHsKICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLm9iaklkID0gbnVsbDsKICAgIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2U7CiAgICB0aGlzLl9fbm9uU2VyaWFsaXphYmxlX18gPSBub25TZXJpYWxpemFibGU7CiAgfQogIGFzc2lnblhyZWYobmV3WHJlZikgewogICAgdGhpcy54cmVmID0gbmV3WHJlZjsKICB9CiAgZ2V0IHNpemUoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLnNpemU7CiAgfQogIGdldChrZXkxLCBrZXkyLCBrZXkzKSB7CiAgICBsZXQgdmFsdWUgPSB0aGlzLl9tYXAuZ2V0KGtleTEpOwogICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkyKTsKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXAuZ2V0KGtleTMpOwogICAgICB9CiAgICB9CiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWYgJiYgdGhpcy54cmVmKSB7CiAgICAgIHJldHVybiB0aGlzLnhyZWYuZmV0Y2godmFsdWUsIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CiAgYXN5bmMgZ2V0QXN5bmMoa2V5MSwga2V5Miwga2V5MykgewogICAgbGV0IHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkxKTsKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTIgIT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuX21hcC5nZXQoa2V5Mik7CiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkzKTsKICAgICAgfQogICAgfQogICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmICYmIHRoaXMueHJlZikgewogICAgICByZXR1cm4gdGhpcy54cmVmLmZldGNoQXN5bmModmFsdWUsIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CiAgZ2V0QXJyYXkoa2V5MSwga2V5Miwga2V5MykgewogICAgbGV0IHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkxKTsKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTIgIT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuX21hcC5nZXQoa2V5Mik7CiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkzKTsKICAgICAgfQogICAgfQogICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmICYmIHRoaXMueHJlZikgewogICAgICB2YWx1ZSA9IHRoaXMueHJlZi5mZXRjaCh2YWx1ZSwgdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfQogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoKTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdmFsdWUubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGlmICh2YWx1ZVtpXSBpbnN0YW5jZW9mIFJlZiAmJiB0aGlzLnhyZWYpIHsKICAgICAgICAgIHZhbHVlW2ldID0gdGhpcy54cmVmLmZldGNoKHZhbHVlW2ldLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQogIGdldFJhdyhrZXkpIHsKICAgIHJldHVybiB0aGlzLl9tYXAuZ2V0KGtleSk7CiAgfQogIGdldEtleXMoKSB7CiAgICByZXR1cm4gWy4uLnRoaXMuX21hcC5rZXlzKCldOwogIH0KICBnZXRSYXdWYWx1ZXMoKSB7CiAgICByZXR1cm4gWy4uLnRoaXMuX21hcC52YWx1ZXMoKV07CiAgfQogIHNldChrZXksIHZhbHVlKSB7CiAgICB0aGlzLl9tYXAuc2V0KGtleSwgdmFsdWUpOwogIH0KICBoYXMoa2V5KSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLmhhcyhrZXkpOwogIH0KICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9tYXApIHsKICAgICAgeWllbGQgW2tleSwgdmFsdWUgaW5zdGFuY2VvZiBSZWYgJiYgdGhpcy54cmVmID8gdGhpcy54cmVmLmZldGNoKHZhbHVlLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbikgOiB2YWx1ZV07CiAgICB9CiAgfQogIHN0YXRpYyBnZXQgZW1wdHkoKSB7CiAgICBjb25zdCBlbXB0eURpY3QgPSBuZXcgRGljdChudWxsKTsKICAgIGVtcHR5RGljdC5zZXQgPSAoa2V5LCB2YWx1ZSkgPT4gewogICAgICB1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIGBzZXRgIG9uIHRoZSBlbXB0eSBkaWN0aW9uYXJ5LiIpOwogICAgfTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImVtcHR5IiwgZW1wdHlEaWN0KTsKICB9CiAgc3RhdGljIG1lcmdlKHsKICAgIHhyZWYsCiAgICBkaWN0QXJyYXksCiAgICBtZXJnZVN1YkRpY3RzID0gZmFsc2UKICB9KSB7CiAgICBjb25zdCBtZXJnZWREaWN0ID0gbmV3IERpY3QoeHJlZiksCiAgICAgIHByb3BlcnRpZXMgPSBuZXcgTWFwKCk7CiAgICBmb3IgKGNvbnN0IGRpY3Qgb2YgZGljdEFycmF5KSB7CiAgICAgIGlmICghKGRpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGRpY3QuX21hcCkgewogICAgICAgIGxldCBwcm9wZXJ0eSA9IHByb3BlcnRpZXMuZ2V0KGtleSk7CiAgICAgICAgaWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHByb3BlcnR5ID0gW107CiAgICAgICAgICBwcm9wZXJ0aWVzLnNldChrZXksIHByb3BlcnR5KTsKICAgICAgICB9IGVsc2UgaWYgKCFtZXJnZVN1YkRpY3RzIHx8ICEodmFsdWUgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHByb3BlcnR5LnB1c2godmFsdWUpOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZXNdIG9mIHByb3BlcnRpZXMpIHsKICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDEgfHwgISh2YWx1ZXNbMF0gaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIG1lcmdlZERpY3QuX21hcC5zZXQobmFtZSwgdmFsdWVzWzBdKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBzdWJEaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGZvciAoY29uc3QgZGljdCBvZiB2YWx1ZXMpIHsKICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkaWN0Ll9tYXApIHsKICAgICAgICAgIGlmICghc3ViRGljdC5fbWFwLmhhcyhrZXkpKSB7CiAgICAgICAgICAgIHN1YkRpY3QuX21hcC5zZXQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdWJEaWN0LnNpemUgPiAwKSB7CiAgICAgICAgbWVyZ2VkRGljdC5fbWFwLnNldChuYW1lLCBzdWJEaWN0KTsKICAgICAgfQogICAgfQogICAgcHJvcGVydGllcy5jbGVhcigpOwogICAgcmV0dXJuIG1lcmdlZERpY3Quc2l6ZSA+IDAgPyBtZXJnZWREaWN0IDogRGljdC5lbXB0eTsKICB9CiAgY2xvbmUoKSB7CiAgICBjb25zdCBkaWN0ID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuZ2V0S2V5cygpKSB7CiAgICAgIGRpY3Quc2V0KGtleSwgdGhpcy5nZXRSYXcoa2V5KSk7CiAgICB9CiAgICByZXR1cm4gZGljdDsKICB9CiAgZGVsZXRlKGtleSkgewogICAgZGVsZXRlIHRoaXMuX21hcFtrZXldOwogIH0KfQpjbGFzcyBSZWYgewogIGNvbnN0cnVjdG9yKG51bSwgZ2VuKSB7CiAgICB0aGlzLm51bSA9IG51bTsKICAgIHRoaXMuZ2VuID0gZ2VuOwogIH0KICB0b1N0cmluZygpIHsKICAgIGlmICh0aGlzLmdlbiA9PT0gMCkgewogICAgICByZXR1cm4gYCR7dGhpcy5udW19UmA7CiAgICB9CiAgICByZXR1cm4gYCR7dGhpcy5udW19UiR7dGhpcy5nZW59YDsKICB9CiAgc3RhdGljIGZyb21TdHJpbmcoc3RyKSB7CiAgICBjb25zdCByZWYgPSBSZWZDYWNoZVtzdHJdOwogICAgaWYgKHJlZikgewogICAgICByZXR1cm4gcmVmOwogICAgfQogICAgY29uc3QgbSA9IC9eKFxkKylSKFxkKikkLy5leGVjKHN0cik7CiAgICBpZiAoIW0gfHwgbVsxXSA9PT0gIjAiKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIFJlZkNhY2hlW3N0cl0gPSBuZXcgUmVmKHBhcnNlSW50KG1bMV0pLCAhbVsyXSA/IDAgOiBwYXJzZUludChtWzJdKSk7CiAgfQogIHN0YXRpYyBnZXQobnVtLCBnZW4pIHsKICAgIGNvbnN0IGtleSA9IGdlbiA9PT0gMCA/IGAke251bX1SYCA6IGAke251bX1SJHtnZW59YDsKICAgIHJldHVybiBSZWZDYWNoZVtrZXldIHx8PSBuZXcgUmVmKG51bSwgZ2VuKTsKICB9Cn0KY2xhc3MgUmVmU2V0IHsKICBjb25zdHJ1Y3RvcihwYXJlbnQgPSBudWxsKSB7CiAgICB0aGlzLl9zZXQgPSBuZXcgU2V0KHBhcmVudD8uX3NldCk7CiAgfQogIGhhcyhyZWYpIHsKICAgIHJldHVybiB0aGlzLl9zZXQuaGFzKHJlZi50b1N0cmluZygpKTsKICB9CiAgcHV0KHJlZikgewogICAgdGhpcy5fc2V0LmFkZChyZWYudG9TdHJpbmcoKSk7CiAgfQogIHJlbW92ZShyZWYpIHsKICAgIHRoaXMuX3NldC5kZWxldGUocmVmLnRvU3RyaW5nKCkpOwogIH0KICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsKICAgIHJldHVybiB0aGlzLl9zZXQudmFsdWVzKCk7CiAgfQogIGNsZWFyKCkgewogICAgdGhpcy5fc2V0LmNsZWFyKCk7CiAgfQp9CmNsYXNzIFJlZlNldENhY2hlIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKICB9CiAgZ2V0IHNpemUoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLnNpemU7CiAgfQogIGdldChyZWYpIHsKICAgIHJldHVybiB0aGlzLl9tYXAuZ2V0KHJlZi50b1N0cmluZygpKTsKICB9CiAgaGFzKHJlZikgewogICAgcmV0dXJuIHRoaXMuX21hcC5oYXMocmVmLnRvU3RyaW5nKCkpOwogIH0KICBwdXQocmVmLCBvYmopIHsKICAgIHRoaXMuX21hcC5zZXQocmVmLnRvU3RyaW5nKCksIG9iaik7CiAgfQogIHB1dEFsaWFzKHJlZiwgYWxpYXNSZWYpIHsKICAgIHRoaXMuX21hcC5zZXQocmVmLnRvU3RyaW5nKCksIHRoaXMuZ2V0KGFsaWFzUmVmKSk7CiAgfQogIFtTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgcmV0dXJuIHRoaXMuX21hcC52YWx1ZXMoKTsKICB9CiAgY2xlYXIoKSB7CiAgICB0aGlzLl9tYXAuY2xlYXIoKTsKICB9CiAgKnZhbHVlcygpIHsKICAgIHlpZWxkKiB0aGlzLl9tYXAudmFsdWVzKCk7CiAgfQogICppdGVtcygpIHsKICAgIGZvciAoY29uc3QgW3JlZiwgdmFsdWVdIG9mIHRoaXMuX21hcCkgewogICAgICB5aWVsZCBbUmVmLmZyb21TdHJpbmcocmVmKSwgdmFsdWVdOwogICAgfQogIH0KfQpmdW5jdGlvbiBpc05hbWUodiwgbmFtZSkgewogIHJldHVybiB2IGluc3RhbmNlb2YgTmFtZSAmJiAobmFtZSA9PT0gdW5kZWZpbmVkIHx8IHYubmFtZSA9PT0gbmFtZSk7Cn0KZnVuY3Rpb24gaXNDbWQodiwgY21kKSB7CiAgcmV0dXJuIHYgaW5zdGFuY2VvZiBDbWQgJiYgKGNtZCA9PT0gdW5kZWZpbmVkIHx8IHYuY21kID09PSBjbWQpOwp9CmZ1bmN0aW9uIGlzRGljdCh2LCB0eXBlKSB7CiAgcmV0dXJuIHYgaW5zdGFuY2VvZiBEaWN0ICYmICh0eXBlID09PSB1bmRlZmluZWQgfHwgaXNOYW1lKHYuZ2V0KCJUeXBlIiksIHR5cGUpKTsKfQpmdW5jdGlvbiBpc1JlZnNFcXVhbCh2MSwgdjIpIHsKICByZXR1cm4gdjEubnVtID09PSB2Mi5udW0gJiYgdjEuZ2VuID09PSB2Mi5nZW47Cn0KCjsvLyAuL3NyYy9jb3JlL2Jhc2Vfc3RyZWFtLmpzCgpjbGFzcyBCYXNlU3RyZWFtIHsKICBnZXQgbGVuZ3RoKCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IGdldHRlciBgbGVuZ3RoYCBhY2Nlc3NlZCIpOwogIH0KICBnZXQgaXNFbXB0eSgpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBnZXR0ZXIgYGlzRW1wdHlgIGFjY2Vzc2VkIik7CiAgfQogIGdldCBpc0RhdGFMb2FkZWQoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc0RhdGFMb2FkZWQiLCB0cnVlKTsKICB9CiAgZ2V0Qnl0ZSgpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVgIGNhbGxlZCIpOwogIH0KICBnZXRCeXRlcyhsZW5ndGgpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVzYCBjYWxsZWQiKTsKICB9CiAgYXN5bmMgZ2V0SW1hZ2VEYXRhKGxlbmd0aCwgZGVjb2Rlck9wdGlvbnMpIHsKICAgIHJldHVybiB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZGVjb2Rlck9wdGlvbnMpOwogIH0KICBhc3luYyBhc3luY0dldEJ5dGVzKCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgYXN5bmNHZXRCeXRlc2AgY2FsbGVkIik7CiAgfQogIGdldCBpc0FzeW5jKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBnZXQgaXNBc3luY0RlY29kZXIoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGdldCBjYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlcigpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgZ2V0VHJhbnNmZXJhYmxlSW1hZ2UoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcGVla0J5dGUoKSB7CiAgICBjb25zdCBwZWVrZWRCeXRlID0gdGhpcy5nZXRCeXRlKCk7CiAgICBpZiAocGVla2VkQnl0ZSAhPT0gLTEpIHsKICAgICAgdGhpcy5wb3MtLTsKICAgIH0KICAgIHJldHVybiBwZWVrZWRCeXRlOwogIH0KICBwZWVrQnl0ZXMobGVuZ3RoKSB7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuZ2V0Qnl0ZXMobGVuZ3RoKTsKICAgIHRoaXMucG9zIC09IGJ5dGVzLmxlbmd0aDsKICAgIHJldHVybiBieXRlczsKICB9CiAgZ2V0VWludDE2KCkgewogICAgY29uc3QgYjAgPSB0aGlzLmdldEJ5dGUoKTsKICAgIGNvbnN0IGIxID0gdGhpcy5nZXRCeXRlKCk7CiAgICBpZiAoYjAgPT09IC0xIHx8IGIxID09PSAtMSkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7CiAgfQogIGdldEludDMyKCkgewogICAgY29uc3QgYjAgPSB0aGlzLmdldEJ5dGUoKTsKICAgIGNvbnN0IGIxID0gdGhpcy5nZXRCeXRlKCk7CiAgICBjb25zdCBiMiA9IHRoaXMuZ2V0Qnl0ZSgpOwogICAgY29uc3QgYjMgPSB0aGlzLmdldEJ5dGUoKTsKICAgIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzOwogIH0KICBnZXRCeXRlUmFuZ2UoYmVnaW4sIGVuZCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZ2V0Qnl0ZVJhbmdlYCBjYWxsZWQiKTsKICB9CiAgZ2V0U3RyaW5nKGxlbmd0aCkgewogICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcodGhpcy5nZXRCeXRlcyhsZW5ndGgpKTsKICB9CiAgc2tpcChuKSB7CiAgICB0aGlzLnBvcyArPSBuIHx8IDE7CiAgfQogIHJlc2V0KCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgcmVzZXRgIGNhbGxlZCIpOwogIH0KICBtb3ZlU3RhcnQoKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBtb3ZlU3RhcnRgIGNhbGxlZCIpOwogIH0KICBtYWtlU3ViU3RyZWFtKHN0YXJ0LCBsZW5ndGgsIGRpY3QgPSBudWxsKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBtYWtlU3ViU3RyZWFtYCBjYWxsZWQiKTsKICB9CiAgZ2V0QmFzZVN0cmVhbXMoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NvcmVfdXRpbHMuanMKCgoKY29uc3QgUERGX1ZFUlNJT05fUkVHRVhQID0gL15bMS05XVwuXGQkLzsKY29uc3QgTUFYX0lOVF8zMiA9IDIgKiogMzEgLSAxOwpjb25zdCBNSU5fSU5UXzMyID0gLSgyICoqIDMxKTsKZnVuY3Rpb24gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGluaXRpYWxpemVyKSB7CiAgbGV0IGxvb2t1cDsKICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgaWYgKGluaXRpYWxpemVyKSB7CiAgICAgIGxvb2t1cCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGluaXRpYWxpemVyKGxvb2t1cCk7CiAgICAgIGluaXRpYWxpemVyID0gbnVsbDsKICAgIH0KICAgIHJldHVybiBsb29rdXA7CiAgfTsKfQpjbGFzcyBNaXNzaW5nRGF0YUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKGJlZ2luLCBlbmQpIHsKICAgIHN1cGVyKGBNaXNzaW5nIGRhdGEgWyR7YmVnaW59LCAke2VuZH0pYCwgIk1pc3NpbmdEYXRhRXhjZXB0aW9uIik7CiAgICB0aGlzLmJlZ2luID0gYmVnaW47CiAgICB0aGlzLmVuZCA9IGVuZDsKICB9Cn0KY2xhc3MgUGFyc2VyRU9GRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJQYXJzZXJFT0ZFeGNlcHRpb24iKTsKICB9Cn0KY2xhc3MgWFJlZkVudHJ5RXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJYUmVmRW50cnlFeGNlcHRpb24iKTsKICB9Cn0KY2xhc3MgWFJlZlBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJYUmVmUGFyc2VFeGNlcHRpb24iKTsKICB9Cn0KZnVuY3Rpb24gYXJyYXlCdWZmZXJzVG9CeXRlcyhhcnIpIHsKICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoOwogIGlmIChsZW5ndGggPT09IDApIHsKICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTsKICB9CiAgaWYgKGxlbmd0aCA9PT0gMSkgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGFyclswXSk7CiAgfQogIGxldCBkYXRhTGVuZ3RoID0gMDsKICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBkYXRhTGVuZ3RoICs9IGFycltpXS5ieXRlTGVuZ3RoOwogIH0KICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YUxlbmd0aCk7CiAgbGV0IHBvcyA9IDA7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgY29uc3QgaXRlbSA9IG5ldyBVaW50OEFycmF5KGFycltpXSk7CiAgICBkYXRhLnNldChpdGVtLCBwb3MpOwogICAgcG9zICs9IGl0ZW0uYnl0ZUxlbmd0aDsKICB9CiAgcmV0dXJuIGRhdGE7Cn0KYXN5bmMgZnVuY3Rpb24gZmV0Y2hCaW5hcnlEYXRhKHVybCkgewogIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTsKICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBmaWxlICIke3VybH0iIHdpdGggIiR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0iLmApOwogIH0KICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7Cn0KZnVuY3Rpb24gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgZGljdCwKICBrZXksCiAgZ2V0QXJyYXkgPSBmYWxzZSwKICBzdG9wV2hlbkZvdW5kID0gdHJ1ZQp9KSB7CiAgbGV0IHZhbHVlczsKICBjb25zdCB2aXNpdGVkID0gbmV3IFJlZlNldCgpOwogIHdoaWxlIChkaWN0IGluc3RhbmNlb2YgRGljdCAmJiAhKGRpY3Qub2JqSWQgJiYgdmlzaXRlZC5oYXMoZGljdC5vYmpJZCkpKSB7CiAgICBpZiAoZGljdC5vYmpJZCkgewogICAgICB2aXNpdGVkLnB1dChkaWN0Lm9iaklkKTsKICAgIH0KICAgIGNvbnN0IHZhbHVlID0gZ2V0QXJyYXkgPyBkaWN0LmdldEFycmF5KGtleSkgOiBkaWN0LmdldChrZXkpOwogICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKHN0b3BXaGVuRm91bmQpIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KICAgICAgKHZhbHVlcyB8fD0gW10pLnB1c2godmFsdWUpOwogICAgfQogICAgZGljdCA9IGRpY3QuZ2V0KCJQYXJlbnQiKTsKICB9CiAgcmV0dXJuIHZhbHVlczsKfQpmdW5jdGlvbiBnZXRQYXJlbnRUb1VwZGF0ZShkaWN0LCByZWYsIHhyZWYpIHsKICBjb25zdCB2aXNpdGVkID0gbmV3IFJlZlNldCgpOwogIGNvbnN0IGZpcnN0RGljdCA9IGRpY3Q7CiAgY29uc3QgcmVzdWx0ID0gewogICAgZGljdDogbnVsbCwKICAgIHJlZjogbnVsbAogIH07CiAgd2hpbGUgKGRpY3QgaW5zdGFuY2VvZiBEaWN0ICYmICF2aXNpdGVkLmhhcyhyZWYpKSB7CiAgICB2aXNpdGVkLnB1dChyZWYpOwogICAgaWYgKGRpY3QuaGFzKCJUIikpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICByZWYgPSBkaWN0LmdldFJhdygiUGFyZW50Iik7CiAgICBpZiAoIShyZWYgaW5zdGFuY2VvZiBSZWYpKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBkaWN0ID0geHJlZi5mZXRjaChyZWYpOwogIH0KICBpZiAoZGljdCBpbnN0YW5jZW9mIERpY3QgJiYgZGljdCAhPT0gZmlyc3REaWN0KSB7CiAgICByZXN1bHQuZGljdCA9IGRpY3Q7CiAgICByZXN1bHQucmVmID0gcmVmOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmNvbnN0IFJPTUFOX05VTUJFUl9NQVAgPSBbIiIsICJDIiwgIkNDIiwgIkNDQyIsICJDRCIsICJEIiwgIkRDIiwgIkRDQyIsICJEQ0NDIiwgIkNNIiwgIiIsICJYIiwgIlhYIiwgIlhYWCIsICJYTCIsICJMIiwgIkxYIiwgIkxYWCIsICJMWFhYIiwgIlhDIiwgIiIsICJJIiwgIklJIiwgIklJSSIsICJJViIsICJWIiwgIlZJIiwgIlZJSSIsICJWSUlJIiwgIklYIl07CmZ1bmN0aW9uIHRvUm9tYW5OdW1lcmFscyhudW1iZXIsIGxvd2VyQ2FzZSA9IGZhbHNlKSB7CiAgYXNzZXJ0KE51bWJlci5pc0ludGVnZXIobnVtYmVyKSAmJiBudW1iZXIgPiAwLCAiVGhlIG51bWJlciBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLiIpOwogIGNvbnN0IHJvbWFuID0gIk0iLnJlcGVhdChudW1iZXIgLyAxMDAwIHwgMCkgKyBST01BTl9OVU1CRVJfTUFQW251bWJlciAlIDEwMDAgLyAxMDAgfCAwXSArIFJPTUFOX05VTUJFUl9NQVBbMTAgKyAobnVtYmVyICUgMTAwIC8gMTAgfCAwKV0gKyBST01BTl9OVU1CRVJfTUFQWzIwICsgbnVtYmVyICUgMTBdOwogIHJldHVybiBsb3dlckNhc2UgPyByb21hbi50b0xvd2VyQ2FzZSgpIDogcm9tYW47Cn0KZnVuY3Rpb24gbG9nMih4KSB7CiAgcmV0dXJuIHggPiAwID8gTWF0aC5jZWlsKE1hdGgubG9nMih4KSkgOiAwOwp9CmZ1bmN0aW9uIHJlYWRJbnQ4KGRhdGEsIG9mZnNldCkgewogIHJldHVybiBkYXRhW29mZnNldF0gPDwgMjQgPj4gMjQ7Cn0KZnVuY3Rpb24gcmVhZEludDE2KGRhdGEsIG9mZnNldCkgewogIHJldHVybiAoZGF0YVtvZmZzZXRdIDw8IDI0IHwgZGF0YVtvZmZzZXQgKyAxXSA8PCAxNikgPj4gMTY7Cn0KZnVuY3Rpb24gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpIHsKICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDggfCBkYXRhW29mZnNldCArIDFdOwp9CmZ1bmN0aW9uIHJlYWRVaW50MzIoZGF0YSwgb2Zmc2V0KSB7CiAgcmV0dXJuIChkYXRhW29mZnNldF0gPDwgMjQgfCBkYXRhW29mZnNldCArIDFdIDw8IDE2IHwgZGF0YVtvZmZzZXQgKyAyXSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAzXSkgPj4+IDA7Cn0KZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGNoKSB7CiAgcmV0dXJuIGNoID09PSAweDIwIHx8IGNoID09PSAweDA5IHx8IGNoID09PSAweDBkIHx8IGNoID09PSAweDBhOwp9CmZ1bmN0aW9uIGlzQm9vbGVhbkFycmF5KGFyciwgbGVuKSB7CiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKSAmJiAobGVuID09PSBudWxsIHx8IGFyci5sZW5ndGggPT09IGxlbikgJiYgYXJyLmV2ZXJ5KHggPT4gdHlwZW9mIHggPT09ICJib29sZWFuIik7Cn0KZnVuY3Rpb24gaXNOdW1iZXJBcnJheShhcnIsIGxlbikgewogIGlmIChBcnJheS5pc0FycmF5KGFycikpIHsKICAgIHJldHVybiAobGVuID09PSBudWxsIHx8IGFyci5sZW5ndGggPT09IGxlbikgJiYgYXJyLmV2ZXJ5KHggPT4gdHlwZW9mIHggPT09ICJudW1iZXIiKTsKICB9CiAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnIpICYmICEoYXJyIGluc3RhbmNlb2YgQmlnSW50NjRBcnJheSB8fCBhcnIgaW5zdGFuY2VvZiBCaWdVaW50NjRBcnJheSkgJiYgKGxlbiA9PT0gbnVsbCB8fCBhcnIubGVuZ3RoID09PSBsZW4pOwp9CmZ1bmN0aW9uIGxvb2t1cE1hdHJpeChhcnIsIGZhbGxiYWNrKSB7CiAgcmV0dXJuIGlzTnVtYmVyQXJyYXkoYXJyLCA2KSA/IGFyciA6IGZhbGxiYWNrOwp9CmZ1bmN0aW9uIGxvb2t1cFJlY3QoYXJyLCBmYWxsYmFjaykgewogIHJldHVybiBpc051bWJlckFycmF5KGFyciwgNCkgPyBhcnIgOiBmYWxsYmFjazsKfQpmdW5jdGlvbiBsb29rdXBOb3JtYWxSZWN0KGFyciwgZmFsbGJhY2spIHsKICByZXR1cm4gaXNOdW1iZXJBcnJheShhcnIsIDQpID8gVXRpbC5ub3JtYWxpemVSZWN0KGFycikgOiBmYWxsYmFjazsKfQpmdW5jdGlvbiBwYXJzZVhGQVBhdGgocGF0aCkgewogIGNvbnN0IHBvc2l0aW9uUGF0dGVybiA9IC8oLispXFsoXGQrKVxdJC87CiAgcmV0dXJuIHBhdGguc3BsaXQoIi4iKS5tYXAoY29tcG9uZW50ID0+IHsKICAgIGNvbnN0IG0gPSBjb21wb25lbnQubWF0Y2gocG9zaXRpb25QYXR0ZXJuKTsKICAgIGlmIChtKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgbmFtZTogbVsxXSwKICAgICAgICBwb3M6IHBhcnNlSW50KG1bMl0sIDEwKQogICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgbmFtZTogY29tcG9uZW50LAogICAgICBwb3M6IDAKICAgIH07CiAgfSk7Cn0KZnVuY3Rpb24gZXNjYXBlUERGTmFtZShzdHIpIHsKICBjb25zdCBidWZmZXIgPSBbXTsKICBsZXQgc3RhcnQgPSAwOwogIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7CiAgICBpZiAoY2hhciA8IDB4MjEgfHwgY2hhciA+IDB4N2UgfHwgY2hhciA9PT0gMHgyMyB8fCBjaGFyID09PSAweDI4IHx8IGNoYXIgPT09IDB4MjkgfHwgY2hhciA9PT0gMHgzYyB8fCBjaGFyID09PSAweDNlIHx8IGNoYXIgPT09IDB4NWIgfHwgY2hhciA9PT0gMHg1ZCB8fCBjaGFyID09PSAweDdiIHx8IGNoYXIgPT09IDB4N2QgfHwgY2hhciA9PT0gMHgyZiB8fCBjaGFyID09PSAweDI1KSB7CiAgICAgIGlmIChzdGFydCA8IGkpIHsKICAgICAgICBidWZmZXIucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7CiAgICAgIH0KICAgICAgYnVmZmVyLnB1c2goYCMke2NoYXIudG9TdHJpbmcoMTYpfWApOwogICAgICBzdGFydCA9IGkgKyAxOwogICAgfQogIH0KICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIHN0cjsKICB9CiAgaWYgKHN0YXJ0IDwgc3RyLmxlbmd0aCkgewogICAgYnVmZmVyLnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgc3RyLmxlbmd0aCkpOwogIH0KICByZXR1cm4gYnVmZmVyLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2VBbGwoLyhbKClcXFxuXHJdKS9nLCBtYXRjaCA9PiB7CiAgICBpZiAobWF0Y2ggPT09ICJcbiIpIHsKICAgICAgcmV0dXJuICJcXG4iOwogICAgfSBlbHNlIGlmIChtYXRjaCA9PT0gIlxyIikgewogICAgICByZXR1cm4gIlxcciI7CiAgICB9CiAgICByZXR1cm4gYFxcJHttYXRjaH1gOwogIH0pOwp9CmZ1bmN0aW9uIF9jb2xsZWN0SlMoZW50cnksIHhyZWYsIGxpc3QsIHBhcmVudHMpIHsKICBpZiAoIWVudHJ5KSB7CiAgICByZXR1cm47CiAgfQogIGxldCBwYXJlbnQgPSBudWxsOwogIGlmIChlbnRyeSBpbnN0YW5jZW9mIFJlZikgewogICAgaWYgKHBhcmVudHMuaGFzKGVudHJ5KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBwYXJlbnQgPSBlbnRyeTsKICAgIHBhcmVudHMucHV0KHBhcmVudCk7CiAgICBlbnRyeSA9IHhyZWYuZmV0Y2goZW50cnkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkpIHsKICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbnRyeSkgewogICAgICBfY29sbGVjdEpTKGVsZW1lbnQsIHhyZWYsIGxpc3QsIHBhcmVudHMpOwogICAgfQogIH0gZWxzZSBpZiAoZW50cnkgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBpZiAoaXNOYW1lKGVudHJ5LmdldCgiUyIpLCAiSmF2YVNjcmlwdCIpKSB7CiAgICAgIGNvbnN0IGpzID0gZW50cnkuZ2V0KCJKUyIpOwogICAgICBsZXQgY29kZTsKICAgICAgaWYgKGpzIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgIGNvZGUgPSBqcy5nZXRTdHJpbmcoKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YganMgPT09ICJzdHJpbmciKSB7CiAgICAgICAgY29kZSA9IGpzOwogICAgICB9CiAgICAgIGNvZGUgJiY9IHN0cmluZ1RvUERGU3RyaW5nKGNvZGUpLnJlcGxhY2VBbGwoIlx4MDAiLCAiIik7CiAgICAgIGlmIChjb2RlKSB7CiAgICAgICAgbGlzdC5wdXNoKGNvZGUpOwogICAgICB9CiAgICB9CiAgICBfY29sbGVjdEpTKGVudHJ5LmdldFJhdygiTmV4dCIpLCB4cmVmLCBsaXN0LCBwYXJlbnRzKTsKICB9CiAgaWYgKHBhcmVudCkgewogICAgcGFyZW50cy5yZW1vdmUocGFyZW50KTsKICB9Cn0KZnVuY3Rpb24gY29sbGVjdEFjdGlvbnMoeHJlZiwgZGljdCwgZXZlbnRUeXBlKSB7CiAgY29uc3QgYWN0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgY29uc3QgYWRkaXRpb25hbEFjdGlvbnNEaWN0cyA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgZGljdCwKICAgIGtleTogIkFBIiwKICAgIHN0b3BXaGVuRm91bmQ6IGZhbHNlCiAgfSk7CiAgaWYgKGFkZGl0aW9uYWxBY3Rpb25zRGljdHMpIHsKICAgIGZvciAobGV0IGkgPSBhZGRpdGlvbmFsQWN0aW9uc0RpY3RzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNvbnN0IGFkZGl0aW9uYWxBY3Rpb25zID0gYWRkaXRpb25hbEFjdGlvbnNEaWN0c1tpXTsKICAgICAgaWYgKCEoYWRkaXRpb25hbEFjdGlvbnMgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFkZGl0aW9uYWxBY3Rpb25zLmdldEtleXMoKSkgewogICAgICAgIGNvbnN0IGFjdGlvbiA9IGV2ZW50VHlwZVtrZXldOwogICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYWN0aW9uRGljdCA9IGFkZGl0aW9uYWxBY3Rpb25zLmdldFJhdyhrZXkpOwogICAgICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgUmVmU2V0KCk7CiAgICAgICAgY29uc3QgbGlzdCA9IFtdOwogICAgICAgIF9jb2xsZWN0SlMoYWN0aW9uRGljdCwgeHJlZiwgbGlzdCwgcGFyZW50cyk7CiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgYWN0aW9uc1thY3Rpb25dID0gbGlzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKGRpY3QuaGFzKCJBIikpIHsKICAgIGNvbnN0IGFjdGlvbkRpY3QgPSBkaWN0LmdldCgiQSIpOwogICAgY29uc3QgcGFyZW50cyA9IG5ldyBSZWZTZXQoKTsKICAgIGNvbnN0IGxpc3QgPSBbXTsKICAgIF9jb2xsZWN0SlMoYWN0aW9uRGljdCwgeHJlZiwgbGlzdCwgcGFyZW50cyk7CiAgICBpZiAobGlzdC5sZW5ndGggPiAwKSB7CiAgICAgIGFjdGlvbnMuQWN0aW9uID0gbGlzdDsKICAgIH0KICB9CiAgcmV0dXJuIG9iamVjdFNpemUoYWN0aW9ucykgPiAwID8gYWN0aW9ucyA6IG51bGw7Cn0KY29uc3QgWE1MRW50aXRpZXMgPSB7CiAgMHgzYzogIiZsdDsiLAogIDB4M2U6ICImZ3Q7IiwKICAweDI2OiAiJmFtcDsiLAogIDB4MjI6ICImcXVvdDsiLAogIDB4Mjc6ICImYXBvczsiCn07CmZ1bmN0aW9uKiBjb2RlUG9pbnRJdGVyKHN0cikgewogIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBjaGFyID0gc3RyLmNvZGVQb2ludEF0KGkpOwogICAgaWYgKGNoYXIgPiAweGQ3ZmYgJiYgKGNoYXIgPCAweGUwMDAgfHwgY2hhciA+IDB4ZmZmZCkpIHsKICAgICAgaSsrOwogICAgfQogICAgeWllbGQgY2hhcjsKICB9Cn0KZnVuY3Rpb24gZW5jb2RlVG9YbWxTdHJpbmcoc3RyKSB7CiAgY29uc3QgYnVmZmVyID0gW107CiAgbGV0IHN0YXJ0ID0gMDsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jb2RlUG9pbnRBdChpKTsKICAgIGlmICgweDIwIDw9IGNoYXIgJiYgY2hhciA8PSAweDdlKSB7CiAgICAgIGNvbnN0IGVudGl0eSA9IFhNTEVudGl0aWVzW2NoYXJdOwogICAgICBpZiAoZW50aXR5KSB7CiAgICAgICAgaWYgKHN0YXJ0IDwgaSkgewogICAgICAgICAgYnVmZmVyLnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgaSkpOwogICAgICAgIH0KICAgICAgICBidWZmZXIucHVzaChlbnRpdHkpOwogICAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChzdGFydCA8IGkpIHsKICAgICAgICBidWZmZXIucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7CiAgICAgIH0KICAgICAgYnVmZmVyLnB1c2goYCYjeCR7Y2hhci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX07YCk7CiAgICAgIGlmIChjaGFyID4gMHhkN2ZmICYmIChjaGFyIDwgMHhlMDAwIHx8IGNoYXIgPiAweGZmZmQpKSB7CiAgICAgICAgaSsrOwogICAgICB9CiAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICB9CiAgfQogIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gc3RyOwogIH0KICBpZiAoc3RhcnQgPCBzdHIubGVuZ3RoKSB7CiAgICBidWZmZXIucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBzdHIubGVuZ3RoKSk7CiAgfQogIHJldHVybiBidWZmZXIuam9pbigiIik7Cn0KZnVuY3Rpb24gdmFsaWRhdGVGb250TmFtZShmb250RmFtaWx5LCBtdXN0V2FybiA9IGZhbHNlKSB7CiAgY29uc3QgbSA9IC9eKCJ8JykuKigifCcpJC8uZXhlYyhmb250RmFtaWx5KTsKICBpZiAobSAmJiBtWzFdID09PSBtWzJdKSB7CiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYFteXFxcXF0ke21bMV19YCk7CiAgICBpZiAocmUudGVzdChmb250RmFtaWx5LnNsaWNlKDEsIC0xKSkpIHsKICAgICAgaWYgKG11c3RXYXJuKSB7CiAgICAgICAgd2FybihgRm9udEZhbWlseSBjb250YWlucyB1bmVzY2FwZWQgJHttWzFdfTogJHtmb250RmFtaWx5fS5gKTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAoY29uc3QgaWRlbnQgb2YgZm9udEZhbWlseS5zcGxpdCgvWyBcdF0rLykpIHsKICAgICAgaWYgKC9eKFxkfCgtKFxkfC0pKSkvLnRlc3QoaWRlbnQpIHx8ICEvXltcdy1cXF0rJC8udGVzdChpZGVudCkpIHsKICAgICAgICBpZiAobXVzdFdhcm4pIHsKICAgICAgICAgIHdhcm4oYEZvbnRGYW1pbHkgY29udGFpbnMgaW52YWxpZCA8Y3VzdG9tLWlkZW50PjogJHtmb250RmFtaWx5fS5gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIHZhbGlkYXRlQ1NTRm9udChjc3NGb250SW5mbykgewogIGNvbnN0IERFRkFVTFRfQ1NTX0ZPTlRfT0JMSVFVRSA9ICIxNCI7CiAgY29uc3QgREVGQVVMVF9DU1NfRk9OVF9XRUlHSFQgPSAiNDAwIjsKICBjb25zdCBDU1NfRk9OVF9XRUlHSFRfVkFMVUVTID0gbmV3IFNldChbIjEwMCIsICIyMDAiLCAiMzAwIiwgIjQwMCIsICI1MDAiLCAiNjAwIiwgIjcwMCIsICI4MDAiLCAiOTAwIiwgIjEwMDAiLCAibm9ybWFsIiwgImJvbGQiLCAiYm9sZGVyIiwgImxpZ2h0ZXIiXSk7CiAgY29uc3QgewogICAgZm9udEZhbWlseSwKICAgIGZvbnRXZWlnaHQsCiAgICBpdGFsaWNBbmdsZQogIH0gPSBjc3NGb250SW5mbzsKICBpZiAoIXZhbGlkYXRlRm9udE5hbWUoZm9udEZhbWlseSwgdHJ1ZSkpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgY29uc3Qgd2VpZ2h0ID0gZm9udFdlaWdodCA/IGZvbnRXZWlnaHQudG9TdHJpbmcoKSA6ICIiOwogIGNzc0ZvbnRJbmZvLmZvbnRXZWlnaHQgPSBDU1NfRk9OVF9XRUlHSFRfVkFMVUVTLmhhcyh3ZWlnaHQpID8gd2VpZ2h0IDogREVGQVVMVF9DU1NfRk9OVF9XRUlHSFQ7CiAgY29uc3QgYW5nbGUgPSBwYXJzZUZsb2F0KGl0YWxpY0FuZ2xlKTsKICBjc3NGb250SW5mby5pdGFsaWNBbmdsZSA9IGlzTmFOKGFuZ2xlKSB8fCBhbmdsZSA8IC05MCB8fCBhbmdsZSA+IDkwID8gREVGQVVMVF9DU1NfRk9OVF9PQkxJUVVFIDogaXRhbGljQW5nbGUudG9TdHJpbmcoKTsKICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiByZWNvdmVySnNVUkwoc3RyKSB7CiAgY29uc3QgVVJMX09QRU5fTUVUSE9EUyA9IFsiYXBwLmxhdW5jaFVSTCIsICJ3aW5kb3cub3BlbiIsICJ4ZmEuaG9zdC5nb3RvVVJMIl07CiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKCJeXFxzKigiICsgVVJMX09QRU5fTUVUSE9EUy5qb2luKCJ8IikucmVwbGFjZUFsbCgiLiIsICJcXC4iKSArICIpXFwoKD86J3xcIikoW14nXCJdKikoPzonfFwiKSg/OixcXHMqKFxcdyspXFwpfFxcKSkiLCAiaSIpOwogIGNvbnN0IGpzVXJsID0gcmVnZXguZXhlYyhzdHIpOwogIGlmIChqc1VybD8uWzJdKSB7CiAgICByZXR1cm4gewogICAgICB1cmw6IGpzVXJsWzJdLAogICAgICBuZXdXaW5kb3c6IGpzVXJsWzFdID09PSAiYXBwLmxhdW5jaFVSTCIgJiYganNVcmxbM10gPT09ICJ0cnVlIgogICAgfTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KZnVuY3Rpb24gbnVtYmVyVG9TdHJpbmcodmFsdWUpIHsKICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwogIH0KICBjb25zdCByb3VuZGVkVmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlICogMTAwKTsKICBpZiAocm91bmRlZFZhbHVlICUgMTAwID09PSAwKSB7CiAgICByZXR1cm4gKHJvdW5kZWRWYWx1ZSAvIDEwMCkudG9TdHJpbmcoKTsKICB9CiAgaWYgKHJvdW5kZWRWYWx1ZSAlIDEwID09PSAwKSB7CiAgICByZXR1cm4gdmFsdWUudG9GaXhlZCgxKTsKICB9CiAgcmV0dXJuIHZhbHVlLnRvRml4ZWQoMik7Cn0KZnVuY3Rpb24gZ2V0TmV3QW5ub3RhdGlvbnNNYXAoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICBpZiAoIWFubm90YXRpb25TdG9yYWdlKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgbmV3QW5ub3RhdGlvbnNCeVBhZ2UgPSBuZXcgTWFwKCk7CiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoQW5ub3RhdGlvbkVkaXRvclByZWZpeCkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBsZXQgYW5ub3RhdGlvbnMgPSBuZXdBbm5vdGF0aW9uc0J5UGFnZS5nZXQodmFsdWUucGFnZUluZGV4KTsKICAgIGlmICghYW5ub3RhdGlvbnMpIHsKICAgICAgYW5ub3RhdGlvbnMgPSBbXTsKICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2Uuc2V0KHZhbHVlLnBhZ2VJbmRleCwgYW5ub3RhdGlvbnMpOwogICAgfQogICAgYW5ub3RhdGlvbnMucHVzaCh2YWx1ZSk7CiAgfQogIHJldHVybiBuZXdBbm5vdGF0aW9uc0J5UGFnZS5zaXplID4gMCA/IG5ld0Fubm90YXRpb25zQnlQYWdlIDogbnVsbDsKfQpmdW5jdGlvbiBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKHN0cikgewogIHJldHVybiBpc0FzY2lpKHN0cikgPyBzdHIgOiBzdHJpbmdUb1VURjE2U3RyaW5nKHN0ciwgdHJ1ZSk7Cn0KZnVuY3Rpb24gaXNBc2NpaShzdHIpIHsKICByZXR1cm4gL15bXHgwMC1ceDdGXSokLy50ZXN0KHN0cik7Cn0KZnVuY3Rpb24gc3RyaW5nVG9VVEYxNkhleFN0cmluZyhzdHIpIHsKICBjb25zdCBidWYgPSBbXTsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgYnVmLnB1c2goaGV4TnVtYmVyc1tjaGFyID4+IDggJiAweGZmXSwgaGV4TnVtYmVyc1tjaGFyICYgMHhmZl0pOwogIH0KICByZXR1cm4gYnVmLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIHN0cmluZ1RvVVRGMTZTdHJpbmcoc3RyLCBiaWdFbmRpYW4gPSBmYWxzZSkgewogIGNvbnN0IGJ1ZiA9IFtdOwogIGlmIChiaWdFbmRpYW4pIHsKICAgIGJ1Zi5wdXNoKCJceEZFXHhGRiIpOwogIH0KICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgYnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyID4+IDggJiAweGZmKSwgU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyICYgMHhmZikpOwogIH0KICByZXR1cm4gYnVmLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIGdldFJvdGF0aW9uTWF0cml4KHJvdGF0aW9uLCB3aWR0aCwgaGVpZ2h0KSB7CiAgc3dpdGNoIChyb3RhdGlvbikgewogICAgY2FzZSA5MDoKICAgICAgcmV0dXJuIFswLCAxLCAtMSwgMCwgd2lkdGgsIDBdOwogICAgY2FzZSAxODA6CiAgICAgIHJldHVybiBbLTEsIDAsIDAsIC0xLCB3aWR0aCwgaGVpZ2h0XTsKICAgIGNhc2UgMjcwOgogICAgICByZXR1cm4gWzAsIC0xLCAxLCAwLCAwLCBoZWlnaHRdOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHJvdGF0aW9uIik7CiAgfQp9CmZ1bmN0aW9uIGdldFNpemVJbkJ5dGVzKHgpIHsKICByZXR1cm4gTWF0aC5jZWlsKE1hdGguY2VpbChNYXRoLmxvZzIoMSArIHgpKSAvIDgpOwp9Cgo7Ly8gLi9leHRlcm5hbC9xY21zL3FjbXNfdXRpbHMuanMKY2xhc3MgUUNNUyB7CiAgc3RhdGljIF9tb2R1bGUgPSBudWxsOwogIHN0YXRpYyBfbXVzdEFkZEFscGhhID0gZmFsc2U7CiAgc3RhdGljIF9kZXN0QnVmZmVyID0gbnVsbDsKfQpmdW5jdGlvbiBjb3B5X3Jlc3VsdChwdHIsIGxlbikgewogIGNvbnN0IHsKICAgIF9tb2R1bGUsCiAgICBfbXVzdEFkZEFscGhhLAogICAgX2Rlc3RCdWZmZXIKICB9ID0gUUNNUzsKICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShfbW9kdWxlLm1lbW9yeS5idWZmZXIsIHB0ciwgbGVuKTsKICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gX2Rlc3RCdWZmZXIubGVuZ3RoKSB7CiAgICBfZGVzdEJ1ZmZlci5zZXQocmVzdWx0KTsKICAgIHJldHVybjsKICB9CiAgaWYgKF9tdXN0QWRkQWxwaGEpIHsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSByZXN1bHQubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMywgaiArPSA0KSB7CiAgICAgIF9kZXN0QnVmZmVyW2pdID0gcmVzdWx0W2ldOwogICAgICBfZGVzdEJ1ZmZlcltqICsgMV0gPSByZXN1bHRbaSArIDFdOwogICAgICBfZGVzdEJ1ZmZlcltqICsgMl0gPSByZXN1bHRbaSArIDJdOwogICAgICBfZGVzdEJ1ZmZlcltqICsgM10gPSAyNTU7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSByZXN1bHQubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMywgaiArPSA0KSB7CiAgICAgIF9kZXN0QnVmZmVyW2pdID0gcmVzdWx0W2ldOwogICAgICBfZGVzdEJ1ZmZlcltqICsgMV0gPSByZXN1bHRbaSArIDFdOwogICAgICBfZGVzdEJ1ZmZlcltqICsgMl0gPSByZXN1bHRbaSArIDJdOwogICAgfQogIH0KfQpmdW5jdGlvbiBjb3B5X3JnYihwdHIpIHsKICBRQ01TLl9kZXN0QnVmZmVyLnNldChuZXcgVWludDhBcnJheShRQ01TLl9tb2R1bGUubWVtb3J5LmJ1ZmZlciwgcHRyLCAzKSk7Cn0KCjsvLyAuL2V4dGVybmFsL3FjbXMvcWNtcy5qcwoKbGV0IHdhc207CmNvbnN0IGNhY2hlZFRleHREZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAndW5kZWZpbmVkJyA/IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnLCB7CiAgaWdub3JlQk9NOiB0cnVlLAogIGZhdGFsOiB0cnVlCn0pIDogewogIGRlY29kZTogKCkgPT4gewogICAgdGhyb3cgRXJyb3IoJ1RleHREZWNvZGVyIG5vdCBhdmFpbGFibGUnKTsKICB9Cn07CmlmICh0eXBlb2YgVGV4dERlY29kZXIgIT09ICd1bmRlZmluZWQnKSB7CiAgY2FjaGVkVGV4dERlY29kZXIuZGVjb2RlKCk7Cn0KOwpsZXQgY2FjaGVkVWludDhBcnJheU1lbW9yeTAgPSBudWxsOwpmdW5jdGlvbiBnZXRVaW50OEFycmF5TWVtb3J5MCgpIHsKICBpZiAoY2FjaGVkVWludDhBcnJheU1lbW9yeTAgPT09IG51bGwgfHwgY2FjaGVkVWludDhBcnJheU1lbW9yeTAuYnl0ZUxlbmd0aCA9PT0gMCkgewogICAgY2FjaGVkVWludDhBcnJheU1lbW9yeTAgPSBuZXcgVWludDhBcnJheSh3YXNtLm1lbW9yeS5idWZmZXIpOwogIH0KICByZXR1cm4gY2FjaGVkVWludDhBcnJheU1lbW9yeTA7Cn0KZnVuY3Rpb24gZ2V0U3RyaW5nRnJvbVdhc20wKHB0ciwgbGVuKSB7CiAgcHRyID0gcHRyID4+PiAwOwogIHJldHVybiBjYWNoZWRUZXh0RGVjb2Rlci5kZWNvZGUoZ2V0VWludDhBcnJheU1lbW9yeTAoKS5zdWJhcnJheShwdHIsIHB0ciArIGxlbikpOwp9CmxldCBXQVNNX1ZFQ1RPUl9MRU4gPSAwOwpmdW5jdGlvbiBwYXNzQXJyYXk4VG9XYXNtMChhcmcsIG1hbGxvYykgewogIGNvbnN0IHB0ciA9IG1hbGxvYyhhcmcubGVuZ3RoICogMSwgMSkgPj4+IDA7CiAgZ2V0VWludDhBcnJheU1lbW9yeTAoKS5zZXQoYXJnLCBwdHIgLyAxKTsKICBXQVNNX1ZFQ1RPUl9MRU4gPSBhcmcubGVuZ3RoOwogIHJldHVybiBwdHI7Cn0KZnVuY3Rpb24gcWNtc19jb252ZXJ0X2FycmF5KHRyYW5zZm9ybWVyLCBzcmMpIHsKICBjb25zdCBwdHIwID0gcGFzc0FycmF5OFRvV2FzbTAoc3JjLCB3YXNtLl9fd2JpbmRnZW5fbWFsbG9jKTsKICBjb25zdCBsZW4wID0gV0FTTV9WRUNUT1JfTEVOOwogIHdhc20ucWNtc19jb252ZXJ0X2FycmF5KHRyYW5zZm9ybWVyLCBwdHIwLCBsZW4wKTsKfQpmdW5jdGlvbiBxY21zX2NvbnZlcnRfb25lKHRyYW5zZm9ybWVyLCBzcmMpIHsKICB3YXNtLnFjbXNfY29udmVydF9vbmUodHJhbnNmb3JtZXIsIHNyYyk7Cn0KZnVuY3Rpb24gcWNtc19jb252ZXJ0X3RocmVlKHRyYW5zZm9ybWVyLCBzcmMxLCBzcmMyLCBzcmMzKSB7CiAgd2FzbS5xY21zX2NvbnZlcnRfdGhyZWUodHJhbnNmb3JtZXIsIHNyYzEsIHNyYzIsIHNyYzMpOwp9CmZ1bmN0aW9uIHFjbXNfY29udmVydF9mb3VyKHRyYW5zZm9ybWVyLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KSB7CiAgd2FzbS5xY21zX2NvbnZlcnRfZm91cih0cmFuc2Zvcm1lciwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Cn0KZnVuY3Rpb24gcWNtc190cmFuc2Zvcm1lcl9mcm9tX21lbW9yeShtZW0sIGluX3R5cGUsIGludGVudCkgewogIGNvbnN0IHB0cjAgPSBwYXNzQXJyYXk4VG9XYXNtMChtZW0sIHdhc20uX193YmluZGdlbl9tYWxsb2MpOwogIGNvbnN0IGxlbjAgPSBXQVNNX1ZFQ1RPUl9MRU47CiAgY29uc3QgcmV0ID0gd2FzbS5xY21zX3RyYW5zZm9ybWVyX2Zyb21fbWVtb3J5KHB0cjAsIGxlbjAsIGluX3R5cGUsIGludGVudCk7CiAgcmV0dXJuIHJldCA+Pj4gMDsKfQpmdW5jdGlvbiBxY21zX2Ryb3BfdHJhbnNmb3JtZXIodHJhbnNmb3JtZXIpIHsKICB3YXNtLnFjbXNfZHJvcF90cmFuc2Zvcm1lcih0cmFuc2Zvcm1lcik7Cn0KY29uc3QgRGF0YVR5cGUgPSBPYmplY3QuZnJlZXplKHsKICBSR0I4OiAwLAogICIwIjogIlJHQjgiLAogIFJHQkE4OiAxLAogICIxIjogIlJHQkE4IiwKICBCR1JBODogMiwKICAiMiI6ICJCR1JBOCIsCiAgR3JheTg6IDMsCiAgIjMiOiAiR3JheTgiLAogIEdyYXlBODogNCwKICAiNCI6ICJHcmF5QTgiLAogIENNWUs6IDUsCiAgIjUiOiAiQ01ZSyIKfSk7CmNvbnN0IEludGVudCA9IE9iamVjdC5mcmVlemUoewogIFBlcmNlcHR1YWw6IDAsCiAgIjAiOiAiUGVyY2VwdHVhbCIsCiAgUmVsYXRpdmVDb2xvcmltZXRyaWM6IDEsCiAgIjEiOiAiUmVsYXRpdmVDb2xvcmltZXRyaWMiLAogIFNhdHVyYXRpb246IDIsCiAgIjIiOiAiU2F0dXJhdGlvbiIsCiAgQWJzb2x1dGVDb2xvcmltZXRyaWM6IDMsCiAgIjMiOiAiQWJzb2x1dGVDb2xvcmltZXRyaWMiCn0pOwphc3luYyBmdW5jdGlvbiBfX3diZ19sb2FkKG1vZHVsZSwgaW1wb3J0cykgewogIGlmICh0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbicgJiYgbW9kdWxlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHsKICAgIGlmICh0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcobW9kdWxlLCBpbXBvcnRzKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChtb2R1bGUuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpICE9ICdhcHBsaWNhdGlvbi93YXNtJykgewogICAgICAgICAgY29uc29sZS53YXJuKCJgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmdgIGZhaWxlZCBiZWNhdXNlIHlvdXIgc2VydmVyIGRvZXMgbm90IHNlcnZlIFdhc20gd2l0aCBgYXBwbGljYXRpb24vd2FzbWAgTUlNRSB0eXBlLiBGYWxsaW5nIGJhY2sgdG8gYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlYCB3aGljaCBpcyBzbG93ZXIuIE9yaWdpbmFsIGVycm9yOlxuIiwgZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCBieXRlcyA9IGF3YWl0IG1vZHVsZS5hcnJheUJ1ZmZlcigpOwogICAgcmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJ5dGVzLCBpbXBvcnRzKTsKICB9IGVsc2UgewogICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShtb2R1bGUsIGltcG9ydHMpOwogICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuSW5zdGFuY2UpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBpbnN0YW5jZSwKICAgICAgICBtb2R1bGUKICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gX193YmdfZ2V0X2ltcG9ydHMoKSB7CiAgY29uc3QgaW1wb3J0cyA9IHt9OwogIGltcG9ydHMud2JnID0ge307CiAgaW1wb3J0cy53YmcuX193YmdfY29weXJlc3VsdF9iMDhlZTdkMjczZjI5NWRkID0gZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgIGNvcHlfcmVzdWx0KGFyZzAgPj4+IDAsIGFyZzEgPj4+IDApOwogIH07CiAgaW1wb3J0cy53YmcuX193YmdfY29weXJnYl9kNjBjZTE3YmIwNWQ5YjY3ID0gZnVuY3Rpb24gKGFyZzApIHsKICAgIGNvcHlfcmdiKGFyZzAgPj4+IDApOwogIH07CiAgaW1wb3J0cy53YmcuX193YmluZGdlbl9pbml0X2V4dGVybnJlZl90YWJsZSA9IGZ1bmN0aW9uICgpIHsKICAgIGNvbnN0IHRhYmxlID0gd2FzbS5fX3diaW5kZ2VuX2V4cG9ydF8wOwogICAgY29uc3Qgb2Zmc2V0ID0gdGFibGUuZ3Jvdyg0KTsKICAgIHRhYmxlLnNldCgwLCB1bmRlZmluZWQpOwogICAgdGFibGUuc2V0KG9mZnNldCArIDAsIHVuZGVmaW5lZCk7CiAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMSwgbnVsbCk7CiAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMiwgdHJ1ZSk7CiAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMywgZmFsc2UpOwogIH07CiAgaW1wb3J0cy53YmcuX193YmluZGdlbl90aHJvdyA9IGZ1bmN0aW9uIChhcmcwLCBhcmcxKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsIGFyZzEpKTsKICB9OwogIHJldHVybiBpbXBvcnRzOwp9CmZ1bmN0aW9uIF9fd2JnX2luaXRfbWVtb3J5KGltcG9ydHMsIG1lbW9yeSkge30KZnVuY3Rpb24gX193YmdfZmluYWxpemVfaW5pdChpbnN0YW5jZSwgbW9kdWxlKSB7CiAgd2FzbSA9IGluc3RhbmNlLmV4cG9ydHM7CiAgX193YmdfaW5pdC5fX3diaW5kZ2VuX3dhc21fbW9kdWxlID0gbW9kdWxlOwogIGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwID0gbnVsbDsKICB3YXNtLl9fd2JpbmRnZW5fc3RhcnQoKTsKICByZXR1cm4gd2FzbTsKfQpmdW5jdGlvbiBpbml0U3luYyhtb2R1bGUpIHsKICBpZiAod2FzbSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gd2FzbTsKICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kdWxlKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgewogICAgICAoewogICAgICAgIG1vZHVsZQogICAgICB9ID0gbW9kdWxlKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUud2FybigndXNpbmcgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzIGZvciBgaW5pdFN5bmMoKWA7IHBhc3MgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQnKTsKICAgIH0KICB9CiAgY29uc3QgaW1wb3J0cyA9IF9fd2JnX2dldF9pbXBvcnRzKCk7CiAgX193YmdfaW5pdF9tZW1vcnkoaW1wb3J0cyk7CiAgaWYgKCEobW9kdWxlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlKSkgewogICAgbW9kdWxlID0gbmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShtb2R1bGUpOwogIH0KICBjb25zdCBpbnN0YW5jZSA9IG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShtb2R1bGUsIGltcG9ydHMpOwogIHJldHVybiBfX3diZ19maW5hbGl6ZV9pbml0KGluc3RhbmNlLCBtb2R1bGUpOwp9CmFzeW5jIGZ1bmN0aW9uIF9fd2JnX2luaXQobW9kdWxlX29yX3BhdGgpIHsKICBpZiAod2FzbSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gd2FzbTsKICBpZiAodHlwZW9mIG1vZHVsZV9vcl9wYXRoICE9PSAndW5kZWZpbmVkJykgewogICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2R1bGVfb3JfcGF0aCkgPT09IE9iamVjdC5wcm90b3R5cGUpIHsKICAgICAgKHsKICAgICAgICBtb2R1bGVfb3JfcGF0aAogICAgICB9ID0gbW9kdWxlX29yX3BhdGgpOwogICAgfSBlbHNlIHsKICAgICAgY29uc29sZS53YXJuKCd1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnMgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbjsgcGFzcyBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCcpOwogICAgfQogIH0KICBpZiAodHlwZW9mIG1vZHVsZV9vcl9wYXRoID09PSAndW5kZWZpbmVkJykgewogICAgbW9kdWxlX29yX3BhdGggPSBuZXcgVVJMKCdxY21zX2JnLndhc20nLCBpbXBvcnQubWV0YS51cmwpOwogIH0KICBjb25zdCBpbXBvcnRzID0gX193YmdfZ2V0X2ltcG9ydHMoKTsKICBpZiAodHlwZW9mIG1vZHVsZV9vcl9wYXRoID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiBtb2R1bGVfb3JfcGF0aCBpbnN0YW5jZW9mIFJlcXVlc3QgfHwgdHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJyAmJiBtb2R1bGVfb3JfcGF0aCBpbnN0YW5jZW9mIFVSTCkgewogICAgbW9kdWxlX29yX3BhdGggPSBmZXRjaChtb2R1bGVfb3JfcGF0aCk7CiAgfQogIF9fd2JnX2luaXRfbWVtb3J5KGltcG9ydHMpOwogIGNvbnN0IHsKICAgIGluc3RhbmNlLAogICAgbW9kdWxlCiAgfSA9IGF3YWl0IF9fd2JnX2xvYWQoYXdhaXQgbW9kdWxlX29yX3BhdGgsIGltcG9ydHMpOwogIHJldHVybiBfX3diZ19maW5hbGl6ZV9pbml0KGluc3RhbmNlLCBtb2R1bGUpOwp9CgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIGNvbnN0IHFjbXMgPSAoKC8qIHVudXNlZCBwdXJlIGV4cHJlc3Npb24gb3Igc3VwZXIgKi8gbnVsbCAmJiAoX193YmdfaW5pdCkpKTsKOy8vIC4vc3JjL2NvcmUvY29sb3JzcGFjZS5qcwoKCmZ1bmN0aW9uIHJlc2l6ZVJnYkltYWdlKHNyYywgZGVzdCwgdzEsIGgxLCB3MiwgaDIsIGFscGhhMDEpIHsKICBjb25zdCBDT01QT05FTlRTID0gMzsKICBhbHBoYTAxID0gYWxwaGEwMSAhPT0gMSA/IDAgOiBhbHBoYTAxOwogIGNvbnN0IHhSYXRpbyA9IHcxIC8gdzI7CiAgY29uc3QgeVJhdGlvID0gaDEgLyBoMjsKICBsZXQgbmV3SW5kZXggPSAwLAogICAgb2xkSW5kZXg7CiAgY29uc3QgeFNjYWxlZCA9IG5ldyBVaW50MTZBcnJheSh3Mik7CiAgY29uc3QgdzFTY2FubGluZSA9IHcxICogQ09NUE9ORU5UUzsKICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgIHhTY2FsZWRbaV0gPSBNYXRoLmZsb29yKGkgKiB4UmF0aW8pICogQ09NUE9ORU5UUzsKICB9CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoMjsgaSsrKSB7CiAgICBjb25zdCBweSA9IE1hdGguZmxvb3IoaSAqIHlSYXRpbykgKiB3MVNjYW5saW5lOwogICAgZm9yIChsZXQgaiA9IDA7IGogPCB3MjsgaisrKSB7CiAgICAgIG9sZEluZGV4ID0gcHkgKyB4U2NhbGVkW2pdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBuZXdJbmRleCArPSBhbHBoYTAxOwogICAgfQogIH0KfQpmdW5jdGlvbiByZXNpemVSZ2JhSW1hZ2Uoc3JjLCBkZXN0LCB3MSwgaDEsIHcyLCBoMiwgYWxwaGEwMSkgewogIGNvbnN0IHhSYXRpbyA9IHcxIC8gdzI7CiAgY29uc3QgeVJhdGlvID0gaDEgLyBoMjsKICBsZXQgbmV3SW5kZXggPSAwOwogIGNvbnN0IHhTY2FsZWQgPSBuZXcgVWludDE2QXJyYXkodzIpOwogIGlmIChhbHBoYTAxID09PSAxKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbyk7CiAgICB9CiAgICBjb25zdCBzcmMzMiA9IG5ldyBVaW50MzJBcnJheShzcmMuYnVmZmVyKTsKICAgIGNvbnN0IGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlcik7CiAgICBjb25zdCByZ2JNYXNrID0gRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4gPyAweDAwZmZmZmZmIDogMHhmZmZmZmYwMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaDI7IGkrKykgewogICAgICBjb25zdCBidWYgPSBzcmMzMi5zdWJhcnJheShNYXRoLmZsb29yKGkgKiB5UmF0aW8pICogdzEpOwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHcyOyBqKyspIHsKICAgICAgICBkZXN0MzJbbmV3SW5kZXgrK10gfD0gYnVmW3hTY2FsZWRbal1dICYgcmdiTWFzazsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBjb25zdCBDT01QT05FTlRTID0gNDsKICAgIGNvbnN0IHcxU2NhbmxpbmUgPSB3MSAqIENPTVBPTkVOVFM7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbykgKiBDT01QT05FTlRTOwogICAgfQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoMjsgaSsrKSB7CiAgICAgIGNvbnN0IGJ1ZiA9IHNyYy5zdWJhcnJheShNYXRoLmZsb29yKGkgKiB5UmF0aW8pICogdzFTY2FubGluZSk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdzI7IGorKykgewogICAgICAgIGNvbnN0IG9sZEluZGV4ID0geFNjYWxlZFtqXTsKICAgICAgICBkZXN0W25ld0luZGV4KytdID0gYnVmW29sZEluZGV4XTsKICAgICAgICBkZXN0W25ld0luZGV4KytdID0gYnVmW29sZEluZGV4ICsgMV07CiAgICAgICAgZGVzdFtuZXdJbmRleCsrXSA9IGJ1ZltvbGRJbmRleCArIDJdOwogICAgICB9CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGNvcHlSZ2JhSW1hZ2Uoc3JjLCBkZXN0LCBhbHBoYTAxKSB7CiAgaWYgKGFscGhhMDEgPT09IDEpIHsKICAgIGNvbnN0IHNyYzMyID0gbmV3IFVpbnQzMkFycmF5KHNyYy5idWZmZXIpOwogICAgY29uc3QgZGVzdDMyID0gbmV3IFVpbnQzMkFycmF5KGRlc3QuYnVmZmVyKTsKICAgIGNvbnN0IHJnYk1hc2sgPSBGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDB4MDBmZmZmZmYgOiAweGZmZmZmZjAwOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjMzIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBkZXN0MzJbaV0gfD0gc3JjMzJbaV0gJiByZ2JNYXNrOwogICAgfQogIH0gZWxzZSB7CiAgICBsZXQgaiA9IDA7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkgewogICAgICBkZXN0W2orK10gPSBzcmNbaV07CiAgICAgIGRlc3RbaisrXSA9IHNyY1tpICsgMV07CiAgICAgIGRlc3RbaisrXSA9IHNyY1tpICsgMl07CiAgICB9CiAgfQp9CmNsYXNzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKG5hbWUsIG51bUNvbXBzKSB7CiAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgdGhpcy5udW1Db21wcyA9IG51bUNvbXBzOwogIH0KICBnZXRSZ2Ioc3JjLCBzcmNPZmZzZXQpIHsKICAgIGNvbnN0IHJnYiA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTsKICAgIHRoaXMuZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgcmdiLCAwKTsKICAgIHJldHVybiByZ2I7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIHVucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JJdGVtIik7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIHVucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JCdWZmZXIiKTsKICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICB1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0T3V0cHV0TGVuZ3RoIik7CiAgfQogIGlzUGFzc3Rocm91Z2goYml0cykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHsKICAgIHJldHVybiBDb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIHRoaXMubnVtQ29tcHMpOwogIH0KICBmaWxsUmdiKGRlc3QsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGJwYywgY29tcHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IGNvdW50ID0gb3JpZ2luYWxXaWR0aCAqIG9yaWdpbmFsSGVpZ2h0OwogICAgbGV0IHJnYkJ1ZiA9IG51bGw7CiAgICBjb25zdCBudW1Db21wb25lbnRDb2xvcnMgPSAxIDw8IGJwYzsKICAgIGNvbnN0IG5lZWRzUmVzaXppbmcgPSBvcmlnaW5hbEhlaWdodCAhPT0gaGVpZ2h0IHx8IG9yaWdpbmFsV2lkdGggIT09IHdpZHRoOwogICAgaWYgKHRoaXMuaXNQYXNzdGhyb3VnaChicGMpKSB7CiAgICAgIHJnYkJ1ZiA9IGNvbXBzOwogICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBzID09PSAxICYmIGNvdW50ID4gbnVtQ29tcG9uZW50Q29sb3JzICYmIHRoaXMubmFtZSAhPT0gIkRldmljZUdyYXkiICYmIHRoaXMubmFtZSAhPT0gIkRldmljZVJHQiIpIHsKICAgICAgY29uc3QgYWxsQ29sb3JzID0gYnBjIDw9IDggPyBuZXcgVWludDhBcnJheShudW1Db21wb25lbnRDb2xvcnMpIDogbmV3IFVpbnQxNkFycmF5KG51bUNvbXBvbmVudENvbG9ycyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50Q29sb3JzOyBpKyspIHsKICAgICAgICBhbGxDb2xvcnNbaV0gPSBpOwogICAgICB9CiAgICAgIGNvbnN0IGNvbG9yTWFwID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG51bUNvbXBvbmVudENvbG9ycyAqIDMpOwogICAgICB0aGlzLmdldFJnYkJ1ZmZlcihhbGxDb2xvcnMsIDAsIG51bUNvbXBvbmVudENvbG9ycywgY29sb3JNYXAsIDAsIGJwYywgMCk7CiAgICAgIGlmICghbmVlZHNSZXNpemluZykgewogICAgICAgIGxldCBkZXN0UG9zID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgICAgIGNvbnN0IGtleSA9IGNvbXBzW2ldICogMzsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGNvbG9yTWFwW2tleV07CiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAxXTsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGNvbG9yTWFwW2tleSArIDJdOwogICAgICAgICAgZGVzdFBvcyArPSBhbHBoYTAxOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZ2JCdWYgPSBuZXcgVWludDhBcnJheShjb3VudCAqIDMpOwogICAgICAgIGxldCByZ2JQb3MgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgICAgY29uc3Qga2V5ID0gY29tcHNbaV0gKiAzOwogICAgICAgICAgcmdiQnVmW3JnYlBvcysrXSA9IGNvbG9yTWFwW2tleV07CiAgICAgICAgICByZ2JCdWZbcmdiUG9zKytdID0gY29sb3JNYXBba2V5ICsgMV07CiAgICAgICAgICByZ2JCdWZbcmdiUG9zKytdID0gY29sb3JNYXBba2V5ICsgMl07CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKCFuZWVkc1Jlc2l6aW5nKSB7CiAgICAgIHRoaXMuZ2V0UmdiQnVmZmVyKGNvbXBzLCAwLCB3aWR0aCAqIGFjdHVhbEhlaWdodCwgZGVzdCwgMCwgYnBjLCBhbHBoYTAxKTsKICAgIH0gZWxzZSB7CiAgICAgIHJnYkJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShjb3VudCAqIDMpOwogICAgICB0aGlzLmdldFJnYkJ1ZmZlcihjb21wcywgMCwgY291bnQsIHJnYkJ1ZiwgMCwgYnBjLCAwKTsKICAgIH0KICAgIGlmIChyZ2JCdWYpIHsKICAgICAgaWYgKG5lZWRzUmVzaXppbmcpIHsKICAgICAgICByZXNpemVSZ2JJbWFnZShyZ2JCdWYsIGRlc3QsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBhbHBoYTAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgZGVzdFBvcyA9IDAsCiAgICAgICAgICByZ2JQb3MgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHdpZHRoICogYWN0dWFsSGVpZ2h0OyBpIDwgaWk7IGkrKykgewogICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gcmdiQnVmW3JnYlBvcysrXTsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHJnYkJ1ZltyZ2JQb3MrK107CiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSByZ2JCdWZbcmdiUG9zKytdOwogICAgICAgICAgZGVzdFBvcyArPSBhbHBoYTAxOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBnZXQgdXNlc1plcm9Ub09uZVJhbmdlKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidXNlc1plcm9Ub09uZVJhbmdlIiwgdHJ1ZSk7CiAgfQogIHN0YXRpYyBpc0RlZmF1bHREZWNvZGUoZGVjb2RlLCBudW1Db21wcykgewogICAgaWYgKCFBcnJheS5pc0FycmF5KGRlY29kZSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAobnVtQ29tcHMgKiAyICE9PSBkZWNvZGUubGVuZ3RoKSB7CiAgICAgIHdhcm4oIlRoZSBkZWNvZGUgbWFwIGlzIG5vdCB0aGUgY29ycmVjdCBsZW5ndGgiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBkZWNvZGUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICBpZiAoZGVjb2RlW2ldICE9PSAwIHx8IGRlY29kZVtpICsgMV0gIT09IDEpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBBbHRlcm5hdGVDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKG51bUNvbXBzLCBiYXNlLCB0aW50Rm4pIHsKICAgIHN1cGVyKCJBbHRlcm5hdGUiLCBudW1Db21wcyk7CiAgICB0aGlzLmJhc2UgPSBiYXNlOwogICAgdGhpcy50aW50Rm4gPSB0aW50Rm47CiAgICB0aGlzLnRtcEJ1ZiA9IG5ldyBGbG9hdDMyQXJyYXkoYmFzZS5udW1Db21wcyk7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIGNvbnN0IHRtcEJ1ZiA9IHRoaXMudG1wQnVmOwogICAgdGhpcy50aW50Rm4oc3JjLCBzcmNPZmZzZXQsIHRtcEJ1ZiwgMCk7CiAgICB0aGlzLmJhc2UuZ2V0UmdiSXRlbSh0bXBCdWYsIDAsIGRlc3QsIGRlc3RPZmZzZXQpOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBjb25zdCB0aW50Rm4gPSB0aGlzLnRpbnRGbjsKICAgIGNvbnN0IGJhc2UgPSB0aGlzLmJhc2U7CiAgICBjb25zdCBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTsKICAgIGNvbnN0IGJhc2VOdW1Db21wcyA9IGJhc2UubnVtQ29tcHM7CiAgICBjb25zdCB1c2VzWmVyb1RvT25lUmFuZ2UgPSBiYXNlLnVzZXNaZXJvVG9PbmVSYW5nZTsKICAgIGNvbnN0IGlzUGFzc3Rocm91Z2ggPSAoYmFzZS5pc1Bhc3N0aHJvdWdoKDgpIHx8ICF1c2VzWmVyb1RvT25lUmFuZ2UpICYmIGFscGhhMDEgPT09IDA7CiAgICBsZXQgcG9zID0gaXNQYXNzdGhyb3VnaCA/IGRlc3RPZmZzZXQgOiAwOwogICAgY29uc3QgYmFzZUJ1ZiA9IGlzUGFzc3Rocm91Z2ggPyBkZXN0IDogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJhc2VOdW1Db21wcyAqIGNvdW50KTsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKICAgIGNvbnN0IHNjYWxlZCA9IG5ldyBGbG9hdDMyQXJyYXkobnVtQ29tcHMpOwogICAgY29uc3QgdGludGVkID0gbmV3IEZsb2F0MzJBcnJheShiYXNlTnVtQ29tcHMpOwogICAgbGV0IGksIGo7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBmb3IgKGogPSAwOyBqIDwgbnVtQ29tcHM7IGorKykgewogICAgICAgIHNjYWxlZFtqXSA9IHNyY1tzcmNPZmZzZXQrK10gKiBzY2FsZTsKICAgICAgfQogICAgICB0aW50Rm4oc2NhbGVkLCAwLCB0aW50ZWQsIDApOwogICAgICBpZiAodXNlc1plcm9Ub09uZVJhbmdlKSB7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IGJhc2VOdW1Db21wczsgaisrKSB7CiAgICAgICAgICBiYXNlQnVmW3BvcysrXSA9IHRpbnRlZFtqXSAqIDI1NTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmFzZS5nZXRSZ2JJdGVtKHRpbnRlZCwgMCwgYmFzZUJ1ZiwgcG9zKTsKICAgICAgICBwb3MgKz0gYmFzZU51bUNvbXBzOwogICAgICB9CiAgICB9CiAgICBpZiAoIWlzUGFzc3Rocm91Z2gpIHsKICAgICAgYmFzZS5nZXRSZ2JCdWZmZXIoYmFzZUJ1ZiwgMCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIDgsIGFscGhhMDEpOwogICAgfQogIH0KICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoICogdGhpcy5iYXNlLm51bUNvbXBzIC8gdGhpcy5udW1Db21wcywgYWxwaGEwMSk7CiAgfQp9CmNsYXNzIFBhdHRlcm5DUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKGJhc2VDUykgewogICAgc3VwZXIoIlBhdHRlcm4iLCBudWxsKTsKICAgIHRoaXMuYmFzZSA9IGJhc2VDUzsKICB9CiAgaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7CiAgICB1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIFBhdHRlcm5DUy5pc0RlZmF1bHREZWNvZGUiKTsKICB9Cn0KY2xhc3MgSW5kZXhlZENTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgY29uc3RydWN0b3IoYmFzZSwgaGlnaFZhbCwgbG9va3VwKSB7CiAgICBzdXBlcigiSW5kZXhlZCIsIDEpOwogICAgdGhpcy5iYXNlID0gYmFzZTsKICAgIGNvbnN0IGxlbmd0aCA9IGJhc2UubnVtQ29tcHMgKiAoaGlnaFZhbCArIDEpOwogICAgdGhpcy5sb29rdXAgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwogICAgaWYgKGxvb2t1cCBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgY29uc3QgYnl0ZXMgPSBsb29rdXAuZ2V0Qnl0ZXMobGVuZ3RoKTsKICAgICAgdGhpcy5sb29rdXAuc2V0KGJ5dGVzKTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGxvb2t1cCA9PT0gInN0cmluZyIpIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgIHRoaXMubG9va3VwW2ldID0gbG9va3VwLmNoYXJDb2RlQXQoaSkgJiAweGZmOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEluZGV4ZWRDUyAtIHVucmVjb2duaXplZCBsb29rdXAgdGFibGU6ICR7bG9va3VwfWApOwogICAgfQogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBjb25zdCBudW1Db21wcyA9IHRoaXMuYmFzZS5udW1Db21wczsKICAgIGNvbnN0IHN0YXJ0ID0gc3JjW3NyY09mZnNldF0gKiBudW1Db21wczsKICAgIHRoaXMuYmFzZS5nZXRSZ2JCdWZmZXIodGhpcy5sb29rdXAsIHN0YXJ0LCAxLCBkZXN0LCBkZXN0T2Zmc2V0LCA4LCAwKTsKICB9CiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgewogICAgY29uc3QgYmFzZSA9IHRoaXMuYmFzZTsKICAgIGNvbnN0IG51bUNvbXBzID0gYmFzZS5udW1Db21wczsKICAgIGNvbnN0IG91dHB1dERlbHRhID0gYmFzZS5nZXRPdXRwdXRMZW5ndGgobnVtQ29tcHMsIGFscGhhMDEpOwogICAgY29uc3QgbG9va3VwID0gdGhpcy5sb29rdXA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgY29uc3QgbG9va3VwUG9zID0gc3JjW3NyY09mZnNldCsrXSAqIG51bUNvbXBzOwogICAgICBiYXNlLmdldFJnYkJ1ZmZlcihsb29rdXAsIGxvb2t1cFBvcywgMSwgZGVzdCwgZGVzdE9mZnNldCwgOCwgYWxwaGEwMSk7CiAgICAgIGRlc3RPZmZzZXQgKz0gb3V0cHV0RGVsdGE7CiAgICB9CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGggKiB0aGlzLmJhc2UubnVtQ29tcHMsIGFscGhhMDEpOwogIH0KICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHsKICAgIGlmICghQXJyYXkuaXNBcnJheShkZWNvZGVNYXApKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKGRlY29kZU1hcC5sZW5ndGggIT09IDIpIHsKICAgICAgd2FybigiRGVjb2RlIG1hcCBsZW5ndGggaXMgbm90IGNvcnJlY3QiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYnBjKSB8fCBicGMgPCAxKSB7CiAgICAgIHdhcm4oIkJpdHMgcGVyIGNvbXBvbmVudCBpcyBub3QgY29ycmVjdCIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBkZWNvZGVNYXBbMF0gPT09IDAgJiYgZGVjb2RlTWFwWzFdID09PSAoMSA8PCBicGMpIC0gMTsKICB9Cn0KY2xhc3MgRGV2aWNlR3JheUNTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlcigiRGV2aWNlR3JheSIsIDEpOwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBjb25zdCBjID0gc3JjW3NyY09mZnNldF0gKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXRdID0gZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IGM7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IHNjYWxlID0gMjU1IC8gKCgxIDw8IGJpdHMpIC0gMSk7CiAgICBsZXQgaiA9IHNyY09mZnNldCwKICAgICAgcSA9IGRlc3RPZmZzZXQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgY29uc3QgYyA9IHNjYWxlICogc3JjW2orK107CiAgICAgIGRlc3RbcSsrXSA9IGM7CiAgICAgIGRlc3RbcSsrXSA9IGM7CiAgICAgIGRlc3RbcSsrXSA9IGM7CiAgICAgIHEgKz0gYWxwaGEwMTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpOwogIH0KfQpjbGFzcyBEZXZpY2VSZ2JDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoIkRldmljZVJHQiIsIDMpOwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBkZXN0W2Rlc3RPZmZzZXRdID0gc3JjW3NyY09mZnNldF0gKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IHNyY1tzcmNPZmZzZXQgKyAxXSAqIDI1NTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gc3JjW3NyY09mZnNldCArIDJdICogMjU1OwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBpZiAoYml0cyA9PT0gOCAmJiBhbHBoYTAxID09PSAwKSB7CiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNPZmZzZXQsIHNyY09mZnNldCArIGNvdW50ICogMyksIGRlc3RPZmZzZXQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzY2FsZSA9IDI1NSAvICgoMSA8PCBiaXRzKSAtIDEpOwogICAgbGV0IGogPSBzcmNPZmZzZXQsCiAgICAgIHEgPSBkZXN0T2Zmc2V0OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CiAgICAgIHEgKz0gYWxwaGEwMTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpIC8gMyB8IDA7CiAgfQogIGlzUGFzc3Rocm91Z2goYml0cykgewogICAgcmV0dXJuIGJpdHMgPT09IDg7CiAgfQp9CmNsYXNzIERldmljZVJnYmFDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoIkRldmljZVJHQkEiLCA0KTsKICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBfYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoICogNDsKICB9CiAgaXNQYXNzdGhyb3VnaChiaXRzKSB7CiAgICByZXR1cm4gYml0cyA9PT0gODsKICB9CiAgZmlsbFJnYihkZXN0LCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgd2lkdGgsIGhlaWdodCwgYWN0dWFsSGVpZ2h0LCBicGMsIGNvbXBzLCBhbHBoYTAxKSB7CiAgICBpZiAob3JpZ2luYWxIZWlnaHQgIT09IGhlaWdodCB8fCBvcmlnaW5hbFdpZHRoICE9PSB3aWR0aCkgewogICAgICByZXNpemVSZ2JhSW1hZ2UoY29tcHMsIGRlc3QsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBhbHBoYTAxKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvcHlSZ2JhSW1hZ2UoY29tcHMsIGRlc3QsIGFscGhhMDEpOwogICAgfQogIH0KfQpjbGFzcyBEZXZpY2VDbXlrQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKCJEZXZpY2VDTVlLIiwgNCk7CiAgfQogICN0b1JnYihzcmMsIHNyY09mZnNldCwgc3JjU2NhbGUsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIGNvbnN0IGMgPSBzcmNbc3JjT2Zmc2V0XSAqIHNyY1NjYWxlOwogICAgY29uc3QgbSA9IHNyY1tzcmNPZmZzZXQgKyAxXSAqIHNyY1NjYWxlOwogICAgY29uc3QgeSA9IHNyY1tzcmNPZmZzZXQgKyAyXSAqIHNyY1NjYWxlOwogICAgY29uc3QgayA9IHNyY1tzcmNPZmZzZXQgKyAzXSAqIHNyY1NjYWxlOwogICAgZGVzdFtkZXN0T2Zmc2V0XSA9IDI1NSArIGMgKiAoLTQuMzg3MzMyMzg0NjA5OTg4ICogYyArIDU0LjQ4NjE1MTk0MTg5MTc2ICogbSArIDE4LjgyMjkwNTAyMTY1MzAyICogeSArIDIxMi4yNTY2MjQ1MTYzOTU4NSAqIGsgKyAtMjg1LjIzMzEwMjYxMzcwMDQpICsgbSAqICgxLjcxNDk3NjM0NzczNjIxMzQgKiBtIC0gNS42MDk2NzM2OTA0MDQ3MzE1ICogeSArIC0xNy44NzM4NzA4NjE0MTU0NDQgKiBrIC0gNS40OTcwMDY0MjcxOTYzNjYpICsgeSAqICgtMi41MjE3MzQwMTMxNjgzMDMzICogeSAtIDIxLjI0ODkyMzMzNzM1MzA3MyAqIGsgKyAxNy41MTE5MjcwODQxODEzKSArIGsgKiAoLTIxLjg2MTIyMTQ3NDYzNjA1ICogayAtIDE4OS40ODE4MDgzNTkyMjc0Nyk7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IDI1NSArIGMgKiAoOC44NDEwNDE0MjIwMzYxNDkgKiBjICsgNjAuMTE4MDI3MDQ1NTk3MzY2ICogbSArIDYuODcxNDI1NTkyMDQ5MDA3ICogeSArIDMxLjE1OTEwMDEzMDA1NTkyMiAqIGsgKyAtNzkuMjk3MDg0NDgxNjU0OCkgKyBtICogKC0xNS4zMTAzNjEzMDY5Njc4MTcgKiBtICsgMTcuNTc1MjUxMjYxMTA5NDgyICogeSArIDEzMS4zNTI1MDkxMjQ5Mzk3NiAqIGsgLSAxOTAuOTQ1MzMwMjU4ODk1MSkgKyB5ICogKDQuNDQ0MzM5MTAyODUyNzM5ICogeSArIDkuODYzMjg2MTQ5MzQwNSAqIGsgLSAyNC44Njc0MTU4MjU1NTg3OCkgKyBrICogKC0yMC43MzczMjU0NzExODEwMzQgKiBrIC0gMTg3LjgwNDUzNzA5NzE5NTc4KTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gMjU1ICsgYyAqICgwLjg4NDI1MjI0MzAwMDMyOTYgKiBjICsgOC4wNzg2Nzc1MDMxMTI5MjggKiBtICsgMzAuODk5NzgzMDk3MDM3MjkgKiB5IC0gMC4yMzg4MzIzODY4OTE3ODkzNCAqIGsgKyAtMTQuMTgzNTc2Nzk5NjczMjg2KSArIG0gKiAoMTAuNDk1OTMyNzM0MzIwNzIgKiBtICsgNjMuMDIzNzg0OTQ3NTQwNTIgKiB5ICsgNTAuNjA2OTU3NjU2MzYwNzM0ICogayAtIDExMi4yMzg4NDI1MzcxOTI0OCkgKyB5ICogKDAuMDMyOTYwNDExMTQ4NzMyMTcgKiB5ICsgMTE1LjYwMzg0NDQ5NjQ2NjQxICogayArIC0xOTMuNTgyMDkzNTY4NjE1MDUpICsgayAqICgtMjIuMzM4MTY4MDczMDk4ODYgKiBrIC0gMTgwLjEyNjEzOTc0NzA4MzY3KTsKICB9CiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgdGhpcy4jdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIDEsIGRlc3QsIGRlc3RPZmZzZXQpOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBjb25zdCBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICB0aGlzLiN0b1JnYihzcmMsIHNyY09mZnNldCwgc2NhbGUsIGRlc3QsIGRlc3RPZmZzZXQpOwogICAgICBzcmNPZmZzZXQgKz0gNDsKICAgICAgZGVzdE9mZnNldCArPSAzICsgYWxwaGEwMTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gaW5wdXRMZW5ndGggLyA0ICogKDMgKyBhbHBoYTAxKSB8IDA7CiAgfQp9CmNsYXNzIENhbEdyYXlDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIGdhbW1hKSB7CiAgICBzdXBlcigiQ2FsR3JheSIsIDEpOwogICAgaWYgKCF3aGl0ZVBvaW50KSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIENhbEdyYXkiKTsKICAgIH0KICAgIFt0aGlzLlhXLCB0aGlzLllXLCB0aGlzLlpXXSA9IHdoaXRlUG9pbnQ7CiAgICBbdGhpcy5YQiwgdGhpcy5ZQiwgdGhpcy5aQl0gPSBibGFja1BvaW50IHx8IFswLCAwLCAwXTsKICAgIHRoaXMuRyA9IGdhbW1hIHx8IDE7CiAgICBpZiAodGhpcy5YVyA8IDAgfHwgdGhpcy5aVyA8IDAgfHwgdGhpcy5ZVyAhPT0gMSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAke3RoaXMubmFtZX0sIG5vIGZhbGxiYWNrIGF2YWlsYWJsZWApOwogICAgfQogICAgaWYgKHRoaXMuWEIgPCAwIHx8IHRoaXMuWUIgPCAwIHx8IHRoaXMuWkIgPCAwKSB7CiAgICAgIGluZm8oYEludmFsaWQgQmxhY2tQb2ludCBmb3IgJHt0aGlzLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTsKICAgICAgdGhpcy5YQiA9IHRoaXMuWUIgPSB0aGlzLlpCID0gMDsKICAgIH0KICAgIGlmICh0aGlzLlhCICE9PSAwIHx8IHRoaXMuWUIgIT09IDAgfHwgdGhpcy5aQiAhPT0gMCkgewogICAgICB3YXJuKGAke3RoaXMubmFtZX0sIEJsYWNrUG9pbnQ6IFhCOiAke3RoaXMuWEJ9LCBZQjogJHt0aGlzLllCfSwgYCArIGBaQjogJHt0aGlzLlpCfSwgb25seSBkZWZhdWx0IHZhbHVlcyBhcmUgc3VwcG9ydGVkLmApOwogICAgfQogICAgaWYgKHRoaXMuRyA8IDEpIHsKICAgICAgaW5mbyhgSW52YWxpZCBHYW1tYTogJHt0aGlzLkd9IGZvciAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmApOwogICAgICB0aGlzLkcgPSAxOwogICAgfQogIH0KICAjdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKSB7CiAgICBjb25zdCBBID0gc3JjW3NyY09mZnNldF0gKiBzY2FsZTsKICAgIGNvbnN0IEFHID0gQSAqKiB0aGlzLkc7CiAgICBjb25zdCBMID0gdGhpcy5ZVyAqIEFHOwogICAgY29uc3QgdmFsID0gTWF0aC5tYXgoMjk1LjggKiBMICoqIDAuMzMzMzMzMzMzMzMzMzMzMyAtIDQwLjgsIDApOwogICAgZGVzdFtkZXN0T2Zmc2V0XSA9IHZhbDsKICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gdmFsOwogICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSB2YWw7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIHRoaXMuI3RvUmdiKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCAxKTsKICB9CiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgewogICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgdGhpcy4jdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKTsKICAgICAgc3JjT2Zmc2V0ICs9IDE7CiAgICAgIGRlc3RPZmZzZXQgKz0gMyArIGFscGhhMDE7CiAgICB9CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKTsKICB9Cn0KY2xhc3MgQ2FsUkdCQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBzdGF0aWMgI0JSQURGT1JEX1NDQUxFX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzAuODk1MSwgMC4yNjY0LCAtMC4xNjE0LCAtMC43NTAyLCAxLjcxMzUsIDAuMDM2NywgMC4wMzg5LCAtMC4wNjg1LCAxLjAyOTZdKTsKICBzdGF0aWMgI0JSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbMC45ODY5OTI5LCAtMC4xNDcwNTQzLCAwLjE1OTk2MjcsIDAuNDMyMzA1MywgMC41MTgzNjAzLCAwLjA0OTI5MTIsIC0wLjAwODUyODcsIDAuMDQwMDQyOCwgMC45Njg0ODY3XSk7CiAgc3RhdGljICNTUkdCX0Q2NV9YWVpfVE9fUkdCX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzMuMjQwNDU0MiwgLTEuNTM3MTM4NSwgLTAuNDk4NTMxNCwgLTAuOTY5MjY2MCwgMS44NzYwMTA4LCAwLjA0MTU1NjAsIDAuMDU1NjQzNCwgLTAuMjA0MDI1OSwgMS4wNTcyMjUyXSk7CiAgc3RhdGljICNGTEFUX1dISVRFUE9JTlRfTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbMSwgMSwgMV0pOwogIHN0YXRpYyAjdGVtcE5vcm1hbGl6ZU1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CiAgc3RhdGljICN0ZW1wQ29udmVydE1hdHJpeDEgPSBuZXcgRmxvYXQzMkFycmF5KDMpOwogIHN0YXRpYyAjdGVtcENvbnZlcnRNYXRyaXgyID0gbmV3IEZsb2F0MzJBcnJheSgzKTsKICBzdGF0aWMgI0RFQ09ERV9MX0NPTlNUQU5UID0gKCg4ICsgMTYpIC8gMTE2KSAqKiAzIC8gOC4wOwogIGNvbnN0cnVjdG9yKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIGdhbW1hLCBtYXRyaXgpIHsKICAgIHN1cGVyKCJDYWxSR0IiLCAzKTsKICAgIGlmICghd2hpdGVQb2ludCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBDYWxSR0IiKTsKICAgIH0KICAgIGNvbnN0IFtYVywgWVcsIFpXXSA9IHRoaXMud2hpdGVQb2ludCA9IHdoaXRlUG9pbnQ7CiAgICBjb25zdCBbWEIsIFlCLCBaQl0gPSB0aGlzLmJsYWNrUG9pbnQgPSBibGFja1BvaW50IHx8IG5ldyBGbG9hdDMyQXJyYXkoMyk7CiAgICBbdGhpcy5HUiwgdGhpcy5HRywgdGhpcy5HQl0gPSBnYW1tYSB8fCBuZXcgRmxvYXQzMkFycmF5KFsxLCAxLCAxXSk7CiAgICBbdGhpcy5NWEEsIHRoaXMuTVlBLCB0aGlzLk1aQSwgdGhpcy5NWEIsIHRoaXMuTVlCLCB0aGlzLk1aQiwgdGhpcy5NWEMsIHRoaXMuTVlDLCB0aGlzLk1aQ10gPSBtYXRyaXggfHwgbmV3IEZsb2F0MzJBcnJheShbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV0pOwogICAgaWYgKFhXIDwgMCB8fCBaVyA8IDAgfHwgWVcgIT09IDEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cyBmb3IgJHt0aGlzLm5hbWV9LCBubyBmYWxsYmFjayBhdmFpbGFibGVgKTsKICAgIH0KICAgIGlmIChYQiA8IDAgfHwgWUIgPCAwIHx8IFpCIDwgMCkgewogICAgICBpbmZvKGBJbnZhbGlkIEJsYWNrUG9pbnQgZm9yICR7dGhpcy5uYW1lfSBbJHtYQn0sICR7WUJ9LCAke1pCfV0sIGAgKyAiZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuIik7CiAgICAgIHRoaXMuYmxhY2tQb2ludCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CiAgICB9CiAgICBpZiAodGhpcy5HUiA8IDAgfHwgdGhpcy5HRyA8IDAgfHwgdGhpcy5HQiA8IDApIHsKICAgICAgaW5mbyhgSW52YWxpZCBHYW1tYSBbJHt0aGlzLkdSfSwgJHt0aGlzLkdHfSwgJHt0aGlzLkdCfV0gZm9yIGAgKyBgJHt0aGlzLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTsKICAgICAgdGhpcy5HUiA9IHRoaXMuR0cgPSB0aGlzLkdCID0gMTsKICAgIH0KICB9CiAgI21hdHJpeFByb2R1Y3QoYSwgYiwgcmVzdWx0KSB7CiAgICByZXN1bHRbMF0gPSBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl07CiAgICByZXN1bHRbMV0gPSBhWzNdICogYlswXSArIGFbNF0gKiBiWzFdICsgYVs1XSAqIGJbMl07CiAgICByZXN1bHRbMl0gPSBhWzZdICogYlswXSArIGFbN10gKiBiWzFdICsgYVs4XSAqIGJbMl07CiAgfQogICN0b0ZsYXQoc291cmNlV2hpdGVQb2ludCwgTE1TLCByZXN1bHQpIHsKICAgIHJlc3VsdFswXSA9IExNU1swXSAqIDEgLyBzb3VyY2VXaGl0ZVBvaW50WzBdOwogICAgcmVzdWx0WzFdID0gTE1TWzFdICogMSAvIHNvdXJjZVdoaXRlUG9pbnRbMV07CiAgICByZXN1bHRbMl0gPSBMTVNbMl0gKiAxIC8gc291cmNlV2hpdGVQb2ludFsyXTsKICB9CiAgI3RvRDY1KHNvdXJjZVdoaXRlUG9pbnQsIExNUywgcmVzdWx0KSB7CiAgICBjb25zdCBENjVYID0gMC45NTA0NzsKICAgIGNvbnN0IEQ2NVkgPSAxOwogICAgY29uc3QgRDY1WiA9IDEuMDg4ODM7CiAgICByZXN1bHRbMF0gPSBMTVNbMF0gKiBENjVYIC8gc291cmNlV2hpdGVQb2ludFswXTsKICAgIHJlc3VsdFsxXSA9IExNU1sxXSAqIEQ2NVkgLyBzb3VyY2VXaGl0ZVBvaW50WzFdOwogICAgcmVzdWx0WzJdID0gTE1TWzJdICogRDY1WiAvIHNvdXJjZVdoaXRlUG9pbnRbMl07CiAgfQogICNzUkdCVHJhbnNmZXJGdW5jdGlvbihjb2xvcikgewogICAgaWYgKGNvbG9yIDw9IDAuMDAzMTMwOCkgewogICAgICByZXR1cm4gTWF0aENsYW1wKDEyLjkyICogY29sb3IsIDAsIDEpOwogICAgfQogICAgaWYgKGNvbG9yID49IDAuOTk1NTQ1MjUpIHsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gTWF0aENsYW1wKCgxICsgMC4wNTUpICogY29sb3IgKiogKDEgLyAyLjQpIC0gMC4wNTUsIDAsIDEpOwogIH0KICAjZGVjb2RlTChMKSB7CiAgICBpZiAoTCA8IDApIHsKICAgICAgcmV0dXJuIC10aGlzLiNkZWNvZGVMKC1MKTsKICAgIH0KICAgIGlmIChMID4gOC4wKSB7CiAgICAgIHJldHVybiAoKEwgKyAxNikgLyAxMTYpICoqIDM7CiAgICB9CiAgICByZXR1cm4gTCAqIENhbFJHQkNTLiNERUNPREVfTF9DT05TVEFOVDsKICB9CiAgI2NvbXBlbnNhdGVCbGFja1BvaW50KHNvdXJjZUJsYWNrUG9pbnQsIFhZWl9GbGF0LCByZXN1bHQpIHsKICAgIGlmIChzb3VyY2VCbGFja1BvaW50WzBdID09PSAwICYmIHNvdXJjZUJsYWNrUG9pbnRbMV0gPT09IDAgJiYgc291cmNlQmxhY2tQb2ludFsyXSA9PT0gMCkgewogICAgICByZXN1bHRbMF0gPSBYWVpfRmxhdFswXTsKICAgICAgcmVzdWx0WzFdID0gWFlaX0ZsYXRbMV07CiAgICAgIHJlc3VsdFsyXSA9IFhZWl9GbGF0WzJdOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCB6ZXJvRGVjb2RlTCA9IHRoaXMuI2RlY29kZUwoMCk7CiAgICBjb25zdCBYX0RTVCA9IHplcm9EZWNvZGVMOwogICAgY29uc3QgWF9TUkMgPSB0aGlzLiNkZWNvZGVMKHNvdXJjZUJsYWNrUG9pbnRbMF0pOwogICAgY29uc3QgWV9EU1QgPSB6ZXJvRGVjb2RlTDsKICAgIGNvbnN0IFlfU1JDID0gdGhpcy4jZGVjb2RlTChzb3VyY2VCbGFja1BvaW50WzFdKTsKICAgIGNvbnN0IFpfRFNUID0gemVyb0RlY29kZUw7CiAgICBjb25zdCBaX1NSQyA9IHRoaXMuI2RlY29kZUwoc291cmNlQmxhY2tQb2ludFsyXSk7CiAgICBjb25zdCBYX1NjYWxlID0gKDEgLSBYX0RTVCkgLyAoMSAtIFhfU1JDKTsKICAgIGNvbnN0IFhfT2Zmc2V0ID0gMSAtIFhfU2NhbGU7CiAgICBjb25zdCBZX1NjYWxlID0gKDEgLSBZX0RTVCkgLyAoMSAtIFlfU1JDKTsKICAgIGNvbnN0IFlfT2Zmc2V0ID0gMSAtIFlfU2NhbGU7CiAgICBjb25zdCBaX1NjYWxlID0gKDEgLSBaX0RTVCkgLyAoMSAtIFpfU1JDKTsKICAgIGNvbnN0IFpfT2Zmc2V0ID0gMSAtIFpfU2NhbGU7CiAgICByZXN1bHRbMF0gPSBYWVpfRmxhdFswXSAqIFhfU2NhbGUgKyBYX09mZnNldDsKICAgIHJlc3VsdFsxXSA9IFhZWl9GbGF0WzFdICogWV9TY2FsZSArIFlfT2Zmc2V0OwogICAgcmVzdWx0WzJdID0gWFlaX0ZsYXRbMl0gKiBaX1NjYWxlICsgWl9PZmZzZXQ7CiAgfQogICNub3JtYWxpemVXaGl0ZVBvaW50VG9GbGF0KHNvdXJjZVdoaXRlUG9pbnQsIFhZWl9JbiwgcmVzdWx0KSB7CiAgICBpZiAoc291cmNlV2hpdGVQb2ludFswXSA9PT0gMSAmJiBzb3VyY2VXaGl0ZVBvaW50WzJdID09PSAxKSB7CiAgICAgIHJlc3VsdFswXSA9IFhZWl9JblswXTsKICAgICAgcmVzdWx0WzFdID0gWFlaX0luWzFdOwogICAgICByZXN1bHRbMl0gPSBYWVpfSW5bMl07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IExNUyA9IHJlc3VsdDsKICAgIHRoaXMuI21hdHJpeFByb2R1Y3QoQ2FsUkdCQ1MuI0JSQURGT1JEX1NDQUxFX01BVFJJWCwgWFlaX0luLCBMTVMpOwogICAgY29uc3QgTE1TX0ZsYXQgPSBDYWxSR0JDUy4jdGVtcE5vcm1hbGl6ZU1hdHJpeDsKICAgIHRoaXMuI3RvRmxhdChzb3VyY2VXaGl0ZVBvaW50LCBMTVMsIExNU19GbGF0KTsKICAgIHRoaXMuI21hdHJpeFByb2R1Y3QoQ2FsUkdCQ1MuI0JSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYLCBMTVNfRmxhdCwgcmVzdWx0KTsKICB9CiAgI25vcm1hbGl6ZVdoaXRlUG9pbnRUb0Q2NShzb3VyY2VXaGl0ZVBvaW50LCBYWVpfSW4sIHJlc3VsdCkgewogICAgY29uc3QgTE1TID0gcmVzdWx0OwogICAgdGhpcy4jbWF0cml4UHJvZHVjdChDYWxSR0JDUy4jQlJBREZPUkRfU0NBTEVfTUFUUklYLCBYWVpfSW4sIExNUyk7CiAgICBjb25zdCBMTVNfRDY1ID0gQ2FsUkdCQ1MuI3RlbXBOb3JtYWxpemVNYXRyaXg7CiAgICB0aGlzLiN0b0Q2NShzb3VyY2VXaGl0ZVBvaW50LCBMTVMsIExNU19ENjUpOwogICAgdGhpcy4jbWF0cml4UHJvZHVjdChDYWxSR0JDUy4jQlJBREZPUkRfU0NBTEVfSU5WRVJTRV9NQVRSSVgsIExNU19ENjUsIHJlc3VsdCk7CiAgfQogICN0b1JnYihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpIHsKICAgIGNvbnN0IEEgPSBNYXRoQ2xhbXAoc3JjW3NyY09mZnNldF0gKiBzY2FsZSwgMCwgMSk7CiAgICBjb25zdCBCID0gTWF0aENsYW1wKHNyY1tzcmNPZmZzZXQgKyAxXSAqIHNjYWxlLCAwLCAxKTsKICAgIGNvbnN0IEMgPSBNYXRoQ2xhbXAoc3JjW3NyY09mZnNldCArIDJdICogc2NhbGUsIDAsIDEpOwogICAgY29uc3QgQUdSID0gQSA9PT0gMSA/IDEgOiBBICoqIHRoaXMuR1I7CiAgICBjb25zdCBCR0cgPSBCID09PSAxID8gMSA6IEIgKiogdGhpcy5HRzsKICAgIGNvbnN0IENHQiA9IEMgPT09IDEgPyAxIDogQyAqKiB0aGlzLkdCOwogICAgY29uc3QgWCA9IHRoaXMuTVhBICogQUdSICsgdGhpcy5NWEIgKiBCR0cgKyB0aGlzLk1YQyAqIENHQjsKICAgIGNvbnN0IFkgPSB0aGlzLk1ZQSAqIEFHUiArIHRoaXMuTVlCICogQkdHICsgdGhpcy5NWUMgKiBDR0I7CiAgICBjb25zdCBaID0gdGhpcy5NWkEgKiBBR1IgKyB0aGlzLk1aQiAqIEJHRyArIHRoaXMuTVpDICogQ0dCOwogICAgY29uc3QgWFlaID0gQ2FsUkdCQ1MuI3RlbXBDb252ZXJ0TWF0cml4MTsKICAgIFhZWlswXSA9IFg7CiAgICBYWVpbMV0gPSBZOwogICAgWFlaWzJdID0gWjsKICAgIGNvbnN0IFhZWl9GbGF0ID0gQ2FsUkdCQ1MuI3RlbXBDb252ZXJ0TWF0cml4MjsKICAgIHRoaXMuI25vcm1hbGl6ZVdoaXRlUG9pbnRUb0ZsYXQodGhpcy53aGl0ZVBvaW50LCBYWVosIFhZWl9GbGF0KTsKICAgIGNvbnN0IFhZWl9CbGFjayA9IENhbFJHQkNTLiN0ZW1wQ29udmVydE1hdHJpeDE7CiAgICB0aGlzLiNjb21wZW5zYXRlQmxhY2tQb2ludCh0aGlzLmJsYWNrUG9pbnQsIFhZWl9GbGF0LCBYWVpfQmxhY2spOwogICAgY29uc3QgWFlaX0Q2NSA9IENhbFJHQkNTLiN0ZW1wQ29udmVydE1hdHJpeDI7CiAgICB0aGlzLiNub3JtYWxpemVXaGl0ZVBvaW50VG9ENjUoQ2FsUkdCQ1MuI0ZMQVRfV0hJVEVQT0lOVF9NQVRSSVgsIFhZWl9CbGFjaywgWFlaX0Q2NSk7CiAgICBjb25zdCBTUkdCID0gQ2FsUkdCQ1MuI3RlbXBDb252ZXJ0TWF0cml4MTsKICAgIHRoaXMuI21hdHJpeFByb2R1Y3QoQ2FsUkdCQ1MuI1NSR0JfRDY1X1hZWl9UT19SR0JfTUFUUklYLCBYWVpfRDY1LCBTUkdCKTsKICAgIGRlc3RbZGVzdE9mZnNldF0gPSB0aGlzLiNzUkdCVHJhbnNmZXJGdW5jdGlvbihTUkdCWzBdKSAqIDI1NTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gdGhpcy4jc1JHQlRyYW5zZmVyRnVuY3Rpb24oU1JHQlsxXSkgKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IHRoaXMuI3NSR0JUcmFuc2ZlckZ1bmN0aW9uKFNSR0JbMl0pICogMjU1OwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICB0aGlzLiN0b1JnYihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgMSk7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IHNjYWxlID0gMSAvICgoMSA8PCBiaXRzKSAtIDEpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgIHRoaXMuI3RvUmdiKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCBzY2FsZSk7CiAgICAgIHNyY09mZnNldCArPSAzOwogICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxOwogICAgfQogIH0KICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKICAgIHJldHVybiBpbnB1dExlbmd0aCAqICgzICsgYWxwaGEwMSkgLyAzIHwgMDsKICB9Cn0KY2xhc3MgTGFiQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSkgewogICAgc3VwZXIoIkxhYiIsIDMpOwogICAgaWYgKCF3aGl0ZVBvaW50KSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIExhYiIpOwogICAgfQogICAgW3RoaXMuWFcsIHRoaXMuWVcsIHRoaXMuWlddID0gd2hpdGVQb2ludDsKICAgIFt0aGlzLmFtaW4sIHRoaXMuYW1heCwgdGhpcy5ibWluLCB0aGlzLmJtYXhdID0gcmFuZ2UgfHwgWy0xMDAsIDEwMCwgLTEwMCwgMTAwXTsKICAgIFt0aGlzLlhCLCB0aGlzLllCLCB0aGlzLlpCXSA9IGJsYWNrUG9pbnQgfHwgWzAsIDAsIDBdOwogICAgaWYgKHRoaXMuWFcgPCAwIHx8IHRoaXMuWlcgPCAwIHx8IHRoaXMuWVcgIT09IDEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cywgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIik7CiAgICB9CiAgICBpZiAodGhpcy5YQiA8IDAgfHwgdGhpcy5ZQiA8IDAgfHwgdGhpcy5aQiA8IDApIHsKICAgICAgaW5mbygiSW52YWxpZCBCbGFja1BvaW50LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCIpOwogICAgICB0aGlzLlhCID0gdGhpcy5ZQiA9IHRoaXMuWkIgPSAwOwogICAgfQogICAgaWYgKHRoaXMuYW1pbiA+IHRoaXMuYW1heCB8fCB0aGlzLmJtaW4gPiB0aGlzLmJtYXgpIHsKICAgICAgaW5mbygiSW52YWxpZCBSYW5nZSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHRzIik7CiAgICAgIHRoaXMuYW1pbiA9IC0xMDA7CiAgICAgIHRoaXMuYW1heCA9IDEwMDsKICAgICAgdGhpcy5ibWluID0gLTEwMDsKICAgICAgdGhpcy5ibWF4ID0gMTAwOwogICAgfQogIH0KICAjZm5fZyh4KSB7CiAgICByZXR1cm4geCA+PSA2IC8gMjkgPyB4ICoqIDMgOiAxMDggLyA4NDEgKiAoeCAtIDQgLyAyOSk7CiAgfQogICNkZWNvZGUodmFsdWUsIGhpZ2gxLCBsb3cyLCBoaWdoMikgewogICAgcmV0dXJuIGxvdzIgKyB2YWx1ZSAqIChoaWdoMiAtIGxvdzIpIC8gaGlnaDE7CiAgfQogICN0b1JnYihzcmMsIHNyY09mZnNldCwgbWF4VmFsLCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBsZXQgTHMgPSBzcmNbc3JjT2Zmc2V0XTsKICAgIGxldCBhcyA9IHNyY1tzcmNPZmZzZXQgKyAxXTsKICAgIGxldCBicyA9IHNyY1tzcmNPZmZzZXQgKyAyXTsKICAgIGlmIChtYXhWYWwgIT09IGZhbHNlKSB7CiAgICAgIExzID0gdGhpcy4jZGVjb2RlKExzLCBtYXhWYWwsIDAsIDEwMCk7CiAgICAgIGFzID0gdGhpcy4jZGVjb2RlKGFzLCBtYXhWYWwsIHRoaXMuYW1pbiwgdGhpcy5hbWF4KTsKICAgICAgYnMgPSB0aGlzLiNkZWNvZGUoYnMsIG1heFZhbCwgdGhpcy5ibWluLCB0aGlzLmJtYXgpOwogICAgfQogICAgaWYgKGFzID4gdGhpcy5hbWF4KSB7CiAgICAgIGFzID0gdGhpcy5hbWF4OwogICAgfSBlbHNlIGlmIChhcyA8IHRoaXMuYW1pbikgewogICAgICBhcyA9IHRoaXMuYW1pbjsKICAgIH0KICAgIGlmIChicyA+IHRoaXMuYm1heCkgewogICAgICBicyA9IHRoaXMuYm1heDsKICAgIH0gZWxzZSBpZiAoYnMgPCB0aGlzLmJtaW4pIHsKICAgICAgYnMgPSB0aGlzLmJtaW47CiAgICB9CiAgICBjb25zdCBNID0gKExzICsgMTYpIC8gMTE2OwogICAgY29uc3QgTCA9IE0gKyBhcyAvIDUwMDsKICAgIGNvbnN0IE4gPSBNIC0gYnMgLyAyMDA7CiAgICBjb25zdCBYID0gdGhpcy5YVyAqIHRoaXMuI2ZuX2coTCk7CiAgICBjb25zdCBZID0gdGhpcy5ZVyAqIHRoaXMuI2ZuX2coTSk7CiAgICBjb25zdCBaID0gdGhpcy5aVyAqIHRoaXMuI2ZuX2coTik7CiAgICBsZXQgciwgZywgYjsKICAgIGlmICh0aGlzLlpXIDwgMSkgewogICAgICByID0gWCAqIDMuMTMzOSArIFkgKiAtMS42MTcgKyBaICogLTAuNDkwNjsKICAgICAgZyA9IFggKiAtMC45Nzg1ICsgWSAqIDEuOTE2ICsgWiAqIDAuMDMzMzsKICAgICAgYiA9IFggKiAwLjA3MiArIFkgKiAtMC4yMjkgKyBaICogMS40MDU3OwogICAgfSBlbHNlIHsKICAgICAgciA9IFggKiAzLjI0MDYgKyBZICogLTEuNTM3MiArIFogKiAtMC40OTg2OwogICAgICBnID0gWCAqIC0wLjk2ODkgKyBZICogMS44NzU4ICsgWiAqIDAuMDQxNTsKICAgICAgYiA9IFggKiAwLjA1NTcgKyBZICogLTAuMjA0ICsgWiAqIDEuMDU3OwogICAgfQogICAgZGVzdFtkZXN0T2Zmc2V0XSA9IE1hdGguc3FydChyKSAqIDI1NTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gTWF0aC5zcXJ0KGcpICogMjU1OwogICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSBNYXRoLnNxcnQoYikgKiAyNTU7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIHRoaXMuI3RvUmdiKHNyYywgc3JjT2Zmc2V0LCBmYWxzZSwgZGVzdCwgZGVzdE9mZnNldCk7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IG1heFZhbCA9ICgxIDw8IGJpdHMpIC0gMTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICB0aGlzLiN0b1JnYihzcmMsIHNyY09mZnNldCwgbWF4VmFsLCBkZXN0LCBkZXN0T2Zmc2V0KTsKICAgICAgc3JjT2Zmc2V0ICs9IDM7CiAgICAgIGRlc3RPZmZzZXQgKz0gMyArIGFscGhhMDE7CiAgICB9CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKSAvIDMgfCAwOwogIH0KICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBnZXQgdXNlc1plcm9Ub09uZVJhbmdlKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidXNlc1plcm9Ub09uZVJhbmdlIiwgZmFsc2UpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvaWNjX2NvbG9yc3BhY2UuanMKCgoKCmZ1bmN0aW9uIGZldGNoU3luYyh1cmwpIHsKICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgeGhyLnNlbmQobnVsbCk7CiAgcmV0dXJuIHhoci5yZXNwb25zZTsKfQpjbGFzcyBJY2NDb2xvclNwYWNlIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgI3RyYW5zZm9ybWVyOwogICNjb252ZXJ0UGl4ZWw7CiAgc3RhdGljICN1c2VXYXNtID0gdHJ1ZTsKICBzdGF0aWMgI3dhc21VcmwgPSBudWxsOwogIHN0YXRpYyAjZmluYWxpemVyID0gbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHRyYW5zZm9ybWVyID0+IHsKICAgIHFjbXNfZHJvcF90cmFuc2Zvcm1lcih0cmFuc2Zvcm1lcik7CiAgfSk7CiAgY29uc3RydWN0b3IoaWNjUHJvZmlsZSwgbmFtZSwgbnVtQ29tcHMpIHsKICAgIGlmICghSWNjQ29sb3JTcGFjZS5pc1VzYWJsZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vIElDQyBjb2xvciBzcGFjZSBzdXBwb3J0Iik7CiAgICB9CiAgICBzdXBlcihuYW1lLCBudW1Db21wcyk7CiAgICBsZXQgaW5UeXBlOwogICAgc3dpdGNoIChudW1Db21wcykgewogICAgICBjYXNlIDE6CiAgICAgICAgaW5UeXBlID0gRGF0YVR5cGUuR3JheTg7CiAgICAgICAgdGhpcy4jY29udmVydFBpeGVsID0gKHNyYywgc3JjT2Zmc2V0KSA9PiBxY21zX2NvbnZlcnRfb25lKHRoaXMuI3RyYW5zZm9ybWVyLCBzcmNbc3JjT2Zmc2V0XSAqIDI1NSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgICBpblR5cGUgPSBEYXRhVHlwZS5SR0I4OwogICAgICAgIHRoaXMuI2NvbnZlcnRQaXhlbCA9IChzcmMsIHNyY09mZnNldCkgPT4gcWNtc19jb252ZXJ0X3RocmVlKHRoaXMuI3RyYW5zZm9ybWVyLCBzcmNbc3JjT2Zmc2V0XSAqIDI1NSwgc3JjW3NyY09mZnNldCArIDFdICogMjU1LCBzcmNbc3JjT2Zmc2V0ICsgMl0gKiAyNTUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDQ6CiAgICAgICAgaW5UeXBlID0gRGF0YVR5cGUuQ01ZSzsKICAgICAgICB0aGlzLiNjb252ZXJ0UGl4ZWwgPSAoc3JjLCBzcmNPZmZzZXQpID0+IHFjbXNfY29udmVydF9mb3VyKHRoaXMuI3RyYW5zZm9ybWVyLCBzcmNbc3JjT2Zmc2V0XSAqIDI1NSwgc3JjW3NyY09mZnNldCArIDFdICogMjU1LCBzcmNbc3JjT2Zmc2V0ICsgMl0gKiAyNTUsIHNyY1tzcmNPZmZzZXQgKyAzXSAqIDI1NSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBudW1iZXIgb2YgY29tcG9uZW50czogJHtudW1Db21wc31gKTsKICAgIH0KICAgIHRoaXMuI3RyYW5zZm9ybWVyID0gcWNtc190cmFuc2Zvcm1lcl9mcm9tX21lbW9yeShpY2NQcm9maWxlLCBpblR5cGUsIEludGVudC5QZXJjZXB0dWFsKTsKICAgIGlmICghdGhpcy4jdHJhbnNmb3JtZXIpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIElDQyBjb2xvciBzcGFjZSIpOwogICAgfQogICAgSWNjQ29sb3JTcGFjZS4jZmluYWxpemVyLnJlZ2lzdGVyKHRoaXMsIHRoaXMuI3RyYW5zZm9ybWVyKTsKICB9CiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgUUNNUy5fZGVzdEJ1ZmZlciA9IGRlc3Quc3ViYXJyYXkoZGVzdE9mZnNldCwgZGVzdE9mZnNldCArIDMpOwogICAgdGhpcy4jY29udmVydFBpeGVsKHNyYywgc3JjT2Zmc2V0KTsKICAgIFFDTVMuX2Rlc3RCdWZmZXIgPSBudWxsOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBzcmMgPSBzcmMuc3ViYXJyYXkoc3JjT2Zmc2V0LCBzcmNPZmZzZXQgKyBjb3VudCAqIHRoaXMubnVtQ29tcHMpOwogICAgaWYgKGJpdHMgIT09IDgpIHsKICAgICAgY29uc3Qgc2NhbGUgPSAyNTUgLyAoKDEgPDwgYml0cykgLSAxKTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBzcmNbaV0gKj0gc2NhbGU7CiAgICAgIH0KICAgIH0KICAgIFFDTVMuX211c3RBZGRBbHBoYSA9IGFscGhhMDEgJiYgZGVzdC5idWZmZXIgPT09IHNyYy5idWZmZXI7CiAgICBRQ01TLl9kZXN0QnVmZmVyID0gZGVzdC5zdWJhcnJheShkZXN0T2Zmc2V0LCBkZXN0T2Zmc2V0ICsgY291bnQgKiAoMyArIGFscGhhMDEpKTsKICAgIHFjbXNfY29udmVydF9hcnJheSh0aGlzLiN0cmFuc2Zvcm1lciwgc3JjKTsKICAgIFFDTVMuX211c3RBZGRBbHBoYSA9IGZhbHNlOwogICAgUUNNUy5fZGVzdEJ1ZmZlciA9IG51bGw7CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoIC8gdGhpcy5udW1Db21wcyAqICgzICsgYWxwaGEwMSkgfCAwOwogIH0KICBzdGF0aWMgc2V0T3B0aW9ucyh7CiAgICB1c2VXYXNtLAogICAgdXNlV29ya2VyRmV0Y2gsCiAgICB3YXNtVXJsCiAgfSkgewogICAgaWYgKCF1c2VXb3JrZXJGZXRjaCkgewogICAgICB0aGlzLiN1c2VXYXNtID0gZmFsc2U7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuI3VzZVdhc20gPSB1c2VXYXNtOwogICAgdGhpcy4jd2FzbVVybCA9IHdhc21Vcmw7CiAgfQogIHN0YXRpYyBnZXQgaXNVc2FibGUoKSB7CiAgICBsZXQgaXNVc2FibGUgPSBmYWxzZTsKICAgIGlmICh0aGlzLiN1c2VXYXNtKSB7CiAgICAgIGlmICh0aGlzLiN3YXNtVXJsKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMuX21vZHVsZSA9IFFDTVMuX21vZHVsZSA9IGluaXRTeW5jKHsKICAgICAgICAgICAgbW9kdWxlOiBmZXRjaFN5bmMoYCR7dGhpcy4jd2FzbVVybH1xY21zX2JnLndhc21gKQogICAgICAgICAgfSk7CiAgICAgICAgICBpc1VzYWJsZSA9ICEhdGhpcy5fbW9kdWxlOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHdhcm4oYElDQ0Jhc2VkIGNvbG9yIHNwYWNlOiAiJHtlfSIuYCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIk5vIElDQyBjb2xvciBzcGFjZSBzdXBwb3J0IGR1ZSB0byBtaXNzaW5nIGB3YXNtVXJsYCBBUEkgb3B0aW9uIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImlzVXNhYmxlIiwgaXNVc2FibGUpOwogIH0KfQpjbGFzcyBDbXlrSUNDQmFzZWRDUyBleHRlbmRzIEljY0NvbG9yU3BhY2UgewogIHN0YXRpYyAjaWNjVXJsOwogIGNvbnN0cnVjdG9yKCkgewogICAgY29uc3QgaWNjUHJvZmlsZSA9IG5ldyBVaW50OEFycmF5KGZldGNoU3luYyhgJHtDbXlrSUNDQmFzZWRDUy4jaWNjVXJsfUNHQVRTMDAxQ29tcGF0LXYyLW1pY3JvLmljY2ApKTsKICAgIHN1cGVyKGljY1Byb2ZpbGUsICJEZXZpY2VDTVlLIiwgNCk7CiAgfQogIHN0YXRpYyBzZXRPcHRpb25zKHsKICAgIGljY1VybAogIH0pIHsKICAgIHRoaXMuI2ljY1VybCA9IGljY1VybDsKICB9CiAgc3RhdGljIGdldCBpc1VzYWJsZSgpIHsKICAgIGxldCBpc1VzYWJsZSA9IGZhbHNlOwogICAgaWYgKEljY0NvbG9yU3BhY2UuaXNVc2FibGUpIHsKICAgICAgaWYgKHRoaXMuI2ljY1VybCkgewogICAgICAgIGlzVXNhYmxlID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3YXJuKCJObyBDTVlLIElDQyBwcm9maWxlIHN1cHBvcnQgZHVlIHRvIG1pc3NpbmcgYGljY1VybGAgQVBJIG9wdGlvbiIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc1VzYWJsZSIsIGlzVXNhYmxlKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3N0cmVhbS5qcwoKCmNsYXNzIFN0cmVhbSBleHRlbmRzIEJhc2VTdHJlYW0gewogIGNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLCBzdGFydCwgbGVuZ3RoLCBkaWN0KSB7CiAgICBzdXBlcigpOwogICAgdGhpcy5ieXRlcyA9IGFycmF5QnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGFycmF5QnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpOwogICAgdGhpcy5zdGFydCA9IHN0YXJ0IHx8IDA7CiAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7CiAgICB0aGlzLmVuZCA9IHN0YXJ0ICsgbGVuZ3RoIHx8IHRoaXMuYnl0ZXMubGVuZ3RoOwogICAgdGhpcy5kaWN0ID0gZGljdDsKICB9CiAgZ2V0IGxlbmd0aCgpIHsKICAgIHJldHVybiB0aGlzLmVuZCAtIHRoaXMuc3RhcnQ7CiAgfQogIGdldCBpc0VtcHR5KCkgewogICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwOwogIH0KICBnZXRCeXRlKCkgewogICAgaWYgKHRoaXMucG9zID49IHRoaXMuZW5kKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHJldHVybiB0aGlzLmJ5dGVzW3RoaXMucG9zKytdOwogIH0KICBnZXRCeXRlcyhsZW5ndGgpIHsKICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlczsKICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zOwogICAgY29uc3Qgc3RyRW5kID0gdGhpcy5lbmQ7CiAgICBpZiAoIWxlbmd0aCkgewogICAgICByZXR1cm4gYnl0ZXMuc3ViYXJyYXkocG9zLCBzdHJFbmQpOwogICAgfQogICAgbGV0IGVuZCA9IHBvcyArIGxlbmd0aDsKICAgIGlmIChlbmQgPiBzdHJFbmQpIHsKICAgICAgZW5kID0gc3RyRW5kOwogICAgfQogICAgdGhpcy5wb3MgPSBlbmQ7CiAgICByZXR1cm4gYnl0ZXMuc3ViYXJyYXkocG9zLCBlbmQpOwogIH0KICBnZXRCeXRlUmFuZ2UoYmVnaW4sIGVuZCkgewogICAgaWYgKGJlZ2luIDwgMCkgewogICAgICBiZWdpbiA9IDA7CiAgICB9CiAgICBpZiAoZW5kID4gdGhpcy5lbmQpIHsKICAgICAgZW5kID0gdGhpcy5lbmQ7CiAgICB9CiAgICByZXR1cm4gdGhpcy5ieXRlcy5zdWJhcnJheShiZWdpbiwgZW5kKTsKICB9CiAgcmVzZXQoKSB7CiAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7CiAgfQogIG1vdmVTdGFydCgpIHsKICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvczsKICB9CiAgbWFrZVN1YlN0cmVhbShzdGFydCwgbGVuZ3RoLCBkaWN0ID0gbnVsbCkgewogICAgcmV0dXJuIG5ldyBTdHJlYW0odGhpcy5ieXRlcy5idWZmZXIsIHN0YXJ0LCBsZW5ndGgsIGRpY3QpOwogIH0KfQpjbGFzcyBTdHJpbmdTdHJlYW0gZXh0ZW5kcyBTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0cikgewogICAgc3VwZXIoc3RyaW5nVG9CeXRlcyhzdHIpKTsKICB9Cn0KY2xhc3MgTnVsbFN0cmVhbSBleHRlbmRzIFN0cmVhbSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlcihuZXcgVWludDhBcnJheSgwKSk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jaHVua2VkX3N0cmVhbS5qcwoKCgpjbGFzcyBDaHVua2VkU3RyZWFtIGV4dGVuZHMgU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihsZW5ndGgsIGNodW5rU2l6ZSwgbWFuYWdlcikgewogICAgc3VwZXIobmV3IFVpbnQ4QXJyYXkobGVuZ3RoKSwgMCwgbGVuZ3RoLCBudWxsKTsKICAgIHRoaXMuY2h1bmtTaXplID0gY2h1bmtTaXplOwogICAgdGhpcy5fbG9hZGVkQ2h1bmtzID0gbmV3IFNldCgpOwogICAgdGhpcy5udW1DaHVua3MgPSBNYXRoLmNlaWwobGVuZ3RoIC8gY2h1bmtTaXplKTsKICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7CiAgICB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA9IDA7CiAgICB0aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rID0gLTE7CiAgfQogIGdldE1pc3NpbmdDaHVua3MoKSB7CiAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgIGZvciAobGV0IGNodW5rID0gMCwgbiA9IHRoaXMubnVtQ2h1bmtzOyBjaHVuayA8IG47ICsrY2h1bmspIHsKICAgICAgaWYgKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKSkgewogICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNodW5rczsKICB9CiAgZ2V0IG51bUNodW5rc0xvYWRlZCgpIHsKICAgIHJldHVybiB0aGlzLl9sb2FkZWRDaHVua3Muc2l6ZTsKICB9CiAgZ2V0IGlzRGF0YUxvYWRlZCgpIHsKICAgIHJldHVybiB0aGlzLm51bUNodW5rc0xvYWRlZCA9PT0gdGhpcy5udW1DaHVua3M7CiAgfQogIG9uUmVjZWl2ZURhdGEoYmVnaW4sIGNodW5rKSB7CiAgICBjb25zdCBjaHVua1NpemUgPSB0aGlzLmNodW5rU2l6ZTsKICAgIGlmIChiZWdpbiAlIGNodW5rU2l6ZSAhPT0gMCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYEJhZCBiZWdpbiBvZmZzZXQ6ICR7YmVnaW59YCk7CiAgICB9CiAgICBjb25zdCBlbmQgPSBiZWdpbiArIGNodW5rLmJ5dGVMZW5ndGg7CiAgICBpZiAoZW5kICUgY2h1bmtTaXplICE9PSAwICYmIGVuZCAhPT0gdGhpcy5ieXRlcy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYWQgZW5kIG9mZnNldDogJHtlbmR9YCk7CiAgICB9CiAgICB0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheShjaHVuayksIGJlZ2luKTsKICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKGJlZ2luIC8gY2h1bmtTaXplKTsKICAgIGNvbnN0IGVuZENodW5rID0gTWF0aC5mbG9vcigoZW5kIC0gMSkgLyBjaHVua1NpemUpICsgMTsKICAgIGZvciAobGV0IGN1ckNodW5rID0gYmVnaW5DaHVuazsgY3VyQ2h1bmsgPCBlbmRDaHVuazsgKytjdXJDaHVuaykgewogICAgICB0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGN1ckNodW5rKTsKICAgIH0KICB9CiAgb25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGRhdGEpIHsKICAgIGxldCBwb3NpdGlvbiA9IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoOwogICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IocG9zaXRpb24gLyB0aGlzLmNodW5rU2l6ZSk7CiAgICB0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheShkYXRhKSwgcG9zaXRpb24pOwogICAgcG9zaXRpb24gKz0gZGF0YS5ieXRlTGVuZ3RoOwogICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSBwb3NpdGlvbjsKICAgIGNvbnN0IGVuZENodW5rID0gcG9zaXRpb24gPj0gdGhpcy5lbmQgPyB0aGlzLm51bUNodW5rcyA6IE1hdGguZmxvb3IocG9zaXRpb24gLyB0aGlzLmNodW5rU2l6ZSk7CiAgICBmb3IgKGxldCBjdXJDaHVuayA9IGJlZ2luQ2h1bms7IGN1ckNodW5rIDwgZW5kQ2h1bms7ICsrY3VyQ2h1bmspIHsKICAgICAgdGhpcy5fbG9hZGVkQ2h1bmtzLmFkZChjdXJDaHVuayk7CiAgICB9CiAgfQogIGVuc3VyZUJ5dGUocG9zKSB7CiAgICBpZiAocG9zIDwgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgY2h1bmsgPSBNYXRoLmZsb29yKHBvcyAvIHRoaXMuY2h1bmtTaXplKTsKICAgIGlmIChjaHVuayA+IHRoaXMubnVtQ2h1bmtzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChjaHVuayA9PT0gdGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuaykgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CiAgICAgIHRocm93IG5ldyBNaXNzaW5nRGF0YUV4Y2VwdGlvbihwb3MsIHBvcyArIDEpOwogICAgfQogICAgdGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuayA9IGNodW5rOwogIH0KICBlbnN1cmVSYW5nZShiZWdpbiwgZW5kKSB7CiAgICBpZiAoYmVnaW4gPj0gZW5kKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChlbmQgPD0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7CiAgICBpZiAoYmVnaW5DaHVuayA+IHRoaXMubnVtQ2h1bmtzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGVuZENodW5rID0gTWF0aC5taW4oTWF0aC5mbG9vcigoZW5kIC0gMSkgLyB0aGlzLmNodW5rU2l6ZSkgKyAxLCB0aGlzLm51bUNodW5rcyk7CiAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKICAgICAgaWYgKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKSkgewogICAgICAgIHRocm93IG5ldyBNaXNzaW5nRGF0YUV4Y2VwdGlvbihiZWdpbiwgZW5kKTsKICAgICAgfQogICAgfQogIH0KICBuZXh0RW1wdHlDaHVuayhiZWdpbkNodW5rKSB7CiAgICBjb25zdCBudW1DaHVua3MgPSB0aGlzLm51bUNodW5rczsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ2h1bmtzOyArK2kpIHsKICAgICAgY29uc3QgY2h1bmsgPSAoYmVnaW5DaHVuayArIGkpICUgbnVtQ2h1bmtzOwogICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CiAgICAgICAgcmV0dXJuIGNodW5rOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaGFzQ2h1bmsoY2h1bmspIHsKICAgIHJldHVybiB0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKTsKICB9CiAgZ2V0Qnl0ZSgpIHsKICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zOwogICAgaWYgKHBvcyA+PSB0aGlzLmVuZCkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAocG9zID49IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CiAgICAgIHRoaXMuZW5zdXJlQnl0ZShwb3MpOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5wb3MrK107CiAgfQogIGdldEJ5dGVzKGxlbmd0aCkgewogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgcG9zID0gdGhpcy5wb3M7CiAgICBjb25zdCBzdHJFbmQgPSB0aGlzLmVuZDsKICAgIGlmICghbGVuZ3RoKSB7CiAgICAgIGlmIChzdHJFbmQgPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICAgIHRoaXMuZW5zdXJlUmFuZ2UocG9zLCBzdHJFbmQpOwogICAgICB9CiAgICAgIHJldHVybiBieXRlcy5zdWJhcnJheShwb3MsIHN0ckVuZCk7CiAgICB9CiAgICBsZXQgZW5kID0gcG9zICsgbGVuZ3RoOwogICAgaWYgKGVuZCA+IHN0ckVuZCkgewogICAgICBlbmQgPSBzdHJFbmQ7CiAgICB9CiAgICBpZiAoZW5kID4gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgdGhpcy5lbnN1cmVSYW5nZShwb3MsIGVuZCk7CiAgICB9CiAgICB0aGlzLnBvcyA9IGVuZDsKICAgIHJldHVybiBieXRlcy5zdWJhcnJheShwb3MsIGVuZCk7CiAgfQogIGdldEJ5dGVSYW5nZShiZWdpbiwgZW5kKSB7CiAgICBpZiAoYmVnaW4gPCAwKSB7CiAgICAgIGJlZ2luID0gMDsKICAgIH0KICAgIGlmIChlbmQgPiB0aGlzLmVuZCkgewogICAgICBlbmQgPSB0aGlzLmVuZDsKICAgIH0KICAgIGlmIChlbmQgPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICB0aGlzLmVuc3VyZVJhbmdlKGJlZ2luLCBlbmQpOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnl0ZXMuc3ViYXJyYXkoYmVnaW4sIGVuZCk7CiAgfQogIG1ha2VTdWJTdHJlYW0oc3RhcnQsIGxlbmd0aCwgZGljdCA9IG51bGwpIHsKICAgIGlmIChsZW5ndGgpIHsKICAgICAgaWYgKHN0YXJ0ICsgbGVuZ3RoID4gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgICB0aGlzLmVuc3VyZVJhbmdlKHN0YXJ0LCBzdGFydCArIGxlbmd0aCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RhcnQgPj0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgdGhpcy5lbnN1cmVCeXRlKHN0YXJ0KTsKICAgIH0KICAgIGZ1bmN0aW9uIENodW5rZWRTdHJlYW1TdWJzdHJlYW0oKSB7fQogICAgQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHRoaXMpOwogICAgQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGUuZ2V0TWlzc2luZ0NodW5rcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgY29uc3QgY2h1bmtTaXplID0gdGhpcy5jaHVua1NpemU7CiAgICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKHRoaXMuc3RhcnQgLyBjaHVua1NpemUpOwogICAgICBjb25zdCBlbmRDaHVuayA9IE1hdGguZmxvb3IoKHRoaXMuZW5kIC0gMSkgLyBjaHVua1NpemUpICsgMTsKICAgICAgY29uc3QgbWlzc2luZ0NodW5rcyA9IFtdOwogICAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CiAgICAgICAgICBtaXNzaW5nQ2h1bmtzLnB1c2goY2h1bmspOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbWlzc2luZ0NodW5rczsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGUsICJpc0RhdGFMb2FkZWQiLCB7CiAgICAgIGdldCgpIHsKICAgICAgICBpZiAodGhpcy5udW1DaHVua3NMb2FkZWQgPT09IHRoaXMubnVtQ2h1bmtzKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWlzc2luZ0NodW5rcygpLmxlbmd0aCA9PT0gMDsKICAgICAgfSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9KTsKICAgIGNvbnN0IHN1YlN0cmVhbSA9IG5ldyBDaHVua2VkU3RyZWFtU3Vic3RyZWFtKCk7CiAgICBzdWJTdHJlYW0ucG9zID0gc3ViU3RyZWFtLnN0YXJ0ID0gc3RhcnQ7CiAgICBzdWJTdHJlYW0uZW5kID0gc3RhcnQgKyBsZW5ndGggfHwgdGhpcy5lbmQ7CiAgICBzdWJTdHJlYW0uZGljdCA9IGRpY3Q7CiAgICByZXR1cm4gc3ViU3RyZWFtOwogIH0KICBnZXRCYXNlU3RyZWFtcygpIHsKICAgIHJldHVybiBbdGhpc107CiAgfQp9CmNsYXNzIENodW5rZWRTdHJlYW1NYW5hZ2VyIHsKICBjb25zdHJ1Y3RvcihwZGZOZXR3b3JrU3RyZWFtLCBhcmdzKSB7CiAgICB0aGlzLmxlbmd0aCA9IGFyZ3MubGVuZ3RoOwogICAgdGhpcy5jaHVua1NpemUgPSBhcmdzLnJhbmdlQ2h1bmtTaXplOwogICAgdGhpcy5zdHJlYW0gPSBuZXcgQ2h1bmtlZFN0cmVhbSh0aGlzLmxlbmd0aCwgdGhpcy5jaHVua1NpemUsIHRoaXMpOwogICAgdGhpcy5wZGZOZXR3b3JrU3RyZWFtID0gcGRmTmV0d29ya1N0cmVhbTsKICAgIHRoaXMuZGlzYWJsZUF1dG9GZXRjaCA9IGFyZ3MuZGlzYWJsZUF1dG9GZXRjaDsKICAgIHRoaXMubXNnSGFuZGxlciA9IGFyZ3MubXNnSGFuZGxlcjsKICAgIHRoaXMuY3VyclJlcXVlc3RJZCA9IDA7CiAgICB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdCA9IG5ldyBNYXAoKTsKICAgIHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoID0gMDsKICAgIHRoaXMuYWJvcnRlZCA9IGZhbHNlOwogICAgdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogIH0KICBzZW5kUmVxdWVzdChiZWdpbiwgZW5kKSB7CiAgICBjb25zdCByYW5nZVJlYWRlciA9IHRoaXMucGRmTmV0d29ya1N0cmVhbS5nZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKTsKICAgIGlmICghcmFuZ2VSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKICAgICAgcmFuZ2VSZWFkZXIub25Qcm9ncmVzcyA9IHRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMpOwogICAgfQogICAgbGV0IGNodW5rcyA9IFtdLAogICAgICBsb2FkZWQgPSAwOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgY29uc3QgcmVhZENodW5rID0gKHsKICAgICAgICB2YWx1ZSwKICAgICAgICBkb25lCiAgICAgIH0pID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKGRvbmUpIHsKICAgICAgICAgICAgY29uc3QgY2h1bmtEYXRhID0gYXJyYXlCdWZmZXJzVG9CeXRlcyhjaHVua3MpOwogICAgICAgICAgICBjaHVua3MgPSBudWxsOwogICAgICAgICAgICByZXNvbHZlKGNodW5rRGF0YSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGxvYWRlZCArPSB2YWx1ZS5ieXRlTGVuZ3RoOwogICAgICAgICAgaWYgKHJhbmdlUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkKSB7CiAgICAgICAgICAgIHRoaXMub25Qcm9ncmVzcyh7CiAgICAgICAgICAgICAgbG9hZGVkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgY2h1bmtzLnB1c2godmFsdWUpOwogICAgICAgICAgcmFuZ2VSZWFkZXIucmVhZCgpLnRoZW4ocmVhZENodW5rLCByZWplY3QpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHJlamVjdChlKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJhbmdlUmVhZGVyLnJlYWQoKS50aGVuKHJlYWRDaHVuaywgcmVqZWN0KTsKICAgIH0pLnRoZW4oZGF0YSA9PiB7CiAgICAgIGlmICh0aGlzLmFib3J0ZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5vblJlY2VpdmVEYXRhKHsKICAgICAgICBjaHVuazogZGF0YSwKICAgICAgICBiZWdpbgogICAgICB9KTsKICAgIH0pOwogIH0KICByZXF1ZXN0QWxsQ2h1bmtzKG5vRmV0Y2ggPSBmYWxzZSkgewogICAgaWYgKCFub0ZldGNoKSB7CiAgICAgIGNvbnN0IG1pc3NpbmdDaHVua3MgPSB0aGlzLnN0cmVhbS5nZXRNaXNzaW5nQ2h1bmtzKCk7CiAgICAgIHRoaXMuX3JlcXVlc3RDaHVua3MobWlzc2luZ0NodW5rcyk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5wcm9taXNlOwogIH0KICBfcmVxdWVzdENodW5rcyhjaHVua3MpIHsKICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuY3VyclJlcXVlc3RJZCsrOwogICAgY29uc3QgY2h1bmtzTmVlZGVkID0gbmV3IFNldCgpOwogICAgdGhpcy5fY2h1bmtzTmVlZGVkQnlSZXF1ZXN0LnNldChyZXF1ZXN0SWQsIGNodW5rc05lZWRlZCk7CiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykgewogICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGNodW5rKSkgewogICAgICAgIGNodW5rc05lZWRlZC5hZGQoY2h1bmspOwogICAgICB9CiAgICB9CiAgICBpZiAoY2h1bmtzTmVlZGVkLnNpemUgPT09IDApIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgfQogICAgY29uc3QgY2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3Quc2V0KHJlcXVlc3RJZCwgY2FwYWJpbGl0eSk7CiAgICBjb25zdCBjaHVua3NUb1JlcXVlc3QgPSBbXTsKICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzTmVlZGVkKSB7CiAgICAgIGxldCByZXF1ZXN0SWRzID0gdGhpcy5fcmVxdWVzdHNCeUNodW5rLmdldChjaHVuayk7CiAgICAgIGlmICghcmVxdWVzdElkcykgewogICAgICAgIHJlcXVlc3RJZHMgPSBbXTsKICAgICAgICB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuc2V0KGNodW5rLCByZXF1ZXN0SWRzKTsKICAgICAgICBjaHVua3NUb1JlcXVlc3QucHVzaChjaHVuayk7CiAgICAgIH0KICAgICAgcmVxdWVzdElkcy5wdXNoKHJlcXVlc3RJZCk7CiAgICB9CiAgICBpZiAoY2h1bmtzVG9SZXF1ZXN0Lmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgZ3JvdXBlZENodW5rc1RvUmVxdWVzdCA9IHRoaXMuZ3JvdXBDaHVua3MoY2h1bmtzVG9SZXF1ZXN0KTsKICAgICAgZm9yIChjb25zdCBncm91cGVkQ2h1bmsgb2YgZ3JvdXBlZENodW5rc1RvUmVxdWVzdCkgewogICAgICAgIGNvbnN0IGJlZ2luID0gZ3JvdXBlZENodW5rLmJlZ2luQ2h1bmsgKiB0aGlzLmNodW5rU2l6ZTsKICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihncm91cGVkQ2h1bmsuZW5kQ2h1bmsgKiB0aGlzLmNodW5rU2l6ZSwgdGhpcy5sZW5ndGgpOwogICAgICAgIHRoaXMuc2VuZFJlcXVlc3QoYmVnaW4sIGVuZCkuY2F0Y2goY2FwYWJpbGl0eS5yZWplY3QpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlLmNhdGNoKHJlYXNvbiA9PiB7CiAgICAgIGlmICh0aGlzLmFib3J0ZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIGdldFN0cmVhbSgpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbTsKICB9CiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIGVuZCA9IE1hdGgubWluKGVuZCwgdGhpcy5sZW5ndGgpOwogICAgY29uc3QgYmVnaW5DaHVuayA9IHRoaXMuZ2V0QmVnaW5DaHVuayhiZWdpbik7CiAgICBjb25zdCBlbmRDaHVuayA9IHRoaXMuZ2V0RW5kQ2h1bmsoZW5kKTsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgZm9yIChsZXQgY2h1bmsgPSBiZWdpbkNodW5rOyBjaHVuayA8IGVuZENodW5rOyArK2NodW5rKSB7CiAgICAgIGNodW5rcy5wdXNoKGNodW5rKTsKICAgIH0KICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKGNodW5rcyk7CiAgfQogIHJlcXVlc3RSYW5nZXMocmFuZ2VzID0gW10pIHsKICAgIGNvbnN0IGNodW5rc1RvUmVxdWVzdCA9IFtdOwogICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHsKICAgICAgY29uc3QgYmVnaW5DaHVuayA9IHRoaXMuZ2V0QmVnaW5DaHVuayhyYW5nZS5iZWdpbik7CiAgICAgIGNvbnN0IGVuZENodW5rID0gdGhpcy5nZXRFbmRDaHVuayhyYW5nZS5lbmQpOwogICAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKICAgICAgICBpZiAoIWNodW5rc1RvUmVxdWVzdC5pbmNsdWRlcyhjaHVuaykpIHsKICAgICAgICAgIGNodW5rc1RvUmVxdWVzdC5wdXNoKGNodW5rKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNodW5rc1RvUmVxdWVzdC5zb3J0KChhLCBiKSA9PiBhIC0gYik7CiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdENodW5rcyhjaHVua3NUb1JlcXVlc3QpOwogIH0KICBncm91cENodW5rcyhjaHVua3MpIHsKICAgIGNvbnN0IGdyb3VwZWRDaHVua3MgPSBbXTsKICAgIGxldCBiZWdpbkNodW5rID0gLTE7CiAgICBsZXQgcHJldkNodW5rID0gLTE7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaHVua3MubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBjaHVuayA9IGNodW5rc1tpXTsKICAgICAgaWYgKGJlZ2luQ2h1bmsgPCAwKSB7CiAgICAgICAgYmVnaW5DaHVuayA9IGNodW5rOwogICAgICB9CiAgICAgIGlmIChwcmV2Q2h1bmsgPj0gMCAmJiBwcmV2Q2h1bmsgKyAxICE9PSBjaHVuaykgewogICAgICAgIGdyb3VwZWRDaHVua3MucHVzaCh7CiAgICAgICAgICBiZWdpbkNodW5rLAogICAgICAgICAgZW5kQ2h1bms6IHByZXZDaHVuayArIDEKICAgICAgICB9KTsKICAgICAgICBiZWdpbkNodW5rID0gY2h1bms7CiAgICAgIH0KICAgICAgaWYgKGkgKyAxID09PSBjaHVua3MubGVuZ3RoKSB7CiAgICAgICAgZ3JvdXBlZENodW5rcy5wdXNoKHsKICAgICAgICAgIGJlZ2luQ2h1bmssCiAgICAgICAgICBlbmRDaHVuazogY2h1bmsgKyAxCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcHJldkNodW5rID0gY2h1bms7CiAgICB9CiAgICByZXR1cm4gZ3JvdXBlZENodW5rczsKICB9CiAgb25Qcm9ncmVzcyhhcmdzKSB7CiAgICB0aGlzLm1zZ0hhbmRsZXIuc2VuZCgiRG9jUHJvZ3Jlc3MiLCB7CiAgICAgIGxvYWRlZDogdGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkICogdGhpcy5jaHVua1NpemUgKyBhcmdzLmxvYWRlZCwKICAgICAgdG90YWw6IHRoaXMubGVuZ3RoCiAgICB9KTsKICB9CiAgb25SZWNlaXZlRGF0YShhcmdzKSB7CiAgICBjb25zdCBjaHVuayA9IGFyZ3MuY2h1bms7CiAgICBjb25zdCBpc1Byb2dyZXNzaXZlID0gYXJncy5iZWdpbiA9PT0gdW5kZWZpbmVkOwogICAgY29uc3QgYmVnaW4gPSBpc1Byb2dyZXNzaXZlID8gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggOiBhcmdzLmJlZ2luOwogICAgY29uc3QgZW5kID0gYmVnaW4gKyBjaHVuay5ieXRlTGVuZ3RoOwogICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7CiAgICBjb25zdCBlbmRDaHVuayA9IGVuZCA8IHRoaXMubGVuZ3RoID8gTWF0aC5mbG9vcihlbmQgLyB0aGlzLmNodW5rU2l6ZSkgOiBNYXRoLmNlaWwoZW5kIC8gdGhpcy5jaHVua1NpemUpOwogICAgaWYgKGlzUHJvZ3Jlc3NpdmUpIHsKICAgICAgdGhpcy5zdHJlYW0ub25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGNodW5rKTsKICAgICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSBlbmQ7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnN0cmVhbS5vblJlY2VpdmVEYXRhKGJlZ2luLCBjaHVuayk7CiAgICB9CiAgICBpZiAodGhpcy5zdHJlYW0uaXNEYXRhTG9hZGVkKSB7CiAgICAgIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucmVzb2x2ZSh0aGlzLnN0cmVhbSk7CiAgICB9CiAgICBjb25zdCBsb2FkZWRSZXF1ZXN0cyA9IFtdOwogICAgZm9yIChsZXQgY3VyQ2h1bmsgPSBiZWdpbkNodW5rOyBjdXJDaHVuayA8IGVuZENodW5rOyArK2N1ckNodW5rKSB7CiAgICAgIGNvbnN0IHJlcXVlc3RJZHMgPSB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZ2V0KGN1ckNodW5rKTsKICAgICAgaWYgKCFyZXF1ZXN0SWRzKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdGhpcy5fcmVxdWVzdHNCeUNodW5rLmRlbGV0ZShjdXJDaHVuayk7CiAgICAgIGZvciAoY29uc3QgcmVxdWVzdElkIG9mIHJlcXVlc3RJZHMpIHsKICAgICAgICBjb25zdCBjaHVua3NOZWVkZWQgPSB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QuZ2V0KHJlcXVlc3RJZCk7CiAgICAgICAgaWYgKGNodW5rc05lZWRlZC5oYXMoY3VyQ2h1bmspKSB7CiAgICAgICAgICBjaHVua3NOZWVkZWQuZGVsZXRlKGN1ckNodW5rKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNodW5rc05lZWRlZC5zaXplID4gMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxvYWRlZFJlcXVlc3RzLnB1c2gocmVxdWVzdElkKTsKICAgICAgfQogICAgfQogICAgaWYgKCF0aGlzLmRpc2FibGVBdXRvRmV0Y2ggJiYgdGhpcy5fcmVxdWVzdHNCeUNodW5rLnNpemUgPT09IDApIHsKICAgICAgbGV0IG5leHRFbXB0eUNodW5rOwogICAgICBpZiAodGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkID09PSAxKSB7CiAgICAgICAgY29uc3QgbGFzdENodW5rID0gdGhpcy5zdHJlYW0ubnVtQ2h1bmtzIC0gMTsKICAgICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGxhc3RDaHVuaykpIHsKICAgICAgICAgIG5leHRFbXB0eUNodW5rID0gbGFzdENodW5rOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBuZXh0RW1wdHlDaHVuayA9IHRoaXMuc3RyZWFtLm5leHRFbXB0eUNodW5rKGVuZENodW5rKTsKICAgICAgfQogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihuZXh0RW1wdHlDaHVuaykpIHsKICAgICAgICB0aGlzLl9yZXF1ZXN0Q2h1bmtzKFtuZXh0RW1wdHlDaHVua10pOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IHJlcXVlc3RJZCBvZiBsb2FkZWRSZXF1ZXN0cykgewogICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3QuZ2V0KHJlcXVlc3RJZCk7CiAgICAgIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmRlbGV0ZShyZXF1ZXN0SWQpOwogICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTsKICAgIH0KICAgIHRoaXMubXNnSGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIsIHsKICAgICAgbG9hZGVkOiB0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQgKiB0aGlzLmNodW5rU2l6ZSwKICAgICAgdG90YWw6IHRoaXMubGVuZ3RoCiAgICB9KTsKICB9CiAgb25FcnJvcihlcnIpIHsKICAgIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucmVqZWN0KGVycik7CiAgfQogIGdldEJlZ2luQ2h1bmsoYmVnaW4pIHsKICAgIHJldHVybiBNYXRoLmZsb29yKGJlZ2luIC8gdGhpcy5jaHVua1NpemUpOwogIH0KICBnZXRFbmRDaHVuayhlbmQpIHsKICAgIHJldHVybiBNYXRoLmZsb29yKChlbmQgLSAxKSAvIHRoaXMuY2h1bmtTaXplKSArIDE7CiAgfQogIGFib3J0KHJlYXNvbikgewogICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTsKICAgIHRoaXMucGRmTmV0d29ya1N0cmVhbT8uY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKTsKICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC52YWx1ZXMoKSkgewogICAgICBjYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL3NoYXJlZC9pbWFnZV91dGlscy5qcwoKZnVuY3Rpb24gY29udmVydFRvUkdCQShwYXJhbXMpIHsKICBzd2l0Y2ggKHBhcmFtcy5raW5kKSB7CiAgICBjYXNlIEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDoKICAgICAgcmV0dXJuIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHBhcmFtcyk7CiAgICBjYXNlIEltYWdlS2luZC5SR0JfMjRCUFA6CiAgICAgIHJldHVybiBjb252ZXJ0UkdCVG9SR0JBKHBhcmFtcyk7CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHsKICBzcmMsCiAgc3JjUG9zID0gMCwKICBkZXN0LAogIHdpZHRoLAogIGhlaWdodCwKICBub25CbGFja0NvbG9yID0gMHhmZmZmZmZmZiwKICBpbnZlcnNlRGVjb2RlID0gZmFsc2UKfSkgewogIGNvbnN0IGJsYWNrID0gRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4gPyAweGZmMDAwMDAwIDogMHgwMDAwMDBmZjsKICBjb25zdCBbemVyb01hcHBpbmcsIG9uZU1hcHBpbmddID0gaW52ZXJzZURlY29kZSA/IFtub25CbGFja0NvbG9yLCBibGFja10gOiBbYmxhY2ssIG5vbkJsYWNrQ29sb3JdOwogIGNvbnN0IHdpZHRoSW5Tb3VyY2UgPSB3aWR0aCA+PiAzOwogIGNvbnN0IHdpZHRoUmVtYWluZGVyID0gd2lkdGggJiA3OwogIGNvbnN0IHNyY0xlbmd0aCA9IHNyYy5sZW5ndGg7CiAgZGVzdCA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlcik7CiAgbGV0IGRlc3RQb3MgPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIGZvciAoY29uc3QgbWF4ID0gc3JjUG9zICsgd2lkdGhJblNvdXJjZTsgc3JjUG9zIDwgbWF4OyBzcmNQb3MrKykgewogICAgICBjb25zdCBlbGVtID0gc3JjUG9zIDwgc3JjTGVuZ3RoID8gc3JjW3NyY1Bvc10gOiAyNTU7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgfQogICAgaWYgKHdpZHRoUmVtYWluZGVyID09PSAwKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgZWxlbSA9IHNyY1BvcyA8IHNyY0xlbmd0aCA/IHNyY1tzcmNQb3MrK10gOiAyNTU7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHdpZHRoUmVtYWluZGVyOyBqKyspIHsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDEgPDwgNyAtIGogPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7CiAgICB9CiAgfQogIHJldHVybiB7CiAgICBzcmNQb3MsCiAgICBkZXN0UG9zCiAgfTsKfQpmdW5jdGlvbiBjb252ZXJ0UkdCVG9SR0JBKHsKICBzcmMsCiAgc3JjUG9zID0gMCwKICBkZXN0LAogIGRlc3RQb3MgPSAwLAogIHdpZHRoLAogIGhlaWdodAp9KSB7CiAgbGV0IGkgPSAwOwogIGNvbnN0IGxlbiA9IHdpZHRoICogaGVpZ2h0ICogMzsKICBjb25zdCBsZW4zMiA9IGxlbiA+PiAyOwogIGNvbnN0IHNyYzMyID0gbmV3IFVpbnQzMkFycmF5KHNyYy5idWZmZXIsIHNyY1BvcywgbGVuMzIpOwogIGlmIChGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbikgewogICAgZm9yICg7IGkgPCBsZW4zMiAtIDI7IGkgKz0gMywgZGVzdFBvcyArPSA0KSB7CiAgICAgIGNvbnN0IHMxID0gc3JjMzJbaV07CiAgICAgIGNvbnN0IHMyID0gc3JjMzJbaSArIDFdOwogICAgICBjb25zdCBzMyA9IHNyYzMyW2kgKyAyXTsKICAgICAgZGVzdFtkZXN0UG9zXSA9IHMxIHwgMHhmZjAwMDAwMDsKICAgICAgZGVzdFtkZXN0UG9zICsgMV0gPSBzMSA+Pj4gMjQgfCBzMiA8PCA4IHwgMHhmZjAwMDAwMDsKICAgICAgZGVzdFtkZXN0UG9zICsgMl0gPSBzMiA+Pj4gMTYgfCBzMyA8PCAxNiB8IDB4ZmYwMDAwMDA7CiAgICAgIGRlc3RbZGVzdFBvcyArIDNdID0gczMgPj4+IDggfCAweGZmMDAwMDAwOwogICAgfQogICAgZm9yIChsZXQgaiA9IGkgKiA0LCBqaiA9IHNyY1BvcyArIGxlbjsgaiA8IGpqOyBqICs9IDMpIHsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW2pdIHwgc3JjW2ogKyAxXSA8PCA4IHwgc3JjW2ogKyAyXSA8PCAxNiB8IDB4ZmYwMDAwMDA7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAoOyBpIDwgbGVuMzIgLSAyOyBpICs9IDMsIGRlc3RQb3MgKz0gNCkgewogICAgICBjb25zdCBzMSA9IHNyYzMyW2ldOwogICAgICBjb25zdCBzMiA9IHNyYzMyW2kgKyAxXTsKICAgICAgY29uc3QgczMgPSBzcmMzMltpICsgMl07CiAgICAgIGRlc3RbZGVzdFBvc10gPSBzMSB8IDB4ZmY7CiAgICAgIGRlc3RbZGVzdFBvcyArIDFdID0gczEgPDwgMjQgfCBzMiA+Pj4gOCB8IDB4ZmY7CiAgICAgIGRlc3RbZGVzdFBvcyArIDJdID0gczIgPDwgMTYgfCBzMyA+Pj4gMTYgfCAweGZmOwogICAgICBkZXN0W2Rlc3RQb3MgKyAzXSA9IHMzIDw8IDggfCAweGZmOwogICAgfQogICAgZm9yIChsZXQgaiA9IGkgKiA0LCBqaiA9IHNyY1BvcyArIGxlbjsgaiA8IGpqOyBqICs9IDMpIHsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW2pdIDw8IDI0IHwgc3JjW2ogKyAxXSA8PCAxNiB8IHNyY1tqICsgMl0gPDwgOCB8IDB4ZmY7CiAgICB9CiAgfQogIHJldHVybiB7CiAgICBzcmNQb3M6IHNyY1BvcyArIGxlbiwKICAgIGRlc3RQb3MKICB9Owp9CmZ1bmN0aW9uIGdyYXlUb1JHQkEoc3JjLCBkZXN0KSB7CiAgaWYgKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBkZXN0W2ldID0gc3JjW2ldICogMHgxMDEwMSB8IDB4ZmYwMDAwMDA7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNyYy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGRlc3RbaV0gPSBzcmNbaV0gKiAweDEwMTAxMDAgfCAweDAwMDAwMGZmOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvaW1hZ2VfcmVzaXplci5qcwoKCgpjb25zdCBNSU5fSU1BR0VfRElNID0gMjA0ODsKY29uc3QgTUFYX0lNQUdFX0RJTSA9IDY1NTM3Owpjb25zdCBNQVhfRVJST1IgPSAxMjg7CmNsYXNzIEltYWdlUmVzaXplciB7CiAgc3RhdGljICNnb29kU3F1YXJlTGVuZ3RoID0gTUlOX0lNQUdFX0RJTTsKICBzdGF0aWMgI2lzSW1hZ2VEZWNvZGVyU3VwcG9ydGVkID0gRmVhdHVyZVRlc3QuaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQ7CiAgY29uc3RydWN0b3IoaW1nRGF0YSwgaXNNYXNrKSB7CiAgICB0aGlzLl9pbWdEYXRhID0gaW1nRGF0YTsKICAgIHRoaXMuX2lzTWFzayA9IGlzTWFzazsKICB9CiAgc3RhdGljIGdldCBjYW5Vc2VJbWFnZURlY29kZXIoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjYW5Vc2VJbWFnZURlY29kZXIiLCB0aGlzLiNpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA/IEltYWdlRGVjb2Rlci5pc1R5cGVTdXBwb3J0ZWQoImltYWdlL2JtcCIpIDogUHJvbWlzZS5yZXNvbHZlKGZhbHNlKSk7CiAgfQogIHN0YXRpYyBuZWVkc1RvQmVSZXNpemVkKHdpZHRoLCBoZWlnaHQpIHsKICAgIGlmICh3aWR0aCA8PSB0aGlzLiNnb29kU3F1YXJlTGVuZ3RoICYmIGhlaWdodCA8PSB0aGlzLiNnb29kU3F1YXJlTGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgTUFYX0RJTQogICAgfSA9IHRoaXM7CiAgICBpZiAod2lkdGggPiBNQVhfRElNIHx8IGhlaWdodCA+IE1BWF9ESU0pIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjb25zdCBhcmVhID0gd2lkdGggKiBoZWlnaHQ7CiAgICBpZiAodGhpcy5faGFzTWF4QXJlYSkgewogICAgICByZXR1cm4gYXJlYSA+IHRoaXMuTUFYX0FSRUE7CiAgICB9CiAgICBpZiAoYXJlYSA8IHRoaXMuI2dvb2RTcXVhcmVMZW5ndGggKiogMikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy5fYXJlR29vZERpbXMod2lkdGgsIGhlaWdodCkpIHsKICAgICAgdGhpcy4jZ29vZFNxdWFyZUxlbmd0aCA9IE1hdGgubWF4KHRoaXMuI2dvb2RTcXVhcmVMZW5ndGgsIE1hdGguZmxvb3IoTWF0aC5zcXJ0KHdpZHRoICogaGVpZ2h0KSkpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB0aGlzLiNnb29kU3F1YXJlTGVuZ3RoID0gdGhpcy5fZ3Vlc3NNYXgodGhpcy4jZ29vZFNxdWFyZUxlbmd0aCwgTUFYX0RJTSwgTUFYX0VSUk9SLCAwKTsKICAgIGNvbnN0IG1heEFyZWEgPSB0aGlzLk1BWF9BUkVBID0gdGhpcy4jZ29vZFNxdWFyZUxlbmd0aCAqKiAyOwogICAgcmV0dXJuIGFyZWEgPiBtYXhBcmVhOwogIH0KICBzdGF0aWMgZ2V0IE1BWF9ESU0oKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJNQVhfRElNIiwgdGhpcy5fZ3Vlc3NNYXgoTUlOX0lNQUdFX0RJTSwgTUFYX0lNQUdFX0RJTSwgMCwgMSkpOwogIH0KICBzdGF0aWMgZ2V0IE1BWF9BUkVBKCkgewogICAgdGhpcy5faGFzTWF4QXJlYSA9IHRydWU7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJNQVhfQVJFQSIsIHRoaXMuX2d1ZXNzTWF4KHRoaXMuI2dvb2RTcXVhcmVMZW5ndGgsIHRoaXMuTUFYX0RJTSwgTUFYX0VSUk9SLCAwKSAqKiAyKTsKICB9CiAgc3RhdGljIHNldCBNQVhfQVJFQShhcmVhKSB7CiAgICBpZiAoYXJlYSA+PSAwKSB7CiAgICAgIHRoaXMuX2hhc01heEFyZWEgPSB0cnVlOwogICAgICBzaGFkb3codGhpcywgIk1BWF9BUkVBIiwgYXJlYSk7CiAgICB9CiAgfQogIHN0YXRpYyBzZXRPcHRpb25zKHsKICAgIGNhbnZhc01heEFyZWFJbkJ5dGVzID0gLTEsCiAgICBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA9IGZhbHNlCiAgfSkgewogICAgaWYgKCF0aGlzLl9oYXNNYXhBcmVhKSB7CiAgICAgIHRoaXMuTUFYX0FSRUEgPSBjYW52YXNNYXhBcmVhSW5CeXRlcyA+PiAyOwogICAgfQogICAgdGhpcy4jaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQgPSBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZDsKICB9CiAgc3RhdGljIF9hcmVHb29kRGltcyh3aWR0aCwgaGVpZ2h0KSB7CiAgICB0cnkgewogICAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOwogICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpOwogICAgICBjb25zdCBvcGFjaXR5ID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhWzNdOwogICAgICBjYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gMTsKICAgICAgcmV0dXJuIG9wYWNpdHkgIT09IDA7CiAgICB9IGNhdGNoIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBzdGF0aWMgX2d1ZXNzTWF4KHN0YXJ0LCBlbmQsIHRvbGVyYW5jZSwgZGVmYXVsdEhlaWdodCkgewogICAgd2hpbGUgKHN0YXJ0ICsgdG9sZXJhbmNlICsgMSA8IGVuZCkgewogICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmZsb29yKChzdGFydCArIGVuZCkgLyAyKTsKICAgICAgY29uc3QgaGVpZ2h0ID0gZGVmYXVsdEhlaWdodCB8fCBtaWRkbGU7CiAgICAgIGlmICh0aGlzLl9hcmVHb29kRGltcyhtaWRkbGUsIGhlaWdodCkpIHsKICAgICAgICBzdGFydCA9IG1pZGRsZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbmQgPSBtaWRkbGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdGFydDsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZUltYWdlKGltZ0RhdGEsIGlzTWFzayA9IGZhbHNlKSB7CiAgICByZXR1cm4gbmV3IEltYWdlUmVzaXplcihpbWdEYXRhLCBpc01hc2spLl9jcmVhdGVJbWFnZSgpOwogIH0KICBhc3luYyBfY3JlYXRlSW1hZ2UoKSB7CiAgICBjb25zdCB7CiAgICAgIF9pbWdEYXRhOiBpbWdEYXRhCiAgICB9ID0gdGhpczsKICAgIGNvbnN0IHsKICAgICAgd2lkdGgsCiAgICAgIGhlaWdodAogICAgfSA9IGltZ0RhdGE7CiAgICBpZiAod2lkdGggKiBoZWlnaHQgKiA0ID4gTUFYX0lOVF8zMikgewogICAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNyZXNjYWxlSW1hZ2VEYXRhKCk7CiAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9CiAgICBjb25zdCBkYXRhID0gdGhpcy5fZW5jb2RlQk1QKCk7CiAgICBsZXQgZGVjb2RlciwgaW1hZ2VQcm9taXNlOwogICAgaWYgKGF3YWl0IEltYWdlUmVzaXplci5jYW5Vc2VJbWFnZURlY29kZXIpIHsKICAgICAgZGVjb2RlciA9IG5ldyBJbWFnZURlY29kZXIoewogICAgICAgIGRhdGEsCiAgICAgICAgdHlwZTogImltYWdlL2JtcCIsCiAgICAgICAgcHJlZmVyQW5pbWF0aW9uOiBmYWxzZSwKICAgICAgICB0cmFuc2ZlcjogW2RhdGEuYnVmZmVyXQogICAgICB9KTsKICAgICAgaW1hZ2VQcm9taXNlID0gZGVjb2Rlci5kZWNvZGUoKS5jYXRjaChyZWFzb24gPT4gewogICAgICAgIHdhcm4oYEJNUCBpbWFnZSBkZWNvZGluZyBmYWlsZWQ6ICR7cmVhc29ufWApOwogICAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChuZXcgQmxvYihbdGhpcy5fZW5jb2RlQk1QKCkuYnVmZmVyXSwgewogICAgICAgICAgdHlwZTogImltYWdlL2JtcCIKICAgICAgICB9KSk7CiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gewogICAgICAgIGRlY29kZXIuY2xvc2UoKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBpbWFnZVByb21pc2UgPSBjcmVhdGVJbWFnZUJpdG1hcChuZXcgQmxvYihbZGF0YS5idWZmZXJdLCB7CiAgICAgICAgdHlwZTogImltYWdlL2JtcCIKICAgICAgfSkpOwogICAgfQogICAgY29uc3QgewogICAgICBNQVhfQVJFQSwKICAgICAgTUFYX0RJTQogICAgfSA9IEltYWdlUmVzaXplcjsKICAgIGNvbnN0IG1pbkZhY3RvciA9IE1hdGgubWF4KHdpZHRoIC8gTUFYX0RJTSwgaGVpZ2h0IC8gTUFYX0RJTSwgTWF0aC5zcXJ0KHdpZHRoICogaGVpZ2h0IC8gTUFYX0FSRUEpKTsKICAgIGNvbnN0IGZpcnN0RmFjdG9yID0gTWF0aC5tYXgobWluRmFjdG9yLCAyKTsKICAgIGNvbnN0IGZhY3RvciA9IE1hdGgucm91bmQoMTAgKiAobWluRmFjdG9yICsgMS4yNSkpIC8gMTAgLyBmaXJzdEZhY3RvcjsKICAgIGNvbnN0IE4gPSBNYXRoLmZsb29yKE1hdGgubG9nMihmYWN0b3IpKTsKICAgIGNvbnN0IHN0ZXBzID0gbmV3IEFycmF5KE4gKyAyKS5maWxsKDIpOwogICAgc3RlcHNbMF0gPSBmaXJzdEZhY3RvcjsKICAgIHN0ZXBzLnNwbGljZSgtMSwgMSwgZmFjdG9yIC8gKDEgPDwgTikpOwogICAgbGV0IG5ld1dpZHRoID0gd2lkdGg7CiAgICBsZXQgbmV3SGVpZ2h0ID0gaGVpZ2h0OwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW1hZ2VQcm9taXNlOwogICAgbGV0IGJpdG1hcCA9IHJlc3VsdC5pbWFnZSB8fCByZXN1bHQ7CiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHsKICAgICAgY29uc3QgcHJldldpZHRoID0gbmV3V2lkdGg7CiAgICAgIGNvbnN0IHByZXZIZWlnaHQgPSBuZXdIZWlnaHQ7CiAgICAgIG5ld1dpZHRoID0gTWF0aC5mbG9vcihuZXdXaWR0aCAvIHN0ZXApIC0gMTsKICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5mbG9vcihuZXdIZWlnaHQgLyBzdGVwKSAtIDE7CiAgICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMobmV3V2lkdGgsIG5ld0hlaWdodCk7CiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICBjdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCwgcHJldldpZHRoLCBwcmV2SGVpZ2h0LCAwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKICAgICAgYml0bWFwLmNsb3NlKCk7CiAgICAgIGJpdG1hcCA9IGNhbnZhcy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTsKICAgIH0KICAgIGltZ0RhdGEuZGF0YSA9IG51bGw7CiAgICBpbWdEYXRhLmJpdG1hcCA9IGJpdG1hcDsKICAgIGltZ0RhdGEud2lkdGggPSBuZXdXaWR0aDsKICAgIGltZ0RhdGEuaGVpZ2h0ID0gbmV3SGVpZ2h0OwogICAgcmV0dXJuIGltZ0RhdGE7CiAgfQogICNyZXNjYWxlSW1hZ2VEYXRhKCkgewogICAgY29uc3QgewogICAgICBfaW1nRGF0YTogaW1nRGF0YQogICAgfSA9IHRoaXM7CiAgICBjb25zdCB7CiAgICAgIGRhdGEsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGtpbmQKICAgIH0gPSBpbWdEYXRhOwogICAgY29uc3QgcmdiYVNpemUgPSB3aWR0aCAqIGhlaWdodCAqIDQ7CiAgICBjb25zdCBLID0gTWF0aC5jZWlsKE1hdGgubG9nMihyZ2JhU2l6ZSAvIE1BWF9JTlRfMzIpKTsKICAgIGNvbnN0IG5ld1dpZHRoID0gd2lkdGggPj4gSzsKICAgIGNvbnN0IG5ld0hlaWdodCA9IGhlaWdodCA+PiBLOwogICAgbGV0IHJnYmFEYXRhOwogICAgbGV0IG1heEhlaWdodCA9IGhlaWdodDsKICAgIHRyeSB7CiAgICAgIHJnYmFEYXRhID0gbmV3IFVpbnQ4QXJyYXkocmdiYVNpemUpOwogICAgfSBjYXRjaCB7CiAgICAgIGxldCBuID0gTWF0aC5mbG9vcihNYXRoLmxvZzIocmdiYVNpemUgKyAxKSk7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJnYmFEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMiAqKiBuIC0gMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIG4gLT0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5mbG9vcigoMiAqKiBuIC0gMSkgLyAod2lkdGggKiA0KSk7CiAgICAgIGNvbnN0IG5ld1NpemUgPSB3aWR0aCAqIG1heEhlaWdodCAqIDQ7CiAgICAgIGlmIChuZXdTaXplIDwgcmdiYURhdGEubGVuZ3RoKSB7CiAgICAgICAgcmdiYURhdGEgPSBuZXcgVWludDhBcnJheShuZXdTaXplKTsKICAgICAgfQogICAgfQogICAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkocmdiYURhdGEuYnVmZmVyKTsKICAgIGNvbnN0IGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShuZXdXaWR0aCAqIG5ld0hlaWdodCk7CiAgICBsZXQgc3JjUG9zID0gMDsKICAgIGxldCBuZXdJbmRleCA9IDA7CiAgICBjb25zdCBzdGVwID0gTWF0aC5jZWlsKGhlaWdodCAvIG1heEhlaWdodCk7CiAgICBjb25zdCByZW1haW5kZXIgPSBoZWlnaHQgJSBtYXhIZWlnaHQgPT09IDAgPyBoZWlnaHQgOiBoZWlnaHQgJSBtYXhIZWlnaHQ7CiAgICBmb3IgKGxldCBrID0gMDsgayA8IHN0ZXA7IGsrKykgewogICAgICBjb25zdCBoID0gayA8IHN0ZXAgLSAxID8gbWF4SGVpZ2h0IDogcmVtYWluZGVyOwogICAgICAoewogICAgICAgIHNyY1BvcwogICAgICB9ID0gY29udmVydFRvUkdCQSh7CiAgICAgICAga2luZCwKICAgICAgICBzcmM6IGRhdGEsCiAgICAgICAgZGVzdDogc3JjMzIsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0OiBoLAogICAgICAgIGludmVyc2VEZWNvZGU6IHRoaXMuX2lzTWFzaywKICAgICAgICBzcmNQb3MKICAgICAgfSkpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoID4+IEs7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgYnVmID0gc3JjMzIuc3ViYXJyYXkoKGkgPDwgSykgKiB3aWR0aCk7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdXaWR0aDsgaisrKSB7CiAgICAgICAgICBkZXN0MzJbbmV3SW5kZXgrK10gPSBidWZbaiA8PCBLXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChJbWFnZVJlc2l6ZXIubmVlZHNUb0JlUmVzaXplZChuZXdXaWR0aCwgbmV3SGVpZ2h0KSkgewogICAgICBpbWdEYXRhLmRhdGEgPSBkZXN0MzI7CiAgICAgIGltZ0RhdGEud2lkdGggPSBuZXdXaWR0aDsKICAgICAgaW1nRGF0YS5oZWlnaHQgPSBuZXdIZWlnaHQ7CiAgICAgIGltZ0RhdGEua2luZCA9IEltYWdlS2luZC5SR0JBXzMyQlBQOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMobmV3V2lkdGgsIG5ld0hlaWdodCk7CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CiAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZQogICAgfSk7CiAgICBjdHgucHV0SW1hZ2VEYXRhKG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRlc3QzMi5idWZmZXIpLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KSwgMCwgMCk7CiAgICBpbWdEYXRhLmRhdGEgPSBudWxsOwogICAgaW1nRGF0YS5iaXRtYXAgPSBjYW52YXMudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7CiAgICBpbWdEYXRhLndpZHRoID0gbmV3V2lkdGg7CiAgICBpbWdEYXRhLmhlaWdodCA9IG5ld0hlaWdodDsKICAgIHJldHVybiBpbWdEYXRhOwogIH0KICBfZW5jb2RlQk1QKCkgewogICAgY29uc3QgewogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0LAogICAgICBraW5kCiAgICB9ID0gdGhpcy5faW1nRGF0YTsKICAgIGxldCBkYXRhID0gdGhpcy5faW1nRGF0YS5kYXRhOwogICAgbGV0IGJpdFBlclBpeGVsOwogICAgbGV0IGNvbG9yVGFibGUgPSBuZXcgVWludDhBcnJheSgwKTsKICAgIGxldCBtYXNrVGFibGUgPSBjb2xvclRhYmxlOwogICAgbGV0IGNvbXByZXNzaW9uID0gMDsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDoKICAgICAgICB7CiAgICAgICAgICBiaXRQZXJQaXhlbCA9IDE7CiAgICAgICAgICBjb2xvclRhYmxlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5faXNNYXNrID8gWzI1NSwgMjU1LCAyNTUsIDI1NSwgMCwgMCwgMCwgMF0gOiBbMCwgMCwgMCwgMCwgMjU1LCAyNTUsIDI1NSwgMjU1XSk7CiAgICAgICAgICBjb25zdCByb3dMZW4gPSB3aWR0aCArIDcgPj4gMzsKICAgICAgICAgIGNvbnN0IHJvd1NpemUgPSByb3dMZW4gKyAzICYgLTQ7CiAgICAgICAgICBpZiAocm93TGVuICE9PSByb3dTaXplKSB7CiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgVWludDhBcnJheShyb3dTaXplICogaGVpZ2h0KTsKICAgICAgICAgICAgbGV0IGsgPSAwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoZWlnaHQgKiByb3dMZW47IGkgPCBpaTsgaSArPSByb3dMZW4sIGsgKz0gcm93U2l6ZSkgewogICAgICAgICAgICAgIG5ld0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoaSwgaSArIHJvd0xlbiksIGspOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRhdGEgPSBuZXdEYXRhOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIEltYWdlS2luZC5SR0JfMjRCUFA6CiAgICAgICAgewogICAgICAgICAgYml0UGVyUGl4ZWwgPSAyNDsKICAgICAgICAgIGlmICh3aWR0aCAmIDMpIHsKICAgICAgICAgICAgY29uc3Qgcm93TGVuID0gMyAqIHdpZHRoOwogICAgICAgICAgICBjb25zdCByb3dTaXplID0gcm93TGVuICsgMyAmIC00OwogICAgICAgICAgICBjb25zdCBleHRyYUxlbiA9IHJvd1NpemUgLSByb3dMZW47CiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgVWludDhBcnJheShyb3dTaXplICogaGVpZ2h0KTsKICAgICAgICAgICAgbGV0IGsgPSAwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoZWlnaHQgKiByb3dMZW47IGkgPCBpaTsgaSArPSByb3dMZW4pIHsKICAgICAgICAgICAgICBjb25zdCByb3cgPSBkYXRhLnN1YmFycmF5KGksIGkgKyByb3dMZW4pOwogICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93TGVuOyBqICs9IDMpIHsKICAgICAgICAgICAgICAgIG5ld0RhdGFbaysrXSA9IHJvd1tqICsgMl07CiAgICAgICAgICAgICAgICBuZXdEYXRhW2srK10gPSByb3dbaiArIDFdOwogICAgICAgICAgICAgICAgbmV3RGF0YVtrKytdID0gcm93W2pdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBrICs9IGV4dHJhTGVuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRhdGEgPSBuZXdEYXRhOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSArPSAzKSB7CiAgICAgICAgICAgICAgY29uc3QgdG1wID0gZGF0YVtpXTsKICAgICAgICAgICAgICBkYXRhW2ldID0gZGF0YVtpICsgMl07CiAgICAgICAgICAgICAgZGF0YVtpICsgMl0gPSB0bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBJbWFnZUtpbmQuUkdCQV8zMkJQUDoKICAgICAgICBiaXRQZXJQaXhlbCA9IDMyOwogICAgICAgIGNvbXByZXNzaW9uID0gMzsKICAgICAgICBtYXNrVGFibGUgPSBuZXcgVWludDhBcnJheSg0ICsgNCArIDQgKyA0ICsgNTIpOwogICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcobWFza1RhYmxlLmJ1ZmZlcik7CiAgICAgICAgaWYgKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMigwLCAweDAwMDAwMGZmLCB0cnVlKTsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDQsIDB4MDAwMGZmMDAsIHRydWUpOwogICAgICAgICAgdmlldy5zZXRVaW50MzIoOCwgMHgwMGZmMDAwMCwgdHJ1ZSk7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMigxMiwgMHhmZjAwMDAwMCwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDAsIDB4ZmYwMDAwMDAsIHRydWUpOwogICAgICAgICAgdmlldy5zZXRVaW50MzIoNCwgMHgwMGZmMDAwMCwgdHJ1ZSk7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMig4LCAweDAwMDBmZjAwLCB0cnVlKTsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDEyLCAweDAwMDAwMGZmLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdCIpOwogICAgfQogICAgbGV0IGkgPSAwOwogICAgY29uc3QgaGVhZGVyTGVuZ3RoID0gNDAgKyBtYXNrVGFibGUubGVuZ3RoOwogICAgY29uc3QgZmlsZUxlbmd0aCA9IDE0ICsgaGVhZGVyTGVuZ3RoICsgY29sb3JUYWJsZS5sZW5ndGggKyBkYXRhLmxlbmd0aDsKICAgIGNvbnN0IGJtcERhdGEgPSBuZXcgVWludDhBcnJheShmaWxlTGVuZ3RoKTsKICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYm1wRGF0YS5idWZmZXIpOwogICAgdmlldy5zZXRVaW50MTYoaSwgMHg0ZDQyLCB0cnVlKTsKICAgIGkgKz0gMjsKICAgIHZpZXcuc2V0VWludDMyKGksIGZpbGVMZW5ndGgsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRVaW50MzIoaSwgMCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQzMihpLCAxNCArIGhlYWRlckxlbmd0aCArIGNvbG9yVGFibGUubGVuZ3RoLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0VWludDMyKGksIGhlYWRlckxlbmd0aCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldEludDMyKGksIHdpZHRoLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0SW50MzIoaSwgLWhlaWdodCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQxNihpLCAxLCB0cnVlKTsKICAgIGkgKz0gMjsKICAgIHZpZXcuc2V0VWludDE2KGksIGJpdFBlclBpeGVsLCB0cnVlKTsKICAgIGkgKz0gMjsKICAgIHZpZXcuc2V0VWludDMyKGksIGNvbXByZXNzaW9uLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0VWludDMyKGksIDAsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRJbnQzMihpLCAwLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0SW50MzIoaSwgMCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQzMihpLCBjb2xvclRhYmxlLmxlbmd0aCAvIDQsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRVaW50MzIoaSwgMCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICBibXBEYXRhLnNldChtYXNrVGFibGUsIGkpOwogICAgaSArPSBtYXNrVGFibGUubGVuZ3RoOwogICAgYm1wRGF0YS5zZXQoY29sb3JUYWJsZSwgaSk7CiAgICBpICs9IGNvbG9yVGFibGUubGVuZ3RoOwogICAgYm1wRGF0YS5zZXQoZGF0YSwgaSk7CiAgICByZXR1cm4gYm1wRGF0YTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2RlY29kZV9zdHJlYW0uanMKCgpjb25zdCBlbXB0eUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApOwpjbGFzcyBEZWNvZGVTdHJlYW0gZXh0ZW5kcyBCYXNlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihtYXliZU1pbkJ1ZmZlckxlbmd0aCkgewogICAgc3VwZXIoKTsKICAgIHRoaXMuX3Jhd01pbkJ1ZmZlckxlbmd0aCA9IG1heWJlTWluQnVmZmVyTGVuZ3RoIHx8IDA7CiAgICB0aGlzLnBvcyA9IDA7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7CiAgICB0aGlzLmVvZiA9IGZhbHNlOwogICAgdGhpcy5idWZmZXIgPSBlbXB0eUJ1ZmZlcjsKICAgIHRoaXMubWluQnVmZmVyTGVuZ3RoID0gNTEyOwogICAgaWYgKG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7CiAgICAgIHdoaWxlICh0aGlzLm1pbkJ1ZmZlckxlbmd0aCA8IG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7CiAgICAgICAgdGhpcy5taW5CdWZmZXJMZW5ndGggKj0gMjsKICAgICAgfQogICAgfQogIH0KICBnZXQgaXNFbXB0eSgpIHsKICAgIHdoaWxlICghdGhpcy5lb2YgJiYgdGhpcy5idWZmZXJMZW5ndGggPT09IDApIHsKICAgICAgdGhpcy5yZWFkQmxvY2soKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmJ1ZmZlckxlbmd0aCA9PT0gMDsKICB9CiAgZW5zdXJlQnVmZmVyKHJlcXVlc3RlZCkgewogICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICBpZiAocmVxdWVzdGVkIDw9IGJ1ZmZlci5ieXRlTGVuZ3RoKSB7CiAgICAgIHJldHVybiBidWZmZXI7CiAgICB9CiAgICBsZXQgc2l6ZSA9IHRoaXMubWluQnVmZmVyTGVuZ3RoOwogICAgd2hpbGUgKHNpemUgPCByZXF1ZXN0ZWQpIHsKICAgICAgc2l6ZSAqPSAyOwogICAgfQogICAgY29uc3QgYnVmZmVyMiA9IG5ldyBVaW50OEFycmF5KHNpemUpOwogICAgYnVmZmVyMi5zZXQoYnVmZmVyKTsKICAgIHJldHVybiB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjI7CiAgfQogIGdldEJ5dGUoKSB7CiAgICBjb25zdCBwb3MgPSB0aGlzLnBvczsKICAgIHdoaWxlICh0aGlzLmJ1ZmZlckxlbmd0aCA8PSBwb3MpIHsKICAgICAgaWYgKHRoaXMuZW9mKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIHRoaXMucmVhZEJsb2NrKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5wb3MrK107CiAgfQogIGdldEJ5dGVzKGxlbmd0aCwgZGVjb2Rlck9wdGlvbnMgPSBudWxsKSB7CiAgICBjb25zdCBwb3MgPSB0aGlzLnBvczsKICAgIGxldCBlbmQ7CiAgICBpZiAobGVuZ3RoKSB7CiAgICAgIHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIGxlbmd0aCk7CiAgICAgIGVuZCA9IHBvcyArIGxlbmd0aDsKICAgICAgd2hpbGUgKCF0aGlzLmVvZiAmJiB0aGlzLmJ1ZmZlckxlbmd0aCA8IGVuZCkgewogICAgICAgIHRoaXMucmVhZEJsb2NrKGRlY29kZXJPcHRpb25zKTsKICAgICAgfQogICAgICBjb25zdCBidWZFbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgICAgaWYgKGVuZCA+IGJ1ZkVuZCkgewogICAgICAgIGVuZCA9IGJ1ZkVuZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKCF0aGlzLmVvZikgewogICAgICAgIHRoaXMucmVhZEJsb2NrKGRlY29kZXJPcHRpb25zKTsKICAgICAgfQogICAgICBlbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIH0KICAgIHRoaXMucG9zID0gZW5kOwogICAgcmV0dXJuIHRoaXMuYnVmZmVyLnN1YmFycmF5KHBvcywgZW5kKTsKICB9CiAgYXN5bmMgZ2V0SW1hZ2VEYXRhKGxlbmd0aCwgZGVjb2Rlck9wdGlvbnMpIHsKICAgIGlmICghdGhpcy5jYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlcikgewogICAgICBpZiAodGhpcy5pc0FzeW5jRGVjb2RlcikgewogICAgICAgIHJldHVybiB0aGlzLmRlY29kZUltYWdlKG51bGwsIGRlY29kZXJPcHRpb25zKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGRlY29kZXJPcHRpb25zKTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnN0cmVhbS5hc3luY0dldEJ5dGVzKCk7CiAgICByZXR1cm4gdGhpcy5kZWNvZGVJbWFnZShkYXRhLCBkZWNvZGVyT3B0aW9ucyk7CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5wb3MgPSAwOwogIH0KICBtYWtlU3ViU3RyZWFtKHN0YXJ0LCBsZW5ndGgsIGRpY3QgPSBudWxsKSB7CiAgICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHsKICAgICAgd2hpbGUgKCF0aGlzLmVvZikgewogICAgICAgIHRoaXMucmVhZEJsb2NrKCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOwogICAgICB3aGlsZSAodGhpcy5idWZmZXJMZW5ndGggPD0gZW5kICYmICF0aGlzLmVvZikgewogICAgICAgIHRoaXMucmVhZEJsb2NrKCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU3RyZWFtKHRoaXMuYnVmZmVyLCBzdGFydCwgbGVuZ3RoLCBkaWN0KTsKICB9CiAgZ2V0QmFzZVN0cmVhbXMoKSB7CiAgICByZXR1cm4gdGhpcy5zdHIgPyB0aGlzLnN0ci5nZXRCYXNlU3RyZWFtcygpIDogbnVsbDsKICB9Cn0KY2xhc3MgU3RyZWFtc1NlcXVlbmNlU3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHJlYW1zLCBvbkVycm9yID0gbnVsbCkgewogICAgc3RyZWFtcyA9IHN0cmVhbXMuZmlsdGVyKHMgPT4gcyBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pOwogICAgbGV0IG1heWJlTGVuZ3RoID0gMDsKICAgIGZvciAoY29uc3Qgc3RyZWFtIG9mIHN0cmVhbXMpIHsKICAgICAgbWF5YmVMZW5ndGggKz0gc3RyZWFtIGluc3RhbmNlb2YgRGVjb2RlU3RyZWFtID8gc3RyZWFtLl9yYXdNaW5CdWZmZXJMZW5ndGggOiBzdHJlYW0ubGVuZ3RoOwogICAgfQogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHJlYW1zID0gc3RyZWFtczsKICAgIHRoaXMuX29uRXJyb3IgPSBvbkVycm9yOwogIH0KICByZWFkQmxvY2soKSB7CiAgICBjb25zdCBzdHJlYW1zID0gdGhpcy5zdHJlYW1zOwogICAgaWYgKHN0cmVhbXMubGVuZ3RoID09PSAwKSB7CiAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtcy5zaGlmdCgpOwogICAgbGV0IGNodW5rOwogICAgdHJ5IHsKICAgICAgY2h1bmsgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICBpZiAodGhpcy5fb25FcnJvcikgewogICAgICAgIHRoaXMuX29uRXJyb3IocmVhc29uLCBzdHJlYW0uZGljdD8ub2JqSWQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyByZWFzb247CiAgICB9CiAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIGNvbnN0IG5ld0xlbmd0aCA9IGJ1ZmZlckxlbmd0aCArIGNodW5rLmxlbmd0aDsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKG5ld0xlbmd0aCk7CiAgICBidWZmZXIuc2V0KGNodW5rLCBidWZmZXJMZW5ndGgpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBuZXdMZW5ndGg7CiAgfQogIGdldEJhc2VTdHJlYW1zKCkgewogICAgY29uc3QgYmFzZVN0cmVhbXNCdWYgPSBbXTsKICAgIGZvciAoY29uc3Qgc3RyZWFtIG9mIHRoaXMuc3RyZWFtcykgewogICAgICBjb25zdCBiYXNlU3RyZWFtcyA9IHN0cmVhbS5nZXRCYXNlU3RyZWFtcygpOwogICAgICBpZiAoYmFzZVN0cmVhbXMpIHsKICAgICAgICBiYXNlU3RyZWFtc0J1Zi5wdXNoKC4uLmJhc2VTdHJlYW1zKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJhc2VTdHJlYW1zQnVmLmxlbmd0aCA+IDAgPyBiYXNlU3RyZWFtc0J1ZiA6IG51bGw7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jb2xvcnNwYWNlX3V0aWxzLmpzCgoKCgoKY2xhc3MgQ29sb3JTcGFjZVV0aWxzIHsKICBzdGF0aWMgcGFyc2UoewogICAgY3MsCiAgICB4cmVmLAogICAgcmVzb3VyY2VzID0gbnVsbCwKICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLAogICAgYXN5bmNJZk5vdENhY2hlZCA9IGZhbHNlCiAgfSkgewogICAgY29uc3Qgb3B0aW9ucyA9IHsKICAgICAgeHJlZiwKICAgICAgcmVzb3VyY2VzLAogICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgIH07CiAgICBsZXQgY3NOYW1lLCBjc1JlZiwgcGFyc2VkQ1M7CiAgICBpZiAoY3MgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgY3NSZWYgPSBjczsKICAgICAgY29uc3QgY2FjaGVkQ1MgPSBnbG9iYWxDb2xvclNwYWNlQ2FjaGUuZ2V0QnlSZWYoY3NSZWYpIHx8IGxvY2FsQ29sb3JTcGFjZUNhY2hlLmdldEJ5UmVmKGNzUmVmKTsKICAgICAgaWYgKGNhY2hlZENTKSB7CiAgICAgICAgcmV0dXJuIGNhY2hlZENTOwogICAgICB9CiAgICAgIGNzID0geHJlZi5mZXRjaChjcyk7CiAgICB9CiAgICBpZiAoY3MgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIGNzTmFtZSA9IGNzLm5hbWU7CiAgICAgIGNvbnN0IGNhY2hlZENTID0gbG9jYWxDb2xvclNwYWNlQ2FjaGUuZ2V0QnlOYW1lKGNzTmFtZSk7CiAgICAgIGlmIChjYWNoZWRDUykgewogICAgICAgIHJldHVybiBjYWNoZWRDUzsKICAgICAgfQogICAgfQogICAgdHJ5IHsKICAgICAgcGFyc2VkQ1MgPSB0aGlzLiNwYXJzZShjcywgb3B0aW9ucyk7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoYXN5bmNJZk5vdENhY2hlZCAmJiAhKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGV4KTsKICAgICAgfQogICAgICB0aHJvdyBleDsKICAgIH0KICAgIGlmIChjc05hbWUgfHwgY3NSZWYpIHsKICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUuc2V0KGNzTmFtZSwgY3NSZWYsIHBhcnNlZENTKTsKICAgICAgaWYgKGNzUmVmKSB7CiAgICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLnNldChudWxsLCBjc1JlZiwgcGFyc2VkQ1MpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYXN5bmNJZk5vdENhY2hlZCA/IFByb21pc2UucmVzb2x2ZShwYXJzZWRDUykgOiBwYXJzZWRDUzsKICB9CiAgc3RhdGljICNzdWJQYXJzZShjcywgb3B0aW9ucykgewogICAgY29uc3QgewogICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUKICAgIH0gPSBvcHRpb25zOwogICAgbGV0IGNzUmVmOwogICAgaWYgKGNzIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIGNzUmVmID0gY3M7CiAgICAgIGNvbnN0IGNhY2hlZENTID0gZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLmdldEJ5UmVmKGNzUmVmKTsKICAgICAgaWYgKGNhY2hlZENTKSB7CiAgICAgICAgcmV0dXJuIGNhY2hlZENTOwogICAgICB9CiAgICB9CiAgICBjb25zdCBwYXJzZWRDUyA9IHRoaXMuI3BhcnNlKGNzLCBvcHRpb25zKTsKICAgIGlmIChjc1JlZikgewogICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUuc2V0KG51bGwsIGNzUmVmLCBwYXJzZWRDUyk7CiAgICB9CiAgICByZXR1cm4gcGFyc2VkQ1M7CiAgfQogIHN0YXRpYyAjcGFyc2UoY3MsIG9wdGlvbnMpIHsKICAgIGNvbnN0IHsKICAgICAgeHJlZiwKICAgICAgcmVzb3VyY2VzLAogICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZQogICAgfSA9IG9wdGlvbnM7CiAgICBjcyA9IHhyZWYuZmV0Y2hJZlJlZihjcyk7CiAgICBpZiAoY3MgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHN3aXRjaCAoY3MubmFtZSkgewogICAgICAgIGNhc2UgIkciOgogICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgogICAgICAgICAgcmV0dXJuIHRoaXMuZ3JheTsKICAgICAgICBjYXNlICJSR0IiOgogICAgICAgIGNhc2UgIkRldmljZVJHQiI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZ2I7CiAgICAgICAgY2FzZSAiRGV2aWNlUkdCQSI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZ2JhOwogICAgICAgIGNhc2UgIkNNWUsiOgogICAgICAgIGNhc2UgIkRldmljZUNNWUsiOgogICAgICAgICAgcmV0dXJuIHRoaXMuY215azsKICAgICAgICBjYXNlICJQYXR0ZXJuIjoKICAgICAgICAgIHJldHVybiBuZXcgUGF0dGVybkNTKG51bGwpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAocmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICBjb25zdCBjb2xvclNwYWNlcyA9IHJlc291cmNlcy5nZXQoIkNvbG9yU3BhY2UiKTsKICAgICAgICAgICAgaWYgKGNvbG9yU3BhY2VzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlc0NTID0gY29sb3JTcGFjZXMuZ2V0KGNzLm5hbWUpOwogICAgICAgICAgICAgIGlmIChyZXNvdXJjZXNDUykgewogICAgICAgICAgICAgICAgaWYgKHJlc291cmNlc0NTIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4jcGFyc2UocmVzb3VyY2VzQ1MsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3MgPSByZXNvdXJjZXNDUzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgd2FybihgVW5yZWNvZ25pemVkIENvbG9yU3BhY2U6ICR7Y3MubmFtZX1gKTsKICAgICAgICAgIHJldHVybiB0aGlzLmdyYXk7CiAgICAgIH0KICAgIH0KICAgIGlmIChBcnJheS5pc0FycmF5KGNzKSkgewogICAgICBjb25zdCBtb2RlID0geHJlZi5mZXRjaElmUmVmKGNzWzBdKS5uYW1lOwogICAgICBsZXQgcGFyYW1zLCBudW1Db21wcywgYmFzZUNTLCB3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYTsKICAgICAgc3dpdGNoIChtb2RlKSB7CiAgICAgICAgY2FzZSAiRyI6CiAgICAgICAgY2FzZSAiRGV2aWNlR3JheSI6CiAgICAgICAgICByZXR1cm4gdGhpcy5ncmF5OwogICAgICAgIGNhc2UgIlJHQiI6CiAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKICAgICAgICAgIHJldHVybiB0aGlzLnJnYjsKICAgICAgICBjYXNlICJDTVlLIjoKICAgICAgICBjYXNlICJEZXZpY2VDTVlLIjoKICAgICAgICAgIHJldHVybiB0aGlzLmNteWs7CiAgICAgICAgY2FzZSAiQ2FsR3JheSI6CiAgICAgICAgICBwYXJhbXMgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOwogICAgICAgICAgd2hpdGVQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiV2hpdGVQb2ludCIpOwogICAgICAgICAgYmxhY2tQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiQmxhY2tQb2ludCIpOwogICAgICAgICAgZ2FtbWEgPSBwYXJhbXMuZ2V0KCJHYW1tYSIpOwogICAgICAgICAgcmV0dXJuIG5ldyBDYWxHcmF5Q1Mod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWEpOwogICAgICAgIGNhc2UgIkNhbFJHQiI6CiAgICAgICAgICBwYXJhbXMgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOwogICAgICAgICAgd2hpdGVQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiV2hpdGVQb2ludCIpOwogICAgICAgICAgYmxhY2tQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiQmxhY2tQb2ludCIpOwogICAgICAgICAgZ2FtbWEgPSBwYXJhbXMuZ2V0QXJyYXkoIkdhbW1hIik7CiAgICAgICAgICBjb25zdCBtYXRyaXggPSBwYXJhbXMuZ2V0QXJyYXkoIk1hdHJpeCIpOwogICAgICAgICAgcmV0dXJuIG5ldyBDYWxSR0JDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSwgbWF0cml4KTsKICAgICAgICBjYXNlICJJQ0NCYXNlZCI6CiAgICAgICAgICBjb25zdCBpc1JlZiA9IGNzWzFdIGluc3RhbmNlb2YgUmVmOwogICAgICAgICAgaWYgKGlzUmVmKSB7CiAgICAgICAgICAgIGNvbnN0IGNhY2hlZENTID0gZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLmdldEJ5UmVmKGNzWzFdKTsKICAgICAgICAgICAgaWYgKGNhY2hlZENTKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENTOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzdHJlYW0gPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOwogICAgICAgICAgY29uc3QgZGljdCA9IHN0cmVhbS5kaWN0OwogICAgICAgICAgbnVtQ29tcHMgPSBkaWN0LmdldCgiTiIpOwogICAgICAgICAgaWYgKEljY0NvbG9yU3BhY2UuaXNVc2FibGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBjb25zdCBpY2NDUyA9IG5ldyBJY2NDb2xvclNwYWNlKHN0cmVhbS5nZXRCeXRlcygpLCAiSUNDQmFzZWQiLCBudW1Db21wcyk7CiAgICAgICAgICAgICAgaWYgKGlzUmVmKSB7CiAgICAgICAgICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUuc2V0KG51bGwsIGNzWzFdLCBpY2NDUyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBpY2NDUzsKICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHdhcm4oYElDQ0Jhc2VkIGNvbG9yIHNwYWNlICgke2NzWzFdfSk6ICIke2V4fSIuYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGFsdFJhdyA9IGRpY3QuZ2V0UmF3KCJBbHRlcm5hdGUiKTsKICAgICAgICAgIGlmIChhbHRSYXcpIHsKICAgICAgICAgICAgY29uc3QgYWx0Q1MgPSB0aGlzLiNzdWJQYXJzZShhbHRSYXcsIG9wdGlvbnMpOwogICAgICAgICAgICBpZiAoYWx0Q1MubnVtQ29tcHMgPT09IG51bUNvbXBzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGFsdENTOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdhcm4oIklDQ0Jhc2VkIGNvbG9yIHNwYWNlOiBJZ25vcmluZyBpbmNvcnJlY3QgL0FsdGVybmF0ZSBlbnRyeS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChudW1Db21wcyA9PT0gMSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5ncmF5OwogICAgICAgICAgfSBlbHNlIGlmIChudW1Db21wcyA9PT0gMykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZ2I7CiAgICAgICAgICB9IGVsc2UgaWYgKG51bUNvbXBzID09PSA0KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNteWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJQYXR0ZXJuIjoKICAgICAgICAgIGJhc2VDUyA9IGNzWzFdIHx8IG51bGw7CiAgICAgICAgICBpZiAoYmFzZUNTKSB7CiAgICAgICAgICAgIGJhc2VDUyA9IHRoaXMuI3N1YlBhcnNlKGJhc2VDUywgb3B0aW9ucyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbmV3IFBhdHRlcm5DUyhiYXNlQ1MpOwogICAgICAgIGNhc2UgIkkiOgogICAgICAgIGNhc2UgIkluZGV4ZWQiOgogICAgICAgICAgYmFzZUNTID0gdGhpcy4jc3ViUGFyc2UoY3NbMV0sIG9wdGlvbnMpOwogICAgICAgICAgY29uc3QgaGlWYWwgPSBNYXRoQ2xhbXAoeHJlZi5mZXRjaElmUmVmKGNzWzJdKSwgMCwgMjU1KTsKICAgICAgICAgIGNvbnN0IGxvb2t1cCA9IHhyZWYuZmV0Y2hJZlJlZihjc1szXSk7CiAgICAgICAgICByZXR1cm4gbmV3IEluZGV4ZWRDUyhiYXNlQ1MsIGhpVmFsLCBsb29rdXApOwogICAgICAgIGNhc2UgIlNlcGFyYXRpb24iOgogICAgICAgIGNhc2UgIkRldmljZU4iOgogICAgICAgICAgY29uc3QgbmFtZSA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7CiAgICAgICAgICBudW1Db21wcyA9IEFycmF5LmlzQXJyYXkobmFtZSkgPyBuYW1lLmxlbmd0aCA6IDE7CiAgICAgICAgICBiYXNlQ1MgPSB0aGlzLiNzdWJQYXJzZShjc1syXSwgb3B0aW9ucyk7CiAgICAgICAgICBjb25zdCB0aW50Rm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKGNzWzNdKTsKICAgICAgICAgIHJldHVybiBuZXcgQWx0ZXJuYXRlQ1MobnVtQ29tcHMsIGJhc2VDUywgdGludEZuKTsKICAgICAgICBjYXNlICJMYWIiOgogICAgICAgICAgcGFyYW1zID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTsKICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTsKICAgICAgICAgIGNvbnN0IHJhbmdlID0gcGFyYW1zLmdldEFycmF5KCJSYW5nZSIpOwogICAgICAgICAgcmV0dXJuIG5ldyBMYWJDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHdhcm4oYFVuaW1wbGVtZW50ZWQgQ29sb3JTcGFjZSBvYmplY3Q6ICR7bW9kZX1gKTsKICAgICAgICAgIHJldHVybiB0aGlzLmdyYXk7CiAgICAgIH0KICAgIH0KICAgIHdhcm4oYFVucmVjb2duaXplZCBDb2xvclNwYWNlIG9iamVjdDogJHtjc31gKTsKICAgIHJldHVybiB0aGlzLmdyYXk7CiAgfQogIHN0YXRpYyBnZXQgZ3JheSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImdyYXkiLCBuZXcgRGV2aWNlR3JheUNTKCkpOwogIH0KICBzdGF0aWMgZ2V0IHJnYigpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgInJnYiIsIG5ldyBEZXZpY2VSZ2JDUygpKTsKICB9CiAgc3RhdGljIGdldCByZ2JhKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicmdiYSIsIG5ldyBEZXZpY2VSZ2JhQ1MoKSk7CiAgfQogIHN0YXRpYyBnZXQgY215aygpIHsKICAgIGlmIChDbXlrSUNDQmFzZWRDUy5pc1VzYWJsZSkgewogICAgICB0cnkgewogICAgICAgIHJldHVybiBzaGFkb3codGhpcywgImNteWsiLCBuZXcgQ215a0lDQ0Jhc2VkQ1MoKSk7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHdhcm4oIkNNWUsgZmFsbGJhY2s6IERldmljZUNNWUsiKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiY215ayIsIG5ldyBEZXZpY2VDbXlrQ1MoKSk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9qcGcuanMKCgoKCgpjbGFzcyBKcGVnRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIkpwZWdFcnJvciIpOwogIH0KfQpjbGFzcyBETkxNYXJrZXJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHNjYW5MaW5lcykgewogICAgc3VwZXIobWVzc2FnZSwgIkROTE1hcmtlckVycm9yIik7CiAgICB0aGlzLnNjYW5MaW5lcyA9IHNjYW5MaW5lczsKICB9Cn0KY2xhc3MgRU9JTWFya2VyRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIkVPSU1hcmtlckVycm9yIik7CiAgfQp9CmNvbnN0IGRjdFppZ1phZyA9IG5ldyBVaW50OEFycmF5KFswLCAxLCA4LCAxNiwgOSwgMiwgMywgMTAsIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsIDQsIDUsIDEyLCAxOSwgMjYsIDMzLCA0MCwgNDgsIDQxLCAzNCwgMjcsIDIwLCAxMywgNiwgNywgMTQsIDIxLCAyOCwgMzUsIDQyLCA0OSwgNTYsIDU3LCA1MCwgNDMsIDM2LCAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsIDU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzXSk7CmNvbnN0IGRjdENvczEgPSA0MDE3Owpjb25zdCBkY3RTaW4xID0gNzk5Owpjb25zdCBkY3RDb3MzID0gMzQwNjsKY29uc3QgZGN0U2luMyA9IDIyNzY7CmNvbnN0IGRjdENvczYgPSAxNTY3Owpjb25zdCBkY3RTaW42ID0gMzc4NDsKY29uc3QgZGN0U3FydDIgPSA1NzkzOwpjb25zdCBkY3RTcXJ0MWQyID0gMjg5NjsKZnVuY3Rpb24gYnVpbGRIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMsIHZhbHVlcykgewogIGxldCBrID0gMCwKICAgIGksCiAgICBqLAogICAgbGVuZ3RoID0gMTY7CiAgd2hpbGUgKGxlbmd0aCA+IDAgJiYgIWNvZGVMZW5ndGhzW2xlbmd0aCAtIDFdKSB7CiAgICBsZW5ndGgtLTsKICB9CiAgY29uc3QgY29kZSA9IFt7CiAgICBjaGlsZHJlbjogW10sCiAgICBpbmRleDogMAogIH1dOwogIGxldCBwID0gY29kZVswXSwKICAgIHE7CiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBmb3IgKGogPSAwOyBqIDwgY29kZUxlbmd0aHNbaV07IGorKykgewogICAgICBwID0gY29kZS5wb3AoKTsKICAgICAgcC5jaGlsZHJlbltwLmluZGV4XSA9IHZhbHVlc1trXTsKICAgICAgd2hpbGUgKHAuaW5kZXggPiAwKSB7CiAgICAgICAgcCA9IGNvZGUucG9wKCk7CiAgICAgIH0KICAgICAgcC5pbmRleCsrOwogICAgICBjb2RlLnB1c2gocCk7CiAgICAgIHdoaWxlIChjb2RlLmxlbmd0aCA8PSBpKSB7CiAgICAgICAgY29kZS5wdXNoKHEgPSB7CiAgICAgICAgICBjaGlsZHJlbjogW10sCiAgICAgICAgICBpbmRleDogMAogICAgICAgIH0pOwogICAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSBxLmNoaWxkcmVuOwogICAgICAgIHAgPSBxOwogICAgICB9CiAgICAgIGsrKzsKICAgIH0KICAgIGlmIChpICsgMSA8IGxlbmd0aCkgewogICAgICBjb2RlLnB1c2gocSA9IHsKICAgICAgICBjaGlsZHJlbjogW10sCiAgICAgICAgaW5kZXg6IDAKICAgICAgfSk7CiAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSBxLmNoaWxkcmVuOwogICAgICBwID0gcTsKICAgIH0KICB9CiAgcmV0dXJuIGNvZGVbMF0uY2hpbGRyZW47Cn0KZnVuY3Rpb24gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCByb3csIGNvbCkgewogIHJldHVybiA2NCAqICgoY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgKyAxKSAqIHJvdyArIGNvbCk7Cn0KZnVuY3Rpb24gZGVjb2RlU2NhbihkYXRhLCBvZmZzZXQsIGZyYW1lLCBjb21wb25lbnRzLCByZXNldEludGVydmFsLCBzcGVjdHJhbFN0YXJ0LCBzcGVjdHJhbEVuZCwgc3VjY2Vzc2l2ZVByZXYsIHN1Y2Nlc3NpdmUsIHBhcnNlRE5MTWFya2VyID0gZmFsc2UpIHsKICBjb25zdCBtY3VzUGVyTGluZSA9IGZyYW1lLm1jdXNQZXJMaW5lOwogIGNvbnN0IHByb2dyZXNzaXZlID0gZnJhbWUucHJvZ3Jlc3NpdmU7CiAgY29uc3Qgc3RhcnRPZmZzZXQgPSBvZmZzZXQ7CiAgbGV0IGJpdHNEYXRhID0gMCwKICAgIGJpdHNDb3VudCA9IDA7CiAgZnVuY3Rpb24gcmVhZEJpdCgpIHsKICAgIGlmIChiaXRzQ291bnQgPiAwKSB7CiAgICAgIGJpdHNDb3VudC0tOwogICAgICByZXR1cm4gYml0c0RhdGEgPj4gYml0c0NvdW50ICYgMTsKICAgIH0KICAgIGJpdHNEYXRhID0gZGF0YVtvZmZzZXQrK107CiAgICBpZiAoYml0c0RhdGEgPT09IDB4ZmYpIHsKICAgICAgY29uc3QgbmV4dEJ5dGUgPSBkYXRhW29mZnNldCsrXTsKICAgICAgaWYgKG5leHRCeXRlKSB7CiAgICAgICAgaWYgKG5leHRCeXRlID09PSAweGRjICYmIHBhcnNlRE5MTWFya2VyKSB7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGNvbnN0IHNjYW5MaW5lcyA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgaWYgKHNjYW5MaW5lcyA+IDAgJiYgc2NhbkxpbmVzICE9PSBmcmFtZS5zY2FuTGluZXMpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEROTE1hcmtlckVycm9yKCJGb3VuZCBETkwgbWFya2VyICgweEZGREMpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIiwgc2NhbkxpbmVzKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG5leHRCeXRlID09PSAweGQ5KSB7CiAgICAgICAgICBpZiAocGFyc2VETkxNYXJrZXIpIHsKICAgICAgICAgICAgY29uc3QgbWF5YmVTY2FuTGluZXMgPSBibG9ja1JvdyAqIChmcmFtZS5wcmVjaXNpb24gPT09IDggPyA4IDogMCk7CiAgICAgICAgICAgIGlmIChtYXliZVNjYW5MaW5lcyA+IDAgJiYgTWF0aC5yb3VuZChmcmFtZS5zY2FuTGluZXMgLyBtYXliZVNjYW5MaW5lcykgPj0gNSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcigiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSwgIiArICJwb3NzaWJseSBjYXVzZWQgYnkgaW5jb3JyZWN0IGBzY2FuTGluZXNgIHBhcmFtZXRlciIsIG1heWJlU2NhbkxpbmVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgbmV3IEVPSU1hcmtlckVycm9yKCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIik7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoYHVuZXhwZWN0ZWQgbWFya2VyICR7KGJpdHNEYXRhIDw8IDggfCBuZXh0Qnl0ZSkudG9TdHJpbmcoMTYpfWApOwogICAgICB9CiAgICB9CiAgICBiaXRzQ291bnQgPSA3OwogICAgcmV0dXJuIGJpdHNEYXRhID4+PiA3OwogIH0KICBmdW5jdGlvbiBkZWNvZGVIdWZmbWFuKHRyZWUpIHsKICAgIGxldCBub2RlID0gdHJlZTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIG5vZGUgPSBub2RlW3JlYWRCaXQoKV07CiAgICAgIHN3aXRjaCAodHlwZW9mIG5vZGUpIHsKICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgY2FzZSAib2JqZWN0IjoKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgaHVmZm1hbiBzZXF1ZW5jZSIpOwogICAgfQogIH0KICBmdW5jdGlvbiByZWNlaXZlKGxlbmd0aCkgewogICAgbGV0IG4gPSAwOwogICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKICAgICAgbiA9IG4gPDwgMSB8IHJlYWRCaXQoKTsKICAgICAgbGVuZ3RoLS07CiAgICB9CiAgICByZXR1cm4gbjsKICB9CiAgZnVuY3Rpb24gcmVjZWl2ZUFuZEV4dGVuZChsZW5ndGgpIHsKICAgIGlmIChsZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHJlYWRCaXQoKSA9PT0gMSA/IDEgOiAtMTsKICAgIH0KICAgIGNvbnN0IG4gPSByZWNlaXZlKGxlbmd0aCk7CiAgICBpZiAobiA+PSAxIDw8IGxlbmd0aCAtIDEpIHsKICAgICAgcmV0dXJuIG47CiAgICB9CiAgICByZXR1cm4gbiArICgtMSA8PCBsZW5ndGgpICsgMTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlQmFzZWxpbmUoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgY29uc3QgdCA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDKTsKICAgIGNvbnN0IGRpZmYgPSB0ID09PSAwID8gMCA6IHJlY2VpdmVBbmRFeHRlbmQodCk7CiAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSA9IGNvbXBvbmVudC5wcmVkICs9IGRpZmY7CiAgICBsZXQgayA9IDE7CiAgICB3aGlsZSAoayA8IDY0KSB7CiAgICAgIGNvbnN0IHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpOwogICAgICBjb25zdCBzID0gcnMgJiAxNSwKICAgICAgICByID0gcnMgPj4gNDsKICAgICAgaWYgKHMgPT09IDApIHsKICAgICAgICBpZiAociA8IDE1KSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgayArPSAxNjsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBrICs9IHI7CiAgICAgIGNvbnN0IHogPSBkY3RaaWdaYWdba107CiAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9IHJlY2VpdmVBbmRFeHRlbmQocyk7CiAgICAgIGsrKzsKICAgIH0KICB9CiAgZnVuY3Rpb24gZGVjb2RlRENGaXJzdChjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CiAgICBjb25zdCB0ID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlREMpOwogICAgY29uc3QgZGlmZiA9IHQgPT09IDAgPyAwIDogcmVjZWl2ZUFuZEV4dGVuZCh0KSA8PCBzdWNjZXNzaXZlOwogICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gPSBjb21wb25lbnQucHJlZCArPSBkaWZmOwogIH0KICBmdW5jdGlvbiBkZWNvZGVEQ1N1Y2Nlc3NpdmUoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gfD0gcmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmU7CiAgfQogIGxldCBlb2JydW4gPSAwOwogIGZ1bmN0aW9uIGRlY29kZUFDRmlyc3QoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgaWYgKGVvYnJ1biA+IDApIHsKICAgICAgZW9icnVuLS07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBrID0gc3BlY3RyYWxTdGFydDsKICAgIGNvbnN0IGUgPSBzcGVjdHJhbEVuZDsKICAgIHdoaWxlIChrIDw9IGUpIHsKICAgICAgY29uc3QgcnMgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyk7CiAgICAgIGNvbnN0IHMgPSBycyAmIDE1LAogICAgICAgIHIgPSBycyA+PiA0OwogICAgICBpZiAocyA9PT0gMCkgewogICAgICAgIGlmIChyIDwgMTUpIHsKICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKSAtIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgayArPSAxNjsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBrICs9IHI7CiAgICAgIGNvbnN0IHogPSBkY3RaaWdaYWdba107CiAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9IHJlY2VpdmVBbmRFeHRlbmQocykgKiAoMSA8PCBzdWNjZXNzaXZlKTsKICAgICAgaysrOwogICAgfQogIH0KICBsZXQgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwLAogICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlOwogIGZ1bmN0aW9uIGRlY29kZUFDU3VjY2Vzc2l2ZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CiAgICBsZXQgayA9IHNwZWN0cmFsU3RhcnQ7CiAgICBjb25zdCBlID0gc3BlY3RyYWxFbmQ7CiAgICBsZXQgciA9IDA7CiAgICBsZXQgczsKICAgIGxldCByczsKICAgIHdoaWxlIChrIDw9IGUpIHsKICAgICAgY29uc3Qgb2Zmc2V0WiA9IGJsb2NrT2Zmc2V0ICsgZGN0WmlnWmFnW2tdOwogICAgICBjb25zdCBzaWduID0gY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSA8IDAgPyAtMSA6IDE7CiAgICAgIHN3aXRjaCAoc3VjY2Vzc2l2ZUFDU3RhdGUpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBycyA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDKTsKICAgICAgICAgIHMgPSBycyAmIDE1OwogICAgICAgICAgciA9IHJzID4+IDQ7CiAgICAgICAgICBpZiAocyA9PT0gMCkgewogICAgICAgICAgICBpZiAociA8IDE1KSB7CiAgICAgICAgICAgICAgZW9icnVuID0gcmVjZWl2ZShyKSArICgxIDw8IHIpOwogICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gNDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByID0gMTY7CiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAocyAhPT0gMSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgQUNuIGVuY29kaW5nIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlID0gcmVjZWl2ZUFuZEV4dGVuZChzKTsKICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSByID8gMiA6IDM7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlIDE6CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgaWYgKGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0pIHsKICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSArPSBzaWduICogKHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHItLTsKICAgICAgICAgICAgaWYgKHIgPT09IDApIHsKICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IHN1Y2Nlc3NpdmVBQ1N0YXRlID09PSAyID8gMyA6IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CiAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdID0gc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlIDw8IHN1Y2Nlc3NpdmU7CiAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CiAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBrKys7CiAgICB9CiAgICBpZiAoc3VjY2Vzc2l2ZUFDU3RhdGUgPT09IDQpIHsKICAgICAgZW9icnVuLS07CiAgICAgIGlmIChlb2JydW4gPT09IDApIHsKICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7CiAgICAgIH0KICAgIH0KICB9CiAgbGV0IGJsb2NrUm93ID0gMDsKICBmdW5jdGlvbiBkZWNvZGVNY3UoY29tcG9uZW50LCBkZWNvZGUsIG1jdSwgcm93LCBjb2wpIHsKICAgIGNvbnN0IG1jdVJvdyA9IG1jdSAvIG1jdXNQZXJMaW5lIHwgMDsKICAgIGNvbnN0IG1jdUNvbCA9IG1jdSAlIG1jdXNQZXJMaW5lOwogICAgYmxvY2tSb3cgPSBtY3VSb3cgKiBjb21wb25lbnQudiArIHJvdzsKICAgIGNvbnN0IGJsb2NrQ29sID0gbWN1Q29sICogY29tcG9uZW50LmggKyBjb2w7CiAgICBjb25zdCBibG9ja09mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTsKICAgIGRlY29kZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGUsIG1jdSkgewogICAgYmxvY2tSb3cgPSBtY3UgLyBjb21wb25lbnQuYmxvY2tzUGVyTGluZSB8IDA7CiAgICBjb25zdCBibG9ja0NvbCA9IG1jdSAlIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lOwogICAgY29uc3QgYmxvY2tPZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7CiAgICBkZWNvZGUoY29tcG9uZW50LCBibG9ja09mZnNldCk7CiAgfQogIGNvbnN0IGNvbXBvbmVudHNMZW5ndGggPSBjb21wb25lbnRzLmxlbmd0aDsKICBsZXQgY29tcG9uZW50LCBpLCBqLCBrLCBuOwogIGxldCBkZWNvZGVGbjsKICBpZiAocHJvZ3Jlc3NpdmUpIHsKICAgIGlmIChzcGVjdHJhbFN0YXJ0ID09PSAwKSB7CiAgICAgIGRlY29kZUZuID0gc3VjY2Vzc2l2ZVByZXYgPT09IDAgPyBkZWNvZGVEQ0ZpcnN0IDogZGVjb2RlRENTdWNjZXNzaXZlOwogICAgfSBlbHNlIHsKICAgICAgZGVjb2RlRm4gPSBzdWNjZXNzaXZlUHJldiA9PT0gMCA/IGRlY29kZUFDRmlyc3QgOiBkZWNvZGVBQ1N1Y2Nlc3NpdmU7CiAgICB9CiAgfSBlbHNlIHsKICAgIGRlY29kZUZuID0gZGVjb2RlQmFzZWxpbmU7CiAgfQogIGxldCBtY3UgPSAwLAogICAgZmlsZU1hcmtlcjsKICBjb25zdCBtY3VFeHBlY3RlZCA9IGNvbXBvbmVudHNMZW5ndGggPT09IDEgPyBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckxpbmUgKiBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckNvbHVtbiA6IG1jdXNQZXJMaW5lICogZnJhbWUubWN1c1BlckNvbHVtbjsKICBsZXQgaCwgdjsKICB3aGlsZSAobWN1IDw9IG1jdUV4cGVjdGVkKSB7CiAgICBjb25zdCBtY3VUb1JlYWQgPSByZXNldEludGVydmFsID8gTWF0aC5taW4obWN1RXhwZWN0ZWQgLSBtY3UsIHJlc2V0SW50ZXJ2YWwpIDogbWN1RXhwZWN0ZWQ7CiAgICBpZiAobWN1VG9SZWFkID4gMCkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0xlbmd0aDsgaSsrKSB7CiAgICAgICAgY29tcG9uZW50c1tpXS5wcmVkID0gMDsKICAgICAgfQogICAgICBlb2JydW4gPSAwOwogICAgICBpZiAoY29tcG9uZW50c0xlbmd0aCA9PT0gMSkgewogICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbMF07CiAgICAgICAgZm9yIChuID0gMDsgbiA8IG1jdVRvUmVhZDsgbisrKSB7CiAgICAgICAgICBkZWNvZGVCbG9jayhjb21wb25lbnQsIGRlY29kZUZuLCBtY3UpOwogICAgICAgICAgbWN1Kys7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAobiA9IDA7IG4gPCBtY3VUb1JlYWQ7IG4rKykgewogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvbmVudHNMZW5ndGg7IGkrKykgewogICAgICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnRzW2ldOwogICAgICAgICAgICBoID0gY29tcG9uZW50Lmg7CiAgICAgICAgICAgIHYgPSBjb21wb25lbnQudjsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHY7IGorKykgewogICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBoOyBrKyspIHsKICAgICAgICAgICAgICAgIGRlY29kZU1jdShjb21wb25lbnQsIGRlY29kZUZuLCBtY3UsIGosIGspOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbWN1Kys7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBiaXRzQ291bnQgPSAwOwogICAgZmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBvZmZzZXQpOwogICAgaWYgKCFmaWxlTWFya2VyKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGZpbGVNYXJrZXIuaW52YWxpZCkgewogICAgICBjb25zdCBwYXJ0aWFsTXNnID0gbWN1VG9SZWFkID4gMCA/ICJ1bmV4cGVjdGVkIiA6ICJleGNlc3NpdmUiOwogICAgICB3YXJuKGBkZWNvZGVTY2FuIC0gJHtwYXJ0aWFsTXNnfSBNQ1UgZGF0YSwgY3VycmVudCBtYXJrZXIgaXM6ICR7ZmlsZU1hcmtlci5pbnZhbGlkfWApOwogICAgICBvZmZzZXQgPSBmaWxlTWFya2VyLm9mZnNldDsKICAgIH0KICAgIGlmIChmaWxlTWFya2VyLm1hcmtlciA+PSAweGZmZDAgJiYgZmlsZU1hcmtlci5tYXJrZXIgPD0gMHhmZmQ3KSB7CiAgICAgIG9mZnNldCArPSAyOwogICAgfSBlbHNlIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHJldHVybiBvZmZzZXQgLSBzdGFydE9mZnNldDsKfQpmdW5jdGlvbiBxdWFudGl6ZUFuZEludmVyc2UoY29tcG9uZW50LCBibG9ja0J1ZmZlck9mZnNldCwgcCkgewogIGNvbnN0IHF0ID0gY29tcG9uZW50LnF1YW50aXphdGlvblRhYmxlLAogICAgYmxvY2tEYXRhID0gY29tcG9uZW50LmJsb2NrRGF0YTsKICBsZXQgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3OwogIGxldCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDc7CiAgbGV0IHQ7CiAgaWYgKCFxdCkgewogICAgdGhyb3cgbmV3IEpwZWdFcnJvcigibWlzc2luZyByZXF1aXJlZCBRdWFudGl6YXRpb24gVGFibGUuIik7CiAgfQogIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IDY0OyByb3cgKz0gOCkgewogICAgcDAgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3ddOwogICAgcDEgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAxXTsKICAgIHAyID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgMl07CiAgICBwMyA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDNdOwogICAgcDQgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA0XTsKICAgIHA1ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNV07CiAgICBwNiA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDZdOwogICAgcDcgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA3XTsKICAgIHAwICo9IHF0W3Jvd107CiAgICBpZiAoKHAxIHwgcDIgfCBwMyB8IHA0IHwgcDUgfCBwNiB8IHA3KSA9PT0gMCkgewogICAgICB0ID0gZGN0U3FydDIgKiBwMCArIDUxMiA+PiAxMDsKICAgICAgcFtyb3ddID0gdDsKICAgICAgcFtyb3cgKyAxXSA9IHQ7CiAgICAgIHBbcm93ICsgMl0gPSB0OwogICAgICBwW3JvdyArIDNdID0gdDsKICAgICAgcFtyb3cgKyA0XSA9IHQ7CiAgICAgIHBbcm93ICsgNV0gPSB0OwogICAgICBwW3JvdyArIDZdID0gdDsKICAgICAgcFtyb3cgKyA3XSA9IHQ7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgcDEgKj0gcXRbcm93ICsgMV07CiAgICBwMiAqPSBxdFtyb3cgKyAyXTsKICAgIHAzICo9IHF0W3JvdyArIDNdOwogICAgcDQgKj0gcXRbcm93ICsgNF07CiAgICBwNSAqPSBxdFtyb3cgKyA1XTsKICAgIHA2ICo9IHF0W3JvdyArIDZdOwogICAgcDcgKj0gcXRbcm93ICsgN107CiAgICB2MCA9IGRjdFNxcnQyICogcDAgKyAxMjggPj4gODsKICAgIHYxID0gZGN0U3FydDIgKiBwNCArIDEyOCA+PiA4OwogICAgdjIgPSBwMjsKICAgIHYzID0gcDY7CiAgICB2NCA9IGRjdFNxcnQxZDIgKiAocDEgLSBwNykgKyAxMjggPj4gODsKICAgIHY3ID0gZGN0U3FydDFkMiAqIChwMSArIHA3KSArIDEyOCA+PiA4OwogICAgdjUgPSBwMyA8PCA0OwogICAgdjYgPSBwNSA8PCA0OwogICAgdjAgPSB2MCArIHYxICsgMSA+PiAxOwogICAgdjEgPSB2MCAtIHYxOwogICAgdCA9IHYyICogZGN0U2luNiArIHYzICogZGN0Q29zNiArIDEyOCA+PiA4OwogICAgdjIgPSB2MiAqIGRjdENvczYgLSB2MyAqIGRjdFNpbjYgKyAxMjggPj4gODsKICAgIHYzID0gdDsKICAgIHY0ID0gdjQgKyB2NiArIDEgPj4gMTsKICAgIHY2ID0gdjQgLSB2NjsKICAgIHY3ID0gdjcgKyB2NSArIDEgPj4gMTsKICAgIHY1ID0gdjcgLSB2NTsKICAgIHYwID0gdjAgKyB2MyArIDEgPj4gMTsKICAgIHYzID0gdjAgLSB2MzsKICAgIHYxID0gdjEgKyB2MiArIDEgPj4gMTsKICAgIHYyID0gdjEgLSB2MjsKICAgIHQgPSB2NCAqIGRjdFNpbjMgKyB2NyAqIGRjdENvczMgKyAyMDQ4ID4+IDEyOwogICAgdjQgPSB2NCAqIGRjdENvczMgLSB2NyAqIGRjdFNpbjMgKyAyMDQ4ID4+IDEyOwogICAgdjcgPSB0OwogICAgdCA9IHY1ICogZGN0U2luMSArIHY2ICogZGN0Q29zMSArIDIwNDggPj4gMTI7CiAgICB2NSA9IHY1ICogZGN0Q29zMSAtIHY2ICogZGN0U2luMSArIDIwNDggPj4gMTI7CiAgICB2NiA9IHQ7CiAgICBwW3Jvd10gPSB2MCArIHY3OwogICAgcFtyb3cgKyA3XSA9IHYwIC0gdjc7CiAgICBwW3JvdyArIDFdID0gdjEgKyB2NjsKICAgIHBbcm93ICsgNl0gPSB2MSAtIHY2OwogICAgcFtyb3cgKyAyXSA9IHYyICsgdjU7CiAgICBwW3JvdyArIDVdID0gdjIgLSB2NTsKICAgIHBbcm93ICsgM10gPSB2MyArIHY0OwogICAgcFtyb3cgKyA0XSA9IHYzIC0gdjQ7CiAgfQogIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IDg7ICsrY29sKSB7CiAgICBwMCA9IHBbY29sXTsKICAgIHAxID0gcFtjb2wgKyA4XTsKICAgIHAyID0gcFtjb2wgKyAxNl07CiAgICBwMyA9IHBbY29sICsgMjRdOwogICAgcDQgPSBwW2NvbCArIDMyXTsKICAgIHA1ID0gcFtjb2wgKyA0MF07CiAgICBwNiA9IHBbY29sICsgNDhdOwogICAgcDcgPSBwW2NvbCArIDU2XTsKICAgIGlmICgocDEgfCBwMiB8IHAzIHwgcDQgfCBwNSB8IHA2IHwgcDcpID09PSAwKSB7CiAgICAgIHQgPSBkY3RTcXJ0MiAqIHAwICsgODE5MiA+PiAxNDsKICAgICAgaWYgKHQgPCAtMjA0MCkgewogICAgICAgIHQgPSAwOwogICAgICB9IGVsc2UgaWYgKHQgPj0gMjAyNCkgewogICAgICAgIHQgPSAyNTU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdCA9IHQgKyAyMDU2ID4+IDQ7CiAgICAgIH0KICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sXSA9IHQ7CiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDhdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMTZdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMjRdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMzJdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDBdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDhdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNTZdID0gdDsKICAgICAgY29udGludWU7CiAgICB9CiAgICB2MCA9IGRjdFNxcnQyICogcDAgKyAyMDQ4ID4+IDEyOwogICAgdjEgPSBkY3RTcXJ0MiAqIHA0ICsgMjA0OCA+PiAxMjsKICAgIHYyID0gcDI7CiAgICB2MyA9IHA2OwogICAgdjQgPSBkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMjA0OCA+PiAxMjsKICAgIHY3ID0gZGN0U3FydDFkMiAqIChwMSArIHA3KSArIDIwNDggPj4gMTI7CiAgICB2NSA9IHAzOwogICAgdjYgPSBwNTsKICAgIHYwID0gKHYwICsgdjEgKyAxID4+IDEpICsgNDExMjsKICAgIHYxID0gdjAgLSB2MTsKICAgIHQgPSB2MiAqIGRjdFNpbjYgKyB2MyAqIGRjdENvczYgKyAyMDQ4ID4+IDEyOwogICAgdjIgPSB2MiAqIGRjdENvczYgLSB2MyAqIGRjdFNpbjYgKyAyMDQ4ID4+IDEyOwogICAgdjMgPSB0OwogICAgdjQgPSB2NCArIHY2ICsgMSA+PiAxOwogICAgdjYgPSB2NCAtIHY2OwogICAgdjcgPSB2NyArIHY1ICsgMSA+PiAxOwogICAgdjUgPSB2NyAtIHY1OwogICAgdjAgPSB2MCArIHYzICsgMSA+PiAxOwogICAgdjMgPSB2MCAtIHYzOwogICAgdjEgPSB2MSArIHYyICsgMSA+PiAxOwogICAgdjIgPSB2MSAtIHYyOwogICAgdCA9IHY0ICogZGN0U2luMyArIHY3ICogZGN0Q29zMyArIDIwNDggPj4gMTI7CiAgICB2NCA9IHY0ICogZGN0Q29zMyAtIHY3ICogZGN0U2luMyArIDIwNDggPj4gMTI7CiAgICB2NyA9IHQ7CiAgICB0ID0gdjUgKiBkY3RTaW4xICsgdjYgKiBkY3RDb3MxICsgMjA0OCA+PiAxMjsKICAgIHY1ID0gdjUgKiBkY3RDb3MxIC0gdjYgKiBkY3RTaW4xICsgMjA0OCA+PiAxMjsKICAgIHY2ID0gdDsKICAgIHAwID0gdjAgKyB2NzsKICAgIHA3ID0gdjAgLSB2NzsKICAgIHAxID0gdjEgKyB2NjsKICAgIHA2ID0gdjEgLSB2NjsKICAgIHAyID0gdjIgKyB2NTsKICAgIHA1ID0gdjIgLSB2NTsKICAgIHAzID0gdjMgKyB2NDsKICAgIHA0ID0gdjMgLSB2NDsKICAgIGlmIChwMCA8IDE2KSB7CiAgICAgIHAwID0gMDsKICAgIH0gZWxzZSBpZiAocDAgPj0gNDA4MCkgewogICAgICBwMCA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHAwID4+PSA0OwogICAgfQogICAgaWYgKHAxIDwgMTYpIHsKICAgICAgcDEgPSAwOwogICAgfSBlbHNlIGlmIChwMSA+PSA0MDgwKSB7CiAgICAgIHAxID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDEgPj49IDQ7CiAgICB9CiAgICBpZiAocDIgPCAxNikgewogICAgICBwMiA9IDA7CiAgICB9IGVsc2UgaWYgKHAyID49IDQwODApIHsKICAgICAgcDIgPSAyNTU7CiAgICB9IGVsc2UgewogICAgICBwMiA+Pj0gNDsKICAgIH0KICAgIGlmIChwMyA8IDE2KSB7CiAgICAgIHAzID0gMDsKICAgIH0gZWxzZSBpZiAocDMgPj0gNDA4MCkgewogICAgICBwMyA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHAzID4+PSA0OwogICAgfQogICAgaWYgKHA0IDwgMTYpIHsKICAgICAgcDQgPSAwOwogICAgfSBlbHNlIGlmIChwNCA+PSA0MDgwKSB7CiAgICAgIHA0ID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDQgPj49IDQ7CiAgICB9CiAgICBpZiAocDUgPCAxNikgewogICAgICBwNSA9IDA7CiAgICB9IGVsc2UgaWYgKHA1ID49IDQwODApIHsKICAgICAgcDUgPSAyNTU7CiAgICB9IGVsc2UgewogICAgICBwNSA+Pj0gNDsKICAgIH0KICAgIGlmIChwNiA8IDE2KSB7CiAgICAgIHA2ID0gMDsKICAgIH0gZWxzZSBpZiAocDYgPj0gNDA4MCkgewogICAgICBwNiA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHA2ID4+PSA0OwogICAgfQogICAgaWYgKHA3IDwgMTYpIHsKICAgICAgcDcgPSAwOwogICAgfSBlbHNlIGlmIChwNyA+PSA0MDgwKSB7CiAgICAgIHA3ID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDcgPj49IDQ7CiAgICB9CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2xdID0gcDA7CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA4XSA9IHAxOwogICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMTZdID0gcDI7CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAyNF0gPSBwMzsKICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDMyXSA9IHA0OwogICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDBdID0gcDU7CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0OF0gPSBwNjsKICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDU2XSA9IHA3OwogIH0KfQpmdW5jdGlvbiBidWlsZENvbXBvbmVudERhdGEoZnJhbWUsIGNvbXBvbmVudCkgewogIGNvbnN0IGJsb2Nrc1BlckxpbmUgPSBjb21wb25lbnQuYmxvY2tzUGVyTGluZTsKICBjb25zdCBibG9ja3NQZXJDb2x1bW4gPSBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uOwogIGNvbnN0IGNvbXB1dGF0aW9uQnVmZmVyID0gbmV3IEludDE2QXJyYXkoNjQpOwogIGZvciAobGV0IGJsb2NrUm93ID0gMDsgYmxvY2tSb3cgPCBibG9ja3NQZXJDb2x1bW47IGJsb2NrUm93KyspIHsKICAgIGZvciAobGV0IGJsb2NrQ29sID0gMDsgYmxvY2tDb2wgPCBibG9ja3NQZXJMaW5lOyBibG9ja0NvbCsrKSB7CiAgICAgIGNvbnN0IG9mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTsKICAgICAgcXVhbnRpemVBbmRJbnZlcnNlKGNvbXBvbmVudCwgb2Zmc2V0LCBjb21wdXRhdGlvbkJ1ZmZlcik7CiAgICB9CiAgfQogIHJldHVybiBjb21wb25lbnQuYmxvY2tEYXRhOwp9CmZ1bmN0aW9uIGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBjdXJyZW50UG9zLCBzdGFydFBvcyA9IGN1cnJlbnRQb3MpIHsKICBjb25zdCBtYXhQb3MgPSBkYXRhLmxlbmd0aCAtIDE7CiAgbGV0IG5ld1BvcyA9IHN0YXJ0UG9zIDwgY3VycmVudFBvcyA/IHN0YXJ0UG9zIDogY3VycmVudFBvczsKICBpZiAoY3VycmVudFBvcyA+PSBtYXhQb3MpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCBjdXJyZW50TWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBjdXJyZW50UG9zKTsKICBpZiAoY3VycmVudE1hcmtlciA+PSAweGZmYzAgJiYgY3VycmVudE1hcmtlciA8PSAweGZmZmUpIHsKICAgIHJldHVybiB7CiAgICAgIGludmFsaWQ6IG51bGwsCiAgICAgIG1hcmtlcjogY3VycmVudE1hcmtlciwKICAgICAgb2Zmc2V0OiBjdXJyZW50UG9zCiAgICB9OwogIH0KICBsZXQgbmV3TWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBuZXdQb3MpOwogIHdoaWxlICghKG5ld01hcmtlciA+PSAweGZmYzAgJiYgbmV3TWFya2VyIDw9IDB4ZmZmZSkpIHsKICAgIGlmICgrK25ld1BvcyA+PSBtYXhQb3MpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBuZXdNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG5ld1Bvcyk7CiAgfQogIHJldHVybiB7CiAgICBpbnZhbGlkOiBjdXJyZW50TWFya2VyLnRvU3RyaW5nKDE2KSwKICAgIG1hcmtlcjogbmV3TWFya2VyLAogICAgb2Zmc2V0OiBuZXdQb3MKICB9Owp9CmZ1bmN0aW9uIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKSB7CiAgY29uc3QgbWN1c1BlckxpbmUgPSBNYXRoLmNlaWwoZnJhbWUuc2FtcGxlc1BlckxpbmUgLyA4IC8gZnJhbWUubWF4SCk7CiAgY29uc3QgbWN1c1BlckNvbHVtbiA9IE1hdGguY2VpbChmcmFtZS5zY2FuTGluZXMgLyA4IC8gZnJhbWUubWF4Vik7CiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgZnJhbWUuY29tcG9uZW50cykgewogICAgY29uc3QgYmxvY2tzUGVyTGluZSA9IE1hdGguY2VpbChNYXRoLmNlaWwoZnJhbWUuc2FtcGxlc1BlckxpbmUgLyA4KSAqIGNvbXBvbmVudC5oIC8gZnJhbWUubWF4SCk7CiAgICBjb25zdCBibG9ja3NQZXJDb2x1bW4gPSBNYXRoLmNlaWwoTWF0aC5jZWlsKGZyYW1lLnNjYW5MaW5lcyAvIDgpICogY29tcG9uZW50LnYgLyBmcmFtZS5tYXhWKTsKICAgIGNvbnN0IGJsb2Nrc1BlckxpbmVGb3JNY3UgPSBtY3VzUGVyTGluZSAqIGNvbXBvbmVudC5oOwogICAgY29uc3QgYmxvY2tzUGVyQ29sdW1uRm9yTWN1ID0gbWN1c1BlckNvbHVtbiAqIGNvbXBvbmVudC52OwogICAgY29uc3QgYmxvY2tzQnVmZmVyU2l6ZSA9IDY0ICogYmxvY2tzUGVyQ29sdW1uRm9yTWN1ICogKGJsb2Nrc1BlckxpbmVGb3JNY3UgKyAxKTsKICAgIGNvbXBvbmVudC5ibG9ja0RhdGEgPSBuZXcgSW50MTZBcnJheShibG9ja3NCdWZmZXJTaXplKTsKICAgIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lID0gYmxvY2tzUGVyTGluZTsKICAgIGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW4gPSBibG9ja3NQZXJDb2x1bW47CiAgfQogIGZyYW1lLm1jdXNQZXJMaW5lID0gbWN1c1BlckxpbmU7CiAgZnJhbWUubWN1c1BlckNvbHVtbiA9IG1jdXNQZXJDb2x1bW47Cn0KZnVuY3Rpb24gcmVhZERhdGFCbG9jayhkYXRhLCBvZmZzZXQpIHsKICBjb25zdCBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgb2Zmc2V0ICs9IDI7CiAgbGV0IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aCAtIDI7CiAgY29uc3QgZmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBlbmRPZmZzZXQsIG9mZnNldCk7CiAgaWYgKGZpbGVNYXJrZXI/LmludmFsaWQpIHsKICAgIHdhcm4oInJlYWREYXRhQmxvY2sgLSBpbmNvcnJlY3QgbGVuZ3RoLCBjdXJyZW50IG1hcmtlciBpczogIiArIGZpbGVNYXJrZXIuaW52YWxpZCk7CiAgICBlbmRPZmZzZXQgPSBmaWxlTWFya2VyLm9mZnNldDsKICB9CiAgY29uc3QgYXJyYXkgPSBkYXRhLnN1YmFycmF5KG9mZnNldCwgZW5kT2Zmc2V0KTsKICByZXR1cm4gewogICAgYXBwRGF0YTogYXJyYXksCiAgICBvbGRPZmZzZXQ6IG9mZnNldCwKICAgIG5ld09mZnNldDogb2Zmc2V0ICsgYXJyYXkubGVuZ3RoCiAgfTsKfQpmdW5jdGlvbiBza2lwRGF0YShkYXRhLCBvZmZzZXQpIHsKICBjb25zdCBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgb2Zmc2V0ICs9IDI7CiAgY29uc3QgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoIC0gMjsKICBjb25zdCBmaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIGVuZE9mZnNldCwgb2Zmc2V0KTsKICBpZiAoZmlsZU1hcmtlcj8uaW52YWxpZCkgewogICAgcmV0dXJuIGZpbGVNYXJrZXIub2Zmc2V0OwogIH0KICByZXR1cm4gZW5kT2Zmc2V0Owp9CmNsYXNzIEpwZWdJbWFnZSB7CiAgY29uc3RydWN0b3IoewogICAgZGVjb2RlVHJhbnNmb3JtID0gbnVsbCwKICAgIGNvbG9yVHJhbnNmb3JtID0gLTEKICB9ID0ge30pIHsKICAgIHRoaXMuX2RlY29kZVRyYW5zZm9ybSA9IGRlY29kZVRyYW5zZm9ybTsKICAgIHRoaXMuX2NvbG9yVHJhbnNmb3JtID0gY29sb3JUcmFuc2Zvcm07CiAgfQogIHN0YXRpYyBjYW5Vc2VJbWFnZURlY29kZXIoZGF0YSwgY29sb3JUcmFuc2Zvcm0gPSAtMSkgewogICAgbGV0IGV4aWZPZmZzZXRzID0gbnVsbDsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgbGV0IG51bUNvbXBvbmVudHMgPSBudWxsOwogICAgbGV0IGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICBvZmZzZXQgKz0gMjsKICAgIGlmIChmaWxlTWFya2VyICE9PSAweGZmZDgpIHsKICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiU09JIG5vdCBmb3VuZCIpOwogICAgfQogICAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgIG9mZnNldCArPSAyOwogICAgbWFya2VyTG9vcDogd2hpbGUgKGZpbGVNYXJrZXIgIT09IDB4ZmZkOSkgewogICAgICBzd2l0Y2ggKGZpbGVNYXJrZXIpIHsKICAgICAgICBjYXNlIDB4ZmZlMToKICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgYXBwRGF0YSwKICAgICAgICAgICAgb2xkT2Zmc2V0LAogICAgICAgICAgICBuZXdPZmZzZXQKICAgICAgICAgIH0gPSByZWFkRGF0YUJsb2NrKGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgPSBuZXdPZmZzZXQ7CiAgICAgICAgICBpZiAoYXBwRGF0YVswXSA9PT0gMHg0NSAmJiBhcHBEYXRhWzFdID09PSAweDc4ICYmIGFwcERhdGFbMl0gPT09IDB4NjkgJiYgYXBwRGF0YVszXSA9PT0gMHg2NiAmJiBhcHBEYXRhWzRdID09PSAwICYmIGFwcERhdGFbNV0gPT09IDApIHsKICAgICAgICAgICAgaWYgKGV4aWZPZmZzZXRzKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiRHVwbGljYXRlIEVYSUYtYmxvY2tzIGZvdW5kLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGV4aWZPZmZzZXRzID0gewogICAgICAgICAgICAgIGV4aWZTdGFydDogb2xkT2Zmc2V0ICsgNiwKICAgICAgICAgICAgICBleGlmRW5kOiBuZXdPZmZzZXQKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICAgIGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgMHhmZmMwOgogICAgICAgIGNhc2UgMHhmZmMxOgogICAgICAgIGNhc2UgMHhmZmMyOgogICAgICAgICAgbnVtQ29tcG9uZW50cyA9IGRhdGFbb2Zmc2V0ICsgKDIgKyAxICsgMiArIDIpXTsKICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7CiAgICAgICAgY2FzZSAweGZmZmY6CiAgICAgICAgICBpZiAoZGF0YVtvZmZzZXRdICE9PSAweGZmKSB7CiAgICAgICAgICAgIG9mZnNldC0tOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgb2Zmc2V0ID0gc2tpcERhdGEoZGF0YSwgb2Zmc2V0KTsKICAgICAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgb2Zmc2V0ICs9IDI7CiAgICB9CiAgICBpZiAobnVtQ29tcG9uZW50cyA9PT0gNCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChudW1Db21wb25lbnRzID09PSAzICYmIGNvbG9yVHJhbnNmb3JtID09PSAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIGV4aWZPZmZzZXRzIHx8IHt9OwogIH0KICBwYXJzZShkYXRhLCB7CiAgICBkbmxTY2FuTGluZXMgPSBudWxsCiAgfSA9IHt9KSB7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGxldCBqZmlmID0gbnVsbDsKICAgIGxldCBhZG9iZSA9IG51bGw7CiAgICBsZXQgZnJhbWUsIHJlc2V0SW50ZXJ2YWw7CiAgICBsZXQgbnVtU09TTWFya2VycyA9IDA7CiAgICBjb25zdCBxdWFudGl6YXRpb25UYWJsZXMgPSBbXTsKICAgIGNvbnN0IGh1ZmZtYW5UYWJsZXNBQyA9IFtdLAogICAgICBodWZmbWFuVGFibGVzREMgPSBbXTsKICAgIGxldCBmaWxlTWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpOwogICAgb2Zmc2V0ICs9IDI7CiAgICBpZiAoZmlsZU1hcmtlciAhPT0gMHhmZmQ4KSB7CiAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIlNPSSBub3QgZm91bmQiKTsKICAgIH0KICAgIGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICBvZmZzZXQgKz0gMjsKICAgIG1hcmtlckxvb3A6IHdoaWxlIChmaWxlTWFya2VyICE9PSAweGZmZDkpIHsKICAgICAgbGV0IGksIGosIGw7CiAgICAgIHN3aXRjaCAoZmlsZU1hcmtlcikgewogICAgICAgIGNhc2UgMHhmZmUwOgogICAgICAgIGNhc2UgMHhmZmUxOgogICAgICAgIGNhc2UgMHhmZmUyOgogICAgICAgIGNhc2UgMHhmZmUzOgogICAgICAgIGNhc2UgMHhmZmU0OgogICAgICAgIGNhc2UgMHhmZmU1OgogICAgICAgIGNhc2UgMHhmZmU2OgogICAgICAgIGNhc2UgMHhmZmU3OgogICAgICAgIGNhc2UgMHhmZmU4OgogICAgICAgIGNhc2UgMHhmZmU5OgogICAgICAgIGNhc2UgMHhmZmVhOgogICAgICAgIGNhc2UgMHhmZmViOgogICAgICAgIGNhc2UgMHhmZmVjOgogICAgICAgIGNhc2UgMHhmZmVkOgogICAgICAgIGNhc2UgMHhmZmVlOgogICAgICAgIGNhc2UgMHhmZmVmOgogICAgICAgIGNhc2UgMHhmZmZlOgogICAgICAgICAgY29uc3QgewogICAgICAgICAgICBhcHBEYXRhLAogICAgICAgICAgICBuZXdPZmZzZXQKICAgICAgICAgIH0gPSByZWFkRGF0YUJsb2NrKGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgPSBuZXdPZmZzZXQ7CiAgICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhmZmUwKSB7CiAgICAgICAgICAgIGlmIChhcHBEYXRhWzBdID09PSAweDRhICYmIGFwcERhdGFbMV0gPT09IDB4NDYgJiYgYXBwRGF0YVsyXSA9PT0gMHg0OSAmJiBhcHBEYXRhWzNdID09PSAweDQ2ICYmIGFwcERhdGFbNF0gPT09IDApIHsKICAgICAgICAgICAgICBqZmlmID0gewogICAgICAgICAgICAgICAgdmVyc2lvbjogewogICAgICAgICAgICAgICAgICBtYWpvcjogYXBwRGF0YVs1XSwKICAgICAgICAgICAgICAgICAgbWlub3I6IGFwcERhdGFbNl0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZW5zaXR5VW5pdHM6IGFwcERhdGFbN10sCiAgICAgICAgICAgICAgICB4RGVuc2l0eTogYXBwRGF0YVs4XSA8PCA4IHwgYXBwRGF0YVs5XSwKICAgICAgICAgICAgICAgIHlEZW5zaXR5OiBhcHBEYXRhWzEwXSA8PCA4IHwgYXBwRGF0YVsxMV0sCiAgICAgICAgICAgICAgICB0aHVtYldpZHRoOiBhcHBEYXRhWzEyXSwKICAgICAgICAgICAgICAgIHRodW1iSGVpZ2h0OiBhcHBEYXRhWzEzXSwKICAgICAgICAgICAgICAgIHRodW1iRGF0YTogYXBwRGF0YS5zdWJhcnJheSgxNCwgMTQgKyAzICogYXBwRGF0YVsxMl0gKiBhcHBEYXRhWzEzXSkKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhmZmVlKSB7CiAgICAgICAgICAgIGlmIChhcHBEYXRhWzBdID09PSAweDQxICYmIGFwcERhdGFbMV0gPT09IDB4NjQgJiYgYXBwRGF0YVsyXSA9PT0gMHg2ZiAmJiBhcHBEYXRhWzNdID09PSAweDYyICYmIGFwcERhdGFbNF0gPT09IDB4NjUpIHsKICAgICAgICAgICAgICBhZG9iZSA9IHsKICAgICAgICAgICAgICAgIHZlcnNpb246IGFwcERhdGFbNV0gPDwgOCB8IGFwcERhdGFbNl0sCiAgICAgICAgICAgICAgICBmbGFnczA6IGFwcERhdGFbN10gPDwgOCB8IGFwcERhdGFbOF0sCiAgICAgICAgICAgICAgICBmbGFnczE6IGFwcERhdGFbOV0gPDwgOCB8IGFwcERhdGFbMTBdLAogICAgICAgICAgICAgICAgdHJhbnNmb3JtQ29kZTogYXBwRGF0YVsxMV0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmZkYjoKICAgICAgICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlc0xlbmd0aCA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uVGFibGVzRW5kID0gcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoICsgb2Zmc2V0IC0gMjsKICAgICAgICAgIGxldCB6OwogICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHF1YW50aXphdGlvblRhYmxlc0VuZCkgewogICAgICAgICAgICBjb25zdCBxdWFudGl6YXRpb25UYWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFVpbnQxNkFycmF5KDY0KTsKICAgICAgICAgICAgaWYgKHF1YW50aXphdGlvblRhYmxlU3BlYyA+PiA0ID09PSAwKSB7CiAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKICAgICAgICAgICAgICAgIHogPSBkY3RaaWdaYWdbal07CiAgICAgICAgICAgICAgICB0YWJsZURhdGFbel0gPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAocXVhbnRpemF0aW9uVGFibGVTcGVjID4+IDQgPT09IDEpIHsKICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykgewogICAgICAgICAgICAgICAgeiA9IGRjdFppZ1phZ1tqXTsKICAgICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJEUVQgLSBpbnZhbGlkIHRhYmxlIHNwZWMiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBxdWFudGl6YXRpb25UYWJsZXNbcXVhbnRpemF0aW9uVGFibGVTcGVjICYgMTVdID0gdGFibGVEYXRhOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGZmYzA6CiAgICAgICAgY2FzZSAweGZmYzE6CiAgICAgICAgY2FzZSAweGZmYzI6CiAgICAgICAgICBpZiAoZnJhbWUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiT25seSBzaW5nbGUgZnJhbWUgSlBFR3Mgc3VwcG9ydGVkIik7CiAgICAgICAgICB9CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGZyYW1lID0ge307CiAgICAgICAgICBmcmFtZS5leHRlbmRlZCA9IGZpbGVNYXJrZXIgPT09IDB4ZmZjMTsKICAgICAgICAgIGZyYW1lLnByb2dyZXNzaXZlID0gZmlsZU1hcmtlciA9PT0gMHhmZmMyOwogICAgICAgICAgZnJhbWUucHJlY2lzaW9uID0gZGF0YVtvZmZzZXQrK107CiAgICAgICAgICBjb25zdCBzb2ZTY2FuTGluZXMgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGZyYW1lLnNjYW5MaW5lcyA9IGRubFNjYW5MaW5lcyB8fCBzb2ZTY2FuTGluZXM7CiAgICAgICAgICBmcmFtZS5zYW1wbGVzUGVyTGluZSA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgZnJhbWUuY29tcG9uZW50cyA9IFtdOwogICAgICAgICAgZnJhbWUuY29tcG9uZW50SWRzID0ge307CiAgICAgICAgICBjb25zdCBjb21wb25lbnRzQ291bnQgPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgIGxldCBtYXhIID0gMCwKICAgICAgICAgICAgbWF4ViA9IDA7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHsKICAgICAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBkYXRhW29mZnNldF07CiAgICAgICAgICAgIGNvbnN0IGggPSBkYXRhW29mZnNldCArIDFdID4+IDQ7CiAgICAgICAgICAgIGNvbnN0IHYgPSBkYXRhW29mZnNldCArIDFdICYgMTU7CiAgICAgICAgICAgIGlmIChtYXhIIDwgaCkgewogICAgICAgICAgICAgIG1heEggPSBoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtYXhWIDwgdikgewogICAgICAgICAgICAgIG1heFYgPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHFJZCA9IGRhdGFbb2Zmc2V0ICsgMl07CiAgICAgICAgICAgIGwgPSBmcmFtZS5jb21wb25lbnRzLnB1c2goewogICAgICAgICAgICAgIGgsCiAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICBxdWFudGl6YXRpb25JZDogcUlkLAogICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlOiBudWxsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmcmFtZS5jb21wb25lbnRJZHNbY29tcG9uZW50SWRdID0gbCAtIDE7CiAgICAgICAgICAgIG9mZnNldCArPSAzOwogICAgICAgICAgfQogICAgICAgICAgZnJhbWUubWF4SCA9IG1heEg7CiAgICAgICAgICBmcmFtZS5tYXhWID0gbWF4VjsKICAgICAgICAgIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhmZmM0OgogICAgICAgICAgY29uc3QgaHVmZm1hbkxlbmd0aCA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgZm9yIChpID0gMjsgaSA8IGh1ZmZtYW5MZW5ndGg7KSB7CiAgICAgICAgICAgIGNvbnN0IGh1ZmZtYW5UYWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgY29uc3QgY29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgICAgICAgIGxldCBjb2RlTGVuZ3RoU3VtID0gMDsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyssIG9mZnNldCsrKSB7CiAgICAgICAgICAgICAgY29kZUxlbmd0aFN1bSArPSBjb2RlTGVuZ3Roc1tqXSA9IGRhdGFbb2Zmc2V0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBodWZmbWFuVmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbmd0aFN1bSk7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlTGVuZ3RoU3VtOyBqKyssIG9mZnNldCsrKSB7CiAgICAgICAgICAgICAgaHVmZm1hblZhbHVlc1tqXSA9IGRhdGFbb2Zmc2V0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpICs9IDE3ICsgY29kZUxlbmd0aFN1bTsKICAgICAgICAgICAgKGh1ZmZtYW5UYWJsZVNwZWMgPj4gNCA9PT0gMCA/IGh1ZmZtYW5UYWJsZXNEQyA6IGh1ZmZtYW5UYWJsZXNBQylbaHVmZm1hblRhYmxlU3BlYyAmIDE1XSA9IGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCBodWZmbWFuVmFsdWVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhmZmRkOgogICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICByZXNldEludGVydmFsID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpOwogICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmZkYToKICAgICAgICAgIGNvbnN0IHBhcnNlRE5MTWFya2VyID0gKytudW1TT1NNYXJrZXJzID09PSAxICYmICFkbmxTY2FuTGluZXM7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGNvbnN0IHNlbGVjdG9yc0NvdW50ID0gZGF0YVtvZmZzZXQrK10sCiAgICAgICAgICAgIGNvbXBvbmVudHMgPSBbXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWxlY3RvcnNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVtvZmZzZXQrK107CiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEluZGV4ID0gZnJhbWUuY29tcG9uZW50SWRzW2luZGV4XTsKICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZnJhbWUuY29tcG9uZW50c1tjb21wb25lbnRJbmRleF07CiAgICAgICAgICAgIGNvbXBvbmVudC5pbmRleCA9IGluZGV4OwogICAgICAgICAgICBjb25zdCB0YWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDID0gaHVmZm1hblRhYmxlc0RDW3RhYmxlU3BlYyA+PiA0XTsKICAgICAgICAgICAgY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDID0gaHVmZm1hblRhYmxlc0FDW3RhYmxlU3BlYyAmIDE1XTsKICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzcGVjdHJhbFN0YXJ0ID0gZGF0YVtvZmZzZXQrK10sCiAgICAgICAgICAgIHNwZWN0cmFsRW5kID0gZGF0YVtvZmZzZXQrK10sCiAgICAgICAgICAgIHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uID0gZGF0YVtvZmZzZXQrK107CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBwcm9jZXNzZWQgPSBkZWNvZGVTY2FuKGRhdGEsIG9mZnNldCwgZnJhbWUsIGNvbXBvbmVudHMsIHJlc2V0SW50ZXJ2YWwsIHNwZWN0cmFsU3RhcnQsIHNwZWN0cmFsRW5kLCBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiA+PiA0LCBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiAmIDE1LCBwYXJzZUROTE1hcmtlcik7CiAgICAgICAgICAgIG9mZnNldCArPSBwcm9jZXNzZWQ7CiAgICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBETkxNYXJrZXJFcnJvcikgewogICAgICAgICAgICAgIHdhcm4oYCR7ZXgubWVzc2FnZX0gLS0gYXR0ZW1wdGluZyB0byByZS1wYXJzZSB0aGUgSlBFRyBpbWFnZS5gKTsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZShkYXRhLCB7CiAgICAgICAgICAgICAgICBkbmxTY2FuTGluZXM6IGV4LnNjYW5MaW5lcwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgRU9JTWFya2VyRXJyb3IpIHsKICAgICAgICAgICAgICB3YXJuKGAke2V4Lm1lc3NhZ2V9IC0tIGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSBpbWFnZSBkYXRhLmApOwogICAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmZkYzoKICAgICAgICAgIG9mZnNldCArPSA0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGZmZmY6CiAgICAgICAgICBpZiAoZGF0YVtvZmZzZXRdICE9PSAweGZmKSB7CiAgICAgICAgICAgIG9mZnNldC0tOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGNvbnN0IG5leHRGaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIG9mZnNldCAtIDIsIG9mZnNldCAtIDMpOwogICAgICAgICAgaWYgKG5leHRGaWxlTWFya2VyPy5pbnZhbGlkKSB7CiAgICAgICAgICAgIHdhcm4oIkpwZWdJbWFnZS5wYXJzZSAtIHVuZXhwZWN0ZWQgZGF0YSwgY3VycmVudCBtYXJrZXIgaXM6ICIgKyBuZXh0RmlsZU1hcmtlci5pbnZhbGlkKTsKICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dEZpbGVNYXJrZXIub2Zmc2V0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghbmV4dEZpbGVNYXJrZXIgfHwgb2Zmc2V0ID49IGRhdGEubGVuZ3RoIC0gMSkgewogICAgICAgICAgICB3YXJuKCJKcGVnSW1hZ2UucGFyc2UgLSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGltYWdlIGRhdGEgIiArICJ3aXRob3V0IGZpbmRpbmcgYW4gRU9JIG1hcmtlciAoMHhGRkQ5KS4iKTsKICAgICAgICAgICAgYnJlYWsgbWFya2VyTG9vcDsKICAgICAgICAgIH0KICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIkpwZWdJbWFnZS5wYXJzZSAtIHVua25vd24gbWFya2VyOiAiICsgZmlsZU1hcmtlci50b1N0cmluZygxNikpOwogICAgICB9CiAgICAgIGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICAgIG9mZnNldCArPSAyOwogICAgfQogICAgaWYgKCFmcmFtZSkgewogICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJKcGVnSW1hZ2UucGFyc2UgLSBubyBmcmFtZSBkYXRhIGZvdW5kLiIpOwogICAgfQogICAgdGhpcy53aWR0aCA9IGZyYW1lLnNhbXBsZXNQZXJMaW5lOwogICAgdGhpcy5oZWlnaHQgPSBmcmFtZS5zY2FuTGluZXM7CiAgICB0aGlzLmpmaWYgPSBqZmlmOwogICAgdGhpcy5hZG9iZSA9IGFkb2JlOwogICAgdGhpcy5jb21wb25lbnRzID0gW107CiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBmcmFtZS5jb21wb25lbnRzKSB7CiAgICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlID0gcXVhbnRpemF0aW9uVGFibGVzW2NvbXBvbmVudC5xdWFudGl6YXRpb25JZF07CiAgICAgIGlmIChxdWFudGl6YXRpb25UYWJsZSkgewogICAgICAgIGNvbXBvbmVudC5xdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlOwogICAgICB9CiAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKHsKICAgICAgICBpbmRleDogY29tcG9uZW50LmluZGV4LAogICAgICAgIG91dHB1dDogYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLCBjb21wb25lbnQpLAogICAgICAgIHNjYWxlWDogY29tcG9uZW50LmggLyBmcmFtZS5tYXhILAogICAgICAgIHNjYWxlWTogY29tcG9uZW50LnYgLyBmcmFtZS5tYXhWLAogICAgICAgIGJsb2Nrc1BlckxpbmU6IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lLAogICAgICAgIGJsb2Nrc1BlckNvbHVtbjogY29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbgogICAgICB9KTsKICAgIH0KICAgIHRoaXMubnVtQ29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7CiAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0KICBfZ2V0TGluZWFyaXplZEJsb2NrRGF0YSh3aWR0aCwgaGVpZ2h0LCBpc1NvdXJjZVBERiA9IGZhbHNlKSB7CiAgICBjb25zdCBzY2FsZVggPSB0aGlzLndpZHRoIC8gd2lkdGgsCiAgICAgIHNjYWxlWSA9IHRoaXMuaGVpZ2h0IC8gaGVpZ2h0OwogICAgbGV0IGNvbXBvbmVudCwgY29tcG9uZW50U2NhbGVYLCBjb21wb25lbnRTY2FsZVksIGJsb2Nrc1BlclNjYW5saW5lOwogICAgbGV0IHgsIHksIGksIGosIGs7CiAgICBsZXQgaW5kZXg7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGxldCBvdXRwdXQ7CiAgICBjb25zdCBudW1Db21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmxlbmd0aDsKICAgIGNvbnN0IGRhdGFMZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIG51bUNvbXBvbmVudHM7CiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGFMZW5ndGgpOwogICAgY29uc3QgeFNjYWxlQmxvY2tPZmZzZXQgPSBuZXcgVWludDMyQXJyYXkod2lkdGgpOwogICAgY29uc3QgbWFzazNMU0IgPSAweGZmZmZmZmY4OwogICAgbGV0IGxhc3RDb21wb25lbnRTY2FsZVg7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgaSsrKSB7CiAgICAgIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tpXTsKICAgICAgY29tcG9uZW50U2NhbGVYID0gY29tcG9uZW50LnNjYWxlWCAqIHNjYWxlWDsKICAgICAgY29tcG9uZW50U2NhbGVZID0gY29tcG9uZW50LnNjYWxlWSAqIHNjYWxlWTsKICAgICAgb2Zmc2V0ID0gaTsKICAgICAgb3V0cHV0ID0gY29tcG9uZW50Lm91dHB1dDsKICAgICAgYmxvY2tzUGVyU2NhbmxpbmUgPSBjb21wb25lbnQuYmxvY2tzUGVyTGluZSArIDEgPDwgMzsKICAgICAgaWYgKGNvbXBvbmVudFNjYWxlWCAhPT0gbGFzdENvbXBvbmVudFNjYWxlWCkgewogICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICBqID0gMCB8IHggKiBjb21wb25lbnRTY2FsZVg7CiAgICAgICAgICB4U2NhbGVCbG9ja09mZnNldFt4XSA9IChqICYgbWFzazNMU0IpIDw8IDMgfCBqICYgNzsKICAgICAgICB9CiAgICAgICAgbGFzdENvbXBvbmVudFNjYWxlWCA9IGNvbXBvbmVudFNjYWxlWDsKICAgICAgfQogICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICBqID0gMCB8IHkgKiBjb21wb25lbnRTY2FsZVk7CiAgICAgICAgaW5kZXggPSBibG9ja3NQZXJTY2FubGluZSAqIChqICYgbWFzazNMU0IpIHwgKGogJiA3KSA8PCAzOwogICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICBkYXRhW29mZnNldF0gPSBvdXRwdXRbaW5kZXggKyB4U2NhbGVCbG9ja09mZnNldFt4XV07CiAgICAgICAgICBvZmZzZXQgKz0gbnVtQ29tcG9uZW50czsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGxldCB0cmFuc2Zvcm0gPSB0aGlzLl9kZWNvZGVUcmFuc2Zvcm07CiAgICBpZiAoIWlzU291cmNlUERGICYmIG51bUNvbXBvbmVudHMgPT09IDQgJiYgIXRyYW5zZm9ybSkgewogICAgICB0cmFuc2Zvcm0gPSBuZXcgSW50MzJBcnJheShbLTI1NiwgMjU1LCAtMjU2LCAyNTUsIC0yNTYsIDI1NSwgLTI1NiwgMjU1XSk7CiAgICB9CiAgICBpZiAodHJhbnNmb3JtKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOykgewogICAgICAgIGZvciAoaiA9IDAsIGsgPSAwOyBqIDwgbnVtQ29tcG9uZW50czsgaisrLCBpKyssIGsgKz0gMikgewogICAgICAgICAgZGF0YVtpXSA9IChkYXRhW2ldICogdHJhbnNmb3JtW2tdID4+IDgpICsgdHJhbnNmb3JtW2sgKyAxXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KICBnZXQgX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKCkgewogICAgaWYgKHRoaXMuYWRvYmUpIHsKICAgICAgcmV0dXJuICEhdGhpcy5hZG9iZS50cmFuc2Zvcm1Db2RlOwogICAgfQogICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gMykgewogICAgICBpZiAodGhpcy5fY29sb3JUcmFuc2Zvcm0gPT09IDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21wb25lbnRzWzBdLmluZGV4ID09PSAweDUyICYmIHRoaXMuY29tcG9uZW50c1sxXS5pbmRleCA9PT0gMHg0NyAmJiB0aGlzLmNvbXBvbmVudHNbMl0uaW5kZXggPT09IDB4NDIpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAodGhpcy5fY29sb3JUcmFuc2Zvcm0gPT09IDEpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIF9jb252ZXJ0WWNjVG9SZ2IoZGF0YSkgewogICAgbGV0IFksIENiLCBDcjsKICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CiAgICAgIFkgPSBkYXRhW2ldOwogICAgICBDYiA9IGRhdGFbaSArIDFdOwogICAgICBDciA9IGRhdGFbaSArIDJdOwogICAgICBkYXRhW2ldID0gWSAtIDE3OS40NTYgKyAxLjQwMiAqIENyOwogICAgICBkYXRhW2kgKyAxXSA9IFkgKyAxMzUuNDU5IC0gMC4zNDQgKiBDYiAtIDAuNzE0ICogQ3I7CiAgICAgIGRhdGFbaSArIDJdID0gWSAtIDIyNi44MTYgKyAxLjc3MiAqIENiOwogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQogIF9jb252ZXJ0WWNjVG9SZ2JhKGRhdGEsIG91dCkgewogICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAzLCBqICs9IDQpIHsKICAgICAgY29uc3QgWSA9IGRhdGFbaV07CiAgICAgIGNvbnN0IENiID0gZGF0YVtpICsgMV07CiAgICAgIGNvbnN0IENyID0gZGF0YVtpICsgMl07CiAgICAgIG91dFtqXSA9IFkgLSAxNzkuNDU2ICsgMS40MDIgKiBDcjsKICAgICAgb3V0W2ogKyAxXSA9IFkgKyAxMzUuNDU5IC0gMC4zNDQgKiBDYiAtIDAuNzE0ICogQ3I7CiAgICAgIG91dFtqICsgMl0gPSBZIC0gMjI2LjgxNiArIDEuNzcyICogQ2I7CiAgICAgIG91dFtqICsgM10gPSAyNTU7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBfY29udmVydFljY2tUb1JnYihkYXRhKSB7CiAgICB0aGlzLl9jb252ZXJ0WWNja1RvQ215ayhkYXRhKTsKICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q215a1RvUmdiKGRhdGEpOwogIH0KICBfY29udmVydFljY2tUb1JnYmEoZGF0YSkgewogICAgdGhpcy5fY29udmVydFljY2tUb0NteWsoZGF0YSk7CiAgICByZXR1cm4gdGhpcy5fY29udmVydENteWtUb1JnYmEoZGF0YSk7CiAgfQogIF9jb252ZXJ0WWNja1RvQ215ayhkYXRhKSB7CiAgICBsZXQgWSwgQ2IsIENyOwogICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKICAgICAgWSA9IGRhdGFbaV07CiAgICAgIENiID0gZGF0YVtpICsgMV07CiAgICAgIENyID0gZGF0YVtpICsgMl07CiAgICAgIGRhdGFbaV0gPSA0MzQuNDU2IC0gWSAtIDEuNDAyICogQ3I7CiAgICAgIGRhdGFbaSArIDFdID0gMTE5LjU0MSAtIFkgKyAwLjM0NCAqIENiICsgMC43MTQgKiBDcjsKICAgICAgZGF0YVtpICsgMl0gPSA0ODEuODE2IC0gWSAtIDEuNzcyICogQ2I7CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9CiAgX2NvbnZlcnRDbXlrVG9SZ2IoZGF0YSkgewogICAgY29uc3QgY291bnQgPSBkYXRhLmxlbmd0aCAvIDQ7CiAgICBDb2xvclNwYWNlVXRpbHMuY215ay5nZXRSZ2JCdWZmZXIoZGF0YSwgMCwgY291bnQsIGRhdGEsIDAsIDgsIDApOwogICAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgY291bnQgKiAzKTsKICB9CiAgX2NvbnZlcnRDbXlrVG9SZ2JhKGRhdGEpIHsKICAgIENvbG9yU3BhY2VVdGlscy5jbXlrLmdldFJnYkJ1ZmZlcihkYXRhLCAwLCBkYXRhLmxlbmd0aCAvIDQsIGRhdGEsIDAsIDgsIDEpOwogICAgaWYgKENvbG9yU3BhY2VVdGlscy5jbXlrIGluc3RhbmNlb2YgRGV2aWNlQ215a0NTKSB7CiAgICAgIGZvciAobGV0IGkgPSAzLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkgewogICAgICAgIGRhdGFbaV0gPSAyNTU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KICBnZXREYXRhKHsKICAgIHdpZHRoLAogICAgaGVpZ2h0LAogICAgZm9yY2VSR0JBID0gZmFsc2UsCiAgICBmb3JjZVJHQiA9IGZhbHNlLAogICAgaXNTb3VyY2VQREYgPSBmYWxzZQogIH0pIHsKICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPiA0KSB7CiAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIlVuc3VwcG9ydGVkIGNvbG9yIG1vZGUiKTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHdpZHRoLCBoZWlnaHQsIGlzU291cmNlUERGKTsKICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDEgJiYgKGZvcmNlUkdCQSB8fCBmb3JjZVJHQikpIHsKICAgICAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGggKiAoZm9yY2VSR0JBID8gNCA6IDMpOwogICAgICBjb25zdCByZ2JhRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShsZW4pOwogICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgaWYgKGZvcmNlUkdCQSkgewogICAgICAgIGdyYXlUb1JHQkEoZGF0YSwgbmV3IFVpbnQzMkFycmF5KHJnYmFEYXRhLmJ1ZmZlcikpOwogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoY29uc3QgZ3JheUNvbG9yIG9mIGRhdGEpIHsKICAgICAgICAgIHJnYmFEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKICAgICAgICAgIHJnYmFEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKICAgICAgICAgIHJnYmFEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJnYmFEYXRhOwogICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDMgJiYgdGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpIHsKICAgICAgaWYgKGZvcmNlUkdCQSkgewogICAgICAgIGNvbnN0IHJnYmFEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEubGVuZ3RoIC8gMyAqIDQpOwogICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNjVG9SZ2JhKGRhdGEsIHJnYmFEYXRhKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fY29udmVydFljY1RvUmdiKGRhdGEpOwogICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDQpIHsKICAgICAgaWYgKHRoaXMuX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKSB7CiAgICAgICAgaWYgKGZvcmNlUkdCQSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NrVG9SZ2JhKGRhdGEpOwogICAgICAgIH0KICAgICAgICBpZiAoZm9yY2VSR0IpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvUmdiKGRhdGEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydFljY2tUb0NteWsoZGF0YSk7CiAgICAgIH0gZWxzZSBpZiAoZm9yY2VSR0JBKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2JhKGRhdGEpOwogICAgICB9IGVsc2UgaWYgKGZvcmNlUkdCKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2IoZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvanBlZ19zdHJlYW0uanMKCgoKCmNsYXNzIEpwZWdTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIHN0YXRpYyAjaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQgPSBGZWF0dXJlVGVzdC5pc0ltYWdlRGVjb2RlclN1cHBvcnRlZDsKICBjb25zdHJ1Y3RvcihzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5kaWN0ID0gc3RyZWFtLmRpY3Q7CiAgICB0aGlzLm1heWJlTGVuZ3RoID0gbWF5YmVMZW5ndGg7CiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICB9CiAgc3RhdGljIGdldCBjYW5Vc2VJbWFnZURlY29kZXIoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjYW5Vc2VJbWFnZURlY29kZXIiLCB0aGlzLiNpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA/IEltYWdlRGVjb2Rlci5pc1R5cGVTdXBwb3J0ZWQoImltYWdlL2pwZWciKSA6IFByb21pc2UucmVzb2x2ZShmYWxzZSkpOwogIH0KICBzdGF0aWMgc2V0T3B0aW9ucyh7CiAgICBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA9IGZhbHNlCiAgfSkgewogICAgdGhpcy4jaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQgPSBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZDsKICB9CiAgZ2V0IGJ5dGVzKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYnl0ZXMiLCB0aGlzLnN0cmVhbS5nZXRCeXRlcyh0aGlzLm1heWJlTGVuZ3RoKSk7CiAgfQogIGVuc3VyZUJ1ZmZlcihyZXF1ZXN0ZWQpIHt9CiAgcmVhZEJsb2NrKCkgewogICAgdGhpcy5kZWNvZGVJbWFnZSgpOwogIH0KICBnZXQganBlZ09wdGlvbnMoKSB7CiAgICBjb25zdCBqcGVnT3B0aW9ucyA9IHsKICAgICAgZGVjb2RlVHJhbnNmb3JtOiB1bmRlZmluZWQsCiAgICAgIGNvbG9yVHJhbnNmb3JtOiB1bmRlZmluZWQKICAgIH07CiAgICBjb25zdCBkZWNvZGVBcnIgPSB0aGlzLmRpY3QuZ2V0QXJyYXkoIkQiLCAiRGVjb2RlIik7CiAgICBpZiAoKHRoaXMuZm9yY2VSR0JBIHx8IHRoaXMuZm9yY2VSR0IpICYmIEFycmF5LmlzQXJyYXkoZGVjb2RlQXJyKSkgewogICAgICBjb25zdCBiaXRzUGVyQ29tcG9uZW50ID0gdGhpcy5kaWN0LmdldCgiQlBDIiwgIkJpdHNQZXJDb21wb25lbnQiKSB8fCA4OwogICAgICBjb25zdCBkZWNvZGVBcnJMZW5ndGggPSBkZWNvZGVBcnIubGVuZ3RoOwogICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgSW50MzJBcnJheShkZWNvZGVBcnJMZW5ndGgpOwogICAgICBsZXQgdHJhbnNmb3JtTmVlZGVkID0gZmFsc2U7CiAgICAgIGNvbnN0IG1heFZhbHVlID0gKDEgPDwgYml0c1BlckNvbXBvbmVudCkgLSAxOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlY29kZUFyckxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgdHJhbnNmb3JtW2ldID0gKGRlY29kZUFycltpICsgMV0gLSBkZWNvZGVBcnJbaV0pICogMjU2IHwgMDsKICAgICAgICB0cmFuc2Zvcm1baSArIDFdID0gZGVjb2RlQXJyW2ldICogbWF4VmFsdWUgfCAwOwogICAgICAgIGlmICh0cmFuc2Zvcm1baV0gIT09IDI1NiB8fCB0cmFuc2Zvcm1baSArIDFdICE9PSAwKSB7CiAgICAgICAgICB0cmFuc2Zvcm1OZWVkZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodHJhbnNmb3JtTmVlZGVkKSB7CiAgICAgICAganBlZ09wdGlvbnMuZGVjb2RlVHJhbnNmb3JtID0gdHJhbnNmb3JtOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5wYXJhbXMgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGNvbnN0IGNvbG9yVHJhbnNmb3JtID0gdGhpcy5wYXJhbXMuZ2V0KCJDb2xvclRyYW5zZm9ybSIpOwogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihjb2xvclRyYW5zZm9ybSkpIHsKICAgICAgICBqcGVnT3B0aW9ucy5jb2xvclRyYW5zZm9ybSA9IGNvbG9yVHJhbnNmb3JtOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJqcGVnT3B0aW9ucyIsIGpwZWdPcHRpb25zKTsKICB9CiAgI3NraXBVc2VsZXNzQnl0ZXMoZGF0YSkgewogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGggLSAxOyBpIDwgaWk7IGkrKykgewogICAgICBpZiAoZGF0YVtpXSA9PT0gMHhmZiAmJiBkYXRhW2kgKyAxXSA9PT0gMHhkOCkgewogICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgZGF0YSA9IGRhdGEuc3ViYXJyYXkoaSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9CiAgZGVjb2RlSW1hZ2UoYnl0ZXMpIHsKICAgIGlmICh0aGlzLmVvZikgewogICAgICByZXR1cm4gdGhpcy5idWZmZXI7CiAgICB9CiAgICBieXRlcyA9IHRoaXMuI3NraXBVc2VsZXNzQnl0ZXMoYnl0ZXMgfHwgdGhpcy5ieXRlcyk7CiAgICBjb25zdCBqcGVnSW1hZ2UgPSBuZXcgSnBlZ0ltYWdlKHRoaXMuanBlZ09wdGlvbnMpOwogICAganBlZ0ltYWdlLnBhcnNlKGJ5dGVzKTsKICAgIGNvbnN0IGRhdGEgPSBqcGVnSW1hZ2UuZ2V0RGF0YSh7CiAgICAgIHdpZHRoOiB0aGlzLmRyYXdXaWR0aCwKICAgICAgaGVpZ2h0OiB0aGlzLmRyYXdIZWlnaHQsCiAgICAgIGZvcmNlUkdCQTogdGhpcy5mb3JjZVJHQkEsCiAgICAgIGZvcmNlUkdCOiB0aGlzLmZvcmNlUkdCLAogICAgICBpc1NvdXJjZVBERjogdHJ1ZQogICAgfSk7CiAgICB0aGlzLmJ1ZmZlciA9IGRhdGE7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgdGhpcy5lb2YgPSB0cnVlOwogICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogIH0KICBnZXQgY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIoKSB7CiAgICByZXR1cm4gdGhpcy5zdHJlYW0uaXNBc3luYzsKICB9CiAgYXN5bmMgZ2V0VHJhbnNmZXJhYmxlSW1hZ2UoKSB7CiAgICBpZiAoIShhd2FpdCBKcGVnU3RyZWFtLmNhblVzZUltYWdlRGVjb2RlcikpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBqcGVnT3B0aW9ucyA9IHRoaXMuanBlZ09wdGlvbnM7CiAgICBpZiAoanBlZ09wdGlvbnMuZGVjb2RlVHJhbnNmb3JtKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbGV0IGRlY29kZXI7CiAgICB0cnkgewogICAgICBjb25zdCBieXRlcyA9IHRoaXMuY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIgJiYgKGF3YWl0IHRoaXMuc3RyZWFtLmFzeW5jR2V0Qnl0ZXMoKSkgfHwgdGhpcy5ieXRlczsKICAgICAgaWYgKCFieXRlcykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGxldCBkYXRhID0gdGhpcy4jc2tpcFVzZWxlc3NCeXRlcyhieXRlcyk7CiAgICAgIGNvbnN0IHVzZUltYWdlRGVjb2RlciA9IEpwZWdJbWFnZS5jYW5Vc2VJbWFnZURlY29kZXIoZGF0YSwganBlZ09wdGlvbnMuY29sb3JUcmFuc2Zvcm0pOwogICAgICBpZiAoIXVzZUltYWdlRGVjb2RlcikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmICh1c2VJbWFnZURlY29kZXIuZXhpZlN0YXJ0KSB7CiAgICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoKTsKICAgICAgICBkYXRhLmZpbGwoMHgwMCwgdXNlSW1hZ2VEZWNvZGVyLmV4aWZTdGFydCwgdXNlSW1hZ2VEZWNvZGVyLmV4aWZFbmQpOwogICAgICB9CiAgICAgIGRlY29kZXIgPSBuZXcgSW1hZ2VEZWNvZGVyKHsKICAgICAgICBkYXRhLAogICAgICAgIHR5cGU6ICJpbWFnZS9qcGVnIiwKICAgICAgICBwcmVmZXJBbmltYXRpb246IGZhbHNlCiAgICAgIH0pOwogICAgICByZXR1cm4gKGF3YWl0IGRlY29kZXIuZGVjb2RlKCkpLmltYWdlOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHdhcm4oYGdldFRyYW5zZmVyYWJsZUltYWdlIC0gZmFpbGVkOiAiJHtyZWFzb259Ii5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGZpbmFsbHkgewogICAgICBkZWNvZGVyPy5jbG9zZSgpOwogICAgfQogIH0KfQoKOy8vIC4vZXh0ZXJuYWwvb3BlbmpwZWcvb3BlbmpwZWcuanMKdmFyIE9wZW5KUEVHID0gKCgpID0+IHsKICB2YXIgX3NjcmlwdE5hbWUgPSBpbXBvcnQubWV0YS51cmw7CiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChtb2R1bGVBcmcgPSB7fSkgewogICAgdmFyIG1vZHVsZVJ0bjsKICAgIHZhciBNb2R1bGUgPSBtb2R1bGVBcmc7CiAgICB2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSwgcmVhZHlQcm9taXNlUmVqZWN0OwogICAgdmFyIHJlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgIHJlYWR5UHJvbWlzZVJlamVjdCA9IHJlamVjdDsKICAgIH0pOwogICAgdmFyIEVOVklST05NRU5UX0lTX1dFQiA9IHRydWU7CiAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSID0gZmFsc2U7CiAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0gT2JqZWN0LmFzc2lnbih7fSwgTW9kdWxlKTsKICAgIHZhciBhcmd1bWVudHNfID0gW107CiAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgdmFyIHF1aXRfID0gKHN0YXR1cywgdG9UaHJvdykgPT4gewogICAgICB0aHJvdyB0b1Rocm93OwogICAgfTsKICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgIGZ1bmN0aW9uIGxvY2F0ZUZpbGUocGF0aCkgewogICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgfQogICAgICByZXR1cm4gc2NyaXB0RGlyZWN0b3J5ICsgcGF0aDsKICAgIH0KICAgIHZhciByZWFkQXN5bmMsIHJlYWRCaW5hcnk7CiAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV0VCIHx8IEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCAhPSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CiAgICAgIH0KICAgICAgaWYgKF9zY3JpcHROYW1lKSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX3NjcmlwdE5hbWU7CiAgICAgIH0KICAgICAgaWYgKHNjcmlwdERpcmVjdG9yeS5zdGFydHNXaXRoKCJibG9iOiIpKSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gIiI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2NyaXB0RGlyZWN0b3J5LnNsaWNlKDAsIHNjcmlwdERpcmVjdG9yeS5yZXBsYWNlKC9bPyNdLiovLCAiIikubGFzdEluZGV4T2YoIi8iKSArIDEpOwogICAgICB9CiAgICAgIHJlYWRBc3luYyA9IGFzeW5jIHVybCA9PiB7CiAgICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7CiAgICAgICAgICBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIgogICAgICAgIH0pOwogICAgICAgIGlmIChyZXNwb25zZS5vaykgewogICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyAiIDogIiArIHJlc3BvbnNlLnVybCk7CiAgICAgIH07CiAgICB9IGVsc2Uge30KICAgIHZhciBvdXQgPSBNb2R1bGVbInByaW50Il0gfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTsKICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpOwogICAgT2JqZWN0LmFzc2lnbihNb2R1bGUsIG1vZHVsZU92ZXJyaWRlcyk7CiAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgaWYgKE1vZHVsZVsiYXJndW1lbnRzIl0pIGFyZ3VtZW50c18gPSBNb2R1bGVbImFyZ3VtZW50cyJdOwogICAgaWYgKE1vZHVsZVsidGhpc1Byb2dyYW0iXSkgdGhpc1Byb2dyYW0gPSBNb2R1bGVbInRoaXNQcm9ncmFtIl07CiAgICB2YXIgd2FzbUJpbmFyeSA9IE1vZHVsZVsid2FzbUJpbmFyeSJdOwogICAgdmFyIHdhc21NZW1vcnk7CiAgICB2YXIgQUJPUlQgPSBmYWxzZTsKICAgIHZhciBFWElUU1RBVFVTOwogICAgdmFyIEhFQVA4LCBIRUFQVTgsIEhFQVAxNiwgSEVBUFUxNiwgSEVBUDMyLCBIRUFQVTMyLCBIRUFQRjMyLCBIRUFQNjQsIEhFQVBVNjQsIEhFQVBGNjQ7CiAgICB2YXIgcnVudGltZUluaXRpYWxpemVkID0gZmFsc2U7CiAgICBmdW5jdGlvbiB1cGRhdGVNZW1vcnlWaWV3cygpIHsKICAgICAgdmFyIGIgPSB3YXNtTWVtb3J5LmJ1ZmZlcjsKICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGIpOwogICAgICBNb2R1bGVbIkhFQVAxNiJdID0gSEVBUDE2ID0gbmV3IEludDE2QXJyYXkoYik7CiAgICAgIE1vZHVsZVsiSEVBUFU4Il0gPSBIRUFQVTggPSBuZXcgVWludDhBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQVTE2Il0gPSBIRUFQVTE2ID0gbmV3IFVpbnQxNkFycmF5KGIpOwogICAgICBNb2R1bGVbIkhFQVAzMiJdID0gSEVBUDMyID0gbmV3IEludDMyQXJyYXkoYik7CiAgICAgIE1vZHVsZVsiSEVBUFUzMiJdID0gSEVBUFUzMiA9IG5ldyBVaW50MzJBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQRjMyIl0gPSBIRUFQRjMyID0gbmV3IEZsb2F0MzJBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBIRUFQRjY0ID0gbmV3IEZsb2F0NjRBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQNjQiXSA9IEhFQVA2NCA9IG5ldyBCaWdJbnQ2NEFycmF5KGIpOwogICAgICBNb2R1bGVbIkhFQVBVNjQiXSA9IEhFQVBVNjQgPSBuZXcgQmlnVWludDY0QXJyYXkoYik7CiAgICB9CiAgICBmdW5jdGlvbiBwcmVSdW4oKSB7CiAgICAgIGlmIChNb2R1bGVbInByZVJ1biJdKSB7CiAgICAgICAgaWYgKHR5cGVvZiBNb2R1bGVbInByZVJ1biJdID09ICJmdW5jdGlvbiIpIE1vZHVsZVsicHJlUnVuIl0gPSBbTW9kdWxlWyJwcmVSdW4iXV07CiAgICAgICAgd2hpbGUgKE1vZHVsZVsicHJlUnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICBhZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpOwogICAgICAgIH0KICAgICAgfQogICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhvblByZVJ1bnMpOwogICAgfQogICAgZnVuY3Rpb24gaW5pdFJ1bnRpbWUoKSB7CiAgICAgIHJ1bnRpbWVJbml0aWFsaXplZCA9IHRydWU7CiAgICAgIHdhc21FeHBvcnRzWyJ0Il0oKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgIGlmIChNb2R1bGVbInBvc3RSdW4iXSkgewogICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl0gPT0gImZ1bmN0aW9uIikgTW9kdWxlWyJwb3N0UnVuIl0gPSBbTW9kdWxlWyJwb3N0UnVuIl1dOwogICAgICAgIHdoaWxlIChNb2R1bGVbInBvc3RSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3Mob25Qb3N0UnVucyk7CiAgICB9CiAgICB2YXIgcnVuRGVwZW5kZW5jaWVzID0gMDsKICAgIHZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsOwogICAgZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCkgewogICAgICBydW5EZXBlbmRlbmNpZXMrKzsKICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0/LihydW5EZXBlbmRlbmNpZXMpOwogICAgfQogICAgZnVuY3Rpb24gcmVtb3ZlUnVuRGVwZW5kZW5jeShpZCkgewogICAgICBydW5EZXBlbmRlbmNpZXMtLTsKICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0/LihydW5EZXBlbmRlbmNpZXMpOwogICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID09IDApIHsKICAgICAgICBpZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7CiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ7CiAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsOwogICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFib3J0KHdoYXQpIHsKICAgICAgTW9kdWxlWyJvbkFib3J0Il0/Lih3aGF0KTsKICAgICAgd2hhdCA9ICJBYm9ydGVkKCIgKyB3aGF0ICsgIikiOwogICAgICBlcnIod2hhdCk7CiAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgd2hhdCArPSAiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7CiAgICAgIHZhciBlID0gbmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcih3aGF0KTsKICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICB0aHJvdyBlOwogICAgfQogICAgdmFyIHdhc21CaW5hcnlGaWxlOwogICAgZnVuY3Rpb24gZmluZFdhc21CaW5hcnkoKSB7CiAgICAgIGlmIChNb2R1bGVbImxvY2F0ZUZpbGUiXSkgewogICAgICAgIHJldHVybiBsb2NhdGVGaWxlKCJvcGVuanBlZy53YXNtIik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBVUkwoIm9wZW5qcGVnLndhc20iLCBpbXBvcnQubWV0YS51cmwpLmhyZWY7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRCaW5hcnlTeW5jKGZpbGUpIHsKICAgICAgaWYgKGZpbGUgPT0gd2FzbUJpbmFyeUZpbGUgJiYgd2FzbUJpbmFyeSkgewogICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KTsKICAgICAgfQogICAgICBpZiAocmVhZEJpbmFyeSkgewogICAgICAgIHJldHVybiByZWFkQmluYXJ5KGZpbGUpOwogICAgICB9CiAgICAgIHRocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCI7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBnZXRXYXNtQmluYXJ5KGJpbmFyeUZpbGUpIHsKICAgICAgaWYgKCF3YXNtQmluYXJ5KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IHJlYWRBc3luYyhiaW5hcnlGaWxlKTsKICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZXNwb25zZSk7CiAgICAgICAgfSBjYXRjaCB7fQogICAgICB9CiAgICAgIHJldHVybiBnZXRCaW5hcnlTeW5jKGJpbmFyeUZpbGUpOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihiaW5hcnlGaWxlLCBpbXBvcnRzKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGJpbmFyeSA9IGF3YWl0IGdldFdhc21CaW5hcnkoYmluYXJ5RmlsZSk7CiAgICAgICAgdmFyIGluc3RhbmNlID0gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LCBpbXBvcnRzKTsKICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgIGVycihgZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogJHtyZWFzb259YCk7CiAgICAgICAgYWJvcnQocmVhc29uKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYyhiaW5hcnksIGJpbmFyeUZpbGUsIGltcG9ydHMpIHsKICAgICAgaWYgKCFiaW5hcnkgJiYgdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09ICJmdW5jdGlvbiIpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIHJlc3BvbnNlID0gZmV0Y2goYmluYXJ5RmlsZSwgewogICAgICAgICAgICBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIgogICAgICAgICAgfSk7CiAgICAgICAgICB2YXIgaW5zdGFudGlhdGlvblJlc3VsdCA9IGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlc3BvbnNlLCBpbXBvcnRzKTsKICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0aW9uUmVzdWx0OwogICAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgICAgZXJyKGB3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogJHtyZWFzb259YCk7CiAgICAgICAgICBlcnIoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKGJpbmFyeUZpbGUsIGltcG9ydHMpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0V2FzbUltcG9ydHMoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgYTogd2FzbUltcG9ydHMKICAgICAgfTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVdhc20oKSB7CiAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgd2FzbUV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgIHdhc21NZW1vcnkgPSB3YXNtRXhwb3J0c1sicyJdOwogICAgICAgIHVwZGF0ZU1lbW9yeVZpZXdzKCk7CiAgICAgICAgcmVtb3ZlUnVuRGVwZW5kZW5jeSgid2FzbS1pbnN0YW50aWF0ZSIpOwogICAgICAgIHJldHVybiB3YXNtRXhwb3J0czsKICAgICAgfQogICAgICBhZGRSdW5EZXBlbmRlbmN5KCJ3YXNtLWluc3RhbnRpYXRlIik7CiAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW50aWF0aW9uUmVzdWx0KHJlc3VsdCkgewogICAgICAgIHJldHVybiByZWNlaXZlSW5zdGFuY2UocmVzdWx0WyJpbnN0YW5jZSJdKTsKICAgICAgfQogICAgICB2YXIgaW5mbyA9IGdldFdhc21JbXBvcnRzKCk7CiAgICAgIGlmIChNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIE1vZHVsZVsiaW5zdGFudGlhdGVXYXNtIl0oaW5mbywgKG1vZCwgaW5zdCkgPT4gewogICAgICAgICAgICByZWNlaXZlSW5zdGFuY2UobW9kLCBpbnN0KTsKICAgICAgICAgICAgcmVzb2x2ZShtb2QuZXhwb3J0cyk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICB3YXNtQmluYXJ5RmlsZSA/Pz0gZmluZFdhc21CaW5hcnkoKTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgaW5zdGFudGlhdGVBc3luYyh3YXNtQmluYXJ5LCB3YXNtQmluYXJ5RmlsZSwgaW5mbyk7CiAgICAgICAgdmFyIGV4cG9ydHMgPSByZWNlaXZlSW5zdGFudGlhdGlvblJlc3VsdChyZXN1bHQpOwogICAgICAgIHJldHVybiBleHBvcnRzOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTsKICAgICAgfQogICAgfQogICAgY2xhc3MgRXhpdFN0YXR1cyB7CiAgICAgIG5hbWUgPSAiRXhpdFN0YXR1cyI7CiAgICAgIGNvbnN0cnVjdG9yKHN0YXR1cykgewogICAgICAgIHRoaXMubWVzc2FnZSA9IGBQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCR7c3RhdHVzfSlgOwogICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwogICAgICB9CiAgICB9CiAgICB2YXIgY2FsbFJ1bnRpbWVDYWxsYmFja3MgPSBjYWxsYmFja3MgPT4gewogICAgICB3aGlsZSAoY2FsbGJhY2tzLmxlbmd0aCA+IDApIHsKICAgICAgICBjYWxsYmFja3Muc2hpZnQoKShNb2R1bGUpOwogICAgICB9CiAgICB9OwogICAgdmFyIG9uUG9zdFJ1bnMgPSBbXTsKICAgIHZhciBhZGRPblBvc3RSdW4gPSBjYiA9PiBvblBvc3RSdW5zLnVuc2hpZnQoY2IpOwogICAgdmFyIG9uUHJlUnVucyA9IFtdOwogICAgdmFyIGFkZE9uUHJlUnVuID0gY2IgPT4gb25QcmVSdW5zLnVuc2hpZnQoY2IpOwogICAgdmFyIG5vRXhpdFJ1bnRpbWUgPSBNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSB8fCB0cnVlOwogICAgdmFyIF9fYWJvcnRfanMgPSAoKSA9PiBhYm9ydCgiIik7CiAgICB2YXIgcnVudGltZUtlZXBhbGl2ZUNvdW50ZXIgPSAwOwogICAgdmFyIF9fZW1zY3JpcHRlbl9ydW50aW1lX2tlZXBhbGl2ZV9jbGVhciA9ICgpID0+IHsKICAgICAgbm9FeGl0UnVudGltZSA9IGZhbHNlOwogICAgICBydW50aW1lS2VlcGFsaXZlQ291bnRlciA9IDA7CiAgICB9OwogICAgdmFyIHRpbWVycyA9IHt9OwogICAgdmFyIGhhbmRsZUV4Y2VwdGlvbiA9IGUgPT4gewogICAgICBpZiAoZSBpbnN0YW5jZW9mIEV4aXRTdGF0dXMgfHwgZSA9PSAidW53aW5kIikgewogICAgICAgIHJldHVybiBFWElUU1RBVFVTOwogICAgICB9CiAgICAgIHF1aXRfKDEsIGUpOwogICAgfTsKICAgIHZhciBrZWVwUnVudGltZUFsaXZlID0gKCkgPT4gbm9FeGl0UnVudGltZSB8fCBydW50aW1lS2VlcGFsaXZlQ291bnRlciA+IDA7CiAgICB2YXIgX3Byb2NfZXhpdCA9IGNvZGUgPT4gewogICAgICBFWElUU1RBVFVTID0gY29kZTsKICAgICAgaWYgKCFrZWVwUnVudGltZUFsaXZlKCkpIHsKICAgICAgICBNb2R1bGVbIm9uRXhpdCJdPy4oY29kZSk7CiAgICAgICAgQUJPUlQgPSB0cnVlOwogICAgICB9CiAgICAgIHF1aXRfKGNvZGUsIG5ldyBFeGl0U3RhdHVzKGNvZGUpKTsKICAgIH07CiAgICB2YXIgZXhpdEpTID0gKHN0YXR1cywgaW1wbGljaXQpID0+IHsKICAgICAgRVhJVFNUQVRVUyA9IHN0YXR1czsKICAgICAgX3Byb2NfZXhpdChzdGF0dXMpOwogICAgfTsKICAgIHZhciBfZXhpdCA9IGV4aXRKUzsKICAgIHZhciBtYXliZUV4aXQgPSAoKSA9PiB7CiAgICAgIGlmICgha2VlcFJ1bnRpbWVBbGl2ZSgpKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIF9leGl0KEVYSVRTVEFUVVMpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICB2YXIgY2FsbFVzZXJDYWxsYmFjayA9IGZ1bmMgPT4gewogICAgICBpZiAoQUJPUlQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBmdW5jKCk7CiAgICAgICAgbWF5YmVFeGl0KCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9ICgpID0+IHBlcmZvcm1hbmNlLm5vdygpOwogICAgdmFyIF9fc2V0aXRpbWVyX2pzID0gKHdoaWNoLCB0aW1lb3V0X21zKSA9PiB7CiAgICAgIGlmICh0aW1lcnNbd2hpY2hdKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyc1t3aGljaF0uaWQpOwogICAgICAgIGRlbGV0ZSB0aW1lcnNbd2hpY2hdOwogICAgICB9CiAgICAgIGlmICghdGltZW91dF9tcykgcmV0dXJuIDA7CiAgICAgIHZhciBpZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGRlbGV0ZSB0aW1lcnNbd2hpY2hdOwogICAgICAgIGNhbGxVc2VyQ2FsbGJhY2soKCkgPT4gX19lbXNjcmlwdGVuX3RpbWVvdXQod2hpY2gsIF9lbXNjcmlwdGVuX2dldF9ub3coKSkpOwogICAgICB9LCB0aW1lb3V0X21zKTsKICAgICAgdGltZXJzW3doaWNoXSA9IHsKICAgICAgICBpZCwKICAgICAgICB0aW1lb3V0X21zCiAgICAgIH07CiAgICAgIHJldHVybiAwOwogICAgfTsKICAgIGZ1bmN0aW9uIF9jb3B5X3BpeGVsc18xKGNvbXBHX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBHX3B0ciA+Pj0gMjsKICAgICAgY29uc3QgaW1hZ2VEYXRhID0gTW9kdWxlLmltYWdlRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wRyA9IEhFQVAzMi5zdWJhcnJheShjb21wR19wdHIsIGNvbXBHX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGltYWdlRGF0YS5zZXQoY29tcEcpOwogICAgfQogICAgZnVuY3Rpb24gX2NvcHlfcGl4ZWxzXzMoY29tcFJfcHRyLCBjb21wR19wdHIsIGNvbXBCX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBSX3B0ciA+Pj0gMjsKICAgICAgY29tcEdfcHRyID4+PSAyOwogICAgICBjb21wQl9wdHIgPj49IDI7CiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IE1vZHVsZS5pbWFnZURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobmJfcGl4ZWxzICogMyk7CiAgICAgIGNvbnN0IGNvbXBSID0gSEVBUDMyLnN1YmFycmF5KGNvbXBSX3B0ciwgY29tcFJfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wQiA9IEhFQVAzMi5zdWJhcnJheShjb21wQl9wdHIsIGNvbXBCX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmJfcGl4ZWxzOyBpKyspIHsKICAgICAgICBpbWFnZURhdGFbMyAqIGldID0gY29tcFJbaV07CiAgICAgICAgaW1hZ2VEYXRhWzMgKiBpICsgMV0gPSBjb21wR1tpXTsKICAgICAgICBpbWFnZURhdGFbMyAqIGkgKyAyXSA9IGNvbXBCW2ldOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfY29weV9waXhlbHNfNChjb21wUl9wdHIsIGNvbXBHX3B0ciwgY29tcEJfcHRyLCBjb21wQV9wdHIsIG5iX3BpeGVscykgewogICAgICBjb21wUl9wdHIgPj49IDI7CiAgICAgIGNvbXBHX3B0ciA+Pj0gMjsKICAgICAgY29tcEJfcHRyID4+PSAyOwogICAgICBjb21wQV9wdHIgPj49IDI7CiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IE1vZHVsZS5pbWFnZURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobmJfcGl4ZWxzICogNCk7CiAgICAgIGNvbnN0IGNvbXBSID0gSEVBUDMyLnN1YmFycmF5KGNvbXBSX3B0ciwgY29tcFJfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wQiA9IEhFQVAzMi5zdWJhcnJheShjb21wQl9wdHIsIGNvbXBCX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGNvbnN0IGNvbXBBID0gSEVBUDMyLnN1YmFycmF5KGNvbXBBX3B0ciwgY29tcEFfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYl9waXhlbHM7IGkrKykgewogICAgICAgIGltYWdlRGF0YVs0ICogaV0gPSBjb21wUltpXTsKICAgICAgICBpbWFnZURhdGFbNCAqIGkgKyAxXSA9IGNvbXBHW2ldOwogICAgICAgIGltYWdlRGF0YVs0ICogaSArIDJdID0gY29tcEJbaV07CiAgICAgICAgaW1hZ2VEYXRhWzQgKiBpICsgM10gPSBjb21wQVtpXTsKICAgICAgfQogICAgfQogICAgdmFyIGdldEhlYXBNYXggPSAoKSA9PiAyMTQ3NDgzNjQ4OwogICAgdmFyIGFsaWduTWVtb3J5ID0gKHNpemUsIGFsaWdubWVudCkgPT4gTWF0aC5jZWlsKHNpemUgLyBhbGlnbm1lbnQpICogYWxpZ25tZW50OwogICAgdmFyIGdyb3dNZW1vcnkgPSBzaXplID0+IHsKICAgICAgdmFyIGIgPSB3YXNtTWVtb3J5LmJ1ZmZlcjsKICAgICAgdmFyIHBhZ2VzID0gKHNpemUgLSBiLmJ5dGVMZW5ndGggKyA2NTUzNSkgLyA2NTUzNiB8IDA7CiAgICAgIHRyeSB7CiAgICAgICAgd2FzbU1lbW9yeS5ncm93KHBhZ2VzKTsKICAgICAgICB1cGRhdGVNZW1vcnlWaWV3cygpOwogICAgICAgIHJldHVybiAxOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfTsKICAgIHZhciBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcCA9IHJlcXVlc3RlZFNpemUgPT4gewogICAgICB2YXIgb2xkU2l6ZSA9IEhFQVBVOC5sZW5ndGg7CiAgICAgIHJlcXVlc3RlZFNpemUgPj4+PSAwOwogICAgICB2YXIgbWF4SGVhcFNpemUgPSBnZXRIZWFwTWF4KCk7CiAgICAgIGlmIChyZXF1ZXN0ZWRTaXplID4gbWF4SGVhcFNpemUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZm9yICh2YXIgY3V0RG93biA9IDE7IGN1dERvd24gPD0gNDsgY3V0RG93biAqPSAyKSB7CiAgICAgICAgdmFyIG92ZXJHcm93bkhlYXBTaXplID0gb2xkU2l6ZSAqICgxICsgLjIgLyBjdXREb3duKTsKICAgICAgICBvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2KTsKICAgICAgICB2YXIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnbk1lbW9yeShNYXRoLm1heChyZXF1ZXN0ZWRTaXplLCBvdmVyR3Jvd25IZWFwU2l6ZSksIDY1NTM2KSk7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gZ3Jvd01lbW9yeShuZXdTaXplKTsKICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgdmFyIEVOViA9IHt9OwogICAgdmFyIGdldEV4ZWN1dGFibGVOYW1lID0gKCkgPT4gdGhpc1Byb2dyYW0gfHwgIi4vdGhpcy5wcm9ncmFtIjsKICAgIHZhciBnZXRFbnZTdHJpbmdzID0gKCkgPT4gewogICAgICBpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykgewogICAgICAgIHZhciBsYW5nID0gKHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCIgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcyAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdIHx8ICJDIikucmVwbGFjZSgiLSIsICJfIikgKyAiLlVURi04IjsKICAgICAgICB2YXIgZW52ID0gewogICAgICAgICAgVVNFUjogIndlYl91c2VyIiwKICAgICAgICAgIExPR05BTUU6ICJ3ZWJfdXNlciIsCiAgICAgICAgICBQQVRIOiAiLyIsCiAgICAgICAgICBQV0Q6ICIvIiwKICAgICAgICAgIEhPTUU6ICIvaG9tZS93ZWJfdXNlciIsCiAgICAgICAgICBMQU5HOiBsYW5nLAogICAgICAgICAgXzogZ2V0RXhlY3V0YWJsZU5hbWUoKQogICAgICAgIH07CiAgICAgICAgZm9yICh2YXIgeCBpbiBFTlYpIHsKICAgICAgICAgIGlmIChFTlZbeF0gPT09IHVuZGVmaW5lZCkgZGVsZXRlIGVudlt4XTtlbHNlIGVudlt4XSA9IEVOVlt4XTsKICAgICAgICB9CiAgICAgICAgdmFyIHN0cmluZ3MgPSBbXTsKICAgICAgICBmb3IgKHZhciB4IGluIGVudikgewogICAgICAgICAgc3RyaW5ncy5wdXNoKGAke3h9PSR7ZW52W3hdfWApOwogICAgICAgIH0KICAgICAgICBnZXRFbnZTdHJpbmdzLnN0cmluZ3MgPSBzdHJpbmdzOwogICAgICB9CiAgICAgIHJldHVybiBnZXRFbnZTdHJpbmdzLnN0cmluZ3M7CiAgICB9OwogICAgdmFyIHN0cmluZ1RvQXNjaWkgPSAoc3RyLCBidWZmZXIpID0+IHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICBIRUFQOFtidWZmZXIrK10gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgfQogICAgICBIRUFQOFtidWZmZXJdID0gMDsKICAgIH07CiAgICB2YXIgX2Vudmlyb25fZ2V0ID0gKF9fZW52aXJvbiwgZW52aXJvbl9idWYpID0+IHsKICAgICAgdmFyIGJ1ZlNpemUgPSAwOwogICAgICBnZXRFbnZTdHJpbmdzKCkuZm9yRWFjaCgoc3RyaW5nLCBpKSA9PiB7CiAgICAgICAgdmFyIHB0ciA9IGVudmlyb25fYnVmICsgYnVmU2l6ZTsKICAgICAgICBIRUFQVTMyW19fZW52aXJvbiArIGkgKiA0ID4+IDJdID0gcHRyOwogICAgICAgIHN0cmluZ1RvQXNjaWkoc3RyaW5nLCBwdHIpOwogICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgIH0pOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICB2YXIgX2Vudmlyb25fc2l6ZXNfZ2V0ID0gKHBlbnZpcm9uX2NvdW50LCBwZW52aXJvbl9idWZfc2l6ZSkgPT4gewogICAgICB2YXIgc3RyaW5ncyA9IGdldEVudlN0cmluZ3MoKTsKICAgICAgSEVBUFUzMltwZW52aXJvbl9jb3VudCA+PiAyXSA9IHN0cmluZ3MubGVuZ3RoOwogICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgIHN0cmluZ3MuZm9yRWFjaChzdHJpbmcgPT4gYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMSk7CiAgICAgIEhFQVBVMzJbcGVudmlyb25fYnVmX3NpemUgPj4gMl0gPSBidWZTaXplOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICB2YXIgX2ZkX2Nsb3NlID0gZmQgPT4gNTI7CiAgICB2YXIgSU5UNTNfTUFYID0gOTAwNzE5OTI1NDc0MDk5MjsKICAgIHZhciBJTlQ1M19NSU4gPSAtOTAwNzE5OTI1NDc0MDk5MjsKICAgIHZhciBiaWdpbnRUb0k1M0NoZWNrZWQgPSBudW0gPT4gbnVtIDwgSU5UNTNfTUlOIHx8IG51bSA+IElOVDUzX01BWCA/IE5hTiA6IE51bWJlcihudW0pOwogICAgZnVuY3Rpb24gX2ZkX3NlZWsoZmQsIG9mZnNldCwgd2hlbmNlLCBuZXdPZmZzZXQpIHsKICAgICAgb2Zmc2V0ID0gYmlnaW50VG9JNTNDaGVja2VkKG9mZnNldCk7CiAgICAgIHJldHVybiA3MDsKICAgIH0KICAgIHZhciBwcmludENoYXJCdWZmZXJzID0gW251bGwsIFtdLCBbXV07CiAgICB2YXIgVVRGOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgIT0gInVuZGVmaW5lZCIgPyBuZXcgVGV4dERlY29kZXIoKSA6IHVuZGVmaW5lZDsKICAgIHZhciBVVEY4QXJyYXlUb1N0cmluZyA9IChoZWFwT3JBcnJheSwgaWR4ID0gMCwgbWF4Qnl0ZXNUb1JlYWQgPSBOYU4pID0+IHsKICAgICAgdmFyIGVuZElkeCA9IGlkeCArIG1heEJ5dGVzVG9SZWFkOwogICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICB3aGlsZSAoaGVhcE9yQXJyYXlbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKSArK2VuZFB0cjsKICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXBPckFycmF5LmJ1ZmZlciAmJiBVVEY4RGVjb2RlcikgewogICAgICAgIHJldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcE9yQXJyYXkuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgfQogICAgICB2YXIgc3RyID0gIiI7CiAgICAgIHdoaWxlIChpZHggPCBlbmRQdHIpIHsKICAgICAgICB2YXIgdTAgPSBoZWFwT3JBcnJheVtpZHgrK107CiAgICAgICAgaWYgKCEodTAgJiAxMjgpKSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdmFyIHUxID0gaGVhcE9yQXJyYXlbaWR4KytdICYgNjM7CiAgICAgICAgaWYgKCh1MCAmIDIyNCkgPT0gMTkyKSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgodTAgJiAzMSkgPDwgNiB8IHUxKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB2YXIgdTIgPSBoZWFwT3JBcnJheVtpZHgrK10gJiA2MzsKICAgICAgICBpZiAoKHUwICYgMjQwKSA9PSAyMjQpIHsKICAgICAgICAgIHUwID0gKHUwICYgMTUpIDw8IDEyIHwgdTEgPDwgNiB8IHUyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1MCA9ICh1MCAmIDcpIDw8IDE4IHwgdTEgPDwgMTIgfCB1MiA8PCA2IHwgaGVhcE9yQXJyYXlbaWR4KytdICYgNjM7CiAgICAgICAgfQogICAgICAgIGlmICh1MCA8IDY1NTM2KSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBjaCA9IHUwIC0gNjU1MzY7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NiB8IGNoID4+IDEwLCA1NjMyMCB8IGNoICYgMTAyMyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzdHI7CiAgICB9OwogICAgdmFyIHByaW50Q2hhciA9IChzdHJlYW0sIGN1cnIpID0+IHsKICAgICAgdmFyIGJ1ZmZlciA9IHByaW50Q2hhckJ1ZmZlcnNbc3RyZWFtXTsKICAgICAgaWYgKGN1cnIgPT09IDAgfHwgY3VyciA9PT0gMTApIHsKICAgICAgICAoc3RyZWFtID09PSAxID8gb3V0IDogZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIpKTsKICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZmZXIucHVzaChjdXJyKTsKICAgICAgfQogICAgfTsKICAgIHZhciBVVEY4VG9TdHJpbmcgPSAocHRyLCBtYXhCeXRlc1RvUmVhZCkgPT4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgdmFyIF9mZF93cml0ZSA9IChmZCwgaW92LCBpb3ZjbnQsIHBudW0pID0+IHsKICAgICAgdmFyIG51bSA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsKICAgICAgICB2YXIgcHRyID0gSEVBUFUzMltpb3YgPj4gMl07CiAgICAgICAgdmFyIGxlbiA9IEhFQVBVMzJbaW92ICsgNCA+PiAyXTsKICAgICAgICBpb3YgKz0gODsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgICBwcmludENoYXIoZmQsIEhFQVBVOFtwdHIgKyBqXSk7CiAgICAgICAgfQogICAgICAgIG51bSArPSBsZW47CiAgICAgIH0KICAgICAgSEVBUFUzMltwbnVtID4+IDJdID0gbnVtOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICBmdW5jdGlvbiBfZ3JheV90b19yZ2JhKGNvbXBHX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBHX3B0ciA+Pj0gMjsKICAgICAgY29uc3QgaW1hZ2VEYXRhID0gTW9kdWxlLmltYWdlRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShuYl9waXhlbHMgKiA0KTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iX3BpeGVsczsgaSsrKSB7CiAgICAgICAgaW1hZ2VEYXRhWzQgKiBpXSA9IGltYWdlRGF0YVs0ICogaSArIDFdID0gaW1hZ2VEYXRhWzQgKiBpICsgMl0gPSBjb21wR1tpXTsKICAgICAgICBpbWFnZURhdGFbNCAqIGkgKyAzXSA9IDI1NTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gX2dyYXlhX3RvX3JnYmEoY29tcEdfcHRyLCBjb21wQV9wdHIsIG5iX3BpeGVscykgewogICAgICBjb21wR19wdHIgPj49IDI7CiAgICAgIGNvbXBBX3B0ciA+Pj0gMjsKICAgICAgY29uc3QgaW1hZ2VEYXRhID0gTW9kdWxlLmltYWdlRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShuYl9waXhlbHMgKiA0KTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wQSA9IEhFQVAzMi5zdWJhcnJheShjb21wQV9wdHIsIGNvbXBBX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmJfcGl4ZWxzOyBpKyspIHsKICAgICAgICBpbWFnZURhdGFbNCAqIGldID0gaW1hZ2VEYXRhWzQgKiBpICsgMV0gPSBpbWFnZURhdGFbNCAqIGkgKyAyXSA9IGNvbXBHW2ldOwogICAgICAgIGltYWdlRGF0YVs0ICogaSArIDNdID0gY29tcEFbaV07CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIF9qc1ByaW50V2FybmluZyhtZXNzYWdlX3B0cikgewogICAgICBjb25zdCBtZXNzYWdlID0gVVRGOFRvU3RyaW5nKG1lc3NhZ2VfcHRyKTsKICAgICAgKE1vZHVsZS53YXJuIHx8IGNvbnNvbGUud2FybikoYE9wZW5KUEVHOiAke21lc3NhZ2V9YCk7CiAgICB9CiAgICBmdW5jdGlvbiBfcmdiX3RvX3JnYmEoY29tcFJfcHRyLCBjb21wR19wdHIsIGNvbXBCX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBSX3B0ciA+Pj0gMjsKICAgICAgY29tcEdfcHRyID4+PSAyOwogICAgICBjb21wQl9wdHIgPj49IDI7CiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IE1vZHVsZS5pbWFnZURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobmJfcGl4ZWxzICogNCk7CiAgICAgIGNvbnN0IGNvbXBSID0gSEVBUDMyLnN1YmFycmF5KGNvbXBSX3B0ciwgY29tcFJfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wQiA9IEhFQVAzMi5zdWJhcnJheShjb21wQl9wdHIsIGNvbXBCX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmJfcGl4ZWxzOyBpKyspIHsKICAgICAgICBpbWFnZURhdGFbNCAqIGldID0gY29tcFJbaV07CiAgICAgICAgaW1hZ2VEYXRhWzQgKiBpICsgMV0gPSBjb21wR1tpXTsKICAgICAgICBpbWFnZURhdGFbNCAqIGkgKyAyXSA9IGNvbXBCW2ldOwogICAgICAgIGltYWdlRGF0YVs0ICogaSArIDNdID0gMjU1OwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfc3RvcmVFcnJvck1lc3NhZ2UobWVzc2FnZV9wdHIpIHsKICAgICAgY29uc3QgbWVzc2FnZSA9IFVURjhUb1N0cmluZyhtZXNzYWdlX3B0cik7CiAgICAgIGlmICghTW9kdWxlLmVycm9yTWVzc2FnZXMpIHsKICAgICAgICBNb2R1bGUuZXJyb3JNZXNzYWdlcyA9IG1lc3NhZ2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgTW9kdWxlLmVycm9yTWVzc2FnZXMgKz0gIlxuIiArIG1lc3NhZ2U7CiAgICAgIH0KICAgIH0KICAgIHZhciB3YXNtSW1wb3J0cyA9IHsKICAgICAgbDogX19hYm9ydF9qcywKICAgICAgazogX19lbXNjcmlwdGVuX3J1bnRpbWVfa2VlcGFsaXZlX2NsZWFyLAogICAgICBtOiBfX3NldGl0aW1lcl9qcywKICAgICAgZzogX2NvcHlfcGl4ZWxzXzEsCiAgICAgIGY6IF9jb3B5X3BpeGVsc18zLAogICAgICBlOiBfY29weV9waXhlbHNfNCwKICAgICAgbjogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsCiAgICAgIHA6IF9lbnZpcm9uX2dldCwKICAgICAgcTogX2Vudmlyb25fc2l6ZXNfZ2V0LAogICAgICBiOiBfZmRfY2xvc2UsCiAgICAgIG86IF9mZF9zZWVrLAogICAgICBjOiBfZmRfd3JpdGUsCiAgICAgIHI6IF9ncmF5X3RvX3JnYmEsCiAgICAgIGk6IF9ncmF5YV90b19yZ2JhLAogICAgICBkOiBfanNQcmludFdhcm5pbmcsCiAgICAgIGo6IF9wcm9jX2V4aXQsCiAgICAgIGg6IF9yZ2JfdG9fcmdiYSwKICAgICAgYTogX3N0b3JlRXJyb3JNZXNzYWdlCiAgICB9OwogICAgdmFyIHdhc21FeHBvcnRzID0gYXdhaXQgY3JlYXRlV2FzbSgpOwogICAgdmFyIF9fX3dhc21fY2FsbF9jdG9ycyA9IHdhc21FeHBvcnRzWyJ0Il07CiAgICB2YXIgX21hbGxvYyA9IE1vZHVsZVsiX21hbGxvYyJdID0gd2FzbUV4cG9ydHNbInUiXTsKICAgIHZhciBfZnJlZSA9IE1vZHVsZVsiX2ZyZWUiXSA9IHdhc21FeHBvcnRzWyJ2Il07CiAgICB2YXIgX2pwMl9kZWNvZGUgPSBNb2R1bGVbIl9qcDJfZGVjb2RlIl0gPSB3YXNtRXhwb3J0c1sieCJdOwogICAgdmFyIF9fZW1zY3JpcHRlbl90aW1lb3V0ID0gd2FzbUV4cG9ydHNbInkiXTsKICAgIGZ1bmN0aW9uIHJ1bigpIHsKICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBydW47CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHByZVJ1bigpOwogICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bjsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZG9SdW4oKSB7CiAgICAgICAgTW9kdWxlWyJjYWxsZWRSdW4iXSA9IHRydWU7CiAgICAgICAgaWYgKEFCT1JUKSByZXR1cm47CiAgICAgICAgaW5pdFJ1bnRpbWUoKTsKICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7CiAgICAgICAgTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdPy4oKTsKICAgICAgICBwb3N0UnVuKCk7CiAgICAgIH0KICAgICAgaWYgKE1vZHVsZVsic2V0U3RhdHVzIl0pIHsKICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCJSdW5uaW5nLi4uIik7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IE1vZHVsZVsic2V0U3RhdHVzIl0oIiIpLCAxKTsKICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgfSwgMSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG9SdW4oKTsKICAgICAgfQogICAgfQogICAgaWYgKE1vZHVsZVsicHJlSW5pdCJdKSB7CiAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il0gPT0gImZ1bmN0aW9uIikgTW9kdWxlWyJwcmVJbml0Il0gPSBbTW9kdWxlWyJwcmVJbml0Il1dOwogICAgICB3aGlsZSAoTW9kdWxlWyJwcmVJbml0Il0ubGVuZ3RoID4gMCkgewogICAgICAgIE1vZHVsZVsicHJlSW5pdCJdLnBvcCgpKCk7CiAgICAgIH0KICAgIH0KICAgIHJ1bigpOwogICAgbW9kdWxlUnRuID0gcmVhZHlQcm9taXNlOwogICAgcmV0dXJuIG1vZHVsZVJ0bjsKICB9Owp9KSgpOwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIGNvbnN0IG9wZW5qcGVnID0gKE9wZW5KUEVHKTsKOy8vIC4vc3JjL2NvcmUvanB4LmpzCgoKCgpjbGFzcyBKcHhFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiSnB4RXJyb3IiKTsKICB9Cn0KY2xhc3MgSnB4SW1hZ2UgewogIHN0YXRpYyAjYnVmZmVyID0gbnVsbDsKICBzdGF0aWMgI2hhbmRsZXIgPSBudWxsOwogIHN0YXRpYyAjbW9kdWxlUHJvbWlzZSA9IG51bGw7CiAgc3RhdGljICN1c2VXYXNtID0gdHJ1ZTsKICBzdGF0aWMgI3VzZVdvcmtlckZldGNoID0gdHJ1ZTsKICBzdGF0aWMgI3dhc21VcmwgPSBudWxsOwogIHN0YXRpYyBzZXRPcHRpb25zKHsKICAgIGhhbmRsZXIsCiAgICB1c2VXYXNtLAogICAgdXNlV29ya2VyRmV0Y2gsCiAgICB3YXNtVXJsCiAgfSkgewogICAgdGhpcy4jdXNlV2FzbSA9IHVzZVdhc207CiAgICB0aGlzLiN1c2VXb3JrZXJGZXRjaCA9IHVzZVdvcmtlckZldGNoOwogICAgdGhpcy4jd2FzbVVybCA9IHdhc21Vcmw7CiAgICBpZiAoIXVzZVdvcmtlckZldGNoKSB7CiAgICAgIHRoaXMuI2hhbmRsZXIgPSBoYW5kbGVyOwogICAgfQogIH0KICBzdGF0aWMgYXN5bmMgI2dldEpzTW9kdWxlKGZhbGxiYWNrQ2FsbGJhY2spIHsKICAgIGNvbnN0IHBhdGggPSBgJHt0aGlzLiN3YXNtVXJsfW9wZW5qcGVnX25vd2FzbV9mYWxsYmFjay5qc2A7CiAgICBsZXQgaW5zdGFuY2UgPSBudWxsOwogICAgdHJ5IHsKICAgICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KAogICAgICAvKndlYnBhY2tJZ25vcmU6IHRydWUqLwogICAgICAvKkB2aXRlLWlnbm9yZSovCiAgICAgIHBhdGgpOwogICAgICBpbnN0YW5jZSA9IG1vZC5kZWZhdWx0KCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHdhcm4oYEpweEltYWdlI2dldEpzTW9kdWxlOiAke2V9YCk7CiAgICB9CiAgICBmYWxsYmFja0NhbGxiYWNrKGluc3RhbmNlKTsKICB9CiAgc3RhdGljIGFzeW5jICNpbnN0YW50aWF0ZVdhc20oZmFsbGJhY2tDYWxsYmFjaywgaW1wb3J0cywgc3VjY2Vzc0NhbGxiYWNrKSB7CiAgICBjb25zdCBmaWxlbmFtZSA9ICJvcGVuanBlZy53YXNtIjsKICAgIHRyeSB7CiAgICAgIGlmICghdGhpcy4jYnVmZmVyKSB7CiAgICAgICAgaWYgKHRoaXMuI3VzZVdvcmtlckZldGNoKSB7CiAgICAgICAgICB0aGlzLiNidWZmZXIgPSBhd2FpdCBmZXRjaEJpbmFyeURhdGEoYCR7dGhpcy4jd2FzbVVybH0ke2ZpbGVuYW1lfWApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLiNidWZmZXIgPSBhd2FpdCB0aGlzLiNoYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiRmV0Y2hCaW5hcnlEYXRhIiwgewogICAgICAgICAgICB0eXBlOiAid2FzbUZhY3RvcnkiLAogICAgICAgICAgICBmaWxlbmFtZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh0aGlzLiNidWZmZXIsIGltcG9ydHMpOwogICAgICByZXR1cm4gc3VjY2Vzc0NhbGxiYWNrKHJlc3VsdHMuaW5zdGFuY2UpOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHdhcm4oYEpweEltYWdlI2luc3RhbnRpYXRlV2FzbTogJHtyZWFzb259YCk7CiAgICAgIHRoaXMuI2dldEpzTW9kdWxlKGZhbGxiYWNrQ2FsbGJhY2spOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZmluYWxseSB7CiAgICAgIHRoaXMuI2hhbmRsZXIgPSBudWxsOwogICAgfQogIH0KICBzdGF0aWMgYXN5bmMgZGVjb2RlKGJ5dGVzLCB7CiAgICBudW1Db21wb25lbnRzID0gNCwKICAgIGlzSW5kZXhlZENvbG9ybWFwID0gZmFsc2UsCiAgICBzbWFza0luRGF0YSA9IGZhbHNlCiAgfSA9IHt9KSB7CiAgICBpZiAoIXRoaXMuI21vZHVsZVByb21pc2UpIHsKICAgICAgY29uc3QgewogICAgICAgIHByb21pc2UsCiAgICAgICAgcmVzb2x2ZQogICAgICB9ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgICAgIGNvbnN0IHByb21pc2VzID0gW3Byb21pc2VdOwogICAgICBpZiAoIXRoaXMuI3VzZVdhc20pIHsKICAgICAgICB0aGlzLiNnZXRKc01vZHVsZShyZXNvbHZlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwcm9taXNlcy5wdXNoKG9wZW5qcGVnKHsKICAgICAgICAgIHdhcm46IHdhcm4sCiAgICAgICAgICBpbnN0YW50aWF0ZVdhc206IHRoaXMuI2luc3RhbnRpYXRlV2FzbS5iaW5kKHRoaXMsIHJlc29sdmUpCiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIHRoaXMuI21vZHVsZVByb21pc2UgPSBQcm9taXNlLnJhY2UocHJvbWlzZXMpOwogICAgfQogICAgY29uc3QgbW9kdWxlID0gYXdhaXQgdGhpcy4jbW9kdWxlUHJvbWlzZTsKICAgIGlmICghbW9kdWxlKSB7CiAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiT3BlbkpQRUcgZmFpbGVkIHRvIGluaXRpYWxpemUiKTsKICAgIH0KICAgIGxldCBwdHI7CiAgICB0cnkgewogICAgICBjb25zdCBzaXplID0gYnl0ZXMubGVuZ3RoOwogICAgICBwdHIgPSBtb2R1bGUuX21hbGxvYyhzaXplKTsKICAgICAgbW9kdWxlLkhFQVBVOC5zZXQoYnl0ZXMsIHB0cik7CiAgICAgIGNvbnN0IHJldCA9IG1vZHVsZS5fanAyX2RlY29kZShwdHIsIHNpemUsIG51bUNvbXBvbmVudHMgPiAwID8gbnVtQ29tcG9uZW50cyA6IDAsICEhaXNJbmRleGVkQ29sb3JtYXAsICEhc21hc2tJbkRhdGEpOwogICAgICBpZiAocmV0KSB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgZXJyb3JNZXNzYWdlcwogICAgICAgIH0gPSBtb2R1bGU7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZXMpIHsKICAgICAgICAgIGRlbGV0ZSBtb2R1bGUuZXJyb3JNZXNzYWdlczsKICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcihlcnJvck1lc3NhZ2VzKTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJVbmtub3duIGVycm9yIik7CiAgICAgIH0KICAgICAgY29uc3QgewogICAgICAgIGltYWdlRGF0YQogICAgICB9ID0gbW9kdWxlOwogICAgICBtb2R1bGUuaW1hZ2VEYXRhID0gbnVsbDsKICAgICAgcmV0dXJuIGltYWdlRGF0YTsKICAgIH0gZmluYWxseSB7CiAgICAgIGlmIChwdHIpIHsKICAgICAgICBtb2R1bGUuX2ZyZWUocHRyKTsKICAgICAgfQogICAgfQogIH0KICBzdGF0aWMgY2xlYW51cCgpIHsKICAgIHRoaXMuI21vZHVsZVByb21pc2UgPSBudWxsOwogIH0KICBzdGF0aWMgcGFyc2VJbWFnZVByb3BlcnRpZXMoc3RyZWFtKSB7CiAgICBsZXQgbmV3Qnl0ZSA9IHN0cmVhbS5nZXRCeXRlKCk7CiAgICB3aGlsZSAobmV3Qnl0ZSA+PSAwKSB7CiAgICAgIGNvbnN0IG9sZEJ5dGUgPSBuZXdCeXRlOwogICAgICBuZXdCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgY29uc3QgY29kZSA9IG9sZEJ5dGUgPDwgOCB8IG5ld0J5dGU7CiAgICAgIGlmIChjb2RlID09PSAweGZmNTEpIHsKICAgICAgICBzdHJlYW0uc2tpcCg0KTsKICAgICAgICBjb25zdCBYc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgY29uc3QgWXNpeiA9IHN0cmVhbS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgIGNvbnN0IFhPc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgY29uc3QgWU9zaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICBzdHJlYW0uc2tpcCgxNik7CiAgICAgICAgY29uc3QgQ3NpeiA9IHN0cmVhbS5nZXRVaW50MTYoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgd2lkdGg6IFhzaXogLSBYT3NpeiwKICAgICAgICAgIGhlaWdodDogWXNpeiAtIFlPc2l6LAogICAgICAgICAgYml0c1BlckNvbXBvbmVudDogOCwKICAgICAgICAgIGNvbXBvbmVudHNDb3VudDogQ3NpegogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBKcHhFcnJvcigiTm8gc2l6ZSBtYXJrZXIgZm91bmQgaW4gSlBYIHN0cmVhbSIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvYmluYXJ5X2NtYXAuanMKCmZ1bmN0aW9uIGhleFRvSW50KGEsIHNpemUpIHsKICBsZXQgbiA9IDA7CiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gc2l6ZTsgaSsrKSB7CiAgICBuID0gbiA8PCA4IHwgYVtpXTsKICB9CiAgcmV0dXJuIG4gPj4+IDA7Cn0KZnVuY3Rpb24gaGV4VG9TdHIoYSwgc2l6ZSkgewogIGlmIChzaXplID09PSAxKSB7CiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhWzBdLCBhWzFdKTsKICB9CiAgaWYgKHNpemUgPT09IDMpIHsKICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pOwogIH0KICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5hLnN1YmFycmF5KDAsIHNpemUgKyAxKSk7Cn0KZnVuY3Rpb24gYWRkSGV4KGEsIGIsIHNpemUpIHsKICBsZXQgYyA9IDA7CiAgZm9yIChsZXQgaSA9IHNpemU7IGkgPj0gMDsgaS0tKSB7CiAgICBjICs9IGFbaV0gKyBiW2ldOwogICAgYVtpXSA9IGMgJiAyNTU7CiAgICBjID4+PSA4OwogIH0KfQpmdW5jdGlvbiBpbmNIZXgoYSwgc2l6ZSkgewogIGxldCBjID0gMTsKICBmb3IgKGxldCBpID0gc2l6ZTsgaSA+PSAwICYmIGMgPiAwOyBpLS0pIHsKICAgIGMgKz0gYVtpXTsKICAgIGFbaV0gPSBjICYgMjU1OwogICAgYyA+Pj0gODsKICB9Cn0KY29uc3QgTUFYX05VTV9TSVpFID0gMTY7CmNvbnN0IE1BWF9FTkNPREVEX05VTV9TSVpFID0gMTk7CmNsYXNzIEJpbmFyeUNNYXBTdHJlYW0gewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIHRoaXMuYnVmZmVyID0gZGF0YTsKICAgIHRoaXMucG9zID0gMDsKICAgIHRoaXMuZW5kID0gZGF0YS5sZW5ndGg7CiAgICB0aGlzLnRtcEJ1ZiA9IG5ldyBVaW50OEFycmF5KE1BWF9FTkNPREVEX05VTV9TSVpFKTsKICB9CiAgcmVhZEJ5dGUoKSB7CiAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5lbmQpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zKytdOwogIH0KICByZWFkTnVtYmVyKCkgewogICAgbGV0IG4gPSAwOwogICAgbGV0IGxhc3Q7CiAgICBkbyB7CiAgICAgIGNvbnN0IGIgPSB0aGlzLnJlYWRCeXRlKCk7CiAgICAgIGlmIChiIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTsKICAgICAgfQogICAgICBsYXN0ID0gIShiICYgMHg4MCk7CiAgICAgIG4gPSBuIDw8IDcgfCBiICYgMHg3ZjsKICAgIH0gd2hpbGUgKCFsYXN0KTsKICAgIHJldHVybiBuOwogIH0KICByZWFkU2lnbmVkKCkgewogICAgY29uc3QgbiA9IHRoaXMucmVhZE51bWJlcigpOwogICAgcmV0dXJuIG4gJiAxID8gfihuID4+PiAxKSA6IG4gPj4+IDE7CiAgfQogIHJlYWRIZXgobnVtLCBzaXplKSB7CiAgICBudW0uc2V0KHRoaXMuYnVmZmVyLnN1YmFycmF5KHRoaXMucG9zLCB0aGlzLnBvcyArIHNpemUgKyAxKSk7CiAgICB0aGlzLnBvcyArPSBzaXplICsgMTsKICB9CiAgcmVhZEhleE51bWJlcihudW0sIHNpemUpIHsKICAgIGxldCBsYXN0OwogICAgY29uc3Qgc3RhY2sgPSB0aGlzLnRtcEJ1ZjsKICAgIGxldCBzcCA9IDA7CiAgICBkbyB7CiAgICAgIGNvbnN0IGIgPSB0aGlzLnJlYWRCeXRlKCk7CiAgICAgIGlmIChiIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTsKICAgICAgfQogICAgICBsYXN0ID0gIShiICYgMHg4MCk7CiAgICAgIHN0YWNrW3NwKytdID0gYiAmIDB4N2Y7CiAgICB9IHdoaWxlICghbGFzdCk7CiAgICBsZXQgaSA9IHNpemUsCiAgICAgIGJ1ZmZlciA9IDAsCiAgICAgIGJ1ZmZlclNpemUgPSAwOwogICAgd2hpbGUgKGkgPj0gMCkgewogICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IDggJiYgc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgIGJ1ZmZlciB8PSBzdGFja1stLXNwXSA8PCBidWZmZXJTaXplOwogICAgICAgIGJ1ZmZlclNpemUgKz0gNzsKICAgICAgfQogICAgICBudW1baV0gPSBidWZmZXIgJiAyNTU7CiAgICAgIGktLTsKICAgICAgYnVmZmVyID4+PSA4OwogICAgICBidWZmZXJTaXplIC09IDg7CiAgICB9CiAgfQogIHJlYWRIZXhTaWduZWQobnVtLCBzaXplKSB7CiAgICB0aGlzLnJlYWRIZXhOdW1iZXIobnVtLCBzaXplKTsKICAgIGNvbnN0IHNpZ24gPSBudW1bc2l6ZV0gJiAxID8gMjU1IDogMDsKICAgIGxldCBjID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHNpemU7IGkrKykgewogICAgICBjID0gKGMgJiAxKSA8PCA4IHwgbnVtW2ldOwogICAgICBudW1baV0gPSBjID4+IDEgXiBzaWduOwogICAgfQogIH0KICByZWFkU3RyaW5nKCkgewogICAgY29uc3QgbGVuID0gdGhpcy5yZWFkTnVtYmVyKCksCiAgICAgIGJ1ZiA9IG5ldyBBcnJheShsZW4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBidWZbaV0gPSB0aGlzLnJlYWROdW1iZXIoKTsKICAgIH0KICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7CiAgfQp9CmNsYXNzIEJpbmFyeUNNYXBSZWFkZXIgewogIGFzeW5jIHByb2Nlc3MoZGF0YSwgY01hcCwgZXh0ZW5kKSB7CiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5Q01hcFN0cmVhbShkYXRhKTsKICAgIGNvbnN0IGhlYWRlciA9IHN0cmVhbS5yZWFkQnl0ZSgpOwogICAgY01hcC52ZXJ0aWNhbCA9ICEhKGhlYWRlciAmIDEpOwogICAgbGV0IHVzZUNNYXAgPSBudWxsOwogICAgY29uc3Qgc3RhcnQgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgZW5kID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKICAgIGNvbnN0IGNoYXIgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgY2hhckNvZGUgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgdG1wID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKICAgIGxldCBjb2RlOwogICAgbGV0IGI7CiAgICB3aGlsZSAoKGIgPSBzdHJlYW0ucmVhZEJ5dGUoKSkgPj0gMCkgewogICAgICBjb25zdCB0eXBlID0gYiA+PiA1OwogICAgICBpZiAodHlwZSA9PT0gNykgewogICAgICAgIHN3aXRjaCAoYiAmIDB4MWYpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgc3RyZWFtLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHVzZUNNYXAgPSBzdHJlYW0ucmVhZFN0cmluZygpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3Qgc2VxdWVuY2UgPSAhIShiICYgMHgxMCk7CiAgICAgIGNvbnN0IGRhdGFTaXplID0gYiAmIDE1OwogICAgICBpZiAoZGF0YVNpemUgKyAxID4gTUFYX05VTV9TSVpFKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCaW5hcnlDTWFwUmVhZGVyLnByb2Nlc3M6IEludmFsaWQgZGF0YVNpemUuIik7CiAgICAgIH0KICAgICAgY29uc3QgdWNzMkRhdGFTaXplID0gMTsKICAgICAgY29uc3Qgc3ViaXRlbXNDb3VudCA9IHN0cmVhbS5yZWFkTnVtYmVyKCk7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBjTWFwLmFkZENvZGVzcGFjZVJhbmdlKGRhdGFTaXplICsgMSwgaGV4VG9JbnQoc3RhcnQsIGRhdGFTaXplKSwgaGV4VG9JbnQoZW5kLCBkYXRhU2l6ZSkpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShkYXRhU2l6ZSArIDEsIGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgICAgc3RyZWFtLnJlYWROdW1iZXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXIsIGRhdGFTaXplKTsKICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgZGF0YVNpemUpLCBjb2RlKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGluY0hleChjaGFyLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcih0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoY2hhciwgdG1wLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29kZSA9IHN0cmVhbS5yZWFkU2lnbmVkKCkgKyAoY29kZSArIDEpOwogICAgICAgICAgICBjTWFwLm1hcE9uZShoZXhUb0ludChjaGFyLCBkYXRhU2l6ZSksIGNvZGUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgc3RyZWFtLnJlYWRIZXgoc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgY01hcC5tYXBDaWRSYW5nZShoZXhUb0ludChzdGFydCwgZGF0YVNpemUpLCBoZXhUb0ludChlbmQsIGRhdGFTaXplKSwgY29kZSk7CiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgewogICAgICAgICAgICBpbmNIZXgoZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICAgIGFkZEhleChzdGFydCwgZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3RhcnQuc2V0KGVuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgICBjTWFwLm1hcENpZFJhbmdlKGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpLCBjb2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXIsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgewogICAgICAgICAgICBpbmNIZXgoY2hhciwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgaWYgKCFzZXF1ZW5jZSkgewogICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKHRtcCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoY2hhciwgdG1wLCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluY0hleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleFNpZ25lZCh0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGNoYXJDb2RlLCB0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICBzdHJlYW0ucmVhZEhleChzdGFydCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgc3RyZWFtLnJlYWRIZXgoY2hhckNvZGUsIGRhdGFTaXplKTsKICAgICAgICAgIGNNYXAubWFwQmZSYW5nZShoZXhUb0ludChzdGFydCwgdWNzMkRhdGFTaXplKSwgaGV4VG9JbnQoZW5kLCB1Y3MyRGF0YVNpemUpLCBoZXhUb1N0cihjaGFyQ29kZSwgZGF0YVNpemUpKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGluY0hleChlbmQsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzdGFydC5zZXQoZW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgICBjTWFwLm1hcEJmUmFuZ2UoaGV4VG9JbnQoc3RhcnQsIHVjczJEYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCaW5hcnlDTWFwUmVhZGVyLnByb2Nlc3MgLSB1bmtub3duIHR5cGU6ICR7dHlwZX1gKTsKICAgICAgfQogICAgfQogICAgaWYgKHVzZUNNYXApIHsKICAgICAgcmV0dXJuIGV4dGVuZCh1c2VDTWFwKTsKICAgIH0KICAgIHJldHVybiBjTWFwOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvYXNjaWlfODVfc3RyZWFtLmpzCgoKY2xhc3MgQXNjaWk4NVN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCkgewogICAgaWYgKG1heWJlTGVuZ3RoKSB7CiAgICAgIG1heWJlTGVuZ3RoICo9IDAuODsKICAgIH0KICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgICB0aGlzLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoNSk7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGNvbnN0IFRJTERBX0NIQVIgPSAweDdlOwogICAgY29uc3QgWl9MT1dFUl9DSEFSID0gMHg3YTsKICAgIGNvbnN0IEVPRiA9IC0xOwogICAgY29uc3Qgc3RyID0gdGhpcy5zdHI7CiAgICBsZXQgYyA9IHN0ci5nZXRCeXRlKCk7CiAgICB3aGlsZSAoaXNXaGl0ZVNwYWNlKGMpKSB7CiAgICAgIGMgPSBzdHIuZ2V0Qnl0ZSgpOwogICAgfQogICAgaWYgKGMgPT09IEVPRiB8fCBjID09PSBUSUxEQV9DSEFSKSB7CiAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICBsZXQgYnVmZmVyLCBpOwogICAgaWYgKGMgPT09IFpfTE9XRVJfQ0hBUikgewogICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyA0KTsKICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGggKyBpXSA9IDA7CiAgICAgIH0KICAgICAgdGhpcy5idWZmZXJMZW5ndGggKz0gNDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dDsKICAgICAgaW5wdXRbMF0gPSBjOwogICAgICBmb3IgKGkgPSAxOyBpIDwgNTsgKytpKSB7CiAgICAgICAgYyA9IHN0ci5nZXRCeXRlKCk7CiAgICAgICAgd2hpbGUgKGlzV2hpdGVTcGFjZShjKSkgewogICAgICAgICAgYyA9IHN0ci5nZXRCeXRlKCk7CiAgICAgICAgfQogICAgICAgIGlucHV0W2ldID0gYzsKICAgICAgICBpZiAoYyA9PT0gRU9GIHx8IGMgPT09IFRJTERBX0NIQVIpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBpIC0gMSk7CiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IGkgLSAxOwogICAgICBpZiAoaSA8IDUpIHsKICAgICAgICBmb3IgKDsgaSA8IDU7ICsraSkgewogICAgICAgICAgaW5wdXRbaV0gPSAweDIxICsgODQ7CiAgICAgICAgfQogICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgdCA9IDA7CiAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKICAgICAgICB0ID0gdCAqIDg1ICsgKGlucHV0W2ldIC0gMHgyMSk7CiAgICAgIH0KICAgICAgZm9yIChpID0gMzsgaSA+PSAwOyAtLWkpIHsKICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoICsgaV0gPSB0ICYgMHhmZjsKICAgICAgICB0ID4+PSA4OwogICAgICB9CiAgICB9CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9hc2NpaV9oZXhfc3RyZWFtLmpzCgpjbGFzcyBBc2NpaUhleFN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCkgewogICAgaWYgKG1heWJlTGVuZ3RoKSB7CiAgICAgIG1heWJlTGVuZ3RoICo9IDAuNTsKICAgIH0KICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgICB0aGlzLmZpcnN0RGlnaXQgPSAtMTsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgY29uc3QgVVBTVFJFQU1fQkxPQ0tfU0laRSA9IDgwMDA7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKFVQU1RSRUFNX0JMT0NLX1NJWkUpOwogICAgaWYgKCFieXRlcy5sZW5ndGgpIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBtYXhEZWNvZGVMZW5ndGggPSBieXRlcy5sZW5ndGggKyAxID4+IDE7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIG1heERlY29kZUxlbmd0aCk7CiAgICBsZXQgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICBsZXQgZmlyc3REaWdpdCA9IHRoaXMuZmlyc3REaWdpdDsKICAgIGZvciAoY29uc3QgY2ggb2YgYnl0ZXMpIHsKICAgICAgbGV0IGRpZ2l0OwogICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5KSB7CiAgICAgICAgZGlnaXQgPSBjaCAmIDB4MGY7CiAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHg0MSAmJiBjaCA8PSAweDQ2IHx8IGNoID49IDB4NjEgJiYgY2ggPD0gMHg2NikgewogICAgICAgIGRpZ2l0ID0gKGNoICYgMHgwZikgKyA5OwogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDNlKSB7CiAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChmaXJzdERpZ2l0IDwgMCkgewogICAgICAgIGZpcnN0RGlnaXQgPSBkaWdpdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gZmlyc3REaWdpdCA8PCA0IHwgZGlnaXQ7CiAgICAgICAgZmlyc3REaWdpdCA9IC0xOwogICAgICB9CiAgICB9CiAgICBpZiAoZmlyc3REaWdpdCA+PSAwICYmIHRoaXMuZW9mKSB7CiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSBmaXJzdERpZ2l0IDw8IDQ7CiAgICAgIGZpcnN0RGlnaXQgPSAtMTsKICAgIH0KICAgIHRoaXMuZmlyc3REaWdpdCA9IGZpcnN0RGlnaXQ7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NjaXR0LmpzCgpjb25zdCBjY2l0dEVPTCA9IC0yOwpjb25zdCBjY2l0dEVPRiA9IC0xOwpjb25zdCB0d29EaW1QYXNzID0gMDsKY29uc3QgdHdvRGltSG9yaXogPSAxOwpjb25zdCB0d29EaW1WZXJ0MCA9IDI7CmNvbnN0IHR3b0RpbVZlcnRSMSA9IDM7CmNvbnN0IHR3b0RpbVZlcnRMMSA9IDQ7CmNvbnN0IHR3b0RpbVZlcnRSMiA9IDU7CmNvbnN0IHR3b0RpbVZlcnRMMiA9IDY7CmNvbnN0IHR3b0RpbVZlcnRSMyA9IDc7CmNvbnN0IHR3b0RpbVZlcnRMMyA9IDg7CmNvbnN0IHR3b0RpbVRhYmxlID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWzcsIHR3b0RpbVZlcnRMM10sIFs3LCB0d29EaW1WZXJ0UjNdLCBbNiwgdHdvRGltVmVydEwyXSwgWzYsIHR3b0RpbVZlcnRMMl0sIFs2LCB0d29EaW1WZXJ0UjJdLCBbNiwgdHdvRGltVmVydFIyXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXV07CmNvbnN0IHdoaXRlVGFibGUxID0gW1stMSwgLTFdLCBbMTIsIGNjaXR0RU9MXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTIsIDE5ODRdLCBbMTIsIDIwNDhdLCBbMTIsIDIxMTJdLCBbMTIsIDIxNzZdLCBbMTIsIDIyNDBdLCBbMTIsIDIzMDRdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTIsIDIzNjhdLCBbMTIsIDI0MzJdLCBbMTIsIDI0OTZdLCBbMTIsIDI1NjBdXTsKY29uc3Qgd2hpdGVUYWJsZTIgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFs4LCAyOV0sIFs4LCAyOV0sIFs4LCAzMF0sIFs4LCAzMF0sIFs4LCA0NV0sIFs4LCA0NV0sIFs4LCA0Nl0sIFs4LCA0Nl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyM10sIFs3LCAyM10sIFs3LCAyM10sIFs3LCAyM10sIFs4LCA0N10sIFs4LCA0N10sIFs4LCA0OF0sIFs4LCA0OF0sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sIFs4LCAzM10sIFs4LCAzM10sIFs4LCAzNF0sIFs4LCAzNF0sIFs4LCAzNV0sIFs4LCAzNV0sIFs4LCAzNl0sIFs4LCAzNl0sIFs4LCAzN10sIFs4LCAzN10sIFs4LCAzOF0sIFs4LCAzOF0sIFs3LCAxOV0sIFs3LCAxOV0sIFs3LCAxOV0sIFs3LCAxOV0sIFs4LCAzMV0sIFs4LCAzMV0sIFs4LCAzMl0sIFs4LCAzMl0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbOCwgNTNdLCBbOCwgNTNdLCBbOCwgNTRdLCBbOCwgNTRdLCBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCBbOCwgMzldLCBbOCwgMzldLCBbOCwgNDBdLCBbOCwgNDBdLCBbOCwgNDFdLCBbOCwgNDFdLCBbOCwgNDJdLCBbOCwgNDJdLCBbOCwgNDNdLCBbOCwgNDNdLCBbOCwgNDRdLCBbOCwgNDRdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjhdLCBbNywgMjhdLCBbNywgMjhdLCBbNywgMjhdLCBbOCwgNjFdLCBbOCwgNjFdLCBbOCwgNjJdLCBbOCwgNjJdLCBbOCwgNjNdLCBbOCwgNjNdLCBbOCwgMF0sIFs4LCAwXSwgWzgsIDMyMF0sIFs4LCAzMjBdLCBbOCwgMzg0XSwgWzgsIDM4NF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs3LCAyN10sIFs3LCAyN10sIFs3LCAyN10sIFs3LCAyN10sIFs4LCA1OV0sIFs4LCA1OV0sIFs4LCA2MF0sIFs4LCA2MF0sIFs5LCAxNDcyXSwgWzksIDE1MzZdLCBbOSwgMTYwMF0sIFs5LCAxNzI4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzgsIDQ5XSwgWzgsIDQ5XSwgWzgsIDUwXSwgWzgsIDUwXSwgWzgsIDUxXSwgWzgsIDUxXSwgWzgsIDUyXSwgWzgsIDUyXSwgWzcsIDI1XSwgWzcsIDI1XSwgWzcsIDI1XSwgWzcsIDI1XSwgWzgsIDU1XSwgWzgsIDU1XSwgWzgsIDU2XSwgWzgsIDU2XSwgWzgsIDU3XSwgWzgsIDU3XSwgWzgsIDU4XSwgWzgsIDU4XSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzgsIDQ0OF0sIFs4LCA0NDhdLCBbOCwgNTEyXSwgWzgsIDUxMl0sIFs5LCA3MDRdLCBbOSwgNzY4XSwgWzgsIDY0MF0sIFs4LCA2NDBdLCBbOCwgNTc2XSwgWzgsIDU3Nl0sIFs5LCA4MzJdLCBbOSwgODk2XSwgWzksIDk2MF0sIFs5LCAxMDI0XSwgWzksIDEwODhdLCBbOSwgMTE1Ml0sIFs5LCAxMjE2XSwgWzksIDEyODBdLCBbOSwgMTM0NF0sIFs5LCAxNDA4XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCBbNywgMjU2XSwgWzcsIDI1Nl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XV07CmNvbnN0IGJsYWNrVGFibGUxID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWzEyLCBjY2l0dEVPTF0sIFsxMiwgY2NpdHRFT0xdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzEyLCAxOTg0XSwgWzEyLCAxOTg0XSwgWzEyLCAyMDQ4XSwgWzEyLCAyMDQ4XSwgWzEyLCAyMTEyXSwgWzEyLCAyMTEyXSwgWzEyLCAyMTc2XSwgWzEyLCAyMTc2XSwgWzEyLCAyMjQwXSwgWzEyLCAyMjQwXSwgWzEyLCAyMzA0XSwgWzEyLCAyMzA0XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzEyLCAyMzY4XSwgWzEyLCAyMzY4XSwgWzEyLCAyNDMyXSwgWzEyLCAyNDMyXSwgWzEyLCAyNDk2XSwgWzEyLCAyNDk2XSwgWzEyLCAyNTYwXSwgWzEyLCAyNTYwXSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTIsIDUyXSwgWzEyLCA1Ml0sIFsxMywgNjQwXSwgWzEzLCA3MDRdLCBbMTMsIDc2OF0sIFsxMywgODMyXSwgWzEyLCA1NV0sIFsxMiwgNTVdLCBbMTIsIDU2XSwgWzEyLCA1Nl0sIFsxMywgMTI4MF0sIFsxMywgMTM0NF0sIFsxMywgMTQwOF0sIFsxMywgMTQ3Ml0sIFsxMiwgNTldLCBbMTIsIDU5XSwgWzEyLCA2MF0sIFsxMiwgNjBdLCBbMTMsIDE1MzZdLCBbMTMsIDE2MDBdLCBbMTEsIDI0XSwgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgWzExLCAyNV0sIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzExLCAyNV0sIFsxMywgMTY2NF0sIFsxMywgMTcyOF0sIFsxMiwgMzIwXSwgWzEyLCAzMjBdLCBbMTIsIDM4NF0sIFsxMiwgMzg0XSwgWzEyLCA0NDhdLCBbMTIsIDQ0OF0sIFsxMywgNTEyXSwgWzEzLCA1NzZdLCBbMTIsIDUzXSwgWzEyLCA1M10sIFsxMiwgNTRdLCBbMTIsIDU0XSwgWzEzLCA4OTZdLCBbMTMsIDk2MF0sIFsxMywgMTAyNF0sIFsxMywgMTA4OF0sIFsxMywgMTE1Ml0sIFsxMywgMTIxNl0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XV07CmNvbnN0IGJsYWNrVGFibGUyID0gW1s4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFsxMSwgMjNdLCBbMTEsIDIzXSwgWzEyLCA1MF0sIFsxMiwgNTFdLCBbMTIsIDQ0XSwgWzEyLCA0NV0sIFsxMiwgNDZdLCBbMTIsIDQ3XSwgWzEyLCA1N10sIFsxMiwgNThdLCBbMTIsIDYxXSwgWzEyLCAyNTZdLCBbMTAsIDE2XSwgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgWzEwLCAxN10sIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEwLCAxN10sIFsxMiwgNDhdLCBbMTIsIDQ5XSwgWzEyLCA2Ml0sIFsxMiwgNjNdLCBbMTIsIDMwXSwgWzEyLCAzMV0sIFsxMiwgMzJdLCBbMTIsIDMzXSwgWzEyLCA0MF0sIFsxMiwgNDFdLCBbMTEsIDIyXSwgWzExLCAyMl0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFsxMiwgMTI4XSwgWzEyLCAxOTJdLCBbMTIsIDI2XSwgWzEyLCAyN10sIFsxMiwgMjhdLCBbMTIsIDI5XSwgWzExLCAxOV0sIFsxMSwgMTldLCBbMTEsIDIwXSwgWzExLCAyMF0sIFsxMiwgMzRdLCBbMTIsIDM1XSwgWzEyLCAzNl0sIFsxMiwgMzddLCBbMTIsIDM4XSwgWzEyLCAzOV0sIFsxMSwgMjFdLCBbMTEsIDIxXSwgWzEyLCA0Ml0sIFsxMiwgNDNdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdXTsKY29uc3QgYmxhY2tUYWJsZTMgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFs2LCA5XSwgWzYsIDhdLCBbNSwgN10sIFs1LCA3XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl1dOwpjbGFzcyBDQ0lUVEZheERlY29kZXIgewogIGNvbnN0cnVjdG9yKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7CiAgICBpZiAodHlwZW9mIHNvdXJjZT8ubmV4dCAhPT0gImZ1bmN0aW9uIikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NDSVRURmF4RGVjb2RlciAtIGludmFsaWQgInNvdXJjZSIgcGFyYW1ldGVyLicpOwogICAgfQogICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CiAgICB0aGlzLmVvZiA9IGZhbHNlOwogICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuSyB8fCAwOwogICAgdGhpcy5lb2xpbmUgPSBvcHRpb25zLkVuZE9mTGluZSB8fCBmYWxzZTsKICAgIHRoaXMuYnl0ZUFsaWduID0gb3B0aW9ucy5FbmNvZGVkQnl0ZUFsaWduIHx8IGZhbHNlOwogICAgdGhpcy5jb2x1bW5zID0gb3B0aW9ucy5Db2x1bW5zIHx8IDE3Mjg7CiAgICB0aGlzLnJvd3MgPSBvcHRpb25zLlJvd3MgfHwgMDsKICAgIHRoaXMuZW9ibG9jayA9IG9wdGlvbnMuRW5kT2ZCbG9jayA/PyB0cnVlOwogICAgdGhpcy5ibGFjayA9IG9wdGlvbnMuQmxhY2tJczEgfHwgZmFsc2U7CiAgICB0aGlzLmNvZGluZ0xpbmUgPSBuZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zICsgMSk7CiAgICB0aGlzLnJlZkxpbmUgPSBuZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zICsgMik7CiAgICB0aGlzLmNvZGluZ0xpbmVbMF0gPSB0aGlzLmNvbHVtbnM7CiAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CiAgICB0aGlzLnJvdyA9IDA7CiAgICB0aGlzLm5leHRMaW5lMkQgPSB0aGlzLmVuY29kaW5nIDwgMDsKICAgIHRoaXMuaW5wdXRCaXRzID0gMDsKICAgIHRoaXMuaW5wdXRCdWYgPSAwOwogICAgdGhpcy5vdXRwdXRCaXRzID0gMDsKICAgIHRoaXMucm93c0RvbmUgPSBmYWxzZTsKICAgIGxldCBjb2RlMTsKICAgIHdoaWxlICgoY29kZTEgPSB0aGlzLl9sb29rQml0cygxMikpID09PSAwKSB7CiAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICB9CiAgICBpZiAoY29kZTEgPT09IDEpIHsKICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICB9CiAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKICAgICAgdGhpcy5uZXh0TGluZTJEID0gIXRoaXMuX2xvb2tCaXRzKDEpOwogICAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgfQogIH0KICByZWFkTmV4dENoYXIoKSB7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgY29uc3QgcmVmTGluZSA9IHRoaXMucmVmTGluZTsKICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zOwogICAgbGV0IHJlZlBvcywgYmxhY2tQaXhlbHMsIGJpdHMsIGk7CiAgICBpZiAodGhpcy5vdXRwdXRCaXRzID09PSAwKSB7CiAgICAgIGlmICh0aGlzLnJvd3NEb25lKSB7CiAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICB9CiAgICAgIGlmICh0aGlzLmVvZikgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICB0aGlzLmVyciA9IGZhbHNlOwogICAgICBsZXQgY29kZTEsIGNvZGUyLCBjb2RlMzsKICAgICAgaWYgKHRoaXMubmV4dExpbmUyRCkgewogICAgICAgIGZvciAoaSA9IDA7IGNvZGluZ0xpbmVbaV0gPCBjb2x1bW5zOyArK2kpIHsKICAgICAgICAgIHJlZkxpbmVbaV0gPSBjb2RpbmdMaW5lW2ldOwogICAgICAgIH0KICAgICAgICByZWZMaW5lW2krK10gPSBjb2x1bW5zOwogICAgICAgIHJlZkxpbmVbaV0gPSBjb2x1bW5zOwogICAgICAgIGNvZGluZ0xpbmVbMF0gPSAwOwogICAgICAgIHRoaXMuY29kaW5nUG9zID0gMDsKICAgICAgICByZWZQb3MgPSAwOwogICAgICAgIGJsYWNrUGl4ZWxzID0gMDsKICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICBjb2RlMSA9IHRoaXMuX2dldFR3b0RpbUNvZGUoKTsKICAgICAgICAgIHN3aXRjaCAoY29kZTEpIHsKICAgICAgICAgICAgY2FzZSB0d29EaW1QYXNzOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvcyArIDFdLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgaWYgKHJlZkxpbmVbcmVmUG9zICsgMV0gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltSG9yaXo6CiAgICAgICAgICAgICAgY29kZTEgPSBjb2RlMiA9IDA7CiAgICAgICAgICAgICAgaWYgKGJsYWNrUGl4ZWxzKSB7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0QmxhY2tDb2RlKCk7CiAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgIGNvZGUyICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CiAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgY29kZTIgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICsgY29kZTEsIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMiwgYmxhY2tQaXhlbHMgXiAxKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIzOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAzLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIyOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAyLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIxOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAxLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydDA6CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSwgYmxhY2tQaXhlbHMpOwogICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CiAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgKytyZWZQb3M7CiAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRMMzoKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHNOZWcocmVmTGluZVtyZWZQb3NdIC0gMywgYmxhY2tQaXhlbHMpOwogICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CiAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgaWYgKHJlZlBvcyA+IDApIHsKICAgICAgICAgICAgICAgICAgLS1yZWZQb3M7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydEwyOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVsc05lZyhyZWZMaW5lW3JlZlBvc10gLSAyLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgewogICAgICAgICAgICAgICAgICAtLXJlZlBvczsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICsrcmVmUG9zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDE6CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDEsIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOwogICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgIGlmIChyZWZQb3MgPiAwKSB7CiAgICAgICAgICAgICAgICAgIC0tcmVmUG9zOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIGNjaXR0RU9GOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2x1bW5zLCAwKTsKICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgaW5mbygiYmFkIDJkIGNvZGUiKTsKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29sdW1ucywgMCk7CiAgICAgICAgICAgICAgdGhpcy5lcnIgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb2RpbmdMaW5lWzBdID0gMDsKICAgICAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CiAgICAgICAgYmxhY2tQaXhlbHMgPSAwOwogICAgICAgIHdoaWxlIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgIGNvZGUxID0gMDsKICAgICAgICAgIGlmIChibGFja1BpeGVscykgewogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTsKICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CiAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUxLCBibGFja1BpeGVscyk7CiAgICAgICAgICBibGFja1BpeGVscyBePSAxOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgZ290RU9MID0gZmFsc2U7CiAgICAgIGlmICh0aGlzLmJ5dGVBbGlnbikgewogICAgICAgIHRoaXMuaW5wdXRCaXRzICY9IH43OwogICAgICB9CiAgICAgIGlmICghdGhpcy5lb2Jsb2NrICYmIHRoaXMucm93ID09PSB0aGlzLnJvd3MgLSAxKSB7CiAgICAgICAgdGhpcy5yb3dzRG9uZSA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CiAgICAgICAgaWYgKHRoaXMuZW9saW5lKSB7CiAgICAgICAgICB3aGlsZSAoY29kZTEgIT09IGNjaXR0RU9GICYmIGNvZGUxICE9PSAxKSB7CiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3aGlsZSAoY29kZTEgPT09IDApIHsKICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjb2RlMSA9PT0gMSkgewogICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgICBnb3RFT0wgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAoY29kZTEgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGhpcy5lb2YgJiYgdGhpcy5lbmNvZGluZyA+IDAgJiYgIXRoaXMucm93c0RvbmUpIHsKICAgICAgICB0aGlzLm5leHRMaW5lMkQgPSAhdGhpcy5fbG9va0JpdHMoMSk7CiAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgfQogICAgICBpZiAodGhpcy5lb2Jsb2NrICYmIGdvdEVPTCAmJiB0aGlzLmJ5dGVBbGlnbikgewogICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOwogICAgICAgIGlmIChjb2RlMSA9PT0gMSkgewogICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKICAgICAgICAgICAgdGhpcy5fbG9va0JpdHMoMSk7CiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+PSAwKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKICAgICAgICAgICAgICBpZiAoY29kZTEgIT09IDEpIHsKICAgICAgICAgICAgICAgIGluZm8oImJhZCBydGMgY29kZTogIiArIGNvZGUxKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPiAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9sb29rQml0cygxKTsKICAgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyICYmIHRoaXMuZW9saW5lKSB7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTMpOwogICAgICAgICAgaWYgKGNvZGUxID09PSBjY2l0dEVPRikgewogICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjb2RlMSA+PiAxID09PSAxKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPiAwKSB7CiAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgICAgICAgdGhpcy5uZXh0TGluZTJEID0gIShjb2RlMSAmIDEpOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lWzBdID4gMCA/IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgPSAwXSA6IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgPSAxXTsKICAgICAgdGhpcy5yb3crKzsKICAgIH0KICAgIGxldCBjOwogICAgaWYgKHRoaXMub3V0cHV0Qml0cyA+PSA4KSB7CiAgICAgIGMgPSB0aGlzLmNvZGluZ1BvcyAmIDEgPyAwIDogMHhmZjsKICAgICAgdGhpcy5vdXRwdXRCaXRzIC09IDg7CiAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDAgJiYgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgdGhpcy5jb2RpbmdQb3MrKzsKICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAtIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgLSAxXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYml0cyA9IDg7CiAgICAgIGMgPSAwOwogICAgICBkbyB7CiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm91dHB1dEJpdHMgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ0ludmFsaWQgL0NDSVRURmF4RGVjb2RlIGRhdGEsICJvdXRwdXRCaXRzIiBtdXN0IGJlIGEgbnVtYmVyLicpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID4gYml0cykgewogICAgICAgICAgYyA8PD0gYml0czsKICAgICAgICAgIGlmICghKHRoaXMuY29kaW5nUG9zICYgMSkpIHsKICAgICAgICAgICAgYyB8PSAweGZmID4+IDggLSBiaXRzOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5vdXRwdXRCaXRzIC09IGJpdHM7CiAgICAgICAgICBiaXRzID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYyA8PD0gdGhpcy5vdXRwdXRCaXRzOwogICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkgewogICAgICAgICAgICBjIHw9IDB4ZmYgPj4gOCAtIHRoaXMub3V0cHV0Qml0czsKICAgICAgICAgIH0KICAgICAgICAgIGJpdHMgLT0gdGhpcy5vdXRwdXRCaXRzOwogICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gMDsKICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgdGhpcy5jb2RpbmdQb3MrKzsKICAgICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gLSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zIC0gMV07CiAgICAgICAgICB9IGVsc2UgaWYgKGJpdHMgPiAwKSB7CiAgICAgICAgICAgIGMgPDw9IGJpdHM7CiAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSB3aGlsZSAoYml0cyk7CiAgICB9CiAgICBpZiAodGhpcy5ibGFjaykgewogICAgICBjIF49IDB4ZmY7CiAgICB9CiAgICByZXR1cm4gYzsKICB9CiAgX2FkZFBpeGVscyhhMSwgYmxhY2tQaXhlbHMpIHsKICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CiAgICBsZXQgY29kaW5nUG9zID0gdGhpcy5jb2RpbmdQb3M7CiAgICBpZiAoYTEgPiBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKICAgICAgaWYgKGExID4gdGhpcy5jb2x1bW5zKSB7CiAgICAgICAgaW5mbygicm93IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICAgIHRoaXMuZXJyID0gdHJ1ZTsKICAgICAgICBhMSA9IHRoaXMuY29sdW1uczsKICAgICAgfQogICAgICBpZiAoY29kaW5nUG9zICYgMSBeIGJsYWNrUGl4ZWxzKSB7CiAgICAgICAgKytjb2RpbmdQb3M7CiAgICAgIH0KICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CiAgICB9CiAgICB0aGlzLmNvZGluZ1BvcyA9IGNvZGluZ1BvczsKICB9CiAgX2FkZFBpeGVsc05lZyhhMSwgYmxhY2tQaXhlbHMpIHsKICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CiAgICBsZXQgY29kaW5nUG9zID0gdGhpcy5jb2RpbmdQb3M7CiAgICBpZiAoYTEgPiBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKICAgICAgaWYgKGExID4gdGhpcy5jb2x1bW5zKSB7CiAgICAgICAgaW5mbygicm93IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICAgIHRoaXMuZXJyID0gdHJ1ZTsKICAgICAgICBhMSA9IHRoaXMuY29sdW1uczsKICAgICAgfQogICAgICBpZiAoY29kaW5nUG9zICYgMSBeIGJsYWNrUGl4ZWxzKSB7CiAgICAgICAgKytjb2RpbmdQb3M7CiAgICAgIH0KICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CiAgICB9IGVsc2UgaWYgKGExIDwgY29kaW5nTGluZVtjb2RpbmdQb3NdKSB7CiAgICAgIGlmIChhMSA8IDApIHsKICAgICAgICBpbmZvKCJpbnZhbGlkIGNvZGUiKTsKICAgICAgICB0aGlzLmVyciA9IHRydWU7CiAgICAgICAgYTEgPSAwOwogICAgICB9CiAgICAgIHdoaWxlIChjb2RpbmdQb3MgPiAwICYmIGExIDwgY29kaW5nTGluZVtjb2RpbmdQb3MgLSAxXSkgewogICAgICAgIC0tY29kaW5nUG9zOwogICAgICB9CiAgICAgIGNvZGluZ0xpbmVbY29kaW5nUG9zXSA9IGExOwogICAgfQogICAgdGhpcy5jb2RpbmdQb3MgPSBjb2RpbmdQb3M7CiAgfQogIF9maW5kVGFibGVDb2RlKHN0YXJ0LCBlbmQsIHRhYmxlLCBsaW1pdCkgewogICAgY29uc3QgbGltaXRWYWx1ZSA9IGxpbWl0IHx8IDA7CiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpIHsKICAgICAgbGV0IGNvZGUgPSB0aGlzLl9sb29rQml0cyhpKTsKICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgcmV0dXJuIFt0cnVlLCAxLCBmYWxzZV07CiAgICAgIH0KICAgICAgaWYgKGkgPCBlbmQpIHsKICAgICAgICBjb2RlIDw8PSBlbmQgLSBpOwogICAgICB9CiAgICAgIGlmICghbGltaXRWYWx1ZSB8fCBjb2RlID49IGxpbWl0VmFsdWUpIHsKICAgICAgICBjb25zdCBwID0gdGFibGVbY29kZSAtIGxpbWl0VmFsdWVdOwogICAgICAgIGlmIChwWzBdID09PSBpKSB7CiAgICAgICAgICB0aGlzLl9lYXRCaXRzKGkpOwogICAgICAgICAgcmV0dXJuIFt0cnVlLCBwWzFdLCB0cnVlXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBbZmFsc2UsIDAsIGZhbHNlXTsKICB9CiAgX2dldFR3b0RpbUNvZGUoKSB7CiAgICBsZXQgY29kZSA9IDA7CiAgICBsZXQgcDsKICAgIGlmICh0aGlzLmVvYmxvY2spIHsKICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDcpOwogICAgICBwID0gdHdvRGltVGFibGVbY29kZV07CiAgICAgIGlmIChwPy5bMF0gPiAwKSB7CiAgICAgICAgdGhpcy5fZWF0Qml0cyhwWzBdKTsKICAgICAgICByZXR1cm4gcFsxXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxLCA3LCB0d29EaW1UYWJsZSk7CiAgICAgIGlmIChyZXN1bHRbMF0gJiYgcmVzdWx0WzJdKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKICAgICAgfQogICAgfQogICAgaW5mbygiQmFkIHR3byBkaW0gY29kZSIpOwogICAgcmV0dXJuIGNjaXR0RU9GOwogIH0KICBfZ2V0V2hpdGVDb2RlKCkgewogICAgbGV0IGNvZGUgPSAwOwogICAgbGV0IHA7CiAgICBpZiAodGhpcy5lb2Jsb2NrKSB7CiAgICAgIGNvZGUgPSB0aGlzLl9sb29rQml0cygxMik7CiAgICAgIGlmIChjb2RlID09PSBjY2l0dEVPRikgewogICAgICAgIHJldHVybiAxOwogICAgICB9CiAgICAgIHAgPSBjb2RlID4+IDUgPT09IDAgPyB3aGl0ZVRhYmxlMVtjb2RlXSA6IHdoaXRlVGFibGUyW2NvZGUgPj4gM107CiAgICAgIGlmIChwWzBdID4gMCkgewogICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7CiAgICAgICAgcmV0dXJuIHBbMV07CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDksIHdoaXRlVGFibGUyKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMSwgMTIsIHdoaXRlVGFibGUxKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgIH0KICAgIGluZm8oImJhZCB3aGl0ZSBjb2RlIik7CiAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgcmV0dXJuIDE7CiAgfQogIF9nZXRCbGFja0NvZGUoKSB7CiAgICBsZXQgY29kZSwgcDsKICAgIGlmICh0aGlzLmVvYmxvY2spIHsKICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEzKTsKICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICAgICAgaWYgKGNvZGUgPj4gNyA9PT0gMCkgewogICAgICAgIHAgPSBibGFja1RhYmxlMVtjb2RlXTsKICAgICAgfSBlbHNlIGlmIChjb2RlID4+IDkgPT09IDAgJiYgY29kZSA+PiA3ICE9PSAwKSB7CiAgICAgICAgcCA9IGJsYWNrVGFibGUyWyhjb2RlID4+IDEpIC0gNjRdOwogICAgICB9IGVsc2UgewogICAgICAgIHAgPSBibGFja1RhYmxlM1tjb2RlID4+IDddOwogICAgICB9CiAgICAgIGlmIChwWzBdID4gMCkgewogICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7CiAgICAgICAgcmV0dXJuIHBbMV07CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDIsIDYsIGJsYWNrVGFibGUzKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSg3LCAxMiwgYmxhY2tUYWJsZTIsIDY0KTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMCwgMTMsIGJsYWNrVGFibGUxKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgIH0KICAgIGluZm8oImJhZCBibGFjayBjb2RlIik7CiAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgcmV0dXJuIDE7CiAgfQogIF9sb29rQml0cyhuKSB7CiAgICBsZXQgYzsKICAgIHdoaWxlICh0aGlzLmlucHV0Qml0cyA8IG4pIHsKICAgICAgaWYgKChjID0gdGhpcy5zb3VyY2UubmV4dCgpKSA9PT0gLTEpIHsKICAgICAgICBpZiAodGhpcy5pbnB1dEJpdHMgPT09IDApIHsKICAgICAgICAgIHJldHVybiBjY2l0dEVPRjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRCdWYgPDwgbiAtIHRoaXMuaW5wdXRCaXRzICYgMHhmZmZmID4+IDE2IC0gbjsKICAgICAgfQogICAgICB0aGlzLmlucHV0QnVmID0gdGhpcy5pbnB1dEJ1ZiA8PCA4IHwgYzsKICAgICAgdGhpcy5pbnB1dEJpdHMgKz0gODsKICAgIH0KICAgIHJldHVybiB0aGlzLmlucHV0QnVmID4+IHRoaXMuaW5wdXRCaXRzIC0gbiAmIDB4ZmZmZiA+PiAxNiAtIG47CiAgfQogIF9lYXRCaXRzKG4pIHsKICAgIGlmICgodGhpcy5pbnB1dEJpdHMgLT0gbikgPCAwKSB7CiAgICAgIHRoaXMuaW5wdXRCaXRzID0gMDsKICAgIH0KICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NjaXR0X3N0cmVhbS5qcwoKCgpjbGFzcyBDQ0lUVEZheFN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCwgcGFyYW1zKSB7CiAgICBzdXBlcihtYXliZUxlbmd0aCk7CiAgICB0aGlzLnN0ciA9IHN0cjsKICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OwogICAgaWYgKCEocGFyYW1zIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcGFyYW1zID0gRGljdC5lbXB0eTsKICAgIH0KICAgIGNvbnN0IHNvdXJjZSA9IHsKICAgICAgbmV4dCgpIHsKICAgICAgICByZXR1cm4gc3RyLmdldEJ5dGUoKTsKICAgICAgfQogICAgfTsKICAgIHRoaXMuY2NpdHRGYXhEZWNvZGVyID0gbmV3IENDSVRURmF4RGVjb2Rlcihzb3VyY2UsIHsKICAgICAgSzogcGFyYW1zLmdldCgiSyIpLAogICAgICBFbmRPZkxpbmU6IHBhcmFtcy5nZXQoIkVuZE9mTGluZSIpLAogICAgICBFbmNvZGVkQnl0ZUFsaWduOiBwYXJhbXMuZ2V0KCJFbmNvZGVkQnl0ZUFsaWduIiksCiAgICAgIENvbHVtbnM6IHBhcmFtcy5nZXQoIkNvbHVtbnMiKSwKICAgICAgUm93czogcGFyYW1zLmdldCgiUm93cyIpLAogICAgICBFbmRPZkJsb2NrOiBwYXJhbXMuZ2V0KCJFbmRPZkJsb2NrIiksCiAgICAgIEJsYWNrSXMxOiBwYXJhbXMuZ2V0KCJCbGFja0lzMSIpCiAgICB9KTsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgd2hpbGUgKCF0aGlzLmVvZikgewogICAgICBjb25zdCBjID0gdGhpcy5jY2l0dEZheERlY29kZXIucmVhZE5leHRDaGFyKCk7CiAgICAgIGlmIChjID09PSAtMSkgewogICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyAxKTsKICAgICAgdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK10gPSBjOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZmxhdGVfc3RyZWFtLmpzCgoKCmNvbnN0IGNvZGVMZW5Db2RlTWFwID0gbmV3IEludDMyQXJyYXkoWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdKTsKY29uc3QgbGVuZ3RoRGVjb2RlID0gbmV3IEludDMyQXJyYXkoWzB4MDAwMDMsIDB4MDAwMDQsIDB4MDAwMDUsIDB4MDAwMDYsIDB4MDAwMDcsIDB4MDAwMDgsIDB4MDAwMDksIDB4MDAwMGEsIDB4MTAwMGIsIDB4MTAwMGQsIDB4MTAwMGYsIDB4MTAwMTEsIDB4MjAwMTMsIDB4MjAwMTcsIDB4MjAwMWIsIDB4MjAwMWYsIDB4MzAwMjMsIDB4MzAwMmIsIDB4MzAwMzMsIDB4MzAwM2IsIDB4NDAwNDMsIDB4NDAwNTMsIDB4NDAwNjMsIDB4NDAwNzMsIDB4NTAwODMsIDB4NTAwYTMsIDB4NTAwYzMsIDB4NTAwZTMsIDB4MDAxMDIsIDB4MDAxMDIsIDB4MDAxMDJdKTsKY29uc3QgZGlzdERlY29kZSA9IG5ldyBJbnQzMkFycmF5KFsweDAwMDAxLCAweDAwMDAyLCAweDAwMDAzLCAweDAwMDA0LCAweDEwMDA1LCAweDEwMDA3LCAweDIwMDA5LCAweDIwMDBkLCAweDMwMDExLCAweDMwMDE5LCAweDQwMDIxLCAweDQwMDMxLCAweDUwMDQxLCAweDUwMDYxLCAweDYwMDgxLCAweDYwMGMxLCAweDcwMTAxLCAweDcwMTgxLCAweDgwMjAxLCAweDgwMzAxLCAweDkwNDAxLCAweDkwNjAxLCAweGEwODAxLCAweGEwYzAxLCAweGIxMDAxLCAweGIxODAxLCAweGMyMDAxLCAweGMzMDAxLCAweGQ0MDAxLCAweGQ2MDAxXSk7CmNvbnN0IGZpeGVkTGl0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbMHg3MDEwMCwgMHg4MDA1MCwgMHg4MDAxMCwgMHg4MDExOCwgMHg3MDExMCwgMHg4MDA3MCwgMHg4MDAzMCwgMHg5MDBjMCwgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMCwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMCwgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MCwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMCwgMHg3MDEwYywgMHg4MDA2OCwgMHg4MDAyOCwgMHg5MDBiMCwgMHg4MDAwOCwgMHg4MDA4OCwgMHg4MDA0OCwgMHg5MDBmMCwgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOCwgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOCwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOCwgMHg3MDEwNiwgMHg4MDA1YywgMHg4MDAxYywgMHg5MDA5OCwgMHg3MDExNiwgMHg4MDA3YywgMHg4MDAzYywgMHg5MDBkOCwgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOCwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOCwgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNCwgMHg3MDEwOSwgMHg4MDA2MiwgMHg4MDAyMiwgMHg5MDBhNCwgMHg4MDAwMiwgMHg4MDA4MiwgMHg4MDA0MiwgMHg5MDBlNCwgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NCwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNCwgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNCwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNCwgMHg3MDEwMywgMHg4MDA1NiwgMHg4MDAxNiwgMHg4MDExZSwgMHg3MDExMywgMHg4MDA3NiwgMHg4MDAzNiwgMHg5MDBjYywgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhYywgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlYywgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5YywgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkYywgMHg3MDEwZiwgMHg4MDA2ZSwgMHg4MDAyZSwgMHg5MDBiYywgMHg4MDAwZSwgMHg4MDA4ZSwgMHg4MDA0ZSwgMHg5MDBmYywgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMiwgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMiwgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMiwgMHg3MDEwNCwgMHg4MDA1OSwgMHg4MDAxOSwgMHg5MDA5MiwgMHg3MDExNCwgMHg4MDA3OSwgMHg4MDAzOSwgMHg5MDBkMiwgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMiwgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMiwgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYSwgMHg3MDEwYSwgMHg4MDA2NSwgMHg4MDAyNSwgMHg5MDBhYSwgMHg4MDAwNSwgMHg4MDA4NSwgMHg4MDA0NSwgMHg5MDBlYSwgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YSwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYSwgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYSwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYSwgMHg3MDEwMSwgMHg4MDA1MywgMHg4MDAxMywgMHg4MDExYiwgMHg3MDExMSwgMHg4MDA3MywgMHg4MDAzMywgMHg5MDBjNiwgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNiwgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNiwgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NiwgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNiwgMHg3MDEwZCwgMHg4MDA2YiwgMHg4MDAyYiwgMHg5MDBiNiwgMHg4MDAwYiwgMHg4MDA4YiwgMHg4MDA0YiwgMHg5MDBmNiwgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZSwgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZSwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZSwgMHg3MDEwNywgMHg4MDA1ZiwgMHg4MDAxZiwgMHg5MDA5ZSwgMHg3MDExNywgMHg4MDA3ZiwgMHg4MDAzZiwgMHg5MDBkZSwgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZSwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZSwgMHg3MDEwMCwgMHg4MDA1MCwgMHg4MDAxMCwgMHg4MDExOCwgMHg3MDExMCwgMHg4MDA3MCwgMHg4MDAzMCwgMHg5MDBjMSwgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMSwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMSwgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MSwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMSwgMHg3MDEwYywgMHg4MDA2OCwgMHg4MDAyOCwgMHg5MDBiMSwgMHg4MDAwOCwgMHg4MDA4OCwgMHg4MDA0OCwgMHg5MDBmMSwgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOSwgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOSwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOSwgMHg3MDEwNiwgMHg4MDA1YywgMHg4MDAxYywgMHg5MDA5OSwgMHg3MDExNiwgMHg4MDA3YywgMHg4MDAzYywgMHg5MDBkOSwgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOSwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOSwgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNSwgMHg3MDEwOSwgMHg4MDA2MiwgMHg4MDAyMiwgMHg5MDBhNSwgMHg4MDAwMiwgMHg4MDA4MiwgMHg4MDA0MiwgMHg5MDBlNSwgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NSwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNSwgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNSwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNSwgMHg3MDEwMywgMHg4MDA1NiwgMHg4MDAxNiwgMHg4MDExZSwgMHg3MDExMywgMHg4MDA3NiwgMHg4MDAzNiwgMHg5MDBjZCwgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhZCwgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlZCwgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5ZCwgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkZCwgMHg3MDEwZiwgMHg4MDA2ZSwgMHg4MDAyZSwgMHg5MDBiZCwgMHg4MDAwZSwgMHg4MDA4ZSwgMHg4MDA0ZSwgMHg5MDBmZCwgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMywgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMywgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMywgMHg3MDEwNCwgMHg4MDA1OSwgMHg4MDAxOSwgMHg5MDA5MywgMHg3MDExNCwgMHg4MDA3OSwgMHg4MDAzOSwgMHg5MDBkMywgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMywgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMywgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYiwgMHg3MDEwYSwgMHg4MDA2NSwgMHg4MDAyNSwgMHg5MDBhYiwgMHg4MDAwNSwgMHg4MDA4NSwgMHg4MDA0NSwgMHg5MDBlYiwgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YiwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYiwgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYiwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYiwgMHg3MDEwMSwgMHg4MDA1MywgMHg4MDAxMywgMHg4MDExYiwgMHg3MDExMSwgMHg4MDA3MywgMHg4MDAzMywgMHg5MDBjNywgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNywgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNywgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NywgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNywgMHg3MDEwZCwgMHg4MDA2YiwgMHg4MDAyYiwgMHg5MDBiNywgMHg4MDAwYiwgMHg4MDA4YiwgMHg4MDA0YiwgMHg5MDBmNywgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZiwgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZiwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZiwgMHg3MDEwNywgMHg4MDA1ZiwgMHg4MDAxZiwgMHg5MDA5ZiwgMHg3MDExNywgMHg4MDA3ZiwgMHg4MDAzZiwgMHg5MDBkZiwgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZiwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZl0pLCA5XTsKY29uc3QgZml4ZWREaXN0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbMHg1MDAwMCwgMHg1MDAxMCwgMHg1MDAwOCwgMHg1MDAxOCwgMHg1MDAwNCwgMHg1MDAxNCwgMHg1MDAwYywgMHg1MDAxYywgMHg1MDAwMiwgMHg1MDAxMiwgMHg1MDAwYSwgMHg1MDAxYSwgMHg1MDAwNiwgMHg1MDAxNiwgMHg1MDAwZSwgMHgwMDAwMCwgMHg1MDAwMSwgMHg1MDAxMSwgMHg1MDAwOSwgMHg1MDAxOSwgMHg1MDAwNSwgMHg1MDAxNSwgMHg1MDAwZCwgMHg1MDAxZCwgMHg1MDAwMywgMHg1MDAxMywgMHg1MDAwYiwgMHg1MDAxYiwgMHg1MDAwNywgMHg1MDAxNywgMHg1MDAwZiwgMHgwMDAwMF0pLCA1XTsKY2xhc3MgRmxhdGVTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0ciwgbWF5YmVMZW5ndGgpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgICBjb25zdCBjbWYgPSBzdHIuZ2V0Qnl0ZSgpOwogICAgY29uc3QgZmxnID0gc3RyLmdldEJ5dGUoKTsKICAgIGlmIChjbWYgPT09IC0xIHx8IGZsZyA9PT0gLTEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7CiAgICB9CiAgICBpZiAoKGNtZiAmIDB4MGYpICE9PSAweDA4KSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gZmxhdGUgc3RyZWFtOiAke2NtZn0sICR7ZmxnfWApOwogICAgfQogICAgaWYgKCgoY21mIDw8IDgpICsgZmxnKSAlIDMxICE9PSAwKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgQmFkIEZDSEVDSyBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7CiAgICB9CiAgICBpZiAoZmxnICYgMHgyMCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEZESUNUIGJpdCBzZXQgaW4gZmxhdGUgc3RyZWFtOiAke2NtZn0sICR7ZmxnfWApOwogICAgfQogICAgdGhpcy5jb2RlU2l6ZSA9IDA7CiAgICB0aGlzLmNvZGVCdWYgPSAwOwogIH0KICBhc3luYyBnZXRJbWFnZURhdGEobGVuZ3RoLCBfZGVjb2Rlck9wdGlvbnMpIHsKICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmFzeW5jR2V0Qnl0ZXMoKTsKICAgIHJldHVybiBkYXRhPy5zdWJhcnJheSgwLCBsZW5ndGgpIHx8IHRoaXMuZ2V0Qnl0ZXMobGVuZ3RoKTsKICB9CiAgYXN5bmMgYXN5bmNHZXRCeXRlcygpIHsKICAgIHRoaXMuc3RyLnJlc2V0KCk7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKCk7CiAgICB0cnkgewogICAgICBjb25zdCB7CiAgICAgICAgcmVhZGFibGUsCiAgICAgICAgd3JpdGFibGUKICAgICAgfSA9IG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCJkZWZsYXRlIik7CiAgICAgIGNvbnN0IHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpOwogICAgICBhd2FpdCB3cml0ZXIucmVhZHk7CiAgICAgIHdyaXRlci53cml0ZShieXRlcykudGhlbihhc3luYyAoKSA9PiB7CiAgICAgICAgYXdhaXQgd3JpdGVyLnJlYWR5OwogICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpOwogICAgICB9KS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgICBsZXQgdG90YWxMZW5ndGggPSAwOwogICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlYWRhYmxlKSB7CiAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspOwogICAgICAgIHRvdGFsTGVuZ3RoICs9IGNodW5rLmJ5dGVMZW5ndGg7CiAgICAgIH0KICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTsKICAgICAgbGV0IG9mZnNldCA9IDA7CiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7CiAgICAgICAgZGF0YS5zZXQoY2h1bmssIG9mZnNldCk7CiAgICAgICAgb2Zmc2V0ICs9IGNodW5rLmJ5dGVMZW5ndGg7CiAgICAgIH0KICAgICAgcmV0dXJuIGRhdGE7CiAgICB9IGNhdGNoIHsKICAgICAgdGhpcy5zdHIgPSBuZXcgU3RyZWFtKGJ5dGVzLCAyLCBieXRlcy5sZW5ndGgsIHRoaXMuc3RyLmRpY3QpOwogICAgICB0aGlzLnJlc2V0KCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KICBnZXQgaXNBc3luYygpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBnZXRCaXRzKGJpdHMpIHsKICAgIGNvbnN0IHN0ciA9IHRoaXMuc3RyOwogICAgbGV0IGNvZGVTaXplID0gdGhpcy5jb2RlU2l6ZTsKICAgIGxldCBjb2RlQnVmID0gdGhpcy5jb2RlQnVmOwogICAgbGV0IGI7CiAgICB3aGlsZSAoY29kZVNpemUgPCBiaXRzKSB7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICB9CiAgICAgIGNvZGVCdWYgfD0gYiA8PCBjb2RlU2l6ZTsKICAgICAgY29kZVNpemUgKz0gODsKICAgIH0KICAgIGIgPSBjb2RlQnVmICYgKDEgPDwgYml0cykgLSAxOwogICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBiaXRzOwogICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC09IGJpdHM7CiAgICByZXR1cm4gYjsKICB9CiAgZ2V0Q29kZSh0YWJsZSkgewogICAgY29uc3Qgc3RyID0gdGhpcy5zdHI7CiAgICBjb25zdCBjb2RlcyA9IHRhYmxlWzBdOwogICAgY29uc3QgbWF4TGVuID0gdGFibGVbMV07CiAgICBsZXQgY29kZVNpemUgPSB0aGlzLmNvZGVTaXplOwogICAgbGV0IGNvZGVCdWYgPSB0aGlzLmNvZGVCdWY7CiAgICBsZXQgYjsKICAgIHdoaWxlIChjb2RlU2l6ZSA8IG1heExlbikgewogICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjb2RlQnVmIHw9IGIgPDwgY29kZVNpemU7CiAgICAgIGNvZGVTaXplICs9IDg7CiAgICB9CiAgICBjb25zdCBjb2RlID0gY29kZXNbY29kZUJ1ZiAmICgxIDw8IG1heExlbikgLSAxXTsKICAgIGNvbnN0IGNvZGVMZW4gPSBjb2RlID4+IDE2OwogICAgY29uc3QgY29kZVZhbCA9IGNvZGUgJiAweGZmZmY7CiAgICBpZiAoY29kZUxlbiA8IDEgfHwgY29kZVNpemUgPCBjb2RlTGVuKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbSIpOwogICAgfQogICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBjb2RlTGVuOwogICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC0gY29kZUxlbjsKICAgIHJldHVybiBjb2RlVmFsOwogIH0KICBnZW5lcmF0ZUh1ZmZtYW5UYWJsZShsZW5ndGhzKSB7CiAgICBjb25zdCBuID0gbGVuZ3Rocy5sZW5ndGg7CiAgICBsZXQgbWF4TGVuID0gMDsKICAgIGxldCBpOwogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBpZiAobGVuZ3Roc1tpXSA+IG1heExlbikgewogICAgICAgIG1heExlbiA9IGxlbmd0aHNbaV07CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHNpemUgPSAxIDw8IG1heExlbjsKICAgIGNvbnN0IGNvZGVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7CiAgICBmb3IgKGxldCBsZW4gPSAxLCBjb2RlID0gMCwgc2tpcCA9IDI7IGxlbiA8PSBtYXhMZW47ICsrbGVuLCBjb2RlIDw8PSAxLCBza2lwIDw8PSAxKSB7CiAgICAgIGZvciAobGV0IHZhbCA9IDA7IHZhbCA8IG47ICsrdmFsKSB7CiAgICAgICAgaWYgKGxlbmd0aHNbdmFsXSA9PT0gbGVuKSB7CiAgICAgICAgICBsZXQgY29kZTIgPSAwOwogICAgICAgICAgbGV0IHQgPSBjb2RlOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgICAgIGNvZGUyID0gY29kZTIgPDwgMSB8IHQgJiAxOwogICAgICAgICAgICB0ID4+PSAxOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChpID0gY29kZTI7IGkgPCBzaXplOyBpICs9IHNraXApIHsKICAgICAgICAgICAgY29kZXNbaV0gPSBsZW4gPDwgMTYgfCB2YWw7CiAgICAgICAgICB9CiAgICAgICAgICArK2NvZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gW2NvZGVzLCBtYXhMZW5dOwogIH0KICAjZW5kc1N0cmVhbU9uRXJyb3IoZXJyKSB7CiAgICBpbmZvKGVycik7CiAgICB0aGlzLmVvZiA9IHRydWU7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGxldCBidWZmZXIsIGhkciwgbGVuOwogICAgY29uc3Qgc3RyID0gdGhpcy5zdHI7CiAgICB0cnkgewogICAgICBoZHIgPSB0aGlzLmdldEJpdHMoMyk7CiAgICB9IGNhdGNoIChleCkgewogICAgICB0aGlzLiNlbmRzU3RyZWFtT25FcnJvcihleC5tZXNzYWdlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGhkciAmIDEpIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgfQogICAgaGRyID4+PSAxOwogICAgaWYgKGhkciA9PT0gMCkgewogICAgICBsZXQgYjsKICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7CiAgICAgICAgdGhpcy4jZW5kc1N0cmVhbU9uRXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCBibG9ja0xlbiA9IGI7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIHRoaXMuI2VuZHNTdHJlYW1PbkVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBibG9ja0xlbiB8PSBiIDw8IDg7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIHRoaXMuI2VuZHNTdHJlYW1PbkVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBsZXQgY2hlY2sgPSBiOwogICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKICAgICAgICB0aGlzLiNlbmRzU3RyZWFtT25FcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY2hlY2sgfD0gYiA8PCA4OwogICAgICBpZiAoY2hlY2sgIT09ICh+YmxvY2tMZW4gJiAweGZmZmYpICYmIChibG9ja0xlbiAhPT0gMCB8fCBjaGVjayAhPT0gMCkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkJhZCB1bmNvbXByZXNzZWQgYmxvY2sgbGVuZ3RoIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICB9CiAgICAgIHRoaXMuY29kZUJ1ZiA9IDA7CiAgICAgIHRoaXMuY29kZVNpemUgPSAwOwogICAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aCwKICAgICAgICBlbmQgPSBidWZmZXJMZW5ndGggKyBibG9ja0xlbjsKICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoZW5kKTsKICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBlbmQ7CiAgICAgIGlmIChibG9ja0xlbiA9PT0gMCkgewogICAgICAgIGlmIChzdHIucGVla0J5dGUoKSA9PT0gLTEpIHsKICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgYmxvY2sgPSBzdHIuZ2V0Qnl0ZXMoYmxvY2tMZW4pOwogICAgICAgIGJ1ZmZlci5zZXQoYmxvY2ssIGJ1ZmZlckxlbmd0aCk7CiAgICAgICAgaWYgKGJsb2NrLmxlbmd0aCA8IGJsb2NrTGVuKSB7CiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBsaXRDb2RlVGFibGU7CiAgICBsZXQgZGlzdENvZGVUYWJsZTsKICAgIGlmIChoZHIgPT09IDEpIHsKICAgICAgbGl0Q29kZVRhYmxlID0gZml4ZWRMaXRDb2RlVGFiOwogICAgICBkaXN0Q29kZVRhYmxlID0gZml4ZWREaXN0Q29kZVRhYjsKICAgIH0gZWxzZSBpZiAoaGRyID09PSAyKSB7CiAgICAgIGNvbnN0IG51bUxpdENvZGVzID0gdGhpcy5nZXRCaXRzKDUpICsgMjU3OwogICAgICBjb25zdCBudW1EaXN0Q29kZXMgPSB0aGlzLmdldEJpdHMoNSkgKyAxOwogICAgICBjb25zdCBudW1Db2RlTGVuQ29kZXMgPSB0aGlzLmdldEJpdHMoNCkgKyA0OwogICAgICBjb25zdCBjb2RlTGVuQ29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheShjb2RlTGVuQ29kZU1hcC5sZW5ndGgpOwogICAgICBsZXQgaTsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNvZGVMZW5Db2RlczsgKytpKSB7CiAgICAgICAgY29kZUxlbkNvZGVMZW5ndGhzW2NvZGVMZW5Db2RlTWFwW2ldXSA9IHRoaXMuZ2V0Qml0cygzKTsKICAgICAgfQogICAgICBjb25zdCBjb2RlTGVuQ29kZVRhYiA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbkNvZGVMZW5ndGhzKTsKICAgICAgbGVuID0gMDsKICAgICAgaSA9IDA7CiAgICAgIGNvbnN0IGNvZGVzID0gbnVtTGl0Q29kZXMgKyBudW1EaXN0Q29kZXM7CiAgICAgIGNvbnN0IGNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoY29kZXMpOwogICAgICBsZXQgYml0c0xlbmd0aCwgYml0c09mZnNldCwgd2hhdDsKICAgICAgd2hpbGUgKGkgPCBjb2RlcykgewogICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLmdldENvZGUoY29kZUxlbkNvZGVUYWIpOwogICAgICAgIGlmIChjb2RlID09PSAxNikgewogICAgICAgICAgYml0c0xlbmd0aCA9IDI7CiAgICAgICAgICBiaXRzT2Zmc2V0ID0gMzsKICAgICAgICAgIHdoYXQgPSBsZW47CiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAxNykgewogICAgICAgICAgYml0c0xlbmd0aCA9IDM7CiAgICAgICAgICBiaXRzT2Zmc2V0ID0gMzsKICAgICAgICAgIHdoYXQgPSBsZW4gPSAwOwogICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMTgpIHsKICAgICAgICAgIGJpdHNMZW5ndGggPSA3OwogICAgICAgICAgYml0c09mZnNldCA9IDExOwogICAgICAgICAgd2hhdCA9IGxlbiA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSBsZW4gPSBjb2RlOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCByZXBlYXRMZW5ndGggPSB0aGlzLmdldEJpdHMoYml0c0xlbmd0aCkgKyBiaXRzT2Zmc2V0OwogICAgICAgIHdoaWxlIChyZXBlYXRMZW5ndGgtLSA+IDApIHsKICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSB3aGF0OwogICAgICAgIH0KICAgICAgfQogICAgICBsaXRDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KDAsIG51bUxpdENvZGVzKSk7CiAgICAgIGRpc3RDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KG51bUxpdENvZGVzLCBjb2RlcykpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIGJsb2NrIHR5cGUgaW4gZmxhdGUgc3RyZWFtIik7CiAgICB9CiAgICBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIGxldCBsaW1pdCA9IGJ1ZmZlciA/IGJ1ZmZlci5sZW5ndGggOiAwOwogICAgbGV0IHBvcyA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgbGV0IGNvZGUxID0gdGhpcy5nZXRDb2RlKGxpdENvZGVUYWJsZSk7CiAgICAgIGlmIChjb2RlMSA8IDI1NikgewogICAgICAgIGlmIChwb3MgKyAxID49IGxpbWl0KSB7CiAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyAxKTsKICAgICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IGNvZGUxOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChjb2RlMSA9PT0gMjU2KSB7CiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBwb3M7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvZGUxIC09IDI1NzsKICAgICAgY29kZTEgPSBsZW5ndGhEZWNvZGVbY29kZTFdOwogICAgICBsZXQgY29kZTIgPSBjb2RlMSA+PiAxNjsKICAgICAgaWYgKGNvZGUyID4gMCkgewogICAgICAgIGNvZGUyID0gdGhpcy5nZXRCaXRzKGNvZGUyKTsKICAgICAgfQogICAgICBsZW4gPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7CiAgICAgIGNvZGUxID0gdGhpcy5nZXRDb2RlKGRpc3RDb2RlVGFibGUpOwogICAgICBjb2RlMSA9IGRpc3REZWNvZGVbY29kZTFdOwogICAgICBjb2RlMiA9IGNvZGUxID4+IDE2OwogICAgICBpZiAoY29kZTIgPiAwKSB7CiAgICAgICAgY29kZTIgPSB0aGlzLmdldEJpdHMoY29kZTIpOwogICAgICB9CiAgICAgIGNvbnN0IGRpc3QgPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7CiAgICAgIGlmIChwb3MgKyBsZW4gPj0gbGltaXQpIHsKICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyBsZW4pOwogICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDsKICAgICAgfQogICAgICBmb3IgKGxldCBrID0gMDsgayA8IGxlbjsgKytrLCArK3BvcykgewogICAgICAgIGJ1ZmZlcltwb3NdID0gYnVmZmVyW3BvcyAtIGRpc3RdOwogICAgICB9CiAgICB9CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9hcml0aG1ldGljX2RlY29kZXIuanMKY29uc3QgUWVUYWJsZSA9IFt7CiAgcWU6IDB4NTYwMSwKICBubXBzOiAxLAogIG5scHM6IDEsCiAgc3dpdGNoRmxhZzogMQp9LCB7CiAgcWU6IDB4MzQwMSwKICBubXBzOiAyLAogIG5scHM6IDYsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MTgwMSwKICBubXBzOiAzLAogIG5scHM6IDksCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MGFjMSwKICBubXBzOiA0LAogIG5scHM6IDEyLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDA1MjEsCiAgbm1wczogNSwKICBubHBzOiAyOSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMjIxLAogIG5tcHM6IDM4LAogIG5scHM6IDMzLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDU2MDEsCiAgbm1wczogNywKICBubHBzOiA2LAogIHN3aXRjaEZsYWc6IDEKfSwgewogIHFlOiAweDU0MDEsCiAgbm1wczogOCwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHg0ODAxLAogIG5tcHM6IDksCiAgbmxwczogMTQsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MzgwMSwKICBubXBzOiAxMCwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgzMDAxLAogIG5tcHM6IDExLAogIG5scHM6IDE3LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDI0MDEsCiAgbm1wczogMTIsCiAgbmxwczogMTgsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MWMwMSwKICBubXBzOiAxMywKICBubHBzOiAyMCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxNjAxLAogIG5tcHM6IDI5LAogIG5scHM6IDIxLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDU2MDEsCiAgbm1wczogMTUsCiAgbmxwczogMTQsCiAgc3dpdGNoRmxhZzogMQp9LCB7CiAgcWU6IDB4NTQwMSwKICBubXBzOiAxNiwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHg1MTAxLAogIG5tcHM6IDE3LAogIG5scHM6IDE1LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDQ4MDEsCiAgbm1wczogMTgsCiAgbmxwczogMTYsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MzgwMSwKICBubXBzOiAxOSwKICBubHBzOiAxNywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgzNDAxLAogIG5tcHM6IDIwLAogIG5scHM6IDE4LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDMwMDEsCiAgbm1wczogMjEsCiAgbmxwczogMTksCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MjgwMSwKICBubXBzOiAyMiwKICBubHBzOiAxOSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgyNDAxLAogIG5tcHM6IDIzLAogIG5scHM6IDIwLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDIyMDEsCiAgbm1wczogMjQsCiAgbmxwczogMjEsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MWMwMSwKICBubXBzOiAyNSwKICBubHBzOiAyMiwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxODAxLAogIG5tcHM6IDI2LAogIG5scHM6IDIzLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDE2MDEsCiAgbm1wczogMjcsCiAgbmxwczogMjQsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MTQwMSwKICBubXBzOiAyOCwKICBubHBzOiAyNSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxMjAxLAogIG5tcHM6IDI5LAogIG5scHM6IDI2LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDExMDEsCiAgbm1wczogMzAsCiAgbmxwczogMjcsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MGFjMSwKICBubXBzOiAzMSwKICBubHBzOiAyOCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwOWMxLAogIG5tcHM6IDMyLAogIG5scHM6IDI5LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDA4YTEsCiAgbm1wczogMzMsCiAgbmxwczogMzAsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDUyMSwKICBubXBzOiAzNCwKICBubHBzOiAzMSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwNDQxLAogIG5tcHM6IDM1LAogIG5scHM6IDMyLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAyYTEsCiAgbm1wczogMzYsCiAgbmxwczogMzMsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDIyMSwKICBubXBzOiAzNywKICBubHBzOiAzNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMTQxLAogIG5tcHM6IDM4LAogIG5scHM6IDM1LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAxMTEsCiAgbm1wczogMzksCiAgbmxwczogMzYsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDA4NSwKICBubXBzOiA0MCwKICBubHBzOiAzNywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMDQ5LAogIG5tcHM6IDQxLAogIG5scHM6IDM4LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAwMjUsCiAgbm1wczogNDIsCiAgbmxwczogMzksCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDAxNSwKICBubXBzOiA0MywKICBubHBzOiA0MCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMDA5LAogIG5tcHM6IDQ0LAogIG5scHM6IDQxLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAwMDUsCiAgbm1wczogNDUsCiAgbmxwczogNDIsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDAwMSwKICBubXBzOiA0NSwKICBubHBzOiA0MywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHg1NjAxLAogIG5tcHM6IDQ2LAogIG5scHM6IDQ2LAogIHN3aXRjaEZsYWc6IDAKfV07CmNsYXNzIEFyaXRobWV0aWNEZWNvZGVyIHsKICBjb25zdHJ1Y3RvcihkYXRhLCBzdGFydCwgZW5kKSB7CiAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgdGhpcy5icCA9IHN0YXJ0OwogICAgdGhpcy5kYXRhRW5kID0gZW5kOwogICAgdGhpcy5jaGlnaCA9IGRhdGFbc3RhcnRdOwogICAgdGhpcy5jbG93ID0gMDsKICAgIHRoaXMuYnl0ZUluKCk7CiAgICB0aGlzLmNoaWdoID0gdGhpcy5jaGlnaCA8PCA3ICYgMHhmZmZmIHwgdGhpcy5jbG93ID4+IDkgJiAweDdmOwogICAgdGhpcy5jbG93ID0gdGhpcy5jbG93IDw8IDcgJiAweGZmZmY7CiAgICB0aGlzLmN0IC09IDc7CiAgICB0aGlzLmEgPSAweDgwMDA7CiAgfQogIGJ5dGVJbigpIHsKICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CiAgICBsZXQgYnAgPSB0aGlzLmJwOwogICAgaWYgKGRhdGFbYnBdID09PSAweGZmKSB7CiAgICAgIGlmIChkYXRhW2JwICsgMV0gPiAweDhmKSB7CiAgICAgICAgdGhpcy5jbG93ICs9IDB4ZmYwMDsKICAgICAgICB0aGlzLmN0ID0gODsKICAgICAgfSBlbHNlIHsKICAgICAgICBicCsrOwogICAgICAgIHRoaXMuY2xvdyArPSBkYXRhW2JwXSA8PCA5OwogICAgICAgIHRoaXMuY3QgPSA3OwogICAgICAgIHRoaXMuYnAgPSBicDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYnArKzsKICAgICAgdGhpcy5jbG93ICs9IGJwIDwgdGhpcy5kYXRhRW5kID8gZGF0YVticF0gPDwgOCA6IDB4ZmYwMDsKICAgICAgdGhpcy5jdCA9IDg7CiAgICAgIHRoaXMuYnAgPSBicDsKICAgIH0KICAgIGlmICh0aGlzLmNsb3cgPiAweGZmZmYpIHsKICAgICAgdGhpcy5jaGlnaCArPSB0aGlzLmNsb3cgPj4gMTY7CiAgICAgIHRoaXMuY2xvdyAmPSAweGZmZmY7CiAgICB9CiAgfQogIHJlYWRCaXQoY29udGV4dHMsIHBvcykgewogICAgbGV0IGN4X2luZGV4ID0gY29udGV4dHNbcG9zXSA+PiAxLAogICAgICBjeF9tcHMgPSBjb250ZXh0c1twb3NdICYgMTsKICAgIGNvbnN0IHFlVGFibGVJY3ggPSBRZVRhYmxlW2N4X2luZGV4XTsKICAgIGNvbnN0IHFlSWN4ID0gcWVUYWJsZUljeC5xZTsKICAgIGxldCBkOwogICAgbGV0IGEgPSB0aGlzLmEgLSBxZUljeDsKICAgIGlmICh0aGlzLmNoaWdoIDwgcWVJY3gpIHsKICAgICAgaWYgKGEgPCBxZUljeCkgewogICAgICAgIGEgPSBxZUljeDsKICAgICAgICBkID0gY3hfbXBzOwogICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubXBzOwogICAgICB9IGVsc2UgewogICAgICAgIGEgPSBxZUljeDsKICAgICAgICBkID0gMSBeIGN4X21wczsKICAgICAgICBpZiAocWVUYWJsZUljeC5zd2l0Y2hGbGFnID09PSAxKSB7CiAgICAgICAgICBjeF9tcHMgPSBkOwogICAgICAgIH0KICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubmxwczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5jaGlnaCAtPSBxZUljeDsKICAgICAgaWYgKChhICYgMHg4MDAwKSAhPT0gMCkgewogICAgICAgIHRoaXMuYSA9IGE7CiAgICAgICAgcmV0dXJuIGN4X21wczsKICAgICAgfQogICAgICBpZiAoYSA8IHFlSWN4KSB7CiAgICAgICAgZCA9IDEgXiBjeF9tcHM7CiAgICAgICAgaWYgKHFlVGFibGVJY3guc3dpdGNoRmxhZyA9PT0gMSkgewogICAgICAgICAgY3hfbXBzID0gZDsKICAgICAgICB9CiAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5scHM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZCA9IGN4X21wczsKICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubm1wczsKICAgICAgfQogICAgfQogICAgZG8gewogICAgICBpZiAodGhpcy5jdCA9PT0gMCkgewogICAgICAgIHRoaXMuYnl0ZUluKCk7CiAgICAgIH0KICAgICAgYSA8PD0gMTsKICAgICAgdGhpcy5jaGlnaCA9IHRoaXMuY2hpZ2ggPDwgMSAmIDB4ZmZmZiB8IHRoaXMuY2xvdyA+PiAxNSAmIDE7CiAgICAgIHRoaXMuY2xvdyA9IHRoaXMuY2xvdyA8PCAxICYgMHhmZmZmOwogICAgICB0aGlzLmN0LS07CiAgICB9IHdoaWxlICgoYSAmIDB4ODAwMCkgPT09IDApOwogICAgdGhpcy5hID0gYTsKICAgIGNvbnRleHRzW3Bvc10gPSBjeF9pbmRleCA8PCAxIHwgY3hfbXBzOwogICAgcmV0dXJuIGQ7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9qYmlnMi5qcwoKCgoKY2xhc3MgSmJpZzJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiSmJpZzJFcnJvciIpOwogIH0KfQpjbGFzcyBDb250ZXh0Q2FjaGUgewogIGdldENvbnRleHRzKGlkKSB7CiAgICBpZiAoaWQgaW4gdGhpcykgewogICAgICByZXR1cm4gdGhpc1tpZF07CiAgICB9CiAgICByZXR1cm4gdGhpc1tpZF0gPSBuZXcgSW50OEFycmF5KDEgPDwgMTYpOwogIH0KfQpjbGFzcyBEZWNvZGluZ0NvbnRleHQgewogIGNvbnN0cnVjdG9yKGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CiAgICB0aGlzLmVuZCA9IGVuZDsKICB9CiAgZ2V0IGRlY29kZXIoKSB7CiAgICBjb25zdCBkZWNvZGVyID0gbmV3IEFyaXRobWV0aWNEZWNvZGVyKHRoaXMuZGF0YSwgdGhpcy5zdGFydCwgdGhpcy5lbmQpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZGVjb2RlciIsIGRlY29kZXIpOwogIH0KICBnZXQgY29udGV4dENhY2hlKCkgewogICAgY29uc3QgY2FjaGUgPSBuZXcgQ29udGV4dENhY2hlKCk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjb250ZXh0Q2FjaGUiLCBjYWNoZSk7CiAgfQp9CmZ1bmN0aW9uIGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBwcm9jZWR1cmUsIGRlY29kZXIpIHsKICBjb25zdCBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhwcm9jZWR1cmUpOwogIGxldCBwcmV2ID0gMTsKICBmdW5jdGlvbiByZWFkQml0cyhsZW5ndGgpIHsKICAgIGxldCB2ID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwcmV2KTsKICAgICAgcHJldiA9IHByZXYgPCAyNTYgPyBwcmV2IDw8IDEgfCBiaXQgOiAocHJldiA8PCAxIHwgYml0KSAmIDUxMSB8IDI1NjsKICAgICAgdiA9IHYgPDwgMSB8IGJpdDsKICAgIH0KICAgIHJldHVybiB2ID4+PiAwOwogIH0KICBjb25zdCBzaWduID0gcmVhZEJpdHMoMSk7CiAgY29uc3QgdmFsdWUgPSByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMSkgPyByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMzIpICsgNDQzNiA6IHJlYWRCaXRzKDEyKSArIDM0MCA6IHJlYWRCaXRzKDgpICsgODQgOiByZWFkQml0cyg2KSArIDIwIDogcmVhZEJpdHMoNCkgKyA0IDogcmVhZEJpdHMoMik7CiAgbGV0IHNpZ25lZFZhbHVlOwogIGlmIChzaWduID09PSAwKSB7CiAgICBzaWduZWRWYWx1ZSA9IHZhbHVlOwogIH0gZWxzZSBpZiAodmFsdWUgPiAwKSB7CiAgICBzaWduZWRWYWx1ZSA9IC12YWx1ZTsKICB9CiAgaWYgKHNpZ25lZFZhbHVlID49IE1JTl9JTlRfMzIgJiYgc2lnbmVkVmFsdWUgPD0gTUFYX0lOVF8zMikgewogICAgcmV0dXJuIHNpZ25lZFZhbHVlOwogIH0KICByZXR1cm4gbnVsbDsKfQpmdW5jdGlvbiBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2RlciwgY29kZUxlbmd0aCkgewogIGNvbnN0IGNvbnRleHRzID0gY29udGV4dENhY2hlLmdldENvbnRleHRzKCJJQUlEIik7CiAgbGV0IHByZXYgPSAxOwogIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZUxlbmd0aDsgaSsrKSB7CiAgICBjb25zdCBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHByZXYpOwogICAgcHJldiA9IHByZXYgPDwgMSB8IGJpdDsKICB9CiAgaWYgKGNvZGVMZW5ndGggPCAzMSkgewogICAgcmV0dXJuIHByZXYgJiAoMSA8PCBjb2RlTGVuZ3RoKSAtIDE7CiAgfQogIHJldHVybiBwcmV2ICYgMHg3ZmZmZmZmZjsKfQpjb25zdCBTZWdtZW50VHlwZXMgPSBbIlN5bWJvbERpY3Rpb25hcnkiLCBudWxsLCBudWxsLCBudWxsLCAiSW50ZXJtZWRpYXRlVGV4dFJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVUZXh0UmVnaW9uIiwgIkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJQYXR0ZXJuRGljdGlvbmFyeSIsIG51bGwsIG51bGwsIG51bGwsICJJbnRlcm1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIkludGVybWVkaWF0ZUdlbmVyaWNSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24iLCAiSW50ZXJtZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCAiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJQYWdlSW5mb3JtYXRpb24iLCAiRW5kT2ZQYWdlIiwgIkVuZE9mU3RyaXBlIiwgIkVuZE9mRmlsZSIsICJQcm9maWxlcyIsICJUYWJsZXMiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiRXh0ZW5zaW9uIl07CmNvbnN0IENvZGluZ1RlbXBsYXRlcyA9IFtbewogIHg6IC0xLAogIHk6IC0yCn0sIHsKICB4OiAwLAogIHk6IC0yCn0sIHsKICB4OiAxLAogIHk6IC0yCn0sIHsKICB4OiAtMiwKICB5OiAtMQp9LCB7CiAgeDogLTEsCiAgeTogLTEKfSwgewogIHg6IDAsCiAgeTogLTEKfSwgewogIHg6IDEsCiAgeTogLTEKfSwgewogIHg6IDIsCiAgeTogLTEKfSwgewogIHg6IC00LAogIHk6IDAKfSwgewogIHg6IC0zLAogIHk6IDAKfSwgewogIHg6IC0yLAogIHk6IDAKfSwgewogIHg6IC0xLAogIHk6IDAKfV0sIFt7CiAgeDogLTEsCiAgeTogLTIKfSwgewogIHg6IDAsCiAgeTogLTIKfSwgewogIHg6IDEsCiAgeTogLTIKfSwgewogIHg6IDIsCiAgeTogLTIKfSwgewogIHg6IC0yLAogIHk6IC0xCn0sIHsKICB4OiAtMSwKICB5OiAtMQp9LCB7CiAgeDogMCwKICB5OiAtMQp9LCB7CiAgeDogMSwKICB5OiAtMQp9LCB7CiAgeDogMiwKICB5OiAtMQp9LCB7CiAgeDogLTMsCiAgeTogMAp9LCB7CiAgeDogLTIsCiAgeTogMAp9LCB7CiAgeDogLTEsCiAgeTogMAp9XSwgW3sKICB4OiAtMSwKICB5OiAtMgp9LCB7CiAgeDogMCwKICB5OiAtMgp9LCB7CiAgeDogMSwKICB5OiAtMgp9LCB7CiAgeDogLTIsCiAgeTogLTEKfSwgewogIHg6IC0xLAogIHk6IC0xCn0sIHsKICB4OiAwLAogIHk6IC0xCn0sIHsKICB4OiAxLAogIHk6IC0xCn0sIHsKICB4OiAtMiwKICB5OiAwCn0sIHsKICB4OiAtMSwKICB5OiAwCn1dLCBbewogIHg6IC0zLAogIHk6IC0xCn0sIHsKICB4OiAtMiwKICB5OiAtMQp9LCB7CiAgeDogLTEsCiAgeTogLTEKfSwgewogIHg6IDAsCiAgeTogLTEKfSwgewogIHg6IDEsCiAgeTogLTEKfSwgewogIHg6IC00LAogIHk6IDAKfSwgewogIHg6IC0zLAogIHk6IDAKfSwgewogIHg6IC0yLAogIHk6IDAKfSwgewogIHg6IC0xLAogIHk6IDAKfV1dOwpjb25zdCBSZWZpbmVtZW50VGVtcGxhdGVzID0gW3sKICBjb2Rpbmc6IFt7CiAgICB4OiAwLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAxLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAtMSwKICAgIHk6IDAKICB9XSwKICByZWZlcmVuY2U6IFt7CiAgICB4OiAwLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAxLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAtMSwKICAgIHk6IDAKICB9LCB7CiAgICB4OiAwLAogICAgeTogMAogIH0sIHsKICAgIHg6IDEsCiAgICB5OiAwCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAxCiAgfSwgewogICAgeDogMCwKICAgIHk6IDEKICB9LCB7CiAgICB4OiAxLAogICAgeTogMQogIH1dCn0sIHsKICBjb2Rpbmc6IFt7CiAgICB4OiAtMSwKICAgIHk6IC0xCiAgfSwgewogICAgeDogMCwKICAgIHk6IC0xCiAgfSwgewogICAgeDogMSwKICAgIHk6IC0xCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAwCiAgfV0sCiAgcmVmZXJlbmNlOiBbewogICAgeDogMCwKICAgIHk6IC0xCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAwCiAgfSwgewogICAgeDogMCwKICAgIHk6IDAKICB9LCB7CiAgICB4OiAxLAogICAgeTogMAogIH0sIHsKICAgIHg6IDAsCiAgICB5OiAxCiAgfSwgewogICAgeDogMSwKICAgIHk6IDEKICB9XQp9XTsKY29uc3QgUmV1c2VkQ29udGV4dHMgPSBbMHg5YjI1LCAweDA3OTUsIDB4MDBlNSwgMHgwMTk1XTsKY29uc3QgUmVmaW5lbWVudFJldXNlZENvbnRleHRzID0gWzB4MDAyMCwgMHgwMDA4XTsKZnVuY3Rpb24gZGVjb2RlQml0bWFwVGVtcGxhdGUwKHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nQ29udGV4dCkgewogIGNvbnN0IGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKICBjb25zdCBjb250ZXh0cyA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoIkdCIik7CiAgY29uc3QgYml0bWFwID0gW107CiAgbGV0IGNvbnRleHRMYWJlbCwgaSwgaiwgcGl4ZWwsIHJvdywgcm93MSwgcm93MjsKICBjb25zdCBPTERfUElYRUxfTUFTSyA9IDB4N2JmNzsKICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIHJvdyA9IGJpdG1hcFtpXSA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKICAgIHJvdzEgPSBpIDwgMSA/IHJvdyA6IGJpdG1hcFtpIC0gMV07CiAgICByb3cyID0gaSA8IDIgPyByb3cgOiBiaXRtYXBbaSAtIDJdOwogICAgY29udGV4dExhYmVsID0gcm93MlswXSA8PCAxMyB8IHJvdzJbMV0gPDwgMTIgfCByb3cyWzJdIDw8IDExIHwgcm93MVswXSA8PCA3IHwgcm93MVsxXSA8PCA2IHwgcm93MVsyXSA8PCA1IHwgcm93MVszXSA8PCA0OwogICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKICAgICAgcm93W2pdID0gcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CiAgICAgIGNvbnRleHRMYWJlbCA9IChjb250ZXh0TGFiZWwgJiBPTERfUElYRUxfTUFTSykgPDwgMSB8IChqICsgMyA8IHdpZHRoID8gcm93MltqICsgM10gPDwgMTEgOiAwKSB8IChqICsgNCA8IHdpZHRoID8gcm93MVtqICsgNF0gPDwgNCA6IDApIHwgcGl4ZWw7CiAgICB9CiAgfQogIHJldHVybiBiaXRtYXA7Cn0KZnVuY3Rpb24gZGVjb2RlQml0bWFwKG1tciwgd2lkdGgsIGhlaWdodCwgdGVtcGxhdGVJbmRleCwgcHJlZGljdGlvbiwgc2tpcCwgYXQsIGRlY29kaW5nQ29udGV4dCkgewogIGlmIChtbXIpIHsKICAgIGNvbnN0IGlucHV0ID0gbmV3IFJlYWRlcihkZWNvZGluZ0NvbnRleHQuZGF0YSwgZGVjb2RpbmdDb250ZXh0LnN0YXJ0LCBkZWNvZGluZ0NvbnRleHQuZW5kKTsKICAgIHJldHVybiBkZWNvZGVNTVJCaXRtYXAoaW5wdXQsIHdpZHRoLCBoZWlnaHQsIGZhbHNlKTsKICB9CiAgaWYgKHRlbXBsYXRlSW5kZXggPT09IDAgJiYgIXNraXAgJiYgIXByZWRpY3Rpb24gJiYgYXQubGVuZ3RoID09PSA0ICYmIGF0WzBdLnggPT09IDMgJiYgYXRbMF0ueSA9PT0gLTEgJiYgYXRbMV0ueCA9PT0gLTMgJiYgYXRbMV0ueSA9PT0gLTEgJiYgYXRbMl0ueCA9PT0gMiAmJiBhdFsyXS55ID09PSAtMiAmJiBhdFszXS54ID09PSAtMiAmJiBhdFszXS55ID09PSAtMikgewogICAgcmV0dXJuIGRlY29kZUJpdG1hcFRlbXBsYXRlMCh3aWR0aCwgaGVpZ2h0LCBkZWNvZGluZ0NvbnRleHQpOwogIH0KICBjb25zdCB1c2Vza2lwID0gISFza2lwOwogIGNvbnN0IHRlbXBsYXRlID0gQ29kaW5nVGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLmNvbmNhdChhdCk7CiAgdGVtcGxhdGUuc29ydCgoYSwgYikgPT4gYS55IC0gYi55IHx8IGEueCAtIGIueCk7CiAgY29uc3QgdGVtcGxhdGVMZW5ndGggPSB0ZW1wbGF0ZS5sZW5ndGg7CiAgY29uc3QgdGVtcGxhdGVYID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7CiAgY29uc3QgdGVtcGxhdGVZID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7CiAgY29uc3QgY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMgPSBbXTsKICBsZXQgcmV1c2VNYXNrID0gMCwKICAgIG1pblggPSAwLAogICAgbWF4WCA9IDAsCiAgICBtaW5ZID0gMDsKICBsZXQgYywgazsKICBmb3IgKGsgPSAwOyBrIDwgdGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgdGVtcGxhdGVYW2tdID0gdGVtcGxhdGVba10ueDsKICAgIHRlbXBsYXRlWVtrXSA9IHRlbXBsYXRlW2tdLnk7CiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgdGVtcGxhdGVba10ueCk7CiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgdGVtcGxhdGVba10ueCk7CiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgdGVtcGxhdGVba10ueSk7CiAgICBpZiAoayA8IHRlbXBsYXRlTGVuZ3RoIC0gMSAmJiB0ZW1wbGF0ZVtrXS55ID09PSB0ZW1wbGF0ZVtrICsgMV0ueSAmJiB0ZW1wbGF0ZVtrXS54ID09PSB0ZW1wbGF0ZVtrICsgMV0ueCAtIDEpIHsKICAgICAgcmV1c2VNYXNrIHw9IDEgPDwgdGVtcGxhdGVMZW5ndGggLSAxIC0gazsKICAgIH0gZWxzZSB7CiAgICAgIGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzLnB1c2goayk7CiAgICB9CiAgfQogIGNvbnN0IGNoYW5naW5nRW50cmllc0xlbmd0aCA9IGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzLmxlbmd0aDsKICBjb25zdCBjaGFuZ2luZ1RlbXBsYXRlWCA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKICBjb25zdCBjaGFuZ2luZ1RlbXBsYXRlWSA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKICBjb25zdCBjaGFuZ2luZ1RlbXBsYXRlQml0ID0gbmV3IFVpbnQxNkFycmF5KGNoYW5naW5nRW50cmllc0xlbmd0aCk7CiAgZm9yIChjID0gMDsgYyA8IGNoYW5naW5nRW50cmllc0xlbmd0aDsgYysrKSB7CiAgICBrID0gY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXNbY107CiAgICBjaGFuZ2luZ1RlbXBsYXRlWFtjXSA9IHRlbXBsYXRlW2tdLng7CiAgICBjaGFuZ2luZ1RlbXBsYXRlWVtjXSA9IHRlbXBsYXRlW2tdLnk7CiAgICBjaGFuZ2luZ1RlbXBsYXRlQml0W2NdID0gMSA8PCB0ZW1wbGF0ZUxlbmd0aCAtIDEgLSBrOwogIH0KICBjb25zdCBzYmJfbGVmdCA9IC1taW5YOwogIGNvbnN0IHNiYl90b3AgPSAtbWluWTsKICBjb25zdCBzYmJfcmlnaHQgPSB3aWR0aCAtIG1heFg7CiAgY29uc3QgcHNldWRvUGl4ZWxDb250ZXh0ID0gUmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07CiAgbGV0IHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKICBjb25zdCBiaXRtYXAgPSBbXTsKICBjb25zdCBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CiAgY29uc3QgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHQiIpOwogIGxldCBsdHAgPSAwLAogICAgaiwKICAgIGkwLAogICAgajAsCiAgICBjb250ZXh0TGFiZWwgPSAwLAogICAgYml0LAogICAgc2hpZnQ7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgaWYgKHByZWRpY3Rpb24pIHsKICAgICAgY29uc3Qgc2x0cCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHNldWRvUGl4ZWxDb250ZXh0KTsKICAgICAgbHRwIF49IHNsdHA7CiAgICAgIGlmIChsdHApIHsKICAgICAgICBiaXRtYXAucHVzaChyb3cpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICB9CiAgICByb3cgPSBuZXcgVWludDhBcnJheShyb3cpOwogICAgYml0bWFwLnB1c2gocm93KTsKICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgIGlmICh1c2Vza2lwICYmIHNraXBbaV1bal0pIHsKICAgICAgICByb3dbal0gPSAwOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChqID49IHNiYl9sZWZ0ICYmIGogPCBzYmJfcmlnaHQgJiYgaSA+PSBzYmJfdG9wKSB7CiAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgJiByZXVzZU1hc2s7CiAgICAgICAgZm9yIChrID0gMDsgayA8IGNoYW5naW5nRW50cmllc0xlbmd0aDsgaysrKSB7CiAgICAgICAgICBpMCA9IGkgKyBjaGFuZ2luZ1RlbXBsYXRlWVtrXTsKICAgICAgICAgIGowID0gaiArIGNoYW5naW5nVGVtcGxhdGVYW2tdOwogICAgICAgICAgYml0ID0gYml0bWFwW2kwXVtqMF07CiAgICAgICAgICBpZiAoYml0KSB7CiAgICAgICAgICAgIGJpdCA9IGNoYW5naW5nVGVtcGxhdGVCaXRba107CiAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRleHRMYWJlbCA9IDA7CiAgICAgICAgc2hpZnQgPSB0ZW1wbGF0ZUxlbmd0aCAtIDE7CiAgICAgICAgZm9yIChrID0gMDsgayA8IHRlbXBsYXRlTGVuZ3RoOyBrKyssIHNoaWZ0LS0pIHsKICAgICAgICAgIGowID0gaiArIHRlbXBsYXRlWFtrXTsKICAgICAgICAgIGlmIChqMCA+PSAwICYmIGowIDwgd2lkdGgpIHsKICAgICAgICAgICAgaTAgPSBpICsgdGVtcGxhdGVZW2tdOwogICAgICAgICAgICBpZiAoaTAgPj0gMCkgewogICAgICAgICAgICAgIGJpdCA9IGJpdG1hcFtpMF1bajBdOwogICAgICAgICAgICAgIGlmIChiaXQpIHsKICAgICAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQgPDwgc2hpZnQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOwogICAgICByb3dbal0gPSBwaXhlbDsKICAgIH0KICB9CiAgcmV0dXJuIGJpdG1hcDsKfQpmdW5jdGlvbiBkZWNvZGVSZWZpbmVtZW50KHdpZHRoLCBoZWlnaHQsIHRlbXBsYXRlSW5kZXgsIHJlZmVyZW5jZUJpdG1hcCwgb2Zmc2V0WCwgb2Zmc2V0WSwgcHJlZGljdGlvbiwgYXQsIGRlY29kaW5nQ29udGV4dCkgewogIGxldCBjb2RpbmdUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0uY29kaW5nOwogIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7CiAgICBjb2RpbmdUZW1wbGF0ZSA9IGNvZGluZ1RlbXBsYXRlLmNvbmNhdChbYXRbMF1dKTsKICB9CiAgY29uc3QgY29kaW5nVGVtcGxhdGVMZW5ndGggPSBjb2RpbmdUZW1wbGF0ZS5sZW5ndGg7CiAgY29uc3QgY29kaW5nVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkoY29kaW5nVGVtcGxhdGVMZW5ndGgpOwogIGNvbnN0IGNvZGluZ1RlbXBsYXRlWSA9IG5ldyBJbnQzMkFycmF5KGNvZGluZ1RlbXBsYXRlTGVuZ3RoKTsKICBsZXQgazsKICBmb3IgKGsgPSAwOyBrIDwgY29kaW5nVGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgY29kaW5nVGVtcGxhdGVYW2tdID0gY29kaW5nVGVtcGxhdGVba10ueDsKICAgIGNvZGluZ1RlbXBsYXRlWVtrXSA9IGNvZGluZ1RlbXBsYXRlW2tdLnk7CiAgfQogIGxldCByZWZlcmVuY2VUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0ucmVmZXJlbmNlOwogIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7CiAgICByZWZlcmVuY2VUZW1wbGF0ZSA9IHJlZmVyZW5jZVRlbXBsYXRlLmNvbmNhdChbYXRbMV1dKTsKICB9CiAgY29uc3QgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGggPSByZWZlcmVuY2VUZW1wbGF0ZS5sZW5ndGg7CiAgY29uc3QgcmVmZXJlbmNlVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkocmVmZXJlbmNlVGVtcGxhdGVMZW5ndGgpOwogIGNvbnN0IHJlZmVyZW5jZVRlbXBsYXRlWSA9IG5ldyBJbnQzMkFycmF5KHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoKTsKICBmb3IgKGsgPSAwOyBrIDwgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgcmVmZXJlbmNlVGVtcGxhdGVYW2tdID0gcmVmZXJlbmNlVGVtcGxhdGVba10ueDsKICAgIHJlZmVyZW5jZVRlbXBsYXRlWVtrXSA9IHJlZmVyZW5jZVRlbXBsYXRlW2tdLnk7CiAgfQogIGNvbnN0IHJlZmVyZW5jZVdpZHRoID0gcmVmZXJlbmNlQml0bWFwWzBdLmxlbmd0aDsKICBjb25zdCByZWZlcmVuY2VIZWlnaHQgPSByZWZlcmVuY2VCaXRtYXAubGVuZ3RoOwogIGNvbnN0IHBzZXVkb1BpeGVsQ29udGV4dCA9IFJlZmluZW1lbnRSZXVzZWRDb250ZXh0c1t0ZW1wbGF0ZUluZGV4XTsKICBjb25zdCBiaXRtYXAgPSBbXTsKICBjb25zdCBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CiAgY29uc3QgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHUiIpOwogIGxldCBsdHAgPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIGlmIChwcmVkaWN0aW9uKSB7CiAgICAgIGNvbnN0IHNsdHAgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHBzZXVkb1BpeGVsQ29udGV4dCk7CiAgICAgIGx0cCBePSBzbHRwOwogICAgICBpZiAobHRwKSB7CiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInByZWRpY3Rpb24gaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICB9CiAgICB9CiAgICBjb25zdCByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CiAgICBiaXRtYXAucHVzaChyb3cpOwogICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgIGxldCBpMCwgajA7CiAgICAgIGxldCBjb250ZXh0TGFiZWwgPSAwOwogICAgICBmb3IgKGsgPSAwOyBrIDwgY29kaW5nVGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgICAgIGkwID0gaSArIGNvZGluZ1RlbXBsYXRlWVtrXTsKICAgICAgICBqMCA9IGogKyBjb2RpbmdUZW1wbGF0ZVhba107CiAgICAgICAgaWYgKGkwIDwgMCB8fCBqMCA8IDAgfHwgajAgPj0gd2lkdGgpIHsKICAgICAgICAgIGNvbnRleHRMYWJlbCA8PD0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgfCBiaXRtYXBbaTBdW2owXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChrID0gMDsgayA8IHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoOyBrKyspIHsKICAgICAgICBpMCA9IGkgKyByZWZlcmVuY2VUZW1wbGF0ZVlba10gLSBvZmZzZXRZOwogICAgICAgIGowID0gaiArIHJlZmVyZW5jZVRlbXBsYXRlWFtrXSAtIG9mZnNldFg7CiAgICAgICAgaWYgKGkwIDwgMCB8fCBpMCA+PSByZWZlcmVuY2VIZWlnaHQgfHwgajAgPCAwIHx8IGowID49IHJlZmVyZW5jZVdpZHRoKSB7CiAgICAgICAgICBjb250ZXh0TGFiZWwgPDw9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnRleHRMYWJlbCA9IGNvbnRleHRMYWJlbCA8PCAxIHwgcmVmZXJlbmNlQml0bWFwW2kwXVtqMF07CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOwogICAgICByb3dbal0gPSBwaXhlbDsKICAgIH0KICB9CiAgcmV0dXJuIGJpdG1hcDsKfQpmdW5jdGlvbiBkZWNvZGVTeW1ib2xEaWN0aW9uYXJ5KGh1ZmZtYW4sIHJlZmluZW1lbnQsIHN5bWJvbHMsIG51bWJlck9mTmV3U3ltYm9scywgbnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsIGh1ZmZtYW5UYWJsZXMsIHRlbXBsYXRlSW5kZXgsIGF0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIGh1ZmZtYW5JbnB1dCkgewogIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHsKICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJzeW1ib2wgcmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICBjb25zdCBuZXdTeW1ib2xzID0gW107CiAgbGV0IGN1cnJlbnRIZWlnaHQgPSAwOwogIGxldCBzeW1ib2xDb2RlTGVuZ3RoID0gbG9nMihzeW1ib2xzLmxlbmd0aCArIG51bWJlck9mTmV3U3ltYm9scyk7CiAgY29uc3QgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOwogIGNvbnN0IGNvbnRleHRDYWNoZSA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGU7CiAgbGV0IHRhYmxlQjEsIHN5bWJvbFdpZHRoczsKICBpZiAoaHVmZm1hbikgewogICAgdGFibGVCMSA9IGdldFN0YW5kYXJkVGFibGUoMSk7CiAgICBzeW1ib2xXaWR0aHMgPSBbXTsKICAgIHN5bWJvbENvZGVMZW5ndGggPSBNYXRoLm1heChzeW1ib2xDb2RlTGVuZ3RoLCAxKTsKICB9CiAgd2hpbGUgKG5ld1N5bWJvbHMubGVuZ3RoIDwgbnVtYmVyT2ZOZXdTeW1ib2xzKSB7CiAgICBjb25zdCBkZWx0YUhlaWdodCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFIZWlnaHQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBREgiLCBkZWNvZGVyKTsKICAgIGN1cnJlbnRIZWlnaHQgKz0gZGVsdGFIZWlnaHQ7CiAgICBsZXQgY3VycmVudFdpZHRoID0gMCwKICAgICAgdG90YWxXaWR0aCA9IDA7CiAgICBjb25zdCBmaXJzdFN5bWJvbCA9IGh1ZmZtYW4gPyBzeW1ib2xXaWR0aHMubGVuZ3RoIDogMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGNvbnN0IGRlbHRhV2lkdGggPSBodWZmbWFuID8gaHVmZm1hblRhYmxlcy50YWJsZURlbHRhV2lkdGguZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFciLCBkZWNvZGVyKTsKICAgICAgaWYgKGRlbHRhV2lkdGggPT09IG51bGwpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjdXJyZW50V2lkdGggKz0gZGVsdGFXaWR0aDsKICAgICAgdG90YWxXaWR0aCArPSBjdXJyZW50V2lkdGg7CiAgICAgIGxldCBiaXRtYXA7CiAgICAgIGlmIChyZWZpbmVtZW50KSB7CiAgICAgICAgY29uc3QgbnVtYmVyT2ZJbnN0YW5jZXMgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBQUkiLCBkZWNvZGVyKTsKICAgICAgICBpZiAobnVtYmVyT2ZJbnN0YW5jZXMgPiAxKSB7CiAgICAgICAgICBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKGh1ZmZtYW4sIHJlZmluZW1lbnQsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCwgMCwgbnVtYmVyT2ZJbnN0YW5jZXMsIDEsIHN5bWJvbHMuY29uY2F0KG5ld1N5bWJvbHMpLCBzeW1ib2xDb2RlTGVuZ3RoLCAwLCAwLCAxLCAwLCBodWZmbWFuVGFibGVzLCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIDAsIGh1ZmZtYW5JbnB1dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHN5bWJvbElkID0gZGVjb2RlSUFJRChjb250ZXh0Q2FjaGUsIGRlY29kZXIsIHN5bWJvbENvZGVMZW5ndGgpOwogICAgICAgICAgY29uc3QgcmR4ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWCIsIGRlY29kZXIpOwogICAgICAgICAgY29uc3QgcmR5ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWSIsIGRlY29kZXIpOwogICAgICAgICAgY29uc3Qgc3ltYm9sID0gc3ltYm9sSWQgPCBzeW1ib2xzLmxlbmd0aCA/IHN5bWJvbHNbc3ltYm9sSWRdIDogbmV3U3ltYm9sc1tzeW1ib2xJZCAtIHN5bWJvbHMubGVuZ3RoXTsKICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgc3ltYm9sLCByZHgsIHJkeSwgZmFsc2UsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgbmV3U3ltYm9scy5wdXNoKGJpdG1hcCk7CiAgICAgIH0gZWxzZSBpZiAoaHVmZm1hbikgewogICAgICAgIHN5bWJvbFdpZHRocy5wdXNoKGN1cnJlbnRXaWR0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYml0bWFwID0gZGVjb2RlQml0bWFwKGZhbHNlLCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQsIHRlbXBsYXRlSW5kZXgsIGZhbHNlLCBudWxsLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKICAgICAgICBuZXdTeW1ib2xzLnB1c2goYml0bWFwKTsKICAgICAgfQogICAgfQogICAgaWYgKGh1ZmZtYW4gJiYgIXJlZmluZW1lbnQpIHsKICAgICAgY29uc3QgYml0bWFwU2l6ZSA9IGh1ZmZtYW5UYWJsZXMudGFibGVCaXRtYXBTaXplLmRlY29kZShodWZmbWFuSW5wdXQpOwogICAgICBodWZmbWFuSW5wdXQuYnl0ZUFsaWduKCk7CiAgICAgIGxldCBjb2xsZWN0aXZlQml0bWFwOwogICAgICBpZiAoYml0bWFwU2l6ZSA9PT0gMCkgewogICAgICAgIGNvbGxlY3RpdmVCaXRtYXAgPSByZWFkVW5jb21wcmVzc2VkQml0bWFwKGh1ZmZtYW5JbnB1dCwgdG90YWxXaWR0aCwgY3VycmVudEhlaWdodCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3Qgb3JpZ2luYWxFbmQgPSBodWZmbWFuSW5wdXQuZW5kOwogICAgICAgIGNvbnN0IGJpdG1hcEVuZCA9IGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiArIGJpdG1hcFNpemU7CiAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IGJpdG1hcEVuZDsKICAgICAgICBjb2xsZWN0aXZlQml0bWFwID0gZGVjb2RlTU1SQml0bWFwKGh1ZmZtYW5JbnB1dCwgdG90YWxXaWR0aCwgY3VycmVudEhlaWdodCwgZmFsc2UpOwogICAgICAgIGh1ZmZtYW5JbnB1dC5lbmQgPSBvcmlnaW5hbEVuZDsKICAgICAgICBodWZmbWFuSW5wdXQucG9zaXRpb24gPSBiaXRtYXBFbmQ7CiAgICAgIH0KICAgICAgY29uc3QgbnVtYmVyT2ZTeW1ib2xzRGVjb2RlZCA9IHN5bWJvbFdpZHRocy5sZW5ndGg7CiAgICAgIGlmIChmaXJzdFN5bWJvbCA9PT0gbnVtYmVyT2ZTeW1ib2xzRGVjb2RlZCAtIDEpIHsKICAgICAgICBuZXdTeW1ib2xzLnB1c2goY29sbGVjdGl2ZUJpdG1hcCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IGksCiAgICAgICAgICB5LAogICAgICAgICAgeE1pbiA9IDAsCiAgICAgICAgICB4TWF4LAogICAgICAgICAgYml0bWFwV2lkdGgsCiAgICAgICAgICBzeW1ib2xCaXRtYXA7CiAgICAgICAgZm9yIChpID0gZmlyc3RTeW1ib2w7IGkgPCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkOyBpKyspIHsKICAgICAgICAgIGJpdG1hcFdpZHRoID0gc3ltYm9sV2lkdGhzW2ldOwogICAgICAgICAgeE1heCA9IHhNaW4gKyBiaXRtYXBXaWR0aDsKICAgICAgICAgIHN5bWJvbEJpdG1hcCA9IFtdOwogICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGN1cnJlbnRIZWlnaHQ7IHkrKykgewogICAgICAgICAgICBzeW1ib2xCaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTsKICAgICAgICAgIH0KICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChzeW1ib2xCaXRtYXApOwogICAgICAgICAgeE1pbiA9IHhNYXg7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGNvbnN0IGV4cG9ydGVkU3ltYm9scyA9IFtdLAogICAgZmxhZ3MgPSBbXTsKICBsZXQgY3VycmVudEZsYWcgPSBmYWxzZSwKICAgIGksCiAgICBpaTsKICBjb25zdCB0b3RhbFN5bWJvbHNMZW5ndGggPSBzeW1ib2xzLmxlbmd0aCArIG51bWJlck9mTmV3U3ltYm9sczsKICB3aGlsZSAoZmxhZ3MubGVuZ3RoIDwgdG90YWxTeW1ib2xzTGVuZ3RoKSB7CiAgICBsZXQgcnVuTGVuZ3RoID0gaHVmZm1hbiA/IHRhYmxlQjEuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRVgiLCBkZWNvZGVyKTsKICAgIHdoaWxlIChydW5MZW5ndGgtLSkgewogICAgICBmbGFncy5wdXNoKGN1cnJlbnRGbGFnKTsKICAgIH0KICAgIGN1cnJlbnRGbGFnID0gIWN1cnJlbnRGbGFnOwogIH0KICBmb3IgKGkgPSAwLCBpaSA9IHN5bWJvbHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgaWYgKGZsYWdzW2ldKSB7CiAgICAgIGV4cG9ydGVkU3ltYm9scy5wdXNoKHN5bWJvbHNbaV0pOwogICAgfQogIH0KICBmb3IgKGxldCBqID0gMDsgaiA8IG51bWJlck9mTmV3U3ltYm9sczsgaSsrLCBqKyspIHsKICAgIGlmIChmbGFnc1tpXSkgewogICAgICBleHBvcnRlZFN5bWJvbHMucHVzaChuZXdTeW1ib2xzW2pdKTsKICAgIH0KICB9CiAgcmV0dXJuIGV4cG9ydGVkU3ltYm9sczsKfQpmdW5jdGlvbiBkZWNvZGVUZXh0UmVnaW9uKGh1ZmZtYW4sIHJlZmluZW1lbnQsIHdpZHRoLCBoZWlnaHQsIGRlZmF1bHRQaXhlbFZhbHVlLCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcywgc3RyaXBTaXplLCBpbnB1dFN5bWJvbHMsIHN5bWJvbENvZGVMZW5ndGgsIHRyYW5zcG9zZWQsIGRzT2Zmc2V0LCByZWZlcmVuY2VDb3JuZXIsIGNvbWJpbmF0aW9uT3BlcmF0b3IsIGh1ZmZtYW5UYWJsZXMsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgbG9nU3RyaXBTaXplLCBodWZmbWFuSW5wdXQpIHsKICBpZiAoaHVmZm1hbiAmJiByZWZpbmVtZW50KSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigicmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICBjb25zdCBiaXRtYXAgPSBbXTsKICBsZXQgaSwgcm93OwogIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOwogICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7CiAgICAgIHJvdy5maWxsKGRlZmF1bHRQaXhlbFZhbHVlKTsKICAgIH0KICAgIGJpdG1hcC5wdXNoKHJvdyk7CiAgfQogIGNvbnN0IGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKICBjb25zdCBjb250ZXh0Q2FjaGUgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlOwogIGxldCBzdHJpcFQgPSBodWZmbWFuID8gLWh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiAtZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQURUIiwgZGVjb2Rlcik7CiAgbGV0IGZpcnN0UyA9IDA7CiAgaSA9IDA7CiAgd2hpbGUgKGkgPCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcykgewogICAgY29uc3QgZGVsdGFUID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFQiLCBkZWNvZGVyKTsKICAgIHN0cmlwVCArPSBkZWx0YVQ7CiAgICBjb25zdCBkZWx0YUZpcnN0UyA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRmlyc3RTLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQUZTIiwgZGVjb2Rlcik7CiAgICBmaXJzdFMgKz0gZGVsdGFGaXJzdFM7CiAgICBsZXQgY3VycmVudFMgPSBmaXJzdFM7CiAgICBkbyB7CiAgICAgIGxldCBjdXJyZW50VCA9IDA7CiAgICAgIGlmIChzdHJpcFNpemUgPiAxKSB7CiAgICAgICAgY3VycmVudFQgPSBodWZmbWFuID8gaHVmZm1hbklucHV0LnJlYWRCaXRzKGxvZ1N0cmlwU2l6ZSkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBSVQiLCBkZWNvZGVyKTsKICAgICAgfQogICAgICBjb25zdCB0ID0gc3RyaXBTaXplICogc3RyaXBUICsgY3VycmVudFQ7CiAgICAgIGNvbnN0IHN5bWJvbElkID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMuc3ltYm9sSURUYWJsZS5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBzeW1ib2xDb2RlTGVuZ3RoKTsKICAgICAgY29uc3QgYXBwbHlSZWZpbmVtZW50ID0gcmVmaW5lbWVudCAmJiAoaHVmZm1hbiA/IGh1ZmZtYW5JbnB1dC5yZWFkQml0KCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkkiLCBkZWNvZGVyKSk7CiAgICAgIGxldCBzeW1ib2xCaXRtYXAgPSBpbnB1dFN5bWJvbHNbc3ltYm9sSWRdOwogICAgICBsZXQgc3ltYm9sV2lkdGggPSBzeW1ib2xCaXRtYXBbMF0ubGVuZ3RoOwogICAgICBsZXQgc3ltYm9sSGVpZ2h0ID0gc3ltYm9sQml0bWFwLmxlbmd0aDsKICAgICAgaWYgKGFwcGx5UmVmaW5lbWVudCkgewogICAgICAgIGNvbnN0IHJkdyA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFciLCBkZWNvZGVyKTsKICAgICAgICBjb25zdCByZGggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRIIiwgZGVjb2Rlcik7CiAgICAgICAgY29uc3QgcmR4ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWCIsIGRlY29kZXIpOwogICAgICAgIGNvbnN0IHJkeSA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFkiLCBkZWNvZGVyKTsKICAgICAgICBzeW1ib2xXaWR0aCArPSByZHc7CiAgICAgICAgc3ltYm9sSGVpZ2h0ICs9IHJkaDsKICAgICAgICBzeW1ib2xCaXRtYXAgPSBkZWNvZGVSZWZpbmVtZW50KHN5bWJvbFdpZHRoLCBzeW1ib2xIZWlnaHQsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCBzeW1ib2xCaXRtYXAsIChyZHcgPj4gMSkgKyByZHgsIChyZGggPj4gMSkgKyByZHksIGZhbHNlLCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCk7CiAgICAgIH0KICAgICAgbGV0IGluY3JlbWVudCA9IDA7CiAgICAgIGlmICghdHJhbnNwb3NlZCkgewogICAgICAgIGlmIChyZWZlcmVuY2VDb3JuZXIgPiAxKSB7CiAgICAgICAgICBjdXJyZW50UyArPSBzeW1ib2xXaWR0aCAtIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluY3JlbWVudCA9IHN5bWJvbFdpZHRoIC0gMTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIShyZWZlcmVuY2VDb3JuZXIgJiAxKSkgewogICAgICAgIGN1cnJlbnRTICs9IHN5bWJvbEhlaWdodCAtIDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5jcmVtZW50ID0gc3ltYm9sSGVpZ2h0IC0gMTsKICAgICAgfQogICAgICBjb25zdCBvZmZzZXRUID0gdCAtIChyZWZlcmVuY2VDb3JuZXIgJiAxID8gMCA6IHN5bWJvbEhlaWdodCAtIDEpOwogICAgICBjb25zdCBvZmZzZXRTID0gY3VycmVudFMgLSAocmVmZXJlbmNlQ29ybmVyICYgMiA/IHN5bWJvbFdpZHRoIC0gMSA6IDApOwogICAgICBsZXQgczIsIHQyLCBzeW1ib2xSb3c7CiAgICAgIGlmICh0cmFuc3Bvc2VkKSB7CiAgICAgICAgZm9yIChzMiA9IDA7IHMyIDwgc3ltYm9sSGVpZ2h0OyBzMisrKSB7CiAgICAgICAgICByb3cgPSBiaXRtYXBbb2Zmc2V0UyArIHMyXTsKICAgICAgICAgIGlmICghcm93KSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgc3ltYm9sUm93ID0gc3ltYm9sQml0bWFwW3MyXTsKICAgICAgICAgIGNvbnN0IG1heFdpZHRoID0gTWF0aC5taW4od2lkdGggLSBvZmZzZXRULCBzeW1ib2xXaWR0aCk7CiAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IG1heFdpZHRoOyB0MisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0VCArIHQyXSB8PSBzeW1ib2xSb3dbdDJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IG1heFdpZHRoOyB0MisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0VCArIHQyXSBePSBzeW1ib2xSb3dbdDJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAodDIgPSAwOyB0MiA8IHN5bWJvbEhlaWdodDsgdDIrKykgewogICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFQgKyB0Ml07CiAgICAgICAgICBpZiAoIXJvdykgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFt0Ml07CiAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSB8PSBzeW1ib2xSb3dbczJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSBePSBzeW1ib2xSb3dbczJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGkrKzsKICAgICAgY29uc3QgZGVsdGFTID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVMuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFMiLCBkZWNvZGVyKTsKICAgICAgaWYgKGRlbHRhUyA9PT0gbnVsbCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGN1cnJlbnRTICs9IGluY3JlbWVudCArIGRlbHRhUyArIGRzT2Zmc2V0OwogICAgfSB3aGlsZSAodHJ1ZSk7CiAgfQogIHJldHVybiBiaXRtYXA7Cn0KZnVuY3Rpb24gZGVjb2RlUGF0dGVybkRpY3Rpb25hcnkobW1yLCBwYXR0ZXJuV2lkdGgsIHBhdHRlcm5IZWlnaHQsIG1heFBhdHRlcm5JbmRleCwgdGVtcGxhdGUsIGRlY29kaW5nQ29udGV4dCkgewogIGNvbnN0IGF0ID0gW107CiAgaWYgKCFtbXIpIHsKICAgIGF0LnB1c2goewogICAgICB4OiAtcGF0dGVybldpZHRoLAogICAgICB5OiAwCiAgICB9KTsKICAgIGlmICh0ZW1wbGF0ZSA9PT0gMCkgewogICAgICBhdC5wdXNoKHsKICAgICAgICB4OiAtMywKICAgICAgICB5OiAtMQogICAgICB9LCB7CiAgICAgICAgeDogMiwKICAgICAgICB5OiAtMgogICAgICB9LCB7CiAgICAgICAgeDogLTIsCiAgICAgICAgeTogLTIKICAgICAgfSk7CiAgICB9CiAgfQogIGNvbnN0IGNvbGxlY3RpdmVXaWR0aCA9IChtYXhQYXR0ZXJuSW5kZXggKyAxKSAqIHBhdHRlcm5XaWR0aDsKICBjb25zdCBjb2xsZWN0aXZlQml0bWFwID0gZGVjb2RlQml0bWFwKG1tciwgY29sbGVjdGl2ZVdpZHRoLCBwYXR0ZXJuSGVpZ2h0LCB0ZW1wbGF0ZSwgZmFsc2UsIG51bGwsIGF0LCBkZWNvZGluZ0NvbnRleHQpOwogIGNvbnN0IHBhdHRlcm5zID0gW107CiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbWF4UGF0dGVybkluZGV4OyBpKyspIHsKICAgIGNvbnN0IHBhdHRlcm5CaXRtYXAgPSBbXTsKICAgIGNvbnN0IHhNaW4gPSBwYXR0ZXJuV2lkdGggKiBpOwogICAgY29uc3QgeE1heCA9IHhNaW4gKyBwYXR0ZXJuV2lkdGg7CiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHBhdHRlcm5IZWlnaHQ7IHkrKykgewogICAgICBwYXR0ZXJuQml0bWFwLnB1c2goY29sbGVjdGl2ZUJpdG1hcFt5XS5zdWJhcnJheSh4TWluLCB4TWF4KSk7CiAgICB9CiAgICBwYXR0ZXJucy5wdXNoKHBhdHRlcm5CaXRtYXApOwogIH0KICByZXR1cm4gcGF0dGVybnM7Cn0KZnVuY3Rpb24gZGVjb2RlSGFsZnRvbmVSZWdpb24obW1yLCBwYXR0ZXJucywgdGVtcGxhdGUsIHJlZ2lvbldpZHRoLCByZWdpb25IZWlnaHQsIGRlZmF1bHRQaXhlbFZhbHVlLCBlbmFibGVTa2lwLCBjb21iaW5hdGlvbk9wZXJhdG9yLCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIGdyaWRPZmZzZXRYLCBncmlkT2Zmc2V0WSwgZ3JpZFZlY3RvclgsIGdyaWRWZWN0b3JZLCBkZWNvZGluZ0NvbnRleHQpIHsKICBjb25zdCBza2lwID0gbnVsbDsKICBpZiAoZW5hYmxlU2tpcCkgewogICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNraXAgaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICBpZiAoY29tYmluYXRpb25PcGVyYXRvciAhPT0gMCkgewogICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoYG9wZXJhdG9yICIke2NvbWJpbmF0aW9uT3BlcmF0b3J9IiBpcyBub3Qgc3VwcG9ydGVkIGluIGhhbGZ0b25lIHJlZ2lvbmApOwogIH0KICBjb25zdCByZWdpb25CaXRtYXAgPSBbXTsKICBsZXQgaSwgaiwgcm93OwogIGZvciAoaSA9IDA7IGkgPCByZWdpb25IZWlnaHQ7IGkrKykgewogICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkocmVnaW9uV2lkdGgpOwogICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7CiAgICAgIHJvdy5maWxsKGRlZmF1bHRQaXhlbFZhbHVlKTsKICAgIH0KICAgIHJlZ2lvbkJpdG1hcC5wdXNoKHJvdyk7CiAgfQogIGNvbnN0IG51bWJlck9mUGF0dGVybnMgPSBwYXR0ZXJucy5sZW5ndGg7CiAgY29uc3QgcGF0dGVybjAgPSBwYXR0ZXJuc1swXTsKICBjb25zdCBwYXR0ZXJuV2lkdGggPSBwYXR0ZXJuMFswXS5sZW5ndGgsCiAgICBwYXR0ZXJuSGVpZ2h0ID0gcGF0dGVybjAubGVuZ3RoOwogIGNvbnN0IGJpdHNQZXJWYWx1ZSA9IGxvZzIobnVtYmVyT2ZQYXR0ZXJucyk7CiAgY29uc3QgYXQgPSBbXTsKICBpZiAoIW1tcikgewogICAgYXQucHVzaCh7CiAgICAgIHg6IHRlbXBsYXRlIDw9IDEgPyAzIDogMiwKICAgICAgeTogLTEKICAgIH0pOwogICAgaWYgKHRlbXBsYXRlID09PSAwKSB7CiAgICAgIGF0LnB1c2goewogICAgICAgIHg6IC0zLAogICAgICAgIHk6IC0xCiAgICAgIH0sIHsKICAgICAgICB4OiAyLAogICAgICAgIHk6IC0yCiAgICAgIH0sIHsKICAgICAgICB4OiAtMiwKICAgICAgICB5OiAtMgogICAgICB9KTsKICAgIH0KICB9CiAgY29uc3QgZ3JheVNjYWxlQml0UGxhbmVzID0gW107CiAgbGV0IG1tcklucHV0LCBiaXRtYXA7CiAgaWYgKG1tcikgewogICAgbW1ySW5wdXQgPSBuZXcgUmVhZGVyKGRlY29kaW5nQ29udGV4dC5kYXRhLCBkZWNvZGluZ0NvbnRleHQuc3RhcnQsIGRlY29kaW5nQ29udGV4dC5lbmQpOwogIH0KICBmb3IgKGkgPSBiaXRzUGVyVmFsdWUgLSAxOyBpID49IDA7IGktLSkgewogICAgaWYgKG1tcikgewogICAgICBiaXRtYXAgPSBkZWNvZGVNTVJCaXRtYXAobW1ySW5wdXQsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBiaXRtYXAgPSBkZWNvZGVCaXRtYXAoZmFsc2UsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdGVtcGxhdGUsIGZhbHNlLCBza2lwLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKICAgIH0KICAgIGdyYXlTY2FsZUJpdFBsYW5lc1tpXSA9IGJpdG1hcDsKICB9CiAgbGV0IG1nLCBuZywgYml0LCBwYXR0ZXJuSW5kZXgsIHBhdHRlcm5CaXRtYXAsIHgsIHksIHBhdHRlcm5Sb3csIHJlZ2lvblJvdzsKICBmb3IgKG1nID0gMDsgbWcgPCBncmlkSGVpZ2h0OyBtZysrKSB7CiAgICBmb3IgKG5nID0gMDsgbmcgPCBncmlkV2lkdGg7IG5nKyspIHsKICAgICAgYml0ID0gMDsKICAgICAgcGF0dGVybkluZGV4ID0gMDsKICAgICAgZm9yIChqID0gYml0c1BlclZhbHVlIC0gMTsgaiA+PSAwOyBqLS0pIHsKICAgICAgICBiaXQgXj0gZ3JheVNjYWxlQml0UGxhbmVzW2pdW21nXVtuZ107CiAgICAgICAgcGF0dGVybkluZGV4IHw9IGJpdCA8PCBqOwogICAgICB9CiAgICAgIHBhdHRlcm5CaXRtYXAgPSBwYXR0ZXJuc1twYXR0ZXJuSW5kZXhdOwogICAgICB4ID0gZ3JpZE9mZnNldFggKyBtZyAqIGdyaWRWZWN0b3JZICsgbmcgKiBncmlkVmVjdG9yWCA+PiA4OwogICAgICB5ID0gZ3JpZE9mZnNldFkgKyBtZyAqIGdyaWRWZWN0b3JYIC0gbmcgKiBncmlkVmVjdG9yWSA+PiA4OwogICAgICBpZiAoeCA+PSAwICYmIHggKyBwYXR0ZXJuV2lkdGggPD0gcmVnaW9uV2lkdGggJiYgeSA+PSAwICYmIHkgKyBwYXR0ZXJuSGVpZ2h0IDw9IHJlZ2lvbkhlaWdodCkgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHsKICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFt5ICsgaV07CiAgICAgICAgICBwYXR0ZXJuUm93ID0gcGF0dGVybkJpdG1hcFtpXTsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXR0ZXJuV2lkdGg7IGorKykgewogICAgICAgICAgICByZWdpb25Sb3dbeCArIGpdIHw9IHBhdHRlcm5Sb3dbal07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGxldCByZWdpb25YLCByZWdpb25ZOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHsKICAgICAgICAgIHJlZ2lvblkgPSB5ICsgaTsKICAgICAgICAgIGlmIChyZWdpb25ZIDwgMCB8fCByZWdpb25ZID49IHJlZ2lvbkhlaWdodCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFtyZWdpb25ZXTsKICAgICAgICAgIHBhdHRlcm5Sb3cgPSBwYXR0ZXJuQml0bWFwW2ldOwogICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdHRlcm5XaWR0aDsgaisrKSB7CiAgICAgICAgICAgIHJlZ2lvblggPSB4ICsgajsKICAgICAgICAgICAgaWYgKHJlZ2lvblggPj0gMCAmJiByZWdpb25YIDwgcmVnaW9uV2lkdGgpIHsKICAgICAgICAgICAgICByZWdpb25Sb3dbcmVnaW9uWF0gfD0gcGF0dGVyblJvd1tqXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gcmVnaW9uQml0bWFwOwp9CmZ1bmN0aW9uIHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHN0YXJ0KSB7CiAgY29uc3Qgc2VnbWVudEhlYWRlciA9IHt9OwogIHNlZ21lbnRIZWFkZXIubnVtYmVyID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCk7CiAgY29uc3QgZmxhZ3MgPSBkYXRhW3N0YXJ0ICsgNF07CiAgY29uc3Qgc2VnbWVudFR5cGUgPSBmbGFncyAmIDB4M2Y7CiAgaWYgKCFTZWdtZW50VHlwZXNbc2VnbWVudFR5cGVdKSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBzZWdtZW50IHR5cGU6ICIgKyBzZWdtZW50VHlwZSk7CiAgfQogIHNlZ21lbnRIZWFkZXIudHlwZSA9IHNlZ21lbnRUeXBlOwogIHNlZ21lbnRIZWFkZXIudHlwZU5hbWUgPSBTZWdtZW50VHlwZXNbc2VnbWVudFR5cGVdOwogIHNlZ21lbnRIZWFkZXIuZGVmZXJyZWROb25SZXRhaW4gPSAhIShmbGFncyAmIDB4ODApOwogIGNvbnN0IHBhZ2VBc3NvY2lhdGlvbkZpZWxkU2l6ZSA9ICEhKGZsYWdzICYgMHg0MCk7CiAgY29uc3QgcmVmZXJyZWRGbGFncyA9IGRhdGFbc3RhcnQgKyA1XTsKICBsZXQgcmVmZXJyZWRUb0NvdW50ID0gcmVmZXJyZWRGbGFncyA+PiA1ICYgNzsKICBjb25zdCByZXRhaW5CaXRzID0gW3JlZmVycmVkRmxhZ3MgJiAzMV07CiAgbGV0IHBvc2l0aW9uID0gc3RhcnQgKyA2OwogIGlmIChyZWZlcnJlZEZsYWdzID09PSA3KSB7CiAgICByZWZlcnJlZFRvQ291bnQgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uIC0gMSkgJiAweDFmZmZmZmZmOwogICAgcG9zaXRpb24gKz0gMzsKICAgIGxldCBieXRlcyA9IHJlZmVycmVkVG9Db3VudCArIDcgPj4gMzsKICAgIHJldGFpbkJpdHNbMF0gPSBkYXRhW3Bvc2l0aW9uKytdOwogICAgd2hpbGUgKC0tYnl0ZXMgPiAwKSB7CiAgICAgIHJldGFpbkJpdHMucHVzaChkYXRhW3Bvc2l0aW9uKytdKTsKICAgIH0KICB9IGVsc2UgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDUgfHwgcmVmZXJyZWRGbGFncyA9PT0gNikgewogICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgcmVmZXJyZWQtdG8gZmxhZ3MiKTsKICB9CiAgc2VnbWVudEhlYWRlci5yZXRhaW5CaXRzID0gcmV0YWluQml0czsKICBsZXQgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gNDsKICBpZiAoc2VnbWVudEhlYWRlci5udW1iZXIgPD0gMjU2KSB7CiAgICByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSAxOwogIH0gZWxzZSBpZiAoc2VnbWVudEhlYWRlci5udW1iZXIgPD0gNjU1MzYpIHsKICAgIHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9IDI7CiAgfQogIGNvbnN0IHJlZmVycmVkVG8gPSBbXTsKICBsZXQgaSwgaWk7CiAgZm9yIChpID0gMDsgaSA8IHJlZmVycmVkVG9Db3VudDsgaSsrKSB7CiAgICBsZXQgbnVtYmVyOwogICAgaWYgKHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9PT0gMSkgewogICAgICBudW1iZXIgPSBkYXRhW3Bvc2l0aW9uXTsKICAgIH0gZWxzZSBpZiAocmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID09PSAyKSB7CiAgICAgIG51bWJlciA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgbnVtYmVyID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7CiAgICB9CiAgICByZWZlcnJlZFRvLnB1c2gobnVtYmVyKTsKICAgIHBvc2l0aW9uICs9IHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZTsKICB9CiAgc2VnbWVudEhlYWRlci5yZWZlcnJlZFRvID0gcmVmZXJyZWRUbzsKICBpZiAoIXBhZ2VBc3NvY2lhdGlvbkZpZWxkU2l6ZSkgewogICAgc2VnbWVudEhlYWRlci5wYWdlQXNzb2NpYXRpb24gPSBkYXRhW3Bvc2l0aW9uKytdOwogIH0gZWxzZSB7CiAgICBzZWdtZW50SGVhZGVyLnBhZ2VBc3NvY2lhdGlvbiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pOwogICAgcG9zaXRpb24gKz0gNDsKICB9CiAgc2VnbWVudEhlYWRlci5sZW5ndGggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICBwb3NpdGlvbiArPSA0OwogIGlmIChzZWdtZW50SGVhZGVyLmxlbmd0aCA9PT0gMHhmZmZmZmZmZikgewogICAgaWYgKHNlZ21lbnRUeXBlID09PSAzOCkgewogICAgICBjb25zdCBnZW5lcmljUmVnaW9uSW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOwogICAgICBjb25zdCBnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzID0gZGF0YVtwb3NpdGlvbiArIFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoXTsKICAgICAgY29uc3QgZ2VuZXJpY1JlZ2lvbk1tciA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKICAgICAgY29uc3Qgc2VhcmNoUGF0dGVybkxlbmd0aCA9IDY7CiAgICAgIGNvbnN0IHNlYXJjaFBhdHRlcm4gPSBuZXcgVWludDhBcnJheShzZWFyY2hQYXR0ZXJuTGVuZ3RoKTsKICAgICAgaWYgKCFnZW5lcmljUmVnaW9uTW1yKSB7CiAgICAgICAgc2VhcmNoUGF0dGVyblswXSA9IDB4ZmY7CiAgICAgICAgc2VhcmNoUGF0dGVyblsxXSA9IDB4YWM7CiAgICAgIH0KICAgICAgc2VhcmNoUGF0dGVyblsyXSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+Pj4gMjQgJiAweGZmOwogICAgICBzZWFyY2hQYXR0ZXJuWzNdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+IDE2ICYgMHhmZjsKICAgICAgc2VhcmNoUGF0dGVybls0XSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+PiA4ICYgMHhmZjsKICAgICAgc2VhcmNoUGF0dGVybls1XSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCAmIDB4ZmY7CiAgICAgIGZvciAoaSA9IHBvc2l0aW9uLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGxldCBqID0gMDsKICAgICAgICB3aGlsZSAoaiA8IHNlYXJjaFBhdHRlcm5MZW5ndGggJiYgc2VhcmNoUGF0dGVybltqXSA9PT0gZGF0YVtpICsgal0pIHsKICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICAgICAgaWYgKGogPT09IHNlYXJjaFBhdHRlcm5MZW5ndGgpIHsKICAgICAgICAgIHNlZ21lbnRIZWFkZXIubGVuZ3RoID0gaSArIHNlYXJjaFBhdHRlcm5MZW5ndGg7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHNlZ21lbnRIZWFkZXIubGVuZ3RoID09PSAweGZmZmZmZmZmKSB7CiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNlZ21lbnQgZW5kIHdhcyBub3QgZm91bmQiKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgdW5rbm93biBzZWdtZW50IGxlbmd0aCIpOwogICAgfQogIH0KICBzZWdtZW50SGVhZGVyLmhlYWRlckVuZCA9IHBvc2l0aW9uOwogIHJldHVybiBzZWdtZW50SGVhZGVyOwp9CmZ1bmN0aW9uIHJlYWRTZWdtZW50cyhoZWFkZXIsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKICBjb25zdCBzZWdtZW50cyA9IFtdOwogIGxldCBwb3NpdGlvbiA9IHN0YXJ0OwogIHdoaWxlIChwb3NpdGlvbiA8IGVuZCkgewogICAgY29uc3Qgc2VnbWVudEhlYWRlciA9IHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHBvc2l0aW9uKTsKICAgIHBvc2l0aW9uID0gc2VnbWVudEhlYWRlci5oZWFkZXJFbmQ7CiAgICBjb25zdCBzZWdtZW50ID0gewogICAgICBoZWFkZXI6IHNlZ21lbnRIZWFkZXIsCiAgICAgIGRhdGEKICAgIH07CiAgICBpZiAoIWhlYWRlci5yYW5kb21BY2Nlc3MpIHsKICAgICAgc2VnbWVudC5zdGFydCA9IHBvc2l0aW9uOwogICAgICBwb3NpdGlvbiArPSBzZWdtZW50SGVhZGVyLmxlbmd0aDsKICAgICAgc2VnbWVudC5lbmQgPSBwb3NpdGlvbjsKICAgIH0KICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7CiAgICBpZiAoc2VnbWVudEhlYWRlci50eXBlID09PSA1MSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGhlYWRlci5yYW5kb21BY2Nlc3MpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgc2VnbWVudHNbaV0uc3RhcnQgPSBwb3NpdGlvbjsKICAgICAgcG9zaXRpb24gKz0gc2VnbWVudHNbaV0uaGVhZGVyLmxlbmd0aDsKICAgICAgc2VnbWVudHNbaV0uZW5kID0gcG9zaXRpb247CiAgICB9CiAgfQogIHJldHVybiBzZWdtZW50czsKfQpmdW5jdGlvbiByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHN0YXJ0KSB7CiAgcmV0dXJuIHsKICAgIHdpZHRoOiByZWFkVWludDMyKGRhdGEsIHN0YXJ0KSwKICAgIGhlaWdodDogcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDQpLAogICAgeDogcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDgpLAogICAgeTogcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDEyKSwKICAgIGNvbWJpbmF0aW9uT3BlcmF0b3I6IGRhdGFbc3RhcnQgKyAxNl0gJiA3CiAgfTsKfQpjb25zdCBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aCA9IDE3OwpmdW5jdGlvbiBwcm9jZXNzU2VnbWVudChzZWdtZW50LCB2aXNpdG9yKSB7CiAgY29uc3QgaGVhZGVyID0gc2VnbWVudC5oZWFkZXI7CiAgY29uc3QgZGF0YSA9IHNlZ21lbnQuZGF0YSwKICAgIGVuZCA9IHNlZ21lbnQuZW5kOwogIGxldCBwb3NpdGlvbiA9IHNlZ21lbnQuc3RhcnQ7CiAgbGV0IGFyZ3MsIGF0LCBpLCBhdExlbmd0aDsKICBzd2l0Y2ggKGhlYWRlci50eXBlKSB7CiAgICBjYXNlIDA6CiAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB7fTsKICAgICAgY29uc3QgZGljdGlvbmFyeUZsYWdzID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7CiAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbiA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDEpOwogICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAyKTsKICAgICAgZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiAyICYgMzsKICAgICAgZGljdGlvbmFyeS5odWZmbWFuRFdTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA0ICYgMzsKICAgICAgZGljdGlvbmFyeS5iaXRtYXBTaXplU2VsZWN0b3IgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gNiAmIDE7CiAgICAgIGRpY3Rpb25hcnkuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA3ICYgMTsKICAgICAgZGljdGlvbmFyeS5iaXRtYXBDb2RpbmdDb250ZXh0VXNlZCA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDI1Nik7CiAgICAgIGRpY3Rpb25hcnkuYml0bWFwQ29kaW5nQ29udGV4dFJldGFpbmVkID0gISEoZGljdGlvbmFyeUZsYWdzICYgNTEyKTsKICAgICAgZGljdGlvbmFyeS50ZW1wbGF0ZSA9IGRpY3Rpb25hcnlGbGFncyA+PiAxMCAmIDM7CiAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlID0gZGljdGlvbmFyeUZsYWdzID4+IDEyICYgMTsKICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgaWYgKCFkaWN0aW9uYXJ5Lmh1ZmZtYW4pIHsKICAgICAgICBhdExlbmd0aCA9IGRpY3Rpb25hcnkudGVtcGxhdGUgPT09IDAgPyA0IDogMTsKICAgICAgICBhdCA9IFtdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdExlbmd0aDsgaSsrKSB7CiAgICAgICAgICBhdC5wdXNoKHsKICAgICAgICAgICAgeDogcmVhZEludDgoZGF0YSwgcG9zaXRpb24pLAogICAgICAgICAgICB5OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiArIDEpCiAgICAgICAgICB9KTsKICAgICAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgICAgfQogICAgICAgIGRpY3Rpb25hcnkuYXQgPSBhdDsKICAgICAgfQogICAgICBpZiAoZGljdGlvbmFyeS5yZWZpbmVtZW50ICYmICFkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSkgewogICAgICAgIGF0ID0gW107CiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgYXQucHVzaCh7CiAgICAgICAgICAgIHg6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uKSwKICAgICAgICAgICAgeTogcmVhZEludDgoZGF0YSwgcG9zaXRpb24gKyAxKQogICAgICAgICAgfSk7CiAgICAgICAgICBwb3NpdGlvbiArPSAyOwogICAgICAgIH0KICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRBdCA9IGF0OwogICAgICB9CiAgICAgIGRpY3Rpb25hcnkubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgZGljdGlvbmFyeS5udW1iZXJPZk5ld1N5bWJvbHMgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgYXJncyA9IFtkaWN0aW9uYXJ5LCBoZWFkZXIubnVtYmVyLCBoZWFkZXIucmVmZXJyZWRUbywgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSA2OgogICAgY2FzZSA3OgogICAgICBjb25zdCB0ZXh0UmVnaW9uID0ge307CiAgICAgIHRleHRSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDsKICAgICAgY29uc3QgdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSAyOwogICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW4gPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgMSk7CiAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudCA9ICEhKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgJiAyKTsKICAgICAgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemUgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDIgJiAzOwogICAgICB0ZXh0UmVnaW9uLnN0cmlwU2l6ZSA9IDEgPDwgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemU7CiAgICAgIHRleHRSZWdpb24ucmVmZXJlbmNlQ29ybmVyID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA0ICYgMzsKICAgICAgdGV4dFJlZ2lvbi50cmFuc3Bvc2VkID0gISEodGV4dFJlZ2lvblNlZ21lbnRGbGFncyAmIDY0KTsKICAgICAgdGV4dFJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA3ICYgMzsKICAgICAgdGV4dFJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gOSAmIDE7CiAgICAgIHRleHRSZWdpb24uZHNPZmZzZXQgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzIDw8IDE3ID4+IDI3OwogICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnRUZW1wbGF0ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMTUgJiAxOwogICAgICBpZiAodGV4dFJlZ2lvbi5odWZmbWFuKSB7CiAgICAgICAgY29uc3QgdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pOwogICAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuRlMgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5EUyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMiAmIDM7CiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuRFQgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDQgJiAzOwogICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREVyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gNiAmIDM7CiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERIID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA4ICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFggPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDEwICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFkgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDEyICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50U2l6ZVNlbGVjdG9yID0gISEodGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyAmIDB4NDAwMCk7CiAgICAgIH0KICAgICAgaWYgKHRleHRSZWdpb24ucmVmaW5lbWVudCAmJiAhdGV4dFJlZ2lvbi5yZWZpbmVtZW50VGVtcGxhdGUpIHsKICAgICAgICBhdCA9IFtdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgIGF0LnB1c2goewogICAgICAgICAgICB4OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiksCiAgICAgICAgICAgIHk6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uICsgMSkKICAgICAgICAgIH0pOwogICAgICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgICB9CiAgICAgICAgdGV4dFJlZ2lvbi5yZWZpbmVtZW50QXQgPSBhdDsKICAgICAgfQogICAgICB0ZXh0UmVnaW9uLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IDQ7CiAgICAgIGFyZ3MgPSBbdGV4dFJlZ2lvbiwgaGVhZGVyLnJlZmVycmVkVG8sIGRhdGEsIHBvc2l0aW9uLCBlbmRdOwogICAgICBicmVhazsKICAgIGNhc2UgMTY6CiAgICAgIGNvbnN0IHBhdHRlcm5EaWN0aW9uYXJ5ID0ge307CiAgICAgIGNvbnN0IHBhdHRlcm5EaWN0aW9uYXJ5RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uKytdOwogICAgICBwYXR0ZXJuRGljdGlvbmFyeS5tbXIgPSAhIShwYXR0ZXJuRGljdGlvbmFyeUZsYWdzICYgMSk7CiAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5LnRlbXBsYXRlID0gcGF0dGVybkRpY3Rpb25hcnlGbGFncyA+PiAxICYgMzsKICAgICAgcGF0dGVybkRpY3Rpb25hcnkucGF0dGVybldpZHRoID0gZGF0YVtwb3NpdGlvbisrXTsKICAgICAgcGF0dGVybkRpY3Rpb25hcnkucGF0dGVybkhlaWdodCA9IGRhdGFbcG9zaXRpb24rK107CiAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5Lm1heFBhdHRlcm5JbmRleCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSA0OwogICAgICBhcmdzID0gW3BhdHRlcm5EaWN0aW9uYXJ5LCBoZWFkZXIubnVtYmVyLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDIyOgogICAgY2FzZSAyMzoKICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb24gPSB7fTsKICAgICAgaGFsZnRvbmVSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDsKICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb25GbGFncyA9IGRhdGFbcG9zaXRpb24rK107CiAgICAgIGhhbGZ0b25lUmVnaW9uLm1tciA9ICEhKGhhbGZ0b25lUmVnaW9uRmxhZ3MgJiAxKTsKICAgICAgaGFsZnRvbmVSZWdpb24udGVtcGxhdGUgPSBoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDEgJiAzOwogICAgICBoYWxmdG9uZVJlZ2lvbi5lbmFibGVTa2lwID0gISEoaGFsZnRvbmVSZWdpb25GbGFncyAmIDgpOwogICAgICBoYWxmdG9uZVJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yID0gaGFsZnRvbmVSZWdpb25GbGFncyA+PiA0ICYgNzsKICAgICAgaGFsZnRvbmVSZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUgPSBoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDcgJiAxOwogICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkV2lkdGggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZEhlaWdodCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSA0OwogICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkT2Zmc2V0WCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pICYgMHhmZmZmZmZmZjsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZE9mZnNldFkgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKSAmIDB4ZmZmZmZmZmY7CiAgICAgIHBvc2l0aW9uICs9IDQ7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JYID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JZID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgIGFyZ3MgPSBbaGFsZnRvbmVSZWdpb24sIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM4OgogICAgY2FzZSAzOToKICAgICAgY29uc3QgZ2VuZXJpY1JlZ2lvbiA9IHt9OwogICAgICBnZW5lcmljUmVnaW9uLmluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGg7CiAgICAgIGNvbnN0IGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uKytdOwogICAgICBnZW5lcmljUmVnaW9uLm1tciA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKICAgICAgZ2VuZXJpY1JlZ2lvbi50ZW1wbGF0ZSA9IGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPj4gMSAmIDM7CiAgICAgIGdlbmVyaWNSZWdpb24ucHJlZGljdGlvbiA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiA4KTsKICAgICAgaWYgKCFnZW5lcmljUmVnaW9uLm1tcikgewogICAgICAgIGF0TGVuZ3RoID0gZ2VuZXJpY1JlZ2lvbi50ZW1wbGF0ZSA9PT0gMCA/IDQgOiAxOwogICAgICAgIGF0ID0gW107CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0TGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGF0LnB1c2goewogICAgICAgICAgICB4OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiksCiAgICAgICAgICAgIHk6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uICsgMSkKICAgICAgICAgIH0pOwogICAgICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgICB9CiAgICAgICAgZ2VuZXJpY1JlZ2lvbi5hdCA9IGF0OwogICAgICB9CiAgICAgIGFyZ3MgPSBbZ2VuZXJpY1JlZ2lvbiwgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSA0ODoKICAgICAgY29uc3QgcGFnZUluZm8gPSB7CiAgICAgICAgd2lkdGg6IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pLAogICAgICAgIGhlaWdodDogcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDQpLAogICAgICAgIHJlc29sdXRpb25YOiByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgOCksCiAgICAgICAgcmVzb2x1dGlvblk6IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAxMikKICAgICAgfTsKICAgICAgaWYgKHBhZ2VJbmZvLmhlaWdodCA9PT0gMHhmZmZmZmZmZikgewogICAgICAgIGRlbGV0ZSBwYWdlSW5mby5oZWlnaHQ7CiAgICAgIH0KICAgICAgY29uc3QgcGFnZVNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24gKyAxNl07CiAgICAgIHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24gKyAxNyk7CiAgICAgIHBhZ2VJbmZvLmxvc3NsZXNzID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDEpOwogICAgICBwYWdlSW5mby5yZWZpbmVtZW50ID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDIpOwogICAgICBwYWdlSW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSA9IHBhZ2VTZWdtZW50RmxhZ3MgPj4gMiAmIDE7CiAgICAgIHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSBwYWdlU2VnbWVudEZsYWdzID4+IDMgJiAzOwogICAgICBwYWdlSW5mby5yZXF1aXJlc0J1ZmZlciA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiAzMik7CiAgICAgIHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZSA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiA2NCk7CiAgICAgIGFyZ3MgPSBbcGFnZUluZm9dOwogICAgICBicmVhazsKICAgIGNhc2UgNDk6CiAgICAgIGJyZWFrOwogICAgY2FzZSA1MDoKICAgICAgYnJlYWs7CiAgICBjYXNlIDUxOgogICAgICBicmVhazsKICAgIGNhc2UgNTM6CiAgICAgIGFyZ3MgPSBbaGVhZGVyLm51bWJlciwgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSA2MjoKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc2VnbWVudCB0eXBlICR7aGVhZGVyLnR5cGVOYW1lfSgke2hlYWRlci50eXBlfSkgaXMgbm90IGltcGxlbWVudGVkYCk7CiAgfQogIGNvbnN0IGNhbGxiYWNrTmFtZSA9ICJvbiIgKyBoZWFkZXIudHlwZU5hbWU7CiAgaWYgKGNhbGxiYWNrTmFtZSBpbiB2aXNpdG9yKSB7CiAgICB2aXNpdG9yW2NhbGxiYWNrTmFtZV0uYXBwbHkodmlzaXRvciwgYXJncyk7CiAgfQp9CmZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50cyhzZWdtZW50cywgdmlzaXRvcikgewogIGZvciAobGV0IGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIHByb2Nlc3NTZWdtZW50KHNlZ21lbnRzW2ldLCB2aXNpdG9yKTsKICB9Cn0KZnVuY3Rpb24gcGFyc2VKYmlnMkNodW5rcyhjaHVua3MpIHsKICBjb25zdCB2aXNpdG9yID0gbmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yKCk7CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gY2h1bmtzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW2ldOwogICAgY29uc3Qgc2VnbWVudHMgPSByZWFkU2VnbWVudHMoe30sIGNodW5rLmRhdGEsIGNodW5rLnN0YXJ0LCBjaHVuay5lbmQpOwogICAgcHJvY2Vzc1NlZ21lbnRzKHNlZ21lbnRzLCB2aXNpdG9yKTsKICB9CiAgcmV0dXJuIHZpc2l0b3IuYnVmZmVyOwp9CmZ1bmN0aW9uIHBhcnNlSmJpZzIoZGF0YSkgewogIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBwYXJzZUpiaWcyIik7Cn0KY2xhc3MgU2ltcGxlU2VnbWVudFZpc2l0b3IgewogIG9uUGFnZUluZm9ybWF0aW9uKGluZm8pIHsKICAgIHRoaXMuY3VycmVudFBhZ2VJbmZvID0gaW5mbzsKICAgIGNvbnN0IHJvd1NpemUgPSBpbmZvLndpZHRoICsgNyA+PiAzOwogICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHJvd1NpemUgKiBpbmZvLmhlaWdodCk7CiAgICBpZiAoaW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSkgewogICAgICBidWZmZXIuZmlsbCgweGZmKTsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogIH0KICBkcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCkgewogICAgY29uc3QgcGFnZUluZm8gPSB0aGlzLmN1cnJlbnRQYWdlSW5mbzsKICAgIGNvbnN0IHdpZHRoID0gcmVnaW9uSW5mby53aWR0aCwKICAgICAgaGVpZ2h0ID0gcmVnaW9uSW5mby5oZWlnaHQ7CiAgICBjb25zdCByb3dTaXplID0gcGFnZUluZm8ud2lkdGggKyA3ID4+IDM7CiAgICBjb25zdCBjb21iaW5hdGlvbk9wZXJhdG9yID0gcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvck92ZXJyaWRlID8gcmVnaW9uSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yIDogcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvcjsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgY29uc3QgbWFzazAgPSAxMjggPj4gKHJlZ2lvbkluZm8ueCAmIDcpOwogICAgbGV0IG9mZnNldDAgPSByZWdpb25JbmZvLnkgKiByb3dTaXplICsgKHJlZ2lvbkluZm8ueCA+PiAzKTsKICAgIGxldCBpLCBqLCBtYXNrLCBvZmZzZXQ7CiAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgICAgICAgbWFzayA9IG1hc2swOwogICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MDsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgICAgICAgIGlmIChiaXRtYXBbaV1bal0pIHsKICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0XSB8PSBtYXNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1hc2sgPj49IDE7CiAgICAgICAgICAgIGlmICghbWFzaykgewogICAgICAgICAgICAgIG1hc2sgPSAxMjg7CiAgICAgICAgICAgICAgb2Zmc2V0Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG9mZnNldDAgKz0gcm93U2l6ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgICAgICAgIG1hc2sgPSBtYXNrMDsKICAgICAgICAgIG9mZnNldCA9IG9mZnNldDA7CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgewogICAgICAgICAgICBpZiAoYml0bWFwW2ldW2pdKSB7CiAgICAgICAgICAgICAgYnVmZmVyW29mZnNldF0gXj0gbWFzazsKICAgICAgICAgICAgfQogICAgICAgICAgICBtYXNrID4+PSAxOwogICAgICAgICAgICBpZiAoIW1hc2spIHsKICAgICAgICAgICAgICBtYXNrID0gMTI4OwogICAgICAgICAgICAgIG9mZnNldCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBvZmZzZXQwICs9IHJvd1NpemU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKGBvcGVyYXRvciAke2NvbWJpbmF0aW9uT3BlcmF0b3J9IGlzIG5vdCBzdXBwb3J0ZWRgKTsKICAgIH0KICB9CiAgb25JbW1lZGlhdGVHZW5lcmljUmVnaW9uKHJlZ2lvbiwgZGF0YSwgc3RhcnQsIGVuZCkgewogICAgY29uc3QgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvOwogICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKICAgIGNvbnN0IGJpdG1hcCA9IGRlY29kZUJpdG1hcChyZWdpb24ubW1yLCByZWdpb25JbmZvLndpZHRoLCByZWdpb25JbmZvLmhlaWdodCwgcmVnaW9uLnRlbXBsYXRlLCByZWdpb24ucHJlZGljdGlvbiwgbnVsbCwgcmVnaW9uLmF0LCBkZWNvZGluZ0NvbnRleHQpOwogICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7CiAgfQogIG9uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uKCkgewogICAgdGhpcy5vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24oLi4uYXJndW1lbnRzKTsKICB9CiAgb25TeW1ib2xEaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGN1cnJlbnRTZWdtZW50LCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBsZXQgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0OwogICAgaWYgKGRpY3Rpb25hcnkuaHVmZm1hbikgewogICAgICBodWZmbWFuVGFibGVzID0gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZGljdGlvbmFyeSwgcmVmZXJyZWRTZWdtZW50cywgdGhpcy5jdXN0b21UYWJsZXMpOwogICAgICBodWZmbWFuSW5wdXQgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgfQogICAgbGV0IHN5bWJvbHMgPSB0aGlzLnN5bWJvbHM7CiAgICBpZiAoIXN5bWJvbHMpIHsKICAgICAgdGhpcy5zeW1ib2xzID0gc3ltYm9scyA9IHt9OwogICAgfQogICAgY29uc3QgaW5wdXRTeW1ib2xzID0gW107CiAgICBmb3IgKGNvbnN0IHJlZmVycmVkU2VnbWVudCBvZiByZWZlcnJlZFNlZ21lbnRzKSB7CiAgICAgIGNvbnN0IHJlZmVycmVkU3ltYm9scyA9IHN5bWJvbHNbcmVmZXJyZWRTZWdtZW50XTsKICAgICAgaWYgKHJlZmVycmVkU3ltYm9scykgewogICAgICAgIGlucHV0U3ltYm9scy5wdXNoKC4uLnJlZmVycmVkU3ltYm9scyk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICBzeW1ib2xzW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVN5bWJvbERpY3Rpb25hcnkoZGljdGlvbmFyeS5odWZmbWFuLCBkaWN0aW9uYXJ5LnJlZmluZW1lbnQsIGlucHV0U3ltYm9scywgZGljdGlvbmFyeS5udW1iZXJPZk5ld1N5bWJvbHMsIGRpY3Rpb25hcnkubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsIGh1ZmZtYW5UYWJsZXMsIGRpY3Rpb25hcnkudGVtcGxhdGUsIGRpY3Rpb25hcnkuYXQsIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlLCBkaWN0aW9uYXJ5LnJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCBodWZmbWFuSW5wdXQpOwogIH0KICBvbkltbWVkaWF0ZVRleHRSZWdpb24ocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBjb25zdCByZWdpb25JbmZvID0gcmVnaW9uLmluZm87CiAgICBsZXQgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0OwogICAgY29uc3Qgc3ltYm9scyA9IHRoaXMuc3ltYm9sczsKICAgIGNvbnN0IGlucHV0U3ltYm9scyA9IFtdOwogICAgZm9yIChjb25zdCByZWZlcnJlZFNlZ21lbnQgb2YgcmVmZXJyZWRTZWdtZW50cykgewogICAgICBjb25zdCByZWZlcnJlZFN5bWJvbHMgPSBzeW1ib2xzW3JlZmVycmVkU2VnbWVudF07CiAgICAgIGlmIChyZWZlcnJlZFN5bWJvbHMpIHsKICAgICAgICBpbnB1dFN5bWJvbHMucHVzaCguLi5yZWZlcnJlZFN5bWJvbHMpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBzeW1ib2xDb2RlTGVuZ3RoID0gbG9nMihpbnB1dFN5bWJvbHMubGVuZ3RoKTsKICAgIGlmIChyZWdpb24uaHVmZm1hbikgewogICAgICBodWZmbWFuSW5wdXQgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgICBodWZmbWFuVGFibGVzID0gZ2V0VGV4dFJlZ2lvbkh1ZmZtYW5UYWJsZXMocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCB0aGlzLmN1c3RvbVRhYmxlcywgaW5wdXRTeW1ib2xzLmxlbmd0aCwgaHVmZm1hbklucHV0KTsKICAgIH0KICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICBjb25zdCBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKHJlZ2lvbi5odWZmbWFuLCByZWdpb24ucmVmaW5lbWVudCwgcmVnaW9uSW5mby53aWR0aCwgcmVnaW9uSW5mby5oZWlnaHQsIHJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSwgcmVnaW9uLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzLCByZWdpb24uc3RyaXBTaXplLCBpbnB1dFN5bWJvbHMsIHN5bWJvbENvZGVMZW5ndGgsIHJlZ2lvbi50cmFuc3Bvc2VkLCByZWdpb24uZHNPZmZzZXQsIHJlZ2lvbi5yZWZlcmVuY2VDb3JuZXIsIHJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yLCBodWZmbWFuVGFibGVzLCByZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlLCByZWdpb24ucmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIHJlZ2lvbi5sb2dTdHJpcFNpemUsIGh1ZmZtYW5JbnB1dCk7CiAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTsKICB9CiAgb25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24oKSB7CiAgICB0aGlzLm9uSW1tZWRpYXRlVGV4dFJlZ2lvbiguLi5hcmd1bWVudHMpOwogIH0KICBvblBhdHRlcm5EaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGN1cnJlbnRTZWdtZW50LCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBsZXQgcGF0dGVybnMgPSB0aGlzLnBhdHRlcm5zOwogICAgaWYgKCFwYXR0ZXJucykgewogICAgICB0aGlzLnBhdHRlcm5zID0gcGF0dGVybnMgPSB7fTsKICAgIH0KICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICBwYXR0ZXJuc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShkaWN0aW9uYXJ5Lm1tciwgZGljdGlvbmFyeS5wYXR0ZXJuV2lkdGgsIGRpY3Rpb25hcnkucGF0dGVybkhlaWdodCwgZGljdGlvbmFyeS5tYXhQYXR0ZXJuSW5kZXgsIGRpY3Rpb25hcnkudGVtcGxhdGUsIGRlY29kaW5nQ29udGV4dCk7CiAgfQogIG9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24ocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMucGF0dGVybnNbcmVmZXJyZWRTZWdtZW50c1swXV07CiAgICBjb25zdCByZWdpb25JbmZvID0gcmVnaW9uLmluZm87CiAgICBjb25zdCBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgY29uc3QgYml0bWFwID0gZGVjb2RlSGFsZnRvbmVSZWdpb24ocmVnaW9uLm1tciwgcGF0dGVybnMsIHJlZ2lvbi50ZW1wbGF0ZSwgcmVnaW9uSW5mby53aWR0aCwgcmVnaW9uSW5mby5oZWlnaHQsIHJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSwgcmVnaW9uLmVuYWJsZVNraXAsIHJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yLCByZWdpb24uZ3JpZFdpZHRoLCByZWdpb24uZ3JpZEhlaWdodCwgcmVnaW9uLmdyaWRPZmZzZXRYLCByZWdpb24uZ3JpZE9mZnNldFksIHJlZ2lvbi5ncmlkVmVjdG9yWCwgcmVnaW9uLmdyaWRWZWN0b3JZLCBkZWNvZGluZ0NvbnRleHQpOwogICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7CiAgfQogIG9uSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbigpIHsKICAgIHRoaXMub25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbiguLi5hcmd1bWVudHMpOwogIH0KICBvblRhYmxlcyhjdXJyZW50U2VnbWVudCwgZGF0YSwgc3RhcnQsIGVuZCkgewogICAgbGV0IGN1c3RvbVRhYmxlcyA9IHRoaXMuY3VzdG9tVGFibGVzOwogICAgaWYgKCFjdXN0b21UYWJsZXMpIHsKICAgICAgdGhpcy5jdXN0b21UYWJsZXMgPSBjdXN0b21UYWJsZXMgPSB7fTsKICAgIH0KICAgIGN1c3RvbVRhYmxlc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVUYWJsZXNTZWdtZW50KGRhdGEsIHN0YXJ0LCBlbmQpOwogIH0KfQpjbGFzcyBIdWZmbWFuTGluZSB7CiAgY29uc3RydWN0b3IobGluZURhdGEpIHsKICAgIGlmIChsaW5lRGF0YS5sZW5ndGggPT09IDIpIHsKICAgICAgdGhpcy5pc09PQiA9IHRydWU7CiAgICAgIHRoaXMucmFuZ2VMb3cgPSAwOwogICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzBdOwogICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gMDsKICAgICAgdGhpcy5wcmVmaXhDb2RlID0gbGluZURhdGFbMV07CiAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmlzT09CID0gZmFsc2U7CiAgICAgIHRoaXMucmFuZ2VMb3cgPSBsaW5lRGF0YVswXTsKICAgICAgdGhpcy5wcmVmaXhMZW5ndGggPSBsaW5lRGF0YVsxXTsKICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmVEYXRhWzJdOwogICAgICB0aGlzLnByZWZpeENvZGUgPSBsaW5lRGF0YVszXTsKICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBsaW5lRGF0YVs0XSA9PT0gImxvd2VyIjsKICAgIH0KICB9Cn0KY2xhc3MgSHVmZm1hblRyZWVOb2RlIHsKICBjb25zdHJ1Y3RvcihsaW5lKSB7CiAgICB0aGlzLmNoaWxkcmVuID0gW107CiAgICBpZiAobGluZSkgewogICAgICB0aGlzLmlzTGVhZiA9IHRydWU7CiAgICAgIHRoaXMucmFuZ2VMZW5ndGggPSBsaW5lLnJhbmdlTGVuZ3RoOwogICAgICB0aGlzLnJhbmdlTG93ID0gbGluZS5yYW5nZUxvdzsKICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBsaW5lLmlzTG93ZXJSYW5nZTsKICAgICAgdGhpcy5pc09PQiA9IGxpbmUuaXNPT0I7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmlzTGVhZiA9IGZhbHNlOwogICAgfQogIH0KICBidWlsZFRyZWUobGluZSwgc2hpZnQpIHsKICAgIGNvbnN0IGJpdCA9IGxpbmUucHJlZml4Q29kZSA+PiBzaGlmdCAmIDE7CiAgICBpZiAoc2hpZnQgPD0gMCkgewogICAgICB0aGlzLmNoaWxkcmVuW2JpdF0gPSBuZXcgSHVmZm1hblRyZWVOb2RlKGxpbmUpOwogICAgfSBlbHNlIHsKICAgICAgbGV0IG5vZGUgPSB0aGlzLmNoaWxkcmVuW2JpdF07CiAgICAgIGlmICghbm9kZSkgewogICAgICAgIHRoaXMuY2hpbGRyZW5bYml0XSA9IG5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpOwogICAgICB9CiAgICAgIG5vZGUuYnVpbGRUcmVlKGxpbmUsIHNoaWZ0IC0gMSk7CiAgICB9CiAgfQogIGRlY29kZU5vZGUocmVhZGVyKSB7CiAgICBpZiAodGhpcy5pc0xlYWYpIHsKICAgICAgaWYgKHRoaXMuaXNPT0IpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBodE9mZnNldCA9IHJlYWRlci5yZWFkQml0cyh0aGlzLnJhbmdlTGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXMucmFuZ2VMb3cgKyAodGhpcy5pc0xvd2VyUmFuZ2UgPyAtaHRPZmZzZXQgOiBodE9mZnNldCk7CiAgICB9CiAgICBjb25zdCBub2RlID0gdGhpcy5jaGlsZHJlbltyZWFkZXIucmVhZEJpdCgpXTsKICAgIGlmICghbm9kZSkgewogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIGRhdGEiKTsKICAgIH0KICAgIHJldHVybiBub2RlLmRlY29kZU5vZGUocmVhZGVyKTsKICB9Cn0KY2xhc3MgSHVmZm1hblRhYmxlIHsKICBjb25zdHJ1Y3RvcihsaW5lcywgcHJlZml4Q29kZXNEb25lKSB7CiAgICBpZiAoIXByZWZpeENvZGVzRG9uZSkgewogICAgICB0aGlzLmFzc2lnblByZWZpeENvZGVzKGxpbmVzKTsKICAgIH0KICAgIHRoaXMucm9vdE5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07CiAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnJvb3ROb2RlLmJ1aWxkVHJlZShsaW5lLCBsaW5lLnByZWZpeExlbmd0aCAtIDEpOwogICAgICB9CiAgICB9CiAgfQogIGRlY29kZShyZWFkZXIpIHsKICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLmRlY29kZU5vZGUocmVhZGVyKTsKICB9CiAgYXNzaWduUHJlZml4Q29kZXMobGluZXMpIHsKICAgIGNvbnN0IGxpbmVzTGVuZ3RoID0gbGluZXMubGVuZ3RoOwogICAgbGV0IHByZWZpeExlbmd0aE1heCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzTGVuZ3RoOyBpKyspIHsKICAgICAgcHJlZml4TGVuZ3RoTWF4ID0gTWF0aC5tYXgocHJlZml4TGVuZ3RoTWF4LCBsaW5lc1tpXS5wcmVmaXhMZW5ndGgpOwogICAgfQogICAgY29uc3QgaGlzdG9ncmFtID0gbmV3IFVpbnQzMkFycmF5KHByZWZpeExlbmd0aE1heCArIDEpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7CiAgICAgIGhpc3RvZ3JhbVtsaW5lc1tpXS5wcmVmaXhMZW5ndGhdKys7CiAgICB9CiAgICBsZXQgY3VycmVudExlbmd0aCA9IDEsCiAgICAgIGZpcnN0Q29kZSA9IDAsCiAgICAgIGN1cnJlbnRDb2RlLAogICAgICBjdXJyZW50VGVtcCwKICAgICAgbGluZTsKICAgIGhpc3RvZ3JhbVswXSA9IDA7CiAgICB3aGlsZSAoY3VycmVudExlbmd0aCA8PSBwcmVmaXhMZW5ndGhNYXgpIHsKICAgICAgZmlyc3RDb2RlID0gZmlyc3RDb2RlICsgaGlzdG9ncmFtW2N1cnJlbnRMZW5ndGggLSAxXSA8PCAxOwogICAgICBjdXJyZW50Q29kZSA9IGZpcnN0Q29kZTsKICAgICAgY3VycmVudFRlbXAgPSAwOwogICAgICB3aGlsZSAoY3VycmVudFRlbXAgPCBsaW5lc0xlbmd0aCkgewogICAgICAgIGxpbmUgPSBsaW5lc1tjdXJyZW50VGVtcF07CiAgICAgICAgaWYgKGxpbmUucHJlZml4TGVuZ3RoID09PSBjdXJyZW50TGVuZ3RoKSB7CiAgICAgICAgICBsaW5lLnByZWZpeENvZGUgPSBjdXJyZW50Q29kZTsKICAgICAgICAgIGN1cnJlbnRDb2RlKys7CiAgICAgICAgfQogICAgICAgIGN1cnJlbnRUZW1wKys7CiAgICAgIH0KICAgICAgY3VycmVudExlbmd0aCsrOwogICAgfQogIH0KfQpmdW5jdGlvbiBkZWNvZGVUYWJsZXNTZWdtZW50KGRhdGEsIHN0YXJ0LCBlbmQpIHsKICBjb25zdCBmbGFncyA9IGRhdGFbc3RhcnRdOwogIGNvbnN0IGxvd2VzdFZhbHVlID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDEpICYgMHhmZmZmZmZmZjsKICBjb25zdCBoaWdoZXN0VmFsdWUgPSByZWFkVWludDMyKGRhdGEsIHN0YXJ0ICsgNSkgJiAweGZmZmZmZmZmOwogIGNvbnN0IHJlYWRlciA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQgKyA5LCBlbmQpOwogIGNvbnN0IHByZWZpeFNpemVCaXRzID0gKGZsYWdzID4+IDEgJiA3KSArIDE7CiAgY29uc3QgcmFuZ2VTaXplQml0cyA9IChmbGFncyA+PiA0ICYgNykgKyAxOwogIGNvbnN0IGxpbmVzID0gW107CiAgbGV0IHByZWZpeExlbmd0aCwKICAgIHJhbmdlTGVuZ3RoLAogICAgY3VycmVudFJhbmdlTG93ID0gbG93ZXN0VmFsdWU7CiAgZG8gewogICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKICAgIHJhbmdlTGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHJhbmdlU2l6ZUJpdHMpOwogICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2N1cnJlbnRSYW5nZUxvdywgcHJlZml4TGVuZ3RoLCByYW5nZUxlbmd0aCwgMF0pKTsKICAgIGN1cnJlbnRSYW5nZUxvdyArPSAxIDw8IHJhbmdlTGVuZ3RoOwogIH0gd2hpbGUgKGN1cnJlbnRSYW5nZUxvdyA8IGhpZ2hlc3RWYWx1ZSk7CiAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbbG93ZXN0VmFsdWUgLSAxLCBwcmVmaXhMZW5ndGgsIDMyLCAwLCAibG93ZXIiXSkpOwogIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7CiAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2hpZ2hlc3RWYWx1ZSwgcHJlZml4TGVuZ3RoLCAzMiwgMF0pKTsKICBpZiAoZmxhZ3MgJiAxKSB7CiAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpOwogICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW3ByZWZpeExlbmd0aCwgMF0pKTsKICB9CiAgcmV0dXJuIG5ldyBIdWZmbWFuVGFibGUobGluZXMsIGZhbHNlKTsKfQpjb25zdCBzdGFuZGFyZFRhYmxlc0NhY2hlID0ge307CmZ1bmN0aW9uIGdldFN0YW5kYXJkVGFibGUobnVtYmVyKSB7CiAgbGV0IHRhYmxlID0gc3RhbmRhcmRUYWJsZXNDYWNoZVtudW1iZXJdOwogIGlmICh0YWJsZSkgewogICAgcmV0dXJuIHRhYmxlOwogIH0KICBsZXQgbGluZXM7CiAgc3dpdGNoIChudW1iZXIpIHsKICAgIGNhc2UgMToKICAgICAgbGluZXMgPSBbWzAsIDEsIDQsIDB4MF0sIFsxNiwgMiwgOCwgMHgyXSwgWzI3MiwgMywgMTYsIDB4Nl0sIFs2NTgwOCwgMywgMzIsIDB4N11dOwogICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgICAgbGluZXMgPSBbWzAsIDEsIDAsIDB4MF0sIFsxLCAyLCAwLCAweDJdLCBbMiwgMywgMCwgMHg2XSwgWzMsIDQsIDMsIDB4ZV0sIFsxMSwgNSwgNiwgMHgxZV0sIFs3NSwgNiwgMzIsIDB4M2VdLCBbNiwgMHgzZl1dOwogICAgICBicmVhazsKICAgIGNhc2UgMzoKICAgICAgbGluZXMgPSBbWy0yNTYsIDgsIDgsIDB4ZmVdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDIsIDAsIDB4Ml0sIFsyLCAzLCAwLCAweDZdLCBbMywgNCwgMywgMHhlXSwgWzExLCA1LCA2LCAweDFlXSwgWy0yNTcsIDgsIDMyLCAweGZmLCAibG93ZXIiXSwgWzc1LCA3LCAzMiwgMHg3ZV0sIFs2LCAweDNlXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAwLCAweDZdLCBbNCwgNCwgMywgMHhlXSwgWzEyLCA1LCA2LCAweDFlXSwgWzc2LCA1LCAzMiwgMHgxZl1dOwogICAgICBicmVhazsKICAgIGNhc2UgNToKICAgICAgbGluZXMgPSBbWy0yNTUsIDcsIDgsIDB4N2VdLCBbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAwLCAweDZdLCBbNCwgNCwgMywgMHhlXSwgWzEyLCA1LCA2LCAweDFlXSwgWy0yNTYsIDcsIDMyLCAweDdmLCAibG93ZXIiXSwgWzc2LCA2LCAzMiwgMHgzZV1dOwogICAgICBicmVhazsKICAgIGNhc2UgNjoKICAgICAgbGluZXMgPSBbWy0yMDQ4LCA1LCAxMCwgMHgxY10sIFstMTAyNCwgNCwgOSwgMHg4XSwgWy01MTIsIDQsIDgsIDB4OV0sIFstMjU2LCA0LCA3LCAweGFdLCBbLTEyOCwgNSwgNiwgMHgxZF0sIFstNjQsIDUsIDUsIDB4MWVdLCBbLTMyLCA0LCA1LCAweGJdLCBbMCwgMiwgNywgMHgwXSwgWzEyOCwgMywgNywgMHgyXSwgWzI1NiwgMywgOCwgMHgzXSwgWzUxMiwgNCwgOSwgMHhjXSwgWzEwMjQsIDQsIDEwLCAweGRdLCBbLTIwNDksIDYsIDMyLCAweDNlLCAibG93ZXIiXSwgWzIwNDgsIDYsIDMyLCAweDNmXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSA3OgogICAgICBsaW5lcyA9IFtbLTEwMjQsIDQsIDksIDB4OF0sIFstNTEyLCAzLCA4LCAweDBdLCBbLTI1NiwgNCwgNywgMHg5XSwgWy0xMjgsIDUsIDYsIDB4MWFdLCBbLTY0LCA1LCA1LCAweDFiXSwgWy0zMiwgNCwgNSwgMHhhXSwgWzAsIDQsIDUsIDB4Yl0sIFszMiwgNSwgNSwgMHgxY10sIFs2NCwgNSwgNiwgMHgxZF0sIFsxMjgsIDQsIDcsIDB4Y10sIFsyNTYsIDMsIDgsIDB4MV0sIFs1MTIsIDMsIDksIDB4Ml0sIFsxMDI0LCAzLCAxMCwgMHgzXSwgWy0xMDI1LCA1LCAzMiwgMHgxZSwgImxvd2VyIl0sIFsyMDQ4LCA1LCAzMiwgMHgxZl1dOwogICAgICBicmVhazsKICAgIGNhc2UgODoKICAgICAgbGluZXMgPSBbWy0xNSwgOCwgMywgMHhmY10sIFstNywgOSwgMSwgMHgxZmNdLCBbLTUsIDgsIDEsIDB4ZmRdLCBbLTMsIDksIDAsIDB4MWZkXSwgWy0yLCA3LCAwLCAweDdjXSwgWy0xLCA0LCAwLCAweGFdLCBbMCwgMiwgMSwgMHgwXSwgWzIsIDUsIDAsIDB4MWFdLCBbMywgNiwgMCwgMHgzYV0sIFs0LCAzLCA0LCAweDRdLCBbMjAsIDYsIDEsIDB4M2JdLCBbMjIsIDQsIDQsIDB4Yl0sIFszOCwgNCwgNSwgMHhjXSwgWzcwLCA1LCA2LCAweDFiXSwgWzEzNCwgNSwgNywgMHgxY10sIFsyNjIsIDYsIDcsIDB4M2NdLCBbMzkwLCA3LCA4LCAweDdkXSwgWzY0NiwgNiwgMTAsIDB4M2RdLCBbLTE2LCA5LCAzMiwgMHgxZmUsICJsb3dlciJdLCBbMTY3MCwgOSwgMzIsIDB4MWZmXSwgWzIsIDB4MV1dOwogICAgICBicmVhazsKICAgIGNhc2UgOToKICAgICAgbGluZXMgPSBbWy0zMSwgOCwgNCwgMHhmY10sIFstMTUsIDksIDIsIDB4MWZjXSwgWy0xMSwgOCwgMiwgMHhmZF0sIFstNywgOSwgMSwgMHgxZmRdLCBbLTUsIDcsIDEsIDB4N2NdLCBbLTMsIDQsIDEsIDB4YV0sIFstMSwgMywgMSwgMHgyXSwgWzEsIDMsIDEsIDB4M10sIFszLCA1LCAxLCAweDFhXSwgWzUsIDYsIDEsIDB4M2FdLCBbNywgMywgNSwgMHg0XSwgWzM5LCA2LCAyLCAweDNiXSwgWzQzLCA0LCA1LCAweGJdLCBbNzUsIDQsIDYsIDB4Y10sIFsxMzksIDUsIDcsIDB4MWJdLCBbMjY3LCA1LCA4LCAweDFjXSwgWzUyMywgNiwgOCwgMHgzY10sIFs3NzksIDcsIDksIDB4N2RdLCBbMTI5MSwgNiwgMTEsIDB4M2RdLCBbLTMyLCA5LCAzMiwgMHgxZmUsICJsb3dlciJdLCBbMzMzOSwgOSwgMzIsIDB4MWZmXSwgWzIsIDB4MF1dOwogICAgICBicmVhazsKICAgIGNhc2UgMTA6CiAgICAgIGxpbmVzID0gW1stMjEsIDcsIDQsIDB4N2FdLCBbLTUsIDgsIDAsIDB4ZmNdLCBbLTQsIDcsIDAsIDB4N2JdLCBbLTMsIDUsIDAsIDB4MThdLCBbLTIsIDIsIDIsIDB4MF0sIFsyLCA1LCAwLCAweDE5XSwgWzMsIDYsIDAsIDB4MzZdLCBbNCwgNywgMCwgMHg3Y10sIFs1LCA4LCAwLCAweGZkXSwgWzYsIDIsIDYsIDB4MV0sIFs3MCwgNSwgNSwgMHgxYV0sIFsxMDIsIDYsIDUsIDB4MzddLCBbMTM0LCA2LCA2LCAweDM4XSwgWzE5OCwgNiwgNywgMHgzOV0sIFszMjYsIDYsIDgsIDB4M2FdLCBbNTgyLCA2LCA5LCAweDNiXSwgWzEwOTQsIDYsIDEwLCAweDNjXSwgWzIxMTgsIDcsIDExLCAweDdkXSwgWy0yMiwgOCwgMzIsIDB4ZmUsICJsb3dlciJdLCBbNDE2NiwgOCwgMzIsIDB4ZmZdLCBbMiwgMHgyXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAxMToKICAgICAgbGluZXMgPSBbWzEsIDEsIDAsIDB4MF0sIFsyLCAyLCAxLCAweDJdLCBbNCwgNCwgMCwgMHhjXSwgWzUsIDQsIDEsIDB4ZF0sIFs3LCA1LCAxLCAweDFjXSwgWzksIDUsIDIsIDB4MWRdLCBbMTMsIDYsIDIsIDB4M2NdLCBbMTcsIDcsIDIsIDB4N2FdLCBbMjEsIDcsIDMsIDB4N2JdLCBbMjksIDcsIDQsIDB4N2NdLCBbNDUsIDcsIDUsIDB4N2RdLCBbNzcsIDcsIDYsIDB4N2VdLCBbMTQxLCA3LCAzMiwgMHg3Zl1dOwogICAgICBicmVhazsKICAgIGNhc2UgMTI6CiAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMiwgMCwgMHgyXSwgWzMsIDMsIDEsIDB4Nl0sIFs1LCA1LCAwLCAweDFjXSwgWzYsIDUsIDEsIDB4MWRdLCBbOCwgNiwgMSwgMHgzY10sIFsxMCwgNywgMCwgMHg3YV0sIFsxMSwgNywgMSwgMHg3Yl0sIFsxMywgNywgMiwgMHg3Y10sIFsxNywgNywgMywgMHg3ZF0sIFsyNSwgNywgNCwgMHg3ZV0sIFs0MSwgOCwgNSwgMHhmZV0sIFs3MywgOCwgMzIsIDB4ZmZdXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDEzOgogICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDMsIDAsIDB4NF0sIFszLCA0LCAwLCAweGNdLCBbNCwgNSwgMCwgMHgxY10sIFs1LCA0LCAxLCAweGRdLCBbNywgMywgMywgMHg1XSwgWzE1LCA2LCAxLCAweDNhXSwgWzE3LCA2LCAyLCAweDNiXSwgWzIxLCA2LCAzLCAweDNjXSwgWzI5LCA2LCA0LCAweDNkXSwgWzQ1LCA2LCA1LCAweDNlXSwgWzc3LCA3LCA2LCAweDdlXSwgWzE0MSwgNywgMzIsIDB4N2ZdXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDE0OgogICAgICBsaW5lcyA9IFtbLTIsIDMsIDAsIDB4NF0sIFstMSwgMywgMCwgMHg1XSwgWzAsIDEsIDAsIDB4MF0sIFsxLCAzLCAwLCAweDZdLCBbMiwgMywgMCwgMHg3XV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAxNToKICAgICAgbGluZXMgPSBbWy0yNCwgNywgNCwgMHg3Y10sIFstOCwgNiwgMiwgMHgzY10sIFstNCwgNSwgMSwgMHgxY10sIFstMiwgNCwgMCwgMHhjXSwgWy0xLCAzLCAwLCAweDRdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDMsIDAsIDB4NV0sIFsyLCA0LCAwLCAweGRdLCBbMywgNSwgMSwgMHgxZF0sIFs1LCA2LCAyLCAweDNkXSwgWzksIDcsIDQsIDB4N2RdLCBbLTI1LCA3LCAzMiwgMHg3ZSwgImxvd2VyIl0sIFsyNSwgNywgMzIsIDB4N2ZdXTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc3RhbmRhcmQgdGFibGUgQi4ke251bWJlcn0gZG9lcyBub3QgZXhpc3RgKTsKICB9CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgbGluZXNbaV0gPSBuZXcgSHVmZm1hbkxpbmUobGluZXNbaV0pOwogIH0KICB0YWJsZSA9IG5ldyBIdWZmbWFuVGFibGUobGluZXMsIHRydWUpOwogIHN0YW5kYXJkVGFibGVzQ2FjaGVbbnVtYmVyXSA9IHRhYmxlOwogIHJldHVybiB0YWJsZTsKfQpjbGFzcyBSZWFkZXIgewogIGNvbnN0cnVjdG9yKGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CiAgICB0aGlzLmVuZCA9IGVuZDsKICAgIHRoaXMucG9zaXRpb24gPSBzdGFydDsKICAgIHRoaXMuc2hpZnQgPSAtMTsKICAgIHRoaXMuY3VycmVudEJ5dGUgPSAwOwogIH0KICByZWFkQml0KCkgewogICAgaWYgKHRoaXMuc2hpZnQgPCAwKSB7CiAgICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7CiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImVuZCBvZiBkYXRhIHdoaWxlIHJlYWRpbmcgYml0Iik7CiAgICAgIH0KICAgICAgdGhpcy5jdXJyZW50Qnl0ZSA9IHRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdOwogICAgICB0aGlzLnNoaWZ0ID0gNzsKICAgIH0KICAgIGNvbnN0IGJpdCA9IHRoaXMuY3VycmVudEJ5dGUgPj4gdGhpcy5zaGlmdCAmIDE7CiAgICB0aGlzLnNoaWZ0LS07CiAgICByZXR1cm4gYml0OwogIH0KICByZWFkQml0cyhudW1CaXRzKSB7CiAgICBsZXQgcmVzdWx0ID0gMCwKICAgICAgaTsKICAgIGZvciAoaSA9IG51bUJpdHMgLSAxOyBpID49IDA7IGktLSkgewogICAgICByZXN1bHQgfD0gdGhpcy5yZWFkQml0KCkgPDwgaTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGJ5dGVBbGlnbigpIHsKICAgIHRoaXMuc2hpZnQgPSAtMTsKICB9CiAgbmV4dCgpIHsKICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5wb3NpdGlvbisrXTsKICB9Cn0KZnVuY3Rpb24gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpIHsKICBsZXQgY3VycmVudEluZGV4ID0gMDsKICBmb3IgKGxldCBpID0gMCwgaWkgPSByZWZlcnJlZFRvLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHRhYmxlID0gY3VzdG9tVGFibGVzW3JlZmVycmVkVG9baV1dOwogICAgaWYgKHRhYmxlKSB7CiAgICAgIGlmIChpbmRleCA9PT0gY3VycmVudEluZGV4KSB7CiAgICAgICAgcmV0dXJuIHRhYmxlOwogICAgICB9CiAgICAgIGN1cnJlbnRJbmRleCsrOwogICAgfQogIH0KICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiY2FuJ3QgZmluZCBjdXN0b20gSHVmZm1hbiB0YWJsZSIpOwp9CmZ1bmN0aW9uIGdldFRleHRSZWdpb25IdWZmbWFuVGFibGVzKHRleHRSZWdpb24sIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcywgbnVtYmVyT2ZTeW1ib2xzLCByZWFkZXIpIHsKICBjb25zdCBjb2RlcyA9IFtdOwogIGZvciAobGV0IGkgPSAwOyBpIDw9IDM0OyBpKyspIHsKICAgIGNvbnN0IGNvZGVMZW5ndGggPSByZWFkZXIucmVhZEJpdHMoNCk7CiAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTsKICB9CiAgY29uc3QgcnVuQ29kZXNUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKICBjb2Rlcy5sZW5ndGggPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZTeW1ib2xzOykgewogICAgY29uc3QgY29kZUxlbmd0aCA9IHJ1bkNvZGVzVGFibGUuZGVjb2RlKHJlYWRlcik7CiAgICBpZiAoY29kZUxlbmd0aCA+PSAzMikgewogICAgICBsZXQgcmVwZWF0ZWRMZW5ndGgsIG51bWJlck9mUmVwZWF0cywgajsKICAgICAgc3dpdGNoIChjb2RlTGVuZ3RoKSB7CiAgICAgICAgY2FzZSAzMjoKICAgICAgICAgIGlmIChpID09PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJubyBwcmV2aW91cyB2YWx1ZSBpbiBzeW1ib2wgSUQgdGFibGUiKTsKICAgICAgICAgIH0KICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cygyKSArIDM7CiAgICAgICAgICByZXBlYXRlZExlbmd0aCA9IGNvZGVzW2kgLSAxXS5wcmVmaXhMZW5ndGg7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDMzOgogICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDMpICsgMzsKICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSByZWFkZXIucmVhZEJpdHMoNykgKyAxMTsKICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBjb2RlIGxlbmd0aCBpbiBzeW1ib2wgSUQgdGFibGUiKTsKICAgICAgfQogICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyT2ZSZXBlYXRzOyBqKyspIHsKICAgICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgcmVwZWF0ZWRMZW5ndGgsIDAsIDBdKSk7CiAgICAgICAgaSsrOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTsKICAgICAgaSsrOwogICAgfQogIH0KICByZWFkZXIuYnl0ZUFsaWduKCk7CiAgY29uc3Qgc3ltYm9sSURUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKICBsZXQgY3VzdG9tSW5kZXggPSAwLAogICAgdGFibGVGaXJzdFMsCiAgICB0YWJsZURlbHRhUywKICAgIHRhYmxlRGVsdGFUOwogIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRlMpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgdGFibGVGaXJzdFMgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkZTICsgNik7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICB0YWJsZUZpcnN0UyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgICAgY3VzdG9tSW5kZXgrKzsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIEZTIHNlbGVjdG9yIik7CiAgfQogIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRFMpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgdGFibGVEZWx0YVMgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkRTICsgOCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICB0YWJsZURlbHRhUyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgICAgY3VzdG9tSW5kZXgrKzsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERTIHNlbGVjdG9yIik7CiAgfQogIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRFQpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgdGFibGVEZWx0YVQgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkRUICsgMTEpOwogICAgICBicmVhazsKICAgIGNhc2UgMzoKICAgICAgdGFibGVEZWx0YVQgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CiAgICAgIGN1c3RvbUluZGV4Kys7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVCBzZWxlY3RvciIpOwogIH0KICBpZiAodGV4dFJlZ2lvbi5yZWZpbmVtZW50KSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigicmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICByZXR1cm4gewogICAgc3ltYm9sSURUYWJsZSwKICAgIHRhYmxlRmlyc3RTLAogICAgdGFibGVEZWx0YVMsCiAgICB0YWJsZURlbHRhVAogIH07Cn0KZnVuY3Rpb24gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZGljdGlvbmFyeSwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKSB7CiAgbGV0IGN1c3RvbUluZGV4ID0gMCwKICAgIHRhYmxlRGVsdGFIZWlnaHQsCiAgICB0YWJsZURlbHRhV2lkdGg7CiAgc3dpdGNoIChkaWN0aW9uYXJ5Lmh1ZmZtYW5ESFNlbGVjdG9yKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICAgIHRhYmxlRGVsdGFIZWlnaHQgPSBnZXRTdGFuZGFyZFRhYmxlKGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IgKyA0KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM6CiAgICAgIHRhYmxlRGVsdGFIZWlnaHQgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CiAgICAgIGN1c3RvbUluZGV4Kys7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBESCBzZWxlY3RvciIpOwogIH0KICBzd2l0Y2ggKGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgdGFibGVEZWx0YVdpZHRoID0gZ2V0U3RhbmRhcmRUYWJsZShkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yICsgMik7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICB0YWJsZURlbHRhV2lkdGggPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CiAgICAgIGN1c3RvbUluZGV4Kys7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVyBzZWxlY3RvciIpOwogIH0KICBsZXQgdGFibGVCaXRtYXBTaXplLCB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlczsKICBpZiAoZGljdGlvbmFyeS5iaXRtYXBTaXplU2VsZWN0b3IpIHsKICAgIHRhYmxlQml0bWFwU2l6ZSA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgIGN1c3RvbUluZGV4Kys7CiAgfSBlbHNlIHsKICAgIHRhYmxlQml0bWFwU2l6ZSA9IGdldFN0YW5kYXJkVGFibGUoMSk7CiAgfQogIGlmIChkaWN0aW9uYXJ5LmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3IpIHsKICAgIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOwogIH0gZWxzZSB7CiAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyA9IGdldFN0YW5kYXJkVGFibGUoMSk7CiAgfQogIHJldHVybiB7CiAgICB0YWJsZURlbHRhSGVpZ2h0LAogICAgdGFibGVEZWx0YVdpZHRoLAogICAgdGFibGVCaXRtYXBTaXplLAogICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMKICB9Owp9CmZ1bmN0aW9uIHJlYWRVbmNvbXByZXNzZWRCaXRtYXAocmVhZGVyLCB3aWR0aCwgaGVpZ2h0KSB7CiAgY29uc3QgYml0bWFwID0gW107CiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOwogICAgYml0bWFwLnB1c2gocm93KTsKICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICByb3dbeF0gPSByZWFkZXIucmVhZEJpdCgpOwogICAgfQogICAgcmVhZGVyLmJ5dGVBbGlnbigpOwogIH0KICByZXR1cm4gYml0bWFwOwp9CmZ1bmN0aW9uIGRlY29kZU1NUkJpdG1hcChpbnB1dCwgd2lkdGgsIGhlaWdodCwgZW5kT2ZCbG9jaykgewogIGNvbnN0IHBhcmFtcyA9IHsKICAgIEs6IC0xLAogICAgQ29sdW1uczogd2lkdGgsCiAgICBSb3dzOiBoZWlnaHQsCiAgICBCbGFja0lzMTogdHJ1ZSwKICAgIEVuZE9mQmxvY2s6IGVuZE9mQmxvY2sKICB9OwogIGNvbnN0IGRlY29kZXIgPSBuZXcgQ0NJVFRGYXhEZWNvZGVyKGlucHV0LCBwYXJhbXMpOwogIGNvbnN0IGJpdG1hcCA9IFtdOwogIGxldCBjdXJyZW50Qnl0ZSwKICAgIGVvZiA9IGZhbHNlOwogIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgIGNvbnN0IHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKICAgIGJpdG1hcC5wdXNoKHJvdyk7CiAgICBsZXQgc2hpZnQgPSAtMTsKICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICBpZiAoc2hpZnQgPCAwKSB7CiAgICAgICAgY3VycmVudEJ5dGUgPSBkZWNvZGVyLnJlYWROZXh0Q2hhcigpOwogICAgICAgIGlmIChjdXJyZW50Qnl0ZSA9PT0gLTEpIHsKICAgICAgICAgIGN1cnJlbnRCeXRlID0gMDsKICAgICAgICAgIGVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHNoaWZ0ID0gNzsKICAgICAgfQogICAgICByb3dbeF0gPSBjdXJyZW50Qnl0ZSA+PiBzaGlmdCAmIDE7CiAgICAgIHNoaWZ0LS07CiAgICB9CiAgfQogIGlmIChlbmRPZkJsb2NrICYmICFlb2YpIHsKICAgIGNvbnN0IGxvb2tGb3JFT0ZMaW1pdCA9IDU7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvb2tGb3JFT0ZMaW1pdDsgaSsrKSB7CiAgICAgIGlmIChkZWNvZGVyLnJlYWROZXh0Q2hhcigpID09PSAtMSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBiaXRtYXA7Cn0KY2xhc3MgSmJpZzJJbWFnZSB7CiAgcGFyc2VDaHVua3MoY2h1bmtzKSB7CiAgICByZXR1cm4gcGFyc2VKYmlnMkNodW5rcyhjaHVua3MpOwogIH0KICBwYXJzZShkYXRhKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZDogSmJpZzJJbWFnZS5wYXJzZSIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvamJpZzJfc3RyZWFtLmpzCgoKCgoKY2xhc3MgSmJpZzJTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcykgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLmRpY3QgPSBzdHJlYW0uZGljdDsKICAgIHRoaXMubWF5YmVMZW5ndGggPSBtYXliZUxlbmd0aDsKICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwogIH0KICBnZXQgYnl0ZXMoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJieXRlcyIsIHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKTsKICB9CiAgZW5zdXJlQnVmZmVyKHJlcXVlc3RlZCkge30KICByZWFkQmxvY2soKSB7CiAgICB0aGlzLmRlY29kZUltYWdlKCk7CiAgfQogIGRlY29kZUltYWdlKGJ5dGVzKSB7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogICAgfQogICAgYnl0ZXMgfHw9IHRoaXMuYnl0ZXM7CiAgICBjb25zdCBqYmlnMkltYWdlID0gbmV3IEpiaWcySW1hZ2UoKTsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgaWYgKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCBnbG9iYWxzU3RyZWFtID0gdGhpcy5wYXJhbXMuZ2V0KCJKQklHMkdsb2JhbHMiKTsKICAgICAgaWYgKGdsb2JhbHNTdHJlYW0gaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgY29uc3QgZ2xvYmFscyA9IGdsb2JhbHNTdHJlYW0uZ2V0Qnl0ZXMoKTsKICAgICAgICBjaHVua3MucHVzaCh7CiAgICAgICAgICBkYXRhOiBnbG9iYWxzLAogICAgICAgICAgc3RhcnQ6IDAsCiAgICAgICAgICBlbmQ6IGdsb2JhbHMubGVuZ3RoCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGNodW5rcy5wdXNoKHsKICAgICAgZGF0YTogYnl0ZXMsCiAgICAgIHN0YXJ0OiAwLAogICAgICBlbmQ6IGJ5dGVzLmxlbmd0aAogICAgfSk7CiAgICBjb25zdCBkYXRhID0gamJpZzJJbWFnZS5wYXJzZUNodW5rcyhjaHVua3MpOwogICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHsKICAgICAgZGF0YVtpXSBePSAweGZmOwogICAgfQogICAgdGhpcy5idWZmZXIgPSBkYXRhOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBkYXRhTGVuZ3RoOwogICAgdGhpcy5lb2YgPSB0cnVlOwogICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogIH0KICBnZXQgY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIoKSB7CiAgICByZXR1cm4gdGhpcy5zdHJlYW0uaXNBc3luYzsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2pweF9zdHJlYW0uanMKCgoKY2xhc3MgSnB4U3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5kaWN0ID0gc3RyZWFtLmRpY3Q7CiAgICB0aGlzLm1heWJlTGVuZ3RoID0gbWF5YmVMZW5ndGg7CiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICB9CiAgZ2V0IGJ5dGVzKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYnl0ZXMiLCB0aGlzLnN0cmVhbS5nZXRCeXRlcyh0aGlzLm1heWJlTGVuZ3RoKSk7CiAgfQogIGVuc3VyZUJ1ZmZlcihyZXF1ZXN0ZWQpIHt9CiAgcmVhZEJsb2NrKGRlY29kZXJPcHRpb25zKSB7CiAgICB1bnJlYWNoYWJsZSgiSnB4U3RyZWFtLnJlYWRCbG9jayIpOwogIH0KICBnZXQgaXNBc3luY0RlY29kZXIoKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgYXN5bmMgZGVjb2RlSW1hZ2UoYnl0ZXMsIGRlY29kZXJPcHRpb25zKSB7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogICAgfQogICAgYnl0ZXMgfHw9IHRoaXMuYnl0ZXM7CiAgICB0aGlzLmJ1ZmZlciA9IGF3YWl0IEpweEltYWdlLmRlY29kZShieXRlcywgZGVjb2Rlck9wdGlvbnMpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlci5sZW5ndGg7CiAgICB0aGlzLmVvZiA9IHRydWU7CiAgICByZXR1cm4gdGhpcy5idWZmZXI7CiAgfQogIGdldCBjYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlcigpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbS5pc0FzeW5jOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvbHp3X3N0cmVhbS5qcwoKY2xhc3MgTFpXU3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIsIG1heWJlTGVuZ3RoLCBlYXJseUNoYW5nZSkgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHIgPSBzdHI7CiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKICAgIHRoaXMuY2FjaGVkRGF0YSA9IDA7CiAgICB0aGlzLmJpdHNDYWNoZWQgPSAwOwogICAgY29uc3QgbWF4THp3RGljdGlvbmFyeVNpemUgPSA0MDk2OwogICAgY29uc3QgbHp3U3RhdGUgPSB7CiAgICAgIGVhcmx5Q2hhbmdlLAogICAgICBjb2RlTGVuZ3RoOiA5LAogICAgICBuZXh0Q29kZTogMjU4LAogICAgICBkaWN0aW9uYXJ5VmFsdWVzOiBuZXcgVWludDhBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksCiAgICAgIGRpY3Rpb25hcnlMZW5ndGhzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAogICAgICBkaWN0aW9uYXJ5UHJldkNvZGVzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAogICAgICBjdXJyZW50U2VxdWVuY2U6IG5ldyBVaW50OEFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSwKICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoOiAwCiAgICB9OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkgewogICAgICBsendTdGF0ZS5kaWN0aW9uYXJ5VmFsdWVzW2ldID0gaTsKICAgICAgbHp3U3RhdGUuZGljdGlvbmFyeUxlbmd0aHNbaV0gPSAxOwogICAgfQogICAgdGhpcy5sendTdGF0ZSA9IGx6d1N0YXRlOwogIH0KICByZWFkQml0cyhuKSB7CiAgICBsZXQgYml0c0NhY2hlZCA9IHRoaXMuYml0c0NhY2hlZDsKICAgIGxldCBjYWNoZWREYXRhID0gdGhpcy5jYWNoZWREYXRhOwogICAgd2hpbGUgKGJpdHNDYWNoZWQgPCBuKSB7CiAgICAgIGNvbnN0IGMgPSB0aGlzLnN0ci5nZXRCeXRlKCk7CiAgICAgIGlmIChjID09PSAtMSkgewogICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjYWNoZWREYXRhID0gY2FjaGVkRGF0YSA8PCA4IHwgYzsKICAgICAgYml0c0NhY2hlZCArPSA4OwogICAgfQogICAgdGhpcy5iaXRzQ2FjaGVkID0gYml0c0NhY2hlZCAtPSBuOwogICAgdGhpcy5jYWNoZWREYXRhID0gY2FjaGVkRGF0YTsKICAgIHRoaXMubGFzdENvZGUgPSBudWxsOwogICAgcmV0dXJuIGNhY2hlZERhdGEgPj4+IGJpdHNDYWNoZWQgJiAoMSA8PCBuKSAtIDE7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGNvbnN0IGJsb2NrU2l6ZSA9IDUxMiwKICAgICAgZGVjb2RlZFNpemVEZWx0YSA9IGJsb2NrU2l6ZTsKICAgIGxldCBlc3RpbWF0ZWREZWNvZGVkU2l6ZSA9IGJsb2NrU2l6ZSAqIDI7CiAgICBsZXQgaSwgaiwgcTsKICAgIGNvbnN0IGx6d1N0YXRlID0gdGhpcy5sendTdGF0ZTsKICAgIGlmICghbHp3U3RhdGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZWFybHlDaGFuZ2UgPSBsendTdGF0ZS5lYXJseUNoYW5nZTsKICAgIGxldCBuZXh0Q29kZSA9IGx6d1N0YXRlLm5leHRDb2RlOwogICAgY29uc3QgZGljdGlvbmFyeVZhbHVlcyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlWYWx1ZXM7CiAgICBjb25zdCBkaWN0aW9uYXJ5TGVuZ3RocyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlMZW5ndGhzOwogICAgY29uc3QgZGljdGlvbmFyeVByZXZDb2RlcyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlQcmV2Q29kZXM7CiAgICBsZXQgY29kZUxlbmd0aCA9IGx6d1N0YXRlLmNvZGVMZW5ndGg7CiAgICBsZXQgcHJldkNvZGUgPSBsendTdGF0ZS5wcmV2Q29kZTsKICAgIGNvbnN0IGN1cnJlbnRTZXF1ZW5jZSA9IGx6d1N0YXRlLmN1cnJlbnRTZXF1ZW5jZTsKICAgIGxldCBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2VMZW5ndGg7CiAgICBsZXQgZGVjb2RlZExlbmd0aCA9IDA7CiAgICBsZXQgY3VycmVudEJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgbGV0IGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpOwogICAgZm9yIChpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7CiAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLnJlYWRCaXRzKGNvZGVMZW5ndGgpOwogICAgICBjb25zdCBoYXNQcmV2ID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoID4gMDsKICAgICAgaWYgKGNvZGUgPCAyNTYpIHsKICAgICAgICBjdXJyZW50U2VxdWVuY2VbMF0gPSBjb2RlOwogICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IDE7CiAgICAgIH0gZWxzZSBpZiAoY29kZSA+PSAyNTgpIHsKICAgICAgICBpZiAoY29kZSA8IG5leHRDb2RlKSB7CiAgICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBkaWN0aW9uYXJ5TGVuZ3Roc1tjb2RlXTsKICAgICAgICAgIGZvciAoaiA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCAtIDEsIHEgPSBjb2RlOyBqID49IDA7IGotLSkgewogICAgICAgICAgICBjdXJyZW50U2VxdWVuY2Vbal0gPSBkaWN0aW9uYXJ5VmFsdWVzW3FdOwogICAgICAgICAgICBxID0gZGljdGlvbmFyeVByZXZDb2Rlc1txXTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudFNlcXVlbmNlW2N1cnJlbnRTZXF1ZW5jZUxlbmd0aCsrXSA9IGN1cnJlbnRTZXF1ZW5jZVswXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMjU2KSB7CiAgICAgICAgY29kZUxlbmd0aCA9IDk7CiAgICAgICAgbmV4dENvZGUgPSAyNTg7CiAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gMDsKICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgZGVsZXRlIHRoaXMubHp3U3RhdGU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGhhc1ByZXYpIHsKICAgICAgICBkaWN0aW9uYXJ5UHJldkNvZGVzW25leHRDb2RlXSA9IHByZXZDb2RlOwogICAgICAgIGRpY3Rpb25hcnlMZW5ndGhzW25leHRDb2RlXSA9IGRpY3Rpb25hcnlMZW5ndGhzW3ByZXZDb2RlXSArIDE7CiAgICAgICAgZGljdGlvbmFyeVZhbHVlc1tuZXh0Q29kZV0gPSBjdXJyZW50U2VxdWVuY2VbMF07CiAgICAgICAgbmV4dENvZGUrKzsKICAgICAgICBjb2RlTGVuZ3RoID0gbmV4dENvZGUgKyBlYXJseUNoYW5nZSAmIG5leHRDb2RlICsgZWFybHlDaGFuZ2UgLSAxID8gY29kZUxlbmd0aCA6IE1hdGgubWluKE1hdGgubG9nKG5leHRDb2RlICsgZWFybHlDaGFuZ2UpIC8gMC42OTMxNDcxODA1NTk5NDUzICsgMSwgMTIpIHwgMDsKICAgICAgfQogICAgICBwcmV2Q29kZSA9IGNvZGU7CiAgICAgIGRlY29kZWRMZW5ndGggKz0gY3VycmVudFNlcXVlbmNlTGVuZ3RoOwogICAgICBpZiAoZXN0aW1hdGVkRGVjb2RlZFNpemUgPCBkZWNvZGVkTGVuZ3RoKSB7CiAgICAgICAgZG8gewogICAgICAgICAgZXN0aW1hdGVkRGVjb2RlZFNpemUgKz0gZGVjb2RlZFNpemVEZWx0YTsKICAgICAgICB9IHdoaWxlIChlc3RpbWF0ZWREZWNvZGVkU2l6ZSA8IGRlY29kZWRMZW5ndGgpOwogICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpOwogICAgICB9CiAgICAgIGZvciAoaiA9IDA7IGogPCBjdXJyZW50U2VxdWVuY2VMZW5ndGg7IGorKykgewogICAgICAgIGJ1ZmZlcltjdXJyZW50QnVmZmVyTGVuZ3RoKytdID0gY3VycmVudFNlcXVlbmNlW2pdOwogICAgICB9CiAgICB9CiAgICBsendTdGF0ZS5uZXh0Q29kZSA9IG5leHRDb2RlOwogICAgbHp3U3RhdGUuY29kZUxlbmd0aCA9IGNvZGVMZW5ndGg7CiAgICBsendTdGF0ZS5wcmV2Q29kZSA9IHByZXZDb2RlOwogICAgbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBjdXJyZW50QnVmZmVyTGVuZ3RoOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvcHJlZGljdG9yX3N0cmVhbS5qcwoKCgpjbGFzcyBQcmVkaWN0b3JTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0ciwgbWF5YmVMZW5ndGgsIHBhcmFtcykgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgaWYgKCEocGFyYW1zIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIHN0cjsKICAgIH0KICAgIGNvbnN0IHByZWRpY3RvciA9IHRoaXMucHJlZGljdG9yID0gcGFyYW1zLmdldCgiUHJlZGljdG9yIikgfHwgMTsKICAgIGlmIChwcmVkaWN0b3IgPD0gMSkgewogICAgICByZXR1cm4gc3RyOwogICAgfQogICAgaWYgKHByZWRpY3RvciAhPT0gMiAmJiAocHJlZGljdG9yIDwgMTAgfHwgcHJlZGljdG9yID4gMTUpKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5zdXBwb3J0ZWQgcHJlZGljdG9yOiAke3ByZWRpY3Rvcn1gKTsKICAgIH0KICAgIHRoaXMucmVhZEJsb2NrID0gcHJlZGljdG9yID09PSAyID8gdGhpcy5yZWFkQmxvY2tUaWZmIDogdGhpcy5yZWFkQmxvY2tQbmc7CiAgICB0aGlzLnN0ciA9IHN0cjsKICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnMgPSBwYXJhbXMuZ2V0KCJDb2xvcnMiKSB8fCAxOwogICAgY29uc3QgYml0cyA9IHRoaXMuYml0cyA9IHBhcmFtcy5nZXQoIkJQQyIsICJCaXRzUGVyQ29tcG9uZW50IikgfHwgODsKICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMgPSBwYXJhbXMuZ2V0KCJDb2x1bW5zIikgfHwgMTsKICAgIHRoaXMucGl4Qnl0ZXMgPSBjb2xvcnMgKiBiaXRzICsgNyA+PiAzOwogICAgdGhpcy5yb3dCeXRlcyA9IGNvbHVtbnMgKiBjb2xvcnMgKiBiaXRzICsgNyA+PiAzOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHJlYWRCbG9ja1RpZmYoKSB7CiAgICBjb25zdCByb3dCeXRlcyA9IHRoaXMucm93Qnl0ZXM7CiAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIHJvd0J5dGVzKTsKICAgIGNvbnN0IGJpdHMgPSB0aGlzLmJpdHM7CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmNvbG9yczsKICAgIGNvbnN0IHJhd0J5dGVzID0gdGhpcy5zdHIuZ2V0Qnl0ZXMocm93Qnl0ZXMpOwogICAgdGhpcy5lb2YgPSAhcmF3Qnl0ZXMubGVuZ3RoOwogICAgaWYgKHRoaXMuZW9mKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBpbmJ1ZiA9IDAsCiAgICAgIG91dGJ1ZiA9IDA7CiAgICBsZXQgaW5iaXRzID0gMCwKICAgICAgb3V0Yml0cyA9IDA7CiAgICBsZXQgcG9zID0gYnVmZmVyTGVuZ3RoOwogICAgbGV0IGk7CiAgICBpZiAoYml0cyA9PT0gMSAmJiBjb2xvcnMgPT09IDEpIHsKICAgICAgZm9yIChpID0gMDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKICAgICAgICBsZXQgYyA9IHJhd0J5dGVzW2ldIF4gaW5idWY7CiAgICAgICAgYyBePSBjID4+IDE7CiAgICAgICAgYyBePSBjID4+IDI7CiAgICAgICAgYyBePSBjID4+IDQ7CiAgICAgICAgaW5idWYgPSAoYyAmIDEpIDw8IDc7CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IGM7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYml0cyA9PT0gOCkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JzOyArK2kpIHsKICAgICAgICBidWZmZXJbcG9zKytdID0gcmF3Qnl0ZXNbaV07CiAgICAgIH0KICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgYnVmZmVyW3Bvc10gPSBidWZmZXJbcG9zIC0gY29sb3JzXSArIHJhd0J5dGVzW2ldOwogICAgICAgIHBvcysrOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGJpdHMgPT09IDE2KSB7CiAgICAgIGNvbnN0IGJ5dGVzUGVyUGl4ZWwgPSBjb2xvcnMgKiAyOwogICAgICBmb3IgKGkgPSAwOyBpIDwgYnl0ZXNQZXJQaXhlbDsgKytpKSB7CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IHJhd0J5dGVzW2ldOwogICAgICB9CiAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7IGkgKz0gMikgewogICAgICAgIGNvbnN0IHN1bSA9ICgocmF3Qnl0ZXNbaV0gJiAweGZmKSA8PCA4KSArIChyYXdCeXRlc1tpICsgMV0gJiAweGZmKSArICgoYnVmZmVyW3BvcyAtIGJ5dGVzUGVyUGl4ZWxdICYgMHhmZikgPDwgOCkgKyAoYnVmZmVyW3BvcyAtIGJ5dGVzUGVyUGl4ZWwgKyAxXSAmIDB4ZmYpOwogICAgICAgIGJ1ZmZlcltwb3MrK10gPSBzdW0gPj4gOCAmIDB4ZmY7CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IHN1bSAmIDB4ZmY7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGNvbXBBcnJheSA9IG5ldyBVaW50OEFycmF5KGNvbG9ycyArIDEpOwogICAgICBjb25zdCBiaXRNYXNrID0gKDEgPDwgYml0cykgLSAxOwogICAgICBsZXQgaiA9IDAsCiAgICAgICAgayA9IGJ1ZmZlckxlbmd0aDsKICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1uczsKICAgICAgZm9yIChpID0gMDsgaSA8IGNvbHVtbnM7ICsraSkgewogICAgICAgIGZvciAobGV0IGtrID0gMDsga2sgPCBjb2xvcnM7ICsra2spIHsKICAgICAgICAgIGlmIChpbmJpdHMgPCBiaXRzKSB7CiAgICAgICAgICAgIGluYnVmID0gaW5idWYgPDwgOCB8IHJhd0J5dGVzW2orK10gJiAweGZmOwogICAgICAgICAgICBpbmJpdHMgKz0gODsKICAgICAgICAgIH0KICAgICAgICAgIGNvbXBBcnJheVtra10gPSBjb21wQXJyYXlba2tdICsgKGluYnVmID4+IGluYml0cyAtIGJpdHMpICYgYml0TWFzazsKICAgICAgICAgIGluYml0cyAtPSBiaXRzOwogICAgICAgICAgb3V0YnVmID0gb3V0YnVmIDw8IGJpdHMgfCBjb21wQXJyYXlba2tdOwogICAgICAgICAgb3V0Yml0cyArPSBiaXRzOwogICAgICAgICAgaWYgKG91dGJpdHMgPj0gOCkgewogICAgICAgICAgICBidWZmZXJbaysrXSA9IG91dGJ1ZiA+PiBvdXRiaXRzIC0gOCAmIDB4ZmY7CiAgICAgICAgICAgIG91dGJpdHMgLT0gODsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG91dGJpdHMgPiAwKSB7CiAgICAgICAgYnVmZmVyW2srK10gPSAob3V0YnVmIDw8IDggLSBvdXRiaXRzKSArIChpbmJ1ZiAmICgxIDw8IDggLSBvdXRiaXRzKSAtIDEpOwogICAgICB9CiAgICB9CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSByb3dCeXRlczsKICB9CiAgcmVhZEJsb2NrUG5nKCkgewogICAgY29uc3Qgcm93Qnl0ZXMgPSB0aGlzLnJvd0J5dGVzOwogICAgY29uc3QgcGl4Qnl0ZXMgPSB0aGlzLnBpeEJ5dGVzOwogICAgY29uc3QgcHJlZGljdG9yID0gdGhpcy5zdHIuZ2V0Qnl0ZSgpOwogICAgY29uc3QgcmF3Qnl0ZXMgPSB0aGlzLnN0ci5nZXRCeXRlcyhyb3dCeXRlcyk7CiAgICB0aGlzLmVvZiA9ICFyYXdCeXRlcy5sZW5ndGg7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyByb3dCeXRlcyk7CiAgICBsZXQgcHJldlJvdyA9IGJ1ZmZlci5zdWJhcnJheShidWZmZXJMZW5ndGggLSByb3dCeXRlcywgYnVmZmVyTGVuZ3RoKTsKICAgIGlmIChwcmV2Um93Lmxlbmd0aCA9PT0gMCkgewogICAgICBwcmV2Um93ID0gbmV3IFVpbnQ4QXJyYXkocm93Qnl0ZXMpOwogICAgfQogICAgbGV0IGksCiAgICAgIGogPSBidWZmZXJMZW5ndGgsCiAgICAgIHVwLAogICAgICBjOwogICAgc3dpdGNoIChwcmVkaWN0b3IpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaisrXSA9IHJhd0J5dGVzW2ldOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaXhCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaisrXSA9IHJhd0J5dGVzW2ldOwogICAgICAgIH0KICAgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKICAgICAgICAgIGJ1ZmZlcltqXSA9IGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdICsgcmF3Qnl0ZXNbaV0gJiAweGZmOwogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAyOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaisrXSA9IHByZXZSb3dbaV0gKyByYXdCeXRlc1tpXSAmIDB4ZmY7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeEJ5dGVzOyArK2kpIHsKICAgICAgICAgIGJ1ZmZlcltqKytdID0gKHByZXZSb3dbaV0gPj4gMSkgKyByYXdCeXRlc1tpXTsKICAgICAgICB9CiAgICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbal0gPSAocHJldlJvd1tpXSArIGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdID4+IDEpICsgcmF3Qnl0ZXNbaV0gJiAweGZmOwogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSA0OgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaXhCeXRlczsgKytpKSB7CiAgICAgICAgICB1cCA9IHByZXZSb3dbaV07CiAgICAgICAgICBjID0gcmF3Qnl0ZXNbaV07CiAgICAgICAgICBidWZmZXJbaisrXSA9IHVwICsgYzsKICAgICAgICB9CiAgICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgICB1cCA9IHByZXZSb3dbaV07CiAgICAgICAgICBjb25zdCB1cExlZnQgPSBwcmV2Um93W2kgLSBwaXhCeXRlc107CiAgICAgICAgICBjb25zdCBsZWZ0ID0gYnVmZmVyW2ogLSBwaXhCeXRlc107CiAgICAgICAgICBjb25zdCBwID0gbGVmdCArIHVwIC0gdXBMZWZ0OwogICAgICAgICAgbGV0IHBhID0gcCAtIGxlZnQ7CiAgICAgICAgICBpZiAocGEgPCAwKSB7CiAgICAgICAgICAgIHBhID0gLXBhOwogICAgICAgICAgfQogICAgICAgICAgbGV0IHBiID0gcCAtIHVwOwogICAgICAgICAgaWYgKHBiIDwgMCkgewogICAgICAgICAgICBwYiA9IC1wYjsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBwYyA9IHAgLSB1cExlZnQ7CiAgICAgICAgICBpZiAocGMgPCAwKSB7CiAgICAgICAgICAgIHBjID0gLXBjOwogICAgICAgICAgfQogICAgICAgICAgYyA9IHJhd0J5dGVzW2ldOwogICAgICAgICAgaWYgKHBhIDw9IHBiICYmIHBhIDw9IHBjKSB7CiAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gbGVmdCArIGM7CiAgICAgICAgICB9IGVsc2UgaWYgKHBiIDw9IHBjKSB7CiAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gdXAgKyBjOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnVmZmVyW2orK10gPSB1cExlZnQgKyBjOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVuc3VwcG9ydGVkIHByZWRpY3RvcjogJHtwcmVkaWN0b3J9YCk7CiAgICB9CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSByb3dCeXRlczsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3J1bl9sZW5ndGhfc3RyZWFtLmpzCgpjbGFzcyBSdW5MZW5ndGhTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0ciwgbWF5YmVMZW5ndGgpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGNvbnN0IHJlcGVhdEhlYWRlciA9IHRoaXMuc3RyLmdldEJ5dGVzKDIpOwogICAgaWYgKCFyZXBlYXRIZWFkZXIgfHwgcmVwZWF0SGVhZGVyLmxlbmd0aCA8IDIgfHwgcmVwZWF0SGVhZGVyWzBdID09PSAxMjgpIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgYnVmZmVyOwogICAgbGV0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgbGV0IG4gPSByZXBlYXRIZWFkZXJbMF07CiAgICBpZiAobiA8IDEyOCkgewogICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBuICsgMSk7CiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSByZXBlYXRIZWFkZXJbMV07CiAgICAgIGlmIChuID4gMCkgewogICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc3RyLmdldEJ5dGVzKG4pOwogICAgICAgIGJ1ZmZlci5zZXQoc291cmNlLCBidWZmZXJMZW5ndGgpOwogICAgICAgIGJ1ZmZlckxlbmd0aCArPSBuOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBuID0gMjU3IC0gbjsKICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgbiArIDEpOwogICAgICBidWZmZXIuZmlsbChyZXBlYXRIZWFkZXJbMV0sIGJ1ZmZlckxlbmd0aCwgYnVmZmVyTGVuZ3RoICsgbik7CiAgICAgIGJ1ZmZlckxlbmd0aCArPSBuOwogICAgfQogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9wYXJzZXIuanMKCgoKCgoKCgoKCgoKCgpjb25zdCBNQVhfTEVOR1RIX1RPX0NBQ0hFID0gMTAwMDsKZnVuY3Rpb24gZ2V0SW5saW5lSW1hZ2VDYWNoZUtleShieXRlcykgewogIGNvbnN0IHN0ckJ1ZiA9IFtdLAogICAgaWkgPSBieXRlcy5sZW5ndGg7CiAgbGV0IGkgPSAwOwogIHdoaWxlIChpIDwgaWkgLSAxKSB7CiAgICBzdHJCdWYucHVzaChieXRlc1tpKytdIDw8IDggfCBieXRlc1tpKytdKTsKICB9CiAgaWYgKGkgPCBpaSkgewogICAgc3RyQnVmLnB1c2goYnl0ZXNbaV0pOwogIH0KICByZXR1cm4gaWkgKyAiXyIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHN0ckJ1Zik7Cn0KY2xhc3MgUGFyc2VyIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBsZXhlciwKICAgIHhyZWYsCiAgICBhbGxvd1N0cmVhbXMgPSBmYWxzZSwKICAgIHJlY292ZXJ5TW9kZSA9IGZhbHNlCiAgfSkgewogICAgdGhpcy5sZXhlciA9IGxleGVyOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuYWxsb3dTdHJlYW1zID0gYWxsb3dTdHJlYW1zOwogICAgdGhpcy5yZWNvdmVyeU1vZGUgPSByZWNvdmVyeU1vZGU7CiAgICB0aGlzLmltYWdlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5faW1hZ2VJZCA9IDA7CiAgICB0aGlzLnJlZmlsbCgpOwogIH0KICByZWZpbGwoKSB7CiAgICB0aGlzLmJ1ZjEgPSB0aGlzLmxleGVyLmdldE9iaigpOwogICAgdGhpcy5idWYyID0gdGhpcy5sZXhlci5nZXRPYmooKTsKICB9CiAgc2hpZnQoKSB7CiAgICBpZiAodGhpcy5idWYyIGluc3RhbmNlb2YgQ21kICYmIHRoaXMuYnVmMi5jbWQgPT09ICJJRCIpIHsKICAgICAgdGhpcy5idWYxID0gdGhpcy5idWYyOwogICAgICB0aGlzLmJ1ZjIgPSBudWxsOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5idWYxID0gdGhpcy5idWYyOwogICAgICB0aGlzLmJ1ZjIgPSB0aGlzLmxleGVyLmdldE9iaigpOwogICAgfQogIH0KICB0cnlTaGlmdCgpIHsKICAgIHRyeSB7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgZ2V0T2JqKGNpcGhlclRyYW5zZm9ybSA9IG51bGwpIHsKICAgIGNvbnN0IGJ1ZjEgPSB0aGlzLmJ1ZjE7CiAgICB0aGlzLnNoaWZ0KCk7CiAgICBpZiAoYnVmMSBpbnN0YW5jZW9mIENtZCkgewogICAgICBzd2l0Y2ggKGJ1ZjEuY21kKSB7CiAgICAgICAgY2FzZSAiQkkiOgogICAgICAgICAgcmV0dXJuIHRoaXMubWFrZUlubGluZUltYWdlKGNpcGhlclRyYW5zZm9ybSk7CiAgICAgICAgY2FzZSAiWyI6CiAgICAgICAgICBjb25zdCBhcnJheSA9IFtdOwogICAgICAgICAgd2hpbGUgKCFpc0NtZCh0aGlzLmJ1ZjEsICJdIikgJiYgdGhpcy5idWYxICE9PSBFT0YpIHsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmJ1ZjEgPT09IEVPRikgewogICAgICAgICAgICBpZiAodGhpcy5yZWNvdmVyeU1vZGUpIHsKICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlckVPRkV4Y2VwdGlvbigiRW5kIG9mIGZpbGUgaW5zaWRlIGFycmF5LiIpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5zaGlmdCgpOwogICAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICAgIGNhc2UgIjw8IjoKICAgICAgICAgIGNvbnN0IGRpY3QgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgICAgICAgd2hpbGUgKCFpc0NtZCh0aGlzLmJ1ZjEsICI+PiIpICYmIHRoaXMuYnVmMSAhPT0gRU9GKSB7CiAgICAgICAgICAgIGlmICghKHRoaXMuYnVmMSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgICAgICAgaW5mbygiTWFsZm9ybWVkIGRpY3Rpb25hcnk6IGtleSBtdXN0IGJlIGEgbmFtZSBvYmplY3QiKTsKICAgICAgICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5idWYxLm5hbWU7CiAgICAgICAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgICAgICAgaWYgKHRoaXMuYnVmMSA9PT0gRU9GKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGljdC5zZXQoa2V5LCB0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmJ1ZjEgPT09IEVPRikgewogICAgICAgICAgICBpZiAodGhpcy5yZWNvdmVyeU1vZGUpIHsKICAgICAgICAgICAgICByZXR1cm4gZGljdDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VyRU9GRXhjZXB0aW9uKCJFbmQgb2YgZmlsZSBpbnNpZGUgZGljdGlvbmFyeS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc0NtZCh0aGlzLmJ1ZjIsICJzdHJlYW0iKSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5hbGxvd1N0cmVhbXMgPyB0aGlzLm1ha2VTdHJlYW0oZGljdCwgY2lwaGVyVHJhbnNmb3JtKSA6IGRpY3Q7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgICByZXR1cm4gZGljdDsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGJ1ZjE7CiAgICAgIH0KICAgIH0KICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGJ1ZjEpKSB7CiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHRoaXMuYnVmMSkgJiYgaXNDbWQodGhpcy5idWYyLCAiUiIpKSB7CiAgICAgICAgY29uc3QgcmVmID0gUmVmLmdldChidWYxLCB0aGlzLmJ1ZjEpOwogICAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgcmV0dXJuIHJlZjsKICAgICAgfQogICAgICByZXR1cm4gYnVmMTsKICAgIH0KICAgIGlmICh0eXBlb2YgYnVmMSA9PT0gInN0cmluZyIpIHsKICAgICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgewogICAgICAgIHJldHVybiBjaXBoZXJUcmFuc2Zvcm0uZGVjcnlwdFN0cmluZyhidWYxKTsKICAgICAgfQogICAgICByZXR1cm4gYnVmMTsKICAgIH0KICAgIHJldHVybiBidWYxOwogIH0KICBmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IEUgPSAweDQ1LAogICAgICBJID0gMHg0OSwKICAgICAgU1BBQ0UgPSAweDIwLAogICAgICBMRiA9IDB4YSwKICAgICAgQ1IgPSAweGQsCiAgICAgIE5VTCA9IDB4MDsKICAgIGNvbnN0IHsKICAgICAgICBrbm93bkNvbW1hbmRzCiAgICAgIH0gPSB0aGlzLmxleGVyLAogICAgICBzdGFydFBvcyA9IHN0cmVhbS5wb3MsCiAgICAgIG4gPSAxNTsKICAgIGxldCBzdGF0ZSA9IDAsCiAgICAgIGNoLAogICAgICBtYXliZUVJUG9zOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgewogICAgICBpZiAoc3RhdGUgPT09IDApIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBFID8gMSA6IDA7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IDEpIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBJID8gMiA6IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGNoID09PSBTUEFDRSB8fCBjaCA9PT0gTEYgfHwgY2ggPT09IENSKSB7CiAgICAgICAgICBtYXliZUVJUG9zID0gc3RyZWFtLnBvczsKICAgICAgICAgIGNvbnN0IGZvbGxvd2luZ0J5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhuKTsKICAgICAgICAgIGNvbnN0IGlpID0gZm9sbG93aW5nQnl0ZXMubGVuZ3RoOwogICAgICAgICAgaWYgKGlpID09PSAwKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgIGNoID0gZm9sbG93aW5nQnl0ZXNbaV07CiAgICAgICAgICAgIGlmIChjaCA9PT0gTlVMICYmIGZvbGxvd2luZ0J5dGVzW2kgKyAxXSAhPT0gTlVMKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IgJiYgKGNoIDwgU1BBQ0UgfHwgY2ggPiAweDdmKSkgewogICAgICAgICAgICAgIHN0YXRlID0gMDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlICE9PSAyKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFrbm93bkNvbW1hbmRzKSB7CiAgICAgICAgICAgIHdhcm4oImZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kIC0gYGxleGVyLmtub3duQ29tbWFuZHNgIGlzIHVuZGVmaW5lZC4iKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCB0bXBMZXhlciA9IG5ldyBMZXhlcihuZXcgU3RyZWFtKHN0cmVhbS5wZWVrQnl0ZXMoNSAqIG4pKSwga25vd25Db21tYW5kcyk7CiAgICAgICAgICB0bXBMZXhlci5faGV4U3RyaW5nV2FybiA9ICgpID0+IHt9OwogICAgICAgICAgbGV0IG51bUFyZ3MgPSAwOwogICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgY29uc3QgbmV4dE9iaiA9IHRtcExleGVyLmdldE9iaigpOwogICAgICAgICAgICBpZiAobmV4dE9iaiA9PT0gRU9GKSB7CiAgICAgICAgICAgICAgc3RhdGUgPSAwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXh0T2JqIGluc3RhbmNlb2YgQ21kKSB7CiAgICAgICAgICAgICAgY29uc3Qga25vd25Db21tYW5kID0ga25vd25Db21tYW5kc1tuZXh0T2JqLmNtZF07CiAgICAgICAgICAgICAgaWYgKCFrbm93bkNvbW1hbmQpIHsKICAgICAgICAgICAgICAgIHN0YXRlID0gMDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoa25vd25Db21tYW5kLnZhcmlhYmxlQXJncyA/IG51bUFyZ3MgPD0ga25vd25Db21tYW5kLm51bUFyZ3MgOiBudW1BcmdzID09PSBrbm93bkNvbW1hbmQubnVtQXJncykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG51bUFyZ3MgPSAwOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG51bUFyZ3MrKzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdGF0ZSA9PT0gMikgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUgPSAwOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGNoID09PSAtMSkgewogICAgICB3YXJuKCJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZDogIiArICJSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB3aXRob3V0IGZpbmRpbmcgYSB2YWxpZCBFSSBtYXJrZXIiKTsKICAgICAgaWYgKG1heWJlRUlQb3MpIHsKICAgICAgICB3YXJuKCcuLi4gdHJ5aW5nIHRvIHJlY292ZXIgYnkgdXNpbmcgdGhlIGxhc3QgIkVJIiBvY2N1cnJlbmNlLicpOwogICAgICAgIHN0cmVhbS5za2lwKC0oc3RyZWFtLnBvcyAtIG1heWJlRUlQb3MpKTsKICAgICAgfQogICAgfQogICAgbGV0IGVuZE9mZnNldCA9IDQ7CiAgICBzdHJlYW0uc2tpcCgtZW5kT2Zmc2V0KTsKICAgIGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CiAgICBzdHJlYW0uc2tpcChlbmRPZmZzZXQpOwogICAgaWYgKCFpc1doaXRlU3BhY2UoY2gpKSB7CiAgICAgIGVuZE9mZnNldC0tOwogICAgfQogICAgcmV0dXJuIHN0cmVhbS5wb3MgLSBlbmRPZmZzZXQgLSBzdGFydFBvczsKICB9CiAgZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKICAgIGxldCBmb3VuZEVPSSA9IGZhbHNlLAogICAgICBiLAogICAgICBtYXJrZXJMZW5ndGg7CiAgICB3aGlsZSAoKGIgPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKGIgIT09IDB4ZmYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBzd2l0Y2ggKHN0cmVhbS5nZXRCeXRlKCkpIHsKICAgICAgICBjYXNlIDB4MDA6CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmY6CiAgICAgICAgICBzdHJlYW0uc2tpcCgtMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZDk6CiAgICAgICAgICBmb3VuZEVPSSA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4YzA6CiAgICAgICAgY2FzZSAweGMxOgogICAgICAgIGNhc2UgMHhjMjoKICAgICAgICBjYXNlIDB4YzM6CiAgICAgICAgY2FzZSAweGM1OgogICAgICAgIGNhc2UgMHhjNjoKICAgICAgICBjYXNlIDB4Yzc6CiAgICAgICAgY2FzZSAweGM5OgogICAgICAgIGNhc2UgMHhjYToKICAgICAgICBjYXNlIDB4Y2I6CiAgICAgICAgY2FzZSAweGNkOgogICAgICAgIGNhc2UgMHhjZToKICAgICAgICBjYXNlIDB4Y2Y6CiAgICAgICAgY2FzZSAweGM0OgogICAgICAgIGNhc2UgMHhjYzoKICAgICAgICBjYXNlIDB4ZGE6CiAgICAgICAgY2FzZSAweGRiOgogICAgICAgIGNhc2UgMHhkYzoKICAgICAgICBjYXNlIDB4ZGQ6CiAgICAgICAgY2FzZSAweGRlOgogICAgICAgIGNhc2UgMHhkZjoKICAgICAgICBjYXNlIDB4ZTA6CiAgICAgICAgY2FzZSAweGUxOgogICAgICAgIGNhc2UgMHhlMjoKICAgICAgICBjYXNlIDB4ZTM6CiAgICAgICAgY2FzZSAweGU0OgogICAgICAgIGNhc2UgMHhlNToKICAgICAgICBjYXNlIDB4ZTY6CiAgICAgICAgY2FzZSAweGU3OgogICAgICAgIGNhc2UgMHhlODoKICAgICAgICBjYXNlIDB4ZTk6CiAgICAgICAgY2FzZSAweGVhOgogICAgICAgIGNhc2UgMHhlYjoKICAgICAgICBjYXNlIDB4ZWM6CiAgICAgICAgY2FzZSAweGVkOgogICAgICAgIGNhc2UgMHhlZToKICAgICAgICBjYXNlIDB4ZWY6CiAgICAgICAgY2FzZSAweGZlOgogICAgICAgICAgbWFya2VyTGVuZ3RoID0gc3RyZWFtLmdldFVpbnQxNigpOwogICAgICAgICAgaWYgKG1hcmtlckxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgc3RyZWFtLnNraXAobWFya2VyTGVuZ3RoIC0gMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW0uc2tpcCgtMik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoZm91bmRFT0kpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0YXJ0UG9zOwogICAgaWYgKGIgPT09IC0xKSB7CiAgICAgIHdhcm4oIklubGluZSBEQ1REZWNvZGUgaW1hZ2Ugc3RyZWFtOiAiICsgIkVPSSBtYXJrZXIgbm90IGZvdW5kLCBzZWFyY2hpbmcgZm9yIC9FSS8gaW5zdGVhZC4iKTsKICAgICAgc3RyZWFtLnNraXAoLWxlbmd0aCk7CiAgICAgIHJldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CiAgICB9CiAgICB0aGlzLmlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pOwogICAgcmV0dXJuIGxlbmd0aDsKICB9CiAgZmluZEFTQ0lJODVEZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKSB7CiAgICBjb25zdCBUSUxERSA9IDB4N2UsCiAgICAgIEdUID0gMHgzZTsKICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKICAgIGxldCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKGNoID09PSBUSUxERSkgewogICAgICAgIGNvbnN0IHRpbGRlUG9zID0gc3RyZWFtLnBvczsKICAgICAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpOwogICAgICAgIHdoaWxlIChpc1doaXRlU3BhY2UoY2gpKSB7CiAgICAgICAgICBzdHJlYW0uc2tpcCgpOwogICAgICAgICAgY2ggPSBzdHJlYW0ucGVla0J5dGUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNoID09PSBHVCkgewogICAgICAgICAgc3RyZWFtLnNraXAoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLnBvcyA+IHRpbGRlUG9zKSB7CiAgICAgICAgICBjb25zdCBtYXliZUVJID0gc3RyZWFtLnBlZWtCeXRlcygyKTsKICAgICAgICAgIGlmIChtYXliZUVJWzBdID09PSAweDQ1ICYmIG1heWJlRUlbMV0gPT09IDB4NDkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CiAgICBpZiAoY2ggPT09IC0xKSB7CiAgICAgIHdhcm4oIklubGluZSBBU0NJSTg1RGVjb2RlIGltYWdlIHN0cmVhbTogIiArICJFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7CiAgICAgIHN0cmVhbS5za2lwKC1sZW5ndGgpOwogICAgICByZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgfQogICAgdGhpcy5pbmxpbmVTdHJlYW1Ta2lwRUkoc3RyZWFtKTsKICAgIHJldHVybiBsZW5ndGg7CiAgfQogIGZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IEdUID0gMHgzZTsKICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKICAgIGxldCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKGNoID09PSBHVCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CiAgICBpZiAoY2ggPT09IC0xKSB7CiAgICAgIHdhcm4oIklubGluZSBBU0NJSUhleERlY29kZSBpbWFnZSBzdHJlYW06ICIgKyAiRU9EIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpOwogICAgICBzdHJlYW0uc2tpcCgtbGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKICAgIH0KICAgIHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKHN0cmVhbSk7CiAgICByZXR1cm4gbGVuZ3RoOwogIH0KICBpbmxpbmVTdHJlYW1Ta2lwRUkoc3RyZWFtKSB7CiAgICBjb25zdCBFID0gMHg0NSwKICAgICAgSSA9IDB4NDk7CiAgICBsZXQgc3RhdGUgPSAwLAogICAgICBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKHN0YXRlID09PSAwKSB7CiAgICAgICAgc3RhdGUgPSBjaCA9PT0gRSA/IDEgOiAwOwogICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAxKSB7CiAgICAgICAgc3RhdGUgPSBjaCA9PT0gSSA/IDIgOiAwOwogICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAyKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgbWFrZUlubGluZUltYWdlKGNpcGhlclRyYW5zZm9ybSkgewogICAgY29uc3QgbGV4ZXIgPSB0aGlzLmxleGVyOwogICAgY29uc3Qgc3RyZWFtID0gbGV4ZXIuc3RyZWFtOwogICAgY29uc3QgZGljdE1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBsZXQgZGljdExlbmd0aDsKICAgIHdoaWxlICghaXNDbWQodGhpcy5idWYxLCAiSUQiKSAmJiB0aGlzLmJ1ZjEgIT09IEVPRikgewogICAgICBpZiAoISh0aGlzLmJ1ZjEgaW5zdGFuY2VvZiBOYW1lKSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRGljdGlvbmFyeSBrZXkgbXVzdCBiZSBhIG5hbWUgb2JqZWN0Iik7CiAgICAgIH0KICAgICAgY29uc3Qga2V5ID0gdGhpcy5idWYxLm5hbWU7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgaWYgKHRoaXMuYnVmMSA9PT0gRU9GKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGljdE1hcFtrZXldID0gdGhpcy5nZXRPYmooY2lwaGVyVHJhbnNmb3JtKTsKICAgIH0KICAgIGlmIChsZXhlci5iZWdpbklubGluZUltYWdlUG9zICE9PSAtMSkgewogICAgICBkaWN0TGVuZ3RoID0gc3RyZWFtLnBvcyAtIGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3M7CiAgICB9CiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihkaWN0TWFwLkYgfHwgZGljdE1hcC5GaWx0ZXIpOwogICAgbGV0IGZpbHRlck5hbWU7CiAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyLm5hbWU7CiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkgewogICAgICBjb25zdCBmaWx0ZXJaZXJvID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZmlsdGVyWzBdKTsKICAgICAgaWYgKGZpbHRlclplcm8gaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgZmlsdGVyTmFtZSA9IGZpbHRlclplcm8ubmFtZTsKICAgICAgfQogICAgfQogICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zOwogICAgbGV0IGxlbmd0aDsKICAgIHN3aXRjaCAoZmlsdGVyTmFtZSkgewogICAgICBjYXNlICJEQ1QiOgogICAgICBjYXNlICJEQ1REZWNvZGUiOgogICAgICAgIGxlbmd0aCA9IHRoaXMuZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJBODUiOgogICAgICBjYXNlICJBU0NJSTg1RGVjb2RlIjoKICAgICAgICBsZW5ndGggPSB0aGlzLmZpbmRBU0NJSTg1RGVjb2RlSW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkFIeCI6CiAgICAgIGNhc2UgIkFTQ0lJSGV4RGVjb2RlIjoKICAgICAgICBsZW5ndGggPSB0aGlzLmZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGxlbmd0aCA9IHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKICAgIH0KICAgIGxldCBjYWNoZUtleTsKICAgIGlmIChsZW5ndGggPCBNQVhfTEVOR1RIX1RPX0NBQ0hFICYmIGRpY3RMZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGluaXRpYWxTdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOwogICAgICBzdHJlYW0ucG9zID0gbGV4ZXIuYmVnaW5JbmxpbmVJbWFnZVBvczsKICAgICAgY2FjaGVLZXkgPSBnZXRJbmxpbmVJbWFnZUNhY2hlS2V5KHN0cmVhbS5nZXRCeXRlcyhkaWN0TGVuZ3RoICsgbGVuZ3RoKSk7CiAgICAgIHN0cmVhbS5wb3MgPSBpbml0aWFsU3RyZWFtUG9zOwogICAgICBjb25zdCBjYWNoZUVudHJ5ID0gdGhpcy5pbWFnZUNhY2hlW2NhY2hlS2V5XTsKICAgICAgaWYgKGNhY2hlRW50cnkgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRoaXMuYnVmMiA9IENtZC5nZXQoIkVJIik7CiAgICAgICAgdGhpcy5zaGlmdCgpOwogICAgICAgIGNhY2hlRW50cnkucmVzZXQoKTsKICAgICAgICByZXR1cm4gY2FjaGVFbnRyeTsKICAgICAgfQogICAgfQogICAgY29uc3QgZGljdCA9IG5ldyBEaWN0KHRoaXMueHJlZik7CiAgICBmb3IgKGNvbnN0IGtleSBpbiBkaWN0TWFwKSB7CiAgICAgIGRpY3Quc2V0KGtleSwgZGljdE1hcFtrZXldKTsKICAgIH0KICAgIGxldCBpbWFnZVN0cmVhbSA9IHN0cmVhbS5tYWtlU3ViU3RyZWFtKHN0YXJ0UG9zLCBsZW5ndGgsIGRpY3QpOwogICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgewogICAgICBpbWFnZVN0cmVhbSA9IGNpcGhlclRyYW5zZm9ybS5jcmVhdGVTdHJlYW0oaW1hZ2VTdHJlYW0sIGxlbmd0aCk7CiAgICB9CiAgICBpbWFnZVN0cmVhbSA9IHRoaXMuZmlsdGVyKGltYWdlU3RyZWFtLCBkaWN0LCBsZW5ndGgpOwogICAgaW1hZ2VTdHJlYW0uZGljdCA9IGRpY3Q7CiAgICBpZiAoY2FjaGVLZXkgIT09IHVuZGVmaW5lZCkgewogICAgICBpbWFnZVN0cmVhbS5jYWNoZUtleSA9IGBpbmxpbmVfaW1nXyR7Kyt0aGlzLl9pbWFnZUlkfWA7CiAgICAgIHRoaXMuaW1hZ2VDYWNoZVtjYWNoZUtleV0gPSBpbWFnZVN0cmVhbTsKICAgIH0KICAgIHRoaXMuYnVmMiA9IENtZC5nZXQoIkVJIik7CiAgICB0aGlzLnNoaWZ0KCk7CiAgICByZXR1cm4gaW1hZ2VTdHJlYW07CiAgfQogICNmaW5kU3RyZWFtTGVuZ3RoKHN0YXJ0UG9zKSB7CiAgICBjb25zdCB7CiAgICAgIHN0cmVhbQogICAgfSA9IHRoaXMubGV4ZXI7CiAgICBzdHJlYW0ucG9zID0gc3RhcnRQb3M7CiAgICBjb25zdCBTQ0FOX0JMT0NLX0xFTkdUSCA9IDIwNDg7CiAgICBjb25zdCBzaWduYXR1cmVMZW5ndGggPSAiZW5kc3RyZWFtIi5sZW5ndGg7CiAgICBjb25zdCBFTkRfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4NjUsIDB4NmUsIDB4NjRdKTsKICAgIGNvbnN0IGVuZExlbmd0aCA9IEVORF9TSUdOQVRVUkUubGVuZ3RoOwogICAgY29uc3QgUEFSVElBTF9TSUdOQVRVUkUgPSBbbmV3IFVpbnQ4QXJyYXkoWzB4NzMsIDB4NzQsIDB4NzIsIDB4NjUsIDB4NjEsIDB4NmRdKSwgbmV3IFVpbnQ4QXJyYXkoWzB4NzMsIDB4NzQsIDB4NjUsIDB4NjEsIDB4NmRdKSwgbmV3IFVpbnQ4QXJyYXkoWzB4NzMsIDB4NzQsIDB4NzIsIDB4NjUsIDB4NjFdKV07CiAgICBjb25zdCBub3JtYWxMZW5ndGggPSBzaWduYXR1cmVMZW5ndGggLSBlbmRMZW5ndGg7CiAgICB3aGlsZSAoc3RyZWFtLnBvcyA8IHN0cmVhbS5lbmQpIHsKICAgICAgY29uc3Qgc2NhbkJ5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhTQ0FOX0JMT0NLX0xFTkdUSCk7CiAgICAgIGNvbnN0IHNjYW5MZW5ndGggPSBzY2FuQnl0ZXMubGVuZ3RoIC0gc2lnbmF0dXJlTGVuZ3RoOwogICAgICBpZiAoc2Nhbkxlbmd0aCA8PSAwKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbGV0IHBvcyA9IDA7CiAgICAgIHdoaWxlIChwb3MgPCBzY2FuTGVuZ3RoKSB7CiAgICAgICAgbGV0IGogPSAwOwogICAgICAgIHdoaWxlIChqIDwgZW5kTGVuZ3RoICYmIHNjYW5CeXRlc1twb3MgKyBqXSA9PT0gRU5EX1NJR05BVFVSRVtqXSkgewogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBpZiAoaiA+PSBlbmRMZW5ndGgpIHsKICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOwogICAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIFBBUlRJQUxfU0lHTkFUVVJFKSB7CiAgICAgICAgICAgIGNvbnN0IHBhcnRMZW4gPSBwYXJ0Lmxlbmd0aDsKICAgICAgICAgICAgbGV0IGsgPSAwOwogICAgICAgICAgICB3aGlsZSAoayA8IHBhcnRMZW4gJiYgc2NhbkJ5dGVzW3BvcyArIGogKyBrXSA9PT0gcGFydFtrXSkgewogICAgICAgICAgICAgIGsrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoayA+PSBub3JtYWxMZW5ndGgpIHsKICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGsgPj0gcGFydExlbikgewogICAgICAgICAgICAgIGNvbnN0IGxhc3RCeXRlID0gc2NhbkJ5dGVzW3BvcyArIGogKyBrXTsKICAgICAgICAgICAgICBpZiAoaXNXaGl0ZVNwYWNlKGxhc3RCeXRlKSkgewogICAgICAgICAgICAgICAgaW5mbyhgRm91bmQgIiR7Ynl0ZXNUb1N0cmluZyhbLi4uRU5EX1NJR05BVFVSRSwgLi4ucGFydF0pfSIgd2hlbiBgICsgInNlYXJjaGluZyBmb3IgZW5kc3RyZWFtIGNvbW1hbmQuIik7CiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZm91bmQpIHsKICAgICAgICAgICAgc3RyZWFtLnBvcyArPSBwb3M7CiAgICAgICAgICAgIHJldHVybiBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHBvcysrOwogICAgICB9CiAgICAgIHN0cmVhbS5wb3MgKz0gc2Nhbkxlbmd0aDsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgbWFrZVN0cmVhbShkaWN0LCBjaXBoZXJUcmFuc2Zvcm0pIHsKICAgIGNvbnN0IGxleGVyID0gdGhpcy5sZXhlcjsKICAgIGxldCBzdHJlYW0gPSBsZXhlci5zdHJlYW07CiAgICBsZXhlci5za2lwVG9OZXh0TGluZSgpOwogICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zIC0gMTsKICAgIGxldCBsZW5ndGggPSBkaWN0LmdldCgiTGVuZ3RoIik7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobGVuZ3RoKSkgewogICAgICBpbmZvKGBCYWQgbGVuZ3RoICIke2xlbmd0aCAmJiBsZW5ndGgudG9TdHJpbmcoKX0iIGluIHN0cmVhbS5gKTsKICAgICAgbGVuZ3RoID0gMDsKICAgIH0KICAgIHN0cmVhbS5wb3MgPSBzdGFydFBvcyArIGxlbmd0aDsKICAgIGxleGVyLm5leHRDaGFyKCk7CiAgICBpZiAodGhpcy50cnlTaGlmdCgpICYmIGlzQ21kKHRoaXMuYnVmMiwgImVuZHN0cmVhbSIpKSB7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgIH0gZWxzZSB7CiAgICAgIGxlbmd0aCA9IHRoaXMuI2ZpbmRTdHJlYW1MZW5ndGgoc3RhcnRQb3MpOwogICAgICBpZiAobGVuZ3RoIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTWlzc2luZyBlbmRzdHJlYW0gY29tbWFuZC4iKTsKICAgICAgfQogICAgICBsZXhlci5uZXh0Q2hhcigpOwogICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgIH0KICAgIHRoaXMuc2hpZnQoKTsKICAgIHN0cmVhbSA9IHN0cmVhbS5tYWtlU3ViU3RyZWFtKHN0YXJ0UG9zLCBsZW5ndGgsIGRpY3QpOwogICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgewogICAgICBzdHJlYW0gPSBjaXBoZXJUcmFuc2Zvcm0uY3JlYXRlU3RyZWFtKHN0cmVhbSwgbGVuZ3RoKTsKICAgIH0KICAgIHN0cmVhbSA9IHRoaXMuZmlsdGVyKHN0cmVhbSwgZGljdCwgbGVuZ3RoKTsKICAgIHN0cmVhbS5kaWN0ID0gZGljdDsKICAgIHJldHVybiBzdHJlYW07CiAgfQogIGZpbHRlcihzdHJlYW0sIGRpY3QsIGxlbmd0aCkgewogICAgbGV0IGZpbHRlciA9IGRpY3QuZ2V0KCJGIiwgIkZpbHRlciIpOwogICAgbGV0IHBhcmFtcyA9IGRpY3QuZ2V0KCJEUCIsICJEZWNvZGVQYXJtcyIpOwogICAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zKSkgewogICAgICAgIHdhcm4oIi9EZWNvZGVQYXJtcyBzaG91bGQgbm90IGJlIGFuIEFycmF5LCB3aGVuIC9GaWx0ZXIgaXMgYSBOYW1lLiIpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLm1ha2VGaWx0ZXIoc3RyZWFtLCBmaWx0ZXIubmFtZSwgbGVuZ3RoLCBwYXJhbXMpOwogICAgfQogICAgbGV0IG1heWJlTGVuZ3RoID0gbGVuZ3RoOwogICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkgewogICAgICBjb25zdCBmaWx0ZXJBcnJheSA9IGZpbHRlcjsKICAgICAgY29uc3QgcGFyYW1zQXJyYXkgPSBwYXJhbXM7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGZpbHRlckFycmF5Lmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgICBmaWx0ZXIgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihmaWx0ZXJBcnJheVtpXSk7CiAgICAgICAgaWYgKCEoZmlsdGVyIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgQmFkIGZpbHRlciBuYW1lICIke2ZpbHRlcn0iYCk7CiAgICAgICAgfQogICAgICAgIHBhcmFtcyA9IG51bGw7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zQXJyYXkpICYmIGkgaW4gcGFyYW1zQXJyYXkpIHsKICAgICAgICAgIHBhcmFtcyA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHBhcmFtc0FycmF5W2ldKTsKICAgICAgICB9CiAgICAgICAgc3RyZWFtID0gdGhpcy5tYWtlRmlsdGVyKHN0cmVhbSwgZmlsdGVyLm5hbWUsIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICAgIG1heWJlTGVuZ3RoID0gbnVsbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0cmVhbTsKICB9CiAgbWFrZUZpbHRlcihzdHJlYW0sIG5hbWUsIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKICAgIGlmIChtYXliZUxlbmd0aCA9PT0gMCkgewogICAgICB3YXJuKGBFbXB0eSAiJHtuYW1lfSIgc3RyZWFtLmApOwogICAgICByZXR1cm4gbmV3IE51bGxTdHJlYW0oKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgIGNhc2UgIkZsIjoKICAgICAgICBjYXNlICJGbGF0ZURlY29kZSI6CiAgICAgICAgICBpZiAocGFyYW1zKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJlZGljdG9yU3RyZWFtKG5ldyBGbGF0ZVN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbmV3IEZsYXRlU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOwogICAgICAgIGNhc2UgIkxaVyI6CiAgICAgICAgY2FzZSAiTFpXRGVjb2RlIjoKICAgICAgICAgIGxldCBlYXJseUNoYW5nZSA9IDE7CiAgICAgICAgICBpZiAocGFyYW1zKSB7CiAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzKCJFYXJseUNoYW5nZSIpKSB7CiAgICAgICAgICAgICAgZWFybHlDaGFuZ2UgPSBwYXJhbXMuZ2V0KCJFYXJseUNoYW5nZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJlZGljdG9yU3RyZWFtKG5ldyBMWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBuZXcgTFpXU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGVhcmx5Q2hhbmdlKTsKICAgICAgICBjYXNlICJEQ1QiOgogICAgICAgIGNhc2UgIkRDVERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IEpwZWdTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKICAgICAgICBjYXNlICJKUFgiOgogICAgICAgIGNhc2UgIkpQWERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IEpweFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICAgIGNhc2UgIkE4NSI6CiAgICAgICAgY2FzZSAiQVNDSUk4NURlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IEFzY2lpODVTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCk7CiAgICAgICAgY2FzZSAiQUh4IjoKICAgICAgICBjYXNlICJBU0NJSUhleERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IEFzY2lpSGV4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOwogICAgICAgIGNhc2UgIkNDRiI6CiAgICAgICAgY2FzZSAiQ0NJVFRGYXhEZWNvZGUiOgogICAgICAgICAgcmV0dXJuIG5ldyBDQ0lUVEZheFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICAgIGNhc2UgIlJMIjoKICAgICAgICBjYXNlICJSdW5MZW5ndGhEZWNvZGUiOgogICAgICAgICAgcmV0dXJuIG5ldyBSdW5MZW5ndGhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCk7CiAgICAgICAgY2FzZSAiSkJJRzJEZWNvZGUiOgogICAgICAgICAgcmV0dXJuIG5ldyBKYmlnMlN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICB9CiAgICAgIHdhcm4oYEZpbHRlciAiJHtuYW1lfSIgaXMgbm90IHN1cHBvcnRlZC5gKTsKICAgICAgcmV0dXJuIHN0cmVhbTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihgSW52YWxpZCBzdHJlYW06ICIke2V4fSJgKTsKICAgICAgcmV0dXJuIG5ldyBOdWxsU3RyZWFtKCk7CiAgICB9CiAgfQp9CmNvbnN0IHNwZWNpYWxDaGFycyA9IFsxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTsKZnVuY3Rpb24gdG9IZXhEaWdpdChjaCkgewogIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzkpIHsKICAgIHJldHVybiBjaCAmIDB4MGY7CiAgfQogIGlmIChjaCA+PSAweDQxICYmIGNoIDw9IDB4NDYgfHwgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDY2KSB7CiAgICByZXR1cm4gKGNoICYgMHgwZikgKyA5OwogIH0KICByZXR1cm4gLTE7Cn0KY2xhc3MgTGV4ZXIgewogIGNvbnN0cnVjdG9yKHN0cmVhbSwga25vd25Db21tYW5kcyA9IG51bGwpIHsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5uZXh0Q2hhcigpOwogICAgdGhpcy5zdHJCdWYgPSBbXTsKICAgIHRoaXMua25vd25Db21tYW5kcyA9IGtub3duQ29tbWFuZHM7CiAgICB0aGlzLl9oZXhTdHJpbmdOdW1XYXJuID0gMDsKICAgIHRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcyA9IC0xOwogIH0KICBuZXh0Q2hhcigpIHsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOwogIH0KICBwZWVrQ2hhcigpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbS5wZWVrQnl0ZSgpOwogIH0KICBnZXROdW1iZXIoKSB7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgbGV0IGVOb3RhdGlvbiA9IGZhbHNlOwogICAgbGV0IGRpdmlkZUJ5ID0gMDsKICAgIGxldCBzaWduID0gMTsKICAgIGlmIChjaCA9PT0gMHgyZCkgewogICAgICBzaWduID0gLTE7CiAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICBpZiAoY2ggPT09IDB4MmQpIHsKICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyYikgewogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkgewogICAgICBkbyB7CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgIH0gd2hpbGUgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKTsKICAgIH0KICAgIGlmIChjaCA9PT0gMHgyZSkgewogICAgICBkaXZpZGVCeSA9IDEwOwogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIGlmIChjaCA8IDB4MzAgfHwgY2ggPiAweDM5KSB7CiAgICAgIGNvbnN0IG1zZyA9IGBJbnZhbGlkIG51bWJlcjogJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKX0gKGNoYXJDb2RlICR7Y2h9KWA7CiAgICAgIGlmIChpc1doaXRlU3BhY2UoY2gpIHx8IGNoID09PSAweDI4IHx8IGNoID09PSAweDNjIHx8IGNoID09PSAtMSkgewogICAgICAgIGluZm8oYExleGVyLmdldE51bWJlciAtICIke21zZ30iLmApOwogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihtc2cpOwogICAgfQogICAgbGV0IGJhc2VWYWx1ZSA9IGNoIC0gMHgzMDsKICAgIGxldCBwb3dlclZhbHVlID0gMDsKICAgIGxldCBwb3dlclZhbHVlU2lnbiA9IDE7CiAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwKSB7CiAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzkpIHsKICAgICAgICBjb25zdCBjdXJyZW50RGlnaXQgPSBjaCAtIDB4MzA7CiAgICAgICAgaWYgKGVOb3RhdGlvbikgewogICAgICAgICAgcG93ZXJWYWx1ZSA9IHBvd2VyVmFsdWUgKiAxMCArIGN1cnJlbnREaWdpdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRpdmlkZUJ5ICE9PSAwKSB7CiAgICAgICAgICAgIGRpdmlkZUJ5ICo9IDEwOwogICAgICAgICAgfQogICAgICAgICAgYmFzZVZhbHVlID0gYmFzZVZhbHVlICogMTAgKyBjdXJyZW50RGlnaXQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDJlKSB7CiAgICAgICAgaWYgKGRpdmlkZUJ5ID09PSAwKSB7CiAgICAgICAgICBkaXZpZGVCeSA9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyZCkgewogICAgICAgIHdhcm4oIkJhZGx5IGZvcm1hdHRlZCBudW1iZXI6IG1pbnVzIHNpZ24gaW4gdGhlIG1pZGRsZSIpOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDQ1IHx8IGNoID09PSAweDY1KSB7CiAgICAgICAgY2ggPSB0aGlzLnBlZWtDaGFyKCk7CiAgICAgICAgaWYgKGNoID09PSAweDJiIHx8IGNoID09PSAweDJkKSB7CiAgICAgICAgICBwb3dlclZhbHVlU2lnbiA9IGNoID09PSAweDJkID8gLTEgOiAxOwogICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIH0gZWxzZSBpZiAoY2ggPCAweDMwIHx8IGNoID4gMHgzOSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVOb3RhdGlvbiA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChkaXZpZGVCeSAhPT0gMCkgewogICAgICBiYXNlVmFsdWUgLz0gZGl2aWRlQnk7CiAgICB9CiAgICBpZiAoZU5vdGF0aW9uKSB7CiAgICAgIGJhc2VWYWx1ZSAqPSAxMCAqKiAocG93ZXJWYWx1ZVNpZ24gKiBwb3dlclZhbHVlKTsKICAgIH0KICAgIHJldHVybiBzaWduICogYmFzZVZhbHVlOwogIH0KICBnZXRTdHJpbmcoKSB7CiAgICBsZXQgbnVtUGFyZW4gPSAxOwogICAgbGV0IGRvbmUgPSBmYWxzZTsKICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOwogICAgc3RyQnVmLmxlbmd0aCA9IDA7CiAgICBsZXQgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBsZXQgY2hhckJ1ZmZlcmVkID0gZmFsc2U7CiAgICAgIHN3aXRjaCAoY2ggfCAwKSB7CiAgICAgICAgY2FzZSAtMToKICAgICAgICAgIHdhcm4oIlVudGVybWluYXRlZCBzdHJpbmciKTsKICAgICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDI4OgogICAgICAgICAgKytudW1QYXJlbjsKICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIoIik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4Mjk6CiAgICAgICAgICBpZiAoLS1udW1QYXJlbiA9PT0gMCkgewogICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyQnVmLnB1c2goIikiKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHg1YzoKICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICAgIHdhcm4oIlVudGVybWluYXRlZCBzdHJpbmciKTsKICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAweDZlOgogICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCJcbiIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4NzI6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxyIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHg3NDoKICAgICAgICAgICAgICBzdHJCdWYucHVzaCgiXHQiKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAweDYyOgogICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCJcYiIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4NjY6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxmIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHg1YzoKICAgICAgICAgICAgY2FzZSAweDI4OgogICAgICAgICAgICBjYXNlIDB4Mjk6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4MzA6CiAgICAgICAgICAgIGNhc2UgMHgzMToKICAgICAgICAgICAgY2FzZSAweDMyOgogICAgICAgICAgICBjYXNlIDB4MzM6CiAgICAgICAgICAgIGNhc2UgMHgzNDoKICAgICAgICAgICAgY2FzZSAweDM1OgogICAgICAgICAgICBjYXNlIDB4MzY6CiAgICAgICAgICAgIGNhc2UgMHgzNzoKICAgICAgICAgICAgICBsZXQgeCA9IGNoICYgMHgwZjsKICAgICAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgICBjaGFyQnVmZmVyZWQgPSB0cnVlOwogICAgICAgICAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzcpIHsKICAgICAgICAgICAgICAgIHggPSAoeCA8PCAzKSArIChjaCAmIDB4MGYpOwogICAgICAgICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM3KSB7CiAgICAgICAgICAgICAgICAgIGNoYXJCdWZmZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICB4ID0gKHggPDwgMykgKyAoY2ggJiAweDBmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh4KSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHgwZDoKICAgICAgICAgICAgICBpZiAodGhpcy5wZWVrQ2hhcigpID09PSAweDBhKSB7CiAgICAgICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4MGE6CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChkb25lKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKCFjaGFyQnVmZmVyZWQpIHsKICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKICB9CiAgZ2V0TmFtZSgpIHsKICAgIGxldCBjaCwgcHJldmlvdXNDaDsKICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOwogICAgc3RyQnVmLmxlbmd0aCA9IDA7CiAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwICYmICFzcGVjaWFsQ2hhcnNbY2hdKSB7CiAgICAgIGlmIChjaCA9PT0gMHgyMykgewogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGlmIChzcGVjaWFsQ2hhcnNbY2hdKSB7CiAgICAgICAgICB3YXJuKCJMZXhlcl9nZXROYW1lOiAiICsgIk5VTUJFUiBTSUdOICgjKSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBoZXhhZGVjaW1hbCBudW1iZXIuIik7CiAgICAgICAgICBzdHJCdWYucHVzaCgiIyIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHggPSB0b0hleERpZ2l0KGNoKTsKICAgICAgICBpZiAoeCAhPT0gLTEpIHsKICAgICAgICAgIHByZXZpb3VzQ2ggPSBjaDsKICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgICAgY29uc3QgeDIgPSB0b0hleERpZ2l0KGNoKTsKICAgICAgICAgIGlmICh4MiA9PT0gLTEpIHsKICAgICAgICAgICAgd2FybihgTGV4ZXJfZ2V0TmFtZTogSWxsZWdhbCBkaWdpdCAoJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKX0pIGAgKyAiaW4gaGV4YWRlY2ltYWwgbnVtYmVyLiIpOwogICAgICAgICAgICBzdHJCdWYucHVzaCgiIyIsIFN0cmluZy5mcm9tQ2hhckNvZGUocHJldmlvdXNDaCkpOwogICAgICAgICAgICBpZiAoc3BlY2lhbENoYXJzW2NoXSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHggPDwgNCB8IHgyKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIjIiwgU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChzdHJCdWYubGVuZ3RoID4gMTI3KSB7CiAgICAgIHdhcm4oYE5hbWUgdG9rZW4gaXMgbG9uZ2VyIHRoYW4gYWxsb3dlZCBieSB0aGUgc3BlYzogJHtzdHJCdWYubGVuZ3RofWApOwogICAgfQogICAgcmV0dXJuIE5hbWUuZ2V0KHN0ckJ1Zi5qb2luKCIiKSk7CiAgfQogIF9oZXhTdHJpbmdXYXJuKGNoKSB7CiAgICBjb25zdCBNQVhfSEVYX1NUUklOR19OVU1fV0FSTiA9IDU7CiAgICBpZiAodGhpcy5faGV4U3RyaW5nTnVtV2FybisrID09PSBNQVhfSEVYX1NUUklOR19OVU1fV0FSTikgewogICAgICB3YXJuKCJnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBhZGRpdGlvbmFsIGludmFsaWQgY2hhcmFjdGVycy4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuX2hleFN0cmluZ051bVdhcm4gPiBNQVhfSEVYX1NUUklOR19OVU1fV0FSTikgewogICAgICByZXR1cm47CiAgICB9CiAgICB3YXJuKGBnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBpbnZhbGlkIGNoYXJhY3RlcjogJHtjaH1gKTsKICB9CiAgZ2V0SGV4U3RyaW5nKCkgewogICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CiAgICBzdHJCdWYubGVuZ3RoID0gMDsKICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CiAgICBsZXQgZmlyc3REaWdpdCA9IC0xLAogICAgICBkaWdpdCA9IC0xOwogICAgdGhpcy5faGV4U3RyaW5nTnVtV2FybiA9IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoY2ggPCAwKSB7CiAgICAgICAgd2FybigiVW50ZXJtaW5hdGVkIGhleCBzdHJpbmciKTsKICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgzZSkgewogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChzcGVjaWFsQ2hhcnNbY2hdID09PSAxKSB7CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGlnaXQgPSB0b0hleERpZ2l0KGNoKTsKICAgICAgICBpZiAoZGlnaXQgPT09IC0xKSB7CiAgICAgICAgICB0aGlzLl9oZXhTdHJpbmdXYXJuKGNoKTsKICAgICAgICB9IGVsc2UgaWYgKGZpcnN0RGlnaXQgPT09IC0xKSB7CiAgICAgICAgICBmaXJzdERpZ2l0ID0gZGlnaXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZmlyc3REaWdpdCA8PCA0IHwgZGlnaXQpKTsKICAgICAgICAgIGZpcnN0RGlnaXQgPSAtMTsKICAgICAgICB9CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChmaXJzdERpZ2l0ICE9PSAtMSkgewogICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGZpcnN0RGlnaXQgPDwgNCkpOwogICAgfQogICAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKICB9CiAgZ2V0T2JqKCkgewogICAgbGV0IGNvbW1lbnQgPSBmYWxzZTsKICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoY2ggPCAwKSB7CiAgICAgICAgcmV0dXJuIEVPRjsKICAgICAgfQogICAgICBpZiAoY29tbWVudCkgewogICAgICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkgewogICAgICAgICAgY29tbWVudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyNSkgewogICAgICAgIGNvbW1lbnQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKHNwZWNpYWxDaGFyc1tjaF0gIT09IDEpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIHN3aXRjaCAoY2ggfCAwKSB7CiAgICAgIGNhc2UgMHgzMDoKICAgICAgY2FzZSAweDMxOgogICAgICBjYXNlIDB4MzI6CiAgICAgIGNhc2UgMHgzMzoKICAgICAgY2FzZSAweDM0OgogICAgICBjYXNlIDB4MzU6CiAgICAgIGNhc2UgMHgzNjoKICAgICAgY2FzZSAweDM3OgogICAgICBjYXNlIDB4Mzg6CiAgICAgIGNhc2UgMHgzOToKICAgICAgY2FzZSAweDJiOgogICAgICBjYXNlIDB4MmQ6CiAgICAgIGNhc2UgMHgyZToKICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKTsKICAgICAgY2FzZSAweDI4OgogICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZygpOwogICAgICBjYXNlIDB4MmY6CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgpOwogICAgICBjYXNlIDB4NWI6CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIHJldHVybiBDbWQuZ2V0KCJbIik7CiAgICAgIGNhc2UgMHg1ZDoKICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgcmV0dXJuIENtZC5nZXQoIl0iKTsKICAgICAgY2FzZSAweDNjOgogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGlmIChjaCA9PT0gMHgzYykgewogICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgICAgcmV0dXJuIENtZC5nZXQoIjw8Iik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmdldEhleFN0cmluZygpOwogICAgICBjYXNlIDB4M2U6CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgaWYgKGNoID09PSAweDNlKSB7CiAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICByZXR1cm4gQ21kLmdldCgiPj4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIENtZC5nZXQoIj4iKTsKICAgICAgY2FzZSAweDdiOgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICByZXR1cm4gQ21kLmdldCgieyIpOwogICAgICBjYXNlIDB4N2Q6CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIHJldHVybiBDbWQuZ2V0KCJ9Iik7CiAgICAgIGNhc2UgMHgyOToKICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbGxlZ2FsIGNoYXJhY3RlcjogJHtjaH1gKTsKICAgIH0KICAgIGxldCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgIGlmIChjaCA8IDB4MjAgfHwgY2ggPiAweDdmKSB7CiAgICAgIGNvbnN0IG5leHRDaCA9IHRoaXMucGVla0NoYXIoKTsKICAgICAgaWYgKG5leHRDaCA+PSAweDIwICYmIG5leHRDaCA8PSAweDdmKSB7CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIHJldHVybiBDbWQuZ2V0KHN0cik7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGtub3duQ29tbWFuZHMgPSB0aGlzLmtub3duQ29tbWFuZHM7CiAgICBsZXQga25vd25Db21tYW5kRm91bmQgPSBrbm93bkNvbW1hbmRzPy5bc3RyXSAhPT0gdW5kZWZpbmVkOwogICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCAmJiAhc3BlY2lhbENoYXJzW2NoXSkgewogICAgICBjb25zdCBwb3NzaWJsZUNvbW1hbmQgPSBzdHIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgICAgaWYgKGtub3duQ29tbWFuZEZvdW5kICYmIGtub3duQ29tbWFuZHNbcG9zc2libGVDb21tYW5kXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDEyOCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgQ29tbWFuZCB0b2tlbiB0b28gbG9uZzogJHtzdHIubGVuZ3RofWApOwogICAgICB9CiAgICAgIHN0ciA9IHBvc3NpYmxlQ29tbWFuZDsKICAgICAga25vd25Db21tYW5kRm91bmQgPSBrbm93bkNvbW1hbmRzPy5bc3RyXSAhPT0gdW5kZWZpbmVkOwogICAgfQogICAgaWYgKHN0ciA9PT0gInRydWUiKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKHN0ciA9PT0gImZhbHNlIikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoc3RyID09PSAibnVsbCIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoc3RyID09PSAiQkkiKSB7CiAgICAgIHRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcyA9IHRoaXMuc3RyZWFtLnBvczsKICAgIH0KICAgIHJldHVybiBDbWQuZ2V0KHN0cik7CiAgfQogIHNraXBUb05leHRMaW5lKCkgewogICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKICAgIHdoaWxlIChjaCA+PSAwKSB7CiAgICAgIGlmIChjaCA9PT0gMHgwZCkgewogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGlmIChjaCA9PT0gMHgwYSkgewogICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgwYSkgewogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICB9Cn0KY2xhc3MgTGluZWFyaXphdGlvbiB7CiAgc3RhdGljIGNyZWF0ZShzdHJlYW0pIHsKICAgIGZ1bmN0aW9uIGdldEludChsaW5EaWN0LCBuYW1lLCBhbGxvd1plcm9WYWx1ZSA9IGZhbHNlKSB7CiAgICAgIGNvbnN0IG9iaiA9IGxpbkRpY3QuZ2V0KG5hbWUpOwogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopICYmIChhbGxvd1plcm9WYWx1ZSA/IG9iaiA+PSAwIDogb2JqID4gMCkpIHsKICAgICAgICByZXR1cm4gb2JqOwogICAgICB9CiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICIke25hbWV9IiBwYXJhbWV0ZXIgaW4gdGhlIGxpbmVhcml6YXRpb24gYCArICJkaWN0aW9uYXJ5IGlzIGludmFsaWQuIik7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRIaW50cyhsaW5EaWN0KSB7CiAgICAgIGNvbnN0IGhpbnRzID0gbGluRGljdC5nZXQoIkgiKTsKICAgICAgbGV0IGhpbnRzTGVuZ3RoOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShoaW50cykgJiYgKChoaW50c0xlbmd0aCA9IGhpbnRzLmxlbmd0aCkgPT09IDIgfHwgaGludHNMZW5ndGggPT09IDQpKSB7CiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGhpbnRzTGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICBjb25zdCBoaW50ID0gaGludHNbaW5kZXhdOwogICAgICAgICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcihoaW50KSAmJiBoaW50ID4gMCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIaW50ICgke2luZGV4fSkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLmApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaGludHM7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJIaW50IGFycmF5IGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKTsKICAgIH0KICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksCiAgICAgIHhyZWY6IG51bGwKICAgIH0pOwogICAgY29uc3Qgb2JqMSA9IHBhcnNlci5nZXRPYmooKTsKICAgIGNvbnN0IG9iajIgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBjb25zdCBvYmozID0gcGFyc2VyLmdldE9iaigpOwogICAgY29uc3QgbGluRGljdCA9IHBhcnNlci5nZXRPYmooKTsKICAgIGxldCBvYmosIGxlbmd0aDsKICAgIGlmICghKE51bWJlci5pc0ludGVnZXIob2JqMSkgJiYgTnVtYmVyLmlzSW50ZWdlcihvYmoyKSAmJiBpc0NtZChvYmozLCAib2JqIikgJiYgbGluRGljdCBpbnN0YW5jZW9mIERpY3QgJiYgdHlwZW9mIChvYmogPSBsaW5EaWN0LmdldCgiTGluZWFyaXplZCIpKSA9PT0gIm51bWJlciIgJiYgb2JqID4gMCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgaWYgKChsZW5ndGggPSBnZXRJbnQobGluRGljdCwgIkwiKSkgIT09IHN0cmVhbS5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgIkwiIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5ICcgKyAiZG9lcyBub3QgZXF1YWwgdGhlIHN0cmVhbSBsZW5ndGguIik7CiAgICB9CiAgICByZXR1cm4gewogICAgICBsZW5ndGgsCiAgICAgIGhpbnRzOiBnZXRIaW50cyhsaW5EaWN0KSwKICAgICAgb2JqZWN0TnVtYmVyRmlyc3Q6IGdldEludChsaW5EaWN0LCAiTyIpLAogICAgICBlbmRGaXJzdDogZ2V0SW50KGxpbkRpY3QsICJFIiksCiAgICAgIG51bVBhZ2VzOiBnZXRJbnQobGluRGljdCwgIk4iKSwKICAgICAgbWFpblhSZWZFbnRyaWVzT2Zmc2V0OiBnZXRJbnQobGluRGljdCwgIlQiKSwKICAgICAgcGFnZUZpcnN0OiBsaW5EaWN0LmhhcygiUCIpID8gZ2V0SW50KGxpbkRpY3QsICJQIiwgdHJ1ZSkgOiAwCiAgICB9OwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvY21hcC5qcwoKCgoKCgoKY29uc3QgQlVJTFRfSU5fQ01BUFMgPSBbIkFkb2JlLUdCMS1VQ1MyIiwgIkFkb2JlLUNOUzEtVUNTMiIsICJBZG9iZS1KYXBhbjEtVUNTMiIsICJBZG9iZS1Lb3JlYTEtVUNTMiIsICI3OC1FVUMtSCIsICI3OC1FVUMtViIsICI3OC1IIiwgIjc4LVJLU0otSCIsICI3OC1SS1NKLVYiLCAiNzgtViIsICI3OG1zLVJLU0otSCIsICI3OG1zLVJLU0otViIsICI4M3B2LVJLU0otSCIsICI5MG1zLVJLU0otSCIsICI5MG1zLVJLU0otViIsICI5MG1zcC1SS1NKLUgiLCAiOTBtc3AtUktTSi1WIiwgIjkwcHYtUktTSi1IIiwgIjkwcHYtUktTSi1WIiwgIkFkZC1IIiwgIkFkZC1SS1NKLUgiLCAiQWRkLVJLU0otViIsICJBZGQtViIsICJBZG9iZS1DTlMxLTAiLCAiQWRvYmUtQ05TMS0xIiwgIkFkb2JlLUNOUzEtMiIsICJBZG9iZS1DTlMxLTMiLCAiQWRvYmUtQ05TMS00IiwgIkFkb2JlLUNOUzEtNSIsICJBZG9iZS1DTlMxLTYiLCAiQWRvYmUtR0IxLTAiLCAiQWRvYmUtR0IxLTEiLCAiQWRvYmUtR0IxLTIiLCAiQWRvYmUtR0IxLTMiLCAiQWRvYmUtR0IxLTQiLCAiQWRvYmUtR0IxLTUiLCAiQWRvYmUtSmFwYW4xLTAiLCAiQWRvYmUtSmFwYW4xLTEiLCAiQWRvYmUtSmFwYW4xLTIiLCAiQWRvYmUtSmFwYW4xLTMiLCAiQWRvYmUtSmFwYW4xLTQiLCAiQWRvYmUtSmFwYW4xLTUiLCAiQWRvYmUtSmFwYW4xLTYiLCAiQWRvYmUtS29yZWExLTAiLCAiQWRvYmUtS29yZWExLTEiLCAiQWRvYmUtS29yZWExLTIiLCAiQjUtSCIsICJCNS1WIiwgIkI1cGMtSCIsICJCNXBjLVYiLCAiQ05TLUVVQy1IIiwgIkNOUy1FVUMtViIsICJDTlMxLUgiLCAiQ05TMS1WIiwgIkNOUzItSCIsICJDTlMyLVYiLCAiRVRISy1CNS1IIiwgIkVUSEstQjUtViIsICJFVGVuLUI1LUgiLCAiRVRlbi1CNS1WIiwgIkVUZW5tcy1CNS1IIiwgIkVUZW5tcy1CNS1WIiwgIkVVQy1IIiwgIkVVQy1WIiwgIkV4dC1IIiwgIkV4dC1SS1NKLUgiLCAiRXh0LVJLU0otViIsICJFeHQtViIsICJHQi1FVUMtSCIsICJHQi1FVUMtViIsICJHQi1IIiwgIkdCLVYiLCAiR0JLLUVVQy1IIiwgIkdCSy1FVUMtViIsICJHQksySy1IIiwgIkdCSzJLLVYiLCAiR0JLcC1FVUMtSCIsICJHQktwLUVVQy1WIiwgIkdCVC1FVUMtSCIsICJHQlQtRVVDLVYiLCAiR0JULUgiLCAiR0JULVYiLCAiR0JUcGMtRVVDLUgiLCAiR0JUcGMtRVVDLVYiLCAiR0JwYy1FVUMtSCIsICJHQnBjLUVVQy1WIiwgIkgiLCAiSEtkbGEtQjUtSCIsICJIS2RsYS1CNS1WIiwgIkhLZGxiLUI1LUgiLCAiSEtkbGItQjUtViIsICJIS2djY3MtQjUtSCIsICJIS2djY3MtQjUtViIsICJIS20zMTQtQjUtSCIsICJIS20zMTQtQjUtViIsICJIS200NzEtQjUtSCIsICJIS200NzEtQjUtViIsICJIS3Njcy1CNS1IIiwgIkhLc2NzLUI1LVYiLCAiSGFua2FrdSIsICJIaXJhZ2FuYSIsICJLU0MtRVVDLUgiLCAiS1NDLUVVQy1WIiwgIktTQy1IIiwgIktTQy1Kb2hhYi1IIiwgIktTQy1Kb2hhYi1WIiwgIktTQy1WIiwgIktTQ21zLVVIQy1IIiwgIktTQ21zLVVIQy1IVy1IIiwgIktTQ21zLVVIQy1IVy1WIiwgIktTQ21zLVVIQy1WIiwgIktTQ3BjLUVVQy1IIiwgIktTQ3BjLUVVQy1WIiwgIkthdGFrYW5hIiwgIk5XUC1IIiwgIk5XUC1WIiwgIlJLU0otSCIsICJSS1NKLVYiLCAiUm9tYW4iLCAiVW5pQ05TLVVDUzItSCIsICJVbmlDTlMtVUNTMi1WIiwgIlVuaUNOUy1VVEYxNi1IIiwgIlVuaUNOUy1VVEYxNi1WIiwgIlVuaUNOUy1VVEYzMi1IIiwgIlVuaUNOUy1VVEYzMi1WIiwgIlVuaUNOUy1VVEY4LUgiLCAiVW5pQ05TLVVURjgtViIsICJVbmlHQi1VQ1MyLUgiLCAiVW5pR0ItVUNTMi1WIiwgIlVuaUdCLVVURjE2LUgiLCAiVW5pR0ItVVRGMTYtViIsICJVbmlHQi1VVEYzMi1IIiwgIlVuaUdCLVVURjMyLVYiLCAiVW5pR0ItVVRGOC1IIiwgIlVuaUdCLVVURjgtViIsICJVbmlKSVMtVUNTMi1IIiwgIlVuaUpJUy1VQ1MyLUhXLUgiLCAiVW5pSklTLVVDUzItSFctViIsICJVbmlKSVMtVUNTMi1WIiwgIlVuaUpJUy1VVEYxNi1IIiwgIlVuaUpJUy1VVEYxNi1WIiwgIlVuaUpJUy1VVEYzMi1IIiwgIlVuaUpJUy1VVEYzMi1WIiwgIlVuaUpJUy1VVEY4LUgiLCAiVW5pSklTLVVURjgtViIsICJVbmlKSVMyMDA0LVVURjE2LUgiLCAiVW5pSklTMjAwNC1VVEYxNi1WIiwgIlVuaUpJUzIwMDQtVVRGMzItSCIsICJVbmlKSVMyMDA0LVVURjMyLVYiLCAiVW5pSklTMjAwNC1VVEY4LUgiLCAiVW5pSklTMjAwNC1VVEY4LVYiLCAiVW5pSklTUHJvLVVDUzItSFctViIsICJVbmlKSVNQcm8tVUNTMi1WIiwgIlVuaUpJU1Byby1VVEY4LVYiLCAiVW5pSklTWDAyMTMtVVRGMzItSCIsICJVbmlKSVNYMDIxMy1VVEYzMi1WIiwgIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1IIiwgIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1WIiwgIlVuaUtTLVVDUzItSCIsICJVbmlLUy1VQ1MyLVYiLCAiVW5pS1MtVVRGMTYtSCIsICJVbmlLUy1VVEYxNi1WIiwgIlVuaUtTLVVURjMyLUgiLCAiVW5pS1MtVVRGMzItViIsICJVbmlLUy1VVEY4LUgiLCAiVW5pS1MtVVRGOC1WIiwgIlYiLCAiV1AtU3ltYm9sIl07CmNvbnN0IE1BWF9NQVBfUkFOR0UgPSAyICoqIDI0IC0gMTsKY2xhc3MgQ01hcCB7CiAgY29uc3RydWN0b3IoYnVpbHRJbkNNYXAgPSBmYWxzZSkgewogICAgdGhpcy5jb2Rlc3BhY2VSYW5nZXMgPSBbW10sIFtdLCBbXSwgW11dOwogICAgdGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMgPSAwOwogICAgdGhpcy5fbWFwID0gW107CiAgICB0aGlzLm5hbWUgPSAiIjsKICAgIHRoaXMudmVydGljYWwgPSBmYWxzZTsKICAgIHRoaXMudXNlQ01hcCA9IG51bGw7CiAgICB0aGlzLmJ1aWx0SW5DTWFwID0gYnVpbHRJbkNNYXA7CiAgfQogIGFkZENvZGVzcGFjZVJhbmdlKG4sIGxvdywgaGlnaCkgewogICAgdGhpcy5jb2Rlc3BhY2VSYW5nZXNbbiAtIDFdLnB1c2gobG93LCBoaWdoKTsKICAgIHRoaXMubnVtQ29kZXNwYWNlUmFuZ2VzKys7CiAgfQogIG1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7CiAgICBpZiAoaGlnaCAtIGxvdyA+IE1BWF9NQVBfUkFOR0UpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJtYXBDaWRSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTsKICAgIH0KICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgewogICAgICB0aGlzLl9tYXBbbG93KytdID0gZHN0TG93Kys7CiAgICB9CiAgfQogIG1hcEJmUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHsKICAgIGlmIChoaWdoIC0gbG93ID4gTUFYX01BUF9SQU5HRSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hcEJmUmFuZ2UgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7CiAgICB9CiAgICBjb25zdCBsYXN0Qnl0ZSA9IGRzdExvdy5sZW5ndGggLSAxOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgIHRoaXMuX21hcFtsb3crK10gPSBkc3RMb3c7CiAgICAgIGNvbnN0IG5leHRDaGFyQ29kZSA9IGRzdExvdy5jaGFyQ29kZUF0KGxhc3RCeXRlKSArIDE7CiAgICAgIGlmIChuZXh0Q2hhckNvZGUgPiAweGZmKSB7CiAgICAgICAgZHN0TG93ID0gZHN0TG93LnN1YnN0cmluZygwLCBsYXN0Qnl0ZSAtIDEpICsgU3RyaW5nLmZyb21DaGFyQ29kZShkc3RMb3cuY2hhckNvZGVBdChsYXN0Qnl0ZSAtIDEpICsgMSkgKyAiXHgwMCI7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZHN0TG93ID0gZHN0TG93LnN1YnN0cmluZygwLCBsYXN0Qnl0ZSkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSk7CiAgICB9CiAgfQogIG1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpIHsKICAgIGlmIChoaWdoIC0gbG93ID4gTUFYX01BUF9SQU5HRSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hcEJmUmFuZ2VUb0FycmF5IC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLiIpOwogICAgfQogICAgY29uc3QgaWkgPSBhcnJheS5sZW5ndGg7CiAgICBsZXQgaSA9IDA7CiAgICB3aGlsZSAobG93IDw9IGhpZ2ggJiYgaSA8IGlpKSB7CiAgICAgIHRoaXMuX21hcFtsb3ddID0gYXJyYXlbaSsrXTsKICAgICAgKytsb3c7CiAgICB9CiAgfQogIG1hcE9uZShzcmMsIGRzdCkgewogICAgdGhpcy5fbWFwW3NyY10gPSBkc3Q7CiAgfQogIGxvb2t1cChjb2RlKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwW2NvZGVdOwogIH0KICBjb250YWlucyhjb2RlKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwW2NvZGVdICE9PSB1bmRlZmluZWQ7CiAgfQogIGZvckVhY2goY2FsbGJhY2spIHsKICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDsKICAgIGNvbnN0IGxlbmd0aCA9IG1hcC5sZW5ndGg7CiAgICBpZiAobGVuZ3RoIDw9IDB4MTAwMDApIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIGlmIChtYXBbaV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgY2FsbGJhY2soaSwgbWFwW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoY29uc3QgaSBpbiBtYXApIHsKICAgICAgICBjYWxsYmFjayhpLCBtYXBbaV0pOwogICAgICB9CiAgICB9CiAgfQogIGNoYXJDb2RlT2YodmFsdWUpIHsKICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDsKICAgIGlmIChtYXAubGVuZ3RoIDw9IDB4MTAwMDApIHsKICAgICAgcmV0dXJuIG1hcC5pbmRleE9mKHZhbHVlKTsKICAgIH0KICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gbWFwKSB7CiAgICAgIGlmIChtYXBbY2hhckNvZGVdID09PSB2YWx1ZSkgewogICAgICAgIHJldHVybiBjaGFyQ29kZSB8IDA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgZ2V0TWFwKCkgewogICAgcmV0dXJuIHRoaXMuX21hcDsKICB9CiAgcmVhZENoYXJDb2RlKHN0ciwgb2Zmc2V0LCBvdXQpIHsKICAgIGxldCBjID0gMDsKICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlcyA9IHRoaXMuY29kZXNwYWNlUmFuZ2VzOwogICAgZm9yIChsZXQgbiA9IDAsIG5uID0gY29kZXNwYWNlUmFuZ2VzLmxlbmd0aDsgbiA8IG5uOyBuKyspIHsKICAgICAgYyA9IChjIDw8IDggfCBzdHIuY2hhckNvZGVBdChvZmZzZXQgKyBuKSkgPj4+IDA7CiAgICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlID0gY29kZXNwYWNlUmFuZ2VzW25dOwogICAgICBmb3IgKGxldCBrID0gMCwga2sgPSBjb2Rlc3BhY2VSYW5nZS5sZW5ndGg7IGsgPCBrazspIHsKICAgICAgICBjb25zdCBsb3cgPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGNvbnN0IGhpZ2ggPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGlmIChjID49IGxvdyAmJiBjIDw9IGhpZ2gpIHsKICAgICAgICAgIG91dC5jaGFyY29kZSA9IGM7CiAgICAgICAgICBvdXQubGVuZ3RoID0gbiArIDE7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBvdXQuY2hhcmNvZGUgPSAwOwogICAgb3V0Lmxlbmd0aCA9IDE7CiAgfQogIGdldENoYXJDb2RlTGVuZ3RoKGNoYXJDb2RlKSB7CiAgICBjb25zdCBjb2Rlc3BhY2VSYW5nZXMgPSB0aGlzLmNvZGVzcGFjZVJhbmdlczsKICAgIGZvciAobGV0IG4gPSAwLCBubiA9IGNvZGVzcGFjZVJhbmdlcy5sZW5ndGg7IG4gPCBubjsgbisrKSB7CiAgICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlID0gY29kZXNwYWNlUmFuZ2VzW25dOwogICAgICBmb3IgKGxldCBrID0gMCwga2sgPSBjb2Rlc3BhY2VSYW5nZS5sZW5ndGg7IGsgPCBrazspIHsKICAgICAgICBjb25zdCBsb3cgPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGNvbnN0IGhpZ2ggPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGlmIChjaGFyQ29kZSA+PSBsb3cgJiYgY2hhckNvZGUgPD0gaGlnaCkgewogICAgICAgICAgcmV0dXJuIG4gKyAxOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7CiAgfQogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLmxlbmd0aDsKICB9CiAgZ2V0IGlzSWRlbnRpdHlDTWFwKCkgewogICAgaWYgKCEodGhpcy5uYW1lID09PSAiSWRlbnRpdHktSCIgfHwgdGhpcy5uYW1lID09PSAiSWRlbnRpdHktViIpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzLl9tYXAubGVuZ3RoICE9PSAweDEwMDAwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMHgxMDAwMDsgaSsrKSB7CiAgICAgIGlmICh0aGlzLl9tYXBbaV0gIT09IGkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBJZGVudGl0eUNNYXAgZXh0ZW5kcyBDTWFwIHsKICBjb25zdHJ1Y3Rvcih2ZXJ0aWNhbCwgbikgewogICAgc3VwZXIoKTsKICAgIHRoaXMudmVydGljYWwgPSB2ZXJ0aWNhbDsKICAgIHRoaXMuYWRkQ29kZXNwYWNlUmFuZ2UobiwgMCwgMHhmZmZmKTsKICB9CiAgbWFwQ2lkUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHsKICAgIHVucmVhY2hhYmxlKCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkUmFuZ2UiKTsKICB9CiAgbWFwQmZSYW5nZShsb3csIGhpZ2gsIGRzdExvdykgewogICAgdW5yZWFjaGFibGUoInNob3VsZCBub3QgY2FsbCBtYXBCZlJhbmdlIik7CiAgfQogIG1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpIHsKICAgIHVucmVhY2hhYmxlKCJzaG91bGQgbm90IGNhbGwgbWFwQmZSYW5nZVRvQXJyYXkiKTsKICB9CiAgbWFwT25lKHNyYywgZHN0KSB7CiAgICB1bnJlYWNoYWJsZSgic2hvdWxkIG5vdCBjYWxsIG1hcENpZE9uZSIpOwogIH0KICBsb29rdXAoY29kZSkgewogICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoY29kZSkgJiYgY29kZSA8PSAweGZmZmYgPyBjb2RlIDogdW5kZWZpbmVkOwogIH0KICBjb250YWlucyhjb2RlKSB7CiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihjb2RlKSAmJiBjb2RlIDw9IDB4ZmZmZjsKICB9CiAgZm9yRWFjaChjYWxsYmFjaykgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMHhmZmZmOyBpKyspIHsKICAgICAgY2FsbGJhY2soaSwgaSk7CiAgICB9CiAgfQogIGNoYXJDb2RlT2YodmFsdWUpIHsKICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA8PSAweGZmZmYgPyB2YWx1ZSA6IC0xOwogIH0KICBnZXRNYXAoKSB7CiAgICBjb25zdCBtYXAgPSBuZXcgQXJyYXkoMHgxMDAwMCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAweGZmZmY7IGkrKykgewogICAgICBtYXBbaV0gPSBpOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CiAgZ2V0IGxlbmd0aCgpIHsKICAgIHJldHVybiAweDEwMDAwOwogIH0KICBnZXQgaXNJZGVudGl0eUNNYXAoKSB7CiAgICB1bnJlYWNoYWJsZSgic2hvdWxkIG5vdCBhY2Nlc3MgLmlzSWRlbnRpdHlDTWFwIik7CiAgfQp9CmZ1bmN0aW9uIHN0clRvSW50KHN0cikgewogIGxldCBhID0gMDsKICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgYSA9IGEgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KGkpOwogIH0KICByZXR1cm4gYSA+Pj4gMDsKfQpmdW5jdGlvbiBleHBlY3RTdHJpbmcob2JqKSB7CiAgaWYgKHR5cGVvZiBvYmogIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk1hbGZvcm1lZCBDTWFwOiBleHBlY3RlZCBzdHJpbmcuIik7CiAgfQp9CmZ1bmN0aW9uIGV4cGVjdEludChvYmopIHsKICBpZiAoIU51bWJlci5pc0ludGVnZXIob2JqKSkgewogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJNYWxmb3JtZWQgQ01hcDogZXhwZWN0ZWQgaW50LiIpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUJmQ2hhcihjTWFwLCBsZXhlcikgewogIHdoaWxlICh0cnVlKSB7CiAgICBsZXQgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAob2JqID09PSBFT0YpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoaXNDbWQob2JqLCAiZW5kYmZjaGFyIikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZXhwZWN0U3RyaW5nKG9iaik7CiAgICBjb25zdCBzcmMgPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IGRzdCA9IG9iajsKICAgIGNNYXAubWFwT25lKHNyYywgZHN0KTsKICB9Cn0KZnVuY3Rpb24gcGFyc2VCZlJhbmdlKGNNYXAsIGxleGVyKSB7CiAgd2hpbGUgKHRydWUpIHsKICAgIGxldCBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmIChvYmogPT09IEVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGlmIChpc0NtZChvYmosICJlbmRiZnJhbmdlIikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZXhwZWN0U3RyaW5nKG9iaik7CiAgICBjb25zdCBsb3cgPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IGhpZ2ggPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopIHx8IHR5cGVvZiBvYmogPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IGRzdExvdyA9IE51bWJlci5pc0ludGVnZXIob2JqKSA/IFN0cmluZy5mcm9tQ2hhckNvZGUob2JqKSA6IG9iajsKICAgICAgY01hcC5tYXBCZlJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTsKICAgIH0gZWxzZSBpZiAoaXNDbWQob2JqLCAiWyIpKSB7CiAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgICBjb25zdCBhcnJheSA9IFtdOwogICAgICB3aGlsZSAoIWlzQ21kKG9iaiwgIl0iKSAmJiBvYmogIT09IEVPRikgewogICAgICAgIGFycmF5LnB1c2gob2JqKTsKICAgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgICAgfQogICAgICBjTWFwLm1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpOwogICAgfSBlbHNlIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBiZiByYW5nZS4iKTsKfQpmdW5jdGlvbiBwYXJzZUNpZENoYXIoY01hcCwgbGV4ZXIpIHsKICB3aGlsZSAodHJ1ZSkgewogICAgbGV0IG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgaWYgKG9iaiA9PT0gRU9GKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGlzQ21kKG9iaiwgImVuZGNpZGNoYXIiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IHNyYyA9IHN0clRvSW50KG9iaik7CiAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGV4cGVjdEludChvYmopOwogICAgY29uc3QgZHN0ID0gb2JqOwogICAgY01hcC5tYXBPbmUoc3JjLCBkc3QpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUNpZFJhbmdlKGNNYXAsIGxleGVyKSB7CiAgd2hpbGUgKHRydWUpIHsKICAgIGxldCBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmIChvYmogPT09IEVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGlmIChpc0NtZChvYmosICJlbmRjaWRyYW5nZSIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGV4cGVjdFN0cmluZyhvYmopOwogICAgY29uc3QgbG93ID0gc3RyVG9JbnQob2JqKTsKICAgIG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgZXhwZWN0U3RyaW5nKG9iaik7CiAgICBjb25zdCBoaWdoID0gc3RyVG9JbnQob2JqKTsKICAgIG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgZXhwZWN0SW50KG9iaik7CiAgICBjb25zdCBkc3RMb3cgPSBvYmo7CiAgICBjTWFwLm1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTsKICB9Cn0KZnVuY3Rpb24gcGFyc2VDb2Rlc3BhY2VSYW5nZShjTWFwLCBsZXhlcikgewogIHdoaWxlICh0cnVlKSB7CiAgICBsZXQgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAob2JqID09PSBFT0YpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoaXNDbWQob2JqLCAiZW5kY29kZXNwYWNlcmFuZ2UiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodHlwZW9mIG9iaiAhPT0gInN0cmluZyIpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCBsb3cgPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAodHlwZW9mIG9iaiAhPT0gInN0cmluZyIpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCBoaWdoID0gc3RyVG9JbnQob2JqKTsKICAgIGNNYXAuYWRkQ29kZXNwYWNlUmFuZ2Uob2JqLmxlbmd0aCwgbG93LCBoaWdoKTsKICB9CiAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIGNvZGVzcGFjZSByYW5nZS4iKTsKfQpmdW5jdGlvbiBwYXJzZVdNb2RlKGNNYXAsIGxleGVyKSB7CiAgY29uc3Qgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSkgewogICAgY01hcC52ZXJ0aWNhbCA9ICEhb2JqOwogIH0KfQpmdW5jdGlvbiBwYXJzZUNNYXBOYW1lKGNNYXAsIGxleGVyKSB7CiAgY29uc3Qgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgIGNNYXAubmFtZSA9IG9iai5uYW1lOwogIH0KfQphc3luYyBmdW5jdGlvbiBwYXJzZUNNYXAoY01hcCwgbGV4ZXIsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApIHsKICBsZXQgcHJldmlvdXMsIGVtYmVkZGVkVXNlQ01hcDsKICBvYmpMb29wOiB3aGlsZSAodHJ1ZSkgewogICAgdHJ5IHsKICAgICAgY29uc3Qgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICAgIGlmIChvYmogPT09IEVPRikgewogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBpZiAob2JqLm5hbWUgPT09ICJXTW9kZSIpIHsKICAgICAgICAgIHBhcnNlV01vZGUoY01hcCwgbGV4ZXIpOwogICAgICAgIH0gZWxzZSBpZiAob2JqLm5hbWUgPT09ICJDTWFwTmFtZSIpIHsKICAgICAgICAgIHBhcnNlQ01hcE5hbWUoY01hcCwgbGV4ZXIpOwogICAgICAgIH0KICAgICAgICBwcmV2aW91cyA9IG9iajsKICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDbWQpIHsKICAgICAgICBzd2l0Y2ggKG9iai5jbWQpIHsKICAgICAgICAgIGNhc2UgImVuZGNtYXAiOgogICAgICAgICAgICBicmVhayBvYmpMb29wOwogICAgICAgICAgY2FzZSAidXNlY21hcCI6CiAgICAgICAgICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICBlbWJlZGRlZFVzZUNNYXAgPSBwcmV2aW91cy5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYmVnaW5jb2Rlc3BhY2VyYW5nZSI6CiAgICAgICAgICAgIHBhcnNlQ29kZXNwYWNlUmFuZ2UoY01hcCwgbGV4ZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImJlZ2luYmZjaGFyIjoKICAgICAgICAgICAgcGFyc2VCZkNoYXIoY01hcCwgbGV4ZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImJlZ2luY2lkY2hhciI6CiAgICAgICAgICAgIHBhcnNlQ2lkQ2hhcihjTWFwLCBsZXhlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYmVnaW5iZnJhbmdlIjoKICAgICAgICAgICAgcGFyc2VCZlJhbmdlKGNNYXAsIGxleGVyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJiZWdpbmNpZHJhbmdlIjoKICAgICAgICAgICAgcGFyc2VDaWRSYW5nZShjTWFwLCBsZXhlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKCJJbnZhbGlkIGNNYXAgZGF0YTogIiArIGV4KTsKICAgICAgY29udGludWU7CiAgICB9CiAgfQogIGlmICghdXNlQ01hcCAmJiBlbWJlZGRlZFVzZUNNYXApIHsKICAgIHVzZUNNYXAgPSBlbWJlZGRlZFVzZUNNYXA7CiAgfQogIGlmICh1c2VDTWFwKSB7CiAgICByZXR1cm4gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKTsKICB9CiAgcmV0dXJuIGNNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKSB7CiAgY01hcC51c2VDTWFwID0gYXdhaXQgY3JlYXRlQnVpbHRJbkNNYXAodXNlQ01hcCwgZmV0Y2hCdWlsdEluQ01hcCk7CiAgaWYgKGNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzID09PSAwKSB7CiAgICBjb25zdCB1c2VDb2Rlc3BhY2VSYW5nZXMgPSBjTWFwLnVzZUNNYXAuY29kZXNwYWNlUmFuZ2VzOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VDb2Rlc3BhY2VSYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgY01hcC5jb2Rlc3BhY2VSYW5nZXNbaV0gPSB1c2VDb2Rlc3BhY2VSYW5nZXNbaV0uc2xpY2UoKTsKICAgIH0KICAgIGNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzID0gY01hcC51c2VDTWFwLm51bUNvZGVzcGFjZVJhbmdlczsKICB9CiAgY01hcC51c2VDTWFwLmZvckVhY2goZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgIGlmICghY01hcC5jb250YWlucyhrZXkpKSB7CiAgICAgIGNNYXAubWFwT25lKGtleSwgdmFsdWUpOwogICAgfQogIH0pOwogIHJldHVybiBjTWFwOwp9CmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUJ1aWx0SW5DTWFwKG5hbWUsIGZldGNoQnVpbHRJbkNNYXApIHsKICBpZiAobmFtZSA9PT0gIklkZW50aXR5LUgiKSB7CiAgICByZXR1cm4gbmV3IElkZW50aXR5Q01hcChmYWxzZSwgMik7CiAgfSBlbHNlIGlmIChuYW1lID09PSAiSWRlbnRpdHktViIpIHsKICAgIHJldHVybiBuZXcgSWRlbnRpdHlDTWFwKHRydWUsIDIpOwogIH0KICBpZiAoIUJVSUxUX0lOX0NNQVBTLmluY2x1ZGVzKG5hbWUpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gQ01hcCBuYW1lOiAiICsgbmFtZSk7CiAgfQogIGlmICghZmV0Y2hCdWlsdEluQ01hcCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJCdWlsdC1pbiBDTWFwIHBhcmFtZXRlcnMgYXJlIG5vdCBwcm92aWRlZC4iKTsKICB9CiAgY29uc3QgewogICAgY01hcERhdGEsCiAgICBpc0NvbXByZXNzZWQKICB9ID0gYXdhaXQgZmV0Y2hCdWlsdEluQ01hcChuYW1lKTsKICBjb25zdCBjTWFwID0gbmV3IENNYXAodHJ1ZSk7CiAgaWYgKGlzQ29tcHJlc3NlZCkgewogICAgcmV0dXJuIG5ldyBCaW5hcnlDTWFwUmVhZGVyKCkucHJvY2VzcyhjTWFwRGF0YSwgY01hcCwgdXNlQ01hcCA9PiBleHRlbmRDTWFwKGNNYXAsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApKTsKICB9CiAgY29uc3QgbGV4ZXIgPSBuZXcgTGV4ZXIobmV3IFN0cmVhbShjTWFwRGF0YSkpOwogIHJldHVybiBwYXJzZUNNYXAoY01hcCwgbGV4ZXIsIGZldGNoQnVpbHRJbkNNYXAsIG51bGwpOwp9CmNsYXNzIENNYXBGYWN0b3J5IHsKICBzdGF0aWMgYXN5bmMgY3JlYXRlKHsKICAgIGVuY29kaW5nLAogICAgZmV0Y2hCdWlsdEluQ01hcCwKICAgIHVzZUNNYXAKICB9KSB7CiAgICBpZiAoZW5jb2RpbmcgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHJldHVybiBjcmVhdGVCdWlsdEluQ01hcChlbmNvZGluZy5uYW1lLCBmZXRjaEJ1aWx0SW5DTWFwKTsKICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgIGNvbnN0IHBhcnNlZENNYXAgPSBhd2FpdCBwYXJzZUNNYXAobmV3IENNYXAoKSwgbmV3IExleGVyKGVuY29kaW5nKSwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCk7CiAgICAgIGlmIChwYXJzZWRDTWFwLmlzSWRlbnRpdHlDTWFwKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWx0SW5DTWFwKHBhcnNlZENNYXAubmFtZSwgZmV0Y2hCdWlsdEluQ01hcCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnNlZENNYXA7CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoIkVuY29kaW5nIHJlcXVpcmVkLiIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvY2hhcnNldHMuanMKY29uc3QgSVNPQWRvYmVDaGFyc2V0ID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICJlbmRhc2giLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgInF1ZXN0aW9uZG93biIsICJncmF2ZSIsICJhY3V0ZSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAiZGllcmVzaXMiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIkFFIiwgIm9yZGZlbWluaW5lIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgImFlIiwgImRvdGxlc3NpIiwgImxzbGFzaCIsICJvc2xhc2giLCAib2UiLCAiZ2VybWFuZGJscyIsICJvbmVzdXBlcmlvciIsICJsb2dpY2Fsbm90IiwgIm11IiwgInRyYWRlbWFyayIsICJFdGgiLCAib25laGFsZiIsICJwbHVzbWludXMiLCAiVGhvcm4iLCAib25lcXVhcnRlciIsICJkaXZpZGUiLCAiYnJva2VuYmFyIiwgImRlZ3JlZSIsICJ0aG9ybiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInR3b3N1cGVyaW9yIiwgInJlZ2lzdGVyZWQiLCAibWludXMiLCAiZXRoIiwgIm11bHRpcGx5IiwgInRocmVlc3VwZXJpb3IiLCAiY29weXJpZ2h0IiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBZGllcmVzaXMiLCAiQWdyYXZlIiwgIkFyaW5nIiwgIkF0aWxkZSIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJOdGlsZGUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk9kaWVyZXNpcyIsICJPZ3JhdmUiLCAiT3RpbGRlIiwgIlNjYXJvbiIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIlVncmF2ZSIsICJZYWN1dGUiLCAiWWRpZXJlc2lzIiwgIlpjYXJvbiIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImFncmF2ZSIsICJhcmluZyIsICJhdGlsZGUiLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJlZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJpZ3JhdmUiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib2dyYXZlIiwgIm90aWxkZSIsICJzY2Fyb24iLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJ1Z3JhdmUiLCAieWFjdXRlIiwgInlkaWVyZXNpcyIsICJ6Y2Fyb24iXTsKY29uc3QgRXhwZXJ0Q2hhcnNldCA9IFsiLm5vdGRlZiIsICJzcGFjZSIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJhbXBlcnNhbmRzbWFsbCIsICJBY3V0ZXNtYWxsIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgImZyYWN0aW9uIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAiY29tbWFzdXBlcmlvciIsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgInBlcmlvZHN1cGVyaW9yIiwgInF1ZXN0aW9uc21hbGwiLCAiYXN1cGVyaW9yIiwgImJzdXBlcmlvciIsICJjZW50c3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgImVzdXBlcmlvciIsICJpc3VwZXJpb3IiLCAibHN1cGVyaW9yIiwgIm1zdXBlcmlvciIsICJuc3VwZXJpb3IiLCAib3N1cGVyaW9yIiwgInJzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgImZmIiwgImZpIiwgImZsIiwgImZmaSIsICJmZmwiLCAicGFyZW5sZWZ0aW5mZXJpb3IiLCAicGFyZW5yaWdodGluZmVyaW9yIiwgIkNpcmN1bWZsZXhzbWFsbCIsICJoeXBoZW5zdXBlcmlvciIsICJHcmF2ZXNtYWxsIiwgIkFzbWFsbCIsICJCc21hbGwiLCAiQ3NtYWxsIiwgIkRzbWFsbCIsICJFc21hbGwiLCAiRnNtYWxsIiwgIkdzbWFsbCIsICJIc21hbGwiLCAiSXNtYWxsIiwgIkpzbWFsbCIsICJLc21hbGwiLCAiTHNtYWxsIiwgIk1zbWFsbCIsICJOc21hbGwiLCAiT3NtYWxsIiwgIlBzbWFsbCIsICJRc21hbGwiLCAiUnNtYWxsIiwgIlNzbWFsbCIsICJUc21hbGwiLCAiVXNtYWxsIiwgIlZzbWFsbCIsICJXc21hbGwiLCAiWHNtYWxsIiwgIllzbWFsbCIsICJac21hbGwiLCAiY29sb25tb25ldGFyeSIsICJvbmVmaXR0ZWQiLCAicnVwaWFoIiwgIlRpbGRlc21hbGwiLCAiZXhjbGFtZG93bnNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICJTY2Fyb25zbWFsbCIsICJaY2Fyb25zbWFsbCIsICJEaWVyZXNpc3NtYWxsIiwgIkJyZXZlc21hbGwiLCAiQ2Fyb25zbWFsbCIsICJEb3RhY2NlbnRzbWFsbCIsICJNYWNyb25zbWFsbCIsICJmaWd1cmVkYXNoIiwgImh5cGhlbmluZmVyaW9yIiwgIk9nb25la3NtYWxsIiwgIlJpbmdzbWFsbCIsICJDZWRpbGxhc21hbGwiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgInplcm9zdXBlcmlvciIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJlaWdodHN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAib25laW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgInNpeGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJuaW5laW5mZXJpb3IiLCAiY2VudGluZmVyaW9yIiwgImRvbGxhcmluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiLCAiQWdyYXZlc21hbGwiLCAiQWFjdXRlc21hbGwiLCAiQWNpcmN1bWZsZXhzbWFsbCIsICJBdGlsZGVzbWFsbCIsICJBZGllcmVzaXNzbWFsbCIsICJBcmluZ3NtYWxsIiwgIkFFc21hbGwiLCAiQ2NlZGlsbGFzbWFsbCIsICJFZ3JhdmVzbWFsbCIsICJFYWN1dGVzbWFsbCIsICJFY2lyY3VtZmxleHNtYWxsIiwgIkVkaWVyZXNpc3NtYWxsIiwgIklncmF2ZXNtYWxsIiwgIklhY3V0ZXNtYWxsIiwgIkljaXJjdW1mbGV4c21hbGwiLCAiSWRpZXJlc2lzc21hbGwiLCAiRXRoc21hbGwiLCAiTnRpbGRlc21hbGwiLCAiT2dyYXZlc21hbGwiLCAiT2FjdXRlc21hbGwiLCAiT2NpcmN1bWZsZXhzbWFsbCIsICJPdGlsZGVzbWFsbCIsICJPZGllcmVzaXNzbWFsbCIsICJPRXNtYWxsIiwgIk9zbGFzaHNtYWxsIiwgIlVncmF2ZXNtYWxsIiwgIlVhY3V0ZXNtYWxsIiwgIlVjaXJjdW1mbGV4c21hbGwiLCAiVWRpZXJlc2lzc21hbGwiLCAiWWFjdXRlc21hbGwiLCAiVGhvcm5zbWFsbCIsICJZZGllcmVzaXNzbWFsbCJdOwpjb25zdCBFeHBlcnRTdWJzZXRDaGFyc2V0ID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImRvbGxhcm9sZHN0eWxlIiwgImRvbGxhcnN1cGVyaW9yIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgImZyYWN0aW9uIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAiY29tbWFzdXBlcmlvciIsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgInBlcmlvZHN1cGVyaW9yIiwgImFzdXBlcmlvciIsICJic3VwZXJpb3IiLCAiY2VudHN1cGVyaW9yIiwgImRzdXBlcmlvciIsICJlc3VwZXJpb3IiLCAiaXN1cGVyaW9yIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJoeXBoZW5zdXBlcmlvciIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiY2VudG9sZHN0eWxlIiwgImZpZ3VyZWRhc2giLCAiaHlwaGVuaW5mZXJpb3IiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgInplcm9zdXBlcmlvciIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJlaWdodHN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAib25laW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgInNpeGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJuaW5laW5mZXJpb3IiLCAiY2VudGluZmVyaW9yIiwgImRvbGxhcmluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiXTsKCjsvLyAuL3NyYy9jb3JlL2VuY29kaW5ncy5qcwpjb25zdCBFeHBlcnRFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICIiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgIiIsICJhc3VwZXJpb3IiLCAiYnN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiZXN1cGVyaW9yIiwgIiIsICIiLCAiIiwgImlzdXBlcmlvciIsICIiLCAiIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICIiLCAiIiwgInJzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgIiIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgIiIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiQ2lyY3VtZmxleHNtYWxsIiwgImh5cGhlbnN1cGVyaW9yIiwgIkdyYXZlc21hbGwiLCAiQXNtYWxsIiwgIkJzbWFsbCIsICJDc21hbGwiLCAiRHNtYWxsIiwgIkVzbWFsbCIsICJGc21hbGwiLCAiR3NtYWxsIiwgIkhzbWFsbCIsICJJc21hbGwiLCAiSnNtYWxsIiwgIktzbWFsbCIsICJMc21hbGwiLCAiTXNtYWxsIiwgIk5zbWFsbCIsICJPc21hbGwiLCAiUHNtYWxsIiwgIlFzbWFsbCIsICJSc21hbGwiLCAiU3NtYWxsIiwgIlRzbWFsbCIsICJVc21hbGwiLCAiVnNtYWxsIiwgIldzbWFsbCIsICJYc21hbGwiLCAiWXNtYWxsIiwgIlpzbWFsbCIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiVGlsZGVzbWFsbCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiZXhjbGFtZG93bnNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICIiLCAiIiwgIlNjYXJvbnNtYWxsIiwgIlpjYXJvbnNtYWxsIiwgIkRpZXJlc2lzc21hbGwiLCAiQnJldmVzbWFsbCIsICJDYXJvbnNtYWxsIiwgIiIsICJEb3RhY2NlbnRzbWFsbCIsICIiLCAiIiwgIk1hY3JvbnNtYWxsIiwgIiIsICIiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICIiLCAiIiwgIk9nb25la3NtYWxsIiwgIlJpbmdzbWFsbCIsICJDZWRpbGxhc21hbGwiLCAiIiwgIiIsICIiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgIiIsICIiLCAiemVyb3N1cGVyaW9yIiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgImVpZ2h0c3VwZXJpb3IiLCAibmluZXN1cGVyaW9yIiwgInplcm9pbmZlcmlvciIsICJvbmVpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICJ0aHJlZWluZmVyaW9yIiwgImZvdXJpbmZlcmlvciIsICJmaXZlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAic2V2ZW5pbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgIm5pbmVpbmZlcmlvciIsICJjZW50aW5mZXJpb3IiLCAiZG9sbGFyaW5mZXJpb3IiLCAicGVyaW9kaW5mZXJpb3IiLCAiY29tbWFpbmZlcmlvciIsICJBZ3JhdmVzbWFsbCIsICJBYWN1dGVzbWFsbCIsICJBY2lyY3VtZmxleHNtYWxsIiwgIkF0aWxkZXNtYWxsIiwgIkFkaWVyZXNpc3NtYWxsIiwgIkFyaW5nc21hbGwiLCAiQUVzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJFdGhzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPZ3JhdmVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk90aWxkZXNtYWxsIiwgIk9kaWVyZXNpc3NtYWxsIiwgIk9Fc21hbGwiLCAiT3NsYXNoc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICJZYWN1dGVzbWFsbCIsICJUaG9ybnNtYWxsIiwgIllkaWVyZXNpc3NtYWxsIl07CmNvbnN0IE1hY0V4cGVydEVuY29kaW5nID0gWyIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgInNwYWNlIiwgImV4Y2xhbXNtYWxsIiwgIkh1bmdhcnVtbGF1dHNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJhbXBlcnNhbmRzbWFsbCIsICJBY3V0ZXNtYWxsIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgImZyYWN0aW9uIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAiIiwgInRocmVlcXVhcnRlcnNlbWRhc2giLCAiIiwgInF1ZXN0aW9uc21hbGwiLCAiIiwgIiIsICIiLCAiIiwgIkV0aHNtYWxsIiwgIiIsICIiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgImZmIiwgImZpIiwgImZsIiwgImZmaSIsICJmZmwiLCAicGFyZW5sZWZ0aW5mZXJpb3IiLCAiIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuaW5mZXJpb3IiLCAiR3JhdmVzbWFsbCIsICJBc21hbGwiLCAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsICJHc21hbGwiLCAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwgIkxzbWFsbCIsICJNc21hbGwiLCAiTnNtYWxsIiwgIk9zbWFsbCIsICJQc21hbGwiLCAiUXNtYWxsIiwgIlJzbWFsbCIsICJTc21hbGwiLCAiVHNtYWxsIiwgIlVzbWFsbCIsICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgIiIsICIiLCAiYXN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICIiLCAiIiwgIiIsICIiLCAiQWFjdXRlc21hbGwiLCAiQWdyYXZlc21hbGwiLCAiQWNpcmN1bWZsZXhzbWFsbCIsICJBZGllcmVzaXNzbWFsbCIsICJBdGlsZGVzbWFsbCIsICJBcmluZ3NtYWxsIiwgIkNjZWRpbGxhc21hbGwiLCAiRWFjdXRlc21hbGwiLCAiRWdyYXZlc21hbGwiLCAiRWNpcmN1bWZsZXhzbWFsbCIsICJFZGllcmVzaXNzbWFsbCIsICJJYWN1dGVzbWFsbCIsICJJZ3JhdmVzbWFsbCIsICJJY2lyY3VtZmxleHNtYWxsIiwgIklkaWVyZXNpc3NtYWxsIiwgIk50aWxkZXNtYWxsIiwgIk9hY3V0ZXNtYWxsIiwgIk9ncmF2ZXNtYWxsIiwgIk9jaXJjdW1mbGV4c21hbGwiLCAiT2RpZXJlc2lzc21hbGwiLCAiT3RpbGRlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICIiLCAiZWlnaHRzdXBlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiU2Nhcm9uc21hbGwiLCAiIiwgImNlbnRpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICIiLCAiRGllcmVzaXNzbWFsbCIsICIiLCAiQ2Fyb25zbWFsbCIsICJvc3VwZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgIiIsICJjb21tYWluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgIllhY3V0ZXNtYWxsIiwgIiIsICJkb2xsYXJpbmZlcmlvciIsICIiLCAiIiwgIlRob3Juc21hbGwiLCAiIiwgIm5pbmVpbmZlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAiWmNhcm9uc21hbGwiLCAiQUVzbWFsbCIsICJPc2xhc2hzbWFsbCIsICJxdWVzdGlvbmRvd25zbWFsbCIsICJvbmVpbmZlcmlvciIsICJMc2xhc2hzbWFsbCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJDZWRpbGxhc21hbGwiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJPRXNtYWxsIiwgImZpZ3VyZWRhc2giLCAiaHlwaGVuc3VwZXJpb3IiLCAiIiwgIiIsICIiLCAiIiwgImV4Y2xhbWRvd25zbWFsbCIsICIiLCAiWWRpZXJlc2lzc21hbGwiLCAiIiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvc3VwZXJpb3IiLCAiIiwgImVzdXBlcmlvciIsICJyc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgIiIsICIiLCAiaXN1cGVyaW9yIiwgInNzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJsc3VwZXJpb3IiLCAiT2dvbmVrc21hbGwiLCAiQnJldmVzbWFsbCIsICJNYWNyb25zbWFsbCIsICJic3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm1zdXBlcmlvciIsICJjb21tYXN1cGVyaW9yIiwgInBlcmlvZHN1cGVyaW9yIiwgIkRvdGFjY2VudHNtYWxsIiwgIlJpbmdzbWFsbCIsICIiLCAiIiwgIiIsICIiXTsKY29uc3QgTWFjUm9tYW5FbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICIiLCAiQWRpZXJlc2lzIiwgIkFyaW5nIiwgIkNjZWRpbGxhIiwgIkVhY3V0ZSIsICJOdGlsZGUiLCAiT2RpZXJlc2lzIiwgIlVkaWVyZXNpcyIsICJhYWN1dGUiLCAiYWdyYXZlIiwgImFjaXJjdW1mbGV4IiwgImFkaWVyZXNpcyIsICJhdGlsZGUiLCAiYXJpbmciLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVncmF2ZSIsICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLCAiaWFjdXRlIiwgImlncmF2ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvZ3JhdmUiLCAib2NpcmN1bWZsZXgiLCAib2RpZXJlc2lzIiwgIm90aWxkZSIsICJ1YWN1dGUiLCAidWdyYXZlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJkYWdnZXIiLCAiZGVncmVlIiwgImNlbnQiLCAic3RlcmxpbmciLCAic2VjdGlvbiIsICJidWxsZXQiLCAicGFyYWdyYXBoIiwgImdlcm1hbmRibHMiLCAicmVnaXN0ZXJlZCIsICJjb3B5cmlnaHQiLCAidHJhZGVtYXJrIiwgImFjdXRlIiwgImRpZXJlc2lzIiwgIm5vdGVxdWFsIiwgIkFFIiwgIk9zbGFzaCIsICJpbmZpbml0eSIsICJwbHVzbWludXMiLCAibGVzc2VxdWFsIiwgImdyZWF0ZXJlcXVhbCIsICJ5ZW4iLCAibXUiLCAicGFydGlhbGRpZmYiLCAic3VtbWF0aW9uIiwgInByb2R1Y3QiLCAicGkiLCAiaW50ZWdyYWwiLCAib3JkZmVtaW5pbmUiLCAib3JkbWFzY3VsaW5lIiwgIk9tZWdhIiwgImFlIiwgIm9zbGFzaCIsICJxdWVzdGlvbmRvd24iLCAiZXhjbGFtZG93biIsICJsb2dpY2Fsbm90IiwgInJhZGljYWwiLCAiZmxvcmluIiwgImFwcHJveGVxdWFsIiwgIkRlbHRhIiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAic3BhY2UiLCAiQWdyYXZlIiwgIkF0aWxkZSIsICJPdGlsZGUiLCAiT0UiLCAib2UiLCAiZW5kYXNoIiwgImVtZGFzaCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJkaXZpZGUiLCAibG96ZW5nZSIsICJ5ZGllcmVzaXMiLCAiWWRpZXJlc2lzIiwgImZyYWN0aW9uIiwgImN1cnJlbmN5IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJwZXJ0aG91c2FuZCIsICJBY2lyY3VtZmxleCIsICJFY2lyY3VtZmxleCIsICJBYWN1dGUiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiYXBwbGUiLCAiT2dyYXZlIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZ3JhdmUiLCAiZG90bGVzc2kiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIl07CmNvbnN0IFN0YW5kYXJkRW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3RlcmlnaHQiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgInF1b3RlbGVmdCIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICIiLCAiZW5kYXNoIiwgImRhZ2dlciIsICJkYWdnZXJkYmwiLCAicGVyaW9kY2VudGVyZWQiLCAiIiwgInBhcmFncmFwaCIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInF1b3RlZGJscmlnaHQiLCAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAicGVydGhvdXNhbmQiLCAiIiwgInF1ZXN0aW9uZG93biIsICIiLCAiZ3JhdmUiLCAiYWN1dGUiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgImRpZXJlc2lzIiwgIiIsICJyaW5nIiwgImNlZGlsbGEiLCAiIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJBRSIsICIiLCAib3JkZmVtaW5pbmUiLCAiIiwgIiIsICIiLCAiIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiYWUiLCAiIiwgIiIsICIiLCAiZG90bGVzc2kiLCAiIiwgIiIsICJsc2xhc2giLCAib3NsYXNoIiwgIm9lIiwgImdlcm1hbmRibHMiLCAiIiwgIiIsICIiLCAiIl07CmNvbnN0IFdpbkFuc2lFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJidWxsZXQiLCAiRXVybyIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAiZmxvcmluIiwgInF1b3RlZGJsYmFzZSIsICJlbGxpcHNpcyIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgImNpcmN1bWZsZXgiLCAicGVydGhvdXNhbmQiLCAiU2Nhcm9uIiwgImd1aWxzaW5nbGxlZnQiLCAiT0UiLCAiYnVsbGV0IiwgIlpjYXJvbiIsICJidWxsZXQiLCAiYnVsbGV0IiwgInF1b3RlbGVmdCIsICJxdW90ZXJpZ2h0IiwgInF1b3RlZGJsbGVmdCIsICJxdW90ZWRibHJpZ2h0IiwgImJ1bGxldCIsICJlbmRhc2giLCAiZW1kYXNoIiwgInRpbGRlIiwgInRyYWRlbWFyayIsICJzY2Fyb24iLCAiZ3VpbHNpbmdscmlnaHQiLCAib2UiLCAiYnVsbGV0IiwgInpjYXJvbiIsICJZZGllcmVzaXMiLCAic3BhY2UiLCAiZXhjbGFtZG93biIsICJjZW50IiwgInN0ZXJsaW5nIiwgImN1cnJlbmN5IiwgInllbiIsICJicm9rZW5iYXIiLCAic2VjdGlvbiIsICJkaWVyZXNpcyIsICJjb3B5cmlnaHQiLCAib3JkZmVtaW5pbmUiLCAiZ3VpbGxlbW90bGVmdCIsICJsb2dpY2Fsbm90IiwgImh5cGhlbiIsICJyZWdpc3RlcmVkIiwgIm1hY3JvbiIsICJkZWdyZWUiLCAicGx1c21pbnVzIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiYWN1dGUiLCAibXUiLCAicGFyYWdyYXBoIiwgInBlcmlvZGNlbnRlcmVkIiwgImNlZGlsbGEiLCAib25lc3VwZXJpb3IiLCAib3JkbWFzY3VsaW5lIiwgImd1aWxsZW1vdHJpZ2h0IiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInF1ZXN0aW9uZG93biIsICJBZ3JhdmUiLCAiQWFjdXRlIiwgIkFjaXJjdW1mbGV4IiwgIkF0aWxkZSIsICJBZGllcmVzaXMiLCAiQXJpbmciLCAiQUUiLCAiQ2NlZGlsbGEiLCAiRWdyYXZlIiwgIkVhY3V0ZSIsICJFY2lyY3VtZmxleCIsICJFZGllcmVzaXMiLCAiSWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLCAiRXRoIiwgIk50aWxkZSIsICJPZ3JhdmUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk90aWxkZSIsICJPZGllcmVzaXMiLCAibXVsdGlwbHkiLCAiT3NsYXNoIiwgIlVncmF2ZSIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIllhY3V0ZSIsICJUaG9ybiIsICJnZXJtYW5kYmxzIiwgImFncmF2ZSIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYXRpbGRlIiwgImFkaWVyZXNpcyIsICJhcmluZyIsICJhZSIsICJjY2VkaWxsYSIsICJlZ3JhdmUiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJpZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJldGgiLCAibnRpbGRlIiwgIm9ncmF2ZSIsICJvYWN1dGUiLCAib2NpcmN1bWZsZXgiLCAib3RpbGRlIiwgIm9kaWVyZXNpcyIsICJkaXZpZGUiLCAib3NsYXNoIiwgInVncmF2ZSIsICJ1YWN1dGUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgInlhY3V0ZSIsICJ0aG9ybiIsICJ5ZGllcmVzaXMiXTsKY29uc3QgU3ltYm9sU2V0RW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtIiwgInVuaXZlcnNhbCIsICJudW1iZXJzaWduIiwgImV4aXN0ZW50aWFsIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInN1Y2h0aGF0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrbWF0aCIsICJwbHVzIiwgImNvbW1hIiwgIm1pbnVzIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiY29uZ3J1ZW50IiwgIkFscGhhIiwgIkJldGEiLCAiQ2hpIiwgIkRlbHRhIiwgIkVwc2lsb24iLCAiUGhpIiwgIkdhbW1hIiwgIkV0YSIsICJJb3RhIiwgInRoZXRhMSIsICJLYXBwYSIsICJMYW1iZGEiLCAiTXUiLCAiTnUiLCAiT21pY3JvbiIsICJQaSIsICJUaGV0YSIsICJSaG8iLCAiU2lnbWEiLCAiVGF1IiwgIlVwc2lsb24iLCAic2lnbWExIiwgIk9tZWdhIiwgIlhpIiwgIlBzaSIsICJaZXRhIiwgImJyYWNrZXRsZWZ0IiwgInRoZXJlZm9yZSIsICJicmFja2V0cmlnaHQiLCAicGVycGVuZGljdWxhciIsICJ1bmRlcnNjb3JlIiwgInJhZGljYWxleCIsICJhbHBoYSIsICJiZXRhIiwgImNoaSIsICJkZWx0YSIsICJlcHNpbG9uIiwgInBoaSIsICJnYW1tYSIsICJldGEiLCAiaW90YSIsICJwaGkxIiwgImthcHBhIiwgImxhbWJkYSIsICJtdSIsICJudSIsICJvbWljcm9uIiwgInBpIiwgInRoZXRhIiwgInJobyIsICJzaWdtYSIsICJ0YXUiLCAidXBzaWxvbiIsICJvbWVnYTEiLCAib21lZ2EiLCAieGkiLCAicHNpIiwgInpldGEiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgInNpbWlsYXIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiRXVybyIsICJVcHNpbG9uMSIsICJtaW51dGUiLCAibGVzc2VxdWFsIiwgImZyYWN0aW9uIiwgImluZmluaXR5IiwgImZsb3JpbiIsICJjbHViIiwgImRpYW1vbmQiLCAiaGVhcnQiLCAic3BhZGUiLCAiYXJyb3dib3RoIiwgImFycm93bGVmdCIsICJhcnJvd3VwIiwgImFycm93cmlnaHQiLCAiYXJyb3dkb3duIiwgImRlZ3JlZSIsICJwbHVzbWludXMiLCAic2Vjb25kIiwgImdyZWF0ZXJlcXVhbCIsICJtdWx0aXBseSIsICJwcm9wb3J0aW9uYWwiLCAicGFydGlhbGRpZmYiLCAiYnVsbGV0IiwgImRpdmlkZSIsICJub3RlcXVhbCIsICJlcXVpdmFsZW5jZSIsICJhcHByb3hlcXVhbCIsICJlbGxpcHNpcyIsICJhcnJvd3ZlcnRleCIsICJhcnJvd2hvcml6ZXgiLCAiY2FycmlhZ2VyZXR1cm4iLCAiYWxlcGgiLCAiSWZyYWt0dXIiLCAiUmZyYWt0dXIiLCAid2VpZXJzdHJhc3MiLCAiY2lyY2xlbXVsdGlwbHkiLCAiY2lyY2xlcGx1cyIsICJlbXB0eXNldCIsICJpbnRlcnNlY3Rpb24iLCAidW5pb24iLCAicHJvcGVyc3VwZXJzZXQiLCAicmVmbGV4c3VwZXJzZXQiLCAibm90c3Vic2V0IiwgInByb3BlcnN1YnNldCIsICJyZWZsZXhzdWJzZXQiLCAiZWxlbWVudCIsICJub3RlbGVtZW50IiwgImFuZ2xlIiwgImdyYWRpZW50IiwgInJlZ2lzdGVyc2VyaWYiLCAiY29weXJpZ2h0c2VyaWYiLCAidHJhZGVtYXJrc2VyaWYiLCAicHJvZHVjdCIsICJyYWRpY2FsIiwgImRvdG1hdGgiLCAibG9naWNhbG5vdCIsICJsb2dpY2FsYW5kIiwgImxvZ2ljYWxvciIsICJhcnJvd2RibGJvdGgiLCAiYXJyb3dkYmxsZWZ0IiwgImFycm93ZGJsdXAiLCAiYXJyb3dkYmxyaWdodCIsICJhcnJvd2RibGRvd24iLCAibG96ZW5nZSIsICJhbmdsZWxlZnQiLCAicmVnaXN0ZXJzYW5zIiwgImNvcHlyaWdodHNhbnMiLCAidHJhZGVtYXJrc2FucyIsICJzdW1tYXRpb24iLCAicGFyZW5sZWZ0dHAiLCAicGFyZW5sZWZ0ZXgiLCAicGFyZW5sZWZ0YnQiLCAiYnJhY2tldGxlZnR0cCIsICJicmFja2V0bGVmdGV4IiwgImJyYWNrZXRsZWZ0YnQiLCAiYnJhY2VsZWZ0dHAiLCAiYnJhY2VsZWZ0bWlkIiwgImJyYWNlbGVmdGJ0IiwgImJyYWNlZXgiLCAiIiwgImFuZ2xlcmlnaHQiLCAiaW50ZWdyYWwiLCAiaW50ZWdyYWx0cCIsICJpbnRlZ3JhbGV4IiwgImludGVncmFsYnQiLCAicGFyZW5yaWdodHRwIiwgInBhcmVucmlnaHRleCIsICJwYXJlbnJpZ2h0YnQiLCAiYnJhY2tldHJpZ2h0dHAiLCAiYnJhY2tldHJpZ2h0ZXgiLCAiYnJhY2tldHJpZ2h0YnQiLCAiYnJhY2VyaWdodHRwIiwgImJyYWNlcmlnaHRtaWQiLCAiYnJhY2VyaWdodGJ0IiwgIiJdOwpjb25zdCBaYXBmRGluZ2JhdHNFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJhMSIsICJhMiIsICJhMjAyIiwgImEzIiwgImE0IiwgImE1IiwgImExMTkiLCAiYTExOCIsICJhMTE3IiwgImExMSIsICJhMTIiLCAiYTEzIiwgImExNCIsICJhMTUiLCAiYTE2IiwgImExMDUiLCAiYTE3IiwgImExOCIsICJhMTkiLCAiYTIwIiwgImEyMSIsICJhMjIiLCAiYTIzIiwgImEyNCIsICJhMjUiLCAiYTI2IiwgImEyNyIsICJhMjgiLCAiYTYiLCAiYTciLCAiYTgiLCAiYTkiLCAiYTEwIiwgImEyOSIsICJhMzAiLCAiYTMxIiwgImEzMiIsICJhMzMiLCAiYTM0IiwgImEzNSIsICJhMzYiLCAiYTM3IiwgImEzOCIsICJhMzkiLCAiYTQwIiwgImE0MSIsICJhNDIiLCAiYTQzIiwgImE0NCIsICJhNDUiLCAiYTQ2IiwgImE0NyIsICJhNDgiLCAiYTQ5IiwgImE1MCIsICJhNTEiLCAiYTUyIiwgImE1MyIsICJhNTQiLCAiYTU1IiwgImE1NiIsICJhNTciLCAiYTU4IiwgImE1OSIsICJhNjAiLCAiYTYxIiwgImE2MiIsICJhNjMiLCAiYTY0IiwgImE2NSIsICJhNjYiLCAiYTY3IiwgImE2OCIsICJhNjkiLCAiYTcwIiwgImE3MSIsICJhNzIiLCAiYTczIiwgImE3NCIsICJhMjAzIiwgImE3NSIsICJhMjA0IiwgImE3NiIsICJhNzciLCAiYTc4IiwgImE3OSIsICJhODEiLCAiYTgyIiwgImE4MyIsICJhODQiLCAiYTk3IiwgImE5OCIsICJhOTkiLCAiYTEwMCIsICIiLCAiYTg5IiwgImE5MCIsICJhOTMiLCAiYTk0IiwgImE5MSIsICJhOTIiLCAiYTIwNSIsICJhODUiLCAiYTIwNiIsICJhODYiLCAiYTg3IiwgImE4OCIsICJhOTUiLCAiYTk2IiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJhMTAxIiwgImExMDIiLCAiYTEwMyIsICJhMTA0IiwgImExMDYiLCAiYTEwNyIsICJhMTA4IiwgImExMTIiLCAiYTExMSIsICJhMTEwIiwgImExMDkiLCAiYTEyMCIsICJhMTIxIiwgImExMjIiLCAiYTEyMyIsICJhMTI0IiwgImExMjUiLCAiYTEyNiIsICJhMTI3IiwgImExMjgiLCAiYTEyOSIsICJhMTMwIiwgImExMzEiLCAiYTEzMiIsICJhMTMzIiwgImExMzQiLCAiYTEzNSIsICJhMTM2IiwgImExMzciLCAiYTEzOCIsICJhMTM5IiwgImExNDAiLCAiYTE0MSIsICJhMTQyIiwgImExNDMiLCAiYTE0NCIsICJhMTQ1IiwgImExNDYiLCAiYTE0NyIsICJhMTQ4IiwgImExNDkiLCAiYTE1MCIsICJhMTUxIiwgImExNTIiLCAiYTE1MyIsICJhMTU0IiwgImExNTUiLCAiYTE1NiIsICJhMTU3IiwgImExNTgiLCAiYTE1OSIsICJhMTYwIiwgImExNjEiLCAiYTE2MyIsICJhMTY0IiwgImExOTYiLCAiYTE2NSIsICJhMTkyIiwgImExNjYiLCAiYTE2NyIsICJhMTY4IiwgImExNjkiLCAiYTE3MCIsICJhMTcxIiwgImExNzIiLCAiYTE3MyIsICJhMTYyIiwgImExNzQiLCAiYTE3NSIsICJhMTc2IiwgImExNzciLCAiYTE3OCIsICJhMTc5IiwgImExOTMiLCAiYTE4MCIsICJhMTk5IiwgImExODEiLCAiYTIwMCIsICJhMTgyIiwgIiIsICJhMjAxIiwgImExODMiLCAiYTE4NCIsICJhMTk3IiwgImExODUiLCAiYTE5NCIsICJhMTk4IiwgImExODYiLCAiYTE5NSIsICJhMTg3IiwgImExODgiLCAiYTE4OSIsICJhMTkwIiwgImExOTEiLCAiIl07CmZ1bmN0aW9uIGdldEVuY29kaW5nKGVuY29kaW5nTmFtZSkgewogIHN3aXRjaCAoZW5jb2RpbmdOYW1lKSB7CiAgICBjYXNlICJXaW5BbnNpRW5jb2RpbmciOgogICAgICByZXR1cm4gV2luQW5zaUVuY29kaW5nOwogICAgY2FzZSAiU3RhbmRhcmRFbmNvZGluZyI6CiAgICAgIHJldHVybiBTdGFuZGFyZEVuY29kaW5nOwogICAgY2FzZSAiTWFjUm9tYW5FbmNvZGluZyI6CiAgICAgIHJldHVybiBNYWNSb21hbkVuY29kaW5nOwogICAgY2FzZSAiU3ltYm9sU2V0RW5jb2RpbmciOgogICAgICByZXR1cm4gU3ltYm9sU2V0RW5jb2Rpbmc7CiAgICBjYXNlICJaYXBmRGluZ2JhdHNFbmNvZGluZyI6CiAgICAgIHJldHVybiBaYXBmRGluZ2JhdHNFbmNvZGluZzsKICAgIGNhc2UgIkV4cGVydEVuY29kaW5nIjoKICAgICAgcmV0dXJuIEV4cGVydEVuY29kaW5nOwogICAgY2FzZSAiTWFjRXhwZXJ0RW5jb2RpbmciOgogICAgICByZXR1cm4gTWFjRXhwZXJ0RW5jb2Rpbmc7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NmZl9wYXJzZXIuanMKCgoKCmNvbnN0IE1BWF9TVUJSX05FU1RJTkcgPSAxMDsKY29uc3QgQ0ZGU3RhbmRhcmRTdHJpbmdzID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICJlbmRhc2giLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgInF1ZXN0aW9uZG93biIsICJncmF2ZSIsICJhY3V0ZSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAiZGllcmVzaXMiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIkFFIiwgIm9yZGZlbWluaW5lIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgImFlIiwgImRvdGxlc3NpIiwgImxzbGFzaCIsICJvc2xhc2giLCAib2UiLCAiZ2VybWFuZGJscyIsICJvbmVzdXBlcmlvciIsICJsb2dpY2Fsbm90IiwgIm11IiwgInRyYWRlbWFyayIsICJFdGgiLCAib25laGFsZiIsICJwbHVzbWludXMiLCAiVGhvcm4iLCAib25lcXVhcnRlciIsICJkaXZpZGUiLCAiYnJva2VuYmFyIiwgImRlZ3JlZSIsICJ0aG9ybiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInR3b3N1cGVyaW9yIiwgInJlZ2lzdGVyZWQiLCAibWludXMiLCAiZXRoIiwgIm11bHRpcGx5IiwgInRocmVlc3VwZXJpb3IiLCAiY29weXJpZ2h0IiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBZGllcmVzaXMiLCAiQWdyYXZlIiwgIkFyaW5nIiwgIkF0aWxkZSIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJOdGlsZGUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk9kaWVyZXNpcyIsICJPZ3JhdmUiLCAiT3RpbGRlIiwgIlNjYXJvbiIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIlVncmF2ZSIsICJZYWN1dGUiLCAiWWRpZXJlc2lzIiwgIlpjYXJvbiIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImFncmF2ZSIsICJhcmluZyIsICJhdGlsZGUiLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJlZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJpZ3JhdmUiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib2dyYXZlIiwgIm90aWxkZSIsICJzY2Fyb24iLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJ1Z3JhdmUiLCAieWFjdXRlIiwgInlkaWVyZXNpcyIsICJ6Y2Fyb24iLCAiZXhjbGFtc21hbGwiLCAiSHVuZ2FydW1sYXV0c21hbGwiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiemVyb29sZHN0eWxlIiwgIm9uZW9sZHN0eWxlIiwgInR3b29sZHN0eWxlIiwgInRocmVlb2xkc3R5bGUiLCAiZm91cm9sZHN0eWxlIiwgImZpdmVvbGRzdHlsZSIsICJzaXhvbGRzdHlsZSIsICJzZXZlbm9sZHN0eWxlIiwgImVpZ2h0b2xkc3R5bGUiLCAibmluZW9sZHN0eWxlIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgImFzdXBlcmlvciIsICJic3VwZXJpb3IiLCAiY2VudHN1cGVyaW9yIiwgImRzdXBlcmlvciIsICJlc3VwZXJpb3IiLCAiaXN1cGVyaW9yIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICJmZiIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuc3VwZXJpb3IiLCAiR3JhdmVzbWFsbCIsICJBc21hbGwiLCAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsICJHc21hbGwiLCAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwgIkxzbWFsbCIsICJNc21hbGwiLCAiTnNtYWxsIiwgIk9zbWFsbCIsICJQc21hbGwiLCAiUXNtYWxsIiwgIlJzbWFsbCIsICJTc21hbGwiLCAiVHNtYWxsIiwgIlVzbWFsbCIsICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgImV4Y2xhbWRvd25zbWFsbCIsICJjZW50b2xkc3R5bGUiLCAiTHNsYXNoc21hbGwiLCAiU2Nhcm9uc21hbGwiLCAiWmNhcm9uc21hbGwiLCAiRGllcmVzaXNzbWFsbCIsICJCcmV2ZXNtYWxsIiwgIkNhcm9uc21hbGwiLCAiRG90YWNjZW50c21hbGwiLCAiTWFjcm9uc21hbGwiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICJPZ29uZWtzbWFsbCIsICJSaW5nc21hbGwiLCAiQ2VkaWxsYXNtYWxsIiwgInF1ZXN0aW9uZG93bnNtYWxsIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICJ6ZXJvc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgImVpZ2h0c3VwZXJpb3IiLCAibmluZXN1cGVyaW9yIiwgInplcm9pbmZlcmlvciIsICJvbmVpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICJ0aHJlZWluZmVyaW9yIiwgImZvdXJpbmZlcmlvciIsICJmaXZlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAic2V2ZW5pbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgIm5pbmVpbmZlcmlvciIsICJjZW50aW5mZXJpb3IiLCAiZG9sbGFyaW5mZXJpb3IiLCAicGVyaW9kaW5mZXJpb3IiLCAiY29tbWFpbmZlcmlvciIsICJBZ3JhdmVzbWFsbCIsICJBYWN1dGVzbWFsbCIsICJBY2lyY3VtZmxleHNtYWxsIiwgIkF0aWxkZXNtYWxsIiwgIkFkaWVyZXNpc3NtYWxsIiwgIkFyaW5nc21hbGwiLCAiQUVzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJFdGhzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPZ3JhdmVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk90aWxkZXNtYWxsIiwgIk9kaWVyZXNpc3NtYWxsIiwgIk9Fc21hbGwiLCAiT3NsYXNoc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICJZYWN1dGVzbWFsbCIsICJUaG9ybnNtYWxsIiwgIllkaWVyZXNpc3NtYWxsIiwgIjAwMS4wMDAiLCAiMDAxLjAwMSIsICIwMDEuMDAyIiwgIjAwMS4wMDMiLCAiQmxhY2siLCAiQm9sZCIsICJCb29rIiwgIkxpZ2h0IiwgIk1lZGl1bSIsICJSZWd1bGFyIiwgIlJvbWFuIiwgIlNlbWlib2xkIl07CmNvbnN0IE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUyA9IDM5MTsKY29uc3QgQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhID0gW251bGwsIHsKICBpZDogImhzdGVtIiwKICBtaW46IDIsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZSwKICBzdGVtOiB0cnVlCn0sIG51bGwsIHsKICBpZDogInZzdGVtIiwKICBtaW46IDIsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZSwKICBzdGVtOiB0cnVlCn0sIHsKICBpZDogInZtb3ZldG8iLAogIG1pbjogMSwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogInJsaW5ldG8iLAogIG1pbjogMiwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogImhsaW5ldG8iLAogIG1pbjogMSwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogInZsaW5ldG8iLAogIG1pbjogMSwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogInJyY3VydmV0byIsCiAgbWluOiA2LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgbnVsbCwgewogIGlkOiAiY2FsbHN1YnIiLAogIG1pbjogMSwKICB1bmRlZlN0YWNrOiB0cnVlCn0sIHsKICBpZDogInJldHVybiIsCiAgbWluOiAwLAogIHVuZGVmU3RhY2s6IHRydWUKfSwgbnVsbCwgbnVsbCwgewogIGlkOiAiZW5kY2hhciIsCiAgbWluOiAwLAogIHN0YWNrQ2xlYXJpbmc6IHRydWUKfSwgbnVsbCwgbnVsbCwgbnVsbCwgewogIGlkOiAiaHN0ZW1obSIsCiAgbWluOiAyLAogIHN0YWNrQ2xlYXJpbmc6IHRydWUsCiAgc3RlbTogdHJ1ZQp9LCB7CiAgaWQ6ICJoaW50bWFzayIsCiAgbWluOiAwLAogIHN0YWNrQ2xlYXJpbmc6IHRydWUKfSwgewogIGlkOiAiY250cm1hc2siLAogIG1pbjogMCwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogInJtb3ZldG8iLAogIG1pbjogMiwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogImhtb3ZldG8iLAogIG1pbjogMSwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogInZzdGVtaG0iLAogIG1pbjogMiwKICBzdGFja0NsZWFyaW5nOiB0cnVlLAogIHN0ZW06IHRydWUKfSwgewogIGlkOiAicmN1cnZlbGluZSIsCiAgbWluOiA4LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAicmxpbmVjdXJ2ZSIsCiAgbWluOiA4LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAidnZjdXJ2ZXRvIiwKICBtaW46IDQsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJoaGN1cnZldG8iLAogIG1pbjogNCwKICByZXNldFN0YWNrOiB0cnVlCn0sIG51bGwsIHsKICBpZDogImNhbGxnc3ViciIsCiAgbWluOiAxLAogIHVuZGVmU3RhY2s6IHRydWUKfSwgewogIGlkOiAidmhjdXJ2ZXRvIiwKICBtaW46IDQsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJodmN1cnZldG8iLAogIG1pbjogNCwKICByZXNldFN0YWNrOiB0cnVlCn1dOwpjb25zdCBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGExMiA9IFtudWxsLCBudWxsLCBudWxsLCB7CiAgaWQ6ICJhbmQiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMQp9LCB7CiAgaWQ6ICJvciIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IC0xCn0sIHsKICBpZDogIm5vdCIsCiAgbWluOiAxLAogIHN0YWNrRGVsdGE6IDAKfSwgbnVsbCwgbnVsbCwgbnVsbCwgewogIGlkOiAiYWJzIiwKICBtaW46IDEsCiAgc3RhY2tEZWx0YTogMAp9LCB7CiAgaWQ6ICJhZGQiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMSwKICBzdGFja0ZuKHN0YWNrLCBpbmRleCkgewogICAgc3RhY2tbaW5kZXggLSAyXSA9IHN0YWNrW2luZGV4IC0gMl0gKyBzdGFja1tpbmRleCAtIDFdOwogIH0KfSwgewogIGlkOiAic3ViIiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogLTEsCiAgc3RhY2tGbihzdGFjaywgaW5kZXgpIHsKICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdIC0gc3RhY2tbaW5kZXggLSAxXTsKICB9Cn0sIHsKICBpZDogImRpdiIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IC0xLAogIHN0YWNrRm4oc3RhY2ssIGluZGV4KSB7CiAgICBzdGFja1tpbmRleCAtIDJdID0gc3RhY2tbaW5kZXggLSAyXSAvIHN0YWNrW2luZGV4IC0gMV07CiAgfQp9LCBudWxsLCB7CiAgaWQ6ICJuZWciLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAwLAogIHN0YWNrRm4oc3RhY2ssIGluZGV4KSB7CiAgICBzdGFja1tpbmRleCAtIDFdID0gLXN0YWNrW2luZGV4IC0gMV07CiAgfQp9LCB7CiAgaWQ6ICJlcSIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IC0xCn0sIG51bGwsIG51bGwsIHsKICBpZDogImRyb3AiLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAtMQp9LCBudWxsLCB7CiAgaWQ6ICJwdXQiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMgp9LCB7CiAgaWQ6ICJnZXQiLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAwCn0sIHsKICBpZDogImlmZWxzZSIsCiAgbWluOiA0LAogIHN0YWNrRGVsdGE6IC0zCn0sIHsKICBpZDogInJhbmRvbSIsCiAgbWluOiAwLAogIHN0YWNrRGVsdGE6IDEKfSwgewogIGlkOiAibXVsIiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogLTEsCiAgc3RhY2tGbihzdGFjaywgaW5kZXgpIHsKICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdICogc3RhY2tbaW5kZXggLSAxXTsKICB9Cn0sIG51bGwsIHsKICBpZDogInNxcnQiLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAwCn0sIHsKICBpZDogImR1cCIsCiAgbWluOiAxLAogIHN0YWNrRGVsdGE6IDEKfSwgewogIGlkOiAiZXhjaCIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IDAKfSwgewogIGlkOiAiaW5kZXgiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAwCn0sIHsKICBpZDogInJvbGwiLAogIG1pbjogMywKICBzdGFja0RlbHRhOiAtMgp9LCBudWxsLCBudWxsLCBudWxsLCB7CiAgaWQ6ICJoZmxleCIsCiAgbWluOiA3LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAiZmxleCIsCiAgbWluOiAxMywKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogImhmbGV4MSIsCiAgbWluOiA5LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAiZmxleDEiLAogIG1pbjogMTEsCiAgcmVzZXRTdGFjazogdHJ1ZQp9XTsKY2xhc3MgQ0ZGUGFyc2VyIHsKICBjb25zdHJ1Y3RvcihmaWxlLCBwcm9wZXJ0aWVzLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgICB0aGlzLmJ5dGVzID0gZmlsZS5nZXRCeXRlcygpOwogICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKICAgIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCA9ICEhc2VhY0FuYWx5c2lzRW5hYmxlZDsKICB9CiAgcGFyc2UoKSB7CiAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzOwogICAgY29uc3QgY2ZmID0gbmV3IENGRigpOwogICAgdGhpcy5jZmYgPSBjZmY7CiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLnBhcnNlSGVhZGVyKCk7CiAgICBjb25zdCBuYW1lSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgoaGVhZGVyLmVuZFBvcyk7CiAgICBjb25zdCB0b3BEaWN0SW5kZXggPSB0aGlzLnBhcnNlSW5kZXgobmFtZUluZGV4LmVuZFBvcyk7CiAgICBjb25zdCBzdHJpbmdJbmRleCA9IHRoaXMucGFyc2VJbmRleCh0b3BEaWN0SW5kZXguZW5kUG9zKTsKICAgIGNvbnN0IGdsb2JhbFN1YnJJbmRleCA9IHRoaXMucGFyc2VJbmRleChzdHJpbmdJbmRleC5lbmRQb3MpOwogICAgY29uc3QgdG9wRGljdFBhcnNlZCA9IHRoaXMucGFyc2VEaWN0KHRvcERpY3RJbmRleC5vYmouZ2V0KDApKTsKICAgIGNvbnN0IHRvcERpY3QgPSB0aGlzLmNyZWF0ZURpY3QoQ0ZGVG9wRGljdCwgdG9wRGljdFBhcnNlZCwgY2ZmLnN0cmluZ3MpOwogICAgY2ZmLmhlYWRlciA9IGhlYWRlci5vYmo7CiAgICBjZmYubmFtZXMgPSB0aGlzLnBhcnNlTmFtZUluZGV4KG5hbWVJbmRleC5vYmopOwogICAgY2ZmLnN0cmluZ3MgPSB0aGlzLnBhcnNlU3RyaW5nSW5kZXgoc3RyaW5nSW5kZXgub2JqKTsKICAgIGNmZi50b3BEaWN0ID0gdG9wRGljdDsKICAgIGNmZi5nbG9iYWxTdWJySW5kZXggPSBnbG9iYWxTdWJySW5kZXgub2JqOwogICAgdGhpcy5wYXJzZVByaXZhdGVEaWN0KGNmZi50b3BEaWN0KTsKICAgIGNmZi5pc0NJREZvbnQgPSB0b3BEaWN0Lmhhc05hbWUoIlJPUyIpOwogICAgY29uc3QgY2hhclN0cmluZ09mZnNldCA9IHRvcERpY3QuZ2V0QnlOYW1lKCJDaGFyU3RyaW5ncyIpOwogICAgY29uc3QgY2hhclN0cmluZ0luZGV4ID0gdGhpcy5wYXJzZUluZGV4KGNoYXJTdHJpbmdPZmZzZXQpLm9iajsKICAgIGNvbnN0IGZvbnRNYXRyaXggPSB0b3BEaWN0LmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpOwogICAgaWYgKGZvbnRNYXRyaXgpIHsKICAgICAgcHJvcGVydGllcy5mb250TWF0cml4ID0gZm9udE1hdHJpeDsKICAgIH0KICAgIGNvbnN0IGZvbnRCQm94ID0gdG9wRGljdC5nZXRCeU5hbWUoIkZvbnRCQm94Iik7CiAgICBpZiAoZm9udEJCb3gpIHsKICAgICAgcHJvcGVydGllcy5hc2NlbnQgPSBNYXRoLm1heChmb250QkJveFszXSwgZm9udEJCb3hbMV0pOwogICAgICBwcm9wZXJ0aWVzLmRlc2NlbnQgPSBNYXRoLm1pbihmb250QkJveFsxXSwgZm9udEJCb3hbM10pOwogICAgICBwcm9wZXJ0aWVzLmFzY2VudFNjYWxlZCA9IHRydWU7CiAgICB9CiAgICBsZXQgY2hhcnNldCwgZW5jb2Rpbmc7CiAgICBpZiAoY2ZmLmlzQ0lERm9udCkgewogICAgICBjb25zdCBmZEFycmF5SW5kZXggPSB0aGlzLnBhcnNlSW5kZXgodG9wRGljdC5nZXRCeU5hbWUoIkZEQXJyYXkiKSkub2JqOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmZEFycmF5SW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgY29uc3QgZGljdFJhdyA9IGZkQXJyYXlJbmRleC5nZXQoaSk7CiAgICAgICAgY29uc3QgZm9udERpY3QgPSB0aGlzLmNyZWF0ZURpY3QoQ0ZGVG9wRGljdCwgdGhpcy5wYXJzZURpY3QoZGljdFJhdyksIGNmZi5zdHJpbmdzKTsKICAgICAgICB0aGlzLnBhcnNlUHJpdmF0ZURpY3QoZm9udERpY3QpOwogICAgICAgIGNmZi5mZEFycmF5LnB1c2goZm9udERpY3QpOwogICAgICB9CiAgICAgIGVuY29kaW5nID0gbnVsbDsKICAgICAgY2hhcnNldCA9IHRoaXMucGFyc2VDaGFyc2V0cyh0b3BEaWN0LmdldEJ5TmFtZSgiY2hhcnNldCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQsIGNmZi5zdHJpbmdzLCB0cnVlKTsKICAgICAgY2ZmLmZkU2VsZWN0ID0gdGhpcy5wYXJzZUZEU2VsZWN0KHRvcERpY3QuZ2V0QnlOYW1lKCJGRFNlbGVjdCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQpOwogICAgfSBlbHNlIHsKICAgICAgY2hhcnNldCA9IHRoaXMucGFyc2VDaGFyc2V0cyh0b3BEaWN0LmdldEJ5TmFtZSgiY2hhcnNldCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQsIGNmZi5zdHJpbmdzLCBmYWxzZSk7CiAgICAgIGVuY29kaW5nID0gdGhpcy5wYXJzZUVuY29kaW5nKHRvcERpY3QuZ2V0QnlOYW1lKCJFbmNvZGluZyIpLCBwcm9wZXJ0aWVzLCBjZmYuc3RyaW5ncywgY2hhcnNldC5jaGFyc2V0KTsKICAgIH0KICAgIGNmZi5jaGFyc2V0ID0gY2hhcnNldDsKICAgIGNmZi5lbmNvZGluZyA9IGVuY29kaW5nOwogICAgY29uc3QgY2hhclN0cmluZ3NBbmRTZWFjcyA9IHRoaXMucGFyc2VDaGFyU3RyaW5ncyh7CiAgICAgIGNoYXJTdHJpbmdzOiBjaGFyU3RyaW5nSW5kZXgsCiAgICAgIGxvY2FsU3VickluZGV4OiB0b3BEaWN0LnByaXZhdGVEaWN0LnN1YnJzSW5kZXgsCiAgICAgIGdsb2JhbFN1YnJJbmRleDogZ2xvYmFsU3VickluZGV4Lm9iaiwKICAgICAgZmRTZWxlY3Q6IGNmZi5mZFNlbGVjdCwKICAgICAgZmRBcnJheTogY2ZmLmZkQXJyYXksCiAgICAgIHByaXZhdGVEaWN0OiB0b3BEaWN0LnByaXZhdGVEaWN0CiAgICB9KTsKICAgIGNmZi5jaGFyU3RyaW5ncyA9IGNoYXJTdHJpbmdzQW5kU2VhY3MuY2hhclN0cmluZ3M7CiAgICBjZmYuc2VhY3MgPSBjaGFyU3RyaW5nc0FuZFNlYWNzLnNlYWNzOwogICAgY2ZmLndpZHRocyA9IGNoYXJTdHJpbmdzQW5kU2VhY3Mud2lkdGhzOwogICAgcmV0dXJuIGNmZjsKICB9CiAgcGFyc2VIZWFkZXIoKSB7CiAgICBsZXQgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgYnl0ZXNMZW5ndGggPSBieXRlcy5sZW5ndGg7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIHdoaWxlIChvZmZzZXQgPCBieXRlc0xlbmd0aCAmJiBieXRlc1tvZmZzZXRdICE9PSAxKSB7CiAgICAgICsrb2Zmc2V0OwogICAgfQogICAgaWYgKG9mZnNldCA+PSBieXRlc0xlbmd0aCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgQ0ZGIGhlYWRlciIpOwogICAgfQogICAgaWYgKG9mZnNldCAhPT0gMCkgewogICAgICBpbmZvKCJjZmYgZGF0YSBpcyBzaGlmdGVkIik7CiAgICAgIGJ5dGVzID0gYnl0ZXMuc3ViYXJyYXkob2Zmc2V0KTsKICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOwogICAgfQogICAgY29uc3QgbWFqb3IgPSBieXRlc1swXTsKICAgIGNvbnN0IG1pbm9yID0gYnl0ZXNbMV07CiAgICBjb25zdCBoZHJTaXplID0gYnl0ZXNbMl07CiAgICBjb25zdCBvZmZTaXplID0gYnl0ZXNbM107CiAgICBjb25zdCBoZWFkZXIgPSBuZXcgQ0ZGSGVhZGVyKG1ham9yLCBtaW5vciwgaGRyU2l6ZSwgb2ZmU2l6ZSk7CiAgICByZXR1cm4gewogICAgICBvYmo6IGhlYWRlciwKICAgICAgZW5kUG9zOiBoZHJTaXplCiAgICB9OwogIH0KICBwYXJzZURpY3QoZGljdCkgewogICAgbGV0IHBvcyA9IDA7CiAgICBmdW5jdGlvbiBwYXJzZU9wZXJhbmQoKSB7CiAgICAgIGxldCB2YWx1ZSA9IGRpY3RbcG9zKytdOwogICAgICBpZiAodmFsdWUgPT09IDMwKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXRPcGVyYW5kKCk7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI4KSB7CiAgICAgICAgdmFsdWUgPSByZWFkSW50MTYoZGljdCwgcG9zKTsKICAgICAgICBwb3MgKz0gMjsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI5KSB7CiAgICAgICAgdmFsdWUgPSBkaWN0W3BvcysrXTsKICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMzIgJiYgdmFsdWUgPD0gMjQ2KSB7CiAgICAgICAgcmV0dXJuIHZhbHVlIC0gMTM5OwogICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI0NyAmJiB2YWx1ZSA8PSAyNTApIHsKICAgICAgICByZXR1cm4gKHZhbHVlIC0gMjQ3KSAqIDI1NiArIGRpY3RbcG9zKytdICsgMTA4OwogICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI1MSAmJiB2YWx1ZSA8PSAyNTQpIHsKICAgICAgICByZXR1cm4gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGRpY3RbcG9zKytdIC0gMTA4OwogICAgICB9CiAgICAgIHdhcm4oJ0NGRlBhcnNlcl9wYXJzZURpY3Q6ICInICsgdmFsdWUgKyAnIiBpcyBhIHJlc2VydmVkIGNvbW1hbmQuJyk7CiAgICAgIHJldHVybiBOYU47CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZUZsb2F0T3BlcmFuZCgpIHsKICAgICAgbGV0IHN0ciA9ICIiOwogICAgICBjb25zdCBlb2YgPSAxNTsKICAgICAgY29uc3QgbG9va3VwID0gWyIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIi4iLCAiRSIsICJFLSIsIG51bGwsICItIl07CiAgICAgIGNvbnN0IGxlbmd0aCA9IGRpY3QubGVuZ3RoOwogICAgICB3aGlsZSAocG9zIDwgbGVuZ3RoKSB7CiAgICAgICAgY29uc3QgYiA9IGRpY3RbcG9zKytdOwogICAgICAgIGNvbnN0IGIxID0gYiA+PiA0OwogICAgICAgIGNvbnN0IGIyID0gYiAmIDE1OwogICAgICAgIGlmIChiMSA9PT0gZW9mKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgc3RyICs9IGxvb2t1cFtiMV07CiAgICAgICAgaWYgKGIyID09PSBlb2YpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdHIgKz0gbG9va3VwW2IyXTsKICAgICAgfQogICAgICByZXR1cm4gcGFyc2VGbG9hdChzdHIpOwogICAgfQogICAgbGV0IG9wZXJhbmRzID0gW107CiAgICBjb25zdCBlbnRyaWVzID0gW107CiAgICBwb3MgPSAwOwogICAgY29uc3QgZW5kID0gZGljdC5sZW5ndGg7CiAgICB3aGlsZSAocG9zIDwgZW5kKSB7CiAgICAgIGxldCBiID0gZGljdFtwb3NdOwogICAgICBpZiAoYiA8PSAyMSkgewogICAgICAgIGlmIChiID09PSAxMikgewogICAgICAgICAgYiA9IGIgPDwgOCB8IGRpY3RbKytwb3NdOwogICAgICAgIH0KICAgICAgICBlbnRyaWVzLnB1c2goW2IsIG9wZXJhbmRzXSk7CiAgICAgICAgb3BlcmFuZHMgPSBbXTsKICAgICAgICArK3BvczsKICAgICAgfSBlbHNlIHsKICAgICAgICBvcGVyYW5kcy5wdXNoKHBhcnNlT3BlcmFuZCgpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGVudHJpZXM7CiAgfQogIHBhcnNlSW5kZXgocG9zKSB7CiAgICBjb25zdCBjZmZJbmRleCA9IG5ldyBDRkZJbmRleCgpOwogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgY291bnQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgIGNvbnN0IG9mZnNldHMgPSBbXTsKICAgIGxldCBlbmQgPSBwb3M7CiAgICBsZXQgaSwgaWk7CiAgICBpZiAoY291bnQgIT09IDApIHsKICAgICAgY29uc3Qgb2Zmc2V0U2l6ZSA9IGJ5dGVzW3BvcysrXTsKICAgICAgY29uc3Qgc3RhcnRQb3MgPSBwb3MgKyAoY291bnQgKyAxKSAqIG9mZnNldFNpemUgLSAxOwogICAgICBmb3IgKGkgPSAwLCBpaSA9IGNvdW50ICsgMTsgaSA8IGlpOyArK2kpIHsKICAgICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG9mZnNldFNpemU7ICsraikgewogICAgICAgICAgb2Zmc2V0IDw8PSA4OwogICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzW3BvcysrXTsKICAgICAgICB9CiAgICAgICAgb2Zmc2V0cy5wdXNoKHN0YXJ0UG9zICsgb2Zmc2V0KTsKICAgICAgfQogICAgICBlbmQgPSBvZmZzZXRzW2NvdW50XTsKICAgIH0KICAgIGZvciAoaSA9IDAsIGlpID0gb2Zmc2V0cy5sZW5ndGggLSAxOyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBvZmZzZXRTdGFydCA9IG9mZnNldHNbaV07CiAgICAgIGNvbnN0IG9mZnNldEVuZCA9IG9mZnNldHNbaSArIDFdOwogICAgICBjZmZJbmRleC5hZGQoYnl0ZXMuc3ViYXJyYXkob2Zmc2V0U3RhcnQsIG9mZnNldEVuZCkpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgb2JqOiBjZmZJbmRleCwKICAgICAgZW5kUG9zOiBlbmQKICAgIH07CiAgfQogIHBhcnNlTmFtZUluZGV4KGluZGV4KSB7CiAgICBjb25zdCBuYW1lcyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBpbmRleC5nZXQoaSk7CiAgICAgIG5hbWVzLnB1c2goYnl0ZXNUb1N0cmluZyhuYW1lKSk7CiAgICB9CiAgICByZXR1cm4gbmFtZXM7CiAgfQogIHBhcnNlU3RyaW5nSW5kZXgoaW5kZXgpIHsKICAgIGNvbnN0IHN0cmluZ3MgPSBuZXcgQ0ZGU3RyaW5ncygpOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBpbmRleC5nZXQoaSk7CiAgICAgIHN0cmluZ3MuYWRkKGJ5dGVzVG9TdHJpbmcoZGF0YSkpOwogICAgfQogICAgcmV0dXJuIHN0cmluZ3M7CiAgfQogIGNyZWF0ZURpY3QoVHlwZSwgZGljdCwgc3RyaW5ncykgewogICAgY29uc3QgY2ZmRGljdCA9IG5ldyBUeXBlKHN0cmluZ3MpOwogICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZGljdCkgewogICAgICBjZmZEaWN0LnNldEJ5S2V5KGtleSwgdmFsdWUpOwogICAgfQogICAgcmV0dXJuIGNmZkRpY3Q7CiAgfQogIHBhcnNlQ2hhclN0cmluZyhzdGF0ZSwgZGF0YSwgbG9jYWxTdWJySW5kZXgsIGdsb2JhbFN1YnJJbmRleCkgewogICAgaWYgKCFkYXRhIHx8IHN0YXRlLmNhbGxEZXB0aCA+IE1BWF9TVUJSX05FU1RJTkcpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgbGV0IHN0YWNrU2l6ZSA9IHN0YXRlLnN0YWNrU2l6ZTsKICAgIGNvbnN0IHN0YWNrID0gc3RhdGUuc3RhY2s7CiAgICBsZXQgbGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxlbmd0aDspIHsKICAgICAgY29uc3QgdmFsdWUgPSBkYXRhW2orK107CiAgICAgIGxldCB2YWxpZGF0aW9uQ29tbWFuZCA9IG51bGw7CiAgICAgIGlmICh2YWx1ZSA9PT0gMTIpIHsKICAgICAgICBjb25zdCBxID0gZGF0YVtqKytdOwogICAgICAgIGlmIChxID09PSAwKSB7CiAgICAgICAgICBkYXRhW2ogLSAyXSA9IDEzOTsKICAgICAgICAgIGRhdGFbaiAtIDFdID0gMjI7CiAgICAgICAgICBzdGFja1NpemUgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YTEyW3FdOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMjgpIHsKICAgICAgICBzdGFja1tzdGFja1NpemVdID0gcmVhZEludDE2KGRhdGEsIGopOwogICAgICAgIGogKz0gMjsKICAgICAgICBzdGFja1NpemUrKzsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTQpIHsKICAgICAgICBpZiAoc3RhY2tTaXplID49IDQpIHsKICAgICAgICAgIHN0YWNrU2l6ZSAtPSA0OwogICAgICAgICAgaWYgKHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCkgewogICAgICAgICAgICBzdGF0ZS5zZWFjID0gc3RhY2suc2xpY2Uoc3RhY2tTaXplLCBzdGFja1NpemUgKyA0KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMzIgJiYgdmFsdWUgPD0gMjQ2KSB7CiAgICAgICAgc3RhY2tbc3RhY2tTaXplXSA9IHZhbHVlIC0gMTM5OwogICAgICAgIHN0YWNrU2l6ZSsrOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI0NyAmJiB2YWx1ZSA8PSAyNTQpIHsKICAgICAgICBzdGFja1tzdGFja1NpemVdID0gdmFsdWUgPCAyNTEgPyAodmFsdWUgLSAyNDcgPDwgOCkgKyBkYXRhW2pdICsgMTA4IDogLSh2YWx1ZSAtIDI1MSA8PCA4KSAtIGRhdGFbal0gLSAxMDg7CiAgICAgICAgaisrOwogICAgICAgIHN0YWNrU2l6ZSsrOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyNTUpIHsKICAgICAgICBzdGFja1tzdGFja1NpemVdID0gKGRhdGFbal0gPDwgMjQgfCBkYXRhW2ogKyAxXSA8PCAxNiB8IGRhdGFbaiArIDJdIDw8IDggfCBkYXRhW2ogKyAzXSkgLyA2NTUzNjsKICAgICAgICBqICs9IDQ7CiAgICAgICAgc3RhY2tTaXplKys7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDE5IHx8IHZhbHVlID09PSAyMCkgewogICAgICAgIHN0YXRlLmhpbnRzICs9IHN0YWNrU2l6ZSA+PiAxOwogICAgICAgIGlmIChzdGF0ZS5oaW50cyA9PT0gMCkgewogICAgICAgICAgZGF0YS5jb3B5V2l0aGluKGogLSAxLCBqLCAtMSk7CiAgICAgICAgICBqIC09IDE7CiAgICAgICAgICBsZW5ndGggLT0gMTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBqICs9IHN0YXRlLmhpbnRzICsgNyA+PiAzOwogICAgICAgIHN0YWNrU2l6ZSAlPSAyOwogICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTAgfHwgdmFsdWUgPT09IDI5KSB7CiAgICAgICAgY29uc3Qgc3VicnNJbmRleCA9IHZhbHVlID09PSAxMCA/IGxvY2FsU3VickluZGV4IDogZ2xvYmFsU3VickluZGV4OwogICAgICAgIGlmICghc3VicnNJbmRleCkgewogICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbdmFsdWVdOwogICAgICAgICAgd2FybigiTWlzc2luZyBzdWJyc0luZGV4IGZvciAiICsgdmFsaWRhdGlvbkNvbW1hbmQuaWQpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBsZXQgYmlhcyA9IDMyNzY4OwogICAgICAgIGlmIChzdWJyc0luZGV4LmNvdW50IDwgMTI0MCkgewogICAgICAgICAgYmlhcyA9IDEwNzsKICAgICAgICB9IGVsc2UgaWYgKHN1YnJzSW5kZXguY291bnQgPCAzMzkwMCkgewogICAgICAgICAgYmlhcyA9IDExMzE7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN1YnJOdW1iZXIgPSBzdGFja1stLXN0YWNrU2l6ZV0gKyBiaWFzOwogICAgICAgIGlmIChzdWJyTnVtYmVyIDwgMCB8fCBzdWJyTnVtYmVyID49IHN1YnJzSW5kZXguY291bnQgfHwgaXNOYU4oc3Vick51bWJlcikpIHsKICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKICAgICAgICAgIHdhcm4oIk91dCBvZiBib3VuZHMgc3VickluZGV4IGZvciAiICsgdmFsaWRhdGlvbkNvbW1hbmQuaWQpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBzdGF0ZS5zdGFja1NpemUgPSBzdGFja1NpemU7CiAgICAgICAgc3RhdGUuY2FsbERlcHRoKys7CiAgICAgICAgY29uc3QgdmFsaWQgPSB0aGlzLnBhcnNlQ2hhclN0cmluZyhzdGF0ZSwgc3VicnNJbmRleC5nZXQoc3Vick51bWJlciksIGxvY2FsU3VickluZGV4LCBnbG9iYWxTdWJySW5kZXgpOwogICAgICAgIGlmICghdmFsaWQpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc3RhdGUuY2FsbERlcHRoLS07CiAgICAgICAgc3RhY2tTaXplID0gc3RhdGUuc3RhY2tTaXplOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAxMSkgewogICAgICAgIHN0YXRlLnN0YWNrU2l6ZSA9IHN0YWNrU2l6ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMCAmJiBqID09PSBkYXRhLmxlbmd0aCkgewogICAgICAgIGRhdGFbaiAtIDFdID0gMTQ7CiAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbMTRdOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSA5KSB7CiAgICAgICAgZGF0YS5jb3B5V2l0aGluKGogLSAxLCBqLCAtMSk7CiAgICAgICAgaiAtPSAxOwogICAgICAgIGxlbmd0aCAtPSAxOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKICAgICAgfQogICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQpIHsKICAgICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQuc3RlbSkgewogICAgICAgICAgc3RhdGUuaGludHMgKz0gc3RhY2tTaXplID4+IDE7CiAgICAgICAgICBpZiAodmFsdWUgPT09IDMgfHwgdmFsdWUgPT09IDIzKSB7CiAgICAgICAgICAgIHN0YXRlLmhhc1ZTdGVtcyA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhhc1ZTdGVtcyAmJiAodmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDE4KSkgewogICAgICAgICAgICB3YXJuKCJDRkYgc3RlbSBoaW50cyBhcmUgaW4gd3Jvbmcgb3JkZXIiKTsKICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSB2YWx1ZSA9PT0gMSA/IDMgOiAyMzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCJtaW4iIGluIHZhbGlkYXRpb25Db21tYW5kKSB7CiAgICAgICAgICBpZiAoIXN0YXRlLnVuZGVmU3RhY2sgJiYgc3RhY2tTaXplIDwgdmFsaWRhdGlvbkNvbW1hbmQubWluKSB7CiAgICAgICAgICAgIHdhcm4oIk5vdCBlbm91Z2ggcGFyYW1ldGVycyBmb3IgIiArIHZhbGlkYXRpb25Db21tYW5kLmlkICsgIjsgYWN0dWFsOiAiICsgc3RhY2tTaXplICsgIiwgZXhwZWN0ZWQ6ICIgKyB2YWxpZGF0aW9uQ29tbWFuZC5taW4pOwogICAgICAgICAgICBpZiAoc3RhY2tTaXplID09PSAwKSB7CiAgICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSAxNDsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgJiYgdmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tDbGVhcmluZykgewogICAgICAgICAgc3RhdGUuZmlyc3RTdGFja0NsZWFyaW5nID0gZmFsc2U7CiAgICAgICAgICBzdGFja1NpemUgLT0gdmFsaWRhdGlvbkNvbW1hbmQubWluOwogICAgICAgICAgaWYgKHN0YWNrU2l6ZSA+PSAyICYmIHZhbGlkYXRpb25Db21tYW5kLnN0ZW0pIHsKICAgICAgICAgICAgc3RhY2tTaXplICU9IDI7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrU2l6ZSA+IDEpIHsKICAgICAgICAgICAgd2FybigiRm91bmQgdG9vIG1hbnkgcGFyYW1ldGVycyBmb3Igc3RhY2stY2xlYXJpbmcgY29tbWFuZCIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YWNrU2l6ZSA+IDApIHsKICAgICAgICAgICAgc3RhdGUud2lkdGggPSBzdGFja1tzdGFja1NpemUgLSAxXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCJzdGFja0RlbHRhIiBpbiB2YWxpZGF0aW9uQ29tbWFuZCkgewogICAgICAgICAgaWYgKCJzdGFja0ZuIiBpbiB2YWxpZGF0aW9uQ29tbWFuZCkgewogICAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0ZuKHN0YWNrLCBzdGFja1NpemUpOwogICAgICAgICAgfQogICAgICAgICAgc3RhY2tTaXplICs9IHZhbGlkYXRpb25Db21tYW5kLnN0YWNrRGVsdGE7CiAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0NsZWFyaW5nKSB7CiAgICAgICAgICBzdGFja1NpemUgPSAwOwogICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdGlvbkNvbW1hbmQucmVzZXRTdGFjaykgewogICAgICAgICAgc3RhY2tTaXplID0gMDsKICAgICAgICAgIHN0YXRlLnVuZGVmU3RhY2sgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRpb25Db21tYW5kLnVuZGVmU3RhY2spIHsKICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7CiAgICAgICAgICBzdGF0ZS51bmRlZlN0YWNrID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLmZpcnN0U3RhY2tDbGVhcmluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGxlbmd0aCA8IGRhdGEubGVuZ3RoKSB7CiAgICAgIGRhdGEuZmlsbCgxNCwgbGVuZ3RoKTsKICAgIH0KICAgIHN0YXRlLnN0YWNrU2l6ZSA9IHN0YWNrU2l6ZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBwYXJzZUNoYXJTdHJpbmdzKHsKICAgIGNoYXJTdHJpbmdzLAogICAgbG9jYWxTdWJySW5kZXgsCiAgICBnbG9iYWxTdWJySW5kZXgsCiAgICBmZFNlbGVjdCwKICAgIGZkQXJyYXksCiAgICBwcml2YXRlRGljdAogIH0pIHsKICAgIGNvbnN0IHNlYWNzID0gW107CiAgICBjb25zdCB3aWR0aHMgPSBbXTsKICAgIGNvbnN0IGNvdW50ID0gY2hhclN0cmluZ3MuY291bnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgY29uc3QgY2hhcnN0cmluZyA9IGNoYXJTdHJpbmdzLmdldChpKTsKICAgICAgY29uc3Qgc3RhdGUgPSB7CiAgICAgICAgY2FsbERlcHRoOiAwLAogICAgICAgIHN0YWNrU2l6ZTogMCwKICAgICAgICBzdGFjazogW10sCiAgICAgICAgdW5kZWZTdGFjazogdHJ1ZSwKICAgICAgICBoaW50czogMCwKICAgICAgICBmaXJzdFN0YWNrQ2xlYXJpbmc6IHRydWUsCiAgICAgICAgc2VhYzogbnVsbCwKICAgICAgICB3aWR0aDogbnVsbCwKICAgICAgICBoYXNWU3RlbXM6IGZhbHNlCiAgICAgIH07CiAgICAgIGxldCB2YWxpZCA9IHRydWU7CiAgICAgIGxldCBsb2NhbFN1YnJUb1VzZSA9IG51bGw7CiAgICAgIGxldCBwcml2YXRlRGljdFRvVXNlID0gcHJpdmF0ZURpY3Q7CiAgICAgIGlmIChmZFNlbGVjdCAmJiBmZEFycmF5Lmxlbmd0aCkgewogICAgICAgIGNvbnN0IGZkSW5kZXggPSBmZFNlbGVjdC5nZXRGREluZGV4KGkpOwogICAgICAgIGlmIChmZEluZGV4ID09PSAtMSkgewogICAgICAgICAgd2FybigiR2x5cGggaW5kZXggaXMgbm90IGluIGZkIHNlbGVjdC4iKTsKICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChmZEluZGV4ID49IGZkQXJyYXkubGVuZ3RoKSB7CiAgICAgICAgICB3YXJuKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTsKICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICh2YWxpZCkgewogICAgICAgICAgcHJpdmF0ZURpY3RUb1VzZSA9IGZkQXJyYXlbZmRJbmRleF0ucHJpdmF0ZURpY3Q7CiAgICAgICAgICBsb2NhbFN1YnJUb1VzZSA9IHByaXZhdGVEaWN0VG9Vc2Uuc3VicnNJbmRleDsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobG9jYWxTdWJySW5kZXgpIHsKICAgICAgICBsb2NhbFN1YnJUb1VzZSA9IGxvY2FsU3VickluZGV4OwogICAgICB9CiAgICAgIGlmICh2YWxpZCkgewogICAgICAgIHZhbGlkID0gdGhpcy5wYXJzZUNoYXJTdHJpbmcoc3RhdGUsIGNoYXJzdHJpbmcsIGxvY2FsU3ViclRvVXNlLCBnbG9iYWxTdWJySW5kZXgpOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS53aWR0aCAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IG5vbWluYWxXaWR0aCA9IHByaXZhdGVEaWN0VG9Vc2UuZ2V0QnlOYW1lKCJub21pbmFsV2lkdGhYIik7CiAgICAgICAgd2lkdGhzW2ldID0gbm9taW5hbFdpZHRoICsgc3RhdGUud2lkdGg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gcHJpdmF0ZURpY3RUb1VzZS5nZXRCeU5hbWUoImRlZmF1bHRXaWR0aFgiKTsKICAgICAgICB3aWR0aHNbaV0gPSBkZWZhdWx0V2lkdGg7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLnNlYWMgIT09IG51bGwpIHsKICAgICAgICBzZWFjc1tpXSA9IHN0YXRlLnNlYWM7CiAgICAgIH0KICAgICAgaWYgKCF2YWxpZCkgewogICAgICAgIGNoYXJTdHJpbmdzLnNldChpLCBuZXcgVWludDhBcnJheShbMTRdKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGNoYXJTdHJpbmdzLAogICAgICBzZWFjcywKICAgICAgd2lkdGhzCiAgICB9OwogIH0KICBlbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpIHsKICAgIGNvbnN0IHByaXZhdGVEaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlByaXZhdGVEaWN0LCBbXSwgcGFyZW50RGljdC5zdHJpbmdzKTsKICAgIHBhcmVudERpY3Quc2V0QnlLZXkoMTgsIFswLCAwXSk7CiAgICBwYXJlbnREaWN0LnByaXZhdGVEaWN0ID0gcHJpdmF0ZURpY3Q7CiAgfQogIHBhcnNlUHJpdmF0ZURpY3QocGFyZW50RGljdCkgewogICAgaWYgKCFwYXJlbnREaWN0Lmhhc05hbWUoIlByaXZhdGUiKSkgewogICAgICB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkocGFyZW50RGljdCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHByaXZhdGVPZmZzZXQgPSBwYXJlbnREaWN0LmdldEJ5TmFtZSgiUHJpdmF0ZSIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KHByaXZhdGVPZmZzZXQpIHx8IHByaXZhdGVPZmZzZXQubGVuZ3RoICE9PSAyKSB7CiAgICAgIHBhcmVudERpY3QucmVtb3ZlQnlOYW1lKCJQcml2YXRlIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHNpemUgPSBwcml2YXRlT2Zmc2V0WzBdOwogICAgY29uc3Qgb2Zmc2V0ID0gcHJpdmF0ZU9mZnNldFsxXTsKICAgIGlmIChzaXplID09PSAwIHx8IG9mZnNldCA+PSB0aGlzLmJ5dGVzLmxlbmd0aCkgewogICAgICB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkocGFyZW50RGljdCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHByaXZhdGVEaWN0RW5kID0gb2Zmc2V0ICsgc2l6ZTsKICAgIGNvbnN0IGRpY3REYXRhID0gdGhpcy5ieXRlcy5zdWJhcnJheShvZmZzZXQsIHByaXZhdGVEaWN0RW5kKTsKICAgIGNvbnN0IGRpY3QgPSB0aGlzLnBhcnNlRGljdChkaWN0RGF0YSk7CiAgICBjb25zdCBwcml2YXRlRGljdCA9IHRoaXMuY3JlYXRlRGljdChDRkZQcml2YXRlRGljdCwgZGljdCwgcGFyZW50RGljdC5zdHJpbmdzKTsKICAgIHBhcmVudERpY3QucHJpdmF0ZURpY3QgPSBwcml2YXRlRGljdDsKICAgIGlmIChwcml2YXRlRGljdC5nZXRCeU5hbWUoIkV4cGFuc2lvbkZhY3RvciIpID09PSAwKSB7CiAgICAgIHByaXZhdGVEaWN0LnNldEJ5TmFtZSgiRXhwYW5zaW9uRmFjdG9yIiwgMC4wNik7CiAgICB9CiAgICBpZiAoIXByaXZhdGVEaWN0LmdldEJ5TmFtZSgiU3VicnMiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdWJyc09mZnNldCA9IHByaXZhdGVEaWN0LmdldEJ5TmFtZSgiU3VicnMiKTsKICAgIGNvbnN0IHJlbGF0aXZlT2Zmc2V0ID0gb2Zmc2V0ICsgc3VicnNPZmZzZXQ7CiAgICBpZiAoc3VicnNPZmZzZXQgPT09IDAgfHwgcmVsYXRpdmVPZmZzZXQgPj0gdGhpcy5ieXRlcy5sZW5ndGgpIHsKICAgICAgdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdWJyc0luZGV4ID0gdGhpcy5wYXJzZUluZGV4KHJlbGF0aXZlT2Zmc2V0KTsKICAgIHByaXZhdGVEaWN0LnN1YnJzSW5kZXggPSBzdWJyc0luZGV4Lm9iajsKICB9CiAgcGFyc2VDaGFyc2V0cyhwb3MsIGxlbmd0aCwgc3RyaW5ncywgY2lkKSB7CiAgICBpZiAocG9zID09PSAwKSB7CiAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldCh0cnVlLCBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzLklTT19BRE9CRSwgSVNPQWRvYmVDaGFyc2V0KTsKICAgIH0gZWxzZSBpZiAocG9zID09PSAxKSB7CiAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldCh0cnVlLCBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzLkVYUEVSVCwgRXhwZXJ0Q2hhcnNldCk7CiAgICB9IGVsc2UgaWYgKHBvcyA9PT0gMikgewogICAgICByZXR1cm4gbmV3IENGRkNoYXJzZXQodHJ1ZSwgQ0ZGQ2hhcnNldFByZWRlZmluZWRUeXBlcy5FWFBFUlRfU1VCU0VULCBFeHBlcnRTdWJzZXRDaGFyc2V0KTsKICAgIH0KICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlczsKICAgIGNvbnN0IHN0YXJ0ID0gcG9zOwogICAgY29uc3QgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgY29uc3QgY2hhcnNldCA9IFtjaWQgPyAwIDogIi5ub3RkZWYiXTsKICAgIGxldCBpZCwgY291bnQsIGk7CiAgICBsZW5ndGggLT0gMTsKICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlkID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CiAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQgOiBzdHJpbmdzLmdldChpZCkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIHdoaWxlIChjaGFyc2V0Lmxlbmd0aCA8PSBsZW5ndGgpIHsKICAgICAgICAgIGlkID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CiAgICAgICAgICBjb3VudCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgewogICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQrKyA6IHN0cmluZ3MuZ2V0KGlkKyspKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICB3aGlsZSAoY2hhcnNldC5sZW5ndGggPD0gbGVuZ3RoKSB7CiAgICAgICAgICBpZCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOwogICAgICAgICAgY291bnQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgewogICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQrKyA6IHN0cmluZ3MuZ2V0KGlkKyspKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIGNoYXJzZXQgZm9ybWF0Iik7CiAgICB9CiAgICBjb25zdCBlbmQgPSBwb3M7CiAgICBjb25zdCByYXcgPSBieXRlcy5zdWJhcnJheShzdGFydCwgZW5kKTsKICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldChmYWxzZSwgZm9ybWF0LCBjaGFyc2V0LCByYXcpOwogIH0KICBwYXJzZUVuY29kaW5nKHBvcywgcHJvcGVydGllcywgc3RyaW5ncywgY2hhcnNldCkgewogICAgY29uc3QgZW5jb2RpbmcgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgbGV0IHByZWRlZmluZWQgPSBmYWxzZTsKICAgIGxldCBmb3JtYXQsIGksIGlpOwogICAgbGV0IHJhdyA9IG51bGw7CiAgICBmdW5jdGlvbiByZWFkU3VwcGxlbWVudCgpIHsKICAgICAgY29uc3Qgc3VwcGxlbWVudHNDb3VudCA9IGJ5dGVzW3BvcysrXTsKICAgICAgZm9yIChpID0gMDsgaSA8IHN1cHBsZW1lbnRzQ291bnQ7IGkrKykgewogICAgICAgIGNvbnN0IGNvZGUgPSBieXRlc1twb3MrK107CiAgICAgICAgY29uc3Qgc2lkID0gKGJ5dGVzW3BvcysrXSA8PCA4KSArIChieXRlc1twb3MrK10gJiAweGZmKTsKICAgICAgICBlbmNvZGluZ1tjb2RlXSA9IGNoYXJzZXQuaW5kZXhPZihzdHJpbmdzLmdldChzaWQpKTsKICAgICAgfQogICAgfQogICAgaWYgKHBvcyA9PT0gMCB8fCBwb3MgPT09IDEpIHsKICAgICAgcHJlZGVmaW5lZCA9IHRydWU7CiAgICAgIGZvcm1hdCA9IHBvczsKICAgICAgY29uc3QgYmFzZUVuY29kaW5nID0gcG9zID8gRXhwZXJ0RW5jb2RpbmcgOiBTdGFuZGFyZEVuY29kaW5nOwogICAgICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzZXQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IGluZGV4ID0gYmFzZUVuY29kaW5nLmluZGV4T2YoY2hhcnNldFtpXSk7CiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgICAgZW5jb2RpbmdbaW5kZXhdID0gaTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGRhdGFTdGFydCA9IHBvczsKICAgICAgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgICBzd2l0Y2ggKGZvcm1hdCAmIDB4N2YpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBjb25zdCBnbHlwaHNDb3VudCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gZ2x5cGhzQ291bnQ7IGkrKykgewogICAgICAgICAgICBlbmNvZGluZ1tieXRlc1twb3MrK11dID0gaTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIGNvbnN0IHJhbmdlc0NvdW50ID0gYnl0ZXNbcG9zKytdOwogICAgICAgICAgbGV0IGdpZCA9IDE7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2VzQ291bnQ7IGkrKykgewogICAgICAgICAgICBjb25zdCBzdGFydCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgICAgY29uc3QgbGVmdCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDw9IHN0YXJ0ICsgbGVmdDsgaisrKSB7CiAgICAgICAgICAgICAgZW5jb2Rpbmdbal0gPSBnaWQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBlbmNvZGluZyBmb3JtYXQ6ICR7Zm9ybWF0fSBpbiBDRkZgKTsKICAgICAgfQogICAgICBjb25zdCBkYXRhRW5kID0gcG9zOwogICAgICBpZiAoZm9ybWF0ICYgMHg4MCkgewogICAgICAgIGJ5dGVzW2RhdGFTdGFydF0gJj0gMHg3ZjsKICAgICAgICByZWFkU3VwcGxlbWVudCgpOwogICAgICB9CiAgICAgIHJhdyA9IGJ5dGVzLnN1YmFycmF5KGRhdGFTdGFydCwgZGF0YUVuZCk7CiAgICB9CiAgICBmb3JtYXQgJj0gMHg3ZjsKICAgIHJldHVybiBuZXcgQ0ZGRW5jb2RpbmcocHJlZGVmaW5lZCwgZm9ybWF0LCBlbmNvZGluZywgcmF3KTsKICB9CiAgcGFyc2VGRFNlbGVjdChwb3MsIGxlbmd0aCkgewogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgY29uc3QgZmRTZWxlY3QgPSBbXTsKICAgIGxldCBpOwogICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgY29uc3QgaWQgPSBieXRlc1twb3MrK107CiAgICAgICAgICBmZFNlbGVjdC5wdXNoKGlkKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgICBjb25zdCByYW5nZXNDb3VudCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZXNDb3VudDsgKytpKSB7CiAgICAgICAgICBsZXQgZmlyc3QgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGlmIChpID09PSAwICYmIGZpcnN0ICE9PSAwKSB7CiAgICAgICAgICAgIHdhcm4oInBhcnNlRkRTZWxlY3Q6IFRoZSBmaXJzdCByYW5nZSBtdXN0IGhhdmUgYSBmaXJzdCBHSUQgb2YgMCIgKyAiIC0tIHRyeWluZyB0byByZWNvdmVyLiIpOwogICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBmZEluZGV4ID0gYnl0ZXNbcG9zKytdOwogICAgICAgICAgY29uc3QgbmV4dCA9IGJ5dGVzW3Bvc10gPDwgOCB8IGJ5dGVzW3BvcyArIDFdOwogICAgICAgICAgZm9yIChsZXQgaiA9IGZpcnN0OyBqIDwgbmV4dDsgKytqKSB7CiAgICAgICAgICAgIGZkU2VsZWN0LnB1c2goZmRJbmRleCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHBvcyArPSAyOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgcGFyc2VGRFNlbGVjdDogVW5rbm93biBmb3JtYXQgIiR7Zm9ybWF0fSIuYCk7CiAgICB9CiAgICBpZiAoZmRTZWxlY3QubGVuZ3RoICE9PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJwYXJzZUZEU2VsZWN0OiBJbnZhbGlkIGZvbnQgZGF0YS4iKTsKICAgIH0KICAgIHJldHVybiBuZXcgQ0ZGRkRTZWxlY3QoZm9ybWF0LCBmZFNlbGVjdCk7CiAgfQp9CmNsYXNzIENGRiB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLmhlYWRlciA9IG51bGw7CiAgICB0aGlzLm5hbWVzID0gW107CiAgICB0aGlzLnRvcERpY3QgPSBudWxsOwogICAgdGhpcy5zdHJpbmdzID0gbmV3IENGRlN0cmluZ3MoKTsKICAgIHRoaXMuZ2xvYmFsU3VickluZGV4ID0gbnVsbDsKICAgIHRoaXMuZW5jb2RpbmcgPSBudWxsOwogICAgdGhpcy5jaGFyc2V0ID0gbnVsbDsKICAgIHRoaXMuY2hhclN0cmluZ3MgPSBudWxsOwogICAgdGhpcy5mZEFycmF5ID0gW107CiAgICB0aGlzLmZkU2VsZWN0ID0gbnVsbDsKICAgIHRoaXMuaXNDSURGb250ID0gZmFsc2U7CiAgfQogIGR1cGxpY2F0ZUZpcnN0R2x5cGgoKSB7CiAgICBpZiAodGhpcy5jaGFyU3RyaW5ncy5jb3VudCA+PSA2NTUzNSkgewogICAgICB3YXJuKCJOb3QgZW5vdWdoIHNwYWNlIGluIGNoYXJzdHJpbmdzIHRvIGR1cGxpY2F0ZSBmaXJzdCBnbHlwaC4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZ2x5cGhaZXJvID0gdGhpcy5jaGFyU3RyaW5ncy5nZXQoMCk7CiAgICB0aGlzLmNoYXJTdHJpbmdzLmFkZChnbHlwaFplcm8pOwogICAgaWYgKHRoaXMuaXNDSURGb250KSB7CiAgICAgIHRoaXMuZmRTZWxlY3QuZmRTZWxlY3QucHVzaCh0aGlzLmZkU2VsZWN0LmZkU2VsZWN0WzBdKTsKICAgIH0KICB9CiAgaGFzR2x5cGhJZChpZCkgewogICAgaWYgKGlkIDwgMCB8fCBpZCA+PSB0aGlzLmNoYXJTdHJpbmdzLmNvdW50KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IGdseXBoID0gdGhpcy5jaGFyU3RyaW5ncy5nZXQoaWQpOwogICAgcmV0dXJuIGdseXBoLmxlbmd0aCA+IDA7CiAgfQp9CmNsYXNzIENGRkhlYWRlciB7CiAgY29uc3RydWN0b3IobWFqb3IsIG1pbm9yLCBoZHJTaXplLCBvZmZTaXplKSB7CiAgICB0aGlzLm1ham9yID0gbWFqb3I7CiAgICB0aGlzLm1pbm9yID0gbWlub3I7CiAgICB0aGlzLmhkclNpemUgPSBoZHJTaXplOwogICAgdGhpcy5vZmZTaXplID0gb2ZmU2l6ZTsKICB9Cn0KY2xhc3MgQ0ZGU3RyaW5ncyB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLnN0cmluZ3MgPSBbXTsKICB9CiAgZ2V0KGluZGV4KSB7CiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSBOVU1fU1RBTkRBUkRfQ0ZGX1NUUklOR1MgLSAxKSB7CiAgICAgIHJldHVybiBDRkZTdGFuZGFyZFN0cmluZ3NbaW5kZXhdOwogICAgfQogICAgaWYgKGluZGV4IC0gTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTIDw9IHRoaXMuc3RyaW5ncy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nc1tpbmRleCAtIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HU107CiAgICB9CiAgICByZXR1cm4gQ0ZGU3RhbmRhcmRTdHJpbmdzWzBdOwogIH0KICBnZXRTSUQoc3RyKSB7CiAgICBsZXQgaW5kZXggPSBDRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihzdHIpOwogICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICByZXR1cm4gaW5kZXg7CiAgICB9CiAgICBpbmRleCA9IHRoaXMuc3RyaW5ncy5pbmRleE9mKHN0cik7CiAgICBpZiAoaW5kZXggIT09IC0xKSB7CiAgICAgIHJldHVybiBpbmRleCArIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUzsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgYWRkKHZhbHVlKSB7CiAgICB0aGlzLnN0cmluZ3MucHVzaCh2YWx1ZSk7CiAgfQogIGdldCBjb3VudCgpIHsKICAgIHJldHVybiB0aGlzLnN0cmluZ3MubGVuZ3RoOwogIH0KfQpjbGFzcyBDRkZJbmRleCB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLm9iamVjdHMgPSBbXTsKICAgIHRoaXMubGVuZ3RoID0gMDsKICB9CiAgYWRkKGRhdGEpIHsKICAgIHRoaXMubGVuZ3RoICs9IGRhdGEubGVuZ3RoOwogICAgdGhpcy5vYmplY3RzLnB1c2goZGF0YSk7CiAgfQogIHNldChpbmRleCwgZGF0YSkgewogICAgdGhpcy5sZW5ndGggKz0gZGF0YS5sZW5ndGggLSB0aGlzLm9iamVjdHNbaW5kZXhdLmxlbmd0aDsKICAgIHRoaXMub2JqZWN0c1tpbmRleF0gPSBkYXRhOwogIH0KICBnZXQoaW5kZXgpIHsKICAgIHJldHVybiB0aGlzLm9iamVjdHNbaW5kZXhdOwogIH0KICBnZXQgY291bnQoKSB7CiAgICByZXR1cm4gdGhpcy5vYmplY3RzLmxlbmd0aDsKICB9Cn0KY2xhc3MgQ0ZGRGljdCB7CiAgY29uc3RydWN0b3IodGFibGVzLCBzdHJpbmdzKSB7CiAgICB0aGlzLmtleVRvTmFtZU1hcCA9IHRhYmxlcy5rZXlUb05hbWVNYXA7CiAgICB0aGlzLm5hbWVUb0tleU1hcCA9IHRhYmxlcy5uYW1lVG9LZXlNYXA7CiAgICB0aGlzLmRlZmF1bHRzID0gdGFibGVzLmRlZmF1bHRzOwogICAgdGhpcy50eXBlcyA9IHRhYmxlcy50eXBlczsKICAgIHRoaXMub3Bjb2RlcyA9IHRhYmxlcy5vcGNvZGVzOwogICAgdGhpcy5vcmRlciA9IHRhYmxlcy5vcmRlcjsKICAgIHRoaXMuc3RyaW5ncyA9IHN0cmluZ3M7CiAgICB0aGlzLnZhbHVlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgfQogIHNldEJ5S2V5KGtleSwgdmFsdWUpIHsKICAgIGlmICghKGtleSBpbiB0aGlzLmtleVRvTmFtZU1hcCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlKSB7CiAgICAgIGlmIChpc05hTih2YWwpKSB7CiAgICAgICAgd2FybihgSW52YWxpZCBDRkZEaWN0IHZhbHVlOiAiJHt2YWx1ZX0iIGZvciBrZXkgIiR7a2V5fSIuYCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGVzW2tleV07CiAgICBpZiAodHlwZSA9PT0gIm51bSIgfHwgdHlwZSA9PT0gInNpZCIgfHwgdHlwZSA9PT0gIm9mZnNldCIpIHsKICAgICAgdmFsdWUgPSB2YWx1ZVswXTsKICAgIH0KICAgIHRoaXMudmFsdWVzW2tleV0gPSB2YWx1ZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBzZXRCeU5hbWUobmFtZSwgdmFsdWUpIHsKICAgIGlmICghKG5hbWUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBkaWN0aW9uYXJ5IG5hbWUgIiR7bmFtZX0iYCk7CiAgICB9CiAgICB0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFtuYW1lXV0gPSB2YWx1ZTsKICB9CiAgaGFzTmFtZShuYW1lKSB7CiAgICByZXR1cm4gdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV0gaW4gdGhpcy52YWx1ZXM7CiAgfQogIGdldEJ5TmFtZShuYW1lKSB7CiAgICBpZiAoIShuYW1lIGluIHRoaXMubmFtZVRvS2V5TWFwKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZGljdGlvbmFyeSBuYW1lICR7bmFtZX0iYCk7CiAgICB9CiAgICBjb25zdCBrZXkgPSB0aGlzLm5hbWVUb0tleU1hcFtuYW1lXTsKICAgIGlmICghKGtleSBpbiB0aGlzLnZhbHVlcykpIHsKICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdHNba2V5XTsKICAgIH0KICAgIHJldHVybiB0aGlzLnZhbHVlc1trZXldOwogIH0KICByZW1vdmVCeU5hbWUobmFtZSkgewogICAgZGVsZXRlIHRoaXMudmFsdWVzW3RoaXMubmFtZVRvS2V5TWFwW25hbWVdXTsKICB9CiAgc3RhdGljIGNyZWF0ZVRhYmxlcyhsYXlvdXQpIHsKICAgIGNvbnN0IHRhYmxlcyA9IHsKICAgICAga2V5VG9OYW1lTWFwOiB7fSwKICAgICAgbmFtZVRvS2V5TWFwOiB7fSwKICAgICAgZGVmYXVsdHM6IHt9LAogICAgICB0eXBlczoge30sCiAgICAgIG9wY29kZXM6IHt9LAogICAgICBvcmRlcjogW10KICAgIH07CiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxheW91dCkgewogICAgICBjb25zdCBrZXkgPSBBcnJheS5pc0FycmF5KGVudHJ5WzBdKSA/IChlbnRyeVswXVswXSA8PCA4KSArIGVudHJ5WzBdWzFdIDogZW50cnlbMF07CiAgICAgIHRhYmxlcy5rZXlUb05hbWVNYXBba2V5XSA9IGVudHJ5WzFdOwogICAgICB0YWJsZXMubmFtZVRvS2V5TWFwW2VudHJ5WzFdXSA9IGtleTsKICAgICAgdGFibGVzLnR5cGVzW2tleV0gPSBlbnRyeVsyXTsKICAgICAgdGFibGVzLmRlZmF1bHRzW2tleV0gPSBlbnRyeVszXTsKICAgICAgdGFibGVzLm9wY29kZXNba2V5XSA9IEFycmF5LmlzQXJyYXkoZW50cnlbMF0pID8gZW50cnlbMF0gOiBbZW50cnlbMF1dOwogICAgICB0YWJsZXMub3JkZXIucHVzaChrZXkpOwogICAgfQogICAgcmV0dXJuIHRhYmxlczsKICB9Cn0KY29uc3QgQ0ZGVG9wRGljdExheW91dCA9IFtbWzEyLCAzMF0sICJST1MiLCBbInNpZCIsICJzaWQiLCAibnVtIl0sIG51bGxdLCBbWzEyLCAyMF0sICJTeW50aGV0aWNCYXNlIiwgIm51bSIsIG51bGxdLCBbMCwgInZlcnNpb24iLCAic2lkIiwgbnVsbF0sIFsxLCAiTm90aWNlIiwgInNpZCIsIG51bGxdLCBbWzEyLCAwXSwgIkNvcHlyaWdodCIsICJzaWQiLCBudWxsXSwgWzIsICJGdWxsTmFtZSIsICJzaWQiLCBudWxsXSwgWzMsICJGYW1pbHlOYW1lIiwgInNpZCIsIG51bGxdLCBbNCwgIldlaWdodCIsICJzaWQiLCBudWxsXSwgW1sxMiwgMV0sICJpc0ZpeGVkUGl0Y2giLCAibnVtIiwgMF0sIFtbMTIsIDJdLCAiSXRhbGljQW5nbGUiLCAibnVtIiwgMF0sIFtbMTIsIDNdLCAiVW5kZXJsaW5lUG9zaXRpb24iLCAibnVtIiwgLTEwMF0sIFtbMTIsIDRdLCAiVW5kZXJsaW5lVGhpY2tuZXNzIiwgIm51bSIsIDUwXSwgW1sxMiwgNV0sICJQYWludFR5cGUiLCAibnVtIiwgMF0sIFtbMTIsIDZdLCAiQ2hhcnN0cmluZ1R5cGUiLCAibnVtIiwgMl0sIFtbMTIsIDddLCAiRm9udE1hdHJpeCIsIFsibnVtIiwgIm51bSIsICJudW0iLCAibnVtIiwgIm51bSIsICJudW0iXSwgWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF1dLCBbMTMsICJVbmlxdWVJRCIsICJudW0iLCBudWxsXSwgWzUsICJGb250QkJveCIsIFsibnVtIiwgIm51bSIsICJudW0iLCAibnVtIl0sIFswLCAwLCAwLCAwXV0sIFtbMTIsIDhdLCAiU3Ryb2tlV2lkdGgiLCAibnVtIiwgMF0sIFsxNCwgIlhVSUQiLCAiYXJyYXkiLCBudWxsXSwgWzE1LCAiY2hhcnNldCIsICJvZmZzZXQiLCAwXSwgWzE2LCAiRW5jb2RpbmciLCAib2Zmc2V0IiwgMF0sIFsxNywgIkNoYXJTdHJpbmdzIiwgIm9mZnNldCIsIDBdLCBbMTgsICJQcml2YXRlIiwgWyJvZmZzZXQiLCAib2Zmc2V0Il0sIG51bGxdLCBbWzEyLCAyMV0sICJQb3N0U2NyaXB0IiwgInNpZCIsIG51bGxdLCBbWzEyLCAyMl0sICJCYXNlRm9udE5hbWUiLCAic2lkIiwgbnVsbF0sIFtbMTIsIDIzXSwgIkJhc2VGb250QmxlbmQiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgMzFdLCAiQ0lERm9udFZlcnNpb24iLCAibnVtIiwgMF0sIFtbMTIsIDMyXSwgIkNJREZvbnRSZXZpc2lvbiIsICJudW0iLCAwXSwgW1sxMiwgMzNdLCAiQ0lERm9udFR5cGUiLCAibnVtIiwgMF0sIFtbMTIsIDM0XSwgIkNJRENvdW50IiwgIm51bSIsIDg3MjBdLCBbWzEyLCAzNV0sICJVSURCYXNlIiwgIm51bSIsIG51bGxdLCBbWzEyLCAzN10sICJGRFNlbGVjdCIsICJvZmZzZXQiLCBudWxsXSwgW1sxMiwgMzZdLCAiRkRBcnJheSIsICJvZmZzZXQiLCBudWxsXSwgW1sxMiwgMzhdLCAiRm9udE5hbWUiLCAic2lkIiwgbnVsbF1dOwpjbGFzcyBDRkZUb3BEaWN0IGV4dGVuZHMgQ0ZGRGljdCB7CiAgc3RhdGljIGdldCB0YWJsZXMoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ0YWJsZXMiLCB0aGlzLmNyZWF0ZVRhYmxlcyhDRkZUb3BEaWN0TGF5b3V0KSk7CiAgfQogIGNvbnN0cnVjdG9yKHN0cmluZ3MpIHsKICAgIHN1cGVyKENGRlRvcERpY3QudGFibGVzLCBzdHJpbmdzKTsKICAgIHRoaXMucHJpdmF0ZURpY3QgPSBudWxsOwogIH0KfQpjb25zdCBDRkZQcml2YXRlRGljdExheW91dCA9IFtbNiwgIkJsdWVWYWx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgWzcsICJPdGhlckJsdWVzIiwgImRlbHRhIiwgbnVsbF0sIFs4LCAiRmFtaWx5Qmx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgWzksICJGYW1pbHlPdGhlckJsdWVzIiwgImRlbHRhIiwgbnVsbF0sIFtbMTIsIDldLCAiQmx1ZVNjYWxlIiwgIm51bSIsIDAuMDM5NjI1XSwgW1sxMiwgMTBdLCAiQmx1ZVNoaWZ0IiwgIm51bSIsIDddLCBbWzEyLCAxMV0sICJCbHVlRnV6eiIsICJudW0iLCAxXSwgWzEwLCAiU3RkSFciLCAibnVtIiwgbnVsbF0sIFsxMSwgIlN0ZFZXIiwgIm51bSIsIG51bGxdLCBbWzEyLCAxMl0sICJTdGVtU25hcEgiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgMTNdLCAiU3RlbVNuYXBWIiwgImRlbHRhIiwgbnVsbF0sIFtbMTIsIDE0XSwgIkZvcmNlQm9sZCIsICJudW0iLCAwXSwgW1sxMiwgMTddLCAiTGFuZ3VhZ2VHcm91cCIsICJudW0iLCAwXSwgW1sxMiwgMThdLCAiRXhwYW5zaW9uRmFjdG9yIiwgIm51bSIsIDAuMDZdLCBbWzEyLCAxOV0sICJpbml0aWFsUmFuZG9tU2VlZCIsICJudW0iLCAwXSwgWzIwLCAiZGVmYXVsdFdpZHRoWCIsICJudW0iLCAwXSwgWzIxLCAibm9taW5hbFdpZHRoWCIsICJudW0iLCAwXSwgWzE5LCAiU3VicnMiLCAib2Zmc2V0IiwgbnVsbF1dOwpjbGFzcyBDRkZQcml2YXRlRGljdCBleHRlbmRzIENGRkRpY3QgewogIHN0YXRpYyBnZXQgdGFibGVzKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidGFibGVzIiwgdGhpcy5jcmVhdGVUYWJsZXMoQ0ZGUHJpdmF0ZURpY3RMYXlvdXQpKTsKICB9CiAgY29uc3RydWN0b3Ioc3RyaW5ncykgewogICAgc3VwZXIoQ0ZGUHJpdmF0ZURpY3QudGFibGVzLCBzdHJpbmdzKTsKICAgIHRoaXMuc3VicnNJbmRleCA9IG51bGw7CiAgfQp9CmNvbnN0IENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMgPSB7CiAgSVNPX0FET0JFOiAwLAogIEVYUEVSVDogMSwKICBFWFBFUlRfU1VCU0VUOiAyCn07CmNsYXNzIENGRkNoYXJzZXQgewogIGNvbnN0cnVjdG9yKHByZWRlZmluZWQsIGZvcm1hdCwgY2hhcnNldCwgcmF3KSB7CiAgICB0aGlzLnByZWRlZmluZWQgPSBwcmVkZWZpbmVkOwogICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CiAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0OwogICAgdGhpcy5yYXcgPSByYXc7CiAgfQp9CmNsYXNzIENGRkVuY29kaW5nIHsKICBjb25zdHJ1Y3RvcihwcmVkZWZpbmVkLCBmb3JtYXQsIGVuY29kaW5nLCByYXcpIHsKICAgIHRoaXMucHJlZGVmaW5lZCA9IHByZWRlZmluZWQ7CiAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDsKICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKICAgIHRoaXMucmF3ID0gcmF3OwogIH0KfQpjbGFzcyBDRkZGRFNlbGVjdCB7CiAgY29uc3RydWN0b3IoZm9ybWF0LCBmZFNlbGVjdCkgewogICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CiAgICB0aGlzLmZkU2VsZWN0ID0gZmRTZWxlY3Q7CiAgfQogIGdldEZESW5kZXgoZ2x5cGhJbmRleCkgewogICAgaWYgKGdseXBoSW5kZXggPCAwIHx8IGdseXBoSW5kZXggPj0gdGhpcy5mZFNlbGVjdC5sZW5ndGgpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIHRoaXMuZmRTZWxlY3RbZ2x5cGhJbmRleF07CiAgfQp9CmNsYXNzIENGRk9mZnNldFRyYWNrZXIgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5vZmZzZXRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB9CiAgaXNUcmFja2luZyhrZXkpIHsKICAgIHJldHVybiBrZXkgaW4gdGhpcy5vZmZzZXRzOwogIH0KICB0cmFjayhrZXksIGxvY2F0aW9uKSB7CiAgICBpZiAoa2V5IGluIHRoaXMub2Zmc2V0cykgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEFscmVhZHkgdHJhY2tpbmcgbG9jYXRpb24gb2YgJHtrZXl9YCk7CiAgICB9CiAgICB0aGlzLm9mZnNldHNba2V5XSA9IGxvY2F0aW9uOwogIH0KICBvZmZzZXQodmFsdWUpIHsKICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMub2Zmc2V0cykgewogICAgICB0aGlzLm9mZnNldHNba2V5XSArPSB2YWx1ZTsKICAgIH0KICB9CiAgc2V0RW50cnlMb2NhdGlvbihrZXksIHZhbHVlcywgb3V0cHV0KSB7CiAgICBpZiAoIShrZXkgaW4gdGhpcy5vZmZzZXRzKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYE5vdCB0cmFja2luZyBsb2NhdGlvbiBvZiAke2tleX1gKTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBvdXRwdXQuZGF0YTsKICAgIGNvbnN0IGRhdGFPZmZzZXQgPSB0aGlzLm9mZnNldHNba2V5XTsKICAgIGNvbnN0IHNpemUgPSA1OwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdmFsdWVzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgY29uc3Qgb2Zmc2V0MCA9IGkgKiBzaXplICsgZGF0YU9mZnNldDsKICAgICAgY29uc3Qgb2Zmc2V0MSA9IG9mZnNldDAgKyAxOwogICAgICBjb25zdCBvZmZzZXQyID0gb2Zmc2V0MCArIDI7CiAgICAgIGNvbnN0IG9mZnNldDMgPSBvZmZzZXQwICsgMzsKICAgICAgY29uc3Qgb2Zmc2V0NCA9IG9mZnNldDAgKyA0OwogICAgICBpZiAoZGF0YVtvZmZzZXQwXSAhPT0gMHgxZCB8fCBkYXRhW29mZnNldDFdICE9PSAwIHx8IGRhdGFbb2Zmc2V0Ml0gIT09IDAgfHwgZGF0YVtvZmZzZXQzXSAhPT0gMCB8fCBkYXRhW29mZnNldDRdICE9PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJ3cml0aW5nIHRvIGFuIG9mZnNldCB0aGF0IGlzIG5vdCBlbXB0eSIpOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldOwogICAgICBkYXRhW29mZnNldDBdID0gMHgxZDsKICAgICAgZGF0YVtvZmZzZXQxXSA9IHZhbHVlID4+IDI0ICYgMHhmZjsKICAgICAgZGF0YVtvZmZzZXQyXSA9IHZhbHVlID4+IDE2ICYgMHhmZjsKICAgICAgZGF0YVtvZmZzZXQzXSA9IHZhbHVlID4+IDggJiAweGZmOwogICAgICBkYXRhW29mZnNldDRdID0gdmFsdWUgJiAweGZmOwogICAgfQogIH0KfQpjbGFzcyBDRkZDb21waWxlciB7CiAgY29uc3RydWN0b3IoY2ZmKSB7CiAgICB0aGlzLmNmZiA9IGNmZjsKICB9CiAgY29tcGlsZSgpIHsKICAgIGNvbnN0IGNmZiA9IHRoaXMuY2ZmOwogICAgY29uc3Qgb3V0cHV0ID0gewogICAgICBkYXRhOiBbXSwKICAgICAgbGVuZ3RoOiAwLAogICAgICBhZGQoZGF0YSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmRhdGEucHVzaCguLi5kYXRhKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoZGF0YSk7CiAgICAgICAgfQogICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aDsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuY29tcGlsZUhlYWRlcihjZmYuaGVhZGVyKTsKICAgIG91dHB1dC5hZGQoaGVhZGVyKTsKICAgIGNvbnN0IG5hbWVJbmRleCA9IHRoaXMuY29tcGlsZU5hbWVJbmRleChjZmYubmFtZXMpOwogICAgb3V0cHV0LmFkZChuYW1lSW5kZXgpOwogICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKICAgICAgaWYgKGNmZi50b3BEaWN0Lmhhc05hbWUoIkZvbnRNYXRyaXgiKSkgewogICAgICAgIGNvbnN0IGJhc2UgPSBjZmYudG9wRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKTsKICAgICAgICBjZmYudG9wRGljdC5yZW1vdmVCeU5hbWUoIkZvbnRNYXRyaXgiKTsKICAgICAgICBmb3IgKGNvbnN0IHN1YkRpY3Qgb2YgY2ZmLmZkQXJyYXkpIHsKICAgICAgICAgIGxldCBtYXRyaXggPSBiYXNlLnNsaWNlKDApOwogICAgICAgICAgaWYgKHN1YkRpY3QuaGFzTmFtZSgiRm9udE1hdHJpeCIpKSB7CiAgICAgICAgICAgIG1hdHJpeCA9IFV0aWwudHJhbnNmb3JtKG1hdHJpeCwgc3ViRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKSk7CiAgICAgICAgICB9CiAgICAgICAgICBzdWJEaWN0LnNldEJ5TmFtZSgiRm9udE1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCB4dWlkID0gY2ZmLnRvcERpY3QuZ2V0QnlOYW1lKCJYVUlEIik7CiAgICBpZiAoeHVpZD8ubGVuZ3RoID4gMTYpIHsKICAgICAgY2ZmLnRvcERpY3QucmVtb3ZlQnlOYW1lKCJYVUlEIik7CiAgICB9CiAgICBjZmYudG9wRGljdC5zZXRCeU5hbWUoImNoYXJzZXQiLCAwKTsKICAgIGxldCBjb21waWxlZCA9IHRoaXMuY29tcGlsZVRvcERpY3RzKFtjZmYudG9wRGljdF0sIG91dHB1dC5sZW5ndGgsIGNmZi5pc0NJREZvbnQpOwogICAgb3V0cHV0LmFkZChjb21waWxlZC5vdXRwdXQpOwogICAgY29uc3QgdG9wRGljdFRyYWNrZXIgPSBjb21waWxlZC50cmFja2Vyc1swXTsKICAgIGNvbnN0IHN0cmluZ0luZGV4ID0gdGhpcy5jb21waWxlU3RyaW5nSW5kZXgoY2ZmLnN0cmluZ3Muc3RyaW5ncyk7CiAgICBvdXRwdXQuYWRkKHN0cmluZ0luZGV4KTsKICAgIGNvbnN0IGdsb2JhbFN1YnJJbmRleCA9IHRoaXMuY29tcGlsZUluZGV4KGNmZi5nbG9iYWxTdWJySW5kZXgpOwogICAgb3V0cHV0LmFkZChnbG9iYWxTdWJySW5kZXgpOwogICAgaWYgKGNmZi5lbmNvZGluZyAmJiBjZmYudG9wRGljdC5oYXNOYW1lKCJFbmNvZGluZyIpKSB7CiAgICAgIGlmIChjZmYuZW5jb2RpbmcucHJlZGVmaW5lZCkgewogICAgICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oIkVuY29kaW5nIiwgW2NmZi5lbmNvZGluZy5mb3JtYXRdLCBvdXRwdXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGVuY29kaW5nID0gdGhpcy5jb21waWxlRW5jb2RpbmcoY2ZmLmVuY29kaW5nKTsKICAgICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJFbmNvZGluZyIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKICAgICAgICBvdXRwdXQuYWRkKGVuY29kaW5nKTsKICAgICAgfQogICAgfQogICAgY29uc3QgY2hhcnNldCA9IHRoaXMuY29tcGlsZUNoYXJzZXQoY2ZmLmNoYXJzZXQsIGNmZi5jaGFyU3RyaW5ncy5jb3VudCwgY2ZmLnN0cmluZ3MsIGNmZi5pc0NJREZvbnQpOwogICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiY2hhcnNldCIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKICAgIG91dHB1dC5hZGQoY2hhcnNldCk7CiAgICBjb25zdCBjaGFyU3RyaW5ncyA9IHRoaXMuY29tcGlsZUNoYXJTdHJpbmdzKGNmZi5jaGFyU3RyaW5ncyk7CiAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJDaGFyU3RyaW5ncyIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKICAgIG91dHB1dC5hZGQoY2hhclN0cmluZ3MpOwogICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiRkRTZWxlY3QiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CiAgICAgIGNvbnN0IGZkU2VsZWN0ID0gdGhpcy5jb21waWxlRkRTZWxlY3QoY2ZmLmZkU2VsZWN0KTsKICAgICAgb3V0cHV0LmFkZChmZFNlbGVjdCk7CiAgICAgIGNvbXBpbGVkID0gdGhpcy5jb21waWxlVG9wRGljdHMoY2ZmLmZkQXJyYXksIG91dHB1dC5sZW5ndGgsIHRydWUpOwogICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJGREFycmF5IiwgW291dHB1dC5sZW5ndGhdLCBvdXRwdXQpOwogICAgICBvdXRwdXQuYWRkKGNvbXBpbGVkLm91dHB1dCk7CiAgICAgIGNvbnN0IGZvbnREaWN0VHJhY2tlcnMgPSBjb21waWxlZC50cmFja2VyczsKICAgICAgdGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKGNmZi5mZEFycmF5LCBmb250RGljdFRyYWNrZXJzLCBvdXRwdXQpOwogICAgfQogICAgdGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKFtjZmYudG9wRGljdF0sIFt0b3BEaWN0VHJhY2tlcl0sIG91dHB1dCk7CiAgICBvdXRwdXQuYWRkKFswXSk7CiAgICByZXR1cm4gb3V0cHV0LmRhdGE7CiAgfQogIGVuY29kZU51bWJlcih2YWx1ZSkgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7CiAgICAgIHJldHVybiB0aGlzLmVuY29kZUludGVnZXIodmFsdWUpOwogICAgfQogICAgcmV0dXJuIHRoaXMuZW5jb2RlRmxvYXQodmFsdWUpOwogIH0KICBzdGF0aWMgZ2V0IEVuY29kZUZsb2F0UmVnRXhwKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiRW5jb2RlRmxvYXRSZWdFeHAiLCAvXC4oXGQqPykoPzo5ezUsMjB9fDB7NSwyMH0pXGR7MCwyfSg/OmUoLispfCQpLyk7CiAgfQogIGVuY29kZUZsb2F0KG51bSkgewogICAgbGV0IHZhbHVlID0gbnVtLnRvU3RyaW5nKCk7CiAgICBjb25zdCBtID0gQ0ZGQ29tcGlsZXIuRW5jb2RlRmxvYXRSZWdFeHAuZXhlYyh2YWx1ZSk7CiAgICBpZiAobSkgewogICAgICBjb25zdCBlcHNpbG9uID0gcGFyc2VGbG9hdCgiMWUiICsgKChtWzJdID8gK21bMl0gOiAwKSArIG1bMV0ubGVuZ3RoKSk7CiAgICAgIHZhbHVlID0gKE1hdGgucm91bmQobnVtICogZXBzaWxvbikgLyBlcHNpbG9uKS50b1N0cmluZygpOwogICAgfQogICAgbGV0IG5pYmJsZXMgPSAiIjsKICAgIGxldCBpLCBpaTsKICAgIGZvciAoaSA9IDAsIGlpID0gdmFsdWUubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBhID0gdmFsdWVbaV07CiAgICAgIGlmIChhID09PSAiZSIpIHsKICAgICAgICBuaWJibGVzICs9IHZhbHVlWysraV0gPT09ICItIiA/ICJjIiA6ICJiIjsKICAgICAgfSBlbHNlIGlmIChhID09PSAiLiIpIHsKICAgICAgICBuaWJibGVzICs9ICJhIjsKICAgICAgfSBlbHNlIGlmIChhID09PSAiLSIpIHsKICAgICAgICBuaWJibGVzICs9ICJlIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBuaWJibGVzICs9IGE7CiAgICAgIH0KICAgIH0KICAgIG5pYmJsZXMgKz0gbmliYmxlcy5sZW5ndGggJiAxID8gImYiIDogImZmIjsKICAgIGNvbnN0IG91dCA9IFszMF07CiAgICBmb3IgKGkgPSAwLCBpaSA9IG5pYmJsZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICBvdXQucHVzaChwYXJzZUludChuaWJibGVzLnN1YnN0cmluZyhpLCBpICsgMiksIDE2KSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBlbmNvZGVJbnRlZ2VyKHZhbHVlKSB7CiAgICBsZXQgY29kZTsKICAgIGlmICh2YWx1ZSA+PSAtMTA3ICYmIHZhbHVlIDw9IDEwNykgewogICAgICBjb2RlID0gW3ZhbHVlICsgMTM5XTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMTA4ICYmIHZhbHVlIDw9IDExMzEpIHsKICAgICAgdmFsdWUgLT0gMTA4OwogICAgICBjb2RlID0gWyh2YWx1ZSA+PiA4KSArIDI0NywgdmFsdWUgJiAweGZmXTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gLTExMzEgJiYgdmFsdWUgPD0gLTEwOCkgewogICAgICB2YWx1ZSA9IC12YWx1ZSAtIDEwODsKICAgICAgY29kZSA9IFsodmFsdWUgPj4gOCkgKyAyNTEsIHZhbHVlICYgMHhmZl07CiAgICB9IGVsc2UgaWYgKHZhbHVlID49IC0zMjc2OCAmJiB2YWx1ZSA8PSAzMjc2NykgewogICAgICBjb2RlID0gWzB4MWMsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmZdOwogICAgfSBlbHNlIHsKICAgICAgY29kZSA9IFsweDFkLCB2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZl07CiAgICB9CiAgICByZXR1cm4gY29kZTsKICB9CiAgY29tcGlsZUhlYWRlcihoZWFkZXIpIHsKICAgIHJldHVybiBbaGVhZGVyLm1ham9yLCBoZWFkZXIubWlub3IsIDQsIGhlYWRlci5vZmZTaXplXTsKICB9CiAgY29tcGlsZU5hbWVJbmRleChuYW1lcykgewogICAgY29uc3QgbmFtZUluZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5taW4obmFtZS5sZW5ndGgsIDEyNyk7CiAgICAgIGxldCBzYW5pdGl6ZWROYW1lID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKICAgICAgICBsZXQgY2hhciA9IG5hbWVbal07CiAgICAgICAgaWYgKGNoYXIgPCAiISIgfHwgY2hhciA+ICJ+IiB8fCBjaGFyID09PSAiWyIgfHwgY2hhciA9PT0gIl0iIHx8IGNoYXIgPT09ICIoIiB8fCBjaGFyID09PSAiKSIgfHwgY2hhciA9PT0gInsiIHx8IGNoYXIgPT09ICJ9IiB8fCBjaGFyID09PSAiPCIgfHwgY2hhciA9PT0gIj4iIHx8IGNoYXIgPT09ICIvIiB8fCBjaGFyID09PSAiJSIpIHsKICAgICAgICAgIGNoYXIgPSAiXyI7CiAgICAgICAgfQogICAgICAgIHNhbml0aXplZE5hbWVbal0gPSBjaGFyOwogICAgICB9CiAgICAgIHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZWROYW1lLmpvaW4oIiIpOwogICAgICBpZiAoc2FuaXRpemVkTmFtZSA9PT0gIiIpIHsKICAgICAgICBzYW5pdGl6ZWROYW1lID0gIkJhZF9Gb250X05hbWUiOwogICAgICB9CiAgICAgIG5hbWVJbmRleC5hZGQoc3RyaW5nVG9CeXRlcyhzYW5pdGl6ZWROYW1lKSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlSW5kZXgobmFtZUluZGV4KTsKICB9CiAgY29tcGlsZVRvcERpY3RzKGRpY3RzLCBsZW5ndGgsIHJlbW92ZUNpZEtleXMpIHsKICAgIGNvbnN0IGZvbnREaWN0VHJhY2tlcnMgPSBbXTsKICAgIGxldCBmZEFycmF5SW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGZvciAoY29uc3QgZm9udERpY3Qgb2YgZGljdHMpIHsKICAgICAgaWYgKHJlbW92ZUNpZEtleXMpIHsKICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJREZvbnRWZXJzaW9uIik7CiAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJDSURGb250UmV2aXNpb24iKTsKICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJREZvbnRUeXBlIik7CiAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJDSURDb3VudCIpOwogICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZSgiVUlEQmFzZSIpOwogICAgICB9CiAgICAgIGNvbnN0IGZvbnREaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7CiAgICAgIGNvbnN0IGZvbnREaWN0RGF0YSA9IHRoaXMuY29tcGlsZURpY3QoZm9udERpY3QsIGZvbnREaWN0VHJhY2tlcik7CiAgICAgIGZvbnREaWN0VHJhY2tlcnMucHVzaChmb250RGljdFRyYWNrZXIpOwogICAgICBmZEFycmF5SW5kZXguYWRkKGZvbnREaWN0RGF0YSk7CiAgICAgIGZvbnREaWN0VHJhY2tlci5vZmZzZXQobGVuZ3RoKTsKICAgIH0KICAgIGZkQXJyYXlJbmRleCA9IHRoaXMuY29tcGlsZUluZGV4KGZkQXJyYXlJbmRleCwgZm9udERpY3RUcmFja2Vycyk7CiAgICByZXR1cm4gewogICAgICB0cmFja2VyczogZm9udERpY3RUcmFja2VycywKICAgICAgb3V0cHV0OiBmZEFycmF5SW5kZXgKICAgIH07CiAgfQogIGNvbXBpbGVQcml2YXRlRGljdHMoZGljdHMsIHRyYWNrZXJzLCBvdXRwdXQpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRpY3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgY29uc3QgZm9udERpY3QgPSBkaWN0c1tpXTsKICAgICAgY29uc3QgcHJpdmF0ZURpY3QgPSBmb250RGljdC5wcml2YXRlRGljdDsKICAgICAgaWYgKCFwcml2YXRlRGljdCB8fCAhZm9udERpY3QuaGFzTmFtZSgiUHJpdmF0ZSIpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJUaGVyZSBtdXN0IGJlIGEgcHJpdmF0ZSBkaWN0aW9uYXJ5LiIpOwogICAgICB9CiAgICAgIGNvbnN0IHByaXZhdGVEaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7CiAgICAgIGNvbnN0IHByaXZhdGVEaWN0RGF0YSA9IHRoaXMuY29tcGlsZURpY3QocHJpdmF0ZURpY3QsIHByaXZhdGVEaWN0VHJhY2tlcik7CiAgICAgIGxldCBvdXRwdXRMZW5ndGggPSBvdXRwdXQubGVuZ3RoOwogICAgICBwcml2YXRlRGljdFRyYWNrZXIub2Zmc2V0KG91dHB1dExlbmd0aCk7CiAgICAgIGlmICghcHJpdmF0ZURpY3REYXRhLmxlbmd0aCkgewogICAgICAgIG91dHB1dExlbmd0aCA9IDA7CiAgICAgIH0KICAgICAgdHJhY2tlcnNbaV0uc2V0RW50cnlMb2NhdGlvbigiUHJpdmF0ZSIsIFtwcml2YXRlRGljdERhdGEubGVuZ3RoLCBvdXRwdXRMZW5ndGhdLCBvdXRwdXQpOwogICAgICBvdXRwdXQuYWRkKHByaXZhdGVEaWN0RGF0YSk7CiAgICAgIGlmIChwcml2YXRlRGljdC5zdWJyc0luZGV4ICYmIHByaXZhdGVEaWN0Lmhhc05hbWUoIlN1YnJzIikpIHsKICAgICAgICBjb25zdCBzdWJycyA9IHRoaXMuY29tcGlsZUluZGV4KHByaXZhdGVEaWN0LnN1YnJzSW5kZXgpOwogICAgICAgIHByaXZhdGVEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJTdWJycyIsIFtwcml2YXRlRGljdERhdGEubGVuZ3RoXSwgb3V0cHV0KTsKICAgICAgICBvdXRwdXQuYWRkKHN1YnJzKTsKICAgICAgfQogICAgfQogIH0KICBjb21waWxlRGljdChkaWN0LCBvZmZzZXRUcmFja2VyKSB7CiAgICBjb25zdCBvdXQgPSBbXTsKICAgIGZvciAoY29uc3Qga2V5IG9mIGRpY3Qub3JkZXIpIHsKICAgICAgaWYgKCEoa2V5IGluIGRpY3QudmFsdWVzKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxldCB2YWx1ZXMgPSBkaWN0LnZhbHVlc1trZXldOwogICAgICBsZXQgdHlwZXMgPSBkaWN0LnR5cGVzW2tleV07CiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0eXBlcykpIHsKICAgICAgICB0eXBlcyA9IFt0eXBlc107CiAgICAgIH0KICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHsKICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTsKICAgICAgfQogICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHR5cGVzLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKICAgICAgICBjb25zdCB0eXBlID0gdHlwZXNbal07CiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbal07CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlICJudW0iOgogICAgICAgICAgY2FzZSAic2lkIjoKICAgICAgICAgICAgb3V0LnB1c2goLi4udGhpcy5lbmNvZGVOdW1iZXIodmFsdWUpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJvZmZzZXQiOgogICAgICAgICAgICBjb25zdCBuYW1lID0gZGljdC5rZXlUb05hbWVNYXBba2V5XTsKICAgICAgICAgICAgaWYgKCFvZmZzZXRUcmFja2VyLmlzVHJhY2tpbmcobmFtZSkpIHsKICAgICAgICAgICAgICBvZmZzZXRUcmFja2VyLnRyYWNrKG5hbWUsIG91dC5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dC5wdXNoKDB4MWQsIDAsIDAsIDAsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImFycmF5IjoKICAgICAgICAgIGNhc2UgImRlbHRhIjoKICAgICAgICAgICAgb3V0LnB1c2goLi4udGhpcy5lbmNvZGVOdW1iZXIodmFsdWUpKTsKICAgICAgICAgICAgZm9yIChsZXQgayA9IDEsIGtrID0gdmFsdWVzLmxlbmd0aDsgayA8IGtrOyArK2spIHsKICAgICAgICAgICAgICBvdXQucHVzaCguLi50aGlzLmVuY29kZU51bWJlcih2YWx1ZXNba10pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgb2YgJHt0eXBlfWApOwogICAgICAgIH0KICAgICAgfQogICAgICBvdXQucHVzaCguLi5kaWN0Lm9wY29kZXNba2V5XSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBjb21waWxlU3RyaW5nSW5kZXgoc3RyaW5ncykgewogICAgY29uc3Qgc3RyaW5nSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGZvciAoY29uc3Qgc3RyaW5nIG9mIHN0cmluZ3MpIHsKICAgICAgc3RyaW5nSW5kZXguYWRkKHN0cmluZ1RvQnl0ZXMoc3RyaW5nKSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlSW5kZXgoc3RyaW5nSW5kZXgpOwogIH0KICBjb21waWxlQ2hhclN0cmluZ3MoY2hhclN0cmluZ3MpIHsKICAgIGNvbnN0IGNoYXJTdHJpbmdzSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhclN0cmluZ3MuY291bnQ7IGkrKykgewogICAgICBjb25zdCBnbHlwaCA9IGNoYXJTdHJpbmdzLmdldChpKTsKICAgICAgaWYgKGdseXBoLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKG5ldyBVaW50OEFycmF5KFsweDhiLCAweDBlXSkpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKGdseXBoKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmNvbXBpbGVJbmRleChjaGFyU3RyaW5nc0luZGV4KTsKICB9CiAgY29tcGlsZUNoYXJzZXQoY2hhcnNldCwgbnVtR2x5cGhzLCBzdHJpbmdzLCBpc0NJREZvbnQpIHsKICAgIGxldCBvdXQ7CiAgICBjb25zdCBudW1HbHlwaHNMZXNzTm90RGVmID0gbnVtR2x5cGhzIC0gMTsKICAgIGlmIChpc0NJREZvbnQpIHsKICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoWzIsIDAsIDAsIG51bUdseXBoc0xlc3NOb3REZWYgPj4gOCAmIDB4ZmYsIG51bUdseXBoc0xlc3NOb3REZWYgJiAweGZmXSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBsZW5ndGggPSAxICsgbnVtR2x5cGhzTGVzc05vdERlZiAqIDI7CiAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CiAgICAgIG91dFswXSA9IDA7CiAgICAgIGxldCBjaGFyc2V0SW5kZXggPSAwOwogICAgICBjb25zdCBudW1DaGFyc2V0cyA9IGNoYXJzZXQuY2hhcnNldC5sZW5ndGg7CiAgICAgIGxldCB3YXJuZWQgPSBmYWxzZTsKICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICBsZXQgc2lkID0gMDsKICAgICAgICBpZiAoY2hhcnNldEluZGV4IDwgbnVtQ2hhcnNldHMpIHsKICAgICAgICAgIGNvbnN0IG5hbWUgPSBjaGFyc2V0LmNoYXJzZXRbY2hhcnNldEluZGV4KytdOwogICAgICAgICAgc2lkID0gc3RyaW5ncy5nZXRTSUQobmFtZSk7CiAgICAgICAgICBpZiAoc2lkID09PSAtMSkgewogICAgICAgICAgICBzaWQgPSAwOwogICAgICAgICAgICBpZiAoIXdhcm5lZCkgewogICAgICAgICAgICAgIHdhcm5lZCA9IHRydWU7CiAgICAgICAgICAgICAgd2FybihgQ291bGRuJ3QgZmluZCAke25hbWV9IGluIENGRiBzdHJpbmdzYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb3V0W2ldID0gc2lkID4+IDggJiAweGZmOwogICAgICAgIG91dFtpICsgMV0gPSBzaWQgJiAweGZmOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShvdXQpOwogIH0KICBjb21waWxlRW5jb2RpbmcoZW5jb2RpbmcpIHsKICAgIHJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KGVuY29kaW5nLnJhdyk7CiAgfQogIGNvbXBpbGVGRFNlbGVjdChmZFNlbGVjdCkgewogICAgY29uc3QgZm9ybWF0ID0gZmRTZWxlY3QuZm9ybWF0OwogICAgbGV0IG91dCwgaTsKICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBvdXQgPSBuZXcgVWludDhBcnJheSgxICsgZmRTZWxlY3QuZmRTZWxlY3QubGVuZ3RoKTsKICAgICAgICBvdXRbMF0gPSBmb3JtYXQ7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGZkU2VsZWN0LmZkU2VsZWN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBvdXRbaSArIDFdID0gZmRTZWxlY3QuZmRTZWxlY3RbaV07CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgY29uc3Qgc3RhcnQgPSAwOwogICAgICAgIGxldCBsYXN0RkQgPSBmZFNlbGVjdC5mZFNlbGVjdFswXTsKICAgICAgICBjb25zdCByYW5nZXMgPSBbZm9ybWF0LCAwLCAwLCBzdGFydCA+PiA4ICYgMHhmZiwgc3RhcnQgJiAweGZmLCBsYXN0RkRdOwogICAgICAgIGZvciAoaSA9IDE7IGkgPCBmZFNlbGVjdC5mZFNlbGVjdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgY3VycmVudEZEID0gZmRTZWxlY3QuZmRTZWxlY3RbaV07CiAgICAgICAgICBpZiAoY3VycmVudEZEICE9PSBsYXN0RkQpIHsKICAgICAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYsIGN1cnJlbnRGRCk7CiAgICAgICAgICAgIGxhc3RGRCA9IGN1cnJlbnRGRDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgbnVtUmFuZ2VzID0gKHJhbmdlcy5sZW5ndGggLSAzKSAvIDM7CiAgICAgICAgcmFuZ2VzWzFdID0gbnVtUmFuZ2VzID4+IDggJiAweGZmOwogICAgICAgIHJhbmdlc1syXSA9IG51bVJhbmdlcyAmIDB4ZmY7CiAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYpOwogICAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KHJhbmdlcyk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShvdXQpOwogIH0KICBjb21waWxlVHlwZWRBcnJheShkYXRhKSB7CiAgICByZXR1cm4gQXJyYXkuZnJvbShkYXRhKTsKICB9CiAgY29tcGlsZUluZGV4KGluZGV4LCB0cmFja2VycyA9IFtdKSB7CiAgICBjb25zdCBvYmplY3RzID0gaW5kZXgub2JqZWN0czsKICAgIGNvbnN0IGNvdW50ID0gb2JqZWN0cy5sZW5ndGg7CiAgICBpZiAoY291bnQgPT09IDApIHsKICAgICAgcmV0dXJuIFswLCAwXTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBbY291bnQgPj4gOCAmIDB4ZmYsIGNvdW50ICYgMHhmZl07CiAgICBsZXQgbGFzdE9mZnNldCA9IDEsCiAgICAgIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICBsYXN0T2Zmc2V0ICs9IG9iamVjdHNbaV0ubGVuZ3RoOwogICAgfQogICAgbGV0IG9mZnNldFNpemU7CiAgICBpZiAobGFzdE9mZnNldCA8IDB4MTAwKSB7CiAgICAgIG9mZnNldFNpemUgPSAxOwogICAgfSBlbHNlIGlmIChsYXN0T2Zmc2V0IDwgMHgxMDAwMCkgewogICAgICBvZmZzZXRTaXplID0gMjsKICAgIH0gZWxzZSBpZiAobGFzdE9mZnNldCA8IDB4MTAwMDAwMCkgewogICAgICBvZmZzZXRTaXplID0gMzsKICAgIH0gZWxzZSB7CiAgICAgIG9mZnNldFNpemUgPSA0OwogICAgfQogICAgZGF0YS5wdXNoKG9mZnNldFNpemUpOwogICAgbGV0IHJlbGF0aXZlT2Zmc2V0ID0gMTsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudCArIDE7IGkrKykgewogICAgICBpZiAob2Zmc2V0U2l6ZSA9PT0gMSkgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9IGVsc2UgaWYgKG9mZnNldFNpemUgPT09IDIpIHsKICAgICAgICBkYXRhLnB1c2gocmVsYXRpdmVPZmZzZXQgPj4gOCAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ICYgMHhmZik7CiAgICAgIH0gZWxzZSBpZiAob2Zmc2V0U2l6ZSA9PT0gMykgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9IGVsc2UgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+Pj4gMjQgJiAweGZmLCByZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9CiAgICAgIGlmIChvYmplY3RzW2ldKSB7CiAgICAgICAgcmVsYXRpdmVPZmZzZXQgKz0gb2JqZWN0c1tpXS5sZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGlmICh0cmFja2Vyc1tpXSkgewogICAgICAgIHRyYWNrZXJzW2ldLm9mZnNldChkYXRhLmxlbmd0aCk7CiAgICAgIH0KICAgICAgZGF0YS5wdXNoKC4uLm9iamVjdHNbaV0pOwogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9nbHlwaGxpc3QuanMKCmNvbnN0IGdldEdseXBoc1VuaWNvZGUgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LkEgPSAweDAwNDE7CiAgdC5BRSA9IDB4MDBjNjsKICB0LkFFYWN1dGUgPSAweDAxZmM7CiAgdC5BRW1hY3JvbiA9IDB4MDFlMjsKICB0LkFFc21hbGwgPSAweGY3ZTY7CiAgdC5BYWN1dGUgPSAweDAwYzE7CiAgdC5BYWN1dGVzbWFsbCA9IDB4ZjdlMTsKICB0LkFicmV2ZSA9IDB4MDEwMjsKICB0LkFicmV2ZWFjdXRlID0gMHgxZWFlOwogIHQuQWJyZXZlY3lyaWxsaWMgPSAweDA0ZDA7CiAgdC5BYnJldmVkb3RiZWxvdyA9IDB4MWViNjsKICB0LkFicmV2ZWdyYXZlID0gMHgxZWIwOwogIHQuQWJyZXZlaG9va2Fib3ZlID0gMHgxZWIyOwogIHQuQWJyZXZldGlsZGUgPSAweDFlYjQ7CiAgdC5BY2Fyb24gPSAweDAxY2Q7CiAgdC5BY2lyY2xlID0gMHgyNGI2OwogIHQuQWNpcmN1bWZsZXggPSAweDAwYzI7CiAgdC5BY2lyY3VtZmxleGFjdXRlID0gMHgxZWE0OwogIHQuQWNpcmN1bWZsZXhkb3RiZWxvdyA9IDB4MWVhYzsKICB0LkFjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYTY7CiAgdC5BY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVhODsKICB0LkFjaXJjdW1mbGV4c21hbGwgPSAweGY3ZTI7CiAgdC5BY2lyY3VtZmxleHRpbGRlID0gMHgxZWFhOwogIHQuQWN1dGUgPSAweGY2Yzk7CiAgdC5BY3V0ZXNtYWxsID0gMHhmN2I0OwogIHQuQWN5cmlsbGljID0gMHgwNDEwOwogIHQuQWRibGdyYXZlID0gMHgwMjAwOwogIHQuQWRpZXJlc2lzID0gMHgwMGM0OwogIHQuQWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZDI7CiAgdC5BZGllcmVzaXNtYWNyb24gPSAweDAxZGU7CiAgdC5BZGllcmVzaXNzbWFsbCA9IDB4ZjdlNDsKICB0LkFkb3RiZWxvdyA9IDB4MWVhMDsKICB0LkFkb3RtYWNyb24gPSAweDAxZTA7CiAgdC5BZ3JhdmUgPSAweDAwYzA7CiAgdC5BZ3JhdmVzbWFsbCA9IDB4ZjdlMDsKICB0LkFob29rYWJvdmUgPSAweDFlYTI7CiAgdC5BaWVjeXJpbGxpYyA9IDB4MDRkNDsKICB0LkFpbnZlcnRlZGJyZXZlID0gMHgwMjAyOwogIHQuQWxwaGEgPSAweDAzOTE7CiAgdC5BbHBoYXRvbm9zID0gMHgwMzg2OwogIHQuQW1hY3JvbiA9IDB4MDEwMDsKICB0LkFtb25vc3BhY2UgPSAweGZmMjE7CiAgdC5Bb2dvbmVrID0gMHgwMTA0OwogIHQuQXJpbmcgPSAweDAwYzU7CiAgdC5BcmluZ2FjdXRlID0gMHgwMWZhOwogIHQuQXJpbmdiZWxvdyA9IDB4MWUwMDsKICB0LkFyaW5nc21hbGwgPSAweGY3ZTU7CiAgdC5Bc21hbGwgPSAweGY3NjE7CiAgdC5BdGlsZGUgPSAweDAwYzM7CiAgdC5BdGlsZGVzbWFsbCA9IDB4ZjdlMzsKICB0LkF5YmFybWVuaWFuID0gMHgwNTMxOwogIHQuQiA9IDB4MDA0MjsKICB0LkJjaXJjbGUgPSAweDI0Yjc7CiAgdC5CZG90YWNjZW50ID0gMHgxZTAyOwogIHQuQmRvdGJlbG93ID0gMHgxZTA0OwogIHQuQmVjeXJpbGxpYyA9IDB4MDQxMTsKICB0LkJlbmFybWVuaWFuID0gMHgwNTMyOwogIHQuQmV0YSA9IDB4MDM5MjsKICB0LkJob29rID0gMHgwMTgxOwogIHQuQmxpbmViZWxvdyA9IDB4MWUwNjsKICB0LkJtb25vc3BhY2UgPSAweGZmMjI7CiAgdC5CcmV2ZXNtYWxsID0gMHhmNmY0OwogIHQuQnNtYWxsID0gMHhmNzYyOwogIHQuQnRvcGJhciA9IDB4MDE4MjsKICB0LkMgPSAweDAwNDM7CiAgdC5DYWFybWVuaWFuID0gMHgwNTNlOwogIHQuQ2FjdXRlID0gMHgwMTA2OwogIHQuQ2Fyb24gPSAweGY2Y2E7CiAgdC5DYXJvbnNtYWxsID0gMHhmNmY1OwogIHQuQ2Nhcm9uID0gMHgwMTBjOwogIHQuQ2NlZGlsbGEgPSAweDAwYzc7CiAgdC5DY2VkaWxsYWFjdXRlID0gMHgxZTA4OwogIHQuQ2NlZGlsbGFzbWFsbCA9IDB4ZjdlNzsKICB0LkNjaXJjbGUgPSAweDI0Yjg7CiAgdC5DY2lyY3VtZmxleCA9IDB4MDEwODsKICB0LkNkb3QgPSAweDAxMGE7CiAgdC5DZG90YWNjZW50ID0gMHgwMTBhOwogIHQuQ2VkaWxsYXNtYWxsID0gMHhmN2I4OwogIHQuQ2hhYXJtZW5pYW4gPSAweDA1NDk7CiAgdC5DaGVhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiYzsKICB0LkNoZWN5cmlsbGljID0gMHgwNDI3OwogIHQuQ2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YmU7CiAgdC5DaGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiNjsKICB0LkNoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjQ7CiAgdC5DaGVoYXJtZW5pYW4gPSAweDA1NDM7CiAgdC5DaGVraGFrYXNzaWFuY3lyaWxsaWMgPSAweDA0Y2I7CiAgdC5DaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNGI4OwogIHQuQ2hpID0gMHgwM2E3OwogIHQuQ2hvb2sgPSAweDAxODc7CiAgdC5DaXJjdW1mbGV4c21hbGwgPSAweGY2ZjY7CiAgdC5DbW9ub3NwYWNlID0gMHhmZjIzOwogIHQuQ29hcm1lbmlhbiA9IDB4MDU1MTsKICB0LkNzbWFsbCA9IDB4Zjc2MzsKICB0LkQgPSAweDAwNDQ7CiAgdC5EWiA9IDB4MDFmMTsKICB0LkRaY2Fyb24gPSAweDAxYzQ7CiAgdC5EYWFybWVuaWFuID0gMHgwNTM0OwogIHQuRGFmcmljYW4gPSAweDAxODk7CiAgdC5EY2Fyb24gPSAweDAxMGU7CiAgdC5EY2VkaWxsYSA9IDB4MWUxMDsKICB0LkRjaXJjbGUgPSAweDI0Yjk7CiAgdC5EY2lyY3VtZmxleGJlbG93ID0gMHgxZTEyOwogIHQuRGNyb2F0ID0gMHgwMTEwOwogIHQuRGRvdGFjY2VudCA9IDB4MWUwYTsKICB0LkRkb3RiZWxvdyA9IDB4MWUwYzsKICB0LkRlY3lyaWxsaWMgPSAweDA0MTQ7CiAgdC5EZWljb3B0aWMgPSAweDAzZWU7CiAgdC5EZWx0YSA9IDB4MjIwNjsKICB0LkRlbHRhZ3JlZWsgPSAweDAzOTQ7CiAgdC5EaG9vayA9IDB4MDE4YTsKICB0LkRpZXJlc2lzID0gMHhmNmNiOwogIHQuRGllcmVzaXNBY3V0ZSA9IDB4ZjZjYzsKICB0LkRpZXJlc2lzR3JhdmUgPSAweGY2Y2Q7CiAgdC5EaWVyZXNpc3NtYWxsID0gMHhmN2E4OwogIHQuRGlnYW1tYWdyZWVrID0gMHgwM2RjOwogIHQuRGplY3lyaWxsaWMgPSAweDA0MDI7CiAgdC5EbGluZWJlbG93ID0gMHgxZTBlOwogIHQuRG1vbm9zcGFjZSA9IDB4ZmYyNDsKICB0LkRvdGFjY2VudHNtYWxsID0gMHhmNmY3OwogIHQuRHNsYXNoID0gMHgwMTEwOwogIHQuRHNtYWxsID0gMHhmNzY0OwogIHQuRHRvcGJhciA9IDB4MDE4YjsKICB0LkR6ID0gMHgwMWYyOwogIHQuRHpjYXJvbiA9IDB4MDFjNTsKICB0LkR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUwOwogIHQuRHplY3lyaWxsaWMgPSAweDA0MDU7CiAgdC5EemhlY3lyaWxsaWMgPSAweDA0MGY7CiAgdC5FID0gMHgwMDQ1OwogIHQuRWFjdXRlID0gMHgwMGM5OwogIHQuRWFjdXRlc21hbGwgPSAweGY3ZTk7CiAgdC5FYnJldmUgPSAweDAxMTQ7CiAgdC5FY2Fyb24gPSAweDAxMWE7CiAgdC5FY2VkaWxsYWJyZXZlID0gMHgxZTFjOwogIHQuRWNoYXJtZW5pYW4gPSAweDA1MzU7CiAgdC5FY2lyY2xlID0gMHgyNGJhOwogIHQuRWNpcmN1bWZsZXggPSAweDAwY2E7CiAgdC5FY2lyY3VtZmxleGFjdXRlID0gMHgxZWJlOwogIHQuRWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxODsKICB0LkVjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYzY7CiAgdC5FY2lyY3VtZmxleGdyYXZlID0gMHgxZWMwOwogIHQuRWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzI7CiAgdC5FY2lyY3VtZmxleHNtYWxsID0gMHhmN2VhOwogIHQuRWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVjNDsKICB0LkVjeXJpbGxpYyA9IDB4MDQwNDsKICB0LkVkYmxncmF2ZSA9IDB4MDIwNDsKICB0LkVkaWVyZXNpcyA9IDB4MDBjYjsKICB0LkVkaWVyZXNpc3NtYWxsID0gMHhmN2ViOwogIHQuRWRvdCA9IDB4MDExNjsKICB0LkVkb3RhY2NlbnQgPSAweDAxMTY7CiAgdC5FZG90YmVsb3cgPSAweDFlYjg7CiAgdC5FZmN5cmlsbGljID0gMHgwNDI0OwogIHQuRWdyYXZlID0gMHgwMGM4OwogIHQuRWdyYXZlc21hbGwgPSAweGY3ZTg7CiAgdC5FaGFybWVuaWFuID0gMHgwNTM3OwogIHQuRWhvb2thYm92ZSA9IDB4MWViYTsKICB0LkVpZ2h0cm9tYW4gPSAweDIxNjc7CiAgdC5FaW52ZXJ0ZWRicmV2ZSA9IDB4MDIwNjsKICB0LkVpb3RpZmllZGN5cmlsbGljID0gMHgwNDY0OwogIHQuRWxjeXJpbGxpYyA9IDB4MDQxYjsKICB0LkVsZXZlbnJvbWFuID0gMHgyMTZhOwogIHQuRW1hY3JvbiA9IDB4MDExMjsKICB0LkVtYWNyb25hY3V0ZSA9IDB4MWUxNjsKICB0LkVtYWNyb25ncmF2ZSA9IDB4MWUxNDsKICB0LkVtY3lyaWxsaWMgPSAweDA0MWM7CiAgdC5FbW9ub3NwYWNlID0gMHhmZjI1OwogIHQuRW5jeXJpbGxpYyA9IDB4MDQxZDsKICB0LkVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTI7CiAgdC5FbmcgPSAweDAxNGE7CiAgdC5FbmdoZWN5cmlsbGljID0gMHgwNGE0OwogIHQuRW5ob29rY3lyaWxsaWMgPSAweDA0Yzc7CiAgdC5Fb2dvbmVrID0gMHgwMTE4OwogIHQuRW9wZW4gPSAweDAxOTA7CiAgdC5FcHNpbG9uID0gMHgwMzk1OwogIHQuRXBzaWxvbnRvbm9zID0gMHgwMzg4OwogIHQuRXJjeXJpbGxpYyA9IDB4MDQyMDsKICB0LkVyZXZlcnNlZCA9IDB4MDE4ZTsKICB0LkVyZXZlcnNlZGN5cmlsbGljID0gMHgwNDJkOwogIHQuRXNjeXJpbGxpYyA9IDB4MDQyMTsKICB0LkVzZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YWE7CiAgdC5Fc2ggPSAweDAxYTk7CiAgdC5Fc21hbGwgPSAweGY3NjU7CiAgdC5FdGEgPSAweDAzOTc7CiAgdC5FdGFybWVuaWFuID0gMHgwNTM4OwogIHQuRXRhdG9ub3MgPSAweDAzODk7CiAgdC5FdGggPSAweDAwZDA7CiAgdC5FdGhzbWFsbCA9IDB4ZjdmMDsKICB0LkV0aWxkZSA9IDB4MWViYzsKICB0LkV0aWxkZWJlbG93ID0gMHgxZTFhOwogIHQuRXVybyA9IDB4MjBhYzsKICB0LkV6aCA9IDB4MDFiNzsKICB0LkV6aGNhcm9uID0gMHgwMWVlOwogIHQuRXpocmV2ZXJzZWQgPSAweDAxYjg7CiAgdC5GID0gMHgwMDQ2OwogIHQuRmNpcmNsZSA9IDB4MjRiYjsKICB0LkZkb3RhY2NlbnQgPSAweDFlMWU7CiAgdC5GZWhhcm1lbmlhbiA9IDB4MDU1NjsKICB0LkZlaWNvcHRpYyA9IDB4MDNlNDsKICB0LkZob29rID0gMHgwMTkxOwogIHQuRml0YWN5cmlsbGljID0gMHgwNDcyOwogIHQuRml2ZXJvbWFuID0gMHgyMTY0OwogIHQuRm1vbm9zcGFjZSA9IDB4ZmYyNjsKICB0LkZvdXJyb21hbiA9IDB4MjE2MzsKICB0LkZzbWFsbCA9IDB4Zjc2NjsKICB0LkcgPSAweDAwNDc7CiAgdC5HQnNxdWFyZSA9IDB4MzM4NzsKICB0LkdhY3V0ZSA9IDB4MDFmNDsKICB0LkdhbW1hID0gMHgwMzkzOwogIHQuR2FtbWFhZnJpY2FuID0gMHgwMTk0OwogIHQuR2FuZ2lhY29wdGljID0gMHgwM2VhOwogIHQuR2JyZXZlID0gMHgwMTFlOwogIHQuR2Nhcm9uID0gMHgwMWU2OwogIHQuR2NlZGlsbGEgPSAweDAxMjI7CiAgdC5HY2lyY2xlID0gMHgyNGJjOwogIHQuR2NpcmN1bWZsZXggPSAweDAxMWM7CiAgdC5HY29tbWFhY2NlbnQgPSAweDAxMjI7CiAgdC5HZG90ID0gMHgwMTIwOwogIHQuR2RvdGFjY2VudCA9IDB4MDEyMDsKICB0LkdlY3lyaWxsaWMgPSAweDA0MTM7CiAgdC5HaGFkYXJtZW5pYW4gPSAweDA1NDI7CiAgdC5HaGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0OTQ7CiAgdC5HaGVzdHJva2VjeXJpbGxpYyA9IDB4MDQ5MjsKICB0LkdoZXVwdHVybmN5cmlsbGljID0gMHgwNDkwOwogIHQuR2hvb2sgPSAweDAxOTM7CiAgdC5HaW1hcm1lbmlhbiA9IDB4MDUzMzsKICB0LkdqZWN5cmlsbGljID0gMHgwNDAzOwogIHQuR21hY3JvbiA9IDB4MWUyMDsKICB0Lkdtb25vc3BhY2UgPSAweGZmMjc7CiAgdC5HcmF2ZSA9IDB4ZjZjZTsKICB0LkdyYXZlc21hbGwgPSAweGY3NjA7CiAgdC5Hc21hbGwgPSAweGY3Njc7CiAgdC5Hc21hbGxob29rID0gMHgwMjliOwogIHQuR3N0cm9rZSA9IDB4MDFlNDsKICB0LkggPSAweDAwNDg7CiAgdC5IMTg1MzMgPSAweDI1Y2Y7CiAgdC5IMTg1NDMgPSAweDI1YWE7CiAgdC5IMTg1NTEgPSAweDI1YWI7CiAgdC5IMjIwNzMgPSAweDI1YTE7CiAgdC5IUHNxdWFyZSA9IDB4MzNjYjsKICB0LkhhYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YTg7CiAgdC5IYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGIyOwogIHQuSGFyZHNpZ25jeXJpbGxpYyA9IDB4MDQyYTsKICB0LkhiYXIgPSAweDAxMjY7CiAgdC5IYnJldmViZWxvdyA9IDB4MWUyYTsKICB0LkhjZWRpbGxhID0gMHgxZTI4OwogIHQuSGNpcmNsZSA9IDB4MjRiZDsKICB0LkhjaXJjdW1mbGV4ID0gMHgwMTI0OwogIHQuSGRpZXJlc2lzID0gMHgxZTI2OwogIHQuSGRvdGFjY2VudCA9IDB4MWUyMjsKICB0Lkhkb3RiZWxvdyA9IDB4MWUyNDsKICB0Lkhtb25vc3BhY2UgPSAweGZmMjg7CiAgdC5Ib2FybWVuaWFuID0gMHgwNTQwOwogIHQuSG9yaWNvcHRpYyA9IDB4MDNlODsKICB0LkhzbWFsbCA9IDB4Zjc2ODsKICB0Lkh1bmdhcnVtbGF1dCA9IDB4ZjZjZjsKICB0Lkh1bmdhcnVtbGF1dHNtYWxsID0gMHhmNmY4OwogIHQuSHpzcXVhcmUgPSAweDMzOTA7CiAgdC5JID0gMHgwMDQ5OwogIHQuSUFjeXJpbGxpYyA9IDB4MDQyZjsKICB0LklKID0gMHgwMTMyOwogIHQuSVVjeXJpbGxpYyA9IDB4MDQyZTsKICB0LklhY3V0ZSA9IDB4MDBjZDsKICB0LklhY3V0ZXNtYWxsID0gMHhmN2VkOwogIHQuSWJyZXZlID0gMHgwMTJjOwogIHQuSWNhcm9uID0gMHgwMWNmOwogIHQuSWNpcmNsZSA9IDB4MjRiZTsKICB0LkljaXJjdW1mbGV4ID0gMHgwMGNlOwogIHQuSWNpcmN1bWZsZXhzbWFsbCA9IDB4ZjdlZTsKICB0LkljeXJpbGxpYyA9IDB4MDQwNjsKICB0LklkYmxncmF2ZSA9IDB4MDIwODsKICB0LklkaWVyZXNpcyA9IDB4MDBjZjsKICB0LklkaWVyZXNpc2FjdXRlID0gMHgxZTJlOwogIHQuSWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTQ7CiAgdC5JZGllcmVzaXNzbWFsbCA9IDB4ZjdlZjsKICB0Lklkb3QgPSAweDAxMzA7CiAgdC5JZG90YWNjZW50ID0gMHgwMTMwOwogIHQuSWRvdGJlbG93ID0gMHgxZWNhOwogIHQuSWVicmV2ZWN5cmlsbGljID0gMHgwNGQ2OwogIHQuSWVjeXJpbGxpYyA9IDB4MDQxNTsKICB0LklmcmFrdHVyID0gMHgyMTExOwogIHQuSWdyYXZlID0gMHgwMGNjOwogIHQuSWdyYXZlc21hbGwgPSAweGY3ZWM7CiAgdC5JaG9va2Fib3ZlID0gMHgxZWM4OwogIHQuSWljeXJpbGxpYyA9IDB4MDQxODsKICB0LklpbnZlcnRlZGJyZXZlID0gMHgwMjBhOwogIHQuSWlzaG9ydGN5cmlsbGljID0gMHgwNDE5OwogIHQuSW1hY3JvbiA9IDB4MDEyYTsKICB0LkltYWNyb25jeXJpbGxpYyA9IDB4MDRlMjsKICB0Lkltb25vc3BhY2UgPSAweGZmMjk7CiAgdC5Jbmlhcm1lbmlhbiA9IDB4MDUzYjsKICB0LklvY3lyaWxsaWMgPSAweDA0MDE7CiAgdC5Jb2dvbmVrID0gMHgwMTJlOwogIHQuSW90YSA9IDB4MDM5OTsKICB0LklvdGFhZnJpY2FuID0gMHgwMTk2OwogIHQuSW90YWRpZXJlc2lzID0gMHgwM2FhOwogIHQuSW90YXRvbm9zID0gMHgwMzhhOwogIHQuSXNtYWxsID0gMHhmNzY5OwogIHQuSXN0cm9rZSA9IDB4MDE5NzsKICB0Lkl0aWxkZSA9IDB4MDEyODsKICB0Lkl0aWxkZWJlbG93ID0gMHgxZTJjOwogIHQuSXpoaXRzYWN5cmlsbGljID0gMHgwNDc0OwogIHQuSXpoaXRzYWRibGdyYXZlY3lyaWxsaWMgPSAweDA0NzY7CiAgdC5KID0gMHgwMDRhOwogIHQuSmFhcm1lbmlhbiA9IDB4MDU0MTsKICB0LkpjaXJjbGUgPSAweDI0YmY7CiAgdC5KY2lyY3VtZmxleCA9IDB4MDEzNDsKICB0LkplY3lyaWxsaWMgPSAweDA0MDg7CiAgdC5KaGVoYXJtZW5pYW4gPSAweDA1NGI7CiAgdC5KbW9ub3NwYWNlID0gMHhmZjJhOwogIHQuSnNtYWxsID0gMHhmNzZhOwogIHQuSyA9IDB4MDA0YjsKICB0LktCc3F1YXJlID0gMHgzMzg1OwogIHQuS0tzcXVhcmUgPSAweDMzY2Q7CiAgdC5LYWJhc2hraXJjeXJpbGxpYyA9IDB4MDRhMDsKICB0LkthY3V0ZSA9IDB4MWUzMDsKICB0LkthY3lyaWxsaWMgPSAweDA0MWE7CiAgdC5LYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDlhOwogIHQuS2Fob29rY3lyaWxsaWMgPSAweDA0YzM7CiAgdC5LYXBwYSA9IDB4MDM5YTsKICB0Lkthc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWU7CiAgdC5LYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWM7CiAgdC5LY2Fyb24gPSAweDAxZTg7CiAgdC5LY2VkaWxsYSA9IDB4MDEzNjsKICB0LktjaXJjbGUgPSAweDI0YzA7CiAgdC5LY29tbWFhY2NlbnQgPSAweDAxMzY7CiAgdC5LZG90YmVsb3cgPSAweDFlMzI7CiAgdC5LZWhhcm1lbmlhbiA9IDB4MDU1NDsKICB0LktlbmFybWVuaWFuID0gMHgwNTNmOwogIHQuS2hhY3lyaWxsaWMgPSAweDA0MjU7CiAgdC5LaGVpY29wdGljID0gMHgwM2U2OwogIHQuS2hvb2sgPSAweDAxOTg7CiAgdC5LamVjeXJpbGxpYyA9IDB4MDQwYzsKICB0LktsaW5lYmVsb3cgPSAweDFlMzQ7CiAgdC5LbW9ub3NwYWNlID0gMHhmZjJiOwogIHQuS29wcGFjeXJpbGxpYyA9IDB4MDQ4MDsKICB0LktvcHBhZ3JlZWsgPSAweDAzZGU7CiAgdC5Lc2ljeXJpbGxpYyA9IDB4MDQ2ZTsKICB0LktzbWFsbCA9IDB4Zjc2YjsKICB0LkwgPSAweDAwNGM7CiAgdC5MSiA9IDB4MDFjNzsKICB0LkxMID0gMHhmNmJmOwogIHQuTGFjdXRlID0gMHgwMTM5OwogIHQuTGFtYmRhID0gMHgwMzliOwogIHQuTGNhcm9uID0gMHgwMTNkOwogIHQuTGNlZGlsbGEgPSAweDAxM2I7CiAgdC5MY2lyY2xlID0gMHgyNGMxOwogIHQuTGNpcmN1bWZsZXhiZWxvdyA9IDB4MWUzYzsKICB0Lkxjb21tYWFjY2VudCA9IDB4MDEzYjsKICB0Lkxkb3QgPSAweDAxM2Y7CiAgdC5MZG90YWNjZW50ID0gMHgwMTNmOwogIHQuTGRvdGJlbG93ID0gMHgxZTM2OwogIHQuTGRvdGJlbG93bWFjcm9uID0gMHgxZTM4OwogIHQuTGl3bmFybWVuaWFuID0gMHgwNTNjOwogIHQuTGogPSAweDAxYzg7CiAgdC5MamVjeXJpbGxpYyA9IDB4MDQwOTsKICB0LkxsaW5lYmVsb3cgPSAweDFlM2E7CiAgdC5MbW9ub3NwYWNlID0gMHhmZjJjOwogIHQuTHNsYXNoID0gMHgwMTQxOwogIHQuTHNsYXNoc21hbGwgPSAweGY2Zjk7CiAgdC5Mc21hbGwgPSAweGY3NmM7CiAgdC5NID0gMHgwMDRkOwogIHQuTUJzcXVhcmUgPSAweDMzODY7CiAgdC5NYWNyb24gPSAweGY2ZDA7CiAgdC5NYWNyb25zbWFsbCA9IDB4ZjdhZjsKICB0Lk1hY3V0ZSA9IDB4MWUzZTsKICB0Lk1jaXJjbGUgPSAweDI0YzI7CiAgdC5NZG90YWNjZW50ID0gMHgxZTQwOwogIHQuTWRvdGJlbG93ID0gMHgxZTQyOwogIHQuTWVuYXJtZW5pYW4gPSAweDA1NDQ7CiAgdC5NbW9ub3NwYWNlID0gMHhmZjJkOwogIHQuTXNtYWxsID0gMHhmNzZkOwogIHQuTXR1cm5lZCA9IDB4MDE5YzsKICB0Lk11ID0gMHgwMzljOwogIHQuTiA9IDB4MDA0ZTsKICB0Lk5KID0gMHgwMWNhOwogIHQuTmFjdXRlID0gMHgwMTQzOwogIHQuTmNhcm9uID0gMHgwMTQ3OwogIHQuTmNlZGlsbGEgPSAweDAxNDU7CiAgdC5OY2lyY2xlID0gMHgyNGMzOwogIHQuTmNpcmN1bWZsZXhiZWxvdyA9IDB4MWU0YTsKICB0Lk5jb21tYWFjY2VudCA9IDB4MDE0NTsKICB0Lk5kb3RhY2NlbnQgPSAweDFlNDQ7CiAgdC5OZG90YmVsb3cgPSAweDFlNDY7CiAgdC5OaG9va2xlZnQgPSAweDAxOWQ7CiAgdC5OaW5lcm9tYW4gPSAweDIxNjg7CiAgdC5OaiA9IDB4MDFjYjsKICB0Lk5qZWN5cmlsbGljID0gMHgwNDBhOwogIHQuTmxpbmViZWxvdyA9IDB4MWU0ODsKICB0Lk5tb25vc3BhY2UgPSAweGZmMmU7CiAgdC5Ob3dhcm1lbmlhbiA9IDB4MDU0NjsKICB0Lk5zbWFsbCA9IDB4Zjc2ZTsKICB0Lk50aWxkZSA9IDB4MDBkMTsKICB0Lk50aWxkZXNtYWxsID0gMHhmN2YxOwogIHQuTnUgPSAweDAzOWQ7CiAgdC5PID0gMHgwMDRmOwogIHQuT0UgPSAweDAxNTI7CiAgdC5PRXNtYWxsID0gMHhmNmZhOwogIHQuT2FjdXRlID0gMHgwMGQzOwogIHQuT2FjdXRlc21hbGwgPSAweGY3ZjM7CiAgdC5PYmFycmVkY3lyaWxsaWMgPSAweDA0ZTg7CiAgdC5PYmFycmVkZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlYTsKICB0Lk9icmV2ZSA9IDB4MDE0ZTsKICB0Lk9jYXJvbiA9IDB4MDFkMTsKICB0Lk9jZW50ZXJlZHRpbGRlID0gMHgwMTlmOwogIHQuT2NpcmNsZSA9IDB4MjRjNDsKICB0Lk9jaXJjdW1mbGV4ID0gMHgwMGQ0OwogIHQuT2NpcmN1bWZsZXhhY3V0ZSA9IDB4MWVkMDsKICB0Lk9jaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlZDg7CiAgdC5PY2lyY3VtZmxleGdyYXZlID0gMHgxZWQyOwogIHQuT2NpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlZDQ7CiAgdC5PY2lyY3VtZmxleHNtYWxsID0gMHhmN2Y0OwogIHQuT2NpcmN1bWZsZXh0aWxkZSA9IDB4MWVkNjsKICB0Lk9jeXJpbGxpYyA9IDB4MDQxZTsKICB0Lk9kYmxhY3V0ZSA9IDB4MDE1MDsKICB0Lk9kYmxncmF2ZSA9IDB4MDIwYzsKICB0Lk9kaWVyZXNpcyA9IDB4MDBkNjsKICB0Lk9kaWVyZXNpc2N5cmlsbGljID0gMHgwNGU2OwogIHQuT2RpZXJlc2lzc21hbGwgPSAweGY3ZjY7CiAgdC5PZG90YmVsb3cgPSAweDFlY2M7CiAgdC5PZ29uZWtzbWFsbCA9IDB4ZjZmYjsKICB0Lk9ncmF2ZSA9IDB4MDBkMjsKICB0Lk9ncmF2ZXNtYWxsID0gMHhmN2YyOwogIHQuT2hhcm1lbmlhbiA9IDB4MDU1NTsKICB0Lk9obSA9IDB4MjEyNjsKICB0Lk9ob29rYWJvdmUgPSAweDFlY2U7CiAgdC5PaG9ybiA9IDB4MDFhMDsKICB0Lk9ob3JuYWN1dGUgPSAweDFlZGE7CiAgdC5PaG9ybmRvdGJlbG93ID0gMHgxZWUyOwogIHQuT2hvcm5ncmF2ZSA9IDB4MWVkYzsKICB0Lk9ob3JuaG9va2Fib3ZlID0gMHgxZWRlOwogIHQuT2hvcm50aWxkZSA9IDB4MWVlMDsKICB0Lk9odW5nYXJ1bWxhdXQgPSAweDAxNTA7CiAgdC5PaSA9IDB4MDFhMjsKICB0Lk9pbnZlcnRlZGJyZXZlID0gMHgwMjBlOwogIHQuT21hY3JvbiA9IDB4MDE0YzsKICB0Lk9tYWNyb25hY3V0ZSA9IDB4MWU1MjsKICB0Lk9tYWNyb25ncmF2ZSA9IDB4MWU1MDsKICB0Lk9tZWdhID0gMHgyMTI2OwogIHQuT21lZ2FjeXJpbGxpYyA9IDB4MDQ2MDsKICB0Lk9tZWdhZ3JlZWsgPSAweDAzYTk7CiAgdC5PbWVnYXJvdW5kY3lyaWxsaWMgPSAweDA0N2E7CiAgdC5PbWVnYXRpdGxvY3lyaWxsaWMgPSAweDA0N2M7CiAgdC5PbWVnYXRvbm9zID0gMHgwMzhmOwogIHQuT21pY3JvbiA9IDB4MDM5ZjsKICB0Lk9taWNyb250b25vcyA9IDB4MDM4YzsKICB0Lk9tb25vc3BhY2UgPSAweGZmMmY7CiAgdC5PbmVyb21hbiA9IDB4MjE2MDsKICB0Lk9vZ29uZWsgPSAweDAxZWE7CiAgdC5Pb2dvbmVrbWFjcm9uID0gMHgwMWVjOwogIHQuT29wZW4gPSAweDAxODY7CiAgdC5Pc2xhc2ggPSAweDAwZDg7CiAgdC5Pc2xhc2hhY3V0ZSA9IDB4MDFmZTsKICB0Lk9zbGFzaHNtYWxsID0gMHhmN2Y4OwogIHQuT3NtYWxsID0gMHhmNzZmOwogIHQuT3N0cm9rZWFjdXRlID0gMHgwMWZlOwogIHQuT3RjeXJpbGxpYyA9IDB4MDQ3ZTsKICB0Lk90aWxkZSA9IDB4MDBkNTsKICB0Lk90aWxkZWFjdXRlID0gMHgxZTRjOwogIHQuT3RpbGRlZGllcmVzaXMgPSAweDFlNGU7CiAgdC5PdGlsZGVzbWFsbCA9IDB4ZjdmNTsKICB0LlAgPSAweDAwNTA7CiAgdC5QYWN1dGUgPSAweDFlNTQ7CiAgdC5QY2lyY2xlID0gMHgyNGM1OwogIHQuUGRvdGFjY2VudCA9IDB4MWU1NjsKICB0LlBlY3lyaWxsaWMgPSAweDA0MWY7CiAgdC5QZWhhcm1lbmlhbiA9IDB4MDU0YTsKICB0LlBlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNGE2OwogIHQuUGhpID0gMHgwM2E2OwogIHQuUGhvb2sgPSAweDAxYTQ7CiAgdC5QaSA9IDB4MDNhMDsKICB0LlBpd3Jhcm1lbmlhbiA9IDB4MDU1MzsKICB0LlBtb25vc3BhY2UgPSAweGZmMzA7CiAgdC5Qc2kgPSAweDAzYTg7CiAgdC5Qc2ljeXJpbGxpYyA9IDB4MDQ3MDsKICB0LlBzbWFsbCA9IDB4Zjc3MDsKICB0LlEgPSAweDAwNTE7CiAgdC5RY2lyY2xlID0gMHgyNGM2OwogIHQuUW1vbm9zcGFjZSA9IDB4ZmYzMTsKICB0LlFzbWFsbCA9IDB4Zjc3MTsKICB0LlIgPSAweDAwNTI7CiAgdC5SYWFybWVuaWFuID0gMHgwNTRjOwogIHQuUmFjdXRlID0gMHgwMTU0OwogIHQuUmNhcm9uID0gMHgwMTU4OwogIHQuUmNlZGlsbGEgPSAweDAxNTY7CiAgdC5SY2lyY2xlID0gMHgyNGM3OwogIHQuUmNvbW1hYWNjZW50ID0gMHgwMTU2OwogIHQuUmRibGdyYXZlID0gMHgwMjEwOwogIHQuUmRvdGFjY2VudCA9IDB4MWU1ODsKICB0LlJkb3RiZWxvdyA9IDB4MWU1YTsKICB0LlJkb3RiZWxvd21hY3JvbiA9IDB4MWU1YzsKICB0LlJlaGFybWVuaWFuID0gMHgwNTUwOwogIHQuUmZyYWt0dXIgPSAweDIxMWM7CiAgdC5SaG8gPSAweDAzYTE7CiAgdC5SaW5nc21hbGwgPSAweGY2ZmM7CiAgdC5SaW52ZXJ0ZWRicmV2ZSA9IDB4MDIxMjsKICB0LlJsaW5lYmVsb3cgPSAweDFlNWU7CiAgdC5SbW9ub3NwYWNlID0gMHhmZjMyOwogIHQuUnNtYWxsID0gMHhmNzcyOwogIHQuUnNtYWxsaW52ZXJ0ZWQgPSAweDAyODE7CiAgdC5Sc21hbGxpbnZlcnRlZHN1cGVyaW9yID0gMHgwMmI2OwogIHQuUyA9IDB4MDA1MzsKICB0LlNGMDEwMDAwID0gMHgyNTBjOwogIHQuU0YwMjAwMDAgPSAweDI1MTQ7CiAgdC5TRjAzMDAwMCA9IDB4MjUxMDsKICB0LlNGMDQwMDAwID0gMHgyNTE4OwogIHQuU0YwNTAwMDAgPSAweDI1M2M7CiAgdC5TRjA2MDAwMCA9IDB4MjUyYzsKICB0LlNGMDcwMDAwID0gMHgyNTM0OwogIHQuU0YwODAwMDAgPSAweDI1MWM7CiAgdC5TRjA5MDAwMCA9IDB4MjUyNDsKICB0LlNGMTAwMDAwID0gMHgyNTAwOwogIHQuU0YxMTAwMDAgPSAweDI1MDI7CiAgdC5TRjE5MDAwMCA9IDB4MjU2MTsKICB0LlNGMjAwMDAwID0gMHgyNTYyOwogIHQuU0YyMTAwMDAgPSAweDI1NTY7CiAgdC5TRjIyMDAwMCA9IDB4MjU1NTsKICB0LlNGMjMwMDAwID0gMHgyNTYzOwogIHQuU0YyNDAwMDAgPSAweDI1NTE7CiAgdC5TRjI1MDAwMCA9IDB4MjU1NzsKICB0LlNGMjYwMDAwID0gMHgyNTVkOwogIHQuU0YyNzAwMDAgPSAweDI1NWM7CiAgdC5TRjI4MDAwMCA9IDB4MjU1YjsKICB0LlNGMzYwMDAwID0gMHgyNTVlOwogIHQuU0YzNzAwMDAgPSAweDI1NWY7CiAgdC5TRjM4MDAwMCA9IDB4MjU1YTsKICB0LlNGMzkwMDAwID0gMHgyNTU0OwogIHQuU0Y0MDAwMDAgPSAweDI1Njk7CiAgdC5TRjQxMDAwMCA9IDB4MjU2NjsKICB0LlNGNDIwMDAwID0gMHgyNTYwOwogIHQuU0Y0MzAwMDAgPSAweDI1NTA7CiAgdC5TRjQ0MDAwMCA9IDB4MjU2YzsKICB0LlNGNDUwMDAwID0gMHgyNTY3OwogIHQuU0Y0NjAwMDAgPSAweDI1Njg7CiAgdC5TRjQ3MDAwMCA9IDB4MjU2NDsKICB0LlNGNDgwMDAwID0gMHgyNTY1OwogIHQuU0Y0OTAwMDAgPSAweDI1NTk7CiAgdC5TRjUwMDAwMCA9IDB4MjU1ODsKICB0LlNGNTEwMDAwID0gMHgyNTUyOwogIHQuU0Y1MjAwMDAgPSAweDI1NTM7CiAgdC5TRjUzMDAwMCA9IDB4MjU2YjsKICB0LlNGNTQwMDAwID0gMHgyNTZhOwogIHQuU2FjdXRlID0gMHgwMTVhOwogIHQuU2FjdXRlZG90YWNjZW50ID0gMHgxZTY0OwogIHQuU2FtcGlncmVlayA9IDB4MDNlMDsKICB0LlNjYXJvbiA9IDB4MDE2MDsKICB0LlNjYXJvbmRvdGFjY2VudCA9IDB4MWU2NjsKICB0LlNjYXJvbnNtYWxsID0gMHhmNmZkOwogIHQuU2NlZGlsbGEgPSAweDAxNWU7CiAgdC5TY2h3YSA9IDB4MDE4ZjsKICB0LlNjaHdhY3lyaWxsaWMgPSAweDA0ZDg7CiAgdC5TY2h3YWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGE7CiAgdC5TY2lyY2xlID0gMHgyNGM4OwogIHQuU2NpcmN1bWZsZXggPSAweDAxNWM7CiAgdC5TY29tbWFhY2NlbnQgPSAweDAyMTg7CiAgdC5TZG90YWNjZW50ID0gMHgxZTYwOwogIHQuU2RvdGJlbG93ID0gMHgxZTYyOwogIHQuU2RvdGJlbG93ZG90YWNjZW50ID0gMHgxZTY4OwogIHQuU2VoYXJtZW5pYW4gPSAweDA1NGQ7CiAgdC5TZXZlbnJvbWFuID0gMHgyMTY2OwogIHQuU2hhYXJtZW5pYW4gPSAweDA1NDc7CiAgdC5TaGFjeXJpbGxpYyA9IDB4MDQyODsKICB0LlNoY2hhY3lyaWxsaWMgPSAweDA0Mjk7CiAgdC5TaGVpY29wdGljID0gMHgwM2UyOwogIHQuU2hoYWN5cmlsbGljID0gMHgwNGJhOwogIHQuU2hpbWFjb3B0aWMgPSAweDAzZWM7CiAgdC5TaWdtYSA9IDB4MDNhMzsKICB0LlNpeHJvbWFuID0gMHgyMTY1OwogIHQuU21vbm9zcGFjZSA9IDB4ZmYzMzsKICB0LlNvZnRzaWduY3lyaWxsaWMgPSAweDA0MmM7CiAgdC5Tc21hbGwgPSAweGY3NzM7CiAgdC5TdGlnbWFncmVlayA9IDB4MDNkYTsKICB0LlQgPSAweDAwNTQ7CiAgdC5UYXUgPSAweDAzYTQ7CiAgdC5UYmFyID0gMHgwMTY2OwogIHQuVGNhcm9uID0gMHgwMTY0OwogIHQuVGNlZGlsbGEgPSAweDAxNjI7CiAgdC5UY2lyY2xlID0gMHgyNGM5OwogIHQuVGNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3MDsKICB0LlRjb21tYWFjY2VudCA9IDB4MDE2MjsKICB0LlRkb3RhY2NlbnQgPSAweDFlNmE7CiAgdC5UZG90YmVsb3cgPSAweDFlNmM7CiAgdC5UZWN5cmlsbGljID0gMHgwNDIyOwogIHQuVGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYzsKICB0LlRlbnJvbWFuID0gMHgyMTY5OwogIHQuVGV0c2VjeXJpbGxpYyA9IDB4MDRiNDsKICB0LlRoZXRhID0gMHgwMzk4OwogIHQuVGhvb2sgPSAweDAxYWM7CiAgdC5UaG9ybiA9IDB4MDBkZTsKICB0LlRob3Juc21hbGwgPSAweGY3ZmU7CiAgdC5UaHJlZXJvbWFuID0gMHgyMTYyOwogIHQuVGlsZGVzbWFsbCA9IDB4ZjZmZTsKICB0LlRpd25hcm1lbmlhbiA9IDB4MDU0ZjsKICB0LlRsaW5lYmVsb3cgPSAweDFlNmU7CiAgdC5UbW9ub3NwYWNlID0gMHhmZjM0OwogIHQuVG9hcm1lbmlhbiA9IDB4MDUzOTsKICB0LlRvbmVmaXZlID0gMHgwMWJjOwogIHQuVG9uZXNpeCA9IDB4MDE4NDsKICB0LlRvbmV0d28gPSAweDAxYTc7CiAgdC5UcmV0cm9mbGV4aG9vayA9IDB4MDFhZTsKICB0LlRzZWN5cmlsbGljID0gMHgwNDI2OwogIHQuVHNoZWN5cmlsbGljID0gMHgwNDBiOwogIHQuVHNtYWxsID0gMHhmNzc0OwogIHQuVHdlbHZlcm9tYW4gPSAweDIxNmI7CiAgdC5Ud29yb21hbiA9IDB4MjE2MTsKICB0LlUgPSAweDAwNTU7CiAgdC5VYWN1dGUgPSAweDAwZGE7CiAgdC5VYWN1dGVzbWFsbCA9IDB4ZjdmYTsKICB0LlVicmV2ZSA9IDB4MDE2YzsKICB0LlVjYXJvbiA9IDB4MDFkMzsKICB0LlVjaXJjbGUgPSAweDI0Y2E7CiAgdC5VY2lyY3VtZmxleCA9IDB4MDBkYjsKICB0LlVjaXJjdW1mbGV4YmVsb3cgPSAweDFlNzY7CiAgdC5VY2lyY3VtZmxleHNtYWxsID0gMHhmN2ZiOwogIHQuVWN5cmlsbGljID0gMHgwNDIzOwogIHQuVWRibGFjdXRlID0gMHgwMTcwOwogIHQuVWRibGdyYXZlID0gMHgwMjE0OwogIHQuVWRpZXJlc2lzID0gMHgwMGRjOwogIHQuVWRpZXJlc2lzYWN1dGUgPSAweDAxZDc7CiAgdC5VZGllcmVzaXNiZWxvdyA9IDB4MWU3MjsKICB0LlVkaWVyZXNpc2Nhcm9uID0gMHgwMWQ5OwogIHQuVWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjA7CiAgdC5VZGllcmVzaXNncmF2ZSA9IDB4MDFkYjsKICB0LlVkaWVyZXNpc21hY3JvbiA9IDB4MDFkNTsKICB0LlVkaWVyZXNpc3NtYWxsID0gMHhmN2ZjOwogIHQuVWRvdGJlbG93ID0gMHgxZWU0OwogIHQuVWdyYXZlID0gMHgwMGQ5OwogIHQuVWdyYXZlc21hbGwgPSAweGY3Zjk7CiAgdC5VaG9va2Fib3ZlID0gMHgxZWU2OwogIHQuVWhvcm4gPSAweDAxYWY7CiAgdC5VaG9ybmFjdXRlID0gMHgxZWU4OwogIHQuVWhvcm5kb3RiZWxvdyA9IDB4MWVmMDsKICB0LlVob3JuZ3JhdmUgPSAweDFlZWE7CiAgdC5VaG9ybmhvb2thYm92ZSA9IDB4MWVlYzsKICB0LlVob3JudGlsZGUgPSAweDFlZWU7CiAgdC5VaHVuZ2FydW1sYXV0ID0gMHgwMTcwOwogIHQuVWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYyOwogIHQuVWludmVydGVkYnJldmUgPSAweDAyMTY7CiAgdC5Va2N5cmlsbGljID0gMHgwNDc4OwogIHQuVW1hY3JvbiA9IDB4MDE2YTsKICB0LlVtYWNyb25jeXJpbGxpYyA9IDB4MDRlZTsKICB0LlVtYWNyb25kaWVyZXNpcyA9IDB4MWU3YTsKICB0LlVtb25vc3BhY2UgPSAweGZmMzU7CiAgdC5Vb2dvbmVrID0gMHgwMTcyOwogIHQuVXBzaWxvbiA9IDB4MDNhNTsKICB0LlVwc2lsb24xID0gMHgwM2QyOwogIHQuVXBzaWxvbmFjdXRlaG9va3N5bWJvbGdyZWVrID0gMHgwM2QzOwogIHQuVXBzaWxvbmFmcmljYW4gPSAweDAxYjE7CiAgdC5VcHNpbG9uZGllcmVzaXMgPSAweDAzYWI7CiAgdC5VcHNpbG9uZGllcmVzaXNob29rc3ltYm9sZ3JlZWsgPSAweDAzZDQ7CiAgdC5VcHNpbG9uaG9va3N5bWJvbCA9IDB4MDNkMjsKICB0LlVwc2lsb250b25vcyA9IDB4MDM4ZTsKICB0LlVyaW5nID0gMHgwMTZlOwogIHQuVXNob3J0Y3lyaWxsaWMgPSAweDA0MGU7CiAgdC5Vc21hbGwgPSAweGY3NzU7CiAgdC5Vc3RyYWlnaHRjeXJpbGxpYyA9IDB4MDRhZTsKICB0LlVzdHJhaWdodHN0cm9rZWN5cmlsbGljID0gMHgwNGIwOwogIHQuVXRpbGRlID0gMHgwMTY4OwogIHQuVXRpbGRlYWN1dGUgPSAweDFlNzg7CiAgdC5VdGlsZGViZWxvdyA9IDB4MWU3NDsKICB0LlYgPSAweDAwNTY7CiAgdC5WY2lyY2xlID0gMHgyNGNiOwogIHQuVmRvdGJlbG93ID0gMHgxZTdlOwogIHQuVmVjeXJpbGxpYyA9IDB4MDQxMjsKICB0LlZld2FybWVuaWFuID0gMHgwNTRlOwogIHQuVmhvb2sgPSAweDAxYjI7CiAgdC5WbW9ub3NwYWNlID0gMHhmZjM2OwogIHQuVm9hcm1lbmlhbiA9IDB4MDU0ODsKICB0LlZzbWFsbCA9IDB4Zjc3NjsKICB0LlZ0aWxkZSA9IDB4MWU3YzsKICB0LlcgPSAweDAwNTc7CiAgdC5XYWN1dGUgPSAweDFlODI7CiAgdC5XY2lyY2xlID0gMHgyNGNjOwogIHQuV2NpcmN1bWZsZXggPSAweDAxNzQ7CiAgdC5XZGllcmVzaXMgPSAweDFlODQ7CiAgdC5XZG90YWNjZW50ID0gMHgxZTg2OwogIHQuV2RvdGJlbG93ID0gMHgxZTg4OwogIHQuV2dyYXZlID0gMHgxZTgwOwogIHQuV21vbm9zcGFjZSA9IDB4ZmYzNzsKICB0LldzbWFsbCA9IDB4Zjc3NzsKICB0LlggPSAweDAwNTg7CiAgdC5YY2lyY2xlID0gMHgyNGNkOwogIHQuWGRpZXJlc2lzID0gMHgxZThjOwogIHQuWGRvdGFjY2VudCA9IDB4MWU4YTsKICB0LlhlaGFybWVuaWFuID0gMHgwNTNkOwogIHQuWGkgPSAweDAzOWU7CiAgdC5YbW9ub3NwYWNlID0gMHhmZjM4OwogIHQuWHNtYWxsID0gMHhmNzc4OwogIHQuWSA9IDB4MDA1OTsKICB0LllhY3V0ZSA9IDB4MDBkZDsKICB0LllhY3V0ZXNtYWxsID0gMHhmN2ZkOwogIHQuWWF0Y3lyaWxsaWMgPSAweDA0NjI7CiAgdC5ZY2lyY2xlID0gMHgyNGNlOwogIHQuWWNpcmN1bWZsZXggPSAweDAxNzY7CiAgdC5ZZGllcmVzaXMgPSAweDAxNzg7CiAgdC5ZZGllcmVzaXNzbWFsbCA9IDB4ZjdmZjsKICB0Lllkb3RhY2NlbnQgPSAweDFlOGU7CiAgdC5ZZG90YmVsb3cgPSAweDFlZjQ7CiAgdC5ZZXJpY3lyaWxsaWMgPSAweDA0MmI7CiAgdC5ZZXJ1ZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmODsKICB0LllncmF2ZSA9IDB4MWVmMjsKICB0Lllob29rID0gMHgwMWIzOwogIHQuWWhvb2thYm92ZSA9IDB4MWVmNjsKICB0LllpYXJtZW5pYW4gPSAweDA1NDU7CiAgdC5ZaWN5cmlsbGljID0gMHgwNDA3OwogIHQuWWl3bmFybWVuaWFuID0gMHgwNTUyOwogIHQuWW1vbm9zcGFjZSA9IDB4ZmYzOTsKICB0LllzbWFsbCA9IDB4Zjc3OTsKICB0Lll0aWxkZSA9IDB4MWVmODsKICB0Lll1c2JpZ2N5cmlsbGljID0gMHgwNDZhOwogIHQuWXVzYmlnaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2YzsKICB0Lll1c2xpdHRsZWN5cmlsbGljID0gMHgwNDY2OwogIHQuWXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2ODsKICB0LlogPSAweDAwNWE7CiAgdC5aYWFybWVuaWFuID0gMHgwNTM2OwogIHQuWmFjdXRlID0gMHgwMTc5OwogIHQuWmNhcm9uID0gMHgwMTdkOwogIHQuWmNhcm9uc21hbGwgPSAweGY2ZmY7CiAgdC5aY2lyY2xlID0gMHgyNGNmOwogIHQuWmNpcmN1bWZsZXggPSAweDFlOTA7CiAgdC5aZG90ID0gMHgwMTdiOwogIHQuWmRvdGFjY2VudCA9IDB4MDE3YjsKICB0Llpkb3RiZWxvdyA9IDB4MWU5MjsKICB0LlplY3lyaWxsaWMgPSAweDA0MTc7CiAgdC5aZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk4OwogIHQuWmVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRlOwogIHQuWmV0YSA9IDB4MDM5NjsKICB0LlpoZWFybWVuaWFuID0gMHgwNTNhOwogIHQuWmhlYnJldmVjeXJpbGxpYyA9IDB4MDRjMTsKICB0LlpoZWN5cmlsbGljID0gMHgwNDE2OwogIHQuWmhlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTY7CiAgdC5aaGVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRjOwogIHQuWmxpbmViZWxvdyA9IDB4MWU5NDsKICB0Llptb25vc3BhY2UgPSAweGZmM2E7CiAgdC5ac21hbGwgPSAweGY3N2E7CiAgdC5ac3Ryb2tlID0gMHgwMWI1OwogIHQuYSA9IDB4MDA2MTsKICB0LmFhYmVuZ2FsaSA9IDB4MDk4NjsKICB0LmFhY3V0ZSA9IDB4MDBlMTsKICB0LmFhZGV2YSA9IDB4MDkwNjsKICB0LmFhZ3VqYXJhdGkgPSAweDBhODY7CiAgdC5hYWd1cm11a2hpID0gMHgwYTA2OwogIHQuYWFtYXRyYWd1cm11a2hpID0gMHgwYTNlOwogIHQuYWFydXNxdWFyZSA9IDB4MzMwMzsKICB0LmFhdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDliZTsKICB0LmFhdm93ZWxzaWduZGV2YSA9IDB4MDkzZTsKICB0LmFhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYmU7CiAgdC5hYmJyZXZpYXRpb25tYXJrYXJtZW5pYW4gPSAweDA1NWY7CiAgdC5hYmJyZXZpYXRpb25zaWduZGV2YSA9IDB4MDk3MDsKICB0LmFiZW5nYWxpID0gMHgwOTg1OwogIHQuYWJvcG9tb2ZvID0gMHgzMTFhOwogIHQuYWJyZXZlID0gMHgwMTAzOwogIHQuYWJyZXZlYWN1dGUgPSAweDFlYWY7CiAgdC5hYnJldmVjeXJpbGxpYyA9IDB4MDRkMTsKICB0LmFicmV2ZWRvdGJlbG93ID0gMHgxZWI3OwogIHQuYWJyZXZlZ3JhdmUgPSAweDFlYjE7CiAgdC5hYnJldmVob29rYWJvdmUgPSAweDFlYjM7CiAgdC5hYnJldmV0aWxkZSA9IDB4MWViNTsKICB0LmFjYXJvbiA9IDB4MDFjZTsKICB0LmFjaXJjbGUgPSAweDI0ZDA7CiAgdC5hY2lyY3VtZmxleCA9IDB4MDBlMjsKICB0LmFjaXJjdW1mbGV4YWN1dGUgPSAweDFlYTU7CiAgdC5hY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWFkOwogIHQuYWNpcmN1bWZsZXhncmF2ZSA9IDB4MWVhNzsKICB0LmFjaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWE5OwogIHQuYWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVhYjsKICB0LmFjdXRlID0gMHgwMGI0OwogIHQuYWN1dGViZWxvd2NtYiA9IDB4MDMxNzsKICB0LmFjdXRlY21iID0gMHgwMzAxOwogIHQuYWN1dGVjb21iID0gMHgwMzAxOwogIHQuYWN1dGVkZXZhID0gMHgwOTU0OwogIHQuYWN1dGVsb3dtb2QgPSAweDAyY2Y7CiAgdC5hY3V0ZXRvbmVjbWIgPSAweDAzNDE7CiAgdC5hY3lyaWxsaWMgPSAweDA0MzA7CiAgdC5hZGJsZ3JhdmUgPSAweDAyMDE7CiAgdC5hZGRha2d1cm11a2hpID0gMHgwYTcxOwogIHQuYWRldmEgPSAweDA5MDU7CiAgdC5hZGllcmVzaXMgPSAweDAwZTQ7CiAgdC5hZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkMzsKICB0LmFkaWVyZXNpc21hY3JvbiA9IDB4MDFkZjsKICB0LmFkb3RiZWxvdyA9IDB4MWVhMTsKICB0LmFkb3RtYWNyb24gPSAweDAxZTE7CiAgdC5hZSA9IDB4MDBlNjsKICB0LmFlYWN1dGUgPSAweDAxZmQ7CiAgdC5hZWtvcmVhbiA9IDB4MzE1MDsKICB0LmFlbWFjcm9uID0gMHgwMWUzOwogIHQuYWZpaTAwMjA4ID0gMHgyMDE1OwogIHQuYWZpaTA4OTQxID0gMHgyMGE0OwogIHQuYWZpaTEwMDE3ID0gMHgwNDEwOwogIHQuYWZpaTEwMDE4ID0gMHgwNDExOwogIHQuYWZpaTEwMDE5ID0gMHgwNDEyOwogIHQuYWZpaTEwMDIwID0gMHgwNDEzOwogIHQuYWZpaTEwMDIxID0gMHgwNDE0OwogIHQuYWZpaTEwMDIyID0gMHgwNDE1OwogIHQuYWZpaTEwMDIzID0gMHgwNDAxOwogIHQuYWZpaTEwMDI0ID0gMHgwNDE2OwogIHQuYWZpaTEwMDI1ID0gMHgwNDE3OwogIHQuYWZpaTEwMDI2ID0gMHgwNDE4OwogIHQuYWZpaTEwMDI3ID0gMHgwNDE5OwogIHQuYWZpaTEwMDI4ID0gMHgwNDFhOwogIHQuYWZpaTEwMDI5ID0gMHgwNDFiOwogIHQuYWZpaTEwMDMwID0gMHgwNDFjOwogIHQuYWZpaTEwMDMxID0gMHgwNDFkOwogIHQuYWZpaTEwMDMyID0gMHgwNDFlOwogIHQuYWZpaTEwMDMzID0gMHgwNDFmOwogIHQuYWZpaTEwMDM0ID0gMHgwNDIwOwogIHQuYWZpaTEwMDM1ID0gMHgwNDIxOwogIHQuYWZpaTEwMDM2ID0gMHgwNDIyOwogIHQuYWZpaTEwMDM3ID0gMHgwNDIzOwogIHQuYWZpaTEwMDM4ID0gMHgwNDI0OwogIHQuYWZpaTEwMDM5ID0gMHgwNDI1OwogIHQuYWZpaTEwMDQwID0gMHgwNDI2OwogIHQuYWZpaTEwMDQxID0gMHgwNDI3OwogIHQuYWZpaTEwMDQyID0gMHgwNDI4OwogIHQuYWZpaTEwMDQzID0gMHgwNDI5OwogIHQuYWZpaTEwMDQ0ID0gMHgwNDJhOwogIHQuYWZpaTEwMDQ1ID0gMHgwNDJiOwogIHQuYWZpaTEwMDQ2ID0gMHgwNDJjOwogIHQuYWZpaTEwMDQ3ID0gMHgwNDJkOwogIHQuYWZpaTEwMDQ4ID0gMHgwNDJlOwogIHQuYWZpaTEwMDQ5ID0gMHgwNDJmOwogIHQuYWZpaTEwMDUwID0gMHgwNDkwOwogIHQuYWZpaTEwMDUxID0gMHgwNDAyOwogIHQuYWZpaTEwMDUyID0gMHgwNDAzOwogIHQuYWZpaTEwMDUzID0gMHgwNDA0OwogIHQuYWZpaTEwMDU0ID0gMHgwNDA1OwogIHQuYWZpaTEwMDU1ID0gMHgwNDA2OwogIHQuYWZpaTEwMDU2ID0gMHgwNDA3OwogIHQuYWZpaTEwMDU3ID0gMHgwNDA4OwogIHQuYWZpaTEwMDU4ID0gMHgwNDA5OwogIHQuYWZpaTEwMDU5ID0gMHgwNDBhOwogIHQuYWZpaTEwMDYwID0gMHgwNDBiOwogIHQuYWZpaTEwMDYxID0gMHgwNDBjOwogIHQuYWZpaTEwMDYyID0gMHgwNDBlOwogIHQuYWZpaTEwMDYzID0gMHhmNmM0OwogIHQuYWZpaTEwMDY0ID0gMHhmNmM1OwogIHQuYWZpaTEwMDY1ID0gMHgwNDMwOwogIHQuYWZpaTEwMDY2ID0gMHgwNDMxOwogIHQuYWZpaTEwMDY3ID0gMHgwNDMyOwogIHQuYWZpaTEwMDY4ID0gMHgwNDMzOwogIHQuYWZpaTEwMDY5ID0gMHgwNDM0OwogIHQuYWZpaTEwMDcwID0gMHgwNDM1OwogIHQuYWZpaTEwMDcxID0gMHgwNDUxOwogIHQuYWZpaTEwMDcyID0gMHgwNDM2OwogIHQuYWZpaTEwMDczID0gMHgwNDM3OwogIHQuYWZpaTEwMDc0ID0gMHgwNDM4OwogIHQuYWZpaTEwMDc1ID0gMHgwNDM5OwogIHQuYWZpaTEwMDc2ID0gMHgwNDNhOwogIHQuYWZpaTEwMDc3ID0gMHgwNDNiOwogIHQuYWZpaTEwMDc4ID0gMHgwNDNjOwogIHQuYWZpaTEwMDc5ID0gMHgwNDNkOwogIHQuYWZpaTEwMDgwID0gMHgwNDNlOwogIHQuYWZpaTEwMDgxID0gMHgwNDNmOwogIHQuYWZpaTEwMDgyID0gMHgwNDQwOwogIHQuYWZpaTEwMDgzID0gMHgwNDQxOwogIHQuYWZpaTEwMDg0ID0gMHgwNDQyOwogIHQuYWZpaTEwMDg1ID0gMHgwNDQzOwogIHQuYWZpaTEwMDg2ID0gMHgwNDQ0OwogIHQuYWZpaTEwMDg3ID0gMHgwNDQ1OwogIHQuYWZpaTEwMDg4ID0gMHgwNDQ2OwogIHQuYWZpaTEwMDg5ID0gMHgwNDQ3OwogIHQuYWZpaTEwMDkwID0gMHgwNDQ4OwogIHQuYWZpaTEwMDkxID0gMHgwNDQ5OwogIHQuYWZpaTEwMDkyID0gMHgwNDRhOwogIHQuYWZpaTEwMDkzID0gMHgwNDRiOwogIHQuYWZpaTEwMDk0ID0gMHgwNDRjOwogIHQuYWZpaTEwMDk1ID0gMHgwNDRkOwogIHQuYWZpaTEwMDk2ID0gMHgwNDRlOwogIHQuYWZpaTEwMDk3ID0gMHgwNDRmOwogIHQuYWZpaTEwMDk4ID0gMHgwNDkxOwogIHQuYWZpaTEwMDk5ID0gMHgwNDUyOwogIHQuYWZpaTEwMTAwID0gMHgwNDUzOwogIHQuYWZpaTEwMTAxID0gMHgwNDU0OwogIHQuYWZpaTEwMTAyID0gMHgwNDU1OwogIHQuYWZpaTEwMTAzID0gMHgwNDU2OwogIHQuYWZpaTEwMTA0ID0gMHgwNDU3OwogIHQuYWZpaTEwMTA1ID0gMHgwNDU4OwogIHQuYWZpaTEwMTA2ID0gMHgwNDU5OwogIHQuYWZpaTEwMTA3ID0gMHgwNDVhOwogIHQuYWZpaTEwMTA4ID0gMHgwNDViOwogIHQuYWZpaTEwMTA5ID0gMHgwNDVjOwogIHQuYWZpaTEwMTEwID0gMHgwNDVlOwogIHQuYWZpaTEwMTQ1ID0gMHgwNDBmOwogIHQuYWZpaTEwMTQ2ID0gMHgwNDYyOwogIHQuYWZpaTEwMTQ3ID0gMHgwNDcyOwogIHQuYWZpaTEwMTQ4ID0gMHgwNDc0OwogIHQuYWZpaTEwMTkyID0gMHhmNmM2OwogIHQuYWZpaTEwMTkzID0gMHgwNDVmOwogIHQuYWZpaTEwMTk0ID0gMHgwNDYzOwogIHQuYWZpaTEwMTk1ID0gMHgwNDczOwogIHQuYWZpaTEwMTk2ID0gMHgwNDc1OwogIHQuYWZpaTEwODMxID0gMHhmNmM3OwogIHQuYWZpaTEwODMyID0gMHhmNmM4OwogIHQuYWZpaTEwODQ2ID0gMHgwNGQ5OwogIHQuYWZpaTI5OSA9IDB4MjAwZTsKICB0LmFmaWkzMDAgPSAweDIwMGY7CiAgdC5hZmlpMzAxID0gMHgyMDBkOwogIHQuYWZpaTU3MzgxID0gMHgwNjZhOwogIHQuYWZpaTU3Mzg4ID0gMHgwNjBjOwogIHQuYWZpaTU3MzkyID0gMHgwNjYwOwogIHQuYWZpaTU3MzkzID0gMHgwNjYxOwogIHQuYWZpaTU3Mzk0ID0gMHgwNjYyOwogIHQuYWZpaTU3Mzk1ID0gMHgwNjYzOwogIHQuYWZpaTU3Mzk2ID0gMHgwNjY0OwogIHQuYWZpaTU3Mzk3ID0gMHgwNjY1OwogIHQuYWZpaTU3Mzk4ID0gMHgwNjY2OwogIHQuYWZpaTU3Mzk5ID0gMHgwNjY3OwogIHQuYWZpaTU3NDAwID0gMHgwNjY4OwogIHQuYWZpaTU3NDAxID0gMHgwNjY5OwogIHQuYWZpaTU3NDAzID0gMHgwNjFiOwogIHQuYWZpaTU3NDA3ID0gMHgwNjFmOwogIHQuYWZpaTU3NDA5ID0gMHgwNjIxOwogIHQuYWZpaTU3NDEwID0gMHgwNjIyOwogIHQuYWZpaTU3NDExID0gMHgwNjIzOwogIHQuYWZpaTU3NDEyID0gMHgwNjI0OwogIHQuYWZpaTU3NDEzID0gMHgwNjI1OwogIHQuYWZpaTU3NDE0ID0gMHgwNjI2OwogIHQuYWZpaTU3NDE1ID0gMHgwNjI3OwogIHQuYWZpaTU3NDE2ID0gMHgwNjI4OwogIHQuYWZpaTU3NDE3ID0gMHgwNjI5OwogIHQuYWZpaTU3NDE4ID0gMHgwNjJhOwogIHQuYWZpaTU3NDE5ID0gMHgwNjJiOwogIHQuYWZpaTU3NDIwID0gMHgwNjJjOwogIHQuYWZpaTU3NDIxID0gMHgwNjJkOwogIHQuYWZpaTU3NDIyID0gMHgwNjJlOwogIHQuYWZpaTU3NDIzID0gMHgwNjJmOwogIHQuYWZpaTU3NDI0ID0gMHgwNjMwOwogIHQuYWZpaTU3NDI1ID0gMHgwNjMxOwogIHQuYWZpaTU3NDI2ID0gMHgwNjMyOwogIHQuYWZpaTU3NDI3ID0gMHgwNjMzOwogIHQuYWZpaTU3NDI4ID0gMHgwNjM0OwogIHQuYWZpaTU3NDI5ID0gMHgwNjM1OwogIHQuYWZpaTU3NDMwID0gMHgwNjM2OwogIHQuYWZpaTU3NDMxID0gMHgwNjM3OwogIHQuYWZpaTU3NDMyID0gMHgwNjM4OwogIHQuYWZpaTU3NDMzID0gMHgwNjM5OwogIHQuYWZpaTU3NDM0ID0gMHgwNjNhOwogIHQuYWZpaTU3NDQwID0gMHgwNjQwOwogIHQuYWZpaTU3NDQxID0gMHgwNjQxOwogIHQuYWZpaTU3NDQyID0gMHgwNjQyOwogIHQuYWZpaTU3NDQzID0gMHgwNjQzOwogIHQuYWZpaTU3NDQ0ID0gMHgwNjQ0OwogIHQuYWZpaTU3NDQ1ID0gMHgwNjQ1OwogIHQuYWZpaTU3NDQ2ID0gMHgwNjQ2OwogIHQuYWZpaTU3NDQ4ID0gMHgwNjQ4OwogIHQuYWZpaTU3NDQ5ID0gMHgwNjQ5OwogIHQuYWZpaTU3NDUwID0gMHgwNjRhOwogIHQuYWZpaTU3NDUxID0gMHgwNjRiOwogIHQuYWZpaTU3NDUyID0gMHgwNjRjOwogIHQuYWZpaTU3NDUzID0gMHgwNjRkOwogIHQuYWZpaTU3NDU0ID0gMHgwNjRlOwogIHQuYWZpaTU3NDU1ID0gMHgwNjRmOwogIHQuYWZpaTU3NDU2ID0gMHgwNjUwOwogIHQuYWZpaTU3NDU3ID0gMHgwNjUxOwogIHQuYWZpaTU3NDU4ID0gMHgwNjUyOwogIHQuYWZpaTU3NDcwID0gMHgwNjQ3OwogIHQuYWZpaTU3NTA1ID0gMHgwNmE0OwogIHQuYWZpaTU3NTA2ID0gMHgwNjdlOwogIHQuYWZpaTU3NTA3ID0gMHgwNjg2OwogIHQuYWZpaTU3NTA4ID0gMHgwNjk4OwogIHQuYWZpaTU3NTA5ID0gMHgwNmFmOwogIHQuYWZpaTU3NTExID0gMHgwNjc5OwogIHQuYWZpaTU3NTEyID0gMHgwNjg4OwogIHQuYWZpaTU3NTEzID0gMHgwNjkxOwogIHQuYWZpaTU3NTE0ID0gMHgwNmJhOwogIHQuYWZpaTU3NTE5ID0gMHgwNmQyOwogIHQuYWZpaTU3NTM0ID0gMHgwNmQ1OwogIHQuYWZpaTU3NjM2ID0gMHgyMGFhOwogIHQuYWZpaTU3NjQ1ID0gMHgwNWJlOwogIHQuYWZpaTU3NjU4ID0gMHgwNWMzOwogIHQuYWZpaTU3NjY0ID0gMHgwNWQwOwogIHQuYWZpaTU3NjY1ID0gMHgwNWQxOwogIHQuYWZpaTU3NjY2ID0gMHgwNWQyOwogIHQuYWZpaTU3NjY3ID0gMHgwNWQzOwogIHQuYWZpaTU3NjY4ID0gMHgwNWQ0OwogIHQuYWZpaTU3NjY5ID0gMHgwNWQ1OwogIHQuYWZpaTU3NjcwID0gMHgwNWQ2OwogIHQuYWZpaTU3NjcxID0gMHgwNWQ3OwogIHQuYWZpaTU3NjcyID0gMHgwNWQ4OwogIHQuYWZpaTU3NjczID0gMHgwNWQ5OwogIHQuYWZpaTU3Njc0ID0gMHgwNWRhOwogIHQuYWZpaTU3Njc1ID0gMHgwNWRiOwogIHQuYWZpaTU3Njc2ID0gMHgwNWRjOwogIHQuYWZpaTU3Njc3ID0gMHgwNWRkOwogIHQuYWZpaTU3Njc4ID0gMHgwNWRlOwogIHQuYWZpaTU3Njc5ID0gMHgwNWRmOwogIHQuYWZpaTU3NjgwID0gMHgwNWUwOwogIHQuYWZpaTU3NjgxID0gMHgwNWUxOwogIHQuYWZpaTU3NjgyID0gMHgwNWUyOwogIHQuYWZpaTU3NjgzID0gMHgwNWUzOwogIHQuYWZpaTU3Njg0ID0gMHgwNWU0OwogIHQuYWZpaTU3Njg1ID0gMHgwNWU1OwogIHQuYWZpaTU3Njg2ID0gMHgwNWU2OwogIHQuYWZpaTU3Njg3ID0gMHgwNWU3OwogIHQuYWZpaTU3Njg4ID0gMHgwNWU4OwogIHQuYWZpaTU3Njg5ID0gMHgwNWU5OwogIHQuYWZpaTU3NjkwID0gMHgwNWVhOwogIHQuYWZpaTU3Njk0ID0gMHhmYjJhOwogIHQuYWZpaTU3Njk1ID0gMHhmYjJiOwogIHQuYWZpaTU3NzAwID0gMHhmYjRiOwogIHQuYWZpaTU3NzA1ID0gMHhmYjFmOwogIHQuYWZpaTU3NzE2ID0gMHgwNWYwOwogIHQuYWZpaTU3NzE3ID0gMHgwNWYxOwogIHQuYWZpaTU3NzE4ID0gMHgwNWYyOwogIHQuYWZpaTU3NzIzID0gMHhmYjM1OwogIHQuYWZpaTU3NzkzID0gMHgwNWI0OwogIHQuYWZpaTU3Nzk0ID0gMHgwNWI1OwogIHQuYWZpaTU3Nzk1ID0gMHgwNWI2OwogIHQuYWZpaTU3Nzk2ID0gMHgwNWJiOwogIHQuYWZpaTU3Nzk3ID0gMHgwNWI4OwogIHQuYWZpaTU3Nzk4ID0gMHgwNWI3OwogIHQuYWZpaTU3Nzk5ID0gMHgwNWIwOwogIHQuYWZpaTU3ODAwID0gMHgwNWIyOwogIHQuYWZpaTU3ODAxID0gMHgwNWIxOwogIHQuYWZpaTU3ODAyID0gMHgwNWIzOwogIHQuYWZpaTU3ODAzID0gMHgwNWMyOwogIHQuYWZpaTU3ODA0ID0gMHgwNWMxOwogIHQuYWZpaTU3ODA2ID0gMHgwNWI5OwogIHQuYWZpaTU3ODA3ID0gMHgwNWJjOwogIHQuYWZpaTU3ODM5ID0gMHgwNWJkOwogIHQuYWZpaTU3ODQxID0gMHgwNWJmOwogIHQuYWZpaTU3ODQyID0gMHgwNWMwOwogIHQuYWZpaTU3OTI5ID0gMHgwMmJjOwogIHQuYWZpaTYxMjQ4ID0gMHgyMTA1OwogIHQuYWZpaTYxMjg5ID0gMHgyMTEzOwogIHQuYWZpaTYxMzUyID0gMHgyMTE2OwogIHQuYWZpaTYxNTczID0gMHgyMDJjOwogIHQuYWZpaTYxNTc0ID0gMHgyMDJkOwogIHQuYWZpaTYxNTc1ID0gMHgyMDJlOwogIHQuYWZpaTYxNjY0ID0gMHgyMDBjOwogIHQuYWZpaTYzMTY3ID0gMHgwNjZkOwogIHQuYWZpaTY0OTM3ID0gMHgwMmJkOwogIHQuYWdyYXZlID0gMHgwMGUwOwogIHQuYWd1amFyYXRpID0gMHgwYTg1OwogIHQuYWd1cm11a2hpID0gMHgwYTA1OwogIHQuYWhpcmFnYW5hID0gMHgzMDQyOwogIHQuYWhvb2thYm92ZSA9IDB4MWVhMzsKICB0LmFpYmVuZ2FsaSA9IDB4MDk5MDsKICB0LmFpYm9wb21vZm8gPSAweDMxMWU7CiAgdC5haWRldmEgPSAweDA5MTA7CiAgdC5haWVjeXJpbGxpYyA9IDB4MDRkNTsKICB0LmFpZ3VqYXJhdGkgPSAweDBhOTA7CiAgdC5haWd1cm11a2hpID0gMHgwYTEwOwogIHQuYWltYXRyYWd1cm11a2hpID0gMHgwYTQ4OwogIHQuYWluYXJhYmljID0gMHgwNjM5OwogIHQuYWluZmluYWxhcmFiaWMgPSAweGZlY2E7CiAgdC5haW5pbml0aWFsYXJhYmljID0gMHhmZWNiOwogIHQuYWlubWVkaWFsYXJhYmljID0gMHhmZWNjOwogIHQuYWludmVydGVkYnJldmUgPSAweDAyMDM7CiAgdC5haXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzg7CiAgdC5haXZvd2Vsc2lnbmRldmEgPSAweDA5NDg7CiAgdC5haXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM4OwogIHQuYWthdGFrYW5hID0gMHgzMGEyOwogIHQuYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjcxOwogIHQuYWtvcmVhbiA9IDB4MzE0ZjsKICB0LmFsZWYgPSAweDA1ZDA7CiAgdC5hbGVmYXJhYmljID0gMHgwNjI3OwogIHQuYWxlZmRhZ2VzaGhlYnJldyA9IDB4ZmIzMDsKICB0LmFsZWZmaW5hbGFyYWJpYyA9IDB4ZmU4ZTsKICB0LmFsZWZoYW16YWFib3ZlYXJhYmljID0gMHgwNjIzOwogIHQuYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4NDsKICB0LmFsZWZoYW16YWJlbG93YXJhYmljID0gMHgwNjI1OwogIHQuYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYyA9IDB4ZmU4ODsKICB0LmFsZWZoZWJyZXcgPSAweDA1ZDA7CiAgdC5hbGVmbGFtZWRoZWJyZXcgPSAweGZiNGY7CiAgdC5hbGVmbWFkZGFhYm92ZWFyYWJpYyA9IDB4MDYyMjsKICB0LmFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODI7CiAgdC5hbGVmbWFrc3VyYWFyYWJpYyA9IDB4MDY0OTsKICB0LmFsZWZtYWtzdXJhZmluYWxhcmFiaWMgPSAweGZlZjA7CiAgdC5hbGVmbWFrc3VyYWluaXRpYWxhcmFiaWMgPSAweGZlZjM7CiAgdC5hbGVmbWFrc3VyYW1lZGlhbGFyYWJpYyA9IDB4ZmVmNDsKICB0LmFsZWZwYXRhaGhlYnJldyA9IDB4ZmIyZTsKICB0LmFsZWZxYW1hdHNoZWJyZXcgPSAweGZiMmY7CiAgdC5hbGVwaCA9IDB4MjEzNTsKICB0LmFsbGVxdWFsID0gMHgyMjRjOwogIHQuYWxwaGEgPSAweDAzYjE7CiAgdC5hbHBoYXRvbm9zID0gMHgwM2FjOwogIHQuYW1hY3JvbiA9IDB4MDEwMTsKICB0LmFtb25vc3BhY2UgPSAweGZmNDE7CiAgdC5hbXBlcnNhbmQgPSAweDAwMjY7CiAgdC5hbXBlcnNhbmRtb25vc3BhY2UgPSAweGZmMDY7CiAgdC5hbXBlcnNhbmRzbWFsbCA9IDB4ZjcyNjsKICB0LmFtc3F1YXJlID0gMHgzM2MyOwogIHQuYW5ib3BvbW9mbyA9IDB4MzEyMjsKICB0LmFuZ2JvcG9tb2ZvID0gMHgzMTI0OwogIHQuYW5nYnJhY2tldGxlZnQgPSAweDMwMDg7CiAgdC5hbmdicmFja2V0cmlnaHQgPSAweDMwMDk7CiAgdC5hbmdraGFua2h1dGhhaSA9IDB4MGU1YTsKICB0LmFuZ2xlID0gMHgyMjIwOwogIHQuYW5nbGVicmFja2V0bGVmdCA9IDB4MzAwODsKICB0LmFuZ2xlYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzZjsKICB0LmFuZ2xlYnJhY2tldHJpZ2h0ID0gMHgzMDA5OwogIHQuYW5nbGVicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmU0MDsKICB0LmFuZ2xlbGVmdCA9IDB4MjMyOTsKICB0LmFuZ2xlcmlnaHQgPSAweDIzMmE7CiAgdC5hbmdzdHJvbSA9IDB4MjEyYjsKICB0LmFub3RlbGVpYSA9IDB4MDM4NzsKICB0LmFudWRhdHRhZGV2YSA9IDB4MDk1MjsKICB0LmFudXN2YXJhYmVuZ2FsaSA9IDB4MDk4MjsKICB0LmFudXN2YXJhZGV2YSA9IDB4MDkwMjsKICB0LmFudXN2YXJhZ3VqYXJhdGkgPSAweDBhODI7CiAgdC5hb2dvbmVrID0gMHgwMTA1OwogIHQuYXBhYXRvc3F1YXJlID0gMHgzMzAwOwogIHQuYXBhcmVuID0gMHgyNDljOwogIHQuYXBvc3Ryb3BoZWFybWVuaWFuID0gMHgwNTVhOwogIHQuYXBvc3Ryb3BoZW1vZCA9IDB4MDJiYzsKICB0LmFwcGxlID0gMHhmOGZmOwogIHQuYXBwcm9hY2hlcyA9IDB4MjI1MDsKICB0LmFwcHJveGVxdWFsID0gMHgyMjQ4OwogIHQuYXBwcm94ZXF1YWxvcmltYWdlID0gMHgyMjUyOwogIHQuYXBwcm94aW1hdGVseWVxdWFsID0gMHgyMjQ1OwogIHQuYXJhZWFla29yZWFuID0gMHgzMThlOwogIHQuYXJhZWFrb3JlYW4gPSAweDMxOGQ7CiAgdC5hcmMgPSAweDIzMTI7CiAgdC5hcmlnaHRoYWxmcmluZyA9IDB4MWU5YTsKICB0LmFyaW5nID0gMHgwMGU1OwogIHQuYXJpbmdhY3V0ZSA9IDB4MDFmYjsKICB0LmFyaW5nYmVsb3cgPSAweDFlMDE7CiAgdC5hcnJvd2JvdGggPSAweDIxOTQ7CiAgdC5hcnJvd2Rhc2hkb3duID0gMHgyMWUzOwogIHQuYXJyb3dkYXNobGVmdCA9IDB4MjFlMDsKICB0LmFycm93ZGFzaHJpZ2h0ID0gMHgyMWUyOwogIHQuYXJyb3dkYXNodXAgPSAweDIxZTE7CiAgdC5hcnJvd2RibGJvdGggPSAweDIxZDQ7CiAgdC5hcnJvd2RibGRvd24gPSAweDIxZDM7CiAgdC5hcnJvd2RibGxlZnQgPSAweDIxZDA7CiAgdC5hcnJvd2RibHJpZ2h0ID0gMHgyMWQyOwogIHQuYXJyb3dkYmx1cCA9IDB4MjFkMTsKICB0LmFycm93ZG93biA9IDB4MjE5MzsKICB0LmFycm93ZG93bmxlZnQgPSAweDIxOTk7CiAgdC5hcnJvd2Rvd25yaWdodCA9IDB4MjE5ODsKICB0LmFycm93ZG93bndoaXRlID0gMHgyMWU5OwogIHQuYXJyb3doZWFkZG93bm1vZCA9IDB4MDJjNTsKICB0LmFycm93aGVhZGxlZnRtb2QgPSAweDAyYzI7CiAgdC5hcnJvd2hlYWRyaWdodG1vZCA9IDB4MDJjMzsKICB0LmFycm93aGVhZHVwbW9kID0gMHgwMmM0OwogIHQuYXJyb3dob3JpemV4ID0gMHhmOGU3OwogIHQuYXJyb3dsZWZ0ID0gMHgyMTkwOwogIHQuYXJyb3dsZWZ0ZGJsID0gMHgyMWQwOwogIHQuYXJyb3dsZWZ0ZGJsc3Ryb2tlID0gMHgyMWNkOwogIHQuYXJyb3dsZWZ0b3ZlcnJpZ2h0ID0gMHgyMWM2OwogIHQuYXJyb3dsZWZ0d2hpdGUgPSAweDIxZTY7CiAgdC5hcnJvd3JpZ2h0ID0gMHgyMTkyOwogIHQuYXJyb3dyaWdodGRibHN0cm9rZSA9IDB4MjFjZjsKICB0LmFycm93cmlnaHRoZWF2eSA9IDB4Mjc5ZTsKICB0LmFycm93cmlnaHRvdmVybGVmdCA9IDB4MjFjNDsKICB0LmFycm93cmlnaHR3aGl0ZSA9IDB4MjFlODsKICB0LmFycm93dGFibGVmdCA9IDB4MjFlNDsKICB0LmFycm93dGFicmlnaHQgPSAweDIxZTU7CiAgdC5hcnJvd3VwID0gMHgyMTkxOwogIHQuYXJyb3d1cGRuID0gMHgyMTk1OwogIHQuYXJyb3d1cGRuYnNlID0gMHgyMWE4OwogIHQuYXJyb3d1cGRvd25iYXNlID0gMHgyMWE4OwogIHQuYXJyb3d1cGxlZnQgPSAweDIxOTY7CiAgdC5hcnJvd3VwbGVmdG9mZG93biA9IDB4MjFjNTsKICB0LmFycm93dXByaWdodCA9IDB4MjE5NzsKICB0LmFycm93dXB3aGl0ZSA9IDB4MjFlNzsKICB0LmFycm93dmVydGV4ID0gMHhmOGU2OwogIHQuYXNjaWljaXJjdW0gPSAweDAwNWU7CiAgdC5hc2NpaWNpcmN1bW1vbm9zcGFjZSA9IDB4ZmYzZTsKICB0LmFzY2lpdGlsZGUgPSAweDAwN2U7CiAgdC5hc2NpaXRpbGRlbW9ub3NwYWNlID0gMHhmZjVlOwogIHQuYXNjcmlwdCA9IDB4MDI1MTsKICB0LmFzY3JpcHR0dXJuZWQgPSAweDAyNTI7CiAgdC5hc21hbGxoaXJhZ2FuYSA9IDB4MzA0MTsKICB0LmFzbWFsbGthdGFrYW5hID0gMHgzMGExOwogIHQuYXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjc7CiAgdC5hc3RlcmlzayA9IDB4MDAyYTsKICB0LmFzdGVyaXNrYWx0b25lYXJhYmljID0gMHgwNjZkOwogIHQuYXN0ZXJpc2thcmFiaWMgPSAweDA2NmQ7CiAgdC5hc3Rlcmlza21hdGggPSAweDIyMTc7CiAgdC5hc3Rlcmlza21vbm9zcGFjZSA9IDB4ZmYwYTsKICB0LmFzdGVyaXNrc21hbGwgPSAweGZlNjE7CiAgdC5hc3RlcmlzbSA9IDB4MjA0MjsKICB0LmFzdXBlcmlvciA9IDB4ZjZlOTsKICB0LmFzeW1wdG90aWNhbGx5ZXF1YWwgPSAweDIyNDM7CiAgdC5hdCA9IDB4MDA0MDsKICB0LmF0aWxkZSA9IDB4MDBlMzsKICB0LmF0bW9ub3NwYWNlID0gMHhmZjIwOwogIHQuYXRzbWFsbCA9IDB4ZmU2YjsKICB0LmF0dXJuZWQgPSAweDAyNTA7CiAgdC5hdWJlbmdhbGkgPSAweDA5OTQ7CiAgdC5hdWJvcG9tb2ZvID0gMHgzMTIwOwogIHQuYXVkZXZhID0gMHgwOTE0OwogIHQuYXVndWphcmF0aSA9IDB4MGE5NDsKICB0LmF1Z3VybXVraGkgPSAweDBhMTQ7CiAgdC5hdWxlbmd0aG1hcmtiZW5nYWxpID0gMHgwOWQ3OwogIHQuYXVtYXRyYWd1cm11a2hpID0gMHgwYTRjOwogIHQuYXV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWNjOwogIHQuYXV2b3dlbHNpZ25kZXZhID0gMHgwOTRjOwogIHQuYXV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjYzsKICB0LmF2YWdyYWhhZGV2YSA9IDB4MDkzZDsKICB0LmF5YmFybWVuaWFuID0gMHgwNTYxOwogIHQuYXlpbiA9IDB4MDVlMjsKICB0LmF5aW5hbHRvbmVoZWJyZXcgPSAweGZiMjA7CiAgdC5heWluaGVicmV3ID0gMHgwNWUyOwogIHQuYiA9IDB4MDA2MjsKICB0LmJhYmVuZ2FsaSA9IDB4MDlhYzsKICB0LmJhY2tzbGFzaCA9IDB4MDA1YzsKICB0LmJhY2tzbGFzaG1vbm9zcGFjZSA9IDB4ZmYzYzsKICB0LmJhZGV2YSA9IDB4MDkyYzsKICB0LmJhZ3VqYXJhdGkgPSAweDBhYWM7CiAgdC5iYWd1cm11a2hpID0gMHgwYTJjOwogIHQuYmFoaXJhZ2FuYSA9IDB4MzA3MDsKICB0LmJhaHR0aGFpID0gMHgwZTNmOwogIHQuYmFrYXRha2FuYSA9IDB4MzBkMDsKICB0LmJhciA9IDB4MDA3YzsKICB0LmJhcm1vbm9zcGFjZSA9IDB4ZmY1YzsKICB0LmJib3BvbW9mbyA9IDB4MzEwNTsKICB0LmJjaXJjbGUgPSAweDI0ZDE7CiAgdC5iZG90YWNjZW50ID0gMHgxZTAzOwogIHQuYmRvdGJlbG93ID0gMHgxZTA1OwogIHQuYmVhbWVkc2l4dGVlbnRobm90ZXMgPSAweDI2NmM7CiAgdC5iZWNhdXNlID0gMHgyMjM1OwogIHQuYmVjeXJpbGxpYyA9IDB4MDQzMTsKICB0LmJlaGFyYWJpYyA9IDB4MDYyODsKICB0LmJlaGZpbmFsYXJhYmljID0gMHhmZTkwOwogIHQuYmVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5MTsKICB0LmJlaGlyYWdhbmEgPSAweDMwNzk7CiAgdC5iZWhtZWRpYWxhcmFiaWMgPSAweGZlOTI7CiAgdC5iZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmM5ZjsKICB0LmJlaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwODsKICB0LmJlaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM2ZDsKICB0LmJla2F0YWthbmEgPSAweDMwZDk7CiAgdC5iZW5hcm1lbmlhbiA9IDB4MDU2MjsKICB0LmJldCA9IDB4MDVkMTsKICB0LmJldGEgPSAweDAzYjI7CiAgdC5iZXRhc3ltYm9sZ3JlZWsgPSAweDAzZDA7CiAgdC5iZXRkYWdlc2ggPSAweGZiMzE7CiAgdC5iZXRkYWdlc2hoZWJyZXcgPSAweGZiMzE7CiAgdC5iZXRoZWJyZXcgPSAweDA1ZDE7CiAgdC5iZXRyYWZlaGVicmV3ID0gMHhmYjRjOwogIHQuYmhhYmVuZ2FsaSA9IDB4MDlhZDsKICB0LmJoYWRldmEgPSAweDA5MmQ7CiAgdC5iaGFndWphcmF0aSA9IDB4MGFhZDsKICB0LmJoYWd1cm11a2hpID0gMHgwYTJkOwogIHQuYmhvb2sgPSAweDAyNTM7CiAgdC5iaWhpcmFnYW5hID0gMHgzMDczOwogIHQuYmlrYXRha2FuYSA9IDB4MzBkMzsKICB0LmJpbGFiaWFsY2xpY2sgPSAweDAyOTg7CiAgdC5iaW5kaWd1cm11a2hpID0gMHgwYTAyOwogIHQuYmlydXNxdWFyZSA9IDB4MzMzMTsKICB0LmJsYWNrY2lyY2xlID0gMHgyNWNmOwogIHQuYmxhY2tkaWFtb25kID0gMHgyNWM2OwogIHQuYmxhY2tkb3ducG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViYzsKICB0LmJsYWNrbGVmdHBvaW50aW5ncG9pbnRlciA9IDB4MjVjNDsKICB0LmJsYWNrbGVmdHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YzA7CiAgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdCA9IDB4MzAxMDsKICB0LmJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2I7CiAgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHQgPSAweDMwMTE7CiAgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzYzsKICB0LmJsYWNrbG93ZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTM7CiAgdC5ibGFja2xvd2VycmlnaHR0cmlhbmdsZSA9IDB4MjVlMjsKICB0LmJsYWNrcmVjdGFuZ2xlID0gMHgyNWFjOwogIHQuYmxhY2tyaWdodHBvaW50aW5ncG9pbnRlciA9IDB4MjViYTsKICB0LmJsYWNrcmlnaHRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWI2OwogIHQuYmxhY2tzbWFsbHNxdWFyZSA9IDB4MjVhYTsKICB0LmJsYWNrc21pbGluZ2ZhY2UgPSAweDI2M2I7CiAgdC5ibGFja3NxdWFyZSA9IDB4MjVhMDsKICB0LmJsYWNrc3RhciA9IDB4MjYwNTsKICB0LmJsYWNrdXBwZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTQ7CiAgdC5ibGFja3VwcGVycmlnaHR0cmlhbmdsZSA9IDB4MjVlNTsKICB0LmJsYWNrdXBwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YjQ7CiAgdC5ibGFja3VwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMjsKICB0LmJsYW5rID0gMHgyNDIzOwogIHQuYmxpbmViZWxvdyA9IDB4MWUwNzsKICB0LmJsb2NrID0gMHgyNTg4OwogIHQuYm1vbm9zcGFjZSA9IDB4ZmY0MjsKICB0LmJvYmFpbWFpdGhhaSA9IDB4MGUxYTsKICB0LmJvaGlyYWdhbmEgPSAweDMwN2M7CiAgdC5ib2thdGFrYW5hID0gMHgzMGRjOwogIHQuYnBhcmVuID0gMHgyNDlkOwogIHQuYnFzcXVhcmUgPSAweDMzYzM7CiAgdC5icmFjZWV4ID0gMHhmOGY0OwogIHQuYnJhY2VsZWZ0ID0gMHgwMDdiOwogIHQuYnJhY2VsZWZ0YnQgPSAweGY4ZjM7CiAgdC5icmFjZWxlZnRtaWQgPSAweGY4ZjI7CiAgdC5icmFjZWxlZnRtb25vc3BhY2UgPSAweGZmNWI7CiAgdC5icmFjZWxlZnRzbWFsbCA9IDB4ZmU1YjsKICB0LmJyYWNlbGVmdHRwID0gMHhmOGYxOwogIHQuYnJhY2VsZWZ0dmVydGljYWwgPSAweGZlMzc7CiAgdC5icmFjZXJpZ2h0ID0gMHgwMDdkOwogIHQuYnJhY2VyaWdodGJ0ID0gMHhmOGZlOwogIHQuYnJhY2VyaWdodG1pZCA9IDB4ZjhmZDsKICB0LmJyYWNlcmlnaHRtb25vc3BhY2UgPSAweGZmNWQ7CiAgdC5icmFjZXJpZ2h0c21hbGwgPSAweGZlNWM7CiAgdC5icmFjZXJpZ2h0dHAgPSAweGY4ZmM7CiAgdC5icmFjZXJpZ2h0dmVydGljYWwgPSAweGZlMzg7CiAgdC5icmFja2V0bGVmdCA9IDB4MDA1YjsKICB0LmJyYWNrZXRsZWZ0YnQgPSAweGY4ZjA7CiAgdC5icmFja2V0bGVmdGV4ID0gMHhmOGVmOwogIHQuYnJhY2tldGxlZnRtb25vc3BhY2UgPSAweGZmM2I7CiAgdC5icmFja2V0bGVmdHRwID0gMHhmOGVlOwogIHQuYnJhY2tldHJpZ2h0ID0gMHgwMDVkOwogIHQuYnJhY2tldHJpZ2h0YnQgPSAweGY4ZmI7CiAgdC5icmFja2V0cmlnaHRleCA9IDB4ZjhmYTsKICB0LmJyYWNrZXRyaWdodG1vbm9zcGFjZSA9IDB4ZmYzZDsKICB0LmJyYWNrZXRyaWdodHRwID0gMHhmOGY5OwogIHQuYnJldmUgPSAweDAyZDg7CiAgdC5icmV2ZWJlbG93Y21iID0gMHgwMzJlOwogIHQuYnJldmVjbWIgPSAweDAzMDY7CiAgdC5icmV2ZWludmVydGVkYmVsb3djbWIgPSAweDAzMmY7CiAgdC5icmV2ZWludmVydGVkY21iID0gMHgwMzExOwogIHQuYnJldmVpbnZlcnRlZGRvdWJsZWNtYiA9IDB4MDM2MTsKICB0LmJyaWRnZWJlbG93Y21iID0gMHgwMzJhOwogIHQuYnJpZGdlaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMzYTsKICB0LmJyb2tlbmJhciA9IDB4MDBhNjsKICB0LmJzdHJva2UgPSAweDAxODA7CiAgdC5ic3VwZXJpb3IgPSAweGY2ZWE7CiAgdC5idG9wYmFyID0gMHgwMTgzOwogIHQuYnVoaXJhZ2FuYSA9IDB4MzA3NjsKICB0LmJ1a2F0YWthbmEgPSAweDMwZDY7CiAgdC5idWxsZXQgPSAweDIwMjI7CiAgdC5idWxsZXRpbnZlcnNlID0gMHgyNWQ4OwogIHQuYnVsbGV0b3BlcmF0b3IgPSAweDIyMTk7CiAgdC5idWxsc2V5ZSA9IDB4MjVjZTsKICB0LmMgPSAweDAwNjM7CiAgdC5jYWFybWVuaWFuID0gMHgwNTZlOwogIHQuY2FiZW5nYWxpID0gMHgwOTlhOwogIHQuY2FjdXRlID0gMHgwMTA3OwogIHQuY2FkZXZhID0gMHgwOTFhOwogIHQuY2FndWphcmF0aSA9IDB4MGE5YTsKICB0LmNhZ3VybXVraGkgPSAweDBhMWE7CiAgdC5jYWxzcXVhcmUgPSAweDMzODg7CiAgdC5jYW5kcmFiaW5kdWJlbmdhbGkgPSAweDA5ODE7CiAgdC5jYW5kcmFiaW5kdWNtYiA9IDB4MDMxMDsKICB0LmNhbmRyYWJpbmR1ZGV2YSA9IDB4MDkwMTsKICB0LmNhbmRyYWJpbmR1Z3VqYXJhdGkgPSAweDBhODE7CiAgdC5jYXBzbG9jayA9IDB4MjFlYTsKICB0LmNhcmVvZiA9IDB4MjEwNTsKICB0LmNhcm9uID0gMHgwMmM3OwogIHQuY2Fyb25iZWxvd2NtYiA9IDB4MDMyYzsKICB0LmNhcm9uY21iID0gMHgwMzBjOwogIHQuY2FycmlhZ2VyZXR1cm4gPSAweDIxYjU7CiAgdC5jYm9wb21vZm8gPSAweDMxMTg7CiAgdC5jY2Fyb24gPSAweDAxMGQ7CiAgdC5jY2VkaWxsYSA9IDB4MDBlNzsKICB0LmNjZWRpbGxhYWN1dGUgPSAweDFlMDk7CiAgdC5jY2lyY2xlID0gMHgyNGQyOwogIHQuY2NpcmN1bWZsZXggPSAweDAxMDk7CiAgdC5jY3VybCA9IDB4MDI1NTsKICB0LmNkb3QgPSAweDAxMGI7CiAgdC5jZG90YWNjZW50ID0gMHgwMTBiOwogIHQuY2RzcXVhcmUgPSAweDMzYzU7CiAgdC5jZWRpbGxhID0gMHgwMGI4OwogIHQuY2VkaWxsYWNtYiA9IDB4MDMyNzsKICB0LmNlbnQgPSAweDAwYTI7CiAgdC5jZW50aWdyYWRlID0gMHgyMTAzOwogIHQuY2VudGluZmVyaW9yID0gMHhmNmRmOwogIHQuY2VudG1vbm9zcGFjZSA9IDB4ZmZlMDsKICB0LmNlbnRvbGRzdHlsZSA9IDB4ZjdhMjsKICB0LmNlbnRzdXBlcmlvciA9IDB4ZjZlMDsKICB0LmNoYWFybWVuaWFuID0gMHgwNTc5OwogIHQuY2hhYmVuZ2FsaSA9IDB4MDk5YjsKICB0LmNoYWRldmEgPSAweDA5MWI7CiAgdC5jaGFndWphcmF0aSA9IDB4MGE5YjsKICB0LmNoYWd1cm11a2hpID0gMHgwYTFiOwogIHQuY2hib3BvbW9mbyA9IDB4MzExNDsKICB0LmNoZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGJkOwogIHQuY2hlY2ttYXJrID0gMHgyNzEzOwogIHQuY2hlY3lyaWxsaWMgPSAweDA0NDc7CiAgdC5jaGVkZXNjZW5kZXJhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiZjsKICB0LmNoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGI3OwogIHQuY2hlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmNTsKICB0LmNoZWhhcm1lbmlhbiA9IDB4MDU3MzsKICB0LmNoZWtoYWthc3NpYW5jeXJpbGxpYyA9IDB4MDRjYzsKICB0LmNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0Yjk7CiAgdC5jaGkgPSAweDAzYzc7CiAgdC5jaGlldWNoYWNpcmNsZWtvcmVhbiA9IDB4MzI3NzsKICB0LmNoaWV1Y2hhcGFyZW5rb3JlYW4gPSAweDMyMTc7CiAgdC5jaGlldWNoY2lyY2xla29yZWFuID0gMHgzMjY5OwogIHQuY2hpZXVjaGtvcmVhbiA9IDB4MzE0YTsKICB0LmNoaWV1Y2hwYXJlbmtvcmVhbiA9IDB4MzIwOTsKICB0LmNob2NoYW5ndGhhaSA9IDB4MGUwYTsKICB0LmNob2NoYW50aGFpID0gMHgwZTA4OwogIHQuY2hvY2hpbmd0aGFpID0gMHgwZTA5OwogIHQuY2hvY2hvZXRoYWkgPSAweDBlMGM7CiAgdC5jaG9vayA9IDB4MDE4ODsKICB0LmNpZXVjYWNpcmNsZWtvcmVhbiA9IDB4MzI3NjsKICB0LmNpZXVjYXBhcmVua29yZWFuID0gMHgzMjE2OwogIHQuY2lldWNjaXJjbGVrb3JlYW4gPSAweDMyNjg7CiAgdC5jaWV1Y2tvcmVhbiA9IDB4MzE0ODsKICB0LmNpZXVjcGFyZW5rb3JlYW4gPSAweDMyMDg7CiAgdC5jaWV1Y3VwYXJlbmtvcmVhbiA9IDB4MzIxYzsKICB0LmNpcmNsZSA9IDB4MjVjYjsKICB0LmNpcmNsZWNvcHlydCA9IDB4MDBhOTsKICB0LmNpcmNsZW11bHRpcGx5ID0gMHgyMjk3OwogIHQuY2lyY2xlb3QgPSAweDIyOTk7CiAgdC5jaXJjbGVwbHVzID0gMHgyMjk1OwogIHQuY2lyY2xlcG9zdGFsbWFyayA9IDB4MzAzNjsKICB0LmNpcmNsZXdpdGhsZWZ0aGFsZmJsYWNrID0gMHgyNWQwOwogIHQuY2lyY2xld2l0aHJpZ2h0aGFsZmJsYWNrID0gMHgyNWQxOwogIHQuY2lyY3VtZmxleCA9IDB4MDJjNjsKICB0LmNpcmN1bWZsZXhiZWxvd2NtYiA9IDB4MDMyZDsKICB0LmNpcmN1bWZsZXhjbWIgPSAweDAzMDI7CiAgdC5jbGVhciA9IDB4MjMyNzsKICB0LmNsaWNrYWx2ZW9sYXIgPSAweDAxYzI7CiAgdC5jbGlja2RlbnRhbCA9IDB4MDFjMDsKICB0LmNsaWNrbGF0ZXJhbCA9IDB4MDFjMTsKICB0LmNsaWNrcmV0cm9mbGV4ID0gMHgwMWMzOwogIHQuY2x1YiA9IDB4MjY2MzsKICB0LmNsdWJzdWl0YmxhY2sgPSAweDI2NjM7CiAgdC5jbHVic3VpdHdoaXRlID0gMHgyNjY3OwogIHQuY21jdWJlZHNxdWFyZSA9IDB4MzNhNDsKICB0LmNtb25vc3BhY2UgPSAweGZmNDM7CiAgdC5jbXNxdWFyZWRzcXVhcmUgPSAweDMzYTA7CiAgdC5jb2FybWVuaWFuID0gMHgwNTgxOwogIHQuY29sb24gPSAweDAwM2E7CiAgdC5jb2xvbm1vbmV0YXJ5ID0gMHgyMGExOwogIHQuY29sb25tb25vc3BhY2UgPSAweGZmMWE7CiAgdC5jb2xvbnNpZ24gPSAweDIwYTE7CiAgdC5jb2xvbnNtYWxsID0gMHhmZTU1OwogIHQuY29sb250cmlhbmd1bGFyaGFsZm1vZCA9IDB4MDJkMTsKICB0LmNvbG9udHJpYW5ndWxhcm1vZCA9IDB4MDJkMDsKICB0LmNvbW1hID0gMHgwMDJjOwogIHQuY29tbWFhYm92ZWNtYiA9IDB4MDMxMzsKICB0LmNvbW1hYWJvdmVyaWdodGNtYiA9IDB4MDMxNTsKICB0LmNvbW1hYWNjZW50ID0gMHhmNmMzOwogIHQuY29tbWFhcmFiaWMgPSAweDA2MGM7CiAgdC5jb21tYWFybWVuaWFuID0gMHgwNTVkOwogIHQuY29tbWFpbmZlcmlvciA9IDB4ZjZlMTsKICB0LmNvbW1hbW9ub3NwYWNlID0gMHhmZjBjOwogIHQuY29tbWFyZXZlcnNlZGFib3ZlY21iID0gMHgwMzE0OwogIHQuY29tbWFyZXZlcnNlZG1vZCA9IDB4MDJiZDsKICB0LmNvbW1hc21hbGwgPSAweGZlNTA7CiAgdC5jb21tYXN1cGVyaW9yID0gMHhmNmUyOwogIHQuY29tbWF0dXJuZWRhYm92ZWNtYiA9IDB4MDMxMjsKICB0LmNvbW1hdHVybmVkbW9kID0gMHgwMmJiOwogIHQuY29tcGFzcyA9IDB4MjYzYzsKICB0LmNvbmdydWVudCA9IDB4MjI0NTsKICB0LmNvbnRvdXJpbnRlZ3JhbCA9IDB4MjIyZTsKICB0LmNvbnRyb2wgPSAweDIzMDM7CiAgdC5jb250cm9sQUNLID0gMHgwMDA2OwogIHQuY29udHJvbEJFTCA9IDB4MDAwNzsKICB0LmNvbnRyb2xCUyA9IDB4MDAwODsKICB0LmNvbnRyb2xDQU4gPSAweDAwMTg7CiAgdC5jb250cm9sQ1IgPSAweDAwMGQ7CiAgdC5jb250cm9sREMxID0gMHgwMDExOwogIHQuY29udHJvbERDMiA9IDB4MDAxMjsKICB0LmNvbnRyb2xEQzMgPSAweDAwMTM7CiAgdC5jb250cm9sREM0ID0gMHgwMDE0OwogIHQuY29udHJvbERFTCA9IDB4MDA3ZjsKICB0LmNvbnRyb2xETEUgPSAweDAwMTA7CiAgdC5jb250cm9sRU0gPSAweDAwMTk7CiAgdC5jb250cm9sRU5RID0gMHgwMDA1OwogIHQuY29udHJvbEVPVCA9IDB4MDAwNDsKICB0LmNvbnRyb2xFU0MgPSAweDAwMWI7CiAgdC5jb250cm9sRVRCID0gMHgwMDE3OwogIHQuY29udHJvbEVUWCA9IDB4MDAwMzsKICB0LmNvbnRyb2xGRiA9IDB4MDAwYzsKICB0LmNvbnRyb2xGUyA9IDB4MDAxYzsKICB0LmNvbnRyb2xHUyA9IDB4MDAxZDsKICB0LmNvbnRyb2xIVCA9IDB4MDAwOTsKICB0LmNvbnRyb2xMRiA9IDB4MDAwYTsKICB0LmNvbnRyb2xOQUsgPSAweDAwMTU7CiAgdC5jb250cm9sTlVMTCA9IDB4MDAwMDsKICB0LmNvbnRyb2xSUyA9IDB4MDAxZTsKICB0LmNvbnRyb2xTSSA9IDB4MDAwZjsKICB0LmNvbnRyb2xTTyA9IDB4MDAwZTsKICB0LmNvbnRyb2xTT1QgPSAweDAwMDI7CiAgdC5jb250cm9sU1RYID0gMHgwMDAxOwogIHQuY29udHJvbFNVQiA9IDB4MDAxYTsKICB0LmNvbnRyb2xTWU4gPSAweDAwMTY7CiAgdC5jb250cm9sVVMgPSAweDAwMWY7CiAgdC5jb250cm9sVlQgPSAweDAwMGI7CiAgdC5jb3B5cmlnaHQgPSAweDAwYTk7CiAgdC5jb3B5cmlnaHRzYW5zID0gMHhmOGU5OwogIHQuY29weXJpZ2h0c2VyaWYgPSAweGY2ZDk7CiAgdC5jb3JuZXJicmFja2V0bGVmdCA9IDB4MzAwYzsKICB0LmNvcm5lcmJyYWNrZXRsZWZ0aGFsZndpZHRoID0gMHhmZjYyOwogIHQuY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MTsKICB0LmNvcm5lcmJyYWNrZXRyaWdodCA9IDB4MzAwZDsKICB0LmNvcm5lcmJyYWNrZXRyaWdodGhhbGZ3aWR0aCA9IDB4ZmY2MzsKICB0LmNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQyOwogIHQuY29ycG9yYXRpb25zcXVhcmUgPSAweDMzN2Y7CiAgdC5jb3NxdWFyZSA9IDB4MzNjNzsKICB0LmNvdmVya2dzcXVhcmUgPSAweDMzYzY7CiAgdC5jcGFyZW4gPSAweDI0OWU7CiAgdC5jcnV6ZWlybyA9IDB4MjBhMjsKICB0LmNzdHJldGNoZWQgPSAweDAyOTc7CiAgdC5jdXJseWFuZCA9IDB4MjJjZjsKICB0LmN1cmx5b3IgPSAweDIyY2U7CiAgdC5jdXJyZW5jeSA9IDB4MDBhNDsKICB0LmN5ckJyZXZlID0gMHhmNmQxOwogIHQuY3lyRmxleCA9IDB4ZjZkMjsKICB0LmN5cmJyZXZlID0gMHhmNmQ0OwogIHQuY3lyZmxleCA9IDB4ZjZkNTsKICB0LmQgPSAweDAwNjQ7CiAgdC5kYWFybWVuaWFuID0gMHgwNTY0OwogIHQuZGFiZW5nYWxpID0gMHgwOWE2OwogIHQuZGFkYXJhYmljID0gMHgwNjM2OwogIHQuZGFkZXZhID0gMHgwOTI2OwogIHQuZGFkZmluYWxhcmFiaWMgPSAweGZlYmU7CiAgdC5kYWRpbml0aWFsYXJhYmljID0gMHhmZWJmOwogIHQuZGFkbWVkaWFsYXJhYmljID0gMHhmZWMwOwogIHQuZGFnZXNoID0gMHgwNWJjOwogIHQuZGFnZXNoaGVicmV3ID0gMHgwNWJjOwogIHQuZGFnZ2VyID0gMHgyMDIwOwogIHQuZGFnZ2VyZGJsID0gMHgyMDIxOwogIHQuZGFndWphcmF0aSA9IDB4MGFhNjsKICB0LmRhZ3VybXVraGkgPSAweDBhMjY7CiAgdC5kYWhpcmFnYW5hID0gMHgzMDYwOwogIHQuZGFrYXRha2FuYSA9IDB4MzBjMDsKICB0LmRhbGFyYWJpYyA9IDB4MDYyZjsKICB0LmRhbGV0ID0gMHgwNWQzOwogIHQuZGFsZXRkYWdlc2ggPSAweGZiMzM7CiAgdC5kYWxldGRhZ2VzaGhlYnJldyA9IDB4ZmIzMzsKICB0LmRhbGV0aGVicmV3ID0gMHgwNWQzOwogIHQuZGFsZmluYWxhcmFiaWMgPSAweGZlYWE7CiAgdC5kYW1tYWFyYWJpYyA9IDB4MDY0ZjsKICB0LmRhbW1hbG93YXJhYmljID0gMHgwNjRmOwogIHQuZGFtbWF0YW5hbHRvbmVhcmFiaWMgPSAweDA2NGM7CiAgdC5kYW1tYXRhbmFyYWJpYyA9IDB4MDY0YzsKICB0LmRhbmRhID0gMHgwOTY0OwogIHQuZGFyZ2FoZWJyZXcgPSAweDA1YTc7CiAgdC5kYXJnYWxlZnRoZWJyZXcgPSAweDA1YTc7CiAgdC5kYXNpYXBuZXVtYXRhY3lyaWxsaWNjbWIgPSAweDA0ODU7CiAgdC5kYmxHcmF2ZSA9IDB4ZjZkMzsKICB0LmRibGFuZ2xlYnJhY2tldGxlZnQgPSAweDMwMGE7CiAgdC5kYmxhbmdsZWJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2Q7CiAgdC5kYmxhbmdsZWJyYWNrZXRyaWdodCA9IDB4MzAwYjsKICB0LmRibGFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2U7CiAgdC5kYmxhcmNoaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMyYjsKICB0LmRibGFycm93bGVmdCA9IDB4MjFkNDsKICB0LmRibGFycm93cmlnaHQgPSAweDIxZDI7CiAgdC5kYmxkYW5kYSA9IDB4MDk2NTsKICB0LmRibGdyYXZlID0gMHhmNmQ2OwogIHQuZGJsZ3JhdmVjbWIgPSAweDAzMGY7CiAgdC5kYmxpbnRlZ3JhbCA9IDB4MjIyYzsKICB0LmRibGxvd2xpbmUgPSAweDIwMTc7CiAgdC5kYmxsb3dsaW5lY21iID0gMHgwMzMzOwogIHQuZGJsb3ZlcmxpbmVjbWIgPSAweDAzM2Y7CiAgdC5kYmxwcmltZW1vZCA9IDB4MDJiYTsKICB0LmRibHZlcnRpY2FsYmFyID0gMHgyMDE2OwogIHQuZGJsdmVydGljYWxsaW5lYWJvdmVjbWIgPSAweDAzMGU7CiAgdC5kYm9wb21vZm8gPSAweDMxMDk7CiAgdC5kYnNxdWFyZSA9IDB4MzNjODsKICB0LmRjYXJvbiA9IDB4MDEwZjsKICB0LmRjZWRpbGxhID0gMHgxZTExOwogIHQuZGNpcmNsZSA9IDB4MjRkMzsKICB0LmRjaXJjdW1mbGV4YmVsb3cgPSAweDFlMTM7CiAgdC5kY3JvYXQgPSAweDAxMTE7CiAgdC5kZGFiZW5nYWxpID0gMHgwOWExOwogIHQuZGRhZGV2YSA9IDB4MDkyMTsKICB0LmRkYWd1amFyYXRpID0gMHgwYWExOwogIHQuZGRhZ3VybXVraGkgPSAweDBhMjE7CiAgdC5kZGFsYXJhYmljID0gMHgwNjg4OwogIHQuZGRhbGZpbmFsYXJhYmljID0gMHhmYjg5OwogIHQuZGRkaGFkZXZhID0gMHgwOTVjOwogIHQuZGRoYWJlbmdhbGkgPSAweDA5YTI7CiAgdC5kZGhhZGV2YSA9IDB4MDkyMjsKICB0LmRkaGFndWphcmF0aSA9IDB4MGFhMjsKICB0LmRkaGFndXJtdWtoaSA9IDB4MGEyMjsKICB0LmRkb3RhY2NlbnQgPSAweDFlMGI7CiAgdC5kZG90YmVsb3cgPSAweDFlMGQ7CiAgdC5kZWNpbWFsc2VwYXJhdG9yYXJhYmljID0gMHgwNjZiOwogIHQuZGVjaW1hbHNlcGFyYXRvcnBlcnNpYW4gPSAweDA2NmI7CiAgdC5kZWN5cmlsbGljID0gMHgwNDM0OwogIHQuZGVncmVlID0gMHgwMGIwOwogIHQuZGVoaWhlYnJldyA9IDB4MDVhZDsKICB0LmRlaGlyYWdhbmEgPSAweDMwNjc7CiAgdC5kZWljb3B0aWMgPSAweDAzZWY7CiAgdC5kZWthdGFrYW5hID0gMHgzMGM3OwogIHQuZGVsZXRlbGVmdCA9IDB4MjMyYjsKICB0LmRlbGV0ZXJpZ2h0ID0gMHgyMzI2OwogIHQuZGVsdGEgPSAweDAzYjQ7CiAgdC5kZWx0YXR1cm5lZCA9IDB4MDE4ZDsKICB0LmRlbm9taW5hdG9ybWludXNvbmVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY4OwogIHQuZGV6aCA9IDB4MDJhNDsKICB0LmRoYWJlbmdhbGkgPSAweDA5YTc7CiAgdC5kaGFkZXZhID0gMHgwOTI3OwogIHQuZGhhZ3VqYXJhdGkgPSAweDBhYTc7CiAgdC5kaGFndXJtdWtoaSA9IDB4MGEyNzsKICB0LmRob29rID0gMHgwMjU3OwogIHQuZGlhbHl0aWthdG9ub3MgPSAweDAzODU7CiAgdC5kaWFseXRpa2F0b25vc2NtYiA9IDB4MDM0NDsKICB0LmRpYW1vbmQgPSAweDI2NjY7CiAgdC5kaWFtb25kc3VpdHdoaXRlID0gMHgyNjYyOwogIHQuZGllcmVzaXMgPSAweDAwYTg7CiAgdC5kaWVyZXNpc2FjdXRlID0gMHhmNmQ3OwogIHQuZGllcmVzaXNiZWxvd2NtYiA9IDB4MDMyNDsKICB0LmRpZXJlc2lzY21iID0gMHgwMzA4OwogIHQuZGllcmVzaXNncmF2ZSA9IDB4ZjZkODsKICB0LmRpZXJlc2lzdG9ub3MgPSAweDAzODU7CiAgdC5kaWhpcmFnYW5hID0gMHgzMDYyOwogIHQuZGlrYXRha2FuYSA9IDB4MzBjMjsKICB0LmRpdHRvbWFyayA9IDB4MzAwMzsKICB0LmRpdmlkZSA9IDB4MDBmNzsKICB0LmRpdmlkZXMgPSAweDIyMjM7CiAgdC5kaXZpc2lvbnNsYXNoID0gMHgyMjE1OwogIHQuZGplY3lyaWxsaWMgPSAweDA0NTI7CiAgdC5ka3NoYWRlID0gMHgyNTkzOwogIHQuZGxpbmViZWxvdyA9IDB4MWUwZjsKICB0LmRsc3F1YXJlID0gMHgzMzk3OwogIHQuZG1hY3JvbiA9IDB4MDExMTsKICB0LmRtb25vc3BhY2UgPSAweGZmNDQ7CiAgdC5kbmJsb2NrID0gMHgyNTg0OwogIHQuZG9jaGFkYXRoYWkgPSAweDBlMGU7CiAgdC5kb2Rla3RoYWkgPSAweDBlMTQ7CiAgdC5kb2hpcmFnYW5hID0gMHgzMDY5OwogIHQuZG9rYXRha2FuYSA9IDB4MzBjOTsKICB0LmRvbGxhciA9IDB4MDAyNDsKICB0LmRvbGxhcmluZmVyaW9yID0gMHhmNmUzOwogIHQuZG9sbGFybW9ub3NwYWNlID0gMHhmZjA0OwogIHQuZG9sbGFyb2xkc3R5bGUgPSAweGY3MjQ7CiAgdC5kb2xsYXJzbWFsbCA9IDB4ZmU2OTsKICB0LmRvbGxhcnN1cGVyaW9yID0gMHhmNmU0OwogIHQuZG9uZyA9IDB4MjBhYjsKICB0LmRvcnVzcXVhcmUgPSAweDMzMjY7CiAgdC5kb3RhY2NlbnQgPSAweDAyZDk7CiAgdC5kb3RhY2NlbnRjbWIgPSAweDAzMDc7CiAgdC5kb3RiZWxvd2NtYiA9IDB4MDMyMzsKICB0LmRvdGJlbG93Y29tYiA9IDB4MDMyMzsKICB0LmRvdGthdGFrYW5hID0gMHgzMGZiOwogIHQuZG90bGVzc2kgPSAweDAxMzE7CiAgdC5kb3RsZXNzaiA9IDB4ZjZiZTsKICB0LmRvdGxlc3Nqc3Ryb2tlaG9vayA9IDB4MDI4NDsKICB0LmRvdG1hdGggPSAweDIyYzU7CiAgdC5kb3R0ZWRjaXJjbGUgPSAweDI1Y2M7CiAgdC5kb3VibGV5b2RwYXRhaCA9IDB4ZmIxZjsKICB0LmRvdWJsZXlvZHBhdGFoaGVicmV3ID0gMHhmYjFmOwogIHQuZG93bnRhY2tiZWxvd2NtYiA9IDB4MDMxZTsKICB0LmRvd250YWNrbW9kID0gMHgwMmQ1OwogIHQuZHBhcmVuID0gMHgyNDlmOwogIHQuZHN1cGVyaW9yID0gMHhmNmViOwogIHQuZHRhaWwgPSAweDAyNTY7CiAgdC5kdG9wYmFyID0gMHgwMThjOwogIHQuZHVoaXJhZ2FuYSA9IDB4MzA2NTsKICB0LmR1a2F0YWthbmEgPSAweDMwYzU7CiAgdC5keiA9IDB4MDFmMzsKICB0LmR6YWx0b25lID0gMHgwMmEzOwogIHQuZHpjYXJvbiA9IDB4MDFjNjsKICB0LmR6Y3VybCA9IDB4MDJhNTsKICB0LmR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUxOwogIHQuZHplY3lyaWxsaWMgPSAweDA0NTU7CiAgdC5kemhlY3lyaWxsaWMgPSAweDA0NWY7CiAgdC5lID0gMHgwMDY1OwogIHQuZWFjdXRlID0gMHgwMGU5OwogIHQuZWFydGggPSAweDI2NDE7CiAgdC5lYmVuZ2FsaSA9IDB4MDk4ZjsKICB0LmVib3BvbW9mbyA9IDB4MzExYzsKICB0LmVicmV2ZSA9IDB4MDExNTsKICB0LmVjYW5kcmFkZXZhID0gMHgwOTBkOwogIHQuZWNhbmRyYWd1amFyYXRpID0gMHgwYThkOwogIHQuZWNhbmRyYXZvd2Vsc2lnbmRldmEgPSAweDA5NDU7CiAgdC5lY2FuZHJhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzU7CiAgdC5lY2Fyb24gPSAweDAxMWI7CiAgdC5lY2VkaWxsYWJyZXZlID0gMHgxZTFkOwogIHQuZWNoYXJtZW5pYW4gPSAweDA1NjU7CiAgdC5lY2h5aXduYXJtZW5pYW4gPSAweDA1ODc7CiAgdC5lY2lyY2xlID0gMHgyNGQ0OwogIHQuZWNpcmN1bWZsZXggPSAweDAwZWE7CiAgdC5lY2lyY3VtZmxleGFjdXRlID0gMHgxZWJmOwogIHQuZWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxOTsKICB0LmVjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYzc7CiAgdC5lY2lyY3VtZmxleGdyYXZlID0gMHgxZWMxOwogIHQuZWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzM7CiAgdC5lY2lyY3VtZmxleHRpbGRlID0gMHgxZWM1OwogIHQuZWN5cmlsbGljID0gMHgwNDU0OwogIHQuZWRibGdyYXZlID0gMHgwMjA1OwogIHQuZWRldmEgPSAweDA5MGY7CiAgdC5lZGllcmVzaXMgPSAweDAwZWI7CiAgdC5lZG90ID0gMHgwMTE3OwogIHQuZWRvdGFjY2VudCA9IDB4MDExNzsKICB0LmVkb3RiZWxvdyA9IDB4MWViOTsKICB0LmVlZ3VybXVraGkgPSAweDBhMGY7CiAgdC5lZW1hdHJhZ3VybXVraGkgPSAweDBhNDc7CiAgdC5lZmN5cmlsbGljID0gMHgwNDQ0OwogIHQuZWdyYXZlID0gMHgwMGU4OwogIHQuZWd1amFyYXRpID0gMHgwYThmOwogIHQuZWhhcm1lbmlhbiA9IDB4MDU2NzsKICB0LmVoYm9wb21vZm8gPSAweDMxMWQ7CiAgdC5laGlyYWdhbmEgPSAweDMwNDg7CiAgdC5laG9va2Fib3ZlID0gMHgxZWJiOwogIHQuZWlib3BvbW9mbyA9IDB4MzExZjsKICB0LmVpZ2h0ID0gMHgwMDM4OwogIHQuZWlnaHRhcmFiaWMgPSAweDA2Njg7CiAgdC5laWdodGJlbmdhbGkgPSAweDA5ZWU7CiAgdC5laWdodGNpcmNsZSA9IDB4MjQ2NzsKICB0LmVpZ2h0Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MTsKICB0LmVpZ2h0ZGV2YSA9IDB4MDk2ZTsKICB0LmVpZ2h0ZWVuY2lyY2xlID0gMHgyNDcxOwogIHQuZWlnaHRlZW5wYXJlbiA9IDB4MjQ4NTsKICB0LmVpZ2h0ZWVucGVyaW9kID0gMHgyNDk5OwogIHQuZWlnaHRndWphcmF0aSA9IDB4MGFlZTsKICB0LmVpZ2h0Z3VybXVraGkgPSAweDBhNmU7CiAgdC5laWdodGhhY2thcmFiaWMgPSAweDA2Njg7CiAgdC5laWdodGhhbmd6aG91ID0gMHgzMDI4OwogIHQuZWlnaHRobm90ZWJlYW1lZCA9IDB4MjY2YjsKICB0LmVpZ2h0aWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNzsKICB0LmVpZ2h0aW5mZXJpb3IgPSAweDIwODg7CiAgdC5laWdodG1vbm9zcGFjZSA9IDB4ZmYxODsKICB0LmVpZ2h0b2xkc3R5bGUgPSAweGY3Mzg7CiAgdC5laWdodHBhcmVuID0gMHgyNDdiOwogIHQuZWlnaHRwZXJpb2QgPSAweDI0OGY7CiAgdC5laWdodHBlcnNpYW4gPSAweDA2Zjg7CiAgdC5laWdodHJvbWFuID0gMHgyMTc3OwogIHQuZWlnaHRzdXBlcmlvciA9IDB4MjA3ODsKICB0LmVpZ2h0dGhhaSA9IDB4MGU1ODsKICB0LmVpbnZlcnRlZGJyZXZlID0gMHgwMjA3OwogIHQuZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0NjU7CiAgdC5la2F0YWthbmEgPSAweDMwYTg7CiAgdC5la2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzQ7CiAgdC5la29ua2FyZ3VybXVraGkgPSAweDBhNzQ7CiAgdC5la29yZWFuID0gMHgzMTU0OwogIHQuZWxjeXJpbGxpYyA9IDB4MDQzYjsKICB0LmVsZW1lbnQgPSAweDIyMDg7CiAgdC5lbGV2ZW5jaXJjbGUgPSAweDI0NmE7CiAgdC5lbGV2ZW5wYXJlbiA9IDB4MjQ3ZTsKICB0LmVsZXZlbnBlcmlvZCA9IDB4MjQ5MjsKICB0LmVsZXZlbnJvbWFuID0gMHgyMTdhOwogIHQuZWxsaXBzaXMgPSAweDIwMjY7CiAgdC5lbGxpcHNpc3ZlcnRpY2FsID0gMHgyMmVlOwogIHQuZW1hY3JvbiA9IDB4MDExMzsKICB0LmVtYWNyb25hY3V0ZSA9IDB4MWUxNzsKICB0LmVtYWNyb25ncmF2ZSA9IDB4MWUxNTsKICB0LmVtY3lyaWxsaWMgPSAweDA0M2M7CiAgdC5lbWRhc2ggPSAweDIwMTQ7CiAgdC5lbWRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMTsKICB0LmVtb25vc3BhY2UgPSAweGZmNDU7CiAgdC5lbXBoYXNpc21hcmthcm1lbmlhbiA9IDB4MDU1YjsKICB0LmVtcHR5c2V0ID0gMHgyMjA1OwogIHQuZW5ib3BvbW9mbyA9IDB4MzEyMzsKICB0LmVuY3lyaWxsaWMgPSAweDA0M2Q7CiAgdC5lbmRhc2ggPSAweDIwMTM7CiAgdC5lbmRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMjsKICB0LmVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTM7CiAgdC5lbmcgPSAweDAxNGI7CiAgdC5lbmdib3BvbW9mbyA9IDB4MzEyNTsKICB0LmVuZ2hlY3lyaWxsaWMgPSAweDA0YTU7CiAgdC5lbmhvb2tjeXJpbGxpYyA9IDB4MDRjODsKICB0LmVuc3BhY2UgPSAweDIwMDI7CiAgdC5lb2dvbmVrID0gMHgwMTE5OwogIHQuZW9rb3JlYW4gPSAweDMxNTM7CiAgdC5lb3BlbiA9IDB4MDI1YjsKICB0LmVvcGVuY2xvc2VkID0gMHgwMjlhOwogIHQuZW9wZW5yZXZlcnNlZCA9IDB4MDI1YzsKICB0LmVvcGVucmV2ZXJzZWRjbG9zZWQgPSAweDAyNWU7CiAgdC5lb3BlbnJldmVyc2VkaG9vayA9IDB4MDI1ZDsKICB0LmVwYXJlbiA9IDB4MjRhMDsKICB0LmVwc2lsb24gPSAweDAzYjU7CiAgdC5lcHNpbG9udG9ub3MgPSAweDAzYWQ7CiAgdC5lcXVhbCA9IDB4MDAzZDsKICB0LmVxdWFsbW9ub3NwYWNlID0gMHhmZjFkOwogIHQuZXF1YWxzbWFsbCA9IDB4ZmU2NjsKICB0LmVxdWFsc3VwZXJpb3IgPSAweDIwN2M7CiAgdC5lcXVpdmFsZW5jZSA9IDB4MjI2MTsKICB0LmVyYm9wb21vZm8gPSAweDMxMjY7CiAgdC5lcmN5cmlsbGljID0gMHgwNDQwOwogIHQuZXJldmVyc2VkID0gMHgwMjU4OwogIHQuZXJldmVyc2VkY3lyaWxsaWMgPSAweDA0NGQ7CiAgdC5lc2N5cmlsbGljID0gMHgwNDQxOwogIHQuZXNkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYjsKICB0LmVzaCA9IDB4MDI4MzsKICB0LmVzaGN1cmwgPSAweDAyODY7CiAgdC5lc2hvcnRkZXZhID0gMHgwOTBlOwogIHQuZXNob3J0dm93ZWxzaWduZGV2YSA9IDB4MDk0NjsKICB0LmVzaHJldmVyc2VkbG9vcCA9IDB4MDFhYTsKICB0LmVzaHNxdWF0cmV2ZXJzZWQgPSAweDAyODU7CiAgdC5lc21hbGxoaXJhZ2FuYSA9IDB4MzA0NzsKICB0LmVzbWFsbGthdGFrYW5hID0gMHgzMGE3OwogIHQuZXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmE7CiAgdC5lc3RpbWF0ZWQgPSAweDIxMmU7CiAgdC5lc3VwZXJpb3IgPSAweGY2ZWM7CiAgdC5ldGEgPSAweDAzYjc7CiAgdC5ldGFybWVuaWFuID0gMHgwNTY4OwogIHQuZXRhdG9ub3MgPSAweDAzYWU7CiAgdC5ldGggPSAweDAwZjA7CiAgdC5ldGlsZGUgPSAweDFlYmQ7CiAgdC5ldGlsZGViZWxvdyA9IDB4MWUxYjsKICB0LmV0bmFodGFmb3VraGhlYnJldyA9IDB4MDU5MTsKICB0LmV0bmFodGFmb3VraGxlZnRoZWJyZXcgPSAweDA1OTE7CiAgdC5ldG5haHRhaGVicmV3ID0gMHgwNTkxOwogIHQuZXRuYWh0YWxlZnRoZWJyZXcgPSAweDA1OTE7CiAgdC5ldHVybmVkID0gMHgwMWRkOwogIHQuZXVrb3JlYW4gPSAweDMxNjE7CiAgdC5ldXJvID0gMHgyMGFjOwogIHQuZXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzc7CiAgdC5ldm93ZWxzaWduZGV2YSA9IDB4MDk0NzsKICB0LmV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjNzsKICB0LmV4Y2xhbSA9IDB4MDAyMTsKICB0LmV4Y2xhbWFybWVuaWFuID0gMHgwNTVjOwogIHQuZXhjbGFtZGJsID0gMHgyMDNjOwogIHQuZXhjbGFtZG93biA9IDB4MDBhMTsKICB0LmV4Y2xhbWRvd25zbWFsbCA9IDB4ZjdhMTsKICB0LmV4Y2xhbW1vbm9zcGFjZSA9IDB4ZmYwMTsKICB0LmV4Y2xhbXNtYWxsID0gMHhmNzIxOwogIHQuZXhpc3RlbnRpYWwgPSAweDIyMDM7CiAgdC5lemggPSAweDAyOTI7CiAgdC5lemhjYXJvbiA9IDB4MDFlZjsKICB0LmV6aGN1cmwgPSAweDAyOTM7CiAgdC5lemhyZXZlcnNlZCA9IDB4MDFiOTsKICB0LmV6aHRhaWwgPSAweDAxYmE7CiAgdC5mID0gMHgwMDY2OwogIHQuZmFkZXZhID0gMHgwOTVlOwogIHQuZmFndXJtdWtoaSA9IDB4MGE1ZTsKICB0LmZhaHJlbmhlaXQgPSAweDIxMDk7CiAgdC5mYXRoYWFyYWJpYyA9IDB4MDY0ZTsKICB0LmZhdGhhbG93YXJhYmljID0gMHgwNjRlOwogIHQuZmF0aGF0YW5hcmFiaWMgPSAweDA2NGI7CiAgdC5mYm9wb21vZm8gPSAweDMxMDg7CiAgdC5mY2lyY2xlID0gMHgyNGQ1OwogIHQuZmRvdGFjY2VudCA9IDB4MWUxZjsKICB0LmZlaGFyYWJpYyA9IDB4MDY0MTsKICB0LmZlaGFybWVuaWFuID0gMHgwNTg2OwogIHQuZmVoZmluYWxhcmFiaWMgPSAweGZlZDI7CiAgdC5mZWhpbml0aWFsYXJhYmljID0gMHhmZWQzOwogIHQuZmVobWVkaWFsYXJhYmljID0gMHhmZWQ0OwogIHQuZmVpY29wdGljID0gMHgwM2U1OwogIHQuZmVtYWxlID0gMHgyNjQwOwogIHQuZmYgPSAweGZiMDA7CiAgdC5mX2YgPSAweGZiMDA7CiAgdC5mZmkgPSAweGZiMDM7CiAgdC5mX2ZfaSA9IDB4ZmIwMzsKICB0LmZmbCA9IDB4ZmIwNDsKICB0LmZfZl9sID0gMHhmYjA0OwogIHQuZmkgPSAweGZiMDE7CiAgdC5mX2kgPSAweGZiMDE7CiAgdC5maWZ0ZWVuY2lyY2xlID0gMHgyNDZlOwogIHQuZmlmdGVlbnBhcmVuID0gMHgyNDgyOwogIHQuZmlmdGVlbnBlcmlvZCA9IDB4MjQ5NjsKICB0LmZpZ3VyZWRhc2ggPSAweDIwMTI7CiAgdC5maWxsZWRib3ggPSAweDI1YTA7CiAgdC5maWxsZWRyZWN0ID0gMHgyNWFjOwogIHQuZmluYWxrYWYgPSAweDA1ZGE7CiAgdC5maW5hbGthZmRhZ2VzaCA9IDB4ZmIzYTsKICB0LmZpbmFsa2FmZGFnZXNoaGVicmV3ID0gMHhmYjNhOwogIHQuZmluYWxrYWZoZWJyZXcgPSAweDA1ZGE7CiAgdC5maW5hbG1lbSA9IDB4MDVkZDsKICB0LmZpbmFsbWVtaGVicmV3ID0gMHgwNWRkOwogIHQuZmluYWxudW4gPSAweDA1ZGY7CiAgdC5maW5hbG51bmhlYnJldyA9IDB4MDVkZjsKICB0LmZpbmFscGUgPSAweDA1ZTM7CiAgdC5maW5hbHBlaGVicmV3ID0gMHgwNWUzOwogIHQuZmluYWx0c2FkaSA9IDB4MDVlNTsKICB0LmZpbmFsdHNhZGloZWJyZXcgPSAweDA1ZTU7CiAgdC5maXJzdHRvbmVjaGluZXNlID0gMHgwMmM5OwogIHQuZmlzaGV5ZSA9IDB4MjVjOTsKICB0LmZpdGFjeXJpbGxpYyA9IDB4MDQ3MzsKICB0LmZpdmUgPSAweDAwMzU7CiAgdC5maXZlYXJhYmljID0gMHgwNjY1OwogIHQuZml2ZWJlbmdhbGkgPSAweDA5ZWI7CiAgdC5maXZlY2lyY2xlID0gMHgyNDY0OwogIHQuZml2ZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGU7CiAgdC5maXZlZGV2YSA9IDB4MDk2YjsKICB0LmZpdmVlaWdodGhzID0gMHgyMTVkOwogIHQuZml2ZWd1amFyYXRpID0gMHgwYWViOwogIHQuZml2ZWd1cm11a2hpID0gMHgwYTZiOwogIHQuZml2ZWhhY2thcmFiaWMgPSAweDA2NjU7CiAgdC5maXZlaGFuZ3pob3UgPSAweDMwMjU7CiAgdC5maXZlaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNDsKICB0LmZpdmVpbmZlcmlvciA9IDB4MjA4NTsKICB0LmZpdmVtb25vc3BhY2UgPSAweGZmMTU7CiAgdC5maXZlb2xkc3R5bGUgPSAweGY3MzU7CiAgdC5maXZlcGFyZW4gPSAweDI0Nzg7CiAgdC5maXZlcGVyaW9kID0gMHgyNDhjOwogIHQuZml2ZXBlcnNpYW4gPSAweDA2ZjU7CiAgdC5maXZlcm9tYW4gPSAweDIxNzQ7CiAgdC5maXZlc3VwZXJpb3IgPSAweDIwNzU7CiAgdC5maXZldGhhaSA9IDB4MGU1NTsKICB0LmZsID0gMHhmYjAyOwogIHQuZl9sID0gMHhmYjAyOwogIHQuZmxvcmluID0gMHgwMTkyOwogIHQuZm1vbm9zcGFjZSA9IDB4ZmY0NjsKICB0LmZtc3F1YXJlID0gMHgzMzk5OwogIHQuZm9mYW50aGFpID0gMHgwZTFmOwogIHQuZm9mYXRoYWkgPSAweDBlMWQ7CiAgdC5mb25nbWFudGhhaSA9IDB4MGU0ZjsKICB0LmZvcmFsbCA9IDB4MjIwMDsKICB0LmZvdXIgPSAweDAwMzQ7CiAgdC5mb3VyYXJhYmljID0gMHgwNjY0OwogIHQuZm91cmJlbmdhbGkgPSAweDA5ZWE7CiAgdC5mb3VyY2lyY2xlID0gMHgyNDYzOwogIHQuZm91cmNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGQ7CiAgdC5mb3VyZGV2YSA9IDB4MDk2YTsKICB0LmZvdXJndWphcmF0aSA9IDB4MGFlYTsKICB0LmZvdXJndXJtdWtoaSA9IDB4MGE2YTsKICB0LmZvdXJoYWNrYXJhYmljID0gMHgwNjY0OwogIHQuZm91cmhhbmd6aG91ID0gMHgzMDI0OwogIHQuZm91cmlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjM7CiAgdC5mb3VyaW5mZXJpb3IgPSAweDIwODQ7CiAgdC5mb3VybW9ub3NwYWNlID0gMHhmZjE0OwogIHQuZm91cm51bWVyYXRvcmJlbmdhbGkgPSAweDA5Zjc7CiAgdC5mb3Vyb2xkc3R5bGUgPSAweGY3MzQ7CiAgdC5mb3VycGFyZW4gPSAweDI0Nzc7CiAgdC5mb3VycGVyaW9kID0gMHgyNDhiOwogIHQuZm91cnBlcnNpYW4gPSAweDA2ZjQ7CiAgdC5mb3Vycm9tYW4gPSAweDIxNzM7CiAgdC5mb3Vyc3VwZXJpb3IgPSAweDIwNzQ7CiAgdC5mb3VydGVlbmNpcmNsZSA9IDB4MjQ2ZDsKICB0LmZvdXJ0ZWVucGFyZW4gPSAweDI0ODE7CiAgdC5mb3VydGVlbnBlcmlvZCA9IDB4MjQ5NTsKICB0LmZvdXJ0aGFpID0gMHgwZTU0OwogIHQuZm91cnRodG9uZWNoaW5lc2UgPSAweDAyY2I7CiAgdC5mcGFyZW4gPSAweDI0YTE7CiAgdC5mcmFjdGlvbiA9IDB4MjA0NDsKICB0LmZyYW5jID0gMHgyMGEzOwogIHQuZyA9IDB4MDA2NzsKICB0LmdhYmVuZ2FsaSA9IDB4MDk5NzsKICB0LmdhY3V0ZSA9IDB4MDFmNTsKICB0LmdhZGV2YSA9IDB4MDkxNzsKICB0LmdhZmFyYWJpYyA9IDB4MDZhZjsKICB0LmdhZmZpbmFsYXJhYmljID0gMHhmYjkzOwogIHQuZ2FmaW5pdGlhbGFyYWJpYyA9IDB4ZmI5NDsKICB0LmdhZm1lZGlhbGFyYWJpYyA9IDB4ZmI5NTsKICB0LmdhZ3VqYXJhdGkgPSAweDBhOTc7CiAgdC5nYWd1cm11a2hpID0gMHgwYTE3OwogIHQuZ2FoaXJhZ2FuYSA9IDB4MzA0YzsKICB0Lmdha2F0YWthbmEgPSAweDMwYWM7CiAgdC5nYW1tYSA9IDB4MDNiMzsKICB0LmdhbW1hbGF0aW5zbWFsbCA9IDB4MDI2MzsKICB0LmdhbW1hc3VwZXJpb3IgPSAweDAyZTA7CiAgdC5nYW5naWFjb3B0aWMgPSAweDAzZWI7CiAgdC5nYm9wb21vZm8gPSAweDMxMGQ7CiAgdC5nYnJldmUgPSAweDAxMWY7CiAgdC5nY2Fyb24gPSAweDAxZTc7CiAgdC5nY2VkaWxsYSA9IDB4MDEyMzsKICB0LmdjaXJjbGUgPSAweDI0ZDY7CiAgdC5nY2lyY3VtZmxleCA9IDB4MDExZDsKICB0Lmdjb21tYWFjY2VudCA9IDB4MDEyMzsKICB0Lmdkb3QgPSAweDAxMjE7CiAgdC5nZG90YWNjZW50ID0gMHgwMTIxOwogIHQuZ2VjeXJpbGxpYyA9IDB4MDQzMzsKICB0LmdlaGlyYWdhbmEgPSAweDMwNTI7CiAgdC5nZWthdGFrYW5hID0gMHgzMGIyOwogIHQuZ2VvbWV0cmljYWxseWVxdWFsID0gMHgyMjUxOwogIHQuZ2VyZXNoYWNjZW50aGVicmV3ID0gMHgwNTljOwogIHQuZ2VyZXNoaGVicmV3ID0gMHgwNWYzOwogIHQuZ2VyZXNobXVxZGFtaGVicmV3ID0gMHgwNTlkOwogIHQuZ2VybWFuZGJscyA9IDB4MDBkZjsKICB0LmdlcnNoYXlpbWFjY2VudGhlYnJldyA9IDB4MDU5ZTsKICB0LmdlcnNoYXlpbWhlYnJldyA9IDB4MDVmNDsKICB0LmdldGFtYXJrID0gMHgzMDEzOwogIHQuZ2hhYmVuZ2FsaSA9IDB4MDk5ODsKICB0LmdoYWRhcm1lbmlhbiA9IDB4MDU3MjsKICB0LmdoYWRldmEgPSAweDA5MTg7CiAgdC5naGFndWphcmF0aSA9IDB4MGE5ODsKICB0LmdoYWd1cm11a2hpID0gMHgwYTE4OwogIHQuZ2hhaW5hcmFiaWMgPSAweDA2M2E7CiAgdC5naGFpbmZpbmFsYXJhYmljID0gMHhmZWNlOwogIHQuZ2hhaW5pbml0aWFsYXJhYmljID0gMHhmZWNmOwogIHQuZ2hhaW5tZWRpYWxhcmFiaWMgPSAweGZlZDA7CiAgdC5naGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0OTU7CiAgdC5naGVzdHJva2VjeXJpbGxpYyA9IDB4MDQ5MzsKICB0LmdoZXVwdHVybmN5cmlsbGljID0gMHgwNDkxOwogIHQuZ2hoYWRldmEgPSAweDA5NWE7CiAgdC5naGhhZ3VybXVraGkgPSAweDBhNWE7CiAgdC5naG9vayA9IDB4MDI2MDsKICB0LmdoenNxdWFyZSA9IDB4MzM5MzsKICB0LmdpaGlyYWdhbmEgPSAweDMwNGU7CiAgdC5naWthdGFrYW5hID0gMHgzMGFlOwogIHQuZ2ltYXJtZW5pYW4gPSAweDA1NjM7CiAgdC5naW1lbCA9IDB4MDVkMjsKICB0LmdpbWVsZGFnZXNoID0gMHhmYjMyOwogIHQuZ2ltZWxkYWdlc2hoZWJyZXcgPSAweGZiMzI7CiAgdC5naW1lbGhlYnJldyA9IDB4MDVkMjsKICB0LmdqZWN5cmlsbGljID0gMHgwNDUzOwogIHQuZ2xvdHRhbGludmVydGVkc3Ryb2tlID0gMHgwMWJlOwogIHQuZ2xvdHRhbHN0b3AgPSAweDAyOTQ7CiAgdC5nbG90dGFsc3RvcGludmVydGVkID0gMHgwMjk2OwogIHQuZ2xvdHRhbHN0b3Btb2QgPSAweDAyYzA7CiAgdC5nbG90dGFsc3RvcHJldmVyc2VkID0gMHgwMjk1OwogIHQuZ2xvdHRhbHN0b3ByZXZlcnNlZG1vZCA9IDB4MDJjMTsKICB0Lmdsb3R0YWxzdG9wcmV2ZXJzZWRzdXBlcmlvciA9IDB4MDJlNDsKICB0Lmdsb3R0YWxzdG9wc3Ryb2tlID0gMHgwMmExOwogIHQuZ2xvdHRhbHN0b3BzdHJva2VyZXZlcnNlZCA9IDB4MDJhMjsKICB0LmdtYWNyb24gPSAweDFlMjE7CiAgdC5nbW9ub3NwYWNlID0gMHhmZjQ3OwogIHQuZ29oaXJhZ2FuYSA9IDB4MzA1NDsKICB0Lmdva2F0YWthbmEgPSAweDMwYjQ7CiAgdC5ncGFyZW4gPSAweDI0YTI7CiAgdC5ncGFzcXVhcmUgPSAweDMzYWM7CiAgdC5ncmFkaWVudCA9IDB4MjIwNzsKICB0LmdyYXZlID0gMHgwMDYwOwogIHQuZ3JhdmViZWxvd2NtYiA9IDB4MDMxNjsKICB0LmdyYXZlY21iID0gMHgwMzAwOwogIHQuZ3JhdmVjb21iID0gMHgwMzAwOwogIHQuZ3JhdmVkZXZhID0gMHgwOTUzOwogIHQuZ3JhdmVsb3dtb2QgPSAweDAyY2U7CiAgdC5ncmF2ZW1vbm9zcGFjZSA9IDB4ZmY0MDsKICB0LmdyYXZldG9uZWNtYiA9IDB4MDM0MDsKICB0LmdyZWF0ZXIgPSAweDAwM2U7CiAgdC5ncmVhdGVyZXF1YWwgPSAweDIyNjU7CiAgdC5ncmVhdGVyZXF1YWxvcmxlc3MgPSAweDIyZGI7CiAgdC5ncmVhdGVybW9ub3NwYWNlID0gMHhmZjFlOwogIHQuZ3JlYXRlcm9yZXF1aXZhbGVudCA9IDB4MjI3MzsKICB0LmdyZWF0ZXJvcmxlc3MgPSAweDIyNzc7CiAgdC5ncmVhdGVyb3ZlcmVxdWFsID0gMHgyMjY3OwogIHQuZ3JlYXRlcnNtYWxsID0gMHhmZTY1OwogIHQuZ3NjcmlwdCA9IDB4MDI2MTsKICB0LmdzdHJva2UgPSAweDAxZTU7CiAgdC5ndWhpcmFnYW5hID0gMHgzMDUwOwogIHQuZ3VpbGxlbW90bGVmdCA9IDB4MDBhYjsKICB0Lmd1aWxsZW1vdHJpZ2h0ID0gMHgwMGJiOwogIHQuZ3VpbHNpbmdsbGVmdCA9IDB4MjAzOTsKICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMHgyMDNhOwogIHQuZ3VrYXRha2FuYSA9IDB4MzBiMDsKICB0Lmd1cmFtdXNxdWFyZSA9IDB4MzMxODsKICB0Lmd5c3F1YXJlID0gMHgzM2M5OwogIHQuaCA9IDB4MDA2ODsKICB0LmhhYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YTk7CiAgdC5oYWFsdG9uZWFyYWJpYyA9IDB4MDZjMTsKICB0LmhhYmVuZ2FsaSA9IDB4MDliOTsKICB0LmhhZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YjM7CiAgdC5oYWRldmEgPSAweDA5Mzk7CiAgdC5oYWd1amFyYXRpID0gMHgwYWI5OwogIHQuaGFndXJtdWtoaSA9IDB4MGEzOTsKICB0LmhhaGFyYWJpYyA9IDB4MDYyZDsKICB0LmhhaGZpbmFsYXJhYmljID0gMHhmZWEyOwogIHQuaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVhMzsKICB0LmhhaGlyYWdhbmEgPSAweDMwNmY7CiAgdC5oYWhtZWRpYWxhcmFiaWMgPSAweGZlYTQ7CiAgdC5oYWl0dXNxdWFyZSA9IDB4MzMyYTsKICB0Lmhha2F0YWthbmEgPSAweDMwY2Y7CiAgdC5oYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjhhOwogIHQuaGFsYW50Z3VybXVraGkgPSAweDBhNGQ7CiAgdC5oYW16YWFyYWJpYyA9IDB4MDYyMTsKICB0LmhhbXphbG93YXJhYmljID0gMHgwNjIxOwogIHQuaGFuZ3VsZmlsbGVyID0gMHgzMTY0OwogIHQuaGFyZHNpZ25jeXJpbGxpYyA9IDB4MDQ0YTsKICB0LmhhcnBvb25sZWZ0YmFyYnVwID0gMHgyMWJjOwogIHQuaGFycG9vbnJpZ2h0YmFyYnVwID0gMHgyMWMwOwogIHQuaGFzcXVhcmUgPSAweDMzY2E7CiAgdC5oYXRhZnBhdGFoID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaDE2ID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaDIzID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaDJmID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaGhlYnJldyA9IDB4MDViMjsKICB0LmhhdGFmcGF0YWhuYXJyb3doZWJyZXcgPSAweDA1YjI7CiAgdC5oYXRhZnBhdGFocXVhcnRlcmhlYnJldyA9IDB4MDViMjsKICB0LmhhdGFmcGF0YWh3aWRlaGVicmV3ID0gMHgwNWIyOwogIHQuaGF0YWZxYW1hdHMgPSAweDA1YjM7CiAgdC5oYXRhZnFhbWF0czFiID0gMHgwNWIzOwogIHQuaGF0YWZxYW1hdHMyOCA9IDB4MDViMzsKICB0LmhhdGFmcWFtYXRzMzQgPSAweDA1YjM7CiAgdC5oYXRhZnFhbWF0c2hlYnJldyA9IDB4MDViMzsKICB0LmhhdGFmcWFtYXRzbmFycm93aGVicmV3ID0gMHgwNWIzOwogIHQuaGF0YWZxYW1hdHNxdWFydGVyaGVicmV3ID0gMHgwNWIzOwogIHQuaGF0YWZxYW1hdHN3aWRlaGVicmV3ID0gMHgwNWIzOwogIHQuaGF0YWZzZWdvbCA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2wxNyA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2wyNCA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2wzMCA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2xoZWJyZXcgPSAweDA1YjE7CiAgdC5oYXRhZnNlZ29sbmFycm93aGVicmV3ID0gMHgwNWIxOwogIHQuaGF0YWZzZWdvbHF1YXJ0ZXJoZWJyZXcgPSAweDA1YjE7CiAgdC5oYXRhZnNlZ29sd2lkZWhlYnJldyA9IDB4MDViMTsKICB0LmhiYXIgPSAweDAxMjc7CiAgdC5oYm9wb21vZm8gPSAweDMxMGY7CiAgdC5oYnJldmViZWxvdyA9IDB4MWUyYjsKICB0LmhjZWRpbGxhID0gMHgxZTI5OwogIHQuaGNpcmNsZSA9IDB4MjRkNzsKICB0LmhjaXJjdW1mbGV4ID0gMHgwMTI1OwogIHQuaGRpZXJlc2lzID0gMHgxZTI3OwogIHQuaGRvdGFjY2VudCA9IDB4MWUyMzsKICB0Lmhkb3RiZWxvdyA9IDB4MWUyNTsKICB0LmhlID0gMHgwNWQ0OwogIHQuaGVhcnQgPSAweDI2NjU7CiAgdC5oZWFydHN1aXRibGFjayA9IDB4MjY2NTsKICB0LmhlYXJ0c3VpdHdoaXRlID0gMHgyNjYxOwogIHQuaGVkYWdlc2ggPSAweGZiMzQ7CiAgdC5oZWRhZ2VzaGhlYnJldyA9IDB4ZmIzNDsKICB0LmhlaGFsdG9uZWFyYWJpYyA9IDB4MDZjMTsKICB0LmhlaGFyYWJpYyA9IDB4MDY0NzsKICB0LmhlaGVicmV3ID0gMHgwNWQ0OwogIHQuaGVoZmluYWxhbHRvbmVhcmFiaWMgPSAweGZiYTc7CiAgdC5oZWhmaW5hbGFsdHR3b2FyYWJpYyA9IDB4ZmVlYTsKICB0LmhlaGZpbmFsYXJhYmljID0gMHhmZWVhOwogIHQuaGVoaGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmYmE1OwogIHQuaGVoaGFtemFhYm92ZWlzb2xhdGVkYXJhYmljID0gMHhmYmE0OwogIHQuaGVoaW5pdGlhbGFsdG9uZWFyYWJpYyA9IDB4ZmJhODsKICB0LmhlaGluaXRpYWxhcmFiaWMgPSAweGZlZWI7CiAgdC5oZWhpcmFnYW5hID0gMHgzMDc4OwogIHQuaGVobWVkaWFsYWx0b25lYXJhYmljID0gMHhmYmE5OwogIHQuaGVobWVkaWFsYXJhYmljID0gMHhmZWVjOwogIHQuaGVpc2VpZXJhc3F1YXJlID0gMHgzMzdiOwogIHQuaGVrYXRha2FuYSA9IDB4MzBkODsKICB0Lmhla2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGQ7CiAgdC5oZWt1dGFhcnVzcXVhcmUgPSAweDMzMzY7CiAgdC5oZW5naG9vayA9IDB4MDI2NzsKICB0LmhlcnV0dXNxdWFyZSA9IDB4MzMzOTsKICB0LmhldCA9IDB4MDVkNzsKICB0LmhldGhlYnJldyA9IDB4MDVkNzsKICB0Lmhob29rID0gMHgwMjY2OwogIHQuaGhvb2tzdXBlcmlvciA9IDB4MDJiMTsKICB0LmhpZXVoYWNpcmNsZWtvcmVhbiA9IDB4MzI3YjsKICB0LmhpZXVoYXBhcmVua29yZWFuID0gMHgzMjFiOwogIHQuaGlldWhjaXJjbGVrb3JlYW4gPSAweDMyNmQ7CiAgdC5oaWV1aGtvcmVhbiA9IDB4MzE0ZTsKICB0LmhpZXVocGFyZW5rb3JlYW4gPSAweDMyMGQ7CiAgdC5oaWhpcmFnYW5hID0gMHgzMDcyOwogIHQuaGlrYXRha2FuYSA9IDB4MzBkMjsKICB0Lmhpa2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGI7CiAgdC5oaXJpcSA9IDB4MDViNDsKICB0LmhpcmlxMTQgPSAweDA1YjQ7CiAgdC5oaXJpcTIxID0gMHgwNWI0OwogIHQuaGlyaXEyZCA9IDB4MDViNDsKICB0LmhpcmlxaGVicmV3ID0gMHgwNWI0OwogIHQuaGlyaXFuYXJyb3doZWJyZXcgPSAweDA1YjQ7CiAgdC5oaXJpcXF1YXJ0ZXJoZWJyZXcgPSAweDA1YjQ7CiAgdC5oaXJpcXdpZGVoZWJyZXcgPSAweDA1YjQ7CiAgdC5obGluZWJlbG93ID0gMHgxZTk2OwogIHQuaG1vbm9zcGFjZSA9IDB4ZmY0ODsKICB0LmhvYXJtZW5pYW4gPSAweDA1NzA7CiAgdC5ob2hpcHRoYWkgPSAweDBlMmI7CiAgdC5ob2hpcmFnYW5hID0gMHgzMDdiOwogIHQuaG9rYXRha2FuYSA9IDB4MzBkYjsKICB0Lmhva2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGU7CiAgdC5ob2xhbSA9IDB4MDViOTsKICB0LmhvbGFtMTkgPSAweDA1Yjk7CiAgdC5ob2xhbTI2ID0gMHgwNWI5OwogIHQuaG9sYW0zMiA9IDB4MDViOTsKICB0LmhvbGFtaGVicmV3ID0gMHgwNWI5OwogIHQuaG9sYW1uYXJyb3doZWJyZXcgPSAweDA1Yjk7CiAgdC5ob2xhbXF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjk7CiAgdC5ob2xhbXdpZGVoZWJyZXcgPSAweDA1Yjk7CiAgdC5ob25va2h1a3RoYWkgPSAweDBlMmU7CiAgdC5ob29rYWJvdmVjb21iID0gMHgwMzA5OwogIHQuaG9va2NtYiA9IDB4MDMwOTsKICB0Lmhvb2twYWxhdGFsaXplZGJlbG93Y21iID0gMHgwMzIxOwogIHQuaG9va3JldHJvZmxleGJlbG93Y21iID0gMHgwMzIyOwogIHQuaG9vbnNxdWFyZSA9IDB4MzM0MjsKICB0Lmhvcmljb3B0aWMgPSAweDAzZTk7CiAgdC5ob3Jpem9udGFsYmFyID0gMHgyMDE1OwogIHQuaG9ybmNtYiA9IDB4MDMxYjsKICB0LmhvdHNwcmluZ3MgPSAweDI2Njg7CiAgdC5ob3VzZSA9IDB4MjMwMjsKICB0LmhwYXJlbiA9IDB4MjRhMzsKICB0LmhzdXBlcmlvciA9IDB4MDJiMDsKICB0Lmh0dXJuZWQgPSAweDAyNjU7CiAgdC5odWhpcmFnYW5hID0gMHgzMDc1OwogIHQuaHVpaXRvc3F1YXJlID0gMHgzMzMzOwogIHQuaHVrYXRha2FuYSA9IDB4MzBkNTsKICB0Lmh1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGM7CiAgdC5odW5nYXJ1bWxhdXQgPSAweDAyZGQ7CiAgdC5odW5nYXJ1bWxhdXRjbWIgPSAweDAzMGI7CiAgdC5odiA9IDB4MDE5NTsKICB0Lmh5cGhlbiA9IDB4MDAyZDsKICB0Lmh5cGhlbmluZmVyaW9yID0gMHhmNmU1OwogIHQuaHlwaGVubW9ub3NwYWNlID0gMHhmZjBkOwogIHQuaHlwaGVuc21hbGwgPSAweGZlNjM7CiAgdC5oeXBoZW5zdXBlcmlvciA9IDB4ZjZlNjsKICB0Lmh5cGhlbnR3byA9IDB4MjAxMDsKICB0LmkgPSAweDAwNjk7CiAgdC5pYWN1dGUgPSAweDAwZWQ7CiAgdC5pYWN5cmlsbGljID0gMHgwNDRmOwogIHQuaWJlbmdhbGkgPSAweDA5ODc7CiAgdC5pYm9wb21vZm8gPSAweDMxMjc7CiAgdC5pYnJldmUgPSAweDAxMmQ7CiAgdC5pY2Fyb24gPSAweDAxZDA7CiAgdC5pY2lyY2xlID0gMHgyNGQ4OwogIHQuaWNpcmN1bWZsZXggPSAweDAwZWU7CiAgdC5pY3lyaWxsaWMgPSAweDA0NTY7CiAgdC5pZGJsZ3JhdmUgPSAweDAyMDk7CiAgdC5pZGVvZ3JhcGhlYXJ0aGNpcmNsZSA9IDB4MzI4ZjsKICB0LmlkZW9ncmFwaGZpcmVjaXJjbGUgPSAweDMyOGI7CiAgdC5pZGVvZ3JhcGhpY2FsbGlhbmNlcGFyZW4gPSAweDMyM2Y7CiAgdC5pZGVvZ3JhcGhpY2NhbGxwYXJlbiA9IDB4MzIzYTsKICB0LmlkZW9ncmFwaGljY2VudHJlY2lyY2xlID0gMHgzMmE1OwogIHQuaWRlb2dyYXBoaWNjbG9zZSA9IDB4MzAwNjsKICB0LmlkZW9ncmFwaGljY29tbWEgPSAweDMwMDE7CiAgdC5pZGVvZ3JhcGhpY2NvbW1hbGVmdCA9IDB4ZmY2NDsKICB0LmlkZW9ncmFwaGljY29uZ3JhdHVsYXRpb25wYXJlbiA9IDB4MzIzNzsKICB0LmlkZW9ncmFwaGljY29ycmVjdGNpcmNsZSA9IDB4MzJhMzsKICB0LmlkZW9ncmFwaGljZWFydGhwYXJlbiA9IDB4MzIyZjsKICB0LmlkZW9ncmFwaGljZW50ZXJwcmlzZXBhcmVuID0gMHgzMjNkOwogIHQuaWRlb2dyYXBoaWNleGNlbGxlbnRjaXJjbGUgPSAweDMyOWQ7CiAgdC5pZGVvZ3JhcGhpY2Zlc3RpdmFscGFyZW4gPSAweDMyNDA7CiAgdC5pZGVvZ3JhcGhpY2ZpbmFuY2lhbGNpcmNsZSA9IDB4MzI5NjsKICB0LmlkZW9ncmFwaGljZmluYW5jaWFscGFyZW4gPSAweDMyMzY7CiAgdC5pZGVvZ3JhcGhpY2ZpcmVwYXJlbiA9IDB4MzIyYjsKICB0LmlkZW9ncmFwaGljaGF2ZXBhcmVuID0gMHgzMjMyOwogIHQuaWRlb2dyYXBoaWNoaWdoY2lyY2xlID0gMHgzMmE0OwogIHQuaWRlb2dyYXBoaWNpdGVyYXRpb25tYXJrID0gMHgzMDA1OwogIHQuaWRlb2dyYXBoaWNsYWJvcmNpcmNsZSA9IDB4MzI5ODsKICB0LmlkZW9ncmFwaGljbGFib3JwYXJlbiA9IDB4MzIzODsKICB0LmlkZW9ncmFwaGljbGVmdGNpcmNsZSA9IDB4MzJhNzsKICB0LmlkZW9ncmFwaGljbG93Y2lyY2xlID0gMHgzMmE2OwogIHQuaWRlb2dyYXBoaWNtZWRpY2luZWNpcmNsZSA9IDB4MzJhOTsKICB0LmlkZW9ncmFwaGljbWV0YWxwYXJlbiA9IDB4MzIyZTsKICB0LmlkZW9ncmFwaGljbW9vbnBhcmVuID0gMHgzMjJhOwogIHQuaWRlb2dyYXBoaWNuYW1lcGFyZW4gPSAweDMyMzQ7CiAgdC5pZGVvZ3JhcGhpY3BlcmlvZCA9IDB4MzAwMjsKICB0LmlkZW9ncmFwaGljcHJpbnRjaXJjbGUgPSAweDMyOWU7CiAgdC5pZGVvZ3JhcGhpY3JlYWNocGFyZW4gPSAweDMyNDM7CiAgdC5pZGVvZ3JhcGhpY3JlcHJlc2VudHBhcmVuID0gMHgzMjM5OwogIHQuaWRlb2dyYXBoaWNyZXNvdXJjZXBhcmVuID0gMHgzMjNlOwogIHQuaWRlb2dyYXBoaWNyaWdodGNpcmNsZSA9IDB4MzJhODsKICB0LmlkZW9ncmFwaGljc2VjcmV0Y2lyY2xlID0gMHgzMjk5OwogIHQuaWRlb2dyYXBoaWNzZWxmcGFyZW4gPSAweDMyNDI7CiAgdC5pZGVvZ3JhcGhpY3NvY2lldHlwYXJlbiA9IDB4MzIzMzsKICB0LmlkZW9ncmFwaGljc3BhY2UgPSAweDMwMDA7CiAgdC5pZGVvZ3JhcGhpY3NwZWNpYWxwYXJlbiA9IDB4MzIzNTsKICB0LmlkZW9ncmFwaGljc3RvY2twYXJlbiA9IDB4MzIzMTsKICB0LmlkZW9ncmFwaGljc3R1ZHlwYXJlbiA9IDB4MzIzYjsKICB0LmlkZW9ncmFwaGljc3VucGFyZW4gPSAweDMyMzA7CiAgdC5pZGVvZ3JhcGhpY3N1cGVydmlzZXBhcmVuID0gMHgzMjNjOwogIHQuaWRlb2dyYXBoaWN3YXRlcnBhcmVuID0gMHgzMjJjOwogIHQuaWRlb2dyYXBoaWN3b29kcGFyZW4gPSAweDMyMmQ7CiAgdC5pZGVvZ3JhcGhpY3plcm8gPSAweDMwMDc7CiAgdC5pZGVvZ3JhcGhtZXRhbGNpcmNsZSA9IDB4MzI4ZTsKICB0LmlkZW9ncmFwaG1vb25jaXJjbGUgPSAweDMyOGE7CiAgdC5pZGVvZ3JhcGhuYW1lY2lyY2xlID0gMHgzMjk0OwogIHQuaWRlb2dyYXBoc3VuY2lyY2xlID0gMHgzMjkwOwogIHQuaWRlb2dyYXBod2F0ZXJjaXJjbGUgPSAweDMyOGM7CiAgdC5pZGVvZ3JhcGh3b29kY2lyY2xlID0gMHgzMjhkOwogIHQuaWRldmEgPSAweDA5MDc7CiAgdC5pZGllcmVzaXMgPSAweDAwZWY7CiAgdC5pZGllcmVzaXNhY3V0ZSA9IDB4MWUyZjsKICB0LmlkaWVyZXNpc2N5cmlsbGljID0gMHgwNGU1OwogIHQuaWRvdGJlbG93ID0gMHgxZWNiOwogIHQuaWVicmV2ZWN5cmlsbGljID0gMHgwNGQ3OwogIHQuaWVjeXJpbGxpYyA9IDB4MDQzNTsKICB0LmlldW5nYWNpcmNsZWtvcmVhbiA9IDB4MzI3NTsKICB0LmlldW5nYXBhcmVua29yZWFuID0gMHgzMjE1OwogIHQuaWV1bmdjaXJjbGVrb3JlYW4gPSAweDMyNjc7CiAgdC5pZXVuZ2tvcmVhbiA9IDB4MzE0NzsKICB0LmlldW5ncGFyZW5rb3JlYW4gPSAweDMyMDc7CiAgdC5pZ3JhdmUgPSAweDAwZWM7CiAgdC5pZ3VqYXJhdGkgPSAweDBhODc7CiAgdC5pZ3VybXVraGkgPSAweDBhMDc7CiAgdC5paGlyYWdhbmEgPSAweDMwNDQ7CiAgdC5paG9va2Fib3ZlID0gMHgxZWM5OwogIHQuaWliZW5nYWxpID0gMHgwOTg4OwogIHQuaWljeXJpbGxpYyA9IDB4MDQzODsKICB0LmlpZGV2YSA9IDB4MDkwODsKICB0LmlpZ3VqYXJhdGkgPSAweDBhODg7CiAgdC5paWd1cm11a2hpID0gMHgwYTA4OwogIHQuaWltYXRyYWd1cm11a2hpID0gMHgwYTQwOwogIHQuaWludmVydGVkYnJldmUgPSAweDAyMGI7CiAgdC5paXNob3J0Y3lyaWxsaWMgPSAweDA0Mzk7CiAgdC5paXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzA7CiAgdC5paXZvd2Vsc2lnbmRldmEgPSAweDA5NDA7CiAgdC5paXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWMwOwogIHQuaWogPSAweDAxMzM7CiAgdC5pa2F0YWthbmEgPSAweDMwYTQ7CiAgdC5pa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzI7CiAgdC5pa29yZWFuID0gMHgzMTYzOwogIHQuaWxkZSA9IDB4MDJkYzsKICB0LmlsdXloZWJyZXcgPSAweDA1YWM7CiAgdC5pbWFjcm9uID0gMHgwMTJiOwogIHQuaW1hY3JvbmN5cmlsbGljID0gMHgwNGUzOwogIHQuaW1hZ2VvcmFwcHJveGltYXRlbHllcXVhbCA9IDB4MjI1MzsKICB0LmltYXRyYWd1cm11a2hpID0gMHgwYTNmOwogIHQuaW1vbm9zcGFjZSA9IDB4ZmY0OTsKICB0LmluY3JlbWVudCA9IDB4MjIwNjsKICB0LmluZmluaXR5ID0gMHgyMjFlOwogIHQuaW5pYXJtZW5pYW4gPSAweDA1NmI7CiAgdC5pbnRlZ3JhbCA9IDB4MjIyYjsKICB0LmludGVncmFsYm90dG9tID0gMHgyMzIxOwogIHQuaW50ZWdyYWxidCA9IDB4MjMyMTsKICB0LmludGVncmFsZXggPSAweGY4ZjU7CiAgdC5pbnRlZ3JhbHRvcCA9IDB4MjMyMDsKICB0LmludGVncmFsdHAgPSAweDIzMjA7CiAgdC5pbnRlcnNlY3Rpb24gPSAweDIyMjk7CiAgdC5pbnRpc3F1YXJlID0gMHgzMzA1OwogIHQuaW52YnVsbGV0ID0gMHgyNWQ4OwogIHQuaW52Y2lyY2xlID0gMHgyNWQ5OwogIHQuaW52c21pbGVmYWNlID0gMHgyNjNiOwogIHQuaW9jeXJpbGxpYyA9IDB4MDQ1MTsKICB0LmlvZ29uZWsgPSAweDAxMmY7CiAgdC5pb3RhID0gMHgwM2I5OwogIHQuaW90YWRpZXJlc2lzID0gMHgwM2NhOwogIHQuaW90YWRpZXJlc2lzdG9ub3MgPSAweDAzOTA7CiAgdC5pb3RhbGF0aW4gPSAweDAyNjk7CiAgdC5pb3RhdG9ub3MgPSAweDAzYWY7CiAgdC5pcGFyZW4gPSAweDI0YTQ7CiAgdC5pcmlndXJtdWtoaSA9IDB4MGE3MjsKICB0LmlzbWFsbGhpcmFnYW5hID0gMHgzMDQzOwogIHQuaXNtYWxsa2F0YWthbmEgPSAweDMwYTM7CiAgdC5pc21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2ODsKICB0Lmlzc2hhcmJlbmdhbGkgPSAweDA5ZmE7CiAgdC5pc3Ryb2tlID0gMHgwMjY4OwogIHQuaXN1cGVyaW9yID0gMHhmNmVkOwogIHQuaXRlcmF0aW9uaGlyYWdhbmEgPSAweDMwOWQ7CiAgdC5pdGVyYXRpb25rYXRha2FuYSA9IDB4MzBmZDsKICB0Lml0aWxkZSA9IDB4MDEyOTsKICB0Lml0aWxkZWJlbG93ID0gMHgxZTJkOwogIHQuaXVib3BvbW9mbyA9IDB4MzEyOTsKICB0Lml1Y3lyaWxsaWMgPSAweDA0NGU7CiAgdC5pdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDliZjsKICB0Lml2b3dlbHNpZ25kZXZhID0gMHgwOTNmOwogIHQuaXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWJmOwogIHQuaXpoaXRzYWN5cmlsbGljID0gMHgwNDc1OwogIHQuaXpoaXRzYWRibGdyYXZlY3lyaWxsaWMgPSAweDA0Nzc7CiAgdC5qID0gMHgwMDZhOwogIHQuamFhcm1lbmlhbiA9IDB4MDU3MTsKICB0LmphYmVuZ2FsaSA9IDB4MDk5YzsKICB0LmphZGV2YSA9IDB4MDkxYzsKICB0LmphZ3VqYXJhdGkgPSAweDBhOWM7CiAgdC5qYWd1cm11a2hpID0gMHgwYTFjOwogIHQuamJvcG9tb2ZvID0gMHgzMTEwOwogIHQuamNhcm9uID0gMHgwMWYwOwogIHQuamNpcmNsZSA9IDB4MjRkOTsKICB0LmpjaXJjdW1mbGV4ID0gMHgwMTM1OwogIHQuamNyb3NzZWR0YWlsID0gMHgwMjlkOwogIHQuamRvdGxlc3NzdHJva2UgPSAweDAyNWY7CiAgdC5qZWN5cmlsbGljID0gMHgwNDU4OwogIHQuamVlbWFyYWJpYyA9IDB4MDYyYzsKICB0LmplZW1maW5hbGFyYWJpYyA9IDB4ZmU5ZTsKICB0LmplZW1pbml0aWFsYXJhYmljID0gMHhmZTlmOwogIHQuamVlbW1lZGlhbGFyYWJpYyA9IDB4ZmVhMDsKICB0LmplaGFyYWJpYyA9IDB4MDY5ODsKICB0LmplaGZpbmFsYXJhYmljID0gMHhmYjhiOwogIHQuamhhYmVuZ2FsaSA9IDB4MDk5ZDsKICB0LmpoYWRldmEgPSAweDA5MWQ7CiAgdC5qaGFndWphcmF0aSA9IDB4MGE5ZDsKICB0LmpoYWd1cm11a2hpID0gMHgwYTFkOwogIHQuamhlaGFybWVuaWFuID0gMHgwNTdiOwogIHQuamlzID0gMHgzMDA0OwogIHQuam1vbm9zcGFjZSA9IDB4ZmY0YTsKICB0LmpwYXJlbiA9IDB4MjRhNTsKICB0LmpzdXBlcmlvciA9IDB4MDJiMjsKICB0LmsgPSAweDAwNmI7CiAgdC5rYWJhc2hraXJjeXJpbGxpYyA9IDB4MDRhMTsKICB0LmthYmVuZ2FsaSA9IDB4MDk5NTsKICB0LmthY3V0ZSA9IDB4MWUzMTsKICB0LmthY3lyaWxsaWMgPSAweDA0M2E7CiAgdC5rYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDliOwogIHQua2FkZXZhID0gMHgwOTE1OwogIHQua2FmID0gMHgwNWRiOwogIHQua2FmYXJhYmljID0gMHgwNjQzOwogIHQua2FmZGFnZXNoID0gMHhmYjNiOwogIHQua2FmZGFnZXNoaGVicmV3ID0gMHhmYjNiOwogIHQua2FmZmluYWxhcmFiaWMgPSAweGZlZGE7CiAgdC5rYWZoZWJyZXcgPSAweDA1ZGI7CiAgdC5rYWZpbml0aWFsYXJhYmljID0gMHhmZWRiOwogIHQua2FmbWVkaWFsYXJhYmljID0gMHhmZWRjOwogIHQua2FmcmFmZWhlYnJldyA9IDB4ZmI0ZDsKICB0LmthZ3VqYXJhdGkgPSAweDBhOTU7CiAgdC5rYWd1cm11a2hpID0gMHgwYTE1OwogIHQua2FoaXJhZ2FuYSA9IDB4MzA0YjsKICB0LmthaG9va2N5cmlsbGljID0gMHgwNGM0OwogIHQua2FrYXRha2FuYSA9IDB4MzBhYjsKICB0Lmtha2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzY7CiAgdC5rYXBwYSA9IDB4MDNiYTsKICB0LmthcHBhc3ltYm9sZ3JlZWsgPSAweDAzZjA7CiAgdC5rYXB5ZW91bm1pZXVta29yZWFuID0gMHgzMTcxOwogIHQua2FweWVvdW5waGlldXBoa29yZWFuID0gMHgzMTg0OwogIHQua2FweWVvdW5waWV1cGtvcmVhbiA9IDB4MzE3ODsKICB0LmthcHllb3Vuc3NhbmdwaWV1cGtvcmVhbiA9IDB4MzE3OTsKICB0Lmthcm9yaWlzcXVhcmUgPSAweDMzMGQ7CiAgdC5rYXNoaWRhYXV0b2FyYWJpYyA9IDB4MDY0MDsKICB0Lmthc2hpZGFhdXRvbm9zaWRlYmVhcmluZ2FyYWJpYyA9IDB4MDY0MDsKICB0Lmthc21hbGxrYXRha2FuYSA9IDB4MzBmNTsKICB0Lmthc3F1YXJlID0gMHgzMzg0OwogIHQua2FzcmFhcmFiaWMgPSAweDA2NTA7CiAgdC5rYXNyYXRhbmFyYWJpYyA9IDB4MDY0ZDsKICB0Lmthc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWY7CiAgdC5rYXRhaGlyYXByb2xvbmdtYXJraGFsZndpZHRoID0gMHhmZjcwOwogIHQua2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNDlkOwogIHQua2JvcG9tb2ZvID0gMHgzMTBlOwogIHQua2NhbHNxdWFyZSA9IDB4MzM4OTsKICB0LmtjYXJvbiA9IDB4MDFlOTsKICB0LmtjZWRpbGxhID0gMHgwMTM3OwogIHQua2NpcmNsZSA9IDB4MjRkYTsKICB0Lmtjb21tYWFjY2VudCA9IDB4MDEzNzsKICB0Lmtkb3RiZWxvdyA9IDB4MWUzMzsKICB0LmtlaGFybWVuaWFuID0gMHgwNTg0OwogIHQua2VoaXJhZ2FuYSA9IDB4MzA1MTsKICB0Lmtla2F0YWthbmEgPSAweDMwYjE7CiAgdC5rZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc5OwogIHQua2VuYXJtZW5pYW4gPSAweDA1NmY7CiAgdC5rZXNtYWxsa2F0YWthbmEgPSAweDMwZjY7CiAgdC5rZ3JlZW5sYW5kaWMgPSAweDAxMzg7CiAgdC5raGFiZW5nYWxpID0gMHgwOTk2OwogIHQua2hhY3lyaWxsaWMgPSAweDA0NDU7CiAgdC5raGFkZXZhID0gMHgwOTE2OwogIHQua2hhZ3VqYXJhdGkgPSAweDBhOTY7CiAgdC5raGFndXJtdWtoaSA9IDB4MGExNjsKICB0LmtoYWhhcmFiaWMgPSAweDA2MmU7CiAgdC5raGFoZmluYWxhcmFiaWMgPSAweGZlYTY7CiAgdC5raGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVhNzsKICB0LmtoYWhtZWRpYWxhcmFiaWMgPSAweGZlYTg7CiAgdC5raGVpY29wdGljID0gMHgwM2U3OwogIHQua2hoYWRldmEgPSAweDA5NTk7CiAgdC5raGhhZ3VybXVraGkgPSAweDBhNTk7CiAgdC5raGlldWtoYWNpcmNsZWtvcmVhbiA9IDB4MzI3ODsKICB0LmtoaWV1a2hhcGFyZW5rb3JlYW4gPSAweDMyMTg7CiAgdC5raGlldWtoY2lyY2xla29yZWFuID0gMHgzMjZhOwogIHQua2hpZXVraGtvcmVhbiA9IDB4MzE0YjsKICB0LmtoaWV1a2hwYXJlbmtvcmVhbiA9IDB4MzIwYTsKICB0Lmtob2toYWl0aGFpID0gMHgwZTAyOwogIHQua2hva2hvbnRoYWkgPSAweDBlMDU7CiAgdC5raG9raHVhdHRoYWkgPSAweDBlMDM7CiAgdC5raG9raHdhaXRoYWkgPSAweDBlMDQ7CiAgdC5raG9tdXR0aGFpID0gMHgwZTViOwogIHQua2hvb2sgPSAweDAxOTk7CiAgdC5raG9yYWtoYW5ndGhhaSA9IDB4MGUwNjsKICB0LmtoenNxdWFyZSA9IDB4MzM5MTsKICB0LmtpaGlyYWdhbmEgPSAweDMwNGQ7CiAgdC5raWthdGFrYW5hID0gMHgzMGFkOwogIHQua2lrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3NzsKICB0Lmtpcm9ndXJhbXVzcXVhcmUgPSAweDMzMTU7CiAgdC5raXJvbWVldG9ydXNxdWFyZSA9IDB4MzMxNjsKICB0Lmtpcm9zcXVhcmUgPSAweDMzMTQ7CiAgdC5raXllb2thY2lyY2xla29yZWFuID0gMHgzMjZlOwogIHQua2l5ZW9rYXBhcmVua29yZWFuID0gMHgzMjBlOwogIHQua2l5ZW9rY2lyY2xla29yZWFuID0gMHgzMjYwOwogIHQua2l5ZW9ra29yZWFuID0gMHgzMTMxOwogIHQua2l5ZW9rcGFyZW5rb3JlYW4gPSAweDMyMDA7CiAgdC5raXllb2tzaW9za29yZWFuID0gMHgzMTMzOwogIHQua2plY3lyaWxsaWMgPSAweDA0NWM7CiAgdC5rbGluZWJlbG93ID0gMHgxZTM1OwogIHQua2xzcXVhcmUgPSAweDMzOTg7CiAgdC5rbWN1YmVkc3F1YXJlID0gMHgzM2E2OwogIHQua21vbm9zcGFjZSA9IDB4ZmY0YjsKICB0Lmttc3F1YXJlZHNxdWFyZSA9IDB4MzNhMjsKICB0LmtvaGlyYWdhbmEgPSAweDMwNTM7CiAgdC5rb2htc3F1YXJlID0gMHgzM2MwOwogIHQua29rYWl0aGFpID0gMHgwZTAxOwogIHQua29rYXRha2FuYSA9IDB4MzBiMzsKICB0Lmtva2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2E7CiAgdC5rb29wb3NxdWFyZSA9IDB4MzMxZTsKICB0LmtvcHBhY3lyaWxsaWMgPSAweDA0ODE7CiAgdC5rb3JlYW5zdGFuZGFyZHN5bWJvbCA9IDB4MzI3ZjsKICB0Lmtvcm9uaXNjbWIgPSAweDAzNDM7CiAgdC5rcGFyZW4gPSAweDI0YTY7CiAgdC5rcGFzcXVhcmUgPSAweDMzYWE7CiAgdC5rc2ljeXJpbGxpYyA9IDB4MDQ2ZjsKICB0Lmt0c3F1YXJlID0gMHgzM2NmOwogIHQua3R1cm5lZCA9IDB4MDI5ZTsKICB0Lmt1aGlyYWdhbmEgPSAweDMwNGY7CiAgdC5rdWthdGFrYW5hID0gMHgzMGFmOwogIHQua3VrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ODsKICB0Lmt2c3F1YXJlID0gMHgzM2I4OwogIHQua3dzcXVhcmUgPSAweDMzYmU7CiAgdC5sID0gMHgwMDZjOwogIHQubGFiZW5nYWxpID0gMHgwOWIyOwogIHQubGFjdXRlID0gMHgwMTNhOwogIHQubGFkZXZhID0gMHgwOTMyOwogIHQubGFndWphcmF0aSA9IDB4MGFiMjsKICB0LmxhZ3VybXVraGkgPSAweDBhMzI7CiAgdC5sYWtraGFuZ3lhb3RoYWkgPSAweDBlNDU7CiAgdC5sYW1hbGVmZmluYWxhcmFiaWMgPSAweGZlZmM7CiAgdC5sYW1hbGVmaGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmZWY4OwogIHQubGFtYWxlZmhhbXphYWJvdmVpc29sYXRlZGFyYWJpYyA9IDB4ZmVmNzsKICB0LmxhbWFsZWZoYW16YWJlbG93ZmluYWxhcmFiaWMgPSAweGZlZmE7CiAgdC5sYW1hbGVmaGFtemFiZWxvd2lzb2xhdGVkYXJhYmljID0gMHhmZWY5OwogIHQubGFtYWxlZmlzb2xhdGVkYXJhYmljID0gMHhmZWZiOwogIHQubGFtYWxlZm1hZGRhYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmVmNjsKICB0LmxhbWFsZWZtYWRkYWFib3ZlaXNvbGF0ZWRhcmFiaWMgPSAweGZlZjU7CiAgdC5sYW1hcmFiaWMgPSAweDA2NDQ7CiAgdC5sYW1iZGEgPSAweDAzYmI7CiAgdC5sYW1iZGFzdHJva2UgPSAweDAxOWI7CiAgdC5sYW1lZCA9IDB4MDVkYzsKICB0LmxhbWVkZGFnZXNoID0gMHhmYjNjOwogIHQubGFtZWRkYWdlc2hoZWJyZXcgPSAweGZiM2M7CiAgdC5sYW1lZGhlYnJldyA9IDB4MDVkYzsKICB0LmxhbWZpbmFsYXJhYmljID0gMHhmZWRlOwogIHQubGFtaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmNjYTsKICB0LmxhbWluaXRpYWxhcmFiaWMgPSAweGZlZGY7CiAgdC5sYW1qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNjOTsKICB0LmxhbWtoYWhpbml0aWFsYXJhYmljID0gMHhmY2NiOwogIHQubGFtbGFtaGVoaXNvbGF0ZWRhcmFiaWMgPSAweGZkZjI7CiAgdC5sYW1tZWRpYWxhcmFiaWMgPSAweGZlZTA7CiAgdC5sYW1tZWVtaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmQ4ODsKICB0LmxhbW1lZW1pbml0aWFsYXJhYmljID0gMHhmY2NjOwogIHQubGFyZ2VjaXJjbGUgPSAweDI1ZWY7CiAgdC5sYmFyID0gMHgwMTlhOwogIHQubGJlbHQgPSAweDAyNmM7CiAgdC5sYm9wb21vZm8gPSAweDMxMGM7CiAgdC5sY2Fyb24gPSAweDAxM2U7CiAgdC5sY2VkaWxsYSA9IDB4MDEzYzsKICB0LmxjaXJjbGUgPSAweDI0ZGI7CiAgdC5sY2lyY3VtZmxleGJlbG93ID0gMHgxZTNkOwogIHQubGNvbW1hYWNjZW50ID0gMHgwMTNjOwogIHQubGRvdCA9IDB4MDE0MDsKICB0Lmxkb3RhY2NlbnQgPSAweDAxNDA7CiAgdC5sZG90YmVsb3cgPSAweDFlMzc7CiAgdC5sZG90YmVsb3dtYWNyb24gPSAweDFlMzk7CiAgdC5sZWZ0YW5nbGVhYm92ZWNtYiA9IDB4MDMxYTsKICB0LmxlZnR0YWNrYmVsb3djbWIgPSAweDAzMTg7CiAgdC5sZXNzID0gMHgwMDNjOwogIHQubGVzc2VxdWFsID0gMHgyMjY0OwogIHQubGVzc2VxdWFsb3JncmVhdGVyID0gMHgyMmRhOwogIHQubGVzc21vbm9zcGFjZSA9IDB4ZmYxYzsKICB0Lmxlc3NvcmVxdWl2YWxlbnQgPSAweDIyNzI7CiAgdC5sZXNzb3JncmVhdGVyID0gMHgyMjc2OwogIHQubGVzc292ZXJlcXVhbCA9IDB4MjI2NjsKICB0Lmxlc3NzbWFsbCA9IDB4ZmU2NDsKICB0LmxlemggPSAweDAyNmU7CiAgdC5sZmJsb2NrID0gMHgyNThjOwogIHQubGhvb2tyZXRyb2ZsZXggPSAweDAyNmQ7CiAgdC5saXJhID0gMHgyMGE0OwogIHQubGl3bmFybWVuaWFuID0gMHgwNTZjOwogIHQubGogPSAweDAxYzk7CiAgdC5samVjeXJpbGxpYyA9IDB4MDQ1OTsKICB0LmxsID0gMHhmNmMwOwogIHQubGxhZGV2YSA9IDB4MDkzMzsKICB0LmxsYWd1amFyYXRpID0gMHgwYWIzOwogIHQubGxpbmViZWxvdyA9IDB4MWUzYjsKICB0LmxsbGFkZXZhID0gMHgwOTM0OwogIHQubGx2b2NhbGljYmVuZ2FsaSA9IDB4MDllMTsKICB0Lmxsdm9jYWxpY2RldmEgPSAweDA5NjE7CiAgdC5sbHZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWUzOwogIHQubGx2b2NhbGljdm93ZWxzaWduZGV2YSA9IDB4MDk2MzsKICB0LmxtaWRkbGV0aWxkZSA9IDB4MDI2YjsKICB0Lmxtb25vc3BhY2UgPSAweGZmNGM7CiAgdC5sbXNxdWFyZSA9IDB4MzNkMDsKICB0LmxvY2h1bGF0aGFpID0gMHgwZTJjOwogIHQubG9naWNhbGFuZCA9IDB4MjIyNzsKICB0LmxvZ2ljYWxub3QgPSAweDAwYWM7CiAgdC5sb2dpY2Fsbm90cmV2ZXJzZWQgPSAweDIzMTA7CiAgdC5sb2dpY2Fsb3IgPSAweDIyMjg7CiAgdC5sb2xpbmd0aGFpID0gMHgwZTI1OwogIHQubG9uZ3MgPSAweDAxN2Y7CiAgdC5sb3dsaW5lY2VudGVybGluZSA9IDB4ZmU0ZTsKICB0Lmxvd2xpbmVjbWIgPSAweDAzMzI7CiAgdC5sb3dsaW5lZGFzaGVkID0gMHhmZTRkOwogIHQubG96ZW5nZSA9IDB4MjVjYTsKICB0LmxwYXJlbiA9IDB4MjRhNzsKICB0LmxzbGFzaCA9IDB4MDE0MjsKICB0LmxzcXVhcmUgPSAweDIxMTM7CiAgdC5sc3VwZXJpb3IgPSAweGY2ZWU7CiAgdC5sdHNoYWRlID0gMHgyNTkxOwogIHQubHV0aGFpID0gMHgwZTI2OwogIHQubHZvY2FsaWNiZW5nYWxpID0gMHgwOThjOwogIHQubHZvY2FsaWNkZXZhID0gMHgwOTBjOwogIHQubHZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWUyOwogIHQubHZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTYyOwogIHQubHhzcXVhcmUgPSAweDMzZDM7CiAgdC5tID0gMHgwMDZkOwogIHQubWFiZW5nYWxpID0gMHgwOWFlOwogIHQubWFjcm9uID0gMHgwMGFmOwogIHQubWFjcm9uYmVsb3djbWIgPSAweDAzMzE7CiAgdC5tYWNyb25jbWIgPSAweDAzMDQ7CiAgdC5tYWNyb25sb3dtb2QgPSAweDAyY2Q7CiAgdC5tYWNyb25tb25vc3BhY2UgPSAweGZmZTM7CiAgdC5tYWN1dGUgPSAweDFlM2Y7CiAgdC5tYWRldmEgPSAweDA5MmU7CiAgdC5tYWd1amFyYXRpID0gMHgwYWFlOwogIHQubWFndXJtdWtoaSA9IDB4MGEyZTsKICB0Lm1haGFwYWtoaGVicmV3ID0gMHgwNWE0OwogIHQubWFoYXBha2hsZWZ0aGVicmV3ID0gMHgwNWE0OwogIHQubWFoaXJhZ2FuYSA9IDB4MzA3ZTsKICB0Lm1haWNoYXR0YXdhbG93bGVmdHRoYWkgPSAweGY4OTU7CiAgdC5tYWljaGF0dGF3YWxvd3JpZ2h0dGhhaSA9IDB4Zjg5NDsKICB0Lm1haWNoYXR0YXdhdGhhaSA9IDB4MGU0YjsKICB0Lm1haWNoYXR0YXdhdXBwZXJsZWZ0dGhhaSA9IDB4Zjg5MzsKICB0Lm1haWVrbG93bGVmdHRoYWkgPSAweGY4OGM7CiAgdC5tYWlla2xvd3JpZ2h0dGhhaSA9IDB4Zjg4YjsKICB0Lm1haWVrdGhhaSA9IDB4MGU0ODsKICB0Lm1haWVrdXBwZXJsZWZ0dGhhaSA9IDB4Zjg4YTsKICB0Lm1haWhhbmFrYXRsZWZ0dGhhaSA9IDB4Zjg4NDsKICB0Lm1haWhhbmFrYXR0aGFpID0gMHgwZTMxOwogIHQubWFpdGFpa2h1bGVmdHRoYWkgPSAweGY4ODk7CiAgdC5tYWl0YWlraHV0aGFpID0gMHgwZTQ3OwogIHQubWFpdGhvbG93bGVmdHRoYWkgPSAweGY4OGY7CiAgdC5tYWl0aG9sb3dyaWdodHRoYWkgPSAweGY4OGU7CiAgdC5tYWl0aG90aGFpID0gMHgwZTQ5OwogIHQubWFpdGhvdXBwZXJsZWZ0dGhhaSA9IDB4Zjg4ZDsKICB0Lm1haXRyaWxvd2xlZnR0aGFpID0gMHhmODkyOwogIHQubWFpdHJpbG93cmlnaHR0aGFpID0gMHhmODkxOwogIHQubWFpdHJpdGhhaSA9IDB4MGU0YTsKICB0Lm1haXRyaXVwcGVybGVmdHRoYWkgPSAweGY4OTA7CiAgdC5tYWl5YW1va3RoYWkgPSAweDBlNDY7CiAgdC5tYWthdGFrYW5hID0gMHgzMGRlOwogIHQubWFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ZjsKICB0Lm1hbGUgPSAweDI2NDI7CiAgdC5tYW5zeW9uc3F1YXJlID0gMHgzMzQ3OwogIHQubWFxYWZoZWJyZXcgPSAweDA1YmU7CiAgdC5tYXJzID0gMHgyNjQyOwogIHQubWFzb3JhY2lyY2xlaGVicmV3ID0gMHgwNWFmOwogIHQubWFzcXVhcmUgPSAweDMzODM7CiAgdC5tYm9wb21vZm8gPSAweDMxMDc7CiAgdC5tYnNxdWFyZSA9IDB4MzNkNDsKICB0Lm1jaXJjbGUgPSAweDI0ZGM7CiAgdC5tY3ViZWRzcXVhcmUgPSAweDMzYTU7CiAgdC5tZG90YWNjZW50ID0gMHgxZTQxOwogIHQubWRvdGJlbG93ID0gMHgxZTQzOwogIHQubWVlbWFyYWJpYyA9IDB4MDY0NTsKICB0Lm1lZW1maW5hbGFyYWJpYyA9IDB4ZmVlMjsKICB0Lm1lZW1pbml0aWFsYXJhYmljID0gMHhmZWUzOwogIHQubWVlbW1lZGlhbGFyYWJpYyA9IDB4ZmVlNDsKICB0Lm1lZW1tZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkMTsKICB0Lm1lZW1tZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNDg7CiAgdC5tZWV0b3J1c3F1YXJlID0gMHgzMzRkOwogIHQubWVoaXJhZ2FuYSA9IDB4MzA4MTsKICB0Lm1laXppZXJhc3F1YXJlID0gMHgzMzdlOwogIHQubWVrYXRha2FuYSA9IDB4MzBlMTsKICB0Lm1la2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTI7CiAgdC5tZW0gPSAweDA1ZGU7CiAgdC5tZW1kYWdlc2ggPSAweGZiM2U7CiAgdC5tZW1kYWdlc2hoZWJyZXcgPSAweGZiM2U7CiAgdC5tZW1oZWJyZXcgPSAweDA1ZGU7CiAgdC5tZW5hcm1lbmlhbiA9IDB4MDU3NDsKICB0Lm1lcmtoYWhlYnJldyA9IDB4MDVhNTsKICB0Lm1lcmtoYWtlZnVsYWhlYnJldyA9IDB4MDVhNjsKICB0Lm1lcmtoYWtlZnVsYWxlZnRoZWJyZXcgPSAweDA1YTY7CiAgdC5tZXJraGFsZWZ0aGVicmV3ID0gMHgwNWE1OwogIHQubWhvb2sgPSAweDAyNzE7CiAgdC5taHpzcXVhcmUgPSAweDMzOTI7CiAgdC5taWRkbGVkb3RrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2NTsKICB0Lm1pZGRvdCA9IDB4MDBiNzsKICB0Lm1pZXVtYWNpcmNsZWtvcmVhbiA9IDB4MzI3MjsKICB0Lm1pZXVtYXBhcmVua29yZWFuID0gMHgzMjEyOwogIHQubWlldW1jaXJjbGVrb3JlYW4gPSAweDMyNjQ7CiAgdC5taWV1bWtvcmVhbiA9IDB4MzE0MTsKICB0Lm1pZXVtcGFuc2lvc2tvcmVhbiA9IDB4MzE3MDsKICB0Lm1pZXVtcGFyZW5rb3JlYW4gPSAweDMyMDQ7CiAgdC5taWV1bXBpZXVwa29yZWFuID0gMHgzMTZlOwogIHQubWlldW1zaW9za29yZWFuID0gMHgzMTZmOwogIHQubWloaXJhZ2FuYSA9IDB4MzA3ZjsKICB0Lm1pa2F0YWthbmEgPSAweDMwZGY7CiAgdC5taWthdGFrYW5haGFsZndpZHRoID0gMHhmZjkwOwogIHQubWludXMgPSAweDIyMTI7CiAgdC5taW51c2JlbG93Y21iID0gMHgwMzIwOwogIHQubWludXNjaXJjbGUgPSAweDIyOTY7CiAgdC5taW51c21vZCA9IDB4MDJkNzsKICB0Lm1pbnVzcGx1cyA9IDB4MjIxMzsKICB0Lm1pbnV0ZSA9IDB4MjAzMjsKICB0Lm1pcmliYWFydXNxdWFyZSA9IDB4MzM0YTsKICB0Lm1pcmlzcXVhcmUgPSAweDMzNDk7CiAgdC5tbG9uZ2xlZ3R1cm5lZCA9IDB4MDI3MDsKICB0Lm1sc3F1YXJlID0gMHgzMzk2OwogIHQubW1jdWJlZHNxdWFyZSA9IDB4MzNhMzsKICB0Lm1tb25vc3BhY2UgPSAweGZmNGQ7CiAgdC5tbXNxdWFyZWRzcXVhcmUgPSAweDMzOWY7CiAgdC5tb2hpcmFnYW5hID0gMHgzMDgyOwogIHQubW9obXNxdWFyZSA9IDB4MzNjMTsKICB0Lm1va2F0YWthbmEgPSAweDMwZTI7CiAgdC5tb2thdGFrYW5haGFsZndpZHRoID0gMHhmZjkzOwogIHQubW9sc3F1YXJlID0gMHgzM2Q2OwogIHQubW9tYXRoYWkgPSAweDBlMjE7CiAgdC5tb3ZlcnNzcXVhcmUgPSAweDMzYTc7CiAgdC5tb3ZlcnNzcXVhcmVkc3F1YXJlID0gMHgzM2E4OwogIHQubXBhcmVuID0gMHgyNGE4OwogIHQubXBhc3F1YXJlID0gMHgzM2FiOwogIHQubXNzcXVhcmUgPSAweDMzYjM7CiAgdC5tc3VwZXJpb3IgPSAweGY2ZWY7CiAgdC5tdHVybmVkID0gMHgwMjZmOwogIHQubXUgPSAweDAwYjU7CiAgdC5tdTEgPSAweDAwYjU7CiAgdC5tdWFzcXVhcmUgPSAweDMzODI7CiAgdC5tdWNoZ3JlYXRlciA9IDB4MjI2YjsKICB0Lm11Y2hsZXNzID0gMHgyMjZhOwogIHQubXVmc3F1YXJlID0gMHgzMzhjOwogIHQubXVncmVlayA9IDB4MDNiYzsKICB0Lm11Z3NxdWFyZSA9IDB4MzM4ZDsKICB0Lm11aGlyYWdhbmEgPSAweDMwODA7CiAgdC5tdWthdGFrYW5hID0gMHgzMGUwOwogIHQubXVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5MTsKICB0Lm11bHNxdWFyZSA9IDB4MzM5NTsKICB0Lm11bHRpcGx5ID0gMHgwMGQ3OwogIHQubXVtc3F1YXJlID0gMHgzMzliOwogIHQubXVuYWhoZWJyZXcgPSAweDA1YTM7CiAgdC5tdW5haGxlZnRoZWJyZXcgPSAweDA1YTM7CiAgdC5tdXNpY2Fsbm90ZSA9IDB4MjY2YTsKICB0Lm11c2ljYWxub3RlZGJsID0gMHgyNjZiOwogIHQubXVzaWNmbGF0c2lnbiA9IDB4MjY2ZDsKICB0Lm11c2ljc2hhcnBzaWduID0gMHgyNjZmOwogIHQubXVzc3F1YXJlID0gMHgzM2IyOwogIHQubXV2c3F1YXJlID0gMHgzM2I2OwogIHQubXV3c3F1YXJlID0gMHgzM2JjOwogIHQubXZtZWdhc3F1YXJlID0gMHgzM2I5OwogIHQubXZzcXVhcmUgPSAweDMzYjc7CiAgdC5td21lZ2FzcXVhcmUgPSAweDMzYmY7CiAgdC5td3NxdWFyZSA9IDB4MzNiZDsKICB0Lm4gPSAweDAwNmU7CiAgdC5uYWJlbmdhbGkgPSAweDA5YTg7CiAgdC5uYWJsYSA9IDB4MjIwNzsKICB0Lm5hY3V0ZSA9IDB4MDE0NDsKICB0Lm5hZGV2YSA9IDB4MDkyODsKICB0Lm5hZ3VqYXJhdGkgPSAweDBhYTg7CiAgdC5uYWd1cm11a2hpID0gMHgwYTI4OwogIHQubmFoaXJhZ2FuYSA9IDB4MzA2YTsKICB0Lm5ha2F0YWthbmEgPSAweDMwY2E7CiAgdC5uYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg1OwogIHQubmFwb3N0cm9waGUgPSAweDAxNDk7CiAgdC5uYXNxdWFyZSA9IDB4MzM4MTsKICB0Lm5ib3BvbW9mbyA9IDB4MzEwYjsKICB0Lm5ic3BhY2UgPSAweDAwYTA7CiAgdC5uY2Fyb24gPSAweDAxNDg7CiAgdC5uY2VkaWxsYSA9IDB4MDE0NjsKICB0Lm5jaXJjbGUgPSAweDI0ZGQ7CiAgdC5uY2lyY3VtZmxleGJlbG93ID0gMHgxZTRiOwogIHQubmNvbW1hYWNjZW50ID0gMHgwMTQ2OwogIHQubmRvdGFjY2VudCA9IDB4MWU0NTsKICB0Lm5kb3RiZWxvdyA9IDB4MWU0NzsKICB0Lm5laGlyYWdhbmEgPSAweDMwNmQ7CiAgdC5uZWthdGFrYW5hID0gMHgzMGNkOwogIHQubmVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ODsKICB0Lm5ld3NoZXFlbHNpZ24gPSAweDIwYWE7CiAgdC5uZnNxdWFyZSA9IDB4MzM4YjsKICB0Lm5nYWJlbmdhbGkgPSAweDA5OTk7CiAgdC5uZ2FkZXZhID0gMHgwOTE5OwogIHQubmdhZ3VqYXJhdGkgPSAweDBhOTk7CiAgdC5uZ2FndXJtdWtoaSA9IDB4MGExOTsKICB0Lm5nb25ndXRoYWkgPSAweDBlMDc7CiAgdC5uaGlyYWdhbmEgPSAweDMwOTM7CiAgdC5uaG9va2xlZnQgPSAweDAyNzI7CiAgdC5uaG9va3JldHJvZmxleCA9IDB4MDI3MzsKICB0Lm5pZXVuYWNpcmNsZWtvcmVhbiA9IDB4MzI2ZjsKICB0Lm5pZXVuYXBhcmVua29yZWFuID0gMHgzMjBmOwogIHQubmlldW5jaWV1Y2tvcmVhbiA9IDB4MzEzNTsKICB0Lm5pZXVuY2lyY2xla29yZWFuID0gMHgzMjYxOwogIHQubmlldW5oaWV1aGtvcmVhbiA9IDB4MzEzNjsKICB0Lm5pZXVua29yZWFuID0gMHgzMTM0OwogIHQubmlldW5wYW5zaW9za29yZWFuID0gMHgzMTY4OwogIHQubmlldW5wYXJlbmtvcmVhbiA9IDB4MzIwMTsKICB0Lm5pZXVuc2lvc2tvcmVhbiA9IDB4MzE2NzsKICB0Lm5pZXVudGlrZXV0a29yZWFuID0gMHgzMTY2OwogIHQubmloaXJhZ2FuYSA9IDB4MzA2YjsKICB0Lm5pa2F0YWthbmEgPSAweDMwY2I7CiAgdC5uaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg2OwogIHQubmlraGFoaXRsZWZ0dGhhaSA9IDB4Zjg5OTsKICB0Lm5pa2hhaGl0dGhhaSA9IDB4MGU0ZDsKICB0Lm5pbmUgPSAweDAwMzk7CiAgdC5uaW5lYXJhYmljID0gMHgwNjY5OwogIHQubmluZWJlbmdhbGkgPSAweDA5ZWY7CiAgdC5uaW5lY2lyY2xlID0gMHgyNDY4OwogIHQubmluZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OTI7CiAgdC5uaW5lZGV2YSA9IDB4MDk2ZjsKICB0Lm5pbmVndWphcmF0aSA9IDB4MGFlZjsKICB0Lm5pbmVndXJtdWtoaSA9IDB4MGE2ZjsKICB0Lm5pbmVoYWNrYXJhYmljID0gMHgwNjY5OwogIHQubmluZWhhbmd6aG91ID0gMHgzMDI5OwogIHQubmluZWlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjg7CiAgdC5uaW5laW5mZXJpb3IgPSAweDIwODk7CiAgdC5uaW5lbW9ub3NwYWNlID0gMHhmZjE5OwogIHQubmluZW9sZHN0eWxlID0gMHhmNzM5OwogIHQubmluZXBhcmVuID0gMHgyNDdjOwogIHQubmluZXBlcmlvZCA9IDB4MjQ5MDsKICB0Lm5pbmVwZXJzaWFuID0gMHgwNmY5OwogIHQubmluZXJvbWFuID0gMHgyMTc4OwogIHQubmluZXN1cGVyaW9yID0gMHgyMDc5OwogIHQubmluZXRlZW5jaXJjbGUgPSAweDI0NzI7CiAgdC5uaW5ldGVlbnBhcmVuID0gMHgyNDg2OwogIHQubmluZXRlZW5wZXJpb2QgPSAweDI0OWE7CiAgdC5uaW5ldGhhaSA9IDB4MGU1OTsKICB0Lm5qID0gMHgwMWNjOwogIHQubmplY3lyaWxsaWMgPSAweDA0NWE7CiAgdC5ua2F0YWthbmEgPSAweDMwZjM7CiAgdC5ua2F0YWthbmFoYWxmd2lkdGggPSAweGZmOWQ7CiAgdC5ubGVncmlnaHRsb25nID0gMHgwMTllOwogIHQubmxpbmViZWxvdyA9IDB4MWU0OTsKICB0Lm5tb25vc3BhY2UgPSAweGZmNGU7CiAgdC5ubXNxdWFyZSA9IDB4MzM5YTsKICB0Lm5uYWJlbmdhbGkgPSAweDA5YTM7CiAgdC5ubmFkZXZhID0gMHgwOTIzOwogIHQubm5hZ3VqYXJhdGkgPSAweDBhYTM7CiAgdC5ubmFndXJtdWtoaSA9IDB4MGEyMzsKICB0Lm5ubmFkZXZhID0gMHgwOTI5OwogIHQubm9oaXJhZ2FuYSA9IDB4MzA2ZTsKICB0Lm5va2F0YWthbmEgPSAweDMwY2U7CiAgdC5ub2thdGFrYW5haGFsZndpZHRoID0gMHhmZjg5OwogIHQubm9uYnJlYWtpbmdzcGFjZSA9IDB4MDBhMDsKICB0Lm5vbmVudGhhaSA9IDB4MGUxMzsKICB0Lm5vbnV0aGFpID0gMHgwZTE5OwogIHQubm9vbmFyYWJpYyA9IDB4MDY0NjsKICB0Lm5vb25maW5hbGFyYWJpYyA9IDB4ZmVlNjsKICB0Lm5vb25naHVubmFhcmFiaWMgPSAweDA2YmE7CiAgdC5ub29uZ2h1bm5hZmluYWxhcmFiaWMgPSAweGZiOWY7CiAgdC5ub29uaW5pdGlhbGFyYWJpYyA9IDB4ZmVlNzsKICB0Lm5vb25qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkMjsKICB0Lm5vb25qZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNGI7CiAgdC5ub29ubWVkaWFsYXJhYmljID0gMHhmZWU4OwogIHQubm9vbm1lZW1pbml0aWFsYXJhYmljID0gMHhmY2Q1OwogIHQubm9vbm1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM0ZTsKICB0Lm5vb25ub29uZmluYWxhcmFiaWMgPSAweGZjOGQ7CiAgdC5ub3Rjb250YWlucyA9IDB4MjIwYzsKICB0Lm5vdGVsZW1lbnQgPSAweDIyMDk7CiAgdC5ub3RlbGVtZW50b2YgPSAweDIyMDk7CiAgdC5ub3RlcXVhbCA9IDB4MjI2MDsKICB0Lm5vdGdyZWF0ZXIgPSAweDIyNmY7CiAgdC5ub3RncmVhdGVybm9yZXF1YWwgPSAweDIyNzE7CiAgdC5ub3RncmVhdGVybm9ybGVzcyA9IDB4MjI3OTsKICB0Lm5vdGlkZW50aWNhbCA9IDB4MjI2MjsKICB0Lm5vdGxlc3MgPSAweDIyNmU7CiAgdC5ub3RsZXNzbm9yZXF1YWwgPSAweDIyNzA7CiAgdC5ub3RwYXJhbGxlbCA9IDB4MjIyNjsKICB0Lm5vdHByZWNlZGVzID0gMHgyMjgwOwogIHQubm90c3Vic2V0ID0gMHgyMjg0OwogIHQubm90c3VjY2VlZHMgPSAweDIyODE7CiAgdC5ub3RzdXBlcnNldCA9IDB4MjI4NTsKICB0Lm5vd2FybWVuaWFuID0gMHgwNTc2OwogIHQubnBhcmVuID0gMHgyNGE5OwogIHQubnNzcXVhcmUgPSAweDMzYjE7CiAgdC5uc3VwZXJpb3IgPSAweDIwN2Y7CiAgdC5udGlsZGUgPSAweDAwZjE7CiAgdC5udSA9IDB4MDNiZDsKICB0Lm51aGlyYWdhbmEgPSAweDMwNmM7CiAgdC5udWthdGFrYW5hID0gMHgzMGNjOwogIHQubnVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NzsKICB0Lm51a3RhYmVuZ2FsaSA9IDB4MDliYzsKICB0Lm51a3RhZGV2YSA9IDB4MDkzYzsKICB0Lm51a3RhZ3VqYXJhdGkgPSAweDBhYmM7CiAgdC5udWt0YWd1cm11a2hpID0gMHgwYTNjOwogIHQubnVtYmVyc2lnbiA9IDB4MDAyMzsKICB0Lm51bWJlcnNpZ25tb25vc3BhY2UgPSAweGZmMDM7CiAgdC5udW1iZXJzaWduc21hbGwgPSAweGZlNWY7CiAgdC5udW1lcmFsc2lnbmdyZWVrID0gMHgwMzc0OwogIHQubnVtZXJhbHNpZ25sb3dlcmdyZWVrID0gMHgwMzc1OwogIHQubnVtZXJvID0gMHgyMTE2OwogIHQubnVuID0gMHgwNWUwOwogIHQubnVuZGFnZXNoID0gMHhmYjQwOwogIHQubnVuZGFnZXNoaGVicmV3ID0gMHhmYjQwOwogIHQubnVuaGVicmV3ID0gMHgwNWUwOwogIHQubnZzcXVhcmUgPSAweDMzYjU7CiAgdC5ud3NxdWFyZSA9IDB4MzNiYjsKICB0Lm55YWJlbmdhbGkgPSAweDA5OWU7CiAgdC5ueWFkZXZhID0gMHgwOTFlOwogIHQubnlhZ3VqYXJhdGkgPSAweDBhOWU7CiAgdC5ueWFndXJtdWtoaSA9IDB4MGExZTsKICB0Lm8gPSAweDAwNmY7CiAgdC5vYWN1dGUgPSAweDAwZjM7CiAgdC5vYW5ndGhhaSA9IDB4MGUyZDsKICB0Lm9iYXJyZWQgPSAweDAyNzU7CiAgdC5vYmFycmVkY3lyaWxsaWMgPSAweDA0ZTk7CiAgdC5vYmFycmVkZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlYjsKICB0Lm9iZW5nYWxpID0gMHgwOTkzOwogIHQub2JvcG9tb2ZvID0gMHgzMTFiOwogIHQub2JyZXZlID0gMHgwMTRmOwogIHQub2NhbmRyYWRldmEgPSAweDA5MTE7CiAgdC5vY2FuZHJhZ3VqYXJhdGkgPSAweDBhOTE7CiAgdC5vY2FuZHJhdm93ZWxzaWduZGV2YSA9IDB4MDk0OTsKICB0Lm9jYW5kcmF2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjOTsKICB0Lm9jYXJvbiA9IDB4MDFkMjsKICB0Lm9jaXJjbGUgPSAweDI0ZGU7CiAgdC5vY2lyY3VtZmxleCA9IDB4MDBmNDsKICB0Lm9jaXJjdW1mbGV4YWN1dGUgPSAweDFlZDE7CiAgdC5vY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWQ5OwogIHQub2NpcmN1bWZsZXhncmF2ZSA9IDB4MWVkMzsKICB0Lm9jaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWQ1OwogIHQub2NpcmN1bWZsZXh0aWxkZSA9IDB4MWVkNzsKICB0Lm9jeXJpbGxpYyA9IDB4MDQzZTsKICB0Lm9kYmxhY3V0ZSA9IDB4MDE1MTsKICB0Lm9kYmxncmF2ZSA9IDB4MDIwZDsKICB0Lm9kZXZhID0gMHgwOTEzOwogIHQub2RpZXJlc2lzID0gMHgwMGY2OwogIHQub2RpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTc7CiAgdC5vZG90YmVsb3cgPSAweDFlY2Q7CiAgdC5vZSA9IDB4MDE1MzsKICB0Lm9la29yZWFuID0gMHgzMTVhOwogIHQub2dvbmVrID0gMHgwMmRiOwogIHQub2dvbmVrY21iID0gMHgwMzI4OwogIHQub2dyYXZlID0gMHgwMGYyOwogIHQub2d1amFyYXRpID0gMHgwYTkzOwogIHQub2hhcm1lbmlhbiA9IDB4MDU4NTsKICB0Lm9oaXJhZ2FuYSA9IDB4MzA0YTsKICB0Lm9ob29rYWJvdmUgPSAweDFlY2Y7CiAgdC5vaG9ybiA9IDB4MDFhMTsKICB0Lm9ob3JuYWN1dGUgPSAweDFlZGI7CiAgdC5vaG9ybmRvdGJlbG93ID0gMHgxZWUzOwogIHQub2hvcm5ncmF2ZSA9IDB4MWVkZDsKICB0Lm9ob3JuaG9va2Fib3ZlID0gMHgxZWRmOwogIHQub2hvcm50aWxkZSA9IDB4MWVlMTsKICB0Lm9odW5nYXJ1bWxhdXQgPSAweDAxNTE7CiAgdC5vaSA9IDB4MDFhMzsKICB0Lm9pbnZlcnRlZGJyZXZlID0gMHgwMjBmOwogIHQub2thdGFrYW5hID0gMHgzMGFhOwogIHQub2thdGFrYW5haGFsZndpZHRoID0gMHhmZjc1OwogIHQub2tvcmVhbiA9IDB4MzE1NzsKICB0Lm9sZWhlYnJldyA9IDB4MDVhYjsKICB0Lm9tYWNyb24gPSAweDAxNGQ7CiAgdC5vbWFjcm9uYWN1dGUgPSAweDFlNTM7CiAgdC5vbWFjcm9uZ3JhdmUgPSAweDFlNTE7CiAgdC5vbWRldmEgPSAweDA5NTA7CiAgdC5vbWVnYSA9IDB4MDNjOTsKICB0Lm9tZWdhMSA9IDB4MDNkNjsKICB0Lm9tZWdhY3lyaWxsaWMgPSAweDA0NjE7CiAgdC5vbWVnYWxhdGluY2xvc2VkID0gMHgwMjc3OwogIHQub21lZ2Fyb3VuZGN5cmlsbGljID0gMHgwNDdiOwogIHQub21lZ2F0aXRsb2N5cmlsbGljID0gMHgwNDdkOwogIHQub21lZ2F0b25vcyA9IDB4MDNjZTsKICB0Lm9tZ3VqYXJhdGkgPSAweDBhZDA7CiAgdC5vbWljcm9uID0gMHgwM2JmOwogIHQub21pY3JvbnRvbm9zID0gMHgwM2NjOwogIHQub21vbm9zcGFjZSA9IDB4ZmY0ZjsKICB0Lm9uZSA9IDB4MDAzMTsKICB0Lm9uZWFyYWJpYyA9IDB4MDY2MTsKICB0Lm9uZWJlbmdhbGkgPSAweDA5ZTc7CiAgdC5vbmVjaXJjbGUgPSAweDI0NjA7CiAgdC5vbmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhhOwogIHQub25lZGV2YSA9IDB4MDk2NzsKICB0Lm9uZWRvdGVubGVhZGVyID0gMHgyMDI0OwogIHQub25lZWlnaHRoID0gMHgyMTViOwogIHQub25lZml0dGVkID0gMHhmNmRjOwogIHQub25lZ3VqYXJhdGkgPSAweDBhZTc7CiAgdC5vbmVndXJtdWtoaSA9IDB4MGE2NzsKICB0Lm9uZWhhY2thcmFiaWMgPSAweDA2NjE7CiAgdC5vbmVoYWxmID0gMHgwMGJkOwogIHQub25laGFuZ3pob3UgPSAweDMwMjE7CiAgdC5vbmVpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjIwOwogIHQub25laW5mZXJpb3IgPSAweDIwODE7CiAgdC5vbmVtb25vc3BhY2UgPSAweGZmMTE7CiAgdC5vbmVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY0OwogIHQub25lb2xkc3R5bGUgPSAweGY3MzE7CiAgdC5vbmVwYXJlbiA9IDB4MjQ3NDsKICB0Lm9uZXBlcmlvZCA9IDB4MjQ4ODsKICB0Lm9uZXBlcnNpYW4gPSAweDA2ZjE7CiAgdC5vbmVxdWFydGVyID0gMHgwMGJjOwogIHQub25lcm9tYW4gPSAweDIxNzA7CiAgdC5vbmVzdXBlcmlvciA9IDB4MDBiOTsKICB0Lm9uZXRoYWkgPSAweDBlNTE7CiAgdC5vbmV0aGlyZCA9IDB4MjE1MzsKICB0Lm9vZ29uZWsgPSAweDAxZWI7CiAgdC5vb2dvbmVrbWFjcm9uID0gMHgwMWVkOwogIHQub29ndXJtdWtoaSA9IDB4MGExMzsKICB0Lm9vbWF0cmFndXJtdWtoaSA9IDB4MGE0YjsKICB0Lm9vcGVuID0gMHgwMjU0OwogIHQub3BhcmVuID0gMHgyNGFhOwogIHQub3BlbmJ1bGxldCA9IDB4MjVlNjsKICB0Lm9wdGlvbiA9IDB4MjMyNTsKICB0Lm9yZGZlbWluaW5lID0gMHgwMGFhOwogIHQub3JkbWFzY3VsaW5lID0gMHgwMGJhOwogIHQub3J0aG9nb25hbCA9IDB4MjIxZjsKICB0Lm9zaG9ydGRldmEgPSAweDA5MTI7CiAgdC5vc2hvcnR2b3dlbHNpZ25kZXZhID0gMHgwOTRhOwogIHQub3NsYXNoID0gMHgwMGY4OwogIHQub3NsYXNoYWN1dGUgPSAweDAxZmY7CiAgdC5vc21hbGxoaXJhZ2FuYSA9IDB4MzA0OTsKICB0Lm9zbWFsbGthdGFrYW5hID0gMHgzMGE5OwogIHQub3NtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmI7CiAgdC5vc3Ryb2tlYWN1dGUgPSAweDAxZmY7CiAgdC5vc3VwZXJpb3IgPSAweGY2ZjA7CiAgdC5vdGN5cmlsbGljID0gMHgwNDdmOwogIHQub3RpbGRlID0gMHgwMGY1OwogIHQub3RpbGRlYWN1dGUgPSAweDFlNGQ7CiAgdC5vdGlsZGVkaWVyZXNpcyA9IDB4MWU0ZjsKICB0Lm91Ym9wb21vZm8gPSAweDMxMjE7CiAgdC5vdmVybGluZSA9IDB4MjAzZTsKICB0Lm92ZXJsaW5lY2VudGVybGluZSA9IDB4ZmU0YTsKICB0Lm92ZXJsaW5lY21iID0gMHgwMzA1OwogIHQub3ZlcmxpbmVkYXNoZWQgPSAweGZlNDk7CiAgdC5vdmVybGluZWRibHdhdnkgPSAweGZlNGM7CiAgdC5vdmVybGluZXdhdnkgPSAweGZlNGI7CiAgdC5vdmVyc2NvcmUgPSAweDAwYWY7CiAgdC5vdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljYjsKICB0Lm92b3dlbHNpZ25kZXZhID0gMHgwOTRiOwogIHQub3Zvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWNiOwogIHQucCA9IDB4MDA3MDsKICB0LnBhYW1wc3NxdWFyZSA9IDB4MzM4MDsKICB0LnBhYXNlbnRvc3F1YXJlID0gMHgzMzJiOwogIHQucGFiZW5nYWxpID0gMHgwOWFhOwogIHQucGFjdXRlID0gMHgxZTU1OwogIHQucGFkZXZhID0gMHgwOTJhOwogIHQucGFnZWRvd24gPSAweDIxZGY7CiAgdC5wYWdldXAgPSAweDIxZGU7CiAgdC5wYWd1amFyYXRpID0gMHgwYWFhOwogIHQucGFndXJtdWtoaSA9IDB4MGEyYTsKICB0LnBhaGlyYWdhbmEgPSAweDMwNzE7CiAgdC5wYWl5YW5ub2l0aGFpID0gMHgwZTJmOwogIHQucGFrYXRha2FuYSA9IDB4MzBkMTsKICB0LnBhbGF0YWxpemF0aW9uY3lyaWxsaWNjbWIgPSAweDA0ODQ7CiAgdC5wYWxvY2hrYWN5cmlsbGljID0gMHgwNGMwOwogIHQucGFuc2lvc2tvcmVhbiA9IDB4MzE3ZjsKICB0LnBhcmFncmFwaCA9IDB4MDBiNjsKICB0LnBhcmFsbGVsID0gMHgyMjI1OwogIHQucGFyZW5sZWZ0ID0gMHgwMDI4OwogIHQucGFyZW5sZWZ0YWx0b25lYXJhYmljID0gMHhmZDNlOwogIHQucGFyZW5sZWZ0YnQgPSAweGY4ZWQ7CiAgdC5wYXJlbmxlZnRleCA9IDB4ZjhlYzsKICB0LnBhcmVubGVmdGluZmVyaW9yID0gMHgyMDhkOwogIHQucGFyZW5sZWZ0bW9ub3NwYWNlID0gMHhmZjA4OwogIHQucGFyZW5sZWZ0c21hbGwgPSAweGZlNTk7CiAgdC5wYXJlbmxlZnRzdXBlcmlvciA9IDB4MjA3ZDsKICB0LnBhcmVubGVmdHRwID0gMHhmOGViOwogIHQucGFyZW5sZWZ0dmVydGljYWwgPSAweGZlMzU7CiAgdC5wYXJlbnJpZ2h0ID0gMHgwMDI5OwogIHQucGFyZW5yaWdodGFsdG9uZWFyYWJpYyA9IDB4ZmQzZjsKICB0LnBhcmVucmlnaHRidCA9IDB4ZjhmODsKICB0LnBhcmVucmlnaHRleCA9IDB4ZjhmNzsKICB0LnBhcmVucmlnaHRpbmZlcmlvciA9IDB4MjA4ZTsKICB0LnBhcmVucmlnaHRtb25vc3BhY2UgPSAweGZmMDk7CiAgdC5wYXJlbnJpZ2h0c21hbGwgPSAweGZlNWE7CiAgdC5wYXJlbnJpZ2h0c3VwZXJpb3IgPSAweDIwN2U7CiAgdC5wYXJlbnJpZ2h0dHAgPSAweGY4ZjY7CiAgdC5wYXJlbnJpZ2h0dmVydGljYWwgPSAweGZlMzY7CiAgdC5wYXJ0aWFsZGlmZiA9IDB4MjIwMjsKICB0LnBhc2VxaGVicmV3ID0gMHgwNWMwOwogIHQucGFzaHRhaGVicmV3ID0gMHgwNTk5OwogIHQucGFzcXVhcmUgPSAweDMzYTk7CiAgdC5wYXRhaCA9IDB4MDViNzsKICB0LnBhdGFoMTEgPSAweDA1Yjc7CiAgdC5wYXRhaDFkID0gMHgwNWI3OwogIHQucGF0YWgyYSA9IDB4MDViNzsKICB0LnBhdGFoaGVicmV3ID0gMHgwNWI3OwogIHQucGF0YWhuYXJyb3doZWJyZXcgPSAweDA1Yjc7CiAgdC5wYXRhaHF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjc7CiAgdC5wYXRhaHdpZGVoZWJyZXcgPSAweDA1Yjc7CiAgdC5wYXplcmhlYnJldyA9IDB4MDVhMTsKICB0LnBib3BvbW9mbyA9IDB4MzEwNjsKICB0LnBjaXJjbGUgPSAweDI0ZGY7CiAgdC5wZG90YWNjZW50ID0gMHgxZTU3OwogIHQucGUgPSAweDA1ZTQ7CiAgdC5wZWN5cmlsbGljID0gMHgwNDNmOwogIHQucGVkYWdlc2ggPSAweGZiNDQ7CiAgdC5wZWRhZ2VzaGhlYnJldyA9IDB4ZmI0NDsKICB0LnBlZXppc3F1YXJlID0gMHgzMzNiOwogIHQucGVmaW5hbGRhZ2VzaGhlYnJldyA9IDB4ZmI0MzsKICB0LnBlaGFyYWJpYyA9IDB4MDY3ZTsKICB0LnBlaGFybWVuaWFuID0gMHgwNTdhOwogIHQucGVoZWJyZXcgPSAweDA1ZTQ7CiAgdC5wZWhmaW5hbGFyYWJpYyA9IDB4ZmI1NzsKICB0LnBlaGluaXRpYWxhcmFiaWMgPSAweGZiNTg7CiAgdC5wZWhpcmFnYW5hID0gMHgzMDdhOwogIHQucGVobWVkaWFsYXJhYmljID0gMHhmYjU5OwogIHQucGVrYXRha2FuYSA9IDB4MzBkYTsKICB0LnBlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNGE3OwogIHQucGVyYWZlaGVicmV3ID0gMHhmYjRlOwogIHQucGVyY2VudCA9IDB4MDAyNTsKICB0LnBlcmNlbnRhcmFiaWMgPSAweDA2NmE7CiAgdC5wZXJjZW50bW9ub3NwYWNlID0gMHhmZjA1OwogIHQucGVyY2VudHNtYWxsID0gMHhmZTZhOwogIHQucGVyaW9kID0gMHgwMDJlOwogIHQucGVyaW9kYXJtZW5pYW4gPSAweDA1ODk7CiAgdC5wZXJpb2RjZW50ZXJlZCA9IDB4MDBiNzsKICB0LnBlcmlvZGhhbGZ3aWR0aCA9IDB4ZmY2MTsKICB0LnBlcmlvZGluZmVyaW9yID0gMHhmNmU3OwogIHQucGVyaW9kbW9ub3NwYWNlID0gMHhmZjBlOwogIHQucGVyaW9kc21hbGwgPSAweGZlNTI7CiAgdC5wZXJpb2RzdXBlcmlvciA9IDB4ZjZlODsKICB0LnBlcmlzcG9tZW5pZ3JlZWtjbWIgPSAweDAzNDI7CiAgdC5wZXJwZW5kaWN1bGFyID0gMHgyMmE1OwogIHQucGVydGhvdXNhbmQgPSAweDIwMzA7CiAgdC5wZXNldGEgPSAweDIwYTc7CiAgdC5wZnNxdWFyZSA9IDB4MzM4YTsKICB0LnBoYWJlbmdhbGkgPSAweDA5YWI7CiAgdC5waGFkZXZhID0gMHgwOTJiOwogIHQucGhhZ3VqYXJhdGkgPSAweDBhYWI7CiAgdC5waGFndXJtdWtoaSA9IDB4MGEyYjsKICB0LnBoaSA9IDB4MDNjNjsKICB0LnBoaTEgPSAweDAzZDU7CiAgdC5waGlldXBoYWNpcmNsZWtvcmVhbiA9IDB4MzI3YTsKICB0LnBoaWV1cGhhcGFyZW5rb3JlYW4gPSAweDMyMWE7CiAgdC5waGlldXBoY2lyY2xla29yZWFuID0gMHgzMjZjOwogIHQucGhpZXVwaGtvcmVhbiA9IDB4MzE0ZDsKICB0LnBoaWV1cGhwYXJlbmtvcmVhbiA9IDB4MzIwYzsKICB0LnBoaWxhdGluID0gMHgwMjc4OwogIHQucGhpbnRodXRoYWkgPSAweDBlM2E7CiAgdC5waGlzeW1ib2xncmVlayA9IDB4MDNkNTsKICB0LnBob29rID0gMHgwMWE1OwogIHQucGhvcGhhbnRoYWkgPSAweDBlMWU7CiAgdC5waG9waHVuZ3RoYWkgPSAweDBlMWM7CiAgdC5waG9zYW1waGFvdGhhaSA9IDB4MGUyMDsKICB0LnBpID0gMHgwM2MwOwogIHQucGlldXBhY2lyY2xla29yZWFuID0gMHgzMjczOwogIHQucGlldXBhcGFyZW5rb3JlYW4gPSAweDMyMTM7CiAgdC5waWV1cGNpZXVja29yZWFuID0gMHgzMTc2OwogIHQucGlldXBjaXJjbGVrb3JlYW4gPSAweDMyNjU7CiAgdC5waWV1cGtpeWVva2tvcmVhbiA9IDB4MzE3MjsKICB0LnBpZXVwa29yZWFuID0gMHgzMTQyOwogIHQucGlldXBwYXJlbmtvcmVhbiA9IDB4MzIwNTsKICB0LnBpZXVwc2lvc2tpeWVva2tvcmVhbiA9IDB4MzE3NDsKICB0LnBpZXVwc2lvc2tvcmVhbiA9IDB4MzE0NDsKICB0LnBpZXVwc2lvc3Rpa2V1dGtvcmVhbiA9IDB4MzE3NTsKICB0LnBpZXVwdGhpZXV0aGtvcmVhbiA9IDB4MzE3NzsKICB0LnBpZXVwdGlrZXV0a29yZWFuID0gMHgzMTczOwogIHQucGloaXJhZ2FuYSA9IDB4MzA3NDsKICB0LnBpa2F0YWthbmEgPSAweDMwZDQ7CiAgdC5waXN5bWJvbGdyZWVrID0gMHgwM2Q2OwogIHQucGl3cmFybWVuaWFuID0gMHgwNTgzOwogIHQucGxhbmNrb3ZlcjJwaSA9IDB4MjEwZjsKICB0LnBsYW5ja292ZXIycGkxID0gMHgyMTBmOwogIHQucGx1cyA9IDB4MDAyYjsKICB0LnBsdXNiZWxvd2NtYiA9IDB4MDMxZjsKICB0LnBsdXNjaXJjbGUgPSAweDIyOTU7CiAgdC5wbHVzbWludXMgPSAweDAwYjE7CiAgdC5wbHVzbW9kID0gMHgwMmQ2OwogIHQucGx1c21vbm9zcGFjZSA9IDB4ZmYwYjsKICB0LnBsdXNzbWFsbCA9IDB4ZmU2MjsKICB0LnBsdXNzdXBlcmlvciA9IDB4MjA3YTsKICB0LnBtb25vc3BhY2UgPSAweGZmNTA7CiAgdC5wbXNxdWFyZSA9IDB4MzNkODsKICB0LnBvaGlyYWdhbmEgPSAweDMwN2Q7CiAgdC5wb2ludGluZ2luZGV4ZG93bndoaXRlID0gMHgyNjFmOwogIHQucG9pbnRpbmdpbmRleGxlZnR3aGl0ZSA9IDB4MjYxYzsKICB0LnBvaW50aW5naW5kZXhyaWdodHdoaXRlID0gMHgyNjFlOwogIHQucG9pbnRpbmdpbmRleHVwd2hpdGUgPSAweDI2MWQ7CiAgdC5wb2thdGFrYW5hID0gMHgzMGRkOwogIHQucG9wbGF0aGFpID0gMHgwZTFiOwogIHQucG9zdGFsbWFyayA9IDB4MzAxMjsKICB0LnBvc3RhbG1hcmtmYWNlID0gMHgzMDIwOwogIHQucHBhcmVuID0gMHgyNGFiOwogIHQucHJlY2VkZXMgPSAweDIyN2E7CiAgdC5wcmVzY3JpcHRpb24gPSAweDIxMWU7CiAgdC5wcmltZW1vZCA9IDB4MDJiOTsKICB0LnByaW1lcmV2ZXJzZWQgPSAweDIwMzU7CiAgdC5wcm9kdWN0ID0gMHgyMjBmOwogIHQucHJvamVjdGl2ZSA9IDB4MjMwNTsKICB0LnByb2xvbmdlZGthbmEgPSAweDMwZmM7CiAgdC5wcm9wZWxsb3IgPSAweDIzMTg7CiAgdC5wcm9wZXJzdWJzZXQgPSAweDIyODI7CiAgdC5wcm9wZXJzdXBlcnNldCA9IDB4MjI4MzsKICB0LnByb3BvcnRpb24gPSAweDIyMzc7CiAgdC5wcm9wb3J0aW9uYWwgPSAweDIyMWQ7CiAgdC5wc2kgPSAweDAzYzg7CiAgdC5wc2ljeXJpbGxpYyA9IDB4MDQ3MTsKICB0LnBzaWxpcG5ldW1hdGFjeXJpbGxpY2NtYiA9IDB4MDQ4NjsKICB0LnBzc3F1YXJlID0gMHgzM2IwOwogIHQucHVoaXJhZ2FuYSA9IDB4MzA3NzsKICB0LnB1a2F0YWthbmEgPSAweDMwZDc7CiAgdC5wdnNxdWFyZSA9IDB4MzNiNDsKICB0LnB3c3F1YXJlID0gMHgzM2JhOwogIHQucSA9IDB4MDA3MTsKICB0LnFhZGV2YSA9IDB4MDk1ODsKICB0LnFhZG1haGVicmV3ID0gMHgwNWE4OwogIHQucWFmYXJhYmljID0gMHgwNjQyOwogIHQucWFmZmluYWxhcmFiaWMgPSAweGZlZDY7CiAgdC5xYWZpbml0aWFsYXJhYmljID0gMHhmZWQ3OwogIHQucWFmbWVkaWFsYXJhYmljID0gMHhmZWQ4OwogIHQucWFtYXRzID0gMHgwNWI4OwogIHQucWFtYXRzMTAgPSAweDA1Yjg7CiAgdC5xYW1hdHMxYSA9IDB4MDViODsKICB0LnFhbWF0czFjID0gMHgwNWI4OwogIHQucWFtYXRzMjcgPSAweDA1Yjg7CiAgdC5xYW1hdHMyOSA9IDB4MDViODsKICB0LnFhbWF0czMzID0gMHgwNWI4OwogIHQucWFtYXRzZGUgPSAweDA1Yjg7CiAgdC5xYW1hdHNoZWJyZXcgPSAweDA1Yjg7CiAgdC5xYW1hdHNuYXJyb3doZWJyZXcgPSAweDA1Yjg7CiAgdC5xYW1hdHNxYXRhbmhlYnJldyA9IDB4MDViODsKICB0LnFhbWF0c3FhdGFubmFycm93aGVicmV3ID0gMHgwNWI4OwogIHQucWFtYXRzcWF0YW5xdWFydGVyaGVicmV3ID0gMHgwNWI4OwogIHQucWFtYXRzcWF0YW53aWRlaGVicmV3ID0gMHgwNWI4OwogIHQucWFtYXRzcXVhcnRlcmhlYnJldyA9IDB4MDViODsKICB0LnFhbWF0c3dpZGVoZWJyZXcgPSAweDA1Yjg7CiAgdC5xYXJuZXlwYXJhaGVicmV3ID0gMHgwNTlmOwogIHQucWJvcG9tb2ZvID0gMHgzMTExOwogIHQucWNpcmNsZSA9IDB4MjRlMDsKICB0LnFob29rID0gMHgwMmEwOwogIHQucW1vbm9zcGFjZSA9IDB4ZmY1MTsKICB0LnFvZiA9IDB4MDVlNzsKICB0LnFvZmRhZ2VzaCA9IDB4ZmI0NzsKICB0LnFvZmRhZ2VzaGhlYnJldyA9IDB4ZmI0NzsKICB0LnFvZmhlYnJldyA9IDB4MDVlNzsKICB0LnFwYXJlbiA9IDB4MjRhYzsKICB0LnF1YXJ0ZXJub3RlID0gMHgyNjY5OwogIHQucXVidXRzID0gMHgwNWJiOwogIHQucXVidXRzMTggPSAweDA1YmI7CiAgdC5xdWJ1dHMyNSA9IDB4MDViYjsKICB0LnF1YnV0czMxID0gMHgwNWJiOwogIHQucXVidXRzaGVicmV3ID0gMHgwNWJiOwogIHQucXVidXRzbmFycm93aGVicmV3ID0gMHgwNWJiOwogIHQucXVidXRzcXVhcnRlcmhlYnJldyA9IDB4MDViYjsKICB0LnF1YnV0c3dpZGVoZWJyZXcgPSAweDA1YmI7CiAgdC5xdWVzdGlvbiA9IDB4MDAzZjsKICB0LnF1ZXN0aW9uYXJhYmljID0gMHgwNjFmOwogIHQucXVlc3Rpb25hcm1lbmlhbiA9IDB4MDU1ZTsKICB0LnF1ZXN0aW9uZG93biA9IDB4MDBiZjsKICB0LnF1ZXN0aW9uZG93bnNtYWxsID0gMHhmN2JmOwogIHQucXVlc3Rpb25ncmVlayA9IDB4MDM3ZTsKICB0LnF1ZXN0aW9ubW9ub3NwYWNlID0gMHhmZjFmOwogIHQucXVlc3Rpb25zbWFsbCA9IDB4ZjczZjsKICB0LnF1b3RlZGJsID0gMHgwMDIyOwogIHQucXVvdGVkYmxiYXNlID0gMHgyMDFlOwogIHQucXVvdGVkYmxsZWZ0ID0gMHgyMDFjOwogIHQucXVvdGVkYmxtb25vc3BhY2UgPSAweGZmMDI7CiAgdC5xdW90ZWRibHByaW1lID0gMHgzMDFlOwogIHQucXVvdGVkYmxwcmltZXJldmVyc2VkID0gMHgzMDFkOwogIHQucXVvdGVkYmxyaWdodCA9IDB4MjAxZDsKICB0LnF1b3RlbGVmdCA9IDB4MjAxODsKICB0LnF1b3RlbGVmdHJldmVyc2VkID0gMHgyMDFiOwogIHQucXVvdGVyZXZlcnNlZCA9IDB4MjAxYjsKICB0LnF1b3RlcmlnaHQgPSAweDIwMTk7CiAgdC5xdW90ZXJpZ2h0biA9IDB4MDE0OTsKICB0LnF1b3Rlc2luZ2xiYXNlID0gMHgyMDFhOwogIHQucXVvdGVzaW5nbGUgPSAweDAwMjc7CiAgdC5xdW90ZXNpbmdsZW1vbm9zcGFjZSA9IDB4ZmYwNzsKICB0LnIgPSAweDAwNzI7CiAgdC5yYWFybWVuaWFuID0gMHgwNTdjOwogIHQucmFiZW5nYWxpID0gMHgwOWIwOwogIHQucmFjdXRlID0gMHgwMTU1OwogIHQucmFkZXZhID0gMHgwOTMwOwogIHQucmFkaWNhbCA9IDB4MjIxYTsKICB0LnJhZGljYWxleCA9IDB4ZjhlNTsKICB0LnJhZG92ZXJzc3F1YXJlID0gMHgzM2FlOwogIHQucmFkb3ZlcnNzcXVhcmVkc3F1YXJlID0gMHgzM2FmOwogIHQucmFkc3F1YXJlID0gMHgzM2FkOwogIHQucmFmZSA9IDB4MDViZjsKICB0LnJhZmVoZWJyZXcgPSAweDA1YmY7CiAgdC5yYWd1amFyYXRpID0gMHgwYWIwOwogIHQucmFndXJtdWtoaSA9IDB4MGEzMDsKICB0LnJhaGlyYWdhbmEgPSAweDMwODk7CiAgdC5yYWthdGFrYW5hID0gMHgzMGU5OwogIHQucmFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NzsKICB0LnJhbG93ZXJkaWFnb25hbGJlbmdhbGkgPSAweDA5ZjE7CiAgdC5yYW1pZGRsZWRpYWdvbmFsYmVuZ2FsaSA9IDB4MDlmMDsKICB0LnJhbXNob3JuID0gMHgwMjY0OwogIHQucmF0aW8gPSAweDIyMzY7CiAgdC5yYm9wb21vZm8gPSAweDMxMTY7CiAgdC5yY2Fyb24gPSAweDAxNTk7CiAgdC5yY2VkaWxsYSA9IDB4MDE1NzsKICB0LnJjaXJjbGUgPSAweDI0ZTE7CiAgdC5yY29tbWFhY2NlbnQgPSAweDAxNTc7CiAgdC5yZGJsZ3JhdmUgPSAweDAyMTE7CiAgdC5yZG90YWNjZW50ID0gMHgxZTU5OwogIHQucmRvdGJlbG93ID0gMHgxZTViOwogIHQucmRvdGJlbG93bWFjcm9uID0gMHgxZTVkOwogIHQucmVmZXJlbmNlbWFyayA9IDB4MjAzYjsKICB0LnJlZmxleHN1YnNldCA9IDB4MjI4NjsKICB0LnJlZmxleHN1cGVyc2V0ID0gMHgyMjg3OwogIHQucmVnaXN0ZXJlZCA9IDB4MDBhZTsKICB0LnJlZ2lzdGVyc2FucyA9IDB4ZjhlODsKICB0LnJlZ2lzdGVyc2VyaWYgPSAweGY2ZGE7CiAgdC5yZWhhcmFiaWMgPSAweDA2MzE7CiAgdC5yZWhhcm1lbmlhbiA9IDB4MDU4MDsKICB0LnJlaGZpbmFsYXJhYmljID0gMHhmZWFlOwogIHQucmVoaXJhZ2FuYSA9IDB4MzA4YzsKICB0LnJla2F0YWthbmEgPSAweDMwZWM7CiAgdC5yZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjlhOwogIHQucmVzaCA9IDB4MDVlODsKICB0LnJlc2hkYWdlc2hoZWJyZXcgPSAweGZiNDg7CiAgdC5yZXNoaGVicmV3ID0gMHgwNWU4OwogIHQucmV2ZXJzZWR0aWxkZSA9IDB4MjIzZDsKICB0LnJldmlhaGVicmV3ID0gMHgwNTk3OwogIHQucmV2aWFtdWdyYXNoaGVicmV3ID0gMHgwNTk3OwogIHQucmV2bG9naWNhbG5vdCA9IDB4MjMxMDsKICB0LnJmaXNoaG9vayA9IDB4MDI3ZTsKICB0LnJmaXNoaG9va3JldmVyc2VkID0gMHgwMjdmOwogIHQucmhhYmVuZ2FsaSA9IDB4MDlkZDsKICB0LnJoYWRldmEgPSAweDA5NWQ7CiAgdC5yaG8gPSAweDAzYzE7CiAgdC5yaG9vayA9IDB4MDI3ZDsKICB0LnJob29rdHVybmVkID0gMHgwMjdiOwogIHQucmhvb2t0dXJuZWRzdXBlcmlvciA9IDB4MDJiNTsKICB0LnJob3N5bWJvbGdyZWVrID0gMHgwM2YxOwogIHQucmhvdGljaG9va21vZCA9IDB4MDJkZTsKICB0LnJpZXVsYWNpcmNsZWtvcmVhbiA9IDB4MzI3MTsKICB0LnJpZXVsYXBhcmVua29yZWFuID0gMHgzMjExOwogIHQucmlldWxjaXJjbGVrb3JlYW4gPSAweDMyNjM7CiAgdC5yaWV1bGhpZXVoa29yZWFuID0gMHgzMTQwOwogIHQucmlldWxraXllb2trb3JlYW4gPSAweDMxM2E7CiAgdC5yaWV1bGtpeWVva3Npb3Nrb3JlYW4gPSAweDMxNjk7CiAgdC5yaWV1bGtvcmVhbiA9IDB4MzEzOTsKICB0LnJpZXVsbWlldW1rb3JlYW4gPSAweDMxM2I7CiAgdC5yaWV1bHBhbnNpb3Nrb3JlYW4gPSAweDMxNmM7CiAgdC5yaWV1bHBhcmVua29yZWFuID0gMHgzMjAzOwogIHQucmlldWxwaGlldXBoa29yZWFuID0gMHgzMTNmOwogIHQucmlldWxwaWV1cGtvcmVhbiA9IDB4MzEzYzsKICB0LnJpZXVscGlldXBzaW9za29yZWFuID0gMHgzMTZiOwogIHQucmlldWxzaW9za29yZWFuID0gMHgzMTNkOwogIHQucmlldWx0aGlldXRoa29yZWFuID0gMHgzMTNlOwogIHQucmlldWx0aWtldXRrb3JlYW4gPSAweDMxNmE7CiAgdC5yaWV1bHllb3JpbmhpZXVoa29yZWFuID0gMHgzMTZkOwogIHQucmlnaHRhbmdsZSA9IDB4MjIxZjsKICB0LnJpZ2h0dGFja2JlbG93Y21iID0gMHgwMzE5OwogIHQucmlnaHR0cmlhbmdsZSA9IDB4MjJiZjsKICB0LnJpaGlyYWdhbmEgPSAweDMwOGE7CiAgdC5yaWthdGFrYW5hID0gMHgzMGVhOwogIHQucmlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5ODsKICB0LnJpbmcgPSAweDAyZGE7CiAgdC5yaW5nYmVsb3djbWIgPSAweDAzMjU7CiAgdC5yaW5nY21iID0gMHgwMzBhOwogIHQucmluZ2hhbGZsZWZ0ID0gMHgwMmJmOwogIHQucmluZ2hhbGZsZWZ0YXJtZW5pYW4gPSAweDA1NTk7CiAgdC5yaW5naGFsZmxlZnRiZWxvd2NtYiA9IDB4MDMxYzsKICB0LnJpbmdoYWxmbGVmdGNlbnRlcmVkID0gMHgwMmQzOwogIHQucmluZ2hhbGZyaWdodCA9IDB4MDJiZTsKICB0LnJpbmdoYWxmcmlnaHRiZWxvd2NtYiA9IDB4MDMzOTsKICB0LnJpbmdoYWxmcmlnaHRjZW50ZXJlZCA9IDB4MDJkMjsKICB0LnJpbnZlcnRlZGJyZXZlID0gMHgwMjEzOwogIHQucml0dG9ydXNxdWFyZSA9IDB4MzM1MTsKICB0LnJsaW5lYmVsb3cgPSAweDFlNWY7CiAgdC5ybG9uZ2xlZyA9IDB4MDI3YzsKICB0LnJsb25nbGVndHVybmVkID0gMHgwMjdhOwogIHQucm1vbm9zcGFjZSA9IDB4ZmY1MjsKICB0LnJvaGlyYWdhbmEgPSAweDMwOGQ7CiAgdC5yb2thdGFrYW5hID0gMHgzMGVkOwogIHQucm9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YjsKICB0LnJvcnVhdGhhaSA9IDB4MGUyMzsKICB0LnJwYXJlbiA9IDB4MjRhZDsKICB0LnJyYWJlbmdhbGkgPSAweDA5ZGM7CiAgdC5ycmFkZXZhID0gMHgwOTMxOwogIHQucnJhZ3VybXVraGkgPSAweDBhNWM7CiAgdC5ycmVoYXJhYmljID0gMHgwNjkxOwogIHQucnJlaGZpbmFsYXJhYmljID0gMHhmYjhkOwogIHQucnJ2b2NhbGljYmVuZ2FsaSA9IDB4MDllMDsKICB0LnJydm9jYWxpY2RldmEgPSAweDA5NjA7CiAgdC5ycnZvY2FsaWNndWphcmF0aSA9IDB4MGFlMDsKICB0LnJydm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzQ7CiAgdC5ycnZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTQ0OwogIHQucnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzQ7CiAgdC5yc3VwZXJpb3IgPSAweGY2ZjE7CiAgdC5ydGJsb2NrID0gMHgyNTkwOwogIHQucnR1cm5lZCA9IDB4MDI3OTsKICB0LnJ0dXJuZWRzdXBlcmlvciA9IDB4MDJiNDsKICB0LnJ1aGlyYWdhbmEgPSAweDMwOGI7CiAgdC5ydWthdGFrYW5hID0gMHgzMGViOwogIHQucnVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5OTsKICB0LnJ1cGVlbWFya2JlbmdhbGkgPSAweDA5ZjI7CiAgdC5ydXBlZXNpZ25iZW5nYWxpID0gMHgwOWYzOwogIHQucnVwaWFoID0gMHhmNmRkOwogIHQucnV0aGFpID0gMHgwZTI0OwogIHQucnZvY2FsaWNiZW5nYWxpID0gMHgwOThiOwogIHQucnZvY2FsaWNkZXZhID0gMHgwOTBiOwogIHQucnZvY2FsaWNndWphcmF0aSA9IDB4MGE4YjsKICB0LnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMzsKICB0LnJ2b2NhbGljdm93ZWxzaWduZGV2YSA9IDB4MDk0MzsKICB0LnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzM7CiAgdC5zID0gMHgwMDczOwogIHQuc2FiZW5nYWxpID0gMHgwOWI4OwogIHQuc2FjdXRlID0gMHgwMTViOwogIHQuc2FjdXRlZG90YWNjZW50ID0gMHgxZTY1OwogIHQuc2FkYXJhYmljID0gMHgwNjM1OwogIHQuc2FkZXZhID0gMHgwOTM4OwogIHQuc2FkZmluYWxhcmFiaWMgPSAweGZlYmE7CiAgdC5zYWRpbml0aWFsYXJhYmljID0gMHhmZWJiOwogIHQuc2FkbWVkaWFsYXJhYmljID0gMHhmZWJjOwogIHQuc2FndWphcmF0aSA9IDB4MGFiODsKICB0LnNhZ3VybXVraGkgPSAweDBhMzg7CiAgdC5zYWhpcmFnYW5hID0gMHgzMDU1OwogIHQuc2FrYXRha2FuYSA9IDB4MzBiNTsKICB0LnNha2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2I7CiAgdC5zYWxsYWxsYWhvdWFsYXloZXdhc2FsbGFtYXJhYmljID0gMHhmZGZhOwogIHQuc2FtZWtoID0gMHgwNWUxOwogIHQuc2FtZWtoZGFnZXNoID0gMHhmYjQxOwogIHQuc2FtZWtoZGFnZXNoaGVicmV3ID0gMHhmYjQxOwogIHQuc2FtZWtoaGVicmV3ID0gMHgwNWUxOwogIHQuc2FyYWFhdGhhaSA9IDB4MGUzMjsKICB0LnNhcmFhZXRoYWkgPSAweDBlNDE7CiAgdC5zYXJhYWltYWltYWxhaXRoYWkgPSAweDBlNDQ7CiAgdC5zYXJhYWltYWltdWFudGhhaSA9IDB4MGU0MzsKICB0LnNhcmFhbXRoYWkgPSAweDBlMzM7CiAgdC5zYXJhYXRoYWkgPSAweDBlMzA7CiAgdC5zYXJhZXRoYWkgPSAweDBlNDA7CiAgdC5zYXJhaWlsZWZ0dGhhaSA9IDB4Zjg4NjsKICB0LnNhcmFpaXRoYWkgPSAweDBlMzU7CiAgdC5zYXJhaWxlZnR0aGFpID0gMHhmODg1OwogIHQuc2FyYWl0aGFpID0gMHgwZTM0OwogIHQuc2FyYW90aGFpID0gMHgwZTQyOwogIHQuc2FyYXVlZWxlZnR0aGFpID0gMHhmODg4OwogIHQuc2FyYXVlZXRoYWkgPSAweDBlMzc7CiAgdC5zYXJhdWVsZWZ0dGhhaSA9IDB4Zjg4NzsKICB0LnNhcmF1ZXRoYWkgPSAweDBlMzY7CiAgdC5zYXJhdXRoYWkgPSAweDBlMzg7CiAgdC5zYXJhdXV0aGFpID0gMHgwZTM5OwogIHQuc2JvcG9tb2ZvID0gMHgzMTE5OwogIHQuc2Nhcm9uID0gMHgwMTYxOwogIHQuc2Nhcm9uZG90YWNjZW50ID0gMHgxZTY3OwogIHQuc2NlZGlsbGEgPSAweDAxNWY7CiAgdC5zY2h3YSA9IDB4MDI1OTsKICB0LnNjaHdhY3lyaWxsaWMgPSAweDA0ZDk7CiAgdC5zY2h3YWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGI7CiAgdC5zY2h3YWhvb2sgPSAweDAyNWE7CiAgdC5zY2lyY2xlID0gMHgyNGUyOwogIHQuc2NpcmN1bWZsZXggPSAweDAxNWQ7CiAgdC5zY29tbWFhY2NlbnQgPSAweDAyMTk7CiAgdC5zZG90YWNjZW50ID0gMHgxZTYxOwogIHQuc2RvdGJlbG93ID0gMHgxZTYzOwogIHQuc2RvdGJlbG93ZG90YWNjZW50ID0gMHgxZTY5OwogIHQuc2VhZ3VsbGJlbG93Y21iID0gMHgwMzNjOwogIHQuc2Vjb25kID0gMHgyMDMzOwogIHQuc2Vjb25kdG9uZWNoaW5lc2UgPSAweDAyY2E7CiAgdC5zZWN0aW9uID0gMHgwMGE3OwogIHQuc2VlbmFyYWJpYyA9IDB4MDYzMzsKICB0LnNlZW5maW5hbGFyYWJpYyA9IDB4ZmViMjsKICB0LnNlZW5pbml0aWFsYXJhYmljID0gMHhmZWIzOwogIHQuc2Vlbm1lZGlhbGFyYWJpYyA9IDB4ZmViNDsKICB0LnNlZ29sID0gMHgwNWI2OwogIHQuc2Vnb2wxMyA9IDB4MDViNjsKICB0LnNlZ29sMWYgPSAweDA1YjY7CiAgdC5zZWdvbDJjID0gMHgwNWI2OwogIHQuc2Vnb2xoZWJyZXcgPSAweDA1YjY7CiAgdC5zZWdvbG5hcnJvd2hlYnJldyA9IDB4MDViNjsKICB0LnNlZ29scXVhcnRlcmhlYnJldyA9IDB4MDViNjsKICB0LnNlZ29sdGFoZWJyZXcgPSAweDA1OTI7CiAgdC5zZWdvbHdpZGVoZWJyZXcgPSAweDA1YjY7CiAgdC5zZWhhcm1lbmlhbiA9IDB4MDU3ZDsKICB0LnNlaGlyYWdhbmEgPSAweDMwNWI7CiAgdC5zZWthdGFrYW5hID0gMHgzMGJiOwogIHQuc2VrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ZTsKICB0LnNlbWljb2xvbiA9IDB4MDAzYjsKICB0LnNlbWljb2xvbmFyYWJpYyA9IDB4MDYxYjsKICB0LnNlbWljb2xvbm1vbm9zcGFjZSA9IDB4ZmYxYjsKICB0LnNlbWljb2xvbnNtYWxsID0gMHhmZTU0OwogIHQuc2VtaXZvaWNlZG1hcmtrYW5hID0gMHgzMDljOwogIHQuc2VtaXZvaWNlZG1hcmtrYW5haGFsZndpZHRoID0gMHhmZjlmOwogIHQuc2VudGlzcXVhcmUgPSAweDMzMjI7CiAgdC5zZW50b3NxdWFyZSA9IDB4MzMyMzsKICB0LnNldmVuID0gMHgwMDM3OwogIHQuc2V2ZW5hcmFiaWMgPSAweDA2Njc7CiAgdC5zZXZlbmJlbmdhbGkgPSAweDA5ZWQ7CiAgdC5zZXZlbmNpcmNsZSA9IDB4MjQ2NjsKICB0LnNldmVuY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MDsKICB0LnNldmVuZGV2YSA9IDB4MDk2ZDsKICB0LnNldmVuZWlnaHRocyA9IDB4MjE1ZTsKICB0LnNldmVuZ3VqYXJhdGkgPSAweDBhZWQ7CiAgdC5zZXZlbmd1cm11a2hpID0gMHgwYTZkOwogIHQuc2V2ZW5oYWNrYXJhYmljID0gMHgwNjY3OwogIHQuc2V2ZW5oYW5nemhvdSA9IDB4MzAyNzsKICB0LnNldmVuaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNjsKICB0LnNldmVuaW5mZXJpb3IgPSAweDIwODc7CiAgdC5zZXZlbm1vbm9zcGFjZSA9IDB4ZmYxNzsKICB0LnNldmVub2xkc3R5bGUgPSAweGY3Mzc7CiAgdC5zZXZlbnBhcmVuID0gMHgyNDdhOwogIHQuc2V2ZW5wZXJpb2QgPSAweDI0OGU7CiAgdC5zZXZlbnBlcnNpYW4gPSAweDA2Zjc7CiAgdC5zZXZlbnJvbWFuID0gMHgyMTc2OwogIHQuc2V2ZW5zdXBlcmlvciA9IDB4MjA3NzsKICB0LnNldmVudGVlbmNpcmNsZSA9IDB4MjQ3MDsKICB0LnNldmVudGVlbnBhcmVuID0gMHgyNDg0OwogIHQuc2V2ZW50ZWVucGVyaW9kID0gMHgyNDk4OwogIHQuc2V2ZW50aGFpID0gMHgwZTU3OwogIHQuc2Z0aHlwaGVuID0gMHgwMGFkOwogIHQuc2hhYXJtZW5pYW4gPSAweDA1Nzc7CiAgdC5zaGFiZW5nYWxpID0gMHgwOWI2OwogIHQuc2hhY3lyaWxsaWMgPSAweDA0NDg7CiAgdC5zaGFkZGFhcmFiaWMgPSAweDA2NTE7CiAgdC5zaGFkZGFkYW1tYWFyYWJpYyA9IDB4ZmM2MTsKICB0LnNoYWRkYWRhbW1hdGFuYXJhYmljID0gMHhmYzVlOwogIHQuc2hhZGRhZmF0aGFhcmFiaWMgPSAweGZjNjA7CiAgdC5zaGFkZGFrYXNyYWFyYWJpYyA9IDB4ZmM2MjsKICB0LnNoYWRkYWthc3JhdGFuYXJhYmljID0gMHhmYzVmOwogIHQuc2hhZGUgPSAweDI1OTI7CiAgdC5zaGFkZWRhcmsgPSAweDI1OTM7CiAgdC5zaGFkZWxpZ2h0ID0gMHgyNTkxOwogIHQuc2hhZGVtZWRpdW0gPSAweDI1OTI7CiAgdC5zaGFkZXZhID0gMHgwOTM2OwogIHQuc2hhZ3VqYXJhdGkgPSAweDBhYjY7CiAgdC5zaGFndXJtdWtoaSA9IDB4MGEzNjsKICB0LnNoYWxzaGVsZXRoZWJyZXcgPSAweDA1OTM7CiAgdC5zaGJvcG9tb2ZvID0gMHgzMTE1OwogIHQuc2hjaGFjeXJpbGxpYyA9IDB4MDQ0OTsKICB0LnNoZWVuYXJhYmljID0gMHgwNjM0OwogIHQuc2hlZW5maW5hbGFyYWJpYyA9IDB4ZmViNjsKICB0LnNoZWVuaW5pdGlhbGFyYWJpYyA9IDB4ZmViNzsKICB0LnNoZWVubWVkaWFsYXJhYmljID0gMHhmZWI4OwogIHQuc2hlaWNvcHRpYyA9IDB4MDNlMzsKICB0LnNoZXFlbCA9IDB4MjBhYTsKICB0LnNoZXFlbGhlYnJldyA9IDB4MjBhYTsKICB0LnNoZXZhID0gMHgwNWIwOwogIHQuc2hldmExMTUgPSAweDA1YjA7CiAgdC5zaGV2YTE1ID0gMHgwNWIwOwogIHQuc2hldmEyMiA9IDB4MDViMDsKICB0LnNoZXZhMmUgPSAweDA1YjA7CiAgdC5zaGV2YWhlYnJldyA9IDB4MDViMDsKICB0LnNoZXZhbmFycm93aGVicmV3ID0gMHgwNWIwOwogIHQuc2hldmFxdWFydGVyaGVicmV3ID0gMHgwNWIwOwogIHQuc2hldmF3aWRlaGVicmV3ID0gMHgwNWIwOwogIHQuc2hoYWN5cmlsbGljID0gMHgwNGJiOwogIHQuc2hpbWFjb3B0aWMgPSAweDAzZWQ7CiAgdC5zaGluID0gMHgwNWU5OwogIHQuc2hpbmRhZ2VzaCA9IDB4ZmI0OTsKICB0LnNoaW5kYWdlc2hoZWJyZXcgPSAweGZiNDk7CiAgdC5zaGluZGFnZXNoc2hpbmRvdCA9IDB4ZmIyYzsKICB0LnNoaW5kYWdlc2hzaGluZG90aGVicmV3ID0gMHhmYjJjOwogIHQuc2hpbmRhZ2VzaHNpbmRvdCA9IDB4ZmIyZDsKICB0LnNoaW5kYWdlc2hzaW5kb3RoZWJyZXcgPSAweGZiMmQ7CiAgdC5zaGluZG90aGVicmV3ID0gMHgwNWMxOwogIHQuc2hpbmhlYnJldyA9IDB4MDVlOTsKICB0LnNoaW5zaGluZG90ID0gMHhmYjJhOwogIHQuc2hpbnNoaW5kb3RoZWJyZXcgPSAweGZiMmE7CiAgdC5zaGluc2luZG90ID0gMHhmYjJiOwogIHQuc2hpbnNpbmRvdGhlYnJldyA9IDB4ZmIyYjsKICB0LnNob29rID0gMHgwMjgyOwogIHQuc2lnbWEgPSAweDAzYzM7CiAgdC5zaWdtYTEgPSAweDAzYzI7CiAgdC5zaWdtYWZpbmFsID0gMHgwM2MyOwogIHQuc2lnbWFsdW5hdGVzeW1ib2xncmVlayA9IDB4MDNmMjsKICB0LnNpaGlyYWdhbmEgPSAweDMwNTc7CiAgdC5zaWthdGFrYW5hID0gMHgzMGI3OwogIHQuc2lrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YzsKICB0LnNpbHVxaGVicmV3ID0gMHgwNWJkOwogIHQuc2lsdXFsZWZ0aGVicmV3ID0gMHgwNWJkOwogIHQuc2ltaWxhciA9IDB4MjIzYzsKICB0LnNpbmRvdGhlYnJldyA9IDB4MDVjMjsKICB0LnNpb3NhY2lyY2xla29yZWFuID0gMHgzMjc0OwogIHQuc2lvc2FwYXJlbmtvcmVhbiA9IDB4MzIxNDsKICB0LnNpb3NjaWV1Y2tvcmVhbiA9IDB4MzE3ZTsKICB0LnNpb3NjaXJjbGVrb3JlYW4gPSAweDMyNjY7CiAgdC5zaW9za2l5ZW9ra29yZWFuID0gMHgzMTdhOwogIHQuc2lvc2tvcmVhbiA9IDB4MzE0NTsKICB0LnNpb3NuaWV1bmtvcmVhbiA9IDB4MzE3YjsKICB0LnNpb3NwYXJlbmtvcmVhbiA9IDB4MzIwNjsKICB0LnNpb3NwaWV1cGtvcmVhbiA9IDB4MzE3ZDsKICB0LnNpb3N0aWtldXRrb3JlYW4gPSAweDMxN2M7CiAgdC5zaXggPSAweDAwMzY7CiAgdC5zaXhhcmFiaWMgPSAweDA2NjY7CiAgdC5zaXhiZW5nYWxpID0gMHgwOWVjOwogIHQuc2l4Y2lyY2xlID0gMHgyNDY1OwogIHQuc2l4Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4ZjsKICB0LnNpeGRldmEgPSAweDA5NmM7CiAgdC5zaXhndWphcmF0aSA9IDB4MGFlYzsKICB0LnNpeGd1cm11a2hpID0gMHgwYTZjOwogIHQuc2l4aGFja2FyYWJpYyA9IDB4MDY2NjsKICB0LnNpeGhhbmd6aG91ID0gMHgzMDI2OwogIHQuc2l4aWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNTsKICB0LnNpeGluZmVyaW9yID0gMHgyMDg2OwogIHQuc2l4bW9ub3NwYWNlID0gMHhmZjE2OwogIHQuc2l4b2xkc3R5bGUgPSAweGY3MzY7CiAgdC5zaXhwYXJlbiA9IDB4MjQ3OTsKICB0LnNpeHBlcmlvZCA9IDB4MjQ4ZDsKICB0LnNpeHBlcnNpYW4gPSAweDA2ZjY7CiAgdC5zaXhyb21hbiA9IDB4MjE3NTsKICB0LnNpeHN1cGVyaW9yID0gMHgyMDc2OwogIHQuc2l4dGVlbmNpcmNsZSA9IDB4MjQ2ZjsKICB0LnNpeHRlZW5jdXJyZW5jeWRlbm9taW5hdG9yYmVuZ2FsaSA9IDB4MDlmOTsKICB0LnNpeHRlZW5wYXJlbiA9IDB4MjQ4MzsKICB0LnNpeHRlZW5wZXJpb2QgPSAweDI0OTc7CiAgdC5zaXh0aGFpID0gMHgwZTU2OwogIHQuc2xhc2ggPSAweDAwMmY7CiAgdC5zbGFzaG1vbm9zcGFjZSA9IDB4ZmYwZjsKICB0LnNsb25nID0gMHgwMTdmOwogIHQuc2xvbmdkb3RhY2NlbnQgPSAweDFlOWI7CiAgdC5zbWlsZWZhY2UgPSAweDI2M2E7CiAgdC5zbW9ub3NwYWNlID0gMHhmZjUzOwogIHQuc29mcGFzdXFoZWJyZXcgPSAweDA1YzM7CiAgdC5zb2Z0aHlwaGVuID0gMHgwMGFkOwogIHQuc29mdHNpZ25jeXJpbGxpYyA9IDB4MDQ0YzsKICB0LnNvaGlyYWdhbmEgPSAweDMwNWQ7CiAgdC5zb2thdGFrYW5hID0gMHgzMGJkOwogIHQuc29rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ZjsKICB0LnNvbGlkdXNsb25nb3ZlcmxheWNtYiA9IDB4MDMzODsKICB0LnNvbGlkdXNzaG9ydG92ZXJsYXljbWIgPSAweDAzMzc7CiAgdC5zb3J1c2l0aGFpID0gMHgwZTI5OwogIHQuc29zYWxhdGhhaSA9IDB4MGUyODsKICB0LnNvc290aGFpID0gMHgwZTBiOwogIHQuc29zdWF0aGFpID0gMHgwZTJhOwogIHQuc3BhY2UgPSAweDAwMjA7CiAgdC5zcGFjZWhhY2thcmFiaWMgPSAweDAwMjA7CiAgdC5zcGFkZSA9IDB4MjY2MDsKICB0LnNwYWRlc3VpdGJsYWNrID0gMHgyNjYwOwogIHQuc3BhZGVzdWl0d2hpdGUgPSAweDI2NjQ7CiAgdC5zcGFyZW4gPSAweDI0YWU7CiAgdC5zcXVhcmViZWxvd2NtYiA9IDB4MDMzYjsKICB0LnNxdWFyZWNjID0gMHgzM2M0OwogIHQuc3F1YXJlY20gPSAweDMzOWQ7CiAgdC5zcXVhcmVkaWFnb25hbGNyb3NzaGF0Y2hmaWxsID0gMHgyNWE5OwogIHQuc3F1YXJlaG9yaXpvbnRhbGZpbGwgPSAweDI1YTQ7CiAgdC5zcXVhcmVrZyA9IDB4MzM4ZjsKICB0LnNxdWFyZWttID0gMHgzMzllOwogIHQuc3F1YXJla21jYXBpdGFsID0gMHgzM2NlOwogIHQuc3F1YXJlbG4gPSAweDMzZDE7CiAgdC5zcXVhcmVsb2cgPSAweDMzZDI7CiAgdC5zcXVhcmVtZyA9IDB4MzM4ZTsKICB0LnNxdWFyZW1pbCA9IDB4MzNkNTsKICB0LnNxdWFyZW1tID0gMHgzMzljOwogIHQuc3F1YXJlbXNxdWFyZWQgPSAweDMzYTE7CiAgdC5zcXVhcmVvcnRob2dvbmFsY3Jvc3NoYXRjaGZpbGwgPSAweDI1YTY7CiAgdC5zcXVhcmV1cHBlcmxlZnR0b2xvd2VycmlnaHRmaWxsID0gMHgyNWE3OwogIHQuc3F1YXJldXBwZXJyaWdodHRvbG93ZXJsZWZ0ZmlsbCA9IDB4MjVhODsKICB0LnNxdWFyZXZlcnRpY2FsZmlsbCA9IDB4MjVhNTsKICB0LnNxdWFyZXdoaXRld2l0aHNtYWxsYmxhY2sgPSAweDI1YTM7CiAgdC5zcnNxdWFyZSA9IDB4MzNkYjsKICB0LnNzYWJlbmdhbGkgPSAweDA5Yjc7CiAgdC5zc2FkZXZhID0gMHgwOTM3OwogIHQuc3NhZ3VqYXJhdGkgPSAweDBhYjc7CiAgdC5zc2FuZ2NpZXVja29yZWFuID0gMHgzMTQ5OwogIHQuc3NhbmdoaWV1aGtvcmVhbiA9IDB4MzE4NTsKICB0LnNzYW5naWV1bmdrb3JlYW4gPSAweDMxODA7CiAgdC5zc2FuZ2tpeWVva2tvcmVhbiA9IDB4MzEzMjsKICB0LnNzYW5nbmlldW5rb3JlYW4gPSAweDMxNjU7CiAgdC5zc2FuZ3BpZXVwa29yZWFuID0gMHgzMTQzOwogIHQuc3NhbmdzaW9za29yZWFuID0gMHgzMTQ2OwogIHQuc3Nhbmd0aWtldXRrb3JlYW4gPSAweDMxMzg7CiAgdC5zc3VwZXJpb3IgPSAweGY2ZjI7CiAgdC5zdGVybGluZyA9IDB4MDBhMzsKICB0LnN0ZXJsaW5nbW9ub3NwYWNlID0gMHhmZmUxOwogIHQuc3Ryb2tlbG9uZ292ZXJsYXljbWIgPSAweDAzMzY7CiAgdC5zdHJva2VzaG9ydG92ZXJsYXljbWIgPSAweDAzMzU7CiAgdC5zdWJzZXQgPSAweDIyODI7CiAgdC5zdWJzZXRub3RlcXVhbCA9IDB4MjI4YTsKICB0LnN1YnNldG9yZXF1YWwgPSAweDIyODY7CiAgdC5zdWNjZWVkcyA9IDB4MjI3YjsKICB0LnN1Y2h0aGF0ID0gMHgyMjBiOwogIHQuc3VoaXJhZ2FuYSA9IDB4MzA1OTsKICB0LnN1a2F0YWthbmEgPSAweDMwYjk7CiAgdC5zdWthdGFrYW5haGFsZndpZHRoID0gMHhmZjdkOwogIHQuc3VrdW5hcmFiaWMgPSAweDA2NTI7CiAgdC5zdW1tYXRpb24gPSAweDIyMTE7CiAgdC5zdW4gPSAweDI2M2M7CiAgdC5zdXBlcnNldCA9IDB4MjI4MzsKICB0LnN1cGVyc2V0bm90ZXF1YWwgPSAweDIyOGI7CiAgdC5zdXBlcnNldG9yZXF1YWwgPSAweDIyODc7CiAgdC5zdnNxdWFyZSA9IDB4MzNkYzsKICB0LnN5b3V3YWVyYXNxdWFyZSA9IDB4MzM3YzsKICB0LnQgPSAweDAwNzQ7CiAgdC50YWJlbmdhbGkgPSAweDA5YTQ7CiAgdC50YWNrZG93biA9IDB4MjJhNDsKICB0LnRhY2tsZWZ0ID0gMHgyMmEzOwogIHQudGFkZXZhID0gMHgwOTI0OwogIHQudGFndWphcmF0aSA9IDB4MGFhNDsKICB0LnRhZ3VybXVraGkgPSAweDBhMjQ7CiAgdC50YWhhcmFiaWMgPSAweDA2Mzc7CiAgdC50YWhmaW5hbGFyYWJpYyA9IDB4ZmVjMjsKICB0LnRhaGluaXRpYWxhcmFiaWMgPSAweGZlYzM7CiAgdC50YWhpcmFnYW5hID0gMHgzMDVmOwogIHQudGFobWVkaWFsYXJhYmljID0gMHhmZWM0OwogIHQudGFpc3lvdWVyYXNxdWFyZSA9IDB4MzM3ZDsKICB0LnRha2F0YWthbmEgPSAweDMwYmY7CiAgdC50YWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgwOwogIHQudGF0d2VlbGFyYWJpYyA9IDB4MDY0MDsKICB0LnRhdSA9IDB4MDNjNDsKICB0LnRhdiA9IDB4MDVlYTsKICB0LnRhdmRhZ2VzID0gMHhmYjRhOwogIHQudGF2ZGFnZXNoID0gMHhmYjRhOwogIHQudGF2ZGFnZXNoaGVicmV3ID0gMHhmYjRhOwogIHQudGF2aGVicmV3ID0gMHgwNWVhOwogIHQudGJhciA9IDB4MDE2NzsKICB0LnRib3BvbW9mbyA9IDB4MzEwYTsKICB0LnRjYXJvbiA9IDB4MDE2NTsKICB0LnRjY3VybCA9IDB4MDJhODsKICB0LnRjZWRpbGxhID0gMHgwMTYzOwogIHQudGNoZWhhcmFiaWMgPSAweDA2ODY7CiAgdC50Y2hlaGZpbmFsYXJhYmljID0gMHhmYjdiOwogIHQudGNoZWhpbml0aWFsYXJhYmljID0gMHhmYjdjOwogIHQudGNoZWhtZWRpYWxhcmFiaWMgPSAweGZiN2Q7CiAgdC50Y2lyY2xlID0gMHgyNGUzOwogIHQudGNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3MTsKICB0LnRjb21tYWFjY2VudCA9IDB4MDE2MzsKICB0LnRkaWVyZXNpcyA9IDB4MWU5NzsKICB0LnRkb3RhY2NlbnQgPSAweDFlNmI7CiAgdC50ZG90YmVsb3cgPSAweDFlNmQ7CiAgdC50ZWN5cmlsbGljID0gMHgwNDQyOwogIHQudGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhZDsKICB0LnRlaGFyYWJpYyA9IDB4MDYyYTsKICB0LnRlaGZpbmFsYXJhYmljID0gMHhmZTk2OwogIHQudGVoaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmNhMjsKICB0LnRlaGhhaGlzb2xhdGVkYXJhYmljID0gMHhmYzBjOwogIHQudGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5NzsKICB0LnRlaGlyYWdhbmEgPSAweDMwNjY7CiAgdC50ZWhqZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNhMTsKICB0LnRlaGplZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwYjsKICB0LnRlaG1hcmJ1dGFhcmFiaWMgPSAweDA2Mjk7CiAgdC50ZWhtYXJidXRhZmluYWxhcmFiaWMgPSAweGZlOTQ7CiAgdC50ZWhtZWRpYWxhcmFiaWMgPSAweGZlOTg7CiAgdC50ZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNhNDsKICB0LnRlaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwZTsKICB0LnRlaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM3MzsKICB0LnRla2F0YWthbmEgPSAweDMwYzY7CiAgdC50ZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgzOwogIHQudGVsZXBob25lID0gMHgyMTIxOwogIHQudGVsZXBob25lYmxhY2sgPSAweDI2MGU7CiAgdC50ZWxpc2hhZ2Vkb2xhaGVicmV3ID0gMHgwNWEwOwogIHQudGVsaXNoYXFldGFuYWhlYnJldyA9IDB4MDVhOTsKICB0LnRlbmNpcmNsZSA9IDB4MjQ2OTsKICB0LnRlbmlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjk7CiAgdC50ZW5wYXJlbiA9IDB4MjQ3ZDsKICB0LnRlbnBlcmlvZCA9IDB4MjQ5MTsKICB0LnRlbnJvbWFuID0gMHgyMTc5OwogIHQudGVzaCA9IDB4MDJhNzsKICB0LnRldCA9IDB4MDVkODsKICB0LnRldGRhZ2VzaCA9IDB4ZmIzODsKICB0LnRldGRhZ2VzaGhlYnJldyA9IDB4ZmIzODsKICB0LnRldGhlYnJldyA9IDB4MDVkODsKICB0LnRldHNlY3lyaWxsaWMgPSAweDA0YjU7CiAgdC50ZXZpcmhlYnJldyA9IDB4MDU5YjsKICB0LnRldmlybGVmdGhlYnJldyA9IDB4MDU5YjsKICB0LnRoYWJlbmdhbGkgPSAweDA5YTU7CiAgdC50aGFkZXZhID0gMHgwOTI1OwogIHQudGhhZ3VqYXJhdGkgPSAweDBhYTU7CiAgdC50aGFndXJtdWtoaSA9IDB4MGEyNTsKICB0LnRoYWxhcmFiaWMgPSAweDA2MzA7CiAgdC50aGFsZmluYWxhcmFiaWMgPSAweGZlYWM7CiAgdC50aGFudGhha2hhdGxvd2xlZnR0aGFpID0gMHhmODk4OwogIHQudGhhbnRoYWtoYXRsb3dyaWdodHRoYWkgPSAweGY4OTc7CiAgdC50aGFudGhha2hhdHRoYWkgPSAweDBlNGM7CiAgdC50aGFudGhha2hhdHVwcGVybGVmdHRoYWkgPSAweGY4OTY7CiAgdC50aGVoYXJhYmljID0gMHgwNjJiOwogIHQudGhlaGZpbmFsYXJhYmljID0gMHhmZTlhOwogIHQudGhlaGluaXRpYWxhcmFiaWMgPSAweGZlOWI7CiAgdC50aGVobWVkaWFsYXJhYmljID0gMHhmZTljOwogIHQudGhlcmVleGlzdHMgPSAweDIyMDM7CiAgdC50aGVyZWZvcmUgPSAweDIyMzQ7CiAgdC50aGV0YSA9IDB4MDNiODsKICB0LnRoZXRhMSA9IDB4MDNkMTsKICB0LnRoZXRhc3ltYm9sZ3JlZWsgPSAweDAzZDE7CiAgdC50aGlldXRoYWNpcmNsZWtvcmVhbiA9IDB4MzI3OTsKICB0LnRoaWV1dGhhcGFyZW5rb3JlYW4gPSAweDMyMTk7CiAgdC50aGlldXRoY2lyY2xla29yZWFuID0gMHgzMjZiOwogIHQudGhpZXV0aGtvcmVhbiA9IDB4MzE0YzsKICB0LnRoaWV1dGhwYXJlbmtvcmVhbiA9IDB4MzIwYjsKICB0LnRoaXJ0ZWVuY2lyY2xlID0gMHgyNDZjOwogIHQudGhpcnRlZW5wYXJlbiA9IDB4MjQ4MDsKICB0LnRoaXJ0ZWVucGVyaW9kID0gMHgyNDk0OwogIHQudGhvbmFuZ21vbnRob3RoYWkgPSAweDBlMTE7CiAgdC50aG9vayA9IDB4MDFhZDsKICB0LnRob3BodXRoYW90aGFpID0gMHgwZTEyOwogIHQudGhvcm4gPSAweDAwZmU7CiAgdC50aG90aGFoYW50aGFpID0gMHgwZTE3OwogIHQudGhvdGhhbnRoYWkgPSAweDBlMTA7CiAgdC50aG90aG9uZ3RoYWkgPSAweDBlMTg7CiAgdC50aG90aHVuZ3RoYWkgPSAweDBlMTY7CiAgdC50aG91c2FuZGN5cmlsbGljID0gMHgwNDgyOwogIHQudGhvdXNhbmRzc2VwYXJhdG9yYXJhYmljID0gMHgwNjZjOwogIHQudGhvdXNhbmRzc2VwYXJhdG9ycGVyc2lhbiA9IDB4MDY2YzsKICB0LnRocmVlID0gMHgwMDMzOwogIHQudGhyZWVhcmFiaWMgPSAweDA2NjM7CiAgdC50aHJlZWJlbmdhbGkgPSAweDA5ZTk7CiAgdC50aHJlZWNpcmNsZSA9IDB4MjQ2MjsKICB0LnRocmVlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4YzsKICB0LnRocmVlZGV2YSA9IDB4MDk2OTsKICB0LnRocmVlZWlnaHRocyA9IDB4MjE1YzsKICB0LnRocmVlZ3VqYXJhdGkgPSAweDBhZTk7CiAgdC50aHJlZWd1cm11a2hpID0gMHgwYTY5OwogIHQudGhyZWVoYWNrYXJhYmljID0gMHgwNjYzOwogIHQudGhyZWVoYW5nemhvdSA9IDB4MzAyMzsKICB0LnRocmVlaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMjsKICB0LnRocmVlaW5mZXJpb3IgPSAweDIwODM7CiAgdC50aHJlZW1vbm9zcGFjZSA9IDB4ZmYxMzsKICB0LnRocmVlbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNjsKICB0LnRocmVlb2xkc3R5bGUgPSAweGY3MzM7CiAgdC50aHJlZXBhcmVuID0gMHgyNDc2OwogIHQudGhyZWVwZXJpb2QgPSAweDI0OGE7CiAgdC50aHJlZXBlcnNpYW4gPSAweDA2ZjM7CiAgdC50aHJlZXF1YXJ0ZXJzID0gMHgwMGJlOwogIHQudGhyZWVxdWFydGVyc2VtZGFzaCA9IDB4ZjZkZTsKICB0LnRocmVlcm9tYW4gPSAweDIxNzI7CiAgdC50aHJlZXN1cGVyaW9yID0gMHgwMGIzOwogIHQudGhyZWV0aGFpID0gMHgwZTUzOwogIHQudGh6c3F1YXJlID0gMHgzMzk0OwogIHQudGloaXJhZ2FuYSA9IDB4MzA2MTsKICB0LnRpa2F0YWthbmEgPSAweDMwYzE7CiAgdC50aWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgxOwogIHQudGlrZXV0YWNpcmNsZWtvcmVhbiA9IDB4MzI3MDsKICB0LnRpa2V1dGFwYXJlbmtvcmVhbiA9IDB4MzIxMDsKICB0LnRpa2V1dGNpcmNsZWtvcmVhbiA9IDB4MzI2MjsKICB0LnRpa2V1dGtvcmVhbiA9IDB4MzEzNzsKICB0LnRpa2V1dHBhcmVua29yZWFuID0gMHgzMjAyOwogIHQudGlsZGUgPSAweDAyZGM7CiAgdC50aWxkZWJlbG93Y21iID0gMHgwMzMwOwogIHQudGlsZGVjbWIgPSAweDAzMDM7CiAgdC50aWxkZWNvbWIgPSAweDAzMDM7CiAgdC50aWxkZWRvdWJsZWNtYiA9IDB4MDM2MDsKICB0LnRpbGRlb3BlcmF0b3IgPSAweDIyM2M7CiAgdC50aWxkZW92ZXJsYXljbWIgPSAweDAzMzQ7CiAgdC50aWxkZXZlcnRpY2FsY21iID0gMHgwMzNlOwogIHQudGltZXNjaXJjbGUgPSAweDIyOTc7CiAgdC50aXBlaGFoZWJyZXcgPSAweDA1OTY7CiAgdC50aXBlaGFsZWZ0aGVicmV3ID0gMHgwNTk2OwogIHQudGlwcGlndXJtdWtoaSA9IDB4MGE3MDsKICB0LnRpdGxvY3lyaWxsaWNjbWIgPSAweDA0ODM7CiAgdC50aXduYXJtZW5pYW4gPSAweDA1N2Y7CiAgdC50bGluZWJlbG93ID0gMHgxZTZmOwogIHQudG1vbm9zcGFjZSA9IDB4ZmY1NDsKICB0LnRvYXJtZW5pYW4gPSAweDA1Njk7CiAgdC50b2hpcmFnYW5hID0gMHgzMDY4OwogIHQudG9rYXRha2FuYSA9IDB4MzBjODsKICB0LnRva2F0YWthbmFoYWxmd2lkdGggPSAweGZmODQ7CiAgdC50b25lYmFyZXh0cmFoaWdobW9kID0gMHgwMmU1OwogIHQudG9uZWJhcmV4dHJhbG93bW9kID0gMHgwMmU5OwogIHQudG9uZWJhcmhpZ2htb2QgPSAweDAyZTY7CiAgdC50b25lYmFybG93bW9kID0gMHgwMmU4OwogIHQudG9uZWJhcm1pZG1vZCA9IDB4MDJlNzsKICB0LnRvbmVmaXZlID0gMHgwMWJkOwogIHQudG9uZXNpeCA9IDB4MDE4NTsKICB0LnRvbmV0d28gPSAweDAxYTg7CiAgdC50b25vcyA9IDB4MDM4NDsKICB0LnRvbnNxdWFyZSA9IDB4MzMyNzsKICB0LnRvcGF0YWt0aGFpID0gMHgwZTBmOwogIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0ID0gMHgzMDE0OwogIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0c21hbGwgPSAweGZlNWQ7CiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzOTsKICB0LnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHQgPSAweDMwMTU7CiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0c21hbGwgPSAweGZlNWU7CiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2E7CiAgdC50b3Rhb3RoYWkgPSAweDBlMTU7CiAgdC50cGFsYXRhbGhvb2sgPSAweDAxYWI7CiAgdC50cGFyZW4gPSAweDI0YWY7CiAgdC50cmFkZW1hcmsgPSAweDIxMjI7CiAgdC50cmFkZW1hcmtzYW5zID0gMHhmOGVhOwogIHQudHJhZGVtYXJrc2VyaWYgPSAweGY2ZGI7CiAgdC50cmV0cm9mbGV4aG9vayA9IDB4MDI4ODsKICB0LnRyaWFnZG4gPSAweDI1YmM7CiAgdC50cmlhZ2xmID0gMHgyNWM0OwogIHQudHJpYWdydCA9IDB4MjViYTsKICB0LnRyaWFndXAgPSAweDI1YjI7CiAgdC50cyA9IDB4MDJhNjsKICB0LnRzYWRpID0gMHgwNWU2OwogIHQudHNhZGlkYWdlc2ggPSAweGZiNDY7CiAgdC50c2FkaWRhZ2VzaGhlYnJldyA9IDB4ZmI0NjsKICB0LnRzYWRpaGVicmV3ID0gMHgwNWU2OwogIHQudHNlY3lyaWxsaWMgPSAweDA0NDY7CiAgdC50c2VyZSA9IDB4MDViNTsKICB0LnRzZXJlMTIgPSAweDA1YjU7CiAgdC50c2VyZTFlID0gMHgwNWI1OwogIHQudHNlcmUyYiA9IDB4MDViNTsKICB0LnRzZXJlaGVicmV3ID0gMHgwNWI1OwogIHQudHNlcmVuYXJyb3doZWJyZXcgPSAweDA1YjU7CiAgdC50c2VyZXF1YXJ0ZXJoZWJyZXcgPSAweDA1YjU7CiAgdC50c2VyZXdpZGVoZWJyZXcgPSAweDA1YjU7CiAgdC50c2hlY3lyaWxsaWMgPSAweDA0NWI7CiAgdC50c3VwZXJpb3IgPSAweGY2ZjM7CiAgdC50dGFiZW5nYWxpID0gMHgwOTlmOwogIHQudHRhZGV2YSA9IDB4MDkxZjsKICB0LnR0YWd1amFyYXRpID0gMHgwYTlmOwogIHQudHRhZ3VybXVraGkgPSAweDBhMWY7CiAgdC50dGVoYXJhYmljID0gMHgwNjc5OwogIHQudHRlaGZpbmFsYXJhYmljID0gMHhmYjY3OwogIHQudHRlaGluaXRpYWxhcmFiaWMgPSAweGZiNjg7CiAgdC50dGVobWVkaWFsYXJhYmljID0gMHhmYjY5OwogIHQudHRoYWJlbmdhbGkgPSAweDA5YTA7CiAgdC50dGhhZGV2YSA9IDB4MDkyMDsKICB0LnR0aGFndWphcmF0aSA9IDB4MGFhMDsKICB0LnR0aGFndXJtdWtoaSA9IDB4MGEyMDsKICB0LnR0dXJuZWQgPSAweDAyODc7CiAgdC50dWhpcmFnYW5hID0gMHgzMDY0OwogIHQudHVrYXRha2FuYSA9IDB4MzBjNDsKICB0LnR1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmODI7CiAgdC50dXNtYWxsaGlyYWdhbmEgPSAweDMwNjM7CiAgdC50dXNtYWxsa2F0YWthbmEgPSAweDMwYzM7CiAgdC50dXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmY7CiAgdC50d2VsdmVjaXJjbGUgPSAweDI0NmI7CiAgdC50d2VsdmVwYXJlbiA9IDB4MjQ3ZjsKICB0LnR3ZWx2ZXBlcmlvZCA9IDB4MjQ5MzsKICB0LnR3ZWx2ZXJvbWFuID0gMHgyMTdiOwogIHQudHdlbnR5Y2lyY2xlID0gMHgyNDczOwogIHQudHdlbnR5aGFuZ3pob3UgPSAweDUzNDQ7CiAgdC50d2VudHlwYXJlbiA9IDB4MjQ4NzsKICB0LnR3ZW50eXBlcmlvZCA9IDB4MjQ5YjsKICB0LnR3byA9IDB4MDAzMjsKICB0LnR3b2FyYWJpYyA9IDB4MDY2MjsKICB0LnR3b2JlbmdhbGkgPSAweDA5ZTg7CiAgdC50d29jaXJjbGUgPSAweDI0NjE7CiAgdC50d29jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhiOwogIHQudHdvZGV2YSA9IDB4MDk2ODsKICB0LnR3b2RvdGVubGVhZGVyID0gMHgyMDI1OwogIHQudHdvZG90bGVhZGVyID0gMHgyMDI1OwogIHQudHdvZG90bGVhZGVydmVydGljYWwgPSAweGZlMzA7CiAgdC50d29ndWphcmF0aSA9IDB4MGFlODsKICB0LnR3b2d1cm11a2hpID0gMHgwYTY4OwogIHQudHdvaGFja2FyYWJpYyA9IDB4MDY2MjsKICB0LnR3b2hhbmd6aG91ID0gMHgzMDIyOwogIHQudHdvaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMTsKICB0LnR3b2luZmVyaW9yID0gMHgyMDgyOwogIHQudHdvbW9ub3NwYWNlID0gMHhmZjEyOwogIHQudHdvbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNTsKICB0LnR3b29sZHN0eWxlID0gMHhmNzMyOwogIHQudHdvcGFyZW4gPSAweDI0NzU7CiAgdC50d29wZXJpb2QgPSAweDI0ODk7CiAgdC50d29wZXJzaWFuID0gMHgwNmYyOwogIHQudHdvcm9tYW4gPSAweDIxNzE7CiAgdC50d29zdHJva2UgPSAweDAxYmI7CiAgdC50d29zdXBlcmlvciA9IDB4MDBiMjsKICB0LnR3b3RoYWkgPSAweDBlNTI7CiAgdC50d290aGlyZHMgPSAweDIxNTQ7CiAgdC51ID0gMHgwMDc1OwogIHQudWFjdXRlID0gMHgwMGZhOwogIHQudWJhciA9IDB4MDI4OTsKICB0LnViZW5nYWxpID0gMHgwOTg5OwogIHQudWJvcG9tb2ZvID0gMHgzMTI4OwogIHQudWJyZXZlID0gMHgwMTZkOwogIHQudWNhcm9uID0gMHgwMWQ0OwogIHQudWNpcmNsZSA9IDB4MjRlNDsKICB0LnVjaXJjdW1mbGV4ID0gMHgwMGZiOwogIHQudWNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3NzsKICB0LnVjeXJpbGxpYyA9IDB4MDQ0MzsKICB0LnVkYXR0YWRldmEgPSAweDA5NTE7CiAgdC51ZGJsYWN1dGUgPSAweDAxNzE7CiAgdC51ZGJsZ3JhdmUgPSAweDAyMTU7CiAgdC51ZGV2YSA9IDB4MDkwOTsKICB0LnVkaWVyZXNpcyA9IDB4MDBmYzsKICB0LnVkaWVyZXNpc2FjdXRlID0gMHgwMWQ4OwogIHQudWRpZXJlc2lzYmVsb3cgPSAweDFlNzM7CiAgdC51ZGllcmVzaXNjYXJvbiA9IDB4MDFkYTsKICB0LnVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGYxOwogIHQudWRpZXJlc2lzZ3JhdmUgPSAweDAxZGM7CiAgdC51ZGllcmVzaXNtYWNyb24gPSAweDAxZDY7CiAgdC51ZG90YmVsb3cgPSAweDFlZTU7CiAgdC51Z3JhdmUgPSAweDAwZjk7CiAgdC51Z3VqYXJhdGkgPSAweDBhODk7CiAgdC51Z3VybXVraGkgPSAweDBhMDk7CiAgdC51aGlyYWdhbmEgPSAweDMwNDY7CiAgdC51aG9va2Fib3ZlID0gMHgxZWU3OwogIHQudWhvcm4gPSAweDAxYjA7CiAgdC51aG9ybmFjdXRlID0gMHgxZWU5OwogIHQudWhvcm5kb3RiZWxvdyA9IDB4MWVmMTsKICB0LnVob3JuZ3JhdmUgPSAweDFlZWI7CiAgdC51aG9ybmhvb2thYm92ZSA9IDB4MWVlZDsKICB0LnVob3JudGlsZGUgPSAweDFlZWY7CiAgdC51aHVuZ2FydW1sYXV0ID0gMHgwMTcxOwogIHQudWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYzOwogIHQudWludmVydGVkYnJldmUgPSAweDAyMTc7CiAgdC51a2F0YWthbmEgPSAweDMwYTY7CiAgdC51a2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzM7CiAgdC51a2N5cmlsbGljID0gMHgwNDc5OwogIHQudWtvcmVhbiA9IDB4MzE1YzsKICB0LnVtYWNyb24gPSAweDAxNmI7CiAgdC51bWFjcm9uY3lyaWxsaWMgPSAweDA0ZWY7CiAgdC51bWFjcm9uZGllcmVzaXMgPSAweDFlN2I7CiAgdC51bWF0cmFndXJtdWtoaSA9IDB4MGE0MTsKICB0LnVtb25vc3BhY2UgPSAweGZmNTU7CiAgdC51bmRlcnNjb3JlID0gMHgwMDVmOwogIHQudW5kZXJzY29yZWRibCA9IDB4MjAxNzsKICB0LnVuZGVyc2NvcmVtb25vc3BhY2UgPSAweGZmM2Y7CiAgdC51bmRlcnNjb3JldmVydGljYWwgPSAweGZlMzM7CiAgdC51bmRlcnNjb3Jld2F2eSA9IDB4ZmU0ZjsKICB0LnVuaW9uID0gMHgyMjJhOwogIHQudW5pdmVyc2FsID0gMHgyMjAwOwogIHQudW9nb25layA9IDB4MDE3MzsKICB0LnVwYXJlbiA9IDB4MjRiMDsKICB0LnVwYmxvY2sgPSAweDI1ODA7CiAgdC51cHBlcmRvdGhlYnJldyA9IDB4MDVjNDsKICB0LnVwc2lsb24gPSAweDAzYzU7CiAgdC51cHNpbG9uZGllcmVzaXMgPSAweDAzY2I7CiAgdC51cHNpbG9uZGllcmVzaXN0b25vcyA9IDB4MDNiMDsKICB0LnVwc2lsb25sYXRpbiA9IDB4MDI4YTsKICB0LnVwc2lsb250b25vcyA9IDB4MDNjZDsKICB0LnVwdGFja2JlbG93Y21iID0gMHgwMzFkOwogIHQudXB0YWNrbW9kID0gMHgwMmQ0OwogIHQudXJhZ3VybXVraGkgPSAweDBhNzM7CiAgdC51cmluZyA9IDB4MDE2ZjsKICB0LnVzaG9ydGN5cmlsbGljID0gMHgwNDVlOwogIHQudXNtYWxsaGlyYWdhbmEgPSAweDMwNDU7CiAgdC51c21hbGxrYXRha2FuYSA9IDB4MzBhNTsKICB0LnVzbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjY5OwogIHQudXN0cmFpZ2h0Y3lyaWxsaWMgPSAweDA0YWY7CiAgdC51c3RyYWlnaHRzdHJva2VjeXJpbGxpYyA9IDB4MDRiMTsKICB0LnV0aWxkZSA9IDB4MDE2OTsKICB0LnV0aWxkZWFjdXRlID0gMHgxZTc5OwogIHQudXRpbGRlYmVsb3cgPSAweDFlNzU7CiAgdC51dWJlbmdhbGkgPSAweDA5OGE7CiAgdC51dWRldmEgPSAweDA5MGE7CiAgdC51dWd1amFyYXRpID0gMHgwYThhOwogIHQudXVndXJtdWtoaSA9IDB4MGEwYTsKICB0LnV1bWF0cmFndXJtdWtoaSA9IDB4MGE0MjsKICB0LnV1dm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMjsKICB0LnV1dm93ZWxzaWduZGV2YSA9IDB4MDk0MjsKICB0LnV1dm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzI7CiAgdC51dm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMTsKICB0LnV2b3dlbHNpZ25kZXZhID0gMHgwOTQxOwogIHQudXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWMxOwogIHQudiA9IDB4MDA3NjsKICB0LnZhZGV2YSA9IDB4MDkzNTsKICB0LnZhZ3VqYXJhdGkgPSAweDBhYjU7CiAgdC52YWd1cm11a2hpID0gMHgwYTM1OwogIHQudmFrYXRha2FuYSA9IDB4MzBmNzsKICB0LnZhdiA9IDB4MDVkNTsKICB0LnZhdmRhZ2VzaCA9IDB4ZmIzNTsKICB0LnZhdmRhZ2VzaDY1ID0gMHhmYjM1OwogIHQudmF2ZGFnZXNoaGVicmV3ID0gMHhmYjM1OwogIHQudmF2aGVicmV3ID0gMHgwNWQ1OwogIHQudmF2aG9sYW0gPSAweGZiNGI7CiAgdC52YXZob2xhbWhlYnJldyA9IDB4ZmI0YjsKICB0LnZhdnZhdmhlYnJldyA9IDB4MDVmMDsKICB0LnZhdnlvZGhlYnJldyA9IDB4MDVmMTsKICB0LnZjaXJjbGUgPSAweDI0ZTU7CiAgdC52ZG90YmVsb3cgPSAweDFlN2Y7CiAgdC52ZWN5cmlsbGljID0gMHgwNDMyOwogIHQudmVoYXJhYmljID0gMHgwNmE0OwogIHQudmVoZmluYWxhcmFiaWMgPSAweGZiNmI7CiAgdC52ZWhpbml0aWFsYXJhYmljID0gMHhmYjZjOwogIHQudmVobWVkaWFsYXJhYmljID0gMHhmYjZkOwogIHQudmVrYXRha2FuYSA9IDB4MzBmOTsKICB0LnZlbnVzID0gMHgyNjQwOwogIHQudmVydGljYWxiYXIgPSAweDAwN2M7CiAgdC52ZXJ0aWNhbGxpbmVhYm92ZWNtYiA9IDB4MDMwZDsKICB0LnZlcnRpY2FsbGluZWJlbG93Y21iID0gMHgwMzI5OwogIHQudmVydGljYWxsaW5lbG93bW9kID0gMHgwMmNjOwogIHQudmVydGljYWxsaW5lbW9kID0gMHgwMmM4OwogIHQudmV3YXJtZW5pYW4gPSAweDA1N2U7CiAgdC52aG9vayA9IDB4MDI4YjsKICB0LnZpa2F0YWthbmEgPSAweDMwZjg7CiAgdC52aXJhbWFiZW5nYWxpID0gMHgwOWNkOwogIHQudmlyYW1hZGV2YSA9IDB4MDk0ZDsKICB0LnZpcmFtYWd1amFyYXRpID0gMHgwYWNkOwogIHQudmlzYXJnYWJlbmdhbGkgPSAweDA5ODM7CiAgdC52aXNhcmdhZGV2YSA9IDB4MDkwMzsKICB0LnZpc2FyZ2FndWphcmF0aSA9IDB4MGE4MzsKICB0LnZtb25vc3BhY2UgPSAweGZmNTY7CiAgdC52b2FybWVuaWFuID0gMHgwNTc4OwogIHQudm9pY2VkaXRlcmF0aW9uaGlyYWdhbmEgPSAweDMwOWU7CiAgdC52b2ljZWRpdGVyYXRpb25rYXRha2FuYSA9IDB4MzBmZTsKICB0LnZvaWNlZG1hcmtrYW5hID0gMHgzMDliOwogIHQudm9pY2VkbWFya2thbmFoYWxmd2lkdGggPSAweGZmOWU7CiAgdC52b2thdGFrYW5hID0gMHgzMGZhOwogIHQudnBhcmVuID0gMHgyNGIxOwogIHQudnRpbGRlID0gMHgxZTdkOwogIHQudnR1cm5lZCA9IDB4MDI4YzsKICB0LnZ1aGlyYWdhbmEgPSAweDMwOTQ7CiAgdC52dWthdGFrYW5hID0gMHgzMGY0OwogIHQudyA9IDB4MDA3NzsKICB0LndhY3V0ZSA9IDB4MWU4MzsKICB0LndhZWtvcmVhbiA9IDB4MzE1OTsKICB0LndhaGlyYWdhbmEgPSAweDMwOGY7CiAgdC53YWthdGFrYW5hID0gMHgzMGVmOwogIHQud2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YzsKICB0Lndha29yZWFuID0gMHgzMTU4OwogIHQud2FzbWFsbGhpcmFnYW5hID0gMHgzMDhlOwogIHQud2FzbWFsbGthdGFrYW5hID0gMHgzMGVlOwogIHQud2F0dG9zcXVhcmUgPSAweDMzNTc7CiAgdC53YXZlZGFzaCA9IDB4MzAxYzsKICB0Lndhdnl1bmRlcnNjb3JldmVydGljYWwgPSAweGZlMzQ7CiAgdC53YXdhcmFiaWMgPSAweDA2NDg7CiAgdC53YXdmaW5hbGFyYWJpYyA9IDB4ZmVlZTsKICB0Lndhd2hhbXphYWJvdmVhcmFiaWMgPSAweDA2MjQ7CiAgdC53YXdoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODY7CiAgdC53YnNxdWFyZSA9IDB4MzNkZDsKICB0LndjaXJjbGUgPSAweDI0ZTY7CiAgdC53Y2lyY3VtZmxleCA9IDB4MDE3NTsKICB0LndkaWVyZXNpcyA9IDB4MWU4NTsKICB0Lndkb3RhY2NlbnQgPSAweDFlODc7CiAgdC53ZG90YmVsb3cgPSAweDFlODk7CiAgdC53ZWhpcmFnYW5hID0gMHgzMDkxOwogIHQud2VpZXJzdHJhc3MgPSAweDIxMTg7CiAgdC53ZWthdGFrYW5hID0gMHgzMGYxOwogIHQud2Vrb3JlYW4gPSAweDMxNWU7CiAgdC53ZW9rb3JlYW4gPSAweDMxNWQ7CiAgdC53Z3JhdmUgPSAweDFlODE7CiAgdC53aGl0ZWJ1bGxldCA9IDB4MjVlNjsKICB0LndoaXRlY2lyY2xlID0gMHgyNWNiOwogIHQud2hpdGVjaXJjbGVpbnZlcnNlID0gMHgyNWQ5OwogIHQud2hpdGVjb3JuZXJicmFja2V0bGVmdCA9IDB4MzAwZTsKICB0LndoaXRlY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MzsKICB0LndoaXRlY29ybmVyYnJhY2tldHJpZ2h0ID0gMHgzMDBmOwogIHQud2hpdGVjb3JuZXJicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmU0NDsKICB0LndoaXRlZGlhbW9uZCA9IDB4MjVjNzsKICB0LndoaXRlZGlhbW9uZGNvbnRhaW5pbmdibGFja3NtYWxsZGlhbW9uZCA9IDB4MjVjODsKICB0LndoaXRlZG93bnBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjViZjsKICB0LndoaXRlZG93bnBvaW50aW5ndHJpYW5nbGUgPSAweDI1YmQ7CiAgdC53aGl0ZWxlZnRwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YzM7CiAgdC53aGl0ZWxlZnRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWMxOwogIHQud2hpdGVsZW50aWN1bGFyYnJhY2tldGxlZnQgPSAweDMwMTY7CiAgdC53aGl0ZWxlbnRpY3VsYXJicmFja2V0cmlnaHQgPSAweDMwMTc7CiAgdC53aGl0ZXJpZ2h0cG9pbnRpbmdzbWFsbHRyaWFuZ2xlID0gMHgyNWI5OwogIHQud2hpdGVyaWdodHBvaW50aW5ndHJpYW5nbGUgPSAweDI1Yjc7CiAgdC53aGl0ZXNtYWxsc3F1YXJlID0gMHgyNWFiOwogIHQud2hpdGVzbWlsaW5nZmFjZSA9IDB4MjYzYTsKICB0LndoaXRlc3F1YXJlID0gMHgyNWExOwogIHQud2hpdGVzdGFyID0gMHgyNjA2OwogIHQud2hpdGV0ZWxlcGhvbmUgPSAweDI2MGY7CiAgdC53aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0bGVmdCA9IDB4MzAxODsKICB0LndoaXRldG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodCA9IDB4MzAxOTsKICB0LndoaXRldXBwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YjU7CiAgdC53aGl0ZXVwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMzsKICB0LndpaGlyYWdhbmEgPSAweDMwOTA7CiAgdC53aWthdGFrYW5hID0gMHgzMGYwOwogIHQud2lrb3JlYW4gPSAweDMxNWY7CiAgdC53bW9ub3NwYWNlID0gMHhmZjU3OwogIHQud29oaXJhZ2FuYSA9IDB4MzA5MjsKICB0Lndva2F0YWthbmEgPSAweDMwZjI7CiAgdC53b2thdGFrYW5haGFsZndpZHRoID0gMHhmZjY2OwogIHQud29uID0gMHgyMGE5OwogIHQud29ubW9ub3NwYWNlID0gMHhmZmU2OwogIHQud293YWVudGhhaSA9IDB4MGUyNzsKICB0LndwYXJlbiA9IDB4MjRiMjsKICB0LndyaW5nID0gMHgxZTk4OwogIHQud3N1cGVyaW9yID0gMHgwMmI3OwogIHQud3R1cm5lZCA9IDB4MDI4ZDsKICB0Lnd5bm4gPSAweDAxYmY7CiAgdC54ID0gMHgwMDc4OwogIHQueGFib3ZlY21iID0gMHgwMzNkOwogIHQueGJvcG9tb2ZvID0gMHgzMTEyOwogIHQueGNpcmNsZSA9IDB4MjRlNzsKICB0LnhkaWVyZXNpcyA9IDB4MWU4ZDsKICB0Lnhkb3RhY2NlbnQgPSAweDFlOGI7CiAgdC54ZWhhcm1lbmlhbiA9IDB4MDU2ZDsKICB0LnhpID0gMHgwM2JlOwogIHQueG1vbm9zcGFjZSA9IDB4ZmY1ODsKICB0LnhwYXJlbiA9IDB4MjRiMzsKICB0LnhzdXBlcmlvciA9IDB4MDJlMzsKICB0LnkgPSAweDAwNzk7CiAgdC55YWFkb3NxdWFyZSA9IDB4MzM0ZTsKICB0LnlhYmVuZ2FsaSA9IDB4MDlhZjsKICB0LnlhY3V0ZSA9IDB4MDBmZDsKICB0LnlhZGV2YSA9IDB4MDkyZjsKICB0LnlhZWtvcmVhbiA9IDB4MzE1MjsKICB0LnlhZ3VqYXJhdGkgPSAweDBhYWY7CiAgdC55YWd1cm11a2hpID0gMHgwYTJmOwogIHQueWFoaXJhZ2FuYSA9IDB4MzA4NDsKICB0Lnlha2F0YWthbmEgPSAweDMwZTQ7CiAgdC55YWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk0OwogIHQueWFrb3JlYW4gPSAweDMxNTE7CiAgdC55YW1ha2thbnRoYWkgPSAweDBlNGU7CiAgdC55YXNtYWxsaGlyYWdhbmEgPSAweDMwODM7CiAgdC55YXNtYWxsa2F0YWthbmEgPSAweDMwZTM7CiAgdC55YXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmM7CiAgdC55YXRjeXJpbGxpYyA9IDB4MDQ2MzsKICB0LnljaXJjbGUgPSAweDI0ZTg7CiAgdC55Y2lyY3VtZmxleCA9IDB4MDE3NzsKICB0LnlkaWVyZXNpcyA9IDB4MDBmZjsKICB0Lnlkb3RhY2NlbnQgPSAweDFlOGY7CiAgdC55ZG90YmVsb3cgPSAweDFlZjU7CiAgdC55ZWhhcmFiaWMgPSAweDA2NGE7CiAgdC55ZWhiYXJyZWVhcmFiaWMgPSAweDA2ZDI7CiAgdC55ZWhiYXJyZWVmaW5hbGFyYWJpYyA9IDB4ZmJhZjsKICB0LnllaGZpbmFsYXJhYmljID0gMHhmZWYyOwogIHQueWVoaGFtemFhYm92ZWFyYWJpYyA9IDB4MDYyNjsKICB0LnllaGhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4YTsKICB0LnllaGhhbXphYWJvdmVpbml0aWFsYXJhYmljID0gMHhmZThiOwogIHQueWVoaGFtemFhYm92ZW1lZGlhbGFyYWJpYyA9IDB4ZmU4YzsKICB0LnllaGluaXRpYWxhcmFiaWMgPSAweGZlZjM7CiAgdC55ZWhtZWRpYWxhcmFiaWMgPSAweGZlZjQ7CiAgdC55ZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkZDsKICB0LnllaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM1ODsKICB0LnllaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM5NDsKICB0LnllaHRocmVlZG90c2JlbG93YXJhYmljID0gMHgwNmQxOwogIHQueWVrb3JlYW4gPSAweDMxNTY7CiAgdC55ZW4gPSAweDAwYTU7CiAgdC55ZW5tb25vc3BhY2UgPSAweGZmZTU7CiAgdC55ZW9rb3JlYW4gPSAweDMxNTU7CiAgdC55ZW9yaW5oaWV1aGtvcmVhbiA9IDB4MzE4NjsKICB0LnllcmFoYmVueW9tb2hlYnJldyA9IDB4MDVhYTsKICB0LnllcmFoYmVueW9tb2xlZnRoZWJyZXcgPSAweDA1YWE7CiAgdC55ZXJpY3lyaWxsaWMgPSAweDA0NGI7CiAgdC55ZXJ1ZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmOTsKICB0Lnllc2lldW5na29yZWFuID0gMHgzMTgxOwogIHQueWVzaWV1bmdwYW5zaW9za29yZWFuID0gMHgzMTgzOwogIHQueWVzaWV1bmdzaW9za29yZWFuID0gMHgzMTgyOwogIHQueWV0aXZoZWJyZXcgPSAweDA1OWE7CiAgdC55Z3JhdmUgPSAweDFlZjM7CiAgdC55aG9vayA9IDB4MDFiNDsKICB0Lnlob29rYWJvdmUgPSAweDFlZjc7CiAgdC55aWFybWVuaWFuID0gMHgwNTc1OwogIHQueWljeXJpbGxpYyA9IDB4MDQ1NzsKICB0Lnlpa29yZWFuID0gMHgzMTYyOwogIHQueWlueWFuZyA9IDB4MjYyZjsKICB0Lnlpd25hcm1lbmlhbiA9IDB4MDU4MjsKICB0Lnltb25vc3BhY2UgPSAweGZmNTk7CiAgdC55b2QgPSAweDA1ZDk7CiAgdC55b2RkYWdlc2ggPSAweGZiMzk7CiAgdC55b2RkYWdlc2hoZWJyZXcgPSAweGZiMzk7CiAgdC55b2RoZWJyZXcgPSAweDA1ZDk7CiAgdC55b2R5b2RoZWJyZXcgPSAweDA1ZjI7CiAgdC55b2R5b2RwYXRhaGhlYnJldyA9IDB4ZmIxZjsKICB0LnlvaGlyYWdhbmEgPSAweDMwODg7CiAgdC55b2lrb3JlYW4gPSAweDMxODk7CiAgdC55b2thdGFrYW5hID0gMHgzMGU4OwogIHQueW9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NjsKICB0Lnlva29yZWFuID0gMHgzMTViOwogIHQueW9zbWFsbGhpcmFnYW5hID0gMHgzMDg3OwogIHQueW9zbWFsbGthdGFrYW5hID0gMHgzMGU3OwogIHQueW9zbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjZlOwogIHQueW90Z3JlZWsgPSAweDAzZjM7CiAgdC55b3lhZWtvcmVhbiA9IDB4MzE4ODsKICB0LnlveWFrb3JlYW4gPSAweDMxODc7CiAgdC55b3lha3RoYWkgPSAweDBlMjI7CiAgdC55b3lpbmd0aGFpID0gMHgwZTBkOwogIHQueXBhcmVuID0gMHgyNGI0OwogIHQueXBvZ2VncmFtbWVuaSA9IDB4MDM3YTsKICB0Lnlwb2dlZ3JhbW1lbmlncmVla2NtYiA9IDB4MDM0NTsKICB0LnlyID0gMHgwMWE2OwogIHQueXJpbmcgPSAweDFlOTk7CiAgdC55c3VwZXJpb3IgPSAweDAyYjg7CiAgdC55dGlsZGUgPSAweDFlZjk7CiAgdC55dHVybmVkID0gMHgwMjhlOwogIHQueXVoaXJhZ2FuYSA9IDB4MzA4NjsKICB0Lnl1aWtvcmVhbiA9IDB4MzE4YzsKICB0Lnl1a2F0YWthbmEgPSAweDMwZTY7CiAgdC55dWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk1OwogIHQueXVrb3JlYW4gPSAweDMxNjA7CiAgdC55dXNiaWdjeXJpbGxpYyA9IDB4MDQ2YjsKICB0Lnl1c2JpZ2lvdGlmaWVkY3lyaWxsaWMgPSAweDA0NmQ7CiAgdC55dXNsaXR0bGVjeXJpbGxpYyA9IDB4MDQ2NzsKICB0Lnl1c2xpdHRsZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0Njk7CiAgdC55dXNtYWxsaGlyYWdhbmEgPSAweDMwODU7CiAgdC55dXNtYWxsa2F0YWthbmEgPSAweDMwZTU7CiAgdC55dXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmQ7CiAgdC55dXlla29yZWFuID0gMHgzMThiOwogIHQueXV5ZW9rb3JlYW4gPSAweDMxOGE7CiAgdC55eWFiZW5nYWxpID0gMHgwOWRmOwogIHQueXlhZGV2YSA9IDB4MDk1ZjsKICB0LnogPSAweDAwN2E7CiAgdC56YWFybWVuaWFuID0gMHgwNTY2OwogIHQuemFjdXRlID0gMHgwMTdhOwogIHQuemFkZXZhID0gMHgwOTViOwogIHQuemFndXJtdWtoaSA9IDB4MGE1YjsKICB0LnphaGFyYWJpYyA9IDB4MDYzODsKICB0LnphaGZpbmFsYXJhYmljID0gMHhmZWM2OwogIHQuemFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVjNzsKICB0LnphaGlyYWdhbmEgPSAweDMwNTY7CiAgdC56YWhtZWRpYWxhcmFiaWMgPSAweGZlYzg7CiAgdC56YWluYXJhYmljID0gMHgwNjMyOwogIHQuemFpbmZpbmFsYXJhYmljID0gMHhmZWIwOwogIHQuemFrYXRha2FuYSA9IDB4MzBiNjsKICB0LnphcWVmZ2Fkb2xoZWJyZXcgPSAweDA1OTU7CiAgdC56YXFlZnFhdGFuaGVicmV3ID0gMHgwNTk0OwogIHQuemFycWFoZWJyZXcgPSAweDA1OTg7CiAgdC56YXlpbiA9IDB4MDVkNjsKICB0LnpheWluZGFnZXNoID0gMHhmYjM2OwogIHQuemF5aW5kYWdlc2hoZWJyZXcgPSAweGZiMzY7CiAgdC56YXlpbmhlYnJldyA9IDB4MDVkNjsKICB0Lnpib3BvbW9mbyA9IDB4MzExNzsKICB0LnpjYXJvbiA9IDB4MDE3ZTsKICB0LnpjaXJjbGUgPSAweDI0ZTk7CiAgdC56Y2lyY3VtZmxleCA9IDB4MWU5MTsKICB0LnpjdXJsID0gMHgwMjkxOwogIHQuemRvdCA9IDB4MDE3YzsKICB0Lnpkb3RhY2NlbnQgPSAweDAxN2M7CiAgdC56ZG90YmVsb3cgPSAweDFlOTM7CiAgdC56ZWN5cmlsbGljID0gMHgwNDM3OwogIHQuemVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDQ5OTsKICB0LnplZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkZjsKICB0LnplaGlyYWdhbmEgPSAweDMwNWM7CiAgdC56ZWthdGFrYW5hID0gMHgzMGJjOwogIHQuemVybyA9IDB4MDAzMDsKICB0Lnplcm9hcmFiaWMgPSAweDA2NjA7CiAgdC56ZXJvYmVuZ2FsaSA9IDB4MDllNjsKICB0Lnplcm9kZXZhID0gMHgwOTY2OwogIHQuemVyb2d1amFyYXRpID0gMHgwYWU2OwogIHQuemVyb2d1cm11a2hpID0gMHgwYTY2OwogIHQuemVyb2hhY2thcmFiaWMgPSAweDA2NjA7CiAgdC56ZXJvaW5mZXJpb3IgPSAweDIwODA7CiAgdC56ZXJvbW9ub3NwYWNlID0gMHhmZjEwOwogIHQuemVyb29sZHN0eWxlID0gMHhmNzMwOwogIHQuemVyb3BlcnNpYW4gPSAweDA2ZjA7CiAgdC56ZXJvc3VwZXJpb3IgPSAweDIwNzA7CiAgdC56ZXJvdGhhaSA9IDB4MGU1MDsKICB0Lnplcm93aWR0aGpvaW5lciA9IDB4ZmVmZjsKICB0Lnplcm93aWR0aG5vbmpvaW5lciA9IDB4MjAwYzsKICB0Lnplcm93aWR0aHNwYWNlID0gMHgyMDBiOwogIHQuemV0YSA9IDB4MDNiNjsKICB0LnpoYm9wb21vZm8gPSAweDMxMTM7CiAgdC56aGVhcm1lbmlhbiA9IDB4MDU2YTsKICB0LnpoZWJyZXZlY3lyaWxsaWMgPSAweDA0YzI7CiAgdC56aGVjeXJpbGxpYyA9IDB4MDQzNjsKICB0LnpoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk3OwogIHQuemhlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkZDsKICB0LnppaGlyYWdhbmEgPSAweDMwNTg7CiAgdC56aWthdGFrYW5hID0gMHgzMGI4OwogIHQuemlub3JoZWJyZXcgPSAweDA1YWU7CiAgdC56bGluZWJlbG93ID0gMHgxZTk1OwogIHQuem1vbm9zcGFjZSA9IDB4ZmY1YTsKICB0LnpvaGlyYWdhbmEgPSAweDMwNWU7CiAgdC56b2thdGFrYW5hID0gMHgzMGJlOwogIHQuenBhcmVuID0gMHgyNGI1OwogIHQuenJldHJvZmxleGhvb2sgPSAweDAyOTA7CiAgdC56c3Ryb2tlID0gMHgwMWI2OwogIHQuenVoaXJhZ2FuYSA9IDB4MzA1YTsKICB0Lnp1a2F0YWthbmEgPSAweDMwYmE7CiAgdFsiLm5vdGRlZiJdID0gMHgwMDAwOwogIHQuYW5nYnJhY2tldGxlZnRiaWcgPSAweDIzMjk7CiAgdC5hbmdicmFja2V0bGVmdEJpZyA9IDB4MjMyOTsKICB0LmFuZ2JyYWNrZXRsZWZ0YmlnZyA9IDB4MjMyOTsKICB0LmFuZ2JyYWNrZXRsZWZ0QmlnZyA9IDB4MjMyOTsKICB0LmFuZ2JyYWNrZXRyaWdodEJpZyA9IDB4MjMyYTsKICB0LmFuZ2JyYWNrZXRyaWdodGJpZyA9IDB4MjMyYTsKICB0LmFuZ2JyYWNrZXRyaWdodEJpZ2cgPSAweDIzMmE7CiAgdC5hbmdicmFja2V0cmlnaHRiaWdnID0gMHgyMzJhOwogIHQuYXJyb3dob29rbGVmdCA9IDB4MjFhYTsKICB0LmFycm93aG9va3JpZ2h0ID0gMHgyMWE5OwogIHQuYXJyb3dsZWZ0dG9waGFsZiA9IDB4MjFiYzsKICB0LmFycm93bGVmdGJvdGhhbGYgPSAweDIxYmQ7CiAgdC5hcnJvd25vcnRoZWFzdCA9IDB4MjE5NzsKICB0LmFycm93bm9ydGh3ZXN0ID0gMHgyMTk2OwogIHQuYXJyb3dyaWdodHRvcGhhbGYgPSAweDIxYzA7CiAgdC5hcnJvd3JpZ2h0Ym90aGFsZiA9IDB4MjFjMTsKICB0LmFycm93c291dGhlYXN0ID0gMHgyMTk4OwogIHQuYXJyb3dzb3V0aHdlc3QgPSAweDIxOTk7CiAgdC5iYWNrc2xhc2hiaWcgPSAweDIyMTY7CiAgdC5iYWNrc2xhc2hCaWcgPSAweDIyMTY7CiAgdC5iYWNrc2xhc2hCaWdnID0gMHgyMjE2OwogIHQuYmFja3NsYXNoYmlnZyA9IDB4MjIxNjsKICB0LmJhcmRibCA9IDB4MjAxNjsKICB0LmJyYWNlaHRpcGRvd25sZWZ0ID0gMHhmZTM3OwogIHQuYnJhY2VodGlwZG93bnJpZ2h0ID0gMHhmZTM3OwogIHQuYnJhY2VodGlwdXBsZWZ0ID0gMHhmZTM4OwogIHQuYnJhY2VodGlwdXByaWdodCA9IDB4ZmUzODsKICB0LmJyYWNlbGVmdEJpZyA9IDB4MDA3YjsKICB0LmJyYWNlbGVmdGJpZyA9IDB4MDA3YjsKICB0LmJyYWNlbGVmdGJpZ2cgPSAweDAwN2I7CiAgdC5icmFjZWxlZnRCaWdnID0gMHgwMDdiOwogIHQuYnJhY2VyaWdodEJpZyA9IDB4MDA3ZDsKICB0LmJyYWNlcmlnaHRiaWcgPSAweDAwN2Q7CiAgdC5icmFjZXJpZ2h0YmlnZyA9IDB4MDA3ZDsKICB0LmJyYWNlcmlnaHRCaWdnID0gMHgwMDdkOwogIHQuYnJhY2tldGxlZnRiaWcgPSAweDAwNWI7CiAgdC5icmFja2V0bGVmdEJpZyA9IDB4MDA1YjsKICB0LmJyYWNrZXRsZWZ0YmlnZyA9IDB4MDA1YjsKICB0LmJyYWNrZXRsZWZ0QmlnZyA9IDB4MDA1YjsKICB0LmJyYWNrZXRyaWdodEJpZyA9IDB4MDA1ZDsKICB0LmJyYWNrZXRyaWdodGJpZyA9IDB4MDA1ZDsKICB0LmJyYWNrZXRyaWdodGJpZ2cgPSAweDAwNWQ7CiAgdC5icmFja2V0cmlnaHRCaWdnID0gMHgwMDVkOwogIHQuY2VpbGluZ2xlZnRiaWcgPSAweDIzMDg7CiAgdC5jZWlsaW5nbGVmdEJpZyA9IDB4MjMwODsKICB0LmNlaWxpbmdsZWZ0QmlnZyA9IDB4MjMwODsKICB0LmNlaWxpbmdsZWZ0YmlnZyA9IDB4MjMwODsKICB0LmNlaWxpbmdyaWdodGJpZyA9IDB4MjMwOTsKICB0LmNlaWxpbmdyaWdodEJpZyA9IDB4MjMwOTsKICB0LmNlaWxpbmdyaWdodGJpZ2cgPSAweDIzMDk7CiAgdC5jZWlsaW5ncmlnaHRCaWdnID0gMHgyMzA5OwogIHQuY2lyY2xlZG90ZGlzcGxheSA9IDB4MjI5OTsKICB0LmNpcmNsZWRvdHRleHQgPSAweDIyOTk7CiAgdC5jaXJjbGVtdWx0aXBseWRpc3BsYXkgPSAweDIyOTc7CiAgdC5jaXJjbGVtdWx0aXBseXRleHQgPSAweDIyOTc7CiAgdC5jaXJjbGVwbHVzZGlzcGxheSA9IDB4MjI5NTsKICB0LmNpcmNsZXBsdXN0ZXh0ID0gMHgyMjk1OwogIHQuY29udGludGVncmFsZGlzcGxheSA9IDB4MjIyZTsKICB0LmNvbnRpbnRlZ3JhbHRleHQgPSAweDIyMmU7CiAgdC5jb3Byb2R1Y3RkaXNwbGF5ID0gMHgyMjEwOwogIHQuY29wcm9kdWN0dGV4dCA9IDB4MjIxMDsKICB0LmZsb29ybGVmdEJpZyA9IDB4MjMwYTsKICB0LmZsb29ybGVmdGJpZyA9IDB4MjMwYTsKICB0LmZsb29ybGVmdGJpZ2cgPSAweDIzMGE7CiAgdC5mbG9vcmxlZnRCaWdnID0gMHgyMzBhOwogIHQuZmxvb3JyaWdodGJpZyA9IDB4MjMwYjsKICB0LmZsb29ycmlnaHRCaWcgPSAweDIzMGI7CiAgdC5mbG9vcnJpZ2h0QmlnZyA9IDB4MjMwYjsKICB0LmZsb29ycmlnaHRiaWdnID0gMHgyMzBiOwogIHQuaGF0d2lkZSA9IDB4MDMwMjsKICB0LmhhdHdpZGVyID0gMHgwMzAyOwogIHQuaGF0d2lkZXN0ID0gMHgwMzAyOwogIHQuaW50ZXJjYWwgPSAweDFkNDA7CiAgdC5pbnRlZ3JhbGRpc3BsYXkgPSAweDIyMmI7CiAgdC5pbnRlZ3JhbHRleHQgPSAweDIyMmI7CiAgdC5pbnRlcnNlY3Rpb25kaXNwbGF5ID0gMHgyMmMyOwogIHQuaW50ZXJzZWN0aW9udGV4dCA9IDB4MjJjMjsKICB0LmxvZ2ljYWxhbmRkaXNwbGF5ID0gMHgyMjI3OwogIHQubG9naWNhbGFuZHRleHQgPSAweDIyMjc7CiAgdC5sb2dpY2Fsb3JkaXNwbGF5ID0gMHgyMjI4OwogIHQubG9naWNhbG9ydGV4dCA9IDB4MjIyODsKICB0LnBhcmVubGVmdEJpZyA9IDB4MDAyODsKICB0LnBhcmVubGVmdGJpZyA9IDB4MDAyODsKICB0LnBhcmVubGVmdEJpZ2cgPSAweDAwMjg7CiAgdC5wYXJlbmxlZnRiaWdnID0gMHgwMDI4OwogIHQucGFyZW5yaWdodEJpZyA9IDB4MDAyOTsKICB0LnBhcmVucmlnaHRiaWcgPSAweDAwMjk7CiAgdC5wYXJlbnJpZ2h0QmlnZyA9IDB4MDAyOTsKICB0LnBhcmVucmlnaHRiaWdnID0gMHgwMDI5OwogIHQucHJpbWUgPSAweDIwMzI7CiAgdC5wcm9kdWN0ZGlzcGxheSA9IDB4MjIwZjsKICB0LnByb2R1Y3R0ZXh0ID0gMHgyMjBmOwogIHQucmFkaWNhbGJpZyA9IDB4MjIxYTsKICB0LnJhZGljYWxCaWcgPSAweDIyMWE7CiAgdC5yYWRpY2FsQmlnZyA9IDB4MjIxYTsKICB0LnJhZGljYWxiaWdnID0gMHgyMjFhOwogIHQucmFkaWNhbGJ0ID0gMHgyMjFhOwogIHQucmFkaWNhbHRwID0gMHgyMjFhOwogIHQucmFkaWNhbHZlcnRleCA9IDB4MjIxYTsKICB0LnNsYXNoYmlnID0gMHgwMDJmOwogIHQuc2xhc2hCaWcgPSAweDAwMmY7CiAgdC5zbGFzaEJpZ2cgPSAweDAwMmY7CiAgdC5zbGFzaGJpZ2cgPSAweDAwMmY7CiAgdC5zdW1tYXRpb25kaXNwbGF5ID0gMHgyMjExOwogIHQuc3VtbWF0aW9udGV4dCA9IDB4MjIxMTsKICB0LnRpbGRld2lkZSA9IDB4MDJkYzsKICB0LnRpbGRld2lkZXIgPSAweDAyZGM7CiAgdC50aWxkZXdpZGVzdCA9IDB4MDJkYzsKICB0LnVuaW9uZGlzcGxheSA9IDB4MjJjMzsKICB0LnVuaW9ubXVsdGlkaXNwbGF5ID0gMHgyMjhlOwogIHQudW5pb25tdWx0aXRleHQgPSAweDIyOGU7CiAgdC51bmlvbnNxZGlzcGxheSA9IDB4MjI5NDsKICB0LnVuaW9uc3F0ZXh0ID0gMHgyMjk0OwogIHQudW5pb250ZXh0ID0gMHgyMmMzOwogIHQudmV4dGVuZGRvdWJsZSA9IDB4MjIyNTsKICB0LnZleHRlbmRzaW5nbGUgPSAweDIyMjM7Cn0pOwpjb25zdCBnZXREaW5nYmF0c0dseXBoc1VuaWNvZGUgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LnNwYWNlID0gMHgwMDIwOwogIHQuYTEgPSAweDI3MDE7CiAgdC5hMiA9IDB4MjcwMjsKICB0LmEyMDIgPSAweDI3MDM7CiAgdC5hMyA9IDB4MjcwNDsKICB0LmE0ID0gMHgyNjBlOwogIHQuYTUgPSAweDI3MDY7CiAgdC5hMTE5ID0gMHgyNzA3OwogIHQuYTExOCA9IDB4MjcwODsKICB0LmExMTcgPSAweDI3MDk7CiAgdC5hMTEgPSAweDI2MWI7CiAgdC5hMTIgPSAweDI2MWU7CiAgdC5hMTMgPSAweDI3MGM7CiAgdC5hMTQgPSAweDI3MGQ7CiAgdC5hMTUgPSAweDI3MGU7CiAgdC5hMTYgPSAweDI3MGY7CiAgdC5hMTA1ID0gMHgyNzEwOwogIHQuYTE3ID0gMHgyNzExOwogIHQuYTE4ID0gMHgyNzEyOwogIHQuYTE5ID0gMHgyNzEzOwogIHQuYTIwID0gMHgyNzE0OwogIHQuYTIxID0gMHgyNzE1OwogIHQuYTIyID0gMHgyNzE2OwogIHQuYTIzID0gMHgyNzE3OwogIHQuYTI0ID0gMHgyNzE4OwogIHQuYTI1ID0gMHgyNzE5OwogIHQuYTI2ID0gMHgyNzFhOwogIHQuYTI3ID0gMHgyNzFiOwogIHQuYTI4ID0gMHgyNzFjOwogIHQuYTYgPSAweDI3MWQ7CiAgdC5hNyA9IDB4MjcxZTsKICB0LmE4ID0gMHgyNzFmOwogIHQuYTkgPSAweDI3MjA7CiAgdC5hMTAgPSAweDI3MjE7CiAgdC5hMjkgPSAweDI3MjI7CiAgdC5hMzAgPSAweDI3MjM7CiAgdC5hMzEgPSAweDI3MjQ7CiAgdC5hMzIgPSAweDI3MjU7CiAgdC5hMzMgPSAweDI3MjY7CiAgdC5hMzQgPSAweDI3Mjc7CiAgdC5hMzUgPSAweDI2MDU7CiAgdC5hMzYgPSAweDI3Mjk7CiAgdC5hMzcgPSAweDI3MmE7CiAgdC5hMzggPSAweDI3MmI7CiAgdC5hMzkgPSAweDI3MmM7CiAgdC5hNDAgPSAweDI3MmQ7CiAgdC5hNDEgPSAweDI3MmU7CiAgdC5hNDIgPSAweDI3MmY7CiAgdC5hNDMgPSAweDI3MzA7CiAgdC5hNDQgPSAweDI3MzE7CiAgdC5hNDUgPSAweDI3MzI7CiAgdC5hNDYgPSAweDI3MzM7CiAgdC5hNDcgPSAweDI3MzQ7CiAgdC5hNDggPSAweDI3MzU7CiAgdC5hNDkgPSAweDI3MzY7CiAgdC5hNTAgPSAweDI3Mzc7CiAgdC5hNTEgPSAweDI3Mzg7CiAgdC5hNTIgPSAweDI3Mzk7CiAgdC5hNTMgPSAweDI3M2E7CiAgdC5hNTQgPSAweDI3M2I7CiAgdC5hNTUgPSAweDI3M2M7CiAgdC5hNTYgPSAweDI3M2Q7CiAgdC5hNTcgPSAweDI3M2U7CiAgdC5hNTggPSAweDI3M2Y7CiAgdC5hNTkgPSAweDI3NDA7CiAgdC5hNjAgPSAweDI3NDE7CiAgdC5hNjEgPSAweDI3NDI7CiAgdC5hNjIgPSAweDI3NDM7CiAgdC5hNjMgPSAweDI3NDQ7CiAgdC5hNjQgPSAweDI3NDU7CiAgdC5hNjUgPSAweDI3NDY7CiAgdC5hNjYgPSAweDI3NDc7CiAgdC5hNjcgPSAweDI3NDg7CiAgdC5hNjggPSAweDI3NDk7CiAgdC5hNjkgPSAweDI3NGE7CiAgdC5hNzAgPSAweDI3NGI7CiAgdC5hNzEgPSAweDI1Y2Y7CiAgdC5hNzIgPSAweDI3NGQ7CiAgdC5hNzMgPSAweDI1YTA7CiAgdC5hNzQgPSAweDI3NGY7CiAgdC5hMjAzID0gMHgyNzUwOwogIHQuYTc1ID0gMHgyNzUxOwogIHQuYTIwNCA9IDB4Mjc1MjsKICB0LmE3NiA9IDB4MjViMjsKICB0LmE3NyA9IDB4MjViYzsKICB0LmE3OCA9IDB4MjVjNjsKICB0LmE3OSA9IDB4Mjc1NjsKICB0LmE4MSA9IDB4MjVkNzsKICB0LmE4MiA9IDB4Mjc1ODsKICB0LmE4MyA9IDB4Mjc1OTsKICB0LmE4NCA9IDB4Mjc1YTsKICB0LmE5NyA9IDB4Mjc1YjsKICB0LmE5OCA9IDB4Mjc1YzsKICB0LmE5OSA9IDB4Mjc1ZDsKICB0LmExMDAgPSAweDI3NWU7CiAgdC5hMTAxID0gMHgyNzYxOwogIHQuYTEwMiA9IDB4Mjc2MjsKICB0LmExMDMgPSAweDI3NjM7CiAgdC5hMTA0ID0gMHgyNzY0OwogIHQuYTEwNiA9IDB4Mjc2NTsKICB0LmExMDcgPSAweDI3NjY7CiAgdC5hMTA4ID0gMHgyNzY3OwogIHQuYTExMiA9IDB4MjY2MzsKICB0LmExMTEgPSAweDI2NjY7CiAgdC5hMTEwID0gMHgyNjY1OwogIHQuYTEwOSA9IDB4MjY2MDsKICB0LmExMjAgPSAweDI0NjA7CiAgdC5hMTIxID0gMHgyNDYxOwogIHQuYTEyMiA9IDB4MjQ2MjsKICB0LmExMjMgPSAweDI0NjM7CiAgdC5hMTI0ID0gMHgyNDY0OwogIHQuYTEyNSA9IDB4MjQ2NTsKICB0LmExMjYgPSAweDI0NjY7CiAgdC5hMTI3ID0gMHgyNDY3OwogIHQuYTEyOCA9IDB4MjQ2ODsKICB0LmExMjkgPSAweDI0Njk7CiAgdC5hMTMwID0gMHgyNzc2OwogIHQuYTEzMSA9IDB4Mjc3NzsKICB0LmExMzIgPSAweDI3Nzg7CiAgdC5hMTMzID0gMHgyNzc5OwogIHQuYTEzNCA9IDB4Mjc3YTsKICB0LmExMzUgPSAweDI3N2I7CiAgdC5hMTM2ID0gMHgyNzdjOwogIHQuYTEzNyA9IDB4Mjc3ZDsKICB0LmExMzggPSAweDI3N2U7CiAgdC5hMTM5ID0gMHgyNzdmOwogIHQuYTE0MCA9IDB4Mjc4MDsKICB0LmExNDEgPSAweDI3ODE7CiAgdC5hMTQyID0gMHgyNzgyOwogIHQuYTE0MyA9IDB4Mjc4MzsKICB0LmExNDQgPSAweDI3ODQ7CiAgdC5hMTQ1ID0gMHgyNzg1OwogIHQuYTE0NiA9IDB4Mjc4NjsKICB0LmExNDcgPSAweDI3ODc7CiAgdC5hMTQ4ID0gMHgyNzg4OwogIHQuYTE0OSA9IDB4Mjc4OTsKICB0LmExNTAgPSAweDI3OGE7CiAgdC5hMTUxID0gMHgyNzhiOwogIHQuYTE1MiA9IDB4Mjc4YzsKICB0LmExNTMgPSAweDI3OGQ7CiAgdC5hMTU0ID0gMHgyNzhlOwogIHQuYTE1NSA9IDB4Mjc4ZjsKICB0LmExNTYgPSAweDI3OTA7CiAgdC5hMTU3ID0gMHgyNzkxOwogIHQuYTE1OCA9IDB4Mjc5MjsKICB0LmExNTkgPSAweDI3OTM7CiAgdC5hMTYwID0gMHgyNzk0OwogIHQuYTE2MSA9IDB4MjE5MjsKICB0LmExNjMgPSAweDIxOTQ7CiAgdC5hMTY0ID0gMHgyMTk1OwogIHQuYTE5NiA9IDB4Mjc5ODsKICB0LmExNjUgPSAweDI3OTk7CiAgdC5hMTkyID0gMHgyNzlhOwogIHQuYTE2NiA9IDB4Mjc5YjsKICB0LmExNjcgPSAweDI3OWM7CiAgdC5hMTY4ID0gMHgyNzlkOwogIHQuYTE2OSA9IDB4Mjc5ZTsKICB0LmExNzAgPSAweDI3OWY7CiAgdC5hMTcxID0gMHgyN2EwOwogIHQuYTE3MiA9IDB4MjdhMTsKICB0LmExNzMgPSAweDI3YTI7CiAgdC5hMTYyID0gMHgyN2EzOwogIHQuYTE3NCA9IDB4MjdhNDsKICB0LmExNzUgPSAweDI3YTU7CiAgdC5hMTc2ID0gMHgyN2E2OwogIHQuYTE3NyA9IDB4MjdhNzsKICB0LmExNzggPSAweDI3YTg7CiAgdC5hMTc5ID0gMHgyN2E5OwogIHQuYTE5MyA9IDB4MjdhYTsKICB0LmExODAgPSAweDI3YWI7CiAgdC5hMTk5ID0gMHgyN2FjOwogIHQuYTE4MSA9IDB4MjdhZDsKICB0LmEyMDAgPSAweDI3YWU7CiAgdC5hMTgyID0gMHgyN2FmOwogIHQuYTIwMSA9IDB4MjdiMTsKICB0LmExODMgPSAweDI3YjI7CiAgdC5hMTg0ID0gMHgyN2IzOwogIHQuYTE5NyA9IDB4MjdiNDsKICB0LmExODUgPSAweDI3YjU7CiAgdC5hMTk0ID0gMHgyN2I2OwogIHQuYTE5OCA9IDB4MjdiNzsKICB0LmExODYgPSAweDI3Yjg7CiAgdC5hMTk1ID0gMHgyN2I5OwogIHQuYTE4NyA9IDB4MjdiYTsKICB0LmExODggPSAweDI3YmI7CiAgdC5hMTg5ID0gMHgyN2JjOwogIHQuYTE5MCA9IDB4MjdiZDsKICB0LmExOTEgPSAweDI3YmU7CiAgdC5hODkgPSAweDI3Njg7CiAgdC5hOTAgPSAweDI3Njk7CiAgdC5hOTMgPSAweDI3NmE7CiAgdC5hOTQgPSAweDI3NmI7CiAgdC5hOTEgPSAweDI3NmM7CiAgdC5hOTIgPSAweDI3NmQ7CiAgdC5hMjA1ID0gMHgyNzZlOwogIHQuYTg1ID0gMHgyNzZmOwogIHQuYTIwNiA9IDB4Mjc3MDsKICB0LmE4NiA9IDB4Mjc3MTsKICB0LmE4NyA9IDB4Mjc3MjsKICB0LmE4OCA9IDB4Mjc3MzsKICB0LmE5NSA9IDB4Mjc3NDsKICB0LmE5NiA9IDB4Mjc3NTsKICB0WyIubm90ZGVmIl0gPSAweDAwMDA7Cn0pOwoKOy8vIC4vc3JjL2NvcmUvdW5pY29kZS5qcwoKY29uc3QgZ2V0U3BlY2lhbFBVQVN5bWJvbHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WzYzNzIxXSA9IDB4MDBhOTsKICB0WzYzMTkzXSA9IDB4MDBhOTsKICB0WzYzNzIwXSA9IDB4MDBhZTsKICB0WzYzMTk0XSA9IDB4MDBhZTsKICB0WzYzNzIyXSA9IDB4MjEyMjsKICB0WzYzMTk1XSA9IDB4MjEyMjsKICB0WzYzNzI5XSA9IDB4MjNhNzsKICB0WzYzNzMwXSA9IDB4MjNhODsKICB0WzYzNzMxXSA9IDB4MjNhOTsKICB0WzYzNzQwXSA9IDB4MjNhYjsKICB0WzYzNzQxXSA9IDB4MjNhYzsKICB0WzYzNzQyXSA9IDB4MjNhZDsKICB0WzYzNzI2XSA9IDB4MjNhMTsKICB0WzYzNzI3XSA9IDB4MjNhMjsKICB0WzYzNzI4XSA9IDB4MjNhMzsKICB0WzYzNzM3XSA9IDB4MjNhNDsKICB0WzYzNzM4XSA9IDB4MjNhNTsKICB0WzYzNzM5XSA9IDB4MjNhNjsKICB0WzYzNzIzXSA9IDB4MjM5YjsKICB0WzYzNzI0XSA9IDB4MjM5YzsKICB0WzYzNzI1XSA9IDB4MjM5ZDsKICB0WzYzNzM0XSA9IDB4MjM5ZTsKICB0WzYzNzM1XSA9IDB4MjM5ZjsKICB0WzYzNzM2XSA9IDB4MjNhMDsKfSk7CmZ1bmN0aW9uIG1hcFNwZWNpYWxVbmljb2RlVmFsdWVzKGNvZGUpIHsKICBpZiAoY29kZSA+PSAweGZmZjAgJiYgY29kZSA8PSAweGZmZmYpIHsKICAgIHJldHVybiAwOwogIH0gZWxzZSBpZiAoY29kZSA+PSAweGY2MDAgJiYgY29kZSA8PSAweGY4ZmYpIHsKICAgIHJldHVybiBnZXRTcGVjaWFsUFVBU3ltYm9scygpW2NvZGVdIHx8IGNvZGU7CiAgfSBlbHNlIGlmIChjb2RlID09PSAweDAwYWQpIHsKICAgIHJldHVybiAweDAwMmQ7CiAgfQogIHJldHVybiBjb2RlOwp9CmZ1bmN0aW9uIGdldFVuaWNvZGVGb3JHbHlwaChuYW1lLCBnbHlwaHNVbmljb2RlTWFwKSB7CiAgbGV0IHVuaWNvZGUgPSBnbHlwaHNVbmljb2RlTWFwW25hbWVdOwogIGlmICh1bmljb2RlICE9PSB1bmRlZmluZWQpIHsKICAgIHJldHVybiB1bmljb2RlOwogIH0KICBpZiAoIW5hbWUpIHsKICAgIHJldHVybiAtMTsKICB9CiAgaWYgKG5hbWVbMF0gPT09ICJ1IikgewogICAgY29uc3QgbmFtZUxlbiA9IG5hbWUubGVuZ3RoOwogICAgbGV0IGhleFN0cjsKICAgIGlmIChuYW1lTGVuID09PSA3ICYmIG5hbWVbMV0gPT09ICJuIiAmJiBuYW1lWzJdID09PSAiaSIpIHsKICAgICAgaGV4U3RyID0gbmFtZS5zdWJzdHJpbmcoMyk7CiAgICB9IGVsc2UgaWYgKG5hbWVMZW4gPj0gNSAmJiBuYW1lTGVuIDw9IDcpIHsKICAgICAgaGV4U3RyID0gbmFtZS5zdWJzdHJpbmcoMSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAoaGV4U3RyID09PSBoZXhTdHIudG9VcHBlckNhc2UoKSkgewogICAgICB1bmljb2RlID0gcGFyc2VJbnQoaGV4U3RyLCAxNik7CiAgICAgIGlmICh1bmljb2RlID49IDApIHsKICAgICAgICByZXR1cm4gdW5pY29kZTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gLTE7Cn0KY29uc3QgVW5pY29kZVJhbmdlcyA9IFtbMHgwMDAwLCAweDAwN2ZdLCBbMHgwMDgwLCAweDAwZmZdLCBbMHgwMTAwLCAweDAxN2ZdLCBbMHgwMTgwLCAweDAyNGZdLCBbMHgwMjUwLCAweDAyYWYsIDB4MWQwMCwgMHgxZDdmLCAweDFkODAsIDB4MWRiZl0sIFsweDAyYjAsIDB4MDJmZiwgMHhhNzAwLCAweGE3MWZdLCBbMHgwMzAwLCAweDAzNmYsIDB4MWRjMCwgMHgxZGZmXSwgWzB4MDM3MCwgMHgwM2ZmXSwgWzB4MmM4MCwgMHgyY2ZmXSwgWzB4MDQwMCwgMHgwNGZmLCAweDA1MDAsIDB4MDUyZiwgMHgyZGUwLCAweDJkZmYsIDB4YTY0MCwgMHhhNjlmXSwgWzB4MDUzMCwgMHgwNThmXSwgWzB4MDU5MCwgMHgwNWZmXSwgWzB4YTUwMCwgMHhhNjNmXSwgWzB4MDYwMCwgMHgwNmZmLCAweDA3NTAsIDB4MDc3Zl0sIFsweDA3YzAsIDB4MDdmZl0sIFsweDA5MDAsIDB4MDk3Zl0sIFsweDA5ODAsIDB4MDlmZl0sIFsweDBhMDAsIDB4MGE3Zl0sIFsweDBhODAsIDB4MGFmZl0sIFsweDBiMDAsIDB4MGI3Zl0sIFsweDBiODAsIDB4MGJmZl0sIFsweDBjMDAsIDB4MGM3Zl0sIFsweDBjODAsIDB4MGNmZl0sIFsweDBkMDAsIDB4MGQ3Zl0sIFsweDBlMDAsIDB4MGU3Zl0sIFsweDBlODAsIDB4MGVmZl0sIFsweDEwYTAsIDB4MTBmZiwgMHgyZDAwLCAweDJkMmZdLCBbMHgxYjAwLCAweDFiN2ZdLCBbMHgxMTAwLCAweDExZmZdLCBbMHgxZTAwLCAweDFlZmYsIDB4MmM2MCwgMHgyYzdmLCAweGE3MjAsIDB4YTdmZl0sIFsweDFmMDAsIDB4MWZmZl0sIFsweDIwMDAsIDB4MjA2ZiwgMHgyZTAwLCAweDJlN2ZdLCBbMHgyMDcwLCAweDIwOWZdLCBbMHgyMGEwLCAweDIwY2ZdLCBbMHgyMGQwLCAweDIwZmZdLCBbMHgyMTAwLCAweDIxNGZdLCBbMHgyMTUwLCAweDIxOGZdLCBbMHgyMTkwLCAweDIxZmYsIDB4MjdmMCwgMHgyN2ZmLCAweDI5MDAsIDB4Mjk3ZiwgMHgyYjAwLCAweDJiZmZdLCBbMHgyMjAwLCAweDIyZmYsIDB4MmEwMCwgMHgyYWZmLCAweDI3YzAsIDB4MjdlZiwgMHgyOTgwLCAweDI5ZmZdLCBbMHgyMzAwLCAweDIzZmZdLCBbMHgyNDAwLCAweDI0M2ZdLCBbMHgyNDQwLCAweDI0NWZdLCBbMHgyNDYwLCAweDI0ZmZdLCBbMHgyNTAwLCAweDI1N2ZdLCBbMHgyNTgwLCAweDI1OWZdLCBbMHgyNWEwLCAweDI1ZmZdLCBbMHgyNjAwLCAweDI2ZmZdLCBbMHgyNzAwLCAweDI3YmZdLCBbMHgzMDAwLCAweDMwM2ZdLCBbMHgzMDQwLCAweDMwOWZdLCBbMHgzMGEwLCAweDMwZmYsIDB4MzFmMCwgMHgzMWZmXSwgWzB4MzEwMCwgMHgzMTJmLCAweDMxYTAsIDB4MzFiZl0sIFsweDMxMzAsIDB4MzE4Zl0sIFsweGE4NDAsIDB4YTg3Zl0sIFsweDMyMDAsIDB4MzJmZl0sIFsweDMzMDAsIDB4MzNmZl0sIFsweGFjMDAsIDB4ZDdhZl0sIFsweGQ4MDAsIDB4ZGZmZl0sIFsweDEwOTAwLCAweDEwOTFmXSwgWzB4NGUwMCwgMHg5ZmZmLCAweDJlODAsIDB4MmVmZiwgMHgyZjAwLCAweDJmZGYsIDB4MmZmMCwgMHgyZmZmLCAweDM0MDAsIDB4NGRiZiwgMHgyMDAwMCwgMHgyYTZkZiwgMHgzMTkwLCAweDMxOWZdLCBbMHhlMDAwLCAweGY4ZmZdLCBbMHgzMWMwLCAweDMxZWYsIDB4ZjkwMCwgMHhmYWZmLCAweDJmODAwLCAweDJmYTFmXSwgWzB4ZmIwMCwgMHhmYjRmXSwgWzB4ZmI1MCwgMHhmZGZmXSwgWzB4ZmUyMCwgMHhmZTJmXSwgWzB4ZmUxMCwgMHhmZTFmXSwgWzB4ZmU1MCwgMHhmZTZmXSwgWzB4ZmU3MCwgMHhmZWZmXSwgWzB4ZmYwMCwgMHhmZmVmXSwgWzB4ZmZmMCwgMHhmZmZmXSwgWzB4MGYwMCwgMHgwZmZmXSwgWzB4MDcwMCwgMHgwNzRmXSwgWzB4MDc4MCwgMHgwN2JmXSwgWzB4MGQ4MCwgMHgwZGZmXSwgWzB4MTAwMCwgMHgxMDlmXSwgWzB4MTIwMCwgMHgxMzdmLCAweDEzODAsIDB4MTM5ZiwgMHgyZDgwLCAweDJkZGZdLCBbMHgxM2EwLCAweDEzZmZdLCBbMHgxNDAwLCAweDE2N2ZdLCBbMHgxNjgwLCAweDE2OWZdLCBbMHgxNmEwLCAweDE2ZmZdLCBbMHgxNzgwLCAweDE3ZmZdLCBbMHgxODAwLCAweDE4YWZdLCBbMHgyODAwLCAweDI4ZmZdLCBbMHhhMDAwLCAweGE0OGZdLCBbMHgxNzAwLCAweDE3MWYsIDB4MTcyMCwgMHgxNzNmLCAweDE3NDAsIDB4MTc1ZiwgMHgxNzYwLCAweDE3N2ZdLCBbMHgxMDMwMCwgMHgxMDMyZl0sIFsweDEwMzMwLCAweDEwMzRmXSwgWzB4MTA0MDAsIDB4MTA0NGZdLCBbMHgxZDAwMCwgMHgxZDBmZiwgMHgxZDEwMCwgMHgxZDFmZiwgMHgxZDIwMCwgMHgxZDI0Zl0sIFsweDFkNDAwLCAweDFkN2ZmXSwgWzB4ZmYwMDAsIDB4ZmZmZmRdLCBbMHhmZTAwLCAweGZlMGYsIDB4ZTAxMDAsIDB4ZTAxZWZdLCBbMHhlMDAwMCwgMHhlMDA3Zl0sIFsweDE5MDAsIDB4MTk0Zl0sIFsweDE5NTAsIDB4MTk3Zl0sIFsweDE5ODAsIDB4MTlkZl0sIFsweDFhMDAsIDB4MWExZl0sIFsweDJjMDAsIDB4MmM1Zl0sIFsweDJkMzAsIDB4MmQ3Zl0sIFsweDRkYzAsIDB4NGRmZl0sIFsweGE4MDAsIDB4YTgyZl0sIFsweDEwMDAwLCAweDEwMDdmLCAweDEwMDgwLCAweDEwMGZmLCAweDEwMTAwLCAweDEwMTNmXSwgWzB4MTAxNDAsIDB4MTAxOGZdLCBbMHgxMDM4MCwgMHgxMDM5Zl0sIFsweDEwM2EwLCAweDEwM2RmXSwgWzB4MTA0NTAsIDB4MTA0N2ZdLCBbMHgxMDQ4MCwgMHgxMDRhZl0sIFsweDEwODAwLCAweDEwODNmXSwgWzB4MTBhMDAsIDB4MTBhNWZdLCBbMHgxZDMwMCwgMHgxZDM1Zl0sIFsweDEyMDAwLCAweDEyM2ZmLCAweDEyNDAwLCAweDEyNDdmXSwgWzB4MWQzNjAsIDB4MWQzN2ZdLCBbMHgxYjgwLCAweDFiYmZdLCBbMHgxYzAwLCAweDFjNGZdLCBbMHgxYzUwLCAweDFjN2ZdLCBbMHhhODgwLCAweGE4ZGZdLCBbMHhhOTAwLCAweGE5MmZdLCBbMHhhOTMwLCAweGE5NWZdLCBbMHhhYTAwLCAweGFhNWZdLCBbMHgxMDE5MCwgMHgxMDFjZl0sIFsweDEwMWQwLCAweDEwMWZmXSwgWzB4MTAyYTAsIDB4MTAyZGYsIDB4MTAyODAsIDB4MTAyOWYsIDB4MTA5MjAsIDB4MTA5M2ZdLCBbMHgxZjAzMCwgMHgxZjA5ZiwgMHgxZjAwMCwgMHgxZjAyZl1dOwpmdW5jdGlvbiBnZXRVbmljb2RlUmFuZ2VGb3IodmFsdWUsIGxhc3RQb3NpdGlvbiA9IC0xKSB7CiAgaWYgKGxhc3RQb3NpdGlvbiAhPT0gLTEpIHsKICAgIGNvbnN0IHJhbmdlID0gVW5pY29kZVJhbmdlc1tsYXN0UG9zaXRpb25dOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcmFuZ2UubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICBpZiAodmFsdWUgPj0gcmFuZ2VbaV0gJiYgdmFsdWUgPD0gcmFuZ2VbaSArIDFdKSB7CiAgICAgICAgcmV0dXJuIGxhc3RQb3NpdGlvbjsKICAgICAgfQogICAgfQogIH0KICBmb3IgKGxldCBpID0gMCwgaWkgPSBVbmljb2RlUmFuZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHJhbmdlID0gVW5pY29kZVJhbmdlc1tpXTsKICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHJhbmdlLmxlbmd0aDsgaiA8IGpqOyBqICs9IDIpIHsKICAgICAgaWYgKHZhbHVlID49IHJhbmdlW2pdICYmIHZhbHVlIDw9IHJhbmdlW2ogKyAxXSkgewogICAgICAgIHJldHVybiBpOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiAtMTsKfQpjb25zdCBTcGVjaWFsQ2hhclJlZ0V4cCA9IG5ldyBSZWdFeHAoIl4oXFxzKXwoXFxwe01ufSl8KFxccHtDZn0pJCIsICJ1Iik7CmNvbnN0IENhdGVnb3J5Q2FjaGUgPSBuZXcgTWFwKCk7CmZ1bmN0aW9uIGdldENoYXJVbmljb2RlQ2F0ZWdvcnkoY2hhcikgewogIGNvbnN0IGNhY2hlZENhdGVnb3J5ID0gQ2F0ZWdvcnlDYWNoZS5nZXQoY2hhcik7CiAgaWYgKGNhY2hlZENhdGVnb3J5KSB7CiAgICByZXR1cm4gY2FjaGVkQ2F0ZWdvcnk7CiAgfQogIGNvbnN0IGdyb3VwcyA9IGNoYXIubWF0Y2goU3BlY2lhbENoYXJSZWdFeHApOwogIGNvbnN0IGNhdGVnb3J5ID0gewogICAgaXNXaGl0ZXNwYWNlOiAhIWdyb3Vwcz8uWzFdLAogICAgaXNaZXJvV2lkdGhEaWFjcml0aWM6ICEhZ3JvdXBzPy5bMl0sCiAgICBpc0ludmlzaWJsZUZvcm1hdE1hcms6ICEhZ3JvdXBzPy5bM10KICB9OwogIENhdGVnb3J5Q2FjaGUuc2V0KGNoYXIsIGNhdGVnb3J5KTsKICByZXR1cm4gY2F0ZWdvcnk7Cn0KZnVuY3Rpb24gY2xlYXJVbmljb2RlQ2FjaGVzKCkgewogIENhdGVnb3J5Q2FjaGUuY2xlYXIoKTsKfQoKOy8vIC4vc3JjL2NvcmUvZm9udHNfdXRpbHMuanMKCgoKCgpjb25zdCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQgPSB0cnVlOwpjb25zdCBGb250RmxhZ3MgPSB7CiAgRml4ZWRQaXRjaDogMSwKICBTZXJpZjogMiwKICBTeW1ib2xpYzogNCwKICBTY3JpcHQ6IDgsCiAgTm9uc3ltYm9saWM6IDMyLAogIEl0YWxpYzogNjQsCiAgQWxsQ2FwOiA2NTUzNiwKICBTbWFsbENhcDogMTMxMDcyLAogIEZvcmNlQm9sZDogMjYyMTQ0Cn07CmNvbnN0IE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZyA9IFsiLm5vdGRlZiIsICIubnVsbCIsICJub25tYXJraW5ncmV0dXJuIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXNpbmdsZSIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJPIiwgIlAiLCAiUSIsICJSIiwgIlMiLCAiVCIsICJVIiwgIlYiLCAiVyIsICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLCAiZ3JhdmUiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgIkFkaWVyZXNpcyIsICJBcmluZyIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiTnRpbGRlIiwgIk9kaWVyZXNpcyIsICJVZGllcmVzaXMiLCAiYWFjdXRlIiwgImFncmF2ZSIsICJhY2lyY3VtZmxleCIsICJhZGllcmVzaXMiLCAiYXRpbGRlIiwgImFyaW5nIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlZ3JhdmUiLCAiZWNpcmN1bWZsZXgiLCAiZWRpZXJlc2lzIiwgImlhY3V0ZSIsICJpZ3JhdmUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwgIm50aWxkZSIsICJvYWN1dGUiLCAib2dyYXZlIiwgIm9jaXJjdW1mbGV4IiwgIm9kaWVyZXNpcyIsICJvdGlsZGUiLCAidWFjdXRlIiwgInVncmF2ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLCAiZGFnZ2VyIiwgImRlZ3JlZSIsICJjZW50IiwgInN0ZXJsaW5nIiwgInNlY3Rpb24iLCAiYnVsbGV0IiwgInBhcmFncmFwaCIsICJnZXJtYW5kYmxzIiwgInJlZ2lzdGVyZWQiLCAiY29weXJpZ2h0IiwgInRyYWRlbWFyayIsICJhY3V0ZSIsICJkaWVyZXNpcyIsICJub3RlcXVhbCIsICJBRSIsICJPc2xhc2giLCAiaW5maW5pdHkiLCAicGx1c21pbnVzIiwgImxlc3NlcXVhbCIsICJncmVhdGVyZXF1YWwiLCAieWVuIiwgIm11IiwgInBhcnRpYWxkaWZmIiwgInN1bW1hdGlvbiIsICJwcm9kdWN0IiwgInBpIiwgImludGVncmFsIiwgIm9yZGZlbWluaW5lIiwgIm9yZG1hc2N1bGluZSIsICJPbWVnYSIsICJhZSIsICJvc2xhc2giLCAicXVlc3Rpb25kb3duIiwgImV4Y2xhbWRvd24iLCAibG9naWNhbG5vdCIsICJyYWRpY2FsIiwgImZsb3JpbiIsICJhcHByb3hlcXVhbCIsICJEZWx0YSIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgIm5vbmJyZWFraW5nc3BhY2UiLCAiQWdyYXZlIiwgIkF0aWxkZSIsICJPdGlsZGUiLCAiT0UiLCAib2UiLCAiZW5kYXNoIiwgImVtZGFzaCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJkaXZpZGUiLCAibG96ZW5nZSIsICJ5ZGllcmVzaXMiLCAiWWRpZXJlc2lzIiwgImZyYWN0aW9uIiwgImN1cnJlbmN5IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJwZXJ0aG91c2FuZCIsICJBY2lyY3VtZmxleCIsICJFY2lyY3VtZmxleCIsICJBYWN1dGUiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiYXBwbGUiLCAiT2dyYXZlIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZ3JhdmUiLCAiZG90bGVzc2kiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIiwgIkxzbGFzaCIsICJsc2xhc2giLCAiU2Nhcm9uIiwgInNjYXJvbiIsICJaY2Fyb24iLCAiemNhcm9uIiwgImJyb2tlbmJhciIsICJFdGgiLCAiZXRoIiwgIllhY3V0ZSIsICJ5YWN1dGUiLCAiVGhvcm4iLCAidGhvcm4iLCAibWludXMiLCAibXVsdGlwbHkiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJvbmVoYWxmIiwgIm9uZXF1YXJ0ZXIiLCAidGhyZWVxdWFydGVycyIsICJmcmFuYyIsICJHYnJldmUiLCAiZ2JyZXZlIiwgIklkb3RhY2NlbnQiLCAiU2NlZGlsbGEiLCAic2NlZGlsbGEiLCAiQ2FjdXRlIiwgImNhY3V0ZSIsICJDY2Fyb24iLCAiY2Nhcm9uIiwgImRjcm9hdCJdOwpmdW5jdGlvbiByZWNvdmVyR2x5cGhOYW1lKG5hbWUsIGdseXBoc1VuaWNvZGVNYXApIHsKICBpZiAoZ2x5cGhzVW5pY29kZU1hcFtuYW1lXSAhPT0gdW5kZWZpbmVkKSB7CiAgICByZXR1cm4gbmFtZTsKICB9CiAgY29uc3QgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChuYW1lLCBnbHlwaHNVbmljb2RlTWFwKTsKICBpZiAodW5pY29kZSAhPT0gLTEpIHsKICAgIGZvciAoY29uc3Qga2V5IGluIGdseXBoc1VuaWNvZGVNYXApIHsKICAgICAgaWYgKGdseXBoc1VuaWNvZGVNYXBba2V5XSA9PT0gdW5pY29kZSkgewogICAgICAgIHJldHVybiBrZXk7CiAgICAgIH0KICAgIH0KICB9CiAgaW5mbygiVW5hYmxlIHRvIHJlY292ZXIgYSBzdGFuZGFyZCBnbHlwaCBuYW1lIGZvcjogIiArIG5hbWUpOwogIHJldHVybiBuYW1lOwp9CmZ1bmN0aW9uIHR5cGUxRm9udEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcsIGdseXBoTmFtZXMpIHsKICBjb25zdCBjaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgbGV0IGdseXBoSWQsIGNoYXJDb2RlLCBiYXNlRW5jb2Rpbmc7CiAgY29uc3QgaXNTeW1ib2xpY0ZvbnQgPSAhIShwcm9wZXJ0aWVzLmZsYWdzICYgRm9udEZsYWdzLlN5bWJvbGljKTsKICBpZiAocHJvcGVydGllcy5pc0ludGVybmFsRm9udCkgewogICAgYmFzZUVuY29kaW5nID0gYnVpbHRJbkVuY29kaW5nOwogICAgZm9yIChjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgYmFzZUVuY29kaW5nLmxlbmd0aDsgY2hhckNvZGUrKykgewogICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKGJhc2VFbmNvZGluZ1tjaGFyQ29kZV0pOwogICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkID49IDAgPyBnbHlwaElkIDogMDsKICAgIH0KICB9IGVsc2UgaWYgKHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSkgewogICAgYmFzZUVuY29kaW5nID0gZ2V0RW5jb2RpbmcocHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lKTsKICAgIGZvciAoY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IGJhc2VFbmNvZGluZy5sZW5ndGg7IGNoYXJDb2RlKyspIHsKICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihiYXNlRW5jb2RpbmdbY2hhckNvZGVdKTsKICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZCA+PSAwID8gZ2x5cGhJZCA6IDA7CiAgICB9CiAgfSBlbHNlIGlmIChpc1N5bWJvbGljRm9udCkgewogICAgZm9yIChjaGFyQ29kZSBpbiBidWlsdEluRW5jb2RpbmcpIHsKICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gYnVpbHRJbkVuY29kaW5nW2NoYXJDb2RlXTsKICAgIH0KICB9IGVsc2UgewogICAgYmFzZUVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZzsKICAgIGZvciAoY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IGJhc2VFbmNvZGluZy5sZW5ndGg7IGNoYXJDb2RlKyspIHsKICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihiYXNlRW5jb2RpbmdbY2hhckNvZGVdKTsKICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZCA+PSAwID8gZ2x5cGhJZCA6IDA7CiAgICB9CiAgfQogIGNvbnN0IGRpZmZlcmVuY2VzID0gcHJvcGVydGllcy5kaWZmZXJlbmNlczsKICBsZXQgZ2x5cGhzVW5pY29kZU1hcDsKICBpZiAoZGlmZmVyZW5jZXMpIHsKICAgIGZvciAoY2hhckNvZGUgaW4gZGlmZmVyZW5jZXMpIHsKICAgICAgY29uc3QgZ2x5cGhOYW1lID0gZGlmZmVyZW5jZXNbY2hhckNvZGVdOwogICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKGdseXBoTmFtZSk7CiAgICAgIGlmIChnbHlwaElkID09PSAtMSkgewogICAgICAgIGlmICghZ2x5cGhzVW5pY29kZU1hcCkgewogICAgICAgICAgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3RhbmRhcmRHbHlwaE5hbWUgPSByZWNvdmVyR2x5cGhOYW1lKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgICAgICAgaWYgKHN0YW5kYXJkR2x5cGhOYW1lICE9PSBnbHlwaE5hbWUpIHsKICAgICAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2Yoc3RhbmRhcmRHbHlwaE5hbWUpOwogICAgICAgIH0KICAgICAgfQogICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkID49IDAgPyBnbHlwaElkIDogMDsKICAgIH0KICB9CiAgcmV0dXJuIGNoYXJDb2RlVG9HbHlwaElkOwp9CmZ1bmN0aW9uIG5vcm1hbGl6ZUZvbnROYW1lKG5hbWUpIHsKICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKC9bLF9dL2csICItIikucmVwbGFjZUFsbCgvXHMvZywgIiIpOwp9CmNvbnN0IGdldFZlcnRpY2FsUHJlc2VudGF0aW9uRm9ybSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeSh0ID0+IHsKICB0WzB4MjAxM10gPSAweGZlMzI7CiAgdFsweDIwMTRdID0gMHhmZTMxOwogIHRbMHgyMDI1XSA9IDB4ZmUzMDsKICB0WzB4MjAyNl0gPSAweGZlMTk7CiAgdFsweDMwMDFdID0gMHhmZTExOwogIHRbMHgzMDAyXSA9IDB4ZmUxMjsKICB0WzB4MzAwOF0gPSAweGZlM2Y7CiAgdFsweDMwMDldID0gMHhmZTQwOwogIHRbMHgzMDBhXSA9IDB4ZmUzZDsKICB0WzB4MzAwYl0gPSAweGZlM2U7CiAgdFsweDMwMGNdID0gMHhmZTQxOwogIHRbMHgzMDBkXSA9IDB4ZmU0MjsKICB0WzB4MzAwZV0gPSAweGZlNDM7CiAgdFsweDMwMGZdID0gMHhmZTQ0OwogIHRbMHgzMDEwXSA9IDB4ZmUzYjsKICB0WzB4MzAxMV0gPSAweGZlM2M7CiAgdFsweDMwMTRdID0gMHhmZTM5OwogIHRbMHgzMDE1XSA9IDB4ZmUzYTsKICB0WzB4MzAxNl0gPSAweGZlMTc7CiAgdFsweDMwMTddID0gMHhmZTE4OwogIHRbMHhmZTRmXSA9IDB4ZmUzNDsKICB0WzB4ZmYwMV0gPSAweGZlMTU7CiAgdFsweGZmMDhdID0gMHhmZTM1OwogIHRbMHhmZjA5XSA9IDB4ZmUzNjsKICB0WzB4ZmYwY10gPSAweGZlMTA7CiAgdFsweGZmMWFdID0gMHhmZTEzOwogIHRbMHhmZjFiXSA9IDB4ZmUxNDsKICB0WzB4ZmYxZl0gPSAweGZlMTY7CiAgdFsweGZmM2JdID0gMHhmZTQ3OwogIHRbMHhmZjNkXSA9IDB4ZmU0ODsKICB0WzB4ZmYzZl0gPSAweGZlMzM7CiAgdFsweGZmNWJdID0gMHhmZTM3OwogIHRbMHhmZjVkXSA9IDB4ZmUzODsKfSk7Cgo7Ly8gLi9zcmMvY29yZS9zdGFuZGFyZF9mb250cy5qcwoKCmNvbnN0IGdldFN0ZEZvbnRNYXAgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WyJUaW1lcy1Sb21hbiJdID0gIlRpbWVzLVJvbWFuIjsKICB0LkhlbHZldGljYSA9ICJIZWx2ZXRpY2EiOwogIHQuQ291cmllciA9ICJDb3VyaWVyIjsKICB0LlN5bWJvbCA9ICJTeW1ib2wiOwogIHRbIlRpbWVzLUJvbGQiXSA9ICJUaW1lcy1Cb2xkIjsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJDb3VyaWVyLUJvbGQiXSA9ICJDb3VyaWVyLUJvbGQiOwogIHQuWmFwZkRpbmdiYXRzID0gIlphcGZEaW5nYmF0cyI7CiAgdFsiVGltZXMtSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJDb3VyaWVyLU9ibGlxdWUiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOwogIHRbIlRpbWVzLUJvbGRJdGFsaWMiXSA9ICJUaW1lcy1Cb2xkSXRhbGljIjsKICB0WyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0LkFyaWFsTmFycm93ID0gIkhlbHZldGljYSI7CiAgdFsiQXJpYWxOYXJyb3ctQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJBcmlhbE5hcnJvdy1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJBcmlhbE5hcnJvdy1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdC5BcmlhbEJsYWNrID0gIkhlbHZldGljYSI7CiAgdFsiQXJpYWxCbGFjay1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsQmxhY2stQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CiAgdFsiQXJpYWxCbGFjay1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdFsiQXJpYWwtQmxhY2siXSA9ICJIZWx2ZXRpY2EiOwogIHRbIkFyaWFsLUJsYWNrLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQXJpYWwtQmxhY2stQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CiAgdFsiQXJpYWwtQmxhY2stSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQXJpYWwgPSAiSGVsdmV0aWNhIjsKICB0WyJBcmlhbC1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0LkFyaWFsTVQgPSAiSGVsdmV0aWNhIjsKICB0WyJBcmlhbC1Cb2xkSXRhbGljTVQiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsLUJvbGRNVCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJBcmlhbC1JdGFsaWNNVCJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJBcmlhbC1Cb2xkSXRhbGljTVQtQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CiAgdFsiQXJpYWwtQm9sZE1ULUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQXJpYWwtSXRhbGljTVQtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQXJpYWxVbmljb2RlTVMgPSAiSGVsdmV0aWNhIjsKICB0WyJBcmlhbFVuaWNvZGVNUy1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsVW5pY29kZU1TLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsVW5pY29kZU1TLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJDb3VyaWVyLUJvbGRJdGFsaWMiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0WyJDb3VyaWVyLUl0YWxpYyJdID0gIkNvdXJpZXItT2JsaXF1ZSI7CiAgdC5Db3VyaWVyTmV3ID0gIkNvdXJpZXIiOwogIHRbIkNvdXJpZXJOZXctQm9sZCJdID0gIkNvdXJpZXItQm9sZCI7CiAgdFsiQ291cmllck5ldy1Cb2xkSXRhbGljIl0gPSAiQ291cmllci1Cb2xkT2JsaXF1ZSI7CiAgdFsiQ291cmllck5ldy1JdGFsaWMiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOwogIHRbIkNvdXJpZXJOZXdQUy1Cb2xkSXRhbGljTVQiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0WyJDb3VyaWVyTmV3UFMtQm9sZE1UIl0gPSAiQ291cmllci1Cb2xkIjsKICB0WyJDb3VyaWVyTmV3UFMtSXRhbGljTVQiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOwogIHQuQ291cmllck5ld1BTTVQgPSAiQ291cmllciI7CiAgdFsiSGVsdmV0aWNhLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkhlbHZldGljYS1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdFsiSGVsdmV0aWNhTFRTdGQtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJTeW1ib2wtQm9sZCJdID0gIlN5bWJvbCI7CiAgdFsiU3ltYm9sLUJvbGRJdGFsaWMiXSA9ICJTeW1ib2wiOwogIHRbIlN5bWJvbC1JdGFsaWMiXSA9ICJTeW1ib2wiOwogIHQuVGltZXNOZXdSb21hbiA9ICJUaW1lcy1Sb21hbiI7CiAgdFsiVGltZXNOZXdSb21hbi1Cb2xkIl0gPSAiVGltZXMtQm9sZCI7CiAgdFsiVGltZXNOZXdSb21hbi1Cb2xkSXRhbGljIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CiAgdFsiVGltZXNOZXdSb21hbi1JdGFsaWMiXSA9ICJUaW1lcy1JdGFsaWMiOwogIHQuVGltZXNOZXdSb21hblBTID0gIlRpbWVzLVJvbWFuIjsKICB0WyJUaW1lc05ld1JvbWFuUFMtQm9sZCJdID0gIlRpbWVzLUJvbGQiOwogIHRbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CiAgdFsiVGltZXNOZXdSb21hblBTLUJvbGRJdGFsaWNNVCJdID0gIlRpbWVzLUJvbGRJdGFsaWMiOwogIHRbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkTVQiXSA9ICJUaW1lcy1Cb2xkIjsKICB0WyJUaW1lc05ld1JvbWFuUFMtSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKICB0WyJUaW1lc05ld1JvbWFuUFMtSXRhbGljTVQiXSA9ICJUaW1lcy1JdGFsaWMiOwogIHQuVGltZXNOZXdSb21hblBTTVQgPSAiVGltZXMtUm9tYW4iOwogIHRbIlRpbWVzTmV3Um9tYW5QU01ULUJvbGQiXSA9ICJUaW1lcy1Cb2xkIjsKICB0WyJUaW1lc05ld1JvbWFuUFNNVC1Cb2xkSXRhbGljIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CiAgdFsiVGltZXNOZXdSb21hblBTTVQtSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKfSk7CmNvbnN0IGdldEZvbnROYW1lVG9GaWxlTWFwID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgdC5Db3VyaWVyID0gIkZveGl0Rml4ZWQucGZiIjsKICB0WyJDb3VyaWVyLUJvbGQiXSA9ICJGb3hpdEZpeGVkQm9sZC5wZmIiOwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9ICJGb3hpdEZpeGVkQm9sZEl0YWxpYy5wZmIiOwogIHRbIkNvdXJpZXItT2JsaXF1ZSJdID0gIkZveGl0Rml4ZWRJdGFsaWMucGZiIjsKICB0LkhlbHZldGljYSA9ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiI7CiAgdFsiSGVsdmV0aWNhLUJvbGQiXSA9ICJMaWJlcmF0aW9uU2Fucy1Cb2xkLnR0ZiI7CiAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYiOwogIHRbIkhlbHZldGljYS1PYmxpcXVlIl0gPSAiTGliZXJhdGlvblNhbnMtSXRhbGljLnR0ZiI7CiAgdFsiVGltZXMtUm9tYW4iXSA9ICJGb3hpdFNlcmlmLnBmYiI7CiAgdFsiVGltZXMtQm9sZCJdID0gIkZveGl0U2VyaWZCb2xkLnBmYiI7CiAgdFsiVGltZXMtQm9sZEl0YWxpYyJdID0gIkZveGl0U2VyaWZCb2xkSXRhbGljLnBmYiI7CiAgdFsiVGltZXMtSXRhbGljIl0gPSAiRm94aXRTZXJpZkl0YWxpYy5wZmIiOwogIHQuU3ltYm9sID0gIkZveGl0U3ltYm9sLnBmYiI7CiAgdC5aYXBmRGluZ2JhdHMgPSAiRm94aXREaW5nYmF0cy5wZmIiOwogIHRbIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiXSA9ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiI7CiAgdFsiTGliZXJhdGlvblNhbnMtQm9sZCJdID0gIkxpYmVyYXRpb25TYW5zLUJvbGQudHRmIjsKICB0WyJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiXSA9ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMudHRmIjsKICB0WyJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIl0gPSAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYiOwp9KTsKY29uc3QgZ2V0Tm9uU3RkRm9udE1hcCA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogIHQuQ2FsaWJyaSA9ICJIZWx2ZXRpY2EiOwogIHRbIkNhbGlicmktQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJDYWxpYnJpLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkNhbGlicmktSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQ2VudHVyeUdvdGhpYyA9ICJIZWx2ZXRpY2EiOwogIHRbIkNlbnR1cnlHb3RoaWMtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJDZW50dXJ5R290aGljLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkNlbnR1cnlHb3RoaWMtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQ29taWNTYW5zTVMgPSAiQ29taWMgU2FucyBNUyI7CiAgdFsiQ29taWNTYW5zTVMtQm9sZCJdID0gIkNvbWljIFNhbnMgTVMtQm9sZCI7CiAgdFsiQ29taWNTYW5zTVMtQm9sZEl0YWxpYyJdID0gIkNvbWljIFNhbnMgTVMtQm9sZEl0YWxpYyI7CiAgdFsiQ29taWNTYW5zTVMtSXRhbGljIl0gPSAiQ29taWMgU2FucyBNUy1JdGFsaWMiOwogIHQuR2lsbFNhbnNNVCA9ICJIZWx2ZXRpY2EiOwogIHRbIkdpbGxTYW5zTVQtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJHaWxsU2Fuc01ULUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkdpbGxTYW5zTVQtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuSW1wYWN0ID0gIkhlbHZldGljYSI7CiAgdFsiSXRjU3ltYm9sLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiSXRjU3ltYm9sLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkl0Y1N5bWJvbC1Cb29rIl0gPSAiSGVsdmV0aWNhIjsKICB0WyJJdGNTeW1ib2wtQm9va0l0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJJdGNTeW1ib2wtTWVkaXVtIl0gPSAiSGVsdmV0aWNhIjsKICB0WyJJdGNTeW1ib2wtTWVkaXVtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuTHVjaWRhQ29uc29sZSA9ICJDb3VyaWVyIjsKICB0WyJMdWNpZGFDb25zb2xlLUJvbGQiXSA9ICJDb3VyaWVyLUJvbGQiOwogIHRbIkx1Y2lkYUNvbnNvbGUtQm9sZEl0YWxpYyJdID0gIkNvdXJpZXItQm9sZE9ibGlxdWUiOwogIHRbIkx1Y2lkYUNvbnNvbGUtSXRhbGljIl0gPSAiQ291cmllci1PYmxpcXVlIjsKICB0WyJMdWNpZGFTYW5zLURlbWkiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiTVMtR290aGljIl0gPSAiTVMgR290aGljIjsKICB0WyJNUy1Hb3RoaWMtQm9sZCJdID0gIk1TIEdvdGhpYy1Cb2xkIjsKICB0WyJNUy1Hb3RoaWMtQm9sZEl0YWxpYyJdID0gIk1TIEdvdGhpYy1Cb2xkSXRhbGljIjsKICB0WyJNUy1Hb3RoaWMtSXRhbGljIl0gPSAiTVMgR290aGljLUl0YWxpYyI7CiAgdFsiTVMtTWluY2hvIl0gPSAiTVMgTWluY2hvIjsKICB0WyJNUy1NaW5jaG8tQm9sZCJdID0gIk1TIE1pbmNoby1Cb2xkIjsKICB0WyJNUy1NaW5jaG8tQm9sZEl0YWxpYyJdID0gIk1TIE1pbmNoby1Cb2xkSXRhbGljIjsKICB0WyJNUy1NaW5jaG8tSXRhbGljIl0gPSAiTVMgTWluY2hvLUl0YWxpYyI7CiAgdFsiTVMtUEdvdGhpYyJdID0gIk1TIFBHb3RoaWMiOwogIHRbIk1TLVBHb3RoaWMtQm9sZCJdID0gIk1TIFBHb3RoaWMtQm9sZCI7CiAgdFsiTVMtUEdvdGhpYy1Cb2xkSXRhbGljIl0gPSAiTVMgUEdvdGhpYy1Cb2xkSXRhbGljIjsKICB0WyJNUy1QR290aGljLUl0YWxpYyJdID0gIk1TIFBHb3RoaWMtSXRhbGljIjsKICB0WyJNUy1QTWluY2hvIl0gPSAiTVMgUE1pbmNobyI7CiAgdFsiTVMtUE1pbmNoby1Cb2xkIl0gPSAiTVMgUE1pbmNoby1Cb2xkIjsKICB0WyJNUy1QTWluY2hvLUJvbGRJdGFsaWMiXSA9ICJNUyBQTWluY2hvLUJvbGRJdGFsaWMiOwogIHRbIk1TLVBNaW5jaG8tSXRhbGljIl0gPSAiTVMgUE1pbmNoby1JdGFsaWMiOwogIHQuTnVwdGlhbFNjcmlwdCA9ICJUaW1lcy1JdGFsaWMiOwogIHQuU2Vnb2VVSVN5bWJvbCA9ICJIZWx2ZXRpY2EiOwp9KTsKY29uc3QgZ2V0U2VyaWZGb250cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogIHRbIkFkb2JlIEplbnNvbiJdID0gdHJ1ZTsKICB0WyJBZG9iZSBUZXh0Il0gPSB0cnVlOwogIHQuQWxiZXJ0dXMgPSB0cnVlOwogIHQuQWxkdXMgPSB0cnVlOwogIHQuQWxleGFuZHJpYSA9IHRydWU7CiAgdC5BbGdlcmlhbiA9IHRydWU7CiAgdFsiQW1lcmljYW4gVHlwZXdyaXRlciJdID0gdHJ1ZTsKICB0LkFudGlxdWEgPSB0cnVlOwogIHQuQXBleCA9IHRydWU7CiAgdC5Bcm5vID0gdHJ1ZTsKICB0LkFzdGVyID0gdHJ1ZTsKICB0LkF1cm9yYSA9IHRydWU7CiAgdC5CYXNrZXJ2aWxsZSA9IHRydWU7CiAgdC5CZWxsID0gdHJ1ZTsKICB0LkJlbWJvID0gdHJ1ZTsKICB0WyJCZW1ibyBTY2hvb2xib29rIl0gPSB0cnVlOwogIHQuQmVuZ3VpYXQgPSB0cnVlOwogIHRbIkJlcmtlbGV5IE9sZCBTdHlsZSJdID0gdHJ1ZTsKICB0WyJCZXJuaGFyZCBNb2Rlcm4iXSA9IHRydWU7CiAgdFsiQmVydGhvbGQgQ2l0eSJdID0gdHJ1ZTsKICB0LkJvZG9uaSA9IHRydWU7CiAgdFsiQmF1ZXIgQm9kb25pIl0gPSB0cnVlOwogIHRbIkJvb2sgQW50aXF1YSJdID0gdHJ1ZTsKICB0LkJvb2ttYW4gPSB0cnVlOwogIHRbIkJvcmRlYXV4IFJvbWFuIl0gPSB0cnVlOwogIHRbIkNhbGlmb3JuaWFuIEZCIl0gPSB0cnVlOwogIHQuQ2FsaXN0byA9IHRydWU7CiAgdC5DYWx2ZXJ0ID0gdHJ1ZTsKICB0LkNhcGl0YWxzID0gdHJ1ZTsKICB0LkNhbWJyaWEgPSB0cnVlOwogIHQuQ2FydGllciA9IHRydWU7CiAgdC5DYXNsb24gPSB0cnVlOwogIHQuQ2F0dWxsID0gdHJ1ZTsKICB0LkNlbnRhdXIgPSB0cnVlOwogIHRbIkNlbnR1cnkgT2xkIFN0eWxlIl0gPSB0cnVlOwogIHRbIkNlbnR1cnkgU2Nob29sYm9vayJdID0gdHJ1ZTsKICB0LkNoYXBhcnJhbCA9IHRydWU7CiAgdFsiQ2hhcmlzIFNJTCJdID0gdHJ1ZTsKICB0LkNoZWx0ZW5oYW0gPSB0cnVlOwogIHRbIkNob2xsYSBTbGFiIl0gPSB0cnVlOwogIHQuQ2xhcmVuZG9uID0gdHJ1ZTsKICB0LkNsZWFyZmFjZSA9IHRydWU7CiAgdC5Db2NoaW4gPSB0cnVlOwogIHQuQ29sb25uYSA9IHRydWU7CiAgdFsiQ29tcHV0ZXIgTW9kZXJuIl0gPSB0cnVlOwogIHRbIkNvbmNyZXRlIFJvbWFuIl0gPSB0cnVlOwogIHQuQ29uc3RhbnRpYSA9IHRydWU7CiAgdFsiQ29vcGVyIEJsYWNrIl0gPSB0cnVlOwogIHQuQ29yb25hID0gdHJ1ZTsKICB0LkVjb3R5cGUgPSB0cnVlOwogIHQuRWd5cHRpZW5uZSA9IHRydWU7CiAgdC5FbGVwaGFudCA9IHRydWU7CiAgdC5FeGNlbHNpb3IgPSB0cnVlOwogIHQuRmFpcmZpZWxkID0gdHJ1ZTsKICB0WyJGRiBTY2FsYSJdID0gdHJ1ZTsKICB0LkZvbGthcmQgPSB0cnVlOwogIHQuRm9vdGxpZ2h0ID0gdHJ1ZTsKICB0LkZyZWVTZXJpZiA9IHRydWU7CiAgdFsiRnJpeiBRdWFkcmF0YSJdID0gdHJ1ZTsKICB0LkdhcmFtb25kID0gdHJ1ZTsKICB0LkdlbnRpdW0gPSB0cnVlOwogIHQuR2VvcmdpYSA9IHRydWU7CiAgdC5HbG91Y2VzdGVyID0gdHJ1ZTsKICB0WyJHb3VkeSBPbGQgU3R5bGUiXSA9IHRydWU7CiAgdFsiR291ZHkgU2Nob29sYm9vayJdID0gdHJ1ZTsKICB0WyJHb3VkeSBQcm8gRm9udCJdID0gdHJ1ZTsKICB0LkdyYW5qb24gPSB0cnVlOwogIHRbIkd1YXJkaWFuIEVneXB0aWFuIl0gPSB0cnVlOwogIHQuSGVhdGhlciA9IHRydWU7CiAgdC5IZXJjdWxlcyA9IHRydWU7CiAgdFsiSGlnaCBUb3dlciBUZXh0Il0gPSB0cnVlOwogIHQuSGlyb3NoaWdlID0gdHJ1ZTsKICB0WyJIb2VmbGVyIFRleHQiXSA9IHRydWU7CiAgdFsiSHVtYW5hIFNlcmlmIl0gPSB0cnVlOwogIHQuSW1wcmludCA9IHRydWU7CiAgdFsiSW9uaWMgTm8uIDUiXSA9IHRydWU7CiAgdC5KYW5zb24gPSB0cnVlOwogIHQuSm9hbm5hID0gdHJ1ZTsKICB0LktvcmlubmEgPSB0cnVlOwogIHQuTGV4aWNvbiA9IHRydWU7CiAgdC5MaWJlcmF0aW9uU2VyaWYgPSB0cnVlOwogIHRbIkxpYmVyYXRpb24gU2VyaWYiXSA9IHRydWU7CiAgdFsiTGludXggTGliZXJ0aW5lIl0gPSB0cnVlOwogIHQuTGl0ZXJhdHVybmF5YSA9IHRydWU7CiAgdC5MdWNpZGEgPSB0cnVlOwogIHRbIkx1Y2lkYSBCcmlnaHQiXSA9IHRydWU7CiAgdC5NZWxpb3IgPSB0cnVlOwogIHQuTWVtcGhpcyA9IHRydWU7CiAgdC5NaWxsZXIgPSB0cnVlOwogIHQuTWluaW9uID0gdHJ1ZTsKICB0Lk1vZGVybiA9IHRydWU7CiAgdFsiTW9uYSBMaXNhIl0gPSB0cnVlOwogIHRbIk1ycyBFYXZlcyJdID0gdHJ1ZTsKICB0WyJNUyBTZXJpZiJdID0gdHJ1ZTsKICB0WyJNdXNlbyBTbGFiIl0gPSB0cnVlOwogIHRbIk5ldyBZb3JrIl0gPSB0cnVlOwogIHRbIk5pbWJ1cyBSb21hbiJdID0gdHJ1ZTsKICB0WyJOUFMgUmF3bGluc29uIFJvYWR3YXkiXSA9IHRydWU7CiAgdC5OdXB0aWFsU2NyaXB0ID0gdHJ1ZTsKICB0LlBhbGF0aW5vID0gdHJ1ZTsKICB0LlBlcnBldHVhID0gdHJ1ZTsKICB0LlBsYW50aW4gPSB0cnVlOwogIHRbIlBsYW50aW4gU2Nob29sYm9vayJdID0gdHJ1ZTsKICB0LlBsYXliaWxsID0gdHJ1ZTsKICB0WyJQb29yIFJpY2hhcmQiXSA9IHRydWU7CiAgdFsiUmF3bGluc29uIFJvYWR3YXkiXSA9IHRydWU7CiAgdC5SZW5hdWx0ID0gdHJ1ZTsKICB0LlJlcXVpZW0gPSB0cnVlOwogIHQuUm9ja3dlbGwgPSB0cnVlOwogIHQuUm9tYW4gPSB0cnVlOwogIHRbIlJvdGlzIFNlcmlmIl0gPSB0cnVlOwogIHQuU2Fib24gPSB0cnVlOwogIHQuU2NhbGEgPSB0cnVlOwogIHQuU2VhZ3VsbCA9IHRydWU7CiAgdC5TaXN0aW5hID0gdHJ1ZTsKICB0LlNvdXZlbmlyID0gdHJ1ZTsKICB0LlNUSVggPSB0cnVlOwogIHRbIlN0b25lIEluZm9ybWFsIl0gPSB0cnVlOwogIHRbIlN0b25lIFNlcmlmIl0gPSB0cnVlOwogIHQuU3lsZmFlbiA9IHRydWU7CiAgdC5UaW1lcyA9IHRydWU7CiAgdC5UcmFqYW4gPSB0cnVlOwogIHRbIlRyaW5pdMOpIl0gPSB0cnVlOwogIHRbIlRydW1wIE1lZGlhZXZhbCJdID0gdHJ1ZTsKICB0LlV0b3BpYSA9IHRydWU7CiAgdFsiVmFsZSBUeXBlIl0gPSB0cnVlOwogIHRbIkJpdHN0cmVhbSBWZXJhIl0gPSB0cnVlOwogIHRbIlZlcmEgU2VyaWYiXSA9IHRydWU7CiAgdC5WZXJzYWlsbGVzID0gdHJ1ZTsKICB0LldhbnRlZCA9IHRydWU7CiAgdC5XZWlzcyA9IHRydWU7CiAgdFsiV2lkZSBMYXRpbiJdID0gdHJ1ZTsKICB0LldpbmRzb3IgPSB0cnVlOwogIHQuWElUUyA9IHRydWU7Cn0pOwpjb25zdCBnZXRTeW1ib2xzRm9udHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LkRpbmdiYXRzID0gdHJ1ZTsKICB0LlN5bWJvbCA9IHRydWU7CiAgdC5aYXBmRGluZ2JhdHMgPSB0cnVlOwogIHQuV2luZ2RpbmdzID0gdHJ1ZTsKICB0WyJXaW5nZGluZ3MtQm9sZCJdID0gdHJ1ZTsKICB0WyJXaW5nZGluZ3MtUmVndWxhciJdID0gdHJ1ZTsKfSk7CmNvbnN0IGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogIHRbMl0gPSAxMDsKICB0WzNdID0gMzI7CiAgdFs0XSA9IDMzOwogIHRbNV0gPSAzNDsKICB0WzZdID0gMzU7CiAgdFs3XSA9IDM2OwogIHRbOF0gPSAzNzsKICB0WzldID0gMzg7CiAgdFsxMF0gPSAzOTsKICB0WzExXSA9IDQwOwogIHRbMTJdID0gNDE7CiAgdFsxM10gPSA0MjsKICB0WzE0XSA9IDQzOwogIHRbMTVdID0gNDQ7CiAgdFsxNl0gPSA0NTsKICB0WzE3XSA9IDQ2OwogIHRbMThdID0gNDc7CiAgdFsxOV0gPSA0ODsKICB0WzIwXSA9IDQ5OwogIHRbMjFdID0gNTA7CiAgdFsyMl0gPSA1MTsKICB0WzIzXSA9IDUyOwogIHRbMjRdID0gNTM7CiAgdFsyNV0gPSA1NDsKICB0WzI2XSA9IDU1OwogIHRbMjddID0gNTY7CiAgdFsyOF0gPSA1NzsKICB0WzI5XSA9IDU4OwogIHRbMzBdID0gODk0OwogIHRbMzFdID0gNjA7CiAgdFszMl0gPSA2MTsKICB0WzMzXSA9IDYyOwogIHRbMzRdID0gNjM7CiAgdFszNV0gPSA2NDsKICB0WzM2XSA9IDY1OwogIHRbMzddID0gNjY7CiAgdFszOF0gPSA2NzsKICB0WzM5XSA9IDY4OwogIHRbNDBdID0gNjk7CiAgdFs0MV0gPSA3MDsKICB0WzQyXSA9IDcxOwogIHRbNDNdID0gNzI7CiAgdFs0NF0gPSA3MzsKICB0WzQ1XSA9IDc0OwogIHRbNDZdID0gNzU7CiAgdFs0N10gPSA3NjsKICB0WzQ4XSA9IDc3OwogIHRbNDldID0gNzg7CiAgdFs1MF0gPSA3OTsKICB0WzUxXSA9IDgwOwogIHRbNTJdID0gODE7CiAgdFs1M10gPSA4MjsKICB0WzU0XSA9IDgzOwogIHRbNTVdID0gODQ7CiAgdFs1Nl0gPSA4NTsKICB0WzU3XSA9IDg2OwogIHRbNThdID0gODc7CiAgdFs1OV0gPSA4ODsKICB0WzYwXSA9IDg5OwogIHRbNjFdID0gOTA7CiAgdFs2Ml0gPSA5MTsKICB0WzYzXSA9IDkyOwogIHRbNjRdID0gOTM7CiAgdFs2NV0gPSA5NDsKICB0WzY2XSA9IDk1OwogIHRbNjddID0gOTY7CiAgdFs2OF0gPSA5NzsKICB0WzY5XSA9IDk4OwogIHRbNzBdID0gOTk7CiAgdFs3MV0gPSAxMDA7CiAgdFs3Ml0gPSAxMDE7CiAgdFs3M10gPSAxMDI7CiAgdFs3NF0gPSAxMDM7CiAgdFs3NV0gPSAxMDQ7CiAgdFs3Nl0gPSAxMDU7CiAgdFs3N10gPSAxMDY7CiAgdFs3OF0gPSAxMDc7CiAgdFs3OV0gPSAxMDg7CiAgdFs4MF0gPSAxMDk7CiAgdFs4MV0gPSAxMTA7CiAgdFs4Ml0gPSAxMTE7CiAgdFs4M10gPSAxMTI7CiAgdFs4NF0gPSAxMTM7CiAgdFs4NV0gPSAxMTQ7CiAgdFs4Nl0gPSAxMTU7CiAgdFs4N10gPSAxMTY7CiAgdFs4OF0gPSAxMTc7CiAgdFs4OV0gPSAxMTg7CiAgdFs5MF0gPSAxMTk7CiAgdFs5MV0gPSAxMjA7CiAgdFs5Ml0gPSAxMjE7CiAgdFs5M10gPSAxMjI7CiAgdFs5NF0gPSAxMjM7CiAgdFs5NV0gPSAxMjQ7CiAgdFs5Nl0gPSAxMjU7CiAgdFs5N10gPSAxMjY7CiAgdFs5OF0gPSAxOTY7CiAgdFs5OV0gPSAxOTc7CiAgdFsxMDBdID0gMTk5OwogIHRbMTAxXSA9IDIwMTsKICB0WzEwMl0gPSAyMDk7CiAgdFsxMDNdID0gMjE0OwogIHRbMTA0XSA9IDIyMDsKICB0WzEwNV0gPSAyMjU7CiAgdFsxMDZdID0gMjI0OwogIHRbMTA3XSA9IDIyNjsKICB0WzEwOF0gPSAyMjg7CiAgdFsxMDldID0gMjI3OwogIHRbMTEwXSA9IDIyOTsKICB0WzExMV0gPSAyMzE7CiAgdFsxMTJdID0gMjMzOwogIHRbMTEzXSA9IDIzMjsKICB0WzExNF0gPSAyMzQ7CiAgdFsxMTVdID0gMjM1OwogIHRbMTE2XSA9IDIzNzsKICB0WzExN10gPSAyMzY7CiAgdFsxMThdID0gMjM4OwogIHRbMTE5XSA9IDIzOTsKICB0WzEyMF0gPSAyNDE7CiAgdFsxMjFdID0gMjQzOwogIHRbMTIyXSA9IDI0MjsKICB0WzEyM10gPSAyNDQ7CiAgdFsxMjRdID0gMjQ2OwogIHRbMTI1XSA9IDI0NTsKICB0WzEyNl0gPSAyNTA7CiAgdFsxMjddID0gMjQ5OwogIHRbMTI4XSA9IDI1MTsKICB0WzEyOV0gPSAyNTI7CiAgdFsxMzBdID0gODIyNDsKICB0WzEzMV0gPSAxNzY7CiAgdFsxMzJdID0gMTYyOwogIHRbMTMzXSA9IDE2MzsKICB0WzEzNF0gPSAxNjc7CiAgdFsxMzVdID0gODIyNjsKICB0WzEzNl0gPSAxODI7CiAgdFsxMzddID0gMjIzOwogIHRbMTM4XSA9IDE3NDsKICB0WzEzOV0gPSAxNjk7CiAgdFsxNDBdID0gODQ4MjsKICB0WzE0MV0gPSAxODA7CiAgdFsxNDJdID0gMTY4OwogIHRbMTQzXSA9IDg4MDA7CiAgdFsxNDRdID0gMTk4OwogIHRbMTQ1XSA9IDIxNjsKICB0WzE0Nl0gPSA4NzM0OwogIHRbMTQ3XSA9IDE3NzsKICB0WzE0OF0gPSA4ODA0OwogIHRbMTQ5XSA9IDg4MDU7CiAgdFsxNTBdID0gMTY1OwogIHRbMTUxXSA9IDE4MTsKICB0WzE1Ml0gPSA4NzA2OwogIHRbMTUzXSA9IDg3MjE7CiAgdFsxNTRdID0gODcxOTsKICB0WzE1Nl0gPSA4NzQ3OwogIHRbMTU3XSA9IDE3MDsKICB0WzE1OF0gPSAxODY7CiAgdFsxNTldID0gODQ4NjsKICB0WzE2MF0gPSAyMzA7CiAgdFsxNjFdID0gMjQ4OwogIHRbMTYyXSA9IDE5MTsKICB0WzE2M10gPSAxNjE7CiAgdFsxNjRdID0gMTcyOwogIHRbMTY1XSA9IDg3MzA7CiAgdFsxNjZdID0gNDAyOwogIHRbMTY3XSA9IDg3NzY7CiAgdFsxNjhdID0gODcxMDsKICB0WzE2OV0gPSAxNzE7CiAgdFsxNzBdID0gMTg3OwogIHRbMTcxXSA9IDgyMzA7CiAgdFsxNzldID0gODIyMDsKICB0WzE4MF0gPSA4MjIxOwogIHRbMTgxXSA9IDgyMTY7CiAgdFsxODJdID0gODIxNzsKICB0WzIwMF0gPSAxOTM7CiAgdFsyMDNdID0gMjA1OwogIHRbMjA3XSA9IDIxMTsKICB0WzIxMF0gPSAyMTg7CiAgdFsyMjNdID0gNzExOwogIHRbMjI0XSA9IDMyMTsKICB0WzIyNV0gPSAzMjI7CiAgdFsyMjZdID0gMzUyOwogIHRbMjI3XSA9IDM1MzsKICB0WzIyOF0gPSAzODE7CiAgdFsyMjldID0gMzgyOwogIHRbMjMzXSA9IDIyMTsKICB0WzIzNF0gPSAyNTM7CiAgdFsyNTJdID0gMjYzOwogIHRbMjUzXSA9IDI2ODsKICB0WzI1NF0gPSAyNjk7CiAgdFsyNThdID0gMjU4OwogIHRbMjYwXSA9IDI2MDsKICB0WzI2MV0gPSAyNjE7CiAgdFsyNjVdID0gMjgwOwogIHRbMjY2XSA9IDI4MTsKICB0WzI2N10gPSAyODI7CiAgdFsyNjhdID0gMjgzOwogIHRbMjY5XSA9IDMxMzsKICB0WzI3NV0gPSAzMjM7CiAgdFsyNzZdID0gMzI0OwogIHRbMjc4XSA9IDMyODsKICB0WzI4M10gPSAzNDQ7CiAgdFsyODRdID0gMzQ1OwogIHRbMjg1XSA9IDM0NjsKICB0WzI4Nl0gPSAzNDc7CiAgdFsyOTJdID0gMzY3OwogIHRbMjk1XSA9IDM3NzsKICB0WzI5Nl0gPSAzNzg7CiAgdFsyOThdID0gMzgwOwogIHRbMzA1XSA9IDk2MzsKICB0WzMwNl0gPSA5NjQ7CiAgdFszMDddID0gOTY2OwogIHRbMzA4XSA9IDgyMTU7CiAgdFszMDldID0gODI1MjsKICB0WzMxMF0gPSA4MzE5OwogIHRbMzExXSA9IDgzNTk7CiAgdFszMTJdID0gODU5MjsKICB0WzMxM10gPSA4NTkzOwogIHRbMzM3XSA9IDk1NTI7CiAgdFs0OTNdID0gMTAzOTsKICB0WzQ5NF0gPSAxMDQwOwogIHRbNTcwXSA9IDEwNDA7CiAgdFs1NzFdID0gMTA0MTsKICB0WzU3Ml0gPSAxMDQyOwogIHRbNTczXSA9IDEwNDM7CiAgdFs1NzRdID0gMTA0NDsKICB0WzU3NV0gPSAxMDQ1OwogIHRbNTc2XSA9IDEwNDY7CiAgdFs1NzddID0gMTA0NzsKICB0WzU3OF0gPSAxMDQ4OwogIHRbNTc5XSA9IDEwNDk7CiAgdFs1ODBdID0gMTA1MDsKICB0WzU4MV0gPSAxMDUxOwogIHRbNTgyXSA9IDEwNTI7CiAgdFs1ODNdID0gMTA1MzsKICB0WzU4NF0gPSAxMDU0OwogIHRbNTg1XSA9IDEwNTU7CiAgdFs1ODZdID0gMTA1NjsKICB0WzU4N10gPSAxMDU3OwogIHRbNTg4XSA9IDEwNTg7CiAgdFs1ODldID0gMTA1OTsKICB0WzU5MF0gPSAxMDYwOwogIHRbNTkxXSA9IDEwNjE7CiAgdFs1OTJdID0gMTA2MjsKICB0WzU5M10gPSAxMDYzOwogIHRbNTk0XSA9IDEwNjQ7CiAgdFs1OTVdID0gMTA2NTsKICB0WzU5Nl0gPSAxMDY2OwogIHRbNTk3XSA9IDEwNjc7CiAgdFs1OThdID0gMTA2ODsKICB0WzU5OV0gPSAxMDY5OwogIHRbNjAwXSA9IDEwNzA7CiAgdFs2NzJdID0gMTQ4ODsKICB0WzY3M10gPSAxNDg5OwogIHRbNjc0XSA9IDE0OTA7CiAgdFs2NzVdID0gMTQ5MTsKICB0WzY3Nl0gPSAxNDkyOwogIHRbNjc3XSA9IDE0OTM7CiAgdFs2NzhdID0gMTQ5NDsKICB0WzY3OV0gPSAxNDk1OwogIHRbNjgwXSA9IDE0OTY7CiAgdFs2ODFdID0gMTQ5NzsKICB0WzY4Ml0gPSAxNDk4OwogIHRbNjgzXSA9IDE0OTk7CiAgdFs2ODRdID0gMTUwMDsKICB0WzY4NV0gPSAxNTAxOwogIHRbNjg2XSA9IDE1MDI7CiAgdFs2ODddID0gMTUwMzsKICB0WzY4OF0gPSAxNTA0OwogIHRbNjg5XSA9IDE1MDU7CiAgdFs2OTBdID0gMTUwNjsKICB0WzY5MV0gPSAxNTA3OwogIHRbNjkyXSA9IDE1MDg7CiAgdFs2OTNdID0gMTUwOTsKICB0WzY5NF0gPSAxNTEwOwogIHRbNjk1XSA9IDE1MTE7CiAgdFs2OTZdID0gMTUxMjsKICB0WzY5N10gPSAxNTEzOwogIHRbNjk4XSA9IDE1MTQ7CiAgdFs3MDVdID0gMTUyNDsKICB0WzcwNl0gPSA4MzYyOwogIHRbNzEwXSA9IDY0Mjg4OwogIHRbNzExXSA9IDY0Mjk4OwogIHRbNzU5XSA9IDE2MTc7CiAgdFs3NjFdID0gMTc3NjsKICB0Wzc2M10gPSAxNzc4OwogIHRbNzc1XSA9IDE2NTI7CiAgdFs3NzddID0gMTc2NDsKICB0Wzc3OF0gPSAxNzgwOwogIHRbNzc5XSA9IDE3ODE7CiAgdFs3ODBdID0gMTc4MjsKICB0Wzc4Ml0gPSA3NzE7CiAgdFs3ODNdID0gNjQ3MjY7CiAgdFs3ODZdID0gODM2MzsKICB0Wzc4OF0gPSA4NTMyOwogIHRbNzkwXSA9IDc2ODsKICB0Wzc5MV0gPSA3Njk7CiAgdFs3OTJdID0gNzY4OwogIHRbNzk1XSA9IDgwMzsKICB0Wzc5N10gPSA2NDMzNjsKICB0Wzc5OF0gPSA2NDMzNzsKICB0Wzc5OV0gPSA2NDM0MjsKICB0WzgwMF0gPSA2NDM0MzsKICB0WzgwMV0gPSA2NDM0NDsKICB0WzgwMl0gPSA2NDM0NTsKICB0WzgwM10gPSA2NDM2MjsKICB0WzgwNF0gPSA2NDM2MzsKICB0WzgwNV0gPSA2NDM2NDsKICB0WzI0MjRdID0gNzgyMTsKICB0WzI0MjVdID0gNzgyMjsKICB0WzI0MjZdID0gNzgyMzsKICB0WzI0MjddID0gNzgyNDsKICB0WzI0MjhdID0gNzgyNTsKICB0WzI0MjldID0gNzgyNjsKICB0WzI0MzBdID0gNzgyNzsKICB0WzI0MzNdID0gNzY4MjsKICB0WzI2NzhdID0gODA0NTsKICB0WzI2NzldID0gODA0NjsKICB0WzI4MzBdID0gMTU1MjsKICB0WzI4MzhdID0gNjg2OwogIHRbMjg0MF0gPSA3NTE7CiAgdFsyODQyXSA9IDc1MzsKICB0WzI4NDNdID0gNzU0OwogIHRbMjg0NF0gPSA3NTU7CiAgdFsyODQ2XSA9IDc1NzsKICB0WzI4NTZdID0gNzY3OwogIHRbMjg1N10gPSA4NDg7CiAgdFsyODU4XSA9IDg0OTsKICB0WzI4NjJdID0gODUzOwogIHRbMjg2M10gPSA4NTQ7CiAgdFsyODY0XSA9IDg1NTsKICB0WzI4NjVdID0gODYxOwogIHRbMjg2Nl0gPSA4NjI7CiAgdFsyOTA2XSA9IDc0NjA7CiAgdFsyOTA4XSA9IDc0NjI7CiAgdFsyOTA5XSA9IDc0NjM7CiAgdFsyOTEwXSA9IDc0NjQ7CiAgdFsyOTEyXSA9IDc0NjY7CiAgdFsyOTEzXSA9IDc0Njc7CiAgdFsyOTE0XSA9IDc0Njg7CiAgdFsyOTE2XSA9IDc0NzA7CiAgdFsyOTE3XSA9IDc0NzE7CiAgdFsyOTE4XSA9IDc0NzI7CiAgdFsyOTIwXSA9IDc0NzQ7CiAgdFsyOTIxXSA9IDc0NzU7CiAgdFsyOTIyXSA9IDc0NzY7CiAgdFsyOTI0XSA9IDc0Nzg7CiAgdFsyOTI1XSA9IDc0Nzk7CiAgdFsyOTI2XSA9IDc0ODA7CiAgdFsyOTI4XSA9IDc0ODI7CiAgdFsyOTI5XSA9IDc0ODM7CiAgdFsyOTMwXSA9IDc0ODQ7CiAgdFsyOTMyXSA9IDc0ODY7CiAgdFsyOTMzXSA9IDc0ODc7CiAgdFsyOTM0XSA9IDc0ODg7CiAgdFsyOTM2XSA9IDc0OTA7CiAgdFsyOTM3XSA9IDc0OTE7CiAgdFsyOTM4XSA9IDc0OTI7CiAgdFsyOTQwXSA9IDc0OTQ7CiAgdFsyOTQxXSA9IDc0OTU7CiAgdFsyOTQyXSA9IDc0OTY7CiAgdFsyOTQ0XSA9IDc0OTg7CiAgdFsyOTQ2XSA9IDc1MDA7CiAgdFsyOTQ4XSA9IDc1MDI7CiAgdFsyOTUwXSA9IDc1MDQ7CiAgdFsyOTUxXSA9IDc1MDU7CiAgdFsyOTUyXSA9IDc1MDY7CiAgdFsyOTU0XSA9IDc1MDg7CiAgdFsyOTU1XSA9IDc1MDk7CiAgdFsyOTU2XSA9IDc1MTA7CiAgdFsyOTU4XSA9IDc1MTI7CiAgdFsyOTU5XSA9IDc1MTM7CiAgdFsyOTYwXSA9IDc1MTQ7CiAgdFsyOTYyXSA9IDc1MTY7CiAgdFsyOTYzXSA9IDc1MTc7CiAgdFsyOTY0XSA9IDc1MTg7CiAgdFsyOTY2XSA9IDc1MjA7CiAgdFsyOTY3XSA9IDc1MjE7CiAgdFsyOTY4XSA9IDc1MjI7CiAgdFsyOTcwXSA9IDc1MjQ7CiAgdFsyOTcxXSA9IDc1MjU7CiAgdFsyOTcyXSA9IDc1MjY7CiAgdFsyOTc0XSA9IDc1Mjg7CiAgdFsyOTc1XSA9IDc1Mjk7CiAgdFsyOTc2XSA9IDc1MzA7CiAgdFsyOTc4XSA9IDE1Mzc7CiAgdFsyOTc5XSA9IDE1Mzg7CiAgdFsyOTgwXSA9IDE1Mzk7CiAgdFsyOTgyXSA9IDE1NDk7CiAgdFsyOTgzXSA9IDE1NTE7CiAgdFsyOTg0XSA9IDE1NTI7CiAgdFsyOTg2XSA9IDE1NTQ7CiAgdFsyOTg3XSA9IDE1NTU7CiAgdFsyOTg4XSA9IDE1NTY7CiAgdFsyOTkwXSA9IDE2MjM7CiAgdFsyOTkxXSA9IDE2MjQ7CiAgdFsyOTk1XSA9IDE3NzU7CiAgdFsyOTk5XSA9IDE3OTE7CiAgdFszMDAyXSA9IDY0MjkwOwogIHRbMzAwM10gPSA2NDI5MTsKICB0WzMwMDRdID0gNjQyOTI7CiAgdFszMDA2XSA9IDY0Mjk0OwogIHRbMzAwN10gPSA2NDI5NTsKICB0WzMwMDhdID0gNjQyOTY7CiAgdFszMDExXSA9IDE5MDA7CiAgdFszMDE0XSA9IDgyMjM7CiAgdFszMDE1XSA9IDgyNDQ7CiAgdFszMDE3XSA9IDc1MzI7CiAgdFszMDE4XSA9IDc1MzM7CiAgdFszMDE5XSA9IDc1MzQ7CiAgdFszMDc1XSA9IDc1OTA7CiAgdFszMDc2XSA9IDc1OTE7CiAgdFszMDc5XSA9IDc1OTQ7CiAgdFszMDgwXSA9IDc1OTU7CiAgdFszMDgzXSA9IDc1OTg7CiAgdFszMDg0XSA9IDc1OTk7CiAgdFszMDg3XSA9IDc2MDI7CiAgdFszMDg4XSA9IDc2MDM7CiAgdFszMDkxXSA9IDc2MDY7CiAgdFszMDkyXSA9IDc2MDc7CiAgdFszMDk1XSA9IDc2MTA7CiAgdFszMDk2XSA9IDc2MTE7CiAgdFszMDk5XSA9IDc2MTQ7CiAgdFszMTAwXSA9IDc2MTU7CiAgdFszMTAzXSA9IDc2MTg7CiAgdFszMTA0XSA9IDc2MTk7CiAgdFszMTA3XSA9IDgzMzc7CiAgdFszMTA4XSA9IDgzMzg7CiAgdFszMTE2XSA9IDE4ODQ7CiAgdFszMTE5XSA9IDE4ODU7CiAgdFszMTIwXSA9IDE4ODU7CiAgdFszMTIzXSA9IDE4ODY7CiAgdFszMTI0XSA9IDE4ODY7CiAgdFszMTI3XSA9IDE4ODc7CiAgdFszMTI4XSA9IDE4ODc7CiAgdFszMTMxXSA9IDE4ODg7CiAgdFszMTMyXSA9IDE4ODg7CiAgdFszMTM1XSA9IDE4ODk7CiAgdFszMTM2XSA9IDE4ODk7CiAgdFszMTM5XSA9IDE4OTA7CiAgdFszMTQwXSA9IDE4OTA7CiAgdFszMTQzXSA9IDE4OTE7CiAgdFszMTQ0XSA9IDE4OTE7CiAgdFszMTQ3XSA9IDE4OTI7CiAgdFszMTQ4XSA9IDE4OTI7CiAgdFszMTUzXSA9IDU4MDsKICB0WzMxNTRdID0gNTgxOwogIHRbMzE1N10gPSA1ODQ7CiAgdFszMTU4XSA9IDU4NTsKICB0WzMxNjFdID0gNTg4OwogIHRbMzE2Ml0gPSA1ODk7CiAgdFszMTY1XSA9IDg5MTsKICB0WzMxNjZdID0gODkyOwogIHRbMzE2OV0gPSAxMjc0OwogIHRbMzE3MF0gPSAxMjc1OwogIHRbMzE3M10gPSAxMjc4OwogIHRbMzE3NF0gPSAxMjc5OwogIHRbMzE4MV0gPSA3NjIyOwogIHRbMzE4Ml0gPSA3NjIzOwogIHRbMzI4Ml0gPSAxMTc5OTsKICB0WzMzMTZdID0gNTc4OwogIHRbMzM3OV0gPSA0Mjc4NTsKICB0WzMzOTNdID0gMTE1OTsKICB0WzM0MTZdID0gODM3NzsKfSk7CmNvbnN0IGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjayA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogIHRbMjI3XSA9IDMyMjsKICB0WzI2NF0gPSAyNjE7CiAgdFsyOTFdID0gMzQ2Owp9KTsKY29uc3QgZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgdFsxXSA9IDMyOwogIHRbNF0gPSA2NTsKICB0WzVdID0gMTkyOwogIHRbNl0gPSAxOTM7CiAgdFs5XSA9IDE5NjsKICB0WzE3XSA9IDY2OwogIHRbMThdID0gNjc7CiAgdFsyMV0gPSAyNjg7CiAgdFsyNF0gPSA2ODsKICB0WzI4XSA9IDY5OwogIHRbMjldID0gMjAwOwogIHRbMzBdID0gMjAxOwogIHRbMzJdID0gMjgyOwogIHRbMzhdID0gNzA7CiAgdFszOV0gPSA3MTsKICB0WzQ0XSA9IDcyOwogIHRbNDddID0gNzM7CiAgdFs0OF0gPSAyMDQ7CiAgdFs0OV0gPSAyMDU7CiAgdFs1OF0gPSA3NDsKICB0WzYwXSA9IDc1OwogIHRbNjJdID0gNzY7CiAgdFs2OF0gPSA3NzsKICB0WzY5XSA9IDc4OwogIHRbNzVdID0gNzk7CiAgdFs3Nl0gPSAyMTA7CiAgdFs4MF0gPSAyMTQ7CiAgdFs4N10gPSA4MDsKICB0Wzg5XSA9IDgxOwogIHRbOTBdID0gODI7CiAgdFs5Ml0gPSAzNDQ7CiAgdFs5NF0gPSA4MzsKICB0Wzk3XSA9IDM1MjsKICB0WzEwMF0gPSA4NDsKICB0WzEwNF0gPSA4NTsKICB0WzEwOV0gPSAyMjA7CiAgdFsxMTVdID0gODY7CiAgdFsxMTZdID0gODc7CiAgdFsxMjFdID0gODg7CiAgdFsxMjJdID0gODk7CiAgdFsxMjRdID0gMjIxOwogIHRbMTI3XSA9IDkwOwogIHRbMTI5XSA9IDM4MTsKICB0WzI1OF0gPSA5NzsKICB0WzI1OV0gPSAyMjQ7CiAgdFsyNjBdID0gMjI1OwogIHRbMjYzXSA9IDIyODsKICB0WzI2OF0gPSAyNjE7CiAgdFsyNzFdID0gOTg7CiAgdFsyNzJdID0gOTk7CiAgdFsyNzNdID0gMjYzOwogIHRbMjc1XSA9IDI2OTsKICB0WzI4Ml0gPSAxMDA7CiAgdFsyODZdID0gMTAxOwogIHRbMjg3XSA9IDIzMjsKICB0WzI4OF0gPSAyMzM7CiAgdFsyOTBdID0gMjgzOwogIHRbMjk1XSA9IDI4MTsKICB0WzI5Nl0gPSAxMDI7CiAgdFszMzZdID0gMTAzOwogIHRbMzQ2XSA9IDEwNDsKICB0WzM0OV0gPSAxMDU7CiAgdFszNTBdID0gMjM2OwogIHRbMzUxXSA9IDIzNzsKICB0WzM2MV0gPSAxMDY7CiAgdFszNjRdID0gMTA3OwogIHRbMzY3XSA9IDEwODsKICB0WzM3MV0gPSAzMjI7CiAgdFszNzNdID0gMTA5OwogIHRbMzc0XSA9IDExMDsKICB0WzM4MV0gPSAxMTE7CiAgdFszODJdID0gMjQyOwogIHRbMzgzXSA9IDI0MzsKICB0WzM4Nl0gPSAyNDY7CiAgdFszOTNdID0gMTEyOwogIHRbMzk1XSA9IDExMzsKICB0WzM5Nl0gPSAxMTQ7CiAgdFszOThdID0gMzQ1OwogIHRbNDAwXSA9IDExNTsKICB0WzQwMV0gPSAzNDc7CiAgdFs0MDNdID0gMzUzOwogIHRbNDEwXSA9IDExNjsKICB0WzQzN10gPSAxMTc7CiAgdFs0NDJdID0gMjUyOwogIHRbNDQ4XSA9IDExODsKICB0WzQ0OV0gPSAxMTk7CiAgdFs0NTRdID0gMTIwOwogIHRbNDU1XSA9IDEyMTsKICB0WzQ1N10gPSAyNTM7CiAgdFs0NjBdID0gMTIyOwogIHRbNDYyXSA9IDM4MjsKICB0WzQ2M10gPSAzODA7CiAgdFs4NTNdID0gNDQ7CiAgdFs4NTVdID0gNTg7CiAgdFs4NTZdID0gNDY7CiAgdFs4NzZdID0gNDc7CiAgdFs4NzhdID0gNDU7CiAgdFs4ODJdID0gNDU7CiAgdFs4OTRdID0gNDA7CiAgdFs4OTVdID0gNDE7CiAgdFs4OTZdID0gOTE7CiAgdFs4OTddID0gOTM7CiAgdFs5MjNdID0gNjQ7CiAgdFs5NDBdID0gMTYzOwogIHRbMTAwNF0gPSA0ODsKICB0WzEwMDVdID0gNDk7CiAgdFsxMDA2XSA9IDUwOwogIHRbMTAwN10gPSA1MTsKICB0WzEwMDhdID0gNTI7CiAgdFsxMDA5XSA9IDUzOwogIHRbMTAxMF0gPSA1NDsKICB0WzEwMTFdID0gNTU7CiAgdFsxMDEyXSA9IDU2OwogIHRbMTAxM10gPSA1NzsKICB0WzEwODFdID0gMzc7CiAgdFsxMDg1XSA9IDQzOwogIHRbMTA4Nl0gPSA0NTsKfSk7CmZ1bmN0aW9uIGdldFN0YW5kYXJkRm9udE5hbWUobmFtZSkgewogIGNvbnN0IGZvbnROYW1lID0gbm9ybWFsaXplRm9udE5hbWUobmFtZSk7CiAgY29uc3Qgc3RkRm9udE1hcCA9IGdldFN0ZEZvbnRNYXAoKTsKICByZXR1cm4gc3RkRm9udE1hcFtmb250TmFtZV07Cn0KZnVuY3Rpb24gaXNLbm93bkZvbnROYW1lKG5hbWUpIHsKICBjb25zdCBmb250TmFtZSA9IG5vcm1hbGl6ZUZvbnROYW1lKG5hbWUpOwogIHJldHVybiAhIShnZXRTdGRGb250TWFwKClbZm9udE5hbWVdIHx8IGdldE5vblN0ZEZvbnRNYXAoKVtmb250TmFtZV0gfHwgZ2V0U2VyaWZGb250cygpW2ZvbnROYW1lXSB8fCBnZXRTeW1ib2xzRm9udHMoKVtmb250TmFtZV0pOwp9Cgo7Ly8gLi9zcmMvY29yZS90b191bmljb2RlX21hcC5qcwoKY2xhc3MgVG9Vbmljb2RlTWFwIHsKICBjb25zdHJ1Y3RvcihjbWFwID0gW10pIHsKICAgIHRoaXMuX21hcCA9IGNtYXA7CiAgfQogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLmxlbmd0aDsKICB9CiAgZm9yRWFjaChjYWxsYmFjaykgewogICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiB0aGlzLl9tYXApIHsKICAgICAgY2FsbGJhY2soY2hhckNvZGUsIHRoaXMuX21hcFtjaGFyQ29kZV0uY29kZVBvaW50QXQoMCkpOwogICAgfQogIH0KICBoYXMoaSkgewogICAgcmV0dXJuIHRoaXMuX21hcFtpXSAhPT0gdW5kZWZpbmVkOwogIH0KICBnZXQoaSkgewogICAgcmV0dXJuIHRoaXMuX21hcFtpXTsKICB9CiAgY2hhckNvZGVPZih2YWx1ZSkgewogICAgY29uc3QgbWFwID0gdGhpcy5fbWFwOwogICAgaWYgKG1hcC5sZW5ndGggPD0gMHgxMDAwMCkgewogICAgICByZXR1cm4gbWFwLmluZGV4T2YodmFsdWUpOwogICAgfQogICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBtYXApIHsKICAgICAgaWYgKG1hcFtjaGFyQ29kZV0gPT09IHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGNoYXJDb2RlIHwgMDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwogIH0KICBhbWVuZChtYXApIHsKICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gbWFwKSB7CiAgICAgIHRoaXMuX21hcFtjaGFyQ29kZV0gPSBtYXBbY2hhckNvZGVdOwogICAgfQogIH0KfQpjbGFzcyBJZGVudGl0eVRvVW5pY29kZU1hcCB7CiAgY29uc3RydWN0b3IoZmlyc3RDaGFyLCBsYXN0Q2hhcikgewogICAgdGhpcy5maXJzdENoYXIgPSBmaXJzdENoYXI7CiAgICB0aGlzLmxhc3RDaGFyID0gbGFzdENoYXI7CiAgfQogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhciArIDEgLSB0aGlzLmZpcnN0Q2hhcjsKICB9CiAgZm9yRWFjaChjYWxsYmFjaykgewogICAgZm9yIChsZXQgaSA9IHRoaXMuZmlyc3RDaGFyLCBpaSA9IHRoaXMubGFzdENoYXI7IGkgPD0gaWk7IGkrKykgewogICAgICBjYWxsYmFjayhpLCBpKTsKICAgIH0KICB9CiAgaGFzKGkpIHsKICAgIHJldHVybiB0aGlzLmZpcnN0Q2hhciA8PSBpICYmIGkgPD0gdGhpcy5sYXN0Q2hhcjsKICB9CiAgZ2V0KGkpIHsKICAgIGlmICh0aGlzLmZpcnN0Q2hhciA8PSBpICYmIGkgPD0gdGhpcy5sYXN0Q2hhcikgewogICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShpKTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIGNoYXJDb2RlT2YodikgewogICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodikgJiYgdiA+PSB0aGlzLmZpcnN0Q2hhciAmJiB2IDw9IHRoaXMubGFzdENoYXIgPyB2IDogLTE7CiAgfQogIGFtZW5kKG1hcCkgewogICAgdW5yZWFjaGFibGUoIlNob3VsZCBub3QgY2FsbCBhbWVuZCgpIik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jZmZfZm9udC5qcwoKCgpjbGFzcyBDRkZGb250IHsKICBjb25zdHJ1Y3RvcihmaWxlLCBwcm9wZXJ0aWVzKSB7CiAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwogICAgY29uc3QgcGFyc2VyID0gbmV3IENGRlBhcnNlcihmaWxlLCBwcm9wZXJ0aWVzLCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQpOwogICAgdGhpcy5jZmYgPSBwYXJzZXIucGFyc2UoKTsKICAgIHRoaXMuY2ZmLmR1cGxpY2F0ZUZpcnN0R2x5cGgoKTsKICAgIGNvbnN0IGNvbXBpbGVyID0gbmV3IENGRkNvbXBpbGVyKHRoaXMuY2ZmKTsKICAgIHRoaXMuc2VhY3MgPSB0aGlzLmNmZi5zZWFjczsKICAgIHRyeSB7CiAgICAgIHRoaXMuZGF0YSA9IGNvbXBpbGVyLmNvbXBpbGUoKTsKICAgIH0gY2F0Y2ggewogICAgICB3YXJuKCJGYWlsZWQgdG8gY29tcGlsZSBmb250ICIgKyBwcm9wZXJ0aWVzLmxvYWRlZE5hbWUpOwogICAgICB0aGlzLmRhdGEgPSBmaWxlOwogICAgfQogICAgdGhpcy5fY3JlYXRlQnVpbHRJbkVuY29kaW5nKCk7CiAgfQogIGdldCBudW1HbHlwaHMoKSB7CiAgICByZXR1cm4gdGhpcy5jZmYuY2hhclN0cmluZ3MuY291bnQ7CiAgfQogIGdldENoYXJzZXQoKSB7CiAgICByZXR1cm4gdGhpcy5jZmYuY2hhcnNldC5jaGFyc2V0OwogIH0KICBnZXRHbHlwaE1hcHBpbmcoKSB7CiAgICBjb25zdCBjZmYgPSB0aGlzLmNmZjsKICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXM7CiAgICBjb25zdCB7CiAgICAgIGNpZFRvR2lkTWFwLAogICAgICBjTWFwCiAgICB9ID0gcHJvcGVydGllczsKICAgIGNvbnN0IGNoYXJzZXRzID0gY2ZmLmNoYXJzZXQuY2hhcnNldDsKICAgIGxldCBjaGFyQ29kZVRvR2x5cGhJZDsKICAgIGxldCBnbHlwaElkOwogICAgaWYgKHByb3BlcnRpZXMuY29tcG9zaXRlKSB7CiAgICAgIGxldCBpbnZDaWRUb0dpZE1hcDsKICAgICAgaWYgKGNpZFRvR2lkTWFwPy5sZW5ndGggPiAwKSB7CiAgICAgICAgaW52Q2lkVG9HaWRNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNpZFRvR2lkTWFwLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGdpZCA9IGNpZFRvR2lkTWFwW2ldOwogICAgICAgICAgaWYgKGdpZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGludkNpZFRvR2lkTWFwW2dpZF0gPSBpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBjaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGxldCBjaGFyQ29kZTsKICAgICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKICAgICAgICBmb3IgKGdseXBoSWQgPSAwOyBnbHlwaElkIDwgY2hhcnNldHMubGVuZ3RoOyBnbHlwaElkKyspIHsKICAgICAgICAgIGNvbnN0IGNpZCA9IGNoYXJzZXRzW2dseXBoSWRdOwogICAgICAgICAgY2hhckNvZGUgPSBjTWFwLmNoYXJDb2RlT2YoY2lkKTsKICAgICAgICAgIGlmIChpbnZDaWRUb0dpZE1hcD8uW2NoYXJDb2RlXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGNoYXJDb2RlID0gaW52Q2lkVG9HaWRNYXBbY2hhckNvZGVdOwogICAgICAgICAgfQogICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNmZi5jaGFyU3RyaW5ncy5jb3VudDsgZ2x5cGhJZCsrKSB7CiAgICAgICAgICBjaGFyQ29kZSA9IGNNYXAuY2hhckNvZGVPZihnbHlwaElkKTsKICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDsKICAgIH0KICAgIGxldCBlbmNvZGluZyA9IGNmZi5lbmNvZGluZyA/IGNmZi5lbmNvZGluZy5lbmNvZGluZyA6IG51bGw7CiAgICBpZiAocHJvcGVydGllcy5pc0ludGVybmFsRm9udCkgewogICAgICBlbmNvZGluZyA9IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nOwogICAgfQogICAgY2hhckNvZGVUb0dseXBoSWQgPSB0eXBlMUZvbnRHbHlwaE1hcHBpbmcocHJvcGVydGllcywgZW5jb2RpbmcsIGNoYXJzZXRzKTsKICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDsKICB9CiAgaGFzR2x5cGhJZChpZCkgewogICAgcmV0dXJuIHRoaXMuY2ZmLmhhc0dseXBoSWQoaWQpOwogIH0KICBfY3JlYXRlQnVpbHRJbkVuY29kaW5nKCkgewogICAgY29uc3QgewogICAgICBjaGFyc2V0LAogICAgICBlbmNvZGluZwogICAgfSA9IHRoaXMuY2ZmOwogICAgaWYgKCFjaGFyc2V0IHx8ICFlbmNvZGluZykgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBjaGFyc2V0cyA9IGNoYXJzZXQuY2hhcnNldCwKICAgICAgZW5jb2RpbmdzID0gZW5jb2RpbmcuZW5jb2Rpbmc7CiAgICBjb25zdCBtYXAgPSBbXTsKICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gZW5jb2RpbmdzKSB7CiAgICAgIGNvbnN0IGdseXBoSWQgPSBlbmNvZGluZ3NbY2hhckNvZGVdOwogICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7CiAgICAgICAgY29uc3QgZ2x5cGhOYW1lID0gY2hhcnNldHNbZ2x5cGhJZF07CiAgICAgICAgaWYgKGdseXBoTmFtZSkgewogICAgICAgICAgbWFwW2NoYXJDb2RlXSA9IGdseXBoTmFtZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChtYXAubGVuZ3RoID4gMCkgewogICAgICB0aGlzLnByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nID0gbWFwOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZm9udF9yZW5kZXJlci5qcwoKCgoKCgpmdW5jdGlvbiBnZXRGbG9hdDIxNChkYXRhLCBvZmZzZXQpIHsKICByZXR1cm4gcmVhZEludDE2KGRhdGEsIG9mZnNldCkgLyAxNjM4NDsKfQpmdW5jdGlvbiBnZXRTdWJyb3V0aW5lQmlhcyhzdWJycykgewogIGNvbnN0IG51bVN1YnJzID0gc3VicnMubGVuZ3RoOwogIGxldCBiaWFzID0gMzI3Njg7CiAgaWYgKG51bVN1YnJzIDwgMTI0MCkgewogICAgYmlhcyA9IDEwNzsKICB9IGVsc2UgaWYgKG51bVN1YnJzIDwgMzM5MDApIHsKICAgIGJpYXMgPSAxMTMxOwogIH0KICByZXR1cm4gYmlhczsKfQpmdW5jdGlvbiBwYXJzZUNtYXAoZGF0YSwgc3RhcnQsIGVuZCkgewogIGNvbnN0IG9mZnNldCA9IHJlYWRVaW50MTYoZGF0YSwgc3RhcnQgKyAyKSA9PT0gMSA/IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyA4KSA6IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyAxNik7CiAgY29uc3QgZm9ybWF0ID0gcmVhZFVpbnQxNihkYXRhLCBzdGFydCArIG9mZnNldCk7CiAgbGV0IHJhbmdlcywgcCwgaTsKICBpZiAoZm9ybWF0ID09PSA0KSB7CiAgICByZWFkVWludDE2KGRhdGEsIHN0YXJ0ICsgb2Zmc2V0ICsgMik7CiAgICBjb25zdCBzZWdDb3VudCA9IHJlYWRVaW50MTYoZGF0YSwgc3RhcnQgKyBvZmZzZXQgKyA2KSA+PiAxOwogICAgcCA9IHN0YXJ0ICsgb2Zmc2V0ICsgMTQ7CiAgICByYW5nZXMgPSBbXTsKICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudDsgaSsrLCBwICs9IDIpIHsKICAgICAgcmFuZ2VzW2ldID0gewogICAgICAgIGVuZDogcmVhZFVpbnQxNihkYXRhLCBwKQogICAgICB9OwogICAgfQogICAgcCArPSAyOwogICAgZm9yIChpID0gMDsgaSA8IHNlZ0NvdW50OyBpKyssIHAgKz0gMikgewogICAgICByYW5nZXNbaV0uc3RhcnQgPSByZWFkVWludDE2KGRhdGEsIHApOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IHNlZ0NvdW50OyBpKyssIHAgKz0gMikgewogICAgICByYW5nZXNbaV0uaWREZWx0YSA9IHJlYWRVaW50MTYoZGF0YSwgcCk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7CiAgICAgIGxldCBpZE9mZnNldCA9IHJlYWRVaW50MTYoZGF0YSwgcCk7CiAgICAgIGlmIChpZE9mZnNldCA9PT0gMCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHJhbmdlc1tpXS5pZHMgPSBbXTsKICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gcmFuZ2VzW2ldLmVuZCAtIHJhbmdlc1tpXS5zdGFydCArIDE7IGogPCBqajsgaisrKSB7CiAgICAgICAgcmFuZ2VzW2ldLmlkc1tqXSA9IHJlYWRVaW50MTYoZGF0YSwgcCArIGlkT2Zmc2V0KTsKICAgICAgICBpZE9mZnNldCArPSAyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmFuZ2VzOwogIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAxMikgewogICAgY29uc3QgZ3JvdXBzID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIG9mZnNldCArIDEyKTsKICAgIHAgPSBzdGFydCArIG9mZnNldCArIDE2OwogICAgcmFuZ2VzID0gW107CiAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzOyBpKyspIHsKICAgICAgc3RhcnQgPSByZWFkVWludDMyKGRhdGEsIHApOwogICAgICByYW5nZXMucHVzaCh7CiAgICAgICAgc3RhcnQsCiAgICAgICAgZW5kOiByZWFkVWludDMyKGRhdGEsIHAgKyA0KSwKICAgICAgICBpZERlbHRhOiByZWFkVWludDMyKGRhdGEsIHAgKyA4KSAtIHN0YXJ0CiAgICAgIH0pOwogICAgICBwICs9IDEyOwogICAgfQogICAgcmV0dXJuIHJhbmdlczsKICB9CiAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGB1bnN1cHBvcnRlZCBjbWFwOiAke2Zvcm1hdH1gKTsKfQpmdW5jdGlvbiBwYXJzZUNmZihkYXRhLCBzdGFydCwgZW5kLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgY29uc3QgcHJvcGVydGllcyA9IHt9OwogIGNvbnN0IHBhcnNlciA9IG5ldyBDRkZQYXJzZXIobmV3IFN0cmVhbShkYXRhLCBzdGFydCwgZW5kIC0gc3RhcnQpLCBwcm9wZXJ0aWVzLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKICBjb25zdCBjZmYgPSBwYXJzZXIucGFyc2UoKTsKICByZXR1cm4gewogICAgZ2x5cGhzOiBjZmYuY2hhclN0cmluZ3Mub2JqZWN0cywKICAgIHN1YnJzOiBjZmYudG9wRGljdC5wcml2YXRlRGljdD8uc3VicnNJbmRleD8ub2JqZWN0cywKICAgIGdzdWJyczogY2ZmLmdsb2JhbFN1YnJJbmRleD8ub2JqZWN0cywKICAgIGlzQ0ZGQ0lERm9udDogY2ZmLmlzQ0lERm9udCwKICAgIGZkU2VsZWN0OiBjZmYuZmRTZWxlY3QsCiAgICBmZEFycmF5OiBjZmYuZmRBcnJheQogIH07Cn0KZnVuY3Rpb24gcGFyc2VHbHlmVGFibGUoZ2x5ZiwgbG9jYSwgaXNHbHlwaExvY2F0aW9uc0xvbmcpIHsKICBsZXQgaXRlbVNpemUsIGl0ZW1EZWNvZGU7CiAgaWYgKGlzR2x5cGhMb2NhdGlvbnNMb25nKSB7CiAgICBpdGVtU2l6ZSA9IDQ7CiAgICBpdGVtRGVjb2RlID0gcmVhZFVpbnQzMjsKICB9IGVsc2UgewogICAgaXRlbVNpemUgPSAyOwogICAgaXRlbURlY29kZSA9IChkYXRhLCBvZmZzZXQpID0+IDIgKiByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgfQogIGNvbnN0IGdseXBocyA9IFtdOwogIGxldCBzdGFydE9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYSwgMCk7CiAgZm9yIChsZXQgaiA9IGl0ZW1TaXplOyBqIDwgbG9jYS5sZW5ndGg7IGogKz0gaXRlbVNpemUpIHsKICAgIGNvbnN0IGVuZE9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYSwgaik7CiAgICBnbHlwaHMucHVzaChnbHlmLnN1YmFycmF5KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpKTsKICAgIHN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0OwogIH0KICByZXR1cm4gZ2x5cGhzOwp9CmZ1bmN0aW9uIGxvb2t1cENtYXAocmFuZ2VzLCB1bmljb2RlKSB7CiAgY29uc3QgY29kZSA9IHVuaWNvZGUuY29kZVBvaW50QXQoMCk7CiAgbGV0IGdpZCA9IDAsCiAgICBsID0gMCwKICAgIHIgPSByYW5nZXMubGVuZ3RoIC0gMTsKICB3aGlsZSAobCA8IHIpIHsKICAgIGNvbnN0IGMgPSBsICsgciArIDEgPj4gMTsKICAgIGlmIChjb2RlIDwgcmFuZ2VzW2NdLnN0YXJ0KSB7CiAgICAgIHIgPSBjIC0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGwgPSBjOwogICAgfQogIH0KICBpZiAocmFuZ2VzW2xdLnN0YXJ0IDw9IGNvZGUgJiYgY29kZSA8PSByYW5nZXNbbF0uZW5kKSB7CiAgICBnaWQgPSByYW5nZXNbbF0uaWREZWx0YSArIChyYW5nZXNbbF0uaWRzID8gcmFuZ2VzW2xdLmlkc1tjb2RlIC0gcmFuZ2VzW2xdLnN0YXJ0XSA6IGNvZGUpICYgMHhmZmZmOwogIH0KICByZXR1cm4gewogICAgY2hhckNvZGU6IGNvZGUsCiAgICBnbHlwaElkOiBnaWQKICB9Owp9CmZ1bmN0aW9uIGNvbXBpbGVHbHlmKGNvZGUsIGNtZHMsIGZvbnQpIHsKICBmdW5jdGlvbiBtb3ZlVG8oeCwgeSkgewogICAgaWYgKGZpcnN0UG9pbnQpIHsKICAgICAgY21kcy5hZGQoIkwiLCBmaXJzdFBvaW50KTsKICAgIH0KICAgIGZpcnN0UG9pbnQgPSBbeCwgeV07CiAgICBjbWRzLmFkZCgiTSIsIFt4LCB5XSk7CiAgfQogIGZ1bmN0aW9uIGxpbmVUbyh4LCB5KSB7CiAgICBjbWRzLmFkZCgiTCIsIFt4LCB5XSk7CiAgfQogIGZ1bmN0aW9uIHF1YWRyYXRpY0N1cnZlVG8oeGEsIHlhLCB4LCB5KSB7CiAgICBjbWRzLmFkZCgiUSIsIFt4YSwgeWEsIHgsIHldKTsKICB9CiAgbGV0IGkgPSAwOwogIGNvbnN0IG51bWJlck9mQ29udG91cnMgPSByZWFkSW50MTYoY29kZSwgaSk7CiAgbGV0IGZsYWdzOwogIGxldCBmaXJzdFBvaW50ID0gbnVsbDsKICBsZXQgeCA9IDAsCiAgICB5ID0gMDsKICBpICs9IDEwOwogIGlmIChudW1iZXJPZkNvbnRvdXJzIDwgMCkgewogICAgZG8gewogICAgICBmbGFncyA9IHJlYWRVaW50MTYoY29kZSwgaSk7CiAgICAgIGNvbnN0IGdseXBoSW5kZXggPSByZWFkVWludDE2KGNvZGUsIGkgKyAyKTsKICAgICAgaSArPSA0OwogICAgICBsZXQgYXJnMSwgYXJnMjsKICAgICAgaWYgKGZsYWdzICYgMHgwMSkgewogICAgICAgIGlmIChmbGFncyAmIDB4MDIpIHsKICAgICAgICAgIGFyZzEgPSByZWFkSW50MTYoY29kZSwgaSk7CiAgICAgICAgICBhcmcyID0gcmVhZEludDE2KGNvZGUsIGkgKyAyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXJnMSA9IHJlYWRVaW50MTYoY29kZSwgaSk7CiAgICAgICAgICBhcmcyID0gcmVhZFVpbnQxNihjb2RlLCBpICsgMik7CiAgICAgICAgfQogICAgICAgIGkgKz0gNDsKICAgICAgfSBlbHNlIGlmIChmbGFncyAmIDB4MDIpIHsKICAgICAgICBhcmcxID0gcmVhZEludDgoY29kZSwgaSsrKTsKICAgICAgICBhcmcyID0gcmVhZEludDgoY29kZSwgaSsrKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcmcxID0gY29kZVtpKytdOwogICAgICAgIGFyZzIgPSBjb2RlW2krK107CiAgICAgIH0KICAgICAgaWYgKGZsYWdzICYgMHgwMikgewogICAgICAgIHggPSBhcmcxOwogICAgICAgIHkgPSBhcmcyOwogICAgICB9IGVsc2UgewogICAgICAgIHggPSAwOwogICAgICAgIHkgPSAwOwogICAgICB9CiAgICAgIGxldCBzY2FsZVggPSAxLAogICAgICAgIHNjYWxlWSA9IDEsCiAgICAgICAgc2NhbGUwMSA9IDAsCiAgICAgICAgc2NhbGUxMCA9IDA7CiAgICAgIGlmIChmbGFncyAmIDB4MDgpIHsKICAgICAgICBzY2FsZVggPSBzY2FsZVkgPSBnZXRGbG9hdDIxNChjb2RlLCBpKTsKICAgICAgICBpICs9IDI7CiAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDQwKSB7CiAgICAgICAgc2NhbGVYID0gZ2V0RmxvYXQyMTQoY29kZSwgaSk7CiAgICAgICAgc2NhbGVZID0gZ2V0RmxvYXQyMTQoY29kZSwgaSArIDIpOwogICAgICAgIGkgKz0gNDsKICAgICAgfSBlbHNlIGlmIChmbGFncyAmIDB4ODApIHsKICAgICAgICBzY2FsZVggPSBnZXRGbG9hdDIxNChjb2RlLCBpKTsKICAgICAgICBzY2FsZTAxID0gZ2V0RmxvYXQyMTQoY29kZSwgaSArIDIpOwogICAgICAgIHNjYWxlMTAgPSBnZXRGbG9hdDIxNChjb2RlLCBpICsgNCk7CiAgICAgICAgc2NhbGVZID0gZ2V0RmxvYXQyMTQoY29kZSwgaSArIDYpOwogICAgICAgIGkgKz0gODsKICAgICAgfQogICAgICBjb25zdCBzdWJnbHlwaCA9IGZvbnQuZ2x5cGhzW2dseXBoSW5kZXhdOwogICAgICBpZiAoc3ViZ2x5cGgpIHsKICAgICAgICBjbWRzLnNhdmUoKTsKICAgICAgICBjbWRzLnRyYW5zZm9ybShbc2NhbGVYLCBzY2FsZTAxLCBzY2FsZTEwLCBzY2FsZVksIHgsIHldKTsKICAgICAgICBpZiAoIShmbGFncyAmIDB4MDIpKSB7fQogICAgICAgIGNvbXBpbGVHbHlmKHN1YmdseXBoLCBjbWRzLCBmb250KTsKICAgICAgICBjbWRzLnJlc3RvcmUoKTsKICAgICAgfQogICAgfSB3aGlsZSAoZmxhZ3MgJiAweDIwKTsKICB9IGVsc2UgewogICAgY29uc3QgZW5kUHRzT2ZDb250b3VycyA9IFtdOwogICAgbGV0IGosIGpqOwogICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mQ29udG91cnM7IGorKykgewogICAgICBlbmRQdHNPZkNvbnRvdXJzLnB1c2gocmVhZFVpbnQxNihjb2RlLCBpKSk7CiAgICAgIGkgKz0gMjsKICAgIH0KICAgIGNvbnN0IGluc3RydWN0aW9uTGVuZ3RoID0gcmVhZFVpbnQxNihjb2RlLCBpKTsKICAgIGkgKz0gMiArIGluc3RydWN0aW9uTGVuZ3RoOwogICAgY29uc3QgbnVtYmVyT2ZQb2ludHMgPSBlbmRQdHNPZkNvbnRvdXJzLmF0KC0xKSArIDE7CiAgICBjb25zdCBwb2ludHMgPSBbXTsKICAgIHdoaWxlIChwb2ludHMubGVuZ3RoIDwgbnVtYmVyT2ZQb2ludHMpIHsKICAgICAgZmxhZ3MgPSBjb2RlW2krK107CiAgICAgIGxldCByZXBlYXQgPSAxOwogICAgICBpZiAoZmxhZ3MgJiAweDA4KSB7CiAgICAgICAgcmVwZWF0ICs9IGNvZGVbaSsrXTsKICAgICAgfQogICAgICB3aGlsZSAocmVwZWF0LS0gPiAwKSB7CiAgICAgICAgcG9pbnRzLnB1c2goewogICAgICAgICAgZmxhZ3MKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHsKICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDEyKSB7CiAgICAgICAgY2FzZSAweDAwOgogICAgICAgICAgeCArPSByZWFkSW50MTYoY29kZSwgaSk7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDI6CiAgICAgICAgICB4IC09IGNvZGVbaSsrXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMjoKICAgICAgICAgIHggKz0gY29kZVtpKytdOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcG9pbnRzW2pdLnggPSB4OwogICAgfQogICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHsKICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDI0KSB7CiAgICAgICAgY2FzZSAweDAwOgogICAgICAgICAgeSArPSByZWFkSW50MTYoY29kZSwgaSk7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDQ6CiAgICAgICAgICB5IC09IGNvZGVbaSsrXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyNDoKICAgICAgICAgIHkgKz0gY29kZVtpKytdOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcG9pbnRzW2pdLnkgPSB5OwogICAgfQogICAgbGV0IHN0YXJ0UG9pbnQgPSAwOwogICAgZm9yIChpID0gMDsgaSA8IG51bWJlck9mQ29udG91cnM7IGkrKykgewogICAgICBjb25zdCBlbmRQb2ludCA9IGVuZFB0c09mQ29udG91cnNbaV07CiAgICAgIGNvbnN0IGNvbnRvdXIgPSBwb2ludHMuc2xpY2Uoc3RhcnRQb2ludCwgZW5kUG9pbnQgKyAxKTsKICAgICAgaWYgKGNvbnRvdXJbMF0uZmxhZ3MgJiAxKSB7CiAgICAgICAgY29udG91ci5wdXNoKGNvbnRvdXJbMF0pOwogICAgICB9IGVsc2UgaWYgKGNvbnRvdXIuYXQoLTEpLmZsYWdzICYgMSkgewogICAgICAgIGNvbnRvdXIudW5zaGlmdChjb250b3VyLmF0KC0xKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgcCA9IHsKICAgICAgICAgIGZsYWdzOiAxLAogICAgICAgICAgeDogKGNvbnRvdXJbMF0ueCArIGNvbnRvdXIuYXQoLTEpLngpIC8gMiwKICAgICAgICAgIHk6IChjb250b3VyWzBdLnkgKyBjb250b3VyLmF0KC0xKS55KSAvIDIKICAgICAgICB9OwogICAgICAgIGNvbnRvdXIudW5zaGlmdChwKTsKICAgICAgICBjb250b3VyLnB1c2gocCk7CiAgICAgIH0KICAgICAgbW92ZVRvKGNvbnRvdXJbMF0ueCwgY29udG91clswXS55KTsKICAgICAgZm9yIChqID0gMSwgamogPSBjb250b3VyLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICBpZiAoY29udG91cltqXS5mbGFncyAmIDEpIHsKICAgICAgICAgIGxpbmVUbyhjb250b3VyW2pdLngsIGNvbnRvdXJbal0ueSk7CiAgICAgICAgfSBlbHNlIGlmIChjb250b3VyW2ogKyAxXS5mbGFncyAmIDEpIHsKICAgICAgICAgIHF1YWRyYXRpY0N1cnZlVG8oY29udG91cltqXS54LCBjb250b3VyW2pdLnksIGNvbnRvdXJbaiArIDFdLngsIGNvbnRvdXJbaiArIDFdLnkpOwogICAgICAgICAgaisrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBxdWFkcmF0aWNDdXJ2ZVRvKGNvbnRvdXJbal0ueCwgY29udG91cltqXS55LCAoY29udG91cltqXS54ICsgY29udG91cltqICsgMV0ueCkgLyAyLCAoY29udG91cltqXS55ICsgY29udG91cltqICsgMV0ueSkgLyAyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhcnRQb2ludCA9IGVuZFBvaW50ICsgMTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gY29tcGlsZUNoYXJTdHJpbmcoY2hhclN0cmluZ0NvZGUsIGNtZHMsIGZvbnQsIGdseXBoSWQpIHsKICBmdW5jdGlvbiBtb3ZlVG8oeCwgeSkgewogICAgaWYgKGZpcnN0UG9pbnQpIHsKICAgICAgY21kcy5hZGQoIkwiLCBmaXJzdFBvaW50KTsKICAgIH0KICAgIGZpcnN0UG9pbnQgPSBbeCwgeV07CiAgICBjbWRzLmFkZCgiTSIsIFt4LCB5XSk7CiAgfQogIGZ1bmN0aW9uIGxpbmVUbyh4LCB5KSB7CiAgICBjbWRzLmFkZCgiTCIsIFt4LCB5XSk7CiAgfQogIGZ1bmN0aW9uIGJlemllckN1cnZlVG8oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHsKICAgIGNtZHMuYWRkKCJDIiwgW3gxLCB5MSwgeDIsIHkyLCB4LCB5XSk7CiAgfQogIGNvbnN0IHN0YWNrID0gW107CiAgbGV0IHggPSAwLAogICAgeSA9IDA7CiAgbGV0IHN0ZW1zID0gMDsKICBsZXQgZmlyc3RQb2ludCA9IG51bGw7CiAgZnVuY3Rpb24gcGFyc2UoY29kZSkgewogICAgbGV0IGkgPSAwOwogICAgd2hpbGUgKGkgPCBjb2RlLmxlbmd0aCkgewogICAgICBsZXQgc3RhY2tDbGVhbiA9IGZhbHNlOwogICAgICBsZXQgdiA9IGNvZGVbaSsrXTsKICAgICAgbGV0IHhhLCB4YiwgeWEsIHliLCB5MSwgeTIsIHkzLCBuLCBzdWJyQ29kZTsKICAgICAgc3dpdGNoICh2KSB7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CiAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICB5ICs9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbW92ZVRvKHgsIHkpOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBsaW5lVG8oeCwgeSk7CiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpbmVUbyh4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzoKICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBsaW5lVG8oeCwgeSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDg6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMDoKICAgICAgICAgIG4gPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN1YnJDb2RlID0gbnVsbDsKICAgICAgICAgIGlmIChmb250LmlzQ0ZGQ0lERm9udCkgewogICAgICAgICAgICBjb25zdCBmZEluZGV4ID0gZm9udC5mZFNlbGVjdC5nZXRGREluZGV4KGdseXBoSWQpOwogICAgICAgICAgICBpZiAoZmRJbmRleCA+PSAwICYmIGZkSW5kZXggPCBmb250LmZkQXJyYXkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgY29uc3QgZm9udERpY3QgPSBmb250LmZkQXJyYXlbZmRJbmRleF07CiAgICAgICAgICAgICAgbGV0IHN1YnJzOwogICAgICAgICAgICAgIGlmIChmb250RGljdC5wcml2YXRlRGljdD8uc3VicnNJbmRleCkgewogICAgICAgICAgICAgICAgc3VicnMgPSBmb250RGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4Lm9iamVjdHM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzdWJycykgewogICAgICAgICAgICAgICAgbiArPSBnZXRTdWJyb3V0aW5lQmlhcyhzdWJycyk7CiAgICAgICAgICAgICAgICBzdWJyQ29kZSA9IHN1YnJzW25dOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB3YXJuKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3VickNvZGUgPSBmb250LnN1YnJzW24gKyBmb250LnN1YnJzQmlhc107CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3VickNvZGUpIHsKICAgICAgICAgICAgcGFyc2Uoc3VickNvZGUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMToKICAgICAgICAgIHJldHVybjsKICAgICAgICBjYXNlIDEyOgogICAgICAgICAgdiA9IGNvZGVbaSsrXTsKICAgICAgICAgIHN3aXRjaCAodikgewogICAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeTEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHksIHhiLCB5MSwgeCwgeTEpOwogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHksIHgsIHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHkxID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeTIgPSB5MSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHkyLCB4LCB5Mik7CiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5MyA9IHkyICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHkyLCB4YiwgeTMsIHgsIHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgIGNvbnN0IHgwID0geCwKICAgICAgICAgICAgICAgIHkwID0geTsKICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGI7CiAgICAgICAgICAgICAgeSA9IHliOwogICAgICAgICAgICAgIGlmIChNYXRoLmFicyh4IC0geDApID4gTWF0aC5hYnMoeSAtIHkwKSkgewogICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgdW5rbm93biBvcGVyYXRvcjogMTIgJHt2fWApOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxNDoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPj0gNCkgewogICAgICAgICAgICBjb25zdCBhY2hhciA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICBjb25zdCBiY2hhciA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICB5ID0gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHggPSBzdGFjay5wb3AoKTsKICAgICAgICAgICAgY21kcy5zYXZlKCk7CiAgICAgICAgICAgIGNtZHMudHJhbnNsYXRlKHgsIHkpOwogICAgICAgICAgICBsZXQgY21hcCA9IGxvb2t1cENtYXAoZm9udC5jbWFwLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2x5cGhOYW1lTWFwW1N0YW5kYXJkRW5jb2RpbmdbYWNoYXJdXSkpOwogICAgICAgICAgICBjb21waWxlQ2hhclN0cmluZyhmb250LmdseXBoc1tjbWFwLmdseXBoSWRdLCBjbWRzLCBmb250LCBjbWFwLmdseXBoSWQpOwogICAgICAgICAgICBjbWRzLnJlc3RvcmUoKTsKICAgICAgICAgICAgY21hcCA9IGxvb2t1cENtYXAoZm9udC5jbWFwLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2x5cGhOYW1lTWFwW1N0YW5kYXJkRW5jb2RpbmdbYmNoYXJdXSkpOwogICAgICAgICAgICBjb21waWxlQ2hhclN0cmluZyhmb250LmdseXBoc1tjbWFwLmdseXBoSWRdLCBjbWRzLCBmb250LCBjbWFwLmdseXBoSWQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNhc2UgMTg6CiAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOToKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgaSArPSBzdGVtcyArIDcgPj4gMzsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyMDoKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgaSArPSBzdGVtcyArIDcgPj4gMzsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyMToKICAgICAgICAgIHkgKz0gc3RhY2sucG9wKCk7CiAgICAgICAgICB4ICs9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbW92ZVRvKHgsIHkpOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDIyOgogICAgICAgICAgeCArPSBzdGFjay5wb3AoKTsKICAgICAgICAgIG1vdmVUbyh4LCB5KTsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyMzoKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI0OgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgIGxpbmVUbyh4LCB5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjU6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gNikgewogICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjY6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikgewogICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHg7CiAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeCA9IHhiOwogICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjc6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikgewogICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YSA9IHk7CiAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeSA9IHliOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjg6CiAgICAgICAgICBzdGFjay5wdXNoKHJlYWRJbnQxNihjb2RlLCBpKSk7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI5OgogICAgICAgICAgbiA9IHN0YWNrLnBvcCgpICsgZm9udC5nc3VicnNCaWFzOwogICAgICAgICAgc3VickNvZGUgPSBmb250LmdzdWJyc1tuXTsKICAgICAgICAgIGlmIChzdWJyQ29kZSkgewogICAgICAgICAgICBwYXJzZShzdWJyQ29kZSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDMwOgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgeGEgPSB4OwogICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWEgPSB5OwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzMToKICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHlhID0geTsKICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4ID0geGIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHhhID0geDsKICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5ID0geWIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAodiA8IDMyKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgdW5rbm93biBvcGVyYXRvcjogJHt2fWApOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHYgPCAyNDcpIHsKICAgICAgICAgICAgc3RhY2sucHVzaCh2IC0gMTM5KTsKICAgICAgICAgIH0gZWxzZSBpZiAodiA8IDI1MSkgewogICAgICAgICAgICBzdGFjay5wdXNoKCh2IC0gMjQ3KSAqIDI1NiArIGNvZGVbaSsrXSArIDEwOCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHYgPCAyNTUpIHsKICAgICAgICAgICAgc3RhY2sucHVzaCgtKHYgLSAyNTEpICogMjU2IC0gY29kZVtpKytdIC0gMTA4KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goKGNvZGVbaV0gPDwgMjQgfCBjb2RlW2kgKyAxXSA8PCAxNiB8IGNvZGVbaSArIDJdIDw8IDggfCBjb2RlW2kgKyAzXSkgLyA2NTUzNik7CiAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChzdGFja0NsZWFuKSB7CiAgICAgICAgc3RhY2subGVuZ3RoID0gMDsKICAgICAgfQogICAgfQogIH0KICBwYXJzZShjaGFyU3RyaW5nQ29kZSk7Cn0KY29uc3QgTk9PUCA9ICIiOwpjbGFzcyBDb21tYW5kcyB7CiAgY21kcyA9IFtdOwogIHRyYW5zZm9ybVN0YWNrID0gW107CiAgY3VycmVudFRyYW5zZm9ybSA9IFsxLCAwLCAwLCAxLCAwLCAwXTsKICBhZGQoY21kLCBhcmdzKSB7CiAgICBpZiAoYXJncykgewogICAgICBjb25zdCBbYSwgYiwgYywgZCwgZSwgZl0gPSB0aGlzLmN1cnJlbnRUcmFuc2Zvcm07CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGFyZ3MubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICAgIGNvbnN0IHggPSBhcmdzW2ldOwogICAgICAgIGNvbnN0IHkgPSBhcmdzW2kgKyAxXTsKICAgICAgICBhcmdzW2ldID0gYSAqIHggKyBjICogeSArIGU7CiAgICAgICAgYXJnc1tpICsgMV0gPSBiICogeCArIGQgKiB5ICsgZjsKICAgICAgfQogICAgICB0aGlzLmNtZHMucHVzaChgJHtjbWR9JHthcmdzLmpvaW4oIiAiKX1gKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuY21kcy5wdXNoKGNtZCk7CiAgICB9CiAgfQogIHRyYW5zZm9ybSh0cmFuc2YpIHsKICAgIHRoaXMuY3VycmVudFRyYW5zZm9ybSA9IFV0aWwudHJhbnNmb3JtKHRoaXMuY3VycmVudFRyYW5zZm9ybSwgdHJhbnNmKTsKICB9CiAgdHJhbnNsYXRlKHgsIHkpIHsKICAgIHRoaXMudHJhbnNmb3JtKFsxLCAwLCAwLCAxLCB4LCB5XSk7CiAgfQogIHNhdmUoKSB7CiAgICB0aGlzLnRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy5jdXJyZW50VHJhbnNmb3JtLnNsaWNlKCkpOwogIH0KICByZXN0b3JlKCkgewogICAgdGhpcy5jdXJyZW50VHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm1TdGFjay5wb3AoKSB8fCBbMSwgMCwgMCwgMSwgMCwgMF07CiAgfQogIGdldFNWRygpIHsKICAgIHJldHVybiB0aGlzLmNtZHMuam9pbigiIik7CiAgfQp9CmNsYXNzIENvbXBpbGVkRm9udCB7CiAgY29uc3RydWN0b3IoZm9udE1hdHJpeCkgewogICAgdGhpcy5mb250TWF0cml4ID0gZm9udE1hdHJpeDsKICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB9CiAgZ2V0UGF0aEpzKHVuaWNvZGUpIHsKICAgIGNvbnN0IHsKICAgICAgY2hhckNvZGUsCiAgICAgIGdseXBoSWQKICAgIH0gPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7CiAgICBsZXQgZm4gPSB0aGlzLmNvbXBpbGVkR2x5cGhzW2dseXBoSWRdLAogICAgICBjb21waWxlRXg7CiAgICBpZiAoZm4gPT09IHVuZGVmaW5lZCkgewogICAgICB0cnkgewogICAgICAgIGZuID0gdGhpcy5jb21waWxlR2x5cGgodGhpcy5nbHlwaHNbZ2x5cGhJZF0sIGdseXBoSWQpOwogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIGZuID0gTk9PUDsKICAgICAgICBjb21waWxlRXggPSBleDsKICAgICAgfQogICAgICB0aGlzLmNvbXBpbGVkR2x5cGhzW2dseXBoSWRdID0gZm47CiAgICB9CiAgICB0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID8/PSBnbHlwaElkOwogICAgaWYgKGNvbXBpbGVFeCkgewogICAgICB0aHJvdyBjb21waWxlRXg7CiAgICB9CiAgICByZXR1cm4gZm47CiAgfQogIGNvbXBpbGVHbHlwaChjb2RlLCBnbHlwaElkKSB7CiAgICBpZiAoIWNvZGU/Lmxlbmd0aCB8fCBjb2RlWzBdID09PSAxNCkgewogICAgICByZXR1cm4gTk9PUDsKICAgIH0KICAgIGxldCBmb250TWF0cml4ID0gdGhpcy5mb250TWF0cml4OwogICAgaWYgKHRoaXMuaXNDRkZDSURGb250KSB7CiAgICAgIGNvbnN0IGZkSW5kZXggPSB0aGlzLmZkU2VsZWN0LmdldEZESW5kZXgoZ2x5cGhJZCk7CiAgICAgIGlmIChmZEluZGV4ID49IDAgJiYgZmRJbmRleCA8IHRoaXMuZmRBcnJheS5sZW5ndGgpIHsKICAgICAgICBjb25zdCBmb250RGljdCA9IHRoaXMuZmRBcnJheVtmZEluZGV4XTsKICAgICAgICBmb250TWF0cml4ID0gZm9udERpY3QuZ2V0QnlOYW1lKCJGb250TWF0cml4IikgfHwgRk9OVF9JREVOVElUWV9NQVRSSVg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigiSW52YWxpZCBmZCBpbmRleCBmb3IgZ2x5cGggaW5kZXguIik7CiAgICAgIH0KICAgIH0KICAgIGFzc2VydChpc051bWJlckFycmF5KGZvbnRNYXRyaXgsIDYpLCAiRXhwZWN0ZWQgYSB2YWxpZCBmb250TWF0cml4LiIpOwogICAgY29uc3QgY21kcyA9IG5ldyBDb21tYW5kcygpOwogICAgY21kcy50cmFuc2Zvcm0oZm9udE1hdHJpeC5zbGljZSgpKTsKICAgIHRoaXMuY29tcGlsZUdseXBoSW1wbChjb2RlLCBjbWRzLCBnbHlwaElkKTsKICAgIGNtZHMuYWRkKCJaIik7CiAgICByZXR1cm4gY21kcy5nZXRTVkcoKTsKICB9CiAgY29tcGlsZUdseXBoSW1wbCgpIHsKICAgIHVucmVhY2hhYmxlKCJDaGlsZHJlbiBjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcy4iKTsKICB9CiAgaGFzQnVpbHRQYXRoKHVuaWNvZGUpIHsKICAgIGNvbnN0IHsKICAgICAgY2hhckNvZGUsCiAgICAgIGdseXBoSWQKICAgIH0gPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7CiAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tnbHlwaElkXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gIT09IHVuZGVmaW5lZDsKICB9Cn0KY2xhc3MgVHJ1ZVR5cGVDb21waWxlZCBleHRlbmRzIENvbXBpbGVkRm9udCB7CiAgY29uc3RydWN0b3IoZ2x5cGhzLCBjbWFwLCBmb250TWF0cml4KSB7CiAgICBzdXBlcihmb250TWF0cml4IHx8IFswLjAwMDQ4OCwgMCwgMCwgMC4wMDA0ODgsIDAsIDBdKTsKICAgIHRoaXMuZ2x5cGhzID0gZ2x5cGhzOwogICAgdGhpcy5jbWFwID0gY21hcDsKICB9CiAgY29tcGlsZUdseXBoSW1wbChjb2RlLCBjbWRzKSB7CiAgICBjb21waWxlR2x5Zihjb2RlLCBjbWRzLCB0aGlzKTsKICB9Cn0KY2xhc3MgVHlwZTJDb21waWxlZCBleHRlbmRzIENvbXBpbGVkRm9udCB7CiAgY29uc3RydWN0b3IoY2ZmSW5mbywgY21hcCwgZm9udE1hdHJpeCkgewogICAgc3VwZXIoZm9udE1hdHJpeCB8fCBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXSk7CiAgICB0aGlzLmdseXBocyA9IGNmZkluZm8uZ2x5cGhzOwogICAgdGhpcy5nc3VicnMgPSBjZmZJbmZvLmdzdWJycyB8fCBbXTsKICAgIHRoaXMuc3VicnMgPSBjZmZJbmZvLnN1YnJzIHx8IFtdOwogICAgdGhpcy5jbWFwID0gY21hcDsKICAgIHRoaXMuZ2x5cGhOYW1lTWFwID0gZ2V0R2x5cGhzVW5pY29kZSgpOwogICAgdGhpcy5nc3VicnNCaWFzID0gZ2V0U3Vicm91dGluZUJpYXModGhpcy5nc3VicnMpOwogICAgdGhpcy5zdWJyc0JpYXMgPSBnZXRTdWJyb3V0aW5lQmlhcyh0aGlzLnN1YnJzKTsKICAgIHRoaXMuaXNDRkZDSURGb250ID0gY2ZmSW5mby5pc0NGRkNJREZvbnQ7CiAgICB0aGlzLmZkU2VsZWN0ID0gY2ZmSW5mby5mZFNlbGVjdDsKICAgIHRoaXMuZmRBcnJheSA9IGNmZkluZm8uZmRBcnJheTsKICB9CiAgY29tcGlsZUdseXBoSW1wbChjb2RlLCBjbWRzLCBnbHlwaElkKSB7CiAgICBjb21waWxlQ2hhclN0cmluZyhjb2RlLCBjbWRzLCB0aGlzLCBnbHlwaElkKTsKICB9Cn0KY2xhc3MgRm9udFJlbmRlcmVyRmFjdG9yeSB7CiAgc3RhdGljIGNyZWF0ZShmb250LCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZm9udC5kYXRhKTsKICAgIGxldCBjbWFwLCBnbHlmLCBsb2NhLCBjZmYsIGluZGV4VG9Mb2NGb3JtYXQsIHVuaXRzUGVyRW07CiAgICBjb25zdCBudW1UYWJsZXMgPSByZWFkVWludDE2KGRhdGEsIDQpOwogICAgZm9yIChsZXQgaSA9IDAsIHAgPSAxMjsgaSA8IG51bVRhYmxlczsgaSsrLCBwICs9IDE2KSB7CiAgICAgIGNvbnN0IHRhZyA9IGJ5dGVzVG9TdHJpbmcoZGF0YS5zdWJhcnJheShwLCBwICsgNCkpOwogICAgICBjb25zdCBvZmZzZXQgPSByZWFkVWludDMyKGRhdGEsIHAgKyA4KTsKICAgICAgY29uc3QgbGVuZ3RoID0gcmVhZFVpbnQzMihkYXRhLCBwICsgMTIpOwogICAgICBzd2l0Y2ggKHRhZykgewogICAgICAgIGNhc2UgImNtYXAiOgogICAgICAgICAgY21hcCA9IHBhcnNlQ21hcChkYXRhLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJnbHlmIjoKICAgICAgICAgIGdseWYgPSBkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxvY2EiOgogICAgICAgICAgbG9jYSA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiaGVhZCI6CiAgICAgICAgICB1bml0c1BlckVtID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQgKyAxOCk7CiAgICAgICAgICBpbmRleFRvTG9jRm9ybWF0ID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQgKyA1MCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJDRkYgIjoKICAgICAgICAgIGNmZiA9IHBhcnNlQ2ZmKGRhdGEsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoZ2x5ZikgewogICAgICBjb25zdCBmb250TWF0cml4ID0gIXVuaXRzUGVyRW0gPyBmb250LmZvbnRNYXRyaXggOiBbMSAvIHVuaXRzUGVyRW0sIDAsIDAsIDEgLyB1bml0c1BlckVtLCAwLCAwXTsKICAgICAgcmV0dXJuIG5ldyBUcnVlVHlwZUNvbXBpbGVkKHBhcnNlR2x5ZlRhYmxlKGdseWYsIGxvY2EsIGluZGV4VG9Mb2NGb3JtYXQpLCBjbWFwLCBmb250TWF0cml4KTsKICAgIH0KICAgIHJldHVybiBuZXcgVHlwZTJDb21waWxlZChjZmYsIGNtYXAsIGZvbnQuZm9udE1hdHJpeCk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9tZXRyaWNzLmpzCgpjb25zdCBnZXRNZXRyaWNzID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgdC5Db3VyaWVyID0gNjAwOwogIHRbIkNvdXJpZXItQm9sZCJdID0gNjAwOwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9IDYwMDsKICB0WyJDb3VyaWVyLU9ibGlxdWUiXSA9IDYwMDsKICB0LkhlbHZldGljYSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogICAgdC5zcGFjZSA9IDI3ODsKICAgIHQuZXhjbGFtID0gMjc4OwogICAgdC5xdW90ZWRibCA9IDM1NTsKICAgIHQubnVtYmVyc2lnbiA9IDU1NjsKICAgIHQuZG9sbGFyID0gNTU2OwogICAgdC5wZXJjZW50ID0gODg5OwogICAgdC5hbXBlcnNhbmQgPSA2Njc7CiAgICB0LnF1b3RlcmlnaHQgPSAyMjI7CiAgICB0LnBhcmVubGVmdCA9IDMzMzsKICAgIHQucGFyZW5yaWdodCA9IDMzMzsKICAgIHQuYXN0ZXJpc2sgPSAzODk7CiAgICB0LnBsdXMgPSA1ODQ7CiAgICB0LmNvbW1hID0gMjc4OwogICAgdC5oeXBoZW4gPSAzMzM7CiAgICB0LnBlcmlvZCA9IDI3ODsKICAgIHQuc2xhc2ggPSAyNzg7CiAgICB0Lnplcm8gPSA1NTY7CiAgICB0Lm9uZSA9IDU1NjsKICAgIHQudHdvID0gNTU2OwogICAgdC50aHJlZSA9IDU1NjsKICAgIHQuZm91ciA9IDU1NjsKICAgIHQuZml2ZSA9IDU1NjsKICAgIHQuc2l4ID0gNTU2OwogICAgdC5zZXZlbiA9IDU1NjsKICAgIHQuZWlnaHQgPSA1NTY7CiAgICB0Lm5pbmUgPSA1NTY7CiAgICB0LmNvbG9uID0gMjc4OwogICAgdC5zZW1pY29sb24gPSAyNzg7CiAgICB0Lmxlc3MgPSA1ODQ7CiAgICB0LmVxdWFsID0gNTg0OwogICAgdC5ncmVhdGVyID0gNTg0OwogICAgdC5xdWVzdGlvbiA9IDU1NjsKICAgIHQuYXQgPSAxMDE1OwogICAgdC5BID0gNjY3OwogICAgdC5CID0gNjY3OwogICAgdC5DID0gNzIyOwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjY3OwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzc4OwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMjc4OwogICAgdC5KID0gNTAwOwogICAgdC5LID0gNjY3OwogICAgdC5MID0gNTU2OwogICAgdC5NID0gODMzOwogICAgdC5OID0gNzIyOwogICAgdC5PID0gNzc4OwogICAgdC5QID0gNjY3OwogICAgdC5RID0gNzc4OwogICAgdC5SID0gNzIyOwogICAgdC5TID0gNjY3OwogICAgdC5UID0gNjExOwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjY3OwogICAgdC5XID0gOTQ0OwogICAgdC5YID0gNjY3OwogICAgdC5ZID0gNjY3OwogICAgdC5aID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDI3ODsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAyNzg7CiAgICB0LmFzY2lpY2lyY3VtID0gNDY5OwogICAgdC51bmRlcnNjb3JlID0gNTU2OwogICAgdC5xdW90ZWxlZnQgPSAyMjI7CiAgICB0LmEgPSA1NTY7CiAgICB0LmIgPSA1NTY7CiAgICB0LmMgPSA1MDA7CiAgICB0LmQgPSA1NTY7CiAgICB0LmUgPSA1NTY7CiAgICB0LmYgPSAyNzg7CiAgICB0LmcgPSA1NTY7CiAgICB0LmggPSA1NTY7CiAgICB0LmkgPSAyMjI7CiAgICB0LmogPSAyMjI7CiAgICB0LmsgPSA1MDA7CiAgICB0LmwgPSAyMjI7CiAgICB0Lm0gPSA4MzM7CiAgICB0Lm4gPSA1NTY7CiAgICB0Lm8gPSA1NTY7CiAgICB0LnAgPSA1NTY7CiAgICB0LnEgPSA1NTY7CiAgICB0LnIgPSAzMzM7CiAgICB0LnMgPSA1MDA7CiAgICB0LnQgPSAyNzg7CiAgICB0LnUgPSA1NTY7CiAgICB0LnYgPSA1MDA7CiAgICB0LncgPSA3MjI7CiAgICB0LnggPSA1MDA7CiAgICB0LnkgPSA1MDA7CiAgICB0LnogPSA1MDA7CiAgICB0LmJyYWNlbGVmdCA9IDMzNDsKICAgIHQuYmFyID0gMjYwOwogICAgdC5icmFjZXJpZ2h0ID0gMzM0OwogICAgdC5hc2NpaXRpbGRlID0gNTg0OwogICAgdC5leGNsYW1kb3duID0gMzMzOwogICAgdC5jZW50ID0gNTU2OwogICAgdC5zdGVybGluZyA9IDU1NjsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDU1NjsKICAgIHQuZmxvcmluID0gNTU2OwogICAgdC5zZWN0aW9uID0gNTU2OwogICAgdC5jdXJyZW5jeSA9IDU1NjsKICAgIHQucXVvdGVzaW5nbGUgPSAxOTE7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTAwOwogICAgdC5mbCA9IDUwMDsKICAgIHQuZW5kYXNoID0gNTU2OwogICAgdC5kYWdnZXIgPSA1NTY7CiAgICB0LmRhZ2dlcmRibCA9IDU1NjsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNzg7CiAgICB0LnBhcmFncmFwaCA9IDUzNzsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDIyMjsKICAgIHQucXVvdGVkYmxiYXNlID0gMzMzOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gMzMzOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDU1NjsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDYxMTsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDEwMDA7CiAgICB0Lm9yZGZlbWluaW5lID0gMzcwOwogICAgdC5Mc2xhc2ggPSA1NTY7CiAgICB0Lk9zbGFzaCA9IDc3ODsKICAgIHQuT0UgPSAxMDAwOwogICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7CiAgICB0LmFlID0gODg5OwogICAgdC5kb3RsZXNzaSA9IDI3ODsKICAgIHQubHNsYXNoID0gMjIyOwogICAgdC5vc2xhc2ggPSA2MTE7CiAgICB0Lm9lID0gOTQ0OwogICAgdC5nZXJtYW5kYmxzID0gNjExOwogICAgdC5JZGllcmVzaXMgPSAyNzg7CiAgICB0LmVhY3V0ZSA9IDU1NjsKICAgIHQuYWJyZXZlID0gNTU2OwogICAgdC51aHVuZ2FydW1sYXV0ID0gNTU2OwogICAgdC5lY2Fyb24gPSA1NTY7CiAgICB0LllkaWVyZXNpcyA9IDY2NzsKICAgIHQuZGl2aWRlID0gNTg0OwogICAgdC5ZYWN1dGUgPSA2Njc7CiAgICB0LkFjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hYWN1dGUgPSA1NTY7CiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOwogICAgdC55YWN1dGUgPSA1MDA7CiAgICB0LnNjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LlVyaW5nID0gNzIyOwogICAgdC5VZGllcmVzaXMgPSA3MjI7CiAgICB0LmFvZ29uZWsgPSA1NTY7CiAgICB0LlVhY3V0ZSA9IDcyMjsKICAgIHQudW9nb25layA9IDU1NjsKICAgIHQuRWRpZXJlc2lzID0gNjY3OwogICAgdC5EY3JvYXQgPSA3MjI7CiAgICB0LmNvbW1hYWNjZW50ID0gMjUwOwogICAgdC5jb3B5cmlnaHQgPSA3Mzc7CiAgICB0LkVtYWNyb24gPSA2Njc7CiAgICB0LmNjYXJvbiA9IDUwMDsKICAgIHQuYXJpbmcgPSA1NTY7CiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKICAgIHQubGFjdXRlID0gMjIyOwogICAgdC5hZ3JhdmUgPSA1NTY7CiAgICB0LlRjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuQ2FjdXRlID0gNzIyOwogICAgdC5hdGlsZGUgPSA1NTY7CiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CiAgICB0LnNjYXJvbiA9IDUwMDsKICAgIHQuc2NlZGlsbGEgPSA1MDA7CiAgICB0LmlhY3V0ZSA9IDI3ODsKICAgIHQubG96ZW5nZSA9IDQ3MTsKICAgIHQuUmNhcm9uID0gNzIyOwogICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LnVjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuQW1hY3JvbiA9IDY2NzsKICAgIHQucmNhcm9uID0gMzMzOwogICAgdC5jY2VkaWxsYSA9IDUwMDsKICAgIHQuWmRvdGFjY2VudCA9IDYxMTsKICAgIHQuVGhvcm4gPSA2Njc7CiAgICB0Lk9tYWNyb24gPSA3Nzg7CiAgICB0LlJhY3V0ZSA9IDcyMjsKICAgIHQuU2FjdXRlID0gNjY3OwogICAgdC5kY2Fyb24gPSA2NDM7CiAgICB0LlVtYWNyb24gPSA3MjI7CiAgICB0LnVyaW5nID0gNTU2OwogICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOwogICAgdC5PZ3JhdmUgPSA3Nzg7CiAgICB0LkFncmF2ZSA9IDY2NzsKICAgIHQuQWJyZXZlID0gNjY3OwogICAgdC5tdWx0aXBseSA9IDU4NDsKICAgIHQudWFjdXRlID0gNTU2OwogICAgdC5UY2Fyb24gPSA2MTE7CiAgICB0LnBhcnRpYWxkaWZmID0gNDc2OwogICAgdC55ZGllcmVzaXMgPSA1MDA7CiAgICB0Lk5hY3V0ZSA9IDcyMjsKICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hZGllcmVzaXMgPSA1NTY7CiAgICB0LmVkaWVyZXNpcyA9IDU1NjsKICAgIHQuY2FjdXRlID0gNTAwOwogICAgdC5uYWN1dGUgPSA1NTY7CiAgICB0LnVtYWNyb24gPSA1NTY7CiAgICB0Lk5jYXJvbiA9IDcyMjsKICAgIHQuSWFjdXRlID0gMjc4OwogICAgdC5wbHVzbWludXMgPSA1ODQ7CiAgICB0LmJyb2tlbmJhciA9IDI2MDsKICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKICAgIHQuR2JyZXZlID0gNzc4OwogICAgdC5JZG90YWNjZW50ID0gMjc4OwogICAgdC5zdW1tYXRpb24gPSA2MDA7CiAgICB0LkVncmF2ZSA9IDY2NzsKICAgIHQucmFjdXRlID0gMzMzOwogICAgdC5vbWFjcm9uID0gNTU2OwogICAgdC5aYWN1dGUgPSA2MTE7CiAgICB0LlpjYXJvbiA9IDYxMTsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5FdGggPSA3MjI7CiAgICB0LkNjZWRpbGxhID0gNzIyOwogICAgdC5sY29tbWFhY2NlbnQgPSAyMjI7CiAgICB0LnRjYXJvbiA9IDMxNzsKICAgIHQuZW9nb25layA9IDU1NjsKICAgIHQuVW9nb25layA9IDcyMjsKICAgIHQuQWFjdXRlID0gNjY3OwogICAgdC5BZGllcmVzaXMgPSA2Njc7CiAgICB0LmVncmF2ZSA9IDU1NjsKICAgIHQuemFjdXRlID0gNTAwOwogICAgdC5pb2dvbmVrID0gMjIyOwogICAgdC5PYWN1dGUgPSA3Nzg7CiAgICB0Lm9hY3V0ZSA9IDU1NjsKICAgIHQuYW1hY3JvbiA9IDU1NjsKICAgIHQuc2FjdXRlID0gNTAwOwogICAgdC5pZGllcmVzaXMgPSAyNzg7CiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OwogICAgdC5VZ3JhdmUgPSA3MjI7CiAgICB0LkRlbHRhID0gNjEyOwogICAgdC50aG9ybiA9IDU1NjsKICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKICAgIHQubXUgPSA1NTY7CiAgICB0LmlncmF2ZSA9IDI3ODsKICAgIHQub2h1bmdhcnVtbGF1dCA9IDU1NjsKICAgIHQuRW9nb25layA9IDY2NzsKICAgIHQuZGNyb2F0ID0gNTU2OwogICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0OwogICAgdC5TY2VkaWxsYSA9IDY2NzsKICAgIHQubGNhcm9uID0gMjk5OwogICAgdC5LY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0LkxhY3V0ZSA9IDU1NjsKICAgIHQudHJhZGVtYXJrID0gMTAwMDsKICAgIHQuZWRvdGFjY2VudCA9IDU1NjsKICAgIHQuSWdyYXZlID0gMjc4OwogICAgdC5JbWFjcm9uID0gMjc4OwogICAgdC5MY2Fyb24gPSA1NTY7CiAgICB0Lm9uZWhhbGYgPSA4MzQ7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQub2NpcmN1bWZsZXggPSA1NTY7CiAgICB0Lm50aWxkZSA9IDU1NjsKICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuRWFjdXRlID0gNjY3OwogICAgdC5lbWFjcm9uID0gNTU2OwogICAgdC5nYnJldmUgPSA1NTY7CiAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7CiAgICB0LlNjYXJvbiA9IDY2NzsKICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OwogICAgdC5kZWdyZWUgPSA0MDA7CiAgICB0Lm9ncmF2ZSA9IDU1NjsKICAgIHQuQ2Nhcm9uID0gNzIyOwogICAgdC51Z3JhdmUgPSA1NTY7CiAgICB0LnJhZGljYWwgPSA0NTM7CiAgICB0LkRjYXJvbiA9IDcyMjsKICAgIHQucmNvbW1hYWNjZW50ID0gMzMzOwogICAgdC5OdGlsZGUgPSA3MjI7CiAgICB0Lm90aWxkZSA9IDU1NjsKICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0LkF0aWxkZSA9IDY2NzsKICAgIHQuQW9nb25layA9IDY2NzsKICAgIHQuQXJpbmcgPSA2Njc7CiAgICB0Lk90aWxkZSA9IDc3ODsKICAgIHQuemRvdGFjY2VudCA9IDUwMDsKICAgIHQuRWNhcm9uID0gNjY3OwogICAgdC5Jb2dvbmVrID0gMjc4OwogICAgdC5rY29tbWFhY2NlbnQgPSA1MDA7CiAgICB0Lm1pbnVzID0gNTg0OwogICAgdC5JY2lyY3VtZmxleCA9IDI3ODsKICAgIHQubmNhcm9uID0gNTU2OwogICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7CiAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7CiAgICB0Lm9kaWVyZXNpcyA9IDU1NjsKICAgIHQudWRpZXJlc2lzID0gNTU2OwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZ2NvbW1hYWNjZW50ID0gNTU2OwogICAgdC5ldGggPSA1NTY7CiAgICB0LnpjYXJvbiA9IDUwMDsKICAgIHQubmNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKICAgIHQuaW1hY3JvbiA9IDI3ODsKICAgIHQuRXVybyA9IDU1NjsKICB9KTsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjc4OwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnF1b3RlZGJsID0gNDc0OwogICAgdC5udW1iZXJzaWduID0gNTU2OwogICAgdC5kb2xsYXIgPSA1NTY7CiAgICB0LnBlcmNlbnQgPSA4ODk7CiAgICB0LmFtcGVyc2FuZCA9IDcyMjsKICAgIHQucXVvdGVyaWdodCA9IDI3ODsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDM4OTsKICAgIHQucGx1cyA9IDU4NDsKICAgIHQuY29tbWEgPSAyNzg7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjc4OwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDU1NjsKICAgIHQub25lID0gNTU2OwogICAgdC50d28gPSA1NTY7CiAgICB0LnRocmVlID0gNTU2OwogICAgdC5mb3VyID0gNTU2OwogICAgdC5maXZlID0gNTU2OwogICAgdC5zaXggPSA1NTY7CiAgICB0LnNldmVuID0gNTU2OwogICAgdC5laWdodCA9IDU1NjsKICAgIHQubmluZSA9IDU1NjsKICAgIHQuY29sb24gPSAzMzM7CiAgICB0LnNlbWljb2xvbiA9IDMzMzsKICAgIHQubGVzcyA9IDU4NDsKICAgIHQuZXF1YWwgPSA1ODQ7CiAgICB0LmdyZWF0ZXIgPSA1ODQ7CiAgICB0LnF1ZXN0aW9uID0gNjExOwogICAgdC5hdCA9IDk3NTsKICAgIHQuQSA9IDcyMjsKICAgIHQuQiA9IDcyMjsKICAgIHQuQyA9IDcyMjsKICAgIHQuRCA9IDcyMjsKICAgIHQuRSA9IDY2NzsKICAgIHQuRiA9IDYxMTsKICAgIHQuRyA9IDc3ODsKICAgIHQuSCA9IDcyMjsKICAgIHQuSSA9IDI3ODsKICAgIHQuSiA9IDU1NjsKICAgIHQuSyA9IDcyMjsKICAgIHQuTCA9IDYxMTsKICAgIHQuTSA9IDgzMzsKICAgIHQuTiA9IDcyMjsKICAgIHQuTyA9IDc3ODsKICAgIHQuUCA9IDY2NzsKICAgIHQuUSA9IDc3ODsKICAgIHQuUiA9IDcyMjsKICAgIHQuUyA9IDY2NzsKICAgIHQuVCA9IDYxMTsKICAgIHQuVSA9IDcyMjsKICAgIHQuViA9IDY2NzsKICAgIHQuVyA9IDk0NDsKICAgIHQuWCA9IDY2NzsKICAgIHQuWSA9IDY2NzsKICAgIHQuWiA9IDYxMTsKICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CiAgICB0LmJhY2tzbGFzaCA9IDI3ODsKICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOwogICAgdC5hc2NpaWNpcmN1bSA9IDU4NDsKICAgIHQudW5kZXJzY29yZSA9IDU1NjsKICAgIHQucXVvdGVsZWZ0ID0gMjc4OwogICAgdC5hID0gNTU2OwogICAgdC5iID0gNjExOwogICAgdC5jID0gNTU2OwogICAgdC5kID0gNjExOwogICAgdC5lID0gNTU2OwogICAgdC5mID0gMzMzOwogICAgdC5nID0gNjExOwogICAgdC5oID0gNjExOwogICAgdC5pID0gMjc4OwogICAgdC5qID0gMjc4OwogICAgdC5rID0gNTU2OwogICAgdC5sID0gMjc4OwogICAgdC5tID0gODg5OwogICAgdC5uID0gNjExOwogICAgdC5vID0gNjExOwogICAgdC5wID0gNjExOwogICAgdC5xID0gNjExOwogICAgdC5yID0gMzg5OwogICAgdC5zID0gNTU2OwogICAgdC50ID0gMzMzOwogICAgdC51ID0gNjExOwogICAgdC52ID0gNTU2OwogICAgdC53ID0gNzc4OwogICAgdC54ID0gNTU2OwogICAgdC55ID0gNTU2OwogICAgdC56ID0gNTAwOwogICAgdC5icmFjZWxlZnQgPSAzODk7CiAgICB0LmJhciA9IDI4MDsKICAgIHQuYnJhY2VyaWdodCA9IDM4OTsKICAgIHQuYXNjaWl0aWxkZSA9IDU4NDsKICAgIHQuZXhjbGFtZG93biA9IDMzMzsKICAgIHQuY2VudCA9IDU1NjsKICAgIHQuc3RlcmxpbmcgPSA1NTY7CiAgICB0LmZyYWN0aW9uID0gMTY3OwogICAgdC55ZW4gPSA1NTY7CiAgICB0LmZsb3JpbiA9IDU1NjsKICAgIHQuc2VjdGlvbiA9IDU1NjsKICAgIHQuY3VycmVuY3kgPSA1NTY7CiAgICB0LnF1b3Rlc2luZ2xlID0gMjM4OwogICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7CiAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1NTY7CiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOwogICAgdC5maSA9IDYxMTsKICAgIHQuZmwgPSA2MTE7CiAgICB0LmVuZGFzaCA9IDU1NjsKICAgIHQuZGFnZ2VyID0gNTU2OwogICAgdC5kYWdnZXJkYmwgPSA1NTY7CiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjc4OwogICAgdC5wYXJhZ3JhcGggPSA1NTY7CiAgICB0LmJ1bGxldCA9IDM1MDsKICAgIHQucXVvdGVzaW5nbGJhc2UgPSAyNzg7CiAgICB0LnF1b3RlZGJsYmFzZSA9IDUwMDsKICAgIHQucXVvdGVkYmxyaWdodCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1NTY7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOwogICAgdC5xdWVzdGlvbmRvd24gPSA2MTE7CiAgICB0LmdyYXZlID0gMzMzOwogICAgdC5hY3V0ZSA9IDMzMzsKICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKICAgIHQudGlsZGUgPSAzMzM7CiAgICB0Lm1hY3JvbiA9IDMzMzsKICAgIHQuYnJldmUgPSAzMzM7CiAgICB0LmRvdGFjY2VudCA9IDMzMzsKICAgIHQuZGllcmVzaXMgPSAzMzM7CiAgICB0LnJpbmcgPSAzMzM7CiAgICB0LmNlZGlsbGEgPSAzMzM7CiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKICAgIHQub2dvbmVrID0gMzMzOwogICAgdC5jYXJvbiA9IDMzMzsKICAgIHQuZW1kYXNoID0gMTAwMDsKICAgIHQuQUUgPSAxMDAwOwogICAgdC5vcmRmZW1pbmluZSA9IDM3MDsKICAgIHQuTHNsYXNoID0gNjExOwogICAgdC5Pc2xhc2ggPSA3Nzg7CiAgICB0Lk9FID0gMTAwMDsKICAgIHQub3JkbWFzY3VsaW5lID0gMzY1OwogICAgdC5hZSA9IDg4OTsKICAgIHQuZG90bGVzc2kgPSAyNzg7CiAgICB0LmxzbGFzaCA9IDI3ODsKICAgIHQub3NsYXNoID0gNjExOwogICAgdC5vZSA9IDk0NDsKICAgIHQuZ2VybWFuZGJscyA9IDYxMTsKICAgIHQuSWRpZXJlc2lzID0gMjc4OwogICAgdC5lYWN1dGUgPSA1NTY7CiAgICB0LmFicmV2ZSA9IDU1NjsKICAgIHQudWh1bmdhcnVtbGF1dCA9IDYxMTsKICAgIHQuZWNhcm9uID0gNTU2OwogICAgdC5ZZGllcmVzaXMgPSA2Njc7CiAgICB0LmRpdmlkZSA9IDU4NDsKICAgIHQuWWFjdXRlID0gNjY3OwogICAgdC5BY2lyY3VtZmxleCA9IDcyMjsKICAgIHQuYWFjdXRlID0gNTU2OwogICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKICAgIHQueWFjdXRlID0gNTU2OwogICAgdC5zY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0LmVjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5VcmluZyA9IDcyMjsKICAgIHQuVWRpZXJlc2lzID0gNzIyOwogICAgdC5hb2dvbmVrID0gNTU2OwogICAgdC5VYWN1dGUgPSA3MjI7CiAgICB0LnVvZ29uZWsgPSA2MTE7CiAgICB0LkVkaWVyZXNpcyA9IDY2NzsKICAgIHQuRGNyb2F0ID0gNzIyOwogICAgdC5jb21tYWFjY2VudCA9IDI1MDsKICAgIHQuY29weXJpZ2h0ID0gNzM3OwogICAgdC5FbWFjcm9uID0gNjY3OwogICAgdC5jY2Fyb24gPSA1NTY7CiAgICB0LmFyaW5nID0gNTU2OwogICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LmxhY3V0ZSA9IDI3ODsKICAgIHQuYWdyYXZlID0gNTU2OwogICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkNhY3V0ZSA9IDcyMjsKICAgIHQuYXRpbGRlID0gNTU2OwogICAgdC5FZG90YWNjZW50ID0gNjY3OwogICAgdC5zY2Fyb24gPSA1NTY7CiAgICB0LnNjZWRpbGxhID0gNTU2OwogICAgdC5pYWN1dGUgPSAyNzg7CiAgICB0LmxvemVuZ2UgPSA0OTQ7CiAgICB0LlJjYXJvbiA9IDcyMjsKICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4OwogICAgdC51Y2lyY3VtZmxleCA9IDYxMTsKICAgIHQuYWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LkFtYWNyb24gPSA3MjI7CiAgICB0LnJjYXJvbiA9IDM4OTsKICAgIHQuY2NlZGlsbGEgPSA1NTY7CiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CiAgICB0LlRob3JuID0gNjY3OwogICAgdC5PbWFjcm9uID0gNzc4OwogICAgdC5SYWN1dGUgPSA3MjI7CiAgICB0LlNhY3V0ZSA9IDY2NzsKICAgIHQuZGNhcm9uID0gNzQzOwogICAgdC5VbWFjcm9uID0gNzIyOwogICAgdC51cmluZyA9IDYxMTsKICAgIHQudGhyZWVzdXBlcmlvciA9IDMzMzsKICAgIHQuT2dyYXZlID0gNzc4OwogICAgdC5BZ3JhdmUgPSA3MjI7CiAgICB0LkFicmV2ZSA9IDcyMjsKICAgIHQubXVsdGlwbHkgPSA1ODQ7CiAgICB0LnVhY3V0ZSA9IDYxMTsKICAgIHQuVGNhcm9uID0gNjExOwogICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKICAgIHQueWRpZXJlc2lzID0gNTU2OwogICAgdC5OYWN1dGUgPSA3MjI7CiAgICB0LmljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWRpZXJlc2lzID0gNTU2OwogICAgdC5lZGllcmVzaXMgPSA1NTY7CiAgICB0LmNhY3V0ZSA9IDU1NjsKICAgIHQubmFjdXRlID0gNjExOwogICAgdC51bWFjcm9uID0gNjExOwogICAgdC5OY2Fyb24gPSA3MjI7CiAgICB0LklhY3V0ZSA9IDI3ODsKICAgIHQucGx1c21pbnVzID0gNTg0OwogICAgdC5icm9rZW5iYXIgPSAyODA7CiAgICB0LnJlZ2lzdGVyZWQgPSA3Mzc7CiAgICB0LkdicmV2ZSA9IDc3ODsKICAgIHQuSWRvdGFjY2VudCA9IDI3ODsKICAgIHQuc3VtbWF0aW9uID0gNjAwOwogICAgdC5FZ3JhdmUgPSA2Njc7CiAgICB0LnJhY3V0ZSA9IDM4OTsKICAgIHQub21hY3JvbiA9IDYxMTsKICAgIHQuWmFjdXRlID0gNjExOwogICAgdC5aY2Fyb24gPSA2MTE7CiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKICAgIHQuRXRoID0gNzIyOwogICAgdC5DY2VkaWxsYSA9IDcyMjsKICAgIHQubGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC50Y2Fyb24gPSAzODk7CiAgICB0LmVvZ29uZWsgPSA1NTY7CiAgICB0LlVvZ29uZWsgPSA3MjI7CiAgICB0LkFhY3V0ZSA9IDcyMjsKICAgIHQuQWRpZXJlc2lzID0gNzIyOwogICAgdC5lZ3JhdmUgPSA1NTY7CiAgICB0LnphY3V0ZSA9IDUwMDsKICAgIHQuaW9nb25layA9IDI3ODsKICAgIHQuT2FjdXRlID0gNzc4OwogICAgdC5vYWN1dGUgPSA2MTE7CiAgICB0LmFtYWNyb24gPSA1NTY7CiAgICB0LnNhY3V0ZSA9IDU1NjsKICAgIHQuaWRpZXJlc2lzID0gMjc4OwogICAgdC5PY2lyY3VtZmxleCA9IDc3ODsKICAgIHQuVWdyYXZlID0gNzIyOwogICAgdC5EZWx0YSA9IDYxMjsKICAgIHQudGhvcm4gPSA2MTE7CiAgICB0LnR3b3N1cGVyaW9yID0gMzMzOwogICAgdC5PZGllcmVzaXMgPSA3Nzg7CiAgICB0Lm11ID0gNjExOwogICAgdC5pZ3JhdmUgPSAyNzg7CiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA2MTE7CiAgICB0LkVvZ29uZWsgPSA2Njc7CiAgICB0LmRjcm9hdCA9IDYxMTsKICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDsKICAgIHQuU2NlZGlsbGEgPSA2Njc7CiAgICB0LmxjYXJvbiA9IDQwMDsKICAgIHQuS2NvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MYWN1dGUgPSA2MTE7CiAgICB0LnRyYWRlbWFyayA9IDEwMDA7CiAgICB0LmVkb3RhY2NlbnQgPSA1NTY7CiAgICB0LklncmF2ZSA9IDI3ODsKICAgIHQuSW1hY3JvbiA9IDI3ODsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gODM0OwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNjExOwogICAgdC5udGlsZGUgPSA2MTE7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDY2NzsKICAgIHQuZW1hY3JvbiA9IDU1NjsKICAgIHQuZ2JyZXZlID0gNjExOwogICAgdC5vbmVxdWFydGVyID0gODM0OwogICAgdC5TY2Fyb24gPSA2Njc7CiAgICB0LlNjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA2MTE7CiAgICB0LkNjYXJvbiA9IDcyMjsKICAgIHQudWdyYXZlID0gNjExOwogICAgdC5yYWRpY2FsID0gNTQ5OwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA2MTE7CiAgICB0LlJjb21tYWFjY2VudCA9IDcyMjsKICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5BdGlsZGUgPSA3MjI7CiAgICB0LkFvZ29uZWsgPSA3MjI7CiAgICB0LkFyaW5nID0gNzIyOwogICAgdC5PdGlsZGUgPSA3Nzg7CiAgICB0Lnpkb3RhY2NlbnQgPSA1MDA7CiAgICB0LkVjYXJvbiA9IDY2NzsKICAgIHQuSW9nb25layA9IDI3ODsKICAgIHQua2NvbW1hYWNjZW50ID0gNTU2OwogICAgdC5taW51cyA9IDU4NDsKICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7CiAgICB0Lm5jYXJvbiA9IDYxMTsKICAgIHQudGNvbW1hYWNjZW50ID0gMzMzOwogICAgdC5sb2dpY2Fsbm90ID0gNTg0OwogICAgdC5vZGllcmVzaXMgPSA2MTE7CiAgICB0LnVkaWVyZXNpcyA9IDYxMTsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuZXRoID0gNjExOwogICAgdC56Y2Fyb24gPSA1MDA7CiAgICB0Lm5jb21tYWFjY2VudCA9IDYxMTsKICAgIHQub25lc3VwZXJpb3IgPSAzMzM7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1NTY7CiAgfSk7CiAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNzg7CiAgICB0LmV4Y2xhbSA9IDMzMzsKICAgIHQucXVvdGVkYmwgPSA0NzQ7CiAgICB0Lm51bWJlcnNpZ24gPSA1NTY7CiAgICB0LmRvbGxhciA9IDU1NjsKICAgIHQucGVyY2VudCA9IDg4OTsKICAgIHQuYW1wZXJzYW5kID0gNzIyOwogICAgdC5xdW90ZXJpZ2h0ID0gMjc4OwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gMzg5OwogICAgdC5wbHVzID0gNTg0OwogICAgdC5jb21tYSA9IDI3ODsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNzg7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTU2OwogICAgdC5vbmUgPSA1NTY7CiAgICB0LnR3byA9IDU1NjsKICAgIHQudGhyZWUgPSA1NTY7CiAgICB0LmZvdXIgPSA1NTY7CiAgICB0LmZpdmUgPSA1NTY7CiAgICB0LnNpeCA9IDU1NjsKICAgIHQuc2V2ZW4gPSA1NTY7CiAgICB0LmVpZ2h0ID0gNTU2OwogICAgdC5uaW5lID0gNTU2OwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNTg0OwogICAgdC5lcXVhbCA9IDU4NDsKICAgIHQuZ3JlYXRlciA9IDU4NDsKICAgIHQucXVlc3Rpb24gPSA2MTE7CiAgICB0LmF0ID0gOTc1OwogICAgdC5BID0gNzIyOwogICAgdC5CID0gNzIyOwogICAgdC5DID0gNzIyOwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjY3OwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzc4OwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMjc4OwogICAgdC5KID0gNTU2OwogICAgdC5LID0gNzIyOwogICAgdC5MID0gNjExOwogICAgdC5NID0gODMzOwogICAgdC5OID0gNzIyOwogICAgdC5PID0gNzc4OwogICAgdC5QID0gNjY3OwogICAgdC5RID0gNzc4OwogICAgdC5SID0gNzIyOwogICAgdC5TID0gNjY3OwogICAgdC5UID0gNjExOwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjY3OwogICAgdC5XID0gOTQ0OwogICAgdC5YID0gNjY3OwogICAgdC5ZID0gNjY3OwogICAgdC5aID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LmFzY2lpY2lyY3VtID0gNTg0OwogICAgdC51bmRlcnNjb3JlID0gNTU2OwogICAgdC5xdW90ZWxlZnQgPSAyNzg7CiAgICB0LmEgPSA1NTY7CiAgICB0LmIgPSA2MTE7CiAgICB0LmMgPSA1NTY7CiAgICB0LmQgPSA2MTE7CiAgICB0LmUgPSA1NTY7CiAgICB0LmYgPSAzMzM7CiAgICB0LmcgPSA2MTE7CiAgICB0LmggPSA2MTE7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA1NTY7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA4ODk7CiAgICB0Lm4gPSA2MTE7CiAgICB0Lm8gPSA2MTE7CiAgICB0LnAgPSA2MTE7CiAgICB0LnEgPSA2MTE7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSA1NTY7CiAgICB0LnQgPSAzMzM7CiAgICB0LnUgPSA2MTE7CiAgICB0LnYgPSA1NTY7CiAgICB0LncgPSA3Nzg7CiAgICB0LnggPSA1NTY7CiAgICB0LnkgPSA1NTY7CiAgICB0LnogPSA1MDA7CiAgICB0LmJyYWNlbGVmdCA9IDM4OTsKICAgIHQuYmFyID0gMjgwOwogICAgdC5icmFjZXJpZ2h0ID0gMzg5OwogICAgdC5hc2NpaXRpbGRlID0gNTg0OwogICAgdC5leGNsYW1kb3duID0gMzMzOwogICAgdC5jZW50ID0gNTU2OwogICAgdC5zdGVybGluZyA9IDU1NjsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDU1NjsKICAgIHQuZmxvcmluID0gNTU2OwogICAgdC5zZWN0aW9uID0gNTU2OwogICAgdC5jdXJyZW5jeSA9IDU1NjsKICAgIHQucXVvdGVzaW5nbGUgPSAyMzg7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNjExOwogICAgdC5mbCA9IDYxMTsKICAgIHQuZW5kYXNoID0gNTU2OwogICAgdC5kYWdnZXIgPSA1NTY7CiAgICB0LmRhZ2dlcmRibCA9IDU1NjsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNzg7CiAgICB0LnBhcmFncmFwaCA9IDU1NjsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDI3ODsKICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDU1NjsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDYxMTsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDEwMDA7CiAgICB0Lm9yZGZlbWluaW5lID0gMzcwOwogICAgdC5Mc2xhc2ggPSA2MTE7CiAgICB0Lk9zbGFzaCA9IDc3ODsKICAgIHQuT0UgPSAxMDAwOwogICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7CiAgICB0LmFlID0gODg5OwogICAgdC5kb3RsZXNzaSA9IDI3ODsKICAgIHQubHNsYXNoID0gMjc4OwogICAgdC5vc2xhc2ggPSA2MTE7CiAgICB0Lm9lID0gOTQ0OwogICAgdC5nZXJtYW5kYmxzID0gNjExOwogICAgdC5JZGllcmVzaXMgPSAyNzg7CiAgICB0LmVhY3V0ZSA9IDU1NjsKICAgIHQuYWJyZXZlID0gNTU2OwogICAgdC51aHVuZ2FydW1sYXV0ID0gNjExOwogICAgdC5lY2Fyb24gPSA1NTY7CiAgICB0LllkaWVyZXNpcyA9IDY2NzsKICAgIHQuZGl2aWRlID0gNTg0OwogICAgdC5ZYWN1dGUgPSA2Njc7CiAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOwogICAgdC5hYWN1dGUgPSA1NTY7CiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOwogICAgdC55YWN1dGUgPSA1NTY7CiAgICB0LnNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LlVyaW5nID0gNzIyOwogICAgdC5VZGllcmVzaXMgPSA3MjI7CiAgICB0LmFvZ29uZWsgPSA1NTY7CiAgICB0LlVhY3V0ZSA9IDcyMjsKICAgIHQudW9nb25layA9IDYxMTsKICAgIHQuRWRpZXJlc2lzID0gNjY3OwogICAgdC5EY3JvYXQgPSA3MjI7CiAgICB0LmNvbW1hYWNjZW50ID0gMjUwOwogICAgdC5jb3B5cmlnaHQgPSA3Mzc7CiAgICB0LkVtYWNyb24gPSA2Njc7CiAgICB0LmNjYXJvbiA9IDU1NjsKICAgIHQuYXJpbmcgPSA1NTY7CiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKICAgIHQubGFjdXRlID0gMjc4OwogICAgdC5hZ3JhdmUgPSA1NTY7CiAgICB0LlRjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuQ2FjdXRlID0gNzIyOwogICAgdC5hdGlsZGUgPSA1NTY7CiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CiAgICB0LnNjYXJvbiA9IDU1NjsKICAgIHQuc2NlZGlsbGEgPSA1NTY7CiAgICB0LmlhY3V0ZSA9IDI3ODsKICAgIHQubG96ZW5nZSA9IDQ5NDsKICAgIHQuUmNhcm9uID0gNzIyOwogICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LnVjaXJjdW1mbGV4ID0gNjExOwogICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuQW1hY3JvbiA9IDcyMjsKICAgIHQucmNhcm9uID0gMzg5OwogICAgdC5jY2VkaWxsYSA9IDU1NjsKICAgIHQuWmRvdGFjY2VudCA9IDYxMTsKICAgIHQuVGhvcm4gPSA2Njc7CiAgICB0Lk9tYWNyb24gPSA3Nzg7CiAgICB0LlJhY3V0ZSA9IDcyMjsKICAgIHQuU2FjdXRlID0gNjY3OwogICAgdC5kY2Fyb24gPSA3NDM7CiAgICB0LlVtYWNyb24gPSA3MjI7CiAgICB0LnVyaW5nID0gNjExOwogICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOwogICAgdC5PZ3JhdmUgPSA3Nzg7CiAgICB0LkFncmF2ZSA9IDcyMjsKICAgIHQuQWJyZXZlID0gNzIyOwogICAgdC5tdWx0aXBseSA9IDU4NDsKICAgIHQudWFjdXRlID0gNjExOwogICAgdC5UY2Fyb24gPSA2MTE7CiAgICB0LnBhcnRpYWxkaWZmID0gNDk0OwogICAgdC55ZGllcmVzaXMgPSA1NTY7CiAgICB0Lk5hY3V0ZSA9IDcyMjsKICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hZGllcmVzaXMgPSA1NTY7CiAgICB0LmVkaWVyZXNpcyA9IDU1NjsKICAgIHQuY2FjdXRlID0gNTU2OwogICAgdC5uYWN1dGUgPSA2MTE7CiAgICB0LnVtYWNyb24gPSA2MTE7CiAgICB0Lk5jYXJvbiA9IDcyMjsKICAgIHQuSWFjdXRlID0gMjc4OwogICAgdC5wbHVzbWludXMgPSA1ODQ7CiAgICB0LmJyb2tlbmJhciA9IDI4MDsKICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKICAgIHQuR2JyZXZlID0gNzc4OwogICAgdC5JZG90YWNjZW50ID0gMjc4OwogICAgdC5zdW1tYXRpb24gPSA2MDA7CiAgICB0LkVncmF2ZSA9IDY2NzsKICAgIHQucmFjdXRlID0gMzg5OwogICAgdC5vbWFjcm9uID0gNjExOwogICAgdC5aYWN1dGUgPSA2MTE7CiAgICB0LlpjYXJvbiA9IDYxMTsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5FdGggPSA3MjI7CiAgICB0LkNjZWRpbGxhID0gNzIyOwogICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CiAgICB0LnRjYXJvbiA9IDM4OTsKICAgIHQuZW9nb25layA9IDU1NjsKICAgIHQuVW9nb25layA9IDcyMjsKICAgIHQuQWFjdXRlID0gNzIyOwogICAgdC5BZGllcmVzaXMgPSA3MjI7CiAgICB0LmVncmF2ZSA9IDU1NjsKICAgIHQuemFjdXRlID0gNTAwOwogICAgdC5pb2dvbmVrID0gMjc4OwogICAgdC5PYWN1dGUgPSA3Nzg7CiAgICB0Lm9hY3V0ZSA9IDYxMTsKICAgIHQuYW1hY3JvbiA9IDU1NjsKICAgIHQuc2FjdXRlID0gNTU2OwogICAgdC5pZGllcmVzaXMgPSAyNzg7CiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OwogICAgdC5VZ3JhdmUgPSA3MjI7CiAgICB0LkRlbHRhID0gNjEyOwogICAgdC50aG9ybiA9IDYxMTsKICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKICAgIHQubXUgPSA2MTE7CiAgICB0LmlncmF2ZSA9IDI3ODsKICAgIHQub2h1bmdhcnVtbGF1dCA9IDYxMTsKICAgIHQuRW9nb25layA9IDY2NzsKICAgIHQuZGNyb2F0ID0gNjExOwogICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0OwogICAgdC5TY2VkaWxsYSA9IDY2NzsKICAgIHQubGNhcm9uID0gNDAwOwogICAgdC5LY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LkxhY3V0ZSA9IDYxMTsKICAgIHQudHJhZGVtYXJrID0gMTAwMDsKICAgIHQuZWRvdGFjY2VudCA9IDU1NjsKICAgIHQuSWdyYXZlID0gMjc4OwogICAgdC5JbWFjcm9uID0gMjc4OwogICAgdC5MY2Fyb24gPSA2MTE7CiAgICB0Lm9uZWhhbGYgPSA4MzQ7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQub2NpcmN1bWZsZXggPSA2MTE7CiAgICB0Lm50aWxkZSA9IDYxMTsKICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuRWFjdXRlID0gNjY3OwogICAgdC5lbWFjcm9uID0gNTU2OwogICAgdC5nYnJldmUgPSA2MTE7CiAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7CiAgICB0LlNjYXJvbiA9IDY2NzsKICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OwogICAgdC5kZWdyZWUgPSA0MDA7CiAgICB0Lm9ncmF2ZSA9IDYxMTsKICAgIHQuQ2Nhcm9uID0gNzIyOwogICAgdC51Z3JhdmUgPSA2MTE7CiAgICB0LnJhZGljYWwgPSA1NDk7CiAgICB0LkRjYXJvbiA9IDcyMjsKICAgIHQucmNvbW1hYWNjZW50ID0gMzg5OwogICAgdC5OdGlsZGUgPSA3MjI7CiAgICB0Lm90aWxkZSA9IDYxMTsKICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkF0aWxkZSA9IDcyMjsKICAgIHQuQW9nb25layA9IDcyMjsKICAgIHQuQXJpbmcgPSA3MjI7CiAgICB0Lk90aWxkZSA9IDc3ODsKICAgIHQuemRvdGFjY2VudCA9IDUwMDsKICAgIHQuRWNhcm9uID0gNjY3OwogICAgdC5Jb2dvbmVrID0gMjc4OwogICAgdC5rY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm1pbnVzID0gNTg0OwogICAgdC5JY2lyY3VtZmxleCA9IDI3ODsKICAgIHQubmNhcm9uID0gNjExOwogICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7CiAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7CiAgICB0Lm9kaWVyZXNpcyA9IDYxMTsKICAgIHQudWRpZXJlc2lzID0gNjExOwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZ2NvbW1hYWNjZW50ID0gNjExOwogICAgdC5ldGggPSA2MTE7CiAgICB0LnpjYXJvbiA9IDUwMDsKICAgIHQubmNvbW1hYWNjZW50ID0gNjExOwogICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKICAgIHQuaW1hY3JvbiA9IDI3ODsKICAgIHQuRXVybyA9IDU1NjsKICB9KTsKICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjc4OwogICAgdC5leGNsYW0gPSAyNzg7CiAgICB0LnF1b3RlZGJsID0gMzU1OwogICAgdC5udW1iZXJzaWduID0gNTU2OwogICAgdC5kb2xsYXIgPSA1NTY7CiAgICB0LnBlcmNlbnQgPSA4ODk7CiAgICB0LmFtcGVyc2FuZCA9IDY2NzsKICAgIHQucXVvdGVyaWdodCA9IDIyMjsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDM4OTsKICAgIHQucGx1cyA9IDU4NDsKICAgIHQuY29tbWEgPSAyNzg7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjc4OwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDU1NjsKICAgIHQub25lID0gNTU2OwogICAgdC50d28gPSA1NTY7CiAgICB0LnRocmVlID0gNTU2OwogICAgdC5mb3VyID0gNTU2OwogICAgdC5maXZlID0gNTU2OwogICAgdC5zaXggPSA1NTY7CiAgICB0LnNldmVuID0gNTU2OwogICAgdC5laWdodCA9IDU1NjsKICAgIHQubmluZSA9IDU1NjsKICAgIHQuY29sb24gPSAyNzg7CiAgICB0LnNlbWljb2xvbiA9IDI3ODsKICAgIHQubGVzcyA9IDU4NDsKICAgIHQuZXF1YWwgPSA1ODQ7CiAgICB0LmdyZWF0ZXIgPSA1ODQ7CiAgICB0LnF1ZXN0aW9uID0gNTU2OwogICAgdC5hdCA9IDEwMTU7CiAgICB0LkEgPSA2Njc7CiAgICB0LkIgPSA2Njc7CiAgICB0LkMgPSA3MjI7CiAgICB0LkQgPSA3MjI7CiAgICB0LkUgPSA2Njc7CiAgICB0LkYgPSA2MTE7CiAgICB0LkcgPSA3Nzg7CiAgICB0LkggPSA3MjI7CiAgICB0LkkgPSAyNzg7CiAgICB0LkogPSA1MDA7CiAgICB0LksgPSA2Njc7CiAgICB0LkwgPSA1NTY7CiAgICB0Lk0gPSA4MzM7CiAgICB0Lk4gPSA3MjI7CiAgICB0Lk8gPSA3Nzg7CiAgICB0LlAgPSA2Njc7CiAgICB0LlEgPSA3Nzg7CiAgICB0LlIgPSA3MjI7CiAgICB0LlMgPSA2Njc7CiAgICB0LlQgPSA2MTE7CiAgICB0LlUgPSA3MjI7CiAgICB0LlYgPSA2Njc7CiAgICB0LlcgPSA5NDQ7CiAgICB0LlggPSA2Njc7CiAgICB0LlkgPSA2Njc7CiAgICB0LlogPSA2MTE7CiAgICB0LmJyYWNrZXRsZWZ0ID0gMjc4OwogICAgdC5iYWNrc2xhc2ggPSAyNzg7CiAgICB0LmJyYWNrZXRyaWdodCA9IDI3ODsKICAgIHQuYXNjaWljaXJjdW0gPSA0Njk7CiAgICB0LnVuZGVyc2NvcmUgPSA1NTY7CiAgICB0LnF1b3RlbGVmdCA9IDIyMjsKICAgIHQuYSA9IDU1NjsKICAgIHQuYiA9IDU1NjsKICAgIHQuYyA9IDUwMDsKICAgIHQuZCA9IDU1NjsKICAgIHQuZSA9IDU1NjsKICAgIHQuZiA9IDI3ODsKICAgIHQuZyA9IDU1NjsKICAgIHQuaCA9IDU1NjsKICAgIHQuaSA9IDIyMjsKICAgIHQuaiA9IDIyMjsKICAgIHQuayA9IDUwMDsKICAgIHQubCA9IDIyMjsKICAgIHQubSA9IDgzMzsKICAgIHQubiA9IDU1NjsKICAgIHQubyA9IDU1NjsKICAgIHQucCA9IDU1NjsKICAgIHQucSA9IDU1NjsKICAgIHQuciA9IDMzMzsKICAgIHQucyA9IDUwMDsKICAgIHQudCA9IDI3ODsKICAgIHQudSA9IDU1NjsKICAgIHQudiA9IDUwMDsKICAgIHQudyA9IDcyMjsKICAgIHQueCA9IDUwMDsKICAgIHQueSA9IDUwMDsKICAgIHQueiA9IDUwMDsKICAgIHQuYnJhY2VsZWZ0ID0gMzM0OwogICAgdC5iYXIgPSAyNjA7CiAgICB0LmJyYWNlcmlnaHQgPSAzMzQ7CiAgICB0LmFzY2lpdGlsZGUgPSA1ODQ7CiAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CiAgICB0LmNlbnQgPSA1NTY7CiAgICB0LnN0ZXJsaW5nID0gNTU2OwogICAgdC5mcmFjdGlvbiA9IDE2NzsKICAgIHQueWVuID0gNTU2OwogICAgdC5mbG9yaW4gPSA1NTY7CiAgICB0LnNlY3Rpb24gPSA1NTY7CiAgICB0LmN1cnJlbmN5ID0gNTU2OwogICAgdC5xdW90ZXNpbmdsZSA9IDE5MTsKICAgIHQucXVvdGVkYmxsZWZ0ID0gMzMzOwogICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTU2OwogICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzOwogICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKICAgIHQuZmkgPSA1MDA7CiAgICB0LmZsID0gNTAwOwogICAgdC5lbmRhc2ggPSA1NTY7CiAgICB0LmRhZ2dlciA9IDU1NjsKICAgIHQuZGFnZ2VyZGJsID0gNTU2OwogICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODsKICAgIHQucGFyYWdyYXBoID0gNTM3OwogICAgdC5idWxsZXQgPSAzNTA7CiAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjIyOwogICAgdC5xdW90ZWRibGJhc2UgPSAzMzM7CiAgICB0LnF1b3RlZGJscmlnaHQgPSAzMzM7CiAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2OwogICAgdC5lbGxpcHNpcyA9IDEwMDA7CiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKICAgIHQucXVlc3Rpb25kb3duID0gNjExOwogICAgdC5ncmF2ZSA9IDMzMzsKICAgIHQuYWN1dGUgPSAzMzM7CiAgICB0LmNpcmN1bWZsZXggPSAzMzM7CiAgICB0LnRpbGRlID0gMzMzOwogICAgdC5tYWNyb24gPSAzMzM7CiAgICB0LmJyZXZlID0gMzMzOwogICAgdC5kb3RhY2NlbnQgPSAzMzM7CiAgICB0LmRpZXJlc2lzID0gMzMzOwogICAgdC5yaW5nID0gMzMzOwogICAgdC5jZWRpbGxhID0gMzMzOwogICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CiAgICB0Lm9nb25layA9IDMzMzsKICAgIHQuY2Fyb24gPSAzMzM7CiAgICB0LmVtZGFzaCA9IDEwMDA7CiAgICB0LkFFID0gMTAwMDsKICAgIHQub3JkZmVtaW5pbmUgPSAzNzA7CiAgICB0LkxzbGFzaCA9IDU1NjsKICAgIHQuT3NsYXNoID0gNzc4OwogICAgdC5PRSA9IDEwMDA7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDM2NTsKICAgIHQuYWUgPSA4ODk7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyMjI7CiAgICB0Lm9zbGFzaCA9IDYxMTsKICAgIHQub2UgPSA5NDQ7CiAgICB0Lmdlcm1hbmRibHMgPSA2MTE7CiAgICB0LklkaWVyZXNpcyA9IDI3ODsKICAgIHQuZWFjdXRlID0gNTU2OwogICAgdC5hYnJldmUgPSA1NTY7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7CiAgICB0LmVjYXJvbiA9IDU1NjsKICAgIHQuWWRpZXJlc2lzID0gNjY3OwogICAgdC5kaXZpZGUgPSA1ODQ7CiAgICB0LllhY3V0ZSA9IDY2NzsKICAgIHQuQWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFhY3V0ZSA9IDU1NjsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDUwMDsKICAgIHQuc2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5lY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDU1NjsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTU2OwogICAgdC5FZGllcmVzaXMgPSA2Njc7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDczNzsKICAgIHQuRW1hY3JvbiA9IDY2NzsKICAgIHQuY2Nhcm9uID0gNTAwOwogICAgdC5hcmluZyA9IDU1NjsKICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5sYWN1dGUgPSAyMjI7CiAgICB0LmFncmF2ZSA9IDU1NjsKICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5DYWN1dGUgPSA3MjI7CiAgICB0LmF0aWxkZSA9IDU1NjsKICAgIHQuRWRvdGFjY2VudCA9IDY2NzsKICAgIHQuc2Nhcm9uID0gNTAwOwogICAgdC5zY2VkaWxsYSA9IDUwMDsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA3MjI7CiAgICB0Lkdjb21tYWFjY2VudCA9IDc3ODsKICAgIHQudWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LmFjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5BbWFjcm9uID0gNjY3OwogICAgdC5yY2Fyb24gPSAzMzM7CiAgICB0LmNjZWRpbGxhID0gNTAwOwogICAgdC5aZG90YWNjZW50ID0gNjExOwogICAgdC5UaG9ybiA9IDY2NzsKICAgIHQuT21hY3JvbiA9IDc3ODsKICAgIHQuUmFjdXRlID0gNzIyOwogICAgdC5TYWN1dGUgPSA2Njc7CiAgICB0LmRjYXJvbiA9IDY0MzsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1NTY7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9ncmF2ZSA9IDc3ODsKICAgIHQuQWdyYXZlID0gNjY3OwogICAgdC5BYnJldmUgPSA2Njc7CiAgICB0Lm11bHRpcGx5ID0gNTg0OwogICAgdC51YWN1dGUgPSA1NTY7CiAgICB0LlRjYXJvbiA9IDYxMTsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDUwMDsKICAgIHQuTmFjdXRlID0gNzIyOwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFkaWVyZXNpcyA9IDU1NjsKICAgIHQuZWRpZXJlc2lzID0gNTU2OwogICAgdC5jYWN1dGUgPSA1MDA7CiAgICB0Lm5hY3V0ZSA9IDU1NjsKICAgIHQudW1hY3JvbiA9IDU1NjsKICAgIHQuTmNhcm9uID0gNzIyOwogICAgdC5JYWN1dGUgPSAyNzg7CiAgICB0LnBsdXNtaW51cyA9IDU4NDsKICAgIHQuYnJva2VuYmFyID0gMjYwOwogICAgdC5yZWdpc3RlcmVkID0gNzM3OwogICAgdC5HYnJldmUgPSA3Nzg7CiAgICB0Lklkb3RhY2NlbnQgPSAyNzg7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjY3OwogICAgdC5yYWN1dGUgPSAzMzM7CiAgICB0Lm9tYWNyb24gPSA1NTY7CiAgICB0LlphY3V0ZSA9IDYxMTsKICAgIHQuWmNhcm9uID0gNjExOwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA3MjI7CiAgICB0Lmxjb21tYWFjY2VudCA9IDIyMjsKICAgIHQudGNhcm9uID0gMzE3OwogICAgdC5lb2dvbmVrID0gNTU2OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA2Njc7CiAgICB0LkFkaWVyZXNpcyA9IDY2NzsKICAgIHQuZWdyYXZlID0gNTU2OwogICAgdC56YWN1dGUgPSA1MDA7CiAgICB0LmlvZ29uZWsgPSAyMjI7CiAgICB0Lk9hY3V0ZSA9IDc3ODsKICAgIHQub2FjdXRlID0gNTU2OwogICAgdC5hbWFjcm9uID0gNTU2OwogICAgdC5zYWN1dGUgPSA1MDA7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTU2OwogICAgdC50d29zdXBlcmlvciA9IDMzMzsKICAgIHQuT2RpZXJlc2lzID0gNzc4OwogICAgdC5tdSA9IDU1NjsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTU2OwogICAgdC5Fb2dvbmVrID0gNjY3OwogICAgdC5kY3JvYXQgPSA1NTY7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA4MzQ7CiAgICB0LlNjZWRpbGxhID0gNjY3OwogICAgdC5sY2Fyb24gPSAyOTk7CiAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGFjdXRlID0gNTU2OwogICAgdC50cmFkZW1hcmsgPSAxMDAwOwogICAgdC5lZG90YWNjZW50ID0gNTU2OwogICAgdC5JZ3JhdmUgPSAyNzg7CiAgICB0LkltYWNyb24gPSAyNzg7CiAgICB0LkxjYXJvbiA9IDU1NjsKICAgIHQub25laGFsZiA9IDgzNDsKICAgIHQubGVzc2VxdWFsID0gNTQ5OwogICAgdC5vY2lyY3VtZmxleCA9IDU1NjsKICAgIHQubnRpbGRlID0gNTU2OwogICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOwogICAgdC5FYWN1dGUgPSA2Njc7CiAgICB0LmVtYWNyb24gPSA1NTY7CiAgICB0LmdicmV2ZSA9IDU1NjsKICAgIHQub25lcXVhcnRlciA9IDgzNDsKICAgIHQuU2Nhcm9uID0gNjY3OwogICAgdC5TY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3Nzg7CiAgICB0LmRlZ3JlZSA9IDQwMDsKICAgIHQub2dyYXZlID0gNTU2OwogICAgdC5DY2Fyb24gPSA3MjI7CiAgICB0LnVncmF2ZSA9IDU1NjsKICAgIHQucmFkaWNhbCA9IDQ1MzsKICAgIHQuRGNhcm9uID0gNzIyOwogICAgdC5yY29tbWFhY2NlbnQgPSAzMzM7CiAgICB0Lk50aWxkZSA9IDcyMjsKICAgIHQub3RpbGRlID0gNTU2OwogICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0Lkxjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuQXRpbGRlID0gNjY3OwogICAgdC5Bb2dvbmVrID0gNjY3OwogICAgdC5BcmluZyA9IDY2NzsKICAgIHQuT3RpbGRlID0gNzc4OwogICAgdC56ZG90YWNjZW50ID0gNTAwOwogICAgdC5FY2Fyb24gPSA2Njc7CiAgICB0LklvZ29uZWsgPSAyNzg7CiAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDsKICAgIHQubWludXMgPSA1ODQ7CiAgICB0LkljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5uY2Fyb24gPSA1NTY7CiAgICB0LnRjb21tYWFjY2VudCA9IDI3ODsKICAgIHQubG9naWNhbG5vdCA9IDU4NDsKICAgIHQub2RpZXJlc2lzID0gNTU2OwogICAgdC51ZGllcmVzaXMgPSA1NTY7CiAgICB0Lm5vdGVxdWFsID0gNTQ5OwogICAgdC5nY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0LmV0aCA9IDU1NjsKICAgIHQuemNhcm9uID0gNTAwOwogICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm9uZXN1cGVyaW9yID0gMzMzOwogICAgdC5pbWFjcm9uID0gMjc4OwogICAgdC5FdXJvID0gNTU2OwogIH0pOwogIHQuU3ltYm9sID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnVuaXZlcnNhbCA9IDcxMzsKICAgIHQubnVtYmVyc2lnbiA9IDUwMDsKICAgIHQuZXhpc3RlbnRpYWwgPSA1NDk7CiAgICB0LnBlcmNlbnQgPSA4MzM7CiAgICB0LmFtcGVyc2FuZCA9IDc3ODsKICAgIHQuc3VjaHRoYXQgPSA0Mzk7CiAgICB0LnBhcmVubGVmdCA9IDMzMzsKICAgIHQucGFyZW5yaWdodCA9IDMzMzsKICAgIHQuYXN0ZXJpc2ttYXRoID0gNTAwOwogICAgdC5wbHVzID0gNTQ5OwogICAgdC5jb21tYSA9IDI1MDsKICAgIHQubWludXMgPSA1NDk7CiAgICB0LnBlcmlvZCA9IDI1MDsKICAgIHQuc2xhc2ggPSAyNzg7CiAgICB0Lnplcm8gPSA1MDA7CiAgICB0Lm9uZSA9IDUwMDsKICAgIHQudHdvID0gNTAwOwogICAgdC50aHJlZSA9IDUwMDsKICAgIHQuZm91ciA9IDUwMDsKICAgIHQuZml2ZSA9IDUwMDsKICAgIHQuc2l4ID0gNTAwOwogICAgdC5zZXZlbiA9IDUwMDsKICAgIHQuZWlnaHQgPSA1MDA7CiAgICB0Lm5pbmUgPSA1MDA7CiAgICB0LmNvbG9uID0gMjc4OwogICAgdC5zZW1pY29sb24gPSAyNzg7CiAgICB0Lmxlc3MgPSA1NDk7CiAgICB0LmVxdWFsID0gNTQ5OwogICAgdC5ncmVhdGVyID0gNTQ5OwogICAgdC5xdWVzdGlvbiA9IDQ0NDsKICAgIHQuY29uZ3J1ZW50ID0gNTQ5OwogICAgdC5BbHBoYSA9IDcyMjsKICAgIHQuQmV0YSA9IDY2NzsKICAgIHQuQ2hpID0gNzIyOwogICAgdC5EZWx0YSA9IDYxMjsKICAgIHQuRXBzaWxvbiA9IDYxMTsKICAgIHQuUGhpID0gNzYzOwogICAgdC5HYW1tYSA9IDYwMzsKICAgIHQuRXRhID0gNzIyOwogICAgdC5Jb3RhID0gMzMzOwogICAgdC50aGV0YTEgPSA2MzE7CiAgICB0LkthcHBhID0gNzIyOwogICAgdC5MYW1iZGEgPSA2ODY7CiAgICB0Lk11ID0gODg5OwogICAgdC5OdSA9IDcyMjsKICAgIHQuT21pY3JvbiA9IDcyMjsKICAgIHQuUGkgPSA3Njg7CiAgICB0LlRoZXRhID0gNzQxOwogICAgdC5SaG8gPSA1NTY7CiAgICB0LlNpZ21hID0gNTkyOwogICAgdC5UYXUgPSA2MTE7CiAgICB0LlVwc2lsb24gPSA2OTA7CiAgICB0LnNpZ21hMSA9IDQzOTsKICAgIHQuT21lZ2EgPSA3Njg7CiAgICB0LlhpID0gNjQ1OwogICAgdC5Qc2kgPSA3OTU7CiAgICB0LlpldGEgPSA2MTE7CiAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzOwogICAgdC50aGVyZWZvcmUgPSA4NjM7CiAgICB0LmJyYWNrZXRyaWdodCA9IDMzMzsKICAgIHQucGVycGVuZGljdWxhciA9IDY1ODsKICAgIHQudW5kZXJzY29yZSA9IDUwMDsKICAgIHQucmFkaWNhbGV4ID0gNTAwOwogICAgdC5hbHBoYSA9IDYzMTsKICAgIHQuYmV0YSA9IDU0OTsKICAgIHQuY2hpID0gNTQ5OwogICAgdC5kZWx0YSA9IDQ5NDsKICAgIHQuZXBzaWxvbiA9IDQzOTsKICAgIHQucGhpID0gNTIxOwogICAgdC5nYW1tYSA9IDQxMTsKICAgIHQuZXRhID0gNjAzOwogICAgdC5pb3RhID0gMzI5OwogICAgdC5waGkxID0gNjAzOwogICAgdC5rYXBwYSA9IDU0OTsKICAgIHQubGFtYmRhID0gNTQ5OwogICAgdC5tdSA9IDU3NjsKICAgIHQubnUgPSA1MjE7CiAgICB0Lm9taWNyb24gPSA1NDk7CiAgICB0LnBpID0gNTQ5OwogICAgdC50aGV0YSA9IDUyMTsKICAgIHQucmhvID0gNTQ5OwogICAgdC5zaWdtYSA9IDYwMzsKICAgIHQudGF1ID0gNDM5OwogICAgdC51cHNpbG9uID0gNTc2OwogICAgdC5vbWVnYTEgPSA3MTM7CiAgICB0Lm9tZWdhID0gNjg2OwogICAgdC54aSA9IDQ5MzsKICAgIHQucHNpID0gNjg2OwogICAgdC56ZXRhID0gNDk0OwogICAgdC5icmFjZWxlZnQgPSA0ODA7CiAgICB0LmJhciA9IDIwMDsKICAgIHQuYnJhY2VyaWdodCA9IDQ4MDsKICAgIHQuc2ltaWxhciA9IDU0OTsKICAgIHQuRXVybyA9IDc1MDsKICAgIHQuVXBzaWxvbjEgPSA2MjA7CiAgICB0Lm1pbnV0ZSA9IDI0NzsKICAgIHQubGVzc2VxdWFsID0gNTQ5OwogICAgdC5mcmFjdGlvbiA9IDE2NzsKICAgIHQuaW5maW5pdHkgPSA3MTM7CiAgICB0LmZsb3JpbiA9IDUwMDsKICAgIHQuY2x1YiA9IDc1MzsKICAgIHQuZGlhbW9uZCA9IDc1MzsKICAgIHQuaGVhcnQgPSA3NTM7CiAgICB0LnNwYWRlID0gNzUzOwogICAgdC5hcnJvd2JvdGggPSAxMDQyOwogICAgdC5hcnJvd2xlZnQgPSA5ODc7CiAgICB0LmFycm93dXAgPSA2MDM7CiAgICB0LmFycm93cmlnaHQgPSA5ODc7CiAgICB0LmFycm93ZG93biA9IDYwMzsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5wbHVzbWludXMgPSA1NDk7CiAgICB0LnNlY29uZCA9IDQxMTsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5tdWx0aXBseSA9IDU0OTsKICAgIHQucHJvcG9ydGlvbmFsID0gNzEzOwogICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKICAgIHQuYnVsbGV0ID0gNDYwOwogICAgdC5kaXZpZGUgPSA1NDk7CiAgICB0Lm5vdGVxdWFsID0gNTQ5OwogICAgdC5lcXVpdmFsZW5jZSA9IDU0OTsKICAgIHQuYXBwcm94ZXF1YWwgPSA1NDk7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQuYXJyb3d2ZXJ0ZXggPSA2MDM7CiAgICB0LmFycm93aG9yaXpleCA9IDEwMDA7CiAgICB0LmNhcnJpYWdlcmV0dXJuID0gNjU4OwogICAgdC5hbGVwaCA9IDgyMzsKICAgIHQuSWZyYWt0dXIgPSA2ODY7CiAgICB0LlJmcmFrdHVyID0gNzk1OwogICAgdC53ZWllcnN0cmFzcyA9IDk4NzsKICAgIHQuY2lyY2xlbXVsdGlwbHkgPSA3Njg7CiAgICB0LmNpcmNsZXBsdXMgPSA3Njg7CiAgICB0LmVtcHR5c2V0ID0gODIzOwogICAgdC5pbnRlcnNlY3Rpb24gPSA3Njg7CiAgICB0LnVuaW9uID0gNzY4OwogICAgdC5wcm9wZXJzdXBlcnNldCA9IDcxMzsKICAgIHQucmVmbGV4c3VwZXJzZXQgPSA3MTM7CiAgICB0Lm5vdHN1YnNldCA9IDcxMzsKICAgIHQucHJvcGVyc3Vic2V0ID0gNzEzOwogICAgdC5yZWZsZXhzdWJzZXQgPSA3MTM7CiAgICB0LmVsZW1lbnQgPSA3MTM7CiAgICB0Lm5vdGVsZW1lbnQgPSA3MTM7CiAgICB0LmFuZ2xlID0gNzY4OwogICAgdC5ncmFkaWVudCA9IDcxMzsKICAgIHQucmVnaXN0ZXJzZXJpZiA9IDc5MDsKICAgIHQuY29weXJpZ2h0c2VyaWYgPSA3OTA7CiAgICB0LnRyYWRlbWFya3NlcmlmID0gODkwOwogICAgdC5wcm9kdWN0ID0gODIzOwogICAgdC5yYWRpY2FsID0gNTQ5OwogICAgdC5kb3RtYXRoID0gMjUwOwogICAgdC5sb2dpY2Fsbm90ID0gNzEzOwogICAgdC5sb2dpY2FsYW5kID0gNjAzOwogICAgdC5sb2dpY2Fsb3IgPSA2MDM7CiAgICB0LmFycm93ZGJsYm90aCA9IDEwNDI7CiAgICB0LmFycm93ZGJsbGVmdCA9IDk4NzsKICAgIHQuYXJyb3dkYmx1cCA9IDYwMzsKICAgIHQuYXJyb3dkYmxyaWdodCA9IDk4NzsKICAgIHQuYXJyb3dkYmxkb3duID0gNjAzOwogICAgdC5sb3plbmdlID0gNDk0OwogICAgdC5hbmdsZWxlZnQgPSAzMjk7CiAgICB0LnJlZ2lzdGVyc2FucyA9IDc5MDsKICAgIHQuY29weXJpZ2h0c2FucyA9IDc5MDsKICAgIHQudHJhZGVtYXJrc2FucyA9IDc4NjsKICAgIHQuc3VtbWF0aW9uID0gNzEzOwogICAgdC5wYXJlbmxlZnR0cCA9IDM4NDsKICAgIHQucGFyZW5sZWZ0ZXggPSAzODQ7CiAgICB0LnBhcmVubGVmdGJ0ID0gMzg0OwogICAgdC5icmFja2V0bGVmdHRwID0gMzg0OwogICAgdC5icmFja2V0bGVmdGV4ID0gMzg0OwogICAgdC5icmFja2V0bGVmdGJ0ID0gMzg0OwogICAgdC5icmFjZWxlZnR0cCA9IDQ5NDsKICAgIHQuYnJhY2VsZWZ0bWlkID0gNDk0OwogICAgdC5icmFjZWxlZnRidCA9IDQ5NDsKICAgIHQuYnJhY2VleCA9IDQ5NDsKICAgIHQuYW5nbGVyaWdodCA9IDMyOTsKICAgIHQuaW50ZWdyYWwgPSAyNzQ7CiAgICB0LmludGVncmFsdHAgPSA2ODY7CiAgICB0LmludGVncmFsZXggPSA2ODY7CiAgICB0LmludGVncmFsYnQgPSA2ODY7CiAgICB0LnBhcmVucmlnaHR0cCA9IDM4NDsKICAgIHQucGFyZW5yaWdodGV4ID0gMzg0OwogICAgdC5wYXJlbnJpZ2h0YnQgPSAzODQ7CiAgICB0LmJyYWNrZXRyaWdodHRwID0gMzg0OwogICAgdC5icmFja2V0cmlnaHRleCA9IDM4NDsKICAgIHQuYnJhY2tldHJpZ2h0YnQgPSAzODQ7CiAgICB0LmJyYWNlcmlnaHR0cCA9IDQ5NDsKICAgIHQuYnJhY2VyaWdodG1pZCA9IDQ5NDsKICAgIHQuYnJhY2VyaWdodGJ0ID0gNDk0OwogICAgdC5hcHBsZSA9IDc5MDsKICB9KTsKICB0WyJUaW1lcy1Sb21hbiJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnF1b3RlZGJsID0gNDA4OwogICAgdC5udW1iZXJzaWduID0gNTAwOwogICAgdC5kb2xsYXIgPSA1MDA7CiAgICB0LnBlcmNlbnQgPSA4MzM7CiAgICB0LmFtcGVyc2FuZCA9IDc3ODsKICAgIHQucXVvdGVyaWdodCA9IDMzMzsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDUwMDsKICAgIHQucGx1cyA9IDU2NDsKICAgIHQuY29tbWEgPSAyNTA7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjUwOwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDUwMDsKICAgIHQub25lID0gNTAwOwogICAgdC50d28gPSA1MDA7CiAgICB0LnRocmVlID0gNTAwOwogICAgdC5mb3VyID0gNTAwOwogICAgdC5maXZlID0gNTAwOwogICAgdC5zaXggPSA1MDA7CiAgICB0LnNldmVuID0gNTAwOwogICAgdC5laWdodCA9IDUwMDsKICAgIHQubmluZSA9IDUwMDsKICAgIHQuY29sb24gPSAyNzg7CiAgICB0LnNlbWljb2xvbiA9IDI3ODsKICAgIHQubGVzcyA9IDU2NDsKICAgIHQuZXF1YWwgPSA1NjQ7CiAgICB0LmdyZWF0ZXIgPSA1NjQ7CiAgICB0LnF1ZXN0aW9uID0gNDQ0OwogICAgdC5hdCA9IDkyMTsKICAgIHQuQSA9IDcyMjsKICAgIHQuQiA9IDY2NzsKICAgIHQuQyA9IDY2NzsKICAgIHQuRCA9IDcyMjsKICAgIHQuRSA9IDYxMTsKICAgIHQuRiA9IDU1NjsKICAgIHQuRyA9IDcyMjsKICAgIHQuSCA9IDcyMjsKICAgIHQuSSA9IDMzMzsKICAgIHQuSiA9IDM4OTsKICAgIHQuSyA9IDcyMjsKICAgIHQuTCA9IDYxMTsKICAgIHQuTSA9IDg4OTsKICAgIHQuTiA9IDcyMjsKICAgIHQuTyA9IDcyMjsKICAgIHQuUCA9IDU1NjsKICAgIHQuUSA9IDcyMjsKICAgIHQuUiA9IDY2NzsKICAgIHQuUyA9IDU1NjsKICAgIHQuVCA9IDYxMTsKICAgIHQuVSA9IDcyMjsKICAgIHQuViA9IDcyMjsKICAgIHQuVyA9IDk0NDsKICAgIHQuWCA9IDcyMjsKICAgIHQuWSA9IDcyMjsKICAgIHQuWiA9IDYxMTsKICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CiAgICB0LmJhY2tzbGFzaCA9IDI3ODsKICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOwogICAgdC5hc2NpaWNpcmN1bSA9IDQ2OTsKICAgIHQudW5kZXJzY29yZSA9IDUwMDsKICAgIHQucXVvdGVsZWZ0ID0gMzMzOwogICAgdC5hID0gNDQ0OwogICAgdC5iID0gNTAwOwogICAgdC5jID0gNDQ0OwogICAgdC5kID0gNTAwOwogICAgdC5lID0gNDQ0OwogICAgdC5mID0gMzMzOwogICAgdC5nID0gNTAwOwogICAgdC5oID0gNTAwOwogICAgdC5pID0gMjc4OwogICAgdC5qID0gMjc4OwogICAgdC5rID0gNTAwOwogICAgdC5sID0gMjc4OwogICAgdC5tID0gNzc4OwogICAgdC5uID0gNTAwOwogICAgdC5vID0gNTAwOwogICAgdC5wID0gNTAwOwogICAgdC5xID0gNTAwOwogICAgdC5yID0gMzMzOwogICAgdC5zID0gMzg5OwogICAgdC50ID0gMjc4OwogICAgdC51ID0gNTAwOwogICAgdC52ID0gNTAwOwogICAgdC53ID0gNzIyOwogICAgdC54ID0gNTAwOwogICAgdC55ID0gNTAwOwogICAgdC56ID0gNDQ0OwogICAgdC5icmFjZWxlZnQgPSA0ODA7CiAgICB0LmJhciA9IDIwMDsKICAgIHQuYnJhY2VyaWdodCA9IDQ4MDsKICAgIHQuYXNjaWl0aWxkZSA9IDU0MTsKICAgIHQuZXhjbGFtZG93biA9IDMzMzsKICAgIHQuY2VudCA9IDUwMDsKICAgIHQuc3RlcmxpbmcgPSA1MDA7CiAgICB0LmZyYWN0aW9uID0gMTY3OwogICAgdC55ZW4gPSA1MDA7CiAgICB0LmZsb3JpbiA9IDUwMDsKICAgIHQuc2VjdGlvbiA9IDUwMDsKICAgIHQuY3VycmVuY3kgPSA1MDA7CiAgICB0LnF1b3Rlc2luZ2xlID0gMTgwOwogICAgdC5xdW90ZWRibGxlZnQgPSA0NDQ7CiAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1MDA7CiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOwogICAgdC5maSA9IDU1NjsKICAgIHQuZmwgPSA1NTY7CiAgICB0LmVuZGFzaCA9IDUwMDsKICAgIHQuZGFnZ2VyID0gNTAwOwogICAgdC5kYWdnZXJkYmwgPSA1MDA7CiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwOwogICAgdC5wYXJhZ3JhcGggPSA0NTM7CiAgICB0LmJ1bGxldCA9IDM1MDsKICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7CiAgICB0LnF1b3RlZGJsYmFzZSA9IDQ0NDsKICAgIHQucXVvdGVkYmxyaWdodCA9IDQ0NDsKICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOwogICAgdC5xdWVzdGlvbmRvd24gPSA0NDQ7CiAgICB0LmdyYXZlID0gMzMzOwogICAgdC5hY3V0ZSA9IDMzMzsKICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKICAgIHQudGlsZGUgPSAzMzM7CiAgICB0Lm1hY3JvbiA9IDMzMzsKICAgIHQuYnJldmUgPSAzMzM7CiAgICB0LmRvdGFjY2VudCA9IDMzMzsKICAgIHQuZGllcmVzaXMgPSAzMzM7CiAgICB0LnJpbmcgPSAzMzM7CiAgICB0LmNlZGlsbGEgPSAzMzM7CiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKICAgIHQub2dvbmVrID0gMzMzOwogICAgdC5jYXJvbiA9IDMzMzsKICAgIHQuZW1kYXNoID0gMTAwMDsKICAgIHQuQUUgPSA4ODk7CiAgICB0Lm9yZGZlbWluaW5lID0gMjc2OwogICAgdC5Mc2xhc2ggPSA2MTE7CiAgICB0Lk9zbGFzaCA9IDcyMjsKICAgIHQuT0UgPSA4ODk7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDsKICAgIHQuYWUgPSA2Njc7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyNzg7CiAgICB0Lm9zbGFzaCA9IDUwMDsKICAgIHQub2UgPSA3MjI7CiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7CiAgICB0LklkaWVyZXNpcyA9IDMzMzsKICAgIHQuZWFjdXRlID0gNDQ0OwogICAgdC5hYnJldmUgPSA0NDQ7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LmVjYXJvbiA9IDQ0NDsKICAgIHQuWWRpZXJlc2lzID0gNzIyOwogICAgdC5kaXZpZGUgPSA1NjQ7CiAgICB0LllhY3V0ZSA9IDcyMjsKICAgIHQuQWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LmFhY3V0ZSA9IDQ0NDsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDUwMDsKICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OwogICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDQ0NDsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTAwOwogICAgdC5FZGllcmVzaXMgPSA2MTE7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDc2MDsKICAgIHQuRW1hY3JvbiA9IDYxMTsKICAgIHQuY2Nhcm9uID0gNDQ0OwogICAgdC5hcmluZyA9IDQ0NDsKICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5sYWN1dGUgPSAyNzg7CiAgICB0LmFncmF2ZSA9IDQ0NDsKICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5DYWN1dGUgPSA2Njc7CiAgICB0LmF0aWxkZSA9IDQ0NDsKICAgIHQuRWRvdGFjY2VudCA9IDYxMTsKICAgIHQuc2Nhcm9uID0gMzg5OwogICAgdC5zY2VkaWxsYSA9IDM4OTsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA2Njc7CiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjsKICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LmFjaXJjdW1mbGV4ID0gNDQ0OwogICAgdC5BbWFjcm9uID0gNzIyOwogICAgdC5yY2Fyb24gPSAzMzM7CiAgICB0LmNjZWRpbGxhID0gNDQ0OwogICAgdC5aZG90YWNjZW50ID0gNjExOwogICAgdC5UaG9ybiA9IDU1NjsKICAgIHQuT21hY3JvbiA9IDcyMjsKICAgIHQuUmFjdXRlID0gNjY3OwogICAgdC5TYWN1dGUgPSA1NTY7CiAgICB0LmRjYXJvbiA9IDU4ODsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1MDA7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9ncmF2ZSA9IDcyMjsKICAgIHQuQWdyYXZlID0gNzIyOwogICAgdC5BYnJldmUgPSA3MjI7CiAgICB0Lm11bHRpcGx5ID0gNTY0OwogICAgdC51YWN1dGUgPSA1MDA7CiAgICB0LlRjYXJvbiA9IDYxMTsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDUwMDsKICAgIHQuTmFjdXRlID0gNzIyOwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFkaWVyZXNpcyA9IDQ0NDsKICAgIHQuZWRpZXJlc2lzID0gNDQ0OwogICAgdC5jYWN1dGUgPSA0NDQ7CiAgICB0Lm5hY3V0ZSA9IDUwMDsKICAgIHQudW1hY3JvbiA9IDUwMDsKICAgIHQuTmNhcm9uID0gNzIyOwogICAgdC5JYWN1dGUgPSAzMzM7CiAgICB0LnBsdXNtaW51cyA9IDU2NDsKICAgIHQuYnJva2VuYmFyID0gMjAwOwogICAgdC5yZWdpc3RlcmVkID0gNzYwOwogICAgdC5HYnJldmUgPSA3MjI7CiAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjExOwogICAgdC5yYWN1dGUgPSAzMzM7CiAgICB0Lm9tYWNyb24gPSA1MDA7CiAgICB0LlphY3V0ZSA9IDYxMTsKICAgIHQuWmNhcm9uID0gNjExOwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA2Njc7CiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKICAgIHQudGNhcm9uID0gMzI2OwogICAgdC5lb2dvbmVrID0gNDQ0OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA3MjI7CiAgICB0LkFkaWVyZXNpcyA9IDcyMjsKICAgIHQuZWdyYXZlID0gNDQ0OwogICAgdC56YWN1dGUgPSA0NDQ7CiAgICB0LmlvZ29uZWsgPSAyNzg7CiAgICB0Lk9hY3V0ZSA9IDcyMjsKICAgIHQub2FjdXRlID0gNTAwOwogICAgdC5hbWFjcm9uID0gNDQ0OwogICAgdC5zYWN1dGUgPSAzODk7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTAwOwogICAgdC50d29zdXBlcmlvciA9IDMwMDsKICAgIHQuT2RpZXJlc2lzID0gNzIyOwogICAgdC5tdSA9IDUwMDsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOwogICAgdC5Fb2dvbmVrID0gNjExOwogICAgdC5kY3JvYXQgPSA1MDA7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CiAgICB0LlNjZWRpbGxhID0gNTU2OwogICAgdC5sY2Fyb24gPSAzNDQ7CiAgICB0Lktjb21tYWFjY2VudCA9IDcyMjsKICAgIHQuTGFjdXRlID0gNjExOwogICAgdC50cmFkZW1hcmsgPSA5ODA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDMzMzsKICAgIHQuSW1hY3JvbiA9IDMzMzsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1MDA7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDYxMTsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1NTY7CiAgICB0LlNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTAwOwogICAgdC5yYWRpY2FsID0gNDUzOwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDMzMzsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5BdGlsZGUgPSA3MjI7CiAgICB0LkFvZ29uZWsgPSA3MjI7CiAgICB0LkFyaW5nID0gNzIyOwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LkVjYXJvbiA9IDYxMTsKICAgIHQuSW9nb25layA9IDMzMzsKICAgIHQua2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5taW51cyA9IDU2NDsKICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7CiAgICB0Lm5jYXJvbiA9IDUwMDsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNTY0OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDUwMDsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSA0NDQ7CiAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdFsiVGltZXMtQm9sZCJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnF1b3RlZGJsID0gNTU1OwogICAgdC5udW1iZXJzaWduID0gNTAwOwogICAgdC5kb2xsYXIgPSA1MDA7CiAgICB0LnBlcmNlbnQgPSAxMDAwOwogICAgdC5hbXBlcnNhbmQgPSA4MzM7CiAgICB0LnF1b3RlcmlnaHQgPSAzMzM7CiAgICB0LnBhcmVubGVmdCA9IDMzMzsKICAgIHQucGFyZW5yaWdodCA9IDMzMzsKICAgIHQuYXN0ZXJpc2sgPSA1MDA7CiAgICB0LnBsdXMgPSA1NzA7CiAgICB0LmNvbW1hID0gMjUwOwogICAgdC5oeXBoZW4gPSAzMzM7CiAgICB0LnBlcmlvZCA9IDI1MDsKICAgIHQuc2xhc2ggPSAyNzg7CiAgICB0Lnplcm8gPSA1MDA7CiAgICB0Lm9uZSA9IDUwMDsKICAgIHQudHdvID0gNTAwOwogICAgdC50aHJlZSA9IDUwMDsKICAgIHQuZm91ciA9IDUwMDsKICAgIHQuZml2ZSA9IDUwMDsKICAgIHQuc2l4ID0gNTAwOwogICAgdC5zZXZlbiA9IDUwMDsKICAgIHQuZWlnaHQgPSA1MDA7CiAgICB0Lm5pbmUgPSA1MDA7CiAgICB0LmNvbG9uID0gMzMzOwogICAgdC5zZW1pY29sb24gPSAzMzM7CiAgICB0Lmxlc3MgPSA1NzA7CiAgICB0LmVxdWFsID0gNTcwOwogICAgdC5ncmVhdGVyID0gNTcwOwogICAgdC5xdWVzdGlvbiA9IDUwMDsKICAgIHQuYXQgPSA5MzA7CiAgICB0LkEgPSA3MjI7CiAgICB0LkIgPSA2Njc7CiAgICB0LkMgPSA3MjI7CiAgICB0LkQgPSA3MjI7CiAgICB0LkUgPSA2Njc7CiAgICB0LkYgPSA2MTE7CiAgICB0LkcgPSA3Nzg7CiAgICB0LkggPSA3Nzg7CiAgICB0LkkgPSAzODk7CiAgICB0LkogPSA1MDA7CiAgICB0LksgPSA3Nzg7CiAgICB0LkwgPSA2Njc7CiAgICB0Lk0gPSA5NDQ7CiAgICB0Lk4gPSA3MjI7CiAgICB0Lk8gPSA3Nzg7CiAgICB0LlAgPSA2MTE7CiAgICB0LlEgPSA3Nzg7CiAgICB0LlIgPSA3MjI7CiAgICB0LlMgPSA1NTY7CiAgICB0LlQgPSA2Njc7CiAgICB0LlUgPSA3MjI7CiAgICB0LlYgPSA3MjI7CiAgICB0LlcgPSAxMDAwOwogICAgdC5YID0gNzIyOwogICAgdC5ZID0gNzIyOwogICAgdC5aID0gNjY3OwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LmFzY2lpY2lyY3VtID0gNTgxOwogICAgdC51bmRlcnNjb3JlID0gNTAwOwogICAgdC5xdW90ZWxlZnQgPSAzMzM7CiAgICB0LmEgPSA1MDA7CiAgICB0LmIgPSA1NTY7CiAgICB0LmMgPSA0NDQ7CiAgICB0LmQgPSA1NTY7CiAgICB0LmUgPSA0NDQ7CiAgICB0LmYgPSAzMzM7CiAgICB0LmcgPSA1MDA7CiAgICB0LmggPSA1NTY7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAzMzM7CiAgICB0LmsgPSA1NTY7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA4MzM7CiAgICB0Lm4gPSA1NTY7CiAgICB0Lm8gPSA1MDA7CiAgICB0LnAgPSA1NTY7CiAgICB0LnEgPSA1NTY7CiAgICB0LnIgPSA0NDQ7CiAgICB0LnMgPSAzODk7CiAgICB0LnQgPSAzMzM7CiAgICB0LnUgPSA1NTY7CiAgICB0LnYgPSA1MDA7CiAgICB0LncgPSA3MjI7CiAgICB0LnggPSA1MDA7CiAgICB0LnkgPSA1MDA7CiAgICB0LnogPSA0NDQ7CiAgICB0LmJyYWNlbGVmdCA9IDM5NDsKICAgIHQuYmFyID0gMjIwOwogICAgdC5icmFjZXJpZ2h0ID0gMzk0OwogICAgdC5hc2NpaXRpbGRlID0gNTIwOwogICAgdC5leGNsYW1kb3duID0gMzMzOwogICAgdC5jZW50ID0gNTAwOwogICAgdC5zdGVybGluZyA9IDUwMDsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDUwMDsKICAgIHQuZmxvcmluID0gNTAwOwogICAgdC5zZWN0aW9uID0gNTAwOwogICAgdC5jdXJyZW5jeSA9IDUwMDsKICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTU2OwogICAgdC5mbCA9IDU1NjsKICAgIHQuZW5kYXNoID0gNTAwOwogICAgdC5kYWdnZXIgPSA1MDA7CiAgICB0LmRhZ2dlcmRibCA9IDUwMDsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CiAgICB0LnBhcmFncmFwaCA9IDU0MDsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDUwMDsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDEwMDA7CiAgICB0Lm9yZGZlbWluaW5lID0gMzAwOwogICAgdC5Mc2xhc2ggPSA2Njc7CiAgICB0Lk9zbGFzaCA9IDc3ODsKICAgIHQuT0UgPSAxMDAwOwogICAgdC5vcmRtYXNjdWxpbmUgPSAzMzA7CiAgICB0LmFlID0gNzIyOwogICAgdC5kb3RsZXNzaSA9IDI3ODsKICAgIHQubHNsYXNoID0gMjc4OwogICAgdC5vc2xhc2ggPSA1MDA7CiAgICB0Lm9lID0gNzIyOwogICAgdC5nZXJtYW5kYmxzID0gNTU2OwogICAgdC5JZGllcmVzaXMgPSAzODk7CiAgICB0LmVhY3V0ZSA9IDQ0NDsKICAgIHQuYWJyZXZlID0gNTAwOwogICAgdC51aHVuZ2FydW1sYXV0ID0gNTU2OwogICAgdC5lY2Fyb24gPSA0NDQ7CiAgICB0LllkaWVyZXNpcyA9IDcyMjsKICAgIHQuZGl2aWRlID0gNTcwOwogICAgdC5ZYWN1dGUgPSA3MjI7CiAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOwogICAgdC5hYWN1dGUgPSA1MDA7CiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOwogICAgdC55YWN1dGUgPSA1MDA7CiAgICB0LnNjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuZWNpcmN1bWZsZXggPSA0NDQ7CiAgICB0LlVyaW5nID0gNzIyOwogICAgdC5VZGllcmVzaXMgPSA3MjI7CiAgICB0LmFvZ29uZWsgPSA1MDA7CiAgICB0LlVhY3V0ZSA9IDcyMjsKICAgIHQudW9nb25layA9IDU1NjsKICAgIHQuRWRpZXJlc2lzID0gNjY3OwogICAgdC5EY3JvYXQgPSA3MjI7CiAgICB0LmNvbW1hYWNjZW50ID0gMjUwOwogICAgdC5jb3B5cmlnaHQgPSA3NDc7CiAgICB0LkVtYWNyb24gPSA2Njc7CiAgICB0LmNjYXJvbiA9IDQ0NDsKICAgIHQuYXJpbmcgPSA1MDA7CiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKICAgIHQubGFjdXRlID0gMjc4OwogICAgdC5hZ3JhdmUgPSA1MDA7CiAgICB0LlRjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuQ2FjdXRlID0gNzIyOwogICAgdC5hdGlsZGUgPSA1MDA7CiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CiAgICB0LnNjYXJvbiA9IDM4OTsKICAgIHQuc2NlZGlsbGEgPSAzODk7CiAgICB0LmlhY3V0ZSA9IDI3ODsKICAgIHQubG96ZW5nZSA9IDQ5NDsKICAgIHQuUmNhcm9uID0gNzIyOwogICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LnVjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5hY2lyY3VtZmxleCA9IDUwMDsKICAgIHQuQW1hY3JvbiA9IDcyMjsKICAgIHQucmNhcm9uID0gNDQ0OwogICAgdC5jY2VkaWxsYSA9IDQ0NDsKICAgIHQuWmRvdGFjY2VudCA9IDY2NzsKICAgIHQuVGhvcm4gPSA2MTE7CiAgICB0Lk9tYWNyb24gPSA3Nzg7CiAgICB0LlJhY3V0ZSA9IDcyMjsKICAgIHQuU2FjdXRlID0gNTU2OwogICAgdC5kY2Fyb24gPSA2NzI7CiAgICB0LlVtYWNyb24gPSA3MjI7CiAgICB0LnVyaW5nID0gNTU2OwogICAgdC50aHJlZXN1cGVyaW9yID0gMzAwOwogICAgdC5PZ3JhdmUgPSA3Nzg7CiAgICB0LkFncmF2ZSA9IDcyMjsKICAgIHQuQWJyZXZlID0gNzIyOwogICAgdC5tdWx0aXBseSA9IDU3MDsKICAgIHQudWFjdXRlID0gNTU2OwogICAgdC5UY2Fyb24gPSA2Njc7CiAgICB0LnBhcnRpYWxkaWZmID0gNDk0OwogICAgdC55ZGllcmVzaXMgPSA1MDA7CiAgICB0Lk5hY3V0ZSA9IDcyMjsKICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hZGllcmVzaXMgPSA1MDA7CiAgICB0LmVkaWVyZXNpcyA9IDQ0NDsKICAgIHQuY2FjdXRlID0gNDQ0OwogICAgdC5uYWN1dGUgPSA1NTY7CiAgICB0LnVtYWNyb24gPSA1NTY7CiAgICB0Lk5jYXJvbiA9IDcyMjsKICAgIHQuSWFjdXRlID0gMzg5OwogICAgdC5wbHVzbWludXMgPSA1NzA7CiAgICB0LmJyb2tlbmJhciA9IDIyMDsKICAgIHQucmVnaXN0ZXJlZCA9IDc0NzsKICAgIHQuR2JyZXZlID0gNzc4OwogICAgdC5JZG90YWNjZW50ID0gMzg5OwogICAgdC5zdW1tYXRpb24gPSA2MDA7CiAgICB0LkVncmF2ZSA9IDY2NzsKICAgIHQucmFjdXRlID0gNDQ0OwogICAgdC5vbWFjcm9uID0gNTAwOwogICAgdC5aYWN1dGUgPSA2Njc7CiAgICB0LlpjYXJvbiA9IDY2NzsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5FdGggPSA3MjI7CiAgICB0LkNjZWRpbGxhID0gNzIyOwogICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CiAgICB0LnRjYXJvbiA9IDQxNjsKICAgIHQuZW9nb25layA9IDQ0NDsKICAgIHQuVW9nb25layA9IDcyMjsKICAgIHQuQWFjdXRlID0gNzIyOwogICAgdC5BZGllcmVzaXMgPSA3MjI7CiAgICB0LmVncmF2ZSA9IDQ0NDsKICAgIHQuemFjdXRlID0gNDQ0OwogICAgdC5pb2dvbmVrID0gMjc4OwogICAgdC5PYWN1dGUgPSA3Nzg7CiAgICB0Lm9hY3V0ZSA9IDUwMDsKICAgIHQuYW1hY3JvbiA9IDUwMDsKICAgIHQuc2FjdXRlID0gMzg5OwogICAgdC5pZGllcmVzaXMgPSAyNzg7CiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OwogICAgdC5VZ3JhdmUgPSA3MjI7CiAgICB0LkRlbHRhID0gNjEyOwogICAgdC50aG9ybiA9IDU1NjsKICAgIHQudHdvc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKICAgIHQubXUgPSA1NTY7CiAgICB0LmlncmF2ZSA9IDI3ODsKICAgIHQub2h1bmdhcnVtbGF1dCA9IDUwMDsKICAgIHQuRW9nb25layA9IDY2NzsKICAgIHQuZGNyb2F0ID0gNTU2OwogICAgdC50aHJlZXF1YXJ0ZXJzID0gNzUwOwogICAgdC5TY2VkaWxsYSA9IDU1NjsKICAgIHQubGNhcm9uID0gMzk0OwogICAgdC5LY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LkxhY3V0ZSA9IDY2NzsKICAgIHQudHJhZGVtYXJrID0gMTAwMDsKICAgIHQuZWRvdGFjY2VudCA9IDQ0NDsKICAgIHQuSWdyYXZlID0gMzg5OwogICAgdC5JbWFjcm9uID0gMzg5OwogICAgdC5MY2Fyb24gPSA2Njc7CiAgICB0Lm9uZWhhbGYgPSA3NTA7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQub2NpcmN1bWZsZXggPSA1MDA7CiAgICB0Lm50aWxkZSA9IDU1NjsKICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuRWFjdXRlID0gNjY3OwogICAgdC5lbWFjcm9uID0gNDQ0OwogICAgdC5nYnJldmUgPSA1MDA7CiAgICB0Lm9uZXF1YXJ0ZXIgPSA3NTA7CiAgICB0LlNjYXJvbiA9IDU1NjsKICAgIHQuU2NvbW1hYWNjZW50ID0gNTU2OwogICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OwogICAgdC5kZWdyZWUgPSA0MDA7CiAgICB0Lm9ncmF2ZSA9IDUwMDsKICAgIHQuQ2Nhcm9uID0gNzIyOwogICAgdC51Z3JhdmUgPSA1NTY7CiAgICB0LnJhZGljYWwgPSA1NDk7CiAgICB0LkRjYXJvbiA9IDcyMjsKICAgIHQucmNvbW1hYWNjZW50ID0gNDQ0OwogICAgdC5OdGlsZGUgPSA3MjI7CiAgICB0Lm90aWxkZSA9IDUwMDsKICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0LkF0aWxkZSA9IDcyMjsKICAgIHQuQW9nb25layA9IDcyMjsKICAgIHQuQXJpbmcgPSA3MjI7CiAgICB0Lk90aWxkZSA9IDc3ODsKICAgIHQuemRvdGFjY2VudCA9IDQ0NDsKICAgIHQuRWNhcm9uID0gNjY3OwogICAgdC5Jb2dvbmVrID0gMzg5OwogICAgdC5rY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm1pbnVzID0gNTcwOwogICAgdC5JY2lyY3VtZmxleCA9IDM4OTsKICAgIHQubmNhcm9uID0gNTU2OwogICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7CiAgICB0LmxvZ2ljYWxub3QgPSA1NzA7CiAgICB0Lm9kaWVyZXNpcyA9IDUwMDsKICAgIHQudWRpZXJlc2lzID0gNTU2OwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZ2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5ldGggPSA1MDA7CiAgICB0LnpjYXJvbiA9IDQ0NDsKICAgIHQubmNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5vbmVzdXBlcmlvciA9IDMwMDsKICAgIHQuaW1hY3JvbiA9IDI3ODsKICAgIHQuRXVybyA9IDUwMDsKICB9KTsKICB0WyJUaW1lcy1Cb2xkSXRhbGljIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNTA7CiAgICB0LmV4Y2xhbSA9IDM4OTsKICAgIHQucXVvdGVkYmwgPSA1NTU7CiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CiAgICB0LmRvbGxhciA9IDUwMDsKICAgIHQucGVyY2VudCA9IDgzMzsKICAgIHQuYW1wZXJzYW5kID0gNzc4OwogICAgdC5xdW90ZXJpZ2h0ID0gMzMzOwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gNTAwOwogICAgdC5wbHVzID0gNTcwOwogICAgdC5jb21tYSA9IDI1MDsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNTA7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTAwOwogICAgdC5vbmUgPSA1MDA7CiAgICB0LnR3byA9IDUwMDsKICAgIHQudGhyZWUgPSA1MDA7CiAgICB0LmZvdXIgPSA1MDA7CiAgICB0LmZpdmUgPSA1MDA7CiAgICB0LnNpeCA9IDUwMDsKICAgIHQuc2V2ZW4gPSA1MDA7CiAgICB0LmVpZ2h0ID0gNTAwOwogICAgdC5uaW5lID0gNTAwOwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNTcwOwogICAgdC5lcXVhbCA9IDU3MDsKICAgIHQuZ3JlYXRlciA9IDU3MDsKICAgIHQucXVlc3Rpb24gPSA1MDA7CiAgICB0LmF0ID0gODMyOwogICAgdC5BID0gNjY3OwogICAgdC5CID0gNjY3OwogICAgdC5DID0gNjY3OwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjY3OwogICAgdC5GID0gNjY3OwogICAgdC5HID0gNzIyOwogICAgdC5IID0gNzc4OwogICAgdC5JID0gMzg5OwogICAgdC5KID0gNTAwOwogICAgdC5LID0gNjY3OwogICAgdC5MID0gNjExOwogICAgdC5NID0gODg5OwogICAgdC5OID0gNzIyOwogICAgdC5PID0gNzIyOwogICAgdC5QID0gNjExOwogICAgdC5RID0gNzIyOwogICAgdC5SID0gNjY3OwogICAgdC5TID0gNTU2OwogICAgdC5UID0gNjExOwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjY3OwogICAgdC5XID0gODg5OwogICAgdC5YID0gNjY3OwogICAgdC5ZID0gNjExOwogICAgdC5aID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LmFzY2lpY2lyY3VtID0gNTcwOwogICAgdC51bmRlcnNjb3JlID0gNTAwOwogICAgdC5xdW90ZWxlZnQgPSAzMzM7CiAgICB0LmEgPSA1MDA7CiAgICB0LmIgPSA1MDA7CiAgICB0LmMgPSA0NDQ7CiAgICB0LmQgPSA1MDA7CiAgICB0LmUgPSA0NDQ7CiAgICB0LmYgPSAzMzM7CiAgICB0LmcgPSA1MDA7CiAgICB0LmggPSA1NTY7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA1MDA7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA3Nzg7CiAgICB0Lm4gPSA1NTY7CiAgICB0Lm8gPSA1MDA7CiAgICB0LnAgPSA1MDA7CiAgICB0LnEgPSA1MDA7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSAzODk7CiAgICB0LnQgPSAyNzg7CiAgICB0LnUgPSA1NTY7CiAgICB0LnYgPSA0NDQ7CiAgICB0LncgPSA2Njc7CiAgICB0LnggPSA1MDA7CiAgICB0LnkgPSA0NDQ7CiAgICB0LnogPSAzODk7CiAgICB0LmJyYWNlbGVmdCA9IDM0ODsKICAgIHQuYmFyID0gMjIwOwogICAgdC5icmFjZXJpZ2h0ID0gMzQ4OwogICAgdC5hc2NpaXRpbGRlID0gNTcwOwogICAgdC5leGNsYW1kb3duID0gMzg5OwogICAgdC5jZW50ID0gNTAwOwogICAgdC5zdGVybGluZyA9IDUwMDsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDUwMDsKICAgIHQuZmxvcmluID0gNTAwOwogICAgdC5zZWN0aW9uID0gNTAwOwogICAgdC5jdXJyZW5jeSA9IDUwMDsKICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTU2OwogICAgdC5mbCA9IDU1NjsKICAgIHQuZW5kYXNoID0gNTAwOwogICAgdC5kYWdnZXIgPSA1MDA7CiAgICB0LmRhZ2dlcmRibCA9IDUwMDsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CiAgICB0LnBhcmFncmFwaCA9IDUwMDsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDUwMDsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDk0NDsKICAgIHQub3JkZmVtaW5pbmUgPSAyNjY7CiAgICB0LkxzbGFzaCA9IDYxMTsKICAgIHQuT3NsYXNoID0gNzIyOwogICAgdC5PRSA9IDk0NDsKICAgIHQub3JkbWFzY3VsaW5lID0gMzAwOwogICAgdC5hZSA9IDcyMjsKICAgIHQuZG90bGVzc2kgPSAyNzg7CiAgICB0LmxzbGFzaCA9IDI3ODsKICAgIHQub3NsYXNoID0gNTAwOwogICAgdC5vZSA9IDcyMjsKICAgIHQuZ2VybWFuZGJscyA9IDUwMDsKICAgIHQuSWRpZXJlc2lzID0gMzg5OwogICAgdC5lYWN1dGUgPSA0NDQ7CiAgICB0LmFicmV2ZSA9IDUwMDsKICAgIHQudWh1bmdhcnVtbGF1dCA9IDU1NjsKICAgIHQuZWNhcm9uID0gNDQ0OwogICAgdC5ZZGllcmVzaXMgPSA2MTE7CiAgICB0LmRpdmlkZSA9IDU3MDsKICAgIHQuWWFjdXRlID0gNjExOwogICAgdC5BY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWFjdXRlID0gNTAwOwogICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKICAgIHQueWFjdXRlID0gNDQ0OwogICAgdC5zY29tbWFhY2NlbnQgPSAzODk7CiAgICB0LmVjaXJjdW1mbGV4ID0gNDQ0OwogICAgdC5VcmluZyA9IDcyMjsKICAgIHQuVWRpZXJlc2lzID0gNzIyOwogICAgdC5hb2dvbmVrID0gNTAwOwogICAgdC5VYWN1dGUgPSA3MjI7CiAgICB0LnVvZ29uZWsgPSA1NTY7CiAgICB0LkVkaWVyZXNpcyA9IDY2NzsKICAgIHQuRGNyb2F0ID0gNzIyOwogICAgdC5jb21tYWFjY2VudCA9IDI1MDsKICAgIHQuY29weXJpZ2h0ID0gNzQ3OwogICAgdC5FbWFjcm9uID0gNjY3OwogICAgdC5jY2Fyb24gPSA0NDQ7CiAgICB0LmFyaW5nID0gNTAwOwogICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LmxhY3V0ZSA9IDI3ODsKICAgIHQuYWdyYXZlID0gNTAwOwogICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkNhY3V0ZSA9IDY2NzsKICAgIHQuYXRpbGRlID0gNTAwOwogICAgdC5FZG90YWNjZW50ID0gNjY3OwogICAgdC5zY2Fyb24gPSAzODk7CiAgICB0LnNjZWRpbGxhID0gMzg5OwogICAgdC5pYWN1dGUgPSAyNzg7CiAgICB0LmxvemVuZ2UgPSA0OTQ7CiAgICB0LlJjYXJvbiA9IDY2NzsKICAgIHQuR2NvbW1hYWNjZW50ID0gNzIyOwogICAgdC51Y2lyY3VtZmxleCA9IDU1NjsKICAgIHQuYWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LkFtYWNyb24gPSA2Njc7CiAgICB0LnJjYXJvbiA9IDM4OTsKICAgIHQuY2NlZGlsbGEgPSA0NDQ7CiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CiAgICB0LlRob3JuID0gNjExOwogICAgdC5PbWFjcm9uID0gNzIyOwogICAgdC5SYWN1dGUgPSA2Njc7CiAgICB0LlNhY3V0ZSA9IDU1NjsKICAgIHQuZGNhcm9uID0gNjA4OwogICAgdC5VbWFjcm9uID0gNzIyOwogICAgdC51cmluZyA9IDU1NjsKICAgIHQudGhyZWVzdXBlcmlvciA9IDMwMDsKICAgIHQuT2dyYXZlID0gNzIyOwogICAgdC5BZ3JhdmUgPSA2Njc7CiAgICB0LkFicmV2ZSA9IDY2NzsKICAgIHQubXVsdGlwbHkgPSA1NzA7CiAgICB0LnVhY3V0ZSA9IDU1NjsKICAgIHQuVGNhcm9uID0gNjExOwogICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKICAgIHQueWRpZXJlc2lzID0gNDQ0OwogICAgdC5OYWN1dGUgPSA3MjI7CiAgICB0LmljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWRpZXJlc2lzID0gNTAwOwogICAgdC5lZGllcmVzaXMgPSA0NDQ7CiAgICB0LmNhY3V0ZSA9IDQ0NDsKICAgIHQubmFjdXRlID0gNTU2OwogICAgdC51bWFjcm9uID0gNTU2OwogICAgdC5OY2Fyb24gPSA3MjI7CiAgICB0LklhY3V0ZSA9IDM4OTsKICAgIHQucGx1c21pbnVzID0gNTcwOwogICAgdC5icm9rZW5iYXIgPSAyMjA7CiAgICB0LnJlZ2lzdGVyZWQgPSA3NDc7CiAgICB0LkdicmV2ZSA9IDcyMjsKICAgIHQuSWRvdGFjY2VudCA9IDM4OTsKICAgIHQuc3VtbWF0aW9uID0gNjAwOwogICAgdC5FZ3JhdmUgPSA2Njc7CiAgICB0LnJhY3V0ZSA9IDM4OTsKICAgIHQub21hY3JvbiA9IDUwMDsKICAgIHQuWmFjdXRlID0gNjExOwogICAgdC5aY2Fyb24gPSA2MTE7CiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKICAgIHQuRXRoID0gNzIyOwogICAgdC5DY2VkaWxsYSA9IDY2NzsKICAgIHQubGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC50Y2Fyb24gPSAzNjY7CiAgICB0LmVvZ29uZWsgPSA0NDQ7CiAgICB0LlVvZ29uZWsgPSA3MjI7CiAgICB0LkFhY3V0ZSA9IDY2NzsKICAgIHQuQWRpZXJlc2lzID0gNjY3OwogICAgdC5lZ3JhdmUgPSA0NDQ7CiAgICB0LnphY3V0ZSA9IDM4OTsKICAgIHQuaW9nb25layA9IDI3ODsKICAgIHQuT2FjdXRlID0gNzIyOwogICAgdC5vYWN1dGUgPSA1MDA7CiAgICB0LmFtYWNyb24gPSA1MDA7CiAgICB0LnNhY3V0ZSA9IDM4OTsKICAgIHQuaWRpZXJlc2lzID0gMjc4OwogICAgdC5PY2lyY3VtZmxleCA9IDcyMjsKICAgIHQuVWdyYXZlID0gNzIyOwogICAgdC5EZWx0YSA9IDYxMjsKICAgIHQudGhvcm4gPSA1MDA7CiAgICB0LnR3b3N1cGVyaW9yID0gMzAwOwogICAgdC5PZGllcmVzaXMgPSA3MjI7CiAgICB0Lm11ID0gNTc2OwogICAgdC5pZ3JhdmUgPSAyNzg7CiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LkVvZ29uZWsgPSA2Njc7CiAgICB0LmRjcm9hdCA9IDUwMDsKICAgIHQudGhyZWVxdWFydGVycyA9IDc1MDsKICAgIHQuU2NlZGlsbGEgPSA1NTY7CiAgICB0LmxjYXJvbiA9IDM4MjsKICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5MYWN1dGUgPSA2MTE7CiAgICB0LnRyYWRlbWFyayA9IDEwMDA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDM4OTsKICAgIHQuSW1hY3JvbiA9IDM4OTsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1NTY7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDY2NzsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1NTY7CiAgICB0LlNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTU2OwogICAgdC5yYWRpY2FsID0gNTQ5OwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5BdGlsZGUgPSA2Njc7CiAgICB0LkFvZ29uZWsgPSA2Njc7CiAgICB0LkFyaW5nID0gNjY3OwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSAzODk7CiAgICB0LkVjYXJvbiA9IDY2NzsKICAgIHQuSW9nb25layA9IDM4OTsKICAgIHQua2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5taW51cyA9IDYwNjsKICAgIHQuSWNpcmN1bWZsZXggPSAzODk7CiAgICB0Lm5jYXJvbiA9IDU1NjsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNjA2OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDU1NjsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSAzODk7CiAgICB0Lm5jb21tYWFjY2VudCA9IDU1NjsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdFsiVGltZXMtSXRhbGljIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNTA7CiAgICB0LmV4Y2xhbSA9IDMzMzsKICAgIHQucXVvdGVkYmwgPSA0MjA7CiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CiAgICB0LmRvbGxhciA9IDUwMDsKICAgIHQucGVyY2VudCA9IDgzMzsKICAgIHQuYW1wZXJzYW5kID0gNzc4OwogICAgdC5xdW90ZXJpZ2h0ID0gMzMzOwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gNTAwOwogICAgdC5wbHVzID0gNjc1OwogICAgdC5jb21tYSA9IDI1MDsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNTA7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTAwOwogICAgdC5vbmUgPSA1MDA7CiAgICB0LnR3byA9IDUwMDsKICAgIHQudGhyZWUgPSA1MDA7CiAgICB0LmZvdXIgPSA1MDA7CiAgICB0LmZpdmUgPSA1MDA7CiAgICB0LnNpeCA9IDUwMDsKICAgIHQuc2V2ZW4gPSA1MDA7CiAgICB0LmVpZ2h0ID0gNTAwOwogICAgdC5uaW5lID0gNTAwOwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNjc1OwogICAgdC5lcXVhbCA9IDY3NTsKICAgIHQuZ3JlYXRlciA9IDY3NTsKICAgIHQucXVlc3Rpb24gPSA1MDA7CiAgICB0LmF0ID0gOTIwOwogICAgdC5BID0gNjExOwogICAgdC5CID0gNjExOwogICAgdC5DID0gNjY3OwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjExOwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzIyOwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMzMzOwogICAgdC5KID0gNDQ0OwogICAgdC5LID0gNjY3OwogICAgdC5MID0gNTU2OwogICAgdC5NID0gODMzOwogICAgdC5OID0gNjY3OwogICAgdC5PID0gNzIyOwogICAgdC5QID0gNjExOwogICAgdC5RID0gNzIyOwogICAgdC5SID0gNjExOwogICAgdC5TID0gNTAwOwogICAgdC5UID0gNTU2OwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjExOwogICAgdC5XID0gODMzOwogICAgdC5YID0gNjExOwogICAgdC5ZID0gNTU2OwogICAgdC5aID0gNTU2OwogICAgdC5icmFja2V0bGVmdCA9IDM4OTsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzODk7CiAgICB0LmFzY2lpY2lyY3VtID0gNDIyOwogICAgdC51bmRlcnNjb3JlID0gNTAwOwogICAgdC5xdW90ZWxlZnQgPSAzMzM7CiAgICB0LmEgPSA1MDA7CiAgICB0LmIgPSA1MDA7CiAgICB0LmMgPSA0NDQ7CiAgICB0LmQgPSA1MDA7CiAgICB0LmUgPSA0NDQ7CiAgICB0LmYgPSAyNzg7CiAgICB0LmcgPSA1MDA7CiAgICB0LmggPSA1MDA7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA0NDQ7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA3MjI7CiAgICB0Lm4gPSA1MDA7CiAgICB0Lm8gPSA1MDA7CiAgICB0LnAgPSA1MDA7CiAgICB0LnEgPSA1MDA7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSAzODk7CiAgICB0LnQgPSAyNzg7CiAgICB0LnUgPSA1MDA7CiAgICB0LnYgPSA0NDQ7CiAgICB0LncgPSA2Njc7CiAgICB0LnggPSA0NDQ7CiAgICB0LnkgPSA0NDQ7CiAgICB0LnogPSAzODk7CiAgICB0LmJyYWNlbGVmdCA9IDQwMDsKICAgIHQuYmFyID0gMjc1OwogICAgdC5icmFjZXJpZ2h0ID0gNDAwOwogICAgdC5hc2NpaXRpbGRlID0gNTQxOwogICAgdC5leGNsYW1kb3duID0gMzg5OwogICAgdC5jZW50ID0gNTAwOwogICAgdC5zdGVybGluZyA9IDUwMDsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDUwMDsKICAgIHQuZmxvcmluID0gNTAwOwogICAgdC5zZWN0aW9uID0gNTAwOwogICAgdC5jdXJyZW5jeSA9IDUwMDsKICAgIHQucXVvdGVzaW5nbGUgPSAyMTQ7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDU1NjsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTAwOwogICAgdC5mbCA9IDUwMDsKICAgIHQuZW5kYXNoID0gNTAwOwogICAgdC5kYWdnZXIgPSA1MDA7CiAgICB0LmRhZ2dlcmRibCA9IDUwMDsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CiAgICB0LnBhcmFncmFwaCA9IDUyMzsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxiYXNlID0gNTU2OwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTU2OwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKICAgIHQuZWxsaXBzaXMgPSA4ODk7CiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKICAgIHQucXVlc3Rpb25kb3duID0gNTAwOwogICAgdC5ncmF2ZSA9IDMzMzsKICAgIHQuYWN1dGUgPSAzMzM7CiAgICB0LmNpcmN1bWZsZXggPSAzMzM7CiAgICB0LnRpbGRlID0gMzMzOwogICAgdC5tYWNyb24gPSAzMzM7CiAgICB0LmJyZXZlID0gMzMzOwogICAgdC5kb3RhY2NlbnQgPSAzMzM7CiAgICB0LmRpZXJlc2lzID0gMzMzOwogICAgdC5yaW5nID0gMzMzOwogICAgdC5jZWRpbGxhID0gMzMzOwogICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CiAgICB0Lm9nb25layA9IDMzMzsKICAgIHQuY2Fyb24gPSAzMzM7CiAgICB0LmVtZGFzaCA9IDg4OTsKICAgIHQuQUUgPSA4ODk7CiAgICB0Lm9yZGZlbWluaW5lID0gMjc2OwogICAgdC5Mc2xhc2ggPSA1NTY7CiAgICB0Lk9zbGFzaCA9IDcyMjsKICAgIHQuT0UgPSA5NDQ7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDsKICAgIHQuYWUgPSA2Njc7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyNzg7CiAgICB0Lm9zbGFzaCA9IDUwMDsKICAgIHQub2UgPSA2Njc7CiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7CiAgICB0LklkaWVyZXNpcyA9IDMzMzsKICAgIHQuZWFjdXRlID0gNDQ0OwogICAgdC5hYnJldmUgPSA1MDA7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LmVjYXJvbiA9IDQ0NDsKICAgIHQuWWRpZXJlc2lzID0gNTU2OwogICAgdC5kaXZpZGUgPSA2NzU7CiAgICB0LllhY3V0ZSA9IDU1NjsKICAgIHQuQWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFhY3V0ZSA9IDUwMDsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDQ0NDsKICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OwogICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDUwMDsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTAwOwogICAgdC5FZGllcmVzaXMgPSA2MTE7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDc2MDsKICAgIHQuRW1hY3JvbiA9IDYxMTsKICAgIHQuY2Nhcm9uID0gNDQ0OwogICAgdC5hcmluZyA9IDUwMDsKICAgIHQuTmNvbW1hYWNjZW50ID0gNjY3OwogICAgdC5sYWN1dGUgPSAyNzg7CiAgICB0LmFncmF2ZSA9IDUwMDsKICAgIHQuVGNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5DYWN1dGUgPSA2Njc7CiAgICB0LmF0aWxkZSA9IDUwMDsKICAgIHQuRWRvdGFjY2VudCA9IDYxMTsKICAgIHQuc2Nhcm9uID0gMzg5OwogICAgdC5zY2VkaWxsYSA9IDM4OTsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA2MTE7CiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjsKICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LmFjaXJjdW1mbGV4ID0gNTAwOwogICAgdC5BbWFjcm9uID0gNjExOwogICAgdC5yY2Fyb24gPSAzODk7CiAgICB0LmNjZWRpbGxhID0gNDQ0OwogICAgdC5aZG90YWNjZW50ID0gNTU2OwogICAgdC5UaG9ybiA9IDYxMTsKICAgIHQuT21hY3JvbiA9IDcyMjsKICAgIHQuUmFjdXRlID0gNjExOwogICAgdC5TYWN1dGUgPSA1MDA7CiAgICB0LmRjYXJvbiA9IDU0NDsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1MDA7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9ncmF2ZSA9IDcyMjsKICAgIHQuQWdyYXZlID0gNjExOwogICAgdC5BYnJldmUgPSA2MTE7CiAgICB0Lm11bHRpcGx5ID0gNjc1OwogICAgdC51YWN1dGUgPSA1MDA7CiAgICB0LlRjYXJvbiA9IDU1NjsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDQ0NDsKICAgIHQuTmFjdXRlID0gNjY3OwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFkaWVyZXNpcyA9IDUwMDsKICAgIHQuZWRpZXJlc2lzID0gNDQ0OwogICAgdC5jYWN1dGUgPSA0NDQ7CiAgICB0Lm5hY3V0ZSA9IDUwMDsKICAgIHQudW1hY3JvbiA9IDUwMDsKICAgIHQuTmNhcm9uID0gNjY3OwogICAgdC5JYWN1dGUgPSAzMzM7CiAgICB0LnBsdXNtaW51cyA9IDY3NTsKICAgIHQuYnJva2VuYmFyID0gMjc1OwogICAgdC5yZWdpc3RlcmVkID0gNzYwOwogICAgdC5HYnJldmUgPSA3MjI7CiAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjExOwogICAgdC5yYWN1dGUgPSAzODk7CiAgICB0Lm9tYWNyb24gPSA1MDA7CiAgICB0LlphY3V0ZSA9IDU1NjsKICAgIHQuWmNhcm9uID0gNTU2OwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA2Njc7CiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKICAgIHQudGNhcm9uID0gMzAwOwogICAgdC5lb2dvbmVrID0gNDQ0OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA2MTE7CiAgICB0LkFkaWVyZXNpcyA9IDYxMTsKICAgIHQuZWdyYXZlID0gNDQ0OwogICAgdC56YWN1dGUgPSAzODk7CiAgICB0LmlvZ29uZWsgPSAyNzg7CiAgICB0Lk9hY3V0ZSA9IDcyMjsKICAgIHQub2FjdXRlID0gNTAwOwogICAgdC5hbWFjcm9uID0gNTAwOwogICAgdC5zYWN1dGUgPSAzODk7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTAwOwogICAgdC50d29zdXBlcmlvciA9IDMwMDsKICAgIHQuT2RpZXJlc2lzID0gNzIyOwogICAgdC5tdSA9IDUwMDsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOwogICAgdC5Fb2dvbmVrID0gNjExOwogICAgdC5kY3JvYXQgPSA1MDA7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CiAgICB0LlNjZWRpbGxhID0gNTAwOwogICAgdC5sY2Fyb24gPSAzMDA7CiAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGFjdXRlID0gNTU2OwogICAgdC50cmFkZW1hcmsgPSA5ODA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDMzMzsKICAgIHQuSW1hY3JvbiA9IDMzMzsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1MDA7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDYxMTsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1MDA7CiAgICB0LlNjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTAwOwogICAgdC5yYWRpY2FsID0gNDUzOwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuTnRpbGRlID0gNjY3OwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuTGNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5BdGlsZGUgPSA2MTE7CiAgICB0LkFvZ29uZWsgPSA2MTE7CiAgICB0LkFyaW5nID0gNjExOwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSAzODk7CiAgICB0LkVjYXJvbiA9IDYxMTsKICAgIHQuSW9nb25layA9IDMzMzsKICAgIHQua2NvbW1hYWNjZW50ID0gNDQ0OwogICAgdC5taW51cyA9IDY3NTsKICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7CiAgICB0Lm5jYXJvbiA9IDUwMDsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNjc1OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDUwMDsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSAzODk7CiAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdC5aYXBmRGluZ2JhdHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNzg7CiAgICB0LmExID0gOTc0OwogICAgdC5hMiA9IDk2MTsKICAgIHQuYTIwMiA9IDk3NDsKICAgIHQuYTMgPSA5ODA7CiAgICB0LmE0ID0gNzE5OwogICAgdC5hNSA9IDc4OTsKICAgIHQuYTExOSA9IDc5MDsKICAgIHQuYTExOCA9IDc5MTsKICAgIHQuYTExNyA9IDY5MDsKICAgIHQuYTExID0gOTYwOwogICAgdC5hMTIgPSA5Mzk7CiAgICB0LmExMyA9IDU0OTsKICAgIHQuYTE0ID0gODU1OwogICAgdC5hMTUgPSA5MTE7CiAgICB0LmExNiA9IDkzMzsKICAgIHQuYTEwNSA9IDkxMTsKICAgIHQuYTE3ID0gOTQ1OwogICAgdC5hMTggPSA5NzQ7CiAgICB0LmExOSA9IDc1NTsKICAgIHQuYTIwID0gODQ2OwogICAgdC5hMjEgPSA3NjI7CiAgICB0LmEyMiA9IDc2MTsKICAgIHQuYTIzID0gNTcxOwogICAgdC5hMjQgPSA2Nzc7CiAgICB0LmEyNSA9IDc2MzsKICAgIHQuYTI2ID0gNzYwOwogICAgdC5hMjcgPSA3NTk7CiAgICB0LmEyOCA9IDc1NDsKICAgIHQuYTYgPSA0OTQ7CiAgICB0LmE3ID0gNTUyOwogICAgdC5hOCA9IDUzNzsKICAgIHQuYTkgPSA1Nzc7CiAgICB0LmExMCA9IDY5MjsKICAgIHQuYTI5ID0gNzg2OwogICAgdC5hMzAgPSA3ODg7CiAgICB0LmEzMSA9IDc4ODsKICAgIHQuYTMyID0gNzkwOwogICAgdC5hMzMgPSA3OTM7CiAgICB0LmEzNCA9IDc5NDsKICAgIHQuYTM1ID0gODE2OwogICAgdC5hMzYgPSA4MjM7CiAgICB0LmEzNyA9IDc4OTsKICAgIHQuYTM4ID0gODQxOwogICAgdC5hMzkgPSA4MjM7CiAgICB0LmE0MCA9IDgzMzsKICAgIHQuYTQxID0gODE2OwogICAgdC5hNDIgPSA4MzE7CiAgICB0LmE0MyA9IDkyMzsKICAgIHQuYTQ0ID0gNzQ0OwogICAgdC5hNDUgPSA3MjM7CiAgICB0LmE0NiA9IDc0OTsKICAgIHQuYTQ3ID0gNzkwOwogICAgdC5hNDggPSA3OTI7CiAgICB0LmE0OSA9IDY5NTsKICAgIHQuYTUwID0gNzc2OwogICAgdC5hNTEgPSA3Njg7CiAgICB0LmE1MiA9IDc5MjsKICAgIHQuYTUzID0gNzU5OwogICAgdC5hNTQgPSA3MDc7CiAgICB0LmE1NSA9IDcwODsKICAgIHQuYTU2ID0gNjgyOwogICAgdC5hNTcgPSA3MDE7CiAgICB0LmE1OCA9IDgyNjsKICAgIHQuYTU5ID0gODE1OwogICAgdC5hNjAgPSA3ODk7CiAgICB0LmE2MSA9IDc4OTsKICAgIHQuYTYyID0gNzA3OwogICAgdC5hNjMgPSA2ODc7CiAgICB0LmE2NCA9IDY5NjsKICAgIHQuYTY1ID0gNjg5OwogICAgdC5hNjYgPSA3ODY7CiAgICB0LmE2NyA9IDc4NzsKICAgIHQuYTY4ID0gNzEzOwogICAgdC5hNjkgPSA3OTE7CiAgICB0LmE3MCA9IDc4NTsKICAgIHQuYTcxID0gNzkxOwogICAgdC5hNzIgPSA4NzM7CiAgICB0LmE3MyA9IDc2MTsKICAgIHQuYTc0ID0gNzYyOwogICAgdC5hMjAzID0gNzYyOwogICAgdC5hNzUgPSA3NTk7CiAgICB0LmEyMDQgPSA3NTk7CiAgICB0LmE3NiA9IDg5MjsKICAgIHQuYTc3ID0gODkyOwogICAgdC5hNzggPSA3ODg7CiAgICB0LmE3OSA9IDc4NDsKICAgIHQuYTgxID0gNDM4OwogICAgdC5hODIgPSAxMzg7CiAgICB0LmE4MyA9IDI3NzsKICAgIHQuYTg0ID0gNDE1OwogICAgdC5hOTcgPSAzOTI7CiAgICB0LmE5OCA9IDM5MjsKICAgIHQuYTk5ID0gNjY4OwogICAgdC5hMTAwID0gNjY4OwogICAgdC5hODkgPSAzOTA7CiAgICB0LmE5MCA9IDM5MDsKICAgIHQuYTkzID0gMzE3OwogICAgdC5hOTQgPSAzMTc7CiAgICB0LmE5MSA9IDI3NjsKICAgIHQuYTkyID0gMjc2OwogICAgdC5hMjA1ID0gNTA5OwogICAgdC5hODUgPSA1MDk7CiAgICB0LmEyMDYgPSA0MTA7CiAgICB0LmE4NiA9IDQxMDsKICAgIHQuYTg3ID0gMjM0OwogICAgdC5hODggPSAyMzQ7CiAgICB0LmE5NSA9IDMzNDsKICAgIHQuYTk2ID0gMzM0OwogICAgdC5hMTAxID0gNzMyOwogICAgdC5hMTAyID0gNTQ0OwogICAgdC5hMTAzID0gNTQ0OwogICAgdC5hMTA0ID0gOTEwOwogICAgdC5hMTA2ID0gNjY3OwogICAgdC5hMTA3ID0gNzYwOwogICAgdC5hMTA4ID0gNzYwOwogICAgdC5hMTEyID0gNzc2OwogICAgdC5hMTExID0gNTk1OwogICAgdC5hMTEwID0gNjk0OwogICAgdC5hMTA5ID0gNjI2OwogICAgdC5hMTIwID0gNzg4OwogICAgdC5hMTIxID0gNzg4OwogICAgdC5hMTIyID0gNzg4OwogICAgdC5hMTIzID0gNzg4OwogICAgdC5hMTI0ID0gNzg4OwogICAgdC5hMTI1ID0gNzg4OwogICAgdC5hMTI2ID0gNzg4OwogICAgdC5hMTI3ID0gNzg4OwogICAgdC5hMTI4ID0gNzg4OwogICAgdC5hMTI5ID0gNzg4OwogICAgdC5hMTMwID0gNzg4OwogICAgdC5hMTMxID0gNzg4OwogICAgdC5hMTMyID0gNzg4OwogICAgdC5hMTMzID0gNzg4OwogICAgdC5hMTM0ID0gNzg4OwogICAgdC5hMTM1ID0gNzg4OwogICAgdC5hMTM2ID0gNzg4OwogICAgdC5hMTM3ID0gNzg4OwogICAgdC5hMTM4ID0gNzg4OwogICAgdC5hMTM5ID0gNzg4OwogICAgdC5hMTQwID0gNzg4OwogICAgdC5hMTQxID0gNzg4OwogICAgdC5hMTQyID0gNzg4OwogICAgdC5hMTQzID0gNzg4OwogICAgdC5hMTQ0ID0gNzg4OwogICAgdC5hMTQ1ID0gNzg4OwogICAgdC5hMTQ2ID0gNzg4OwogICAgdC5hMTQ3ID0gNzg4OwogICAgdC5hMTQ4ID0gNzg4OwogICAgdC5hMTQ5ID0gNzg4OwogICAgdC5hMTUwID0gNzg4OwogICAgdC5hMTUxID0gNzg4OwogICAgdC5hMTUyID0gNzg4OwogICAgdC5hMTUzID0gNzg4OwogICAgdC5hMTU0ID0gNzg4OwogICAgdC5hMTU1ID0gNzg4OwogICAgdC5hMTU2ID0gNzg4OwogICAgdC5hMTU3ID0gNzg4OwogICAgdC5hMTU4ID0gNzg4OwogICAgdC5hMTU5ID0gNzg4OwogICAgdC5hMTYwID0gODk0OwogICAgdC5hMTYxID0gODM4OwogICAgdC5hMTYzID0gMTAxNjsKICAgIHQuYTE2NCA9IDQ1ODsKICAgIHQuYTE5NiA9IDc0ODsKICAgIHQuYTE2NSA9IDkyNDsKICAgIHQuYTE5MiA9IDc0ODsKICAgIHQuYTE2NiA9IDkxODsKICAgIHQuYTE2NyA9IDkyNzsKICAgIHQuYTE2OCA9IDkyODsKICAgIHQuYTE2OSA9IDkyODsKICAgIHQuYTE3MCA9IDgzNDsKICAgIHQuYTE3MSA9IDg3MzsKICAgIHQuYTE3MiA9IDgyODsKICAgIHQuYTE3MyA9IDkyNDsKICAgIHQuYTE2MiA9IDkyNDsKICAgIHQuYTE3NCA9IDkxNzsKICAgIHQuYTE3NSA9IDkzMDsKICAgIHQuYTE3NiA9IDkzMTsKICAgIHQuYTE3NyA9IDQ2MzsKICAgIHQuYTE3OCA9IDg4MzsKICAgIHQuYTE3OSA9IDgzNjsKICAgIHQuYTE5MyA9IDgzNjsKICAgIHQuYTE4MCA9IDg2NzsKICAgIHQuYTE5OSA9IDg2NzsKICAgIHQuYTE4MSA9IDY5NjsKICAgIHQuYTIwMCA9IDY5NjsKICAgIHQuYTE4MiA9IDg3NDsKICAgIHQuYTIwMSA9IDg3NDsKICAgIHQuYTE4MyA9IDc2MDsKICAgIHQuYTE4NCA9IDk0NjsKICAgIHQuYTE5NyA9IDc3MTsKICAgIHQuYTE4NSA9IDg2NTsKICAgIHQuYTE5NCA9IDc3MTsKICAgIHQuYTE5OCA9IDg4ODsKICAgIHQuYTE4NiA9IDk2NzsKICAgIHQuYTE5NSA9IDg4ODsKICAgIHQuYTE4NyA9IDgzMTsKICAgIHQuYTE4OCA9IDg3MzsKICAgIHQuYTE4OSA9IDkyNzsKICAgIHQuYTE5MCA9IDk3MDsKICAgIHQuYTE5MSA9IDkxODsKICB9KTsKfSk7CmNvbnN0IGdldEZvbnRCYXNpY01ldHJpY3MgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LkNvdXJpZXIgPSB7CiAgICBhc2NlbnQ6IDYyOSwKICAgIGRlc2NlbnQ6IC0xNTcsCiAgICBjYXBIZWlnaHQ6IDU2MiwKICAgIHhIZWlnaHQ6IC00MjYKICB9OwogIHRbIkNvdXJpZXItQm9sZCJdID0gewogICAgYXNjZW50OiA2MjksCiAgICBkZXNjZW50OiAtMTU3LAogICAgY2FwSGVpZ2h0OiA1NjIsCiAgICB4SGVpZ2h0OiA0MzkKICB9OwogIHRbIkNvdXJpZXItT2JsaXF1ZSJdID0gewogICAgYXNjZW50OiA2MjksCiAgICBkZXNjZW50OiAtMTU3LAogICAgY2FwSGVpZ2h0OiA1NjIsCiAgICB4SGVpZ2h0OiA0MjYKICB9OwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9IHsKICAgIGFzY2VudDogNjI5LAogICAgZGVzY2VudDogLTE1NywKICAgIGNhcEhlaWdodDogNTYyLAogICAgeEhlaWdodDogNDI2CiAgfTsKICB0LkhlbHZldGljYSA9IHsKICAgIGFzY2VudDogNzE4LAogICAgZGVzY2VudDogLTIwNywKICAgIGNhcEhlaWdodDogNzE4LAogICAgeEhlaWdodDogNTIzCiAgfTsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gewogICAgYXNjZW50OiA3MTgsCiAgICBkZXNjZW50OiAtMjA3LAogICAgY2FwSGVpZ2h0OiA3MTgsCiAgICB4SGVpZ2h0OiA1MzIKICB9OwogIHRbIkhlbHZldGljYS1PYmxpcXVlIl0gPSB7CiAgICBhc2NlbnQ6IDcxOCwKICAgIGRlc2NlbnQ6IC0yMDcsCiAgICBjYXBIZWlnaHQ6IDcxOCwKICAgIHhIZWlnaHQ6IDUyMwogIH07CiAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSB7CiAgICBhc2NlbnQ6IDcxOCwKICAgIGRlc2NlbnQ6IC0yMDcsCiAgICBjYXBIZWlnaHQ6IDcxOCwKICAgIHhIZWlnaHQ6IDUzMgogIH07CiAgdFsiVGltZXMtUm9tYW4iXSA9IHsKICAgIGFzY2VudDogNjgzLAogICAgZGVzY2VudDogLTIxNywKICAgIGNhcEhlaWdodDogNjYyLAogICAgeEhlaWdodDogNDUwCiAgfTsKICB0WyJUaW1lcy1Cb2xkIl0gPSB7CiAgICBhc2NlbnQ6IDY4MywKICAgIGRlc2NlbnQ6IC0yMTcsCiAgICBjYXBIZWlnaHQ6IDY3NiwKICAgIHhIZWlnaHQ6IDQ2MQogIH07CiAgdFsiVGltZXMtSXRhbGljIl0gPSB7CiAgICBhc2NlbnQ6IDY4MywKICAgIGRlc2NlbnQ6IC0yMTcsCiAgICBjYXBIZWlnaHQ6IDY1MywKICAgIHhIZWlnaHQ6IDQ0MQogIH07CiAgdFsiVGltZXMtQm9sZEl0YWxpYyJdID0gewogICAgYXNjZW50OiA2ODMsCiAgICBkZXNjZW50OiAtMjE3LAogICAgY2FwSGVpZ2h0OiA2NjksCiAgICB4SGVpZ2h0OiA0NjIKICB9OwogIHQuU3ltYm9sID0gewogICAgYXNjZW50OiBNYXRoLk5hTiwKICAgIGRlc2NlbnQ6IE1hdGguTmFOLAogICAgY2FwSGVpZ2h0OiBNYXRoLk5hTiwKICAgIHhIZWlnaHQ6IE1hdGguTmFOCiAgfTsKICB0LlphcGZEaW5nYmF0cyA9IHsKICAgIGFzY2VudDogTWF0aC5OYU4sCiAgICBkZXNjZW50OiBNYXRoLk5hTiwKICAgIGNhcEhlaWdodDogTWF0aC5OYU4sCiAgICB4SGVpZ2h0OiBNYXRoLk5hTgogIH07Cn0pOwoKOy8vIC4vc3JjL2NvcmUvZ2x5Zi5qcwpjb25zdCBPTl9DVVJWRV9QT0lOVCA9IDEgPDwgMDsKY29uc3QgWF9TSE9SVF9WRUNUT1IgPSAxIDw8IDE7CmNvbnN0IFlfU0hPUlRfVkVDVE9SID0gMSA8PCAyOwpjb25zdCBSRVBFQVRfRkxBRyA9IDEgPDwgMzsKY29uc3QgWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SID0gMSA8PCA0Owpjb25zdCBZX0lTX1NBTUVfT1JfUE9TSVRJVkVfWV9TSE9SVF9WRUNUT1IgPSAxIDw8IDU7CmNvbnN0IE9WRVJMQVBfU0lNUExFID0gMSA8PCA2Owpjb25zdCBBUkdfMV9BTkRfMl9BUkVfV09SRFMgPSAxIDw8IDA7CmNvbnN0IEFSR1NfQVJFX1hZX1ZBTFVFUyA9IDEgPDwgMTsKY29uc3QgV0VfSEFWRV9BX1NDQUxFID0gMSA8PCAzOwpjb25zdCBNT1JFX0NPTVBPTkVOVFMgPSAxIDw8IDU7CmNvbnN0IFdFX0hBVkVfQU5fWF9BTkRfWV9TQ0FMRSA9IDEgPDwgNjsKY29uc3QgV0VfSEFWRV9BX1RXT19CWV9UV08gPSAxIDw8IDc7CmNvbnN0IFdFX0hBVkVfSU5TVFJVQ1RJT05TID0gMSA8PCA4OwpjbGFzcyBHbHlmVGFibGUgewogIGNvbnN0cnVjdG9yKHsKICAgIGdseWZUYWJsZSwKICAgIGlzR2x5cGhMb2NhdGlvbnNMb25nLAogICAgbG9jYVRhYmxlLAogICAgbnVtR2x5cGhzCiAgfSkgewogICAgdGhpcy5nbHlwaHMgPSBbXTsKICAgIGNvbnN0IGxvY2EgPSBuZXcgRGF0YVZpZXcobG9jYVRhYmxlLmJ1ZmZlciwgbG9jYVRhYmxlLmJ5dGVPZmZzZXQsIGxvY2FUYWJsZS5ieXRlTGVuZ3RoKTsKICAgIGNvbnN0IGdseWYgPSBuZXcgRGF0YVZpZXcoZ2x5ZlRhYmxlLmJ1ZmZlciwgZ2x5ZlRhYmxlLmJ5dGVPZmZzZXQsIGdseWZUYWJsZS5ieXRlTGVuZ3RoKTsKICAgIGNvbnN0IG9mZnNldFNpemUgPSBpc0dseXBoTG9jYXRpb25zTG9uZyA/IDQgOiAyOwogICAgbGV0IHByZXYgPSBpc0dseXBoTG9jYXRpb25zTG9uZyA/IGxvY2EuZ2V0VWludDMyKDApIDogMiAqIGxvY2EuZ2V0VWludDE2KDApOwogICAgbGV0IHBvcyA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUdseXBoczsgaSsrKSB7CiAgICAgIHBvcyArPSBvZmZzZXRTaXplOwogICAgICBjb25zdCBuZXh0ID0gaXNHbHlwaExvY2F0aW9uc0xvbmcgPyBsb2NhLmdldFVpbnQzMihwb3MpIDogMiAqIGxvY2EuZ2V0VWludDE2KHBvcyk7CiAgICAgIGlmIChuZXh0ID09PSBwcmV2KSB7CiAgICAgICAgdGhpcy5nbHlwaHMucHVzaChuZXcgR2x5cGgoe30pKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBnbHlwaCA9IEdseXBoLnBhcnNlKHByZXYsIGdseWYpOwogICAgICB0aGlzLmdseXBocy5wdXNoKGdseXBoKTsKICAgICAgcHJldiA9IG5leHQ7CiAgICB9CiAgfQogIGdldFNpemUoKSB7CiAgICByZXR1cm4gTWF0aC5zdW1QcmVjaXNlKHRoaXMuZ2x5cGhzLm1hcChnID0+IGcuZ2V0U2l6ZSgpICsgMyAmIH4zKSk7CiAgfQogIHdyaXRlKCkgewogICAgY29uc3QgdG90YWxTaXplID0gdGhpcy5nZXRTaXplKCk7CiAgICBjb25zdCBnbHlmVGFibGUgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKHRvdGFsU2l6ZSkpOwogICAgY29uc3QgaXNMb2NhdGlvbkxvbmcgPSB0b3RhbFNpemUgPiAweDFmZmZlOwogICAgY29uc3Qgb2Zmc2V0U2l6ZSA9IGlzTG9jYXRpb25Mb25nID8gNCA6IDI7CiAgICBjb25zdCBsb2NhVGFibGUgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKCh0aGlzLmdseXBocy5sZW5ndGggKyAxKSAqIG9mZnNldFNpemUpKTsKICAgIGlmIChpc0xvY2F0aW9uTG9uZykgewogICAgICBsb2NhVGFibGUuc2V0VWludDMyKDAsIDApOwogICAgfSBlbHNlIHsKICAgICAgbG9jYVRhYmxlLnNldFVpbnQxNigwLCAwKTsKICAgIH0KICAgIGxldCBwb3MgPSAwOwogICAgbGV0IGxvY2FJbmRleCA9IDA7CiAgICBmb3IgKGNvbnN0IGdseXBoIG9mIHRoaXMuZ2x5cGhzKSB7CiAgICAgIHBvcyArPSBnbHlwaC53cml0ZShwb3MsIGdseWZUYWJsZSk7CiAgICAgIHBvcyA9IHBvcyArIDMgJiB+MzsKICAgICAgbG9jYUluZGV4ICs9IG9mZnNldFNpemU7CiAgICAgIGlmIChpc0xvY2F0aW9uTG9uZykgewogICAgICAgIGxvY2FUYWJsZS5zZXRVaW50MzIobG9jYUluZGV4LCBwb3MpOwogICAgICB9IGVsc2UgewogICAgICAgIGxvY2FUYWJsZS5zZXRVaW50MTYobG9jYUluZGV4LCBwb3MgPj4gMSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGlzTG9jYXRpb25Mb25nLAogICAgICBsb2NhOiBuZXcgVWludDhBcnJheShsb2NhVGFibGUuYnVmZmVyKSwKICAgICAgZ2x5ZjogbmV3IFVpbnQ4QXJyYXkoZ2x5ZlRhYmxlLmJ1ZmZlcikKICAgIH07CiAgfQogIHNjYWxlKGZhY3RvcnMpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgdGhpcy5nbHlwaHNbaV0uc2NhbGUoZmFjdG9yc1tpXSk7CiAgICB9CiAgfQp9CmNsYXNzIEdseXBoIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBoZWFkZXIgPSBudWxsLAogICAgc2ltcGxlID0gbnVsbCwKICAgIGNvbXBvc2l0ZXMgPSBudWxsCiAgfSkgewogICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CiAgICB0aGlzLnNpbXBsZSA9IHNpbXBsZTsKICAgIHRoaXMuY29tcG9zaXRlcyA9IGNvbXBvc2l0ZXM7CiAgfQogIHN0YXRpYyBwYXJzZShwb3MsIGdseWYpIHsKICAgIGNvbnN0IFtyZWFkLCBoZWFkZXJdID0gR2x5cGhIZWFkZXIucGFyc2UocG9zLCBnbHlmKTsKICAgIHBvcyArPSByZWFkOwogICAgaWYgKGhlYWRlci5udW1iZXJPZkNvbnRvdXJzIDwgMCkgewogICAgICBjb25zdCBjb21wb3NpdGVzID0gW107CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgY29uc3QgW24sIGNvbXBvc2l0ZV0gPSBDb21wb3NpdGVHbHlwaC5wYXJzZShwb3MsIGdseWYpOwogICAgICAgIHBvcyArPSBuOwogICAgICAgIGNvbXBvc2l0ZXMucHVzaChjb21wb3NpdGUpOwogICAgICAgIGlmICghKGNvbXBvc2l0ZS5mbGFncyAmIE1PUkVfQ09NUE9ORU5UUykpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbmV3IEdseXBoKHsKICAgICAgICBoZWFkZXIsCiAgICAgICAgY29tcG9zaXRlcwogICAgICB9KTsKICAgIH0KICAgIGNvbnN0IHNpbXBsZSA9IFNpbXBsZUdseXBoLnBhcnNlKHBvcywgZ2x5ZiwgaGVhZGVyLm51bWJlck9mQ29udG91cnMpOwogICAgcmV0dXJuIG5ldyBHbHlwaCh7CiAgICAgIGhlYWRlciwKICAgICAgc2ltcGxlCiAgICB9KTsKICB9CiAgZ2V0U2l6ZSgpIHsKICAgIGlmICghdGhpcy5oZWFkZXIpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBjb25zdCBzaXplID0gdGhpcy5zaW1wbGUgPyB0aGlzLnNpbXBsZS5nZXRTaXplKCkgOiBNYXRoLnN1bVByZWNpc2UodGhpcy5jb21wb3NpdGVzLm1hcChjID0+IGMuZ2V0U2l6ZSgpKSk7CiAgICByZXR1cm4gdGhpcy5oZWFkZXIuZ2V0U2l6ZSgpICsgc2l6ZTsKICB9CiAgd3JpdGUocG9zLCBidWYpIHsKICAgIGlmICghdGhpcy5oZWFkZXIpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBjb25zdCBzcG9zID0gcG9zOwogICAgcG9zICs9IHRoaXMuaGVhZGVyLndyaXRlKHBvcywgYnVmKTsKICAgIGlmICh0aGlzLnNpbXBsZSkgewogICAgICBwb3MgKz0gdGhpcy5zaW1wbGUud3JpdGUocG9zLCBidWYpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChjb25zdCBjb21wb3NpdGUgb2YgdGhpcy5jb21wb3NpdGVzKSB7CiAgICAgICAgcG9zICs9IGNvbXBvc2l0ZS53cml0ZShwb3MsIGJ1Zik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwb3MgLSBzcG9zOwogIH0KICBzY2FsZShmYWN0b3IpIHsKICAgIGlmICghdGhpcy5oZWFkZXIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgeE1pZGRsZSA9ICh0aGlzLmhlYWRlci54TWluICsgdGhpcy5oZWFkZXIueE1heCkgLyAyOwogICAgdGhpcy5oZWFkZXIuc2NhbGUoeE1pZGRsZSwgZmFjdG9yKTsKICAgIGlmICh0aGlzLnNpbXBsZSkgewogICAgICB0aGlzLnNpbXBsZS5zY2FsZSh4TWlkZGxlLCBmYWN0b3IpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChjb25zdCBjb21wb3NpdGUgb2YgdGhpcy5jb21wb3NpdGVzKSB7CiAgICAgICAgY29tcG9zaXRlLnNjYWxlKHhNaWRkbGUsIGZhY3Rvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KY2xhc3MgR2x5cGhIZWFkZXIgewogIGNvbnN0cnVjdG9yKHsKICAgIG51bWJlck9mQ29udG91cnMsCiAgICB4TWluLAogICAgeU1pbiwKICAgIHhNYXgsCiAgICB5TWF4CiAgfSkgewogICAgdGhpcy5udW1iZXJPZkNvbnRvdXJzID0gbnVtYmVyT2ZDb250b3VyczsKICAgIHRoaXMueE1pbiA9IHhNaW47CiAgICB0aGlzLnlNaW4gPSB5TWluOwogICAgdGhpcy54TWF4ID0geE1heDsKICAgIHRoaXMueU1heCA9IHlNYXg7CiAgfQogIHN0YXRpYyBwYXJzZShwb3MsIGdseWYpIHsKICAgIHJldHVybiBbMTAsIG5ldyBHbHlwaEhlYWRlcih7CiAgICAgIG51bWJlck9mQ29udG91cnM6IGdseWYuZ2V0SW50MTYocG9zKSwKICAgICAgeE1pbjogZ2x5Zi5nZXRJbnQxNihwb3MgKyAyKSwKICAgICAgeU1pbjogZ2x5Zi5nZXRJbnQxNihwb3MgKyA0KSwKICAgICAgeE1heDogZ2x5Zi5nZXRJbnQxNihwb3MgKyA2KSwKICAgICAgeU1heDogZ2x5Zi5nZXRJbnQxNihwb3MgKyA4KQogICAgfSldOwogIH0KICBnZXRTaXplKCkgewogICAgcmV0dXJuIDEwOwogIH0KICB3cml0ZShwb3MsIGJ1ZikgewogICAgYnVmLnNldEludDE2KHBvcywgdGhpcy5udW1iZXJPZkNvbnRvdXJzKTsKICAgIGJ1Zi5zZXRJbnQxNihwb3MgKyAyLCB0aGlzLnhNaW4pOwogICAgYnVmLnNldEludDE2KHBvcyArIDQsIHRoaXMueU1pbik7CiAgICBidWYuc2V0SW50MTYocG9zICsgNiwgdGhpcy54TWF4KTsKICAgIGJ1Zi5zZXRJbnQxNihwb3MgKyA4LCB0aGlzLnlNYXgpOwogICAgcmV0dXJuIDEwOwogIH0KICBzY2FsZSh4LCBmYWN0b3IpIHsKICAgIHRoaXMueE1pbiA9IE1hdGgucm91bmQoeCArICh0aGlzLnhNaW4gLSB4KSAqIGZhY3Rvcik7CiAgICB0aGlzLnhNYXggPSBNYXRoLnJvdW5kKHggKyAodGhpcy54TWF4IC0geCkgKiBmYWN0b3IpOwogIH0KfQpjbGFzcyBDb250b3VyIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBmbGFncywKICAgIHhDb29yZGluYXRlcywKICAgIHlDb29yZGluYXRlcwogIH0pIHsKICAgIHRoaXMueENvb3JkaW5hdGVzID0geENvb3JkaW5hdGVzOwogICAgdGhpcy55Q29vcmRpbmF0ZXMgPSB5Q29vcmRpbmF0ZXM7CiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7CiAgfQp9CmNsYXNzIFNpbXBsZUdseXBoIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBjb250b3VycywKICAgIGluc3RydWN0aW9ucwogIH0pIHsKICAgIHRoaXMuY29udG91cnMgPSBjb250b3VyczsKICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zOwogIH0KICBzdGF0aWMgcGFyc2UocG9zLCBnbHlmLCBudW1iZXJPZkNvbnRvdXJzKSB7CiAgICBjb25zdCBlbmRQdHNPZkNvbnRvdXJzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mQ29udG91cnM7IGkrKykgewogICAgICBjb25zdCBlbmRQdCA9IGdseWYuZ2V0VWludDE2KHBvcyk7CiAgICAgIHBvcyArPSAyOwogICAgICBlbmRQdHNPZkNvbnRvdXJzLnB1c2goZW5kUHQpOwogICAgfQogICAgY29uc3QgbnVtYmVyT2ZQdCA9IGVuZFB0c09mQ29udG91cnNbbnVtYmVyT2ZDb250b3VycyAtIDFdICsgMTsKICAgIGNvbnN0IGluc3RydWN0aW9uTGVuZ3RoID0gZ2x5Zi5nZXRVaW50MTYocG9zKTsKICAgIHBvcyArPSAyOwogICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gbmV3IFVpbnQ4QXJyYXkoZ2x5Zikuc2xpY2UocG9zLCBwb3MgKyBpbnN0cnVjdGlvbkxlbmd0aCk7CiAgICBwb3MgKz0gaW5zdHJ1Y3Rpb25MZW5ndGg7CiAgICBjb25zdCBmbGFncyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZlB0OyBwb3MrKywgaSsrKSB7CiAgICAgIGxldCBmbGFnID0gZ2x5Zi5nZXRVaW50OChwb3MpOwogICAgICBmbGFncy5wdXNoKGZsYWcpOwogICAgICBpZiAoZmxhZyAmIFJFUEVBVF9GTEFHKSB7CiAgICAgICAgY29uc3QgY291bnQgPSBnbHlmLmdldFVpbnQ4KCsrcG9zKTsKICAgICAgICBmbGFnIF49IFJFUEVBVF9GTEFHOwogICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgY291bnQ7IG0rKykgewogICAgICAgICAgZmxhZ3MucHVzaChmbGFnKTsKICAgICAgICB9CiAgICAgICAgaSArPSBjb3VudDsKICAgICAgfQogICAgfQogICAgY29uc3QgYWxsWENvb3JkaW5hdGVzID0gW107CiAgICBsZXQgeENvb3JkaW5hdGVzID0gW107CiAgICBsZXQgeUNvb3JkaW5hdGVzID0gW107CiAgICBsZXQgcG9pbnRGbGFncyA9IFtdOwogICAgY29uc3QgY29udG91cnMgPSBbXTsKICAgIGxldCBlbmRQdHNPZkNvbnRvdXJzSW5kZXggPSAwOwogICAgbGV0IGxhc3RDb29yZGluYXRlID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZQdDsgaSsrKSB7CiAgICAgIGNvbnN0IGZsYWcgPSBmbGFnc1tpXTsKICAgICAgaWYgKGZsYWcgJiBYX1NIT1JUX1ZFQ1RPUikgewogICAgICAgIGNvbnN0IHggPSBnbHlmLmdldFVpbnQ4KHBvcysrKTsKICAgICAgICBsYXN0Q29vcmRpbmF0ZSArPSBmbGFnICYgWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SID8geCA6IC14OwogICAgICAgIHhDb29yZGluYXRlcy5wdXNoKGxhc3RDb29yZGluYXRlKTsKICAgICAgfSBlbHNlIGlmIChmbGFnICYgWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SKSB7CiAgICAgICAgeENvb3JkaW5hdGVzLnB1c2gobGFzdENvb3JkaW5hdGUpOwogICAgICB9IGVsc2UgewogICAgICAgIGxhc3RDb29yZGluYXRlICs9IGdseWYuZ2V0SW50MTYocG9zKTsKICAgICAgICBwb3MgKz0gMjsKICAgICAgICB4Q29vcmRpbmF0ZXMucHVzaChsYXN0Q29vcmRpbmF0ZSk7CiAgICAgIH0KICAgICAgaWYgKGVuZFB0c09mQ29udG91cnNbZW5kUHRzT2ZDb250b3Vyc0luZGV4XSA9PT0gaSkgewogICAgICAgIGVuZFB0c09mQ29udG91cnNJbmRleCsrOwogICAgICAgIGFsbFhDb29yZGluYXRlcy5wdXNoKHhDb29yZGluYXRlcyk7CiAgICAgICAgeENvb3JkaW5hdGVzID0gW107CiAgICAgIH0KICAgIH0KICAgIGxhc3RDb29yZGluYXRlID0gMDsKICAgIGVuZFB0c09mQ29udG91cnNJbmRleCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mUHQ7IGkrKykgewogICAgICBjb25zdCBmbGFnID0gZmxhZ3NbaV07CiAgICAgIGlmIChmbGFnICYgWV9TSE9SVF9WRUNUT1IpIHsKICAgICAgICBjb25zdCB5ID0gZ2x5Zi5nZXRVaW50OChwb3MrKyk7CiAgICAgICAgbGFzdENvb3JkaW5hdGUgKz0gZmxhZyAmIFlfSVNfU0FNRV9PUl9QT1NJVElWRV9ZX1NIT1JUX1ZFQ1RPUiA/IHkgOiAteTsKICAgICAgICB5Q29vcmRpbmF0ZXMucHVzaChsYXN0Q29vcmRpbmF0ZSk7CiAgICAgIH0gZWxzZSBpZiAoZmxhZyAmIFlfSVNfU0FNRV9PUl9QT1NJVElWRV9ZX1NIT1JUX1ZFQ1RPUikgewogICAgICAgIHlDb29yZGluYXRlcy5wdXNoKGxhc3RDb29yZGluYXRlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsYXN0Q29vcmRpbmF0ZSArPSBnbHlmLmdldEludDE2KHBvcyk7CiAgICAgICAgcG9zICs9IDI7CiAgICAgICAgeUNvb3JkaW5hdGVzLnB1c2gobGFzdENvb3JkaW5hdGUpOwogICAgICB9CiAgICAgIHBvaW50RmxhZ3MucHVzaChmbGFnICYgT05fQ1VSVkVfUE9JTlQgfCBmbGFnICYgT1ZFUkxBUF9TSU1QTEUpOwogICAgICBpZiAoZW5kUHRzT2ZDb250b3Vyc1tlbmRQdHNPZkNvbnRvdXJzSW5kZXhdID09PSBpKSB7CiAgICAgICAgeENvb3JkaW5hdGVzID0gYWxsWENvb3JkaW5hdGVzW2VuZFB0c09mQ29udG91cnNJbmRleF07CiAgICAgICAgZW5kUHRzT2ZDb250b3Vyc0luZGV4Kys7CiAgICAgICAgY29udG91cnMucHVzaChuZXcgQ29udG91cih7CiAgICAgICAgICBmbGFnczogcG9pbnRGbGFncywKICAgICAgICAgIHhDb29yZGluYXRlcywKICAgICAgICAgIHlDb29yZGluYXRlcwogICAgICAgIH0pKTsKICAgICAgICB5Q29vcmRpbmF0ZXMgPSBbXTsKICAgICAgICBwb2ludEZsYWdzID0gW107CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU2ltcGxlR2x5cGgoewogICAgICBjb250b3VycywKICAgICAgaW5zdHJ1Y3Rpb25zCiAgICB9KTsKICB9CiAgZ2V0U2l6ZSgpIHsKICAgIGxldCBzaXplID0gdGhpcy5jb250b3Vycy5sZW5ndGggKiAyICsgMiArIHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aDsKICAgIGxldCBsYXN0WCA9IDA7CiAgICBsZXQgbGFzdFkgPSAwOwogICAgZm9yIChjb25zdCBjb250b3VyIG9mIHRoaXMuY29udG91cnMpIHsKICAgICAgc2l6ZSArPSBjb250b3VyLmZsYWdzLmxlbmd0aDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY29udG91ci54Q29vcmRpbmF0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IHggPSBjb250b3VyLnhDb29yZGluYXRlc1tpXTsKICAgICAgICBjb25zdCB5ID0gY29udG91ci55Q29vcmRpbmF0ZXNbaV07CiAgICAgICAgbGV0IGFicyA9IE1hdGguYWJzKHggLSBsYXN0WCk7CiAgICAgICAgaWYgKGFicyA+IDI1NSkgewogICAgICAgICAgc2l6ZSArPSAyOwogICAgICAgIH0gZWxzZSBpZiAoYWJzID4gMCkgewogICAgICAgICAgc2l6ZSArPSAxOwogICAgICAgIH0KICAgICAgICBsYXN0WCA9IHg7CiAgICAgICAgYWJzID0gTWF0aC5hYnMoeSAtIGxhc3RZKTsKICAgICAgICBpZiAoYWJzID4gMjU1KSB7CiAgICAgICAgICBzaXplICs9IDI7CiAgICAgICAgfSBlbHNlIGlmIChhYnMgPiAwKSB7CiAgICAgICAgICBzaXplICs9IDE7CiAgICAgICAgfQogICAgICAgIGxhc3RZID0geTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNpemU7CiAgfQogIHdyaXRlKHBvcywgYnVmKSB7CiAgICBjb25zdCBzcG9zID0gcG9zOwogICAgY29uc3QgeENvb3JkaW5hdGVzID0gW107CiAgICBjb25zdCB5Q29vcmRpbmF0ZXMgPSBbXTsKICAgIGNvbnN0IGZsYWdzID0gW107CiAgICBsZXQgbGFzdFggPSAwOwogICAgbGV0IGxhc3RZID0gMDsKICAgIGZvciAoY29uc3QgY29udG91ciBvZiB0aGlzLmNvbnRvdXJzKSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNvbnRvdXIueENvb3JkaW5hdGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBsZXQgZmxhZyA9IGNvbnRvdXIuZmxhZ3NbaV07CiAgICAgICAgY29uc3QgeCA9IGNvbnRvdXIueENvb3JkaW5hdGVzW2ldOwogICAgICAgIGxldCBkZWx0YSA9IHggLSBsYXN0WDsKICAgICAgICBpZiAoZGVsdGEgPT09IDApIHsKICAgICAgICAgIGZsYWcgfD0gWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SOwogICAgICAgICAgeENvb3JkaW5hdGVzLnB1c2goMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGFicyA9IE1hdGguYWJzKGRlbHRhKTsKICAgICAgICAgIGlmIChhYnMgPD0gMjU1KSB7CiAgICAgICAgICAgIGZsYWcgfD0gZGVsdGEgPj0gMCA/IFhfU0hPUlRfVkVDVE9SIHwgWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SIDogWF9TSE9SVF9WRUNUT1I7CiAgICAgICAgICAgIHhDb29yZGluYXRlcy5wdXNoKGFicyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB4Q29vcmRpbmF0ZXMucHVzaChkZWx0YSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxhc3RYID0geDsKICAgICAgICBjb25zdCB5ID0gY29udG91ci55Q29vcmRpbmF0ZXNbaV07CiAgICAgICAgZGVsdGEgPSB5IC0gbGFzdFk7CiAgICAgICAgaWYgKGRlbHRhID09PSAwKSB7CiAgICAgICAgICBmbGFnIHw9IFlfSVNfU0FNRV9PUl9QT1NJVElWRV9ZX1NIT1JUX1ZFQ1RPUjsKICAgICAgICAgIHlDb29yZGluYXRlcy5wdXNoKDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBhYnMgPSBNYXRoLmFicyhkZWx0YSk7CiAgICAgICAgICBpZiAoYWJzIDw9IDI1NSkgewogICAgICAgICAgICBmbGFnIHw9IGRlbHRhID49IDAgPyBZX1NIT1JUX1ZFQ1RPUiB8IFlfSVNfU0FNRV9PUl9QT1NJVElWRV9ZX1NIT1JUX1ZFQ1RPUiA6IFlfU0hPUlRfVkVDVE9SOwogICAgICAgICAgICB5Q29vcmRpbmF0ZXMucHVzaChhYnMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgeUNvb3JkaW5hdGVzLnB1c2goZGVsdGEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsYXN0WSA9IHk7CiAgICAgICAgZmxhZ3MucHVzaChmbGFnKTsKICAgICAgfQogICAgICBidWYuc2V0VWludDE2KHBvcywgeENvb3JkaW5hdGVzLmxlbmd0aCAtIDEpOwogICAgICBwb3MgKz0gMjsKICAgIH0KICAgIGJ1Zi5zZXRVaW50MTYocG9zLCB0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgpOwogICAgcG9zICs9IDI7CiAgICBpZiAodGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoKSB7CiAgICAgIG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIDAsIGJ1Zi5idWZmZXIuYnl0ZUxlbmd0aCkuc2V0KHRoaXMuaW5zdHJ1Y3Rpb25zLCBwb3MpOwogICAgICBwb3MgKz0gdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoOwogICAgfQogICAgZm9yIChjb25zdCBmbGFnIG9mIGZsYWdzKSB7CiAgICAgIGJ1Zi5zZXRVaW50OChwb3MrKywgZmxhZyk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB4Q29vcmRpbmF0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCB4ID0geENvb3JkaW5hdGVzW2ldOwogICAgICBjb25zdCBmbGFnID0gZmxhZ3NbaV07CiAgICAgIGlmIChmbGFnICYgWF9TSE9SVF9WRUNUT1IpIHsKICAgICAgICBidWYuc2V0VWludDgocG9zKyssIHgpOwogICAgICB9IGVsc2UgaWYgKCEoZmxhZyAmIFhfSVNfU0FNRV9PUl9QT1NJVElWRV9YX1NIT1JUX1ZFQ1RPUikpIHsKICAgICAgICBidWYuc2V0SW50MTYocG9zLCB4KTsKICAgICAgICBwb3MgKz0gMjsKICAgICAgfQogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0geUNvb3JkaW5hdGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgeSA9IHlDb29yZGluYXRlc1tpXTsKICAgICAgY29uc3QgZmxhZyA9IGZsYWdzW2ldOwogICAgICBpZiAoZmxhZyAmIFlfU0hPUlRfVkVDVE9SKSB7CiAgICAgICAgYnVmLnNldFVpbnQ4KHBvcysrLCB5KTsKICAgICAgfSBlbHNlIGlmICghKGZsYWcgJiBZX0lTX1NBTUVfT1JfUE9TSVRJVkVfWV9TSE9SVF9WRUNUT1IpKSB7CiAgICAgICAgYnVmLnNldEludDE2KHBvcywgeSk7CiAgICAgICAgcG9zICs9IDI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwb3MgLSBzcG9zOwogIH0KICBzY2FsZSh4LCBmYWN0b3IpIHsKICAgIGZvciAoY29uc3QgY29udG91ciBvZiB0aGlzLmNvbnRvdXJzKSB7CiAgICAgIGlmIChjb250b3VyLnhDb29yZGluYXRlcy5sZW5ndGggPT09IDApIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjb250b3VyLnhDb29yZGluYXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29udG91ci54Q29vcmRpbmF0ZXNbaV0gPSBNYXRoLnJvdW5kKHggKyAoY29udG91ci54Q29vcmRpbmF0ZXNbaV0gLSB4KSAqIGZhY3Rvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KY2xhc3MgQ29tcG9zaXRlR2x5cGggewogIGNvbnN0cnVjdG9yKHsKICAgIGZsYWdzLAogICAgZ2x5cGhJbmRleCwKICAgIGFyZ3VtZW50MSwKICAgIGFyZ3VtZW50MiwKICAgIHRyYW5zZiwKICAgIGluc3RydWN0aW9ucwogIH0pIHsKICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKICAgIHRoaXMuZ2x5cGhJbmRleCA9IGdseXBoSW5kZXg7CiAgICB0aGlzLmFyZ3VtZW50MSA9IGFyZ3VtZW50MTsKICAgIHRoaXMuYXJndW1lbnQyID0gYXJndW1lbnQyOwogICAgdGhpcy50cmFuc2YgPSB0cmFuc2Y7CiAgICB0aGlzLmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uczsKICB9CiAgc3RhdGljIHBhcnNlKHBvcywgZ2x5ZikgewogICAgY29uc3Qgc3BvcyA9IHBvczsKICAgIGNvbnN0IHRyYW5zZiA9IFtdOwogICAgbGV0IGZsYWdzID0gZ2x5Zi5nZXRVaW50MTYocG9zKTsKICAgIGNvbnN0IGdseXBoSW5kZXggPSBnbHlmLmdldFVpbnQxNihwb3MgKyAyKTsKICAgIHBvcyArPSA0OwogICAgbGV0IGFyZ3VtZW50MSwgYXJndW1lbnQyOwogICAgaWYgKGZsYWdzICYgQVJHXzFfQU5EXzJfQVJFX1dPUkRTKSB7CiAgICAgIGlmIChmbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUykgewogICAgICAgIGFyZ3VtZW50MSA9IGdseWYuZ2V0SW50MTYocG9zKTsKICAgICAgICBhcmd1bWVudDIgPSBnbHlmLmdldEludDE2KHBvcyArIDIpOwogICAgICB9IGVsc2UgewogICAgICAgIGFyZ3VtZW50MSA9IGdseWYuZ2V0VWludDE2KHBvcyk7CiAgICAgICAgYXJndW1lbnQyID0gZ2x5Zi5nZXRVaW50MTYocG9zICsgMik7CiAgICAgIH0KICAgICAgcG9zICs9IDQ7CiAgICAgIGZsYWdzIF49IEFSR18xX0FORF8yX0FSRV9XT1JEUzsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChmbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUykgewogICAgICAgIGFyZ3VtZW50MSA9IGdseWYuZ2V0SW50OChwb3MpOwogICAgICAgIGFyZ3VtZW50MiA9IGdseWYuZ2V0SW50OChwb3MgKyAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcmd1bWVudDEgPSBnbHlmLmdldFVpbnQ4KHBvcyk7CiAgICAgICAgYXJndW1lbnQyID0gZ2x5Zi5nZXRVaW50OChwb3MgKyAxKTsKICAgICAgfQogICAgICBwb3MgKz0gMjsKICAgIH0KICAgIGlmIChmbGFncyAmIFdFX0hBVkVfQV9TQ0FMRSkgewogICAgICB0cmFuc2YucHVzaChnbHlmLmdldFVpbnQxNihwb3MpKTsKICAgICAgcG9zICs9IDI7CiAgICB9IGVsc2UgaWYgKGZsYWdzICYgV0VfSEFWRV9BTl9YX0FORF9ZX1NDQUxFKSB7CiAgICAgIHRyYW5zZi5wdXNoKGdseWYuZ2V0VWludDE2KHBvcyksIGdseWYuZ2V0VWludDE2KHBvcyArIDIpKTsKICAgICAgcG9zICs9IDQ7CiAgICB9IGVsc2UgaWYgKGZsYWdzICYgV0VfSEFWRV9BX1RXT19CWV9UV08pIHsKICAgICAgdHJhbnNmLnB1c2goZ2x5Zi5nZXRVaW50MTYocG9zKSwgZ2x5Zi5nZXRVaW50MTYocG9zICsgMiksIGdseWYuZ2V0VWludDE2KHBvcyArIDQpLCBnbHlmLmdldFVpbnQxNihwb3MgKyA2KSk7CiAgICAgIHBvcyArPSA4OwogICAgfQogICAgbGV0IGluc3RydWN0aW9ucyA9IG51bGw7CiAgICBpZiAoZmxhZ3MgJiBXRV9IQVZFX0lOU1RSVUNUSU9OUykgewogICAgICBjb25zdCBpbnN0cnVjdGlvbkxlbmd0aCA9IGdseWYuZ2V0VWludDE2KHBvcyk7CiAgICAgIHBvcyArPSAyOwogICAgICBpbnN0cnVjdGlvbnMgPSBuZXcgVWludDhBcnJheShnbHlmKS5zbGljZShwb3MsIHBvcyArIGluc3RydWN0aW9uTGVuZ3RoKTsKICAgICAgcG9zICs9IGluc3RydWN0aW9uTGVuZ3RoOwogICAgfQogICAgcmV0dXJuIFtwb3MgLSBzcG9zLCBuZXcgQ29tcG9zaXRlR2x5cGgoewogICAgICBmbGFncywKICAgICAgZ2x5cGhJbmRleCwKICAgICAgYXJndW1lbnQxLAogICAgICBhcmd1bWVudDIsCiAgICAgIHRyYW5zZiwKICAgICAgaW5zdHJ1Y3Rpb25zCiAgICB9KV07CiAgfQogIGdldFNpemUoKSB7CiAgICBsZXQgc2l6ZSA9IDIgKyAyICsgdGhpcy50cmFuc2YubGVuZ3RoICogMjsKICAgIGlmICh0aGlzLmZsYWdzICYgV0VfSEFWRV9JTlNUUlVDVElPTlMpIHsKICAgICAgc2l6ZSArPSAyICsgdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoOwogICAgfQogICAgc2l6ZSArPSAyOwogICAgaWYgKHRoaXMuZmxhZ3MgJiAyKSB7CiAgICAgIGlmICghKHRoaXMuYXJndW1lbnQxID49IC0xMjggJiYgdGhpcy5hcmd1bWVudDEgPD0gMTI3ICYmIHRoaXMuYXJndW1lbnQyID49IC0xMjggJiYgdGhpcy5hcmd1bWVudDIgPD0gMTI3KSkgewogICAgICAgIHNpemUgKz0gMjsKICAgICAgfQogICAgfSBlbHNlIGlmICghKHRoaXMuYXJndW1lbnQxID49IDAgJiYgdGhpcy5hcmd1bWVudDEgPD0gMjU1ICYmIHRoaXMuYXJndW1lbnQyID49IDAgJiYgdGhpcy5hcmd1bWVudDIgPD0gMjU1KSkgewogICAgICBzaXplICs9IDI7CiAgICB9CiAgICByZXR1cm4gc2l6ZTsKICB9CiAgd3JpdGUocG9zLCBidWYpIHsKICAgIGNvbnN0IHNwb3MgPSBwb3M7CiAgICBpZiAodGhpcy5mbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUykgewogICAgICBpZiAoISh0aGlzLmFyZ3VtZW50MSA+PSAtMTI4ICYmIHRoaXMuYXJndW1lbnQxIDw9IDEyNyAmJiB0aGlzLmFyZ3VtZW50MiA+PSAtMTI4ICYmIHRoaXMuYXJndW1lbnQyIDw9IDEyNykpIHsKICAgICAgICB0aGlzLmZsYWdzIHw9IEFSR18xX0FORF8yX0FSRV9XT1JEUzsKICAgICAgfQogICAgfSBlbHNlIGlmICghKHRoaXMuYXJndW1lbnQxID49IDAgJiYgdGhpcy5hcmd1bWVudDEgPD0gMjU1ICYmIHRoaXMuYXJndW1lbnQyID49IDAgJiYgdGhpcy5hcmd1bWVudDIgPD0gMjU1KSkgewogICAgICB0aGlzLmZsYWdzIHw9IEFSR18xX0FORF8yX0FSRV9XT1JEUzsKICAgIH0KICAgIGJ1Zi5zZXRVaW50MTYocG9zLCB0aGlzLmZsYWdzKTsKICAgIGJ1Zi5zZXRVaW50MTYocG9zICsgMiwgdGhpcy5nbHlwaEluZGV4KTsKICAgIHBvcyArPSA0OwogICAgaWYgKHRoaXMuZmxhZ3MgJiBBUkdfMV9BTkRfMl9BUkVfV09SRFMpIHsKICAgICAgaWYgKHRoaXMuZmxhZ3MgJiBBUkdTX0FSRV9YWV9WQUxVRVMpIHsKICAgICAgICBidWYuc2V0SW50MTYocG9zLCB0aGlzLmFyZ3VtZW50MSk7CiAgICAgICAgYnVmLnNldEludDE2KHBvcyArIDIsIHRoaXMuYXJndW1lbnQyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWYuc2V0VWludDE2KHBvcywgdGhpcy5hcmd1bWVudDEpOwogICAgICAgIGJ1Zi5zZXRVaW50MTYocG9zICsgMiwgdGhpcy5hcmd1bWVudDIpOwogICAgICB9CiAgICAgIHBvcyArPSA0OwogICAgfSBlbHNlIHsKICAgICAgYnVmLnNldFVpbnQ4KHBvcywgdGhpcy5hcmd1bWVudDEpOwogICAgICBidWYuc2V0VWludDgocG9zICsgMSwgdGhpcy5hcmd1bWVudDIpOwogICAgICBwb3MgKz0gMjsKICAgIH0KICAgIGlmICh0aGlzLmZsYWdzICYgV0VfSEFWRV9JTlNUUlVDVElPTlMpIHsKICAgICAgYnVmLnNldFVpbnQxNihwb3MsIHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCk7CiAgICAgIHBvcyArPSAyOwogICAgICBpZiAodGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgMCwgYnVmLmJ1ZmZlci5ieXRlTGVuZ3RoKS5zZXQodGhpcy5pbnN0cnVjdGlvbnMsIHBvcyk7CiAgICAgICAgcG9zICs9IHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBvcyAtIHNwb3M7CiAgfQogIHNjYWxlKHgsIGZhY3Rvcikge30KfQoKOy8vIC4vc3JjL2NvcmUvb3BlbnR5cGVfZmlsZV9idWlsZGVyLmpzCgoKZnVuY3Rpb24gd3JpdGVJbnQxNihkZXN0LCBvZmZzZXQsIG51bSkgewogIGRlc3Rbb2Zmc2V0XSA9IG51bSA+PiA4ICYgMHhmZjsKICBkZXN0W29mZnNldCArIDFdID0gbnVtICYgMHhmZjsKfQpmdW5jdGlvbiB3cml0ZUludDMyKGRlc3QsIG9mZnNldCwgbnVtKSB7CiAgZGVzdFtvZmZzZXRdID0gbnVtID4+IDI0ICYgMHhmZjsKICBkZXN0W29mZnNldCArIDFdID0gbnVtID4+IDE2ICYgMHhmZjsKICBkZXN0W29mZnNldCArIDJdID0gbnVtID4+IDggJiAweGZmOwogIGRlc3Rbb2Zmc2V0ICsgM10gPSBudW0gJiAweGZmOwp9CmZ1bmN0aW9uIHdyaXRlRGF0YShkZXN0LCBvZmZzZXQsIGRhdGEpIHsKICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgIGRlc3Quc2V0KGRhdGEsIG9mZnNldCk7CiAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBkZXN0W29mZnNldCsrXSA9IGRhdGEuY2hhckNvZGVBdChpKSAmIDB4ZmY7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAoY29uc3QgbnVtIG9mIGRhdGEpIHsKICAgICAgZGVzdFtvZmZzZXQrK10gPSBudW0gJiAweGZmOwogICAgfQogIH0KfQpjb25zdCBPVEZfSEVBREVSX1NJWkUgPSAxMjsKY29uc3QgT1RGX1RBQkxFX0VOVFJZX1NJWkUgPSAxNjsKY2xhc3MgT3BlblR5cGVGaWxlQnVpbGRlciB7CiAgY29uc3RydWN0b3Ioc2ZudCkgewogICAgdGhpcy5zZm50ID0gc2ZudDsKICAgIHRoaXMudGFibGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB9CiAgc3RhdGljIGdldFNlYXJjaFBhcmFtcyhlbnRyaWVzQ291bnQsIGVudHJ5U2l6ZSkgewogICAgbGV0IG1heFBvd2VyMiA9IDEsCiAgICAgIGxvZzIgPSAwOwogICAgd2hpbGUgKChtYXhQb3dlcjIgXiBlbnRyaWVzQ291bnQpID4gbWF4UG93ZXIyKSB7CiAgICAgIG1heFBvd2VyMiA8PD0gMTsKICAgICAgbG9nMisrOwogICAgfQogICAgY29uc3Qgc2VhcmNoUmFuZ2UgPSBtYXhQb3dlcjIgKiBlbnRyeVNpemU7CiAgICByZXR1cm4gewogICAgICByYW5nZTogc2VhcmNoUmFuZ2UsCiAgICAgIGVudHJ5OiBsb2cyLAogICAgICByYW5nZVNoaWZ0OiBlbnRyeVNpemUgKiBlbnRyaWVzQ291bnQgLSBzZWFyY2hSYW5nZQogICAgfTsKICB9CiAgdG9BcnJheSgpIHsKICAgIGxldCBzZm50ID0gdGhpcy5zZm50OwogICAgY29uc3QgdGFibGVzID0gdGhpcy50YWJsZXM7CiAgICBjb25zdCB0YWJsZXNOYW1lcyA9IE9iamVjdC5rZXlzKHRhYmxlcyk7CiAgICB0YWJsZXNOYW1lcy5zb3J0KCk7CiAgICBjb25zdCBudW1UYWJsZXMgPSB0YWJsZXNOYW1lcy5sZW5ndGg7CiAgICBsZXQgaSwgaiwgamosIHRhYmxlLCB0YWJsZU5hbWU7CiAgICBsZXQgb2Zmc2V0ID0gT1RGX0hFQURFUl9TSVpFICsgbnVtVGFibGVzICogT1RGX1RBQkxFX0VOVFJZX1NJWkU7CiAgICBjb25zdCB0YWJsZU9mZnNldHMgPSBbb2Zmc2V0XTsKICAgIGZvciAoaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykgewogICAgICB0YWJsZSA9IHRhYmxlc1t0YWJsZXNOYW1lc1tpXV07CiAgICAgIGNvbnN0IHBhZGRlZExlbmd0aCA9ICh0YWJsZS5sZW5ndGggKyAzICYgfjMpID4+PiAwOwogICAgICBvZmZzZXQgKz0gcGFkZGVkTGVuZ3RoOwogICAgICB0YWJsZU9mZnNldHMucHVzaChvZmZzZXQpOwogICAgfQogICAgY29uc3QgZmlsZSA9IG5ldyBVaW50OEFycmF5KG9mZnNldCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKICAgICAgdGFibGUgPSB0YWJsZXNbdGFibGVzTmFtZXNbaV1dOwogICAgICB3cml0ZURhdGEoZmlsZSwgdGFibGVPZmZzZXRzW2ldLCB0YWJsZSk7CiAgICB9CiAgICBpZiAoc2ZudCA9PT0gInRydWUiKSB7CiAgICAgIHNmbnQgPSBzdHJpbmczMigweDAwMDEwMDAwKTsKICAgIH0KICAgIGZpbGVbMF0gPSBzZm50LmNoYXJDb2RlQXQoMCkgJiAweGZmOwogICAgZmlsZVsxXSA9IHNmbnQuY2hhckNvZGVBdCgxKSAmIDB4ZmY7CiAgICBmaWxlWzJdID0gc2ZudC5jaGFyQ29kZUF0KDIpICYgMHhmZjsKICAgIGZpbGVbM10gPSBzZm50LmNoYXJDb2RlQXQoMykgJiAweGZmOwogICAgd3JpdGVJbnQxNihmaWxlLCA0LCBudW1UYWJsZXMpOwogICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gT3BlblR5cGVGaWxlQnVpbGRlci5nZXRTZWFyY2hQYXJhbXMobnVtVGFibGVzLCAxNik7CiAgICB3cml0ZUludDE2KGZpbGUsIDYsIHNlYXJjaFBhcmFtcy5yYW5nZSk7CiAgICB3cml0ZUludDE2KGZpbGUsIDgsIHNlYXJjaFBhcmFtcy5lbnRyeSk7CiAgICB3cml0ZUludDE2KGZpbGUsIDEwLCBzZWFyY2hQYXJhbXMucmFuZ2VTaGlmdCk7CiAgICBvZmZzZXQgPSBPVEZfSEVBREVSX1NJWkU7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKICAgICAgdGFibGVOYW1lID0gdGFibGVzTmFtZXNbaV07CiAgICAgIGZpbGVbb2Zmc2V0XSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDApICYgMHhmZjsKICAgICAgZmlsZVtvZmZzZXQgKyAxXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDEpICYgMHhmZjsKICAgICAgZmlsZVtvZmZzZXQgKyAyXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDIpICYgMHhmZjsKICAgICAgZmlsZVtvZmZzZXQgKyAzXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDMpICYgMHhmZjsKICAgICAgbGV0IGNoZWNrc3VtID0gMDsKICAgICAgZm9yIChqID0gdGFibGVPZmZzZXRzW2ldLCBqaiA9IHRhYmxlT2Zmc2V0c1tpICsgMV07IGogPCBqajsgaiArPSA0KSB7CiAgICAgICAgY29uc3QgcXVhZCA9IHJlYWRVaW50MzIoZmlsZSwgaik7CiAgICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bSArIHF1YWQgPj4+IDA7CiAgICAgIH0KICAgICAgd3JpdGVJbnQzMihmaWxlLCBvZmZzZXQgKyA0LCBjaGVja3N1bSk7CiAgICAgIHdyaXRlSW50MzIoZmlsZSwgb2Zmc2V0ICsgOCwgdGFibGVPZmZzZXRzW2ldKTsKICAgICAgd3JpdGVJbnQzMihmaWxlLCBvZmZzZXQgKyAxMiwgdGFibGVzW3RhYmxlTmFtZV0ubGVuZ3RoKTsKICAgICAgb2Zmc2V0ICs9IE9URl9UQUJMRV9FTlRSWV9TSVpFOwogICAgfQogICAgcmV0dXJuIGZpbGU7CiAgfQogIGFkZFRhYmxlKHRhZywgZGF0YSkgewogICAgaWYgKHRhZyBpbiB0aGlzLnRhYmxlcykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlRhYmxlICIgKyB0YWcgKyAiIGFscmVhZHkgZXhpc3RzIik7CiAgICB9CiAgICB0aGlzLnRhYmxlc1t0YWddID0gZGF0YTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3R5cGUxX3BhcnNlci5qcwoKCgoKY29uc3QgSElOVElOR19FTkFCTEVEID0gZmFsc2U7CmNvbnN0IENPTU1BTkRfTUFQID0gewogIGhzdGVtOiBbMV0sCiAgdnN0ZW06IFszXSwKICB2bW92ZXRvOiBbNF0sCiAgcmxpbmV0bzogWzVdLAogIGhsaW5ldG86IFs2XSwKICB2bGluZXRvOiBbN10sCiAgcnJjdXJ2ZXRvOiBbOF0sCiAgY2FsbHN1YnI6IFsxMF0sCiAgZmxleDogWzEyLCAzNV0sCiAgZHJvcDogWzEyLCAxOF0sCiAgZW5kY2hhcjogWzE0XSwKICBybW92ZXRvOiBbMjFdLAogIGhtb3ZldG86IFsyMl0sCiAgdmhjdXJ2ZXRvOiBbMzBdLAogIGh2Y3VydmV0bzogWzMxXQp9OwpjbGFzcyBUeXBlMUNoYXJTdHJpbmcgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy53aWR0aCA9IDA7CiAgICB0aGlzLmxzYiA9IDA7CiAgICB0aGlzLmZsZXhpbmcgPSBmYWxzZTsKICAgIHRoaXMub3V0cHV0ID0gW107CiAgICB0aGlzLnN0YWNrID0gW107CiAgfQogIGNvbnZlcnQoZW5jb2RlZCwgc3VicnMsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKICAgIGNvbnN0IGNvdW50ID0gZW5jb2RlZC5sZW5ndGg7CiAgICBsZXQgZXJyb3IgPSBmYWxzZTsKICAgIGxldCB3eCwgc2J4LCBzdWJyTnVtYmVyOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGxldCB2YWx1ZSA9IGVuY29kZWRbaV07CiAgICAgIGlmICh2YWx1ZSA8IDMyKSB7CiAgICAgICAgaWYgKHZhbHVlID09PSAxMikgewogICAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgKyBlbmNvZGVkWysraV07CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHsKICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLmhzdGVtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7CiAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC52c3RlbSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICBpZiAodGhpcy5mbGV4aW5nKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMSkgewogICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGR5ID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goMCwgZHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bW92ZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5ybGluZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC5obGluZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bGluZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg2LCBDT01NQU5EX01BUC5ycmN1cnZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3Vick51bWJlciA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGlmICghc3VicnNbc3Vick51bWJlcl0pIHsKICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmNvbnZlcnQoc3VicnNbc3Vick51bWJlcl0sIHN1YnJzLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHd4ID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgc2J4ID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgdGhpcy5sc2IgPSBzYng7CiAgICAgICAgICAgIHRoaXMud2lkdGggPSB3eDsKICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHd4LCBzYngpOwogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaG1vdmV0byk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgdGhpcy5vdXRwdXQucHVzaChDT01NQU5EX01BUC5lbmRjaGFyWzBdKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICBpZiAodGhpcy5mbGV4aW5nKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnJtb3ZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgIGlmICh0aGlzLmZsZXhpbmcpIHsKICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goMCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDEsIENPTU1BTkRfTUFQLmhtb3ZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzA6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC52aGN1cnZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzE6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC5odmN1cnZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMDoKICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMToKICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHsKICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnZzdGVtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDI6CiAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7CiAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5oc3RlbSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyA2OgogICAgICAgICAgICBpZiAoc2VhY0FuYWx5c2lzRW5hYmxlZCkgewogICAgICAgICAgICAgIGNvbnN0IGFzYiA9IHRoaXMuc3RhY2suYXQoLTUpOwogICAgICAgICAgICAgIHRoaXMuc2VhYyA9IHRoaXMuc3RhY2suc3BsaWNlKC00LCA0KTsKICAgICAgICAgICAgICB0aGlzLnNlYWNbMF0gKz0gdGhpcy5sc2IgLSBhc2I7CiAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDAsIENPTU1BTkRfTUFQLmVuZGNoYXIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC5lbmRjaGFyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgNzoKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgNCkgewogICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICAgICAgICB3eCA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGNvbnN0IHNieSA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHNieCA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHRoaXMubHNiID0gc2J4OwogICAgICAgICAgICB0aGlzLndpZHRoID0gd3g7CiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh3eCwgc2J4LCBzYnkpOwogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMywgQ09NTUFORF9NQVAucm1vdmV0byk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxMjoKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBudW0yID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgY29uc3QgbnVtMSA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChudW0xIC8gbnVtMik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxNjoKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJyTnVtYmVyID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgY29uc3QgbnVtQXJncyA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGlmIChzdWJyTnVtYmVyID09PSAwICYmIG51bUFyZ3MgPT09IDMpIHsKICAgICAgICAgICAgICBjb25zdCBmbGV4QXJncyA9IHRoaXMuc3RhY2suc3BsaWNlKC0xNywgMTcpOwogICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChmbGV4QXJnc1syXSArIGZsZXhBcmdzWzBdLCBmbGV4QXJnc1szXSArIGZsZXhBcmdzWzFdLCBmbGV4QXJnc1s0XSwgZmxleEFyZ3NbNV0sIGZsZXhBcmdzWzZdLCBmbGV4QXJnc1s3XSwgZmxleEFyZ3NbOF0sIGZsZXhBcmdzWzldLCBmbGV4QXJnc1sxMF0sIGZsZXhBcmdzWzExXSwgZmxleEFyZ3NbMTJdLCBmbGV4QXJnc1sxM10sIGZsZXhBcmdzWzE0XSk7CiAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDEzLCBDT01NQU5EX01BUC5mbGV4LCB0cnVlKTsKICAgICAgICAgICAgICB0aGlzLmZsZXhpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goZmxleEFyZ3NbMTVdLCBmbGV4QXJnc1sxNl0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnJOdW1iZXIgPT09IDEgJiYgbnVtQXJncyA9PT0gMCkgewogICAgICAgICAgICAgIHRoaXMuZmxleGluZyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDE3OgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMzM6CiAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB3YXJuKCdVbmtub3duIHR5cGUgMSBjaGFyc3RyaW5nIGNvbW1hbmQgb2YgIicgKyB2YWx1ZSArICciJyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8PSAyNDYpIHsKICAgICAgICB2YWx1ZSAtPSAxMzk7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMjUwKSB7CiAgICAgICAgdmFsdWUgPSAodmFsdWUgLSAyNDcpICogMjU2ICsgZW5jb2RlZFsrK2ldICsgMTA4OwogICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDI1NCkgewogICAgICAgIHZhbHVlID0gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGVuY29kZWRbKytpXSAtIDEwODsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCAyNCB8IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCAxNiB8IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCA4IHwgKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDA7CiAgICAgIH0KICAgICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBlcnJvcjsKICB9CiAgZXhlY3V0ZUNvbW1hbmQoaG93TWFueUFyZ3MsIGNvbW1hbmQsIGtlZXBTdGFjaykgewogICAgY29uc3Qgc3RhY2tMZW5ndGggPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgIGlmIChob3dNYW55QXJncyA+IHN0YWNrTGVuZ3RoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgY29uc3Qgc3RhcnQgPSBzdGFja0xlbmd0aCAtIGhvd01hbnlBcmdzOwogICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhY2tMZW5ndGg7IGkrKykgewogICAgICBsZXQgdmFsdWUgPSB0aGlzLnN0YWNrW2ldOwogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKICAgICAgICB0aGlzLm91dHB1dC5wdXNoKDI4LCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9IDY1NTM2ICogdmFsdWUgfCAwOwogICAgICAgIHRoaXMub3V0cHV0LnB1c2goMjU1LCB2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7CiAgICAgIH0KICAgIH0KICAgIHRoaXMub3V0cHV0LnB1c2goLi4uY29tbWFuZCk7CiAgICBpZiAoa2VlcFN0YWNrKSB7CiAgICAgIHRoaXMuc3RhY2suc3BsaWNlKHN0YXJ0LCBob3dNYW55QXJncyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmNvbnN0IEVFWEVDX0VOQ1JZUFRfS0VZID0gNTU2NjU7CmNvbnN0IENIQVJfU1RSU19FTkNSWVBUX0tFWSA9IDQzMzA7CmZ1bmN0aW9uIGlzSGV4RGlnaXQoY29kZSkgewogIHJldHVybiBjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcgfHwgY29kZSA+PSA2NSAmJiBjb2RlIDw9IDcwIHx8IGNvZGUgPj0gOTcgJiYgY29kZSA8PSAxMDI7Cn0KZnVuY3Rpb24gZGVjcnlwdChkYXRhLCBrZXksIGRpc2NhcmROdW1iZXIpIHsKICBpZiAoZGlzY2FyZE51bWJlciA+PSBkYXRhLmxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogIH0KICBjb25zdCBjMSA9IDUyODQ1LAogICAgYzIgPSAyMjcxOTsKICBsZXQgciA9IGtleSB8IDAsCiAgICBpLAogICAgajsKICBmb3IgKGkgPSAwOyBpIDwgZGlzY2FyZE51bWJlcjsgaSsrKSB7CiAgICByID0gKGRhdGFbaV0gKyByKSAqIGMxICsgYzIgJiAoMSA8PCAxNikgLSAxOwogIH0KICBjb25zdCBjb3VudCA9IGRhdGEubGVuZ3RoIC0gZGlzY2FyZE51bWJlcjsKICBjb25zdCBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShjb3VudCk7CiAgZm9yIChpID0gZGlzY2FyZE51bWJlciwgaiA9IDA7IGogPCBjb3VudDsgaSsrLCBqKyspIHsKICAgIGNvbnN0IHZhbHVlID0gZGF0YVtpXTsKICAgIGRlY3J5cHRlZFtqXSA9IHZhbHVlIF4gciA+PiA4OwogICAgciA9ICh2YWx1ZSArIHIpICogYzEgKyBjMiAmICgxIDw8IDE2KSAtIDE7CiAgfQogIHJldHVybiBkZWNyeXB0ZWQ7Cn0KZnVuY3Rpb24gZGVjcnlwdEFzY2lpKGRhdGEsIGtleSwgZGlzY2FyZE51bWJlcikgewogIGNvbnN0IGMxID0gNTI4NDUsCiAgICBjMiA9IDIyNzE5OwogIGxldCByID0ga2V5IHwgMDsKICBjb25zdCBjb3VudCA9IGRhdGEubGVuZ3RoLAogICAgbWF5YmVMZW5ndGggPSBjb3VudCA+Pj4gMTsKICBjb25zdCBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShtYXliZUxlbmd0aCk7CiAgbGV0IGksIGo7CiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICBjb25zdCBkaWdpdDEgPSBkYXRhW2ldOwogICAgaWYgKCFpc0hleERpZ2l0KGRpZ2l0MSkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpKys7CiAgICBsZXQgZGlnaXQyOwogICAgd2hpbGUgKGkgPCBjb3VudCAmJiAhaXNIZXhEaWdpdChkaWdpdDIgPSBkYXRhW2ldKSkgewogICAgICBpKys7CiAgICB9CiAgICBpZiAoaSA8IGNvdW50KSB7CiAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQoU3RyaW5nLmZyb21DaGFyQ29kZShkaWdpdDEsIGRpZ2l0MiksIDE2KTsKICAgICAgZGVjcnlwdGVkW2orK10gPSB2YWx1ZSBeIHIgPj4gODsKICAgICAgciA9ICh2YWx1ZSArIHIpICogYzEgKyBjMiAmICgxIDw8IDE2KSAtIDE7CiAgICB9CiAgfQogIHJldHVybiBkZWNyeXB0ZWQuc2xpY2UoZGlzY2FyZE51bWJlciwgaik7Cn0KZnVuY3Rpb24gaXNTcGVjaWFsKGMpIHsKICByZXR1cm4gYyA9PT0gMHgyZiB8fCBjID09PSAweDViIHx8IGMgPT09IDB4NWQgfHwgYyA9PT0gMHg3YiB8fCBjID09PSAweDdkIHx8IGMgPT09IDB4MjggfHwgYyA9PT0gMHgyOTsKfQpjbGFzcyBUeXBlMVBhcnNlciB7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCBlbmNyeXB0ZWQsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKICAgIGlmIChlbmNyeXB0ZWQpIHsKICAgICAgY29uc3QgZGF0YSA9IHN0cmVhbS5nZXRCeXRlcygpOwogICAgICBjb25zdCBpc0JpbmFyeSA9ICEoKGlzSGV4RGlnaXQoZGF0YVswXSkgfHwgaXNXaGl0ZVNwYWNlKGRhdGFbMF0pKSAmJiBpc0hleERpZ2l0KGRhdGFbMV0pICYmIGlzSGV4RGlnaXQoZGF0YVsyXSkgJiYgaXNIZXhEaWdpdChkYXRhWzNdKSAmJiBpc0hleERpZ2l0KGRhdGFbNF0pICYmIGlzSGV4RGlnaXQoZGF0YVs1XSkgJiYgaXNIZXhEaWdpdChkYXRhWzZdKSAmJiBpc0hleERpZ2l0KGRhdGFbN10pKTsKICAgICAgc3RyZWFtID0gbmV3IFN0cmVhbShpc0JpbmFyeSA/IGRlY3J5cHQoZGF0YSwgRUVYRUNfRU5DUllQVF9LRVksIDQpIDogZGVjcnlwdEFzY2lpKGRhdGEsIEVFWEVDX0VOQ1JZUFRfS0VZLCA0KSk7CiAgICB9CiAgICB0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQgPSAhIXNlYWNBbmFseXNpc0VuYWJsZWQ7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMubmV4dENoYXIoKTsKICB9CiAgcmVhZE51bWJlckFycmF5KCkgewogICAgdGhpcy5nZXRUb2tlbigpOwogICAgY29uc3QgYXJyYXkgPSBbXTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgICBpZiAodG9rZW4gPT09IG51bGwgfHwgdG9rZW4gPT09ICJdIiB8fCB0b2tlbiA9PT0gIn0iKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgYXJyYXkucHVzaChwYXJzZUZsb2F0KHRva2VuIHx8IDApKTsKICAgIH0KICAgIHJldHVybiBhcnJheTsKICB9CiAgcmVhZE51bWJlcigpIHsKICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgcmV0dXJuIHBhcnNlRmxvYXQodG9rZW4gfHwgMCk7CiAgfQogIHJlYWRJbnQoKSB7CiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgIHJldHVybiBwYXJzZUludCh0b2tlbiB8fCAwLCAxMCkgfCAwOwogIH0KICByZWFkQm9vbGVhbigpIHsKICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgcmV0dXJuIHRva2VuID09PSAidHJ1ZSIgPyAxIDogMDsKICB9CiAgbmV4dENoYXIoKSB7CiAgICByZXR1cm4gdGhpcy5jdXJyZW50Q2hhciA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKICB9CiAgcHJldkNoYXIoKSB7CiAgICB0aGlzLnN0cmVhbS5za2lwKC0yKTsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOwogIH0KICBnZXRUb2tlbigpIHsKICAgIGxldCBjb21tZW50ID0gZmFsc2U7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKGNoID09PSAtMSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChjb21tZW50KSB7CiAgICAgICAgaWYgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKSB7CiAgICAgICAgICBjb21tZW50ID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDI1KSB7CiAgICAgICAgY29tbWVudCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoIWlzV2hpdGVTcGFjZShjaCkpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIGlmIChpc1NwZWNpYWwoY2gpKSB7CiAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgfQogICAgbGV0IHRva2VuID0gIiI7CiAgICBkbyB7CiAgICAgIHRva2VuICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0gd2hpbGUgKGNoID49IDAgJiYgIWlzV2hpdGVTcGFjZShjaCkgJiYgIWlzU3BlY2lhbChjaCkpOwogICAgcmV0dXJuIHRva2VuOwogIH0KICByZWFkQ2hhclN0cmluZ3MoYnl0ZXMsIGxlbklWKSB7CiAgICBpZiAobGVuSVYgPT09IC0xKSB7CiAgICAgIHJldHVybiBieXRlczsKICAgIH0KICAgIHJldHVybiBkZWNyeXB0KGJ5dGVzLCBDSEFSX1NUUlNfRU5DUllQVF9LRVksIGxlbklWKTsKICB9CiAgZXh0cmFjdEZvbnRQcm9ncmFtKHByb3BlcnRpZXMpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtOwogICAgY29uc3Qgc3VicnMgPSBbXSwKICAgICAgY2hhcnN0cmluZ3MgPSBbXTsKICAgIGNvbnN0IHByaXZhdGVEYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHByaXZhdGVEYXRhLmxlbklWID0gNDsKICAgIGNvbnN0IHByb2dyYW0gPSB7CiAgICAgIHN1YnJzOiBbXSwKICAgICAgY2hhcnN0cmluZ3M6IFtdLAogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgcHJpdmF0ZURhdGEKICAgICAgfQogICAgfTsKICAgIGxldCB0b2tlbiwgbGVuZ3RoLCBkYXRhLCBsZW5JVjsKICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmdldFRva2VuKCkpICE9PSBudWxsKSB7CiAgICAgIGlmICh0b2tlbiAhPT0gIi8iKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICBjYXNlICJDaGFyU3RyaW5ncyI6CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgaWYgKHRva2VuID09PSBudWxsIHx8IHRva2VuID09PSAiZW5kIikgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0b2tlbiAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZ2x5cGggPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMucmVhZEludCgpOwogICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGRhdGEgPSBsZW5ndGggPiAwID8gc3RyZWFtLmdldEJ5dGVzKGxlbmd0aCkgOiBuZXcgVWludDhBcnJheSgwKTsKICAgICAgICAgICAgbGVuSVYgPSBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGEubGVuSVY7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSB0aGlzLnJlYWRDaGFyU3RyaW5ncyhkYXRhLCBsZW5JVik7CiAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gIm5vYWNjZXNzIikgewogICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gIi8iKSB7CiAgICAgICAgICAgICAgdGhpcy5wcmV2Q2hhcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNoYXJzdHJpbmdzLnB1c2goewogICAgICAgICAgICAgIGdseXBoLAogICAgICAgICAgICAgIGVuY29kZWQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJTdWJycyI6CiAgICAgICAgICB0aGlzLnJlYWRJbnQoKTsKICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgIHdoaWxlICh0aGlzLmdldFRva2VuKCkgPT09ICJkdXAiKSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZWFkSW50KCk7CiAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMucmVhZEludCgpOwogICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGRhdGEgPSBsZW5ndGggPiAwID8gc3RyZWFtLmdldEJ5dGVzKGxlbmd0aCkgOiBuZXcgVWludDhBcnJheSgwKTsKICAgICAgICAgICAgbGVuSVYgPSBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGEubGVuSVY7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSB0aGlzLnJlYWRDaGFyU3RyaW5ncyhkYXRhLCBsZW5JVik7CiAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gIm5vYWNjZXNzIikgewogICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJyc1tpbmRleF0gPSBlbmNvZGVkOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQmx1ZVZhbHVlcyI6CiAgICAgICAgY2FzZSAiT3RoZXJCbHVlcyI6CiAgICAgICAgY2FzZSAiRmFtaWx5Qmx1ZXMiOgogICAgICAgIGNhc2UgIkZhbWlseU90aGVyQmx1ZXMiOgogICAgICAgICAgY29uc3QgYmx1ZUFycmF5ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKICAgICAgICAgIGlmIChibHVlQXJyYXkubGVuZ3RoID4gMCAmJiBibHVlQXJyYXkubGVuZ3RoICUgMiA9PT0gMCAmJiBISU5USU5HX0VOQUJMRUQpIHsKICAgICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IGJsdWVBcnJheTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlN0ZW1TbmFwSCI6CiAgICAgICAgY2FzZSAiU3RlbVNuYXBWIjoKICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiU3RkSFciOgogICAgICAgIGNhc2UgIlN0ZFZXIjoKICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpWzBdOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQmx1ZVNoaWZ0IjoKICAgICAgICBjYXNlICJsZW5JViI6CiAgICAgICAgY2FzZSAiQmx1ZUZ1enoiOgogICAgICAgIGNhc2UgIkJsdWVTY2FsZSI6CiAgICAgICAgY2FzZSAiTGFuZ3VhZ2VHcm91cCI6CiAgICAgICAgICBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbdG9rZW5dID0gdGhpcy5yZWFkTnVtYmVyKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJFeHBhbnNpb25GYWN0b3IiOgogICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZE51bWJlcigpIHx8IDAuMDY7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJGb3JjZUJvbGQiOgogICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZEJvb2xlYW4oKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IHsKICAgICAgZW5jb2RlZCwKICAgICAgZ2x5cGgKICAgIH0gb2YgY2hhcnN0cmluZ3MpIHsKICAgICAgY29uc3QgY2hhclN0cmluZyA9IG5ldyBUeXBlMUNoYXJTdHJpbmcoKTsKICAgICAgY29uc3QgZXJyb3IgPSBjaGFyU3RyaW5nLmNvbnZlcnQoZW5jb2RlZCwgc3VicnMsIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCk7CiAgICAgIGxldCBvdXRwdXQgPSBjaGFyU3RyaW5nLm91dHB1dDsKICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgb3V0cHV0ID0gWzE0XTsKICAgICAgfQogICAgICBjb25zdCBjaGFyU3RyaW5nT2JqZWN0ID0gewogICAgICAgIGdseXBoTmFtZTogZ2x5cGgsCiAgICAgICAgY2hhcnN0cmluZzogb3V0cHV0LAogICAgICAgIHdpZHRoOiBjaGFyU3RyaW5nLndpZHRoLAogICAgICAgIGxzYjogY2hhclN0cmluZy5sc2IsCiAgICAgICAgc2VhYzogY2hhclN0cmluZy5zZWFjCiAgICAgIH07CiAgICAgIGlmIChnbHlwaCA9PT0gIi5ub3RkZWYiKSB7CiAgICAgICAgcHJvZ3JhbS5jaGFyc3RyaW5ncy51bnNoaWZ0KGNoYXJTdHJpbmdPYmplY3QpOwogICAgICB9IGVsc2UgewogICAgICAgIHByb2dyYW0uY2hhcnN0cmluZ3MucHVzaChjaGFyU3RyaW5nT2JqZWN0KTsKICAgICAgfQogICAgICBpZiAocHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpIHsKICAgICAgICBjb25zdCBpbmRleCA9IHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nLmluZGV4T2YoZ2x5cGgpOwogICAgICAgIGlmIChpbmRleCA+IC0xICYmIHByb3BlcnRpZXMud2lkdGhzW2luZGV4XSA9PT0gdW5kZWZpbmVkICYmIGluZGV4ID49IHByb3BlcnRpZXMuZmlyc3RDaGFyICYmIGluZGV4IDw9IHByb3BlcnRpZXMubGFzdENoYXIpIHsKICAgICAgICAgIHByb3BlcnRpZXMud2lkdGhzW2luZGV4XSA9IGNoYXJTdHJpbmcud2lkdGg7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcHJvZ3JhbTsKICB9CiAgZXh0cmFjdEZvbnRIZWFkZXIocHJvcGVydGllcykgewogICAgbGV0IHRva2VuOwogICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKSkgIT09IG51bGwpIHsKICAgICAgaWYgKHRva2VuICE9PSAiLyIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgIGNhc2UgIkZvbnRNYXRyaXgiOgogICAgICAgICAgY29uc3QgbWF0cml4ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKICAgICAgICAgIHByb3BlcnRpZXMuZm9udE1hdHJpeCA9IG1hdHJpeDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVuY29kaW5nIjoKICAgICAgICAgIGNvbnN0IGVuY29kaW5nQXJnID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgbGV0IGVuY29kaW5nOwogICAgICAgICAgaWYgKCEvXlxkKyQvLnRlc3QoZW5jb2RpbmdBcmcpKSB7CiAgICAgICAgICAgIGVuY29kaW5nID0gZ2V0RW5jb2RpbmcoZW5jb2RpbmdBcmcpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBbXTsKICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHBhcnNlSW50KGVuY29kaW5nQXJnLCAxMCkgfCAwOwogICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CiAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgICAgd2hpbGUgKHRva2VuICE9PSAiZHVwIiAmJiB0b2tlbiAhPT0gImRlZiIpIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgICAgaWYgKHRva2VuID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHRva2VuID09PSAiZGVmIikgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZWFkSW50KCk7CiAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgIGNvbnN0IGdseXBoID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgIGVuY29kaW5nW2luZGV4XSA9IGdseXBoOwogICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcgPSBlbmNvZGluZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkZvbnRCQm94IjoKICAgICAgICAgIGNvbnN0IGZvbnRCQm94ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKICAgICAgICAgIHByb3BlcnRpZXMuYXNjZW50ID0gTWF0aC5tYXgoZm9udEJCb3hbM10sIGZvbnRCQm94WzFdKTsKICAgICAgICAgIHByb3BlcnRpZXMuZGVzY2VudCA9IE1hdGgubWluKGZvbnRCQm94WzFdLCBmb250QkJveFszXSk7CiAgICAgICAgICBwcm9wZXJ0aWVzLmFzY2VudFNjYWxlZCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvdHlwZTFfZm9udC5qcwoKCgoKCgpmdW5jdGlvbiBmaW5kQmxvY2soc3RyZWFtQnl0ZXMsIHNpZ25hdHVyZSwgc3RhcnRJbmRleCkgewogIGNvbnN0IHN0cmVhbUJ5dGVzTGVuZ3RoID0gc3RyZWFtQnl0ZXMubGVuZ3RoOwogIGNvbnN0IHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7CiAgY29uc3Qgc2Nhbkxlbmd0aCA9IHN0cmVhbUJ5dGVzTGVuZ3RoIC0gc2lnbmF0dXJlTGVuZ3RoOwogIGxldCBpID0gc3RhcnRJbmRleCwKICAgIGZvdW5kID0gZmFsc2U7CiAgd2hpbGUgKGkgPCBzY2FuTGVuZ3RoKSB7CiAgICBsZXQgaiA9IDA7CiAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzdHJlYW1CeXRlc1tpICsgal0gPT09IHNpZ25hdHVyZVtqXSkgewogICAgICBqKys7CiAgICB9CiAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKICAgICAgaSArPSBqOwogICAgICB3aGlsZSAoaSA8IHN0cmVhbUJ5dGVzTGVuZ3RoICYmIGlzV2hpdGVTcGFjZShzdHJlYW1CeXRlc1tpXSkpIHsKICAgICAgICBpKys7CiAgICAgIH0KICAgICAgZm91bmQgPSB0cnVlOwogICAgICBicmVhazsKICAgIH0KICAgIGkrKzsKICB9CiAgcmV0dXJuIHsKICAgIGZvdW5kLAogICAgbGVuZ3RoOiBpCiAgfTsKfQpmdW5jdGlvbiBnZXRIZWFkZXJCbG9jayhzdHJlYW0sIHN1Z2dlc3RlZExlbmd0aCkgewogIGNvbnN0IEVFWEVDX1NJR05BVFVSRSA9IFsweDY1LCAweDY1LCAweDc4LCAweDY1LCAweDYzXTsKICBjb25zdCBzdHJlYW1TdGFydFBvcyA9IHN0cmVhbS5wb3M7CiAgbGV0IGhlYWRlckJ5dGVzLCBoZWFkZXJCeXRlc0xlbmd0aCwgYmxvY2s7CiAgdHJ5IHsKICAgIGhlYWRlckJ5dGVzID0gc3RyZWFtLmdldEJ5dGVzKHN1Z2dlc3RlZExlbmd0aCk7CiAgICBoZWFkZXJCeXRlc0xlbmd0aCA9IGhlYWRlckJ5dGVzLmxlbmd0aDsKICB9IGNhdGNoIHt9CiAgaWYgKGhlYWRlckJ5dGVzTGVuZ3RoID09PSBzdWdnZXN0ZWRMZW5ndGgpIHsKICAgIGJsb2NrID0gZmluZEJsb2NrKGhlYWRlckJ5dGVzLCBFRVhFQ19TSUdOQVRVUkUsIHN1Z2dlc3RlZExlbmd0aCAtIDIgKiBFRVhFQ19TSUdOQVRVUkUubGVuZ3RoKTsKICAgIGlmIChibG9jay5mb3VuZCAmJiBibG9jay5sZW5ndGggPT09IHN1Z2dlc3RlZExlbmd0aCkgewogICAgICByZXR1cm4gewogICAgICAgIHN0cmVhbTogbmV3IFN0cmVhbShoZWFkZXJCeXRlcyksCiAgICAgICAgbGVuZ3RoOiBzdWdnZXN0ZWRMZW5ndGgKICAgICAgfTsKICAgIH0KICB9CiAgd2FybignSW52YWxpZCAiTGVuZ3RoMSIgcHJvcGVydHkgaW4gVHlwZTEgZm9udCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKICBzdHJlYW0ucG9zID0gc3RyZWFtU3RhcnRQb3M7CiAgY29uc3QgU0NBTl9CTE9DS19MRU5HVEggPSAyMDQ4OwogIGxldCBhY3R1YWxMZW5ndGg7CiAgd2hpbGUgKHRydWUpIHsKICAgIGNvbnN0IHNjYW5CeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMoU0NBTl9CTE9DS19MRU5HVEgpOwogICAgYmxvY2sgPSBmaW5kQmxvY2soc2NhbkJ5dGVzLCBFRVhFQ19TSUdOQVRVUkUsIDApOwogICAgaWYgKGJsb2NrLmxlbmd0aCA9PT0gMCkgewogICAgICBicmVhazsKICAgIH0KICAgIHN0cmVhbS5wb3MgKz0gYmxvY2subGVuZ3RoOwogICAgaWYgKGJsb2NrLmZvdW5kKSB7CiAgICAgIGFjdHVhbExlbmd0aCA9IHN0cmVhbS5wb3MgLSBzdHJlYW1TdGFydFBvczsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHN0cmVhbS5wb3MgPSBzdHJlYW1TdGFydFBvczsKICBpZiAoYWN0dWFsTGVuZ3RoKSB7CiAgICByZXR1cm4gewogICAgICBzdHJlYW06IG5ldyBTdHJlYW0oc3RyZWFtLmdldEJ5dGVzKGFjdHVhbExlbmd0aCkpLAogICAgICBsZW5ndGg6IGFjdHVhbExlbmd0aAogICAgfTsKICB9CiAgd2FybignVW5hYmxlIHRvIHJlY292ZXIgIkxlbmd0aDEiIHByb3BlcnR5IGluIFR5cGUxIGZvbnQgLS0gdXNpbmcgYXMgaXMuJyk7CiAgcmV0dXJuIHsKICAgIHN0cmVhbTogbmV3IFN0cmVhbShzdHJlYW0uZ2V0Qnl0ZXMoc3VnZ2VzdGVkTGVuZ3RoKSksCiAgICBsZW5ndGg6IHN1Z2dlc3RlZExlbmd0aAogIH07Cn0KZnVuY3Rpb24gZ2V0RWV4ZWNCbG9jayhzdHJlYW0sIHN1Z2dlc3RlZExlbmd0aCkgewogIGNvbnN0IGVleGVjQnl0ZXMgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKICBpZiAoZWV4ZWNCeXRlcy5sZW5ndGggPT09IDApIHsKICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiZ2V0RWV4ZWNCbG9jayAtIG5vIGZvbnQgcHJvZ3JhbSBmb3VuZC4iKTsKICB9CiAgcmV0dXJuIHsKICAgIHN0cmVhbTogbmV3IFN0cmVhbShlZXhlY0J5dGVzKSwKICAgIGxlbmd0aDogZWV4ZWNCeXRlcy5sZW5ndGgKICB9Owp9CmNsYXNzIFR5cGUxRm9udCB7CiAgY29uc3RydWN0b3IobmFtZSwgZmlsZSwgcHJvcGVydGllcykgewogICAgY29uc3QgUEZCX0hFQURFUl9TSVpFID0gNjsKICAgIGxldCBoZWFkZXJCbG9ja0xlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoMTsKICAgIGxldCBlZXhlY0Jsb2NrTGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGgyOwogICAgbGV0IHBmYkhlYWRlciA9IGZpbGUucGVla0J5dGVzKFBGQl9IRUFERVJfU0laRSk7CiAgICBjb25zdCBwZmJIZWFkZXJQcmVzZW50ID0gcGZiSGVhZGVyWzBdID09PSAweDgwICYmIHBmYkhlYWRlclsxXSA9PT0gMHgwMTsKICAgIGlmIChwZmJIZWFkZXJQcmVzZW50KSB7CiAgICAgIGZpbGUuc2tpcChQRkJfSEVBREVSX1NJWkUpOwogICAgICBoZWFkZXJCbG9ja0xlbmd0aCA9IHBmYkhlYWRlcls1XSA8PCAyNCB8IHBmYkhlYWRlcls0XSA8PCAxNiB8IHBmYkhlYWRlclszXSA8PCA4IHwgcGZiSGVhZGVyWzJdOwogICAgfQogICAgY29uc3QgaGVhZGVyQmxvY2sgPSBnZXRIZWFkZXJCbG9jayhmaWxlLCBoZWFkZXJCbG9ja0xlbmd0aCk7CiAgICBjb25zdCBoZWFkZXJCbG9ja1BhcnNlciA9IG5ldyBUeXBlMVBhcnNlcihoZWFkZXJCbG9jay5zdHJlYW0sIGZhbHNlLCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQpOwogICAgaGVhZGVyQmxvY2tQYXJzZXIuZXh0cmFjdEZvbnRIZWFkZXIocHJvcGVydGllcyk7CiAgICBpZiAocGZiSGVhZGVyUHJlc2VudCkgewogICAgICBwZmJIZWFkZXIgPSBmaWxlLmdldEJ5dGVzKFBGQl9IRUFERVJfU0laRSk7CiAgICAgIGVleGVjQmxvY2tMZW5ndGggPSBwZmJIZWFkZXJbNV0gPDwgMjQgfCBwZmJIZWFkZXJbNF0gPDwgMTYgfCBwZmJIZWFkZXJbM10gPDwgOCB8IHBmYkhlYWRlclsyXTsKICAgIH0KICAgIGNvbnN0IGVleGVjQmxvY2sgPSBnZXRFZXhlY0Jsb2NrKGZpbGUsIGVleGVjQmxvY2tMZW5ndGgpOwogICAgY29uc3QgZWV4ZWNCbG9ja1BhcnNlciA9IG5ldyBUeXBlMVBhcnNlcihlZXhlY0Jsb2NrLnN0cmVhbSwgdHJ1ZSwgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKICAgIGNvbnN0IGRhdGEgPSBlZXhlY0Jsb2NrUGFyc2VyLmV4dHJhY3RGb250UHJvZ3JhbShwcm9wZXJ0aWVzKTsKICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEucHJvcGVydGllcykgewogICAgICBwcm9wZXJ0aWVzW2tleV0gPSBkYXRhLnByb3BlcnRpZXNba2V5XTsKICAgIH0KICAgIGNvbnN0IGNoYXJzdHJpbmdzID0gZGF0YS5jaGFyc3RyaW5nczsKICAgIGNvbnN0IHR5cGUyQ2hhcnN0cmluZ3MgPSB0aGlzLmdldFR5cGUyQ2hhcnN0cmluZ3MoY2hhcnN0cmluZ3MpOwogICAgY29uc3Qgc3VicnMgPSB0aGlzLmdldFR5cGUyU3VicnMoZGF0YS5zdWJycyk7CiAgICB0aGlzLmNoYXJzdHJpbmdzID0gY2hhcnN0cmluZ3M7CiAgICB0aGlzLmRhdGEgPSB0aGlzLndyYXAobmFtZSwgdHlwZTJDaGFyc3RyaW5ncywgdGhpcy5jaGFyc3RyaW5ncywgc3VicnMsIHByb3BlcnRpZXMpOwogICAgdGhpcy5zZWFjcyA9IHRoaXMuZ2V0U2VhY3MoZGF0YS5jaGFyc3RyaW5ncyk7CiAgfQogIGdldCBudW1HbHlwaHMoKSB7CiAgICByZXR1cm4gdGhpcy5jaGFyc3RyaW5ncy5sZW5ndGggKyAxOwogIH0KICBnZXRDaGFyc2V0KCkgewogICAgY29uc3QgY2hhcnNldCA9IFsiLm5vdGRlZiJdOwogICAgZm9yIChjb25zdCB7CiAgICAgIGdseXBoTmFtZQogICAgfSBvZiB0aGlzLmNoYXJzdHJpbmdzKSB7CiAgICAgIGNoYXJzZXQucHVzaChnbHlwaE5hbWUpOwogICAgfQogICAgcmV0dXJuIGNoYXJzZXQ7CiAgfQogIGdldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKSB7CiAgICBjb25zdCBjaGFyc3RyaW5ncyA9IHRoaXMuY2hhcnN0cmluZ3M7CiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgY29uc3QgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBmb3IgKGxldCBnbHlwaElkID0gMCwgY2hhcnN0cmluZ3NMZW4gPSBjaGFyc3RyaW5ncy5sZW5ndGg7IGdseXBoSWQgPCBjaGFyc3RyaW5nc0xlbjsgZ2x5cGhJZCsrKSB7CiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBwcm9wZXJ0aWVzLmNNYXAuY2hhckNvZGVPZihnbHlwaElkKTsKICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkICsgMTsKICAgICAgfQogICAgICByZXR1cm4gY2hhckNvZGVUb0dseXBoSWQ7CiAgICB9CiAgICBjb25zdCBnbHlwaE5hbWVzID0gWyIubm90ZGVmIl07CiAgICBsZXQgYnVpbHRJbkVuY29kaW5nLCBnbHlwaElkOwogICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7CiAgICAgIGdseXBoTmFtZXMucHVzaChjaGFyc3RyaW5nc1tnbHlwaElkXS5nbHlwaE5hbWUpOwogICAgfQogICAgY29uc3QgZW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZzsKICAgIGlmIChlbmNvZGluZykgewogICAgICBidWlsdEluRW5jb2RpbmcgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIGVuY29kaW5nKSB7CiAgICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihlbmNvZGluZ1tjaGFyQ29kZV0pOwogICAgICAgIGlmIChnbHlwaElkID49IDApIHsKICAgICAgICAgIGJ1aWx0SW5FbmNvZGluZ1tjaGFyQ29kZV0gPSBnbHlwaElkOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHR5cGUxRm9udEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcsIGdseXBoTmFtZXMpOwogIH0KICBoYXNHbHlwaElkKGlkKSB7CiAgICBpZiAoaWQgPCAwIHx8IGlkID49IHRoaXMubnVtR2x5cGhzKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChpZCA9PT0gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGNvbnN0IGdseXBoID0gdGhpcy5jaGFyc3RyaW5nc1tpZCAtIDFdOwogICAgcmV0dXJuIGdseXBoLmNoYXJzdHJpbmcubGVuZ3RoID4gMDsKICB9CiAgZ2V0U2VhY3MoY2hhcnN0cmluZ3MpIHsKICAgIGNvbnN0IHNlYWNNYXAgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNoYXJzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgY2hhcnN0cmluZyA9IGNoYXJzdHJpbmdzW2ldOwogICAgICBpZiAoY2hhcnN0cmluZy5zZWFjKSB7CiAgICAgICAgc2VhY01hcFtpICsgMV0gPSBjaGFyc3RyaW5nLnNlYWM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzZWFjTWFwOwogIH0KICBnZXRUeXBlMkNoYXJzdHJpbmdzKHR5cGUxQ2hhcnN0cmluZ3MpIHsKICAgIGNvbnN0IHR5cGUyQ2hhcnN0cmluZ3MgPSBbXTsKICAgIGZvciAoY29uc3QgdHlwZTFDaGFyc3RyaW5nIG9mIHR5cGUxQ2hhcnN0cmluZ3MpIHsKICAgICAgdHlwZTJDaGFyc3RyaW5ncy5wdXNoKHR5cGUxQ2hhcnN0cmluZy5jaGFyc3RyaW5nKTsKICAgIH0KICAgIHJldHVybiB0eXBlMkNoYXJzdHJpbmdzOwogIH0KICBnZXRUeXBlMlN1YnJzKHR5cGUxU3VicnMpIHsKICAgIGxldCBiaWFzID0gMDsKICAgIGNvbnN0IGNvdW50ID0gdHlwZTFTdWJycy5sZW5ndGg7CiAgICBpZiAoY291bnQgPCAxMTMzKSB7CiAgICAgIGJpYXMgPSAxMDc7CiAgICB9IGVsc2UgaWYgKGNvdW50IDwgMzM3NjkpIHsKICAgICAgYmlhcyA9IDExMzE7CiAgICB9IGVsc2UgewogICAgICBiaWFzID0gMzI3Njg7CiAgICB9CiAgICBjb25zdCB0eXBlMlN1YnJzID0gW107CiAgICBsZXQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBiaWFzOyBpKyspIHsKICAgICAgdHlwZTJTdWJycy5wdXNoKFsweDBiXSk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICB0eXBlMlN1YnJzLnB1c2godHlwZTFTdWJyc1tpXSk7CiAgICB9CiAgICByZXR1cm4gdHlwZTJTdWJyczsKICB9CiAgd3JhcChuYW1lLCBnbHlwaHMsIGNoYXJzdHJpbmdzLCBzdWJycywgcHJvcGVydGllcykgewogICAgY29uc3QgY2ZmID0gbmV3IENGRigpOwogICAgY2ZmLmhlYWRlciA9IG5ldyBDRkZIZWFkZXIoMSwgMCwgNCwgNCk7CiAgICBjZmYubmFtZXMgPSBbbmFtZV07CiAgICBjb25zdCB0b3BEaWN0ID0gbmV3IENGRlRvcERpY3QoKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJ2ZXJzaW9uIiwgMzkxKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJOb3RpY2UiLCAzOTIpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoIkZ1bGxOYW1lIiwgMzkzKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJGYW1pbHlOYW1lIiwgMzk0KTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJXZWlnaHQiLCAzOTUpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoIkVuY29kaW5nIiwgbnVsbCk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRm9udE1hdHJpeCIsIHByb3BlcnRpZXMuZm9udE1hdHJpeCk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRm9udEJCb3giLCBwcm9wZXJ0aWVzLmJib3gpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoImNoYXJzZXQiLCBudWxsKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJDaGFyU3RyaW5ncyIsIG51bGwpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoIlByaXZhdGUiLCBudWxsKTsKICAgIGNmZi50b3BEaWN0ID0gdG9wRGljdDsKICAgIGNvbnN0IHN0cmluZ3MgPSBuZXcgQ0ZGU3RyaW5ncygpOwogICAgc3RyaW5ncy5hZGQoIlZlcnNpb24gMC4xMSIpOwogICAgc3RyaW5ncy5hZGQoIlNlZSBvcmlnaW5hbCBub3RpY2UiKTsKICAgIHN0cmluZ3MuYWRkKG5hbWUpOwogICAgc3RyaW5ncy5hZGQobmFtZSk7CiAgICBzdHJpbmdzLmFkZCgiTWVkaXVtIik7CiAgICBjZmYuc3RyaW5ncyA9IHN0cmluZ3M7CiAgICBjZmYuZ2xvYmFsU3VickluZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBjb25zdCBjb3VudCA9IGdseXBocy5sZW5ndGg7CiAgICBjb25zdCBjaGFyc2V0QXJyYXkgPSBbIi5ub3RkZWYiXTsKICAgIGxldCBpLCBpaTsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGNoYXJzdHJpbmdzW2ldLmdseXBoTmFtZTsKICAgICAgY29uc3QgaW5kZXggPSBDRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihnbHlwaE5hbWUpOwogICAgICBpZiAoaW5kZXggPT09IC0xKSB7CiAgICAgICAgc3RyaW5ncy5hZGQoZ2x5cGhOYW1lKTsKICAgICAgfQogICAgICBjaGFyc2V0QXJyYXkucHVzaChnbHlwaE5hbWUpOwogICAgfQogICAgY2ZmLmNoYXJzZXQgPSBuZXcgQ0ZGQ2hhcnNldChmYWxzZSwgMCwgY2hhcnNldEFycmF5KTsKICAgIGNvbnN0IGNoYXJTdHJpbmdzSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKFsweDhiLCAweDBlXSk7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChnbHlwaHNbaV0pOwogICAgfQogICAgY2ZmLmNoYXJTdHJpbmdzID0gY2hhclN0cmluZ3NJbmRleDsKICAgIGNvbnN0IHByaXZhdGVEaWN0ID0gbmV3IENGRlByaXZhdGVEaWN0KCk7CiAgICBwcml2YXRlRGljdC5zZXRCeU5hbWUoIlN1YnJzIiwgbnVsbCk7CiAgICBjb25zdCBmaWVsZHMgPSBbIkJsdWVWYWx1ZXMiLCAiT3RoZXJCbHVlcyIsICJGYW1pbHlCbHVlcyIsICJGYW1pbHlPdGhlckJsdWVzIiwgIlN0ZW1TbmFwSCIsICJTdGVtU25hcFYiLCAiQmx1ZVNoaWZ0IiwgIkJsdWVGdXp6IiwgIkJsdWVTY2FsZSIsICJMYW5ndWFnZUdyb3VwIiwgIkV4cGFuc2lvbkZhY3RvciIsICJGb3JjZUJvbGQiLCAiU3RkSFciLCAiU3RkVlciXTsKICAgIGZvciAoaSA9IDAsIGlpID0gZmllbGRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHNbaV07CiAgICAgIGlmICghKGZpZWxkIGluIHByb3BlcnRpZXMucHJpdmF0ZURhdGEpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgdmFsdWUgPSBwcm9wZXJ0aWVzLnByaXZhdGVEYXRhW2ZpZWxkXTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgZm9yIChsZXQgaiA9IHZhbHVlLmxlbmd0aCAtIDE7IGogPiAwOyBqLS0pIHsKICAgICAgICAgIHZhbHVlW2pdIC09IHZhbHVlW2ogLSAxXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcHJpdmF0ZURpY3Quc2V0QnlOYW1lKGZpZWxkLCB2YWx1ZSk7CiAgICB9CiAgICBjZmYudG9wRGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0OwogICAgY29uc3Qgc3VickluZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBmb3IgKGkgPSAwLCBpaSA9IHN1YnJzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgc3VickluZGV4LmFkZChzdWJyc1tpXSk7CiAgICB9CiAgICBwcml2YXRlRGljdC5zdWJyc0luZGV4ID0gc3VickluZGV4OwogICAgY29uc3QgY29tcGlsZXIgPSBuZXcgQ0ZGQ29tcGlsZXIoY2ZmKTsKICAgIHJldHVybiBjb21waWxlci5jb21waWxlKCk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9mb250cy5qcwoKCgoKCgoKCgoKCgoKCgoKCmNvbnN0IFBSSVZBVEVfVVNFX0FSRUFTID0gW1sweGUwMDAsIDB4ZjhmZl0sIFsweDEwMDAwMCwgMHgxMGZmZmRdXTsKY29uc3QgUERGX0dMWVBIX1NQQUNFX1VOSVRTID0gMTAwMDsKY29uc3QgRVhQT1JUX0RBVEFfUFJPUEVSVElFUyA9IFsiYXNjZW50IiwgImJib3giLCAiYmxhY2siLCAiYm9sZCIsICJjaGFyUHJvY09wZXJhdG9yTGlzdCIsICJjc3NGb250SW5mbyIsICJkYXRhIiwgImRlZmF1bHRWTWV0cmljcyIsICJkZWZhdWx0V2lkdGgiLCAiZGVzY2VudCIsICJkaXNhYmxlRm9udEZhY2UiLCAiZmFsbGJhY2tOYW1lIiwgImZvbnRFeHRyYVByb3BlcnRpZXMiLCAiZm9udE1hdHJpeCIsICJpc0ludmFsaWRQREZqc0ZvbnQiLCAiaXNUeXBlM0ZvbnQiLCAiaXRhbGljIiwgImxvYWRlZE5hbWUiLCAibWltZXR5cGUiLCAibWlzc2luZ0ZpbGUiLCAibmFtZSIsICJyZW1lYXN1cmUiLCAic3lzdGVtRm9udEluZm8iLCAidmVydGljYWwiXTsKY29uc3QgRVhQT1JUX0RBVEFfRVhUUkFfUFJPUEVSVElFUyA9IFsiY01hcCIsICJjb21wb3NpdGUiLCAiZGVmYXVsdEVuY29kaW5nIiwgImRpZmZlcmVuY2VzIiwgImlzTW9ub3NwYWNlIiwgImlzU2VyaWZGb250IiwgImlzU3ltYm9saWNGb250IiwgInNlYWNNYXAiLCAic3VidHlwZSIsICJ0b0ZvbnRDaGFyIiwgInRvVW5pY29kZSIsICJ0eXBlIiwgInZtZXRyaWNzIiwgIndpZHRocyJdOwpmdW5jdGlvbiBhZGp1c3RXaWR0aHMocHJvcGVydGllcykgewogIGlmICghcHJvcGVydGllcy5mb250TWF0cml4KSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLmZvbnRNYXRyaXhbMF0gPT09IEZPTlRfSURFTlRJVFlfTUFUUklYWzBdKSB7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHNjYWxlID0gMC4wMDEgLyBwcm9wZXJ0aWVzLmZvbnRNYXRyaXhbMF07CiAgY29uc3QgZ2x5cGhzV2lkdGhzID0gcHJvcGVydGllcy53aWR0aHM7CiAgZm9yIChjb25zdCBnbHlwaCBpbiBnbHlwaHNXaWR0aHMpIHsKICAgIGdseXBoc1dpZHRoc1tnbHlwaF0gKj0gc2NhbGU7CiAgfQogIHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoICo9IHNjYWxlOwp9CmZ1bmN0aW9uIGFkanVzdFRydWVUeXBlVG9Vbmljb2RlKHByb3BlcnRpZXMsIGlzU3ltYm9saWNGb250LCBuYW1lUmVjb3JkcykgewogIGlmIChwcm9wZXJ0aWVzLmlzSW50ZXJuYWxGb250KSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSB7CiAgICByZXR1cm47CiAgfQogIGlmICghaXNTeW1ib2xpY0ZvbnQpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKG5hbWVSZWNvcmRzLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmcgPT09IFdpbkFuc2lFbmNvZGluZykgewogICAgcmV0dXJuOwogIH0KICBmb3IgKGNvbnN0IHIgb2YgbmFtZVJlY29yZHMpIHsKICAgIGlmICghaXNXaW5OYW1lUmVjb3JkKHIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICB9CiAgY29uc3QgZW5jb2RpbmcgPSBXaW5BbnNpRW5jb2Rpbmc7CiAgY29uc3QgdG9Vbmljb2RlID0gW10sCiAgICBnbHlwaHNVbmljb2RlTWFwID0gZ2V0R2x5cGhzVW5pY29kZSgpOwogIGZvciAoY29uc3QgY2hhckNvZGUgaW4gZW5jb2RpbmcpIHsKICAgIGNvbnN0IGdseXBoTmFtZSA9IGVuY29kaW5nW2NoYXJDb2RlXTsKICAgIGlmIChnbHlwaE5hbWUgPT09ICIiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgdW5pY29kZSA9IGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXTsKICAgIGlmICh1bmljb2RlID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICB0b1VuaWNvZGVbY2hhckNvZGVdID0gU3RyaW5nLmZyb21DaGFyQ29kZSh1bmljb2RlKTsKICB9CiAgaWYgKHRvVW5pY29kZS5sZW5ndGggPiAwKSB7CiAgICBwcm9wZXJ0aWVzLnRvVW5pY29kZS5hbWVuZCh0b1VuaWNvZGUpOwogIH0KfQpmdW5jdGlvbiBhZGp1c3RUeXBlMVRvVW5pY29kZShwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcpIHsKICBpZiAocHJvcGVydGllcy5pc0ludGVybmFsRm9udCkgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCkgewogICAgcmV0dXJuOwogIH0KICBpZiAoYnVpbHRJbkVuY29kaW5nID09PSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZykgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCB0b1VuaWNvZGUgPSBbXSwKICAgIGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7CiAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBidWlsdEluRW5jb2RpbmcpIHsKICAgIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKSB7CiAgICAgIGlmIChwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgfHwgcHJvcGVydGllcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICB9CiAgICBjb25zdCBnbHlwaE5hbWUgPSBidWlsdEluRW5jb2RpbmdbY2hhckNvZGVdOwogICAgY29uc3QgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOwogICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CiAgICAgIHRvVW5pY29kZVtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpOwogICAgfQogIH0KICBpZiAodG9Vbmljb2RlLmxlbmd0aCA+IDApIHsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlLmFtZW5kKHRvVW5pY29kZSk7CiAgfQp9CmZ1bmN0aW9uIGFtZW5kRmFsbGJhY2tUb1VuaWNvZGUocHJvcGVydGllcykgewogIGlmICghcHJvcGVydGllcy5mYWxsYmFja1RvVW5pY29kZSkgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCB0b1VuaWNvZGUgPSBbXTsKICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGUpIHsKICAgIGlmIChwcm9wZXJ0aWVzLnRvVW5pY29kZS5oYXMoY2hhckNvZGUpKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgdG9Vbmljb2RlW2NoYXJDb2RlXSA9IHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGVbY2hhckNvZGVdOwogIH0KICBpZiAodG9Vbmljb2RlLmxlbmd0aCA+IDApIHsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlLmFtZW5kKHRvVW5pY29kZSk7CiAgfQp9CmNsYXNzIGZvbnRzX0dseXBoIHsKICBjb25zdHJ1Y3RvcihvcmlnaW5hbENoYXJDb2RlLCBmb250Q2hhciwgdW5pY29kZSwgYWNjZW50LCB3aWR0aCwgdm1ldHJpYywgb3BlcmF0b3JMaXN0SWQsIGlzU3BhY2UsIGlzSW5Gb250KSB7CiAgICB0aGlzLm9yaWdpbmFsQ2hhckNvZGUgPSBvcmlnaW5hbENoYXJDb2RlOwogICAgdGhpcy5mb250Q2hhciA9IGZvbnRDaGFyOwogICAgdGhpcy51bmljb2RlID0gdW5pY29kZTsKICAgIHRoaXMuYWNjZW50ID0gYWNjZW50OwogICAgdGhpcy53aWR0aCA9IHdpZHRoOwogICAgdGhpcy52bWV0cmljID0gdm1ldHJpYzsKICAgIHRoaXMub3BlcmF0b3JMaXN0SWQgPSBvcGVyYXRvckxpc3RJZDsKICAgIHRoaXMuaXNTcGFjZSA9IGlzU3BhY2U7CiAgICB0aGlzLmlzSW5Gb250ID0gaXNJbkZvbnQ7CiAgfQogIGdldCBjYXRlZ29yeSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImNhdGVnb3J5IiwgZ2V0Q2hhclVuaWNvZGVDYXRlZ29yeSh0aGlzLnVuaWNvZGUpLCB0cnVlKTsKICB9Cn0KZnVuY3Rpb24gaW50MTYoYjAsIGIxKSB7CiAgcmV0dXJuIChiMCA8PCA4KSArIGIxOwp9CmZ1bmN0aW9uIHdyaXRlU2lnbmVkSW50MTYoYnl0ZXMsIGluZGV4LCB2YWx1ZSkgewogIGJ5dGVzW2luZGV4ICsgMV0gPSB2YWx1ZTsKICBieXRlc1tpbmRleF0gPSB2YWx1ZSA+Pj4gODsKfQpmdW5jdGlvbiBzaWduZWRJbnQxNihiMCwgYjEpIHsKICBjb25zdCB2YWx1ZSA9IChiMCA8PCA4KSArIGIxOwogIHJldHVybiB2YWx1ZSAmIDEgPDwgMTUgPyB2YWx1ZSAtIDB4MTAwMDAgOiB2YWx1ZTsKfQpmdW5jdGlvbiB3cml0ZVVpbnQzMihieXRlcywgaW5kZXgsIHZhbHVlKSB7CiAgYnl0ZXNbaW5kZXggKyAzXSA9IHZhbHVlICYgMHhmZjsKICBieXRlc1tpbmRleCArIDJdID0gdmFsdWUgPj4+IDg7CiAgYnl0ZXNbaW5kZXggKyAxXSA9IHZhbHVlID4+PiAxNjsKICBieXRlc1tpbmRleF0gPSB2YWx1ZSA+Pj4gMjQ7Cn0KZnVuY3Rpb24gaW50MzIoYjAsIGIxLCBiMiwgYjMpIHsKICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMzsKfQpmdW5jdGlvbiBzdHJpbmcxNih2YWx1ZSkgewogIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmYpOwp9CmZ1bmN0aW9uIHNhZmVTdHJpbmcxNih2YWx1ZSkgewogIGlmICh2YWx1ZSA+IDB4N2ZmZikgewogICAgdmFsdWUgPSAweDdmZmY7CiAgfSBlbHNlIGlmICh2YWx1ZSA8IC0weDgwMDApIHsKICAgIHZhbHVlID0gLTB4ODAwMDsKICB9CiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7Cn0KZnVuY3Rpb24gaXNUcnVlVHlwZUZpbGUoZmlsZSkgewogIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOwogIHJldHVybiByZWFkVWludDMyKGhlYWRlciwgMCkgPT09IDB4MDAwMTAwMDAgfHwgYnl0ZXNUb1N0cmluZyhoZWFkZXIpID09PSAidHJ1ZSI7Cn0KZnVuY3Rpb24gaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKGZpbGUpIHsKICBjb25zdCBoZWFkZXIgPSBmaWxlLnBlZWtCeXRlcyg0KTsKICByZXR1cm4gYnl0ZXNUb1N0cmluZyhoZWFkZXIpID09PSAidHRjZiI7Cn0KZnVuY3Rpb24gaXNPcGVuVHlwZUZpbGUoZmlsZSkgewogIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOwogIHJldHVybiBieXRlc1RvU3RyaW5nKGhlYWRlcikgPT09ICJPVFRPIjsKfQpmdW5jdGlvbiBpc1R5cGUxRmlsZShmaWxlKSB7CiAgY29uc3QgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoMik7CiAgaWYgKGhlYWRlclswXSA9PT0gMHgyNSAmJiBoZWFkZXJbMV0gPT09IDB4MjEpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoaGVhZGVyWzBdID09PSAweDgwICYmIGhlYWRlclsxXSA9PT0gMHgwMSkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBpc0NGRkZpbGUoZmlsZSkgewogIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOwogIGlmIChoZWFkZXJbMF0gPj0gMSAmJiBoZWFkZXJbM10gPj0gMSAmJiBoZWFkZXJbM10gPD0gNCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBnZXRGb250RmlsZVR5cGUoZmlsZSwgewogIHR5cGUsCiAgc3VidHlwZSwKICBjb21wb3NpdGUKfSkgewogIGxldCBmaWxlVHlwZSwgZmlsZVN1YnR5cGU7CiAgaWYgKGlzVHJ1ZVR5cGVGaWxlKGZpbGUpIHx8IGlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZShmaWxlKSkgewogICAgZmlsZVR5cGUgPSBjb21wb3NpdGUgPyAiQ0lERm9udFR5cGUyIiA6ICJUcnVlVHlwZSI7CiAgfSBlbHNlIGlmIChpc09wZW5UeXBlRmlsZShmaWxlKSkgewogICAgZmlsZVR5cGUgPSBjb21wb3NpdGUgPyAiQ0lERm9udFR5cGUyIiA6ICJPcGVuVHlwZSI7CiAgfSBlbHNlIGlmIChpc1R5cGUxRmlsZShmaWxlKSkgewogICAgaWYgKGNvbXBvc2l0ZSkgewogICAgICBmaWxlVHlwZSA9ICJDSURGb250VHlwZTAiOwogICAgfSBlbHNlIHsKICAgICAgZmlsZVR5cGUgPSB0eXBlID09PSAiTU1UeXBlMSIgPyAiTU1UeXBlMSIgOiAiVHlwZTEiOwogICAgfQogIH0gZWxzZSBpZiAoaXNDRkZGaWxlKGZpbGUpKSB7CiAgICBpZiAoY29tcG9zaXRlKSB7CiAgICAgIGZpbGVUeXBlID0gIkNJREZvbnRUeXBlMCI7CiAgICAgIGZpbGVTdWJ0eXBlID0gIkNJREZvbnRUeXBlMEMiOwogICAgfSBlbHNlIHsKICAgICAgZmlsZVR5cGUgPSB0eXBlID09PSAiTU1UeXBlMSIgPyAiTU1UeXBlMSIgOiAiVHlwZTEiOwogICAgICBmaWxlU3VidHlwZSA9ICJUeXBlMUMiOwogICAgfQogIH0gZWxzZSB7CiAgICB3YXJuKCJnZXRGb250RmlsZVR5cGU6IFVuYWJsZSB0byBkZXRlY3QgY29ycmVjdCBmb250IGZpbGUgVHlwZS9TdWJ0eXBlLiIpOwogICAgZmlsZVR5cGUgPSB0eXBlOwogICAgZmlsZVN1YnR5cGUgPSBzdWJ0eXBlOwogIH0KICByZXR1cm4gW2ZpbGVUeXBlLCBmaWxlU3VidHlwZV07Cn0KZnVuY3Rpb24gYXBwbHlTdGFuZGFyZEZvbnRHbHlwaE1hcChtYXAsIGdseXBoTWFwKSB7CiAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBnbHlwaE1hcCkgewogICAgbWFwWytjaGFyQ29kZV0gPSBnbHlwaE1hcFtjaGFyQ29kZV07CiAgfQp9CmZ1bmN0aW9uIGJ1aWxkVG9Gb250Q2hhcihlbmNvZGluZywgZ2x5cGhzVW5pY29kZU1hcCwgZGlmZmVyZW5jZXMpIHsKICBjb25zdCB0b0ZvbnRDaGFyID0gW107CiAgbGV0IHVuaWNvZGU7CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gZW5jb2RpbmcubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChlbmNvZGluZ1tpXSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKICAgICAgdG9Gb250Q2hhcltpXSA9IHVuaWNvZGU7CiAgICB9CiAgfQogIGZvciAoY29uc3QgY2hhckNvZGUgaW4gZGlmZmVyZW5jZXMpIHsKICAgIHVuaWNvZGUgPSBnZXRVbmljb2RlRm9yR2x5cGgoZGlmZmVyZW5jZXNbY2hhckNvZGVdLCBnbHlwaHNVbmljb2RlTWFwKTsKICAgIGlmICh1bmljb2RlICE9PSAtMSkgewogICAgICB0b0ZvbnRDaGFyWytjaGFyQ29kZV0gPSB1bmljb2RlOwogICAgfQogIH0KICByZXR1cm4gdG9Gb250Q2hhcjsKfQpmdW5jdGlvbiBpc01hY05hbWVSZWNvcmQocikgewogIHJldHVybiByLnBsYXRmb3JtID09PSAxICYmIHIuZW5jb2RpbmcgPT09IDAgJiYgci5sYW5ndWFnZSA9PT0gMDsKfQpmdW5jdGlvbiBpc1dpbk5hbWVSZWNvcmQocikgewogIHJldHVybiByLnBsYXRmb3JtID09PSAzICYmIHIuZW5jb2RpbmcgPT09IDEgJiYgci5sYW5ndWFnZSA9PT0gMHg0MDk7Cn0KZnVuY3Rpb24gY29udmVydENpZFN0cmluZyhjaGFyQ29kZSwgY2lkLCBzaG91bGRUaHJvdyA9IGZhbHNlKSB7CiAgc3dpdGNoIChjaWQubGVuZ3RoKSB7CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiBjaWQuY2hhckNvZGVBdCgwKTsKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIGNpZC5jaGFyQ29kZUF0KDApIDw8IDggfCBjaWQuY2hhckNvZGVBdCgxKTsKICB9CiAgY29uc3QgbXNnID0gYFVuc3VwcG9ydGVkIENJRCBzdHJpbmcgKGNoYXJDb2RlICR7Y2hhckNvZGV9KTogIiR7Y2lkfSIuYDsKICBpZiAoc2hvdWxkVGhyb3cpIHsKICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihtc2cpOwogIH0KICB3YXJuKG1zZyk7CiAgcmV0dXJuIGNpZDsKfQpmdW5jdGlvbiBhZGp1c3RNYXBwaW5nKGNoYXJDb2RlVG9HbHlwaElkLCBoYXNHbHlwaCwgbmV3R2x5cGhaZXJvSWQsIHRvVW5pY29kZSkgewogIGNvbnN0IG5ld01hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgY29uc3QgdG9Vbmljb2RlRXh0cmFNYXAgPSBuZXcgTWFwKCk7CiAgY29uc3QgdG9Gb250Q2hhciA9IFtdOwogIGNvbnN0IHVzZWRHbHlwaElkcyA9IG5ldyBTZXQoKTsKICBsZXQgcHJpdmF0ZVVzZUFyZWFJbmRleCA9IDA7CiAgY29uc3QgcHJpdmF0ZVVzZU9mZmV0U3RhcnQgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVswXTsKICBsZXQgbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSA9IHByaXZhdGVVc2VPZmZldFN0YXJ0OwogIGxldCBwcml2YXRlVXNlT2ZmZXRFbmQgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVsxXTsKICBjb25zdCBpc0luUHJpdmF0ZUFyZWEgPSBjb2RlID0+IFBSSVZBVEVfVVNFX0FSRUFTWzBdWzBdIDw9IGNvZGUgJiYgY29kZSA8PSBQUklWQVRFX1VTRV9BUkVBU1swXVsxXSB8fCBQUklWQVRFX1VTRV9BUkVBU1sxXVswXSA8PSBjb2RlICYmIGNvZGUgPD0gUFJJVkFURV9VU0VfQVJFQVNbMV1bMV07CiAgbGV0IExJR0FUVVJFX1RPX1VOSUNPREUgPSBudWxsOwogIGZvciAoY29uc3Qgb3JpZ2luYWxDaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkgewogICAgbGV0IGdseXBoSWQgPSBjaGFyQ29kZVRvR2x5cGhJZFtvcmlnaW5hbENoYXJDb2RlXTsKICAgIGlmICghaGFzR2x5cGgoZ2x5cGhJZCkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAobmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSA+IHByaXZhdGVVc2VPZmZldEVuZCkgewogICAgICBwcml2YXRlVXNlQXJlYUluZGV4Kys7CiAgICAgIGlmIChwcml2YXRlVXNlQXJlYUluZGV4ID49IFBSSVZBVEVfVVNFX0FSRUFTLmxlbmd0aCkgewogICAgICAgIHdhcm4oIlJhbiBvdXQgb2Ygc3BhY2UgaW4gZm9udCBwcml2YXRlIHVzZSBhcmVhLiIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVswXTsKICAgICAgcHJpdmF0ZVVzZU9mZmV0RW5kID0gUFJJVkFURV9VU0VfQVJFQVNbcHJpdmF0ZVVzZUFyZWFJbmRleF1bMV07CiAgICB9CiAgICBjb25zdCBmb250Q2hhckNvZGUgPSBuZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlKys7CiAgICBpZiAoZ2x5cGhJZCA9PT0gMCkgewogICAgICBnbHlwaElkID0gbmV3R2x5cGhaZXJvSWQ7CiAgICB9CiAgICBsZXQgdW5pY29kZSA9IHRvVW5pY29kZS5nZXQob3JpZ2luYWxDaGFyQ29kZSk7CiAgICBpZiAodHlwZW9mIHVuaWNvZGUgPT09ICJzdHJpbmciKSB7CiAgICAgIGlmICh1bmljb2RlLmxlbmd0aCA9PT0gMSkgewogICAgICAgIHVuaWNvZGUgPSB1bmljb2RlLmNvZGVQb2ludEF0KDApOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghTElHQVRVUkVfVE9fVU5JQ09ERSkgewogICAgICAgICAgTElHQVRVUkVfVE9fVU5JQ09ERSA9IG5ldyBNYXAoKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAweGZiMDA7IGkgPD0gMHhmYjRmOyBpKyspIHsKICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSkubm9ybWFsaXplKCJORktEIik7CiAgICAgICAgICAgIGlmIChub3JtYWxpemVkLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICBMSUdBVFVSRV9UT19VTklDT0RFLnNldChub3JtYWxpemVkLCBpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1bmljb2RlID0gTElHQVRVUkVfVE9fVU5JQ09ERS5nZXQodW5pY29kZSkgfHwgdW5pY29kZS5jb2RlUG9pbnRBdCgwKTsKICAgICAgfQogICAgfQogICAgaWYgKHVuaWNvZGUgJiYgIWlzSW5Qcml2YXRlQXJlYSh1bmljb2RlKSAmJiAhdXNlZEdseXBoSWRzLmhhcyhnbHlwaElkKSkgewogICAgICB0b1VuaWNvZGVFeHRyYU1hcC5zZXQodW5pY29kZSwgZ2x5cGhJZCk7CiAgICAgIHVzZWRHbHlwaElkcy5hZGQoZ2x5cGhJZCk7CiAgICB9CiAgICBuZXdNYXBbZm9udENoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICB0b0ZvbnRDaGFyW29yaWdpbmFsQ2hhckNvZGVdID0gZm9udENoYXJDb2RlOwogIH0KICByZXR1cm4gewogICAgdG9Gb250Q2hhciwKICAgIGNoYXJDb2RlVG9HbHlwaElkOiBuZXdNYXAsCiAgICB0b1VuaWNvZGVFeHRyYU1hcCwKICAgIG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUKICB9Owp9CmZ1bmN0aW9uIGdldFJhbmdlcyhnbHlwaHMsIHRvVW5pY29kZUV4dHJhTWFwLCBudW1HbHlwaHMpIHsKICBjb25zdCBjb2RlcyA9IFtdOwogIGZvciAoY29uc3QgY2hhckNvZGUgaW4gZ2x5cGhzKSB7CiAgICBpZiAoZ2x5cGhzW2NoYXJDb2RlXSA+PSBudW1HbHlwaHMpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb2Rlcy5wdXNoKHsKICAgICAgZm9udENoYXJDb2RlOiBjaGFyQ29kZSB8IDAsCiAgICAgIGdseXBoSWQ6IGdseXBoc1tjaGFyQ29kZV0KICAgIH0pOwogIH0KICBpZiAodG9Vbmljb2RlRXh0cmFNYXApIHsKICAgIGZvciAoY29uc3QgW3VuaWNvZGUsIGdseXBoSWRdIG9mIHRvVW5pY29kZUV4dHJhTWFwKSB7CiAgICAgIGlmIChnbHlwaElkID49IG51bUdseXBocykgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvZGVzLnB1c2goewogICAgICAgIGZvbnRDaGFyQ29kZTogdW5pY29kZSwKICAgICAgICBnbHlwaElkCiAgICAgIH0pOwogICAgfQogIH0KICBpZiAoY29kZXMubGVuZ3RoID09PSAwKSB7CiAgICBjb2Rlcy5wdXNoKHsKICAgICAgZm9udENoYXJDb2RlOiAwLAogICAgICBnbHlwaElkOiAwCiAgICB9KTsKICB9CiAgY29kZXMuc29ydCgoYSwgYikgPT4gYS5mb250Q2hhckNvZGUgLSBiLmZvbnRDaGFyQ29kZSk7CiAgY29uc3QgcmFuZ2VzID0gW107CiAgY29uc3QgbGVuZ3RoID0gY29kZXMubGVuZ3RoOwogIGZvciAobGV0IG4gPSAwOyBuIDwgbGVuZ3RoOykgewogICAgY29uc3Qgc3RhcnQgPSBjb2Rlc1tuXS5mb250Q2hhckNvZGU7CiAgICBjb25zdCBjb2RlSW5kaWNlcyA9IFtjb2Rlc1tuXS5nbHlwaElkXTsKICAgICsrbjsKICAgIGxldCBlbmQgPSBzdGFydDsKICAgIHdoaWxlIChuIDwgbGVuZ3RoICYmIGVuZCArIDEgPT09IGNvZGVzW25dLmZvbnRDaGFyQ29kZSkgewogICAgICBjb2RlSW5kaWNlcy5wdXNoKGNvZGVzW25dLmdseXBoSWQpOwogICAgICArK2VuZDsKICAgICAgKytuOwogICAgICBpZiAoZW5kID09PSAweGZmZmYpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmFuZ2VzLnB1c2goW3N0YXJ0LCBlbmQsIGNvZGVJbmRpY2VzXSk7CiAgfQogIHJldHVybiByYW5nZXM7Cn0KZnVuY3Rpb24gY3JlYXRlQ21hcFRhYmxlKGdseXBocywgdG9Vbmljb2RlRXh0cmFNYXAsIG51bUdseXBocykgewogIGNvbnN0IHJhbmdlcyA9IGdldFJhbmdlcyhnbHlwaHMsIHRvVW5pY29kZUV4dHJhTWFwLCBudW1HbHlwaHMpOwogIGNvbnN0IG51bVRhYmxlcyA9IHJhbmdlcy5hdCgtMSlbMV0gPiAweGZmZmYgPyAyIDogMTsKICBsZXQgY21hcCA9ICJceDAwXHgwMCIgKyBzdHJpbmcxNihudW1UYWJsZXMpICsgIlx4MDBceDAzIiArICJceDAwXHgwMSIgKyBzdHJpbmczMig0ICsgbnVtVGFibGVzICogOCk7CiAgbGV0IGksIGlpLCBqLCBqajsKICBmb3IgKGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgIGlmIChyYW5nZXNbaV1bMF0gPD0gMHhmZmZmKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBjb25zdCBibXBMZW5ndGggPSBpICsgMTsKICBpZiAocmFuZ2VzW2ldWzBdIDwgMHhmZmZmICYmIHJhbmdlc1tpXVsxXSA9PT0gMHhmZmZmKSB7CiAgICByYW5nZXNbaV1bMV0gPSAweGZmZmU7CiAgfQogIGNvbnN0IHRyYWlsaW5nUmFuZ2VzQ291bnQgPSByYW5nZXNbaV1bMV0gPCAweGZmZmYgPyAxIDogMDsKICBjb25zdCBzZWdDb3VudCA9IGJtcExlbmd0aCArIHRyYWlsaW5nUmFuZ2VzQ291bnQ7CiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gT3BlblR5cGVGaWxlQnVpbGRlci5nZXRTZWFyY2hQYXJhbXMoc2VnQ291bnQsIDIpOwogIGxldCBzdGFydENvdW50ID0gIiI7CiAgbGV0IGVuZENvdW50ID0gIiI7CiAgbGV0IGlkRGVsdGFzID0gIiI7CiAgbGV0IGlkUmFuZ2VPZmZzZXRzID0gIiI7CiAgbGV0IGdseXBoc0lkcyA9ICIiOwogIGxldCBiaWFzID0gMDsKICBsZXQgcmFuZ2UsIHN0YXJ0LCBlbmQsIGNvZGVzOwogIGZvciAoaSA9IDAsIGlpID0gYm1wTGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgcmFuZ2UgPSByYW5nZXNbaV07CiAgICBzdGFydCA9IHJhbmdlWzBdOwogICAgZW5kID0gcmFuZ2VbMV07CiAgICBzdGFydENvdW50ICs9IHN0cmluZzE2KHN0YXJ0KTsKICAgIGVuZENvdW50ICs9IHN0cmluZzE2KGVuZCk7CiAgICBjb2RlcyA9IHJhbmdlWzJdOwogICAgbGV0IGNvbnRpZ3VvdXMgPSB0cnVlOwogICAgZm9yIChqID0gMSwgamogPSBjb2Rlcy5sZW5ndGg7IGogPCBqajsgKytqKSB7CiAgICAgIGlmIChjb2Rlc1tqXSAhPT0gY29kZXNbaiAtIDFdICsgMSkgewogICAgICAgIGNvbnRpZ3VvdXMgPSBmYWxzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKCFjb250aWd1b3VzKSB7CiAgICAgIGNvbnN0IG9mZnNldCA9IChzZWdDb3VudCAtIGkpICogMiArIGJpYXMgKiAyOwogICAgICBiaWFzICs9IGVuZCAtIHN0YXJ0ICsgMTsKICAgICAgaWREZWx0YXMgKz0gc3RyaW5nMTYoMCk7CiAgICAgIGlkUmFuZ2VPZmZzZXRzICs9IHN0cmluZzE2KG9mZnNldCk7CiAgICAgIGZvciAoaiA9IDAsIGpqID0gY29kZXMubGVuZ3RoOyBqIDwgamo7ICsraikgewogICAgICAgIGdseXBoc0lkcyArPSBzdHJpbmcxNihjb2Rlc1tqXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHN0YXJ0Q29kZSA9IGNvZGVzWzBdOwogICAgICBpZERlbHRhcyArPSBzdHJpbmcxNihzdGFydENvZGUgLSBzdGFydCAmIDB4ZmZmZik7CiAgICAgIGlkUmFuZ2VPZmZzZXRzICs9IHN0cmluZzE2KDApOwogICAgfQogIH0KICBpZiAodHJhaWxpbmdSYW5nZXNDb3VudCA+IDApIHsKICAgIGVuZENvdW50ICs9ICJceEZGXHhGRiI7CiAgICBzdGFydENvdW50ICs9ICJceEZGXHhGRiI7CiAgICBpZERlbHRhcyArPSAiXHgwMFx4MDEiOwogICAgaWRSYW5nZU9mZnNldHMgKz0gIlx4MDBceDAwIjsKICB9CiAgY29uc3QgZm9ybWF0MzE0ID0gIlx4MDBceDAwIiArIHN0cmluZzE2KDIgKiBzZWdDb3VudCkgKyBzdHJpbmcxNihzZWFyY2hQYXJhbXMucmFuZ2UpICsgc3RyaW5nMTYoc2VhcmNoUGFyYW1zLmVudHJ5KSArIHN0cmluZzE2KHNlYXJjaFBhcmFtcy5yYW5nZVNoaWZ0KSArIGVuZENvdW50ICsgIlx4MDBceDAwIiArIHN0YXJ0Q291bnQgKyBpZERlbHRhcyArIGlkUmFuZ2VPZmZzZXRzICsgZ2x5cGhzSWRzOwogIGxldCBmb3JtYXQzMTAxMiA9ICIiOwogIGxldCBoZWFkZXIzMTAxMiA9ICIiOwogIGlmIChudW1UYWJsZXMgPiAxKSB7CiAgICBjbWFwICs9ICJceDAwXHgwMyIgKyAiXHgwMFx4MEEiICsgc3RyaW5nMzIoNCArIG51bVRhYmxlcyAqIDggKyA0ICsgZm9ybWF0MzE0Lmxlbmd0aCk7CiAgICBmb3JtYXQzMTAxMiA9ICIiOwogICAgZm9yIChpID0gMCwgaWkgPSByYW5nZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICByYW5nZSA9IHJhbmdlc1tpXTsKICAgICAgc3RhcnQgPSByYW5nZVswXTsKICAgICAgY29kZXMgPSByYW5nZVsyXTsKICAgICAgbGV0IGNvZGUgPSBjb2Rlc1swXTsKICAgICAgZm9yIChqID0gMSwgamogPSBjb2Rlcy5sZW5ndGg7IGogPCBqajsgKytqKSB7CiAgICAgICAgaWYgKGNvZGVzW2pdICE9PSBjb2Rlc1tqIC0gMV0gKyAxKSB7CiAgICAgICAgICBlbmQgPSByYW5nZVswXSArIGogLSAxOwogICAgICAgICAgZm9ybWF0MzEwMTIgKz0gc3RyaW5nMzIoc3RhcnQpICsgc3RyaW5nMzIoZW5kKSArIHN0cmluZzMyKGNvZGUpOwogICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwogICAgICAgICAgY29kZSA9IGNvZGVzW2pdOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3JtYXQzMTAxMiArPSBzdHJpbmczMihzdGFydCkgKyBzdHJpbmczMihyYW5nZVsxXSkgKyBzdHJpbmczMihjb2RlKTsKICAgIH0KICAgIGhlYWRlcjMxMDEyID0gIlx4MDBceDBDIiArICJceDAwXHgwMCIgKyBzdHJpbmczMihmb3JtYXQzMTAxMi5sZW5ndGggKyAxNikgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyBzdHJpbmczMihmb3JtYXQzMTAxMi5sZW5ndGggLyAxMik7CiAgfQogIHJldHVybiBjbWFwICsgIlx4MDBceDA0IiArIHN0cmluZzE2KGZvcm1hdDMxNC5sZW5ndGggKyA0KSArIGZvcm1hdDMxNCArIGhlYWRlcjMxMDEyICsgZm9ybWF0MzEwMTI7Cn0KZnVuY3Rpb24gdmFsaWRhdGVPUzJUYWJsZShvczIsIGZpbGUpIHsKICBmaWxlLnBvcyA9IChmaWxlLnN0YXJ0IHx8IDApICsgb3MyLm9mZnNldDsKICBjb25zdCB2ZXJzaW9uID0gZmlsZS5nZXRVaW50MTYoKTsKICBmaWxlLnNraXAoNjApOwogIGNvbnN0IHNlbGVjdGlvbiA9IGZpbGUuZ2V0VWludDE2KCk7CiAgaWYgKHZlcnNpb24gPCA0ICYmIHNlbGVjdGlvbiAmIDB4MDMwMCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCBmaXJzdENoYXIgPSBmaWxlLmdldFVpbnQxNigpOwogIGNvbnN0IGxhc3RDaGFyID0gZmlsZS5nZXRVaW50MTYoKTsKICBpZiAoZmlyc3RDaGFyID4gbGFzdENoYXIpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgZmlsZS5za2lwKDYpOwogIGNvbnN0IHVzV2luQXNjZW50ID0gZmlsZS5nZXRVaW50MTYoKTsKICBpZiAodXNXaW5Bc2NlbnQgPT09IDApIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgb3MyLmRhdGFbOF0gPSBvczIuZGF0YVs5XSA9IDA7CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgY2hhcnN0cmluZ3MsIG92ZXJyaWRlKSB7CiAgb3ZlcnJpZGUgfHw9IHsKICAgIHVuaXRzUGVyRW06IDAsCiAgICB5TWF4OiAwLAogICAgeU1pbjogMCwKICAgIGFzY2VudDogMCwKICAgIGRlc2NlbnQ6IDAKICB9OwogIGxldCB1bFVuaWNvZGVSYW5nZTEgPSAwOwogIGxldCB1bFVuaWNvZGVSYW5nZTIgPSAwOwogIGxldCB1bFVuaWNvZGVSYW5nZTMgPSAwOwogIGxldCB1bFVuaWNvZGVSYW5nZTQgPSAwOwogIGxldCBmaXJzdENoYXJJbmRleCA9IG51bGw7CiAgbGV0IGxhc3RDaGFySW5kZXggPSAwOwogIGxldCBwb3NpdGlvbiA9IC0xOwogIGlmIChjaGFyc3RyaW5ncykgewogICAgZm9yIChsZXQgY29kZSBpbiBjaGFyc3RyaW5ncykgewogICAgICBjb2RlIHw9IDA7CiAgICAgIGlmIChmaXJzdENoYXJJbmRleCA+IGNvZGUgfHwgIWZpcnN0Q2hhckluZGV4KSB7CiAgICAgICAgZmlyc3RDaGFySW5kZXggPSBjb2RlOwogICAgICB9CiAgICAgIGlmIChsYXN0Q2hhckluZGV4IDwgY29kZSkgewogICAgICAgIGxhc3RDaGFySW5kZXggPSBjb2RlOwogICAgICB9CiAgICAgIHBvc2l0aW9uID0gZ2V0VW5pY29kZVJhbmdlRm9yKGNvZGUsIHBvc2l0aW9uKTsKICAgICAgaWYgKHBvc2l0aW9uIDwgMzIpIHsKICAgICAgICB1bFVuaWNvZGVSYW5nZTEgfD0gMSA8PCBwb3NpdGlvbjsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDY0KSB7CiAgICAgICAgdWxVbmljb2RlUmFuZ2UyIHw9IDEgPDwgcG9zaXRpb24gLSAzMjsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDk2KSB7CiAgICAgICAgdWxVbmljb2RlUmFuZ2UzIHw9IDEgPDwgcG9zaXRpb24gLSA2NDsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDEyMykgewogICAgICAgIHVsVW5pY29kZVJhbmdlNCB8PSAxIDw8IHBvc2l0aW9uIC0gOTY7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmljb2RlIHJhbmdlcyBCaXRzID4gMTIzIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNhZ2UiKTsKICAgICAgfQogICAgfQogICAgaWYgKGxhc3RDaGFySW5kZXggPiAweGZmZmYpIHsKICAgICAgbGFzdENoYXJJbmRleCA9IDB4ZmZmZjsKICAgIH0KICB9IGVsc2UgewogICAgZmlyc3RDaGFySW5kZXggPSAwOwogICAgbGFzdENoYXJJbmRleCA9IDI1NTsKICB9CiAgY29uc3QgYmJveCA9IHByb3BlcnRpZXMuYmJveCB8fCBbMCwgMCwgMCwgMF07CiAgY29uc3QgdW5pdHNQZXJFbSA9IG92ZXJyaWRlLnVuaXRzUGVyRW0gfHwgKHByb3BlcnRpZXMuZm9udE1hdHJpeCA/IDEgLyBNYXRoLm1heCguLi5wcm9wZXJ0aWVzLmZvbnRNYXRyaXguc2xpY2UoMCwgNCkubWFwKE1hdGguYWJzKSkgOiAxMDAwKTsKICBjb25zdCBzY2FsZSA9IHByb3BlcnRpZXMuYXNjZW50U2NhbGVkID8gMS4wIDogdW5pdHNQZXJFbSAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICBjb25zdCB0eXBvQXNjZW50ID0gb3ZlcnJpZGUuYXNjZW50IHx8IE1hdGgucm91bmQoc2NhbGUgKiAocHJvcGVydGllcy5hc2NlbnQgfHwgYmJveFszXSkpOwogIGxldCB0eXBvRGVzY2VudCA9IG92ZXJyaWRlLmRlc2NlbnQgfHwgTWF0aC5yb3VuZChzY2FsZSAqIChwcm9wZXJ0aWVzLmRlc2NlbnQgfHwgYmJveFsxXSkpOwogIGlmICh0eXBvRGVzY2VudCA+IDAgJiYgcHJvcGVydGllcy5kZXNjZW50ID4gMCAmJiBiYm94WzFdIDwgMCkgewogICAgdHlwb0Rlc2NlbnQgPSAtdHlwb0Rlc2NlbnQ7CiAgfQogIGNvbnN0IHdpbkFzY2VudCA9IG92ZXJyaWRlLnlNYXggfHwgdHlwb0FzY2VudDsKICBjb25zdCB3aW5EZXNjZW50ID0gLW92ZXJyaWRlLnlNaW4gfHwgLXR5cG9EZXNjZW50OwogIHJldHVybiAiXHgwMFx4MDMiICsgIlx4MDJceDI0IiArICJceDAxXHhGNCIgKyAiXHgwMFx4MDUiICsgIlx4MDBceDAwIiArICJceDAyXHg4QSIgKyAiXHgwMlx4QkIiICsgIlx4MDBceDAwIiArICJceDAwXHg4QyIgKyAiXHgwMlx4OEEiICsgIlx4MDJceEJCIiArICJceDAwXHgwMCIgKyAiXHgwMVx4REYiICsgIlx4MDBceDMxIiArICJceDAxXHgwMiIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwNiIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHByb3BlcnRpZXMuZml4ZWRQaXRjaCA/IDB4MDkgOiAweDAwKSArICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiICsgc3RyaW5nMzIodWxVbmljb2RlUmFuZ2UxKSArIHN0cmluZzMyKHVsVW5pY29kZVJhbmdlMikgKyBzdHJpbmczMih1bFVuaWNvZGVSYW5nZTMpICsgc3RyaW5nMzIodWxVbmljb2RlUmFuZ2U0KSArICJceDJBXHgzMlx4MzFceDJBIiArIHN0cmluZzE2KHByb3BlcnRpZXMuaXRhbGljQW5nbGUgPyAxIDogMCkgKyBzdHJpbmcxNihmaXJzdENoYXJJbmRleCB8fCBwcm9wZXJ0aWVzLmZpcnN0Q2hhcikgKyBzdHJpbmcxNihsYXN0Q2hhckluZGV4IHx8IHByb3BlcnRpZXMubGFzdENoYXIpICsgc3RyaW5nMTYodHlwb0FzY2VudCkgKyBzdHJpbmcxNih0eXBvRGVzY2VudCkgKyAiXHgwMFx4NjQiICsgc3RyaW5nMTYod2luQXNjZW50KSArIHN0cmluZzE2KHdpbkRlc2NlbnQpICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgc3RyaW5nMTYocHJvcGVydGllcy54SGVpZ2h0KSArIHN0cmluZzE2KHByb3BlcnRpZXMuY2FwSGVpZ2h0KSArIHN0cmluZzE2KDApICsgc3RyaW5nMTYoZmlyc3RDaGFySW5kZXggfHwgcHJvcGVydGllcy5maXJzdENoYXIpICsgIlx4MDBceDAzIjsKfQpmdW5jdGlvbiBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcykgewogIGNvbnN0IGFuZ2xlID0gTWF0aC5mbG9vcihwcm9wZXJ0aWVzLml0YWxpY0FuZ2xlICogMiAqKiAxNik7CiAgcmV0dXJuICJceDAwXHgwM1x4MDBceDAwIiArIHN0cmluZzMyKGFuZ2xlKSArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgc3RyaW5nMzIocHJvcGVydGllcy5maXhlZFBpdGNoID8gMSA6IDApICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiOwp9CmZ1bmN0aW9uIGNyZWF0ZVBvc3RzY3JpcHROYW1lKG5hbWUpIHsKICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKC9bXlx4MjEtXHg3RV18W1tcXSgpe308Pi8lXS9nLCAiIikuc2xpY2UoMCwgNjMpOwp9CmZ1bmN0aW9uIGNyZWF0ZU5hbWVUYWJsZShuYW1lLCBwcm90bykgewogIGlmICghcHJvdG8pIHsKICAgIHByb3RvID0gW1tdLCBbXV07CiAgfQogIGNvbnN0IHN0cmluZ3MgPSBbcHJvdG9bMF1bMF0gfHwgIk9yaWdpbmFsIGxpY2VuY2UiLCBwcm90b1swXVsxXSB8fCBuYW1lLCBwcm90b1swXVsyXSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzNdIHx8ICJ1bmlxdWVJRCIsIHByb3RvWzBdWzRdIHx8IG5hbWUsIHByb3RvWzBdWzVdIHx8ICJWZXJzaW9uIDAuMTEiLCBwcm90b1swXVs2XSB8fCBjcmVhdGVQb3N0c2NyaXB0TmFtZShuYW1lKSwgcHJvdG9bMF1bN10gfHwgIlVua25vd24iLCBwcm90b1swXVs4XSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzldIHx8ICJVbmtub3duIl07CiAgY29uc3Qgc3RyaW5nc1VuaWNvZGUgPSBbXTsKICBsZXQgaSwgaWksIGosIGpqLCBzdHI7CiAgZm9yIChpID0gMCwgaWkgPSBzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIHN0ciA9IHByb3RvWzFdW2ldIHx8IHN0cmluZ3NbaV07CiAgICBjb25zdCBzdHJCdWZVbmljb2RlID0gW107CiAgICBmb3IgKGogPSAwLCBqaiA9IHN0ci5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIHN0ckJ1ZlVuaWNvZGUucHVzaChzdHJpbmcxNihzdHIuY2hhckNvZGVBdChqKSkpOwogICAgfQogICAgc3RyaW5nc1VuaWNvZGUucHVzaChzdHJCdWZVbmljb2RlLmpvaW4oIiIpKTsKICB9CiAgY29uc3QgbmFtZXMgPSBbc3RyaW5ncywgc3RyaW5nc1VuaWNvZGVdOwogIGNvbnN0IHBsYXRmb3JtcyA9IFsiXHgwMFx4MDEiLCAiXHgwMFx4MDMiXTsKICBjb25zdCBlbmNvZGluZ3MgPSBbIlx4MDBceDAwIiwgIlx4MDBceDAxIl07CiAgY29uc3QgbGFuZ3VhZ2VzID0gWyJceDAwXHgwMCIsICJceDA0XHgwOSJdOwogIGNvbnN0IG5hbWVzUmVjb3JkQ291bnQgPSBzdHJpbmdzLmxlbmd0aCAqIHBsYXRmb3Jtcy5sZW5ndGg7CiAgbGV0IG5hbWVUYWJsZSA9ICJceDAwXHgwMCIgKyBzdHJpbmcxNihuYW1lc1JlY29yZENvdW50KSArIHN0cmluZzE2KG5hbWVzUmVjb3JkQ291bnQgKiAxMiArIDYpOwogIGxldCBzdHJPZmZzZXQgPSAwOwogIGZvciAoaSA9IDAsIGlpID0gcGxhdGZvcm1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHN0cnMgPSBuYW1lc1tpXTsKICAgIGZvciAoaiA9IDAsIGpqID0gc3Rycy5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIHN0ciA9IHN0cnNbal07CiAgICAgIGNvbnN0IG5hbWVSZWNvcmQgPSBwbGF0Zm9ybXNbaV0gKyBlbmNvZGluZ3NbaV0gKyBsYW5ndWFnZXNbaV0gKyBzdHJpbmcxNihqKSArIHN0cmluZzE2KHN0ci5sZW5ndGgpICsgc3RyaW5nMTYoc3RyT2Zmc2V0KTsKICAgICAgbmFtZVRhYmxlICs9IG5hbWVSZWNvcmQ7CiAgICAgIHN0ck9mZnNldCArPSBzdHIubGVuZ3RoOwogICAgfQogIH0KICBuYW1lVGFibGUgKz0gc3RyaW5ncy5qb2luKCIiKSArIHN0cmluZ3NVbmljb2RlLmpvaW4oIiIpOwogIHJldHVybiBuYW1lVGFibGU7Cn0KY2xhc3MgRm9udCB7CiAgY29uc3RydWN0b3IobmFtZSwgZmlsZSwgcHJvcGVydGllcywgZXZhbHVhdG9yT3B0aW9ucykgewogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMucHNOYW1lID0gbnVsbDsKICAgIHRoaXMubWltZXR5cGUgPSBudWxsOwogICAgdGhpcy5kaXNhYmxlRm9udEZhY2UgPSBldmFsdWF0b3JPcHRpb25zLmRpc2FibGVGb250RmFjZTsKICAgIHRoaXMuZm9udEV4dHJhUHJvcGVydGllcyA9IGV2YWx1YXRvck9wdGlvbnMuZm9udEV4dHJhUHJvcGVydGllczsKICAgIHRoaXMubG9hZGVkTmFtZSA9IHByb3BlcnRpZXMubG9hZGVkTmFtZTsKICAgIHRoaXMuaXNUeXBlM0ZvbnQgPSBwcm9wZXJ0aWVzLmlzVHlwZTNGb250OwogICAgdGhpcy5taXNzaW5nRmlsZSA9IGZhbHNlOwogICAgdGhpcy5jc3NGb250SW5mbyA9IHByb3BlcnRpZXMuY3NzRm9udEluZm87CiAgICB0aGlzLl9jaGFyc0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHRoaXMuX2dseXBoQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IGlzU2VyaWZGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TZXJpZik7CiAgICBpZiAoIWlzU2VyaWZGb250ICYmICFwcm9wZXJ0aWVzLmlzU2ltdWxhdGVkRmxhZ3MpIHsKICAgICAgY29uc3QgYmFzZU5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoL1ssX10vZywgIi0iKS5zcGxpdCgiLSIsIDEpWzBdLAogICAgICAgIHNlcmlmRm9udHMgPSBnZXRTZXJpZkZvbnRzKCk7CiAgICAgIGZvciAoY29uc3QgbmFtZVBhcnQgb2YgYmFzZU5hbWUuc3BsaXQoIisiKSkgewogICAgICAgIGlmIChzZXJpZkZvbnRzW25hbWVQYXJ0XSkgewogICAgICAgICAgaXNTZXJpZkZvbnQgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzLmlzU2VyaWZGb250ID0gaXNTZXJpZkZvbnQ7CiAgICB0aGlzLmlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7CiAgICB0aGlzLmlzTW9ub3NwYWNlID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5GaXhlZFBpdGNoKTsKICAgIGxldCB7CiAgICAgIHR5cGUsCiAgICAgIHN1YnR5cGUKICAgIH0gPSBwcm9wZXJ0aWVzOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuc3VidHlwZSA9IHN1YnR5cGU7CiAgICB0aGlzLnN5c3RlbUZvbnRJbmZvID0gcHJvcGVydGllcy5zeXN0ZW1Gb250SW5mbzsKICAgIGNvbnN0IG1hdGNoZXMgPSBuYW1lLm1hdGNoKC9eSW52YWxpZFBERmpzRm9udF8oLiopX1xkKyQvKTsKICAgIHRoaXMuaXNJbnZhbGlkUERGanNGb250ID0gISFtYXRjaGVzOwogICAgaWYgKHRoaXMuaXNJbnZhbGlkUERGanNGb250KSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gbWF0Y2hlc1sxXTsKICAgIH0gZWxzZSBpZiAodGhpcy5pc01vbm9zcGFjZSkgewogICAgICB0aGlzLmZhbGxiYWNrTmFtZSA9ICJtb25vc3BhY2UiOwogICAgfSBlbHNlIGlmICh0aGlzLmlzU2VyaWZGb250KSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gInNlcmlmIjsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gInNhbnMtc2VyaWYiOwogICAgfQogICAgaWYgKHRoaXMuc3lzdGVtRm9udEluZm8/Lmd1ZXNzRmFsbGJhY2spIHsKICAgICAgdGhpcy5zeXN0ZW1Gb250SW5mby5ndWVzc0ZhbGxiYWNrID0gZmFsc2U7CiAgICAgIHRoaXMuc3lzdGVtRm9udEluZm8uY3NzICs9IGAsJHt0aGlzLmZhbGxiYWNrTmFtZX1gOwogICAgfQogICAgdGhpcy5kaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzOwogICAgdGhpcy5kZWZhdWx0V2lkdGggPSBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aDsKICAgIHRoaXMuY29tcG9zaXRlID0gcHJvcGVydGllcy5jb21wb3NpdGU7CiAgICB0aGlzLmNNYXAgPSBwcm9wZXJ0aWVzLmNNYXA7CiAgICB0aGlzLmNhcEhlaWdodCA9IHByb3BlcnRpZXMuY2FwSGVpZ2h0IC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTOwogICAgdGhpcy5hc2NlbnQgPSBwcm9wZXJ0aWVzLmFzY2VudCAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICAgIHRoaXMuZGVzY2VudCA9IHByb3BlcnRpZXMuZGVzY2VudCAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICAgIHRoaXMubGluZUhlaWdodCA9IHRoaXMuYXNjZW50IC0gdGhpcy5kZXNjZW50OwogICAgdGhpcy5mb250TWF0cml4ID0gcHJvcGVydGllcy5mb250TWF0cml4OwogICAgdGhpcy5iYm94ID0gcHJvcGVydGllcy5iYm94OwogICAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZzsKICAgIHRoaXMudG9Vbmljb2RlID0gcHJvcGVydGllcy50b1VuaWNvZGU7CiAgICB0aGlzLnRvRm9udENoYXIgPSBbXTsKICAgIGlmIChwcm9wZXJ0aWVzLnR5cGUgPT09ICJUeXBlMyIpIHsKICAgICAgZm9yIChsZXQgY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IDI1NjsgY2hhckNvZGUrKykgewogICAgICAgIHRoaXMudG9Gb250Q2hhcltjaGFyQ29kZV0gPSB0aGlzLmRpZmZlcmVuY2VzW2NoYXJDb2RlXSB8fCBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZ1tjaGFyQ29kZV07CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5jaWRFbmNvZGluZyA9IHByb3BlcnRpZXMuY2lkRW5jb2RpbmcgfHwgIiI7CiAgICB0aGlzLnZlcnRpY2FsID0gISFwcm9wZXJ0aWVzLnZlcnRpY2FsOwogICAgaWYgKHRoaXMudmVydGljYWwpIHsKICAgICAgdGhpcy52bWV0cmljcyA9IHByb3BlcnRpZXMudm1ldHJpY3M7CiAgICAgIHRoaXMuZGVmYXVsdFZNZXRyaWNzID0gcHJvcGVydGllcy5kZWZhdWx0Vk1ldHJpY3M7CiAgICB9CiAgICBpZiAoIWZpbGUgfHwgZmlsZS5pc0VtcHR5KSB7CiAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgd2FybignRm9udCBmaWxlIGlzIGVtcHR5IGluICInICsgbmFtZSArICciICgnICsgdGhpcy5sb2FkZWROYW1lICsgIikiKTsKICAgICAgfQogICAgICB0aGlzLmZhbGxiYWNrVG9TeXN0ZW1Gb250KHByb3BlcnRpZXMpOwogICAgICByZXR1cm47CiAgICB9CiAgICBbdHlwZSwgc3VidHlwZV0gPSBnZXRGb250RmlsZVR5cGUoZmlsZSwgcHJvcGVydGllcyk7CiAgICBpZiAodHlwZSAhPT0gdGhpcy50eXBlIHx8IHN1YnR5cGUgIT09IHRoaXMuc3VidHlwZSkgewogICAgICBpbmZvKCJJbmNvbnNpc3RlbnQgZm9udCBmaWxlIFR5cGUvU3ViVHlwZSwgZXhwZWN0ZWQ6ICIgKyBgJHt0aGlzLnR5cGV9LyR7dGhpcy5zdWJ0eXBlfSBidXQgZm91bmQ6ICR7dHlwZX0vJHtzdWJ0eXBlfS5gKTsKICAgIH0KICAgIGxldCBkYXRhOwogICAgdHJ5IHsKICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSAiTU1UeXBlMSI6CiAgICAgICAgICBpbmZvKCJNTVR5cGUxIGZvbnQgKCIgKyBuYW1lICsgIiksIGZhbGxpbmcgYmFjayB0byBUeXBlMS4iKTsKICAgICAgICBjYXNlICJUeXBlMSI6CiAgICAgICAgY2FzZSAiQ0lERm9udFR5cGUwIjoKICAgICAgICAgIHRoaXMubWltZXR5cGUgPSAiZm9udC9vcGVudHlwZSI7CiAgICAgICAgICBjb25zdCBjZmYgPSBzdWJ0eXBlID09PSAiVHlwZTFDIiB8fCBzdWJ0eXBlID09PSAiQ0lERm9udFR5cGUwQyIgPyBuZXcgQ0ZGRm9udChmaWxlLCBwcm9wZXJ0aWVzKSA6IG5ldyBUeXBlMUZvbnQobmFtZSwgZmlsZSwgcHJvcGVydGllcyk7CiAgICAgICAgICBhZGp1c3RXaWR0aHMocHJvcGVydGllcyk7CiAgICAgICAgICBkYXRhID0gdGhpcy5jb252ZXJ0KG5hbWUsIGNmZiwgcHJvcGVydGllcyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJPcGVuVHlwZSI6CiAgICAgICAgY2FzZSAiVHJ1ZVR5cGUiOgogICAgICAgIGNhc2UgIkNJREZvbnRUeXBlMiI6CiAgICAgICAgICB0aGlzLm1pbWV0eXBlID0gImZvbnQvb3BlbnR5cGUiOwogICAgICAgICAgZGF0YSA9IHRoaXMuY2hlY2tBbmRSZXBhaXIobmFtZSwgZmlsZSwgcHJvcGVydGllcyk7CiAgICAgICAgICBpZiAodGhpcy5pc09wZW5UeXBlKSB7CiAgICAgICAgICAgIGFkanVzdFdpZHRocyhwcm9wZXJ0aWVzKTsKICAgICAgICAgICAgdHlwZSA9ICJPcGVuVHlwZSI7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBGb250ICR7dHlwZX0gaXMgbm90IHN1cHBvcnRlZGApOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHdhcm4oZSk7CiAgICAgIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQocHJvcGVydGllcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGFtZW5kRmFsbGJhY2tUb1VuaWNvZGUocHJvcGVydGllcyk7CiAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuc3VidHlwZSA9IHN1YnR5cGU7CiAgICB0aGlzLmZvbnRNYXRyaXggPSBwcm9wZXJ0aWVzLmZvbnRNYXRyaXg7CiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzOwogICAgdGhpcy5kZWZhdWx0V2lkdGggPSBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aDsKICAgIHRoaXMudG9Vbmljb2RlID0gcHJvcGVydGllcy50b1VuaWNvZGU7CiAgICB0aGlzLnNlYWNNYXAgPSBwcm9wZXJ0aWVzLnNlYWNNYXA7CiAgfQogIGdldCByZW5kZXJlcigpIHsKICAgIGNvbnN0IHJlbmRlcmVyID0gRm9udFJlbmRlcmVyRmFjdG9yeS5jcmVhdGUodGhpcywgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgInJlbmRlcmVyIiwgcmVuZGVyZXIpOwogIH0KICBleHBvcnREYXRhKCkgewogICAgY29uc3QgZXhwb3J0RGF0YVByb3BzID0gdGhpcy5mb250RXh0cmFQcm9wZXJ0aWVzID8gWy4uLkVYUE9SVF9EQVRBX1BST1BFUlRJRVMsIC4uLkVYUE9SVF9EQVRBX0VYVFJBX1BST1BFUlRJRVNdIDogRVhQT1JUX0RBVEFfUFJPUEVSVElFUzsKICAgIGNvbnN0IGRhdGEgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgZm9yIChjb25zdCBwcm9wIG9mIGV4cG9ydERhdGFQcm9wcykgewogICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbcHJvcF07CiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGF0YVtwcm9wXSA9IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9CiAgZmFsbGJhY2tUb1N5c3RlbUZvbnQocHJvcGVydGllcykgewogICAgdGhpcy5taXNzaW5nRmlsZSA9IHRydWU7CiAgICBjb25zdCB7CiAgICAgIG5hbWUsCiAgICAgIHR5cGUKICAgIH0gPSB0aGlzOwogICAgbGV0IGZvbnROYW1lID0gbm9ybWFsaXplRm9udE5hbWUobmFtZSk7CiAgICBjb25zdCBzdGRGb250TWFwID0gZ2V0U3RkRm9udE1hcCgpLAogICAgICBub25TdGRGb250TWFwID0gZ2V0Tm9uU3RkRm9udE1hcCgpOwogICAgY29uc3QgaXNTdGFuZGFyZEZvbnQgPSAhIXN0ZEZvbnRNYXBbZm9udE5hbWVdOwogICAgY29uc3QgaXNNYXBwZWRUb1N0YW5kYXJkRm9udCA9ICEhKG5vblN0ZEZvbnRNYXBbZm9udE5hbWVdICYmIHN0ZEZvbnRNYXBbbm9uU3RkRm9udE1hcFtmb250TmFtZV1dKTsKICAgIGZvbnROYW1lID0gc3RkRm9udE1hcFtmb250TmFtZV0gfHwgbm9uU3RkRm9udE1hcFtmb250TmFtZV0gfHwgZm9udE5hbWU7CiAgICBjb25zdCBmb250QmFzaWNNZXRyaWNzTWFwID0gZ2V0Rm9udEJhc2ljTWV0cmljcygpOwogICAgY29uc3QgbWV0cmljcyA9IGZvbnRCYXNpY01ldHJpY3NNYXBbZm9udE5hbWVdOwogICAgaWYgKG1ldHJpY3MpIHsKICAgICAgaWYgKGlzTmFOKHRoaXMuYXNjZW50KSkgewogICAgICAgIHRoaXMuYXNjZW50ID0gbWV0cmljcy5hc2NlbnQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CiAgICAgIH0KICAgICAgaWYgKGlzTmFOKHRoaXMuZGVzY2VudCkpIHsKICAgICAgICB0aGlzLmRlc2NlbnQgPSBtZXRyaWNzLmRlc2NlbnQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CiAgICAgIH0KICAgICAgaWYgKGlzTmFOKHRoaXMuY2FwSGVpZ2h0KSkgewogICAgICAgIHRoaXMuY2FwSGVpZ2h0ID0gbWV0cmljcy5jYXBIZWlnaHQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuYm9sZCA9IC9ib2xkL2dpLnRlc3QoZm9udE5hbWUpOwogICAgdGhpcy5pdGFsaWMgPSAvb2JsaXF1ZXxpdGFsaWMvZ2kudGVzdChmb250TmFtZSk7CiAgICB0aGlzLmJsYWNrID0gL0JsYWNrL2cudGVzdChuYW1lKTsKICAgIGNvbnN0IGlzTmFycm93ID0gL05hcnJvdy9nLnRlc3QobmFtZSk7CiAgICB0aGlzLnJlbWVhc3VyZSA9ICghaXNTdGFuZGFyZEZvbnQgfHwgaXNOYXJyb3cpICYmIE9iamVjdC5rZXlzKHRoaXMud2lkdGhzKS5sZW5ndGggPiAwOwogICAgaWYgKChpc1N0YW5kYXJkRm9udCB8fCBpc01hcHBlZFRvU3RhbmRhcmRGb250KSAmJiB0eXBlID09PSAiQ0lERm9udFR5cGUyIiAmJiB0aGlzLmNpZEVuY29kaW5nLnN0YXJ0c1dpdGgoIklkZW50aXR5LSIpKSB7CiAgICAgIGNvbnN0IGNpZFRvR2lkTWFwID0gcHJvcGVydGllcy5jaWRUb0dpZE1hcDsKICAgICAgY29uc3QgbWFwID0gW107CiAgICAgIGFwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAobWFwLCBnZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMoKSk7CiAgICAgIGlmICgvQXJpYWwtP0JsYWNrL2kudGVzdChuYW1lKSkgewogICAgICAgIGFwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAobWFwLCBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2soKSk7CiAgICAgIH0gZWxzZSBpZiAoL0NhbGlicmkvaS50ZXN0KG5hbWUpKSB7CiAgICAgICAgYXBwbHlTdGFuZGFyZEZvbnRHbHlwaE1hcChtYXAsIGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSgpKTsKICAgICAgfQogICAgICBpZiAoY2lkVG9HaWRNYXApIHsKICAgICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIG1hcCkgewogICAgICAgICAgY29uc3QgY2lkID0gbWFwW2NoYXJDb2RlXTsKICAgICAgICAgIGlmIChjaWRUb0dpZE1hcFtjaWRdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBjaWRUb0dpZE1hcFtjaWRdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY2lkVG9HaWRNYXAubGVuZ3RoICE9PSB0aGlzLnRvVW5pY29kZS5sZW5ndGggJiYgcHJvcGVydGllcy5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCAmJiB0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSB7CiAgICAgICAgICB0aGlzLnRvVW5pY29kZS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgdW5pY29kZUNoYXJDb2RlKSB7CiAgICAgICAgICAgIGNvbnN0IGNpZCA9IG1hcFtjaGFyQ29kZV07CiAgICAgICAgICAgIGlmIChjaWRUb0dpZE1hcFtjaWRdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IHVuaWNvZGVDaGFyQ29kZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghKHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXApKSB7CiAgICAgICAgdGhpcy50b1VuaWNvZGUuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIHVuaWNvZGVDaGFyQ29kZSkgewogICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSB1bmljb2RlQ2hhckNvZGU7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbWFwOwogICAgICB0aGlzLnRvVW5pY29kZSA9IG5ldyBUb1VuaWNvZGVNYXAobWFwKTsKICAgIH0gZWxzZSBpZiAoL1N5bWJvbC9pLnRlc3QoZm9udE5hbWUpKSB7CiAgICAgIHRoaXMudG9Gb250Q2hhciA9IGJ1aWxkVG9Gb250Q2hhcihTeW1ib2xTZXRFbmNvZGluZywgZ2V0R2x5cGhzVW5pY29kZSgpLCB0aGlzLmRpZmZlcmVuY2VzKTsKICAgIH0gZWxzZSBpZiAoL0RpbmdiYXRzL2kudGVzdChmb250TmFtZSkpIHsKICAgICAgdGhpcy50b0ZvbnRDaGFyID0gYnVpbGRUb0ZvbnRDaGFyKFphcGZEaW5nYmF0c0VuY29kaW5nLCBnZXREaW5nYmF0c0dseXBoc1VuaWNvZGUoKSwgdGhpcy5kaWZmZXJlbmNlcyk7CiAgICB9IGVsc2UgaWYgKGlzU3RhbmRhcmRGb250IHx8IGlzTWFwcGVkVG9TdGFuZGFyZEZvbnQpIHsKICAgICAgY29uc3QgbWFwID0gYnVpbGRUb0ZvbnRDaGFyKHRoaXMuZGVmYXVsdEVuY29kaW5nLCBnZXRHbHlwaHNVbmljb2RlKCksIHRoaXMuZGlmZmVyZW5jZXMpOwogICAgICBpZiAodHlwZSA9PT0gIkNJREZvbnRUeXBlMiIgJiYgIXRoaXMuY2lkRW5jb2Rpbmcuc3RhcnRzV2l0aCgiSWRlbnRpdHktIikgJiYgISh0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSkgewogICAgICAgIHRoaXMudG9Vbmljb2RlLmZvckVhY2goZnVuY3Rpb24gKGNoYXJDb2RlLCB1bmljb2RlQ2hhckNvZGUpIHsKICAgICAgICAgIG1hcFsrY2hhckNvZGVdID0gdW5pY29kZUNoYXJDb2RlOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHRoaXMudG9Gb250Q2hhciA9IG1hcDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7CiAgICAgIGNvbnN0IG1hcCA9IFtdOwogICAgICB0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChjaGFyQ29kZSwgdW5pY29kZUNoYXJDb2RlKSA9PiB7CiAgICAgICAgaWYgKCF0aGlzLmNvbXBvc2l0ZSkgewogICAgICAgICAgY29uc3QgZ2x5cGhOYW1lID0gdGhpcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gfHwgdGhpcy5kZWZhdWx0RW5jb2RpbmdbY2hhckNvZGVdOwogICAgICAgICAgY29uc3QgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOwogICAgICAgICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CiAgICAgICAgICAgIHVuaWNvZGVDaGFyQ29kZSA9IHVuaWNvZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG1hcFsrY2hhckNvZGVdID0gdW5pY29kZUNoYXJDb2RlOwogICAgICB9KTsKICAgICAgaWYgKHRoaXMuY29tcG9zaXRlICYmIHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXApIHsKICAgICAgICBpZiAoL1RhaG9tYXxWZXJkYW5hL2kudGVzdChuYW1lKSkgewogICAgICAgICAgYXBwbHlTdGFuZGFyZEZvbnRHbHlwaE1hcChtYXAsIGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cygpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbWFwOwogICAgfQogICAgYW1lbmRGYWxsYmFja1RvVW5pY29kZShwcm9wZXJ0aWVzKTsKICAgIHRoaXMubG9hZGVkTmFtZSA9IGZvbnROYW1lLnNwbGl0KCItIiwgMSlbMF07CiAgfQogIGNoZWNrQW5kUmVwYWlyKG5hbWUsIGZvbnQsIHByb3BlcnRpZXMpIHsKICAgIGNvbnN0IFZBTElEX1RBQkxFUyA9IFsiT1MvMiIsICJjbWFwIiwgImhlYWQiLCAiaGhlYSIsICJobXR4IiwgIm1heHAiLCAibmFtZSIsICJwb3N0IiwgImxvY2EiLCAiZ2x5ZiIsICJmcGdtIiwgInByZXAiLCAiY3Z0ICIsICJDRkYgIl07CiAgICBmdW5jdGlvbiByZWFkVGFibGVzKGZpbGUsIG51bVRhYmxlcykgewogICAgICBjb25zdCB0YWJsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICB0YWJsZXNbIk9TLzIiXSA9IG51bGw7CiAgICAgIHRhYmxlcy5jbWFwID0gbnVsbDsKICAgICAgdGFibGVzLmhlYWQgPSBudWxsOwogICAgICB0YWJsZXMuaGhlYSA9IG51bGw7CiAgICAgIHRhYmxlcy5obXR4ID0gbnVsbDsKICAgICAgdGFibGVzLm1heHAgPSBudWxsOwogICAgICB0YWJsZXMubmFtZSA9IG51bGw7CiAgICAgIHRhYmxlcy5wb3N0ID0gbnVsbDsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykgewogICAgICAgIGNvbnN0IHRhYmxlID0gcmVhZFRhYmxlRW50cnkoZmlsZSk7CiAgICAgICAgaWYgKCFWQUxJRF9UQUJMRVMuaW5jbHVkZXModGFibGUudGFnKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0YWJsZS5sZW5ndGggPT09IDApIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB0YWJsZXNbdGFibGUudGFnXSA9IHRhYmxlOwogICAgICB9CiAgICAgIHJldHVybiB0YWJsZXM7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkVGFibGVFbnRyeShmaWxlKSB7CiAgICAgIGNvbnN0IHRhZyA9IGZpbGUuZ2V0U3RyaW5nKDQpOwogICAgICBjb25zdCBjaGVja3N1bSA9IGZpbGUuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgY29uc3Qgb2Zmc2V0ID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICBjb25zdCBsZW5ndGggPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CiAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSBmaWxlLnBvczsKICAgICAgZmlsZS5wb3MgPSBmaWxlLnN0YXJ0IHx8IDA7CiAgICAgIGZpbGUuc2tpcChvZmZzZXQpOwogICAgICBjb25zdCBkYXRhID0gZmlsZS5nZXRCeXRlcyhsZW5ndGgpOwogICAgICBmaWxlLnBvcyA9IHByZXZpb3VzUG9zaXRpb247CiAgICAgIGlmICh0YWcgPT09ICJoZWFkIikgewogICAgICAgIGRhdGFbOF0gPSBkYXRhWzldID0gZGF0YVsxMF0gPSBkYXRhWzExXSA9IDA7CiAgICAgICAgZGF0YVsxN10gfD0gMHgyMDsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIHRhZywKICAgICAgICBjaGVja3N1bSwKICAgICAgICBsZW5ndGgsCiAgICAgICAgb2Zmc2V0LAogICAgICAgIGRhdGEKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRPcGVuVHlwZUhlYWRlcih0dGYpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB2ZXJzaW9uOiB0dGYuZ2V0U3RyaW5nKDQpLAogICAgICAgIG51bVRhYmxlczogdHRmLmdldFVpbnQxNigpLAogICAgICAgIHNlYXJjaFJhbmdlOiB0dGYuZ2V0VWludDE2KCksCiAgICAgICAgZW50cnlTZWxlY3RvcjogdHRmLmdldFVpbnQxNigpLAogICAgICAgIHJhbmdlU2hpZnQ6IHR0Zi5nZXRVaW50MTYoKQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkhlYWRlcih0dGMpIHsKICAgICAgY29uc3QgdHRjVGFnID0gdHRjLmdldFN0cmluZyg0KTsKICAgICAgYXNzZXJ0KHR0Y1RhZyA9PT0gInR0Y2YiLCAiTXVzdCBiZSBhIFRydWVUeXBlIENvbGxlY3Rpb24gZm9udC4iKTsKICAgICAgY29uc3QgbWFqb3JWZXJzaW9uID0gdHRjLmdldFVpbnQxNigpOwogICAgICBjb25zdCBtaW5vclZlcnNpb24gPSB0dGMuZ2V0VWludDE2KCk7CiAgICAgIGNvbnN0IG51bUZvbnRzID0gdHRjLmdldEludDMyKCkgPj4+IDA7CiAgICAgIGNvbnN0IG9mZnNldFRhYmxlID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtRm9udHM7IGkrKykgewogICAgICAgIG9mZnNldFRhYmxlLnB1c2godHRjLmdldEludDMyKCkgPj4+IDApOwogICAgICB9CiAgICAgIGNvbnN0IGhlYWRlciA9IHsKICAgICAgICB0dGNUYWcsCiAgICAgICAgbWFqb3JWZXJzaW9uLAogICAgICAgIG1pbm9yVmVyc2lvbiwKICAgICAgICBudW1Gb250cywKICAgICAgICBvZmZzZXRUYWJsZQogICAgICB9OwogICAgICBzd2l0Y2ggKG1ham9yVmVyc2lvbikgewogICAgICAgIGNhc2UgMToKICAgICAgICAgIHJldHVybiBoZWFkZXI7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgaGVhZGVyLmRzaWdUYWcgPSB0dGMuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICAgIGhlYWRlci5kc2lnTGVuZ3RoID0gdHRjLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgICBoZWFkZXIuZHNpZ09mZnNldCA9IHR0Yy5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgcmV0dXJuIGhlYWRlcjsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgVHJ1ZVR5cGUgQ29sbGVjdGlvbiBtYWpvclZlcnNpb246ICR7bWFqb3JWZXJzaW9ufS5gKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25EYXRhKHR0YywgZm9udE5hbWUpIHsKICAgICAgY29uc3QgewogICAgICAgIG51bUZvbnRzLAogICAgICAgIG9mZnNldFRhYmxlCiAgICAgIH0gPSByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uSGVhZGVyKHR0Yyk7CiAgICAgIGNvbnN0IGZvbnROYW1lUGFydHMgPSBmb250TmFtZS5zcGxpdCgiKyIpOwogICAgICBsZXQgZmFsbGJhY2tEYXRhOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUZvbnRzOyBpKyspIHsKICAgICAgICB0dGMucG9zID0gKHR0Yy5zdGFydCB8fCAwKSArIG9mZnNldFRhYmxlW2ldOwogICAgICAgIGNvbnN0IHBvdGVudGlhbEhlYWRlciA9IHJlYWRPcGVuVHlwZUhlYWRlcih0dGMpOwogICAgICAgIGNvbnN0IHBvdGVudGlhbFRhYmxlcyA9IHJlYWRUYWJsZXModHRjLCBwb3RlbnRpYWxIZWFkZXIubnVtVGFibGVzKTsKICAgICAgICBpZiAoIXBvdGVudGlhbFRhYmxlcy5uYW1lKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ1RydWVUeXBlIENvbGxlY3Rpb24gZm9udCBtdXN0IGNvbnRhaW4gYSAibmFtZSIgdGFibGUuJyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IFtuYW1lVGFibGVdID0gcmVhZE5hbWVUYWJsZShwb3RlbnRpYWxUYWJsZXMubmFtZSk7CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gbmFtZVRhYmxlLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgIGZvciAobGV0IGsgPSAwLCBrayA9IG5hbWVUYWJsZVtqXS5sZW5ndGg7IGsgPCBrazsgaysrKSB7CiAgICAgICAgICAgIGNvbnN0IG5hbWVFbnRyeSA9IG5hbWVUYWJsZVtqXVtrXT8ucmVwbGFjZUFsbCgvXHMvZywgIiIpOwogICAgICAgICAgICBpZiAoIW5hbWVFbnRyeSkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuYW1lRW50cnkgPT09IGZvbnROYW1lKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGhlYWRlcjogcG90ZW50aWFsSGVhZGVyLAogICAgICAgICAgICAgICAgdGFibGVzOiBwb3RlbnRpYWxUYWJsZXMKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmb250TmFtZVBhcnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgZm9udE5hbWVQYXJ0cykgewogICAgICAgICAgICAgIGlmIChuYW1lRW50cnkgPT09IHBhcnQpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgbmFtZTogcGFydCwKICAgICAgICAgICAgICAgICAgaGVhZGVyOiBwb3RlbnRpYWxIZWFkZXIsCiAgICAgICAgICAgICAgICAgIHRhYmxlczogcG90ZW50aWFsVGFibGVzCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZmFsbGJhY2tEYXRhKSB7CiAgICAgICAgd2FybihgVHJ1ZVR5cGUgQ29sbGVjdGlvbiBkb2VzIG5vdCBjb250YWluICIke2ZvbnROYW1lfSIgZm9udCwgYCArIGBmYWxsaW5nIGJhY2sgdG8gIiR7ZmFsbGJhY2tEYXRhLm5hbWV9IiBmb250IGluc3RlYWQuYCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGhlYWRlcjogZmFsbGJhY2tEYXRhLmhlYWRlciwKICAgICAgICAgIHRhYmxlczogZmFsbGJhY2tEYXRhLnRhYmxlcwogICAgICAgIH07CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBUcnVlVHlwZSBDb2xsZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gIiR7Zm9udE5hbWV9IiBmb250LmApOwogICAgfQogICAgZnVuY3Rpb24gcmVhZENtYXBUYWJsZShjbWFwLCBmaWxlLCBpc1N5bWJvbGljRm9udCwgaGFzRW5jb2RpbmcpIHsKICAgICAgaWYgKCFjbWFwKSB7CiAgICAgICAgd2FybigiTm8gY21hcCB0YWJsZSBhdmFpbGFibGUuIik7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBsYXRmb3JtSWQ6IC0xLAogICAgICAgICAgZW5jb2RpbmdJZDogLTEsCiAgICAgICAgICBtYXBwaW5nczogW10sCiAgICAgICAgICBoYXNTaG9ydENtYXA6IGZhbHNlCiAgICAgICAgfTsKICAgICAgfQogICAgICBsZXQgc2VnbWVudDsKICAgICAgbGV0IHN0YXJ0ID0gKGZpbGUuc3RhcnQgfHwgMCkgKyBjbWFwLm9mZnNldDsKICAgICAgZmlsZS5wb3MgPSBzdGFydDsKICAgICAgZmlsZS5za2lwKDIpOwogICAgICBjb25zdCBudW1UYWJsZXMgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICBsZXQgcG90ZW50aWFsVGFibGU7CiAgICAgIGxldCBjYW5CcmVhayA9IGZhbHNlOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7CiAgICAgICAgY29uc3QgcGxhdGZvcm1JZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgY29uc3QgZW5jb2RpbmdJZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgIGxldCB1c2VUYWJsZSA9IGZhbHNlOwogICAgICAgIGlmIChwb3RlbnRpYWxUYWJsZT8ucGxhdGZvcm1JZCA9PT0gcGxhdGZvcm1JZCAmJiBwb3RlbnRpYWxUYWJsZT8uZW5jb2RpbmdJZCA9PT0gZW5jb2RpbmdJZCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChwbGF0Zm9ybUlkID09PSAwICYmIChlbmNvZGluZ0lkID09PSAwIHx8IGVuY29kaW5nSWQgPT09IDEgfHwgZW5jb2RpbmdJZCA9PT0gMykpIHsKICAgICAgICAgIHVzZVRhYmxlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKHBsYXRmb3JtSWQgPT09IDEgJiYgZW5jb2RpbmdJZCA9PT0gMCkgewogICAgICAgICAgdXNlVGFibGUgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAocGxhdGZvcm1JZCA9PT0gMyAmJiBlbmNvZGluZ0lkID09PSAxICYmIChoYXNFbmNvZGluZyB8fCAhcG90ZW50aWFsVGFibGUpKSB7CiAgICAgICAgICB1c2VUYWJsZSA9IHRydWU7CiAgICAgICAgICBpZiAoIWlzU3ltYm9saWNGb250KSB7CiAgICAgICAgICAgIGNhbkJyZWFrID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGlzU3ltYm9saWNGb250ICYmIHBsYXRmb3JtSWQgPT09IDMgJiYgZW5jb2RpbmdJZCA9PT0gMCkgewogICAgICAgICAgdXNlVGFibGUgPSB0cnVlOwogICAgICAgICAgbGV0IGNvcnJlY3RseVNvcnRlZCA9IHRydWU7CiAgICAgICAgICBpZiAoaSA8IG51bVRhYmxlcyAtIDEpIHsKICAgICAgICAgICAgY29uc3QgbmV4dEJ5dGVzID0gZmlsZS5wZWVrQnl0ZXMoMiksCiAgICAgICAgICAgICAgbmV4dFBsYXRmb3JtSWQgPSBpbnQxNihuZXh0Qnl0ZXNbMF0sIG5leHRCeXRlc1sxXSk7CiAgICAgICAgICAgIGlmIChuZXh0UGxhdGZvcm1JZCA8IHBsYXRmb3JtSWQpIHsKICAgICAgICAgICAgICBjb3JyZWN0bHlTb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvcnJlY3RseVNvcnRlZCkgewogICAgICAgICAgICBjYW5CcmVhayA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh1c2VUYWJsZSkgewogICAgICAgICAgcG90ZW50aWFsVGFibGUgPSB7CiAgICAgICAgICAgIHBsYXRmb3JtSWQsCiAgICAgICAgICAgIGVuY29kaW5nSWQsCiAgICAgICAgICAgIG9mZnNldAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgaWYgKGNhbkJyZWFrKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHBvdGVudGlhbFRhYmxlKSB7CiAgICAgICAgZmlsZS5wb3MgPSBzdGFydCArIHBvdGVudGlhbFRhYmxlLm9mZnNldDsKICAgICAgfQogICAgICBpZiAoIXBvdGVudGlhbFRhYmxlIHx8IGZpbGUucGVla0J5dGUoKSA9PT0gLTEpIHsKICAgICAgICB3YXJuKCJDb3VsZCBub3QgZmluZCBhIHByZWZlcnJlZCBjbWFwIHRhYmxlLiIpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSwKICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLAogICAgICAgICAgbWFwcGluZ3M6IFtdLAogICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZQogICAgICAgIH07CiAgICAgIH0KICAgICAgY29uc3QgZm9ybWF0ID0gZmlsZS5nZXRVaW50MTYoKTsKICAgICAgbGV0IGhhc1Nob3J0Q21hcCA9IGZhbHNlOwogICAgICBjb25zdCBtYXBwaW5ncyA9IFtdOwogICAgICBsZXQgaiwgZ2x5cGhJZDsKICAgICAgaWYgKGZvcm1hdCA9PT0gMCkgewogICAgICAgIGZpbGUuc2tpcCgyICsgMik7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CiAgICAgICAgICBjb25zdCBpbmRleCA9IGZpbGUuZ2V0Qnl0ZSgpOwogICAgICAgICAgaWYgKCFpbmRleCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICBjaGFyQ29kZTogaiwKICAgICAgICAgICAgZ2x5cGhJZDogaW5kZXgKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBoYXNTaG9ydENtYXAgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gMikgewogICAgICAgIGZpbGUuc2tpcCgyICsgMik7CiAgICAgICAgY29uc3Qgc3ViSGVhZGVyS2V5cyA9IFtdOwogICAgICAgIGxldCBtYXhTdWJIZWFkZXJLZXkgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKICAgICAgICAgIGNvbnN0IHN1YkhlYWRlcktleSA9IGZpbGUuZ2V0VWludDE2KCkgPj4gMzsKICAgICAgICAgIHN1YkhlYWRlcktleXMucHVzaChzdWJIZWFkZXJLZXkpOwogICAgICAgICAgbWF4U3ViSGVhZGVyS2V5ID0gTWF0aC5tYXgoc3ViSGVhZGVyS2V5LCBtYXhTdWJIZWFkZXJLZXkpOwogICAgICAgIH0KICAgICAgICBjb25zdCBzdWJIZWFkZXJzID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbWF4U3ViSGVhZGVyS2V5OyBpKyspIHsKICAgICAgICAgIHN1YkhlYWRlcnMucHVzaCh7CiAgICAgICAgICAgIGZpcnN0Q29kZTogZmlsZS5nZXRVaW50MTYoKSwKICAgICAgICAgICAgZW50cnlDb3VudDogZmlsZS5nZXRVaW50MTYoKSwKICAgICAgICAgICAgaWREZWx0YTogc2lnbmVkSW50MTYoZmlsZS5nZXRCeXRlKCksIGZpbGUuZ2V0Qnl0ZSgpKSwKICAgICAgICAgICAgaWRSYW5nZVBvczogZmlsZS5wb3MgKyBmaWxlLmdldFVpbnQxNigpCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICAgICAgaWYgKHN1YkhlYWRlcktleXNbaV0gPT09IDApIHsKICAgICAgICAgICAgZmlsZS5wb3MgPSBzdWJIZWFkZXJzWzBdLmlkUmFuZ2VQb3MgKyAyICogaTsKICAgICAgICAgICAgZ2x5cGhJZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICAgIGNoYXJDb2RlOiBpLAogICAgICAgICAgICAgIGdseXBoSWQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBzID0gc3ViSGVhZGVyc1tzdWJIZWFkZXJLZXlzW2ldXTsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMuZW50cnlDb3VudDsgaisrKSB7CiAgICAgICAgICAgICAgY29uc3QgY2hhckNvZGUgPSAoaSA8PCA4KSArIGogKyBzLmZpcnN0Q29kZTsKICAgICAgICAgICAgICBmaWxlLnBvcyA9IHMuaWRSYW5nZVBvcyArIDIgKiBqOwogICAgICAgICAgICAgIGdseXBoSWQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgICAgICAgIGlmIChnbHlwaElkICE9PSAwKSB7CiAgICAgICAgICAgICAgICBnbHlwaElkID0gKGdseXBoSWQgKyBzLmlkRGVsdGEpICUgNjU1MzY7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICAgICAgY2hhckNvZGUsCiAgICAgICAgICAgICAgICBnbHlwaElkCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSA0KSB7CiAgICAgICAgZmlsZS5za2lwKDIgKyAyKTsKICAgICAgICBjb25zdCBzZWdDb3VudCA9IGZpbGUuZ2V0VWludDE2KCkgPj4gMTsKICAgICAgICBmaWxlLnNraXAoNik7CiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBbXTsKICAgICAgICBsZXQgc2VnSW5kZXg7CiAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHsKICAgICAgICAgIHNlZ21lbnRzLnB1c2goewogICAgICAgICAgICBlbmQ6IGZpbGUuZ2V0VWludDE2KCkKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBmaWxlLnNraXAoMik7CiAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHsKICAgICAgICAgIHNlZ21lbnRzW3NlZ0luZGV4XS5zdGFydCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgfQogICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CiAgICAgICAgICBzZWdtZW50c1tzZWdJbmRleF0uZGVsdGEgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgIH0KICAgICAgICBsZXQgb2Zmc2V0c0NvdW50ID0gMCwKICAgICAgICAgIG9mZnNldEluZGV4OwogICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CiAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnSW5kZXhdOwogICAgICAgICAgY29uc3QgcmFuZ2VPZmZzZXQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgICAgaWYgKCFyYW5nZU9mZnNldCkgewogICAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gLTE7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgb2Zmc2V0SW5kZXggPSAocmFuZ2VPZmZzZXQgPj4gMSkgLSAoc2VnQ291bnQgLSBzZWdJbmRleCk7CiAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gb2Zmc2V0SW5kZXg7CiAgICAgICAgICBvZmZzZXRzQ291bnQgPSBNYXRoLm1heChvZmZzZXRzQ291bnQsIG9mZnNldEluZGV4ICsgc2VnbWVudC5lbmQgLSBzZWdtZW50LnN0YXJ0ICsgMSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9mZnNldHMgPSBbXTsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgb2Zmc2V0c0NvdW50OyBqKyspIHsKICAgICAgICAgIG9mZnNldHMucHVzaChmaWxlLmdldFVpbnQxNigpKTsKICAgICAgICB9CiAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHsKICAgICAgICAgIHNlZ21lbnQgPSBzZWdtZW50c1tzZWdJbmRleF07CiAgICAgICAgICBzdGFydCA9IHNlZ21lbnQuc3RhcnQ7CiAgICAgICAgICBjb25zdCBlbmQgPSBzZWdtZW50LmVuZDsKICAgICAgICAgIGNvbnN0IGRlbHRhID0gc2VnbWVudC5kZWx0YTsKICAgICAgICAgIG9mZnNldEluZGV4ID0gc2VnbWVudC5vZmZzZXRJbmRleDsKICAgICAgICAgIGZvciAoaiA9IHN0YXJ0OyBqIDw9IGVuZDsgaisrKSB7CiAgICAgICAgICAgIGlmIChqID09PSAweGZmZmYpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbHlwaElkID0gb2Zmc2V0SW5kZXggPCAwID8gaiA6IG9mZnNldHNbb2Zmc2V0SW5kZXggKyBqIC0gc3RhcnRdOwogICAgICAgICAgICBnbHlwaElkID0gZ2x5cGhJZCArIGRlbHRhICYgMHhmZmZmOwogICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgICBjaGFyQ29kZTogaiwKICAgICAgICAgICAgICBnbHlwaElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDYpIHsKICAgICAgICBmaWxlLnNraXAoMiArIDIpOwogICAgICAgIGNvbnN0IGZpcnN0Q29kZSA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgY29uc3QgZW50cnlDb3VudCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IGVudHJ5Q291bnQ7IGorKykgewogICAgICAgICAgZ2x5cGhJZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGZpcnN0Q29kZSArIGo7CiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgY2hhckNvZGUsCiAgICAgICAgICAgIGdseXBoSWQKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDEyKSB7CiAgICAgICAgZmlsZS5za2lwKDIgKyA0ICsgNCk7CiAgICAgICAgY29uc3Qgbkdyb3VwcyA9IGZpbGUuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbkdyb3VwczsgaisrKSB7CiAgICAgICAgICBjb25zdCBzdGFydENoYXJDb2RlID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgY29uc3QgZW5kQ2hhckNvZGUgPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgICBsZXQgZ2x5cGhDb2RlID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgZm9yIChsZXQgY2hhckNvZGUgPSBzdGFydENoYXJDb2RlOyBjaGFyQ29kZSA8PSBlbmRDaGFyQ29kZTsgY2hhckNvZGUrKykgewogICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgICBjaGFyQ29kZSwKICAgICAgICAgICAgICBnbHlwaElkOiBnbHlwaENvZGUrKwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigiY21hcCB0YWJsZSBoYXMgdW5zdXBwb3J0ZWQgZm9ybWF0OiAiICsgZm9ybWF0KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgcGxhdGZvcm1JZDogLTEsCiAgICAgICAgICBlbmNvZGluZ0lkOiAtMSwKICAgICAgICAgIG1hcHBpbmdzOiBbXSwKICAgICAgICAgIGhhc1Nob3J0Q21hcDogZmFsc2UKICAgICAgICB9OwogICAgICB9CiAgICAgIG1hcHBpbmdzLnNvcnQoKGEsIGIpID0+IGEuY2hhckNvZGUgLSBiLmNoYXJDb2RlKTsKICAgICAgY29uc3QgZmluYWxNYXBwaW5ncyA9IFtdLAogICAgICAgIHNlZW5DaGFyQ29kZXMgPSBuZXcgU2V0KCk7CiAgICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHBpbmdzKSB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgY2hhckNvZGUKICAgICAgICB9ID0gbWFwOwogICAgICAgIGlmIChzZWVuQ2hhckNvZGVzLmhhcyhjaGFyQ29kZSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBzZWVuQ2hhckNvZGVzLmFkZChjaGFyQ29kZSk7CiAgICAgICAgZmluYWxNYXBwaW5ncy5wdXNoKG1hcCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBwbGF0Zm9ybUlkOiBwb3RlbnRpYWxUYWJsZS5wbGF0Zm9ybUlkLAogICAgICAgIGVuY29kaW5nSWQ6IHBvdGVudGlhbFRhYmxlLmVuY29kaW5nSWQsCiAgICAgICAgbWFwcGluZ3M6IGZpbmFsTWFwcGluZ3MsCiAgICAgICAgaGFzU2hvcnRDbWFwCiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBzYW5pdGl6ZU1ldHJpY3MoZmlsZSwgaGVhZGVyLCBtZXRyaWNzLCBoZWFkVGFibGUsIG51bUdseXBocywgZHVwRmlyc3RFbnRyeSkgewogICAgICBpZiAoIWhlYWRlcikgewogICAgICAgIGlmIChtZXRyaWNzKSB7CiAgICAgICAgICBtZXRyaWNzLmRhdGEgPSBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZmlsZS5wb3MgPSAoZmlsZS5zdGFydCB8fCAwKSArIGhlYWRlci5vZmZzZXQ7CiAgICAgIGZpbGUucG9zICs9IDQ7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGNvbnN0IGNhcmV0T2Zmc2V0ID0gZmlsZS5nZXRVaW50MTYoKTsKICAgICAgZmlsZS5wb3MgKz0gODsKICAgICAgZmlsZS5wb3MgKz0gMjsKICAgICAgbGV0IG51bU9mTWV0cmljcyA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgIGlmIChjYXJldE9mZnNldCAhPT0gMCkgewogICAgICAgIGNvbnN0IG1hY1N0eWxlID0gaW50MTYoaGVhZFRhYmxlLmRhdGFbNDRdLCBoZWFkVGFibGUuZGF0YVs0NV0pOwogICAgICAgIGlmICghKG1hY1N0eWxlICYgMikpIHsKICAgICAgICAgIGhlYWRlci5kYXRhWzIyXSA9IDA7CiAgICAgICAgICBoZWFkZXIuZGF0YVsyM10gPSAwOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobnVtT2ZNZXRyaWNzID4gbnVtR2x5cGhzKSB7CiAgICAgICAgaW5mbyhgVGhlIG51bU9mTWV0cmljcyAoJHtudW1PZk1ldHJpY3N9KSBzaG91bGQgbm90IGJlIGAgKyBgZ3JlYXRlciB0aGFuIHRoZSBudW1HbHlwaHMgKCR7bnVtR2x5cGhzfSkuYCk7CiAgICAgICAgbnVtT2ZNZXRyaWNzID0gbnVtR2x5cGhzOwogICAgICAgIGhlYWRlci5kYXRhWzM0XSA9IChudW1PZk1ldHJpY3MgJiAweGZmMDApID4+IDg7CiAgICAgICAgaGVhZGVyLmRhdGFbMzVdID0gbnVtT2ZNZXRyaWNzICYgMHgwMGZmOwogICAgICB9CiAgICAgIGNvbnN0IG51bU9mU2lkZWJlYXJpbmdzID0gbnVtR2x5cGhzIC0gbnVtT2ZNZXRyaWNzOwogICAgICBjb25zdCBudW1NaXNzaW5nID0gbnVtT2ZTaWRlYmVhcmluZ3MgLSAobWV0cmljcy5sZW5ndGggLSBudW1PZk1ldHJpY3MgKiA0ID4+IDEpOwogICAgICBpZiAobnVtTWlzc2luZyA+IDApIHsKICAgICAgICBjb25zdCBlbnRyaWVzID0gbmV3IFVpbnQ4QXJyYXkobWV0cmljcy5sZW5ndGggKyBudW1NaXNzaW5nICogMik7CiAgICAgICAgZW50cmllcy5zZXQobWV0cmljcy5kYXRhKTsKICAgICAgICBpZiAoZHVwRmlyc3RFbnRyeSkgewogICAgICAgICAgZW50cmllc1ttZXRyaWNzLmxlbmd0aF0gPSBtZXRyaWNzLmRhdGFbMl07CiAgICAgICAgICBlbnRyaWVzW21ldHJpY3MubGVuZ3RoICsgMV0gPSBtZXRyaWNzLmRhdGFbM107CiAgICAgICAgfQogICAgICAgIG1ldHJpY3MuZGF0YSA9IGVudHJpZXM7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNhbml0aXplR2x5cGgoc291cmNlLCBzb3VyY2VTdGFydCwgc291cmNlRW5kLCBkZXN0LCBkZXN0U3RhcnQsIGhpbnRzVmFsaWQpIHsKICAgICAgY29uc3QgZ2x5cGhQcm9maWxlID0gewogICAgICAgIGxlbmd0aDogMCwKICAgICAgICBzaXplT2ZJbnN0cnVjdGlvbnM6IDAKICAgICAgfTsKICAgICAgaWYgKHNvdXJjZVN0YXJ0IDwgMCB8fCBzb3VyY2VTdGFydCA+PSBzb3VyY2UubGVuZ3RoIHx8IHNvdXJjZUVuZCA+IHNvdXJjZS5sZW5ndGggfHwgc291cmNlRW5kIC0gc291cmNlU3RhcnQgPD0gMTIpIHsKICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICB9CiAgICAgIGNvbnN0IGdseWYgPSBzb3VyY2Uuc3ViYXJyYXkoc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CiAgICAgIGNvbnN0IHhNaW4gPSBzaWduZWRJbnQxNihnbHlmWzJdLCBnbHlmWzNdKTsKICAgICAgY29uc3QgeU1pbiA9IHNpZ25lZEludDE2KGdseWZbNF0sIGdseWZbNV0pOwogICAgICBjb25zdCB4TWF4ID0gc2lnbmVkSW50MTYoZ2x5Zls2XSwgZ2x5Zls3XSk7CiAgICAgIGNvbnN0IHlNYXggPSBzaWduZWRJbnQxNihnbHlmWzhdLCBnbHlmWzldKTsKICAgICAgaWYgKHhNaW4gPiB4TWF4KSB7CiAgICAgICAgd3JpdGVTaWduZWRJbnQxNihnbHlmLCAyLCB4TWF4KTsKICAgICAgICB3cml0ZVNpZ25lZEludDE2KGdseWYsIDYsIHhNaW4pOwogICAgICB9CiAgICAgIGlmICh5TWluID4geU1heCkgewogICAgICAgIHdyaXRlU2lnbmVkSW50MTYoZ2x5ZiwgNCwgeU1heCk7CiAgICAgICAgd3JpdGVTaWduZWRJbnQxNihnbHlmLCA4LCB5TWluKTsKICAgICAgfQogICAgICBjb25zdCBjb250b3Vyc0NvdW50ID0gc2lnbmVkSW50MTYoZ2x5ZlswXSwgZ2x5ZlsxXSk7CiAgICAgIGlmIChjb250b3Vyc0NvdW50IDwgMCkgewogICAgICAgIGlmIChjb250b3Vyc0NvdW50IDwgLTEpIHsKICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICAgICAgfQogICAgICAgIGRlc3Quc2V0KGdseWYsIGRlc3RTdGFydCk7CiAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseWYubGVuZ3RoOwogICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICAgIH0KICAgICAgbGV0IGksCiAgICAgICAgaiA9IDEwLAogICAgICAgIGZsYWdzQ291bnQgPSAwOwogICAgICBmb3IgKGkgPSAwOyBpIDwgY29udG91cnNDb3VudDsgaSsrKSB7CiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSBnbHlmW2pdIDw8IDggfCBnbHlmW2ogKyAxXTsKICAgICAgICBmbGFnc0NvdW50ID0gZW5kUG9pbnQgKyAxOwogICAgICAgIGogKz0gMjsKICAgICAgfQogICAgICBjb25zdCBpbnN0cnVjdGlvbnNTdGFydCA9IGo7CiAgICAgIGNvbnN0IGluc3RydWN0aW9uc0xlbmd0aCA9IGdseWZbal0gPDwgOCB8IGdseWZbaiArIDFdOwogICAgICBnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zTGVuZ3RoOwogICAgICBqICs9IDIgKyBpbnN0cnVjdGlvbnNMZW5ndGg7CiAgICAgIGNvbnN0IGluc3RydWN0aW9uc0VuZCA9IGo7CiAgICAgIGxldCBjb29yZGluYXRlc0xlbmd0aCA9IDA7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBmbGFnc0NvdW50OyBpKyspIHsKICAgICAgICBjb25zdCBmbGFnID0gZ2x5ZltqKytdOwogICAgICAgIGlmIChmbGFnICYgMHhjMCkgewogICAgICAgICAgZ2x5ZltqIC0gMV0gPSBmbGFnICYgMHgzZjsKICAgICAgICB9CiAgICAgICAgbGV0IHhMZW5ndGggPSAyOwogICAgICAgIGlmIChmbGFnICYgMikgewogICAgICAgICAgeExlbmd0aCA9IDE7CiAgICAgICAgfSBlbHNlIGlmIChmbGFnICYgMTYpIHsKICAgICAgICAgIHhMZW5ndGggPSAwOwogICAgICAgIH0KICAgICAgICBsZXQgeUxlbmd0aCA9IDI7CiAgICAgICAgaWYgKGZsYWcgJiA0KSB7CiAgICAgICAgICB5TGVuZ3RoID0gMTsKICAgICAgICB9IGVsc2UgaWYgKGZsYWcgJiAzMikgewogICAgICAgICAgeUxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHh5TGVuZ3RoID0geExlbmd0aCArIHlMZW5ndGg7CiAgICAgICAgY29vcmRpbmF0ZXNMZW5ndGggKz0geHlMZW5ndGg7CiAgICAgICAgaWYgKGZsYWcgJiA4KSB7CiAgICAgICAgICBjb25zdCByZXBlYXQgPSBnbHlmW2orK107CiAgICAgICAgICBpZiAocmVwZWF0ID09PSAwKSB7CiAgICAgICAgICAgIGdseWZbaiAtIDFdIF49IDg7CiAgICAgICAgICB9CiAgICAgICAgICBpICs9IHJlcGVhdDsKICAgICAgICAgIGNvb3JkaW5hdGVzTGVuZ3RoICs9IHJlcGVhdCAqIHh5TGVuZ3RoOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY29vcmRpbmF0ZXNMZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICB9CiAgICAgIGxldCBnbHlwaERhdGFMZW5ndGggPSBqICsgY29vcmRpbmF0ZXNMZW5ndGg7CiAgICAgIGlmIChnbHlwaERhdGFMZW5ndGggPiBnbHlmLmxlbmd0aCkgewogICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICAgIH0KICAgICAgaWYgKCFoaW50c1ZhbGlkICYmIGluc3RydWN0aW9uc0xlbmd0aCA+IDApIHsKICAgICAgICBkZXN0LnNldChnbHlmLnN1YmFycmF5KDAsIGluc3RydWN0aW9uc1N0YXJ0KSwgZGVzdFN0YXJ0KTsKICAgICAgICBkZXN0LnNldChbMCwgMF0sIGRlc3RTdGFydCArIGluc3RydWN0aW9uc1N0YXJ0KTsKICAgICAgICBkZXN0LnNldChnbHlmLnN1YmFycmF5KGluc3RydWN0aW9uc0VuZCwgZ2x5cGhEYXRhTGVuZ3RoKSwgZGVzdFN0YXJ0ICsgaW5zdHJ1Y3Rpb25zU3RhcnQgKyAyKTsKICAgICAgICBnbHlwaERhdGFMZW5ndGggLT0gaW5zdHJ1Y3Rpb25zTGVuZ3RoOwogICAgICAgIGlmIChnbHlmLmxlbmd0aCAtIGdseXBoRGF0YUxlbmd0aCA+IDMpIHsKICAgICAgICAgIGdseXBoRGF0YUxlbmd0aCA9IGdseXBoRGF0YUxlbmd0aCArIDMgJiB+MzsKICAgICAgICB9CiAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseXBoRGF0YUxlbmd0aDsKICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICB9CiAgICAgIGlmIChnbHlmLmxlbmd0aCAtIGdseXBoRGF0YUxlbmd0aCA+IDMpIHsKICAgICAgICBnbHlwaERhdGFMZW5ndGggPSBnbHlwaERhdGFMZW5ndGggKyAzICYgfjM7CiAgICAgICAgZGVzdC5zZXQoZ2x5Zi5zdWJhcnJheSgwLCBnbHlwaERhdGFMZW5ndGgpLCBkZXN0U3RhcnQpOwogICAgICAgIGdseXBoUHJvZmlsZS5sZW5ndGggPSBnbHlwaERhdGFMZW5ndGg7CiAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTsKICAgICAgfQogICAgICBkZXN0LnNldChnbHlmLCBkZXN0U3RhcnQpOwogICAgICBnbHlwaFByb2ZpbGUubGVuZ3RoID0gZ2x5Zi5sZW5ndGg7CiAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICB9CiAgICBmdW5jdGlvbiBzYW5pdGl6ZUhlYWQoaGVhZCwgbnVtR2x5cGhzLCBsb2NhTGVuZ3RoKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBoZWFkLmRhdGE7CiAgICAgIGNvbnN0IHZlcnNpb24gPSBpbnQzMihkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdKTsKICAgICAgaWYgKHZlcnNpb24gPj4gMTYgIT09IDEpIHsKICAgICAgICBpbmZvKCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIHZlcnNpb24gaW4gaGVhZCB0YWJsZTogIiArIHZlcnNpb24pOwogICAgICAgIGRhdGFbMF0gPSAwOwogICAgICAgIGRhdGFbMV0gPSAxOwogICAgICAgIGRhdGFbMl0gPSAwOwogICAgICAgIGRhdGFbM10gPSAwOwogICAgICB9CiAgICAgIGNvbnN0IGluZGV4VG9Mb2NGb3JtYXQgPSBpbnQxNihkYXRhWzUwXSwgZGF0YVs1MV0pOwogICAgICBpZiAoaW5kZXhUb0xvY0Zvcm1hdCA8IDAgfHwgaW5kZXhUb0xvY0Zvcm1hdCA+IDEpIHsKICAgICAgICBpbmZvKCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIGluZGV4VG9Mb2NGb3JtYXQgaW4gaGVhZCB0YWJsZTogIiArIGluZGV4VG9Mb2NGb3JtYXQpOwogICAgICAgIGNvbnN0IG51bUdseXBoc1BsdXNPbmUgPSBudW1HbHlwaHMgKyAxOwogICAgICAgIGlmIChsb2NhTGVuZ3RoID09PSBudW1HbHlwaHNQbHVzT25lIDw8IDEpIHsKICAgICAgICAgIGRhdGFbNTBdID0gMDsKICAgICAgICAgIGRhdGFbNTFdID0gMDsKICAgICAgICB9IGVsc2UgaWYgKGxvY2FMZW5ndGggPT09IG51bUdseXBoc1BsdXNPbmUgPDwgMikgewogICAgICAgICAgZGF0YVs1MF0gPSAwOwogICAgICAgICAgZGF0YVs1MV0gPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkNvdWxkIG5vdCBmaXggaW5kZXhUb0xvY0Zvcm1hdDogIiArIGluZGV4VG9Mb2NGb3JtYXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc2FuaXRpemVHbHlwaExvY2F0aW9ucyhsb2NhLCBnbHlmLCBudW1HbHlwaHMsIGlzR2x5cGhMb2NhdGlvbnNMb25nLCBoaW50c1ZhbGlkLCBkdXBGaXJzdEVudHJ5LCBtYXhTaXplT2ZJbnN0cnVjdGlvbnMpIHsKICAgICAgbGV0IGl0ZW1TaXplLCBpdGVtRGVjb2RlLCBpdGVtRW5jb2RlOwogICAgICBpZiAoaXNHbHlwaExvY2F0aW9uc0xvbmcpIHsKICAgICAgICBpdGVtU2l6ZSA9IDQ7CiAgICAgICAgaXRlbURlY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRGVjb2RlTG9uZyhkYXRhLCBvZmZzZXQpIHsKICAgICAgICAgIHJldHVybiBkYXRhW29mZnNldF0gPDwgMjQgfCBkYXRhW29mZnNldCArIDFdIDw8IDE2IHwgZGF0YVtvZmZzZXQgKyAyXSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAzXTsKICAgICAgICB9OwogICAgICAgIGl0ZW1FbmNvZGUgPSBmdW5jdGlvbiBmb250SXRlbUVuY29kZUxvbmcoZGF0YSwgb2Zmc2V0LCB2YWx1ZSkgewogICAgICAgICAgZGF0YVtvZmZzZXRdID0gdmFsdWUgPj4+IDI0ICYgMHhmZjsKICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+PiAxNiAmIDB4ZmY7CiAgICAgICAgICBkYXRhW29mZnNldCArIDJdID0gdmFsdWUgPj4gOCAmIDB4ZmY7CiAgICAgICAgICBkYXRhW29mZnNldCArIDNdID0gdmFsdWUgJiAweGZmOwogICAgICAgIH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXRlbVNpemUgPSAyOwogICAgICAgIGl0ZW1EZWNvZGUgPSBmdW5jdGlvbiBmb250SXRlbURlY29kZShkYXRhLCBvZmZzZXQpIHsKICAgICAgICAgIHJldHVybiBkYXRhW29mZnNldF0gPDwgOSB8IGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTsKICAgICAgICB9OwogICAgICAgIGl0ZW1FbmNvZGUgPSBmdW5jdGlvbiBmb250SXRlbUVuY29kZShkYXRhLCBvZmZzZXQsIHZhbHVlKSB7CiAgICAgICAgICBkYXRhW29mZnNldF0gPSB2YWx1ZSA+PiA5ICYgMHhmZjsKICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+PiAxICYgMHhmZjsKICAgICAgICB9OwogICAgICB9CiAgICAgIGNvbnN0IG51bUdseXBoc091dCA9IGR1cEZpcnN0RW50cnkgPyBudW1HbHlwaHMgKyAxIDogbnVtR2x5cGhzOwogICAgICBjb25zdCBsb2NhRGF0YVNpemUgPSBpdGVtU2l6ZSAqICgxICsgbnVtR2x5cGhzT3V0KTsKICAgICAgY29uc3QgbG9jYURhdGEgPSBuZXcgVWludDhBcnJheShsb2NhRGF0YVNpemUpOwogICAgICBsb2NhRGF0YS5zZXQobG9jYS5kYXRhLnN1YmFycmF5KDAsIGxvY2FEYXRhU2l6ZSkpOwogICAgICBsb2NhLmRhdGEgPSBsb2NhRGF0YTsKICAgICAgY29uc3Qgb2xkR2x5ZkRhdGEgPSBnbHlmLmRhdGE7CiAgICAgIGNvbnN0IG9sZEdseWZEYXRhTGVuZ3RoID0gb2xkR2x5ZkRhdGEubGVuZ3RoOwogICAgICBjb25zdCBuZXdHbHlmRGF0YSA9IG5ldyBVaW50OEFycmF5KG9sZEdseWZEYXRhTGVuZ3RoKTsKICAgICAgbGV0IGksIGo7CiAgICAgIGNvbnN0IGxvY2FFbnRyaWVzID0gW107CiAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbnVtR2x5cGhzICsgMTsgaSsrLCBqICs9IGl0ZW1TaXplKSB7CiAgICAgICAgbGV0IG9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYURhdGEsIGopOwogICAgICAgIGlmIChvZmZzZXQgPiBvbGRHbHlmRGF0YUxlbmd0aCkgewogICAgICAgICAgb2Zmc2V0ID0gb2xkR2x5ZkRhdGFMZW5ndGg7CiAgICAgICAgfQogICAgICAgIGxvY2FFbnRyaWVzLnB1c2goewogICAgICAgICAgaW5kZXg6IGksCiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICBlbmRPZmZzZXQ6IDAKICAgICAgICB9KTsKICAgICAgfQogICAgICBsb2NhRW50cmllcy5zb3J0KChhLCBiKSA9PiBhLm9mZnNldCAtIGIub2Zmc2V0KTsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bUdseXBoczsgaSsrKSB7CiAgICAgICAgbG9jYUVudHJpZXNbaV0uZW5kT2Zmc2V0ID0gbG9jYUVudHJpZXNbaSArIDFdLm9mZnNldDsKICAgICAgfQogICAgICBsb2NhRW50cmllcy5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykgewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIG9mZnNldCwKICAgICAgICAgIGVuZE9mZnNldAogICAgICAgIH0gPSBsb2NhRW50cmllc1tpXTsKICAgICAgICBpZiAob2Zmc2V0ICE9PSAwIHx8IGVuZE9mZnNldCAhPT0gMCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5leHRPZmZzZXQgPSBsb2NhRW50cmllc1tpICsgMV0ub2Zmc2V0OwogICAgICAgIGlmIChuZXh0T2Zmc2V0ID09PSAwKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgbG9jYUVudHJpZXNbaV0uZW5kT2Zmc2V0ID0gbmV4dE9mZnNldDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjb25zdCBsYXN0ID0gbG9jYUVudHJpZXMuYXQoLTIpOwogICAgICBpZiAobGFzdC5vZmZzZXQgIT09IDAgJiYgbGFzdC5lbmRPZmZzZXQgPT09IDApIHsKICAgICAgICBsYXN0LmVuZE9mZnNldCA9IG9sZEdseWZEYXRhTGVuZ3RoOwogICAgICB9CiAgICAgIGNvbnN0IG1pc3NpbmdHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBsZXQgd3JpdGVPZmZzZXQgPSAwOwogICAgICBpdGVtRW5jb2RlKGxvY2FEYXRhLCAwLCB3cml0ZU9mZnNldCk7CiAgICAgIGZvciAoaSA9IDAsIGogPSBpdGVtU2l6ZTsgaSA8IG51bUdseXBoczsgaSsrLCBqICs9IGl0ZW1TaXplKSB7CiAgICAgICAgY29uc3QgZ2x5cGhQcm9maWxlID0gc2FuaXRpemVHbHlwaChvbGRHbHlmRGF0YSwgbG9jYUVudHJpZXNbaV0ub2Zmc2V0LCBsb2NhRW50cmllc1tpXS5lbmRPZmZzZXQsIG5ld0dseWZEYXRhLCB3cml0ZU9mZnNldCwgaGludHNWYWxpZCk7CiAgICAgICAgY29uc3QgbmV3TGVuZ3RoID0gZ2x5cGhQcm9maWxlLmxlbmd0aDsKICAgICAgICBpZiAobmV3TGVuZ3RoID09PSAwKSB7CiAgICAgICAgICBtaXNzaW5nR2x5cGhzW2ldID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGdseXBoUHJvZmlsZS5zaXplT2ZJbnN0cnVjdGlvbnMgPiBtYXhTaXplT2ZJbnN0cnVjdGlvbnMpIHsKICAgICAgICAgIG1heFNpemVPZkluc3RydWN0aW9ucyA9IGdseXBoUHJvZmlsZS5zaXplT2ZJbnN0cnVjdGlvbnM7CiAgICAgICAgfQogICAgICAgIHdyaXRlT2Zmc2V0ICs9IG5ld0xlbmd0aDsKICAgICAgICBpdGVtRW5jb2RlKGxvY2FEYXRhLCBqLCB3cml0ZU9mZnNldCk7CiAgICAgIH0KICAgICAgaWYgKHdyaXRlT2Zmc2V0ID09PSAwKSB7CiAgICAgICAgY29uc3Qgc2ltcGxlR2x5cGggPSBuZXcgVWludDhBcnJheShbMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNDksIDBdKTsKICAgICAgICBmb3IgKGkgPSAwLCBqID0gaXRlbVNpemU7IGkgPCBudW1HbHlwaHNPdXQ7IGkrKywgaiArPSBpdGVtU2l6ZSkgewogICAgICAgICAgaXRlbUVuY29kZShsb2NhRGF0YSwgaiwgc2ltcGxlR2x5cGgubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgZ2x5Zi5kYXRhID0gc2ltcGxlR2x5cGg7CiAgICAgIH0gZWxzZSBpZiAoZHVwRmlyc3RFbnRyeSkgewogICAgICAgIGNvbnN0IGZpcnN0RW50cnlMZW5ndGggPSBpdGVtRGVjb2RlKGxvY2FEYXRhLCBpdGVtU2l6ZSk7CiAgICAgICAgaWYgKG5ld0dseWZEYXRhLmxlbmd0aCA+IGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCkgewogICAgICAgICAgZ2x5Zi5kYXRhID0gbmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgZmlyc3RFbnRyeUxlbmd0aCArIHdyaXRlT2Zmc2V0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZ2x5Zi5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3RFbnRyeUxlbmd0aCArIHdyaXRlT2Zmc2V0KTsKICAgICAgICAgIGdseWYuZGF0YS5zZXQobmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgd3JpdGVPZmZzZXQpKTsKICAgICAgICB9CiAgICAgICAgZ2x5Zi5kYXRhLnNldChuZXdHbHlmRGF0YS5zdWJhcnJheSgwLCBmaXJzdEVudHJ5TGVuZ3RoKSwgd3JpdGVPZmZzZXQpOwogICAgICAgIGl0ZW1FbmNvZGUobG9jYS5kYXRhLCBsb2NhRGF0YS5sZW5ndGggLSBpdGVtU2l6ZSwgd3JpdGVPZmZzZXQgKyBmaXJzdEVudHJ5TGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnbHlmLmRhdGEgPSBuZXdHbHlmRGF0YS5zdWJhcnJheSgwLCB3cml0ZU9mZnNldCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBtaXNzaW5nR2x5cGhzLAogICAgICAgIG1heFNpemVPZkluc3RydWN0aW9ucwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFBvc3RTY3JpcHRUYWJsZShwb3N0LCBwcm9wZXJ0aWVzT2JqLCBtYXhwTnVtR2x5cGhzKSB7CiAgICAgIGNvbnN0IHN0YXJ0ID0gKGZvbnQuc3RhcnQgfHwgMCkgKyBwb3N0Lm9mZnNldDsKICAgICAgZm9udC5wb3MgPSBzdGFydDsKICAgICAgY29uc3QgbGVuZ3RoID0gcG9zdC5sZW5ndGgsCiAgICAgICAgZW5kID0gc3RhcnQgKyBsZW5ndGg7CiAgICAgIGNvbnN0IHZlcnNpb24gPSBmb250LmdldEludDMyKCk7CiAgICAgIGZvbnQuc2tpcCgyOCk7CiAgICAgIGxldCBnbHlwaE5hbWVzOwogICAgICBsZXQgdmFsaWQgPSB0cnVlOwogICAgICBsZXQgaTsKICAgICAgc3dpdGNoICh2ZXJzaW9uKSB7CiAgICAgICAgY2FzZSAweDAwMDEwMDAwOgogICAgICAgICAgZ2x5cGhOYW1lcyA9IE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAyMDAwMDoKICAgICAgICAgIGNvbnN0IG51bUdseXBocyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICAgICAgICBpZiAobnVtR2x5cGhzICE9PSBtYXhwTnVtR2x5cGhzKSB7CiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgZ2x5cGhOYW1lSW5kZXhlcyA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUdseXBoczsgKytpKSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZm9udC5nZXRVaW50MTYoKTsKICAgICAgICAgICAgaWYgKGluZGV4ID49IDMyNzY4KSB7CiAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbHlwaE5hbWVJbmRleGVzLnB1c2goaW5kZXgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCF2YWxpZCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGN1c3RvbU5hbWVzID0gW10sCiAgICAgICAgICAgIHN0ckJ1ZiA9IFtdOwogICAgICAgICAgd2hpbGUgKGZvbnQucG9zIDwgZW5kKSB7CiAgICAgICAgICAgIGNvbnN0IHN0cmluZ0xlbmd0aCA9IGZvbnQuZ2V0Qnl0ZSgpOwogICAgICAgICAgICBzdHJCdWYubGVuZ3RoID0gc3RyaW5nTGVuZ3RoOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5nTGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICBzdHJCdWZbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2V0Qnl0ZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXN0b21OYW1lcy5wdXNoKHN0ckJ1Zi5qb2luKCIiKSk7CiAgICAgICAgICB9CiAgICAgICAgICBnbHlwaE5hbWVzID0gW107CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtR2x5cGhzOyArK2kpIHsKICAgICAgICAgICAgY29uc3QgaiA9IGdseXBoTmFtZUluZGV4ZXNbaV07CiAgICAgICAgICAgIGlmIChqIDwgMjU4KSB7CiAgICAgICAgICAgICAgZ2x5cGhOYW1lcy5wdXNoKE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZ1tqXSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2x5cGhOYW1lcy5wdXNoKGN1c3RvbU5hbWVzW2ogLSAyNThdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAzMDAwMDoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB3YXJuKCJVbmtub3duL3Vuc3VwcG9ydGVkIHBvc3QgdGFibGUgdmVyc2lvbiAiICsgdmVyc2lvbik7CiAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgaWYgKHByb3BlcnRpZXNPYmouZGVmYXVsdEVuY29kaW5nKSB7CiAgICAgICAgICAgIGdseXBoTmFtZXMgPSBwcm9wZXJ0aWVzT2JqLmRlZmF1bHRFbmNvZGluZzsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHByb3BlcnRpZXNPYmouZ2x5cGhOYW1lcyA9IGdseXBoTmFtZXM7CiAgICAgIHJldHVybiB2YWxpZDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWROYW1lVGFibGUobmFtZVRhYmxlKSB7CiAgICAgIGNvbnN0IHN0YXJ0ID0gKGZvbnQuc3RhcnQgfHwgMCkgKyBuYW1lVGFibGUub2Zmc2V0OwogICAgICBmb250LnBvcyA9IHN0YXJ0OwogICAgICBjb25zdCBuYW1lcyA9IFtbXSwgW11dLAogICAgICAgIHJlY29yZHMgPSBbXTsKICAgICAgY29uc3QgbGVuZ3RoID0gbmFtZVRhYmxlLmxlbmd0aCwKICAgICAgICBlbmQgPSBzdGFydCArIGxlbmd0aDsKICAgICAgY29uc3QgZm9ybWF0ID0gZm9udC5nZXRVaW50MTYoKTsKICAgICAgY29uc3QgRk9STUFUXzBfSEVBREVSX0xFTkdUSCA9IDY7CiAgICAgIGlmIChmb3JtYXQgIT09IDAgfHwgbGVuZ3RoIDwgRk9STUFUXzBfSEVBREVSX0xFTkdUSCkgewogICAgICAgIHJldHVybiBbbmFtZXMsIHJlY29yZHNdOwogICAgICB9CiAgICAgIGNvbnN0IG51bVJlY29yZHMgPSBmb250LmdldFVpbnQxNigpOwogICAgICBjb25zdCBzdHJpbmdzU3RhcnQgPSBmb250LmdldFVpbnQxNigpOwogICAgICBjb25zdCBOQU1FX1JFQ09SRF9MRU5HVEggPSAxMjsKICAgICAgbGV0IGksIGlpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVjb3JkcyAmJiBmb250LnBvcyArIE5BTUVfUkVDT1JEX0xFTkdUSCA8PSBlbmQ7IGkrKykgewogICAgICAgIGNvbnN0IHIgPSB7CiAgICAgICAgICBwbGF0Zm9ybTogZm9udC5nZXRVaW50MTYoKSwKICAgICAgICAgIGVuY29kaW5nOiBmb250LmdldFVpbnQxNigpLAogICAgICAgICAgbGFuZ3VhZ2U6IGZvbnQuZ2V0VWludDE2KCksCiAgICAgICAgICBuYW1lOiBmb250LmdldFVpbnQxNigpLAogICAgICAgICAgbGVuZ3RoOiBmb250LmdldFVpbnQxNigpLAogICAgICAgICAgb2Zmc2V0OiBmb250LmdldFVpbnQxNigpCiAgICAgICAgfTsKICAgICAgICBpZiAoaXNNYWNOYW1lUmVjb3JkKHIpIHx8IGlzV2luTmFtZVJlY29yZChyKSkgewogICAgICAgICAgcmVjb3Jkcy5wdXNoKHIpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGkgPSAwLCBpaSA9IHJlY29yZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHNbaV07CiAgICAgICAgaWYgKHJlY29yZC5sZW5ndGggPD0gMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBvcyA9IHN0YXJ0ICsgc3RyaW5nc1N0YXJ0ICsgcmVjb3JkLm9mZnNldDsKICAgICAgICBpZiAocG9zICsgcmVjb3JkLmxlbmd0aCA+IGVuZCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvbnQucG9zID0gcG9zOwogICAgICAgIGNvbnN0IG5hbWVJbmRleCA9IHJlY29yZC5uYW1lOwogICAgICAgIGlmIChyZWNvcmQuZW5jb2RpbmcpIHsKICAgICAgICAgIGxldCBzdHIgPSAiIjsKICAgICAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHJlY29yZC5sZW5ndGg7IGogPCBqajsgaiArPSAyKSB7CiAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2V0VWludDE2KCkpOwogICAgICAgICAgfQogICAgICAgICAgbmFtZXNbMV1bbmFtZUluZGV4XSA9IHN0cjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmFtZXNbMF1bbmFtZUluZGV4XSA9IGZvbnQuZ2V0U3RyaW5nKHJlY29yZC5sZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gW25hbWVzLCByZWNvcmRzXTsKICAgIH0KICAgIGNvbnN0IFRUT3BzU3RhY2tEZWx0YXMgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTIsIC0yLCAtMiwgLTIsIDAsIDAsIC0yLCAtNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAwLCAwLCAtMSwgMCwgLTEsIC0xLCAtMSwgLTEsIDEsIC0xLCAtOTk5LCAwLCAxLCAwLCAtMSwgLTIsIDAsIC0xLCAtMiwgLTEsIC0xLCAwLCAtMSwgLTEsIDAsIDAsIC05OTksIC05OTksIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTk5OSwgLTIsIC0yLCAtOTk5LCAwLCAtMiwgLTIsIDAsIDAsIC0yLCAwLCAtMiwgMCwgMCwgMCwgLTIsIC0xLCAtMSwgMSwgMSwgMCwgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIC0xLCAwLCAtMSwgLTEsIDAsIC05OTksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0yLCAtOTk5LCAtOTk5LCAtOTk5LCAtOTk5LCAtOTk5LCAtMSwgLTEsIC0yLCAtMiwgMCwgMCwgMCwgMCwgLTEsIC0xLCAtOTk5LCAtMiwgLTIsIDAsIDAsIC0xLCAtMiwgLTIsIDAsIDAsIDAsIC0xLCAtMSwgLTEsIC0yXTsKICAgIGZ1bmN0aW9uIHNhbml0aXplVFRQcm9ncmFtKHRhYmxlLCB0dENvbnRleHQpIHsKICAgICAgbGV0IGRhdGEgPSB0YWJsZS5kYXRhOwogICAgICBsZXQgaSA9IDAsCiAgICAgICAgaiwKICAgICAgICBuLAogICAgICAgIGIsCiAgICAgICAgZnVuY0lkLAogICAgICAgIHBjLAogICAgICAgIGxhc3RFbmRmID0gMCwKICAgICAgICBsYXN0RGVmZiA9IDA7CiAgICAgIGNvbnN0IHN0YWNrID0gW107CiAgICAgIGNvbnN0IGNhbGxzdGFjayA9IFtdOwogICAgICBjb25zdCBmdW5jdGlvbnNDYWxsZWQgPSBbXTsKICAgICAgbGV0IHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyA9IHR0Q29udGV4dC50b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnM7CiAgICAgIGxldCBpbkZERUYgPSBmYWxzZSwKICAgICAgICBpZkxldmVsID0gMCwKICAgICAgICBpbkVMU0UgPSAwOwogICAgICBmb3IgKGxldCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7KSB7CiAgICAgICAgY29uc3Qgb3AgPSBkYXRhW2krK107CiAgICAgICAgaWYgKG9wID09PSAweDQwKSB7CiAgICAgICAgICBuID0gZGF0YVtpKytdOwogICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKICAgICAgICAgICAgaSArPSBuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICAgIHN0YWNrLnB1c2goZGF0YVtpKytdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4NDEpIHsKICAgICAgICAgIG4gPSBkYXRhW2krK107CiAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgewogICAgICAgICAgICBpICs9IG4gKiAyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICAgIGIgPSBkYXRhW2krK107CiAgICAgICAgICAgICAgc3RhY2sucHVzaChiIDw8IDggfCBkYXRhW2krK10pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgob3AgJiAweGY4KSA9PT0gMHhiMCkgewogICAgICAgICAgbiA9IG9wIC0gMHhiMCArIDE7CiAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgewogICAgICAgICAgICBpICs9IG47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgICAgc3RhY2sucHVzaChkYXRhW2krK10pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgob3AgJiAweGY4KSA9PT0gMHhiOCkgewogICAgICAgICAgbiA9IG9wIC0gMHhiOCArIDE7CiAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgewogICAgICAgICAgICBpICs9IG4gKiAyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICAgIGIgPSBkYXRhW2krK107CiAgICAgICAgICAgICAgc3RhY2sucHVzaChzaWduZWRJbnQxNihiLCBkYXRhW2krK10pKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MmIgJiYgIXRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucykgewogICAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkgewogICAgICAgICAgICBmdW5jSWQgPSBzdGFjay5hdCgtMSk7CiAgICAgICAgICAgIGlmIChpc05hTihmdW5jSWQpKSB7CiAgICAgICAgICAgICAgaW5mbygiVFQ6IENBTEwgZW1wdHkgc3RhY2sgKG9yIGludmFsaWQgZW50cnkpLiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkW2Z1bmNJZF0gPSB0cnVlOwogICAgICAgICAgICAgIGlmIChmdW5jSWQgaW4gdHRDb250ZXh0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdGFja0xlbmd0aCA9IHN0YWNrLmxlbmd0aCArIHR0Q29udGV4dC5mdW5jdGlvbnNTdGFja0RlbHRhc1tmdW5jSWRdOwogICAgICAgICAgICAgICAgaWYgKG5ld1N0YWNrTGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgICAgICB3YXJuKCJUVDogQ0FMTCBpbnZhbGlkIGZ1bmN0aW9ucyBzdGFjayBkZWx0YS4iKTsKICAgICAgICAgICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gbmV3U3RhY2tMZW5ndGg7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmdW5jSWQgaW4gdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWQgJiYgIWZ1bmN0aW9uc0NhbGxlZC5pbmNsdWRlcyhmdW5jSWQpKSB7CiAgICAgICAgICAgICAgICBjYWxsc3RhY2sucHVzaCh7CiAgICAgICAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgIHN0YWNrVG9wOiBzdGFjay5sZW5ndGggLSAxCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uc0NhbGxlZC5wdXNoKGZ1bmNJZCk7CiAgICAgICAgICAgICAgICBwYyA9IHR0Q29udGV4dC5mdW5jdGlvbnNEZWZpbmVkW2Z1bmNJZF07CiAgICAgICAgICAgICAgICBpZiAoIXBjKSB7CiAgICAgICAgICAgICAgICAgIHdhcm4oIlRUOiBDQUxMIG5vbi1leGlzdGVudCBmdW5jdGlvbiIpOwogICAgICAgICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkYXRhID0gcGMuZGF0YTsKICAgICAgICAgICAgICAgIGkgPSBwYy5pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MmMgJiYgIXRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucykgewogICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKICAgICAgICAgICAgd2FybigiVFQ6IG5lc3RlZCBGREVGcyBub3QgYWxsb3dlZCIpOwogICAgICAgICAgICB0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgaW5GREVGID0gdHJ1ZTsKICAgICAgICAgIGxhc3REZWZmID0gaTsKICAgICAgICAgIGZ1bmNJZCA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWRbZnVuY0lkXSA9IHsKICAgICAgICAgICAgZGF0YSwKICAgICAgICAgICAgaQogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJkKSB7CiAgICAgICAgICBpZiAoaW5GREVGKSB7CiAgICAgICAgICAgIGluRkRFRiA9IGZhbHNlOwogICAgICAgICAgICBsYXN0RW5kZiA9IGk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYyA9IGNhbGxzdGFjay5wb3AoKTsKICAgICAgICAgICAgaWYgKCFwYykgewogICAgICAgICAgICAgIHdhcm4oIlRUOiBFTkRGIGJhZCBzdGFjayIpOwogICAgICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmNJZCA9IGZ1bmN0aW9uc0NhbGxlZC5wb3AoKTsKICAgICAgICAgICAgZGF0YSA9IHBjLmRhdGE7CiAgICAgICAgICAgIGkgPSBwYy5pOwogICAgICAgICAgICB0dENvbnRleHQuZnVuY3Rpb25zU3RhY2tEZWx0YXNbZnVuY0lkXSA9IHN0YWNrLmxlbmd0aCAtIHBjLnN0YWNrVG9wOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4ODkpIHsKICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CiAgICAgICAgICAgIHdhcm4oIlRUOiBuZXN0ZWQgSURFRnMgbm90IGFsbG93ZWQiKTsKICAgICAgICAgICAgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGluRkRFRiA9IHRydWU7CiAgICAgICAgICBsYXN0RGVmZiA9IGk7CiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg1OCkgewogICAgICAgICAgKytpZkxldmVsOwogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MWIpIHsKICAgICAgICAgIGluRUxTRSA9IGlmTGV2ZWw7CiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg1OSkgewogICAgICAgICAgaWYgKGluRUxTRSA9PT0gaWZMZXZlbCkgewogICAgICAgICAgICBpbkVMU0UgPSAwOwogICAgICAgICAgfQogICAgICAgICAgLS1pZkxldmVsOwogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MWMpIHsKICAgICAgICAgIGlmICghaW5GREVGICYmICFpbkVMU0UpIHsKICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc3RhY2suYXQoLTEpOwogICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgIGkgKz0gb2Zmc2V0IC0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWluRkRFRiAmJiAhaW5FTFNFKSB7CiAgICAgICAgICBsZXQgc3RhY2tEZWx0YSA9IDA7CiAgICAgICAgICBpZiAob3AgPD0gMHg4ZSkgewogICAgICAgICAgICBzdGFja0RlbHRhID0gVFRPcHNTdGFja0RlbHRhc1tvcF07CiAgICAgICAgICB9IGVsc2UgaWYgKG9wID49IDB4YzAgJiYgb3AgPD0gMHhkZikgewogICAgICAgICAgICBzdGFja0RlbHRhID0gLTE7CiAgICAgICAgICB9IGVsc2UgaWYgKG9wID49IDB4ZTApIHsKICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC0yOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wID49IDB4NzEgJiYgb3AgPD0gMHg3NSkgewogICAgICAgICAgICBuID0gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGlmICghaXNOYU4obikpIHsKICAgICAgICAgICAgICBzdGFja0RlbHRhID0gLW4gKiAyOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoc3RhY2tEZWx0YSA8IDAgJiYgc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgICAgc3RhY2tEZWx0YSsrOwogICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKHN0YWNrRGVsdGEgPiAwKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goTmFOKTsKICAgICAgICAgICAgc3RhY2tEZWx0YS0tOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICB0dENvbnRleHQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zOwogICAgICBjb25zdCBjb250ZW50ID0gW2RhdGFdOwogICAgICBpZiAoaSA+IGRhdGEubGVuZ3RoKSB7CiAgICAgICAgY29udGVudC5wdXNoKG5ldyBVaW50OEFycmF5KGkgLSBkYXRhLmxlbmd0aCkpOwogICAgICB9CiAgICAgIGlmIChsYXN0RGVmZiA+IGxhc3RFbmRmKSB7CiAgICAgICAgd2FybigiVFQ6IGNvbXBsZW1lbnRpbmcgYSBtaXNzaW5nIGZ1bmN0aW9uIHRhaWwiKTsKICAgICAgICBjb250ZW50LnB1c2gobmV3IFVpbnQ4QXJyYXkoWzB4MjIsIDB4MmRdKSk7CiAgICAgIH0KICAgICAgZm9sZFRUVGFibGUodGFibGUsIGNvbnRlbnQpOwogICAgfQogICAgZnVuY3Rpb24gY2hlY2tJbnZhbGlkRnVuY3Rpb25zKHR0Q29udGV4dCwgbWF4RnVuY3Rpb25EZWZzKSB7CiAgICAgIGlmICh0dENvbnRleHQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZC5sZW5ndGggPiBtYXhGdW5jdGlvbkRlZnMpIHsKICAgICAgICB3YXJuKCJUVDogbW9yZSBmdW5jdGlvbnMgZGVmaW5lZCB0aGFuIGV4cGVjdGVkIik7CiAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gdHRDb250ZXh0LmZ1bmN0aW9uc1VzZWQubGVuZ3RoOyBqIDwgamo7IGorKykgewogICAgICAgIGlmIChqID4gbWF4RnVuY3Rpb25EZWZzKSB7CiAgICAgICAgICB3YXJuKCJUVDogaW52YWxpZCBmdW5jdGlvbiBpZDogIiArIGopOwogICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkW2pdICYmICF0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZFtqXSkgewogICAgICAgICAgd2FybigiVFQ6IHVuZGVmaW5lZCBmdW5jdGlvbjogIiArIGopOwogICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGZvbGRUVFRhYmxlKHRhYmxlLCBjb250ZW50KSB7CiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IDEpIHsKICAgICAgICBsZXQgbmV3TGVuZ3RoID0gMDsKICAgICAgICBsZXQgaiwgamo7CiAgICAgICAgZm9yIChqID0gMCwgamogPSBjb250ZW50Lmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgIG5ld0xlbmd0aCArPSBjb250ZW50W2pdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgbmV3TGVuZ3RoID0gbmV3TGVuZ3RoICsgMyAmIH4zOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KG5ld0xlbmd0aCk7CiAgICAgICAgbGV0IHBvcyA9IDA7CiAgICAgICAgZm9yIChqID0gMCwgamogPSBjb250ZW50Lmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgIHJlc3VsdC5zZXQoY29udGVudFtqXSwgcG9zKTsKICAgICAgICAgIHBvcyArPSBjb250ZW50W2pdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdGFibGUuZGF0YSA9IHJlc3VsdDsKICAgICAgICB0YWJsZS5sZW5ndGggPSBuZXdMZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNhbml0aXplVFRQcm9ncmFtcyhmcGdtLCBwcmVwLCBjdnQsIG1heEZ1bmN0aW9uRGVmcykgewogICAgICBjb25zdCB0dENvbnRleHQgPSB7CiAgICAgICAgZnVuY3Rpb25zRGVmaW5lZDogW10sCiAgICAgICAgZnVuY3Rpb25zVXNlZDogW10sCiAgICAgICAgZnVuY3Rpb25zU3RhY2tEZWx0YXM6IFtdLAogICAgICAgIHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9uczogZmFsc2UsCiAgICAgICAgaGludHNWYWxpZDogdHJ1ZQogICAgICB9OwogICAgICBpZiAoZnBnbSkgewogICAgICAgIHNhbml0aXplVFRQcm9ncmFtKGZwZ20sIHR0Q29udGV4dCk7CiAgICAgIH0KICAgICAgaWYgKHByZXApIHsKICAgICAgICBzYW5pdGl6ZVRUUHJvZ3JhbShwcmVwLCB0dENvbnRleHQpOwogICAgICB9CiAgICAgIGlmIChmcGdtKSB7CiAgICAgICAgY2hlY2tJbnZhbGlkRnVuY3Rpb25zKHR0Q29udGV4dCwgbWF4RnVuY3Rpb25EZWZzKTsKICAgICAgfQogICAgICBpZiAoY3Z0ICYmIGN2dC5sZW5ndGggJiAxKSB7CiAgICAgICAgY29uc3QgY3Z0RGF0YSA9IG5ldyBVaW50OEFycmF5KGN2dC5sZW5ndGggKyAxKTsKICAgICAgICBjdnREYXRhLnNldChjdnQuZGF0YSk7CiAgICAgICAgY3Z0LmRhdGEgPSBjdnREYXRhOwogICAgICB9CiAgICAgIHJldHVybiB0dENvbnRleHQuaGludHNWYWxpZDsKICAgIH0KICAgIGZvbnQgPSBuZXcgU3RyZWFtKG5ldyBVaW50OEFycmF5KGZvbnQuZ2V0Qnl0ZXMoKSkpOwogICAgbGV0IGhlYWRlciwgdGFibGVzOwogICAgaWYgKGlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZShmb250KSkgewogICAgICBjb25zdCB0dGNEYXRhID0gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkRhdGEoZm9udCwgdGhpcy5uYW1lKTsKICAgICAgaGVhZGVyID0gdHRjRGF0YS5oZWFkZXI7CiAgICAgIHRhYmxlcyA9IHR0Y0RhdGEudGFibGVzOwogICAgfSBlbHNlIHsKICAgICAgaGVhZGVyID0gcmVhZE9wZW5UeXBlSGVhZGVyKGZvbnQpOwogICAgICB0YWJsZXMgPSByZWFkVGFibGVzKGZvbnQsIGhlYWRlci5udW1UYWJsZXMpOwogICAgfQogICAgbGV0IGNmZiwgY2ZmRmlsZTsKICAgIGNvbnN0IGlzVHJ1ZVR5cGUgPSAhdGFibGVzWyJDRkYgIl07CiAgICBpZiAoIWlzVHJ1ZVR5cGUpIHsKICAgICAgY29uc3QgaXNDb21wb3NpdGUgPSBwcm9wZXJ0aWVzLmNvbXBvc2l0ZSAmJiAocHJvcGVydGllcy5jaWRUb0dpZE1hcD8ubGVuZ3RoID4gMCB8fCAhKHByb3BlcnRpZXMuY01hcCBpbnN0YW5jZW9mIElkZW50aXR5Q01hcCkpOwogICAgICBpZiAoaGVhZGVyLnZlcnNpb24gPT09ICJPVFRPIiAmJiAhaXNDb21wb3NpdGUgfHwgIXRhYmxlcy5oZWFkIHx8ICF0YWJsZXMuaGhlYSB8fCAhdGFibGVzLm1heHAgfHwgIXRhYmxlcy5wb3N0KSB7CiAgICAgICAgY2ZmRmlsZSA9IG5ldyBTdHJlYW0odGFibGVzWyJDRkYgIl0uZGF0YSk7CiAgICAgICAgY2ZmID0gbmV3IENGRkZvbnQoY2ZmRmlsZSwgcHJvcGVydGllcyk7CiAgICAgICAgYWRqdXN0V2lkdGhzKHByb3BlcnRpZXMpOwogICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnQobmFtZSwgY2ZmLCBwcm9wZXJ0aWVzKTsKICAgICAgfQogICAgICBkZWxldGUgdGFibGVzLmdseWY7CiAgICAgIGRlbGV0ZSB0YWJsZXMubG9jYTsKICAgICAgZGVsZXRlIHRhYmxlcy5mcGdtOwogICAgICBkZWxldGUgdGFibGVzLnByZXA7CiAgICAgIGRlbGV0ZSB0YWJsZXNbImN2dCAiXTsKICAgICAgdGhpcy5pc09wZW5UeXBlID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghdGFibGVzLmxvY2EpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJsb2NhIiB0YWJsZSBpcyBub3QgZm91bmQnKTsKICAgICAgfQogICAgICBpZiAoIXRhYmxlcy5nbHlmKSB7CiAgICAgICAgd2FybignUmVxdWlyZWQgImdseWYiIHRhYmxlIGlzIG5vdCBmb3VuZCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKICAgICAgICB0YWJsZXMuZ2x5ZiA9IHsKICAgICAgICAgIHRhZzogImdseWYiLAogICAgICAgICAgZGF0YTogbmV3IFVpbnQ4QXJyYXkoMCkKICAgICAgICB9OwogICAgICB9CiAgICAgIHRoaXMuaXNPcGVuVHlwZSA9IGZhbHNlOwogICAgfQogICAgaWYgKCF0YWJsZXMubWF4cCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJtYXhwIiB0YWJsZSBpcyBub3QgZm91bmQnKTsKICAgIH0KICAgIGZvbnQucG9zID0gKGZvbnQuc3RhcnQgfHwgMCkgKyB0YWJsZXMubWF4cC5vZmZzZXQ7CiAgICBsZXQgdmVyc2lvbiA9IGZvbnQuZ2V0SW50MzIoKTsKICAgIGNvbnN0IG51bUdseXBocyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICBpZiAodmVyc2lvbiAhPT0gMHgwMDAxMDAwMCAmJiB2ZXJzaW9uICE9PSAweDAwMDA1MDAwKSB7CiAgICAgIGlmICh0YWJsZXMubWF4cC5sZW5ndGggPT09IDYpIHsKICAgICAgICB2ZXJzaW9uID0gMHgwMDA1MDAwOwogICAgICB9IGVsc2UgaWYgKHRhYmxlcy5tYXhwLmxlbmd0aCA+PSAzMikgewogICAgICAgIHZlcnNpb24gPSAweDAwMDEwMDAwOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgIm1heHAiIHRhYmxlIGhhcyBhIHdyb25nIHZlcnNpb24gbnVtYmVyYCk7CiAgICAgIH0KICAgICAgd3JpdGVVaW50MzIodGFibGVzLm1heHAuZGF0YSwgMCwgdmVyc2lvbik7CiAgICB9CiAgICBpZiAocHJvcGVydGllcy5zY2FsZUZhY3RvcnM/Lmxlbmd0aCA9PT0gbnVtR2x5cGhzICYmIGlzVHJ1ZVR5cGUpIHsKICAgICAgY29uc3QgewogICAgICAgIHNjYWxlRmFjdG9ycwogICAgICB9ID0gcHJvcGVydGllczsKICAgICAgY29uc3QgaXNHbHlwaExvY2F0aW9uc0xvbmcgPSBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzUwXSwgdGFibGVzLmhlYWQuZGF0YVs1MV0pOwogICAgICBjb25zdCBnbHlwaHMgPSBuZXcgR2x5ZlRhYmxlKHsKICAgICAgICBnbHlmVGFibGU6IHRhYmxlcy5nbHlmLmRhdGEsCiAgICAgICAgaXNHbHlwaExvY2F0aW9uc0xvbmcsCiAgICAgICAgbG9jYVRhYmxlOiB0YWJsZXMubG9jYS5kYXRhLAogICAgICAgIG51bUdseXBocwogICAgICB9KTsKICAgICAgZ2x5cGhzLnNjYWxlKHNjYWxlRmFjdG9ycyk7CiAgICAgIGNvbnN0IHsKICAgICAgICBnbHlmLAogICAgICAgIGxvY2EsCiAgICAgICAgaXNMb2NhdGlvbkxvbmcKICAgICAgfSA9IGdseXBocy53cml0ZSgpOwogICAgICB0YWJsZXMuZ2x5Zi5kYXRhID0gZ2x5ZjsKICAgICAgdGFibGVzLmxvY2EuZGF0YSA9IGxvY2E7CiAgICAgIGlmIChpc0xvY2F0aW9uTG9uZyAhPT0gISFpc0dseXBoTG9jYXRpb25zTG9uZykgewogICAgICAgIHRhYmxlcy5oZWFkLmRhdGFbNTBdID0gMDsKICAgICAgICB0YWJsZXMuaGVhZC5kYXRhWzUxXSA9IGlzTG9jYXRpb25Mb25nID8gMSA6IDA7CiAgICAgIH0KICAgICAgY29uc3QgbWV0cmljcyA9IHRhYmxlcy5obXR4LmRhdGE7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtR2x5cGhzOyBpKyspIHsKICAgICAgICBjb25zdCBqID0gNCAqIGk7CiAgICAgICAgY29uc3QgYWR2YW5jZVdpZHRoID0gTWF0aC5yb3VuZChzY2FsZUZhY3RvcnNbaV0gKiBpbnQxNihtZXRyaWNzW2pdLCBtZXRyaWNzW2ogKyAxXSkpOwogICAgICAgIG1ldHJpY3Nbal0gPSBhZHZhbmNlV2lkdGggPj4gOCAmIDB4ZmY7CiAgICAgICAgbWV0cmljc1tqICsgMV0gPSBhZHZhbmNlV2lkdGggJiAweGZmOwogICAgICAgIGNvbnN0IGxzYiA9IE1hdGgucm91bmQoc2NhbGVGYWN0b3JzW2ldICogc2lnbmVkSW50MTYobWV0cmljc1tqICsgMl0sIG1ldHJpY3NbaiArIDNdKSk7CiAgICAgICAgd3JpdGVTaWduZWRJbnQxNihtZXRyaWNzLCBqICsgMiwgbHNiKTsKICAgICAgfQogICAgfQogICAgbGV0IG51bUdseXBoc091dCA9IG51bUdseXBocyArIDE7CiAgICBsZXQgZHVwRmlyc3RFbnRyeSA9IHRydWU7CiAgICBpZiAobnVtR2x5cGhzT3V0ID4gMHhmZmZmKSB7CiAgICAgIGR1cEZpcnN0RW50cnkgPSBmYWxzZTsKICAgICAgbnVtR2x5cGhzT3V0ID0gbnVtR2x5cGhzOwogICAgICB3YXJuKCJOb3QgZW5vdWdoIHNwYWNlIGluIGdseWZzIHRvIGR1cGxpY2F0ZSBmaXJzdCBnbHlwaC4iKTsKICAgIH0KICAgIGxldCBtYXhGdW5jdGlvbkRlZnMgPSAwOwogICAgbGV0IG1heFNpemVPZkluc3RydWN0aW9ucyA9IDA7CiAgICBpZiAodmVyc2lvbiA+PSAweDAwMDEwMDAwICYmIHRhYmxlcy5tYXhwLmxlbmd0aCA+PSAzMikgewogICAgICBmb250LnBvcyArPSA4OwogICAgICBjb25zdCBtYXhab25lcyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICAgIGlmIChtYXhab25lcyA+IDIpIHsKICAgICAgICB0YWJsZXMubWF4cC5kYXRhWzE0XSA9IDA7CiAgICAgICAgdGFibGVzLm1heHAuZGF0YVsxNV0gPSAyOwogICAgICB9CiAgICAgIGZvbnQucG9zICs9IDQ7CiAgICAgIG1heEZ1bmN0aW9uRGVmcyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICAgIGZvbnQucG9zICs9IDQ7CiAgICAgIG1heFNpemVPZkluc3RydWN0aW9ucyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICB9CiAgICB0YWJsZXMubWF4cC5kYXRhWzRdID0gbnVtR2x5cGhzT3V0ID4+IDg7CiAgICB0YWJsZXMubWF4cC5kYXRhWzVdID0gbnVtR2x5cGhzT3V0ICYgMjU1OwogICAgY29uc3QgaGludHNWYWxpZCA9IHNhbml0aXplVFRQcm9ncmFtcyh0YWJsZXMuZnBnbSwgdGFibGVzLnByZXAsIHRhYmxlc1siY3Z0ICJdLCBtYXhGdW5jdGlvbkRlZnMpOwogICAgaWYgKCFoaW50c1ZhbGlkKSB7CiAgICAgIGRlbGV0ZSB0YWJsZXMuZnBnbTsKICAgICAgZGVsZXRlIHRhYmxlcy5wcmVwOwogICAgICBkZWxldGUgdGFibGVzWyJjdnQgIl07CiAgICB9CiAgICBzYW5pdGl6ZU1ldHJpY3MoZm9udCwgdGFibGVzLmhoZWEsIHRhYmxlcy5obXR4LCB0YWJsZXMuaGVhZCwgbnVtR2x5cGhzT3V0LCBkdXBGaXJzdEVudHJ5KTsKICAgIGlmICghdGFibGVzLmhlYWQpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCAiaGVhZCIgdGFibGUgaXMgbm90IGZvdW5kJyk7CiAgICB9CiAgICBzYW5pdGl6ZUhlYWQodGFibGVzLmhlYWQsIG51bUdseXBocywgaXNUcnVlVHlwZSA/IHRhYmxlcy5sb2NhLmxlbmd0aCA6IDApOwogICAgbGV0IG1pc3NpbmdHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKGlzVHJ1ZVR5cGUpIHsKICAgICAgY29uc3QgaXNHbHlwaExvY2F0aW9uc0xvbmcgPSBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzUwXSwgdGFibGVzLmhlYWQuZGF0YVs1MV0pOwogICAgICBjb25zdCBnbHlwaHNJbmZvID0gc2FuaXRpemVHbHlwaExvY2F0aW9ucyh0YWJsZXMubG9jYSwgdGFibGVzLmdseWYsIG51bUdseXBocywgaXNHbHlwaExvY2F0aW9uc0xvbmcsIGhpbnRzVmFsaWQsIGR1cEZpcnN0RW50cnksIG1heFNpemVPZkluc3RydWN0aW9ucyk7CiAgICAgIG1pc3NpbmdHbHlwaHMgPSBnbHlwaHNJbmZvLm1pc3NpbmdHbHlwaHM7CiAgICAgIGlmICh2ZXJzaW9uID49IDB4MDAwMTAwMDAgJiYgdGFibGVzLm1heHAubGVuZ3RoID49IDMyKSB7CiAgICAgICAgdGFibGVzLm1heHAuZGF0YVsyNl0gPSBnbHlwaHNJbmZvLm1heFNpemVPZkluc3RydWN0aW9ucyA+PiA4OwogICAgICAgIHRhYmxlcy5tYXhwLmRhdGFbMjddID0gZ2x5cGhzSW5mby5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgJiAyNTU7CiAgICAgIH0KICAgIH0KICAgIGlmICghdGFibGVzLmhoZWEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCAiaGhlYSIgdGFibGUgaXMgbm90IGZvdW5kJyk7CiAgICB9CiAgICBpZiAodGFibGVzLmhoZWEuZGF0YVsxMF0gPT09IDAgJiYgdGFibGVzLmhoZWEuZGF0YVsxMV0gPT09IDApIHsKICAgICAgdGFibGVzLmhoZWEuZGF0YVsxMF0gPSAweGZmOwogICAgICB0YWJsZXMuaGhlYS5kYXRhWzExXSA9IDB4ZmY7CiAgICB9CiAgICBjb25zdCBtZXRyaWNzT3ZlcnJpZGUgPSB7CiAgICAgIHVuaXRzUGVyRW06IGludDE2KHRhYmxlcy5oZWFkLmRhdGFbMThdLCB0YWJsZXMuaGVhZC5kYXRhWzE5XSksCiAgICAgIHlNYXg6IHNpZ25lZEludDE2KHRhYmxlcy5oZWFkLmRhdGFbNDJdLCB0YWJsZXMuaGVhZC5kYXRhWzQzXSksCiAgICAgIHlNaW46IHNpZ25lZEludDE2KHRhYmxlcy5oZWFkLmRhdGFbMzhdLCB0YWJsZXMuaGVhZC5kYXRhWzM5XSksCiAgICAgIGFzY2VudDogc2lnbmVkSW50MTYodGFibGVzLmhoZWEuZGF0YVs0XSwgdGFibGVzLmhoZWEuZGF0YVs1XSksCiAgICAgIGRlc2NlbnQ6IHNpZ25lZEludDE2KHRhYmxlcy5oaGVhLmRhdGFbNl0sIHRhYmxlcy5oaGVhLmRhdGFbN10pLAogICAgICBsaW5lR2FwOiBzaWduZWRJbnQxNih0YWJsZXMuaGhlYS5kYXRhWzhdLCB0YWJsZXMuaGhlYS5kYXRhWzldKQogICAgfTsKICAgIHRoaXMuYXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmFzY2VudCAvIG1ldHJpY3NPdmVycmlkZS51bml0c1BlckVtOwogICAgdGhpcy5kZXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmRlc2NlbnQgLyBtZXRyaWNzT3ZlcnJpZGUudW5pdHNQZXJFbTsKICAgIHRoaXMubGluZUdhcCA9IG1ldHJpY3NPdmVycmlkZS5saW5lR2FwIC8gbWV0cmljc092ZXJyaWRlLnVuaXRzUGVyRW07CiAgICBpZiAodGhpcy5jc3NGb250SW5mbz8ubGluZUhlaWdodCkgewogICAgICB0aGlzLmxpbmVIZWlnaHQgPSB0aGlzLmNzc0ZvbnRJbmZvLm1ldHJpY3MubGluZUhlaWdodDsKICAgICAgdGhpcy5saW5lR2FwID0gdGhpcy5jc3NGb250SW5mby5tZXRyaWNzLmxpbmVHYXA7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmxpbmVIZWlnaHQgPSB0aGlzLmFzY2VudCAtIHRoaXMuZGVzY2VudCArIHRoaXMubGluZUdhcDsKICAgIH0KICAgIGlmICh0YWJsZXMucG9zdCkgewogICAgICByZWFkUG9zdFNjcmlwdFRhYmxlKHRhYmxlcy5wb3N0LCBwcm9wZXJ0aWVzLCBudW1HbHlwaHMpOwogICAgfQogICAgdGFibGVzLnBvc3QgPSB7CiAgICAgIHRhZzogInBvc3QiLAogICAgICBkYXRhOiBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcykKICAgIH07CiAgICBjb25zdCBjaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmdW5jdGlvbiBoYXNHbHlwaChnbHlwaElkKSB7CiAgICAgIHJldHVybiAhbWlzc2luZ0dseXBoc1tnbHlwaElkXTsKICAgIH0KICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgewogICAgICBjb25zdCBjaWRUb0dpZE1hcCA9IHByb3BlcnRpZXMuY2lkVG9HaWRNYXAgfHwgW107CiAgICAgIGNvbnN0IGlzQ2lkVG9HaWRNYXBFbXB0eSA9IGNpZFRvR2lkTWFwLmxlbmd0aCA9PT0gMDsKICAgICAgcHJvcGVydGllcy5jTWFwLmZvckVhY2goZnVuY3Rpb24gKGNoYXJDb2RlLCBjaWQpIHsKICAgICAgICBpZiAodHlwZW9mIGNpZCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIGNpZCA9IGNvbnZlcnRDaWRTdHJpbmcoY2hhckNvZGUsIGNpZCwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpOwogICAgICAgIH0KICAgICAgICBsZXQgZ2x5cGhJZCA9IC0xOwogICAgICAgIGlmIChpc0NpZFRvR2lkTWFwRW1wdHkpIHsKICAgICAgICAgIGdseXBoSWQgPSBjaWQ7CiAgICAgICAgfSBlbHNlIGlmIChjaWRUb0dpZE1hcFtjaWRdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGdseXBoSWQgPSBjaWRUb0dpZE1hcFtjaWRdOwogICAgICAgIH0KICAgICAgICBpZiAoZ2x5cGhJZCA+PSAwICYmIGdseXBoSWQgPCBudW1HbHlwaHMgJiYgaGFzR2x5cGgoZ2x5cGhJZCkpIHsKICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGNtYXBUYWJsZSA9IHJlYWRDbWFwVGFibGUodGFibGVzLmNtYXAsIGZvbnQsIHRoaXMuaXNTeW1ib2xpY0ZvbnQsIHByb3BlcnRpZXMuaGFzRW5jb2RpbmcpOwogICAgICBjb25zdCBjbWFwUGxhdGZvcm1JZCA9IGNtYXBUYWJsZS5wbGF0Zm9ybUlkOwogICAgICBjb25zdCBjbWFwRW5jb2RpbmdJZCA9IGNtYXBUYWJsZS5lbmNvZGluZ0lkOwogICAgICBjb25zdCBjbWFwTWFwcGluZ3MgPSBjbWFwVGFibGUubWFwcGluZ3M7CiAgICAgIGxldCBiYXNlRW5jb2RpbmcgPSBbXSwKICAgICAgICBmb3JjZVBvc3RUYWJsZSA9IGZhbHNlOwogICAgICBpZiAocHJvcGVydGllcy5oYXNFbmNvZGluZyAmJiAocHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lID09PSAiTWFjUm9tYW5FbmNvZGluZyIgfHwgcHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lID09PSAiV2luQW5zaUVuY29kaW5nIikpIHsKICAgICAgICBiYXNlRW5jb2RpbmcgPSBnZXRFbmNvZGluZyhwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpOwogICAgICB9CiAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nICYmICF0aGlzLmlzU3ltYm9saWNGb250ICYmIChjbWFwUGxhdGZvcm1JZCA9PT0gMyAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMSB8fCBjbWFwUGxhdGZvcm1JZCA9PT0gMSAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMCkpIHsKICAgICAgICBjb25zdCBnbHlwaHNVbmljb2RlTWFwID0gZ2V0R2x5cGhzVW5pY29kZSgpOwogICAgICAgIGZvciAobGV0IGNoYXJDb2RlID0gMDsgY2hhckNvZGUgPCAyNTY7IGNoYXJDb2RlKyspIHsKICAgICAgICAgIGxldCBnbHlwaE5hbWU7CiAgICAgICAgICBpZiAodGhpcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBnbHlwaE5hbWUgPSB0aGlzLmRpZmZlcmVuY2VzW2NoYXJDb2RlXTsKICAgICAgICAgIH0gZWxzZSBpZiAoYmFzZUVuY29kaW5nLmxlbmd0aCAmJiBiYXNlRW5jb2RpbmdbY2hhckNvZGVdICE9PSAiIikgewogICAgICAgICAgICBnbHlwaE5hbWUgPSBiYXNlRW5jb2RpbmdbY2hhckNvZGVdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2x5cGhOYW1lID0gU3RhbmRhcmRFbmNvZGluZ1tjaGFyQ29kZV07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWdseXBoTmFtZSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHN0YW5kYXJkR2x5cGhOYW1lID0gcmVjb3ZlckdseXBoTmFtZShnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOwogICAgICAgICAgbGV0IHVuaWNvZGVPckNoYXJDb2RlOwogICAgICAgICAgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIGNtYXBFbmNvZGluZ0lkID09PSAxKSB7CiAgICAgICAgICAgIHVuaWNvZGVPckNoYXJDb2RlID0gZ2x5cGhzVW5pY29kZU1hcFtzdGFuZGFyZEdseXBoTmFtZV07CiAgICAgICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAxICYmIGNtYXBFbmNvZGluZ0lkID09PSAwKSB7CiAgICAgICAgICAgIHVuaWNvZGVPckNoYXJDb2RlID0gTWFjUm9tYW5FbmNvZGluZy5pbmRleE9mKHN0YW5kYXJkR2x5cGhOYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh1bmljb2RlT3JDaGFyQ29kZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghcHJvcGVydGllcy5nbHlwaE5hbWVzICYmIHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXAgJiYgISh0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSkgewogICAgICAgICAgICAgIGNvbnN0IHVuaWNvZGUgPSB0aGlzLnRvVW5pY29kZS5nZXQoY2hhckNvZGUpOwogICAgICAgICAgICAgIGlmICh1bmljb2RlKSB7CiAgICAgICAgICAgICAgICB1bmljb2RlT3JDaGFyQ29kZSA9IHVuaWNvZGUuY29kZVBvaW50QXQoMCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh1bmljb2RlT3JDaGFyQ29kZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBjbWFwTWFwcGluZ3MpIHsKICAgICAgICAgICAgaWYgKG1hcHBpbmcuY2hhckNvZGUgIT09IHVuaWNvZGVPckNoYXJDb2RlKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gbWFwcGluZy5nbHlwaElkOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY21hcFBsYXRmb3JtSWQgPT09IDApIHsKICAgICAgICBmb3IgKGNvbnN0IG1hcHBpbmcgb2YgY21hcE1hcHBpbmdzKSB7CiAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFttYXBwaW5nLmNoYXJDb2RlXSA9IG1hcHBpbmcuZ2x5cGhJZDsKICAgICAgICB9CiAgICAgICAgZm9yY2VQb3N0VGFibGUgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIGNtYXBFbmNvZGluZ0lkID09PSAwKSB7CiAgICAgICAgZm9yIChjb25zdCBtYXBwaW5nIG9mIGNtYXBNYXBwaW5ncykgewogICAgICAgICAgbGV0IGNoYXJDb2RlID0gbWFwcGluZy5jaGFyQ29kZTsKICAgICAgICAgIGlmIChjaGFyQ29kZSA+PSAweGYwMDAgJiYgY2hhckNvZGUgPD0gMHhmMGZmKSB7CiAgICAgICAgICAgIGNoYXJDb2RlICY9IDB4ZmY7CiAgICAgICAgICB9CiAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBtYXBwaW5nLmdseXBoSWQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBjbWFwTWFwcGluZ3MpIHsKICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW21hcHBpbmcuY2hhckNvZGVdID0gbWFwcGluZy5nbHlwaElkOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocHJvcGVydGllcy5nbHlwaE5hbWVzICYmIChiYXNlRW5jb2RpbmcubGVuZ3RoIHx8IHRoaXMuZGlmZmVyZW5jZXMubGVuZ3RoKSkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKICAgICAgICAgIGlmICghZm9yY2VQb3N0VGFibGUgJiYgY2hhckNvZGVUb0dseXBoSWRbaV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGdseXBoTmFtZSA9IHRoaXMuZGlmZmVyZW5jZXNbaV0gfHwgYmFzZUVuY29kaW5nW2ldOwogICAgICAgICAgaWYgKCFnbHlwaE5hbWUpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBnbHlwaElkID0gcHJvcGVydGllcy5nbHlwaE5hbWVzLmluZGV4T2YoZ2x5cGhOYW1lKTsKICAgICAgICAgIGlmIChnbHlwaElkID4gMCAmJiBoYXNHbHlwaChnbHlwaElkKSkgewogICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtpXSA9IGdseXBoSWQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoY2hhckNvZGVUb0dseXBoSWQubGVuZ3RoID09PSAwKSB7CiAgICAgIGNoYXJDb2RlVG9HbHlwaElkWzBdID0gMDsKICAgIH0KICAgIGxldCBnbHlwaFplcm9JZCA9IG51bUdseXBoc091dCAtIDE7CiAgICBpZiAoIWR1cEZpcnN0RW50cnkpIHsKICAgICAgZ2x5cGhaZXJvSWQgPSAwOwogICAgfQogICAgaWYgKCFwcm9wZXJ0aWVzLmNzc0ZvbnRJbmZvKSB7CiAgICAgIGNvbnN0IG5ld01hcHBpbmcgPSBhZGp1c3RNYXBwaW5nKGNoYXJDb2RlVG9HbHlwaElkLCBoYXNHbHlwaCwgZ2x5cGhaZXJvSWQsIHRoaXMudG9Vbmljb2RlKTsKICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbmV3TWFwcGluZy50b0ZvbnRDaGFyOwogICAgICB0YWJsZXMuY21hcCA9IHsKICAgICAgICB0YWc6ICJjbWFwIiwKICAgICAgICBkYXRhOiBjcmVhdGVDbWFwVGFibGUobmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbmV3TWFwcGluZy50b1VuaWNvZGVFeHRyYU1hcCwgbnVtR2x5cGhzT3V0KQogICAgICB9OwogICAgICBpZiAoIXRhYmxlc1siT1MvMiJdIHx8ICF2YWxpZGF0ZU9TMlRhYmxlKHRhYmxlc1siT1MvMiJdLCBmb250KSkgewogICAgICAgIHRhYmxlc1siT1MvMiJdID0gewogICAgICAgICAgdGFnOiAiT1MvMiIsCiAgICAgICAgICBkYXRhOiBjcmVhdGVPUzJUYWJsZShwcm9wZXJ0aWVzLCBuZXdNYXBwaW5nLmNoYXJDb2RlVG9HbHlwaElkLCBtZXRyaWNzT3ZlcnJpZGUpCiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgaWYgKCFpc1RydWVUeXBlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY2ZmRmlsZSA9IG5ldyBTdHJlYW0odGFibGVzWyJDRkYgIl0uZGF0YSk7CiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IENGRlBhcnNlcihjZmZGaWxlLCBwcm9wZXJ0aWVzLCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQpOwogICAgICAgIGNmZiA9IHBhcnNlci5wYXJzZSgpOwogICAgICAgIGNmZi5kdXBsaWNhdGVGaXJzdEdseXBoKCk7CiAgICAgICAgY29uc3QgY29tcGlsZXIgPSBuZXcgQ0ZGQ29tcGlsZXIoY2ZmKTsKICAgICAgICB0YWJsZXNbIkNGRiAiXS5kYXRhID0gY29tcGlsZXIuY29tcGlsZSgpOwogICAgICB9IGNhdGNoIHsKICAgICAgICB3YXJuKCJGYWlsZWQgdG8gY29tcGlsZSBmb250ICIgKyBwcm9wZXJ0aWVzLmxvYWRlZE5hbWUpOwogICAgICB9CiAgICB9CiAgICBpZiAoIXRhYmxlcy5uYW1lKSB7CiAgICAgIHRhYmxlcy5uYW1lID0gewogICAgICAgIHRhZzogIm5hbWUiLAogICAgICAgIGRhdGE6IGNyZWF0ZU5hbWVUYWJsZSh0aGlzLm5hbWUpCiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBjb25zdCBbbmFtZVByb3RvdHlwZSwgbmFtZVJlY29yZHNdID0gcmVhZE5hbWVUYWJsZSh0YWJsZXMubmFtZSk7CiAgICAgIHRhYmxlcy5uYW1lLmRhdGEgPSBjcmVhdGVOYW1lVGFibGUobmFtZSwgbmFtZVByb3RvdHlwZSk7CiAgICAgIHRoaXMucHNOYW1lID0gbmFtZVByb3RvdHlwZVswXVs2XSB8fCBudWxsOwogICAgICBpZiAoIXByb3BlcnRpZXMuY29tcG9zaXRlKSB7CiAgICAgICAgYWRqdXN0VHJ1ZVR5cGVUb1VuaWNvZGUocHJvcGVydGllcywgdGhpcy5pc1N5bWJvbGljRm9udCwgbmFtZVJlY29yZHMpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBidWlsZGVyID0gbmV3IE9wZW5UeXBlRmlsZUJ1aWxkZXIoaGVhZGVyLnZlcnNpb24pOwogICAgZm9yIChjb25zdCB0YWJsZVRhZyBpbiB0YWJsZXMpIHsKICAgICAgYnVpbGRlci5hZGRUYWJsZSh0YWJsZVRhZywgdGFibGVzW3RhYmxlVGFnXS5kYXRhKTsKICAgIH0KICAgIHJldHVybiBidWlsZGVyLnRvQXJyYXkoKTsKICB9CiAgY29udmVydChmb250TmFtZSwgZm9udCwgcHJvcGVydGllcykgewogICAgcHJvcGVydGllcy5maXhlZFBpdGNoID0gZmFsc2U7CiAgICBpZiAocHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpIHsKICAgICAgYWRqdXN0VHlwZTFUb1VuaWNvZGUocHJvcGVydGllcywgcHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpOwogICAgfQogICAgbGV0IGdseXBoWmVyb0lkID0gMTsKICAgIGlmIChmb250IGluc3RhbmNlb2YgQ0ZGRm9udCkgewogICAgICBnbHlwaFplcm9JZCA9IGZvbnQubnVtR2x5cGhzIC0gMTsKICAgIH0KICAgIGNvbnN0IG1hcHBpbmcgPSBmb250LmdldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKTsKICAgIGxldCBuZXdNYXBwaW5nID0gbnVsbDsKICAgIGxldCBuZXdDaGFyQ29kZVRvR2x5cGhJZCA9IG1hcHBpbmc7CiAgICBsZXQgdG9Vbmljb2RlRXh0cmFNYXAgPSBudWxsOwogICAgaWYgKCFwcm9wZXJ0aWVzLmNzc0ZvbnRJbmZvKSB7CiAgICAgIG5ld01hcHBpbmcgPSBhZGp1c3RNYXBwaW5nKG1hcHBpbmcsIGZvbnQuaGFzR2x5cGhJZC5iaW5kKGZvbnQpLCBnbHlwaFplcm9JZCwgdGhpcy50b1VuaWNvZGUpOwogICAgICB0aGlzLnRvRm9udENoYXIgPSBuZXdNYXBwaW5nLnRvRm9udENoYXI7CiAgICAgIG5ld0NoYXJDb2RlVG9HbHlwaElkID0gbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZDsKICAgICAgdG9Vbmljb2RlRXh0cmFNYXAgPSBuZXdNYXBwaW5nLnRvVW5pY29kZUV4dHJhTWFwOwogICAgfQogICAgY29uc3QgbnVtR2x5cGhzID0gZm9udC5udW1HbHlwaHM7CiAgICBmdW5jdGlvbiBnZXRDaGFyQ29kZXMoY2hhckNvZGVUb0dseXBoSWQsIGdseXBoSWQpIHsKICAgICAgbGV0IGNoYXJDb2RlcyA9IG51bGw7CiAgICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gY2hhckNvZGVUb0dseXBoSWQpIHsKICAgICAgICBpZiAoZ2x5cGhJZCA9PT0gY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdKSB7CiAgICAgICAgICAoY2hhckNvZGVzIHx8PSBbXSkucHVzaChjaGFyQ29kZSB8IDApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gY2hhckNvZGVzOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQ2hhckNvZGUoY2hhckNvZGVUb0dseXBoSWQsIGdseXBoSWQpIHsKICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkgewogICAgICAgIGlmIChnbHlwaElkID09PSBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0pIHsKICAgICAgICAgIHJldHVybiBjaGFyQ29kZSB8IDA7CiAgICAgICAgfQogICAgICB9CiAgICAgIG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWRbbmV3TWFwcGluZy5uZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICAgIHJldHVybiBuZXdNYXBwaW5nLm5leHRBdmFpbGFibGVGb250Q2hhckNvZGUrKzsKICAgIH0KICAgIGNvbnN0IHNlYWNzID0gZm9udC5zZWFjczsKICAgIGlmIChuZXdNYXBwaW5nICYmIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCAmJiBzZWFjcz8ubGVuZ3RoKSB7CiAgICAgIGNvbnN0IG1hdHJpeCA9IHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWDsKICAgICAgY29uc3QgY2hhcnNldCA9IGZvbnQuZ2V0Q2hhcnNldCgpOwogICAgICBjb25zdCBzZWFjTWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZm9yIChsZXQgZ2x5cGhJZCBpbiBzZWFjcykgewogICAgICAgIGdseXBoSWQgfD0gMDsKICAgICAgICBjb25zdCBzZWFjID0gc2VhY3NbZ2x5cGhJZF07CiAgICAgICAgY29uc3QgYmFzZUdseXBoTmFtZSA9IFN0YW5kYXJkRW5jb2Rpbmdbc2VhY1syXV07CiAgICAgICAgY29uc3QgYWNjZW50R2x5cGhOYW1lID0gU3RhbmRhcmRFbmNvZGluZ1tzZWFjWzNdXTsKICAgICAgICBjb25zdCBiYXNlR2x5cGhJZCA9IGNoYXJzZXQuaW5kZXhPZihiYXNlR2x5cGhOYW1lKTsKICAgICAgICBjb25zdCBhY2NlbnRHbHlwaElkID0gY2hhcnNldC5pbmRleE9mKGFjY2VudEdseXBoTmFtZSk7CiAgICAgICAgaWYgKGJhc2VHbHlwaElkIDwgMCB8fCBhY2NlbnRHbHlwaElkIDwgMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFjY2VudE9mZnNldCA9IHsKICAgICAgICAgIHg6IHNlYWNbMF0gKiBtYXRyaXhbMF0gKyBzZWFjWzFdICogbWF0cml4WzJdICsgbWF0cml4WzRdLAogICAgICAgICAgeTogc2VhY1swXSAqIG1hdHJpeFsxXSArIHNlYWNbMV0gKiBtYXRyaXhbM10gKyBtYXRyaXhbNV0KICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYXJDb2RlcyA9IGdldENoYXJDb2RlcyhtYXBwaW5nLCBnbHlwaElkKTsKICAgICAgICBpZiAoIWNoYXJDb2RlcykgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3QgY2hhckNvZGUgb2YgY2hhckNvZGVzKSB7CiAgICAgICAgICBjb25zdCBjaGFyQ29kZVRvR2x5cGhJZCA9IG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWQ7CiAgICAgICAgICBjb25zdCBiYXNlRm9udENoYXJDb2RlID0gY3JlYXRlQ2hhckNvZGUoY2hhckNvZGVUb0dseXBoSWQsIGJhc2VHbHlwaElkKTsKICAgICAgICAgIGNvbnN0IGFjY2VudEZvbnRDaGFyQ29kZSA9IGNyZWF0ZUNoYXJDb2RlKGNoYXJDb2RlVG9HbHlwaElkLCBhY2NlbnRHbHlwaElkKTsKICAgICAgICAgIHNlYWNNYXBbY2hhckNvZGVdID0gewogICAgICAgICAgICBiYXNlRm9udENoYXJDb2RlLAogICAgICAgICAgICBhY2NlbnRGb250Q2hhckNvZGUsCiAgICAgICAgICAgIGFjY2VudE9mZnNldAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcHJvcGVydGllcy5zZWFjTWFwID0gc2VhY01hcDsKICAgIH0KICAgIGNvbnN0IHVuaXRzUGVyRW0gPSBwcm9wZXJ0aWVzLmZvbnRNYXRyaXggPyAxIC8gTWF0aC5tYXgoLi4ucHJvcGVydGllcy5mb250TWF0cml4LnNsaWNlKDAsIDQpLm1hcChNYXRoLmFicykpIDogMTAwMDsKICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgT3BlblR5cGVGaWxlQnVpbGRlcigiXHg0Rlx4NTRceDU0XHg0RiIpOwogICAgYnVpbGRlci5hZGRUYWJsZSgiQ0ZGICIsIGZvbnQuZGF0YSk7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJPUy8yIiwgY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgbmV3Q2hhckNvZGVUb0dseXBoSWQpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoImNtYXAiLCBjcmVhdGVDbWFwVGFibGUobmV3Q2hhckNvZGVUb0dseXBoSWQsIHRvVW5pY29kZUV4dHJhTWFwLCBudW1HbHlwaHMpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoImhlYWQiLCAiXHgwMFx4MDFceDAwXHgwMCIgKyAiXHgwMFx4MDBceDEwXHgwMCIgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAiXHg1Rlx4MEZceDNDXHhGNSIgKyAiXHgwMFx4MDAiICsgc2FmZVN0cmluZzE2KHVuaXRzUGVyRW0pICsgIlx4MDBceDAwXHgwMFx4MDBceDllXHgwYlx4N2VceDI3IiArICJceDAwXHgwMFx4MDBceDAwXHg5ZVx4MGJceDdlXHgyNyIgKyAiXHgwMFx4MDAiICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuZGVzY2VudCkgKyAiXHgwRlx4RkYiICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuYXNjZW50KSArIHN0cmluZzE2KHByb3BlcnRpZXMuaXRhbGljQW5nbGUgPyAyIDogMCkgKyAiXHgwMFx4MTEiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoImhoZWEiLCAiXHgwMFx4MDFceDAwXHgwMCIgKyBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5hc2NlbnQpICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuZGVzY2VudCkgKyAiXHgwMFx4MDAiICsgIlx4RkZceEZGIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmNhcEhlaWdodCkgKyBzYWZlU3RyaW5nMTYoTWF0aC50YW4ocHJvcGVydGllcy5pdGFsaWNBbmdsZSkgKiBwcm9wZXJ0aWVzLnhIZWlnaHQpICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgc3RyaW5nMTYobnVtR2x5cGhzKSk7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJobXR4IiwgZnVuY3Rpb24gZm9udEZpZWxkc0htdHgoKSB7CiAgICAgIGNvbnN0IGNoYXJzdHJpbmdzID0gZm9udC5jaGFyc3RyaW5nczsKICAgICAgY29uc3QgY2ZmV2lkdGhzID0gZm9udC5jZmYgPyBmb250LmNmZi53aWR0aHMgOiBudWxsOwogICAgICBsZXQgaG10eCA9ICJceDAwXHgwMFx4MDBceDAwIjsKICAgICAgZm9yIChsZXQgaSA9IDEsIGlpID0gbnVtR2x5cGhzOyBpIDwgaWk7IGkrKykgewogICAgICAgIGxldCB3aWR0aCA9IDA7CiAgICAgICAgaWYgKGNoYXJzdHJpbmdzKSB7CiAgICAgICAgICBjb25zdCBjaGFyc3RyaW5nID0gY2hhcnN0cmluZ3NbaSAtIDFdOwogICAgICAgICAgd2lkdGggPSAid2lkdGgiIGluIGNoYXJzdHJpbmcgPyBjaGFyc3RyaW5nLndpZHRoIDogMDsKICAgICAgICB9IGVsc2UgaWYgKGNmZldpZHRocykgewogICAgICAgICAgd2lkdGggPSBNYXRoLmNlaWwoY2ZmV2lkdGhzW2ldIHx8IDApOwogICAgICAgIH0KICAgICAgICBobXR4ICs9IHN0cmluZzE2KHdpZHRoKSArIHN0cmluZzE2KDApOwogICAgICB9CiAgICAgIHJldHVybiBobXR4OwogICAgfSgpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoIm1heHAiLCAiXHgwMFx4MDBceDUwXHgwMCIgKyBzdHJpbmcxNihudW1HbHlwaHMpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoIm5hbWUiLCBjcmVhdGVOYW1lVGFibGUoZm9udE5hbWUpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoInBvc3QiLCBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcykpOwogICAgcmV0dXJuIGJ1aWxkZXIudG9BcnJheSgpOwogIH0KICBnZXQgX3NwYWNlV2lkdGgoKSB7CiAgICBjb25zdCBwb3NzaWJsZVNwYWNlUmVwbGFjZW1lbnRzID0gWyJzcGFjZSIsICJtaW51cyIsICJvbmUiLCAiaSIsICJJIl07CiAgICBsZXQgd2lkdGg7CiAgICBmb3IgKGNvbnN0IGdseXBoTmFtZSBvZiBwb3NzaWJsZVNwYWNlUmVwbGFjZW1lbnRzKSB7CiAgICAgIGlmIChnbHlwaE5hbWUgaW4gdGhpcy53aWR0aHMpIHsKICAgICAgICB3aWR0aCA9IHRoaXMud2lkdGhzW2dseXBoTmFtZV07CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTsKICAgICAgY29uc3QgZ2x5cGhVbmljb2RlID0gZ2x5cGhzVW5pY29kZU1hcFtnbHlwaE5hbWVdOwogICAgICBsZXQgY2hhcmNvZGUgPSAwOwogICAgICBpZiAodGhpcy5jb21wb3NpdGUgJiYgdGhpcy5jTWFwLmNvbnRhaW5zKGdseXBoVW5pY29kZSkpIHsKICAgICAgICBjaGFyY29kZSA9IHRoaXMuY01hcC5sb29rdXAoZ2x5cGhVbmljb2RlKTsKICAgICAgICBpZiAodHlwZW9mIGNoYXJjb2RlID09PSAic3RyaW5nIikgewogICAgICAgICAgY2hhcmNvZGUgPSBjb252ZXJ0Q2lkU3RyaW5nKGdseXBoVW5pY29kZSwgY2hhcmNvZGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWNoYXJjb2RlICYmIHRoaXMudG9Vbmljb2RlKSB7CiAgICAgICAgY2hhcmNvZGUgPSB0aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKGdseXBoVW5pY29kZSk7CiAgICAgIH0KICAgICAgaWYgKGNoYXJjb2RlIDw9IDApIHsKICAgICAgICBjaGFyY29kZSA9IGdseXBoVW5pY29kZTsKICAgICAgfQogICAgICB3aWR0aCA9IHRoaXMud2lkdGhzW2NoYXJjb2RlXTsKICAgICAgaWYgKHdpZHRoKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgIl9zcGFjZVdpZHRoIiwgd2lkdGggfHwgdGhpcy5kZWZhdWx0V2lkdGgpOwogIH0KICBfY2hhclRvR2x5cGgoY2hhcmNvZGUsIGlzU3BhY2UgPSBmYWxzZSkgewogICAgbGV0IGdseXBoID0gdGhpcy5fZ2x5cGhDYWNoZVtjaGFyY29kZV07CiAgICBpZiAoZ2x5cGg/LmlzU3BhY2UgPT09IGlzU3BhY2UpIHsKICAgICAgcmV0dXJuIGdseXBoOwogICAgfQogICAgbGV0IGZvbnRDaGFyQ29kZSwgd2lkdGgsIG9wZXJhdG9yTGlzdElkOwogICAgbGV0IHdpZHRoQ29kZSA9IGNoYXJjb2RlOwogICAgaWYgKHRoaXMuY01hcD8uY29udGFpbnMoY2hhcmNvZGUpKSB7CiAgICAgIHdpZHRoQ29kZSA9IHRoaXMuY01hcC5sb29rdXAoY2hhcmNvZGUpOwogICAgICBpZiAodHlwZW9mIHdpZHRoQ29kZSA9PT0gInN0cmluZyIpIHsKICAgICAgICB3aWR0aENvZGUgPSBjb252ZXJ0Q2lkU3RyaW5nKGNoYXJjb2RlLCB3aWR0aENvZGUpOwogICAgICB9CiAgICB9CiAgICB3aWR0aCA9IHRoaXMud2lkdGhzW3dpZHRoQ29kZV07CiAgICBpZiAodHlwZW9mIHdpZHRoICE9PSAibnVtYmVyIikgewogICAgICB3aWR0aCA9IHRoaXMuZGVmYXVsdFdpZHRoOwogICAgfQogICAgY29uc3Qgdm1ldHJpYyA9IHRoaXMudm1ldHJpY3M/Llt3aWR0aENvZGVdOwogICAgbGV0IHVuaWNvZGUgPSB0aGlzLnRvVW5pY29kZS5nZXQoY2hhcmNvZGUpIHx8IGNoYXJjb2RlOwogICAgaWYgKHR5cGVvZiB1bmljb2RlID09PSAibnVtYmVyIikgewogICAgICB1bmljb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSh1bmljb2RlKTsKICAgIH0KICAgIGxldCBpc0luRm9udCA9IHRoaXMudG9Gb250Q2hhcltjaGFyY29kZV0gIT09IHVuZGVmaW5lZDsKICAgIGZvbnRDaGFyQ29kZSA9IHRoaXMudG9Gb250Q2hhcltjaGFyY29kZV0gfHwgY2hhcmNvZGU7CiAgICBpZiAodGhpcy5taXNzaW5nRmlsZSkgewogICAgICBjb25zdCBnbHlwaE5hbWUgPSB0aGlzLmRpZmZlcmVuY2VzW2NoYXJjb2RlXSB8fCB0aGlzLmRlZmF1bHRFbmNvZGluZ1tjaGFyY29kZV07CiAgICAgIGlmICgoZ2x5cGhOYW1lID09PSAiLm5vdGRlZiIgfHwgZ2x5cGhOYW1lID09PSAiIikgJiYgdGhpcy50eXBlID09PSAiVHlwZTEiKSB7CiAgICAgICAgZm9udENoYXJDb2RlID0gMHgyMDsKICAgICAgICBpZiAoZ2x5cGhOYW1lID09PSAiIikgewogICAgICAgICAgd2lkdGggfHw9IHRoaXMuX3NwYWNlV2lkdGg7CiAgICAgICAgICB1bmljb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZShmb250Q2hhckNvZGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb250Q2hhckNvZGUgPSBtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyhmb250Q2hhckNvZGUpOwogICAgfQogICAgaWYgKHRoaXMuaXNUeXBlM0ZvbnQpIHsKICAgICAgb3BlcmF0b3JMaXN0SWQgPSBmb250Q2hhckNvZGU7CiAgICB9CiAgICBsZXQgYWNjZW50ID0gbnVsbDsKICAgIGlmICh0aGlzLnNlYWNNYXA/LltjaGFyY29kZV0pIHsKICAgICAgaXNJbkZvbnQgPSB0cnVlOwogICAgICBjb25zdCBzZWFjID0gdGhpcy5zZWFjTWFwW2NoYXJjb2RlXTsKICAgICAgZm9udENoYXJDb2RlID0gc2VhYy5iYXNlRm9udENoYXJDb2RlOwogICAgICBhY2NlbnQgPSB7CiAgICAgICAgZm9udENoYXI6IFN0cmluZy5mcm9tQ29kZVBvaW50KHNlYWMuYWNjZW50Rm9udENoYXJDb2RlKSwKICAgICAgICBvZmZzZXQ6IHNlYWMuYWNjZW50T2Zmc2V0CiAgICAgIH07CiAgICB9CiAgICBsZXQgZm9udENoYXIgPSAiIjsKICAgIGlmICh0eXBlb2YgZm9udENoYXJDb2RlID09PSAibnVtYmVyIikgewogICAgICBpZiAoZm9udENoYXJDb2RlIDw9IDB4MTBmZmZmKSB7CiAgICAgICAgZm9udENoYXIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChmb250Q2hhckNvZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oYGNoYXJUb0dseXBoIC0gaW52YWxpZCBmb250Q2hhckNvZGU6ICR7Zm9udENoYXJDb2RlfWApOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5taXNzaW5nRmlsZSAmJiB0aGlzLnZlcnRpY2FsICYmIGZvbnRDaGFyLmxlbmd0aCA9PT0gMSkgewogICAgICBjb25zdCB2ZXJ0aWNhbCA9IGdldFZlcnRpY2FsUHJlc2VudGF0aW9uRm9ybSgpW2ZvbnRDaGFyLmNoYXJDb2RlQXQoMCldOwogICAgICBpZiAodmVydGljYWwpIHsKICAgICAgICBmb250Q2hhciA9IHVuaWNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHZlcnRpY2FsKTsKICAgICAgfQogICAgfQogICAgZ2x5cGggPSBuZXcgZm9udHNfR2x5cGgoY2hhcmNvZGUsIGZvbnRDaGFyLCB1bmljb2RlLCBhY2NlbnQsIHdpZHRoLCB2bWV0cmljLCBvcGVyYXRvckxpc3RJZCwgaXNTcGFjZSwgaXNJbkZvbnQpOwogICAgcmV0dXJuIHRoaXMuX2dseXBoQ2FjaGVbY2hhcmNvZGVdID0gZ2x5cGg7CiAgfQogIGNoYXJzVG9HbHlwaHMoY2hhcnMpIHsKICAgIGxldCBnbHlwaHMgPSB0aGlzLl9jaGFyc0NhY2hlW2NoYXJzXTsKICAgIGlmIChnbHlwaHMpIHsKICAgICAgcmV0dXJuIGdseXBoczsKICAgIH0KICAgIGdseXBocyA9IFtdOwogICAgaWYgKHRoaXMuY01hcCkgewogICAgICBjb25zdCBjID0gT2JqZWN0LmNyZWF0ZShudWxsKSwKICAgICAgICBpaSA9IGNoYXJzLmxlbmd0aDsKICAgICAgbGV0IGkgPSAwOwogICAgICB3aGlsZSAoaSA8IGlpKSB7CiAgICAgICAgdGhpcy5jTWFwLnJlYWRDaGFyQ29kZShjaGFycywgaSwgYyk7CiAgICAgICAgY29uc3QgewogICAgICAgICAgY2hhcmNvZGUsCiAgICAgICAgICBsZW5ndGgKICAgICAgICB9ID0gYzsKICAgICAgICBpICs9IGxlbmd0aDsKICAgICAgICBjb25zdCBnbHlwaCA9IHRoaXMuX2NoYXJUb0dseXBoKGNoYXJjb2RlLCBsZW5ndGggPT09IDEgJiYgY2hhcnMuY2hhckNvZGVBdChpIC0gMSkgPT09IDB4MjApOwogICAgICAgIGdseXBocy5wdXNoKGdseXBoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY2hhcnMubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICAgIGNvbnN0IGNoYXJjb2RlID0gY2hhcnMuY2hhckNvZGVBdChpKTsKICAgICAgICBjb25zdCBnbHlwaCA9IHRoaXMuX2NoYXJUb0dseXBoKGNoYXJjb2RlLCBjaGFyY29kZSA9PT0gMHgyMCk7CiAgICAgICAgZ2x5cGhzLnB1c2goZ2x5cGgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5fY2hhcnNDYWNoZVtjaGFyc10gPSBnbHlwaHM7CiAgfQogIGdldENoYXJQb3NpdGlvbnMoY2hhcnMpIHsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IFtdOwogICAgaWYgKHRoaXMuY01hcCkgewogICAgICBjb25zdCBjID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgbGV0IGkgPSAwOwogICAgICB3aGlsZSAoaSA8IGNoYXJzLmxlbmd0aCkgewogICAgICAgIHRoaXMuY01hcC5yZWFkQ2hhckNvZGUoY2hhcnMsIGksIGMpOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IGMubGVuZ3RoOwogICAgICAgIHBvc2l0aW9ucy5wdXNoKFtpLCBpICsgbGVuZ3RoXSk7CiAgICAgICAgaSArPSBsZW5ndGg7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNoYXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgICBwb3NpdGlvbnMucHVzaChbaSwgaSArIDFdKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBvc2l0aW9uczsKICB9CiAgZ2V0IGdseXBoQ2FjaGVWYWx1ZXMoKSB7CiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9nbHlwaENhY2hlKTsKICB9CiAgZW5jb2RlU3RyaW5nKHN0cikgewogICAgY29uc3QgYnVmZmVycyA9IFtdOwogICAgY29uc3QgY3VycmVudEJ1ZiA9IFtdOwogICAgY29uc3QgaGFzQ3VycmVudEJ1ZkVycm9ycyA9ICgpID0+IGJ1ZmZlcnMubGVuZ3RoICUgMiA9PT0gMTsKICAgIGNvbnN0IGdldENoYXJDb2RlID0gdGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCA/IHVuaWNvZGUgPT4gdGhpcy50b1VuaWNvZGUuY2hhckNvZGVPZih1bmljb2RlKSA6IHVuaWNvZGUgPT4gdGhpcy50b1VuaWNvZGUuY2hhckNvZGVPZihTdHJpbmcuZnJvbUNvZGVQb2ludCh1bmljb2RlKSk7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCB1bmljb2RlID0gc3RyLmNvZGVQb2ludEF0KGkpOwogICAgICBpZiAodW5pY29kZSA+IDB4ZDdmZiAmJiAodW5pY29kZSA8IDB4ZTAwMCB8fCB1bmljb2RlID4gMHhmZmZkKSkgewogICAgICAgIGkrKzsKICAgICAgfQogICAgICBpZiAodGhpcy50b1VuaWNvZGUpIHsKICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGdldENoYXJDb2RlKHVuaWNvZGUpOwogICAgICAgIGlmIChjaGFyQ29kZSAhPT0gLTEpIHsKICAgICAgICAgIGlmIChoYXNDdXJyZW50QnVmRXJyb3JzKCkpIHsKICAgICAgICAgICAgYnVmZmVycy5wdXNoKGN1cnJlbnRCdWYuam9pbigiIikpOwogICAgICAgICAgICBjdXJyZW50QnVmLmxlbmd0aCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBjaGFyQ29kZUxlbmd0aCA9IHRoaXMuY01hcCA/IHRoaXMuY01hcC5nZXRDaGFyQ29kZUxlbmd0aChjaGFyQ29kZSkgOiAxOwogICAgICAgICAgZm9yIChsZXQgaiA9IGNoYXJDb2RlTGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKICAgICAgICAgICAgY3VycmVudEJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUgPj4gOCAqIGogJiAweGZmKSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFoYXNDdXJyZW50QnVmRXJyb3JzKCkpIHsKICAgICAgICBidWZmZXJzLnB1c2goY3VycmVudEJ1Zi5qb2luKCIiKSk7CiAgICAgICAgY3VycmVudEJ1Zi5sZW5ndGggPSAwOwogICAgICB9CiAgICAgIGN1cnJlbnRCdWYucHVzaChTdHJpbmcuZnJvbUNvZGVQb2ludCh1bmljb2RlKSk7CiAgICB9CiAgICBidWZmZXJzLnB1c2goY3VycmVudEJ1Zi5qb2luKCIiKSk7CiAgICByZXR1cm4gYnVmZmVyczsKICB9Cn0KY2xhc3MgRXJyb3JGb250IHsKICBjb25zdHJ1Y3RvcihlcnJvcikgewogICAgdGhpcy5lcnJvciA9IGVycm9yOwogICAgdGhpcy5sb2FkZWROYW1lID0gImdfZm9udF9lcnJvciI7CiAgICB0aGlzLm1pc3NpbmdGaWxlID0gdHJ1ZTsKICB9CiAgY2hhcnNUb0dseXBocygpIHsKICAgIHJldHVybiBbXTsKICB9CiAgZW5jb2RlU3RyaW5nKGNoYXJzKSB7CiAgICByZXR1cm4gW2NoYXJzXTsKICB9CiAgZXhwb3J0RGF0YSgpIHsKICAgIHJldHVybiB7CiAgICAgIGVycm9yOiB0aGlzLmVycm9yCiAgICB9OwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvcGF0dGVybi5qcwoKCgoKY29uc3QgU2hhZGluZ1R5cGUgPSB7CiAgRlVOQ1RJT05fQkFTRUQ6IDEsCiAgQVhJQUw6IDIsCiAgUkFESUFMOiAzLAogIEZSRUVfRk9STV9NRVNIOiA0LAogIExBVFRJQ0VfRk9STV9NRVNIOiA1LAogIENPT05TX1BBVENIX01FU0g6IDYsCiAgVEVOU09SX1BBVENIX01FU0g6IDcKfTsKY2xhc3MgUGF0dGVybiB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB1bnJlYWNoYWJsZSgiQ2Fubm90IGluaXRpYWxpemUgUGF0dGVybi4iKTsKICB9CiAgc3RhdGljIHBhcnNlU2hhZGluZyhzaGFkaW5nLCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgewogICAgY29uc3QgZGljdCA9IHNoYWRpbmcgaW5zdGFuY2VvZiBCYXNlU3RyZWFtID8gc2hhZGluZy5kaWN0IDogc2hhZGluZzsKICAgIGNvbnN0IHR5cGUgPSBkaWN0LmdldCgiU2hhZGluZ1R5cGUiKTsKICAgIHRyeSB7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQVhJQUw6CiAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5SQURJQUw6CiAgICAgICAgICByZXR1cm4gbmV3IFJhZGlhbEF4aWFsU2hhZGluZyhkaWN0LCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5GUkVFX0ZPUk1fTUVTSDoKICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLkxBVFRJQ0VfRk9STV9NRVNIOgogICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQ09PTlNfUEFUQ0hfTUVTSDoKICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLlRFTlNPUl9QQVRDSF9NRVNIOgogICAgICAgICAgcmV0dXJuIG5ldyBNZXNoU2hhZGluZyhzaGFkaW5nLCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5zdXBwb3J0ZWQgU2hhZGluZ1R5cGU6ICIgKyB0eXBlKTsKICAgICAgfQogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKGV4KTsKICAgICAgcmV0dXJuIG5ldyBEdW1teVNoYWRpbmcoKTsKICAgIH0KICB9Cn0KY2xhc3MgQmFzZVNoYWRpbmcgewogIHN0YXRpYyBTTUFMTF9OVU1CRVIgPSAxZS02OwogIGdldElSKCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZ2V0SVJgIGNhbGxlZC4iKTsKICB9Cn0KY2xhc3MgUmFkaWFsQXhpYWxTaGFkaW5nIGV4dGVuZHMgQmFzZVNoYWRpbmcgewogIGNvbnN0cnVjdG9yKGRpY3QsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5LCBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBzdXBlcigpOwogICAgdGhpcy5zaGFkaW5nVHlwZSA9IGRpY3QuZ2V0KCJTaGFkaW5nVHlwZSIpOwogICAgbGV0IGNvb3Jkc0xlbiA9IDA7CiAgICBpZiAodGhpcy5zaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuQVhJQUwpIHsKICAgICAgY29vcmRzTGVuID0gNDsKICAgIH0gZWxzZSBpZiAodGhpcy5zaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuUkFESUFMKSB7CiAgICAgIGNvb3Jkc0xlbiA9IDY7CiAgICB9CiAgICB0aGlzLmNvb3Jkc0FyciA9IGRpY3QuZ2V0QXJyYXkoIkNvb3JkcyIpOwogICAgaWYgKCFpc051bWJlckFycmF5KHRoaXMuY29vcmRzQXJyLCBjb29yZHNMZW4pKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiUmFkaWFsQXhpYWxTaGFkaW5nOiBJbnZhbGlkIC9Db29yZHMgYXJyYXkuIik7CiAgICB9CiAgICBjb25zdCBjcyA9IENvbG9yU3BhY2VVdGlscy5wYXJzZSh7CiAgICAgIGNzOiBkaWN0LmdldFJhdygiQ1MiKSB8fCBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpLAogICAgICB4cmVmLAogICAgICByZXNvdXJjZXMsCiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgfSk7CiAgICB0aGlzLmJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGRpY3QuZ2V0QXJyYXkoIkJCb3giKSwgbnVsbCk7CiAgICBsZXQgdDAgPSAwLjAsCiAgICAgIHQxID0gMS4wOwogICAgY29uc3QgZG9tYWluQXJyID0gZGljdC5nZXRBcnJheSgiRG9tYWluIik7CiAgICBpZiAoaXNOdW1iZXJBcnJheShkb21haW5BcnIsIDIpKSB7CiAgICAgIFt0MCwgdDFdID0gZG9tYWluQXJyOwogICAgfQogICAgbGV0IGV4dGVuZFN0YXJ0ID0gZmFsc2UsCiAgICAgIGV4dGVuZEVuZCA9IGZhbHNlOwogICAgY29uc3QgZXh0ZW5kQXJyID0gZGljdC5nZXRBcnJheSgiRXh0ZW5kIik7CiAgICBpZiAoaXNCb29sZWFuQXJyYXkoZXh0ZW5kQXJyLCAyKSkgewogICAgICBbZXh0ZW5kU3RhcnQsIGV4dGVuZEVuZF0gPSBleHRlbmRBcnI7CiAgICB9CiAgICBpZiAodGhpcy5zaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuUkFESUFMICYmICghZXh0ZW5kU3RhcnQgfHwgIWV4dGVuZEVuZCkpIHsKICAgICAgY29uc3QgW3gxLCB5MSwgcjEsIHgyLCB5MiwgcjJdID0gdGhpcy5jb29yZHNBcnI7CiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5oeXBvdCh4MSAtIHgyLCB5MSAtIHkyKTsKICAgICAgaWYgKHIxIDw9IHIyICsgZGlzdGFuY2UgJiYgcjIgPD0gcjEgKyBkaXN0YW5jZSkgewogICAgICAgIHdhcm4oIlVuc3VwcG9ydGVkIHJhZGlhbCBncmFkaWVudC4iKTsKICAgICAgfQogICAgfQogICAgdGhpcy5leHRlbmRTdGFydCA9IGV4dGVuZFN0YXJ0OwogICAgdGhpcy5leHRlbmRFbmQgPSBleHRlbmRFbmQ7CiAgICBjb25zdCBmbk9iaiA9IGRpY3QuZ2V0UmF3KCJGdW5jdGlvbiIpOwogICAgY29uc3QgZm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKGZuT2JqLCB0cnVlKTsKICAgIGNvbnN0IE5VTUJFUl9PRl9TQU1QTEVTID0gODQwOwogICAgY29uc3Qgc3RlcCA9ICh0MSAtIHQwKSAvIE5VTUJFUl9PRl9TQU1QTEVTOwogICAgY29uc3QgY29sb3JTdG9wcyA9IHRoaXMuY29sb3JTdG9wcyA9IFtdOwogICAgaWYgKHQwID49IHQxIHx8IHN0ZXAgPD0gMCkgewogICAgICBpbmZvKCJCYWQgc2hhZGluZyBkb21haW4uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGNvbG9yID0gbmV3IEZsb2F0MzJBcnJheShjcy5udW1Db21wcyksCiAgICAgIHJhdGlvID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKICAgIGxldCByZ2JDb2xvcjsKICAgIGxldCBpQmFzZSA9IDA7CiAgICByYXRpb1swXSA9IHQwOwogICAgZm4ocmF0aW8sIDAsIGNvbG9yLCAwKTsKICAgIGxldCByZ2JCYXNlID0gY3MuZ2V0UmdiKGNvbG9yLCAwKTsKICAgIGNvbnN0IGNzc0NvbG9yQmFzZSA9IFV0aWwubWFrZUhleENvbG9yKHJnYkJhc2VbMF0sIHJnYkJhc2VbMV0sIHJnYkJhc2VbMl0pOwogICAgY29sb3JTdG9wcy5wdXNoKFswLCBjc3NDb2xvckJhc2VdKTsKICAgIGxldCBpUHJldiA9IDE7CiAgICByYXRpb1swXSA9IHQwICsgc3RlcDsKICAgIGZuKHJhdGlvLCAwLCBjb2xvciwgMCk7CiAgICBsZXQgcmdiUHJldiA9IGNzLmdldFJnYihjb2xvciwgMCk7CiAgICBsZXQgbWF4U2xvcGVSID0gcmdiUHJldlswXSAtIHJnYkJhc2VbMF0gKyAxOwogICAgbGV0IG1heFNsb3BlRyA9IHJnYlByZXZbMV0gLSByZ2JCYXNlWzFdICsgMTsKICAgIGxldCBtYXhTbG9wZUIgPSByZ2JQcmV2WzJdIC0gcmdiQmFzZVsyXSArIDE7CiAgICBsZXQgbWluU2xvcGVSID0gcmdiUHJldlswXSAtIHJnYkJhc2VbMF0gLSAxOwogICAgbGV0IG1pblNsb3BlRyA9IHJnYlByZXZbMV0gLSByZ2JCYXNlWzFdIC0gMTsKICAgIGxldCBtaW5TbG9wZUIgPSByZ2JQcmV2WzJdIC0gcmdiQmFzZVsyXSAtIDE7CiAgICBmb3IgKGxldCBpID0gMjsgaSA8IE5VTUJFUl9PRl9TQU1QTEVTOyBpKyspIHsKICAgICAgcmF0aW9bMF0gPSB0MCArIGkgKiBzdGVwOwogICAgICBmbihyYXRpbywgMCwgY29sb3IsIDApOwogICAgICByZ2JDb2xvciA9IGNzLmdldFJnYihjb2xvciwgMCk7CiAgICAgIGNvbnN0IHJ1biA9IGkgLSBpQmFzZTsKICAgICAgbWF4U2xvcGVSID0gTWF0aC5taW4obWF4U2xvcGVSLCAocmdiQ29sb3JbMF0gLSByZ2JCYXNlWzBdICsgMSkgLyBydW4pOwogICAgICBtYXhTbG9wZUcgPSBNYXRoLm1pbihtYXhTbG9wZUcsIChyZ2JDb2xvclsxXSAtIHJnYkJhc2VbMV0gKyAxKSAvIHJ1bik7CiAgICAgIG1heFNsb3BlQiA9IE1hdGgubWluKG1heFNsb3BlQiwgKHJnYkNvbG9yWzJdIC0gcmdiQmFzZVsyXSArIDEpIC8gcnVuKTsKICAgICAgbWluU2xvcGVSID0gTWF0aC5tYXgobWluU2xvcGVSLCAocmdiQ29sb3JbMF0gLSByZ2JCYXNlWzBdIC0gMSkgLyBydW4pOwogICAgICBtaW5TbG9wZUcgPSBNYXRoLm1heChtaW5TbG9wZUcsIChyZ2JDb2xvclsxXSAtIHJnYkJhc2VbMV0gLSAxKSAvIHJ1bik7CiAgICAgIG1pblNsb3BlQiA9IE1hdGgubWF4KG1pblNsb3BlQiwgKHJnYkNvbG9yWzJdIC0gcmdiQmFzZVsyXSAtIDEpIC8gcnVuKTsKICAgICAgY29uc3Qgc2xvcGVzRXhpc3QgPSBtaW5TbG9wZVIgPD0gbWF4U2xvcGVSICYmIG1pblNsb3BlRyA8PSBtYXhTbG9wZUcgJiYgbWluU2xvcGVCIDw9IG1heFNsb3BlQjsKICAgICAgaWYgKCFzbG9wZXNFeGlzdCkgewogICAgICAgIGNvbnN0IGNzc0NvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IocmdiUHJldlswXSwgcmdiUHJldlsxXSwgcmdiUHJldlsyXSk7CiAgICAgICAgY29sb3JTdG9wcy5wdXNoKFtpUHJldiAvIE5VTUJFUl9PRl9TQU1QTEVTLCBjc3NDb2xvcl0pOwogICAgICAgIG1heFNsb3BlUiA9IHJnYkNvbG9yWzBdIC0gcmdiUHJldlswXSArIDE7CiAgICAgICAgbWF4U2xvcGVHID0gcmdiQ29sb3JbMV0gLSByZ2JQcmV2WzFdICsgMTsKICAgICAgICBtYXhTbG9wZUIgPSByZ2JDb2xvclsyXSAtIHJnYlByZXZbMl0gKyAxOwogICAgICAgIG1pblNsb3BlUiA9IHJnYkNvbG9yWzBdIC0gcmdiUHJldlswXSAtIDE7CiAgICAgICAgbWluU2xvcGVHID0gcmdiQ29sb3JbMV0gLSByZ2JQcmV2WzFdIC0gMTsKICAgICAgICBtaW5TbG9wZUIgPSByZ2JDb2xvclsyXSAtIHJnYlByZXZbMl0gLSAxOwogICAgICAgIGlCYXNlID0gaVByZXY7CiAgICAgICAgcmdiQmFzZSA9IHJnYlByZXY7CiAgICAgIH0KICAgICAgaVByZXYgPSBpOwogICAgICByZ2JQcmV2ID0gcmdiQ29sb3I7CiAgICB9CiAgICBjb25zdCBjc3NDb2xvciA9IFV0aWwubWFrZUhleENvbG9yKHJnYlByZXZbMF0sIHJnYlByZXZbMV0sIHJnYlByZXZbMl0pOwogICAgY29sb3JTdG9wcy5wdXNoKFsxLCBjc3NDb2xvcl0pOwogICAgbGV0IGJhY2tncm91bmQgPSAidHJhbnNwYXJlbnQiOwogICAgaWYgKGRpY3QuaGFzKCJCYWNrZ3JvdW5kIikpIHsKICAgICAgcmdiQ29sb3IgPSBjcy5nZXRSZ2IoZGljdC5nZXQoIkJhY2tncm91bmQiKSwgMCk7CiAgICAgIGJhY2tncm91bmQgPSBVdGlsLm1ha2VIZXhDb2xvcihyZ2JDb2xvclswXSwgcmdiQ29sb3JbMV0sIHJnYkNvbG9yWzJdKTsKICAgIH0KICAgIGlmICghZXh0ZW5kU3RhcnQpIHsKICAgICAgY29sb3JTdG9wcy51bnNoaWZ0KFswLCBiYWNrZ3JvdW5kXSk7CiAgICAgIGNvbG9yU3RvcHNbMV1bMF0gKz0gQmFzZVNoYWRpbmcuU01BTExfTlVNQkVSOwogICAgfQogICAgaWYgKCFleHRlbmRFbmQpIHsKICAgICAgY29sb3JTdG9wcy5hdCgtMSlbMF0gLT0gQmFzZVNoYWRpbmcuU01BTExfTlVNQkVSOwogICAgICBjb2xvclN0b3BzLnB1c2goWzEsIGJhY2tncm91bmRdKTsKICAgIH0KICAgIHRoaXMuY29sb3JTdG9wcyA9IGNvbG9yU3RvcHM7CiAgfQogIGdldElSKCkgewogICAgY29uc3QgewogICAgICBjb29yZHNBcnIsCiAgICAgIHNoYWRpbmdUeXBlCiAgICB9ID0gdGhpczsKICAgIGxldCB0eXBlLCBwMCwgcDEsIHIwLCByMTsKICAgIGlmIChzaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuQVhJQUwpIHsKICAgICAgcDAgPSBbY29vcmRzQXJyWzBdLCBjb29yZHNBcnJbMV1dOwogICAgICBwMSA9IFtjb29yZHNBcnJbMl0sIGNvb3Jkc0FyclszXV07CiAgICAgIHIwID0gbnVsbDsKICAgICAgcjEgPSBudWxsOwogICAgICB0eXBlID0gImF4aWFsIjsKICAgIH0gZWxzZSBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLlJBRElBTCkgewogICAgICBwMCA9IFtjb29yZHNBcnJbMF0sIGNvb3Jkc0FyclsxXV07CiAgICAgIHAxID0gW2Nvb3Jkc0FyclszXSwgY29vcmRzQXJyWzRdXTsKICAgICAgcjAgPSBjb29yZHNBcnJbMl07CiAgICAgIHIxID0gY29vcmRzQXJyWzVdOwogICAgICB0eXBlID0gInJhZGlhbCI7CiAgICB9IGVsc2UgewogICAgICB1bnJlYWNoYWJsZShgZ2V0UGF0dGVybiB0eXBlIHVua25vd246ICR7c2hhZGluZ1R5cGV9YCk7CiAgICB9CiAgICByZXR1cm4gWyJSYWRpYWxBeGlhbCIsIHR5cGUsIHRoaXMuYmJveCwgdGhpcy5jb2xvclN0b3BzLCBwMCwgcDEsIHIwLCByMV07CiAgfQp9CmNsYXNzIE1lc2hTdHJlYW1SZWFkZXIgewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgY29udGV4dCkgewogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwogICAgdGhpcy5idWZmZXIgPSAwOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOwogICAgY29uc3QgbnVtQ29tcHMgPSBjb250ZXh0Lm51bUNvbXBzOwogICAgdGhpcy50bXBDb21wc0J1ZiA9IG5ldyBGbG9hdDMyQXJyYXkobnVtQ29tcHMpOwogICAgY29uc3QgY3NOdW1Db21wcyA9IGNvbnRleHQuY29sb3JTcGFjZS5udW1Db21wczsKICAgIHRoaXMudG1wQ3NDb21wc0J1ZiA9IGNvbnRleHQuY29sb3JGbiA/IG5ldyBGbG9hdDMyQXJyYXkoY3NOdW1Db21wcykgOiB0aGlzLnRtcENvbXBzQnVmOwogIH0KICBnZXQgaGFzRGF0YSgpIHsKICAgIGlmICh0aGlzLnN0cmVhbS5lbmQpIHsKICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLnBvcyA8IHRoaXMuc3RyZWFtLmVuZDsKICAgIH0KICAgIGlmICh0aGlzLmJ1ZmZlckxlbmd0aCA+IDApIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjb25zdCBuZXh0Qnl0ZSA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKICAgIGlmIChuZXh0Qnl0ZSA8IDApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdGhpcy5idWZmZXIgPSBuZXh0Qnl0ZTsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gODsKICAgIHJldHVybiB0cnVlOwogIH0KICByZWFkQml0cyhuKSB7CiAgICBjb25zdCB7CiAgICAgIHN0cmVhbQogICAgfSA9IHRoaXM7CiAgICBsZXQgewogICAgICBidWZmZXIsCiAgICAgIGJ1ZmZlckxlbmd0aAogICAgfSA9IHRoaXM7CiAgICBpZiAobiA9PT0gMzIpIHsKICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgfQogICAgICBidWZmZXIgPSBidWZmZXIgPDwgMjQgfCBzdHJlYW0uZ2V0Qnl0ZSgpIDw8IDE2IHwgc3RyZWFtLmdldEJ5dGUoKSA8PCA4IHwgc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgY29uc3QgbmV4dEJ5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICB0aGlzLmJ1ZmZlciA9IG5leHRCeXRlICYgKDEgPDwgYnVmZmVyTGVuZ3RoKSAtIDE7CiAgICAgIHJldHVybiAoYnVmZmVyIDw8IDggLSBidWZmZXJMZW5ndGggfCAobmV4dEJ5dGUgJiAweGZmKSA+PiBidWZmZXJMZW5ndGgpID4+PiAwOwogICAgfQogICAgaWYgKG4gPT09IDggJiYgYnVmZmVyTGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgfQogICAgd2hpbGUgKGJ1ZmZlckxlbmd0aCA8IG4pIHsKICAgICAgYnVmZmVyID0gYnVmZmVyIDw8IDggfCBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICBidWZmZXJMZW5ndGggKz0gODsKICAgIH0KICAgIGJ1ZmZlckxlbmd0aCAtPSBuOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlciAmICgxIDw8IGJ1ZmZlckxlbmd0aCkgLSAxOwogICAgcmV0dXJuIGJ1ZmZlciA+PiBidWZmZXJMZW5ndGg7CiAgfQogIGFsaWduKCkgewogICAgdGhpcy5idWZmZXIgPSAwOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOwogIH0KICByZWFkRmxhZygpIHsKICAgIHJldHVybiB0aGlzLnJlYWRCaXRzKHRoaXMuY29udGV4dC5iaXRzUGVyRmxhZyk7CiAgfQogIHJlYWRDb29yZGluYXRlKCkgewogICAgY29uc3QgewogICAgICBiaXRzUGVyQ29vcmRpbmF0ZSwKICAgICAgZGVjb2RlCiAgICB9ID0gdGhpcy5jb250ZXh0OwogICAgY29uc3QgeGkgPSB0aGlzLnJlYWRCaXRzKGJpdHNQZXJDb29yZGluYXRlKTsKICAgIGNvbnN0IHlpID0gdGhpcy5yZWFkQml0cyhiaXRzUGVyQ29vcmRpbmF0ZSk7CiAgICBjb25zdCBzY2FsZSA9IGJpdHNQZXJDb29yZGluYXRlIDwgMzIgPyAxIC8gKCgxIDw8IGJpdHNQZXJDb29yZGluYXRlKSAtIDEpIDogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsKICAgIHJldHVybiBbeGkgKiBzY2FsZSAqIChkZWNvZGVbMV0gLSBkZWNvZGVbMF0pICsgZGVjb2RlWzBdLCB5aSAqIHNjYWxlICogKGRlY29kZVszXSAtIGRlY29kZVsyXSkgKyBkZWNvZGVbMl1dOwogIH0KICByZWFkQ29tcG9uZW50cygpIHsKICAgIGNvbnN0IHsKICAgICAgYml0c1BlckNvbXBvbmVudCwKICAgICAgY29sb3JGbiwKICAgICAgY29sb3JTcGFjZSwKICAgICAgZGVjb2RlLAogICAgICBudW1Db21wcwogICAgfSA9IHRoaXMuY29udGV4dDsKICAgIGNvbnN0IHNjYWxlID0gYml0c1BlckNvbXBvbmVudCA8IDMyID8gMSAvICgoMSA8PCBiaXRzUGVyQ29tcG9uZW50KSAtIDEpIDogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsKICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLnRtcENvbXBzQnVmOwogICAgZm9yIChsZXQgaSA9IDAsIGogPSA0OyBpIDwgbnVtQ29tcHM7IGkrKywgaiArPSAyKSB7CiAgICAgIGNvbnN0IGNpID0gdGhpcy5yZWFkQml0cyhiaXRzUGVyQ29tcG9uZW50KTsKICAgICAgY29tcG9uZW50c1tpXSA9IGNpICogc2NhbGUgKiAoZGVjb2RlW2ogKyAxXSAtIGRlY29kZVtqXSkgKyBkZWNvZGVbal07CiAgICB9CiAgICBjb25zdCBjb2xvciA9IHRoaXMudG1wQ3NDb21wc0J1ZjsKICAgIGNvbG9yRm4/Lihjb21wb25lbnRzLCAwLCBjb2xvciwgMCk7CiAgICByZXR1cm4gY29sb3JTcGFjZS5nZXRSZ2IoY29sb3IsIDApOwogIH0KfQpsZXQgYkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKZnVuY3Rpb24gYnVpbGRCKGNvdW50KSB7CiAgY29uc3QgbHV0ID0gW107CiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgewogICAgY29uc3QgdCA9IGkgLyBjb3VudCwKICAgICAgdF8gPSAxIC0gdDsKICAgIGx1dC5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoW3RfICoqIDMsIDMgKiB0ICogdF8gKiogMiwgMyAqIHQgKiogMiAqIHRfLCB0ICoqIDNdKSk7CiAgfQogIHJldHVybiBsdXQ7Cn0KZnVuY3Rpb24gZ2V0Qihjb3VudCkgewogIHJldHVybiBiQ2FjaGVbY291bnRdIHx8PSBidWlsZEIoY291bnQpOwp9CmZ1bmN0aW9uIGNsZWFyUGF0dGVybkNhY2hlcygpIHsKICBiQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwp9CmNsYXNzIE1lc2hTaGFkaW5nIGV4dGVuZHMgQmFzZVNoYWRpbmcgewogIHN0YXRpYyBNSU5fU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCA9IDM7CiAgc3RhdGljIE1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5UID0gMjA7CiAgc3RhdGljIFRSSUFOR0xFX0RFTlNJVFkgPSAyMDsKICBjb25zdHJ1Y3RvcihzdHJlYW0sIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5LCBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBzdXBlcigpOwogICAgaWYgKCEoc3RyZWFtIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJNZXNoIGRhdGEgaXMgbm90IGEgc3RyZWFtIik7CiAgICB9CiAgICBjb25zdCBkaWN0ID0gc3RyZWFtLmRpY3Q7CiAgICB0aGlzLnNoYWRpbmdUeXBlID0gZGljdC5nZXQoIlNoYWRpbmdUeXBlIik7CiAgICB0aGlzLmJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGRpY3QuZ2V0QXJyYXkoIkJCb3giKSwgbnVsbCk7CiAgICBjb25zdCBjcyA9IENvbG9yU3BhY2VVdGlscy5wYXJzZSh7CiAgICAgIGNzOiBkaWN0LmdldFJhdygiQ1MiKSB8fCBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpLAogICAgICB4cmVmLAogICAgICByZXNvdXJjZXMsCiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgfSk7CiAgICB0aGlzLmJhY2tncm91bmQgPSBkaWN0LmhhcygiQmFja2dyb3VuZCIpID8gY3MuZ2V0UmdiKGRpY3QuZ2V0KCJCYWNrZ3JvdW5kIiksIDApIDogbnVsbDsKICAgIGNvbnN0IGZuT2JqID0gZGljdC5nZXRSYXcoIkZ1bmN0aW9uIik7CiAgICBjb25zdCBmbiA9IGZuT2JqID8gcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZShmbk9iaiwgdHJ1ZSkgOiBudWxsOwogICAgdGhpcy5jb29yZHMgPSBbXTsKICAgIHRoaXMuY29sb3JzID0gW107CiAgICB0aGlzLmZpZ3VyZXMgPSBbXTsKICAgIGNvbnN0IGRlY29kZUNvbnRleHQgPSB7CiAgICAgIGJpdHNQZXJDb29yZGluYXRlOiBkaWN0LmdldCgiQml0c1BlckNvb3JkaW5hdGUiKSwKICAgICAgYml0c1BlckNvbXBvbmVudDogZGljdC5nZXQoIkJpdHNQZXJDb21wb25lbnQiKSwKICAgICAgYml0c1BlckZsYWc6IGRpY3QuZ2V0KCJCaXRzUGVyRmxhZyIpLAogICAgICBkZWNvZGU6IGRpY3QuZ2V0QXJyYXkoIkRlY29kZSIpLAogICAgICBjb2xvckZuOiBmbiwKICAgICAgY29sb3JTcGFjZTogY3MsCiAgICAgIG51bUNvbXBzOiBmbiA/IDEgOiBjcy5udW1Db21wcwogICAgfTsKICAgIGNvbnN0IHJlYWRlciA9IG5ldyBNZXNoU3RyZWFtUmVhZGVyKHN0cmVhbSwgZGVjb2RlQ29udGV4dCk7CiAgICBsZXQgcGF0Y2hNZXNoID0gZmFsc2U7CiAgICBzd2l0Y2ggKHRoaXMuc2hhZGluZ1R5cGUpIHsKICAgICAgY2FzZSBTaGFkaW5nVHlwZS5GUkVFX0ZPUk1fTUVTSDoKICAgICAgICB0aGlzLl9kZWNvZGVUeXBlNFNoYWRpbmcocmVhZGVyKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTaGFkaW5nVHlwZS5MQVRUSUNFX0ZPUk1fTUVTSDoKICAgICAgICBjb25zdCB2ZXJ0aWNlc1BlclJvdyA9IGRpY3QuZ2V0KCJWZXJ0aWNlc1BlclJvdyIpIHwgMDsKICAgICAgICBpZiAodmVydGljZXNQZXJSb3cgPCAyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgVmVydGljZXNQZXJSb3ciKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZGVjb2RlVHlwZTVTaGFkaW5nKHJlYWRlciwgdmVydGljZXNQZXJSb3cpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFNoYWRpbmdUeXBlLkNPT05TX1BBVENIX01FU0g6CiAgICAgICAgdGhpcy5fZGVjb2RlVHlwZTZTaGFkaW5nKHJlYWRlcik7CiAgICAgICAgcGF0Y2hNZXNoID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTaGFkaW5nVHlwZS5URU5TT1JfUEFUQ0hfTUVTSDoKICAgICAgICB0aGlzLl9kZWNvZGVUeXBlN1NoYWRpbmcocmVhZGVyKTsKICAgICAgICBwYXRjaE1lc2ggPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHVucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBtZXNoIHR5cGUuIik7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGF0Y2hNZXNoKSB7CiAgICAgIHRoaXMuX3VwZGF0ZUJvdW5kcygpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLmZpZ3VyZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIHRoaXMuX2J1aWxkRmlndXJlRnJvbVBhdGNoKGkpOwogICAgICB9CiAgICB9CiAgICB0aGlzLl91cGRhdGVCb3VuZHMoKTsKICAgIHRoaXMuX3BhY2tEYXRhKCk7CiAgfQogIF9kZWNvZGVUeXBlNFNoYWRpbmcocmVhZGVyKSB7CiAgICBjb25zdCBjb29yZHMgPSB0aGlzLmNvb3JkczsKICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuY29sb3JzOwogICAgY29uc3Qgb3BlcmF0b3JzID0gW107CiAgICBjb25zdCBwcyA9IFtdOwogICAgbGV0IHZlcnRpY2VzTGVmdCA9IDA7CiAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKICAgICAgY29uc3QgZiA9IHJlYWRlci5yZWFkRmxhZygpOwogICAgICBjb25zdCBjb29yZCA9IHJlYWRlci5yZWFkQ29vcmRpbmF0ZSgpOwogICAgICBjb25zdCBjb2xvciA9IHJlYWRlci5yZWFkQ29tcG9uZW50cygpOwogICAgICBpZiAodmVydGljZXNMZWZ0ID09PSAwKSB7CiAgICAgICAgaWYgKCEoMCA8PSBmICYmIGYgPD0gMikpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNCBmbGFnIik7CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoZikgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICB2ZXJ0aWNlc0xlZnQgPSAzOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgcHMucHVzaChwcy5hdCgtMiksIHBzLmF0KC0xKSk7CiAgICAgICAgICAgIHZlcnRpY2VzTGVmdCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBwcy5wdXNoKHBzLmF0KC0zKSwgcHMuYXQoLTEpKTsKICAgICAgICAgICAgdmVydGljZXNMZWZ0ID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG9wZXJhdG9ycy5wdXNoKGYpOwogICAgICB9CiAgICAgIHBzLnB1c2goY29vcmRzLmxlbmd0aCk7CiAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTsKICAgICAgY29sb3JzLnB1c2goY29sb3IpOwogICAgICB2ZXJ0aWNlc0xlZnQtLTsKICAgICAgcmVhZGVyLmFsaWduKCk7CiAgICB9CiAgICB0aGlzLmZpZ3VyZXMucHVzaCh7CiAgICAgIHR5cGU6ICJ0cmlhbmdsZXMiLAogICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgY29sb3JzOiBuZXcgSW50MzJBcnJheShwcykKICAgIH0pOwogIH0KICBfZGVjb2RlVHlwZTVTaGFkaW5nKHJlYWRlciwgdmVydGljZXNQZXJSb3cpIHsKICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRzOwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBwcyA9IFtdOwogICAgd2hpbGUgKHJlYWRlci5oYXNEYXRhKSB7CiAgICAgIGNvbnN0IGNvb3JkID0gcmVhZGVyLnJlYWRDb29yZGluYXRlKCk7CiAgICAgIGNvbnN0IGNvbG9yID0gcmVhZGVyLnJlYWRDb21wb25lbnRzKCk7CiAgICAgIHBzLnB1c2goY29vcmRzLmxlbmd0aCk7CiAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTsKICAgICAgY29sb3JzLnB1c2goY29sb3IpOwogICAgfQogICAgdGhpcy5maWd1cmVzLnB1c2goewogICAgICB0eXBlOiAibGF0dGljZSIsCiAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAogICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgdmVydGljZXNQZXJSb3cKICAgIH0pOwogIH0KICBfZGVjb2RlVHlwZTZTaGFkaW5nKHJlYWRlcikgewogICAgY29uc3QgY29vcmRzID0gdGhpcy5jb29yZHM7CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmNvbG9yczsKICAgIGNvbnN0IHBzID0gbmV3IEludDMyQXJyYXkoMTYpOwogICAgY29uc3QgY3MgPSBuZXcgSW50MzJBcnJheSg0KTsKICAgIHdoaWxlIChyZWFkZXIuaGFzRGF0YSkgewogICAgICBjb25zdCBmID0gcmVhZGVyLnJlYWRGbGFnKCk7CiAgICAgIGlmICghKDAgPD0gZiAmJiBmIDw9IDMpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIHR5cGU2IGZsYWciKTsKICAgICAgfQogICAgICBjb25zdCBwaSA9IGNvb3Jkcy5sZW5ndGg7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGYgIT09IDAgPyA4IDogMTI7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29vcmRzLnB1c2gocmVhZGVyLnJlYWRDb29yZGluYXRlKCkpOwogICAgICB9CiAgICAgIGNvbnN0IGNpID0gY29sb3JzLmxlbmd0aDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZiAhPT0gMCA/IDIgOiA0OyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbG9ycy5wdXNoKHJlYWRlci5yZWFkQ29tcG9uZW50cygpKTsKICAgICAgfQogICAgICBsZXQgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKICAgICAgc3dpdGNoIChmKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgcHNbMTJdID0gcGkgKyAzOwogICAgICAgICAgcHNbMTNdID0gcGkgKyA0OwogICAgICAgICAgcHNbMTRdID0gcGkgKyA1OwogICAgICAgICAgcHNbMTVdID0gcGkgKyA2OwogICAgICAgICAgcHNbOF0gPSBwaSArIDI7CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1s0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzddID0gcGkgKyA4OwogICAgICAgICAgcHNbMF0gPSBwaTsKICAgICAgICAgIHBzWzFdID0gcGkgKyAxMTsKICAgICAgICAgIHBzWzJdID0gcGkgKyAxMDsKICAgICAgICAgIHBzWzNdID0gcGkgKyA5OwogICAgICAgICAgY3NbMl0gPSBjaSArIDE7CiAgICAgICAgICBjc1szXSA9IGNpICsgMjsKICAgICAgICAgIGNzWzBdID0gY2k7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHRtcDEgPSBwc1sxMl07CiAgICAgICAgICB0bXAyID0gcHNbMTNdOwogICAgICAgICAgdG1wMyA9IHBzWzE0XTsKICAgICAgICAgIHRtcDQgPSBwc1sxNV07CiAgICAgICAgICBwc1sxMl0gPSB0bXA0OwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSB0bXAzOwogICAgICAgICAgcHNbMTFdID0gcGkgKyAzOwogICAgICAgICAgcHNbNF0gPSB0bXAyOwogICAgICAgICAgcHNbN10gPSBwaSArIDQ7CiAgICAgICAgICBwc1swXSA9IHRtcDE7CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICB0bXAxID0gY3NbMl07CiAgICAgICAgICB0bXAyID0gY3NbM107CiAgICAgICAgICBjc1syXSA9IHRtcDI7CiAgICAgICAgICBjc1szXSA9IGNpOwogICAgICAgICAgY3NbMF0gPSB0bXAxOwogICAgICAgICAgY3NbMV0gPSBjaSArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICB0bXAxID0gcHNbMTVdOwogICAgICAgICAgdG1wMiA9IHBzWzExXTsKICAgICAgICAgIHBzWzEyXSA9IHBzWzNdOwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSBwc1s3XTsKICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKICAgICAgICAgIHBzWzRdID0gdG1wMjsKICAgICAgICAgIHBzWzddID0gcGkgKyA0OwogICAgICAgICAgcHNbMF0gPSB0bXAxOwogICAgICAgICAgcHNbMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1syXSA9IHBpICsgNjsKICAgICAgICAgIHBzWzNdID0gcGkgKyA1OwogICAgICAgICAgdG1wMSA9IGNzWzNdOwogICAgICAgICAgY3NbMl0gPSBjc1sxXTsKICAgICAgICAgIGNzWzNdID0gY2k7CiAgICAgICAgICBjc1swXSA9IHRtcDE7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIHBzWzEyXSA9IHBzWzBdOwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSBwc1sxXTsKICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKICAgICAgICAgIHBzWzRdID0gcHNbMl07CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gcHNbM107CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICBjc1syXSA9IGNzWzBdOwogICAgICAgICAgY3NbM10gPSBjaTsKICAgICAgICAgIGNzWzBdID0gY3NbMV07CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHBzWzVdID0gY29vcmRzLmxlbmd0aDsKICAgICAgY29vcmRzLnB1c2goWygtNCAqIGNvb3Jkc1twc1swXV1bMF0gLSBjb29yZHNbcHNbMTVdXVswXSArIDYgKiAoY29vcmRzW3BzWzRdXVswXSArIGNvb3Jkc1twc1sxXV1bMF0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVswXSArIGNvb3Jkc1twc1szXV1bMF0pICsgMyAqIChjb29yZHNbcHNbMTNdXVswXSArIGNvb3Jkc1twc1s3XV1bMF0pKSAvIDksICgtNCAqIGNvb3Jkc1twc1swXV1bMV0gLSBjb29yZHNbcHNbMTVdXVsxXSArIDYgKiAoY29vcmRzW3BzWzRdXVsxXSArIGNvb3Jkc1twc1sxXV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVsxXSArIGNvb3Jkc1twc1szXV1bMV0pICsgMyAqIChjb29yZHNbcHNbMTNdXVsxXSArIGNvb3Jkc1twc1s3XV1bMV0pKSAvIDldKTsKICAgICAgcHNbNl0gPSBjb29yZHMubGVuZ3RoOwogICAgICBjb29yZHMucHVzaChbKC00ICogY29vcmRzW3BzWzNdXVswXSAtIGNvb3Jkc1twc1sxMl1dWzBdICsgNiAqIChjb29yZHNbcHNbMl1dWzBdICsgY29vcmRzW3BzWzddXVswXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMF0gKyBjb29yZHNbcHNbMTVdXVswXSkgKyAzICogKGNvb3Jkc1twc1s0XV1bMF0gKyBjb29yZHNbcHNbMTRdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzNdXVsxXSAtIGNvb3Jkc1twc1sxMl1dWzFdICsgNiAqIChjb29yZHNbcHNbMl1dWzFdICsgY29vcmRzW3BzWzddXVsxXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMV0gKyBjb29yZHNbcHNbMTVdXVsxXSkgKyAzICogKGNvb3Jkc1twc1s0XV1bMV0gKyBjb29yZHNbcHNbMTRdXVsxXSkpIC8gOV0pOwogICAgICBwc1s5XSA9IGNvb3Jkcy5sZW5ndGg7CiAgICAgIGNvb3Jkcy5wdXNoKFsoLTQgKiBjb29yZHNbcHNbMTJdXVswXSAtIGNvb3Jkc1twc1szXV1bMF0gKyA2ICogKGNvb3Jkc1twc1s4XV1bMF0gKyBjb29yZHNbcHNbMTNdXVswXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMF0gKyBjb29yZHNbcHNbMTVdXVswXSkgKyAzICogKGNvb3Jkc1twc1sxMV1dWzBdICsgY29vcmRzW3BzWzFdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzEyXV1bMV0gLSBjb29yZHNbcHNbM11dWzFdICsgNiAqIChjb29yZHNbcHNbOF1dWzFdICsgY29vcmRzW3BzWzEzXV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMF1dWzFdICsgY29vcmRzW3BzWzE1XV1bMV0pICsgMyAqIChjb29yZHNbcHNbMTFdXVsxXSArIGNvb3Jkc1twc1sxXV1bMV0pKSAvIDldKTsKICAgICAgcHNbMTBdID0gY29vcmRzLmxlbmd0aDsKICAgICAgY29vcmRzLnB1c2goWygtNCAqIGNvb3Jkc1twc1sxNV1dWzBdIC0gY29vcmRzW3BzWzBdXVswXSArIDYgKiAoY29vcmRzW3BzWzExXV1bMF0gKyBjb29yZHNbcHNbMTRdXVswXSkgLSAyICogKGNvb3Jkc1twc1sxMl1dWzBdICsgY29vcmRzW3BzWzNdXVswXSkgKyAzICogKGNvb3Jkc1twc1syXV1bMF0gKyBjb29yZHNbcHNbOF1dWzBdKSkgLyA5LCAoLTQgKiBjb29yZHNbcHNbMTVdXVsxXSAtIGNvb3Jkc1twc1swXV1bMV0gKyA2ICogKGNvb3Jkc1twc1sxMV1dWzFdICsgY29vcmRzW3BzWzE0XV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVsxXSArIGNvb3Jkc1twc1szXV1bMV0pICsgMyAqIChjb29yZHNbcHNbMl1dWzFdICsgY29vcmRzW3BzWzhdXVsxXSkpIC8gOV0pOwogICAgICB0aGlzLmZpZ3VyZXMucHVzaCh7CiAgICAgICAgdHlwZTogInBhdGNoIiwKICAgICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KGNzKQogICAgICB9KTsKICAgIH0KICB9CiAgX2RlY29kZVR5cGU3U2hhZGluZyhyZWFkZXIpIHsKICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRzOwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBwcyA9IG5ldyBJbnQzMkFycmF5KDE2KTsKICAgIGNvbnN0IGNzID0gbmV3IEludDMyQXJyYXkoNCk7CiAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKICAgICAgY29uc3QgZiA9IHJlYWRlci5yZWFkRmxhZygpOwogICAgICBpZiAoISgwIDw9IGYgJiYgZiA8PSAzKSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNyBmbGFnIik7CiAgICAgIH0KICAgICAgY29uc3QgcGkgPSBjb29yZHMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmICE9PSAwID8gMTIgOiAxNjsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb29yZHMucHVzaChyZWFkZXIucmVhZENvb3JkaW5hdGUoKSk7CiAgICAgIH0KICAgICAgY29uc3QgY2kgPSBjb2xvcnMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmICE9PSAwID8gMiA6IDQ7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29sb3JzLnB1c2gocmVhZGVyLnJlYWRDb21wb25lbnRzKCkpOwogICAgICB9CiAgICAgIGxldCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OwogICAgICBzd2l0Y2ggKGYpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBwc1sxMl0gPSBwaSArIDM7CiAgICAgICAgICBwc1sxM10gPSBwaSArIDQ7CiAgICAgICAgICBwc1sxNF0gPSBwaSArIDU7CiAgICAgICAgICBwc1sxNV0gPSBwaSArIDY7CiAgICAgICAgICBwc1s4XSA9IHBpICsgMjsKICAgICAgICAgIHBzWzldID0gcGkgKyAxMzsKICAgICAgICAgIHBzWzEwXSA9IHBpICsgMTQ7CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1s0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzVdID0gcGkgKyAxMjsKICAgICAgICAgIHBzWzZdID0gcGkgKyAxNTsKICAgICAgICAgIHBzWzddID0gcGkgKyA4OwogICAgICAgICAgcHNbMF0gPSBwaTsKICAgICAgICAgIHBzWzFdID0gcGkgKyAxMTsKICAgICAgICAgIHBzWzJdID0gcGkgKyAxMDsKICAgICAgICAgIHBzWzNdID0gcGkgKyA5OwogICAgICAgICAgY3NbMl0gPSBjaSArIDE7CiAgICAgICAgICBjc1szXSA9IGNpICsgMjsKICAgICAgICAgIGNzWzBdID0gY2k7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHRtcDEgPSBwc1sxMl07CiAgICAgICAgICB0bXAyID0gcHNbMTNdOwogICAgICAgICAgdG1wMyA9IHBzWzE0XTsKICAgICAgICAgIHRtcDQgPSBwc1sxNV07CiAgICAgICAgICBwc1sxMl0gPSB0bXA0OwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSB0bXAzOwogICAgICAgICAgcHNbOV0gPSBwaSArIDk7CiAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOwogICAgICAgICAgcHNbMTFdID0gcGkgKyAzOwogICAgICAgICAgcHNbNF0gPSB0bXAyOwogICAgICAgICAgcHNbNV0gPSBwaSArIDg7CiAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gdG1wMTsKICAgICAgICAgIHBzWzFdID0gcGkgKyA3OwogICAgICAgICAgcHNbMl0gPSBwaSArIDY7CiAgICAgICAgICBwc1szXSA9IHBpICsgNTsKICAgICAgICAgIHRtcDEgPSBjc1syXTsKICAgICAgICAgIHRtcDIgPSBjc1szXTsKICAgICAgICAgIGNzWzJdID0gdG1wMjsKICAgICAgICAgIGNzWzNdID0gY2k7CiAgICAgICAgICBjc1swXSA9IHRtcDE7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHRtcDEgPSBwc1sxNV07CiAgICAgICAgICB0bXAyID0gcHNbMTFdOwogICAgICAgICAgcHNbMTJdID0gcHNbM107CiAgICAgICAgICBwc1sxM10gPSBwaSArIDA7CiAgICAgICAgICBwc1sxNF0gPSBwaSArIDE7CiAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CiAgICAgICAgICBwc1s4XSA9IHBzWzddOwogICAgICAgICAgcHNbOV0gPSBwaSArIDk7CiAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOwogICAgICAgICAgcHNbMTFdID0gcGkgKyAzOwogICAgICAgICAgcHNbNF0gPSB0bXAyOwogICAgICAgICAgcHNbNV0gPSBwaSArIDg7CiAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gdG1wMTsKICAgICAgICAgIHBzWzFdID0gcGkgKyA3OwogICAgICAgICAgcHNbMl0gPSBwaSArIDY7CiAgICAgICAgICBwc1szXSA9IHBpICsgNTsKICAgICAgICAgIHRtcDEgPSBjc1szXTsKICAgICAgICAgIGNzWzJdID0gY3NbMV07CiAgICAgICAgICBjc1szXSA9IGNpOwogICAgICAgICAgY3NbMF0gPSB0bXAxOwogICAgICAgICAgY3NbMV0gPSBjaSArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICBwc1sxMl0gPSBwc1swXTsKICAgICAgICAgIHBzWzEzXSA9IHBpICsgMDsKICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKICAgICAgICAgIHBzWzhdID0gcHNbMV07CiAgICAgICAgICBwc1s5XSA9IHBpICsgOTsKICAgICAgICAgIHBzWzEwXSA9IHBpICsgMTA7CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDM7CiAgICAgICAgICBwc1s0XSA9IHBzWzJdOwogICAgICAgICAgcHNbNV0gPSBwaSArIDg7CiAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gcHNbM107CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICBjc1syXSA9IGNzWzBdOwogICAgICAgICAgY3NbM10gPSBjaTsKICAgICAgICAgIGNzWzBdID0gY3NbMV07CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRoaXMuZmlndXJlcy5wdXNoKHsKICAgICAgICB0eXBlOiAicGF0Y2giLAogICAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAogICAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkoY3MpCiAgICAgIH0pOwogICAgfQogIH0KICBfYnVpbGRGaWd1cmVGcm9tUGF0Y2goaW5kZXgpIHsKICAgIGNvbnN0IGZpZ3VyZSA9IHRoaXMuZmlndXJlc1tpbmRleF07CiAgICBhc3NlcnQoZmlndXJlLnR5cGUgPT09ICJwYXRjaCIsICJVbmV4cGVjdGVkIHBhdGNoIG1lc2ggZmlndXJlIik7CiAgICBjb25zdCBjb29yZHMgPSB0aGlzLmNvb3JkcywKICAgICAgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBwaSA9IGZpZ3VyZS5jb29yZHM7CiAgICBjb25zdCBjaSA9IGZpZ3VyZS5jb2xvcnM7CiAgICBjb25zdCBmaWd1cmVNaW5YID0gTWF0aC5taW4oY29vcmRzW3BpWzBdXVswXSwgY29vcmRzW3BpWzNdXVswXSwgY29vcmRzW3BpWzEyXV1bMF0sIGNvb3Jkc1twaVsxNV1dWzBdKTsKICAgIGNvbnN0IGZpZ3VyZU1pblkgPSBNYXRoLm1pbihjb29yZHNbcGlbMF1dWzFdLCBjb29yZHNbcGlbM11dWzFdLCBjb29yZHNbcGlbMTJdXVsxXSwgY29vcmRzW3BpWzE1XV1bMV0pOwogICAgY29uc3QgZmlndXJlTWF4WCA9IE1hdGgubWF4KGNvb3Jkc1twaVswXV1bMF0sIGNvb3Jkc1twaVszXV1bMF0sIGNvb3Jkc1twaVsxMl1dWzBdLCBjb29yZHNbcGlbMTVdXVswXSk7CiAgICBjb25zdCBmaWd1cmVNYXhZID0gTWF0aC5tYXgoY29vcmRzW3BpWzBdXVsxXSwgY29vcmRzW3BpWzNdXVsxXSwgY29vcmRzW3BpWzEyXV1bMV0sIGNvb3Jkc1twaVsxNV1dWzFdKTsKICAgIGxldCBzcGxpdFhCeSA9IE1hdGguY2VpbCgoZmlndXJlTWF4WCAtIGZpZ3VyZU1pblgpICogTWVzaFNoYWRpbmcuVFJJQU5HTEVfREVOU0lUWSAvICh0aGlzLmJvdW5kc1syXSAtIHRoaXMuYm91bmRzWzBdKSk7CiAgICBzcGxpdFhCeSA9IE1hdGhDbGFtcChzcGxpdFhCeSwgTWVzaFNoYWRpbmcuTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIE1lc2hTaGFkaW5nLk1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5UKTsKICAgIGxldCBzcGxpdFlCeSA9IE1hdGguY2VpbCgoZmlndXJlTWF4WSAtIGZpZ3VyZU1pblkpICogTWVzaFNoYWRpbmcuVFJJQU5HTEVfREVOU0lUWSAvICh0aGlzLmJvdW5kc1szXSAtIHRoaXMuYm91bmRzWzFdKSk7CiAgICBzcGxpdFlCeSA9IE1hdGhDbGFtcChzcGxpdFlCeSwgTWVzaFNoYWRpbmcuTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIE1lc2hTaGFkaW5nLk1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5UKTsKICAgIGNvbnN0IHZlcnRpY2VzUGVyUm93ID0gc3BsaXRYQnkgKyAxOwogICAgY29uc3QgZmlndXJlQ29vcmRzID0gbmV3IEludDMyQXJyYXkoKHNwbGl0WUJ5ICsgMSkgKiB2ZXJ0aWNlc1BlclJvdyk7CiAgICBjb25zdCBmaWd1cmVDb2xvcnMgPSBuZXcgSW50MzJBcnJheSgoc3BsaXRZQnkgKyAxKSAqIHZlcnRpY2VzUGVyUm93KTsKICAgIGxldCBrID0gMDsKICAgIGNvbnN0IGNsID0gbmV3IFVpbnQ4QXJyYXkoMyksCiAgICAgIGNyID0gbmV3IFVpbnQ4QXJyYXkoMyk7CiAgICBjb25zdCBjMCA9IGNvbG9yc1tjaVswXV0sCiAgICAgIGMxID0gY29sb3JzW2NpWzFdXSwKICAgICAgYzIgPSBjb2xvcnNbY2lbMl1dLAogICAgICBjMyA9IGNvbG9yc1tjaVszXV07CiAgICBjb25zdCBiUm93ID0gZ2V0QihzcGxpdFlCeSksCiAgICAgIGJDb2wgPSBnZXRCKHNwbGl0WEJ5KTsKICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8PSBzcGxpdFlCeTsgcm93KyspIHsKICAgICAgY2xbMF0gPSAoYzBbMF0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzJbMF0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOwogICAgICBjbFsxXSA9IChjMFsxXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjMlsxXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CiAgICAgIGNsWzJdID0gKGMwWzJdICogKHNwbGl0WUJ5IC0gcm93KSArIGMyWzJdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKICAgICAgY3JbMF0gPSAoYzFbMF0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzNbMF0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOwogICAgICBjclsxXSA9IChjMVsxXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjM1sxXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CiAgICAgIGNyWzJdID0gKGMxWzJdICogKHNwbGl0WUJ5IC0gcm93KSArIGMzWzJdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDw9IHNwbGl0WEJ5OyBjb2wrKywgaysrKSB7CiAgICAgICAgaWYgKChyb3cgPT09IDAgfHwgcm93ID09PSBzcGxpdFlCeSkgJiYgKGNvbCA9PT0gMCB8fCBjb2wgPT09IHNwbGl0WEJ5KSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCB4ID0gMCwKICAgICAgICAgIHkgPSAwOwogICAgICAgIGxldCBxID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAzOyBpKyspIHsKICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDw9IDM7IGorKywgcSsrKSB7CiAgICAgICAgICAgIGNvbnN0IG0gPSBiUm93W3Jvd11baV0gKiBiQ29sW2NvbF1bal07CiAgICAgICAgICAgIHggKz0gY29vcmRzW3BpW3FdXVswXSAqIG07CiAgICAgICAgICAgIHkgKz0gY29vcmRzW3BpW3FdXVsxXSAqIG07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpZ3VyZUNvb3Jkc1trXSA9IGNvb3Jkcy5sZW5ndGg7CiAgICAgICAgY29vcmRzLnB1c2goW3gsIHldKTsKICAgICAgICBmaWd1cmVDb2xvcnNba10gPSBjb2xvcnMubGVuZ3RoOwogICAgICAgIGNvbnN0IG5ld0NvbG9yID0gbmV3IFVpbnQ4QXJyYXkoMyk7CiAgICAgICAgbmV3Q29sb3JbMF0gPSAoY2xbMF0gKiAoc3BsaXRYQnkgLSBjb2wpICsgY3JbMF0gKiBjb2wpIC8gc3BsaXRYQnkgfCAwOwogICAgICAgIG5ld0NvbG9yWzFdID0gKGNsWzFdICogKHNwbGl0WEJ5IC0gY29sKSArIGNyWzFdICogY29sKSAvIHNwbGl0WEJ5IHwgMDsKICAgICAgICBuZXdDb2xvclsyXSA9IChjbFsyXSAqIChzcGxpdFhCeSAtIGNvbCkgKyBjclsyXSAqIGNvbCkgLyBzcGxpdFhCeSB8IDA7CiAgICAgICAgY29sb3JzLnB1c2gobmV3Q29sb3IpOwogICAgICB9CiAgICB9CiAgICBmaWd1cmVDb29yZHNbMF0gPSBwaVswXTsKICAgIGZpZ3VyZUNvbG9yc1swXSA9IGNpWzBdOwogICAgZmlndXJlQ29vcmRzW3NwbGl0WEJ5XSA9IHBpWzNdOwogICAgZmlndXJlQ29sb3JzW3NwbGl0WEJ5XSA9IGNpWzFdOwogICAgZmlndXJlQ29vcmRzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnldID0gcGlbMTJdOwogICAgZmlndXJlQ29sb3JzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnldID0gY2lbMl07CiAgICBmaWd1cmVDb29yZHNbdmVydGljZXNQZXJSb3cgKiBzcGxpdFlCeSArIHNwbGl0WEJ5XSA9IHBpWzE1XTsKICAgIGZpZ3VyZUNvbG9yc1t2ZXJ0aWNlc1BlclJvdyAqIHNwbGl0WUJ5ICsgc3BsaXRYQnldID0gY2lbM107CiAgICB0aGlzLmZpZ3VyZXNbaW5kZXhdID0gewogICAgICB0eXBlOiAibGF0dGljZSIsCiAgICAgIGNvb3JkczogZmlndXJlQ29vcmRzLAogICAgICBjb2xvcnM6IGZpZ3VyZUNvbG9ycywKICAgICAgdmVydGljZXNQZXJSb3cKICAgIH07CiAgfQogIF91cGRhdGVCb3VuZHMoKSB7CiAgICBsZXQgbWluWCA9IHRoaXMuY29vcmRzWzBdWzBdLAogICAgICBtaW5ZID0gdGhpcy5jb29yZHNbMF1bMV0sCiAgICAgIG1heFggPSBtaW5YLAogICAgICBtYXhZID0gbWluWTsKICAgIGZvciAobGV0IGkgPSAxLCBpaSA9IHRoaXMuY29vcmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgeCA9IHRoaXMuY29vcmRzW2ldWzBdLAogICAgICAgIHkgPSB0aGlzLmNvb3Jkc1tpXVsxXTsKICAgICAgbWluWCA9IG1pblggPiB4ID8geCA6IG1pblg7CiAgICAgIG1pblkgPSBtaW5ZID4geSA/IHkgOiBtaW5ZOwogICAgICBtYXhYID0gbWF4WCA8IHggPyB4IDogbWF4WDsKICAgICAgbWF4WSA9IG1heFkgPCB5ID8geSA6IG1heFk7CiAgICB9CiAgICB0aGlzLmJvdW5kcyA9IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTsKICB9CiAgX3BhY2tEYXRhKCkgewogICAgbGV0IGksIGlpLCBqLCBqajsKICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRzOwogICAgY29uc3QgY29vcmRzUGFja2VkID0gbmV3IEZsb2F0MzJBcnJheShjb29yZHMubGVuZ3RoICogMik7CiAgICBmb3IgKGkgPSAwLCBqID0gMCwgaWkgPSBjb29yZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCB4eSA9IGNvb3Jkc1tpXTsKICAgICAgY29vcmRzUGFja2VkW2orK10gPSB4eVswXTsKICAgICAgY29vcmRzUGFja2VkW2orK10gPSB4eVsxXTsKICAgIH0KICAgIHRoaXMuY29vcmRzID0gY29vcmRzUGFja2VkOwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBjb2xvcnNQYWNrZWQgPSBuZXcgVWludDhBcnJheShjb2xvcnMubGVuZ3RoICogMyk7CiAgICBmb3IgKGkgPSAwLCBqID0gMCwgaWkgPSBjb2xvcnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCBjID0gY29sb3JzW2ldOwogICAgICBjb2xvcnNQYWNrZWRbaisrXSA9IGNbMF07CiAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1sxXTsKICAgICAgY29sb3JzUGFja2VkW2orK10gPSBjWzJdOwogICAgfQogICAgdGhpcy5jb2xvcnMgPSBjb2xvcnNQYWNrZWQ7CiAgICBjb25zdCBmaWd1cmVzID0gdGhpcy5maWd1cmVzOwogICAgZm9yIChpID0gMCwgaWkgPSBmaWd1cmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgZmlndXJlID0gZmlndXJlc1tpXSwKICAgICAgICBwcyA9IGZpZ3VyZS5jb29yZHMsCiAgICAgICAgY3MgPSBmaWd1cmUuY29sb3JzOwogICAgICBmb3IgKGogPSAwLCBqaiA9IHBzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICBwc1tqXSAqPSAyOwogICAgICAgIGNzW2pdICo9IDM7CiAgICAgIH0KICAgIH0KICB9CiAgZ2V0SVIoKSB7CiAgICBjb25zdCB7CiAgICAgIGJvdW5kcwogICAgfSA9IHRoaXM7CiAgICBpZiAoYm91bmRzWzJdIC0gYm91bmRzWzBdID09PSAwIHx8IGJvdW5kc1szXSAtIGJvdW5kc1sxXSA9PT0gMCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgTWVzaFNoYWRpbmcgYm91bmRzOiBbJHtib3VuZHN9XS5gKTsKICAgIH0KICAgIHJldHVybiBbIk1lc2giLCB0aGlzLnNoYWRpbmdUeXBlLCB0aGlzLmNvb3JkcywgdGhpcy5jb2xvcnMsIHRoaXMuZmlndXJlcywgYm91bmRzLCB0aGlzLmJib3gsIHRoaXMuYmFja2dyb3VuZF07CiAgfQp9CmNsYXNzIER1bW15U2hhZGluZyBleHRlbmRzIEJhc2VTaGFkaW5nIHsKICBnZXRJUigpIHsKICAgIHJldHVybiBbIkR1bW15Il07CiAgfQp9CmZ1bmN0aW9uIGdldFRpbGluZ1BhdHRlcm5JUihvcGVyYXRvckxpc3QsIGRpY3QsIGNvbG9yKSB7CiAgY29uc3QgbWF0cml4ID0gbG9va3VwTWF0cml4KGRpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpLCBJREVOVElUWV9NQVRSSVgpOwogIGNvbnN0IGJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGRpY3QuZ2V0QXJyYXkoIkJCb3giKSwgbnVsbCk7CiAgaWYgKCFiYm94IHx8IGJib3hbMl0gLSBiYm94WzBdID09PSAwIHx8IGJib3hbM10gLSBiYm94WzFdID09PSAwKSB7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZ2V0VGlsaW5nUGF0dGVybklSIC9CQm94IGFycmF5LmApOwogIH0KICBjb25zdCB4c3RlcCA9IGRpY3QuZ2V0KCJYU3RlcCIpOwogIGlmICh0eXBlb2YgeHN0ZXAgIT09ICJudW1iZXIiKSB7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZ2V0VGlsaW5nUGF0dGVybklSIC9YU3RlcCB2YWx1ZS5gKTsKICB9CiAgY29uc3QgeXN0ZXAgPSBkaWN0LmdldCgiWVN0ZXAiKTsKICBpZiAodHlwZW9mIHlzdGVwICE9PSAibnVtYmVyIikgewogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGdldFRpbGluZ1BhdHRlcm5JUiAvWVN0ZXAgdmFsdWUuYCk7CiAgfQogIGNvbnN0IHBhaW50VHlwZSA9IGRpY3QuZ2V0KCJQYWludFR5cGUiKTsKICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFpbnRUeXBlKSkgewogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGdldFRpbGluZ1BhdHRlcm5JUiAvUGFpbnRUeXBlIHZhbHVlLmApOwogIH0KICBjb25zdCB0aWxpbmdUeXBlID0gZGljdC5nZXQoIlRpbGluZ1R5cGUiKTsKICBpZiAoIU51bWJlci5pc0ludGVnZXIodGlsaW5nVHlwZSkpIHsKICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBnZXRUaWxpbmdQYXR0ZXJuSVIgL1RpbGluZ1R5cGUgdmFsdWUuYCk7CiAgfQogIHJldHVybiBbIlRpbGluZ1BhdHRlcm4iLCBjb2xvciwgb3BlcmF0b3JMaXN0LCBtYXRyaXgsIGJib3gsIHhzdGVwLCB5c3RlcCwgcGFpbnRUeXBlLCB0aWxpbmdUeXBlXTsKfQoKOy8vIC4vc3JjL2NvcmUvY2FsaWJyaV9mYWN0b3JzLmpzCmNvbnN0IENhbGlicmlCb2xkRmFjdG9ycyA9IFsxLjM4NzcsIDEsIDEsIDEsIDAuOTc4MDEsIDAuOTI0ODIsIDAuODk1NTIsIDAuOTExMzMsIDAuODE5ODgsIDAuOTc1NjYsIDAuOTgxNTIsIDAuOTM1NDgsIDAuOTM1NDgsIDEuMjc5OCwgMC44NTI4NCwgMC45Mjc5NCwgMSwgMC45NjEzNCwgMS41NDY1NywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC44Mjg0NSwgMC44Mjg0NSwgMC44NTI4NCwgMC44NTI4NCwgMC44NTI4NCwgMC43NTg1OSwgMC45MjEzOCwgMC44MzkwOCwgMC43NzYyLCAwLjczMjkzLCAwLjg3Mjg5LCAwLjczMTMzLCAwLjc1MTQsIDAuODE5MjEsIDAuODczNTYsIDAuOTU5NTgsIDAuNTk1MjYsIDAuNzU3MjcsIDAuNjkyMjUsIDEuMDQ5MjQsIDAuOTEyMSwgMC44Njk0MywgMC43OTc5NSwgMC44ODE5OCwgMC43Nzk1OCwgMC43MDg2NCwgMC44MTA1NSwgMC45MDM5OSwgMC44ODY1MywgMC45NjAxNywgMC44MjU3NywgMC43Nzg5MiwgMC43ODI1NywgMC45NzUwNywgMS41NDY1NywgMC45NzUwNywgMC44NTI4NCwgMC44OTU1MiwgMC45MDE3NiwgMC44ODc2MiwgMC44Nzg1LCAwLjc1MjQxLCAwLjg3ODUsIDAuOTA1MTgsIDAuOTUwMTUsIDAuNzc2MTgsIDAuODc4NSwgMC44ODQwMSwgMC45MTkxNiwgMC44NjMwNCwgMC44ODQwMSwgMC45MTQ4OCwgMC44Nzg1LCAwLjg4MDEsIDAuODc4NSwgMC44Nzg1LCAwLjkxMzQzLCAwLjcxNzMsIDEuMDQxMDYsIDAuODc4NSwgMC44NTA3NSwgMC45NTc5NCwgMC44MjYxNiwgMC44NTE2MiwgMC43OTQ5MiwgMC44ODMzMSwgMS42OTgwOCwgMC44ODMzMSwgMC44NTI4NCwgMC45NzgwMSwgMC44OTU1MiwgMC45MTEzMywgMC44OTU1MiwgMC45MTEzMywgMS43ODAxLCAwLjg5NTUyLCAxLjI0NDg3LCAxLjEzMjU0LCAxLjEyNDAxLCAwLjk2ODM5LCAwLjg1Mjg0LCAwLjY4Nzg3LCAwLjcwNjQ1LCAwLjg1NTkyLCAwLjkwNzQ3LCAxLjAxNDY2LCAxLjAwODgsIDAuOTAzMjMsIDEsIDEuMDc0NjMsIDEsIDAuOTEwNTYsIDAuNzU4MDYsIDEuMTkxMTgsIDAuOTY4MzksIDAuNzg4NjQsIDAuODI4NDUsIDAuODQxMzMsIDAuNzU4NTksIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuNzc1MzksIDAuNzMyOTMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuOTU5NTgsIDAuOTU5NTgsIDAuOTU5NTgsIDAuOTU5NTgsIDAuODg1MDYsIDAuOTEyMSwgMC44Njk0MywgMC44Njk0MywgMC44Njk0MywgMC44Njk0MywgMC44Njk0MywgMC44NTI4NCwgMC44NzUwOCwgMC45MDM5OSwgMC45MDM5OSwgMC45MDM5OSwgMC45MDM5OSwgMC43Nzg5MiwgMC43OTc5NSwgMC45MDgwNywgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44NzE1LCAwLjc1MjQxLCAwLjkwNTE4LCAwLjkwNTE4LCAwLjkwNTE4LCAwLjkwNTE4LCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg3ODUsIDAuODc4NSwgMC44ODAxLCAwLjg4MDEsIDAuODgwMSwgMC44ODAxLCAwLjg4MDEsIDAuOTA3NDcsIDAuODkwNDksIDAuODc4NSwgMC44Nzg1LCAwLjg3ODUsIDAuODc4NSwgMC44NTE2MiwgMC44Nzg1LCAwLjg1MTYyLCAwLjgzOTA4LCAwLjg4NzYyLCAwLjgzOTA4LCAwLjg4NzYyLCAwLjgzOTA4LCAwLjg4NzYyLCAwLjczMjkzLCAwLjc1MjQxLCAwLjczMjkzLCAwLjc1MjQxLCAwLjczMjkzLCAwLjc1MjQxLCAwLjczMjkzLCAwLjc1MjQxLCAwLjg3Mjg5LCAwLjgzMDE2LCAwLjg4NTA2LCAwLjkzMTI1LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjgxOTIxLCAwLjc3NjE4LCAwLjgxOTIxLCAwLjc3NjE4LCAwLjgxOTIxLCAwLjc3NjE4LCAxLCAxLCAwLjg3MzU2LCAwLjg3ODUsIDAuOTEwNzUsIDAuODk2MDgsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuNzYyMjksIDAuOTAxNjcsIDAuNTk1MjYsIDAuOTE5MTYsIDEsIDEsIDAuODYzMDQsIDAuNjkyMjUsIDAuODg0MDEsIDEsIDEsIDAuNzA0MjQsIDAuNzk0NjgsIDAuOTE5MjYsIDAuODgxNzUsIDAuNzA4MjMsIDAuOTQ5MDMsIDAuOTEyMSwgMC44Nzg1LCAxLCAxLCAwLjkxMjEsIDAuODc4NSwgMC44NzgwMiwgMC44ODY1NiwgMC44Nzg1LCAwLjg2OTQzLCAwLjg4MDEsIDAuODY5NDMsIDAuODgwMSwgMC44Njk0MywgMC44ODAxLCAwLjg3NDAyLCAwLjg5MjkxLCAwLjc3OTU4LCAwLjkxMzQzLCAxLCAxLCAwLjc3OTU4LCAwLjkxMzQzLCAwLjcwODY0LCAwLjcxNzMsIDAuNzA4NjQsIDAuNzE3MywgMC43MDg2NCwgMC43MTczLCAwLjcwODY0LCAwLjcxNzMsIDEsIDEsIDAuODEwNTUsIDAuNzU4NDEsIDAuODEwNTUsIDEuMDY0NTIsIDAuOTAzOTksIDAuODc4NSwgMC45MDM5OSwgMC44Nzg1LCAwLjkwMzk5LCAwLjg3ODUsIDAuOTAzOTksIDAuODc4NSwgMC45MDM5OSwgMC44Nzg1LCAwLjkwMzk5LCAwLjg3ODUsIDAuOTYwMTcsIDAuOTU3OTQsIDAuNzc4OTIsIDAuODUxNjIsIDAuNzc4OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuOTI5NywgMC41Njg5MiwgMC44MzkwOCwgMC44ODc2MiwgMC43NzUzOSwgMC44NzE1LCAwLjg3NTA4LCAwLjg5MDQ5LCAxLCAxLCAwLjgxMDU1LCAxLjA0MTA2LCAxLjIwNTI4LCAxLjIwNTI4LCAxLCAxLjE1NTQzLCAwLjcwNjc0LCAwLjk4Mzg3LCAwLjk0NzIxLCAxLjMzNDMxLCAxLjQ1ODk0LCAwLjk1MTYxLCAxLjA2MzAzLCAwLjgzOTA4LCAwLjgwMzUyLCAwLjU3MTg0LCAwLjY5NjUsIDAuNTYyODksIDAuODIwMDEsIDAuNTYwMjksIDAuODEyMzUsIDEuMDI5ODgsIDAuODM5MDgsIDAuNzc2MiwgMC42ODE1NiwgMC44MDM2NywgMC43MzEzMywgMC43ODI1NywgMC44NzM1NiwgMC44Njk0MywgMC45NTk1OCwgMC43NTcyNywgMC44OTAxOSwgMS4wNDkyNCwgMC45MTIxLCAwLjc2NDgsIDAuODY5NDMsIDAuODczNTYsIDAuNzk3OTUsIDAuNzgyNzUsIDAuODEwNTUsIDAuNzc4OTIsIDAuOTc2MiwgMC44MjU3NywgMC45OTgxOSwgMC44NDg5NiwgMC45NTk1OCwgMC43Nzg5MiwgMC45NjEwOCwgMS4wMTQwNywgMC44OTA0OSwgMS4wMjk4OCwgMC45NDIxMSwgMC45NjEwOCwgMC44OTM2LCAwLjg0MDIxLCAwLjg3ODQyLCAwLjk2Mzk5LCAwLjc5MTA5LCAwLjg5MDQ5LCAxLjAwODEzLCAxLjAyOTg4LCAwLjg2MDc3LCAwLjg3NDQ1LCAwLjkyMDk5LCAwLjg0NzIzLCAwLjg2NTEzLCAwLjg4MDEsIDAuNzU2MzgsIDAuODU3MTQsIDAuNzgyMTYsIDAuNzk1ODYsIDAuODc5NjUsIDAuOTQyMTEsIDAuOTc3NDcsIDAuNzgyODcsIDAuOTc5MjYsIDAuODQ5NzEsIDEuMDI5ODgsIDAuOTQyMTEsIDAuODgwMSwgMC45NDIxMSwgMC44NDk3MSwgMC43MzEzMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDI2NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDUxOCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDU0OCwgMSwgMSwgMSwgMSwgMSwgMSwgMC45NjAxNywgMC45NTc5NCwgMC45NjAxNywgMC45NTc5NCwgMC45NjAxNywgMC45NTc5NCwgMC43Nzg5MiwgMC44NTE2MiwgMSwgMSwgMC44OTU1MiwgMC45MDUyNywgMSwgMC45MDM2MywgMC45Mjc5NCwgMC45Mjc5NCwgMC45Mjc5NCwgMC45Mjc5NCwgMC44NzAxMiwgMC44NzAxMiwgMC44NzAxMiwgMC44OTU1MiwgMC44OTU1MiwgMS40MjI1OSwgMC43MTE0MywgMS4wNjE1MiwgMSwgMSwgMS4wMzM3MiwgMS4wMzM3MiwgMC45NzE3MSwgMS40OTU2LCAyLjI4MDcsIDAuOTM4MzUsIDAuODM0MDYsIDAuOTExMzMsIDAuODQxMDcsIDAuOTExMzMsIDEsIDEsIDEsIDAuNzIwMjEsIDEsIDEuMjMxMDgsIDAuODM0ODksIDAuODg1MjUsIDAuODg1MjUsIDAuODE0OTksIDAuOTA1MjcsIDEuODEwNTUsIDAuOTA1MjcsIDEuODEwNTUsIDEuMzEwMDYsIDEuNTM3MTEsIDAuOTQ0MzQsIDEuMDg2OTYsIDEsIDAuOTUwMTgsIDAuNzcxOTIsIDAuODUyODQsIDAuOTA3NDcsIDEuMTc1MzQsIDAuNjk4MjUsIDAuOTcxNiwgMS4zNzA3NywgMC45MDc0NywgMC45MDc0NywgMC44NTM1NiwgMC45MDc0NywgMC45MDc0NywgMS40NDk0NywgMC44NTI4NCwgMC44OTQxLCAwLjg5NDEsIDAuNzA1NzIsIDAuOCwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTg2MiwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMS4wODAwNCwgMC45MTAyNywgMSwgMSwgMSwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDcyNywgMC45MDcyNywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IENhbGlicmlCb2xkTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIyMDcsCiAgbGluZUdhcDogMC4yMjA3Cn07CmNvbnN0IENhbGlicmlCb2xkSXRhbGljRmFjdG9ycyA9IFsxLjM4NzcsIDEsIDEsIDEsIDAuOTc4MDEsIDAuOTI0ODIsIDAuODk1NTIsIDAuOTExMzMsIDAuODE5ODgsIDAuOTc1NjYsIDAuOTgxNTIsIDAuOTM1NDgsIDAuOTM1NDgsIDEuMjc5OCwgMC44NTI4NCwgMC45Mjc5NCwgMSwgMC45NjEzNCwgMS41NjIzOSwgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC44Mjg0NSwgMC44Mjg0NSwgMC44NTI4NCwgMC44NTI4NCwgMC44NTI4NCwgMC43NTg1OSwgMC45MjEzOCwgMC44MzkwOCwgMC43NzYyLCAwLjcxODA1LCAwLjg3Mjg5LCAwLjczMTMzLCAwLjc1MTQsIDAuODE5MjEsIDAuODczNTYsIDAuOTU5NTgsIDAuNTk1MjYsIDAuNzU3MjcsIDAuNjkyMjUsIDEuMDQ5MjQsIDAuOTA4NzIsIDAuODU5MzgsIDAuNzk3OTUsIDAuODcwNjgsIDAuNzc5NTgsIDAuNjk3NjYsIDAuODEwNTUsIDAuOTAzOTksIDAuODg2NTMsIDAuOTYwNjgsIDAuODI1NzcsIDAuNzc4OTIsIDAuNzgyNTcsIDAuOTc1MDcsIDEuNTI5LCAwLjk3NTA3LCAwLjg1Mjg0LCAwLjg5NTUyLCAwLjkwMTc2LCAwLjk0OTA4LCAwLjg2NDExLCAwLjc0MDEyLCAwLjg2NDExLCAwLjg4MzIzLCAwLjk1MDE1LCAwLjg2NDExLCAwLjg2MzMxLCAwLjg4NDAxLCAwLjkxOTE2LCAwLjg2MzA0LCAwLjg4NDAxLCAwLjkwMzksIDAuODYzMzEsIDAuODYzMzEsIDAuODY0MTEsIDAuODY0MTEsIDAuOTA0NjQsIDAuNzA4NTIsIDEuMDQxMDYsIDAuODYzMzEsIDAuODQzNzIsIDAuOTU3OTQsIDAuODI2MTYsIDAuODQ1NDgsIDAuNzk0OTIsIDAuODgzMzEsIDEuNjk4MDgsIDAuODgzMzEsIDAuODUyODQsIDAuOTc4MDEsIDAuODk1NTIsIDAuOTExMzMsIDAuODk1NTIsIDAuOTExMzMsIDEuNzgwMSwgMC44OTU1MiwgMS4yNDQ4NywgMS4xMzI1NCwgMS4xOTEyOSwgMC45NjgzOSwgMC44NTI4NCwgMC42ODc4NywgMC43MDY0NSwgMC44NTU5MiwgMC45MDc0NywgMS4wMTQ2NiwgMS4wMDg4LCAwLjkwMzIzLCAxLCAxLjA3NDYzLCAxLCAwLjkxMDU2LCAwLjc1ODA2LCAxLjE5MTE4LCAwLjk2ODM5LCAwLjc4ODY0LCAwLjgyODQ1LCAwLjg0MTMzLCAwLjc1ODU5LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjc3NTM5LCAwLjcxODA1LCAwLjczMTMzLCAwLjczMTMzLCAwLjczMTMzLCAwLjczMTMzLCAwLjk1OTU4LCAwLjk1OTU4LCAwLjk1OTU4LCAwLjk1OTU4LCAwLjg4NTA2LCAwLjkwODcyLCAwLjg1OTM4LCAwLjg1OTM4LCAwLjg1OTM4LCAwLjg1OTM4LCAwLjg1OTM4LCAwLjg1Mjg0LCAwLjg3MDY4LCAwLjkwMzk5LCAwLjkwMzk5LCAwLjkwMzk5LCAwLjkwMzk5LCAwLjc3ODkyLCAwLjc5Nzk1LCAwLjkwODA3LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjg1ODg3LCAwLjc0MDEyLCAwLjg4MzIzLCAwLjg4MzIzLCAwLjg4MzIzLCAwLjg4MzIzLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg3ODUsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuOTA3NDcsIDAuODkwNDksIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODQ1NDgsIDAuODY0MTEsIDAuODQ1NDgsIDAuODM5MDgsIDAuOTQ5MDgsIDAuODM5MDgsIDAuOTQ5MDgsIDAuODM5MDgsIDAuOTQ5MDgsIDAuNzE4MDUsIDAuNzQwMTIsIDAuNzE4MDUsIDAuNzQwMTIsIDAuNzE4MDUsIDAuNzQwMTIsIDAuNzE4MDUsIDAuNzQwMTIsIDAuODcyODksIDAuNzk1MzgsIDAuODg1MDYsIDAuOTI3MjYsIDAuNzMxMzMsIDAuODgzMjMsIDAuNzMxMzMsIDAuODgzMjMsIDAuNzMxMzMsIDAuODgzMjMsIDAuNzMxMzMsIDAuODgzMjMsIDAuNzMxMzMsIDAuODgzMjMsIDAuODE5MjEsIDAuODY0MTEsIDAuODE5MjEsIDAuODY0MTEsIDAuODE5MjEsIDAuODY0MTEsIDEsIDEsIDAuODczNTYsIDAuODYzMzEsIDAuOTEwNzUsIDAuODc3NywgMC45NTk1OCwgMC44ODQwMSwgMC45NTk1OCwgMC44ODQwMSwgMC45NTk1OCwgMC44ODQwMSwgMC45NTk1OCwgMC44ODQwMSwgMC45NTk1OCwgMC44ODQwMSwgMC43NjQ2NywgMC45MDE2NywgMC41OTUyNiwgMC45MTkxNiwgMSwgMSwgMC44NjMwNCwgMC42OTIyNSwgMC44ODQwMSwgMSwgMSwgMC43MDQyNCwgMC43NzMxMiwgMC45MTkyNiwgMC44ODE3NSwgMC43MDgyMywgMC45NDkwMywgMC45MDg3MiwgMC44NjMzMSwgMSwgMSwgMC45MDg3MiwgMC44NjMzMSwgMC44NjkwNiwgMC44ODExNiwgMC44NjMzMSwgMC44NTkzOCwgMC44NjMzMSwgMC44NTkzOCwgMC44NjMzMSwgMC44NTkzOCwgMC44NjMzMSwgMC44NzQwMiwgMC44NjU0OSwgMC43Nzk1OCwgMC45MDQ2NCwgMSwgMSwgMC43Nzk1OCwgMC45MDQ2NCwgMC42OTc2NiwgMC43MDg1MiwgMC42OTc2NiwgMC43MDg1MiwgMC42OTc2NiwgMC43MDg1MiwgMC42OTc2NiwgMC43MDg1MiwgMSwgMSwgMC44MTA1NSwgMC43NTg0MSwgMC44MTA1NSwgMS4wNjQ1MiwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45NjA2OCwgMC45NTc5NCwgMC43Nzg5MiwgMC44NDU0OCwgMC43Nzg5MiwgMC43ODI1NywgMC43OTQ5MiwgMC43ODI1NywgMC43OTQ5MiwgMC43ODI1NywgMC43OTQ5MiwgMC45Mjk3LCAwLjU2ODkyLCAwLjgzOTA4LCAwLjk0OTA4LCAwLjc3NTM5LCAwLjg1ODg3LCAwLjg3MDY4LCAwLjg5MDQ5LCAxLCAxLCAwLjgxMDU1LCAxLjA0MTA2LCAxLjIwNTI4LCAxLjIwNTI4LCAxLCAxLjE1NTQzLCAwLjcwMDg4LCAwLjk4Mzg3LCAwLjk0NzIxLCAxLjMzNDMxLCAxLjQ1ODk0LCAwLjk1MTYxLCAxLjQ4Mzg3LCAwLjgzOTA4LCAwLjgwMzUyLCAwLjU3MTE4LCAwLjY5NjUsIDAuNTYzNDcsIDAuNzkxNzksIDAuNTU4NTMsIDAuODAzNDYsIDEuMDI5ODgsIDAuODM5MDgsIDAuNzc2MiwgMC42NzE3NCwgMC44NjAzNiwgMC43MzEzMywgMC43ODI1NywgMC44NzM1NiwgMC44NjQ0MSwgMC45NTk1OCwgMC43NTcyNywgMC44OTAxOSwgMS4wNDkyNCwgMC45MDg3MiwgMC43NDg4OSwgMC44NTkzOCwgMC44Nzg5MSwgMC43OTc5NSwgMC43OTU3LCAwLjgxMDU1LCAwLjc3ODkyLCAwLjk3NDQ3LCAwLjgyNTc3LCAwLjk3NDY2LCAwLjg3MTc5LCAwLjk1OTU4LCAwLjc3ODkyLCAwLjk0MjUyLCAwLjk1NjEyLCAwLjg3NTMsIDEuMDI5ODgsIDAuOTI3MzMsIDAuOTQyNTIsIDAuODc0MTEsIDAuODQwMjEsIDAuODcyOCwgMC45NTYxMiwgMC43NDA4MSwgMC44NzUzLCAxLjAyMTg5LCAxLjAyOTg4LCAwLjg0ODE0LCAwLjg3NDQ1LCAwLjkxODIyLCAwLjg0NzIzLCAwLjg1NjY4LCAwLjg2MzMxLCAwLjgxMzQ0LCAwLjg3NTgxLCAwLjc2NDIyLCAwLjgyMDQ2LCAwLjk2MDU3LCAwLjkyNzMzLCAwLjk5Mzc1LCAwLjc4MDIyLCAwLjk1NDUyLCAwLjg2MDE1LCAxLjAyOTg4LCAwLjkyNzMzLCAwLjg2MzMxLCAwLjkyNzMzLCAwLjg2MDE1LCAwLjczMTMzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjkwNjMxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjg4MzIzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjg1MTc0LCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk2MDY4LCAwLjk1Nzk0LCAwLjk2MDY4LCAwLjk1Nzk0LCAwLjk2MDY4LCAwLjk1Nzk0LCAwLjc3ODkyLCAwLjg0NTQ4LCAxLCAxLCAwLjg5NTUyLCAwLjkwNTI3LCAxLCAwLjkwMzYzLCAwLjkyNzk0LCAwLjkyNzk0LCAwLjkyNzk0LCAwLjg5ODA3LCAwLjg3MDEyLCAwLjg3MDEyLCAwLjg3MDEyLCAwLjg5NTUyLCAwLjg5NTUyLCAxLjQyMjU5LCAwLjcxMDk0LCAxLjA2MTUyLCAxLCAxLCAxLjAzMzcyLCAxLjAzMzcyLCAwLjk3MTcxLCAxLjQ5NTYsIDIuMjgwNywgMC45Mjk3MiwgMC44MzQwNiwgMC45MTEzMywgMC44MzMyNiwgMC45MTEzMywgMSwgMSwgMSwgMC43MjAyMSwgMSwgMS4yMzEwOCwgMC44MzQ4OSwgMC44ODUyNSwgMC44ODUyNSwgMC44MTQ5OSwgMC45MDYxNiwgMS44MTA1NSwgMC45MDUyNywgMS44MTA1NSwgMS4zMTA3LCAxLjUzNzExLCAwLjk0NDM0LCAxLjA4Njk2LCAxLCAwLjk1MDE4LCAwLjc3MTkyLCAwLjg1Mjg0LCAwLjkwNzQ3LCAxLjE3NTM0LCAwLjY5ODI1LCAwLjk3MTYsIDEuMzcwNzcsIDAuOTA3NDcsIDAuOTA3NDcsIDAuODUzNTYsIDAuOTA3NDcsIDAuOTA3NDcsIDEuNDQ5NDcsIDAuODUyODQsIDAuODk0MSwgMC44OTQxLCAwLjcwNTcyLCAwLjgsIDAuNzA1NzIsIDAuNzA1NzIsIDAuNzA1NzIsIDAuNzA1NzIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTk4NjIsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEuMDgwMDQsIDAuOTEwMjcsIDEsIDEsIDEsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTA3MjcsIDAuOTA3MjcsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBDYWxpYnJpQm9sZEl0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yMjA3LAogIGxpbmVHYXA6IDAuMjIwNwp9Owpjb25zdCBDYWxpYnJpSXRhbGljRmFjdG9ycyA9IFsxLjM4NzcsIDEsIDEsIDEsIDEuMTcyMjMsIDEuMTI5MywgMC44OTU1MiwgMC45MTEzMywgMC44MDM5NSwgMS4wMjI2OSwgMS4xNTYwMSwgMC45MTA1NiwgMC45MTA1NiwgMS4yNzk4LCAwLjg1Mjg0LCAwLjg5ODA3LCAxLCAwLjkwODYxLCAxLjM5NTQzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjk2MzA5LCAwLjk2MzA5LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjgzMzE5LCAwLjg4MDcxLCAwLjg2NzUsIDAuODE1NTIsIDAuNzIzNDYsIDAuODUxOTMsIDAuNzMyMDYsIDAuNzUyMiwgMC44MTEwNSwgMC44NjI3NSwgMC45MDY4NSwgMC42Mzc3LCAwLjc3ODkyLCAwLjc1NTkzLCAxLjAyNjM4LCAwLjg5MjQ5LCAwLjg0MTE4LCAwLjc3NDUyLCAwLjg1Mzc0LCAwLjc1MTg2LCAwLjY3Nzg5LCAwLjc5Nzc2LCAwLjg4ODQ0LCAwLjg1MDY2LCAwLjk0MzA5LCAwLjc3ODE4LCAwLjczMDYsIDAuNzY2NTksIDEuMTAzNjksIDEuMzgzMTMsIDEuMTAzNjksIDEuMDYxMzksIDAuODk1NTIsIDAuODczOSwgMC45MjQ1LCAwLjkyNDUsIDAuODMyMDMsIDAuOTI0NSwgMC44NTg2NSwgMS4wOTg0MiwgMC45MjQ1LCAwLjkyNDUsIDEuMDMyOTcsIDEuMDc2OTIsIDAuOTA5MTgsIDEuMDMyOTcsIDAuOTQ5NTksIDAuOTI0NSwgMC45MjI3NCwgMC45MjQ1LCAwLjkyNDUsIDEuMDI5MzMsIDAuNzc4MzIsIDEuMjA1NjIsIDAuOTI0NSwgMC44OTE2LCAwLjk4OTg2LCAwLjg2NjIxLCAwLjg5NDUzLCAwLjc5MDA0LCAwLjk0MTUyLCAxLjc3MjU2LCAwLjk0MTUyLCAwLjg1Mjg0LCAwLjk3ODAxLCAwLjg5NTUyLCAwLjkxMTMzLCAwLjg5NTUyLCAwLjkxMTMzLCAxLjkxNzI5LCAwLjg5NTUyLCAxLjE3ODg5LCAxLjEzMjU0LCAxLjE2MzU5LCAwLjkyMDk4LCAwLjg1Mjg0LCAwLjY4Nzg3LCAwLjcxMzUzLCAwLjg0NzM3LCAwLjkwNzQ3LCAxLjAwODgsIDEuMDA0NCwgMC44NzY4MywgMSwgMS4wOTA5MSwgMSwgMC45MjIyOSwgMC43MzksIDEuMTU2NDIsIDAuOTIwOTgsIDAuNzYyODgsIDAuODA1MDQsIDAuODA5NzIsIDAuNzU4NTksIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuNzYzMTgsIDAuNzIzNDYsIDAuNzMyMDYsIDAuNzMyMDYsIDAuNzMyMDYsIDAuNzMyMDYsIDAuOTA2ODUsIDAuOTA2ODUsIDAuOTA2ODUsIDAuOTA2ODUsIDAuODY0NzcsIDAuODkyNDksIDAuODQxMTgsIDAuODQxMTgsIDAuODQxMTgsIDAuODQxMTgsIDAuODQxMTgsIDAuODUyODQsIDAuODQ1NTcsIDAuODg4NDQsIDAuODg4NDQsIDAuODg4NDQsIDAuODg4NDQsIDAuNzMwNiwgMC43NzQ1MiwgMC44NjMzMSwgMC45MjQ1LCAwLjkyNDUsIDAuOTI0NSwgMC45MjQ1LCAwLjkyNDUsIDAuOTI0NSwgMC44NDg0MywgMC44MzIwMywgMC44NTg2NSwgMC44NTg2NSwgMC44NTg2NSwgMC44NTg2NSwgMC44MjYwMSwgMC44MjYwMSwgMC44MjYwMSwgMC44MjYwMSwgMC45NDQ2OSwgMC45MjQ1LCAwLjkyMjc0LCAwLjkyMjc0LCAwLjkyMjc0LCAwLjkyMjc0LCAwLjkyMjc0LCAwLjkwNzQ3LCAwLjg2NjUxLCAwLjkyNDUsIDAuOTI0NSwgMC45MjQ1LCAwLjkyNDUsIDAuODk0NTMsIDAuOTI0NSwgMC44OTQ1MywgMC44Njc1LCAwLjkyNDUsIDAuODY3NSwgMC45MjQ1LCAwLjg2NzUsIDAuOTI0NSwgMC43MjM0NiwgMC44MzIwMywgMC43MjM0NiwgMC44MzIwMywgMC43MjM0NiwgMC44MzIwMywgMC43MjM0NiwgMC44MzIwMywgMC44NTE5MywgMC44ODc1LCAwLjg2NDc3LCAwLjk5MDM0LCAwLjczMjA2LCAwLjg1ODY1LCAwLjczMjA2LCAwLjg1ODY1LCAwLjczMjA2LCAwLjg1ODY1LCAwLjczMjA2LCAwLjg1ODY1LCAwLjczMjA2LCAwLjg1ODY1LCAwLjgxMTA1LCAwLjkyNDUsIDAuODExMDUsIDAuOTI0NSwgMC44MTEwNSwgMC45MjQ1LCAxLCAxLCAwLjg2Mjc1LCAwLjkyNDUsIDAuOTA4NzIsIDAuOTM1OTEsIDAuOTA2ODUsIDAuODI2MDEsIDAuOTA2ODUsIDAuODI2MDEsIDAuOTA2ODUsIDAuODI2MDEsIDAuOTA2ODUsIDEuMDMyOTcsIDAuOTA2ODUsIDAuODI2MDEsIDAuNzc4OTYsIDEuMDU2MTEsIDAuNjM3NywgMS4wNzY5MiwgMSwgMSwgMC45MDkxOCwgMC43NTU5MywgMS4wMzI5NywgMSwgMSwgMC43NjAzMiwgMC45Mzc1LCAwLjk4MTU2LCAwLjkzNDA3LCAwLjc3MjYxLCAxLjExNDI5LCAwLjg5MjQ5LCAwLjkyNDUsIDEsIDEsIDAuODkyNDksIDAuOTI0NSwgMC45MjUzNCwgMC44NjY5OCwgMC45MjQ1LCAwLjg0MTE4LCAwLjkyMjc0LCAwLjg0MTE4LCAwLjkyMjc0LCAwLjg0MTE4LCAwLjkyMjc0LCAwLjg2NjcsIDAuODYyOTEsIDAuNzUxODYsIDEuMDI5MzMsIDEsIDEsIDAuNzUxODYsIDEuMDI5MzMsIDAuNjc3ODksIDAuNzc4MzIsIDAuNjc3ODksIDAuNzc4MzIsIDAuNjc3ODksIDAuNzc4MzIsIDAuNjc3ODksIDAuNzc4MzIsIDEsIDEsIDAuNzk3NzYsIDAuOTc2NTUsIDAuNzk3NzYsIDEuMjMwMjMsIDAuODg4NDQsIDAuOTI0NSwgMC44ODg0NCwgMC45MjQ1LCAwLjg4ODQ0LCAwLjkyNDUsIDAuODg4NDQsIDAuOTI0NSwgMC44ODg0NCwgMC45MjQ1LCAwLjg4ODQ0LCAwLjkyNDUsIDAuOTQzMDksIDAuOTg5ODYsIDAuNzMwNiwgMC44OTQ1MywgMC43MzA2LCAwLjc2NjU5LCAwLjc5MDA0LCAwLjc2NjU5LCAwLjc5MDA0LCAwLjc2NjU5LCAwLjc5MDA0LCAxLjA5MjMxLCAwLjU0ODczLCAwLjg2NzUsIDAuOTI0NSwgMC43NjMxOCwgMC44NDg0MywgMC44NDU1NywgMC44NjY1MSwgMSwgMSwgMC43OTc3NiwgMS4yMDU2MiwgMS4xODYyMiwgMS4xODYyMiwgMSwgMS4xNDM3LCAwLjY3MDA5LCAwLjk2MzM0LCAwLjkzNjk1LCAxLjM1MTkxLCAxLjQwOTA5LCAwLjk1MTYxLCAxLjQ4Mzg3LCAwLjg2NzUsIDAuOTA4NjEsIDAuNjE5MiwgMC43MzYzLCAwLjY0ODI0LCAwLjgyNDExLCAwLjU2MzIxLCAwLjg1Njk2LCAxLjIzNTE2LCAwLjg2NzUsIDAuODE1NTIsIDAuNzI4NiwgMC44NDEzNCwgMC43MzIwNiwgMC43NjY1OSwgMC44NjI3NSwgMC44NDM2OSwgMC45MDY4NSwgMC43Nzg5MiwgMC44NTg3MSwgMS4wMjYzOCwgMC44OTI0OSwgMC43NTgyOCwgMC44NDExOCwgMC44NTk4NCwgMC43NzQ1MiwgMC43NjQ2NiwgMC43OTc3NiwgMC43MzA2LCAwLjkwNzgyLCAwLjc3ODE4LCAwLjkwMywgMC44NzI5MSwgMC45MDY4NSwgMC43MzA2LCAwLjk5MDU4LCAxLjAzNjY3LCAwLjk0NjM1LCAxLjIzNTE2LCAwLjk4NDksIDAuOTkwNTgsIDAuOTIzOTMsIDAuODkxNiwgMC45NDIsIDEuMDM2NjcsIDAuNzUwMjYsIDAuOTQ2MzUsIDEuMDI5NywgMS4yMzUxNiwgMC45MDkxOCwgMC45NDA0OCwgMC45ODIxNywgMC44OTc0NiwgMC44NDE1MywgMC45MjI3NCwgMC44MjUwNywgMC44ODgzMiwgMC44NDQzOCwgMC44ODE3OCwgMS4wMzUyNSwgMC45ODQ5LCAxLjAwMjI1LCAwLjc4MDg2LCAwLjk3MjQ4LCAwLjg5NDA0LCAxLjIzNTE2LCAwLjk4NDksIDAuOTIyNzQsIDAuOTg0OSwgMC44OTQwNCwgMC43MzIwNiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44OTY5MywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44NTg2NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDkzMywgMSwgMSwgMSwgMSwgMSwgMSwgMC45NDMwOSwgMC45ODk4NiwgMC45NDMwOSwgMC45ODk4NiwgMC45NDMwOSwgMC45ODk4NiwgMC43MzA2LCAwLjg5NDUzLCAxLCAxLCAwLjg5NTUyLCAwLjkwNTI3LCAxLCAwLjkwMTg2LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjI1NjYsIDEuMjU2NiwgMS4yNTY2LCAwLjg5NTUyLCAwLjg5NTUyLCAxLjQyMjU5LCAwLjY4OTk0LCAxLjAzODA5LCAxLCAxLCAxLjAxNzYsIDEuMDE3NiwgMS4xMTUyMywgMS40OTU2LCAyLjAxNDYyLCAwLjk3ODU4LCAwLjgyNjE2LCAwLjkxMTMzLCAwLjgzNDM3LCAwLjkxMTMzLCAxLCAxLCAxLCAwLjcwNTA4LCAxLCAxLjIzMTA4LCAwLjc5ODAxLCAwLjg0NDI2LCAwLjg0NDI2LCAwLjc3NCwgMC45MDU3MiwgMS44MTA1NSwgMC45MDc0OSwgMS44MTA1NSwgMS4yODgwOSwgMS41NTQ2OSwgMC45NDQzNCwgMS4wNzgwNiwgMSwgMC45NzA5NCwgMC43NTg5LCAwLjg1Mjg0LCAwLjkwNzQ3LCAxLjE5NjU4LCAwLjY5ODI1LCAwLjk3NjIyLCAxLjMzNTEyLCAwLjkwNzQ3LCAwLjkwNzQ3LCAwLjg1Mjg0LCAwLjkwNzQ3LCAwLjkwNzQ3LCAxLjQ0OTQ3LCAwLjg1Mjg0LCAwLjg5NDEsIDAuODk0MSwgMC43MDU3MiwgMC44LCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjAzMzYsIDAuOTEwMjcsIDEsIDEsIDEsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDU4NTksIDEuMDU4NTksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBDYWxpYnJpSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIyMDcsCiAgbGluZUdhcDogMC4yMjA3Cn07CmNvbnN0IENhbGlicmlSZWd1bGFyRmFjdG9ycyA9IFsxLjM4NzcsIDEsIDEsIDEsIDEuMTcyMjMsIDEuMTI5MywgMC44OTU1MiwgMC45MTEzMywgMC44MDM5NSwgMS4wMjI2OSwgMS4xNTYwMSwgMC45MTA1NiwgMC45MTA1NiwgMS4yNzk4LCAwLjg1Mjg0LCAwLjg5ODA3LCAxLCAwLjkwODYxLCAxLjM5MDE2LCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjk2MzA5LCAwLjk2MzA5LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjgzMzE5LCAwLjg4MDcxLCAwLjg2NzUsIDAuODE1NTIsIDAuNzM4MzQsIDAuODUxOTMsIDAuNzMyMDYsIDAuNzUyMiwgMC44MTEwNSwgMC44NjI3NSwgMC45MDY4NSwgMC42Mzc3LCAwLjc3ODkyLCAwLjc1NTkzLCAxLjAyNjM4LCAwLjg5Mzg1LCAwLjg1MTIyLCAwLjc3NDUyLCAwLjg2NTAzLCAwLjc1MTg2LCAwLjY4ODg3LCAwLjc5Nzc2LCAwLjg4ODQ0LCAwLjg1MDY2LCAwLjk0MjU4LCAwLjc3ODE4LCAwLjczMDYsIDAuNzY2NTksIDEuMTAzNjksIDEuMzkwMTYsIDEuMTAzNjksIDEuMDYxMzksIDAuODk1NTIsIDAuODczOSwgMC44NjEyOCwgMC45NDQ2OSwgMC44NDU3LCAwLjk0NDY5LCAwLjg5NDY0LCAxLjA5ODQyLCAwLjg0NjM2LCAwLjk0NDY5LCAxLjAzMjk3LCAxLjA3NjkyLCAwLjkwOTE4LCAxLjAzMjk3LCAwLjk1ODk3LCAwLjk0NDY5LCAwLjk0ODIsIDAuOTQ0NjksIDAuOTQ0NjksIDEuMDQ2OTIsIDAuNzgyMjMsIDEuMjA1NjIsIDAuOTQ0NjksIDAuOTAzMzIsIDAuOTg5ODYsIDAuODY2MjEsIDAuOTA1MjcsIDAuNzkwMDQsIDAuOTQxNTIsIDEuNzcyNTYsIDAuOTQxNTIsIDAuODUyODQsIDAuOTc4MDEsIDAuODk1NTIsIDAuOTExMzMsIDAuODk1NTIsIDAuOTExMzMsIDEuOTE3MjksIDAuODk1NTIsIDEuMTc4ODksIDEuMTMyNTQsIDEuMDg3MDcsIDAuOTIwOTgsIDAuODUyODQsIDAuNjg3ODcsIDAuNzEzNTMsIDAuODQ3MzcsIDAuOTA3NDcsIDEuMDA4OCwgMS4wMDQ0LCAwLjg3NjgzLCAxLCAxLjA5MDkxLCAxLCAwLjkyMjI5LCAwLjczOSwgMS4xNTY0MiwgMC45MjA5OCwgMC43NjI4OCwgMC44MDUwNCwgMC44MDk3MiwgMC43NTg1OSwgMC44Njc1LCAwLjg2NzUsIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuODY3NSwgMC43NjMxOCwgMC43MzgzNCwgMC43MzIwNiwgMC43MzIwNiwgMC43MzIwNiwgMC43MzIwNiwgMC45MDY4NSwgMC45MDY4NSwgMC45MDY4NSwgMC45MDY4NSwgMC44NjQ3NywgMC44OTM4NSwgMC44NTEyMiwgMC44NTEyMiwgMC44NTEyMiwgMC44NTEyMiwgMC44NTEyMiwgMC44NTI4NCwgMC44NTMxMSwgMC44ODg0NCwgMC44ODg0NCwgMC44ODg0NCwgMC44ODg0NCwgMC43MzA2LCAwLjc3NDUyLCAwLjg2MzMxLCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2OTMsIDAuODQ1NywgMC44OTQ2NCwgMC44OTQ2NCwgMC44OTQ2NCwgMC44OTQ2NCwgMC44MjYwMSwgMC44MjYwMSwgMC44MjYwMSwgMC44MjYwMSwgMC45NDQ2OSwgMC45NDQ2OSwgMC45NDgyLCAwLjk0ODIsIDAuOTQ4MiwgMC45NDgyLCAwLjk0ODIsIDAuOTA3NDcsIDAuODY2NTEsIDAuOTQ0NjksIDAuOTQ0NjksIDAuOTQ0NjksIDAuOTQ0NjksIDAuOTA1MjcsIDAuOTQ0NjksIDAuOTA1MjcsIDAuODY3NSwgMC44NjEyOCwgMC44Njc1LCAwLjg2MTI4LCAwLjg2NzUsIDAuODYxMjgsIDAuNzM4MzQsIDAuODQ1NywgMC43MzgzNCwgMC44NDU3LCAwLjczODM0LCAwLjg0NTcsIDAuNzM4MzQsIDAuODQ1NywgMC44NTE5MywgMC45MjQ1NCwgMC44NjQ3NywgMC45OTIxLCAwLjczMjA2LCAwLjg5NDY0LCAwLjczMjA2LCAwLjg5NDY0LCAwLjczMjA2LCAwLjg5NDY0LCAwLjczMjA2LCAwLjg5NDY0LCAwLjczMjA2LCAwLjg5NDY0LCAwLjgxMTA1LCAwLjg0NjM2LCAwLjgxMTA1LCAwLjg0NjM2LCAwLjgxMTA1LCAwLjg0NjM2LCAxLCAxLCAwLjg2Mjc1LCAwLjk0NDY5LCAwLjkwODcyLCAwLjk1Nzg2LCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAxLjAzMjk3LCAwLjkwNjg1LCAwLjgyNjAxLCAwLjc3NzQxLCAxLjA1NjExLCAwLjYzNzcsIDEuMDc2OTIsIDEsIDEsIDAuOTA5MTgsIDAuNzU1OTMsIDEuMDMyOTcsIDEsIDEsIDAuNzYwMzIsIDAuOTA0NTIsIDAuOTgxNTYsIDEuMTE4NDIsIDAuNzcyNjEsIDEuMTE0MjksIDAuODkzODUsIDAuOTQ0NjksIDEsIDEsIDAuODkzODUsIDAuOTQ0NjksIDAuOTU4NzcsIDAuODY5MDEsIDAuOTQ0NjksIDAuODUxMjIsIDAuOTQ4MiwgMC44NTEyMiwgMC45NDgyLCAwLjg1MTIyLCAwLjk0ODIsIDAuODY2NywgMC45MDAxNiwgMC43NTE4NiwgMS4wNDY5MiwgMSwgMSwgMC43NTE4NiwgMS4wNDY5MiwgMC42ODg4NywgMC43ODIyMywgMC42ODg4NywgMC43ODIyMywgMC42ODg4NywgMC43ODIyMywgMC42ODg4NywgMC43ODIyMywgMSwgMSwgMC43OTc3NiwgMC45MjE4OCwgMC43OTc3NiwgMS4yMzAyMywgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC45NDI1OCwgMC45ODk4NiwgMC43MzA2LCAwLjkwNTI3LCAwLjczMDYsIDAuNzY2NTksIDAuNzkwMDQsIDAuNzY2NTksIDAuNzkwMDQsIDAuNzY2NTksIDAuNzkwMDQsIDEuMDkyMzEsIDAuNTQ4NzMsIDAuODY3NSwgMC44NjEyOCwgMC43NjMxOCwgMC44NjkzLCAwLjg1MzExLCAwLjg2NjUxLCAxLCAxLCAwLjc5Nzc2LCAxLjIwNTYyLCAxLjE4NjIyLCAxLjE4NjIyLCAxLCAxLjE0MzcsIDAuNjc3NDIsIDAuOTYzMzQsIDAuOTM2OTUsIDEuMzUxOTEsIDEuNDA5MDksIDAuOTUxNjEsIDEuNDgzODcsIDAuODY2ODYsIDAuOTA4NjEsIDAuNjIyNjcsIDAuNzQzNTksIDAuNjU2NDksIDAuODU0OTgsIDAuNTY5NjMsIDAuODgyNTQsIDEuMjM1MTYsIDAuODY3NSwgMC44MTU1MiwgMC43NTQ0MywgMC44NDUwMywgMC43MzIwNiwgMC43NjY1OSwgMC44NjI3NSwgMC44NTEyMiwgMC45MDY4NSwgMC43Nzg5MiwgMC44NTc0NiwgMS4wMjYzOCwgMC44OTM4NSwgMC43NTY1NywgMC44NTEyMiwgMC44NjI3NSwgMC43NzQ1MiwgMC43NDE3MSwgMC43OTc3NiwgMC43MzA2LCAwLjk1MTY1LCAwLjc3ODE4LCAwLjg5NzcyLCAwLjg4ODMxLCAwLjkwNjg1LCAwLjczMDYsIDAuOTgxNDIsIDEuMDIxOTEsIDAuOTY1NzYsIDEuMjM1MTYsIDAuOTkwMTgsIDAuOTgxNDIsIDAuOTIzNiwgMC44OTI1OCwgMC45NDAzNSwgMS4wMjE5MSwgMC43ODg0OCwgMC45NjU3NiwgMC45NTYxLCAxLjIzNTE2LCAwLjkwOTE4LCAwLjkyNTc4LCAwLjk1NDI0LCAwLjg5NzQ2LCAwLjgzOTY5LCAwLjk0ODIsIDAuODAxMTMsIDAuODk0NDIsIDAuODUyMDgsIDAuODYxNTUsIDAuOTgwMjIsIDAuOTkwMTgsIDEuMDA0NTIsIDAuODEyMDksIDAuOTkyNDcsIDAuODkxODEsIDEuMjM1MTYsIDAuOTkwMTgsIDAuOTQ4MiwgMC45OTAxOCwgMC44OTE4MSwgMC43MzIwNiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44ODg0NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44OTQ2NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45Njc2NiwgMSwgMSwgMSwgMSwgMSwgMSwgMC45NDI1OCwgMC45ODk4NiwgMC45NDI1OCwgMC45ODk4NiwgMC45NDI1OCwgMC45ODk4NiwgMC43MzA2LCAwLjkwNTI3LCAxLCAxLCAwLjg5NTUyLCAwLjkwNTI3LCAxLCAwLjkwMTg2LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjI1NjYsIDEuMjU2NiwgMS4yNTY2LCAwLjg5NTUyLCAwLjg5NTUyLCAxLjQyMjU5LCAwLjY5MDQzLCAxLjAzODA5LCAxLCAxLCAxLjAxNzYsIDEuMDE3NiwgMS4xMTUyMywgMS40OTU2LCAyLjAxNDYyLCAwLjk5MzMxLCAwLjgyNjE2LCAwLjkxMTMzLCAwLjg0Mjg2LCAwLjkxMTMzLCAxLCAxLCAxLCAwLjcwNTA4LCAxLCAxLjIzMTA4LCAwLjc5ODAxLCAwLjg0NDI2LCAwLjg0NDI2LCAwLjc3NCwgMC45MDUyNywgMS44MTA1NSwgMC45MDUyNywgMS44MTA1NSwgMS4yODgwOSwgMS41NTQ2OSwgMC45NDQzNCwgMS4wNzgwNiwgMSwgMC45NzA5NCwgMC43NTg5LCAwLjg1Mjg0LCAwLjkwNzQ3LCAxLjE5NjU4LCAwLjY5ODI1LCAwLjk3NjIyLCAxLjMzNTEyLCAwLjkwNzQ3LCAwLjkwNzQ3LCAwLjg1MzU2LCAwLjkwNzQ3LCAwLjkwNzQ3LCAxLjQ0OTQ3LCAwLjg1Mjg0LCAwLjg5NDEsIDAuODk0MSwgMC43MDU3MiwgMC44LCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjAzMzYsIDAuOTEwMjcsIDEsIDEsIDEsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDU4NTksIDEuMDU4NTksIDEsIDEsIDEsIDEuMDcxODUsIDAuOTk0MTMsIDAuOTYzMzQsIDEuMDgwNjUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBDYWxpYnJpUmVndWxhck1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yMjA3LAogIGxpbmVHYXA6IDAuMjIwNwp9OwoKOy8vIC4vc3JjL2NvcmUvaGVsdmV0aWNhX2ZhY3RvcnMuanMKY29uc3QgSGVsdmV0aWNhQm9sZEZhY3RvcnMgPSBbMC43NjExNiwgMSwgMSwgMS4wMDA2LCAwLjk5OTk4LCAwLjk5OTc0LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTgyLCAwLjk5OTc3LCAxLjAwMDg3LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTU5LCAxLjAwMDAzLCAxLjAwMDYsIDAuOTk5OTgsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTk4LCAxLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDI2LCAwLjk5OTksIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3NywgMS4wMDAyNiwgMC45OTk5OSwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAwMSwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAxNiwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk5OCwgMS4wMDA2LCAwLjk5OTk4LCAxLjAwMDAzLCAwLjk5OTczLCAwLjk5OTk4LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMS4wMDA2LCAwLjk5OTgyLCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTU5LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTU5LCAxLjAwMDc3LCAwLjk5OTU5LCAxLjAwMDAzLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDc3LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI1LCAwLjk5OTY4LCAwLjk5OTczLCAxLjAwMDAzLCAxLjAwMDI1LCAwLjYwMjk5LCAxLjAwMDI0LCAxLjA2NDA5LCAxLCAxLCAwLjk5OTk4LCAxLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5OTgsIDEsIDAuOTk5MzYsIDAuOTk5NzMsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMjYsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAwMywgMS4wMDAyMiwgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjA2NDA5LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAxLjAzMzc0LCAwLjk5OTc3LCAxLjAwMDI2LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNDIsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3MywgMC45OTk3MywgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwMjYsIDEuMDM4MjgsIDEuMDAwMjYsIDAuOTk5OTksIDEuMDAwMjYsIDEuMDAwNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTkzLCAwLjk5OTgsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEsIDEuMDAwMTYsIDAuOTk5NzcsIDAuOTk5NTksIDAuOTk5NzcsIDAuOTk5NTksIDAuOTk5NzcsIDAuOTk5NTksIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMjYsIDAuOTk5OTgsIDEuMDAwMjYsIDAuODEyMSwgMS4wMDAyNiwgMC45OTk5OCwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMS4wMDAyNiwgMSwgMS4wMDAyNiwgMSwgMS4wMDAyNiwgMSwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLCAwLjk5OTgyLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAxLjAwMDM0LCAwLjk5OTc3LCAxLCAwLjk5OTk3LCAxLjAwMDI2LCAxLjAwMDc4LCAxLjAwMDM2LCAwLjk5OTczLCAxLjAwMDEzLCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5ODgsIDAuODUxNDgsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwNiwgMC45OTk3NywgMS4wMDAwMSwgMC45OTk5OSwgMC45OTk3NywgMS4wMDA2OSwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDAwMSwgMC45OTk4NCwgMS4wMDAyNiwgMS4wMDAwMSwgMS4wMDAyNCwgMS4wMDAwMSwgMC45OTk5LCAxLCAxLjAwMDYsIDEuMDAwMDEsIDEuMDAwNDEsIDAuOTk5NjIsIDEuMDAwMjYsIDEuMDAwNiwgMC45OTk5NSwgMS4wMDA0MSwgMC45OTk0MiwgMC45OTk3MywgMC45OTkyNywgMS4wMDA4MiwgMC45OTkwMiwgMS4wMDAyNiwgMS4wMDA4NywgMS4wMDA2LCAxLjAwMDY5LCAwLjk5OTczLCAwLjk5ODY3LCAwLjk5OTczLCAwLjk5OTMsIDEuMDAwMjYsIDEuMDAwNDksIDEuMDAwNTYsIDEsIDAuOTk5ODgsIDAuOTk5MzUsIDAuOTk5OTUsIDAuOTk5NTQsIDEuMDAwNTUsIDAuOTk5NDUsIDEuMDAwMzIsIDEuMDAwNiwgMC45OTk5NSwgMS4wMDAyNiwgMC45OTk5NSwgMS4wMDAzMiwgMS4wMDAwMSwgMS4wMDAwOCwgMC45OTk3MSwgMS4wMDAxOSwgMC45OTk0LCAxLjAwMDAxLCAxLjAwMDYsIDEuMDAwNDQsIDAuOTk5NzMsIDEuMDAwMjMsIDEuMDAwNDcsIDEsIDAuOTk5NDIsIDAuOTk1NjEsIDAuOTk5ODksIDEuMDAwMzUsIDAuOTk5NzcsIDEuMDAwMzUsIDAuOTk5NzcsIDEuMDAwMTksIDAuOTk5NDQsIDEuMDAwMDEsIDEuMDAwMjEsIDAuOTk5MjYsIDEuMDAwMzUsIDEuMDAwMzUsIDAuOTk5NDIsIDEuMDAwNDgsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMzUsIDEuMDAwMDEsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5ODksIDEuMDAwNTcsIDEuMDAwMDEsIDAuOTk5MzYsIDEuMDAwNTIsIDEuMDAwMTIsIDAuOTk5OTYsIDEuMDAwNDMsIDEsIDEuMDAwMzUsIDAuOTk5NCwgMC45OTk3NiwgMS4wMDAzNSwgMC45OTk3MywgMS4wMDA1MiwgMS4wMDA0MSwgMS4wMDExOSwgMS4wMDAzNywgMC45OTk3MywgMS4wMDAwMiwgMC45OTk4NiwgMS4wMDA0MSwgMS4wMDA0MSwgMC45OTkwMiwgMC45OTk2LCAxLjAwMDM0LCAwLjk5OTk5LCAxLjAwMDI2LCAwLjk5OTk5LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDUyLCAwLjk5OTczLCAxLCAwLjk5OTczLCAxLjAwMDQxLCAxLjAwMDc1LCAwLjk5OTQsIDEuMDAwMywgMC45OTk5OSwgMSwgMS4wMDA0MSwgMC45OTk1NSwgMSwgMC45OTkxNSwgMC45OTk3MywgMC45OTk3MywgMS4wMDAyNiwgMS4wMDExOSwgMC45OTk1NSwgMC45OTk3MywgMS4wMDA2LCAwLjk5OTExLCAxLjAwMDYsIDEuMDAwMjYsIDAuOTk5NzIsIDEuMDAwMjYsIDAuOTk5MDIsIDEuMDAwNDEsIDAuOTk5NzMsIDAuOTk5OTksIDEsIDEsIDEuMDAwMzgsIDEuMDAwNSwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAwMSwgMC45OTk3MywgMSwgMSwgMC45OTk3MywgMSwgMSwgMC45OTk1NSwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTcyLCAxLCAxLCAxLjAwMTA2LCAwLjk5OTk5LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk5LCAwLjk5OTk4LCAxLjY2NDc1LCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDIzLCAwLjk5OTczLCAwLjk5OTcxLCAxLjAwMDQ3LCAxLjAwMDIzLCAxLCAwLjk5OTkxLCAwLjk5OTg0LCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5OTcyLCAxLCAxLjIwOTg1LCAxLjM5NzEzLCAxLjAwMDAzLCAxLjAwMDMxLCAxLjAwMDE1LCAxLCAwLjk5NTYxLCAxLjAwMDI3LCAxLjAwMDMxLCAxLjAwMDMxLCAwLjk5OTE1LCAxLjAwMDMxLCAxLjAwMDMxLCAwLjk5OTk5LCAxLjAwMDAzLCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQxMTQ0LCAxLjYsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDA1NzksIDEuNDA1NzksIDEuMzY2MjUsIDAuOTk5OTksIDEsIDAuOTk4NjEsIDAuOTk4NjEsIDEsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDAuOTk5NzIsIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDEuNDA0ODMsIDEsIDAuOTk5NzcsIDEuMDAwNTQsIDEsIDEsIDAuOTk5NTMsIDAuOTk5NjIsIDEuMDAwNDIsIDAuOTk5NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IEhlbHZldGljYUJvbGRNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMiwKICBsaW5lR2FwOiAwLjIKfTsKY29uc3QgSGVsdmV0aWNhQm9sZEl0YWxpY0ZhY3RvcnMgPSBbMC43NjExNiwgMSwgMSwgMS4wMDA2LCAwLjk5OTk4LCAwLjk5OTc0LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTgyLCAwLjk5OTc3LCAxLjAwMDg3LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTU5LCAxLjAwMDAzLCAxLjAwMDYsIDAuOTk5OTgsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTk4LCAxLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDI2LCAwLjk5OTksIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3NywgMS4wMDAyNiwgMC45OTk5OSwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAwMSwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAxNiwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk5OCwgMS4wMDA2LCAwLjk5OTk4LCAxLjAwMDAzLCAwLjk5OTczLCAwLjk5OTk4LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMS4wMDA2LCAwLjk5OTgyLCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTU5LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTU5LCAxLjAwMDc3LCAwLjk5OTU5LCAxLjAwMDAzLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDc3LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI1LCAwLjk5OTY4LCAwLjk5OTczLCAxLjAwMDAzLCAxLjAwMDI1LCAwLjYwMjk5LCAxLjAwMDI0LCAxLjA2NDA5LCAxLCAxLCAwLjk5OTk4LCAxLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5OTgsIDEsIDAuOTk5MzYsIDAuOTk5NzMsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMjYsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAwMywgMS4wMDAyMiwgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjA2NDA5LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAxLjAwNDQsIDAuOTk5NzcsIDEuMDAwMjYsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MSwgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMS4wMTAxMSwgMS4wMDAyNiwgMC45OTk5OSwgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTMsIDAuOTk5OCwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMSwgMS4wMDAxNiwgMC45OTk3NywgMC45OTk1OSwgMC45OTk3NywgMC45OTk1OSwgMC45OTk3NywgMC45OTk1OSwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk5OCwgMS4wMDAyNiwgMC44MTIxLCAxLjAwMDI2LCAwLjk5OTk4LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAxLjAwMDE2LCAxLjAwMDIyLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzcsIDAuOTk5NzMsIDEsIDAuOTk5ODIsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMjYsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5NzcsIDEsIDEsIDEuMDAwMjYsIDAuOTk5NjksIDAuOTk5NzIsIDAuOTk5ODEsIDAuOTk5OCwgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDIyLCAwLjkxMTU1LCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDYsIDAuOTk5NzcsIDEuMDAwMDEsIDAuOTk5OTksIDAuOTk5NzcsIDAuOTk5NjYsIDEuMDAwMjIsIDEuMDAwMzIsIDEuMDAwMDEsIDAuOTk5NDQsIDEuMDAwMjYsIDEuMDAwMDEsIDAuOTk5NjgsIDEuMDAwMDEsIDEuMDAwNDcsIDEsIDEuMDAwNiwgMS4wMDAwMSwgMC45OTk4MSwgMS4wMDEwMSwgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTQ4LCAwLjk5OTgxLCAxLjAwMDY0LCAwLjk5OTczLCAwLjk5OTQyLCAxLjAwMTAxLCAxLjAwMDYxLCAxLjAwMDI2LCAxLjAwMDY5LCAxLjAwMDYsIDEuMDAwMTQsIDAuOTk5NzMsIDEuMDEzMjIsIDAuOTk5NzMsIDEuMDAwNjUsIDEuMDAwMjYsIDEuMDAwMTIsIDAuOTk5MjMsIDEsIDEuMDAwNjQsIDEuMDAwNzYsIDAuOTk5NDgsIDEuMDAwNTUsIDEuMDAwNjMsIDEuMDAwMDcsIDAuOTk5NDMsIDEuMDAwNiwgMC45OTk0OCwgMS4wMDAyNiwgMC45OTk0OCwgMC45OTk0MywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyOSwgMS4wMDAzOCwgMS4wMDAzNSwgMS4wMDAwMSwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzgsIDEuMDAwMDEsIDEuMDAwNTcsIDAuOTk5ODksIDAuOTk5NjcsIDAuOTk5NjQsIDAuOTk5NjcsIDAuOTk5NzcsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMzgsIDAuOTk5NzcsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwNjYsIDAuOTk5NjcsIDAuOTk5NjcsIDEuMDAwNDEsIDAuOTk5OTgsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDAuOTk5NjcsIDEuMDAwMDEsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NjQsIDEuMDAwMzEsIDEuMDAwMDEsIDAuOTk5OTksIDAuOTk5OTksIDEsIDEuMDAwMjMsIDEsIDEsIDAuOTk5OTksIDEuMDAwMzUsIDEuMDAwMDEsIDAuOTk5OTksIDAuOTk5NzMsIDAuOTk5NzcsIDAuOTk5OTksIDEuMDAwNTgsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NTUsIDAuOTk5NSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAzMiwgMC45OTk4OSwgMS4wMDAzNCwgMC45OTk5OSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45OTk3MywgMC40NTk5OCwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk5OSwgMC45OTk4MiwgMC45OTk5NCwgMC45OTk5NiwgMSwgMS4wMDA0MiwgMS4wMDA0NCwgMS4wMDAyOSwgMS4wMDAyMywgMC45OTk3MywgMC45OTk3MywgMS4wMDAyNiwgMC45OTk0OSwgMS4wMDAwMiwgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3NSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAzMiwgMC45ODY4NSwgMC45OTk3MywgMS4wMDAyNiwgMSwgMSwgMC45OTk2NiwgMS4wMDA0NCwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAwMSwgMC45OTk3MywgMSwgMSwgMC45OTk3MywgMSwgMSwgMC45OTk1NSwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTcyLCAxLCAxLCAxLjAwMTA2LCAwLjk5OTk5LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk5LCAwLjk5OTk4LCAxLjY2NDc1LCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTczLCAwLjk5OTcxLCAwLjk5OTc4LCAxLCAxLCAwLjk5OTkxLCAwLjk5OTg0LCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDk4LCAxLCAxLCAxLCAxLjAwMDQ5LCAxLCAxLCAwLjk5OTcyLCAxLCAxLjIwOTg1LCAxLjM5NzEzLCAxLjAwMDAzLCAxLjAwMDMxLCAxLjAwMDE1LCAxLCAwLjk5NTYxLCAxLjAwMDI3LCAxLjAwMDMxLCAxLjAwMDMxLCAwLjk5OTE1LCAxLjAwMDMxLCAxLjAwMDMxLCAwLjk5OTk5LCAxLjAwMDAzLCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQxMTQ0LCAxLjYsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDA1NzksIDEuNDA1NzksIDEuMzY2MjUsIDAuOTk5OTksIDEsIDAuOTk4NjEsIDAuOTk4NjEsIDEsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDAuOTk5NzIsIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDEuNDA0ODMsIDEsIDAuOTk5NzcsIDEuMDAwNTQsIDEsIDEsIDAuOTk5NTMsIDAuOTk5NjIsIDEuMDAwNDIsIDAuOTk5NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IEhlbHZldGljYUJvbGRJdGFsaWNNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMzUsCiAgbGluZUdhcDogMC4yCn07CmNvbnN0IEhlbHZldGljYUl0YWxpY0ZhY3RvcnMgPSBbMC43NjExNiwgMSwgMSwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDEuMDAwMDEsIDEuMDAwNDMsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5NTksIDEuMDAwMDMsIDEuMDAwNiwgMC45OTk5OCwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMSwgMS4wMDAwMywgMS4wMDAwMywgMS4wMDAwMywgMC45OTk3MywgMC45OTk4NywgMS4wMDAwMSwgMS4wMDAwMSwgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAyNiwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDA2LCAxLCAxLjAwMDAxLCAwLjk5OTczLCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDAxLCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDE2LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTQ5LCAwLjk5OTczLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5MjQsIDAuOTk5MjQsIDEsIDAuOTk5MjQsIDAuOTk5OTksIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5OTgsIDEsIDEuMDAwNiwgMC45OTk3MywgMSwgMC45OTk3NywgMSwgMSwgMSwgMS4wMDAwNSwgMS4wMDA5LCAxLjAwMDA1LCAxLjAwMDAzLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDksIDAuOTk5NzMsIDAuOTk5OTgsIDEuMDAwMjUsIDAuOTk5NjgsIDAuOTk5NzMsIDEuMDAwMDMsIDEuMDAwMjUsIDAuNjAyOTksIDEuMDAwMjQsIDEuMDY0MDksIDEsIDEsIDAuOTk5OTgsIDEsIDAuOTk5OCwgMS4wMDA2LCAwLjk5OTk4LCAxLCAwLjk5OTM2LCAwLjk5OTczLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDI2LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMDMsIDEuMDAwMjIsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wNjQwOSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMSwgMC45OTk3MywgMSwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMS4wMjg4LCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5MjQsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTQ2LCAxLjAwMDM0LCAxLCAwLjk5OTI0LCAxLjAwMDAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAxLjA2MzExLCAwLjk5OTczLCAxLjAwMDI0LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDQxLCAwLjk5OTgsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEsIDEuMDAwMTYsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMC44OTU0NywgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAwLjk5OTI0LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLCAwLjk5OTgyLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDAxLCAxLCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDEuMDAwMDEsIDEsIDEuMDAwNTQsIDAuOTk5NzcsIDEuMDAwODQsIDEuMDAwMDcsIDAuOTk5NzMsIDEuMDAwMTMsIDAuOTk5MjQsIDEuMDAwMDEsIDEuMDAwMDEsIDAuOTk5NDUsIDAuOTEyMjEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwNiwgMS4wMDAwMSwgMS4wMDAwMSwgMC45OTk5OSwgMC45OTk3NywgMC45OTkzMywgMS4wMDAyMiwgMS4wMDA1NCwgMS4wMDAwMSwgMS4wMDA2NSwgMS4wMDAyNiwgMS4wMDAwMSwgMS4wMDAxLCAxLjAwMDAxLCAxLjAwMDUyLCAxLCAxLjAwMDYsIDEuMDAwMDEsIDAuOTk5NDUsIDAuOTk4OTcsIDAuOTk5NjgsIDAuOTk5MjQsIDEuMDAwMzYsIDAuOTk5NDUsIDAuOTk5NDksIDEsIDEuMDAwNiwgMC45OTg5NywgMC45OTkxOCwgMC45OTk2OCwgMC45OTkxMSwgMC45OTkyNCwgMSwgMC45OTk2MiwgMS4wMTQ4NywgMSwgMS4wMDA1LCAwLjk5OTczLCAxLjAwMDEyLCAxLjAwMDQzLCAxLCAwLjk5OTk1LCAwLjk5OTk0LCAxLjAwMDM2LCAwLjk5OTQ3LCAxLjAwMDE5LCAxLjAwMDYzLCAxLjAwMDI1LCAwLjk5OTI0LCAxLjAwMDM2LCAwLjk5OTczLCAxLjAwMDM2LCAxLjAwMDI1LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDI3LCAxLjAwMDEsIDEuMDAwNjgsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLCAxLjAwMDA4LCAwLjk5OTU3LCAwLjk5OTcyLCAwLjk5OTQsIDAuOTk5NTQsIDAuOTk5NzUsIDEuMDAwNTEsIDEuMDAwMDEsIDEuMDAwMTksIDEuMDAwMDEsIDEuMDAwMSwgMC45OTk4NiwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAzOCwgMC45OTk1NCwgMC45OTk1NCwgMC45OTk0LCAxLjAwMDY2LCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDU0LCAxLjAwMDAxLCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc1LCAxLjAwMDEsIDEuMDAwMDEsIDAuOTk5OTMsIDAuOTk5NSwgMC45OTk1NSwgMS4wMDAxNiwgMC45OTk3OCwgMC45OTk3NCwgMS4wMDAxOSwgMS4wMDAyMiwgMC45OTk1NSwgMS4wMDA1MywgMC45OTk3MywgMS4wMDA4OSwgMS4wMDAwNSwgMC45OTk2NywgMS4wMDA0OCwgMC45OTk3MywgMS4wMDAwMiwgMS4wMDAzNCwgMC45OTk3MywgMC45OTk3MywgMC45OTk2NCwgMS4wMDAwNiwgMS4wMDA2NiwgMC45OTk0NywgMC45OTk3MywgMC45ODg5NCwgMC45OTk3MywgMSwgMC40NDg5OCwgMSwgMC45OTk0NiwgMSwgMS4wMDAzOSwgMS4wMDA4MiwgMC45OTk5MSwgMC45OTk5MSwgMC45OTk4NSwgMS4wMDAyMiwgMS4wMDAyMywgMS4wMDA2MSwgMS4wMDAwNiwgMC45OTk2NiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDAxOSwgMS4wMDA4LCAxLCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTgzLCAxLjAwMDQ0LCAwLjk5OTczLCAwLjk5OTY0LCAwLjk4MzMyLCAxLCAwLjk5OTczLCAxLCAxLCAwLjk5OTYyLCAwLjk5ODk1LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLCAxLCAxLCAwLjk5OTczLCAxLCAxLCAwLjk5OTU1LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTcyLCAxLCAxLCAxLjAwMjY3LCAwLjk5OTk5LCAwLjk5OTk4LCAwLjk5OTk4LCAxLCAwLjk5OTk4LCAxLjY2NDc1LCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDIzLCAwLjk5OTczLCAxLjAwNDIzLCAwLjk5OTI1LCAwLjk5OTk5LCAxLCAwLjk5OTkxLCAwLjk5OTg0LCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDQ5LCAxLCAxLjAwMjQ1LCAxLCAxLCAxLCAxLCAwLjk2MzI5LCAxLCAxLjIwOTg1LCAxLjM5NzEzLCAxLjAwMDAzLCAwLjgyNTQsIDEuMDAwMTUsIDEsIDEuMDAwMzUsIDEuMDAwMjcsIDEuMDAwMzEsIDEuMDAwMzEsIDEuMDAwMDMsIDEuMDAwMzEsIDEuMDAwMzEsIDAuOTk5OTksIDEuMDAwMDMsIDAuOTk5OTksIDAuOTk5OTksIDEuNDExNDQsIDEuNiwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MDU3OSwgMS40MDU3OSwgMS4zNjYyNSwgMC45OTk5OSwgMSwgMC45OTg2MSwgMC45OTg2MSwgMSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45NTMxNywgMC45OTk5OSwgMC45OTk5OSwgMC45OTk5OSwgMC45OTk5OSwgMS40MDQ4MywgMSwgMC45OTk3NywgMS4wMDA1NCwgMSwgMSwgMC45OTk1MywgMC45OTk2MiwgMS4wMDA0MiwgMC45OTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgSGVsdmV0aWNhSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjM1LAogIGxpbmVHYXA6IDAuMgp9Owpjb25zdCBIZWx2ZXRpY2FSZWd1bGFyRmFjdG9ycyA9IFswLjc2MTE2LCAxLCAxLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMS4wMDAwMSwgMS4wMDA0MywgMC45OTk5OCwgMC45OTk5OCwgMC45OTk1OSwgMS4wMDAwMywgMS4wMDA2LCAwLjk5OTk4LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDAzLCAwLjk5OTczLCAwLjk5OTg3LCAxLjAwMDAxLCAxLjAwMDAxLCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDI2LCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDYsIDEsIDEuMDAwMDEsIDAuOTk5NzMsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMDEsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMTYsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NDksIDAuOTk5NzMsIDAuOTk5OTgsIDAuOTk5NzMsIDAuOTk5NzMsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTkyNCwgMC45OTkyNCwgMSwgMC45OTkyNCwgMC45OTk5OSwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk5OCwgMSwgMS4wMDA2LCAwLjk5OTczLCAxLCAwLjk5OTc3LCAxLCAxLCAxLCAxLjAwMDA1LCAxLjAwMDksIDEuMDAwMDUsIDEuMDAwMDMsIDAuOTk5OTgsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwOSwgMC45OTk3MywgMC45OTk5OCwgMS4wMDAyNSwgMC45OTk2OCwgMC45OTk3MywgMS4wMDAwMywgMS4wMDAyNSwgMC42MDI5OSwgMS4wMDAyNCwgMS4wNjQwOSwgMSwgMSwgMC45OTk5OCwgMSwgMC45OTk4LCAxLjAwMDYsIDAuOTk5OTgsIDEsIDAuOTk5MzYsIDAuOTk5NzMsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMjYsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAwMywgMS4wMDAyMiwgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMSwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjA2NDA5LCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTczLCAxLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLjA0NTk2LCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5MjQsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDE5LCAxLjAwMDM0LCAxLCAwLjk5OTI0LCAxLjAwMDAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAxLjAyNTcyLCAwLjk5OTczLCAxLjAwMDA1LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTk5LCAwLjk5OTgsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEsIDEuMDAwMTYsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMC44NDUzMywgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAwLjk5OTI0LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLCAwLjk5OTgyLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDAxLCAxLCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5MjgsIDEsIDAuOTk5NzcsIDEuMDAwMTMsIDEuMDAwNTUsIDAuOTk5NDcsIDAuOTk5NDUsIDAuOTk5NDEsIDAuOTk5MjQsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNCwgMC45MTYyMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDA2LCAxLjAwMDAxLCAxLjAwMDA1LCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDE1LCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDI2LCAxLjAwMDAxLCAxLjAwMDE5LCAxLjAwMDAxLCAwLjk5OTQ2LCAxLCAxLjAwMDYsIDEuMDAwMDEsIDAuOTk5NzgsIDEuMDAwNDUsIDAuOTk5NzMsIDAuOTk5MjQsIDEuMDAwMjMsIDAuOTk5NzgsIDAuOTk5NjYsIDEsIDEuMDAwNjUsIDEuMDAwNDUsIDEuMDAwMTksIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5MjQsIDEsIDEsIDAuOTY0OTksIDEsIDEuMDAwNTUsIDAuOTk5NzMsIDEuMDAwMDgsIDEuMDAwMjcsIDEsIDAuOTk5NywgMC45OTk5NSwgMS4wMDAyMywgMC45OTkzMywgMS4wMDAxOSwgMS4wMDAxNSwgMS4wMDAzMSwgMC45OTkyNCwgMS4wMDAyMywgMC45OTk3MywgMS4wMDAyMywgMS4wMDAzMSwgMS4wMDAwMSwgMC45OTkyOCwgMS4wMDAyOSwgMS4wMDA5MiwgMS4wMDAzNSwgMS4wMDAwMSwgMS4wMDA2LCAxLjAwMDYsIDEsIDAuOTk5ODgsIDAuOTk5NzUsIDEsIDEuMDAwODIsIDAuOTk1NjEsIDAuOTk5NiwgMS4wMDAzNSwgMS4wMDAwMSwgMC45OTk2MiwgMS4wMDAwMSwgMS4wMDA5MiwgMC45OTk2NCwgMS4wMDAwMSwgMC45OTk2MywgMC45OTk5OSwgMS4wMDAzNSwgMS4wMDAzNSwgMS4wMDA4MiwgMC45OTk2MiwgMC45OTk5OSwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAzNSwgMS4wMDAwMSwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk2LCAwLjk5OTY3LCAxLjAwMDAxLCAxLjAwMDM0LCAxLjAwMDc0LCAxLjAwMDU0LCAxLjAwMDUzLCAxLjAwMDYzLCAwLjk5OTcxLCAwLjk5OTYyLCAxLjAwMDM1LCAwLjk5OTc1LCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDQzLCAwLjk5OTUzLCAxLjAwMDcsIDAuOTk5MTUsIDAuOTk5NzMsIDEuMDAwMDgsIDAuOTk4OTIsIDEuMDAwNzMsIDEuMDAwNzMsIDEuMDAxMTQsIDAuOTk5MTUsIDEuMDAwNzMsIDAuOTk5NTUsIDAuOTk5NzMsIDEuMDAwOTIsIDAuOTk5NzMsIDEsIDAuOTk5OTgsIDEsIDEuMDAwMywgMSwgMS4wMDA0MywgMS4wMDAwMSwgMC45OTk2OSwgMS4wMDAzLCAxLCAxLjAwMDM1LCAxLjAwMDAxLCAwLjk5OTUsIDEsIDEuMDAwOTIsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNywgMC45OTk1LCAxLCAwLjk5OTI0LCAxLjAwMDYsIDAuOTk5MjQsIDAuOTk5NzIsIDEuMDAwNjIsIDAuOTk5NzMsIDEuMDAxMTQsIDEuMDAwNzMsIDEsIDAuOTk5NTUsIDEsIDEsIDEuMDAwNDcsIDAuOTk5NjgsIDEuMDAwMTYsIDAuOTk5NzcsIDEuMDAwMTYsIDAuOTk5NzcsIDEuMDAwMTYsIDAuOTk5NzcsIDEuMDAwMDEsIDEsIDEsIDEsIDAuOTk5NzMsIDEsIDEsIDAuOTk5NTUsIDAuOTk5MjQsIDAuOTk5MjQsIDAuOTk5MjQsIDAuOTk5MjQsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzIsIDEsIDEsIDEuMDAyNjcsIDAuOTk5OTksIDAuOTk5OTgsIDAuOTk5OTgsIDEsIDAuOTk5OTgsIDEuNjY0NzUsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwMjMsIDAuOTk5NzMsIDAuOTk5NzEsIDAuOTk5MjUsIDEuMDAwMjMsIDEsIDAuOTk5OTEsIDAuOTk5ODQsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTYzMjksIDEsIDEuMjA5ODUsIDEuMzk3MTMsIDEuMDAwMDMsIDAuODI1NCwgMS4wMDAxNSwgMSwgMS4wMDAzNSwgMS4wMDAyNywgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTkxNSwgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTk5OSwgMS4wMDAwMywgMC45OTk5OSwgMC45OTk5OSwgMS40MTE0NCwgMS42LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQwNTc5LCAxLjQwNTc5LCAxLjM2NjI1LCAwLjk5OTk5LCAxLCAwLjk5ODYxLCAwLjk5ODYxLCAxLCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk1MzE3LCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQwNDgzLCAxLCAwLjk5OTc3LCAxLjAwMDU0LCAxLCAxLCAwLjk5OTUzLCAwLjk5OTYyLCAxLjAwMDQyLCAwLjk5OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBIZWx2ZXRpY2FSZWd1bGFyTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIsCiAgbGluZUdhcDogMC4yCn07Cgo7Ly8gLi9zcmMvY29yZS9saWJlcmF0aW9uc2Fuc193aWR0aHMuanMKY29uc3QgTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzID0gWzM2NSwgMCwgMzMzLCAyNzgsIDMzMywgNDc0LCA1NTYsIDU1NiwgODg5LCA3MjIsIDIzOCwgMzMzLCAzMzMsIDM4OSwgNTg0LCAyNzgsIDMzMywgMjc4LCAyNzgsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMzMzLCAzMzMsIDU4NCwgNTg0LCA1ODQsIDYxMSwgOTc1LCA3MjIsIDcyMiwgNzIyLCA3MjIsIDY2NywgNjExLCA3NzgsIDcyMiwgMjc4LCA1NTYsIDcyMiwgNjExLCA4MzMsIDcyMiwgNzc4LCA2NjcsIDc3OCwgNzIyLCA2NjcsIDYxMSwgNzIyLCA2NjcsIDk0NCwgNjY3LCA2NjcsIDYxMSwgMzMzLCAyNzgsIDMzMywgNTg0LCA1NTYsIDMzMywgNTU2LCA2MTEsIDU1NiwgNjExLCA1NTYsIDMzMywgNjExLCA2MTEsIDI3OCwgMjc4LCA1NTYsIDI3OCwgODg5LCA2MTEsIDYxMSwgNjExLCA2MTEsIDM4OSwgNTU2LCAzMzMsIDYxMSwgNTU2LCA3NzgsIDU1NiwgNTU2LCA1MDAsIDM4OSwgMjgwLCAzODksIDU4NCwgMzMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI4MCwgNTU2LCAzMzMsIDczNywgMzcwLCA1NTYsIDU4NCwgNzM3LCA1NTIsIDQwMCwgNTQ5LCAzMzMsIDMzMywgMzMzLCA1NzYsIDU1NiwgMjc4LCAzMzMsIDMzMywgMzY1LCA1NTYsIDgzNCwgODM0LCA4MzQsIDYxMSwgNzIyLCA3MjIsIDcyMiwgNzIyLCA3MjIsIDcyMiwgMTAwMCwgNzIyLCA2NjcsIDY2NywgNjY3LCA2NjcsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNzIyLCA3MjIsIDc3OCwgNzc4LCA3NzgsIDc3OCwgNzc4LCA1ODQsIDc3OCwgNzIyLCA3MjIsIDcyMiwgNzIyLCA2NjcsIDY2NywgNjExLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA4ODksIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDYxMSwgNjExLCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNTQ5LCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNTU2LCA2MTEsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNzE5LCA3MjIsIDYxMSwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCA3NzgsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDc4NSwgNTU2LCA1NTYsIDI3OCwgNzIyLCA1NTYsIDU1NiwgNjExLCAyNzgsIDYxMSwgMjc4LCA2MTEsIDM4NSwgNjExLCA0NzksIDYxMSwgMjc4LCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MDgsIDcyMywgNjExLCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCAxMDAwLCA5NDQsIDcyMiwgMzg5LCA3MjIsIDM4OSwgNzIyLCAzODksIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2MTEsIDMzMywgNjExLCA0NzksIDYxMSwgMzMzLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA5NDQsIDc3OCwgNjY3LCA1NTYsIDY2NywgNjExLCA1MDAsIDYxMSwgNTAwLCA2MTEsIDUwMCwgMjc4LCA1NTYsIDcyMiwgNTU2LCAxMDAwLCA4ODksIDc3OCwgNjExLCA2NjcsIDU1NiwgNjExLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgNDY1LCA3MjIsIDMzMywgODUzLCA5MDYsIDQ3NCwgODI1LCA5MjcsIDgzOCwgMjc4LCA3MjIsIDcyMiwgNjAxLCA3MTksIDY2NywgNjExLCA3MjIsIDc3OCwgMjc4LCA3MjIsIDY2NywgODMzLCA3MjIsIDY0NCwgNzc4LCA3MjIsIDY2NywgNjAwLCA2MTEsIDY2NywgODIxLCA2NjcsIDgwOSwgODAyLCAyNzgsIDY2NywgNjE1LCA0NTEsIDYxMSwgMjc4LCA1ODIsIDYxNSwgNjEwLCA1NTYsIDYwNiwgNDc1LCA0NjAsIDYxMSwgNTQxLCAyNzgsIDU1OCwgNTU2LCA2MTIsIDU1NiwgNDQ1LCA2MTEsIDc2NiwgNjE5LCA1MjAsIDY4NCwgNDQ2LCA1ODIsIDcxNSwgNTc2LCA3NTMsIDg0NSwgMjc4LCA1ODIsIDYxMSwgNTgyLCA4NDUsIDY2NywgNjY5LCA4ODUsIDU2NywgNzExLCA2NjcsIDI3OCwgMjc2LCA1NTYsIDEwOTQsIDEwNjIsIDg3NSwgNjEwLCA3MjIsIDYyMiwgNzE5LCA3MjIsIDcxOSwgNzIyLCA1NjcsIDcxMiwgNjY3LCA5MDQsIDYyNiwgNzE5LCA3MTksIDYxMCwgNzAyLCA4MzMsIDcyMiwgNzc4LCA3MTksIDY2NywgNzIyLCA2MTEsIDYyMiwgODU0LCA2NjcsIDczMCwgNzAzLCAxMDA1LCAxMDE5LCA4NzAsIDk3OSwgNzE5LCA3MTEsIDEwMzEsIDcxOSwgNTU2LCA2MTgsIDYxNSwgNDE3LCA2MzUsIDU1NiwgNzA5LCA0OTcsIDYxNSwgNjE1LCA1MDAsIDYzNSwgNzQwLCA2MDQsIDYxMSwgNjA0LCA2MTEsIDU1NiwgNDkwLCA1NTYsIDg3NSwgNTU2LCA2MTUsIDU4MSwgODMzLCA4NDQsIDcyOSwgODU0LCA2MTUsIDU1MiwgODU0LCA1ODMsIDU1NiwgNTU2LCA2MTEsIDQxNywgNTUyLCA1NTYsIDI3OCwgMjgxLCAyNzgsIDk2OSwgOTA2LCA2MTEsIDUwMCwgNjE1LCA1NTYsIDYwNCwgNzc4LCA2MTEsIDQ4NywgNDQ3LCA5NDQsIDc3OCwgOTQ0LCA3NzgsIDk0NCwgNzc4LCA2NjcsIDU1NiwgMzMzLCAzMzMsIDU1NiwgMTAwMCwgMTAwMCwgNTUyLCAyNzgsIDI3OCwgMjc4LCAyNzgsIDUwMCwgNTAwLCA1MDAsIDU1NiwgNTU2LCAzNTAsIDEwMDAsIDEwMDAsIDI0MCwgNDc5LCAzMzMsIDMzMywgNjA0LCAzMzMsIDE2NywgMzk2LCA1NTYsIDU1NiwgMTA5NCwgNTU2LCA4ODUsIDQ4OSwgMTExNSwgMTAwMCwgNzY4LCA2MDAsIDgzNCwgODM0LCA4MzQsIDgzNCwgMTAwMCwgNTAwLCAxMDAwLCA1MDAsIDEwMDAsIDUwMCwgNTAwLCA0OTQsIDYxMiwgODIzLCA3MTMsIDU4NCwgNTQ5LCA3MTMsIDk3OSwgNzIyLCAyNzQsIDU0OSwgNTQ5LCA1ODMsIDU0OSwgNTQ5LCA2MDQsIDU4NCwgNjA0LCA2MDQsIDcwOCwgNjI1LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MjksIDYwNCwgNjA0LCAzNTQsIDM1NCwgMTAwMCwgOTkwLCA5OTAsIDk5MCwgOTkwLCA0OTQsIDYwNCwgNjA0LCA2MDQsIDYwNCwgMzU0LCAxMDIxLCAxMDUyLCA5MTcsIDc1MCwgNzUwLCA1MzEsIDY1NiwgNTk0LCA1MTAsIDUwMCwgNzUwLCA3NTAsIDYxMSwgNjExLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMjIyLCAyMjIsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzXTsKY29uc3QgTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZyA9IFstMSwgLTEsIC0xLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3NCwgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsIDI1OCwgMjU5LCAyNjAsIDI2MSwgMjYyLCAyNjMsIDI2NCwgMjY1LCAyNjYsIDI2NywgMjY4LCAyNjksIDI3MCwgMjcxLCAyNzIsIDI3MywgMjc0LCAyNzUsIDI3NiwgMjc3LCAyNzgsIDI3OSwgMjgwLCAyODEsIDI4MiwgMjgzLCAyODQsIDI4NSwgMjg2LCAyODcsIDI4OCwgMjg5LCAyOTAsIDI5MSwgMjkyLCAyOTMsIDI5NCwgMjk1LCAyOTYsIDI5NywgMjk4LCAyOTksIDMwMCwgMzAxLCAzMDIsIDMwMywgMzA0LCAzMDUsIDMwNiwgMzA3LCAzMDgsIDMwOSwgMzEwLCAzMTEsIDMxMiwgMzEzLCAzMTQsIDMxNSwgMzE2LCAzMTcsIDMxOCwgMzE5LCAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAzMjYsIDMyNywgMzI4LCAzMjksIDMzMCwgMzMxLCAzMzIsIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsIDMzOSwgMzQwLCAzNDEsIDM0MiwgMzQzLCAzNDQsIDM0NSwgMzQ2LCAzNDcsIDM0OCwgMzQ5LCAzNTAsIDM1MSwgMzUyLCAzNTMsIDM1NCwgMzU1LCAzNTYsIDM1NywgMzU4LCAzNTksIDM2MCwgMzYxLCAzNjIsIDM2MywgMzY0LCAzNjUsIDM2NiwgMzY3LCAzNjgsIDM2OSwgMzcwLCAzNzEsIDM3MiwgMzczLCAzNzQsIDM3NSwgMzc2LCAzNzcsIDM3OCwgMzc5LCAzODAsIDM4MSwgMzgyLCAzODMsIDQwMiwgNTA2LCA1MDcsIDUwOCwgNTA5LCA1MTAsIDUxMSwgNTM2LCA1MzcsIDUzOCwgNTM5LCA3MTAsIDcxMSwgNzEzLCA3MjgsIDcyOSwgNzMwLCA3MzEsIDczMiwgNzMzLCA5MDAsIDkwMSwgOTAyLCA5MDMsIDkwNCwgOTA1LCA5MDYsIDkwOCwgOTEwLCA5MTEsIDkxMiwgOTEzLCA5MTQsIDkxNSwgOTE2LCA5MTcsIDkxOCwgOTE5LCA5MjAsIDkyMSwgOTIyLCA5MjMsIDkyNCwgOTI1LCA5MjYsIDkyNywgOTI4LCA5MjksIDkzMSwgOTMyLCA5MzMsIDkzNCwgOTM1LCA5MzYsIDkzNywgOTM4LCA5MzksIDk0MCwgOTQxLCA5NDIsIDk0MywgOTQ0LCA5NDUsIDk0NiwgOTQ3LCA5NDgsIDk0OSwgOTUwLCA5NTEsIDk1MiwgOTUzLCA5NTQsIDk1NSwgOTU2LCA5NTcsIDk1OCwgOTU5LCA5NjAsIDk2MSwgOTYyLCA5NjMsIDk2NCwgOTY1LCA5NjYsIDk2NywgOTY4LCA5NjksIDk3MCwgOTcxLCA5NzIsIDk3MywgOTc0LCAxMDI0LCAxMDI1LCAxMDI2LCAxMDI3LCAxMDI4LCAxMDI5LCAxMDMwLCAxMDMxLCAxMDMyLCAxMDMzLCAxMDM0LCAxMDM1LCAxMDM2LCAxMDM3LCAxMDM4LCAxMDM5LCAxMDQwLCAxMDQxLCAxMDQyLCAxMDQzLCAxMDQ0LCAxMDQ1LCAxMDQ2LCAxMDQ3LCAxMDQ4LCAxMDQ5LCAxMDUwLCAxMDUxLCAxMDUyLCAxMDUzLCAxMDU0LCAxMDU1LCAxMDU2LCAxMDU3LCAxMDU4LCAxMDU5LCAxMDYwLCAxMDYxLCAxMDYyLCAxMDYzLCAxMDY0LCAxMDY1LCAxMDY2LCAxMDY3LCAxMDY4LCAxMDY5LCAxMDcwLCAxMDcxLCAxMDcyLCAxMDczLCAxMDc0LCAxMDc1LCAxMDc2LCAxMDc3LCAxMDc4LCAxMDc5LCAxMDgwLCAxMDgxLCAxMDgyLCAxMDgzLCAxMDg0LCAxMDg1LCAxMDg2LCAxMDg3LCAxMDg4LCAxMDg5LCAxMDkwLCAxMDkxLCAxMDkyLCAxMDkzLCAxMDk0LCAxMDk1LCAxMDk2LCAxMDk3LCAxMDk4LCAxMDk5LCAxMTAwLCAxMTAxLCAxMTAyLCAxMTAzLCAxMTA0LCAxMTA1LCAxMTA2LCAxMTA3LCAxMTA4LCAxMTA5LCAxMTEwLCAxMTExLCAxMTEyLCAxMTEzLCAxMTE0LCAxMTE1LCAxMTE2LCAxMTE3LCAxMTE4LCAxMTE5LCAxMTM4LCAxMTM5LCAxMTY4LCAxMTY5LCA3ODA4LCA3ODA5LCA3ODEwLCA3ODExLCA3ODEyLCA3ODEzLCA3OTIyLCA3OTIzLCA4MjA4LCA4MjA5LCA4MjExLCA4MjEyLCA4MjEzLCA4MjE1LCA4MjE2LCA4MjE3LCA4MjE4LCA4MjE5LCA4MjIwLCA4MjIxLCA4MjIyLCA4MjI0LCA4MjI1LCA4MjI2LCA4MjMwLCA4MjQwLCA4MjQyLCA4MjQzLCA4MjQ5LCA4MjUwLCA4MjUyLCA4MjU0LCA4MjYwLCA4MzE5LCA4MzU1LCA4MzU2LCA4MzU5LCA4MzY0LCA4NDUzLCA4NDY3LCA4NDcwLCA4NDgyLCA4NDg2LCA4NDk0LCA4NTM5LCA4NTQwLCA4NTQxLCA4NTQyLCA4NTkyLCA4NTkzLCA4NTk0LCA4NTk1LCA4NTk2LCA4NTk3LCA4NjE2LCA4NzA2LCA4NzEwLCA4NzE5LCA4NzIxLCA4NzIyLCA4NzMwLCA4NzM0LCA4NzM1LCA4NzQ1LCA4NzQ3LCA4Nzc2LCA4ODAwLCA4ODAxLCA4ODA0LCA4ODA1LCA4OTYyLCA4OTc2LCA4OTkyLCA4OTkzLCA5NDcyLCA5NDc0LCA5NDg0LCA5NDg4LCA5NDkyLCA5NDk2LCA5NTAwLCA5NTA4LCA5NTE2LCA5NTI0LCA5NTMyLCA5NTUyLCA5NTUzLCA5NTU0LCA5NTU1LCA5NTU2LCA5NTU3LCA5NTU4LCA5NTU5LCA5NTYwLCA5NTYxLCA5NTYyLCA5NTYzLCA5NTY0LCA5NTY1LCA5NTY2LCA5NTY3LCA5NTY4LCA5NTY5LCA5NTcwLCA5NTcxLCA5NTcyLCA5NTczLCA5NTc0LCA5NTc1LCA5NTc2LCA5NTc3LCA5NTc4LCA5NTc5LCA5NTgwLCA5NjAwLCA5NjA0LCA5NjA4LCA5NjEyLCA5NjE2LCA5NjE3LCA5NjE4LCA5NjE5LCA5NjMyLCA5NjMzLCA5NjQyLCA5NjQzLCA5NjQ0LCA5NjUwLCA5NjU4LCA5NjYwLCA5NjY4LCA5Njc0LCA5Njc1LCA5Njc5LCA5Njg4LCA5Njg5LCA5NzAyLCA5Nzg2LCA5Nzg3LCA5Nzg4LCA5NzkyLCA5Nzk0LCA5ODI0LCA5ODI3LCA5ODI5LCA5ODMwLCA5ODM0LCA5ODM1LCA5ODM2LCA2MTQ0MSwgNjE0NDIsIDYxNDQ1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTFdOwpjb25zdCBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMgPSBbMzY1LCAwLCAzMzMsIDI3OCwgMzMzLCA0NzQsIDU1NiwgNTU2LCA4ODksIDcyMiwgMjM4LCAzMzMsIDMzMywgMzg5LCA1ODQsIDI3OCwgMzMzLCAyNzgsIDI3OCwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCAzMzMsIDMzMywgNTg0LCA1ODQsIDU4NCwgNjExLCA5NzUsIDcyMiwgNzIyLCA3MjIsIDcyMiwgNjY3LCA2MTEsIDc3OCwgNzIyLCAyNzgsIDU1NiwgNzIyLCA2MTEsIDgzMywgNzIyLCA3NzgsIDY2NywgNzc4LCA3MjIsIDY2NywgNjExLCA3MjIsIDY2NywgOTQ0LCA2NjcsIDY2NywgNjExLCAzMzMsIDI3OCwgMzMzLCA1ODQsIDU1NiwgMzMzLCA1NTYsIDYxMSwgNTU2LCA2MTEsIDU1NiwgMzMzLCA2MTEsIDYxMSwgMjc4LCAyNzgsIDU1NiwgMjc4LCA4ODksIDYxMSwgNjExLCA2MTEsIDYxMSwgMzg5LCA1NTYsIDMzMywgNjExLCA1NTYsIDc3OCwgNTU2LCA1NTYsIDUwMCwgMzg5LCAyODAsIDM4OSwgNTg0LCAzMzMsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMjgwLCA1NTYsIDMzMywgNzM3LCAzNzAsIDU1NiwgNTg0LCA3MzcsIDU1MiwgNDAwLCA1NDksIDMzMywgMzMzLCAzMzMsIDU3NiwgNTU2LCAyNzgsIDMzMywgMzMzLCAzNjUsIDU1NiwgODM0LCA4MzQsIDgzNCwgNjExLCA3MjIsIDcyMiwgNzIyLCA3MjIsIDcyMiwgNzIyLCAxMDAwLCA3MjIsIDY2NywgNjY3LCA2NjcsIDY2NywgMjc4LCAyNzgsIDI3OCwgMjc4LCA3MjIsIDcyMiwgNzc4LCA3NzgsIDc3OCwgNzc4LCA3NzgsIDU4NCwgNzc4LCA3MjIsIDcyMiwgNzIyLCA3MjIsIDY2NywgNjY3LCA2MTEsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDg4OSwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNjExLCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNjExLCA1NDksIDYxMSwgNjExLCA2MTEsIDYxMSwgNjExLCA1NTYsIDYxMSwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA3NDAsIDcyMiwgNjExLCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDc3OCwgNjExLCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNzgyLCA1NTYsIDU1NiwgMjc4LCA3MjIsIDU1NiwgNTU2LCA2MTEsIDI3OCwgNjExLCAyNzgsIDYxMSwgMzk2LCA2MTEsIDQ3OSwgNjExLCAyNzgsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcwOCwgNzIzLCA2MTEsIDc3OCwgNjExLCA3NzgsIDYxMSwgNzc4LCA2MTEsIDEwMDAsIDk0NCwgNzIyLCAzODksIDcyMiwgMzg5LCA3MjIsIDM4OSwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDYxMSwgMzMzLCA2MTEsIDQ3OSwgNjExLCAzMzMsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDk0NCwgNzc4LCA2NjcsIDU1NiwgNjY3LCA2MTEsIDUwMCwgNjExLCA1MDAsIDYxMSwgNTAwLCAyNzgsIDU1NiwgNzIyLCA1NTYsIDEwMDAsIDg4OSwgNzc4LCA2MTEsIDY2NywgNTU2LCA2MTEsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDcyMiwgMzMzLCA4NTQsIDkwNiwgNDczLCA4NDQsIDkzMCwgODQ3LCAyNzgsIDcyMiwgNzIyLCA2MTAsIDY3MSwgNjY3LCA2MTEsIDcyMiwgNzc4LCAyNzgsIDcyMiwgNjY3LCA4MzMsIDcyMiwgNjU3LCA3NzgsIDcxOCwgNjY3LCA1OTAsIDYxMSwgNjY3LCA4MjIsIDY2NywgODI5LCA3ODEsIDI3OCwgNjY3LCA2MjAsIDQ3OSwgNjExLCAyNzgsIDU5MSwgNjIwLCA2MjEsIDU1NiwgNjEwLCA0NzksIDQ5MiwgNjExLCA1NTgsIDI3OCwgNTY2LCA1NTYsIDYwMywgNTU2LCA0NTAsIDYxMSwgNzEyLCA2MDUsIDUzMiwgNjY0LCA0MDksIDU5MSwgNzA0LCA1NzgsIDc3MywgODM0LCAyNzgsIDU5MSwgNjExLCA1OTEsIDgzNCwgNjY3LCA2NjcsIDg4NiwgNjE0LCA3MTksIDY2NywgMjc4LCAyNzgsIDU1NiwgMTA5NCwgMTA0MiwgODU0LCA2MjIsIDcxOSwgNjc3LCA3MTksIDcyMiwgNzA4LCA3MjIsIDYxNCwgNzIyLCA2NjcsIDkyNywgNjQzLCA3MTksIDcxOSwgNjE1LCA2ODcsIDgzMywgNzIyLCA3NzgsIDcxOSwgNjY3LCA3MjIsIDYxMSwgNjc3LCA3ODEsIDY2NywgNzI5LCA3MDgsIDk3OSwgOTg5LCA4NTQsIDEwMDAsIDcwOCwgNzE5LCAxMDQyLCA3MjksIDU1NiwgNjE5LCA2MDQsIDUzNCwgNjE4LCA1NTYsIDczNiwgNTEwLCA2MTEsIDYxMSwgNTA3LCA2MjIsIDc0MCwgNjA0LCA2MTEsIDYxMSwgNjExLCA1NTYsIDg4OSwgNTU2LCA4ODUsIDU1NiwgNjQ2LCA1ODMsIDg4OSwgOTM1LCA3MDcsIDg1NCwgNTk0LCA1NTIsIDg2NSwgNTg5LCA1NTYsIDU1NiwgNjExLCA0NjksIDU2MywgNTU2LCAyNzgsIDI3OCwgMjc4LCA5NjksIDkwNiwgNjExLCA1MDcsIDYxOSwgNTU2LCA2MTEsIDc3OCwgNjExLCA1NzUsIDQ2NywgOTQ0LCA3NzgsIDk0NCwgNzc4LCA5NDQsIDc3OCwgNjY3LCA1NTYsIDMzMywgMzMzLCA1NTYsIDEwMDAsIDEwMDAsIDU1MiwgMjc4LCAyNzgsIDI3OCwgMjc4LCA1MDAsIDUwMCwgNTAwLCA1NTYsIDU1NiwgMzUwLCAxMDAwLCAxMDAwLCAyNDAsIDQ3OSwgMzMzLCAzMzMsIDYwNCwgMzMzLCAxNjcsIDM5NiwgNTU2LCA1NTYsIDExMDQsIDU1NiwgODg1LCA1MTYsIDExNDYsIDEwMDAsIDc2OCwgNjAwLCA4MzQsIDgzNCwgODM0LCA4MzQsIDk5OSwgNTAwLCAxMDAwLCA1MDAsIDEwMDAsIDUwMCwgNTAwLCA0OTQsIDYxMiwgODIzLCA3MTMsIDU4NCwgNTQ5LCA3MTMsIDk3OSwgNzIyLCAyNzQsIDU0OSwgNTQ5LCA1ODMsIDU0OSwgNTQ5LCA2MDQsIDU4NCwgNjA0LCA2MDQsIDcwOCwgNjI1LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MjksIDYwNCwgNjA0LCAzNTQsIDM1NCwgMTAwMCwgOTkwLCA5OTAsIDk5MCwgOTkwLCA0OTQsIDYwNCwgNjA0LCA2MDQsIDYwNCwgMzU0LCAxMDIxLCAxMDUyLCA5MTcsIDc1MCwgNzUwLCA1MzEsIDY1NiwgNTk0LCA1MTAsIDUwMCwgNzUwLCA3NTAsIDYxMSwgNjExLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMjIyLCAyMjIsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzXTsKY29uc3QgTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZyA9IFstMSwgLTEsIC0xLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3NCwgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsIDI1OCwgMjU5LCAyNjAsIDI2MSwgMjYyLCAyNjMsIDI2NCwgMjY1LCAyNjYsIDI2NywgMjY4LCAyNjksIDI3MCwgMjcxLCAyNzIsIDI3MywgMjc0LCAyNzUsIDI3NiwgMjc3LCAyNzgsIDI3OSwgMjgwLCAyODEsIDI4MiwgMjgzLCAyODQsIDI4NSwgMjg2LCAyODcsIDI4OCwgMjg5LCAyOTAsIDI5MSwgMjkyLCAyOTMsIDI5NCwgMjk1LCAyOTYsIDI5NywgMjk4LCAyOTksIDMwMCwgMzAxLCAzMDIsIDMwMywgMzA0LCAzMDUsIDMwNiwgMzA3LCAzMDgsIDMwOSwgMzEwLCAzMTEsIDMxMiwgMzEzLCAzMTQsIDMxNSwgMzE2LCAzMTcsIDMxOCwgMzE5LCAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAzMjYsIDMyNywgMzI4LCAzMjksIDMzMCwgMzMxLCAzMzIsIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsIDMzOSwgMzQwLCAzNDEsIDM0MiwgMzQzLCAzNDQsIDM0NSwgMzQ2LCAzNDcsIDM0OCwgMzQ5LCAzNTAsIDM1MSwgMzUyLCAzNTMsIDM1NCwgMzU1LCAzNTYsIDM1NywgMzU4LCAzNTksIDM2MCwgMzYxLCAzNjIsIDM2MywgMzY0LCAzNjUsIDM2NiwgMzY3LCAzNjgsIDM2OSwgMzcwLCAzNzEsIDM3MiwgMzczLCAzNzQsIDM3NSwgMzc2LCAzNzcsIDM3OCwgMzc5LCAzODAsIDM4MSwgMzgyLCAzODMsIDQwMiwgNTA2LCA1MDcsIDUwOCwgNTA5LCA1MTAsIDUxMSwgNTM2LCA1MzcsIDUzOCwgNTM5LCA3MTAsIDcxMSwgNzEzLCA3MjgsIDcyOSwgNzMwLCA3MzEsIDczMiwgNzMzLCA5MDAsIDkwMSwgOTAyLCA5MDMsIDkwNCwgOTA1LCA5MDYsIDkwOCwgOTEwLCA5MTEsIDkxMiwgOTEzLCA5MTQsIDkxNSwgOTE2LCA5MTcsIDkxOCwgOTE5LCA5MjAsIDkyMSwgOTIyLCA5MjMsIDkyNCwgOTI1LCA5MjYsIDkyNywgOTI4LCA5MjksIDkzMSwgOTMyLCA5MzMsIDkzNCwgOTM1LCA5MzYsIDkzNywgOTM4LCA5MzksIDk0MCwgOTQxLCA5NDIsIDk0MywgOTQ0LCA5NDUsIDk0NiwgOTQ3LCA5NDgsIDk0OSwgOTUwLCA5NTEsIDk1MiwgOTUzLCA5NTQsIDk1NSwgOTU2LCA5NTcsIDk1OCwgOTU5LCA5NjAsIDk2MSwgOTYyLCA5NjMsIDk2NCwgOTY1LCA5NjYsIDk2NywgOTY4LCA5NjksIDk3MCwgOTcxLCA5NzIsIDk3MywgOTc0LCAxMDI0LCAxMDI1LCAxMDI2LCAxMDI3LCAxMDI4LCAxMDI5LCAxMDMwLCAxMDMxLCAxMDMyLCAxMDMzLCAxMDM0LCAxMDM1LCAxMDM2LCAxMDM3LCAxMDM4LCAxMDM5LCAxMDQwLCAxMDQxLCAxMDQyLCAxMDQzLCAxMDQ0LCAxMDQ1LCAxMDQ2LCAxMDQ3LCAxMDQ4LCAxMDQ5LCAxMDUwLCAxMDUxLCAxMDUyLCAxMDUzLCAxMDU0LCAxMDU1LCAxMDU2LCAxMDU3LCAxMDU4LCAxMDU5LCAxMDYwLCAxMDYxLCAxMDYyLCAxMDYzLCAxMDY0LCAxMDY1LCAxMDY2LCAxMDY3LCAxMDY4LCAxMDY5LCAxMDcwLCAxMDcxLCAxMDcyLCAxMDczLCAxMDc0LCAxMDc1LCAxMDc2LCAxMDc3LCAxMDc4LCAxMDc5LCAxMDgwLCAxMDgxLCAxMDgyLCAxMDgzLCAxMDg0LCAxMDg1LCAxMDg2LCAxMDg3LCAxMDg4LCAxMDg5LCAxMDkwLCAxMDkxLCAxMDkyLCAxMDkzLCAxMDk0LCAxMDk1LCAxMDk2LCAxMDk3LCAxMDk4LCAxMDk5LCAxMTAwLCAxMTAxLCAxMTAyLCAxMTAzLCAxMTA0LCAxMTA1LCAxMTA2LCAxMTA3LCAxMTA4LCAxMTA5LCAxMTEwLCAxMTExLCAxMTEyLCAxMTEzLCAxMTE0LCAxMTE1LCAxMTE2LCAxMTE3LCAxMTE4LCAxMTE5LCAxMTM4LCAxMTM5LCAxMTY4LCAxMTY5LCA3ODA4LCA3ODA5LCA3ODEwLCA3ODExLCA3ODEyLCA3ODEzLCA3OTIyLCA3OTIzLCA4MjA4LCA4MjA5LCA4MjExLCA4MjEyLCA4MjEzLCA4MjE1LCA4MjE2LCA4MjE3LCA4MjE4LCA4MjE5LCA4MjIwLCA4MjIxLCA4MjIyLCA4MjI0LCA4MjI1LCA4MjI2LCA4MjMwLCA4MjQwLCA4MjQyLCA4MjQzLCA4MjQ5LCA4MjUwLCA4MjUyLCA4MjU0LCA4MjYwLCA4MzE5LCA4MzU1LCA4MzU2LCA4MzU5LCA4MzY0LCA4NDUzLCA4NDY3LCA4NDcwLCA4NDgyLCA4NDg2LCA4NDk0LCA4NTM5LCA4NTQwLCA4NTQxLCA4NTQyLCA4NTkyLCA4NTkzLCA4NTk0LCA4NTk1LCA4NTk2LCA4NTk3LCA4NjE2LCA4NzA2LCA4NzEwLCA4NzE5LCA4NzIxLCA4NzIyLCA4NzMwLCA4NzM0LCA4NzM1LCA4NzQ1LCA4NzQ3LCA4Nzc2LCA4ODAwLCA4ODAxLCA4ODA0LCA4ODA1LCA4OTYyLCA4OTc2LCA4OTkyLCA4OTkzLCA5NDcyLCA5NDc0LCA5NDg0LCA5NDg4LCA5NDkyLCA5NDk2LCA5NTAwLCA5NTA4LCA5NTE2LCA5NTI0LCA5NTMyLCA5NTUyLCA5NTUzLCA5NTU0LCA5NTU1LCA5NTU2LCA5NTU3LCA5NTU4LCA5NTU5LCA5NTYwLCA5NTYxLCA5NTYyLCA5NTYzLCA5NTY0LCA5NTY1LCA5NTY2LCA5NTY3LCA5NTY4LCA5NTY5LCA5NTcwLCA5NTcxLCA5NTcyLCA5NTczLCA5NTc0LCA5NTc1LCA5NTc2LCA5NTc3LCA5NTc4LCA5NTc5LCA5NTgwLCA5NjAwLCA5NjA0LCA5NjA4LCA5NjEyLCA5NjE2LCA5NjE3LCA5NjE4LCA5NjE5LCA5NjMyLCA5NjMzLCA5NjQyLCA5NjQzLCA5NjQ0LCA5NjUwLCA5NjU4LCA5NjYwLCA5NjY4LCA5Njc0LCA5Njc1LCA5Njc5LCA5Njg4LCA5Njg5LCA5NzAyLCA5Nzg2LCA5Nzg3LCA5Nzg4LCA5NzkyLCA5Nzk0LCA5ODI0LCA5ODI3LCA5ODI5LCA5ODMwLCA5ODM0LCA5ODM1LCA5ODM2LCA2MTQ0MSwgNjE0NDIsIDYxNDQ1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTFdOwpjb25zdCBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocyA9IFszNjUsIDAsIDMzMywgMjc4LCAyNzgsIDM1NSwgNTU2LCA1NTYsIDg4OSwgNjY3LCAxOTEsIDMzMywgMzMzLCAzODksIDU4NCwgMjc4LCAzMzMsIDI3OCwgMjc4LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI3OCwgMjc4LCA1ODQsIDU4NCwgNTg0LCA1NTYsIDEwMTUsIDY2NywgNjY3LCA3MjIsIDcyMiwgNjY3LCA2MTEsIDc3OCwgNzIyLCAyNzgsIDUwMCwgNjY3LCA1NTYsIDgzMywgNzIyLCA3NzgsIDY2NywgNzc4LCA3MjIsIDY2NywgNjExLCA3MjIsIDY2NywgOTQ0LCA2NjcsIDY2NywgNjExLCAyNzgsIDI3OCwgMjc4LCA0NjksIDU1NiwgMzMzLCA1NTYsIDU1NiwgNTAwLCA1NTYsIDU1NiwgMjc4LCA1NTYsIDU1NiwgMjIyLCAyMjIsIDUwMCwgMjIyLCA4MzMsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMzMzLCA1MDAsIDI3OCwgNTU2LCA1MDAsIDcyMiwgNTAwLCA1MDAsIDUwMCwgMzM0LCAyNjAsIDMzNCwgNTg0LCAzMzMsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMjYwLCA1NTYsIDMzMywgNzM3LCAzNzAsIDU1NiwgNTg0LCA3MzcsIDU1MiwgNDAwLCA1NDksIDMzMywgMzMzLCAzMzMsIDU3NiwgNTM3LCAyNzgsIDMzMywgMzMzLCAzNjUsIDU1NiwgODM0LCA4MzQsIDgzNCwgNjExLCA2NjcsIDY2NywgNjY3LCA2NjcsIDY2NywgNjY3LCAxMDAwLCA3MjIsIDY2NywgNjY3LCA2NjcsIDY2NywgMjc4LCAyNzgsIDI3OCwgMjc4LCA3MjIsIDcyMiwgNzc4LCA3NzgsIDc3OCwgNzc4LCA3NzgsIDU4NCwgNzc4LCA3MjIsIDcyMiwgNzIyLCA3MjIsIDY2NywgNjY3LCA2MTEsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDg4OSwgNTAwLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NDksIDYxMSwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1MDAsIDU1NiwgNTAwLCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3MjIsIDUwMCwgNzIyLCA1MDAsIDcyMiwgNTAwLCA3MjIsIDUwMCwgNzIyLCA2MjUsIDcyMiwgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjIyLCAyNzgsIDI3OCwgNzMzLCA0NDQsIDUwMCwgMjIyLCA2NjcsIDUwMCwgNTAwLCA1NTYsIDIyMiwgNTU2LCAyMjIsIDU1NiwgMjgxLCA1NTYsIDQwMCwgNTU2LCAyMjIsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDYxNSwgNzIzLCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDEwMDAsIDk0NCwgNzIyLCAzMzMsIDcyMiwgMzMzLCA3MjIsIDMzMywgNjY3LCA1MDAsIDY2NywgNTAwLCA2NjcsIDUwMCwgNjY3LCA1MDAsIDYxMSwgMjc4LCA2MTEsIDM1NCwgNjExLCAyNzgsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDk0NCwgNzIyLCA2NjcsIDUwMCwgNjY3LCA2MTEsIDUwMCwgNjExLCA1MDAsIDYxMSwgNTAwLCAyMjIsIDU1NiwgNjY3LCA1NTYsIDEwMDAsIDg4OSwgNzc4LCA2MTEsIDY2NywgNTAwLCA2MTEsIDI3OCwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDY2NywgMjc4LCA3ODksIDg0NiwgMzg5LCA3OTQsIDg2NSwgNzc1LCAyMjIsIDY2NywgNjY3LCA1NzAsIDY3MSwgNjY3LCA2MTEsIDcyMiwgNzc4LCAyNzgsIDY2NywgNjY3LCA4MzMsIDcyMiwgNjQ4LCA3NzgsIDcyNSwgNjY3LCA2MDAsIDYxMSwgNjY3LCA4MzcsIDY2NywgODMxLCA3NjEsIDI3OCwgNjY3LCA1NzAsIDQzOSwgNTU1LCAyMjIsIDU1MCwgNTcwLCA1NzEsIDUwMCwgNTU2LCA0MzksIDQ2MywgNTU1LCA1NDIsIDIyMiwgNTAwLCA0OTIsIDU0OCwgNTAwLCA0NDcsIDU1NiwgNjcwLCA1NzMsIDQ4NiwgNjAzLCAzNzQsIDU1MCwgNjUyLCA1NDYsIDcyOCwgNzc5LCAyMjIsIDU1MCwgNTU2LCA1NTAsIDc3OSwgNjY3LCA2NjcsIDg0MywgNTQ0LCA3MDgsIDY2NywgMjc4LCAyNzgsIDUwMCwgMTA2NiwgOTgyLCA4NDQsIDU4OSwgNzE1LCA2MzksIDcyNCwgNjY3LCA2NTEsIDY2NywgNTQ0LCA3MDQsIDY2NywgOTE3LCA2MTQsIDcxNSwgNzE1LCA1ODksIDY4NiwgODMzLCA3MjIsIDc3OCwgNzI1LCA2NjcsIDcyMiwgNjExLCA2MzksIDc5NSwgNjY3LCA3MjcsIDY3MywgOTIwLCA5MjMsIDgwNSwgODg2LCA2NTEsIDY5NCwgMTAyMiwgNjgyLCA1NTYsIDU2MiwgNTIyLCA0OTMsIDU1MywgNTU2LCA2ODgsIDQ2NSwgNTU2LCA1NTYsIDQ3MiwgNTY0LCA2ODYsIDU1MCwgNTU2LCA1NTYsIDU1NiwgNTAwLCA4MzMsIDUwMCwgODM1LCA1MDAsIDU3MiwgNTE4LCA4MzAsIDg1MSwgNjIxLCA3MzYsIDUyNiwgNDkyLCA3NTIsIDUzNCwgNTU2LCA1NTYsIDU1NiwgMzc4LCA0OTYsIDUwMCwgMjIyLCAyMjIsIDIyMiwgOTEwLCA4MjgsIDU1NiwgNDcyLCA1NjUsIDUwMCwgNTU2LCA3NzgsIDU1NiwgNDkyLCAzMzksIDk0NCwgNzIyLCA5NDQsIDcyMiwgOTQ0LCA3MjIsIDY2NywgNTAwLCAzMzMsIDMzMywgNTU2LCAxMDAwLCAxMDAwLCA1NTIsIDIyMiwgMjIyLCAyMjIsIDIyMiwgMzMzLCAzMzMsIDMzMywgNTU2LCA1NTYsIDM1MCwgMTAwMCwgMTAwMCwgMTg4LCAzNTQsIDMzMywgMzMzLCA1MDAsIDMzMywgMTY3LCAzNjUsIDU1NiwgNTU2LCAxMDk0LCA1NTYsIDg4NSwgMzIzLCAxMDgzLCAxMDAwLCA3NjgsIDYwMCwgODM0LCA4MzQsIDgzNCwgODM0LCAxMDAwLCA1MDAsIDk5OCwgNTAwLCAxMDAwLCA1MDAsIDUwMCwgNDk0LCA2MTIsIDgyMywgNzEzLCA1ODQsIDU0OSwgNzEzLCA5NzksIDcxOSwgMjc0LCA1NDksIDU0OSwgNTg0LCA1NDksIDU0OSwgNjA0LCA1ODQsIDYwNCwgNjA0LCA3MDgsIDYyNSwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzI5LCA2MDQsIDYwNCwgMzU0LCAzNTQsIDEwMDAsIDk5MCwgOTkwLCA5OTAsIDk5MCwgNDk0LCA2MDQsIDYwNCwgNjA0LCA2MDQsIDM1NCwgMTAyMSwgMTA1MiwgOTE3LCA3NTAsIDc1MCwgNTMxLCA2NTYsIDU5NCwgNTEwLCA1MDAsIDc1MCwgNzUwLCA1MDAsIDUwMCwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDIyMiwgMjIyLCAyOTQsIDI5NCwgMzI0LCAzMjQsIDMxNiwgMzI4LCAzOTgsIDI4NV07CmNvbnN0IExpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZyA9IFstMSwgLTEsIC0xLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3NCwgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsIDI1OCwgMjU5LCAyNjAsIDI2MSwgMjYyLCAyNjMsIDI2NCwgMjY1LCAyNjYsIDI2NywgMjY4LCAyNjksIDI3MCwgMjcxLCAyNzIsIDI3MywgMjc0LCAyNzUsIDI3NiwgMjc3LCAyNzgsIDI3OSwgMjgwLCAyODEsIDI4MiwgMjgzLCAyODQsIDI4NSwgMjg2LCAyODcsIDI4OCwgMjg5LCAyOTAsIDI5MSwgMjkyLCAyOTMsIDI5NCwgMjk1LCAyOTYsIDI5NywgMjk4LCAyOTksIDMwMCwgMzAxLCAzMDIsIDMwMywgMzA0LCAzMDUsIDMwNiwgMzA3LCAzMDgsIDMwOSwgMzEwLCAzMTEsIDMxMiwgMzEzLCAzMTQsIDMxNSwgMzE2LCAzMTcsIDMxOCwgMzE5LCAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAzMjYsIDMyNywgMzI4LCAzMjksIDMzMCwgMzMxLCAzMzIsIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsIDMzOSwgMzQwLCAzNDEsIDM0MiwgMzQzLCAzNDQsIDM0NSwgMzQ2LCAzNDcsIDM0OCwgMzQ5LCAzNTAsIDM1MSwgMzUyLCAzNTMsIDM1NCwgMzU1LCAzNTYsIDM1NywgMzU4LCAzNTksIDM2MCwgMzYxLCAzNjIsIDM2MywgMzY0LCAzNjUsIDM2NiwgMzY3LCAzNjgsIDM2OSwgMzcwLCAzNzEsIDM3MiwgMzczLCAzNzQsIDM3NSwgMzc2LCAzNzcsIDM3OCwgMzc5LCAzODAsIDM4MSwgMzgyLCAzODMsIDQwMiwgNTA2LCA1MDcsIDUwOCwgNTA5LCA1MTAsIDUxMSwgNTM2LCA1MzcsIDUzOCwgNTM5LCA3MTAsIDcxMSwgNzEzLCA3MjgsIDcyOSwgNzMwLCA3MzEsIDczMiwgNzMzLCA5MDAsIDkwMSwgOTAyLCA5MDMsIDkwNCwgOTA1LCA5MDYsIDkwOCwgOTEwLCA5MTEsIDkxMiwgOTEzLCA5MTQsIDkxNSwgOTE2LCA5MTcsIDkxOCwgOTE5LCA5MjAsIDkyMSwgOTIyLCA5MjMsIDkyNCwgOTI1LCA5MjYsIDkyNywgOTI4LCA5MjksIDkzMSwgOTMyLCA5MzMsIDkzNCwgOTM1LCA5MzYsIDkzNywgOTM4LCA5MzksIDk0MCwgOTQxLCA5NDIsIDk0MywgOTQ0LCA5NDUsIDk0NiwgOTQ3LCA5NDgsIDk0OSwgOTUwLCA5NTEsIDk1MiwgOTUzLCA5NTQsIDk1NSwgOTU2LCA5NTcsIDk1OCwgOTU5LCA5NjAsIDk2MSwgOTYyLCA5NjMsIDk2NCwgOTY1LCA5NjYsIDk2NywgOTY4LCA5NjksIDk3MCwgOTcxLCA5NzIsIDk3MywgOTc0LCAxMDI0LCAxMDI1LCAxMDI2LCAxMDI3LCAxMDI4LCAxMDI5LCAxMDMwLCAxMDMxLCAxMDMyLCAxMDMzLCAxMDM0LCAxMDM1LCAxMDM2LCAxMDM3LCAxMDM4LCAxMDM5LCAxMDQwLCAxMDQxLCAxMDQyLCAxMDQzLCAxMDQ0LCAxMDQ1LCAxMDQ2LCAxMDQ3LCAxMDQ4LCAxMDQ5LCAxMDUwLCAxMDUxLCAxMDUyLCAxMDUzLCAxMDU0LCAxMDU1LCAxMDU2LCAxMDU3LCAxMDU4LCAxMDU5LCAxMDYwLCAxMDYxLCAxMDYyLCAxMDYzLCAxMDY0LCAxMDY1LCAxMDY2LCAxMDY3LCAxMDY4LCAxMDY5LCAxMDcwLCAxMDcxLCAxMDcyLCAxMDczLCAxMDc0LCAxMDc1LCAxMDc2LCAxMDc3LCAxMDc4LCAxMDc5LCAxMDgwLCAxMDgxLCAxMDgyLCAxMDgzLCAxMDg0LCAxMDg1LCAxMDg2LCAxMDg3LCAxMDg4LCAxMDg5LCAxMDkwLCAxMDkxLCAxMDkyLCAxMDkzLCAxMDk0LCAxMDk1LCAxMDk2LCAxMDk3LCAxMDk4LCAxMDk5LCAxMTAwLCAxMTAxLCAxMTAyLCAxMTAzLCAxMTA0LCAxMTA1LCAxMTA2LCAxMTA3LCAxMTA4LCAxMTA5LCAxMTEwLCAxMTExLCAxMTEyLCAxMTEzLCAxMTE0LCAxMTE1LCAxMTE2LCAxMTE3LCAxMTE4LCAxMTE5LCAxMTM4LCAxMTM5LCAxMTY4LCAxMTY5LCA3ODA4LCA3ODA5LCA3ODEwLCA3ODExLCA3ODEyLCA3ODEzLCA3OTIyLCA3OTIzLCA4MjA4LCA4MjA5LCA4MjExLCA4MjEyLCA4MjEzLCA4MjE1LCA4MjE2LCA4MjE3LCA4MjE4LCA4MjE5LCA4MjIwLCA4MjIxLCA4MjIyLCA4MjI0LCA4MjI1LCA4MjI2LCA4MjMwLCA4MjQwLCA4MjQyLCA4MjQzLCA4MjQ5LCA4MjUwLCA4MjUyLCA4MjU0LCA4MjYwLCA4MzE5LCA4MzU1LCA4MzU2LCA4MzU5LCA4MzY0LCA4NDUzLCA4NDY3LCA4NDcwLCA4NDgyLCA4NDg2LCA4NDk0LCA4NTM5LCA4NTQwLCA4NTQxLCA4NTQyLCA4NTkyLCA4NTkzLCA4NTk0LCA4NTk1LCA4NTk2LCA4NTk3LCA4NjE2LCA4NzA2LCA4NzEwLCA4NzE5LCA4NzIxLCA4NzIyLCA4NzMwLCA4NzM0LCA4NzM1LCA4NzQ1LCA4NzQ3LCA4Nzc2LCA4ODAwLCA4ODAxLCA4ODA0LCA4ODA1LCA4OTYyLCA4OTc2LCA4OTkyLCA4OTkzLCA5NDcyLCA5NDc0LCA5NDg0LCA5NDg4LCA5NDkyLCA5NDk2LCA5NTAwLCA5NTA4LCA5NTE2LCA5NTI0LCA5NTMyLCA5NTUyLCA5NTUzLCA5NTU0LCA5NTU1LCA5NTU2LCA5NTU3LCA5NTU4LCA5NTU5LCA5NTYwLCA5NTYxLCA5NTYyLCA5NTYzLCA5NTY0LCA5NTY1LCA5NTY2LCA5NTY3LCA5NTY4LCA5NTY5LCA5NTcwLCA5NTcxLCA5NTcyLCA5NTczLCA5NTc0LCA5NTc1LCA5NTc2LCA5NTc3LCA5NTc4LCA5NTc5LCA5NTgwLCA5NjAwLCA5NjA0LCA5NjA4LCA5NjEyLCA5NjE2LCA5NjE3LCA5NjE4LCA5NjE5LCA5NjMyLCA5NjMzLCA5NjQyLCA5NjQzLCA5NjQ0LCA5NjUwLCA5NjU4LCA5NjYwLCA5NjY4LCA5Njc0LCA5Njc1LCA5Njc5LCA5Njg4LCA5Njg5LCA5NzAyLCA5Nzg2LCA5Nzg3LCA5Nzg4LCA5NzkyLCA5Nzk0LCA5ODI0LCA5ODI3LCA5ODI5LCA5ODMwLCA5ODM0LCA5ODM1LCA5ODM2LCA2MTQ0MSwgNjE0NDIsIDYxNDQ1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTFdOwpjb25zdCBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMgPSBbMzY1LCAwLCAzMzMsIDI3OCwgMjc4LCAzNTUsIDU1NiwgNTU2LCA4ODksIDY2NywgMTkxLCAzMzMsIDMzMywgMzg5LCA1ODQsIDI3OCwgMzMzLCAyNzgsIDI3OCwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgNTg0LCA1ODQsIDU4NCwgNTU2LCAxMDE1LCA2NjcsIDY2NywgNzIyLCA3MjIsIDY2NywgNjExLCA3NzgsIDcyMiwgMjc4LCA1MDAsIDY2NywgNTU2LCA4MzMsIDcyMiwgNzc4LCA2NjcsIDc3OCwgNzIyLCA2NjcsIDYxMSwgNzIyLCA2NjcsIDk0NCwgNjY3LCA2NjcsIDYxMSwgMjc4LCAyNzgsIDI3OCwgNDY5LCA1NTYsIDMzMywgNTU2LCA1NTYsIDUwMCwgNTU2LCA1NTYsIDI3OCwgNTU2LCA1NTYsIDIyMiwgMjIyLCA1MDAsIDIyMiwgODMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDMzMywgNTAwLCAyNzgsIDU1NiwgNTAwLCA3MjIsIDUwMCwgNTAwLCA1MDAsIDMzNCwgMjYwLCAzMzQsIDU4NCwgMzMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI2MCwgNTU2LCAzMzMsIDczNywgMzcwLCA1NTYsIDU4NCwgNzM3LCA1NTIsIDQwMCwgNTQ5LCAzMzMsIDMzMywgMzMzLCA1NzYsIDUzNywgMjc4LCAzMzMsIDMzMywgMzY1LCA1NTYsIDgzNCwgODM0LCA4MzQsIDYxMSwgNjY3LCA2NjcsIDY2NywgNjY3LCA2NjcsIDY2NywgMTAwMCwgNzIyLCA2NjcsIDY2NywgNjY3LCA2NjcsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNzIyLCA3MjIsIDc3OCwgNzc4LCA3NzgsIDc3OCwgNzc4LCA1ODQsIDc3OCwgNzIyLCA3MjIsIDcyMiwgNzIyLCA2NjcsIDY2NywgNjExLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA4ODksIDUwMCwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTQ5LCA2MTEsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTAwLCA1NTYsIDUwMCwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNzIyLCA1MDAsIDcyMiwgNTAwLCA3MjIsIDUwMCwgNzIyLCA1MDAsIDcyMiwgNjE1LCA3MjIsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDIyMiwgMjc4LCAyNzgsIDczNSwgNDQ0LCA1MDAsIDIyMiwgNjY3LCA1MDAsIDUwMCwgNTU2LCAyMjIsIDU1NiwgMjIyLCA1NTYsIDI5MiwgNTU2LCAzMzQsIDU1NiwgMjIyLCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA2MDQsIDcyMywgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCAxMDAwLCA5NDQsIDcyMiwgMzMzLCA3MjIsIDMzMywgNzIyLCAzMzMsIDY2NywgNTAwLCA2NjcsIDUwMCwgNjY3LCA1MDAsIDY2NywgNTAwLCA2MTEsIDI3OCwgNjExLCAzNzUsIDYxMSwgMjc4LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA5NDQsIDcyMiwgNjY3LCA1MDAsIDY2NywgNjExLCA1MDAsIDYxMSwgNTAwLCA2MTEsIDUwMCwgMjIyLCA1NTYsIDY2NywgNTU2LCAxMDAwLCA4ODksIDc3OCwgNjExLCA2NjcsIDUwMCwgNjExLCAyNzgsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCA2NjcsIDI3OCwgNzg0LCA4MzgsIDM4NCwgNzc0LCA4NTUsIDc1MiwgMjIyLCA2NjcsIDY2NywgNTUxLCA2NjgsIDY2NywgNjExLCA3MjIsIDc3OCwgMjc4LCA2NjcsIDY2OCwgODMzLCA3MjIsIDY1MCwgNzc4LCA3MjIsIDY2NywgNjE4LCA2MTEsIDY2NywgNzk4LCA2NjcsIDgzNSwgNzQ4LCAyNzgsIDY2NywgNTc4LCA0NDYsIDU1NiwgMjIyLCA1NDcsIDU3OCwgNTc1LCA1MDAsIDU1NywgNDQ2LCA0NDEsIDU1NiwgNTU2LCAyMjIsIDUwMCwgNTAwLCA1NzYsIDUwMCwgNDQ4LCA1NTYsIDY5MCwgNTY5LCA0ODIsIDYxNywgMzk1LCA1NDcsIDY0OCwgNTI1LCA3MTMsIDc4MSwgMjIyLCA1NDcsIDU1NiwgNTQ3LCA3ODEsIDY2NywgNjY3LCA4NjUsIDU0MiwgNzE5LCA2NjcsIDI3OCwgMjc4LCA1MDAsIDEwNTcsIDEwMTAsIDg1NCwgNTgzLCA3MjIsIDYzNSwgNzE5LCA2NjcsIDY1NiwgNjY3LCA1NDIsIDY3NywgNjY3LCA5MjMsIDYwNCwgNzE5LCA3MTksIDU4MywgNjU2LCA4MzMsIDcyMiwgNzc4LCA3MTksIDY2NywgNzIyLCA2MTEsIDYzNSwgNzYwLCA2NjcsIDc0MCwgNjY3LCA5MTcsIDkzOCwgNzkyLCA4ODUsIDY1NiwgNzE5LCAxMDEwLCA3MjIsIDU1NiwgNTczLCA1MzEsIDM2NSwgNTgzLCA1NTYsIDY2OSwgNDU4LCA1NTksIDU1OSwgNDM4LCA1ODMsIDY4OCwgNTUyLCA1NTYsIDU0MiwgNTU2LCA1MDAsIDQ1OCwgNTAwLCA4MjMsIDUwMCwgNTczLCA1MjEsIDgwMiwgODIzLCA2MjUsIDcxOSwgNTIxLCA1MTAsIDc1MCwgNTQyLCA1NTYsIDU1NiwgNTU2LCAzNjUsIDUxMCwgNTAwLCAyMjIsIDI3OCwgMjIyLCA5MDYsIDgxMiwgNTU2LCA0MzgsIDU1OSwgNTAwLCA1NTIsIDc3OCwgNTU2LCA0ODksIDQxMSwgOTQ0LCA3MjIsIDk0NCwgNzIyLCA5NDQsIDcyMiwgNjY3LCA1MDAsIDMzMywgMzMzLCA1NTYsIDEwMDAsIDEwMDAsIDU1MiwgMjIyLCAyMjIsIDIyMiwgMjIyLCAzMzMsIDMzMywgMzMzLCA1NTYsIDU1NiwgMzUwLCAxMDAwLCAxMDAwLCAxODgsIDM1NCwgMzMzLCAzMzMsIDUwMCwgMzMzLCAxNjcsIDM2NSwgNTU2LCA1NTYsIDEwOTQsIDU1NiwgODg1LCAzMjMsIDEwNzMsIDEwMDAsIDc2OCwgNjAwLCA4MzQsIDgzNCwgODM0LCA4MzQsIDEwMDAsIDUwMCwgMTAwMCwgNTAwLCAxMDAwLCA1MDAsIDUwMCwgNDk0LCA2MTIsIDgyMywgNzEzLCA1ODQsIDU0OSwgNzEzLCA5NzksIDcxOSwgMjc0LCA1NDksIDU0OSwgNTgzLCA1NDksIDU0OSwgNjA0LCA1ODQsIDYwNCwgNjA0LCA3MDgsIDYyNSwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzI5LCA2MDQsIDYwNCwgMzU0LCAzNTQsIDEwMDAsIDk5MCwgOTkwLCA5OTAsIDk5MCwgNDk0LCA2MDQsIDYwNCwgNjA0LCA2MDQsIDM1NCwgMTAyMSwgMTA1MiwgOTE3LCA3NTAsIDc1MCwgNTMxLCA2NTYsIDU5NCwgNTEwLCA1MDAsIDc1MCwgNzUwLCA1MDAsIDUwMCwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDIyMiwgMjIyLCAyOTQsIDI5NCwgMzI0LCAzMjQsIDMxNiwgMzI4LCAzOTgsIDI4NV07CmNvbnN0IExpYmVyYXRpb25TYW5zUmVndWxhck1hcHBpbmcgPSBbLTEsIC0xLCAtMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NiwgMjU3LCAyNTgsIDI1OSwgMjYwLCAyNjEsIDI2MiwgMjYzLCAyNjQsIDI2NSwgMjY2LCAyNjcsIDI2OCwgMjY5LCAyNzAsIDI3MSwgMjcyLCAyNzMsIDI3NCwgMjc1LCAyNzYsIDI3NywgMjc4LCAyNzksIDI4MCwgMjgxLCAyODIsIDI4MywgMjg0LCAyODUsIDI4NiwgMjg3LCAyODgsIDI4OSwgMjkwLCAyOTEsIDI5MiwgMjkzLCAyOTQsIDI5NSwgMjk2LCAyOTcsIDI5OCwgMjk5LCAzMDAsIDMwMSwgMzAyLCAzMDMsIDMwNCwgMzA1LCAzMDYsIDMwNywgMzA4LCAzMDksIDMxMCwgMzExLCAzMTIsIDMxMywgMzE0LCAzMTUsIDMxNiwgMzE3LCAzMTgsIDMxOSwgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgMzI2LCAzMjcsIDMyOCwgMzI5LCAzMzAsIDMzMSwgMzMyLCAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LCAzMzksIDM0MCwgMzQxLCAzNDIsIDM0MywgMzQ0LCAzNDUsIDM0NiwgMzQ3LCAzNDgsIDM0OSwgMzUwLCAzNTEsIDM1MiwgMzUzLCAzNTQsIDM1NSwgMzU2LCAzNTcsIDM1OCwgMzU5LCAzNjAsIDM2MSwgMzYyLCAzNjMsIDM2NCwgMzY1LCAzNjYsIDM2NywgMzY4LCAzNjksIDM3MCwgMzcxLCAzNzIsIDM3MywgMzc0LCAzNzUsIDM3NiwgMzc3LCAzNzgsIDM3OSwgMzgwLCAzODEsIDM4MiwgMzgzLCA0MDIsIDUwNiwgNTA3LCA1MDgsIDUwOSwgNTEwLCA1MTEsIDUzNiwgNTM3LCA1MzgsIDUzOSwgNzEwLCA3MTEsIDcxMywgNzI4LCA3MjksIDczMCwgNzMxLCA3MzIsIDczMywgOTAwLCA5MDEsIDkwMiwgOTAzLCA5MDQsIDkwNSwgOTA2LCA5MDgsIDkxMCwgOTExLCA5MTIsIDkxMywgOTE0LCA5MTUsIDkxNiwgOTE3LCA5MTgsIDkxOSwgOTIwLCA5MjEsIDkyMiwgOTIzLCA5MjQsIDkyNSwgOTI2LCA5MjcsIDkyOCwgOTI5LCA5MzEsIDkzMiwgOTMzLCA5MzQsIDkzNSwgOTM2LCA5MzcsIDkzOCwgOTM5LCA5NDAsIDk0MSwgOTQyLCA5NDMsIDk0NCwgOTQ1LCA5NDYsIDk0NywgOTQ4LCA5NDksIDk1MCwgOTUxLCA5NTIsIDk1MywgOTU0LCA5NTUsIDk1NiwgOTU3LCA5NTgsIDk1OSwgOTYwLCA5NjEsIDk2MiwgOTYzLCA5NjQsIDk2NSwgOTY2LCA5NjcsIDk2OCwgOTY5LCA5NzAsIDk3MSwgOTcyLCA5NzMsIDk3NCwgMTAyNCwgMTAyNSwgMTAyNiwgMTAyNywgMTAyOCwgMTAyOSwgMTAzMCwgMTAzMSwgMTAzMiwgMTAzMywgMTAzNCwgMTAzNSwgMTAzNiwgMTAzNywgMTAzOCwgMTAzOSwgMTA0MCwgMTA0MSwgMTA0MiwgMTA0MywgMTA0NCwgMTA0NSwgMTA0NiwgMTA0NywgMTA0OCwgMTA0OSwgMTA1MCwgMTA1MSwgMTA1MiwgMTA1MywgMTA1NCwgMTA1NSwgMTA1NiwgMTA1NywgMTA1OCwgMTA1OSwgMTA2MCwgMTA2MSwgMTA2MiwgMTA2MywgMTA2NCwgMTA2NSwgMTA2NiwgMTA2NywgMTA2OCwgMTA2OSwgMTA3MCwgMTA3MSwgMTA3MiwgMTA3MywgMTA3NCwgMTA3NSwgMTA3NiwgMTA3NywgMTA3OCwgMTA3OSwgMTA4MCwgMTA4MSwgMTA4MiwgMTA4MywgMTA4NCwgMTA4NSwgMTA4NiwgMTA4NywgMTA4OCwgMTA4OSwgMTA5MCwgMTA5MSwgMTA5MiwgMTA5MywgMTA5NCwgMTA5NSwgMTA5NiwgMTA5NywgMTA5OCwgMTA5OSwgMTEwMCwgMTEwMSwgMTEwMiwgMTEwMywgMTEwNCwgMTEwNSwgMTEwNiwgMTEwNywgMTEwOCwgMTEwOSwgMTExMCwgMTExMSwgMTExMiwgMTExMywgMTExNCwgMTExNSwgMTExNiwgMTExNywgMTExOCwgMTExOSwgMTEzOCwgMTEzOSwgMTE2OCwgMTE2OSwgNzgwOCwgNzgwOSwgNzgxMCwgNzgxMSwgNzgxMiwgNzgxMywgNzkyMiwgNzkyMywgODIwOCwgODIwOSwgODIxMSwgODIxMiwgODIxMywgODIxNSwgODIxNiwgODIxNywgODIxOCwgODIxOSwgODIyMCwgODIyMSwgODIyMiwgODIyNCwgODIyNSwgODIyNiwgODIzMCwgODI0MCwgODI0MiwgODI0MywgODI0OSwgODI1MCwgODI1MiwgODI1NCwgODI2MCwgODMxOSwgODM1NSwgODM1NiwgODM1OSwgODM2NCwgODQ1MywgODQ2NywgODQ3MCwgODQ4MiwgODQ4NiwgODQ5NCwgODUzOSwgODU0MCwgODU0MSwgODU0MiwgODU5MiwgODU5MywgODU5NCwgODU5NSwgODU5NiwgODU5NywgODYxNiwgODcwNiwgODcxMCwgODcxOSwgODcyMSwgODcyMiwgODczMCwgODczNCwgODczNSwgODc0NSwgODc0NywgODc3NiwgODgwMCwgODgwMSwgODgwNCwgODgwNSwgODk2MiwgODk3NiwgODk5MiwgODk5MywgOTQ3MiwgOTQ3NCwgOTQ4NCwgOTQ4OCwgOTQ5MiwgOTQ5NiwgOTUwMCwgOTUwOCwgOTUxNiwgOTUyNCwgOTUzMiwgOTU1MiwgOTU1MywgOTU1NCwgOTU1NSwgOTU1NiwgOTU1NywgOTU1OCwgOTU1OSwgOTU2MCwgOTU2MSwgOTU2MiwgOTU2MywgOTU2NCwgOTU2NSwgOTU2NiwgOTU2NywgOTU2OCwgOTU2OSwgOTU3MCwgOTU3MSwgOTU3MiwgOTU3MywgOTU3NCwgOTU3NSwgOTU3NiwgOTU3NywgOTU3OCwgOTU3OSwgOTU4MCwgOTYwMCwgOTYwNCwgOTYwOCwgOTYxMiwgOTYxNiwgOTYxNywgOTYxOCwgOTYxOSwgOTYzMiwgOTYzMywgOTY0MiwgOTY0MywgOTY0NCwgOTY1MCwgOTY1OCwgOTY2MCwgOTY2OCwgOTY3NCwgOTY3NSwgOTY3OSwgOTY4OCwgOTY4OSwgOTcwMiwgOTc4NiwgOTc4NywgOTc4OCwgOTc5MiwgOTc5NCwgOTgyNCwgOTgyNywgOTgyOSwgOTgzMCwgOTgzNCwgOTgzNSwgOTgzNiwgNjE0NDEsIDYxNDQyLCA2MTQ0NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xXTsKCjsvLyAuL3NyYy9jb3JlL215cmlhZHByb19mYWN0b3JzLmpzCmNvbnN0IE15cmlhZFByb0JvbGRGYWN0b3JzID0gWzEuMzY4OTgsIDEsIDEsIDAuNzI3MDYsIDAuODA0NzksIDAuODM3MzQsIDAuOTg4OTQsIDAuOTk3OTMsIDAuOTg5NywgMC45Mzg4NCwgMC44NjIwOSwgMC45NDI5MiwgMC45NDI5MiwgMS4xNjY2MSwgMS4wMjA1OCwgMC45MzU4MiwgMC45NjY5NCwgMC45MzU4MiwgMS4xOTEzNywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC43ODA3NiwgMC43ODA3NiwgMS4wMjA1OCwgMS4wMjA1OCwgMS4wMjA1OCwgMC43Mjg1MSwgMC43ODk2NiwgMC45MDgzOCwgMC44MzYzNywgMC44MjM5MSwgMC45NjM3NiwgMC44MDA2MSwgMC44NjI3NSwgMC44NzY4LCAwLjk1NDA3LCAxLjAyNTgsIDAuNzM5MDEsIDAuODUwMjIsIDAuODM2NTUsIDEuMDE1NiwgMC45NTU0NiwgMC45MjE3OSwgMC44NzEwNywgMC45MjE3OSwgMC44MjExNCwgMC44MDk2LCAwLjg5NzEzLCAwLjk0NDM4LCAwLjk1MzUzLCAwLjk0MDgzLCAwLjkxOTA1LCAwLjkwNDA2LCAwLjk0NDYsIDAuOTQyOTIsIDEuMTg3NzcsIDAuOTQyOTIsIDEuMDIwNTgsIDAuODk5MDMsIDAuOTAwODgsIDAuOTQ5MzgsIDAuOTc4OTgsIDAuODEwOTMsIDAuOTc1NzEsIDAuOTQ5MzgsIDEuMDI0LCAwLjk1NzcsIDAuOTU5MzMsIDAuOTg2MjEsIDEuMDQ3NCwgMC45NzQ1NSwgMC45ODk4MSwgMC45NjcyLCAwLjk1OTMzLCAwLjk0NDYsIDAuOTc4OTgsIDAuOTc0MDcsIDAuOTc2NDYsIDAuNzgwMzYsIDEuMTAyMDgsIDAuOTU0NDIsIDAuOTUyOTgsIDAuOTc1NzksIDAuOTMzMiwgMC45NDAzOSwgMC45MzgsIDAuODA2ODcsIDEuMDExNDksIDAuODA2ODcsIDEuMDIwNTgsIDAuODA0NzksIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDEuMDExNDksIDEuMDA4NzIsIDAuOTAwODgsIDAuOTE4ODIsIDEuMDIxMywgMC44MzYxLCAxLjAyMDU4LCAwLjYyMjk1LCAwLjU0MzI0LCAwLjg5MDIyLCAxLjA4NTk1LCAxLCAxLCAwLjkwMDg4LCAxLCAwLjk3NDU1LCAwLjkzNTgyLCAwLjkwMDg4LCAxLCAxLjA1Njg2LCAwLjgzNjEsIDAuOTk2NDIsIDAuOTk2NDIsIDAuOTk2NDIsIDAuNzI4NTEsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuODY4LCAwLjgyMzkxLCAwLjgwMDYxLCAwLjgwMDYxLCAwLjgwMDYxLCAwLjgwMDYxLCAxLjAyNTgsIDEuMDI1OCwgMS4wMjU4LCAxLjAyNTgsIDAuOTc0ODQsIDAuOTU1NDYsIDAuOTIxNzksIDAuOTIxNzksIDAuOTIxNzksIDAuOTIxNzksIDAuOTIxNzksIDEuMDIwNTgsIDAuOTIxNzksIDAuOTQ0MzgsIDAuOTQ0MzgsIDAuOTQ0MzgsIDAuOTQ0MzgsIDAuOTA0MDYsIDAuODY5NTgsIDAuOTgyMjUsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTAzMSwgMC44MTA5MywgMC45NDkzOCwgMC45NDkzOCwgMC45NDkzOCwgMC45NDkzOCwgMC45ODYyMSwgMC45ODYyMSwgMC45ODYyMSwgMC45ODYyMSwgMC45Mzk2OSwgMC45NTkzMywgMC45NDQ2LCAwLjk0NDYsIDAuOTQ0NiwgMC45NDQ2LCAwLjk0NDYsIDEuMDg1OTUsIDAuOTQ0NiwgMC45NTQ0MiwgMC45NTQ0MiwgMC45NTQ0MiwgMC45NTQ0MiwgMC45NDAzOSwgMC45Nzg5OCwgMC45NDAzOSwgMC45MDgzOCwgMC45NDkzOCwgMC45MDgzOCwgMC45NDkzOCwgMC45MDgzOCwgMC45NDkzOCwgMC44MjM5MSwgMC44MTA5MywgMC44MjM5MSwgMC44MTA5MywgMC44MjM5MSwgMC44MTA5MywgMC44MjM5MSwgMC44MTA5MywgMC45NjM3NiwgMC44NDMxMywgMC45NzQ4NCwgMC45NzU3MSwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44NzY4LCAwLjk1NzcsIDAuODc2OCwgMC45NTc3LCAwLjg3NjgsIDAuOTU3NywgMSwgMSwgMC45NTQwNywgMC45NTkzMywgMC45NzA2OSwgMC45NTkzMywgMS4wMjU4LCAwLjk4NjIxLCAxLjAyNTgsIDAuOTg2MjEsIDEuMDI1OCwgMC45ODYyMSwgMS4wMjU4LCAwLjk4NjIxLCAxLjAyNTgsIDAuOTg2MjEsIDAuODg3LCAxLjAxNTkxLCAwLjczOTAxLCAxLjA0NzQsIDEsIDEsIDAuOTc0NTUsIDAuODM2NTUsIDAuOTg5ODEsIDEsIDEsIDAuODM2NTUsIDAuNzM5NzcsIDAuODM2NTUsIDAuNzM5MDMsIDAuODQ2MzgsIDEuMDMzLCAwLjk1NTQ2LCAwLjk1OTMzLCAxLCAxLCAwLjk1NTQ2LCAwLjk1OTMzLCAwLjgyNzEsIDAuOTU0MTcsIDAuOTU5MzMsIDAuOTIxNzksIDAuOTQ0NiwgMC45MjE3OSwgMC45NDQ2LCAwLjkyMTc5LCAwLjk0NDYsIDAuOTM2LCAwLjkxOTY0LCAwLjgyMTE0LCAwLjk3NjQ2LCAxLCAxLCAwLjgyMTE0LCAwLjk3NjQ2LCAwLjgwOTYsIDAuNzgwMzYsIDAuODA5NiwgMC43ODAzNiwgMSwgMSwgMC44MDk2LCAwLjc4MDM2LCAxLCAxLCAwLjg5NzEzLCAwLjc3NDUyLCAwLjg5NzEzLCAxLjEwMjA4LCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0MDgzLCAwLjk3NTc5LCAwLjkwNDA2LCAwLjk0MDM5LCAwLjkwNDA2LCAwLjk0NDYsIDAuOTM4LCAwLjk0NDYsIDAuOTM4LCAwLjk0NDYsIDAuOTM4LCAxLCAwLjk5NzkzLCAwLjkwODM4LCAwLjk0OTM4LCAwLjg2OCwgMC45MDMxLCAwLjkyMTc5LCAwLjk0NDYsIDEsIDEsIDAuODk3MTMsIDEuMTAyMDgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTA5ODksIDAuOTM1OCwgMC45MTk0NSwgMC44MzE4MSwgMC43NTI2MSwgMC44Nzk5MiwgMC44Mjk3NiwgMC45NjAzNCwgMC44MzY4OSwgMC45NzI2OCwgMS4wMDc4LCAwLjkwODM4LCAwLjgzNjM3LCAwLjgwMTksIDAuOTAxNTcsIDAuODAwNjEsIDAuOTQ0NiwgMC45NTQwNywgMC45MjQzNiwgMS4wMjU4LCAwLjg1MDIyLCAwLjk3MTUzLCAxLjAxNTYsIDAuOTU1NDYsIDAuODkxOTIsIDAuOTIxNzksIDAuOTIzNjEsIDAuODcxMDcsIDAuOTYzMTgsIDAuODk3MTMsIDAuOTM3MDQsIDAuOTU2MzgsIDAuOTE5MDUsIDAuOTE3MDksIDAuOTI3OTYsIDEuMDI1OCwgMC45MzcwNCwgMC45NDgzNiwgMS4wMzczLCAwLjk1OTMzLCAxLjAwNzgsIDAuOTU4NzEsIDAuOTQ4MzYsIDAuOTYxNzQsIDAuOTI2MDEsIDAuOTQ5OCwgMC45ODYwNywgMC45NTc3NiwgMC45NTkzMywgMS4wNTQ1MywgMS4wMDc4LCAwLjk4Mjc1LCAwLjkzMTQsIDAuOTU2MTcsIDAuOTE3MDEsIDEuMDU5OTMsIDAuOTQ0NiwgMC43ODM2NywgMC45NTUzLCAxLCAwLjg2ODMyLCAxLjAxMjgsIDAuOTU4NzEsIDAuOTkzOTQsIDAuODc1NDgsIDAuOTYzNjEsIDAuODY3NzQsIDEuMDA3OCwgMC45NTg3MSwgMC45NDQ2LCAwLjk1ODcxLCAwLjg2Nzc0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk0MDgzLCAwLjk3NTc5LCAwLjk0MDgzLCAwLjk3NTc5LCAwLjk0MDgzLCAwLjk3NTc5LCAwLjkwNDA2LCAwLjk0MDM5LCAwLjk2Njk0LCAxLCAwLjg5OTAzLCAxLCAxLCAxLCAwLjkzNTgyLCAwLjkzNTgyLCAwLjkzNTgyLCAxLCAwLjkwOCwgMC45MDgsIDAuOTE4LCAwLjk0MjE5LCAwLjk0MjE5LCAwLjk2NTQ0LCAxLCAxLjI4NSwgMSwgMSwgMC44MTA3OSwgMC44MTA3OSwgMSwgMSwgMC43NDg1NCwgMSwgMSwgMSwgMSwgMC45OTc5MywgMSwgMSwgMSwgMC42NSwgMSwgMS4zNjE0NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4xNzE3MywgMSwgMC44MDUzNSwgMC43NjE2OSwgMS4wMjA1OCwgMS4wNzMyLCAxLjA1NDg2LCAxLCAxLCAxLjMwNjkyLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjE2MTYxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgTXlyaWFkUHJvQm9sZE1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yLAogIGxpbmVHYXA6IDAuMgp9Owpjb25zdCBNeXJpYWRQcm9Cb2xkSXRhbGljRmFjdG9ycyA9IFsxLjM2ODk4LCAxLCAxLCAwLjY2MjI3LCAwLjgwNzc5LCAwLjgxNjI1LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3NzMzLCAwLjkyMjIyLCAwLjgzMjY2LCAwLjk0MjkyLCAwLjk0MjkyLCAxLjE2MTQ4LCAxLjAyMDU4LCAwLjkzNTgyLCAwLjk2Njk0LCAwLjkzNTgyLCAxLjE3MzM3LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjc4MDc2LCAwLjc4MDc2LCAxLjAyMDU4LCAxLjAyMDU4LCAxLjAyMDU4LCAwLjcxNTQxLCAwLjc2ODEzLCAwLjg1NTc2LCAwLjgwNTkxLCAwLjgwNzI5LCAwLjk0Mjk5LCAwLjc3NTEyLCAwLjgzNjU1LCAwLjg2NTIzLCAwLjkyMjIyLCAwLjk4NjIxLCAwLjcxNzQzLCAwLjgxNjk4LCAwLjc5NzI2LCAwLjk4NTU4LCAwLjkyMjIyLCAwLjkwNjM3LCAwLjgzODA5LCAwLjkwNjM3LCAwLjgwNzI5LCAwLjc2NDYzLCAwLjg2Mjc1LCAwLjkwNjk5LCAwLjkxNjA1LCAwLjkxNTQsIDAuODUzMDgsIDAuODU0NTgsIDAuOTA1MzEsIDAuOTQyOTIsIDEuMjEyOTYsIDAuOTQyOTIsIDEuMDIwNTgsIDAuODk5MDMsIDEuMTg2MTYsIDAuOTk2MTMsIDAuOTE2NzcsIDAuNzgyMTYsIDAuOTE2NzcsIDAuOTAwODMsIDAuOTg3OTYsIDAuOTEzNSwgMC45MjE2OCwgMC45NTM4MSwgMC45ODk4MSwgMC45NTI5OCwgMC45NTM4MSwgMC45MzQ1OSwgMC45MjE2OCwgMC45MTUxMywgMC45MjAwNCwgMC45MTY3NywgMC45NTA3NywgMC43NDgsIDEuMDQ1MDIsIDAuOTE2NzcsIDAuOTIwNjEsIDAuOTQyMzYsIDAuODk1NDQsIDAuODkzNjQsIDAuOSwgMC44MDY4NywgMC44NTc4LCAwLjgwNjg3LCAxLjAyMDU4LCAwLjgwNzc5LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjg1NzgsIDAuOTk5NzMsIDEuMTg2MTYsIDAuOTEzMzksIDEuMDgwNzQsIDAuODI4OTEsIDEuMDIwNTgsIDAuNTU1MDksIDAuNzE1MjYsIDAuODkwMjIsIDEuMDg1OTUsIDEsIDEsIDEuMTg2MTYsIDEsIDAuOTY3MzYsIDAuOTM1ODIsIDEuMTg2MTYsIDEsIDEuMDQ4NjQsIDAuODI3MTEsIDAuOTkwNDMsIDAuOTkwNDMsIDAuOTkwNDMsIDAuNzE1NDEsIDAuODU1NzYsIDAuODU1NzYsIDAuODU1NzYsIDAuODU1NzYsIDAuODU1NzYsIDAuODU1NzYsIDAuODQ1LCAwLjgwNzI5LCAwLjc3NTEyLCAwLjc3NTEyLCAwLjc3NTEyLCAwLjc3NTEyLCAwLjk4NjIxLCAwLjk4NjIxLCAwLjk4NjIxLCAwLjk4NjIxLCAwLjk1OTYxLCAwLjkyMjIyLCAwLjkwNjM3LCAwLjkwNjM3LCAwLjkwNjM3LCAwLjkwNjM3LCAwLjkwNjM3LCAxLjAyMDU4LCAwLjkwMjUxLCAwLjkwNjk5LCAwLjkwNjk5LCAwLjkwNjk5LCAwLjkwNjk5LCAwLjg1NDU4LCAwLjgzNjU5LCAwLjk0OTUxLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjg1ODExLCAwLjc4MjE2LCAwLjkwMDgzLCAwLjkwMDgzLCAwLjkwMDgzLCAwLjkwMDgzLCAwLjk1MzgxLCAwLjk1MzgxLCAwLjk1MzgxLCAwLjk1MzgxLCAwLjkxMzUsIDAuOTIxNjgsIDAuOTE1MTMsIDAuOTE1MTMsIDAuOTE1MTMsIDAuOTE1MTMsIDAuOTE1MTMsIDEuMDg1OTUsIDAuOTE2NzcsIDAuOTE2NzcsIDAuOTE2NzcsIDAuOTE2NzcsIDAuOTE2NzcsIDAuODkzNjQsIDAuOTIzMzIsIDAuODkzNjQsIDAuODU1NzYsIDAuOTk2MTMsIDAuODU1NzYsIDAuOTk2MTMsIDAuODU1NzYsIDAuOTk2MTMsIDAuODA3MjksIDAuNzgyMTYsIDAuODA3MjksIDAuNzgyMTYsIDAuODA3MjksIDAuNzgyMTYsIDAuODA3MjksIDAuNzgyMTYsIDAuOTQyOTksIDAuNzY3ODMsIDAuOTU5NjEsIDAuOTE2NzcsIDAuNzc1MTIsIDAuOTAwODMsIDAuNzc1MTIsIDAuOTAwODMsIDAuNzc1MTIsIDAuOTAwODMsIDAuNzc1MTIsIDAuOTAwODMsIDAuNzc1MTIsIDAuOTAwODMsIDAuODY1MjMsIDAuOTEzNSwgMC44NjUyMywgMC45MTM1LCAwLjg2NTIzLCAwLjkxMzUsIDEsIDEsIDAuOTIyMjIsIDAuOTIxNjgsIDAuOTIyMjIsIDAuOTIxNjgsIDAuOTg2MjEsIDAuOTUzODEsIDAuOTg2MjEsIDAuOTUzODEsIDAuOTg2MjEsIDAuOTUzODEsIDAuOTg2MjEsIDAuOTUzODEsIDAuOTg2MjEsIDAuOTUzODEsIDAuODYwMzYsIDAuOTcwOTYsIDAuNzE3NDMsIDAuOTg5ODEsIDEsIDEsIDAuOTUyOTgsIDAuNzk3MjYsIDAuOTUzODEsIDEsIDEsIDAuNzk3MjYsIDAuNjg5NCwgMC43OTcyNiwgMC43NDMyMSwgMC44MTY5MSwgMS4wMDA2LCAwLjkyMjIyLCAwLjkyMTY4LCAxLCAxLCAwLjkyMjIyLCAwLjkyMTY4LCAwLjc5NDY0LCAwLjkyMDk4LCAwLjkyMTY4LCAwLjkwNjM3LCAwLjkxNTEzLCAwLjkwNjM3LCAwLjkxNTEzLCAwLjkwNjM3LCAwLjkxNTEzLCAwLjkwOSwgMC44NzUxNCwgMC44MDcyOSwgMC45NTA3NywgMSwgMSwgMC44MDcyOSwgMC45NTA3NywgMC43NjQ2MywgMC43NDgsIDAuNzY0NjMsIDAuNzQ4LCAxLCAxLCAwLjc2NDYzLCAwLjc0OCwgMSwgMSwgMC44NjI3NSwgMC43MjY1MSwgMC44NjI3NSwgMS4wNDUwMiwgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MTU0LCAwLjk0MjM2LCAwLjg1NDU4LCAwLjg5MzY0LCAwLjg1NDU4LCAwLjkwNTMxLCAwLjksIDAuOTA1MzEsIDAuOSwgMC45MDUzMSwgMC45LCAxLCAwLjk3Mjc2LCAwLjg1NTc2LCAwLjk5NjEzLCAwLjg0NSwgMC44NTgxMSwgMC45MDI1MSwgMC45MTY3NywgMSwgMSwgMC44NjI3NSwgMS4wNDUwMiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4wMDg5OSwgMS4zMDYyOCwgMC44NTU3NiwgMC44MDE3OCwgMC42Njg2MiwgMC43OTI3LCAwLjY5MzIzLCAwLjg4MTI3LCAwLjcyNDU5LCAwLjg5NzExLCAwLjk1MzgxLCAwLjg1NTc2LCAwLjgwNTkxLCAwLjc4MDUsIDAuOTQ3MjksIDAuNzc1MTIsIDAuOTA1MzEsIDAuOTIyMjIsIDAuOTA2MzcsIDAuOTg2MjEsIDAuODE2OTgsIDAuOTI2NTUsIDAuOTg1NTgsIDAuOTIyMjIsIDAuODUzNTksIDAuOTA2MzcsIDAuOTA5NzYsIDAuODM4MDksIDAuOTQ1MjMsIDAuODYyNzUsIDAuODM1MDksIDAuOTMxNTcsIDAuODUzMDgsIDAuODMzOTIsIDAuOTIzNDYsIDAuOTg2MjEsIDAuODM1MDksIDAuOTI4ODYsIDAuOTEzMjQsIDAuOTIxNjgsIDAuOTUzODEsIDAuOTA2NDYsIDAuOTI4ODYsIDAuOTA1NTcsIDAuODY4NDcsIDAuOTAyNzYsIDAuOTEzMjQsIDAuODY4NDIsIDAuOTIxNjgsIDAuOTk1MzEsIDAuOTUzODEsIDAuOTIyNCwgMC44NTQwOCwgMC45MjY5OSwgMC44Njg0NywgMS4wMDUxLCAwLjkxNTEzLCAwLjgwNDg3LCAwLjkzNDgxLCAxLCAwLjg4MTU5LCAxLjA1MjE0LCAwLjkwNjQ2LCAwLjk3MzU1LCAwLjgxNTM5LCAwLjg5Mzk4LCAwLjg1OTIzLCAwLjk1MzgxLCAwLjkwNjQ2LCAwLjkxNTEzLCAwLjkwNjQ2LCAwLjg1OTIzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjkxNTQsIDAuOTQyMzYsIDAuOTE1NCwgMC45NDIzNiwgMC45MTU0LCAwLjk0MjM2LCAwLjg1NDU4LCAwLjg5MzY0LCAwLjk2Njk0LCAxLCAwLjg5OTAzLCAxLCAxLCAxLCAwLjkxNzgyLCAwLjkxNzgyLCAwLjkxNzgyLCAxLCAwLjg5NiwgMC44OTYsIDAuODk2LCAwLjkzMzIsIDAuOTMzMiwgMC45NTk3MywgMSwgMS4yNiwgMSwgMSwgMC44MDQ3OSwgMC44MDE3OCwgMSwgMSwgMC44NTYzMywgMSwgMSwgMSwgMSwgMC45NzI3NiwgMSwgMSwgMSwgMC42OTgsIDEsIDEuMzYxNDUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMTQ1NDIsIDEsIDAuNzkxOTksIDAuNzg2OTQsIDEuMDIwNTgsIDEuMDM0OTMsIDEuMDU0ODYsIDEsIDEsIDEuMjMwMjYsIDEuMDg1OTUsIDEuMDg1OTUsIDEsIDEuMDg1OTUsIDEuMDg1OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMjAwMDYsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBNeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIsCiAgbGluZUdhcDogMC4yCn07CmNvbnN0IE15cmlhZFByb0l0YWxpY0ZhY3RvcnMgPSBbMS4zNjg5OCwgMSwgMSwgMC42NTUwNywgMC44NDk0MywgMC44NTYzOSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44NjkzNiwgMC44ODMwNywgMC44Njk0OCwgMC44NTI4MywgMC44NTI4MywgMS4wNjM4MywgMS4wMjA1OCwgMC43NTk0NSwgMC45MjE5LCAwLjc1OTQ1LCAxLjE3MzM3LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjc1OTQ1LCAwLjc1OTQ1LCAxLjAyMDU4LCAxLjAyMDU4LCAxLjAyMDU4LCAwLjY5MDQ2LCAwLjcwOTI2LCAwLjg1MTU4LCAwLjc3ODEyLCAwLjc2ODUyLCAwLjg5NTkxLCAwLjcwNDY2LCAwLjc2MTI1LCAwLjgwMDk0LCAwLjg2ODIyLCAwLjgzODY0LCAwLjcyOCwgMC43NzIxMiwgMC43OTQ3NSwgMC45MzYzNywgMC44NzUxNCwgMC44NTg4LCAwLjc2MDEzLCAwLjg1ODgsIDAuNzI0MjEsIDAuNjk4NjYsIDAuNzc1OTgsIDAuODU5OTEsIDAuODA4MTEsIDAuODc4MzIsIDAuNzgxMTIsIDAuNzc1MTIsIDAuODU2MiwgMS4wMjIyLCAxLjE4NDE3LCAxLjAyMjIsIDEuMjcwMTQsIDAuODk5MDMsIDEuMTUwMTIsIDAuOTM4NTksIDAuOTQzOTksIDAuODQ2LCAwLjk0Mzk5LCAwLjgxNDUzLCAxLjAxODYsIDAuOTQyMTksIDAuOTYwMTcsIDEuMDMwNzUsIDEuMDIxNzUsIDAuOTEyLCAxLjAzMDc1LCAwLjk2OTk4LCAwLjk2MDE3LCAwLjkzODU5LCAwLjk0Mzk5LCAwLjk0Mzk5LCAwLjk1NDkzLCAwLjc0NiwgMS4xMjY1OCwgMC45NDU3OCwgMC45MSwgMC45NzksIDAuODgyLCAwLjg4MiwgMC44MywgMC44NTAzNCwgMC44MzUzNywgMC44NTAzNCwgMS4wMjA1OCwgMC43MDg2OSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44MzUzNywgMC45MDA4MywgMS4xNTAxMiwgMC45MTYxLCAwLjk0NTY1LCAwLjczNTQxLCAxLjAyMDU4LCAwLjUzNjA5LCAwLjY5MzUzLCAwLjc5NTE5LCAxLjA4NTk1LCAxLCAxLCAxLjE1MDEyLCAxLCAwLjkxOTc0LCAwLjc1OTQ1LCAxLjE1MDEyLCAxLCAwLjk0NDYsIDAuNzMzNjEsIDAuOTAwNSwgMC45MDA1LCAwLjkwMDUsIDAuNjI4NjQsIDAuODUxNTgsIDAuODUxNTgsIDAuODUxNTgsIDAuODUxNTgsIDAuODUxNTgsIDAuODUxNTgsIDAuNzczLCAwLjc2ODUyLCAwLjcwNDY2LCAwLjcwNDY2LCAwLjcwNDY2LCAwLjcwNDY2LCAwLjgzODY0LCAwLjgzODY0LCAwLjgzODY0LCAwLjgzODY0LCAwLjkwNTYxLCAwLjg3NTE0LCAwLjg1ODgsIDAuODU4OCwgMC44NTg4LCAwLjg1ODgsIDAuODU4OCwgMS4wMjA1OCwgMC44NTc1MSwgMC44NTk5MSwgMC44NTk5MSwgMC44NTk5MSwgMC44NTk5MSwgMC43NzUxMiwgMC43NjAxMywgMC44ODA3NSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC44MDc1LCAwLjg0NiwgMC44MTQ1MywgMC44MTQ1MywgMC44MTQ1MywgMC44MTQ1MywgMC44MjQyNCwgMC44MjQyNCwgMC44MjQyNCwgMC44MjQyNCwgMC45Mjc4LCAwLjk2MDE3LCAwLjkzODU5LCAwLjkzODU5LCAwLjkzODU5LCAwLjkzODU5LCAwLjkzODU5LCAxLjA4NTk1LCAwLjg1NjIsIDAuOTQ1NzgsIDAuOTQ1NzgsIDAuOTQ1NzgsIDAuOTQ1NzgsIDAuODgyLCAwLjk0NTc4LCAwLjg4MiwgMC44NTE1OCwgMC45Mzg1OSwgMC44NTE1OCwgMC45Mzg1OSwgMC44NTE1OCwgMC45Mzg1OSwgMC43Njg1MiwgMC44NDYsIDAuNzY4NTIsIDAuODQ2LCAwLjc2ODUyLCAwLjg0NiwgMC43Njg1MiwgMC44NDYsIDAuODk1OTEsIDAuODU0NCwgMC45MDU2MSwgMC45NDM5OSwgMC43MDQ2NiwgMC44MTQ1MywgMC43MDQ2NiwgMC44MTQ1MywgMC43MDQ2NiwgMC44MTQ1MywgMC43MDQ2NiwgMC44MTQ1MywgMC43MDQ2NiwgMC44MTQ1MywgMC44MDA5NCwgMC45NDIxOSwgMC44MDA5NCwgMC45NDIxOSwgMC44MDA5NCwgMC45NDIxOSwgMSwgMSwgMC44NjgyMiwgMC45NjAxNywgMC44NjgyMiwgMC45NjAxNywgMC44Mzg2NCwgMC44MjQyNCwgMC44Mzg2NCwgMC44MjQyNCwgMC44Mzg2NCwgMC44MjQyNCwgMC44Mzg2NCwgMS4wMzA3NSwgMC44Mzg2NCwgMC44MjQyNCwgMC44MTQwMiwgMS4wMjczOCwgMC43MjgsIDEuMDIxNzUsIDEsIDEsIDAuOTEyLCAwLjc5NDc1LCAxLjAzMDc1LCAxLCAxLCAwLjc5NDc1LCAwLjgzOTExLCAwLjc5NDc1LCAwLjY2MjY2LCAwLjgwNTUzLCAxLjA2Njc2LCAwLjg3NTE0LCAwLjk2MDE3LCAxLCAxLCAwLjg3NTE0LCAwLjk2MDE3LCAwLjg2ODY1LCAwLjg3Mzk2LCAwLjk2MDE3LCAwLjg1ODgsIDAuOTM4NTksIDAuODU4OCwgMC45Mzg1OSwgMC44NTg4LCAwLjkzODU5LCAwLjg2NywgMC44NDc1OSwgMC43MjQyMSwgMC45NTQ5MywgMSwgMSwgMC43MjQyMSwgMC45NTQ5MywgMC42OTg2NiwgMC43NDYsIDAuNjk4NjYsIDAuNzQ2LCAxLCAxLCAwLjY5ODY2LCAwLjc0NiwgMSwgMSwgMC43NzU5OCwgMC44ODQxNywgMC43NzU5OCwgMS4xMjY1OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NzgzMiwgMC45NzksIDAuNzc1MTIsIDAuODgyLCAwLjc3NTEyLCAwLjg1NjIsIDAuODMsIDAuODU2MiwgMC44MywgMC44NTYyLCAwLjgzLCAxLCAwLjg4NDY1LCAwLjg1MTU4LCAwLjkzODU5LCAwLjc3MywgMC44MDc1LCAwLjg1NzUxLCAwLjg1NjIsIDEsIDEsIDAuNzc1OTgsIDEuMTI2NTgsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUzMTMsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMDgxMDYsIDEuMDM5MDEsIDAuODUxNTgsIDAuNzcwMjUsIDAuNjIyNjQsIDAuNzY0NiwgMC42NTM1MSwgMC44NjAyNiwgMC42OTQ2MSwgMC44OTk0NywgMS4wMzA3NSwgMC44NTE1OCwgMC43NzgxMiwgMC43NjQ0OSwgMC44ODgzNiwgMC43MDQ2NiwgMC44NTYyLCAwLjg2ODIyLCAwLjg1ODgsIDAuODM4NjQsIDAuNzcyMTIsIDAuODUzMDgsIDAuOTM2MzcsIDAuODc1MTQsIDAuODIzNTIsIDAuODU4OCwgMC44NTcwMSwgMC43NjAxMywgMC44OTA1OCwgMC43NzU5OCwgMC44MTU2LCAwLjgyNTY1LCAwLjc4MTEyLCAwLjc3ODk5LCAwLjg5Mzg2LCAwLjgzODY0LCAwLjgxNTYsIDAuOTQ4NiwgMC45MjM4OCwgMC45NjE4NiwgMS4wMzA3NSwgMC45MTEyMywgMC45NDg2LCAwLjkzMjk4LCAwLjg3OCwgMC45Mzk0MiwgMC45MjM4OCwgMC44NDU5NiwgMC45NjE4NiwgMC45NTExOSwgMS4wMzA3NSwgMC45MjIsIDAuODg3ODcsIDAuOTU4MjksIDAuODgsIDAuOTM1NTksIDAuOTM4NTksIDAuNzg4MTUsIDAuOTM3NTgsIDEsIDAuODkyMTcsIDEuMDM3MzcsIDAuOTExMjMsIDAuOTM5NjksIDAuNzc0ODcsIDAuODU3NjksIDAuODY3OTksIDEuMDMwNzUsIDAuOTExMjMsIDAuOTM4NTksIDAuOTExMjMsIDAuODY3OTksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODc4MzIsIDAuOTc5LCAwLjg3ODMyLCAwLjk3OSwgMC44NzgzMiwgMC45NzksIDAuNzc1MTIsIDAuODgyLCAwLjkyMTksIDEsIDAuODk5MDMsIDEsIDEsIDEsIDAuODczMjEsIDAuODczMjEsIDAuODczMjEsIDEsIDEuMDI3LCAxLjAyNywgMS4wMjcsIDAuODY4NDcsIDAuODY4NDcsIDAuNzkxMjEsIDEsIDEuMTI0LCAxLCAxLCAwLjczNTcyLCAwLjczNTcyLCAxLCAxLCAwLjg1MDM0LCAxLCAxLCAxLCAxLCAwLjg4NDY1LCAxLCAxLCAxLCAwLjY2OSwgMSwgMS4zNjE0NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNDgyOCwgMSwgMC43NDk0OCwgMC43NTE4NywgMS4wMjA1OCwgMC45ODM5MSwgMS4wMjExOSwgMSwgMSwgMS4wNjIzMywgMS4wODU5NSwgMS4wODU5NSwgMSwgMS4wODU5NSwgMS4wODU5NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNTIzMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IE15cmlhZFByb0l0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yLAogIGxpbmVHYXA6IDAuMgp9Owpjb25zdCBNeXJpYWRQcm9SZWd1bGFyRmFjdG9ycyA9IFsxLjM2ODk4LCAxLCAxLCAwLjc2MzA1LCAwLjgyNzg0LCAwLjk0OTM1LCAwLjg5MzY0LCAwLjkyMjQxLCAwLjg5MDczLCAwLjkwNzA2LCAwLjk4NDcyLCAwLjg1MjgzLCAwLjg1MjgzLCAxLjA2NjQsIDEuMDIwNTgsIDAuNzQ1MDUsIDAuOTIxOSwgMC43NDUwNSwgMS4yMzQ1NiwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC43NDUwNSwgMC43NDUwNSwgMS4wMjA1OCwgMS4wMjA1OCwgMS4wMjA1OCwgMC43MzAwMiwgMC43MjYwMSwgMC45MTc1NSwgMC44MTI2LCAwLjgwMzE0LCAwLjkyMjIyLCAwLjczNzY0LCAwLjc5NzI2LCAwLjgzMDUxLCAwLjkwMjg0LCAwLjg2MDIzLCAwLjc0LCAwLjgxMjYsIDAuODQ4NjksIDAuOTY1MTgsIDAuOTExMTUsIDAuODg1OCwgMC43OTc2MSwgMC44ODU4LCAwLjc0NDk4LCAwLjczOTE0LCAwLjgxMzYzLCAwLjg5NTkxLCAwLjgzNjU5LCAwLjg5NjMzLCAwLjg1NjA4LCAwLjgxMTEsIDAuOTA1MzEsIDEuMDIyMiwgMS4yMjczNiwgMS4wMjIyLCAxLjI3MDE0LCAwLjg5OTAzLCAwLjkwMDg4LCAwLjg2NjY3LCAxLjAyMzEsIDAuODk2LCAxLjAxNDExLCAwLjkwMDgzLCAxLjA1MDk5LCAxLjAwNTEyLCAwLjk5NzkzLCAxLjA1MzI2LCAxLjA5Mzc3LCAwLjkzOCwgMS4wNjIyNiwgMS4wMDExOSwgMC45OTc5MywgMC45ODcxNCwgMS4wMjMxLCAxLjAxMjMxLCAwLjk4MTk2LCAwLjc5MiwgMS4xOTEzNywgMC45OTA3NCwgMC45NjIsIDEuMDE5MTUsIDAuOTI2LCAwLjk0MiwgMC44NTYsIDAuODUwMzQsIDAuOTIwMDYsIDAuODUwMzQsIDEuMDIwNTgsIDAuNjkwNjcsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIwMDYsIDAuOTMzMiwgMC45MDA4OCwgMC45MTg4MiwgMC45MzQ4NCwgMC43NTMzOSwgMS4wMjA1OCwgMC41Njg2NiwgMC41NDMyNCwgMC43OTUxOSwgMS4wODU5NSwgMSwgMSwgMC45MDA4OCwgMSwgMC45NTMyNSwgMC43NDUwNSwgMC45MDA4OCwgMSwgMC45NzE5OCwgMC43NTMzOSwgMC45MTAwOSwgMC45MTAwOSwgMC45MTAwOSwgMC42NjQ2NiwgMC45MTc1NSwgMC45MTc1NSwgMC45MTc1NSwgMC45MTc1NSwgMC45MTc1NSwgMC45MTc1NSwgMC43ODgsIDAuODAzMTQsIDAuNzM3NjQsIDAuNzM3NjQsIDAuNzM3NjQsIDAuNzM3NjQsIDAuODYwMjMsIDAuODYwMjMsIDAuODYwMjMsIDAuODYwMjMsIDAuOTI5MTUsIDAuOTExMTUsIDAuODg1OCwgMC44ODU4LCAwLjg4NTgsIDAuODg1OCwgMC44ODU4LCAxLjAyMDU4LCAwLjg4NTgsIDAuODk1OTEsIDAuODk1OTEsIDAuODk1OTEsIDAuODk1OTEsIDAuODExMSwgMC43OTYxMSwgMC44OTcxMywgMC44NjY2NywgMC44NjY2NywgMC44NjY2NywgMC44NjY2NywgMC44NjY2NywgMC44NjY2NywgMC44NjkzNiwgMC44OTYsIDAuOTAwODMsIDAuOTAwODMsIDAuOTAwODMsIDAuOTAwODMsIDAuODQyMjQsIDAuODQyMjQsIDAuODQyMjQsIDAuODQyMjQsIDAuOTcyNzYsIDAuOTk3OTMsIDAuOTg3MTQsIDAuOTg3MTQsIDAuOTg3MTQsIDAuOTg3MTQsIDAuOTg3MTQsIDEuMDg1OTUsIDAuODk4NzYsIDAuOTkwNzQsIDAuOTkwNzQsIDAuOTkwNzQsIDAuOTkwNzQsIDAuOTQyLCAxLjAyMzEsIDAuOTQyLCAwLjkxNzU1LCAwLjg2NjY3LCAwLjkxNzU1LCAwLjg2NjY3LCAwLjkxNzU1LCAwLjg2NjY3LCAwLjgwMzE0LCAwLjg5NiwgMC44MDMxNCwgMC44OTYsIDAuODAzMTQsIDAuODk2LCAwLjgwMzE0LCAwLjg5NiwgMC45MjIyMiwgMC45MzM3MiwgMC45MjkxNSwgMS4wMTQxMSwgMC43Mzc2NCwgMC45MDA4MywgMC43Mzc2NCwgMC45MDA4MywgMC43Mzc2NCwgMC45MDA4MywgMC43Mzc2NCwgMC45MDA4MywgMC43Mzc2NCwgMC45MDA4MywgMC44MzA1MSwgMS4wMDUxMiwgMC44MzA1MSwgMS4wMDUxMiwgMC44MzA1MSwgMS4wMDUxMiwgMSwgMSwgMC45MDI4NCwgMC45OTc5MywgMC45MDk3NiwgMC45OTc5MywgMC44NjAyMywgMC44NDIyNCwgMC44NjAyMywgMC44NDIyNCwgMC44NjAyMywgMC44NDIyNCwgMC44NjAyMywgMS4wNTMyNiwgMC44NjAyMywgMC44NDIyNCwgMC44Mjg3MywgMS4wNzQ2OSwgMC43NCwgMS4wOTM3NywgMSwgMSwgMC45MzgsIDAuODQ4NjksIDEuMDYyMjYsIDEsIDEsIDAuODQ4NjksIDAuODM3MDQsIDAuODQ4NjksIDAuODE0NDEsIDAuODU1ODgsIDEuMDg5MjcsIDAuOTExMTUsIDAuOTk3OTMsIDEsIDEsIDAuOTExMTUsIDAuOTk3OTMsIDAuOTE4ODcsIDAuOTA5OTEsIDAuOTk3OTMsIDAuODg1OCwgMC45ODcxNCwgMC44ODU4LCAwLjk4NzE0LCAwLjg4NTgsIDAuOTg3MTQsIDAuODk0LCAwLjkxNDM0LCAwLjc0NDk4LCAwLjk4MTk2LCAxLCAxLCAwLjc0NDk4LCAwLjk4MTk2LCAwLjczOTE0LCAwLjc5MiwgMC43MzkxNCwgMC43OTIsIDEsIDEsIDAuNzM5MTQsIDAuNzkyLCAxLCAxLCAwLjgxMzYzLCAwLjkwNCwgMC44MTM2MywgMS4xOTEzNywgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTYzMywgMS4wMTkxNSwgMC44MTExLCAwLjk0MiwgMC44MTExLCAwLjkwNTMxLCAwLjg1NiwgMC45MDUzMSwgMC44NTYsIDAuOTA1MzEsIDAuODU2LCAxLCAwLjkyMjQxLCAwLjkxNzU1LCAwLjg2NjY3LCAwLjc4OCwgMC44NjkzNiwgMC44ODU4LCAwLjg5ODc2LCAxLCAxLCAwLjgxMzYzLCAxLjE5MTM3LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMzg4LCAxLjAzOTAxLCAwLjkyMTM4LCAwLjc4MTA1LCAwLjcxNTQsIDAuODYxNjksIDAuODA1MTMsIDAuOTQwMDcsIDAuODI1MjgsIDAuOTg2MTIsIDEuMDYyMjYsIDAuOTE3NTUsIDAuODEyNiwgMC44MTg4NCwgMC45MjgxOSwgMC43Mzc2NCwgMC45MDUzMSwgMC45MDI4NCwgMC44ODU4LCAwLjg2MDIzLCAwLjgxMjYsIDAuOTExNzIsIDAuOTY1MTgsIDAuOTExMTUsIDAuODMwODksIDAuODg1OCwgMC44Nzc5MSwgMC43OTc2MSwgMC44OTI5NywgMC44MTM2MywgMC44ODE1NywgMC44OTk5MiwgMC44NTYwOCwgMC44MTk5MiwgMC45NDMwNywgMC44NjAyMywgMC44ODE1NywgMC45NTMwOCwgMC45ODY5OSwgMC45OTc5MywgMS4wNjIyNiwgMC45NTgxNywgMC45NTMwOCwgMC45NzM1OCwgMC45MjgsIDAuOTgwODgsIDAuOTg2OTksIDAuOTI3NjEsIDAuOTk3OTMsIDAuOTYwMTcsIDEuMDYyMjYsIDAuOTg2LCAwLjk0NCwgMC45NTk3OCwgMC45MzgsIDAuOTY3MDUsIDAuOTg3MTQsIDAuODA0NDIsIDAuOTg5NzIsIDEsIDAuODk3NjIsIDEuMDQ1NTIsIDAuOTU4MTcsIDAuOTkwMDcsIDAuODcwNjQsIDAuOTE4NzksIDAuODg4ODgsIDEuMDYyMjYsIDAuOTU4MTcsIDAuOTg3MTQsIDAuOTU4MTcsIDAuODg4ODgsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODk2MzMsIDEuMDE5MTUsIDAuODk2MzMsIDEuMDE5MTUsIDAuODk2MzMsIDEuMDE5MTUsIDAuODExMSwgMC45NDIsIDAuOTIxOSwgMSwgMC44OTkwMywgMSwgMSwgMSwgMC45MzE3MywgMC45MzE3MywgMC45MzE3MywgMSwgMS4wNjMwNCwgMS4wNjMwNCwgMS4wNjkwNCwgMC44OTkwMywgMC44OTkwMywgMC44MDU0OSwgMSwgMS4xNTYsIDEsIDEsIDAuNzY1NzUsIDAuNzY1NzUsIDEsIDEsIDAuNzI0NTgsIDEsIDEsIDEsIDEsIDAuOTIyNDEsIDEsIDEsIDEsIDAuNjE5LCAxLCAxLjM2MTQ1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA3MjU3LCAxLCAwLjc0NzA1LCAwLjcxMTE5LCAxLjAyMDU4LCAxLjAyNCwgMS4wMjExOSwgMSwgMSwgMS4xNTM2LCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA1NjM4LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgTXlyaWFkUHJvUmVndWxhck1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yLAogIGxpbmVHYXA6IDAuMgp9OwoKOy8vIC4vc3JjL2NvcmUvc2Vnb2V1aV9mYWN0b3JzLmpzCmNvbnN0IFNlZ29ldWlCb2xkRmFjdG9ycyA9IFsxLjc2NzM4LCAxLCAxLCAwLjk5Mjk3LCAwLjk4MjQsIDEuMDQwMTYsIDEuMDY0OTcsIDEuMDM0MjQsIDAuOTc1MjksIDEuMTc2NDcsIDEuMjMyMDMsIDEuMTA4NSwgMS4xMDg1LCAxLjE2OTM5LCAxLjIxMDcsIDAuOTc1NCwgMS4yMTQwOCwgMC45NzU0LCAxLjU5NTc4LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAwLjgxMzc4LCAwLjgxMzc4LCAxLjIxMDcsIDEuMjEwNywgMS4yMTA3LCAwLjcxNzAzLCAwLjk3ODQ3LCAwLjk3MzYzLCAwLjg4Nzc2LCAwLjg2NDEsIDEuMDIwOTYsIDAuNzk3OTUsIDAuODUxMzIsIDAuOTE0LCAxLjA2MDg1LCAxLjE0MDYsIDAuODAwNywgMC44OTg1OCwgMC44MzY5MywgMS4xNDg4OSwgMS4wOTM5OCwgMC45NzQ4OSwgMC45MjA5NCwgMC45NzQ4OSwgMC45MDM5OSwgMC44NDA0MSwgMC45NTkyMywgMS4wMDEzNSwgMSwgMS4wNjQ2NywgMC45ODI0MywgMC45MDk5NiwgMC45OTM2MSwgMS4xMDg1LCAxLjU2OTQyLCAxLjEwODUsIDEuMjEwNywgMC43NDYyNywgMC45NDI4MiwgMC45Njc1MiwgMS4wMTUxOSwgMC44NjMwNCwgMS4wMTM1OSwgMC45NzI3OCwgMS4xNTEwMywgMS4wMTM1OSwgMC45ODU2MSwgMS4wMjI4NSwgMS4wMjI4NSwgMS4wMDUyNywgMS4wMjI4NSwgMS4wMzAyLCAwLjk5MDQxLCAxLjAwMDgsIDEuMDE1MTksIDEuMDEzNTksIDEuMDIyNTgsIDAuNzkxMDQsIDEuMTY4NjIsIDAuOTkwNDEsIDAuOTc0NTQsIDEuMDI1MTEsIDAuOTkyOTgsIDAuOTY3NTIsIDAuOTU4MDEsIDAuOTQ4NTYsIDEuMTY1NzksIDAuOTQ4NTYsIDEuMjEwNywgMC45ODI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLCAxLjAzNDI0LCAxLjE2NTc5LCAwLjg3MjcsIDEuMzg3MSwgMS4xODYyMiwgMS4xMDgxOCwgMS4wNDQ3OCwgMS4yMTA3LCAxLjE4NjIyLCAwLjc1MTU1LCAwLjk0OTk0LCAxLjI4ODI2LCAxLjIxNDA4LCAxLjIxNDA4LCAwLjkxMDU2LCAxLCAwLjkxNTcyLCAwLjk3NTQsIDAuNjQ2NjMsIDEuMTgzMjgsIDEuMjQ4NjYsIDEuMDQ0NzgsIDEuMTQxNjksIDEuMTU3NDksIDEuMTczODksIDAuNzE3MDMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTM1MDYsIDAuODY0MSwgMC43OTc5NSwgMC43OTc5NSwgMC43OTc5NSwgMC43OTc5NSwgMS4xNDA2LCAxLjE0MDYsIDEuMTQwNiwgMS4xNDA2LCAxLjAyMDk2LCAxLjA5Mzk4LCAwLjk3NDI2LCAwLjk3NDI2LCAwLjk3NDI2LCAwLjk3NDI2LCAwLjk3NDI2LCAxLjIxMDcsIDAuOTc0ODksIDEuMDAxMzUsIDEuMDAxMzUsIDEuMDAxMzUsIDEuMDAxMzUsIDAuOTA5OTYsIDAuOTIwOTQsIDEuMDI3OTgsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTMxMzYsIDAuODYzMDQsIDAuOTcyNzgsIDAuOTcyNzgsIDAuOTcyNzgsIDAuOTcyNzgsIDEuMDIyODUsIDEuMDIyODUsIDEuMDIyODUsIDEuMDIyODUsIDAuOTcxMjIsIDAuOTkwNDEsIDEsIDEsIDEsIDEsIDEsIDEuMjg4MjYsIDEuMDAwOCwgMC45OTA0MSwgMC45OTA0MSwgMC45OTA0MSwgMC45OTA0MSwgMC45Njc1MiwgMS4wMTUxOSwgMC45Njc1MiwgMC45NzM2MywgMC45Njc1MiwgMC45NzM2MywgMC45Njc1MiwgMC45NzM2MywgMC45Njc1MiwgMC44NjQxLCAwLjg2MzA0LCAwLjg2NDEsIDAuODYzMDQsIDAuODY0MSwgMC44NjMwNCwgMC44NjQxLCAwLjg2MzA0LCAxLjAyMDk2LCAxLjAzMDU3LCAxLjAyMDk2LCAxLjAzNTE3LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjkxNCwgMS4wMTM1OSwgMC45MTQsIDEuMDEzNTksIDAuOTE0LCAxLjAxMzU5LCAxLCAxLCAxLjA2MDg1LCAwLjk4NTYxLCAxLjA2MDg1LCAxLjAwODc5LCAxLjE0MDYsIDEuMDIyODUsIDEuMTQwNiwgMS4wMjI4NSwgMS4xNDA2LCAxLjAyMjg1LCAxLjE0MDYsIDEuMDIyODUsIDEuMTQwNiwgMS4wMjI4NSwgMC45NzEzOCwgMS4wODY5MiwgMC44MDA3LCAxLjAyMjg1LCAxLCAxLCAxLjAwNTI3LCAwLjgzNjkzLCAxLjAyMjg1LCAxLCAxLCAwLjgzNjkzLCAwLjk0NTUsIDAuODM2OTMsIDAuOTA0MTgsIDAuODM2OTMsIDEuMTMwMDUsIDEuMDkzOTgsIDAuOTkwNDEsIDEsIDEsIDEuMDkzOTgsIDAuOTkwNDEsIDAuOTY2OTIsIDEuMDkyNTEsIDAuOTkwNDEsIDAuOTc0ODksIDEuMDAwOCwgMC45NzQ4OSwgMS4wMDA4LCAwLjk3NDg5LCAxLjAwMDgsIDAuOTM5OTQsIDAuOTc5MzEsIDAuOTAzOTksIDEuMDIyNTgsIDEsIDEsIDAuOTAzOTksIDEuMDIyNTgsIDAuODQwNDEsIDAuNzkxMDQsIDAuODQwNDEsIDAuNzkxMDQsIDAuODQwNDEsIDAuNzkxMDQsIDAuODQwNDEsIDAuNzkxMDQsIDEsIDEsIDAuOTU5MjMsIDEuMDcwMzQsIDAuOTU5MjMsIDEuMTY4NjIsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDY0NjcsIDEuMDI1MTEsIDAuOTA5OTYsIDAuOTY3NTIsIDAuOTA5OTYsIDAuOTkzNjEsIDAuOTU4MDEsIDAuOTkzNjEsIDAuOTU4MDEsIDAuOTkzNjEsIDAuOTU4MDEsIDEuMDc3MzMsIDEuMDM0MjQsIDAuOTczNjMsIDAuOTY3NTIsIDAuOTM1MDYsIDAuOTMxMzYsIDAuOTc0ODksIDEuMDAwOCwgMSwgMSwgMC45NTkyMywgMS4xNjg2MiwgMS4xNTEwMywgMS4xNTEwMywgMS4wMTE3MywgMS4wMzk1OSwgMC43NTk1MywgMC44MTM3OCwgMC43OTkxMiwgMS4xNTEwMywgMS4yMTk5NCwgMC45NTE2MSwgMC44NzgxNSwgMS4wMTE0OSwgMC44MTUyNSwgMC43Njc2LCAwLjk4MTY3LCAxLjAxMTM0LCAxLjAyNTQ2LCAwLjg0MDk3LCAxLjAzMDg5LCAxLjE4MTAyLCAwLjk3MzYzLCAwLjg4Nzc2LCAwLjg1MTM0LCAwLjk3ODI2LCAwLjc5Nzk1LCAwLjk5MzYxLCAxLjA2MDg1LCAwLjk3NDg5LCAxLjE0MDYsIDAuODk4NTgsIDEuMDM4OCwgMS4xNDg4OSwgMS4wOTM5OCwgMC44NjAzOSwgMC45NzQ4OSwgMS4wNTk1LCAwLjkyMDk0LCAwLjk0NzkzLCAwLjk1OTIzLCAwLjkwOTk2LCAwLjk5MzQ2LCAwLjk4MjQzLCAxLjAyMTEyLCAwLjk1NDkzLCAxLjE0MDYsIDAuOTA5OTYsIDEuMDM1NzQsIDEuMDI1OTcsIDEuMDAwOCwgMS4xODEwMiwgMS4wNjYyOCwgMS4wMzU3NCwgMS4wMTkyLCAxLjAxOTMyLCAxLjAwODg2LCAwLjk3NTMxLCAxLjAxMDYsIDEuMDAwOCwgMS4xMzE4OSwgMS4xODEwMiwgMS4wMjI3NywgMC45ODY4MywgMS4wMDE2LCAwLjk5NTYxLCAxLjA3MjM3LCAxLjAwMDgsIDAuOTA0MzQsIDAuOTk5MjEsIDAuOTM4MDMsIDAuODk2NSwgMS4yMzA4NSwgMS4wNjYyOCwgMS4wNDk4MywgMC45NjI2OCwgMS4wNDk5LCAwLjk4NDM5LCAxLjE4MTAyLCAxLjA2NjI4LCAxLjAwMDgsIDEuMDY2MjgsIDAuOTg0MzksIDAuNzk3OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDk0NjYsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTcyNzgsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDIwNjUsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDY0NjcsIDEuMDI1MTEsIDEuMDY0NjcsIDEuMDI1MTEsIDEuMDY0NjcsIDEuMDI1MTEsIDAuOTA5OTYsIDAuOTY3NTIsIDEsIDEuMjE0MDgsIDAuODk5MDMsIDEsIDEsIDAuNzUxNTUsIDEuMDQzOTQsIDEuMDQzOTQsIDEuMDQzOTQsIDEuMDQzOTQsIDAuOTg2MzMsIDAuOTg2MzMsIDAuOTg2MzMsIDAuNzMwNDcsIDAuNzMwNDcsIDEuMjA2NDIsIDAuOTEyMTEsIDEuMjU2MzUsIDEuMjIyLCAxLjAyOTU2LCAxLjAzMzcyLCAxLjAzMzcyLCAwLjk2MDM5LCAxLjI0NjMzLCAxLCAxLjEyNDU0LCAwLjkzNTAzLCAxLjAzNDI0LCAxLjE5Njg3LCAxLjAzNDI0LCAxLCAxLCAxLCAwLjc3MSwgMSwgMSwgMS4xNTc0OSwgMS4xNTc0OSwgMS4xNTc0OSwgMS4xMDk0OCwgMC44NjI3OSwgMC45NDQzNCwgMC44NjI3OSwgMC45NDQzNCwgMC44NjE4MiwgMSwgMSwgMS4xNjg5NywgMSwgMC45NjA4NSwgMC45MDEzNywgMS4yMTA3LCAxLjE4NDE2LCAxLjEzOTczLCAwLjY5ODI1LCAwLjk3MTYsIDIuMTAzMzksIDEuMjkwMDQsIDEuMjkwMDQsIDEuMjExNzIsIDEuMjkwMDQsIDEuMjkwMDQsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuNDI2MDMsIDEsIDAuOTk4NjIsIDAuOTk4NjIsIDEsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDEuMTg4NzQsIDEuNDI2MDMsIDEsIDEuNDI2MDMsIDEuNDI2MDMsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEuMjg4NiwgMS4wNDMxNSwgMS4xNTI5NiwgMS4zNDE2MywgMSwgMSwgMSwgMS4wOTE5MywgMS4wOTE5MywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IFNlZ29ldWlCb2xkTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjMzMDA4LAogIGxpbmVHYXA6IDAKfTsKY29uc3QgU2Vnb2V1aUJvbGRJdGFsaWNGYWN0b3JzID0gWzEuNzY3MzgsIDEsIDEsIDAuOTg5NDYsIDEuMDM5NTksIDEuMDQwMTYsIDEuMDI4MDksIDEuMDM2LCAwLjk3NjM5LCAxLjEwOTUzLCAxLjIzMjAzLCAxLjExMTQ0LCAxLjExMTQ0LCAxLjE2OTM5LCAxLjIxMjM3LCAwLjk3NTQsIDEuMjEyNjEsIDAuOTc1NCwgMS41OTc1NCwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDAuODEzNzgsIDAuODEzNzgsIDEuMjEyMzcsIDEuMjEyMzcsIDEuMjEyMzcsIDAuNzM1NDEsIDAuOTc4NDcsIDAuOTczNjMsIDAuODk3MjMsIDAuODc4OTcsIDEuMDQyNiwgMC43OTQyOSwgMC44NTI5MiwgMC45MTE0OSwgMS4wNTgxNSwgMS4xNDA2LCAwLjc5NjMxLCAwLjkwMTI4LCAwLjgzODUzLCAxLjA0Mzk2LCAxLjEwNjE1LCAwLjk3NTUyLCAwLjk0NDM2LCAwLjk3NTUyLCAwLjg4NjQxLCAwLjgwNTI3LCAwLjk2MDgzLCAxLjAwMTM1LCAxLCAxLjA2Nzc3LCAwLjk4MTcsIDAuOTExNDIsIDAuOTkzNjEsIDEuMTExNDQsIDEuNTcyOTMsIDEuMTExNDQsIDEuMjEyMzcsIDAuNzQ2MjcsIDEuMzE4MTgsIDEuMDY1ODUsIDAuOTcwNDIsIDAuODMwNTUsIDAuOTcwNDIsIDAuOTM1MDMsIDEuMTI2MSwgMC45NzA0MiwgMC45NzkyMiwgMS4xNDIzNiwgMC45NDU1MiwgMS4wMTA1NCwgMS4xNDIzNiwgMS4wMjQ3MSwgMC45NzkyMiwgMC45NDE2NSwgMC45NzA0MiwgMC45NzA0MiwgMS4wMjc2LCAwLjc4OTI5LCAxLjEyNjEsIDAuOTc5MjIsIDAuOTU4NzQsIDEuMDIxOTcsIDAuOTg1MDcsIDAuOTY3NTIsIDAuOTcxNjgsIDAuOTUxMDcsIDEuMTY1NzksIDAuOTUxMDcsIDEuMjEyMzcsIDEuMDM5NTksIDEuMDM2LCAxLjAzNiwgMSwgMS4wMzYsIDEuMTY1NzksIDAuODczNTcsIDEuMzE4MTgsIDEuMTg3NTQsIDEuMjY3ODEsIDEuMDUzNTYsIDEuMjEyMzcsIDEuMTg2MjIsIDAuNzk0ODcsIDAuOTQ5OTQsIDEuMjkwMDQsIDEuMjQwNDcsIDEuMjQwNDcsIDEuMzE4MTgsIDEsIDAuOTE0ODQsIDAuOTc1NCwgMS4zMTgxOCwgMS4xMzQ5LCAxLjI0ODY2LCAxLjA1MzU2LCAxLjEzOTM0LCAxLjE1NTc0LCAxLjE3Mzg5LCAwLjczNTQxLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk0Mzg1LCAwLjg3ODk3LCAwLjc5NDI5LCAwLjc5NDI5LCAwLjc5NDI5LCAwLjc5NDI5LCAxLjE0MDYsIDEuMTQwNiwgMS4xNDA2LCAxLjE0MDYsIDEuMDQyNiwgMS4xMDYxNSwgMC45NzU1MiwgMC45NzU1MiwgMC45NzU1MiwgMC45NzU1MiwgMC45NzU1MiwgMS4yMTIzNywgMC45NzU1MiwgMS4wMDEzNSwgMS4wMDEzNSwgMS4wMDEzNSwgMS4wMDEzNSwgMC45MTE0MiwgMC45NDQzNiwgMC45ODcyMSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMC45NjcwNSwgMC44MzA1NSwgMC45MzUwMywgMC45MzUwMywgMC45MzUwMywgMC45MzUwMywgMS4xNDIzNiwgMS4xNDIzNiwgMS4xNDIzNiwgMS4xNDIzNiwgMC45MzEyNSwgMC45NzkyMiwgMC45NDE2NSwgMC45NDE2NSwgMC45NDE2NSwgMC45NDE2NSwgMC45NDE2NSwgMS4yOTAwNCwgMC45NDE2NSwgMC45NzkyMiwgMC45NzkyMiwgMC45NzkyMiwgMC45NzkyMiwgMC45Njc1MiwgMC45NzA0MiwgMC45Njc1MiwgMC45NzM2MywgMS4wNjU4NSwgMC45NzM2MywgMS4wNjU4NSwgMC45NzM2MywgMS4wNjU4NSwgMC44Nzg5NywgMC44MzA1NSwgMC44Nzg5NywgMC44MzA1NSwgMC44Nzg5NywgMC44MzA1NSwgMC44Nzg5NywgMC44MzA1NSwgMS4wNDI2LCAxLjAwMzMsIDEuMDQyNiwgMC45NzA0MiwgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC45MTE0OSwgMC45NzA0MiwgMC45MTE0OSwgMC45NzA0MiwgMC45MTE0OSwgMC45NzA0MiwgMSwgMSwgMS4wNTgxNSwgMC45NzkyMiwgMS4wNTgxNSwgMC45NzkyMiwgMS4xNDA2LCAxLjE0MjM2LCAxLjE0MDYsIDEuMTQyMzYsIDEuMTQwNiwgMS4xNDIzNiwgMS4xNDA2LCAxLjE0MjM2LCAxLjE0MDYsIDEuMTQyMzYsIDAuOTc0NDEsIDEuMDQzMDIsIDAuNzk2MzEsIDEuMDE1ODIsIDEsIDEsIDEuMDEwNTQsIDAuODM4NTMsIDEuMTQyMzYsIDEsIDEsIDAuODM4NTMsIDEuMDkxMjUsIDAuODM4NTMsIDAuOTA0MTgsIDAuODM4NTMsIDEuMTk1MDgsIDEuMTA2MTUsIDAuOTc5MjIsIDEsIDEsIDEuMTA2MTUsIDAuOTc5MjIsIDEuMDEwMzQsIDEuMTA0NjYsIDAuOTc5MjIsIDAuOTc1NTIsIDAuOTQxNjUsIDAuOTc1NTIsIDAuOTQxNjUsIDAuOTc1NTIsIDAuOTQxNjUsIDAuOTE2MDIsIDAuOTE5ODEsIDAuODg2NDEsIDEuMDI3NiwgMSwgMSwgMC44ODY0MSwgMS4wMjc2LCAwLjgwNTI3LCAwLjc4OTI5LCAwLjgwNTI3LCAwLjc4OTI5LCAwLjgwNTI3LCAwLjc4OTI5LCAwLjgwNTI3LCAwLjc4OTI5LCAxLCAxLCAwLjk2MDgzLCAxLjA1NDAzLCAwLjk1OTIzLCAxLjE2ODYyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjA2Nzc3LCAxLjAyMTk3LCAwLjkxMTQyLCAwLjk2NzUyLCAwLjkxMTQyLCAwLjk5MzYxLCAwLjk3MTY4LCAwLjk5MzYxLCAwLjk3MTY4LCAwLjk5MzYxLCAwLjk3MTY4LCAxLjIzMTk5LCAxLjAzNiwgMC45NzM2MywgMS4wNjU4NSwgMC45NDM4NSwgMC45NjcwNSwgMC45NzU1MiwgMC45NDE2NSwgMSwgMSwgMC45NjA4MywgMS4xMjYxLCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAwLjk1MTYxLCAxLjI3MTI2LCAxLjAwODExLCAwLjgzMjg0LCAwLjc3NzAyLCAwLjk5MTM3LCAwLjk1MjUzLCAxLjAzNDcsIDAuODYxNDIsIDEuMDcyMDUsIDEuMTQyMzYsIDAuOTczNjMsIDAuODk3MjMsIDAuODY4NjksIDEuMDk4MTgsIDAuNzk0MjksIDAuOTkzNjEsIDEuMDU4MTUsIDAuOTc1NTIsIDEuMTQwNiwgMC45MDEyOCwgMS4wNjY2MiwgMS4wNDM5NiwgMS4xMDYxNSwgMC44NDkxOCwgMC45NzU1MiwgMS4wNDY5NCwgMC45NDQzNiwgMC45ODAxNSwgMC45NjA4MywgMC45MTE0MiwgMS4wMDM1NiwgMC45ODE3LCAxLjAxOTQ1LCAwLjk4OTk5LCAxLjE0MDYsIDAuOTExNDIsIDEuMDQ5NjEsIDAuOTg5OCwgMS4wMDYzOSwgMS4xNDIzNiwgMS4wNzUxNCwgMS4wNDk2MSwgMC45OTYwNywgMS4wMjg5NywgMS4wMDgsIDAuOTg5OCwgMC45NTEzNCwgMS4wMDYzOSwgMS4xMTEyMSwgMS4xNDIzNiwgMS4wMDUxOCwgMC45Nzk4MSwgMS4wMjE4NiwgMSwgMS4wODU3OCwgMC45NDE2NSwgMC45OTMxNCwgMC45ODM4NywgMC45MzAyOCwgMC45MzM3NywgMS4zNTEyNSwgMS4wNzUxNCwgMS4xMDY4NywgMC45MzQ5MSwgMS4wNDIzMiwgMS4wMDM1MSwgMS4xNDIzNiwgMS4wNzUxNCwgMC45NDE2NSwgMS4wNzUxNCwgMS4wMDM1MSwgMC43OTQyOSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wOTA5NywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MzUwMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45NjYwOSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNjc3NywgMS4wMjE5NywgMS4wNjc3NywgMS4wMjE5NywgMS4wNjc3NywgMS4wMjE5NywgMC45MTE0MiwgMC45Njc1MiwgMSwgMS4yMTI2MSwgMC44OTkwMywgMSwgMSwgMC43NTE1NSwgMS4wNDc0NSwgMS4wNDc0NSwgMS4wNDc0NSwgMS4wNDM5NCwgMC45ODYzMywgMC45ODYzMywgMC45ODYzMywgMC43Mjk1OSwgMC43Mjk1OSwgMS4yMDUwMiwgMC45MTQwNiwgMS4yNjUxNCwgMS4yMjIsIDEuMDI5NTYsIDEuMDMzNzIsIDEuMDMzNzIsIDAuOTYwMzksIDEuMjQ2MzMsIDEsIDEuMDkxMjUsIDAuOTMzMjcsIDEuMDMzMzYsIDEuMTY1NDEsIDEuMDM2LCAxLCAxLCAxLCAwLjc3MSwgMSwgMSwgMS4xNTU3NCwgMS4xNTU3NCwgMS4xNTU3NCwgMS4xNTU3NCwgMC44NjM2NCwgMC45NDQzNCwgMC44NjI3OSwgMC45NDQzNCwgMC44NjIyNCwgMSwgMSwgMS4xNjc5OCwgMSwgMC45NjA4NSwgMC45MDA2OCwgMS4yMTIzNywgMS4xODQxNiwgMS4xMzkwNCwgMC42OTgyNSwgMC45NzE2LCAyLjEwMzM5LCAxLjI5MDA0LCAxLjI5MDA0LCAxLjIxMzM5LCAxLjI5MDA0LCAxLjI5MDA0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjQyNjAzLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAxLjE4Nzc1LCAxLjQyNjAzLCAxLCAxLjQyNjAzLCAxLjQyNjAzLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjI4ODYsIDEuMDQzMTUsIDEuMTUyOTYsIDEuMzQxNjMsIDEsIDEsIDEsIDEuMTMyNjksIDEuMTMyNjksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBTZWdvZXVpQm9sZEl0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4zMzAwOCwKICBsaW5lR2FwOiAwCn07CmNvbnN0IFNlZ29ldWlJdGFsaWNGYWN0b3JzID0gWzEuNzY3MzgsIDEsIDEsIDAuOTg5NDYsIDEuMTQ3NjMsIDEuMDUzNjUsIDEuMDYyMzQsIDAuOTY5MjcsIDAuOTI1ODYsIDEuMTUzNzMsIDEuMTg0MTQsIDAuOTEzNDksIDAuOTEzNDksIDEuMDc0MDMsIDEuMTczMDgsIDAuNzgzODMsIDEuMjAwODgsIDAuNzgzODMsIDEuNDI1MzEsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuNzgzODMsIDAuNzgzODMsIDEuMTczMDgsIDEuMTczMDgsIDEuMTczMDgsIDAuNzczNDksIDAuOTQ1NjUsIDAuOTQ3MjksIDAuODU5NDQsIDAuODg1MDYsIDAuOTg1OCwgMC43NDgxNywgMC44MDAxNiwgMC44ODQ0OSwgMC45ODAzOSwgMC45NTc4MiwgMC42OTIzOCwgMC44OTg5OCwgMC44MzIzMSwgMC45ODE4MywgMS4wMzk4OSwgMC45NjkyNCwgMC44NjIzNywgMC45NjkyNCwgMC44MDU5NSwgMC43NDUyNCwgMC44NjA5MSwgMC45NTQwMiwgMC45NDE0MywgMC45ODQ0OCwgMC44ODU4LCAwLjgzMDg5LCAwLjkzMjg1LCAxLjA5NDksIDEuMzkwMTYsIDEuMDk0OSwgMS40NTk5NCwgMC43NDYyNywgMS4wNDgzOSwgMC45NzQ1NCwgMC45NzQ1NCwgMC44NzIwNywgMC45NzQ1NCwgMC44NzUzMywgMS4wNjE1MSwgMC45NzQ1NCwgMS4wMDE3NiwgMS4xNjQ4NCwgMS4wODEzMiwgMC45ODA0NywgMS4xNjQ4NCwgMS4wMjk4OSwgMS4wMTA1NCwgMC45NjIyNSwgMC45NzQ1NCwgMC45NzQ1NCwgMS4wNjU5OCwgMC43OTAwNCwgMS4xNjM0NCwgMS4wMDM1MSwgMC45NDYyOSwgMC45OTczLCAwLjkxMDE2LCAwLjk2Nzc3LCAwLjkwNDMsIDAuOTEwODIsIDAuOTI0ODEsIDAuOTEwODIsIDEuMTczMDgsIDAuOTU3NDgsIDAuOTY5MjcsIDAuOTY5MjcsIDEsIDAuOTY5MjcsIDAuOTI0ODEsIDAuODA1OTcsIDEuMDQ4MzksIDEuMjMzOTMsIDEuMTc4MSwgMC45MjQ1LCAxLjE3MzA4LCAxLjIwODA4LCAwLjYzMjE4LCAwLjk0MjYxLCAxLjI0ODIyLCAxLjA5OTcxLCAxLjA5OTcxLCAxLjA0ODM5LCAxLCAwLjg1MjczLCAwLjc4MDMyLCAxLjA0ODM5LCAxLjA5OTcxLCAxLjIyMzI2LCAwLjkyNDUsIDEuMDk4MzYsIDEuMTM1MjUsIDEuMTUyMjIsIDAuNzA0MjQsIDAuOTQ3MjksIDAuOTQ3MjksIDAuOTQ3MjksIDAuOTQ3MjksIDAuOTQ3MjksIDAuOTQ3MjksIDAuODU0OTgsIDAuODg1MDYsIDAuNzQ4MTcsIDAuNzQ4MTcsIDAuNzQ4MTcsIDAuNzQ4MTcsIDAuOTU3ODIsIDAuOTU3ODIsIDAuOTU3ODIsIDAuOTU3ODIsIDAuOTg1OCwgMS4wMzk4OSwgMC45NjkyNCwgMC45NjkyNCwgMC45NjkyNCwgMC45NjkyNCwgMC45NjkyNCwgMS4xNzMwOCwgMC45NjkyNCwgMC45NTQwMiwgMC45NTQwMiwgMC45NTQwMiwgMC45NTQwMiwgMC44MzA4OSwgMC44NjIzNywgMC44ODQwOSwgMC45NzQ1NCwgMC45NzQ1NCwgMC45NzQ1NCwgMC45NzQ1NCwgMC45NzQ1NCwgMC45NzQ1NCwgMC45MjkxNiwgMC44NzIwNywgMC44NzUzMywgMC44NzUzMywgMC44NzUzMywgMC44NzUzMywgMC45MzE0NiwgMC45MzE0NiwgMC45MzE0NiwgMC45MzE0NiwgMC45Mzg1NCwgMS4wMTA1NCwgMC45NjIyNSwgMC45NjIyNSwgMC45NjIyNSwgMC45NjIyNSwgMC45NjIyNSwgMS4yNDgyMiwgMC44NzYxLCAxLjAwMzUxLCAxLjAwMzUxLCAxLjAwMzUxLCAxLjAwMzUxLCAwLjk2Nzc3LCAwLjk3NDU0LCAwLjk2Nzc3LCAwLjk0NzI5LCAwLjk3NDU0LCAwLjk0NzI5LCAwLjk3NDU0LCAwLjk0NzI5LCAwLjk3NDU0LCAwLjg4NTA2LCAwLjg3MjA3LCAwLjg4NTA2LCAwLjg3MjA3LCAwLjg4NTA2LCAwLjg3MjA3LCAwLjg4NTA2LCAwLjg3MjA3LCAwLjk4NTgsIDAuOTUzOTEsIDAuOTg1OCwgMC45NzQ1NCwgMC43NDgxNywgMC44NzUzMywgMC43NDgxNywgMC44NzUzMywgMC43NDgxNywgMC44NzUzMywgMC43NDgxNywgMC44NzUzMywgMC43NDgxNywgMC44NzUzMywgMC44ODQ0OSwgMC45NzQ1NCwgMC44ODQ0OSwgMC45NzQ1NCwgMC44ODQ0OSwgMC45NzQ1NCwgMSwgMSwgMC45ODAzOSwgMS4wMDE3NiwgMC45ODAzOSwgMS4wMDE3NiwgMC45NTc4MiwgMC45MzE0NiwgMC45NTc4MiwgMC45MzE0NiwgMC45NTc4MiwgMC45MzE0NiwgMC45NTc4MiwgMS4xNjQ4NCwgMC45NTc4MiwgMC45MzE0NiwgMC44NDQyMSwgMS4xMjc2MSwgMC42OTIzOCwgMS4wODEzMiwgMSwgMSwgMC45ODA0NywgMC44MzIzMSwgMS4xNjQ4NCwgMSwgMSwgMC44NDcyMywgMS4wNDg2MSwgMC44NDcyMywgMC43ODc1NSwgMC44MzIzMSwgMS4yMzczNiwgMS4wMzk4OSwgMS4wMTA1NCwgMSwgMSwgMS4wMzk4OSwgMS4wMTA1NCwgMC45ODU3LCAxLjAzODQ5LCAxLjAxMDU0LCAwLjk2OTI0LCAwLjk2MjI1LCAwLjk2OTI0LCAwLjk2MjI1LCAwLjk2OTI0LCAwLjk2MjI1LCAwLjkyMzgzLCAwLjkwMTcxLCAwLjgwNTk1LCAxLjA2NTk4LCAxLCAxLCAwLjgwNTk1LCAxLjA2NTk4LCAwLjc0NTI0LCAwLjc5MDA0LCAwLjc0NTI0LCAwLjc5MDA0LCAwLjc0NTI0LCAwLjc5MDA0LCAwLjc0NTI0LCAwLjc5MDA0LCAxLCAxLCAwLjg2MDkxLCAxLjAyNzU5LCAwLjg1NzcxLCAxLjE2MzQ0LCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk4NDQ4LCAwLjk5NzMsIDAuODMwODksIDAuOTY3NzcsIDAuODMwODksIDAuOTMyODUsIDAuOTA0MywgMC45MzI4NSwgMC45MDQzLCAwLjkzMjg1LCAwLjkwNDMsIDEuMzE4NjgsIDAuOTY5MjcsIDAuOTQ3MjksIDAuOTc0NTQsIDAuODU0OTgsIDAuOTI5MTYsIDAuOTY5MjQsIDAuODc2MSwgMSwgMSwgMC44NjA5MSwgMS4xNjM0NCwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMC44MTk2NSwgMC44MTk2NSwgMC45NDcyOSwgMC43ODAzMiwgMC43MTAyMiwgMC45MDg4MywgMC44NDE3MSwgMC45OTg3NywgMC43NzU5NiwgMS4wNTczNCwgMS4yLCAwLjk0NzI5LCAwLjg1OTQ0LCAwLjgyNzkxLCAwLjk2MDcsIDAuNzQ4MTcsIDAuOTMyODUsIDAuOTgwMzksIDAuOTY5MjQsIDAuOTU3ODIsIDAuODk4OTgsIDAuOTgzMTYsIDAuOTgxODMsIDEuMDM5ODksIDAuNzg2MTQsIDAuOTY5MjQsIDAuOTc2NDIsIDAuODYyMzcsIDAuODYwNzUsIDAuODYwOTEsIDAuODMwODksIDAuOTAwODIsIDAuODg1OCwgMC45NzI5NiwgMS4wMTI4NCwgMC45NTc4MiwgMC44MzA4OSwgMS4wOTc2LCAxLjA0LCAxLjAzMzQyLCAxLjIsIDEuMDY3NSwgMS4wOTc2LCAwLjk4MjA1LCAxLjAzODA5LCAxLjA1MDk3LCAxLjA0LCAwLjk1MzY0LCAxLjAzMzQyLCAxLjA1NDAxLCAxLjIsIDEuMDIxNDgsIDEuMDExOSwgMS4wNDcyNCwgMS4wMTI3LCAxLjAyNzMyLCAwLjk2MjI1LCAwLjg5NjUsIDAuOTc3ODMsIDAuOTM1NzQsIDAuOTQ4MTgsIDEuMzA2NzksIDEuMDY3NSwgMS4xMTgyNiwgMC45OTgyMSwgMS4wNTU3LCAxLjAzMjYsIDEuMiwgMS4wNjc1LCAwLjk2MjI1LCAxLjA2NzUsIDEuMDMyNiwgMC43NDgxNywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wMzc1NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44NzUzMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45ODcwNSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45ODQ0OCwgMC45OTczLCAwLjk4NDQ4LCAwLjk5NzMsIDAuOTg0NDgsIDAuOTk3MywgMC44MzA4OSwgMC45Njc3NywgMSwgMS4yMDA4OCwgMC44OTkwMywgMSwgMSwgMC43NTE1NSwgMC45NDk0NSwgMC45NDk0NSwgMC45NDk0NSwgMC45NDk0NSwgMS4xMjMxNywgMS4xMjMxNywgMS4xMjMxNywgMC42NzYwMywgMC42NzYwMywgMS4xNTYyMSwgMC43MzU4NCwgMS4yMTE5MSwgMS4yMjEzNSwgMS4wNjQ4MywgMC45NDg2OCwgMC45NDg2OCwgMC45NTk5NiwgMS4yNDYzMywgMSwgMS4wNzQ5NywgMC44NzcwOSwgMC45NjkyNywgMS4wMTQ3MywgMC45NjkyNywgMSwgMSwgMSwgMC43NzI5NSwgMSwgMSwgMS4wOTgzNiwgMS4wOTgzNiwgMS4wOTgzNiwgMS4wMTUyMiwgMC44NjMyMSwgMC45NDQzNCwgMC44NjQ5LCAwLjk0NDM0LCAwLjg2MTgyLCAxLCAxLCAxLjA4MywgMSwgMC45MTU3OCwgMC44NjQzOCwgMS4xNzMwOCwgMS4xODQxNiwgMS4xNDU4OSwgMC42OTgyNSwgMC45NzYyMiwgMS45Njc5MSwgMS4yNDgyMiwgMS4yNDgyMiwgMS4xNzMwOCwgMS4yNDgyMiwgMS4yNDgyMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS40MjYwMywgMSwgMC45OTg2MiwgMC45OTg2MiwgMSwgMC44NzAyNSwgMC44NzAyNSwgMC44NzAyNSwgMC44NzAyNSwgMS4xNzk4NCwgMS40MjYwMywgMSwgMS40MjYwMywgMS40MjYwMywgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMS4yODg2LCAxLjA0MzE1LCAxLjE1Mjk2LCAxLjM0MTYzLCAxLCAxLCAxLCAxLjEwNzQyLCAxLjEwNzQyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgU2Vnb2V1aUl0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4zMzAwOCwKICBsaW5lR2FwOiAwCn07CmNvbnN0IFNlZ29ldWlSZWd1bGFyRmFjdG9ycyA9IFsxLjc2NzM4LCAxLCAxLCAwLjk4NTk0LCAxLjAyMjg1LCAxLjEwNDU0LCAxLjA2MjM0LCAwLjk2OTI3LCAwLjkyMDM3LCAxLjE5OTg1LCAxLjIwNDYsIDAuOTA2MTYsIDAuOTA2MTYsIDEuMDcxNTIsIDEuMTcxNCwgMC43ODAzMiwgMS4yMDA4OCwgMC43ODAzMiwgMS40MDI0NiwgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC43ODAzMiwgMC43ODAzMiwgMS4xNzE0LCAxLjE3MTQsIDEuMTcxNCwgMC44MDU5NywgMC45NDA4NCwgMC45NjcwNiwgMC44NTk0NCwgMC44NTczNCwgMC45NzA5MywgMC43NTg0MiwgMC43OTkzNiwgMC44ODE5OCwgMC45ODMxLCAwLjk1NzgyLCAwLjcxMzg3LCAwLjg2OTY5LCAwLjg0NjM2LCAxLjA3Nzk2LCAxLjAzNTg0LCAwLjk2OTI0LCAwLjgzOTY4LCAwLjk2OTI0LCAwLjgyODI2LCAwLjc5NjQ5LCAwLjg1NzcxLCAwLjk1MTMyLCAwLjkzMTE5LCAwLjk4OTY1LCAwLjg4NDMzLCAwLjgyODcsIDAuOTMzNjUsIDEuMDg2MTIsIDEuMzYzOCwgMS4wODYxMiwgMS40NTc4NiwgMC43NDYyNywgMC44MDQ5OSwgMC45MTQ4NCwgMS4wNTcwNywgMC45MjM4MywgMS4wNTg4MiwgMC45NDAzLCAxLjEyNjU0LCAxLjA1ODgyLCAxLjAxNzU2LCAxLjA5MDExLCAxLjA5MDExLCAwLjk5NDE0LCAxLjA5MDExLCAxLjAzNCwgMS4wMTc1NiwgMS4wNTM1NiwgMS4wNTcwNywgMS4wNTg4MiwgMS4wNDM5OSwgMC44NDg2MywgMS4yMTk2OCwgMS4wMTc1NiwgMC45NTgwMSwgMS4wMDA2OCwgMC45MTc5NywgMC45Njc3NywgMC45MDQzLCAwLjkwMzUxLCAwLjkyMTA1LCAwLjkwMzUxLCAxLjE3MTQsIDAuODUzMzcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTk5MTIsIDAuOTY5MjcsIDAuOTIxMDUsIDAuODA1OTcsIDEuMjQzNCwgMS4yMDgwOCwgMS4wNTkzNywgMC45MDk1NywgMS4xNzE0LCAxLjIwODA4LCAwLjc1MTU1LCAwLjk0MjYxLCAxLjI0NjQ0LCAxLjA5OTcxLCAxLjA5OTcxLCAwLjg0NzUxLCAxLCAwLjg1MjczLCAwLjc4MDMyLCAwLjYxNTg0LCAxLjA1NDI1LCAxLjE3OTE0LCAwLjkwOTU3LCAxLjA4NjY1LCAxLjExNTkzLCAxLjE0MTY5LCAwLjczMzgxLCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjg2MDM1LCAwLjg1NzM0LCAwLjc1ODQyLCAwLjc1ODQyLCAwLjc1ODQyLCAwLjc1ODQyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk3MDkzLCAxLjAzNTg0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAxLjE3MTQsIDAuOTY5MjQsIDAuOTUxMzIsIDAuOTUxMzIsIDAuOTUxMzIsIDAuOTUxMzIsIDAuODI4NywgMC44Mzk2OCwgMC44OTA0OSwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MzU3NSwgMC45MjM4MywgMC45NDAzLCAwLjk0MDMsIDAuOTQwMywgMC45NDAzLCAwLjg3MTcsIDAuODcxNywgMC44NzE3LCAwLjg3MTcsIDEuMDA1MjcsIDEuMDE3NTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMjQ2NDQsIDAuOTU5MjMsIDEuMDE3NTYsIDEuMDE3NTYsIDEuMDE3NTYsIDEuMDE3NTYsIDAuOTY3NzcsIDEuMDU3MDcsIDAuOTY3NzcsIDAuOTY3MDYsIDAuOTE0ODQsIDAuOTY3MDYsIDAuOTE0ODQsIDAuOTY3MDYsIDAuOTE0ODQsIDAuODU3MzQsIDAuOTIzODMsIDAuODU3MzQsIDAuOTIzODMsIDAuODU3MzQsIDAuOTIzODMsIDAuODU3MzQsIDAuOTIzODMsIDAuOTcwOTMsIDEuMDk2OSwgMC45NzA5MywgMS4wNTg4MiwgMC43NTg0MiwgMC45NDAzLCAwLjc1ODQyLCAwLjk0MDMsIDAuNzU4NDIsIDAuOTQwMywgMC43NTg0MiwgMC45NDAzLCAwLjc1ODQyLCAwLjk0MDMsIDAuODgxOTgsIDEuMDU4ODIsIDAuODgxOTgsIDEuMDU4ODIsIDAuODgxOTgsIDEuMDU4ODIsIDEsIDEsIDAuOTgzMSwgMS4wMTc1NiwgMC45ODMxLCAxLjAxNzU2LCAwLjk1NzgyLCAwLjg3MTcsIDAuOTU3ODIsIDAuODcxNywgMC45NTc4MiwgMC44NzE3LCAwLjk1NzgyLCAxLjA5MDExLCAwLjk1NzgyLCAwLjg3MTcsIDAuODQ3ODQsIDEuMTE1NTEsIDAuNzEzODcsIDEuMDkwMTEsIDEsIDEsIDAuOTk0MTQsIDAuODQ2MzYsIDEuMDkwMTEsIDEsIDEsIDAuODQ2MzYsIDEuMDUzNiwgMC44NDYzNiwgMC45NDI5OCwgMC44NDYzNiwgMS4yMzI5NywgMS4wMzU4NCwgMS4wMTc1NiwgMSwgMSwgMS4wMzU4NCwgMS4wMTc1NiwgMS4wMDMyMywgMS4wMzQ0NCwgMS4wMTc1NiwgMC45NjkyNCwgMS4wNTM1NiwgMC45NjkyNCwgMS4wNTM1NiwgMC45NjkyNCwgMS4wNTM1NiwgMC45MzA2NiwgMC45ODI5MywgMC44MjgyNiwgMS4wNDM5OSwgMSwgMSwgMC44MjgyNiwgMS4wNDM5OSwgMC43OTY0OSwgMC44NDg2MywgMC43OTY0OSwgMC44NDg2MywgMC43OTY0OSwgMC44NDg2MywgMC43OTY0OSwgMC44NDg2MywgMSwgMSwgMC44NTc3MSwgMS4xNzMxOCwgMC44NTc3MSwgMS4yMTk2OCwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45ODk2NSwgMS4wMDA2OCwgMC44Mjg3LCAwLjk2Nzc3LCAwLjgyODcsIDAuOTMzNjUsIDAuOTA0MywgMC45MzM2NSwgMC45MDQzLCAwLjkzMzY1LCAwLjkwNDMsIDEuMDg1NzEsIDAuOTY5MjcsIDAuOTY3MDYsIDAuOTE0ODQsIDAuODYwMzUsIDAuOTM1NzUsIDAuOTY5MjQsIDAuOTU5MjMsIDEsIDEsIDAuODU3NzEsIDEuMjE5NjgsIDEuMTE0MzcsIDEuMTE0MzcsIDAuOTMxMDksIDAuOTEyMDIsIDAuNjA0MTEsIDAuODQxNjQsIDAuNTU1NzIsIDEuMDExNzMsIDAuOTczNjEsIDAuODE4MTgsIDAuODE4MTgsIDAuOTY2MzUsIDAuNzgwMzIsIDAuNzI3MjcsIDAuOTIzNjYsIDAuOTg2MDEsIDEuMDM0MDUsIDAuNzc5NjgsIDEuMDk3OTksIDEuMiwgMC45NjcwNiwgMC44NTk0NCwgMC44NTYzOCwgMC45NjQ5MSwgMC43NTg0MiwgMC45MzM2NSwgMC45ODMxLCAwLjk2OTI0LCAwLjk1NzgyLCAwLjg2OTY5LCAwLjk0MTUyLCAxLjA3Nzk2LCAxLjAzNTg0LCAwLjc4NDM3LCAwLjk2OTI0LCAwLjk4NzE1LCAwLjgzOTY4LCAwLjgzNDkxLCAwLjg1NzcxLCAwLjgyODcsIDAuOTQ0OTIsIDAuODg0MzMsIDAuOTI4NywgMS4wMDk4LCAwLjk1NzgyLCAwLjgyODcsIDEuMDYyNSwgMC45ODI0OCwgMS4wMzQyNCwgMS4yLCAxLjAxMDcxLCAxLjA2MjUsIDAuOTUyNDYsIDEuMDM4MDksIDEuMDQ5MTIsIDAuOTgyNDgsIDEuMDAyMjEsIDEuMDM0MjQsIDEuMDU0NDMsIDEuMiwgMS4wNDc4NSwgMC45OTYwOSwgMS4wMDE2OSwgMS4wNTE3NiwgMC45OTM0NiwgMS4wNTM1NiwgMC45MDg3LCAxLjAzMDA0LCAwLjk1NTQyLCAwLjkzMTE3LCAxLjIzMzYyLCAxLjAxMDcxLCAxLjA3ODMxLCAxLjAyNTEyLCAxLjA1MjA1LCAxLjAzNTAyLCAxLjIsIDEuMDEwNzEsIDEuMDUzNTYsIDEuMDEwNzEsIDEuMDM1MDIsIDAuNzU4NDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDM3MTksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTQwMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNDAyMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45ODk2NSwgMS4wMDA2OCwgMC45ODk2NSwgMS4wMDA2OCwgMC45ODk2NSwgMS4wMDA2OCwgMC44Mjg3LCAwLjk2Nzc3LCAxLCAxLjIwMDg4LCAwLjg5OTAzLCAxLCAxLCAwLjc1MTU1LCAxLjAzMDc3LCAxLjAzMDc3LCAxLjAzMDc3LCAxLjAzMDc3LCAxLjEzMTk2LCAxLjEzMTk2LCAxLjEzMTk2LCAwLjY3NDI4LCAwLjY3NDI4LCAxLjE2MDM5LCAwLjczMjkxLCAxLjIwOTk2LCAxLjIyMTM1LCAxLjA2NDgzLCAwLjk0ODY4LCAwLjk0ODY4LCAwLjk1OTk2LCAxLjI0NjMzLCAxLCAxLjA3NDk3LCAwLjg3Nzk2LCAwLjk2OTI3LCAxLjAxNTE4LCAwLjk2OTI3LCAxLCAxLCAxLCAwLjc3Mjk1LCAxLCAxLCAxLjEwNTM5LCAxLjEwNTM5LCAxLjExMzU4LCAxLjA2OTY3LCAwLjg2Mjc5LCAwLjk0NDM0LCAwLjg2Mjc5LCAwLjk0NDM0LCAwLjg2MTgyLCAxLCAxLCAxLjA4MywgMSwgMC45MTU3OCwgMC44NjUwNywgMS4xNzE0LCAxLjE4NDE2LCAxLjE0NTg5LCAwLjY5ODI1LCAwLjk3NjIyLCAxLjk2OTcsIDEuMjQ4MjIsIDEuMjQ4MjIsIDEuMTcyMzgsIDEuMjQ4MjIsIDEuMjQ4MjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuNDI2MDMsIDEsIDAuOTk4NjIsIDAuOTk4NjIsIDEsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDEuMTgwODMsIDEuNDI2MDMsIDEsIDEuNDI2MDMsIDEuNDI2MDMsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEuMjg4NiwgMS4wNDMxNSwgMS4xNTI5NiwgMS4zNDE2MywgMSwgMSwgMSwgMS4xMDkzOCwgMS4xMDkzOCwgMSwgMSwgMSwgMS4wNTQyNSwgMS4wOTk3MSwgMS4wOTk3MSwgMS4wOTk3MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IFNlZ29ldWlSZWd1bGFyTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjMzMDA4LAogIGxpbmVHYXA6IDAKfTsKCjsvLyAuL3NyYy9jb3JlL3hmYV9mb250cy5qcwoKCgoKCgoKCmNvbnN0IGdldFhGQUZvbnRNYXAgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WyJNeXJpYWRQcm8tUmVndWxhciJdID0gdFsiUGRmSlMtRmFsbGJhY2stUmVndWxhciJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiLAogICAgZmFjdG9yczogTXlyaWFkUHJvUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IE15cmlhZFByb1JlZ3VsYXJNZXRyaWNzCiAgfTsKICB0WyJNeXJpYWRQcm8tQm9sZCJdID0gdFsiUGRmSlMtRmFsbGJhY2stQm9sZCJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGQiLAogICAgZmFjdG9yczogTXlyaWFkUHJvQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IE15cmlhZFByb0JvbGRNZXRyaWNzCiAgfTsKICB0WyJNeXJpYWRQcm8tSXQiXSA9IHRbIk15cmlhZFByby1JdGFsaWMiXSA9IHRbIlBkZkpTLUZhbGxiYWNrLUl0YWxpYyJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUl0YWxpYyIsCiAgICBmYWN0b3JzOiBNeXJpYWRQcm9JdGFsaWNGYWN0b3JzLAogICAgYmFzZVdpZHRoczogTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNJdGFsaWNNYXBwaW5nLAogICAgbWV0cmljczogTXlyaWFkUHJvSXRhbGljTWV0cmljcwogIH07CiAgdFsiTXlyaWFkUHJvLUJvbGRJdCJdID0gdFsiTXlyaWFkUHJvLUJvbGRJdGFsaWMiXSA9IHRbIlBkZkpTLUZhbGxiYWNrLUJvbGRJdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIiwKICAgIGZhY3RvcnM6IE15cmlhZFByb0JvbGRJdGFsaWNGYWN0b3JzLAogICAgYmFzZVdpZHRoczogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IExpYmVyYXRpb25TYW5zQm9sZEl0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBNeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljcwogIH07CiAgdC5BcmlhbE1UID0gdC5BcmlhbCA9IHRbIkFyaWFsLVJlZ3VsYXIiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIiwKICAgIGJhc2VXaWR0aHM6IExpYmVyYXRpb25TYW5zUmVndWxhcldpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nCiAgfTsKICB0WyJBcmlhbC1Cb2xkTVQiXSA9IHRbIkFyaWFsLUJvbGQiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkIiwKICAgIGJhc2VXaWR0aHM6IExpYmVyYXRpb25TYW5zQm9sZFdpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0JvbGRNYXBwaW5nCiAgfTsKICB0WyJBcmlhbC1JdGFsaWNNVCJdID0gdFsiQXJpYWwtSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtSXRhbGljIiwKICAgIGJhc2VXaWR0aHM6IExpYmVyYXRpb25TYW5zSXRhbGljV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IExpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZwogIH07CiAgdFsiQXJpYWwtQm9sZEl0YWxpY01UIl0gPSB0WyJBcmlhbC1Cb2xkSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZwogIH07CiAgdFsiQ2FsaWJyaS1SZWd1bGFyIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtUmVndWxhciIsCiAgICBmYWN0b3JzOiBDYWxpYnJpUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IENhbGlicmlSZWd1bGFyTWV0cmljcwogIH07CiAgdFsiQ2FsaWJyaS1Cb2xkIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZCIsCiAgICBmYWN0b3JzOiBDYWxpYnJpQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IENhbGlicmlCb2xkTWV0cmljcwogIH07CiAgdFsiQ2FsaWJyaS1JdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiLAogICAgZmFjdG9yczogQ2FsaWJyaUl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBDYWxpYnJpSXRhbGljTWV0cmljcwogIH07CiAgdFsiQ2FsaWJyaS1Cb2xkSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsCiAgICBmYWN0b3JzOiBDYWxpYnJpQm9sZEl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IENhbGlicmlCb2xkSXRhbGljTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1SZWd1bGFyIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtUmVndWxhciIsCiAgICBmYWN0b3JzOiBTZWdvZXVpUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IFNlZ29ldWlSZWd1bGFyTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1Cb2xkIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZCIsCiAgICBmYWN0b3JzOiBTZWdvZXVpQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IFNlZ29ldWlCb2xkTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1JdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiLAogICAgZmFjdG9yczogU2Vnb2V1aUl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBTZWdvZXVpSXRhbGljTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1Cb2xkSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsCiAgICBmYWN0b3JzOiBTZWdvZXVpQm9sZEl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IFNlZ29ldWlCb2xkSXRhbGljTWV0cmljcwogIH07CiAgdFsiSGVsdmV0aWNhLVJlZ3VsYXIiXSA9IHQuSGVsdmV0aWNhID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiLAogICAgZmFjdG9yczogSGVsdmV0aWNhUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IEhlbHZldGljYVJlZ3VsYXJNZXRyaWNzCiAgfTsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGQiLAogICAgZmFjdG9yczogSGVsdmV0aWNhQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IEhlbHZldGljYUJvbGRNZXRyaWNzCiAgfTsKICB0WyJIZWx2ZXRpY2EtSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtSXRhbGljIiwKICAgIGZhY3RvcnM6IEhlbHZldGljYUl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBIZWx2ZXRpY2FJdGFsaWNNZXRyaWNzCiAgfTsKICB0WyJIZWx2ZXRpY2EtQm9sZEl0YWxpYyJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMiLAogICAgZmFjdG9yczogSGVsdmV0aWNhQm9sZEl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IEhlbHZldGljYUJvbGRJdGFsaWNNZXRyaWNzCiAgfTsKfSk7CmZ1bmN0aW9uIGdldFhmYUZvbnROYW1lKG5hbWUpIHsKICBjb25zdCBmb250TmFtZSA9IG5vcm1hbGl6ZUZvbnROYW1lKG5hbWUpOwogIGNvbnN0IGZvbnRNYXAgPSBnZXRYRkFGb250TWFwKCk7CiAgcmV0dXJuIGZvbnRNYXBbZm9udE5hbWVdOwp9CmZ1bmN0aW9uIGdldFhmYUZvbnRXaWR0aHMobmFtZSkgewogIGNvbnN0IGluZm8gPSBnZXRYZmFGb250TmFtZShuYW1lKTsKICBpZiAoIWluZm8pIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCB7CiAgICBiYXNlV2lkdGhzLAogICAgYmFzZU1hcHBpbmcsCiAgICBmYWN0b3JzCiAgfSA9IGluZm87CiAgY29uc3QgcmVzY2FsZWRCYXNlV2lkdGhzID0gIWZhY3RvcnMgPyBiYXNlV2lkdGhzIDogYmFzZVdpZHRocy5tYXAoKHcsIGkpID0+IHcgKiBmYWN0b3JzW2ldKTsKICBsZXQgY3VycmVudENvZGUgPSAtMjsKICBsZXQgY3VycmVudEFycmF5OwogIGNvbnN0IG5ld1dpZHRocyA9IFtdOwogIGZvciAoY29uc3QgW3VuaWNvZGUsIGdseXBoSW5kZXhdIG9mIGJhc2VNYXBwaW5nLm1hcCgoY2hhclVuaWNvZGUsIGluZGV4KSA9PiBbY2hhclVuaWNvZGUsIGluZGV4XSkuc29ydCgoW3VuaWNvZGUxXSwgW3VuaWNvZGUyXSkgPT4gdW5pY29kZTEgLSB1bmljb2RlMikpIHsKICAgIGlmICh1bmljb2RlID09PSAtMSkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmICh1bmljb2RlID09PSBjdXJyZW50Q29kZSArIDEpIHsKICAgICAgY3VycmVudEFycmF5LnB1c2gocmVzY2FsZWRCYXNlV2lkdGhzW2dseXBoSW5kZXhdKTsKICAgICAgY3VycmVudENvZGUgKz0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnRDb2RlID0gdW5pY29kZTsKICAgICAgY3VycmVudEFycmF5ID0gW3Jlc2NhbGVkQmFzZVdpZHRoc1tnbHlwaEluZGV4XV07CiAgICAgIG5ld1dpZHRocy5wdXNoKHVuaWNvZGUsIGN1cnJlbnRBcnJheSk7CiAgICB9CiAgfQogIHJldHVybiBuZXdXaWR0aHM7Cn0KZnVuY3Rpb24gZ2V0WGZhRm9udERpY3QobmFtZSkgewogIGNvbnN0IHdpZHRocyA9IGdldFhmYUZvbnRXaWR0aHMobmFtZSk7CiAgY29uc3QgZGljdCA9IG5ldyBEaWN0KG51bGwpOwogIGRpY3Quc2V0KCJCYXNlRm9udCIsIE5hbWUuZ2V0KG5hbWUpKTsKICBkaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGb250IikpOwogIGRpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkNJREZvbnRUeXBlMiIpKTsKICBkaWN0LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiSWRlbnRpdHktSCIpKTsKICBkaWN0LnNldCgiQ0lEVG9HSURNYXAiLCBOYW1lLmdldCgiSWRlbnRpdHkiKSk7CiAgZGljdC5zZXQoIlciLCB3aWR0aHMpOwogIGRpY3Quc2V0KCJGaXJzdENoYXIiLCB3aWR0aHNbMF0pOwogIGRpY3Quc2V0KCJMYXN0Q2hhciIsIHdpZHRocy5hdCgtMikgKyB3aWR0aHMuYXQoLTEpLmxlbmd0aCAtIDEpOwogIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgRGljdChudWxsKTsKICBkaWN0LnNldCgiRm9udERlc2NyaXB0b3IiLCBkZXNjcmlwdG9yKTsKICBjb25zdCBzeXN0ZW1JbmZvID0gbmV3IERpY3QobnVsbCk7CiAgc3lzdGVtSW5mby5zZXQoIk9yZGVyaW5nIiwgIklkZW50aXR5Iik7CiAgc3lzdGVtSW5mby5zZXQoIlJlZ2lzdHJ5IiwgIkFkb2JlIik7CiAgc3lzdGVtSW5mby5zZXQoIlN1cHBsZW1lbnQiLCAwKTsKICBkaWN0LnNldCgiQ0lEU3lzdGVtSW5mbyIsIHN5c3RlbUluZm8pOwogIHJldHVybiBkaWN0Owp9Cgo7Ly8gLi9zcmMvY29yZS9wc19wYXJzZXIuanMKCgoKY2xhc3MgUG9zdFNjcmlwdFBhcnNlciB7CiAgY29uc3RydWN0b3IobGV4ZXIpIHsKICAgIHRoaXMubGV4ZXIgPSBsZXhlcjsKICAgIHRoaXMub3BlcmF0b3JzID0gW107CiAgICB0aGlzLnRva2VuID0gbnVsbDsKICAgIHRoaXMucHJldiA9IG51bGw7CiAgfQogIG5leHRUb2tlbigpIHsKICAgIHRoaXMucHJldiA9IHRoaXMudG9rZW47CiAgICB0aGlzLnRva2VuID0gdGhpcy5sZXhlci5nZXRUb2tlbigpOwogIH0KICBhY2NlcHQodHlwZSkgewogICAgaWYgKHRoaXMudG9rZW4udHlwZSA9PT0gdHlwZSkgewogICAgICB0aGlzLm5leHRUb2tlbigpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgZXhwZWN0KHR5cGUpIHsKICAgIGlmICh0aGlzLmFjY2VwdCh0eXBlKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5leHBlY3RlZCBzeW1ib2w6IGZvdW5kICR7dGhpcy50b2tlbi50eXBlfSBleHBlY3RlZCAke3R5cGV9LmApOwogIH0KICBwYXJzZSgpIHsKICAgIHRoaXMubmV4dFRva2VuKCk7CiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UpOwogICAgdGhpcy5wYXJzZUJsb2NrKCk7CiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpOwogICAgcmV0dXJuIHRoaXMub3BlcmF0b3JzOwogIH0KICBwYXJzZUJsb2NrKCkgewogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLk5VTUJFUikpIHsKICAgICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKHRoaXMucHJldi52YWx1ZSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5hY2NlcHQoUG9zdFNjcmlwdFRva2VuVHlwZXMuT1BFUkFUT1IpKSB7CiAgICAgICAgdGhpcy5vcGVyYXRvcnMucHVzaCh0aGlzLnByZXYudmFsdWUpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSkpIHsKICAgICAgICB0aGlzLnBhcnNlQ29uZGl0aW9uKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfQogIHBhcnNlQ29uZGl0aW9uKCkgewogICAgY29uc3QgY29uZGl0aW9uTG9jYXRpb24gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CiAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKG51bGwsIG51bGwpOwogICAgdGhpcy5wYXJzZUJsb2NrKCk7CiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpOwogICAgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLklGKSkgewogICAgICB0aGlzLm9wZXJhdG9yc1tjb25kaXRpb25Mb2NhdGlvbl0gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CiAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uICsgMV0gPSAianoiOwogICAgfSBlbHNlIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UpKSB7CiAgICAgIGNvbnN0IGp1bXBMb2NhdGlvbiA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKICAgICAgdGhpcy5vcGVyYXRvcnMucHVzaChudWxsLCBudWxsKTsKICAgICAgY29uc3QgZW5kT2ZUcnVlID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOwogICAgICB0aGlzLnBhcnNlQmxvY2soKTsKICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFKTsKICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuSUZFTFNFKTsKICAgICAgdGhpcy5vcGVyYXRvcnNbanVtcExvY2F0aW9uXSA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKICAgICAgdGhpcy5vcGVyYXRvcnNbanVtcExvY2F0aW9uICsgMV0gPSAiaiI7CiAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uXSA9IGVuZE9mVHJ1ZTsKICAgICAgdGhpcy5vcGVyYXRvcnNbY29uZGl0aW9uTG9jYXRpb24gKyAxXSA9ICJqeiI7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlBTIEZ1bmN0aW9uOiBlcnJvciBwYXJzaW5nIGNvbmRpdGlvbmFsLiIpOwogICAgfQogIH0KfQpjb25zdCBQb3N0U2NyaXB0VG9rZW5UeXBlcyA9IHsKICBMQlJBQ0U6IDAsCiAgUkJSQUNFOiAxLAogIE5VTUJFUjogMiwKICBPUEVSQVRPUjogMywKICBJRjogNCwKICBJRkVMU0U6IDUKfTsKY2xhc3MgUG9zdFNjcmlwdFRva2VuIHsKICBzdGF0aWMgZ2V0IG9wQ2FjaGUoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJvcENhY2hlIiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7CiAgfQogIGNvbnN0cnVjdG9yKHR5cGUsIHZhbHVlKSB7CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogIH0KICBzdGF0aWMgZ2V0T3BlcmF0b3Iob3ApIHsKICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4ub3BDYWNoZVtvcF0gfHw9IG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuT1BFUkFUT1IsIG9wKTsKICB9CiAgc3RhdGljIGdldCBMQlJBQ0UoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJMQlJBQ0UiLCBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSwgInsiKSk7CiAgfQogIHN0YXRpYyBnZXQgUkJSQUNFKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiUkJSQUNFIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UsICJ9IikpOwogIH0KICBzdGF0aWMgZ2V0IElGKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiSUYiLCBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLklGLCAiSUYiKSk7CiAgfQogIHN0YXRpYyBnZXQgSUZFTFNFKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiSUZFTFNFIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5JRkVMU0UsICJJRkVMU0UiKSk7CiAgfQp9CmNsYXNzIFBvc3RTY3JpcHRMZXhlciB7CiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMubmV4dENoYXIoKTsKICAgIHRoaXMuc3RyQnVmID0gW107CiAgfQogIG5leHRDaGFyKCkgewogICAgcmV0dXJuIHRoaXMuY3VycmVudENoYXIgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CiAgfQogIGdldFRva2VuKCkgewogICAgbGV0IGNvbW1lbnQgPSBmYWxzZTsKICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoY2ggPCAwKSB7CiAgICAgICAgcmV0dXJuIEVPRjsKICAgICAgfQogICAgICBpZiAoY29tbWVudCkgewogICAgICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkgewogICAgICAgICAgY29tbWVudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyNSkgewogICAgICAgIGNvbW1lbnQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKCFpc1doaXRlU3BhY2UoY2gpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICB9CiAgICBzd2l0Y2ggKGNoIHwgMCkgewogICAgICBjYXNlIDB4MzA6CiAgICAgIGNhc2UgMHgzMToKICAgICAgY2FzZSAweDMyOgogICAgICBjYXNlIDB4MzM6CiAgICAgIGNhc2UgMHgzNDoKICAgICAgY2FzZSAweDM1OgogICAgICBjYXNlIDB4MzY6CiAgICAgIGNhc2UgMHgzNzoKICAgICAgY2FzZSAweDM4OgogICAgICBjYXNlIDB4Mzk6CiAgICAgIGNhc2UgMHgyYjoKICAgICAgY2FzZSAweDJkOgogICAgICBjYXNlIDB4MmU6CiAgICAgICAgcmV0dXJuIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuTlVNQkVSLCB0aGlzLmdldE51bWJlcigpKTsKICAgICAgY2FzZSAweDdiOgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLkxCUkFDRTsKICAgICAgY2FzZSAweDdkOgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLlJCUkFDRTsKICAgIH0KICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOwogICAgc3RyQnVmLmxlbmd0aCA9IDA7CiAgICBzdHJCdWZbMF0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgIHdoaWxlICgoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDAgJiYgKGNoID49IDB4NDEgJiYgY2ggPD0gMHg1YSB8fCBjaCA+PSAweDYxICYmIGNoIDw9IDB4N2EpKSB7CiAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgIH0KICAgIGNvbnN0IHN0ciA9IHN0ckJ1Zi5qb2luKCIiKTsKICAgIHN3aXRjaCAoc3RyLnRvTG93ZXJDYXNlKCkpIHsKICAgICAgY2FzZSAiaWYiOgogICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUY7CiAgICAgIGNhc2UgImlmZWxzZSI6CiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5JRkVMU0U7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5nZXRPcGVyYXRvcihzdHIpOwogICAgfQogIH0KICBnZXROdW1iZXIoKSB7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CiAgICBzdHJCdWYubGVuZ3RoID0gMDsKICAgIHN0ckJ1ZlswXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCkgewogICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5IHx8IGNoID09PSAweDJkIHx8IGNoID09PSAweDJlKSB7CiAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQoc3RyQnVmLmpvaW4oIiIpKTsKICAgIGlmIChpc05hTih2YWx1ZSkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGZsb2F0aW5nIHBvaW50IG51bWJlcjogJHt2YWx1ZX1gKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2ltYWdlX3V0aWxzLmpzCgoKY2xhc3MgQmFzZUxvY2FsQ2FjaGUgewogIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIHRoaXMuX29ubHlSZWZzID0gb3B0aW9ucz8ub25seVJlZnMgPT09IHRydWU7CiAgICBpZiAoIXRoaXMuX29ubHlSZWZzKSB7CiAgICAgIHRoaXMuX25hbWVSZWZNYXAgPSBuZXcgTWFwKCk7CiAgICAgIHRoaXMuX2ltYWdlTWFwID0gbmV3IE1hcCgpOwogICAgfQogICAgdGhpcy5faW1hZ2VDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogIH0KICBnZXRCeU5hbWUobmFtZSkgewogICAgaWYgKHRoaXMuX29ubHlSZWZzKSB7CiAgICAgIHVucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgYGdldEJ5TmFtZWAgbWV0aG9kLiIpOwogICAgfQogICAgY29uc3QgcmVmID0gdGhpcy5fbmFtZVJlZk1hcC5nZXQobmFtZSk7CiAgICBpZiAocmVmKSB7CiAgICAgIHJldHVybiB0aGlzLmdldEJ5UmVmKHJlZik7CiAgICB9CiAgICByZXR1cm4gdGhpcy5faW1hZ2VNYXAuZ2V0KG5hbWUpIHx8IG51bGw7CiAgfQogIGdldEJ5UmVmKHJlZikgewogICAgcmV0dXJuIHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KHJlZikgfHwgbnVsbDsKICB9CiAgc2V0KG5hbWUsIHJlZiwgZGF0YSkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgc2V0YCBjYWxsZWQuIik7CiAgfQp9CmNsYXNzIExvY2FsSW1hZ2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBzZXQobmFtZSwgcmVmID0gbnVsbCwgZGF0YSkgewogICAgaWYgKHR5cGVvZiBuYW1lICE9PSAic3RyaW5nIikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsSW1hZ2VDYWNoZS5zZXQgLSBleHBlY3RlZCAibmFtZSIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAocmVmKSB7CiAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7CiAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZU1hcC5oYXMobmFtZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VNYXAuc2V0KG5hbWUsIGRhdGEpOwogIH0KfQpjbGFzcyBMb2NhbENvbG9yU3BhY2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBzZXQobmFtZSA9IG51bGwsIHJlZiA9IG51bGwsIGRhdGEpIHsKICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gInN0cmluZyIgJiYgIXJlZikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsQ29sb3JTcGFjZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhbmQvb3IgInJlZiIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAocmVmKSB7CiAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChuYW1lICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5fbmFtZVJlZk1hcC5zZXQobmFtZSwgcmVmKTsKICAgICAgfQogICAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VNYXAuaGFzKG5hbWUpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX2ltYWdlTWFwLnNldChuYW1lLCBkYXRhKTsKICB9Cn0KY2xhc3MgTG9jYWxGdW5jdGlvbkNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgewogIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIHN1cGVyKHsKICAgICAgb25seVJlZnM6IHRydWUKICAgIH0pOwogIH0KICBzZXQobmFtZSA9IG51bGwsIHJlZiwgZGF0YSkgewogICAgaWYgKCFyZWYpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbEZ1bmN0aW9uQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOwogIH0KfQpjbGFzcyBMb2NhbEdTdGF0ZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgewogIHNldChuYW1lLCByZWYgPSBudWxsLCBkYXRhKSB7CiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxHU3RhdGVDYWNoZS5zZXQgLSBleHBlY3RlZCAibmFtZSIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAocmVmKSB7CiAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7CiAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZU1hcC5oYXMobmFtZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VNYXAuc2V0KG5hbWUsIGRhdGEpOwogIH0KfQpjbGFzcyBMb2NhbFRpbGluZ1BhdHRlcm5DYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICBzdXBlcih7CiAgICAgIG9ubHlSZWZzOiB0cnVlCiAgICB9KTsKICB9CiAgc2V0KG5hbWUgPSBudWxsLCByZWYsIGRhdGEpIHsKICAgIGlmICghcmVmKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOwogIH0KfQpjbGFzcyBSZWdpb25hbEltYWdlQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZSB7CiAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgc3VwZXIoewogICAgICBvbmx5UmVmczogdHJ1ZQogICAgfSk7CiAgfQogIHNldChuYW1lID0gbnVsbCwgcmVmLCBkYXRhKSB7CiAgICBpZiAoIXJlZikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQgLSBleHBlY3RlZCAicmVmIiBhcmd1bWVudC4nKTsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgfQp9CmNsYXNzIEdsb2JhbENvbG9yU3BhY2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICBzdXBlcih7CiAgICAgIG9ubHlSZWZzOiB0cnVlCiAgICB9KTsKICB9CiAgc2V0KG5hbWUgPSBudWxsLCByZWYsIGRhdGEpIHsKICAgIGlmICghcmVmKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignR2xvYmFsQ29sb3JTcGFjZUNhY2hlLnNldCAtIGV4cGVjdGVkICJyZWYiIGFyZ3VtZW50LicpOwogICAgfQogICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKICB9CiAgY2xlYXIoKSB7CiAgICB0aGlzLl9pbWFnZUNhY2hlLmNsZWFyKCk7CiAgfQp9CmNsYXNzIEdsb2JhbEltYWdlQ2FjaGUgewogIHN0YXRpYyBOVU1fUEFHRVNfVEhSRVNIT0xEID0gMjsKICBzdGF0aWMgTUlOX0lNQUdFU19UT19DQUNIRSA9IDEwOwogIHN0YXRpYyBNQVhfQllURV9TSVpFID0gNWU3OwogICNkZWNvZGVGYWlsZWRTZXQgPSBuZXcgUmVmU2V0KCk7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLl9yZWZDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgdGhpcy5faW1hZ2VDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogIH0KICBnZXQgI2J5dGVTaXplKCkgewogICAgbGV0IGJ5dGVTaXplID0gMDsKICAgIGZvciAoY29uc3QgaW1hZ2VEYXRhIG9mIHRoaXMuX2ltYWdlQ2FjaGUpIHsKICAgICAgYnl0ZVNpemUgKz0gaW1hZ2VEYXRhLmJ5dGVTaXplOwogICAgfQogICAgcmV0dXJuIGJ5dGVTaXplOwogIH0KICBnZXQgI2NhY2hlTGltaXRSZWFjaGVkKCkgewogICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuc2l6ZSA8IEdsb2JhbEltYWdlQ2FjaGUuTUlOX0lNQUdFU19UT19DQUNIRSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy4jYnl0ZVNpemUgPCBHbG9iYWxJbWFnZUNhY2hlLk1BWF9CWVRFX1NJWkUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIHNob3VsZENhY2hlKHJlZiwgcGFnZUluZGV4KSB7CiAgICBsZXQgcGFnZUluZGV4U2V0ID0gdGhpcy5fcmVmQ2FjaGUuZ2V0KHJlZik7CiAgICBpZiAoIXBhZ2VJbmRleFNldCkgewogICAgICBwYWdlSW5kZXhTZXQgPSBuZXcgU2V0KCk7CiAgICAgIHRoaXMuX3JlZkNhY2hlLnB1dChyZWYsIHBhZ2VJbmRleFNldCk7CiAgICB9CiAgICBwYWdlSW5kZXhTZXQuYWRkKHBhZ2VJbmRleCk7CiAgICBpZiAocGFnZUluZGV4U2V0LnNpemUgPCBHbG9iYWxJbWFnZUNhY2hlLk5VTV9QQUdFU19USFJFU0hPTEQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCF0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpICYmIHRoaXMuI2NhY2hlTGltaXRSZWFjaGVkKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBhZGREZWNvZGVGYWlsZWQocmVmKSB7CiAgICB0aGlzLiNkZWNvZGVGYWlsZWRTZXQucHV0KHJlZik7CiAgfQogIGhhc0RlY29kZUZhaWxlZChyZWYpIHsKICAgIHJldHVybiB0aGlzLiNkZWNvZGVGYWlsZWRTZXQuaGFzKHJlZik7CiAgfQogIGFkZEJ5dGVTaXplKHJlZiwgYnl0ZVNpemUpIHsKICAgIGNvbnN0IGltYWdlRGF0YSA9IHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KHJlZik7CiAgICBpZiAoIWltYWdlRGF0YSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaW1hZ2VEYXRhLmJ5dGVTaXplKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGltYWdlRGF0YS5ieXRlU2l6ZSA9IGJ5dGVTaXplOwogIH0KICBnZXREYXRhKHJlZiwgcGFnZUluZGV4KSB7CiAgICBjb25zdCBwYWdlSW5kZXhTZXQgPSB0aGlzLl9yZWZDYWNoZS5nZXQocmVmKTsKICAgIGlmICghcGFnZUluZGV4U2V0KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHBhZ2VJbmRleFNldC5zaXplIDwgR2xvYmFsSW1hZ2VDYWNoZS5OVU1fUEFHRVNfVEhSRVNIT0xEKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgaW1hZ2VEYXRhID0gdGhpcy5faW1hZ2VDYWNoZS5nZXQocmVmKTsKICAgIGlmICghaW1hZ2VEYXRhKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcGFnZUluZGV4U2V0LmFkZChwYWdlSW5kZXgpOwogICAgcmV0dXJuIGltYWdlRGF0YTsKICB9CiAgc2V0RGF0YShyZWYsIGRhdGEpIHsKICAgIGlmICghdGhpcy5fcmVmQ2FjaGUuaGFzKHJlZikpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdHbG9iYWxJbWFnZUNhY2hlLnNldERhdGEgLSBleHBlY3RlZCAic2hvdWxkQ2FjaGUiIHRvIGhhdmUgYmVlbiBjYWxsZWQuJyk7CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy4jY2FjaGVMaW1pdFJlYWNoZWQpIHsKICAgICAgd2FybigiR2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhIC0gY2FjaGUgbGltaXQgcmVhY2hlZC4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKICB9CiAgY2xlYXIob25seURhdGEgPSBmYWxzZSkgewogICAgaWYgKCFvbmx5RGF0YSkgewogICAgICB0aGlzLiNkZWNvZGVGYWlsZWRTZXQuY2xlYXIoKTsKICAgICAgdGhpcy5fcmVmQ2FjaGUuY2xlYXIoKTsKICAgIH0KICAgIHRoaXMuX2ltYWdlQ2FjaGUuY2xlYXIoKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2Z1bmN0aW9uLmpzCgoKCgoKCmNsYXNzIFBERkZ1bmN0aW9uRmFjdG9yeSB7CiAgY29uc3RydWN0b3IoewogICAgeHJlZiwKICAgIGlzRXZhbFN1cHBvcnRlZCA9IHRydWUKICB9KSB7CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5pc0V2YWxTdXBwb3J0ZWQgPSBpc0V2YWxTdXBwb3J0ZWQgIT09IGZhbHNlOwogIH0KICBjcmVhdGUoZm4sIHBhcnNlQXJyYXkgPSBmYWxzZSkgewogICAgbGV0IGZuUmVmLCBwYXJzZWRGbjsKICAgIGlmIChmbiBpbnN0YW5jZW9mIFJlZikgewogICAgICBmblJlZiA9IGZuOwogICAgfSBlbHNlIGlmIChmbiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgZm5SZWYgPSBmbi5vYmpJZDsKICAgIH0gZWxzZSBpZiAoZm4gaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgIGZuUmVmID0gZm4uZGljdD8ub2JqSWQ7CiAgICB9CiAgICBpZiAoZm5SZWYpIHsKICAgICAgY29uc3QgY2FjaGVkRm4gPSB0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUuZ2V0QnlSZWYoZm5SZWYpOwogICAgICBpZiAoY2FjaGVkRm4pIHsKICAgICAgICByZXR1cm4gY2FjaGVkRm47CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGZuT2JqID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZm4pOwogICAgaWYgKEFycmF5LmlzQXJyYXkoZm5PYmopKSB7CiAgICAgIGlmICghcGFyc2VBcnJheSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignUERGRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZSAtIGV4cGVjdGVkICJwYXJzZUFycmF5IiBhcmd1bWVudC4nKTsKICAgICAgfQogICAgICBwYXJzZWRGbiA9IFBERkZ1bmN0aW9uLnBhcnNlQXJyYXkodGhpcywgZm5PYmopOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VkRm4gPSBQREZGdW5jdGlvbi5wYXJzZSh0aGlzLCBmbk9iaik7CiAgICB9CiAgICBpZiAoZm5SZWYpIHsKICAgICAgdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlLnNldChudWxsLCBmblJlZiwgcGFyc2VkRm4pOwogICAgfQogICAgcmV0dXJuIHBhcnNlZEZuOwogIH0KICBnZXQgX2xvY2FsRnVuY3Rpb25DYWNoZSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIl9sb2NhbEZ1bmN0aW9uQ2FjaGUiLCBuZXcgTG9jYWxGdW5jdGlvbkNhY2hlKCkpOwogIH0KfQpmdW5jdGlvbiB0b051bWJlckFycmF5KGFycikgewogIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaWYgKCFpc051bWJlckFycmF5KGFyciwgbnVsbCkpIHsKICAgIHJldHVybiBhcnIubWFwKHggPT4gK3gpOwogIH0KICByZXR1cm4gYXJyOwp9CmNsYXNzIFBERkZ1bmN0aW9uIHsKICBzdGF0aWMgZ2V0U2FtcGxlQXJyYXkoc2l6ZSwgb3V0cHV0U2l6ZSwgYnBzLCBzdHJlYW0pIHsKICAgIGxldCBpLCBpaTsKICAgIGxldCBsZW5ndGggPSAxOwogICAgZm9yIChpID0gMCwgaWkgPSBzaXplLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgbGVuZ3RoICo9IHNpemVbaV07CiAgICB9CiAgICBsZW5ndGggKj0gb3V0cHV0U2l6ZTsKICAgIGNvbnN0IGFycmF5ID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICBsZXQgY29kZVNpemUgPSAwOwogICAgbGV0IGNvZGVCdWYgPSAwOwogICAgY29uc3Qgc2FtcGxlTXVsID0gMS4wIC8gKDIuMCAqKiBicHMgLSAxKTsKICAgIGNvbnN0IHN0ckJ5dGVzID0gc3RyZWFtLmdldEJ5dGVzKChsZW5ndGggKiBicHMgKyA3KSAvIDgpOwogICAgbGV0IHN0cklkeCA9IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgd2hpbGUgKGNvZGVTaXplIDwgYnBzKSB7CiAgICAgICAgY29kZUJ1ZiA8PD0gODsKICAgICAgICBjb2RlQnVmIHw9IHN0ckJ5dGVzW3N0cklkeCsrXTsKICAgICAgICBjb2RlU2l6ZSArPSA4OwogICAgICB9CiAgICAgIGNvZGVTaXplIC09IGJwczsKICAgICAgYXJyYXlbaV0gPSAoY29kZUJ1ZiA+PiBjb2RlU2l6ZSkgKiBzYW1wbGVNdWw7CiAgICAgIGNvZGVCdWYgJj0gKDEgPDwgY29kZVNpemUpIC0gMTsKICAgIH0KICAgIHJldHVybiBhcnJheTsKICB9CiAgc3RhdGljIHBhcnNlKGZhY3RvcnksIGZuKSB7CiAgICBjb25zdCBkaWN0ID0gZm4uZGljdCB8fCBmbjsKICAgIGNvbnN0IHR5cGVOdW0gPSBkaWN0LmdldCgiRnVuY3Rpb25UeXBlIik7CiAgICBzd2l0Y2ggKHR5cGVOdW0pIHsKICAgICAgY2FzZSAwOgogICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFNhbXBsZWQoZmFjdG9yeSwgZm4sIGRpY3QpOwogICAgICBjYXNlIDE6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RJbnRlcnBvbGF0ZWQoZmFjdG9yeSwgZGljdCk7CiAgICAgIGNhc2UgMzoKICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RTdGljaGVkKGZhY3RvcnksIGRpY3QpOwogICAgICBjYXNlIDQ6CiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0UG9zdFNjcmlwdChmYWN0b3J5LCBmbiwgZGljdCk7CiAgICB9CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZSBvZiBmdW5jdGlvbiIpOwogIH0KICBzdGF0aWMgcGFyc2VBcnJheShmYWN0b3J5LCBmbk9iaikgewogICAgY29uc3QgewogICAgICB4cmVmCiAgICB9ID0gZmFjdG9yeTsKICAgIGNvbnN0IGZuQXJyYXkgPSBbXTsKICAgIGZvciAoY29uc3QgZm4gb2YgZm5PYmopIHsKICAgICAgZm5BcnJheS5wdXNoKHRoaXMucGFyc2UoZmFjdG9yeSwgeHJlZi5mZXRjaElmUmVmKGZuKSkpOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uIChzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmbkFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBmbkFycmF5W2ldKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0ICsgaSk7CiAgICAgIH0KICAgIH07CiAgfQogIHN0YXRpYyBjb25zdHJ1Y3RTYW1wbGVkKGZhY3RvcnksIGZuLCBkaWN0KSB7CiAgICBmdW5jdGlvbiB0b011bHRpQXJyYXkoYXJyKSB7CiAgICAgIGNvbnN0IGlucHV0TGVuZ3RoID0gYXJyLmxlbmd0aDsKICAgICAgY29uc3Qgb3V0ID0gW107CiAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRMZW5ndGg7IGkgKz0gMikgewogICAgICAgIG91dFtpbmRleCsrXSA9IFthcnJbaV0sIGFycltpICsgMV1dOwogICAgICB9CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZSh4LCB4bWluLCB4bWF4LCB5bWluLCB5bWF4KSB7CiAgICAgIHJldHVybiB5bWluICsgKHggLSB4bWluKSAqICgoeW1heCAtIHltaW4pIC8gKHhtYXggLSB4bWluKSk7CiAgICB9CiAgICBsZXQgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CiAgICBsZXQgcmFuZ2UgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIlJhbmdlIikpOwogICAgaWYgKCFkb21haW4gfHwgIXJhbmdlKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gZG9tYWluIG9yIHJhbmdlIik7CiAgICB9CiAgICBjb25zdCBpbnB1dFNpemUgPSBkb21haW4ubGVuZ3RoIC8gMjsKICAgIGNvbnN0IG91dHB1dFNpemUgPSByYW5nZS5sZW5ndGggLyAyOwogICAgZG9tYWluID0gdG9NdWx0aUFycmF5KGRvbWFpbik7CiAgICByYW5nZSA9IHRvTXVsdGlBcnJheShyYW5nZSk7CiAgICBjb25zdCBzaXplID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJTaXplIikpOwogICAgY29uc3QgYnBzID0gZGljdC5nZXQoIkJpdHNQZXJTYW1wbGUiKTsKICAgIGNvbnN0IG9yZGVyID0gZGljdC5nZXQoIk9yZGVyIikgfHwgMTsKICAgIGlmIChvcmRlciAhPT0gMSkgewogICAgICBpbmZvKCJObyBzdXBwb3J0IGZvciBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhdGlvbjogIiArIG9yZGVyKTsKICAgIH0KICAgIGxldCBlbmNvZGUgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkVuY29kZSIpKTsKICAgIGlmICghZW5jb2RlKSB7CiAgICAgIGVuY29kZSA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0U2l6ZTsgKytpKSB7CiAgICAgICAgZW5jb2RlLnB1c2goWzAsIHNpemVbaV0gLSAxXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVuY29kZSA9IHRvTXVsdGlBcnJheShlbmNvZGUpOwogICAgfQogICAgbGV0IGRlY29kZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiRGVjb2RlIikpOwogICAgZGVjb2RlID0gIWRlY29kZSA/IHJhbmdlIDogdG9NdWx0aUFycmF5KGRlY29kZSk7CiAgICBjb25zdCBzYW1wbGVzID0gdGhpcy5nZXRTYW1wbGVBcnJheShzaXplLCBvdXRwdXRTaXplLCBicHMsIGZuKTsKICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RTYW1wbGVkRm4oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgICAgY29uc3QgY3ViZVZlcnRpY2VzID0gMSA8PCBpbnB1dFNpemU7CiAgICAgIGNvbnN0IGN1YmVOID0gbmV3IEZsb2F0NjRBcnJheShjdWJlVmVydGljZXMpLmZpbGwoMSk7CiAgICAgIGNvbnN0IGN1YmVWZXJ0ZXggPSBuZXcgVWludDMyQXJyYXkoY3ViZVZlcnRpY2VzKTsKICAgICAgbGV0IGksIGo7CiAgICAgIGxldCBrID0gb3V0cHV0U2l6ZSwKICAgICAgICBwb3MgPSAxOwogICAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXRTaXplOyArK2kpIHsKICAgICAgICBjb25zdCBkb21haW5fMmkgPSBkb21haW5baV1bMF07CiAgICAgICAgY29uc3QgZG9tYWluXzJpXzEgPSBkb21haW5baV1bMV07CiAgICAgICAgY29uc3QgeGkgPSBNYXRoQ2xhbXAoc3JjW3NyY09mZnNldCArIGldLCBkb21haW5fMmksIGRvbWFpbl8yaV8xKTsKICAgICAgICBsZXQgZSA9IGludGVycG9sYXRlKHhpLCBkb21haW5fMmksIGRvbWFpbl8yaV8xLCBlbmNvZGVbaV1bMF0sIGVuY29kZVtpXVsxXSk7CiAgICAgICAgY29uc3Qgc2l6ZV9pID0gc2l6ZVtpXTsKICAgICAgICBlID0gTWF0aENsYW1wKGUsIDAsIHNpemVfaSAtIDEpOwogICAgICAgIGNvbnN0IGUwID0gZSA8IHNpemVfaSAtIDEgPyBNYXRoLmZsb29yKGUpIDogZSAtIDE7CiAgICAgICAgY29uc3QgbjAgPSBlMCArIDEgLSBlOwogICAgICAgIGNvbnN0IG4xID0gZSAtIGUwOwogICAgICAgIGNvbnN0IG9mZnNldDAgPSBlMCAqIGs7CiAgICAgICAgY29uc3Qgb2Zmc2V0MSA9IG9mZnNldDAgKyBrOwogICAgICAgIGZvciAoaiA9IDA7IGogPCBjdWJlVmVydGljZXM7IGorKykgewogICAgICAgICAgaWYgKGogJiBwb3MpIHsKICAgICAgICAgICAgY3ViZU5bal0gKj0gbjE7CiAgICAgICAgICAgIGN1YmVWZXJ0ZXhbal0gKz0gb2Zmc2V0MTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN1YmVOW2pdICo9IG4wOwogICAgICAgICAgICBjdWJlVmVydGV4W2pdICs9IG9mZnNldDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGsgKj0gc2l6ZV9pOwogICAgICAgIHBvcyA8PD0gMTsKICAgICAgfQogICAgICBmb3IgKGogPSAwOyBqIDwgb3V0cHV0U2l6ZTsgKytqKSB7CiAgICAgICAgbGV0IHJqID0gMDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3ViZVZlcnRpY2VzOyBpKyspIHsKICAgICAgICAgIHJqICs9IHNhbXBsZXNbY3ViZVZlcnRleFtpXSArIGpdICogY3ViZU5baV07CiAgICAgICAgfQogICAgICAgIHJqID0gaW50ZXJwb2xhdGUocmosIDAsIDEsIGRlY29kZVtqXVswXSwgZGVjb2RlW2pdWzFdKTsKICAgICAgICBkZXN0W2Rlc3RPZmZzZXQgKyBqXSA9IE1hdGhDbGFtcChyaiwgcmFuZ2Vbal1bMF0sIHJhbmdlW2pdWzFdKTsKICAgICAgfQogICAgfTsKICB9CiAgc3RhdGljIGNvbnN0cnVjdEludGVycG9sYXRlZChmYWN0b3J5LCBkaWN0KSB7CiAgICBjb25zdCBjMCA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiQzAiKSkgfHwgWzBdOwogICAgY29uc3QgYzEgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkMxIikpIHx8IFsxXTsKICAgIGNvbnN0IG4gPSBkaWN0LmdldCgiTiIpOwogICAgY29uc3QgZGlmZiA9IFtdOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYzAubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBkaWZmLnB1c2goYzFbaV0gLSBjMFtpXSk7CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBkaWZmLmxlbmd0aDsKICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGbihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgICBjb25zdCB4ID0gbiA9PT0gMSA/IHNyY1tzcmNPZmZzZXRdIDogc3JjW3NyY09mZnNldF0gKiogbjsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgewogICAgICAgIGRlc3RbZGVzdE9mZnNldCArIGpdID0gYzBbal0gKyB4ICogZGlmZltqXTsKICAgICAgfQogICAgfTsKICB9CiAgc3RhdGljIGNvbnN0cnVjdFN0aWNoZWQoZmFjdG9yeSwgZGljdCkgewogICAgY29uc3QgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CiAgICBpZiAoIWRvbWFpbikgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk5vIGRvbWFpbiIpOwogICAgfQogICAgY29uc3QgaW5wdXRTaXplID0gZG9tYWluLmxlbmd0aCAvIDI7CiAgICBpZiAoaW5wdXRTaXplICE9PSAxKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFkIGRvbWFpbiBmb3Igc3RpY2hlZCBmdW5jdGlvbiIpOwogICAgfQogICAgY29uc3QgewogICAgICB4cmVmCiAgICB9ID0gZmFjdG9yeTsKICAgIGNvbnN0IGZucyA9IFtdOwogICAgZm9yIChjb25zdCBmbiBvZiBkaWN0LmdldCgiRnVuY3Rpb25zIikpIHsKICAgICAgZm5zLnB1c2godGhpcy5wYXJzZShmYWN0b3J5LCB4cmVmLmZldGNoSWZSZWYoZm4pKSk7CiAgICB9CiAgICBjb25zdCBib3VuZHMgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkJvdW5kcyIpKTsKICAgIGNvbnN0IGVuY29kZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiRW5jb2RlIikpOwogICAgY29uc3QgdG1wQnVmID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RTdGljaGVkRm4oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgICAgY29uc3QgdiA9IE1hdGhDbGFtcChzcmNbc3JjT2Zmc2V0XSwgZG9tYWluWzBdLCBkb21haW5bMV0pOwogICAgICBjb25zdCBsZW5ndGggPSBib3VuZHMubGVuZ3RoOwogICAgICBsZXQgaTsKICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKHYgPCBib3VuZHNbaV0pIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgZG1pbiA9IGRvbWFpblswXTsKICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgZG1pbiA9IGJvdW5kc1tpIC0gMV07CiAgICAgIH0KICAgICAgbGV0IGRtYXggPSBkb21haW5bMV07CiAgICAgIGlmIChpIDwgYm91bmRzLmxlbmd0aCkgewogICAgICAgIGRtYXggPSBib3VuZHNbaV07CiAgICAgIH0KICAgICAgY29uc3Qgcm1pbiA9IGVuY29kZVsyICogaV07CiAgICAgIGNvbnN0IHJtYXggPSBlbmNvZGVbMiAqIGkgKyAxXTsKICAgICAgdG1wQnVmWzBdID0gZG1pbiA9PT0gZG1heCA/IHJtaW4gOiBybWluICsgKHYgLSBkbWluKSAqIChybWF4IC0gcm1pbikgLyAoZG1heCAtIGRtaW4pOwogICAgICBmbnNbaV0odG1wQnVmLCAwLCBkZXN0LCBkZXN0T2Zmc2V0KTsKICAgIH07CiAgfQogIHN0YXRpYyBjb25zdHJ1Y3RQb3N0U2NyaXB0KGZhY3RvcnksIGZuLCBkaWN0KSB7CiAgICBjb25zdCBkb21haW4gPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkRvbWFpbiIpKTsKICAgIGNvbnN0IHJhbmdlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJSYW5nZSIpKTsKICAgIGlmICghZG9tYWluKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gZG9tYWluLiIpOwogICAgfQogICAgaWYgKCFyYW5nZSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk5vIHJhbmdlLiIpOwogICAgfQogICAgY29uc3QgbGV4ZXIgPSBuZXcgUG9zdFNjcmlwdExleGVyKGZuKTsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQb3N0U2NyaXB0UGFyc2VyKGxleGVyKTsKICAgIGNvbnN0IGNvZGUgPSBwYXJzZXIucGFyc2UoKTsKICAgIGlmIChmYWN0b3J5LmlzRXZhbFN1cHBvcnRlZCAmJiBGZWF0dXJlVGVzdC5pc0V2YWxTdXBwb3J0ZWQpIHsKICAgICAgY29uc3QgY29tcGlsZWQgPSBuZXcgUG9zdFNjcmlwdENvbXBpbGVyKCkuY29tcGlsZShjb2RlLCBkb21haW4sIHJhbmdlKTsKICAgICAgaWYgKGNvbXBpbGVkKSB7CiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbigic3JjIiwgInNyY09mZnNldCIsICJkZXN0IiwgImRlc3RPZmZzZXQiLCBjb21waWxlZCk7CiAgICAgIH0KICAgIH0KICAgIGluZm8oIlVuYWJsZSB0byBjb21waWxlIFBTIGZ1bmN0aW9uIik7CiAgICBjb25zdCBudW1PdXRwdXRzID0gcmFuZ2UubGVuZ3RoID4+IDE7CiAgICBjb25zdCBudW1JbnB1dHMgPSBkb21haW4ubGVuZ3RoID4+IDE7CiAgICBjb25zdCBldmFsdWF0b3IgPSBuZXcgUG9zdFNjcmlwdEV2YWx1YXRvcihjb2RlKTsKICAgIGNvbnN0IGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IE1BWF9DQUNIRV9TSVpFID0gMjA0OCAqIDQ7CiAgICBsZXQgY2FjaGVfYXZhaWxhYmxlID0gTUFYX0NBQ0hFX1NJWkU7CiAgICBjb25zdCB0bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KG51bUlucHV0cyk7CiAgICByZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0UG9zdFNjcmlwdEZuKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICAgIGxldCBpLCB2YWx1ZTsKICAgICAgbGV0IGtleSA9ICIiOwogICAgICBjb25zdCBpbnB1dCA9IHRtcEJ1ZjsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bUlucHV0czsgaSsrKSB7CiAgICAgICAgdmFsdWUgPSBzcmNbc3JjT2Zmc2V0ICsgaV07CiAgICAgICAgaW5wdXRbaV0gPSB2YWx1ZTsKICAgICAgICBrZXkgKz0gdmFsdWUgKyAiXyI7CiAgICAgIH0KICAgICAgY29uc3QgY2FjaGVkVmFsdWUgPSBjYWNoZVtrZXldOwogICAgICBpZiAoY2FjaGVkVmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlc3Quc2V0KGNhY2hlZFZhbHVlLCBkZXN0T2Zmc2V0KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShudW1PdXRwdXRzKTsKICAgICAgY29uc3Qgc3RhY2sgPSBldmFsdWF0b3IuZXhlY3V0ZShpbnB1dCk7CiAgICAgIGNvbnN0IHN0YWNrSW5kZXggPSBzdGFjay5sZW5ndGggLSBudW1PdXRwdXRzOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtT3V0cHV0czsgaSsrKSB7CiAgICAgICAgdmFsdWUgPSBzdGFja1tzdGFja0luZGV4ICsgaV07CiAgICAgICAgbGV0IGJvdW5kID0gcmFuZ2VbaSAqIDJdOwogICAgICAgIGlmICh2YWx1ZSA8IGJvdW5kKSB7CiAgICAgICAgICB2YWx1ZSA9IGJvdW5kOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBib3VuZCA9IHJhbmdlW2kgKiAyICsgMV07CiAgICAgICAgICBpZiAodmFsdWUgPiBib3VuZCkgewogICAgICAgICAgICB2YWx1ZSA9IGJvdW5kOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvdXRwdXRbaV0gPSB2YWx1ZTsKICAgICAgfQogICAgICBpZiAoY2FjaGVfYXZhaWxhYmxlID4gMCkgewogICAgICAgIGNhY2hlX2F2YWlsYWJsZS0tOwogICAgICAgIGNhY2hlW2tleV0gPSBvdXRwdXQ7CiAgICAgIH0KICAgICAgZGVzdC5zZXQob3V0cHV0LCBkZXN0T2Zmc2V0KTsKICAgIH07CiAgfQp9CmZ1bmN0aW9uIGlzUERGRnVuY3Rpb24odikgewogIGxldCBmbkRpY3Q7CiAgaWYgKHYgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBmbkRpY3QgPSB2OwogIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgIGZuRGljdCA9IHYuZGljdDsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gZm5EaWN0LmhhcygiRnVuY3Rpb25UeXBlIik7Cn0KY2xhc3MgUG9zdFNjcmlwdFN0YWNrIHsKICBzdGF0aWMgTUFYX1NUQUNLX1NJWkUgPSAxMDA7CiAgY29uc3RydWN0b3IoaW5pdGlhbFN0YWNrKSB7CiAgICB0aGlzLnN0YWNrID0gaW5pdGlhbFN0YWNrID8gQXJyYXkuZnJvbShpbml0aWFsU3RhY2spIDogW107CiAgfQogIHB1c2godmFsdWUpIHsKICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA+PSBQb3N0U2NyaXB0U3RhY2suTUFYX1NUQUNLX1NJWkUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIG92ZXJmbG93LiIpOwogICAgfQogICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTsKICB9CiAgcG9wKCkgewogICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDw9IDApIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIHVuZGVyZmxvdy4iKTsKICAgIH0KICAgIHJldHVybiB0aGlzLnN0YWNrLnBvcCgpOwogIH0KICBjb3B5KG4pIHsKICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCArIG4gPj0gUG9zdFNjcmlwdFN0YWNrLk1BWF9TVEFDS19TSVpFKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayBvdmVyZmxvdy4iKTsKICAgIH0KICAgIGNvbnN0IHN0YWNrID0gdGhpcy5zdGFjazsKICAgIGZvciAobGV0IGkgPSBzdGFjay5sZW5ndGggLSBuLCBqID0gbiAtIDE7IGogPj0gMDsgai0tLCBpKyspIHsKICAgICAgc3RhY2sucHVzaChzdGFja1tpXSk7CiAgICB9CiAgfQogIGluZGV4KG4pIHsKICAgIHRoaXMucHVzaCh0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gbiAtIDFdKTsKICB9CiAgcm9sbChuLCBwKSB7CiAgICBjb25zdCBzdGFjayA9IHRoaXMuc3RhY2s7CiAgICBjb25zdCBsID0gc3RhY2subGVuZ3RoIC0gbjsKICAgIGNvbnN0IHIgPSBzdGFjay5sZW5ndGggLSAxOwogICAgY29uc3QgYyA9IGwgKyAocCAtIE1hdGguZmxvb3IocCAvIG4pICogbik7CiAgICBmb3IgKGxldCBpID0gbCwgaiA9IHI7IGkgPCBqOyBpKyssIGotLSkgewogICAgICBjb25zdCB0ID0gc3RhY2tbaV07CiAgICAgIHN0YWNrW2ldID0gc3RhY2tbal07CiAgICAgIHN0YWNrW2pdID0gdDsKICAgIH0KICAgIGZvciAobGV0IGkgPSBsLCBqID0gYyAtIDE7IGkgPCBqOyBpKyssIGotLSkgewogICAgICBjb25zdCB0ID0gc3RhY2tbaV07CiAgICAgIHN0YWNrW2ldID0gc3RhY2tbal07CiAgICAgIHN0YWNrW2pdID0gdDsKICAgIH0KICAgIGZvciAobGV0IGkgPSBjLCBqID0gcjsgaSA8IGo7IGkrKywgai0tKSB7CiAgICAgIGNvbnN0IHQgPSBzdGFja1tpXTsKICAgICAgc3RhY2tbaV0gPSBzdGFja1tqXTsKICAgICAgc3RhY2tbal0gPSB0OwogICAgfQogIH0KfQpjbGFzcyBQb3N0U2NyaXB0RXZhbHVhdG9yIHsKICBjb25zdHJ1Y3RvcihvcGVyYXRvcnMpIHsKICAgIHRoaXMub3BlcmF0b3JzID0gb3BlcmF0b3JzOwogIH0KICBleGVjdXRlKGluaXRpYWxTdGFjaykgewogICAgY29uc3Qgc3RhY2sgPSBuZXcgUG9zdFNjcmlwdFN0YWNrKGluaXRpYWxTdGFjayk7CiAgICBsZXQgY291bnRlciA9IDA7CiAgICBjb25zdCBvcGVyYXRvcnMgPSB0aGlzLm9wZXJhdG9yczsKICAgIGNvbnN0IGxlbmd0aCA9IG9wZXJhdG9ycy5sZW5ndGg7CiAgICBsZXQgb3BlcmF0b3IsIGEsIGI7CiAgICB3aGlsZSAoY291bnRlciA8IGxlbmd0aCkgewogICAgICBvcGVyYXRvciA9IG9wZXJhdG9yc1tjb3VudGVyKytdOwogICAgICBpZiAodHlwZW9mIG9wZXJhdG9yID09PSAibnVtYmVyIikgewogICAgICAgIHN0YWNrLnB1c2gob3BlcmF0b3IpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHsKICAgICAgICBjYXNlICJqeiI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAoIWEpIHsKICAgICAgICAgICAgY291bnRlciA9IGI7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJqIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGNvdW50ZXIgPSBhOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiYWJzIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5hYnMoYSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiYWRkIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSArIGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiYW5kIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICh0eXBlb2YgYSA9PT0gImJvb2xlYW4iICYmIHR5cGVvZiBiID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhICYmIGIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhICYgYik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJhdGFuIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBNYXRoLmF0YW4yKGEsIGIpIC8gTWF0aC5QSSAqIDE4MDsKICAgICAgICAgIGlmIChhIDwgMCkgewogICAgICAgICAgICBhICs9IDM2MDsKICAgICAgICAgIH0KICAgICAgICAgIHN0YWNrLnB1c2goYSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJiaXRzaGlmdCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAoYSA+IDApIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhIDw8IGIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhID4+IGIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiY2VpbGluZyI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGguY2VpbChhKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjb3B5IjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLmNvcHkoYSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjb3MiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChNYXRoLmNvcyhhICUgMzYwIC8gMTgwICogTWF0aC5QSSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiY3ZpIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKSB8IDA7CiAgICAgICAgICBzdGFjay5wdXNoKGEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiY3ZyIjoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRpdiI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgLyBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImR1cCI6CiAgICAgICAgICBzdGFjay5jb3B5KDEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZXEiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhID09PSBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImV4Y2giOgogICAgICAgICAgc3RhY2sucm9sbCgyLCAxKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImV4cCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgKiogYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJmYWxzZSI6CiAgICAgICAgICBzdGFjay5wdXNoKGZhbHNlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImZsb29yIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5mbG9vcihhKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJnZSI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgPj0gYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJndCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgPiBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImlkaXYiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhIC8gYiB8IDApOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiaW5kZXgiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2suaW5kZXgoYSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJsZSI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgPD0gYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJsbiI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGgubG9nKGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxvZyI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGgubG9nMTAoYSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibHQiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhIDwgYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtb2QiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhICUgYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtdWwiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhICogYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJuZSI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgIT09IGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibmVnIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goLWEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibm90IjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICh0eXBlb2YgYSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goIWEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhY2sucHVzaCh+YSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJvciI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAodHlwZW9mIGEgPT09ICJib29sZWFuIiAmJiB0eXBlb2YgYiA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8fCBiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8IGIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicG9wIjoKICAgICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicm9sbCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5yb2xsKGEsIGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicm91bmQiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChNYXRoLnJvdW5kKGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInNpbiI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGguc2luKGEgJSAzNjAgLyAxODAgKiBNYXRoLlBJKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJzcXJ0IjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5zcXJ0KGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInN1YiI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgLSBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInRydWUiOgogICAgICAgICAgc3RhY2sucHVzaCh0cnVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInRydW5jYXRlIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBhIDwgMCA/IE1hdGguY2VpbChhKSA6IE1hdGguZmxvb3IoYSk7CiAgICAgICAgICBzdGFjay5wdXNoKGEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAieG9yIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICh0eXBlb2YgYSA9PT0gImJvb2xlYW4iICYmIHR5cGVvZiBiID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhICE9PSBiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYSBeIGIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBvcGVyYXRvciAke29wZXJhdG9yfWApOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3RhY2suc3RhY2s7CiAgfQp9CmNsYXNzIEFzdE5vZGUgewogIGNvbnN0cnVjdG9yKHR5cGUpIHsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgIHVucmVhY2hhYmxlKCJhYnN0cmFjdCBtZXRob2QiKTsKICB9Cn0KY2xhc3MgQXN0QXJndW1lbnQgZXh0ZW5kcyBBc3ROb2RlIHsKICBjb25zdHJ1Y3RvcihpbmRleCwgbWluLCBtYXgpIHsKICAgIHN1cGVyKCJhcmdzIik7CiAgICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgICB0aGlzLm1pbiA9IG1pbjsKICAgIHRoaXMubWF4ID0gbWF4OwogIH0KICB2aXNpdCh2aXNpdG9yKSB7CiAgICB2aXNpdG9yLnZpc2l0QXJndW1lbnQodGhpcyk7CiAgfQp9CmNsYXNzIEFzdExpdGVyYWwgZXh0ZW5kcyBBc3ROb2RlIHsKICBjb25zdHJ1Y3RvcihudW1iZXIpIHsKICAgIHN1cGVyKCJsaXRlcmFsIik7CiAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKICAgIHRoaXMubWluID0gbnVtYmVyOwogICAgdGhpcy5tYXggPSBudW1iZXI7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgIHZpc2l0b3IudmlzaXRMaXRlcmFsKHRoaXMpOwogIH0KfQpjbGFzcyBBc3RCaW5hcnlPcGVyYXRpb24gZXh0ZW5kcyBBc3ROb2RlIHsKICBjb25zdHJ1Y3RvcihvcCwgYXJnMSwgYXJnMiwgbWluLCBtYXgpIHsKICAgIHN1cGVyKCJiaW5hcnkiKTsKICAgIHRoaXMub3AgPSBvcDsKICAgIHRoaXMuYXJnMSA9IGFyZzE7CiAgICB0aGlzLmFyZzIgPSBhcmcyOwogICAgdGhpcy5taW4gPSBtaW47CiAgICB0aGlzLm1heCA9IG1heDsKICB9CiAgdmlzaXQodmlzaXRvcikgewogICAgdmlzaXRvci52aXNpdEJpbmFyeU9wZXJhdGlvbih0aGlzKTsKICB9Cn0KY2xhc3MgQXN0TWluIGV4dGVuZHMgQXN0Tm9kZSB7CiAgY29uc3RydWN0b3IoYXJnLCBtYXgpIHsKICAgIHN1cGVyKCJtYXgiKTsKICAgIHRoaXMuYXJnID0gYXJnOwogICAgdGhpcy5taW4gPSBhcmcubWluOwogICAgdGhpcy5tYXggPSBtYXg7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgIHZpc2l0b3IudmlzaXRNaW4odGhpcyk7CiAgfQp9CmNsYXNzIEFzdFZhcmlhYmxlIGV4dGVuZHMgQXN0Tm9kZSB7CiAgY29uc3RydWN0b3IoaW5kZXgsIG1pbiwgbWF4KSB7CiAgICBzdXBlcigidmFyIik7CiAgICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgICB0aGlzLm1pbiA9IG1pbjsKICAgIHRoaXMubWF4ID0gbWF4OwogIH0KICB2aXNpdCh2aXNpdG9yKSB7CiAgICB2aXNpdG9yLnZpc2l0VmFyaWFibGUodGhpcyk7CiAgfQp9CmNsYXNzIEFzdFZhcmlhYmxlRGVmaW5pdGlvbiBleHRlbmRzIEFzdE5vZGUgewogIGNvbnN0cnVjdG9yKHZhcmlhYmxlLCBhcmcpIHsKICAgIHN1cGVyKCJkZWZpbml0aW9uIik7CiAgICB0aGlzLnZhcmlhYmxlID0gdmFyaWFibGU7CiAgICB0aGlzLmFyZyA9IGFyZzsKICB9CiAgdmlzaXQodmlzaXRvcikgewogICAgdmlzaXRvci52aXNpdFZhcmlhYmxlRGVmaW5pdGlvbih0aGlzKTsKICB9Cn0KY2xhc3MgRXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMucGFydHMgPSBbXTsKICB9CiAgdmlzaXRBcmd1bWVudChhcmcpIHsKICAgIHRoaXMucGFydHMucHVzaCgiTWF0aC5tYXgoIiwgYXJnLm1pbiwgIiwgTWF0aC5taW4oIiwgYXJnLm1heCwgIiwgc3JjW3NyY09mZnNldCArICIsIGFyZy5pbmRleCwgIl0pKSIpOwogIH0KICB2aXNpdFZhcmlhYmxlKHZhcmlhYmxlKSB7CiAgICB0aGlzLnBhcnRzLnB1c2goInYiLCB2YXJpYWJsZS5pbmRleCk7CiAgfQogIHZpc2l0TGl0ZXJhbChsaXRlcmFsKSB7CiAgICB0aGlzLnBhcnRzLnB1c2gobGl0ZXJhbC5udW1iZXIpOwogIH0KICB2aXNpdEJpbmFyeU9wZXJhdGlvbihvcGVyYXRpb24pIHsKICAgIHRoaXMucGFydHMucHVzaCgiKCIpOwogICAgb3BlcmF0aW9uLmFyZzEudmlzaXQodGhpcyk7CiAgICB0aGlzLnBhcnRzLnB1c2goIiAiLCBvcGVyYXRpb24ub3AsICIgIik7CiAgICBvcGVyYXRpb24uYXJnMi52aXNpdCh0aGlzKTsKICAgIHRoaXMucGFydHMucHVzaCgiKSIpOwogIH0KICB2aXNpdFZhcmlhYmxlRGVmaW5pdGlvbihkZWZpbml0aW9uKSB7CiAgICB0aGlzLnBhcnRzLnB1c2goInZhciAiKTsKICAgIGRlZmluaXRpb24udmFyaWFibGUudmlzaXQodGhpcyk7CiAgICB0aGlzLnBhcnRzLnB1c2goIiA9ICIpOwogICAgZGVmaW5pdGlvbi5hcmcudmlzaXQodGhpcyk7CiAgICB0aGlzLnBhcnRzLnB1c2goIjsiKTsKICB9CiAgdmlzaXRNaW4obWF4KSB7CiAgICB0aGlzLnBhcnRzLnB1c2goIk1hdGgubWluKCIpOwogICAgbWF4LmFyZy52aXNpdCh0aGlzKTsKICAgIHRoaXMucGFydHMucHVzaCgiLCAiLCBtYXgubWF4LCAiKSIpOwogIH0KICB0b1N0cmluZygpIHsKICAgIHJldHVybiB0aGlzLnBhcnRzLmpvaW4oIiIpOwogIH0KfQpmdW5jdGlvbiBidWlsZEFkZE9wZXJhdGlvbihudW0xLCBudW0yKSB7CiAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTIubnVtYmVyID09PSAwKSB7CiAgICByZXR1cm4gbnVtMTsKICB9CiAgaWYgKG51bTEudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTEubnVtYmVyID09PSAwKSB7CiAgICByZXR1cm4gbnVtMjsKICB9CiAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTEudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwobnVtMS5udW1iZXIgKyBudW0yLm51bWJlcik7CiAgfQogIHJldHVybiBuZXcgQXN0QmluYXJ5T3BlcmF0aW9uKCIrIiwgbnVtMSwgbnVtMiwgbnVtMS5taW4gKyBudW0yLm1pbiwgbnVtMS5tYXggKyBudW0yLm1heCk7Cn0KZnVuY3Rpb24gYnVpbGRNdWxPcGVyYXRpb24obnVtMSwgbnVtMikgewogIGlmIChudW0yLnR5cGUgPT09ICJsaXRlcmFsIikgewogICAgaWYgKG51bTIubnVtYmVyID09PSAwKSB7CiAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbCgwKTsKICAgIH0gZWxzZSBpZiAobnVtMi5udW1iZXIgPT09IDEpIHsKICAgICAgcmV0dXJuIG51bTE7CiAgICB9IGVsc2UgaWYgKG51bTEudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChudW0xLm51bWJlciAqIG51bTIubnVtYmVyKTsKICAgIH0KICB9CiAgaWYgKG51bTEudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICBpZiAobnVtMS5udW1iZXIgPT09IDApIHsKICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKDApOwogICAgfSBlbHNlIGlmIChudW0xLm51bWJlciA9PT0gMSkgewogICAgICByZXR1cm4gbnVtMjsKICAgIH0KICB9CiAgY29uc3QgbWluID0gTWF0aC5taW4obnVtMS5taW4gKiBudW0yLm1pbiwgbnVtMS5taW4gKiBudW0yLm1heCwgbnVtMS5tYXggKiBudW0yLm1pbiwgbnVtMS5tYXggKiBudW0yLm1heCk7CiAgY29uc3QgbWF4ID0gTWF0aC5tYXgobnVtMS5taW4gKiBudW0yLm1pbiwgbnVtMS5taW4gKiBudW0yLm1heCwgbnVtMS5tYXggKiBudW0yLm1pbiwgbnVtMS5tYXggKiBudW0yLm1heCk7CiAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oIioiLCBudW0xLCBudW0yLCBtaW4sIG1heCk7Cn0KZnVuY3Rpb24gYnVpbGRTdWJPcGVyYXRpb24obnVtMSwgbnVtMikgewogIGlmIChudW0yLnR5cGUgPT09ICJsaXRlcmFsIikgewogICAgaWYgKG51bTIubnVtYmVyID09PSAwKSB7CiAgICAgIHJldHVybiBudW0xOwogICAgfSBlbHNlIGlmIChudW0xLnR5cGUgPT09ICJsaXRlcmFsIikgewogICAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwobnVtMS5udW1iZXIgLSBudW0yLm51bWJlcik7CiAgICB9CiAgfQogIGlmIChudW0yLnR5cGUgPT09ICJiaW5hcnkiICYmIG51bTIub3AgPT09ICItIiAmJiBudW0xLnR5cGUgPT09ICJsaXRlcmFsIiAmJiBudW0xLm51bWJlciA9PT0gMSAmJiBudW0yLmFyZzEudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTIuYXJnMS5udW1iZXIgPT09IDEpIHsKICAgIHJldHVybiBudW0yLmFyZzI7CiAgfQogIHJldHVybiBuZXcgQXN0QmluYXJ5T3BlcmF0aW9uKCItIiwgbnVtMSwgbnVtMiwgbnVtMS5taW4gLSBudW0yLm1heCwgbnVtMS5tYXggLSBudW0yLm1pbik7Cn0KZnVuY3Rpb24gYnVpbGRNaW5PcGVyYXRpb24obnVtMSwgbWF4KSB7CiAgaWYgKG51bTEubWluID49IG1heCkgewogICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG1heCk7CiAgfSBlbHNlIGlmIChudW0xLm1heCA8PSBtYXgpIHsKICAgIHJldHVybiBudW0xOwogIH0KICByZXR1cm4gbmV3IEFzdE1pbihudW0xLCBtYXgpOwp9CmNsYXNzIFBvc3RTY3JpcHRDb21waWxlciB7CiAgY29tcGlsZShjb2RlLCBkb21haW4sIHJhbmdlKSB7CiAgICBjb25zdCBzdGFjayA9IFtdOwogICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gW107CiAgICBjb25zdCBpbnB1dFNpemUgPSBkb21haW4ubGVuZ3RoID4+IDEsCiAgICAgIG91dHB1dFNpemUgPSByYW5nZS5sZW5ndGggPj4gMTsKICAgIGxldCBsYXN0UmVnaXN0ZXIgPSAwOwogICAgbGV0IG4sIGo7CiAgICBsZXQgbnVtMSwgbnVtMiwgYXN0MSwgYXN0MiwgdG1wVmFyLCBpdGVtOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFNpemU7IGkrKykgewogICAgICBzdGFjay5wdXNoKG5ldyBBc3RBcmd1bWVudChpLCBkb21haW5baSAqIDJdLCBkb21haW5baSAqIDIgKyAxXSkpOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY29kZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGl0ZW0gPSBjb2RlW2ldOwogICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICJudW1iZXIiKSB7CiAgICAgICAgc3RhY2sucHVzaChuZXcgQXN0TGl0ZXJhbChpdGVtKSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgc3dpdGNoIChpdGVtKSB7CiAgICAgICAgY2FzZSAiYWRkIjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChidWlsZEFkZE9wZXJhdGlvbihudW0xLCBudW0yKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjdnIiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtdWwiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkTXVsT3BlcmF0aW9uKG51bTEsIG51bTIpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInN1YiI6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIG51bTIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIG51bTEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYnVpbGRTdWJPcGVyYXRpb24obnVtMSwgbnVtMikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZXhjaCI6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGFzdDEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGFzdDIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYXN0MSwgYXN0Mik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJwb3AiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImluZGV4IjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgaWYgKG51bTEudHlwZSAhPT0gImxpdGVyYWwiKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbiA9IG51bTEubnVtYmVyOwogICAgICAgICAgaWYgKG4gPCAwIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pIHx8IHN0YWNrLmxlbmd0aCA8IG4pIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBhc3QxID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gbiAtIDFdOwogICAgICAgICAgaWYgKGFzdDEudHlwZSA9PT0gImxpdGVyYWwiIHx8IGFzdDEudHlwZSA9PT0gInZhciIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhc3QxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB0bXBWYXIgPSBuZXcgQXN0VmFyaWFibGUobGFzdFJlZ2lzdGVyKyssIGFzdDEubWluLCBhc3QxLm1heCk7CiAgICAgICAgICBzdGFja1tzdGFjay5sZW5ndGggLSBuIC0gMV0gPSB0bXBWYXI7CiAgICAgICAgICBzdGFjay5wdXNoKHRtcFZhcik7CiAgICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChuZXcgQXN0VmFyaWFibGVEZWZpbml0aW9uKHRtcFZhciwgYXN0MSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZHVwIjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGVvZiBjb2RlW2kgKyAxXSA9PT0gIm51bWJlciIgJiYgY29kZVtpICsgMl0gPT09ICJndCIgJiYgY29kZVtpICsgM10gPT09IGkgKyA3ICYmIGNvZGVbaSArIDRdID09PSAianoiICYmIGNvZGVbaSArIDVdID09PSAicG9wIiAmJiBjb2RlW2kgKyA2XSA9PT0gY29kZVtpICsgMV0pIHsKICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkTWluT3BlcmF0aW9uKG51bTEsIGNvZGVbaSArIDFdKSk7CiAgICAgICAgICAgIGkgKz0gNjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBhc3QxID0gc3RhY2suYXQoLTEpOwogICAgICAgICAgaWYgKGFzdDEudHlwZSA9PT0gImxpdGVyYWwiIHx8IGFzdDEudHlwZSA9PT0gInZhciIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhc3QxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB0bXBWYXIgPSBuZXcgQXN0VmFyaWFibGUobGFzdFJlZ2lzdGVyKyssIGFzdDEubWluLCBhc3QxLm1heCk7CiAgICAgICAgICBzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9IHRtcFZhcjsKICAgICAgICAgIHN0YWNrLnB1c2godG1wVmFyKTsKICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24odG1wVmFyLCBhc3QxKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyb2xsIjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgaWYgKG51bTIudHlwZSAhPT0gImxpdGVyYWwiIHx8IG51bTEudHlwZSAhPT0gImxpdGVyYWwiKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaiA9IG51bTIubnVtYmVyOwogICAgICAgICAgbiA9IG51bTEubnVtYmVyOwogICAgICAgICAgaWYgKG4gPD0gMCB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihqKSB8fCBzdGFjay5sZW5ndGggPCBuKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaiA9IChqICUgbiArIG4pICUgbjsKICAgICAgICAgIGlmIChqID09PSAwKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgc3RhY2sucHVzaCguLi5zdGFjay5zcGxpY2Uoc3RhY2subGVuZ3RoIC0gbiwgbiAtIGopKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKHN0YWNrLmxlbmd0aCAhPT0gb3V0cHV0U2l6ZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHsKICAgICAgY29uc3Qgc3RhdGVtZW50QnVpbGRlciA9IG5ldyBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IoKTsKICAgICAgaW5zdHJ1Y3Rpb24udmlzaXQoc3RhdGVtZW50QnVpbGRlcik7CiAgICAgIHJlc3VsdC5wdXNoKHN0YXRlbWVudEJ1aWxkZXIudG9TdHJpbmcoKSk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdGFjay5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGV4cHIgPSBzdGFja1tpXSwKICAgICAgICBzdGF0ZW1lbnRCdWlsZGVyID0gbmV3IEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvcigpOwogICAgICBleHByLnZpc2l0KHN0YXRlbWVudEJ1aWxkZXIpOwogICAgICBjb25zdCBtaW4gPSByYW5nZVtpICogMl0sCiAgICAgICAgbWF4ID0gcmFuZ2VbaSAqIDIgKyAxXTsKICAgICAgY29uc3Qgb3V0ID0gW3N0YXRlbWVudEJ1aWxkZXIudG9TdHJpbmcoKV07CiAgICAgIGlmIChtaW4gPiBleHByLm1pbikgewogICAgICAgIG91dC51bnNoaWZ0KCJNYXRoLm1heCgiLCBtaW4sICIsICIpOwogICAgICAgIG91dC5wdXNoKCIpIik7CiAgICAgIH0KICAgICAgaWYgKG1heCA8IGV4cHIubWF4KSB7CiAgICAgICAgb3V0LnVuc2hpZnQoIk1hdGgubWluKCIsIG1heCwgIiwgIik7CiAgICAgICAgb3V0LnB1c2goIikiKTsKICAgICAgfQogICAgICBvdXQudW5zaGlmdCgiZGVzdFtkZXN0T2Zmc2V0ICsgIiwgaSwgIl0gPSAiKTsKICAgICAgb3V0LnB1c2goIjsiKTsKICAgICAgcmVzdWx0LnB1c2gob3V0LmpvaW4oIiIpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQuam9pbigiXG4iKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2JpZGkuanMKCmNvbnN0IGJhc2VUeXBlcyA9IFsiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiUyIsICJCIiwgIlMiLCAiV1MiLCAiQiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCIiwgIkIiLCAiQiIsICJTIiwgIldTIiwgIk9OIiwgIk9OIiwgIkVUIiwgIkVUIiwgIkVUIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkVTIiwgIkNTIiwgIkVTIiwgIkNTIiwgIkNTIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkNTIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJDUyIsICJPTiIsICJFVCIsICJFVCIsICJFVCIsICJFVCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIk9OIiwgIk9OIiwgIkJOIiwgIk9OIiwgIk9OIiwgIkVUIiwgIkVUIiwgIkVOIiwgIkVOIiwgIk9OIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiRU4iLCAiTCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiXTsKY29uc3QgYXJhYmljVHlwZXMgPSBbIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIk9OIiwgIk9OIiwgIkFMIiwgIkVUIiwgIkVUIiwgIkFMIiwgIkNTIiwgIkFMIiwgIk9OIiwgIk9OIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkVUIiwgIkFOIiwgIkFOIiwgIkFMIiwgIkFMIiwgIkFMIiwgIk5TTSIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQU4iLCAiT04iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiTlNNIiwgIk5TTSIsICJPTiIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiXTsKZnVuY3Rpb24gaXNPZGQoaSkgewogIHJldHVybiAoaSAmIDEpICE9PSAwOwp9CmZ1bmN0aW9uIGlzRXZlbihpKSB7CiAgcmV0dXJuIChpICYgMSkgPT09IDA7Cn0KZnVuY3Rpb24gZmluZFVuZXF1YWwoYXJyLCBzdGFydCwgdmFsdWUpIHsKICBsZXQgaiwgamo7CiAgZm9yIChqID0gc3RhcnQsIGpqID0gYXJyLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKICAgIGlmIChhcnJbal0gIT09IHZhbHVlKSB7CiAgICAgIHJldHVybiBqOwogICAgfQogIH0KICByZXR1cm4gajsKfQpmdW5jdGlvbiByZXZlcnNlVmFsdWVzKGFyciwgc3RhcnQsIGVuZCkgewogIGZvciAobGV0IGkgPSBzdGFydCwgaiA9IGVuZCAtIDE7IGkgPCBqOyArK2ksIC0taikgewogICAgY29uc3QgdGVtcCA9IGFycltpXTsKICAgIGFycltpXSA9IGFycltqXTsKICAgIGFycltqXSA9IHRlbXA7CiAgfQp9CmZ1bmN0aW9uIGNyZWF0ZUJpZGlUZXh0KHN0ciwgaXNMVFIsIHZlcnRpY2FsID0gZmFsc2UpIHsKICBsZXQgZGlyID0gImx0ciI7CiAgaWYgKHZlcnRpY2FsKSB7CiAgICBkaXIgPSAidHRiIjsKICB9IGVsc2UgaWYgKCFpc0xUUikgewogICAgZGlyID0gInJ0bCI7CiAgfQogIHJldHVybiB7CiAgICBzdHIsCiAgICBkaXIKICB9Owp9CmNvbnN0IGNoYXJzID0gW107CmNvbnN0IHR5cGVzID0gW107CmZ1bmN0aW9uIGJpZGkoc3RyLCBzdGFydExldmVsID0gLTEsIHZlcnRpY2FsID0gZmFsc2UpIHsKICBsZXQgaXNMVFIgPSB0cnVlOwogIGNvbnN0IHN0ckxlbmd0aCA9IHN0ci5sZW5ndGg7CiAgaWYgKHN0ckxlbmd0aCA9PT0gMCB8fCB2ZXJ0aWNhbCkgewogICAgcmV0dXJuIGNyZWF0ZUJpZGlUZXh0KHN0ciwgaXNMVFIsIHZlcnRpY2FsKTsKICB9CiAgY2hhcnMubGVuZ3RoID0gc3RyTGVuZ3RoOwogIHR5cGVzLmxlbmd0aCA9IHN0ckxlbmd0aDsKICBsZXQgbnVtQmlkaSA9IDA7CiAgbGV0IGksIGlpOwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgY2hhcnNbaV0gPSBzdHIuY2hhckF0KGkpOwogICAgY29uc3QgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgIGxldCBjaGFyVHlwZSA9ICJMIjsKICAgIGlmIChjaGFyQ29kZSA8PSAweDAwZmYpIHsKICAgICAgY2hhclR5cGUgPSBiYXNlVHlwZXNbY2hhckNvZGVdOwogICAgfSBlbHNlIGlmICgweDA1OTAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHgwNWY0KSB7CiAgICAgIGNoYXJUeXBlID0gIlIiOwogICAgfSBlbHNlIGlmICgweDA2MDAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHgwNmZmKSB7CiAgICAgIGNoYXJUeXBlID0gYXJhYmljVHlwZXNbY2hhckNvZGUgJiAweGZmXTsKICAgICAgaWYgKCFjaGFyVHlwZSkgewogICAgICAgIHdhcm4oIkJpZGk6IGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgIiArIGNoYXJDb2RlLnRvU3RyaW5nKDE2KSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoMHgwNzAwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4MDhhYyB8fCAweGZiNTAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHhmZGZmIHx8IDB4ZmU3MCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweGZlZmYpIHsKICAgICAgY2hhclR5cGUgPSAiQUwiOwogICAgfQogICAgaWYgKGNoYXJUeXBlID09PSAiUiIgfHwgY2hhclR5cGUgPT09ICJBTCIgfHwgY2hhclR5cGUgPT09ICJBTiIpIHsKICAgICAgbnVtQmlkaSsrOwogICAgfQogICAgdHlwZXNbaV0gPSBjaGFyVHlwZTsKICB9CiAgaWYgKG51bUJpZGkgPT09IDApIHsKICAgIGlzTFRSID0gdHJ1ZTsKICAgIHJldHVybiBjcmVhdGVCaWRpVGV4dChzdHIsIGlzTFRSKTsKICB9CiAgaWYgKHN0YXJ0TGV2ZWwgPT09IC0xKSB7CiAgICBpZiAobnVtQmlkaSAvIHN0ckxlbmd0aCA8IDAuMyAmJiBzdHJMZW5ndGggPiA0KSB7CiAgICAgIGlzTFRSID0gdHJ1ZTsKICAgICAgc3RhcnRMZXZlbCA9IDA7CiAgICB9IGVsc2UgewogICAgICBpc0xUUiA9IGZhbHNlOwogICAgICBzdGFydExldmVsID0gMTsKICAgIH0KICB9CiAgY29uc3QgbGV2ZWxzID0gW107CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICBsZXZlbHNbaV0gPSBzdGFydExldmVsOwogIH0KICBjb25zdCBlID0gaXNPZGQoc3RhcnRMZXZlbCkgPyAiUiIgOiAiTCI7CiAgY29uc3Qgc29yID0gZTsKICBjb25zdCBlb3IgPSBzb3I7CiAgbGV0IGxhc3RUeXBlID0gc29yOwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgaWYgKHR5cGVzW2ldID09PSAiTlNNIikgewogICAgICB0eXBlc1tpXSA9IGxhc3RUeXBlOwogICAgfSBlbHNlIHsKICAgICAgbGFzdFR5cGUgPSB0eXBlc1tpXTsKICAgIH0KICB9CiAgbGFzdFR5cGUgPSBzb3I7CiAgbGV0IHQ7CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICB0ID0gdHlwZXNbaV07CiAgICBpZiAodCA9PT0gIkVOIikgewogICAgICB0eXBlc1tpXSA9IGxhc3RUeXBlID09PSAiQUwiID8gIkFOIiA6ICJFTiI7CiAgICB9IGVsc2UgaWYgKHQgPT09ICJSIiB8fCB0ID09PSAiTCIgfHwgdCA9PT0gIkFMIikgewogICAgICBsYXN0VHlwZSA9IHQ7CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKHQgPT09ICJBTCIpIHsKICAgICAgdHlwZXNbaV0gPSAiUiI7CiAgICB9CiAgfQogIGZvciAoaSA9IDE7IGkgPCBzdHJMZW5ndGggLSAxOyArK2kpIHsKICAgIGlmICh0eXBlc1tpXSA9PT0gIkVTIiAmJiB0eXBlc1tpIC0gMV0gPT09ICJFTiIgJiYgdHlwZXNbaSArIDFdID09PSAiRU4iKSB7CiAgICAgIHR5cGVzW2ldID0gIkVOIjsKICAgIH0KICAgIGlmICh0eXBlc1tpXSA9PT0gIkNTIiAmJiAodHlwZXNbaSAtIDFdID09PSAiRU4iIHx8IHR5cGVzW2kgLSAxXSA9PT0gIkFOIikgJiYgdHlwZXNbaSArIDFdID09PSB0eXBlc1tpIC0gMV0pIHsKICAgICAgdHlwZXNbaV0gPSB0eXBlc1tpIC0gMV07CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgaWYgKHR5cGVzW2ldID09PSAiRU4iKSB7CiAgICAgIGZvciAobGV0IGogPSBpIC0gMTsgaiA+PSAwOyAtLWopIHsKICAgICAgICBpZiAodHlwZXNbal0gIT09ICJFVCIpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0eXBlc1tqXSA9ICJFTiI7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgc3RyTGVuZ3RoOyArK2opIHsKICAgICAgICBpZiAodHlwZXNbal0gIT09ICJFVCIpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0eXBlc1tqXSA9ICJFTiI7CiAgICAgIH0KICAgIH0KICB9CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICB0ID0gdHlwZXNbaV07CiAgICBpZiAodCA9PT0gIldTIiB8fCB0ID09PSAiRVMiIHx8IHQgPT09ICJFVCIgfHwgdCA9PT0gIkNTIikgewogICAgICB0eXBlc1tpXSA9ICJPTiI7CiAgICB9CiAgfQogIGxhc3RUeXBlID0gc29yOwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKHQgPT09ICJFTiIpIHsKICAgICAgdHlwZXNbaV0gPSBsYXN0VHlwZSA9PT0gIkwiID8gIkwiIDogIkVOIjsKICAgIH0gZWxzZSBpZiAodCA9PT0gIlIiIHx8IHQgPT09ICJMIikgewogICAgICBsYXN0VHlwZSA9IHQ7CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgaWYgKHR5cGVzW2ldID09PSAiT04iKSB7CiAgICAgIGNvbnN0IGVuZCA9IGZpbmRVbmVxdWFsKHR5cGVzLCBpICsgMSwgIk9OIik7CiAgICAgIGxldCBiZWZvcmUgPSBzb3I7CiAgICAgIGlmIChpID4gMCkgewogICAgICAgIGJlZm9yZSA9IHR5cGVzW2kgLSAxXTsKICAgICAgfQogICAgICBsZXQgYWZ0ZXIgPSBlb3I7CiAgICAgIGlmIChlbmQgKyAxIDwgc3RyTGVuZ3RoKSB7CiAgICAgICAgYWZ0ZXIgPSB0eXBlc1tlbmQgKyAxXTsKICAgICAgfQogICAgICBpZiAoYmVmb3JlICE9PSAiTCIpIHsKICAgICAgICBiZWZvcmUgPSAiUiI7CiAgICAgIH0KICAgICAgaWYgKGFmdGVyICE9PSAiTCIpIHsKICAgICAgICBhZnRlciA9ICJSIjsKICAgICAgfQogICAgICBpZiAoYmVmb3JlID09PSBhZnRlcikgewogICAgICAgIHR5cGVzLmZpbGwoYmVmb3JlLCBpLCBlbmQpOwogICAgICB9CiAgICAgIGkgPSBlbmQgLSAxOwogICAgfQogIH0KICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKICAgIGlmICh0eXBlc1tpXSA9PT0gIk9OIikgewogICAgICB0eXBlc1tpXSA9IGU7CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKGlzRXZlbihsZXZlbHNbaV0pKSB7CiAgICAgIGlmICh0ID09PSAiUiIpIHsKICAgICAgICBsZXZlbHNbaV0gKz0gMTsKICAgICAgfSBlbHNlIGlmICh0ID09PSAiQU4iIHx8IHQgPT09ICJFTiIpIHsKICAgICAgICBsZXZlbHNbaV0gKz0gMjsKICAgICAgfQogICAgfSBlbHNlIGlmICh0ID09PSAiTCIgfHwgdCA9PT0gIkFOIiB8fCB0ID09PSAiRU4iKSB7CiAgICAgIGxldmVsc1tpXSArPSAxOwogICAgfQogIH0KICBsZXQgaGlnaGVzdExldmVsID0gLTE7CiAgbGV0IGxvd2VzdE9kZExldmVsID0gOTk7CiAgbGV0IGxldmVsOwogIGZvciAoaSA9IDAsIGlpID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgIGxldmVsID0gbGV2ZWxzW2ldOwogICAgaWYgKGhpZ2hlc3RMZXZlbCA8IGxldmVsKSB7CiAgICAgIGhpZ2hlc3RMZXZlbCA9IGxldmVsOwogICAgfQogICAgaWYgKGxvd2VzdE9kZExldmVsID4gbGV2ZWwgJiYgaXNPZGQobGV2ZWwpKSB7CiAgICAgIGxvd2VzdE9kZExldmVsID0gbGV2ZWw7CiAgICB9CiAgfQogIGZvciAobGV2ZWwgPSBoaWdoZXN0TGV2ZWw7IGxldmVsID49IGxvd2VzdE9kZExldmVsOyAtLWxldmVsKSB7CiAgICBsZXQgc3RhcnQgPSAtMTsKICAgIGZvciAoaSA9IDAsIGlpID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgaWYgKGxldmVsc1tpXSA8IGxldmVsKSB7CiAgICAgICAgaWYgKHN0YXJ0ID49IDApIHsKICAgICAgICAgIHJldmVyc2VWYWx1ZXMoY2hhcnMsIHN0YXJ0LCBpKTsKICAgICAgICAgIHN0YXJ0ID0gLTE7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICAgIHN0YXJ0ID0gaTsKICAgICAgfQogICAgfQogICAgaWYgKHN0YXJ0ID49IDApIHsKICAgICAgcmV2ZXJzZVZhbHVlcyhjaGFycywgc3RhcnQsIGxldmVscy5sZW5ndGgpOwogICAgfQogIH0KICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgIGNvbnN0IGNoID0gY2hhcnNbaV07CiAgICBpZiAoY2ggPT09ICI8IiB8fCBjaCA9PT0gIj4iKSB7CiAgICAgIGNoYXJzW2ldID0gIiI7CiAgICB9CiAgfQogIHJldHVybiBjcmVhdGVCaWRpVGV4dChjaGFycy5qb2luKCIiKSwgaXNMVFIpOwp9Cgo7Ly8gLi9zcmMvY29yZS9mb250X3N1YnN0aXR1dGlvbnMuanMKCgoKY29uc3QgTk9STUFMID0gewogIHN0eWxlOiAibm9ybWFsIiwKICB3ZWlnaHQ6ICJub3JtYWwiCn07CmNvbnN0IEJPTEQgPSB7CiAgc3R5bGU6ICJub3JtYWwiLAogIHdlaWdodDogImJvbGQiCn07CmNvbnN0IElUQUxJQyA9IHsKICBzdHlsZTogIml0YWxpYyIsCiAgd2VpZ2h0OiAibm9ybWFsIgp9Owpjb25zdCBCT0xESVRBTElDID0gewogIHN0eWxlOiAiaXRhbGljIiwKICB3ZWlnaHQ6ICJib2xkIgp9Owpjb25zdCBzdWJzdGl0dXRpb25NYXAgPSBuZXcgTWFwKFtbIlRpbWVzLVJvbWFuIiwgewogIGxvY2FsOiBbIlRpbWVzIE5ldyBSb21hbiIsICJUaW1lcy1Sb21hbiIsICJUaW1lcyIsICJMaWJlcmF0aW9uIFNlcmlmIiwgIk5pbWJ1cyBSb21hbiIsICJOaW1idXMgUm9tYW4gTCIsICJUaW5vcyIsICJUaG9ybmRhbGUiLCAiVGVYIEd5cmUgVGVybWVzIiwgIkZyZWVTZXJpZiIsICJMaW51eCBMaWJlcnRpbmUgTyIsICJMaWJlcnRpbnVzIFNlcmlmIiwgIkRlamFWdSBTZXJpZiIsICJCaXRzdHJlYW0gVmVyYSBTZXJpZiIsICJVYnVudHUiXSwKICBzdHlsZTogTk9STUFMLAogIHVsdGltYXRlOiAic2VyaWYiCn1dLCBbIlRpbWVzLUJvbGQiLCB7CiAgYWxpYXM6ICJUaW1lcy1Sb21hbiIsCiAgc3R5bGU6IEJPTEQsCiAgdWx0aW1hdGU6ICJzZXJpZiIKfV0sIFsiVGltZXMtSXRhbGljIiwgewogIGFsaWFzOiAiVGltZXMtUm9tYW4iLAogIHN0eWxlOiBJVEFMSUMsCiAgdWx0aW1hdGU6ICJzZXJpZiIKfV0sIFsiVGltZXMtQm9sZEl0YWxpYyIsIHsKICBhbGlhczogIlRpbWVzLVJvbWFuIiwKICBzdHlsZTogQk9MRElUQUxJQywKICB1bHRpbWF0ZTogInNlcmlmIgp9XSwgWyJIZWx2ZXRpY2EiLCB7CiAgbG9jYWw6IFsiSGVsdmV0aWNhIiwgIkhlbHZldGljYSBOZXVlIiwgIkFyaWFsIiwgIkFyaWFsIE5vdmEiLCAiTGliZXJhdGlvbiBTYW5zIiwgIkFyaW1vIiwgIk5pbWJ1cyBTYW5zIiwgIk5pbWJ1cyBTYW5zIEwiLCAiQTAzMCIsICJUZVggR3lyZSBIZXJvcyIsICJGcmVlU2FucyIsICJEZWphVnUgU2FucyIsICJBbGJhbnkiLCAiQml0c3RyZWFtIFZlcmEgU2FucyIsICJBcmlhbCBVbmljb2RlIE1TIiwgIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgIkFwcGxlIFN5bWJvbHMiLCAiQ2FudGFyZWxsIl0sCiAgcGF0aDogIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIudHRmIiwKICBzdHlsZTogTk9STUFMLAogIHVsdGltYXRlOiAic2Fucy1zZXJpZiIKfV0sIFsiSGVsdmV0aWNhLUJvbGQiLCB7CiAgYWxpYXM6ICJIZWx2ZXRpY2EiLAogIHBhdGg6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkLnR0ZiIsCiAgc3R5bGU6IEJPTEQsCiAgdWx0aW1hdGU6ICJzYW5zLXNlcmlmIgp9XSwgWyJIZWx2ZXRpY2EtT2JsaXF1ZSIsIHsKICBhbGlhczogIkhlbHZldGljYSIsCiAgcGF0aDogIkxpYmVyYXRpb25TYW5zLUl0YWxpYy50dGYiLAogIHN0eWxlOiBJVEFMSUMsCiAgdWx0aW1hdGU6ICJzYW5zLXNlcmlmIgp9XSwgWyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLCB7CiAgYWxpYXM6ICJIZWx2ZXRpY2EiLAogIHBhdGg6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljLnR0ZiIsCiAgc3R5bGU6IEJPTERJVEFMSUMsCiAgdWx0aW1hdGU6ICJzYW5zLXNlcmlmIgp9XSwgWyJDb3VyaWVyIiwgewogIGxvY2FsOiBbIkNvdXJpZXIiLCAiQ291cmllciBOZXciLCAiTGliZXJhdGlvbiBNb25vIiwgIk5pbWJ1cyBNb25vIiwgIk5pbWJ1cyBNb25vIEwiLCAiQ291c2luZSIsICJDdW1iZXJsYW5kIiwgIlRlWCBHeXJlIEN1cnNvciIsICJGcmVlTW9ubyIsICJMaW51eCBMaWJlcnRpbmUgTW9ubyBPIiwgIkxpYmVydGludXMgTW9ubyJdLAogIHN0eWxlOiBOT1JNQUwsCiAgdWx0aW1hdGU6ICJtb25vc3BhY2UiCn1dLCBbIkNvdXJpZXItQm9sZCIsIHsKICBhbGlhczogIkNvdXJpZXIiLAogIHN0eWxlOiBCT0xELAogIHVsdGltYXRlOiAibW9ub3NwYWNlIgp9XSwgWyJDb3VyaWVyLU9ibGlxdWUiLCB7CiAgYWxpYXM6ICJDb3VyaWVyIiwKICBzdHlsZTogSVRBTElDLAogIHVsdGltYXRlOiAibW9ub3NwYWNlIgp9XSwgWyJDb3VyaWVyLUJvbGRPYmxpcXVlIiwgewogIGFsaWFzOiAiQ291cmllciIsCiAgc3R5bGU6IEJPTERJVEFMSUMsCiAgdWx0aW1hdGU6ICJtb25vc3BhY2UiCn1dLCBbIkFyaWFsQmxhY2siLCB7CiAgbG9jYWw6IFsiQXJpYWwgQmxhY2siXSwKICBzdHlsZTogewogICAgc3R5bGU6ICJub3JtYWwiLAogICAgd2VpZ2h0OiAiOTAwIgogIH0sCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZCIKfV0sIFsiQXJpYWxCbGFjay1Cb2xkIiwgewogIGFsaWFzOiAiQXJpYWxCbGFjayIKfV0sIFsiQXJpYWxCbGFjay1JdGFsaWMiLCB7CiAgYWxpYXM6ICJBcmlhbEJsYWNrIiwKICBzdHlsZTogewogICAgc3R5bGU6ICJpdGFsaWMiLAogICAgd2VpZ2h0OiAiOTAwIgogIH0sCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiCn1dLCBbIkFyaWFsQmxhY2stQm9sZEl0YWxpYyIsIHsKICBhbGlhczogIkFyaWFsQmxhY2stSXRhbGljIgp9XSwgWyJBcmlhbE5hcnJvdyIsIHsKICBsb2NhbDogWyJBcmlhbCBOYXJyb3ciLCAiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyIsICJIZWx2ZXRpY2EgQ29uZGVuc2VkIiwgIk5pbWJ1cyBTYW5zIE5hcnJvdyIsICJUZVggR3lyZSBIZXJvcyBDbiJdLAogIHN0eWxlOiBOT1JNQUwsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EiCn1dLCBbIkFyaWFsTmFycm93LUJvbGQiLCB7CiAgYWxpYXM6ICJBcmlhbE5hcnJvdyIsCiAgc3R5bGU6IEJPTEQsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZCIKfV0sIFsiQXJpYWxOYXJyb3ctSXRhbGljIiwgewogIGFsaWFzOiAiQXJpYWxOYXJyb3ciLAogIHN0eWxlOiBJVEFMSUMsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtT2JsaXF1ZSIKfV0sIFsiQXJpYWxOYXJyb3ctQm9sZEl0YWxpYyIsIHsKICBhbGlhczogIkFyaWFsTmFycm93IiwKICBzdHlsZTogQk9MRElUQUxJQywKICBmYWxsYmFjazogIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIKfV0sIFsiQ2FsaWJyaSIsIHsKICBsb2NhbDogWyJDYWxpYnJpIiwgIkNhcmxpdG8iXSwKICBzdHlsZTogTk9STUFMLAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhIgp9XSwgWyJDYWxpYnJpLUJvbGQiLCB7CiAgYWxpYXM6ICJDYWxpYnJpIiwKICBzdHlsZTogQk9MRCwKICBmYWxsYmFjazogIkhlbHZldGljYS1Cb2xkIgp9XSwgWyJDYWxpYnJpLUl0YWxpYyIsIHsKICBhbGlhczogIkNhbGlicmkiLAogIHN0eWxlOiBJVEFMSUMsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtT2JsaXF1ZSIKfV0sIFsiQ2FsaWJyaS1Cb2xkSXRhbGljIiwgewogIGFsaWFzOiAiQ2FsaWJyaSIsCiAgc3R5bGU6IEJPTERJVEFMSUMsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiCn1dLCBbIldpbmdkaW5ncyIsIHsKICBsb2NhbDogWyJXaW5nZGluZ3MiLCAiVVJXIERpbmdiYXRzIl0sCiAgc3R5bGU6IE5PUk1BTAp9XSwgWyJXaW5nZGluZ3MtUmVndWxhciIsIHsKICBhbGlhczogIldpbmdkaW5ncyIKfV0sIFsiV2luZ2RpbmdzLUJvbGQiLCB7CiAgYWxpYXM6ICJXaW5nZGluZ3MiCn1dXSk7CmNvbnN0IGZvbnRBbGlhc2VzID0gbmV3IE1hcChbWyJBcmlhbC1CbGFjayIsICJBcmlhbEJsYWNrIl1dKTsKZnVuY3Rpb24gZ2V0U3R5bGVUb0FwcGVuZChzdHlsZSkgewogIHN3aXRjaCAoc3R5bGUpIHsKICAgIGNhc2UgQk9MRDoKICAgICAgcmV0dXJuICJCb2xkIjsKICAgIGNhc2UgSVRBTElDOgogICAgICByZXR1cm4gIkl0YWxpYyI7CiAgICBjYXNlIEJPTERJVEFMSUM6CiAgICAgIHJldHVybiAiQm9sZCBJdGFsaWMiOwogICAgZGVmYXVsdDoKICAgICAgaWYgKHN0eWxlPy53ZWlnaHQgPT09ICJib2xkIikgewogICAgICAgIHJldHVybiAiQm9sZCI7CiAgICAgIH0KICAgICAgaWYgKHN0eWxlPy5zdHlsZSA9PT0gIml0YWxpYyIpIHsKICAgICAgICByZXR1cm4gIkl0YWxpYyI7CiAgICAgIH0KICB9CiAgcmV0dXJuICIiOwp9CmZ1bmN0aW9uIGdldEZhbWlseU5hbWUoc3RyKSB7CiAgY29uc3Qga2V5d29yZHMgPSBuZXcgU2V0KFsidGhpbiIsICJleHRyYWxpZ2h0IiwgInVsdHJhbGlnaHQiLCAiZGVtaWxpZ2h0IiwgInNlbWlsaWdodCIsICJsaWdodCIsICJib29rIiwgInJlZ3VsYXIiLCAibm9ybWFsIiwgIm1lZGl1bSIsICJkZW1pYm9sZCIsICJzZW1pYm9sZCIsICJib2xkIiwgImV4dHJhYm9sZCIsICJ1bHRyYWJvbGQiLCAiYmxhY2siLCAiaGVhdnkiLCAiZXh0cmFibGFjayIsICJ1bHRyYWJsYWNrIiwgInJvbWFuIiwgIml0YWxpYyIsICJvYmxpcXVlIiwgInVsdHJhY29uZGVuc2VkIiwgImV4dHJhY29uZGVuc2VkIiwgImNvbmRlbnNlZCIsICJzZW1pY29uZGVuc2VkIiwgIm5vcm1hbCIsICJzZW1pZXhwYW5kZWQiLCAiZXhwYW5kZWQiLCAiZXh0cmFleHBhbmRlZCIsICJ1bHRyYWV4cGFuZGVkIiwgImJvbGRpdGFsaWMiXSk7CiAgcmV0dXJuIHN0ci5zcGxpdCgvWy0gLCtdKy9nKS5maWx0ZXIodG9rID0+ICFrZXl3b3Jkcy5oYXModG9rLnRvTG93ZXJDYXNlKCkpKS5qb2luKCIgIik7Cn0KZnVuY3Rpb24gZ2VuZXJhdGVGb250KHsKICBhbGlhcywKICBsb2NhbCwKICBwYXRoLAogIGZhbGxiYWNrLAogIHN0eWxlLAogIHVsdGltYXRlCn0sIHNyYywgbG9jYWxGb250UGF0aCwgdXNlRmFsbGJhY2sgPSB0cnVlLCB1c2VQYXRoID0gdHJ1ZSwgYXBwZW5kID0gIiIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICBzdHlsZTogbnVsbCwKICAgIHVsdGltYXRlOiBudWxsCiAgfTsKICBpZiAobG9jYWwpIHsKICAgIGNvbnN0IGV4dHJhID0gYXBwZW5kID8gYCAke2FwcGVuZH1gIDogIiI7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbG9jYWwpIHsKICAgICAgc3JjLnB1c2goYGxvY2FsKCR7bmFtZX0ke2V4dHJhfSlgKTsKICAgIH0KICB9CiAgaWYgKGFsaWFzKSB7CiAgICBjb25zdCBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb25NYXAuZ2V0KGFsaWFzKTsKICAgIGNvbnN0IGFsaWFzQXBwZW5kID0gYXBwZW5kIHx8IGdldFN0eWxlVG9BcHBlbmQoc3R5bGUpOwogICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIGdlbmVyYXRlRm9udChzdWJzdGl0dXRpb24sIHNyYywgbG9jYWxGb250UGF0aCwgdXNlRmFsbGJhY2sgJiYgIWZhbGxiYWNrLCB1c2VQYXRoICYmICFwYXRoLCBhbGlhc0FwcGVuZCkpOwogIH0KICBpZiAoc3R5bGUpIHsKICAgIHJlc3VsdC5zdHlsZSA9IHN0eWxlOwogIH0KICBpZiAodWx0aW1hdGUpIHsKICAgIHJlc3VsdC51bHRpbWF0ZSA9IHVsdGltYXRlOwogIH0KICBpZiAodXNlRmFsbGJhY2sgJiYgZmFsbGJhY2spIHsKICAgIGNvbnN0IGZhbGxiYWNrSW5mbyA9IHN1YnN0aXR1dGlvbk1hcC5nZXQoZmFsbGJhY2spOwogICAgY29uc3QgewogICAgICB1bHRpbWF0ZTogZmFsbGJhY2tVbHRpbWF0ZQogICAgfSA9IGdlbmVyYXRlRm9udChmYWxsYmFja0luZm8sIHNyYywgbG9jYWxGb250UGF0aCwgdXNlRmFsbGJhY2ssIHVzZVBhdGggJiYgIXBhdGgsIGFwcGVuZCk7CiAgICByZXN1bHQudWx0aW1hdGUgfHw9IGZhbGxiYWNrVWx0aW1hdGU7CiAgfQogIGlmICh1c2VQYXRoICYmIHBhdGggJiYgbG9jYWxGb250UGF0aCkgewogICAgc3JjLnB1c2goYHVybCgke2xvY2FsRm9udFBhdGh9JHtwYXRofSlgKTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpmdW5jdGlvbiBnZXRGb250U3Vic3RpdHV0aW9uKHN5c3RlbUZvbnRDYWNoZSwgaWRGYWN0b3J5LCBsb2NhbEZvbnRQYXRoLCBiYXNlRm9udE5hbWUsIHN0YW5kYXJkRm9udE5hbWUsIHR5cGUpIHsKICBpZiAoYmFzZUZvbnROYW1lLnN0YXJ0c1dpdGgoIkludmFsaWRQREZqc0ZvbnRfIikpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBpZiAoKHR5cGUgPT09ICJUcnVlVHlwZSIgfHwgdHlwZSA9PT0gIlR5cGUxIikgJiYgL15bQS1aXXs2fVwrLy50ZXN0KGJhc2VGb250TmFtZSkpIHsKICAgIGJhc2VGb250TmFtZSA9IGJhc2VGb250TmFtZS5zbGljZSg3KTsKICB9CiAgYmFzZUZvbnROYW1lID0gbm9ybWFsaXplRm9udE5hbWUoYmFzZUZvbnROYW1lKTsKICBjb25zdCBrZXkgPSBiYXNlRm9udE5hbWU7CiAgbGV0IHN1YnN0aXR1dGlvbkluZm8gPSBzeXN0ZW1Gb250Q2FjaGUuZ2V0KGtleSk7CiAgaWYgKHN1YnN0aXR1dGlvbkluZm8pIHsKICAgIHJldHVybiBzdWJzdGl0dXRpb25JbmZvOwogIH0KICBsZXQgc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uTWFwLmdldChiYXNlRm9udE5hbWUpOwogIGlmICghc3Vic3RpdHV0aW9uKSB7CiAgICBmb3IgKGNvbnN0IFthbGlhcywgc3Vic3RdIG9mIGZvbnRBbGlhc2VzKSB7CiAgICAgIGlmIChiYXNlRm9udE5hbWUuc3RhcnRzV2l0aChhbGlhcykpIHsKICAgICAgICBiYXNlRm9udE5hbWUgPSBgJHtzdWJzdH0ke2Jhc2VGb250TmFtZS5zdWJzdHJpbmcoYWxpYXMubGVuZ3RoKX1gOwogICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbk1hcC5nZXQoYmFzZUZvbnROYW1lKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KICBsZXQgbXVzdEFkZEJhc2VGb250ID0gZmFsc2U7CiAgaWYgKCFzdWJzdGl0dXRpb24pIHsKICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbk1hcC5nZXQoc3RhbmRhcmRGb250TmFtZSk7CiAgICBtdXN0QWRkQmFzZUZvbnQgPSB0cnVlOwogIH0KICBjb25zdCBsb2FkZWROYW1lID0gYCR7aWRGYWN0b3J5LmdldERvY0lkKCl9X3Mke2lkRmFjdG9yeS5jcmVhdGVGb250SWQoKX1gOwogIGlmICghc3Vic3RpdHV0aW9uKSB7CiAgICBpZiAoIXZhbGlkYXRlRm9udE5hbWUoYmFzZUZvbnROYW1lKSkgewogICAgICB3YXJuKGBDYW5ub3Qgc3Vic3RpdHV0ZSB0aGUgZm9udCBiZWNhdXNlIG9mIGl0cyBuYW1lOiAke2Jhc2VGb250TmFtZX1gKTsKICAgICAgc3lzdGVtRm9udENhY2hlLnNldChrZXksIG51bGwpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGJvbGQgPSAvYm9sZC9naS50ZXN0KGJhc2VGb250TmFtZSk7CiAgICBjb25zdCBpdGFsaWMgPSAvb2JsaXF1ZXxpdGFsaWMvZ2kudGVzdChiYXNlRm9udE5hbWUpOwogICAgY29uc3Qgc3R5bGUgPSBib2xkICYmIGl0YWxpYyAmJiBCT0xESVRBTElDIHx8IGJvbGQgJiYgQk9MRCB8fCBpdGFsaWMgJiYgSVRBTElDIHx8IE5PUk1BTDsKICAgIHN1YnN0aXR1dGlvbkluZm8gPSB7CiAgICAgIGNzczogYCIke2dldEZhbWlseU5hbWUoYmFzZUZvbnROYW1lKX0iLCR7bG9hZGVkTmFtZX1gLAogICAgICBndWVzc0ZhbGxiYWNrOiB0cnVlLAogICAgICBsb2FkZWROYW1lLAogICAgICBiYXNlRm9udE5hbWUsCiAgICAgIHNyYzogYGxvY2FsKCR7YmFzZUZvbnROYW1lfSlgLAogICAgICBzdHlsZQogICAgfTsKICAgIHN5c3RlbUZvbnRDYWNoZS5zZXQoa2V5LCBzdWJzdGl0dXRpb25JbmZvKTsKICAgIHJldHVybiBzdWJzdGl0dXRpb25JbmZvOwogIH0KICBjb25zdCBzcmMgPSBbXTsKICBpZiAobXVzdEFkZEJhc2VGb250ICYmIHZhbGlkYXRlRm9udE5hbWUoYmFzZUZvbnROYW1lKSkgewogICAgc3JjLnB1c2goYGxvY2FsKCR7YmFzZUZvbnROYW1lfSlgKTsKICB9CiAgY29uc3QgewogICAgc3R5bGUsCiAgICB1bHRpbWF0ZQogIH0gPSBnZW5lcmF0ZUZvbnQoc3Vic3RpdHV0aW9uLCBzcmMsIGxvY2FsRm9udFBhdGgpOwogIGNvbnN0IGd1ZXNzRmFsbGJhY2sgPSB1bHRpbWF0ZSA9PT0gbnVsbDsKICBjb25zdCBmYWxsYmFjayA9IGd1ZXNzRmFsbGJhY2sgPyAiIiA6IGAsJHt1bHRpbWF0ZX1gOwogIHN1YnN0aXR1dGlvbkluZm8gPSB7CiAgICBjc3M6IGAiJHtnZXRGYW1pbHlOYW1lKGJhc2VGb250TmFtZSl9Iiwke2xvYWRlZE5hbWV9JHtmYWxsYmFja31gLAogICAgZ3Vlc3NGYWxsYmFjaywKICAgIGxvYWRlZE5hbWUsCiAgICBiYXNlRm9udE5hbWUsCiAgICBzcmM6IHNyYy5qb2luKCIsIiksCiAgICBzdHlsZQogIH07CiAgc3lzdGVtRm9udENhY2hlLnNldChrZXksIHN1YnN0aXR1dGlvbkluZm8pOwogIHJldHVybiBzdWJzdGl0dXRpb25JbmZvOwp9Cgo7Ly8gLi9zcmMvc2hhcmVkL211cm11cmhhc2gzLmpzCmNvbnN0IFNFRUQgPSAweGMzZDJlMWYwOwpjb25zdCBNQVNLX0hJR0ggPSAweGZmZmYwMDAwOwpjb25zdCBNQVNLX0xPVyA9IDB4ZmZmZjsKY2xhc3MgTXVybXVySGFzaDNfNjQgewogIGNvbnN0cnVjdG9yKHNlZWQpIHsKICAgIHRoaXMuaDEgPSBzZWVkID8gc2VlZCAmIDB4ZmZmZmZmZmYgOiBTRUVEOwogICAgdGhpcy5oMiA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7CiAgfQogIHVwZGF0ZShpbnB1dCkgewogICAgbGV0IGRhdGEsIGxlbmd0aDsKICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICJzdHJpbmciKSB7CiAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGggKiAyKTsKICAgICAgbGVuZ3RoID0gMDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaW5wdXQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IGNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkpOwogICAgICAgIGlmIChjb2RlIDw9IDB4ZmYpIHsKICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlID4+PiA4OwogICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlICYgMHhmZjsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGlucHV0KSkgewogICAgICBkYXRhID0gaW5wdXQuc2xpY2UoKTsKICAgICAgbGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRhdGEgZm9ybWF0LCBtdXN0IGJlIGEgc3RyaW5nIG9yIFR5cGVkQXJyYXkuIik7CiAgICB9CiAgICBjb25zdCBibG9ja0NvdW50cyA9IGxlbmd0aCA+PiAyOwogICAgY29uc3QgdGFpbExlbmd0aCA9IGxlbmd0aCAtIGJsb2NrQ291bnRzICogNDsKICAgIGNvbnN0IGRhdGFVaW50MzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIsIDAsIGJsb2NrQ291bnRzKTsKICAgIGxldCBrMSA9IDAsCiAgICAgIGsyID0gMDsKICAgIGxldCBoMSA9IHRoaXMuaDEsCiAgICAgIGgyID0gdGhpcy5oMjsKICAgIGNvbnN0IEMxID0gMHhjYzllMmQ1MSwKICAgICAgQzIgPSAweDFiODczNTkzOwogICAgY29uc3QgQzFfTE9XID0gQzEgJiBNQVNLX0xPVywKICAgICAgQzJfTE9XID0gQzIgJiBNQVNLX0xPVzsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tDb3VudHM7IGkrKykgewogICAgICBpZiAoaSAmIDEpIHsKICAgICAgICBrMSA9IGRhdGFVaW50MzJbaV07CiAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVzsKICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3OwogICAgICAgIGsxID0gazEgKiBDMiAmIE1BU0tfSElHSCB8IGsxICogQzJfTE9XICYgTUFTS19MT1c7CiAgICAgICAgaDEgXj0gazE7CiAgICAgICAgaDEgPSBoMSA8PCAxMyB8IGgxID4+PiAxOTsKICAgICAgICBoMSA9IGgxICogNSArIDB4ZTY1NDZiNjQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgazIgPSBkYXRhVWludDMyW2ldOwogICAgICAgIGsyID0gazIgKiBDMSAmIE1BU0tfSElHSCB8IGsyICogQzFfTE9XICYgTUFTS19MT1c7CiAgICAgICAgazIgPSBrMiA8PCAxNSB8IGsyID4+PiAxNzsKICAgICAgICBrMiA9IGsyICogQzIgJiBNQVNLX0hJR0ggfCBrMiAqIEMyX0xPVyAmIE1BU0tfTE9XOwogICAgICAgIGgyIF49IGsyOwogICAgICAgIGgyID0gaDIgPDwgMTMgfCBoMiA+Pj4gMTk7CiAgICAgICAgaDIgPSBoMiAqIDUgKyAweGU2NTQ2YjY0OwogICAgICB9CiAgICB9CiAgICBrMSA9IDA7CiAgICBzd2l0Y2ggKHRhaWxMZW5ndGgpIHsKICAgICAgY2FzZSAzOgogICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0ICsgMl0gPDwgMTY7CiAgICAgIGNhc2UgMjoKICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNCArIDFdIDw8IDg7CiAgICAgIGNhc2UgMToKICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNF07CiAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVzsKICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3OwogICAgICAgIGsxID0gazEgKiBDMiAmIE1BU0tfSElHSCB8IGsxICogQzJfTE9XICYgTUFTS19MT1c7CiAgICAgICAgaWYgKGJsb2NrQ291bnRzICYgMSkgewogICAgICAgICAgaDEgXj0gazE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGgyIF49IGsxOwogICAgICAgIH0KICAgIH0KICAgIHRoaXMuaDEgPSBoMTsKICAgIHRoaXMuaDIgPSBoMjsKICB9CiAgaGV4ZGlnZXN0KCkgewogICAgbGV0IGgxID0gdGhpcy5oMSwKICAgICAgaDIgPSB0aGlzLmgyOwogICAgaDEgXj0gaDIgPj4+IDE7CiAgICBoMSA9IGgxICogMHhlZDU1OGNjZCAmIE1BU0tfSElHSCB8IGgxICogMHg4Y2NkICYgTUFTS19MT1c7CiAgICBoMiA9IGgyICogMHhmZjUxYWZkNyAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhhZmQ3ZWQ1NSAmIE1BU0tfSElHSCkgPj4+IDE2OwogICAgaDEgXj0gaDIgPj4+IDE7CiAgICBoMSA9IGgxICogMHgxYTg1ZWM1MyAmIE1BU0tfSElHSCB8IGgxICogMHhlYzUzICYgTUFTS19MT1c7CiAgICBoMiA9IGgyICogMHhjNGNlYjlmZSAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhiOWZlMWE4NSAmIE1BU0tfSElHSCkgPj4+IDE2OwogICAgaDEgXj0gaDIgPj4+IDE7CiAgICByZXR1cm4gKGgxID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgIjAiKSArIChoMiA+Pj4gMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsICIwIik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9vcGVyYXRvcl9saXN0LmpzCgpmdW5jdGlvbiBhZGRTdGF0ZShwYXJlbnRTdGF0ZSwgcGF0dGVybiwgY2hlY2tGbiwgaXRlcmF0ZUZuLCBwcm9jZXNzRm4pIHsKICBsZXQgc3RhdGUgPSBwYXJlbnRTdGF0ZTsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBwYXR0ZXJuLmxlbmd0aCAtIDE7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBpdGVtID0gcGF0dGVybltpXTsKICAgIHN0YXRlID0gc3RhdGVbaXRlbV0gfHw9IFtdOwogIH0KICBzdGF0ZVtwYXR0ZXJuLmF0KC0xKV0gPSB7CiAgICBjaGVja0ZuLAogICAgaXRlcmF0ZUZuLAogICAgcHJvY2Vzc0ZuCiAgfTsKfQpjb25zdCBJbml0aWFsU3RhdGUgPSBbXTsKYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbT1BTLnNhdmUsIE9QUy50cmFuc2Zvcm0sIE9QUy5wYWludElubGluZUltYWdlWE9iamVjdCwgT1BTLnJlc3RvcmVdLCBudWxsLCBmdW5jdGlvbiBpdGVyYXRlSW5saW5lSW1hZ2VHcm91cChjb250ZXh0LCBpKSB7CiAgY29uc3QgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheTsKICBjb25zdCBpRmlyc3RTYXZlID0gY29udGV4dC5pQ3VyciAtIDM7CiAgY29uc3QgcG9zID0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7CiAgc3dpdGNoIChwb3MpIHsKICAgIGNhc2UgMDoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5zYXZlOwogICAgY2FzZSAxOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnRyYW5zZm9ybTsKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5wYWludElubGluZUltYWdlWE9iamVjdDsKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5yZXN0b3JlOwogIH0KICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApOwp9LCBmdW5jdGlvbiBmb3VuZElubGluZUltYWdlR3JvdXAoY29udGV4dCwgaSkgewogIGNvbnN0IE1JTl9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DSyA9IDEwOwogIGNvbnN0IE1BWF9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DSyA9IDIwMDsKICBjb25zdCBNQVhfV0lEVEggPSAxMDAwOwogIGNvbnN0IElNQUdFX1BBRERJTkcgPSAxOwogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBjdXJyID0gY29udGV4dC5pQ3VycjsKICBjb25zdCBpRmlyc3RTYXZlID0gY3VyciAtIDM7CiAgY29uc3QgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7CiAgY29uc3QgaUZpcnN0UElJWE8gPSBjdXJyIC0gMTsKICBjb25zdCBjb3VudCA9IE1hdGgubWluKE1hdGguZmxvb3IoKGkgLSBpRmlyc3RTYXZlKSAvIDQpLCBNQVhfSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0spOwogIGlmIChjb3VudCA8IE1JTl9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DSykgewogICAgcmV0dXJuIGkgLSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKICB9CiAgbGV0IG1heFggPSAwOwogIGNvbnN0IG1hcCA9IFtdOwogIGxldCBtYXhMaW5lSGVpZ2h0ID0gMDsKICBsZXQgY3VycmVudFggPSBJTUFHRV9QQURESU5HLAogICAgY3VycmVudFkgPSBJTUFHRV9QQURESU5HOwogIGZvciAobGV0IHEgPSAwOyBxIDwgY291bnQ7IHErKykgewogICAgY29uc3QgdHJhbnNmb3JtID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybSArIChxIDw8IDIpXTsKICAgIGNvbnN0IGltZyA9IGFyZ3NBcnJheVtpRmlyc3RQSUlYTyArIChxIDw8IDIpXVswXTsKICAgIGlmIChjdXJyZW50WCArIGltZy53aWR0aCA+IE1BWF9XSURUSCkgewogICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgY3VycmVudFgpOwogICAgICBjdXJyZW50WSArPSBtYXhMaW5lSGVpZ2h0ICsgMiAqIElNQUdFX1BBRERJTkc7CiAgICAgIGN1cnJlbnRYID0gMDsKICAgICAgbWF4TGluZUhlaWdodCA9IDA7CiAgICB9CiAgICBtYXAucHVzaCh7CiAgICAgIHRyYW5zZm9ybSwKICAgICAgeDogY3VycmVudFgsCiAgICAgIHk6IGN1cnJlbnRZLAogICAgICB3OiBpbWcud2lkdGgsCiAgICAgIGg6IGltZy5oZWlnaHQKICAgIH0pOwogICAgY3VycmVudFggKz0gaW1nLndpZHRoICsgMiAqIElNQUdFX1BBRERJTkc7CiAgICBtYXhMaW5lSGVpZ2h0ID0gTWF0aC5tYXgobWF4TGluZUhlaWdodCwgaW1nLmhlaWdodCk7CiAgfQogIGNvbnN0IGltZ1dpZHRoID0gTWF0aC5tYXgobWF4WCwgY3VycmVudFgpICsgSU1BR0VfUEFERElORzsKICBjb25zdCBpbWdIZWlnaHQgPSBjdXJyZW50WSArIG1heExpbmVIZWlnaHQgKyBJTUFHRV9QQURESU5HOwogIGNvbnN0IGltZ0RhdGEgPSBuZXcgVWludDhBcnJheShpbWdXaWR0aCAqIGltZ0hlaWdodCAqIDQpOwogIGNvbnN0IGltZ1Jvd1NpemUgPSBpbWdXaWR0aCA8PCAyOwogIGZvciAobGV0IHEgPSAwOyBxIDwgY291bnQ7IHErKykgewogICAgY29uc3QgZGF0YSA9IGFyZ3NBcnJheVtpRmlyc3RQSUlYTyArIChxIDw8IDIpXVswXS5kYXRhOwogICAgY29uc3Qgcm93U2l6ZSA9IG1hcFtxXS53IDw8IDI7CiAgICBsZXQgZGF0YU9mZnNldCA9IDA7CiAgICBsZXQgb2Zmc2V0ID0gbWFwW3FdLnggKyBtYXBbcV0ueSAqIGltZ1dpZHRoIDw8IDI7CiAgICBpbWdEYXRhLnNldChkYXRhLnN1YmFycmF5KDAsIHJvd1NpemUpLCBvZmZzZXQgLSBpbWdSb3dTaXplKTsKICAgIGZvciAobGV0IGsgPSAwLCBrayA9IG1hcFtxXS5oOyBrIDwga2s7IGsrKykgewogICAgICBpbWdEYXRhLnNldChkYXRhLnN1YmFycmF5KGRhdGFPZmZzZXQsIGRhdGFPZmZzZXQgKyByb3dTaXplKSwgb2Zmc2V0KTsKICAgICAgZGF0YU9mZnNldCArPSByb3dTaXplOwogICAgICBvZmZzZXQgKz0gaW1nUm93U2l6ZTsKICAgIH0KICAgIGltZ0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoZGF0YU9mZnNldCAtIHJvd1NpemUsIGRhdGFPZmZzZXQpLCBvZmZzZXQpOwogICAgd2hpbGUgKG9mZnNldCA+PSAwKSB7CiAgICAgIGRhdGFbb2Zmc2V0IC0gNF0gPSBkYXRhW29mZnNldF07CiAgICAgIGRhdGFbb2Zmc2V0IC0gM10gPSBkYXRhW29mZnNldCArIDFdOwogICAgICBkYXRhW29mZnNldCAtIDJdID0gZGF0YVtvZmZzZXQgKyAyXTsKICAgICAgZGF0YVtvZmZzZXQgLSAxXSA9IGRhdGFbb2Zmc2V0ICsgM107CiAgICAgIGRhdGFbb2Zmc2V0ICsgcm93U2l6ZV0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSA0XTsKICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgMV0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAzXTsKICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgMl0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAyXTsKICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgM10gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAxXTsKICAgICAgb2Zmc2V0IC09IGltZ1Jvd1NpemU7CiAgICB9CiAgfQogIGNvbnN0IGltZyA9IHsKICAgIHdpZHRoOiBpbWdXaWR0aCwKICAgIGhlaWdodDogaW1nSGVpZ2h0CiAgfTsKICBpZiAoY29udGV4dC5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhpbWdXaWR0aCwgaW1nSGVpZ2h0KTsKICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgY3R4LnB1dEltYWdlRGF0YShuZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheShpbWdEYXRhLmJ1ZmZlciksIGltZ1dpZHRoLCBpbWdIZWlnaHQpLCAwLCAwKTsKICAgIGltZy5iaXRtYXAgPSBjYW52YXMudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7CiAgICBpbWcuZGF0YSA9IG51bGw7CiAgfSBlbHNlIHsKICAgIGltZy5raW5kID0gSW1hZ2VLaW5kLlJHQkFfMzJCUFA7CiAgICBpbWcuZGF0YSA9IGltZ0RhdGE7CiAgfQogIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXApOwogIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBbaW1nLCBtYXBdKTsKICByZXR1cm4gaUZpcnN0U2F2ZSArIDE7Cn0pOwphZGRTdGF0ZShJbml0aWFsU3RhdGUsIFtPUFMuc2F2ZSwgT1BTLnRyYW5zZm9ybSwgT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCwgT1BTLnJlc3RvcmVdLCBudWxsLCBmdW5jdGlvbiBpdGVyYXRlSW1hZ2VNYXNrR3JvdXAoY29udGV4dCwgaSkgewogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXk7CiAgY29uc3QgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSAzOwogIGNvbnN0IHBvcyA9IChpIC0gaUZpcnN0U2F2ZSkgJSA0OwogIHN3aXRjaCAocG9zKSB7CiAgICBjYXNlIDA6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2F2ZTsKICAgIGNhc2UgMToKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy50cmFuc2Zvcm07CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OwogICAgY2FzZSAzOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnJlc3RvcmU7CiAgfQogIHRocm93IG5ldyBFcnJvcihgaXRlcmF0ZUltYWdlTWFza0dyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApOwp9LCBmdW5jdGlvbiBmb3VuZEltYWdlTWFza0dyb3VwKGNvbnRleHQsIGkpIHsKICBjb25zdCBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLID0gMTA7CiAgY29uc3QgTUFYX0lNQUdFU19JTl9NQVNLU19CTE9DSyA9IDEwMDsKICBjb25zdCBNQVhfU0FNRV9JTUFHRVNfSU5fTUFTS1NfQkxPQ0sgPSAxMDAwOwogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBjdXJyID0gY29udGV4dC5pQ3VycjsKICBjb25zdCBpRmlyc3RTYXZlID0gY3VyciAtIDM7CiAgY29uc3QgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7CiAgY29uc3QgaUZpcnN0UElNWE8gPSBjdXJyIC0gMTsKICBsZXQgY291bnQgPSBNYXRoLmZsb29yKChpIC0gaUZpcnN0U2F2ZSkgLyA0KTsKICBpZiAoY291bnQgPCBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLKSB7CiAgICByZXR1cm4gaSAtIChpIC0gaUZpcnN0U2F2ZSkgJSA0OwogIH0KICBsZXQgaXNTYW1lSW1hZ2UgPSBmYWxzZTsKICBsZXQgaVRyYW5zZm9ybSwgdHJhbnNmb3JtQXJnczsKICBjb25zdCBmaXJzdFBJTVhPQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RQSU1YT11bMF07CiAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmcwID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMF0sCiAgICBmaXJzdFRyYW5zZm9ybUFyZzEgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsxXSwKICAgIGZpcnN0VHJhbnNmb3JtQXJnMiA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzJdLAogICAgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CiAgaWYgKGZpcnN0VHJhbnNmb3JtQXJnMSA9PT0gZmlyc3RUcmFuc2Zvcm1BcmcyKSB7CiAgICBpc1NhbWVJbWFnZSA9IHRydWU7CiAgICBpVHJhbnNmb3JtID0gaUZpcnN0VHJhbnNmb3JtICsgNDsKICAgIGxldCBpUElNWE8gPSBpRmlyc3RQSU1YTyArIDQ7CiAgICBmb3IgKGxldCBxID0gMTsgcSA8IGNvdW50OyBxKyssIGlUcmFuc2Zvcm0gKz0gNCwgaVBJTVhPICs9IDQpIHsKICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpVHJhbnNmb3JtXTsKICAgICAgaWYgKGFyZ3NBcnJheVtpUElNWE9dWzBdICE9PSBmaXJzdFBJTVhPQXJnMCB8fCB0cmFuc2Zvcm1BcmdzWzBdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzAgfHwgdHJhbnNmb3JtQXJnc1sxXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmcxIHx8IHRyYW5zZm9ybUFyZ3NbMl0gIT09IGZpcnN0VHJhbnNmb3JtQXJnMiB8fCB0cmFuc2Zvcm1BcmdzWzNdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzMpIHsKICAgICAgICBpZiAocSA8IE1JTl9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spIHsKICAgICAgICAgIGlzU2FtZUltYWdlID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvdW50ID0gcTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKGlzU2FtZUltYWdlKSB7CiAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCBNQVhfU0FNRV9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spOwogICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDIpOwogICAgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybTsKICAgIGZvciAobGV0IHEgPSAwOyBxIDwgY291bnQ7IHErKywgaVRyYW5zZm9ybSArPSA0KSB7CiAgICAgIHRyYW5zZm9ybUFyZ3MgPSBhcmdzQXJyYXlbaVRyYW5zZm9ybV07CiAgICAgIHBvc2l0aW9uc1txIDw8IDFdID0gdHJhbnNmb3JtQXJnc1s0XTsKICAgICAgcG9zaXRpb25zWyhxIDw8IDEpICsgMV0gPSB0cmFuc2Zvcm1BcmdzWzVdOwogICAgfQogICAgZm5BcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0KTsKICAgIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBbZmlyc3RQSU1YT0FyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMCwgZmlyc3RUcmFuc2Zvcm1BcmcxLCBmaXJzdFRyYW5zZm9ybUFyZzIsIGZpcnN0VHJhbnNmb3JtQXJnMywgcG9zaXRpb25zXSk7CiAgfSBlbHNlIHsKICAgIGNvdW50ID0gTWF0aC5taW4oY291bnQsIE1BWF9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spOwogICAgY29uc3QgaW1hZ2VzID0gW107CiAgICBmb3IgKGxldCBxID0gMDsgcSA8IGNvdW50OyBxKyspIHsKICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm0gKyAocSA8PCAyKV07CiAgICAgIGNvbnN0IG1hc2tQYXJhbXMgPSBhcmdzQXJyYXlbaUZpcnN0UElNWE8gKyAocSA8PCAyKV1bMF07CiAgICAgIGltYWdlcy5wdXNoKHsKICAgICAgICBkYXRhOiBtYXNrUGFyYW1zLmRhdGEsCiAgICAgICAgd2lkdGg6IG1hc2tQYXJhbXMud2lkdGgsCiAgICAgICAgaGVpZ2h0OiBtYXNrUGFyYW1zLmhlaWdodCwKICAgICAgICBpbnRlcnBvbGF0ZTogbWFza1BhcmFtcy5pbnRlcnBvbGF0ZSwKICAgICAgICBjb3VudDogbWFza1BhcmFtcy5jb3VudCwKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybUFyZ3MKICAgICAgfSk7CiAgICB9CiAgICBmbkFycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIE9QUy5wYWludEltYWdlTWFza1hPYmplY3RHcm91cCk7CiAgICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgW2ltYWdlc10pOwogIH0KICByZXR1cm4gaUZpcnN0U2F2ZSArIDE7Cn0pOwphZGRTdGF0ZShJbml0aWFsU3RhdGUsIFtPUFMuc2F2ZSwgT1BTLnRyYW5zZm9ybSwgT1BTLnBhaW50SW1hZ2VYT2JqZWN0LCBPUFMucmVzdG9yZV0sIGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgY29uc3QgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CiAgY29uc3QgaUZpcnN0VHJhbnNmb3JtID0gY29udGV4dC5pQ3VyciAtIDI7CiAgcmV0dXJuIGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzFdID09PSAwICYmIGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzJdID09PSAwOwp9LCBmdW5jdGlvbiBpdGVyYXRlSW1hZ2VHcm91cChjb250ZXh0LCBpKSB7CiAgY29uc3QgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheSwKICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OwogIGNvbnN0IGlGaXJzdFNhdmUgPSBjb250ZXh0LmlDdXJyIC0gMzsKICBjb25zdCBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKICBzd2l0Y2ggKHBvcykgewogICAgY2FzZSAwOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnNhdmU7CiAgICBjYXNlIDE6CiAgICAgIGlmIChmbkFycmF5W2ldICE9PSBPUFMudHJhbnNmb3JtKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNvbnN0IGlGaXJzdFRyYW5zZm9ybSA9IGNvbnRleHQuaUN1cnIgLSAyOwogICAgICBjb25zdCBmaXJzdFRyYW5zZm9ybUFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVswXTsKICAgICAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CiAgICAgIGlmIChhcmdzQXJyYXlbaV1bMF0gIT09IGZpcnN0VHJhbnNmb3JtQXJnMCB8fCBhcmdzQXJyYXlbaV1bMV0gIT09IDAgfHwgYXJnc0FycmF5W2ldWzJdICE9PSAwIHx8IGFyZ3NBcnJheVtpXVszXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmczKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSAyOgogICAgICBpZiAoZm5BcnJheVtpXSAhPT0gT1BTLnBhaW50SW1hZ2VYT2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNvbnN0IGlGaXJzdFBJWE8gPSBjb250ZXh0LmlDdXJyIC0gMTsKICAgICAgY29uc3QgZmlyc3RQSVhPQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RQSVhPXVswXTsKICAgICAgaWYgKGFyZ3NBcnJheVtpXVswXSAhPT0gZmlyc3RQSVhPQXJnMCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5yZXN0b3JlOwogIH0KICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApOwp9LCBmdW5jdGlvbiAoY29udGV4dCwgaSkgewogIGNvbnN0IE1JTl9JTUFHRVNfSU5fQkxPQ0sgPSAzOwogIGNvbnN0IE1BWF9JTUFHRVNfSU5fQkxPQ0sgPSAxMDAwOwogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBjdXJyID0gY29udGV4dC5pQ3VycjsKICBjb25zdCBpRmlyc3RTYXZlID0gY3VyciAtIDM7CiAgY29uc3QgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7CiAgY29uc3QgaUZpcnN0UElYTyA9IGN1cnIgLSAxOwogIGNvbnN0IGZpcnN0UElYT0FyZzAgPSBhcmdzQXJyYXlbaUZpcnN0UElYT11bMF07CiAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmcwID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMF07CiAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CiAgY29uc3QgY291bnQgPSBNYXRoLm1pbihNYXRoLmZsb29yKChpIC0gaUZpcnN0U2F2ZSkgLyA0KSwgTUFYX0lNQUdFU19JTl9CTE9DSyk7CiAgaWYgKGNvdW50IDwgTUlOX0lNQUdFU19JTl9CTE9DSykgewogICAgcmV0dXJuIGkgLSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKICB9CiAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDIpOwogIGxldCBpVHJhbnNmb3JtID0gaUZpcnN0VHJhbnNmb3JtOwogIGZvciAobGV0IHEgPSAwOyBxIDwgY291bnQ7IHErKywgaVRyYW5zZm9ybSArPSA0KSB7CiAgICBjb25zdCB0cmFuc2Zvcm1BcmdzID0gYXJnc0FycmF5W2lUcmFuc2Zvcm1dOwogICAgcG9zaXRpb25zW3EgPDwgMV0gPSB0cmFuc2Zvcm1BcmdzWzRdOwogICAgcG9zaXRpb25zWyhxIDw8IDEpICsgMV0gPSB0cmFuc2Zvcm1BcmdzWzVdOwogIH0KICBjb25zdCBhcmdzID0gW2ZpcnN0UElYT0FyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMCwgZmlyc3RUcmFuc2Zvcm1BcmczLCBwb3NpdGlvbnNdOwogIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgT1BTLnBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KTsKICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgYXJncyk7CiAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxOwp9KTsKYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbT1BTLmJlZ2luVGV4dCwgT1BTLnNldEZvbnQsIE9QUy5zZXRUZXh0TWF0cml4LCBPUFMuc2hvd1RleHQsIE9QUy5lbmRUZXh0XSwgbnVsbCwgZnVuY3Rpb24gaXRlcmF0ZVNob3dUZXh0R3JvdXAoY29udGV4dCwgaSkgewogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBpRmlyc3RTYXZlID0gY29udGV4dC5pQ3VyciAtIDQ7CiAgY29uc3QgcG9zID0gKGkgLSBpRmlyc3RTYXZlKSAlIDU7CiAgc3dpdGNoIChwb3MpIHsKICAgIGNhc2UgMDoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5iZWdpblRleHQ7CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2V0Rm9udDsKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5zZXRUZXh0TWF0cml4OwogICAgY2FzZSAzOgogICAgICBpZiAoZm5BcnJheVtpXSAhPT0gT1BTLnNob3dUZXh0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNvbnN0IGlGaXJzdFNldEZvbnQgPSBjb250ZXh0LmlDdXJyIC0gMzsKICAgICAgY29uc3QgZmlyc3RTZXRGb250QXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVswXTsKICAgICAgY29uc3QgZmlyc3RTZXRGb250QXJnMSA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVsxXTsKICAgICAgaWYgKGFyZ3NBcnJheVtpXVswXSAhPT0gZmlyc3RTZXRGb250QXJnMCB8fCBhcmdzQXJyYXlbaV1bMV0gIT09IGZpcnN0U2V0Rm9udEFyZzEpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIDQ6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuZW5kVGV4dDsKICB9CiAgdGhyb3cgbmV3IEVycm9yKGBpdGVyYXRlU2hvd1RleHRHcm91cCAtIGludmFsaWQgcG9zOiAke3Bvc31gKTsKfSwgZnVuY3Rpb24gKGNvbnRleHQsIGkpIHsKICBjb25zdCBNSU5fQ0hBUlNfSU5fQkxPQ0sgPSAzOwogIGNvbnN0IE1BWF9DSEFSU19JTl9CTE9DSyA9IDEwMDA7CiAgY29uc3QgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheSwKICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OwogIGNvbnN0IGN1cnIgPSBjb250ZXh0LmlDdXJyOwogIGNvbnN0IGlGaXJzdEJlZ2luVGV4dCA9IGN1cnIgLSA0OwogIGNvbnN0IGlGaXJzdFNldEZvbnQgPSBjdXJyIC0gMzsKICBjb25zdCBpRmlyc3RTZXRUZXh0TWF0cml4ID0gY3VyciAtIDI7CiAgY29uc3QgaUZpcnN0U2hvd1RleHQgPSBjdXJyIC0gMTsKICBjb25zdCBpRmlyc3RFbmRUZXh0ID0gY3VycjsKICBjb25zdCBmaXJzdFNldEZvbnRBcmcwID0gYXJnc0FycmF5W2lGaXJzdFNldEZvbnRdWzBdOwogIGNvbnN0IGZpcnN0U2V0Rm9udEFyZzEgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMV07CiAgbGV0IGNvdW50ID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSAtIGlGaXJzdEJlZ2luVGV4dCkgLyA1KSwgTUFYX0NIQVJTX0lOX0JMT0NLKTsKICBpZiAoY291bnQgPCBNSU5fQ0hBUlNfSU5fQkxPQ0spIHsKICAgIHJldHVybiBpIC0gKGkgLSBpRmlyc3RCZWdpblRleHQpICUgNTsKICB9CiAgbGV0IGlGaXJzdCA9IGlGaXJzdEJlZ2luVGV4dDsKICBpZiAoaUZpcnN0QmVnaW5UZXh0ID49IDQgJiYgZm5BcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XSA9PT0gZm5BcnJheVtpRmlyc3RTZXRGb250XSAmJiBmbkFycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDNdID09PSBmbkFycmF5W2lGaXJzdFNldFRleHRNYXRyaXhdICYmIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMl0gPT09IGZuQXJyYXlbaUZpcnN0U2hvd1RleHRdICYmIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMV0gPT09IGZuQXJyYXlbaUZpcnN0RW5kVGV4dF0gJiYgYXJnc0FycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDRdWzBdID09PSBmaXJzdFNldEZvbnRBcmcwICYmIGFyZ3NBcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XVsxXSA9PT0gZmlyc3RTZXRGb250QXJnMSkgewogICAgY291bnQrKzsKICAgIGlGaXJzdCAtPSA1OwogIH0KICBsZXQgaUVuZFRleHQgPSBpRmlyc3QgKyA0OwogIGZvciAobGV0IHEgPSAxOyBxIDwgY291bnQ7IHErKykgewogICAgZm5BcnJheS5zcGxpY2UoaUVuZFRleHQsIDMpOwogICAgYXJnc0FycmF5LnNwbGljZShpRW5kVGV4dCwgMyk7CiAgICBpRW5kVGV4dCArPSAyOwogIH0KICByZXR1cm4gaUVuZFRleHQgKyAxOwp9KTsKY2xhc3MgTnVsbE9wdGltaXplciB7CiAgY29uc3RydWN0b3IocXVldWUpIHsKICAgIHRoaXMucXVldWUgPSBxdWV1ZTsKICB9CiAgX29wdGltaXplKCkge30KICBwdXNoKGZuLCBhcmdzKSB7CiAgICB0aGlzLnF1ZXVlLmZuQXJyYXkucHVzaChmbik7CiAgICB0aGlzLnF1ZXVlLmFyZ3NBcnJheS5wdXNoKGFyZ3MpOwogICAgdGhpcy5fb3B0aW1pemUoKTsKICB9CiAgZmx1c2goKSB7fQogIHJlc2V0KCkge30KfQpjbGFzcyBRdWV1ZU9wdGltaXplciBleHRlbmRzIE51bGxPcHRpbWl6ZXIgewogIGNvbnN0cnVjdG9yKHF1ZXVlKSB7CiAgICBzdXBlcihxdWV1ZSk7CiAgICB0aGlzLnN0YXRlID0gbnVsbDsKICAgIHRoaXMuY29udGV4dCA9IHsKICAgICAgaUN1cnI6IDAsCiAgICAgIGZuQXJyYXk6IHF1ZXVlLmZuQXJyYXksCiAgICAgIGFyZ3NBcnJheTogcXVldWUuYXJnc0FycmF5LAogICAgICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDogZmFsc2UKICAgIH07CiAgICB0aGlzLm1hdGNoID0gbnVsbDsKICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IDA7CiAgfQogIHNldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCh2YWx1ZSkgewogICAgdGhpcy5jb250ZXh0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gdmFsdWU7CiAgfQogIF9vcHRpbWl6ZSgpIHsKICAgIGNvbnN0IGZuQXJyYXkgPSB0aGlzLnF1ZXVlLmZuQXJyYXk7CiAgICBsZXQgaSA9IHRoaXMubGFzdFByb2Nlc3NlZCwKICAgICAgaWkgPSBmbkFycmF5Lmxlbmd0aDsKICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7CiAgICBsZXQgbWF0Y2ggPSB0aGlzLm1hdGNoOwogICAgaWYgKCFzdGF0ZSAmJiAhbWF0Y2ggJiYgaSArIDEgPT09IGlpICYmICFJbml0aWFsU3RhdGVbZm5BcnJheVtpXV0pIHsKICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gaWk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CiAgICB3aGlsZSAoaSA8IGlpKSB7CiAgICAgIGlmIChtYXRjaCkgewogICAgICAgIGNvbnN0IGl0ZXJhdGUgPSAoMCwgbWF0Y2guaXRlcmF0ZUZuKShjb250ZXh0LCBpKTsKICAgICAgICBpZiAoaXRlcmF0ZSkgewogICAgICAgICAgaSsrOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGkgPSAoMCwgbWF0Y2gucHJvY2Vzc0ZuKShjb250ZXh0LCBpICsgMSk7CiAgICAgICAgaWkgPSBmbkFycmF5Lmxlbmd0aDsKICAgICAgICBtYXRjaCA9IG51bGw7CiAgICAgICAgc3RhdGUgPSBudWxsOwogICAgICAgIGlmIChpID49IGlpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGUgPSAoc3RhdGUgfHwgSW5pdGlhbFN0YXRlKVtmbkFycmF5W2ldXTsKICAgICAgaWYgKCFzdGF0ZSB8fCBBcnJheS5pc0FycmF5KHN0YXRlKSkgewogICAgICAgIGkrKzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb250ZXh0LmlDdXJyID0gaTsKICAgICAgaSsrOwogICAgICBpZiAoc3RhdGUuY2hlY2tGbiAmJiAhKDAsIHN0YXRlLmNoZWNrRm4pKGNvbnRleHQpKSB7CiAgICAgICAgc3RhdGUgPSBudWxsOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIG1hdGNoID0gc3RhdGU7CiAgICAgIHN0YXRlID0gbnVsbDsKICAgIH0KICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKICAgIHRoaXMubWF0Y2ggPSBtYXRjaDsKICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IGk7CiAgfQogIGZsdXNoKCkgewogICAgd2hpbGUgKHRoaXMubWF0Y2gpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5xdWV1ZS5mbkFycmF5Lmxlbmd0aDsKICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gKDAsIHRoaXMubWF0Y2gucHJvY2Vzc0ZuKSh0aGlzLmNvbnRleHQsIGxlbmd0aCk7CiAgICAgIHRoaXMubWF0Y2ggPSBudWxsOwogICAgICB0aGlzLnN0YXRlID0gbnVsbDsKICAgICAgdGhpcy5fb3B0aW1pemUoKTsKICAgIH0KICB9CiAgcmVzZXQoKSB7CiAgICB0aGlzLnN0YXRlID0gbnVsbDsKICAgIHRoaXMubWF0Y2ggPSBudWxsOwogICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gMDsKICB9Cn0KY2xhc3MgT3BlcmF0b3JMaXN0IHsKICBzdGF0aWMgQ0hVTktfU0laRSA9IDEwMDA7CiAgc3RhdGljIENIVU5LX1NJWkVfQUJPVVQgPSB0aGlzLkNIVU5LX1NJWkUgLSA1OwogIGNvbnN0cnVjdG9yKGludGVudCA9IDAsIHN0cmVhbVNpbmspIHsKICAgIHRoaXMuX3N0cmVhbVNpbmsgPSBzdHJlYW1TaW5rOwogICAgdGhpcy5mbkFycmF5ID0gW107CiAgICB0aGlzLmFyZ3NBcnJheSA9IFtdOwogICAgdGhpcy5vcHRpbWl6ZXIgPSBzdHJlYW1TaW5rICYmICEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5PUExJU1QpID8gbmV3IFF1ZXVlT3B0aW1pemVyKHRoaXMpIDogbmV3IE51bGxPcHRpbWl6ZXIodGhpcyk7CiAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG5ldyBTZXQoKTsKICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDsKICAgIHRoaXMud2VpZ2h0ID0gMDsKICAgIHRoaXMuX3Jlc29sdmVkID0gc3RyZWFtU2luayA/IG51bGwgOiBQcm9taXNlLnJlc29sdmUoKTsKICB9CiAgc2V0IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKHZhbHVlKSB7CiAgICB0aGlzLm9wdGltaXplci5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA9IHZhbHVlOwogIH0KICBnZXQgbGVuZ3RoKCkgewogICAgcmV0dXJuIHRoaXMuYXJnc0FycmF5Lmxlbmd0aDsKICB9CiAgZ2V0IHJlYWR5KCkgewogICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVkIHx8IHRoaXMuX3N0cmVhbVNpbmsucmVhZHk7CiAgfQogIGdldCB0b3RhbExlbmd0aCgpIHsKICAgIHJldHVybiB0aGlzLl90b3RhbExlbmd0aCArIHRoaXMubGVuZ3RoOwogIH0KICBhZGRPcChmbiwgYXJncykgewogICAgdGhpcy5vcHRpbWl6ZXIucHVzaChmbiwgYXJncyk7CiAgICB0aGlzLndlaWdodCsrOwogICAgaWYgKHRoaXMuX3N0cmVhbVNpbmspIHsKICAgICAgaWYgKHRoaXMud2VpZ2h0ID49IE9wZXJhdG9yTGlzdC5DSFVOS19TSVpFKSB7CiAgICAgICAgdGhpcy5mbHVzaCgpOwogICAgICB9IGVsc2UgaWYgKHRoaXMud2VpZ2h0ID49IE9wZXJhdG9yTGlzdC5DSFVOS19TSVpFX0FCT1VUICYmIChmbiA9PT0gT1BTLnJlc3RvcmUgfHwgZm4gPT09IE9QUy5lbmRUZXh0KSkgewogICAgICAgIHRoaXMuZmx1c2goKTsKICAgICAgfQogICAgfQogIH0KICBhZGRJbWFnZU9wcyhmbiwgYXJncywgb3B0aW9uYWxDb250ZW50LCBoYXNNYXNrID0gZmFsc2UpIHsKICAgIGlmIChoYXNNYXNrKSB7CiAgICAgIHRoaXMuYWRkT3AoT1BTLnNhdmUpOwogICAgICB0aGlzLmFkZE9wKE9QUy5zZXRHU3RhdGUsIFtbWyJTTWFzayIsIGZhbHNlXV1dKTsKICAgIH0KICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICB0aGlzLmFkZE9wKE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG9wdGlvbmFsQ29udGVudF0pOwogICAgfQogICAgdGhpcy5hZGRPcChmbiwgYXJncyk7CiAgICBpZiAob3B0aW9uYWxDb250ZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgdGhpcy5hZGRPcChPUFMuZW5kTWFya2VkQ29udGVudCwgW10pOwogICAgfQogICAgaWYgKGhhc01hc2spIHsKICAgICAgdGhpcy5hZGRPcChPUFMucmVzdG9yZSk7CiAgICB9CiAgfQogIGFkZERlcGVuZGVuY3koZGVwZW5kZW5jeSkgewogICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmRlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7CiAgICB0aGlzLmFkZE9wKE9QUy5kZXBlbmRlbmN5LCBbZGVwZW5kZW5jeV0pOwogIH0KICBhZGREZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKSB7CiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgZGVwZW5kZW5jaWVzKSB7CiAgICAgIHRoaXMuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKICAgIH0KICB9CiAgYWRkT3BMaXN0KG9wTGlzdCkgewogICAgaWYgKCEob3BMaXN0IGluc3RhbmNlb2YgT3BlcmF0b3JMaXN0KSkgewogICAgICB3YXJuKCdhZGRPcExpc3QgLSBpZ25vcmluZyBpbnZhbGlkICJvcExpc3QiIHBhcmFtZXRlci4nKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG9wTGlzdC5kZXBlbmRlbmNpZXMpIHsKICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gb3BMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgdGhpcy5hZGRPcChvcExpc3QuZm5BcnJheVtpXSwgb3BMaXN0LmFyZ3NBcnJheVtpXSk7CiAgICB9CiAgfQogIGdldElSKCkgewogICAgcmV0dXJuIHsKICAgICAgZm5BcnJheTogdGhpcy5mbkFycmF5LAogICAgICBhcmdzQXJyYXk6IHRoaXMuYXJnc0FycmF5LAogICAgICBsZW5ndGg6IHRoaXMubGVuZ3RoCiAgICB9OwogIH0KICBnZXQgX3RyYW5zZmVycygpIHsKICAgIGNvbnN0IHRyYW5zZmVycyA9IFtdOwogICAgY29uc3QgewogICAgICBmbkFycmF5LAogICAgICBhcmdzQXJyYXksCiAgICAgIGxlbmd0aAogICAgfSA9IHRoaXM7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHN3aXRjaCAoZm5BcnJheVtpXSkgewogICAgICAgIGNhc2UgT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OgogICAgICAgIGNhc2UgT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6CiAgICAgICAgY2FzZSBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OgogICAgICAgICAgY29uc3QgYXJnID0gYXJnc0FycmF5W2ldWzBdOwogICAgICAgICAgaWYgKCFhcmcuY2FjaGVkICYmIGFyZy5kYXRhPy5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgewogICAgICAgICAgICB0cmFuc2ZlcnMucHVzaChhcmcuZGF0YS5idWZmZXIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPUFMuY29uc3RydWN0UGF0aDoKICAgICAgICAgIGNvbnN0IFssIFtkYXRhXSwgbWluTWF4XSA9IGFyZ3NBcnJheVtpXTsKICAgICAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgICAgIHRyYW5zZmVycy5wdXNoKGRhdGEuYnVmZmVyLCBtaW5NYXguYnVmZmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJhbnNmZXJzOwogIH0KICBmbHVzaChsYXN0Q2h1bmsgPSBmYWxzZSwgc2VwYXJhdGVBbm5vdHMgPSBudWxsKSB7CiAgICB0aGlzLm9wdGltaXplci5mbHVzaCgpOwogICAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICB0aGlzLl90b3RhbExlbmd0aCArPSBsZW5ndGg7CiAgICB0aGlzLl9zdHJlYW1TaW5rLmVucXVldWUoewogICAgICBmbkFycmF5OiB0aGlzLmZuQXJyYXksCiAgICAgIGFyZ3NBcnJheTogdGhpcy5hcmdzQXJyYXksCiAgICAgIGxhc3RDaHVuaywKICAgICAgc2VwYXJhdGVBbm5vdHMsCiAgICAgIGxlbmd0aAogICAgfSwgMSwgdGhpcy5fdHJhbnNmZXJzKTsKICAgIHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7CiAgICB0aGlzLmZuQXJyYXkubGVuZ3RoID0gMDsKICAgIHRoaXMuYXJnc0FycmF5Lmxlbmd0aCA9IDA7CiAgICB0aGlzLndlaWdodCA9IDA7CiAgICB0aGlzLm9wdGltaXplci5yZXNldCgpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvaW1hZ2UuanMKCgoKCgoKCgoKCmZ1bmN0aW9uIHJlc2l6ZUltYWdlTWFzayhzcmMsIGJwYywgdzEsIGgxLCB3MiwgaDIpIHsKICBjb25zdCBsZW5ndGggPSB3MiAqIGgyOwogIGxldCBkZXN0OwogIGlmIChicGMgPD0gOCkgewogICAgZGVzdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CiAgfSBlbHNlIGlmIChicGMgPD0gMTYpIHsKICAgIGRlc3QgPSBuZXcgVWludDE2QXJyYXkobGVuZ3RoKTsKICB9IGVsc2UgewogICAgZGVzdCA9IG5ldyBVaW50MzJBcnJheShsZW5ndGgpOwogIH0KICBjb25zdCB4UmF0aW8gPSB3MSAvIHcyOwogIGNvbnN0IHlSYXRpbyA9IGgxIC8gaDI7CiAgbGV0IGksCiAgICBqLAogICAgcHksCiAgICBuZXdJbmRleCA9IDAsCiAgICBvbGRJbmRleDsKICBjb25zdCB4U2NhbGVkID0gbmV3IFVpbnQxNkFycmF5KHcyKTsKICBjb25zdCB3MVNjYW5saW5lID0gdzE7CiAgZm9yIChpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgIHhTY2FsZWRbaV0gPSBNYXRoLmZsb29yKGkgKiB4UmF0aW8pOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgaDI7IGkrKykgewogICAgcHkgPSBNYXRoLmZsb29yKGkgKiB5UmF0aW8pICogdzFTY2FubGluZTsKICAgIGZvciAoaiA9IDA7IGogPCB3MjsgaisrKSB7CiAgICAgIG9sZEluZGV4ID0gcHkgKyB4U2NhbGVkW2pdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4XTsKICAgIH0KICB9CiAgcmV0dXJuIGRlc3Q7Cn0KY2xhc3MgUERGSW1hZ2UgewogIGNvbnN0cnVjdG9yKHsKICAgIHhyZWYsCiAgICByZXMsCiAgICBpbWFnZSwKICAgIGlzSW5saW5lID0gZmFsc2UsCiAgICBzbWFzayA9IG51bGwsCiAgICBtYXNrID0gbnVsbCwKICAgIGlzTWFzayA9IGZhbHNlLAogICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICB9KSB7CiAgICB0aGlzLmltYWdlID0gaW1hZ2U7CiAgICBjb25zdCBkaWN0ID0gaW1hZ2UuZGljdDsKICAgIGNvbnN0IGZpbHRlciA9IGRpY3QuZ2V0KCJGIiwgIkZpbHRlciIpOwogICAgbGV0IGZpbHRlck5hbWU7CiAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyLm5hbWU7CiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkgewogICAgICBjb25zdCBmaWx0ZXJaZXJvID0geHJlZi5mZXRjaElmUmVmKGZpbHRlclswXSk7CiAgICAgIGlmIChmaWx0ZXJaZXJvIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgIGZpbHRlck5hbWUgPSBmaWx0ZXJaZXJvLm5hbWU7CiAgICAgIH0KICAgIH0KICAgIHN3aXRjaCAoZmlsdGVyTmFtZSkgewogICAgICBjYXNlICJKUFhEZWNvZGUiOgogICAgICAgICh7CiAgICAgICAgICB3aWR0aDogaW1hZ2Uud2lkdGgsCiAgICAgICAgICBoZWlnaHQ6IGltYWdlLmhlaWdodCwKICAgICAgICAgIGNvbXBvbmVudHNDb3VudDogaW1hZ2UubnVtQ29tcHMsCiAgICAgICAgICBiaXRzUGVyQ29tcG9uZW50OiBpbWFnZS5iaXRzUGVyQ29tcG9uZW50CiAgICAgICAgfSA9IEpweEltYWdlLnBhcnNlSW1hZ2VQcm9wZXJ0aWVzKGltYWdlLnN0cmVhbSkpOwogICAgICAgIGltYWdlLnN0cmVhbS5yZXNldCgpOwogICAgICAgIHRoaXMuanB4RGVjb2Rlck9wdGlvbnMgPSB7CiAgICAgICAgICBudW1Db21wb25lbnRzOiAwLAogICAgICAgICAgaXNJbmRleGVkQ29sb3JtYXA6IGZhbHNlLAogICAgICAgICAgc21hc2tJbkRhdGE6IGRpY3QuaGFzKCJTTWFza0luRGF0YSIpCiAgICAgICAgfTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiSkJJRzJEZWNvZGUiOgogICAgICAgIGltYWdlLmJpdHNQZXJDb21wb25lbnQgPSAxOwogICAgICAgIGltYWdlLm51bUNvbXBzID0gMTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGxldCB3aWR0aCA9IGRpY3QuZ2V0KCJXIiwgIldpZHRoIik7CiAgICBsZXQgaGVpZ2h0ID0gZGljdC5nZXQoIkgiLCAiSGVpZ2h0Iik7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbWFnZS53aWR0aCkgJiYgaW1hZ2Uud2lkdGggPiAwICYmIE51bWJlci5pc0ludGVnZXIoaW1hZ2UuaGVpZ2h0KSAmJiBpbWFnZS5oZWlnaHQgPiAwICYmIChpbWFnZS53aWR0aCAhPT0gd2lkdGggfHwgaW1hZ2UuaGVpZ2h0ICE9PSBoZWlnaHQpKSB7CiAgICAgIHdhcm4oIlBERkltYWdlIC0gdXNpbmcgdGhlIFdpZHRoL0hlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YSwgIiArICJyYXRoZXIgdGhhbiB0aGUgaW1hZ2UgZGljdGlvbmFyeS4iKTsKICAgICAgd2lkdGggPSBpbWFnZS53aWR0aDsKICAgICAgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0OwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgdmFsaWRXaWR0aCA9IHR5cGVvZiB3aWR0aCA9PT0gIm51bWJlciIgJiYgd2lkdGggPiAwLAogICAgICAgIHZhbGlkSGVpZ2h0ID0gdHlwZW9mIGhlaWdodCA9PT0gIm51bWJlciIgJiYgaGVpZ2h0ID4gMDsKICAgICAgaWYgKCF2YWxpZFdpZHRoIHx8ICF2YWxpZEhlaWdodCkgewogICAgICAgIGlmICghaW1hZ2UuZmFsbGJhY2tEaW1zKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgaW1hZ2Ugd2lkdGg6ICR7d2lkdGh9IG9yIGhlaWdodDogJHtoZWlnaHR9YCk7CiAgICAgICAgfQogICAgICAgIHdhcm4oIlBERkltYWdlIC0gdXNpbmcgdGhlIFdpZHRoL0hlaWdodCBvZiB0aGUgcGFyZW50IGltYWdlLCBmb3IgU01hc2svTWFzayBkYXRhLiIpOwogICAgICAgIGlmICghdmFsaWRXaWR0aCkgewogICAgICAgICAgd2lkdGggPSBpbWFnZS5mYWxsYmFja0RpbXMud2lkdGg7CiAgICAgICAgfQogICAgICAgIGlmICghdmFsaWRIZWlnaHQpIHsKICAgICAgICAgIGhlaWdodCA9IGltYWdlLmZhbGxiYWNrRGltcy5oZWlnaHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzLndpZHRoID0gd2lkdGg7CiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKICAgIHRoaXMuaW50ZXJwb2xhdGUgPSBkaWN0LmdldCgiSSIsICJJbnRlcnBvbGF0ZSIpOwogICAgdGhpcy5pbWFnZU1hc2sgPSBkaWN0LmdldCgiSU0iLCAiSW1hZ2VNYXNrIikgfHwgZmFsc2U7CiAgICB0aGlzLm1hdHRlID0gZGljdC5nZXQoIk1hdHRlIikgfHwgZmFsc2U7CiAgICBsZXQgYml0c1BlckNvbXBvbmVudCA9IGltYWdlLmJpdHNQZXJDb21wb25lbnQ7CiAgICBpZiAoIWJpdHNQZXJDb21wb25lbnQpIHsKICAgICAgYml0c1BlckNvbXBvbmVudCA9IGRpY3QuZ2V0KCJCUEMiLCAiQml0c1BlckNvbXBvbmVudCIpOwogICAgICBpZiAoIWJpdHNQZXJDb21wb25lbnQpIHsKICAgICAgICBpZiAodGhpcy5pbWFnZU1hc2spIHsKICAgICAgICAgIGJpdHNQZXJDb21wb25lbnQgPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEJpdHMgcGVyIGNvbXBvbmVudCBtaXNzaW5nIGluIGltYWdlOiAke3RoaXMuaW1hZ2VNYXNrfWApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpcy5icGMgPSBiaXRzUGVyQ29tcG9uZW50OwogICAgaWYgKCF0aGlzLmltYWdlTWFzaykgewogICAgICBsZXQgY29sb3JTcGFjZSA9IGRpY3QuZ2V0UmF3KCJDUyIpIHx8IGRpY3QuZ2V0UmF3KCJDb2xvclNwYWNlIik7CiAgICAgIGNvbnN0IGhhc0NvbG9yU3BhY2UgPSAhIWNvbG9yU3BhY2U7CiAgICAgIGlmICghaGFzQ29sb3JTcGFjZSkgewogICAgICAgIGlmICh0aGlzLmpweERlY29kZXJPcHRpb25zKSB7CiAgICAgICAgICBjb2xvclNwYWNlID0gTmFtZS5nZXQoIkRldmljZVJHQkEiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3dpdGNoIChpbWFnZS5udW1Db21wcykgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgY29sb3JTcGFjZSA9IE5hbWUuZ2V0KCJEZXZpY2VHcmF5Iik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBjb2xvclNwYWNlID0gTmFtZS5nZXQoIkRldmljZVJHQiIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgY29sb3JTcGFjZSA9IE5hbWUuZ2V0KCJEZXZpY2VDTVlLIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbWFnZXMgd2l0aCAke2ltYWdlLm51bUNvbXBzfSBjb2xvciBjb21wb25lbnRzIG5vdCBzdXBwb3J0ZWQuYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMuanB4RGVjb2Rlck9wdGlvbnM/LnNtYXNrSW5EYXRhKSB7CiAgICAgICAgY29sb3JTcGFjZSA9IE5hbWUuZ2V0KCJEZXZpY2VSR0JBIik7CiAgICAgIH0KICAgICAgdGhpcy5jb2xvclNwYWNlID0gQ29sb3JTcGFjZVV0aWxzLnBhcnNlKHsKICAgICAgICBjczogY29sb3JTcGFjZSwKICAgICAgICB4cmVmLAogICAgICAgIHJlc291cmNlczogaXNJbmxpbmUgPyByZXMgOiBudWxsLAogICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgICAgfSk7CiAgICAgIHRoaXMubnVtQ29tcHMgPSB0aGlzLmNvbG9yU3BhY2UubnVtQ29tcHM7CiAgICAgIGlmICh0aGlzLmpweERlY29kZXJPcHRpb25zKSB7CiAgICAgICAgdGhpcy5qcHhEZWNvZGVyT3B0aW9ucy5udW1Db21wb25lbnRzID0gaGFzQ29sb3JTcGFjZSA/IHRoaXMubnVtQ29tcHMgOiAwOwogICAgICAgIHRoaXMuanB4RGVjb2Rlck9wdGlvbnMuaXNJbmRleGVkQ29sb3JtYXAgPSB0aGlzLmNvbG9yU3BhY2UubmFtZSA9PT0gIkluZGV4ZWQiOwogICAgICB9CiAgICB9CiAgICB0aGlzLmRlY29kZSA9IGRpY3QuZ2V0QXJyYXkoIkQiLCAiRGVjb2RlIik7CiAgICB0aGlzLm5lZWRzRGVjb2RlID0gZmFsc2U7CiAgICBpZiAodGhpcy5kZWNvZGUgJiYgKHRoaXMuY29sb3JTcGFjZSAmJiAhdGhpcy5jb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZSh0aGlzLmRlY29kZSwgYml0c1BlckNvbXBvbmVudCkgfHwgaXNNYXNrICYmICFDb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZSh0aGlzLmRlY29kZSwgMSkpKSB7CiAgICAgIHRoaXMubmVlZHNEZWNvZGUgPSB0cnVlOwogICAgICBjb25zdCBtYXggPSAoMSA8PCBiaXRzUGVyQ29tcG9uZW50KSAtIDE7CiAgICAgIHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzID0gW107CiAgICAgIHRoaXMuZGVjb2RlQWRkZW5kcyA9IFtdOwogICAgICBjb25zdCBpc0luZGV4ZWQgPSB0aGlzLmNvbG9yU3BhY2U/Lm5hbWUgPT09ICJJbmRleGVkIjsKICAgICAgZm9yIChsZXQgaSA9IDAsIGogPSAwOyBpIDwgdGhpcy5kZWNvZGUubGVuZ3RoOyBpICs9IDIsICsraikgewogICAgICAgIGNvbnN0IGRtaW4gPSB0aGlzLmRlY29kZVtpXTsKICAgICAgICBjb25zdCBkbWF4ID0gdGhpcy5kZWNvZGVbaSArIDFdOwogICAgICAgIHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzW2pdID0gaXNJbmRleGVkID8gKGRtYXggLSBkbWluKSAvIG1heCA6IGRtYXggLSBkbWluOwogICAgICAgIHRoaXMuZGVjb2RlQWRkZW5kc1tqXSA9IGlzSW5kZXhlZCA/IGRtaW4gOiBtYXggKiBkbWluOwogICAgICB9CiAgICB9CiAgICBpZiAoc21hc2spIHsKICAgICAgc21hc2suZmFsbGJhY2tEaW1zID8/PSB7CiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0CiAgICAgIH07CiAgICAgIHRoaXMuc21hc2sgPSBuZXcgUERGSW1hZ2UoewogICAgICAgIHhyZWYsCiAgICAgICAgcmVzLAogICAgICAgIGltYWdlOiBzbWFzaywKICAgICAgICBpc0lubGluZSwKICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChtYXNrKSB7CiAgICAgIGlmIChtYXNrIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgIGNvbnN0IG1hc2tEaWN0ID0gbWFzay5kaWN0LAogICAgICAgICAgaW1hZ2VNYXNrID0gbWFza0RpY3QuZ2V0KCJJTSIsICJJbWFnZU1hc2siKTsKICAgICAgICBpZiAoIWltYWdlTWFzaykgewogICAgICAgICAgd2FybigiSWdub3JpbmcgL01hc2sgaW4gaW1hZ2Ugd2l0aG91dCAvSW1hZ2VNYXNrLiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtYXNrLmZhbGxiYWNrRGltcyA/Pz0gewogICAgICAgICAgICB3aWR0aCwKICAgICAgICAgICAgaGVpZ2h0CiAgICAgICAgICB9OwogICAgICAgICAgdGhpcy5tYXNrID0gbmV3IFBERkltYWdlKHsKICAgICAgICAgICAgeHJlZiwKICAgICAgICAgICAgcmVzLAogICAgICAgICAgICBpbWFnZTogbWFzaywKICAgICAgICAgICAgaXNJbmxpbmUsCiAgICAgICAgICAgIGlzTWFzazogdHJ1ZSwKICAgICAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5tYXNrID0gbWFzazsKICAgICAgfQogICAgfQogIH0KICBzdGF0aWMgYXN5bmMgYnVpbGRJbWFnZSh7CiAgICB4cmVmLAogICAgcmVzLAogICAgaW1hZ2UsCiAgICBpc0lubGluZSA9IGZhbHNlLAogICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICB9KSB7CiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZTsKICAgIGxldCBzbWFza0RhdGEgPSBudWxsOwogICAgbGV0IG1hc2tEYXRhID0gbnVsbDsKICAgIGNvbnN0IHNtYXNrID0gaW1hZ2UuZGljdC5nZXQoIlNNYXNrIik7CiAgICBjb25zdCBtYXNrID0gaW1hZ2UuZGljdC5nZXQoIk1hc2siKTsKICAgIGlmIChzbWFzaykgewogICAgICBpZiAoc21hc2sgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgc21hc2tEYXRhID0gc21hc2s7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigiVW5zdXBwb3J0ZWQgL1NNYXNrIGZvcm1hdC4iKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChtYXNrKSB7CiAgICAgIGlmIChtYXNrIGluc3RhbmNlb2YgQmFzZVN0cmVhbSB8fCBBcnJheS5pc0FycmF5KG1hc2spKSB7CiAgICAgICAgbWFza0RhdGEgPSBtYXNrOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIlVuc3VwcG9ydGVkIC9NYXNrIGZvcm1hdC4iKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBQREZJbWFnZSh7CiAgICAgIHhyZWYsCiAgICAgIHJlcywKICAgICAgaW1hZ2U6IGltYWdlRGF0YSwKICAgICAgaXNJbmxpbmUsCiAgICAgIHNtYXNrOiBzbWFza0RhdGEsCiAgICAgIG1hc2s6IG1hc2tEYXRhLAogICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgIH0pOwogIH0KICBzdGF0aWMgY3JlYXRlUmF3TWFzayh7CiAgICBpbWdBcnJheSwKICAgIHdpZHRoLAogICAgaGVpZ2h0LAogICAgaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW0sCiAgICBpbnZlcnNlRGVjb2RlLAogICAgaW50ZXJwb2xhdGUKICB9KSB7CiAgICBjb25zdCBjb21wdXRlZExlbmd0aCA9ICh3aWR0aCArIDcgPj4gMykgKiBoZWlnaHQ7CiAgICBjb25zdCBhY3R1YWxMZW5ndGggPSBpbWdBcnJheS5ieXRlTGVuZ3RoOwogICAgY29uc3QgaGF2ZUZ1bGxEYXRhID0gY29tcHV0ZWRMZW5ndGggPT09IGFjdHVhbExlbmd0aDsKICAgIGxldCBkYXRhLCBpOwogICAgaWYgKGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtICYmICghaW52ZXJzZURlY29kZSB8fCBoYXZlRnVsbERhdGEpKSB7CiAgICAgIGRhdGEgPSBpbWdBcnJheTsKICAgIH0gZWxzZSBpZiAoIWludmVyc2VEZWNvZGUpIHsKICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGltZ0FycmF5KTsKICAgIH0gZWxzZSB7CiAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShjb21wdXRlZExlbmd0aCk7CiAgICAgIGRhdGEuc2V0KGltZ0FycmF5KTsKICAgICAgZGF0YS5maWxsKDB4ZmYsIGFjdHVhbExlbmd0aCk7CiAgICB9CiAgICBpZiAoaW52ZXJzZURlY29kZSkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgYWN0dWFsTGVuZ3RoOyBpKyspIHsKICAgICAgICBkYXRhW2ldIF49IDB4ZmY7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGRhdGEsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGludGVycG9sYXRlCiAgICB9OwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlTWFzayh7CiAgICBpbWdBcnJheSwKICAgIHdpZHRoLAogICAgaGVpZ2h0LAogICAgaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW0sCiAgICBpbnZlcnNlRGVjb2RlLAogICAgaW50ZXJwb2xhdGUsCiAgICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA9IGZhbHNlCiAgfSkgewogICAgY29uc3QgaXNTaW5nbGVPcGFxdWVQaXhlbCA9IHdpZHRoID09PSAxICYmIGhlaWdodCA9PT0gMSAmJiBpbnZlcnNlRGVjb2RlID09PSAoaW1nQXJyYXkubGVuZ3RoID09PSAwIHx8ICEhKGltZ0FycmF5WzBdICYgMTI4KSk7CiAgICBpZiAoaXNTaW5nbGVPcGFxdWVQaXhlbCkgewogICAgICByZXR1cm4gewogICAgICAgIGlzU2luZ2xlT3BhcXVlUGl4ZWwKICAgICAgfTsKICAgIH0KICAgIGlmIChpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgICBpZiAoSW1hZ2VSZXNpemVyLm5lZWRzVG9CZVJlc2l6ZWQod2lkdGgsIGhlaWdodCkpIHsKICAgICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7CiAgICAgICAgY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEoewogICAgICAgICAgc3JjOiBpbWdBcnJheSwKICAgICAgICAgIGRlc3Q6IGRhdGEsCiAgICAgICAgICB3aWR0aCwKICAgICAgICAgIGhlaWdodCwKICAgICAgICAgIG5vbkJsYWNrQ29sb3I6IDAsCiAgICAgICAgICBpbnZlcnNlRGVjb2RlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIEltYWdlUmVzaXplci5jcmVhdGVJbWFnZSh7CiAgICAgICAgICBraW5kOiBJbWFnZUtpbmQuUkdCQV8zMkJQUCwKICAgICAgICAgIGRhdGEsCiAgICAgICAgICB3aWR0aCwKICAgICAgICAgIGhlaWdodCwKICAgICAgICAgIGludGVycG9sYXRlCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgIGNvbnN0IGltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpOwogICAgICBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQSh7CiAgICAgICAgc3JjOiBpbWdBcnJheSwKICAgICAgICBkZXN0OiBpbWdEYXRhLmRhdGEsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0LAogICAgICAgIG5vbkJsYWNrQ29sb3I6IDAsCiAgICAgICAgaW52ZXJzZURlY29kZQogICAgICB9KTsKICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWdEYXRhLCAwLCAwKTsKICAgICAgY29uc3QgYml0bWFwID0gY2FudmFzLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpOwogICAgICByZXR1cm4gewogICAgICAgIGRhdGE6IG51bGwsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0LAogICAgICAgIGludGVycG9sYXRlLAogICAgICAgIGJpdG1hcAogICAgICB9OwogICAgfQogICAgcmV0dXJuIHRoaXMuY3JlYXRlUmF3TWFzayh7CiAgICAgIGltZ0FycmF5LAogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0LAogICAgICBpbnZlcnNlRGVjb2RlLAogICAgICBpbWFnZUlzRnJvbURlY29kZVN0cmVhbSwKICAgICAgaW50ZXJwb2xhdGUKICAgIH0pOwogIH0KICBnZXQgZHJhd1dpZHRoKCkgewogICAgcmV0dXJuIE1hdGgubWF4KHRoaXMud2lkdGgsIHRoaXMuc21hc2s/LndpZHRoIHx8IDAsIHRoaXMubWFzaz8ud2lkdGggfHwgMCk7CiAgfQogIGdldCBkcmF3SGVpZ2h0KCkgewogICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuaGVpZ2h0LCB0aGlzLnNtYXNrPy5oZWlnaHQgfHwgMCwgdGhpcy5tYXNrPy5oZWlnaHQgfHwgMCk7CiAgfQogIGRlY29kZUJ1ZmZlcihidWZmZXIpIHsKICAgIGNvbnN0IGJwYyA9IHRoaXMuYnBjOwogICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOwogICAgY29uc3QgZGVjb2RlQWRkZW5kcyA9IHRoaXMuZGVjb2RlQWRkZW5kczsKICAgIGNvbnN0IGRlY29kZUNvZWZmaWNpZW50cyA9IHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzOwogICAgY29uc3QgbWF4ID0gKDEgPDwgYnBjKSAtIDE7CiAgICBsZXQgaSwgaWk7CiAgICBpZiAoYnBjID09PSAxKSB7CiAgICAgIGZvciAoaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBidWZmZXJbaV0gPSArIWJ1ZmZlcltpXTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgaW5kZXggPSAwOwogICAgZm9yIChpID0gMCwgaWkgPSB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQ7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtQ29tcHM7IGorKykgewogICAgICAgIGJ1ZmZlcltpbmRleF0gPSBNYXRoQ2xhbXAoZGVjb2RlQWRkZW5kc1tqXSArIGJ1ZmZlcltpbmRleF0gKiBkZWNvZGVDb2VmZmljaWVudHNbal0sIDAsIG1heCk7CiAgICAgICAgaW5kZXgrKzsKICAgICAgfQogICAgfQogIH0KICBnZXRDb21wb25lbnRzKGJ1ZmZlcikgewogICAgY29uc3QgYnBjID0gdGhpcy5icGM7CiAgICBpZiAoYnBjID09PSA4KSB7CiAgICAgIHJldHVybiBidWZmZXI7CiAgICB9CiAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGg7CiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodDsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKICAgIGNvbnN0IGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogbnVtQ29tcHM7CiAgICBsZXQgYnVmZmVyUG9zID0gMDsKICAgIGxldCBvdXRwdXQ7CiAgICBpZiAoYnBjIDw9IDgpIHsKICAgICAgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKICAgIH0gZWxzZSBpZiAoYnBjIDw9IDE2KSB7CiAgICAgIG91dHB1dCA9IG5ldyBVaW50MTZBcnJheShsZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgb3V0cHV0ID0gbmV3IFVpbnQzMkFycmF5KGxlbmd0aCk7CiAgICB9CiAgICBjb25zdCByb3dDb21wcyA9IHdpZHRoICogbnVtQ29tcHM7CiAgICBjb25zdCBtYXggPSAoMSA8PCBicGMpIC0gMTsKICAgIGxldCBpID0gMCwKICAgICAgaWksCiAgICAgIGJ1ZjsKICAgIGlmIChicGMgPT09IDEpIHsKICAgICAgbGV0IG1hc2ssIGxvb3AxRW5kLCBsb29wMkVuZDsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgewogICAgICAgIGxvb3AxRW5kID0gaSArIChyb3dDb21wcyAmIH43KTsKICAgICAgICBsb29wMkVuZCA9IGkgKyByb3dDb21wczsKICAgICAgICB3aGlsZSAoaSA8IGxvb3AxRW5kKSB7CiAgICAgICAgICBidWYgPSBidWZmZXJbYnVmZmVyUG9zKytdOwogICAgICAgICAgb3V0cHV0W2ldID0gYnVmID4+IDcgJiAxOwogICAgICAgICAgb3V0cHV0W2kgKyAxXSA9IGJ1ZiA+PiA2ICYgMTsKICAgICAgICAgIG91dHB1dFtpICsgMl0gPSBidWYgPj4gNSAmIDE7CiAgICAgICAgICBvdXRwdXRbaSArIDNdID0gYnVmID4+IDQgJiAxOwogICAgICAgICAgb3V0cHV0W2kgKyA0XSA9IGJ1ZiA+PiAzICYgMTsKICAgICAgICAgIG91dHB1dFtpICsgNV0gPSBidWYgPj4gMiAmIDE7CiAgICAgICAgICBvdXRwdXRbaSArIDZdID0gYnVmID4+IDEgJiAxOwogICAgICAgICAgb3V0cHV0W2kgKyA3XSA9IGJ1ZiAmIDE7CiAgICAgICAgICBpICs9IDg7CiAgICAgICAgfQogICAgICAgIGlmIChpIDwgbG9vcDJFbmQpIHsKICAgICAgICAgIGJ1ZiA9IGJ1ZmZlcltidWZmZXJQb3MrK107CiAgICAgICAgICBtYXNrID0gMTI4OwogICAgICAgICAgd2hpbGUgKGkgPCBsb29wMkVuZCkgewogICAgICAgICAgICBvdXRwdXRbaSsrXSA9ICshIShidWYgJiBtYXNrKTsKICAgICAgICAgICAgbWFzayA+Pj0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxldCBiaXRzID0gMDsKICAgICAgYnVmID0gMDsKICAgICAgZm9yIChpID0gMCwgaWkgPSBsZW5ndGg7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgaWYgKGkgJSByb3dDb21wcyA9PT0gMCkgewogICAgICAgICAgYnVmID0gMDsKICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoYml0cyA8IGJwYykgewogICAgICAgICAgYnVmID0gYnVmIDw8IDggfCBidWZmZXJbYnVmZmVyUG9zKytdOwogICAgICAgICAgYml0cyArPSA4OwogICAgICAgIH0KICAgICAgICBjb25zdCByZW1haW5pbmdCaXRzID0gYml0cyAtIGJwYzsKICAgICAgICBsZXQgdmFsdWUgPSBidWYgPj4gcmVtYWluaW5nQml0czsKICAgICAgICBpZiAodmFsdWUgPCAwKSB7CiAgICAgICAgICB2YWx1ZSA9IDA7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IG1heCkgewogICAgICAgICAgdmFsdWUgPSBtYXg7CiAgICAgICAgfQogICAgICAgIG91dHB1dFtpXSA9IHZhbHVlOwogICAgICAgIGJ1ZiAmPSAoMSA8PCByZW1haW5pbmdCaXRzKSAtIDE7CiAgICAgICAgYml0cyA9IHJlbWFpbmluZ0JpdHM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQogIGFzeW5jIGZpbGxPcGFjaXR5KHJnYmFCdWYsIHdpZHRoLCBoZWlnaHQsIGFjdHVhbEhlaWdodCwgaW1hZ2UpIHsKICAgIGNvbnN0IHNtYXNrID0gdGhpcy5zbWFzazsKICAgIGNvbnN0IG1hc2sgPSB0aGlzLm1hc2s7CiAgICBsZXQgYWxwaGFCdWYsIHN3LCBzaCwgaSwgaWksIGo7CiAgICBpZiAoc21hc2spIHsKICAgICAgc3cgPSBzbWFzay53aWR0aDsKICAgICAgc2ggPSBzbWFzay5oZWlnaHQ7CiAgICAgIGFscGhhQnVmID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHN3ICogc2gpOwogICAgICBhd2FpdCBzbWFzay5maWxsR3JheUJ1ZmZlcihhbHBoYUJ1Zik7CiAgICAgIGlmIChzdyAhPT0gd2lkdGggfHwgc2ggIT09IGhlaWdodCkgewogICAgICAgIGFscGhhQnVmID0gcmVzaXplSW1hZ2VNYXNrKGFscGhhQnVmLCBzbWFzay5icGMsIHN3LCBzaCwgd2lkdGgsIGhlaWdodCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobWFzaykgewogICAgICBpZiAobWFzayBpbnN0YW5jZW9mIFBERkltYWdlKSB7CiAgICAgICAgc3cgPSBtYXNrLndpZHRoOwogICAgICAgIHNoID0gbWFzay5oZWlnaHQ7CiAgICAgICAgYWxwaGFCdWYgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3cgKiBzaCk7CiAgICAgICAgbWFzay5udW1Db21wcyA9IDE7CiAgICAgICAgYXdhaXQgbWFzay5maWxsR3JheUJ1ZmZlcihhbHBoYUJ1Zik7CiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBzdyAqIHNoOyBpIDwgaWk7ICsraSkgewogICAgICAgICAgYWxwaGFCdWZbaV0gPSAyNTUgLSBhbHBoYUJ1ZltpXTsKICAgICAgICB9CiAgICAgICAgaWYgKHN3ICE9PSB3aWR0aCB8fCBzaCAhPT0gaGVpZ2h0KSB7CiAgICAgICAgICBhbHBoYUJ1ZiA9IHJlc2l6ZUltYWdlTWFzayhhbHBoYUJ1ZiwgbWFzay5icGMsIHN3LCBzaCwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobWFzaykpIHsKICAgICAgICBhbHBoYUJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCk7CiAgICAgICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOwogICAgICAgIGZvciAoaSA9IDAsIGlpID0gd2lkdGggKiBoZWlnaHQ7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgICBsZXQgb3BhY2l0eSA9IDA7CiAgICAgICAgICBjb25zdCBpbWFnZU9mZnNldCA9IGkgKiBudW1Db21wczsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1Db21wczsgKytqKSB7CiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gaW1hZ2VbaW1hZ2VPZmZzZXQgKyBqXTsKICAgICAgICAgICAgY29uc3QgbWFza09mZnNldCA9IGogKiAyOwogICAgICAgICAgICBpZiAoY29sb3IgPCBtYXNrW21hc2tPZmZzZXRdIHx8IGNvbG9yID4gbWFza1ttYXNrT2Zmc2V0ICsgMV0pIHsKICAgICAgICAgICAgICBvcGFjaXR5ID0gMjU1OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBhbHBoYUJ1ZltpXSA9IG9wYWNpdHk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5rbm93biBtYXNrIGZvcm1hdC4iKTsKICAgICAgfQogICAgfQogICAgaWYgKGFscGhhQnVmKSB7CiAgICAgIGZvciAoaSA9IDAsIGogPSAzLCBpaSA9IHdpZHRoICogYWN0dWFsSGVpZ2h0OyBpIDwgaWk7ICsraSwgaiArPSA0KSB7CiAgICAgICAgcmdiYUJ1ZltqXSA9IGFscGhhQnVmW2ldOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGkgPSAwLCBqID0gMywgaWkgPSB3aWR0aCAqIGFjdHVhbEhlaWdodDsgaSA8IGlpOyArK2ksIGogKz0gNCkgewogICAgICAgIHJnYmFCdWZbal0gPSAyNTU7CiAgICAgIH0KICAgIH0KICB9CiAgdW5kb1ByZWJsZW5kKGJ1ZmZlciwgd2lkdGgsIGhlaWdodCkgewogICAgY29uc3QgbWF0dGUgPSB0aGlzLnNtYXNrPy5tYXR0ZTsKICAgIGlmICghbWF0dGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbWF0dGVSZ2IgPSB0aGlzLmNvbG9yU3BhY2UuZ2V0UmdiKG1hdHRlLCAwKTsKICAgIGNvbnN0IG1hdHRlUiA9IG1hdHRlUmdiWzBdOwogICAgY29uc3QgbWF0dGVHID0gbWF0dGVSZ2JbMV07CiAgICBjb25zdCBtYXR0ZUIgPSBtYXR0ZVJnYlsyXTsKICAgIGNvbnN0IGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogNDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKICAgICAgY29uc3QgYWxwaGEgPSBidWZmZXJbaSArIDNdOwogICAgICBpZiAoYWxwaGEgPT09IDApIHsKICAgICAgICBidWZmZXJbaV0gPSAyNTU7CiAgICAgICAgYnVmZmVyW2kgKyAxXSA9IDI1NTsKICAgICAgICBidWZmZXJbaSArIDJdID0gMjU1OwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGsgPSAyNTUgLyBhbHBoYTsKICAgICAgYnVmZmVyW2ldID0gKGJ1ZmZlcltpXSAtIG1hdHRlUikgKiBrICsgbWF0dGVSOwogICAgICBidWZmZXJbaSArIDFdID0gKGJ1ZmZlcltpICsgMV0gLSBtYXR0ZUcpICogayArIG1hdHRlRzsKICAgICAgYnVmZmVyW2kgKyAyXSA9IChidWZmZXJbaSArIDJdIC0gbWF0dGVCKSAqIGsgKyBtYXR0ZUI7CiAgICB9CiAgfQogIGFzeW5jIGNyZWF0ZUltYWdlRGF0YShmb3JjZVJHQkEgPSBmYWxzZSwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSBmYWxzZSkgewogICAgY29uc3QgZHJhd1dpZHRoID0gdGhpcy5kcmF3V2lkdGg7CiAgICBjb25zdCBkcmF3SGVpZ2h0ID0gdGhpcy5kcmF3SGVpZ2h0OwogICAgY29uc3QgaW1nRGF0YSA9IHsKICAgICAgd2lkdGg6IGRyYXdXaWR0aCwKICAgICAgaGVpZ2h0OiBkcmF3SGVpZ2h0LAogICAgICBpbnRlcnBvbGF0ZTogdGhpcy5pbnRlcnBvbGF0ZSwKICAgICAga2luZDogMCwKICAgICAgZGF0YTogbnVsbAogICAgfTsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKICAgIGNvbnN0IG9yaWdpbmFsV2lkdGggPSB0aGlzLndpZHRoOwogICAgY29uc3Qgb3JpZ2luYWxIZWlnaHQgPSB0aGlzLmhlaWdodDsKICAgIGNvbnN0IGJwYyA9IHRoaXMuYnBjOwogICAgY29uc3Qgcm93Qnl0ZXMgPSBvcmlnaW5hbFdpZHRoICogbnVtQ29tcHMgKiBicGMgKyA3ID4+IDM7CiAgICBjb25zdCBtdXN0QmVSZXNpemVkID0gaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgJiYgSW1hZ2VSZXNpemVyLm5lZWRzVG9CZVJlc2l6ZWQoZHJhd1dpZHRoLCBkcmF3SGVpZ2h0KTsKICAgIGlmICghdGhpcy5zbWFzayAmJiAhdGhpcy5tYXNrICYmIHRoaXMuY29sb3JTcGFjZS5uYW1lID09PSAiRGV2aWNlUkdCQSIpIHsKICAgICAgaW1nRGF0YS5raW5kID0gSW1hZ2VLaW5kLlJHQkFfMzJCUFA7CiAgICAgIGNvbnN0IGltZ0FycmF5ID0gaW1nRGF0YS5kYXRhID0gYXdhaXQgdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogb3JpZ2luYWxXaWR0aCAqIDQsIHt9KTsKICAgICAgaWYgKGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgICAgaWYgKCFtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVCaXRtYXAoSW1hZ2VLaW5kLlJHQkFfMzJCUFAsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgaW1nQXJyYXkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKGltZ0RhdGEsIGZhbHNlKTsKICAgICAgfQogICAgICByZXR1cm4gaW1nRGF0YTsKICAgIH0KICAgIGlmICghZm9yY2VSR0JBKSB7CiAgICAgIGxldCBraW5kOwogICAgICBpZiAodGhpcy5jb2xvclNwYWNlLm5hbWUgPT09ICJEZXZpY2VHcmF5IiAmJiBicGMgPT09IDEpIHsKICAgICAgICBraW5kID0gSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOwogICAgICB9IGVsc2UgaWYgKHRoaXMuY29sb3JTcGFjZS5uYW1lID09PSAiRGV2aWNlUkdCIiAmJiBicGMgPT09IDggJiYgIXRoaXMubmVlZHNEZWNvZGUpIHsKICAgICAgICBraW5kID0gSW1hZ2VLaW5kLlJHQl8yNEJQUDsKICAgICAgfQogICAgICBpZiAoa2luZCAmJiAhdGhpcy5zbWFzayAmJiAhdGhpcy5tYXNrICYmIGRyYXdXaWR0aCA9PT0gb3JpZ2luYWxXaWR0aCAmJiBkcmF3SGVpZ2h0ID09PSBvcmlnaW5hbEhlaWdodCkgewogICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgdGhpcy4jZ2V0SW1hZ2Uob3JpZ2luYWxXaWR0aCwgb3JpZ2luYWxIZWlnaHQpOwogICAgICAgIGlmIChpbWFnZSkgewogICAgICAgICAgcmV0dXJuIGltYWdlOwogICAgICAgIH0KICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXMsIHt9KTsKICAgICAgICBpZiAoaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHsKICAgICAgICAgIGlmIChtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgICAgIHJldHVybiBJbWFnZVJlc2l6ZXIuY3JlYXRlSW1hZ2UoewogICAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgICAga2luZCwKICAgICAgICAgICAgICB3aWR0aDogZHJhd1dpZHRoLAogICAgICAgICAgICAgIGhlaWdodDogZHJhd0hlaWdodCwKICAgICAgICAgICAgICBpbnRlcnBvbGF0ZTogdGhpcy5pbnRlcnBvbGF0ZQogICAgICAgICAgICB9LCB0aGlzLm5lZWRzRGVjb2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUJpdG1hcChraW5kLCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgZGF0YSk7CiAgICAgICAgfQogICAgICAgIGltZ0RhdGEua2luZCA9IGtpbmQ7CiAgICAgICAgaW1nRGF0YS5kYXRhID0gZGF0YTsKICAgICAgICBpZiAodGhpcy5uZWVkc0RlY29kZSkgewogICAgICAgICAgYXNzZXJ0KGtpbmQgPT09IEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCwgIlBERkltYWdlLmNyZWF0ZUltYWdlRGF0YTogVGhlIGltYWdlIG11c3QgYmUgZ3JheXNjYWxlLiIpOwogICAgICAgICAgY29uc3QgYnVmZmVyID0gaW1nRGF0YS5kYXRhOwogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgYnVmZmVyW2ldIF49IDB4ZmY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbWdEYXRhOwogICAgICB9CiAgICAgIGlmICh0aGlzLmltYWdlIGluc3RhbmNlb2YgSnBlZ1N0cmVhbSAmJiAhdGhpcy5zbWFzayAmJiAhdGhpcy5tYXNrICYmICF0aGlzLm5lZWRzRGVjb2RlKSB7CiAgICAgICAgbGV0IGltYWdlTGVuZ3RoID0gb3JpZ2luYWxIZWlnaHQgKiByb3dCeXRlczsKICAgICAgICBpZiAoaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgJiYgIW11c3RCZVJlc2l6ZWQpIHsKICAgICAgICAgIGxldCBpc0hhbmRsZWQgPSBmYWxzZTsKICAgICAgICAgIHN3aXRjaCAodGhpcy5jb2xvclNwYWNlLm5hbWUpIHsKICAgICAgICAgICAgY2FzZSAiRGV2aWNlR3JheSI6CiAgICAgICAgICAgICAgaW1hZ2VMZW5ndGggKj0gNDsKICAgICAgICAgICAgICBpc0hhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJEZXZpY2VSR0IiOgogICAgICAgICAgICAgIGltYWdlTGVuZ3RoID0gaW1hZ2VMZW5ndGggLyAzICogNDsKICAgICAgICAgICAgICBpc0hhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJEZXZpY2VDTVlLIjoKICAgICAgICAgICAgICBpc0hhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzSGFuZGxlZCkgewogICAgICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuI2dldEltYWdlKGRyYXdXaWR0aCwgZHJhd0hlaWdodCk7CiAgICAgICAgICAgIGlmIChpbWFnZSkgewogICAgICAgICAgICAgIHJldHVybiBpbWFnZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByZ2JhID0gYXdhaXQgdGhpcy5nZXRJbWFnZUJ5dGVzKGltYWdlTGVuZ3RoLCB7CiAgICAgICAgICAgICAgZHJhd1dpZHRoLAogICAgICAgICAgICAgIGRyYXdIZWlnaHQsCiAgICAgICAgICAgICAgZm9yY2VSR0JBOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVCaXRtYXAoSW1hZ2VLaW5kLlJHQkFfMzJCUFAsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgcmdiYSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN3aXRjaCAodGhpcy5jb2xvclNwYWNlLm5hbWUpIHsKICAgICAgICAgICAgY2FzZSAiRGV2aWNlR3JheSI6CiAgICAgICAgICAgICAgaW1hZ2VMZW5ndGggKj0gMzsKICAgICAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKICAgICAgICAgICAgY2FzZSAiRGV2aWNlQ01ZSyI6CiAgICAgICAgICAgICAgaW1nRGF0YS5raW5kID0gSW1hZ2VLaW5kLlJHQl8yNEJQUDsKICAgICAgICAgICAgICBpbWdEYXRhLmRhdGEgPSBhd2FpdCB0aGlzLmdldEltYWdlQnl0ZXMoaW1hZ2VMZW5ndGgsIHsKICAgICAgICAgICAgICAgIGRyYXdXaWR0aCwKICAgICAgICAgICAgICAgIGRyYXdIZWlnaHQsCiAgICAgICAgICAgICAgICBmb3JjZVJHQjogdHJ1ZQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGlmIChtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKGltZ0RhdGEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gaW1nRGF0YTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGltZ0FycmF5ID0gYXdhaXQgdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXMsIHsKICAgICAgaW50ZXJuYWw6IHRydWUKICAgIH0pOwogICAgY29uc3QgYWN0dWFsSGVpZ2h0ID0gMCB8IGltZ0FycmF5Lmxlbmd0aCAvIHJvd0J5dGVzICogZHJhd0hlaWdodCAvIG9yaWdpbmFsSGVpZ2h0OwogICAgY29uc3QgY29tcHMgPSB0aGlzLmdldENvbXBvbmVudHMoaW1nQXJyYXkpOwogICAgbGV0IGFscGhhMDEsIG1heWJlVW5kb1ByZWJsZW5kOwogICAgbGV0IGNhbnZhcywgY3R4LCBjYW52YXNJbWdEYXRhLCBkYXRhOwogICAgaWYgKGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkICYmICFtdXN0QmVSZXNpemVkKSB7CiAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoZHJhd1dpZHRoLCBkcmF3SGVpZ2h0KTsKICAgICAgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgIGNhbnZhc0ltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKGRyYXdXaWR0aCwgZHJhd0hlaWdodCk7CiAgICAgIGRhdGEgPSBjYW52YXNJbWdEYXRhLmRhdGE7CiAgICB9CiAgICBpbWdEYXRhLmtpbmQgPSBJbWFnZUtpbmQuUkdCQV8zMkJQUDsKICAgIGlmICghZm9yY2VSR0JBICYmICF0aGlzLnNtYXNrICYmICF0aGlzLm1hc2spIHsKICAgICAgaWYgKCFpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCB8fCBtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgaW1nRGF0YS5raW5kID0gSW1hZ2VLaW5kLlJHQl8yNEJQUDsKICAgICAgICBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRyYXdXaWR0aCAqIGRyYXdIZWlnaHQgKiAzKTsKICAgICAgICBhbHBoYTAxID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBhcnIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIpOwogICAgICAgIGFyci5maWxsKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8gMHhmZjAwMDAwMCA6IDB4MDAwMDAwZmYpOwogICAgICAgIGFscGhhMDEgPSAxOwogICAgICB9CiAgICAgIG1heWJlVW5kb1ByZWJsZW5kID0gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBpZiAoIWlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIHx8IG11c3RCZVJlc2l6ZWQpIHsKICAgICAgICBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRyYXdXaWR0aCAqIGRyYXdIZWlnaHQgKiA0KTsKICAgICAgfQogICAgICBhbHBoYTAxID0gMTsKICAgICAgbWF5YmVVbmRvUHJlYmxlbmQgPSB0cnVlOwogICAgICBhd2FpdCB0aGlzLmZpbGxPcGFjaXR5KGRhdGEsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgYWN0dWFsSGVpZ2h0LCBjb21wcyk7CiAgICB9CiAgICBpZiAodGhpcy5uZWVkc0RlY29kZSkgewogICAgICB0aGlzLmRlY29kZUJ1ZmZlcihjb21wcyk7CiAgICB9CiAgICB0aGlzLmNvbG9yU3BhY2UuZmlsbFJnYihkYXRhLCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGJwYywgY29tcHMsIGFscGhhMDEpOwogICAgaWYgKG1heWJlVW5kb1ByZWJsZW5kKSB7CiAgICAgIHRoaXMudW5kb1ByZWJsZW5kKGRhdGEsIGRyYXdXaWR0aCwgYWN0dWFsSGVpZ2h0KTsKICAgIH0KICAgIGlmIChpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCAmJiAhbXVzdEJlUmVzaXplZCkgewogICAgICBjdHgucHV0SW1hZ2VEYXRhKGNhbnZhc0ltZ0RhdGEsIDAsIDApOwogICAgICBjb25zdCBiaXRtYXAgPSBjYW52YXMudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgZGF0YTogbnVsbCwKICAgICAgICB3aWR0aDogZHJhd1dpZHRoLAogICAgICAgIGhlaWdodDogZHJhd0hlaWdodCwKICAgICAgICBiaXRtYXAsCiAgICAgICAgaW50ZXJwb2xhdGU6IHRoaXMuaW50ZXJwb2xhdGUKICAgICAgfTsKICAgIH0KICAgIGltZ0RhdGEuZGF0YSA9IGRhdGE7CiAgICBpZiAobXVzdEJlUmVzaXplZCkgewogICAgICByZXR1cm4gSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKGltZ0RhdGEpOwogICAgfQogICAgcmV0dXJuIGltZ0RhdGE7CiAgfQogIGFzeW5jIGZpbGxHcmF5QnVmZmVyKGJ1ZmZlcikgewogICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOwogICAgaWYgKG51bUNvbXBzICE9PSAxKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgUmVhZGluZyBncmF5IHNjYWxlIGZyb20gYSBjb2xvciBpbWFnZTogJHtudW1Db21wc31gKTsKICAgIH0KICAgIGNvbnN0IHdpZHRoID0gdGhpcy53aWR0aDsKICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0OwogICAgY29uc3QgYnBjID0gdGhpcy5icGM7CiAgICBjb25zdCByb3dCeXRlcyA9IHdpZHRoICogbnVtQ29tcHMgKiBicGMgKyA3ID4+IDM7CiAgICBjb25zdCBpbWdBcnJheSA9IGF3YWl0IHRoaXMuZ2V0SW1hZ2VCeXRlcyhoZWlnaHQgKiByb3dCeXRlcywgewogICAgICBpbnRlcm5hbDogdHJ1ZQogICAgfSk7CiAgICBjb25zdCBjb21wcyA9IHRoaXMuZ2V0Q29tcG9uZW50cyhpbWdBcnJheSk7CiAgICBsZXQgaSwgbGVuZ3RoOwogICAgaWYgKGJwYyA9PT0gMSkgewogICAgICBsZW5ndGggPSB3aWR0aCAqIGhlaWdodDsKICAgICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IGNvbXBzW2ldIC0gMSAmIDI1NTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSAtY29tcHNbaV0gJiAyNTU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLm5lZWRzRGVjb2RlKSB7CiAgICAgIHRoaXMuZGVjb2RlQnVmZmVyKGNvbXBzKTsKICAgIH0KICAgIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0OwogICAgY29uc3Qgc2NhbGUgPSAyNTUgLyAoKDEgPDwgYnBjKSAtIDEpOwogICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIGJ1ZmZlcltpXSA9IHNjYWxlICogY29tcHNbaV07CiAgICB9CiAgfQogIGNyZWF0ZUJpdG1hcChraW5kLCB3aWR0aCwgaGVpZ2h0LCBzcmMpIHsKICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGxldCBpbWdEYXRhOwogICAgaWYgKGtpbmQgPT09IEltYWdlS2luZC5SR0JBXzMyQlBQKSB7CiAgICAgIGltZ0RhdGEgPSBuZXcgSW1hZ2VEYXRhKHNyYywgd2lkdGgsIGhlaWdodCk7CiAgICB9IGVsc2UgewogICAgICBpbWdEYXRhID0gY3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgY29udmVydFRvUkdCQSh7CiAgICAgICAga2luZCwKICAgICAgICBzcmMsCiAgICAgICAgZGVzdDogbmV3IFVpbnQzMkFycmF5KGltZ0RhdGEuZGF0YS5idWZmZXIpLAogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBpbnZlcnNlRGVjb2RlOiB0aGlzLm5lZWRzRGVjb2RlCiAgICAgIH0pOwogICAgfQogICAgY3R4LnB1dEltYWdlRGF0YShpbWdEYXRhLCAwLCAwKTsKICAgIGNvbnN0IGJpdG1hcCA9IGNhbnZhcy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTsKICAgIHJldHVybiB7CiAgICAgIGRhdGE6IG51bGwsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGJpdG1hcCwKICAgICAgaW50ZXJwb2xhdGU6IHRoaXMuaW50ZXJwb2xhdGUKICAgIH07CiAgfQogIGFzeW5jICNnZXRJbWFnZSh3aWR0aCwgaGVpZ2h0KSB7CiAgICBjb25zdCBiaXRtYXAgPSBhd2FpdCB0aGlzLmltYWdlLmdldFRyYW5zZmVyYWJsZUltYWdlKCk7CiAgICBpZiAoIWJpdG1hcCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGRhdGE6IG51bGwsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGJpdG1hcCwKICAgICAgaW50ZXJwb2xhdGU6IHRoaXMuaW50ZXJwb2xhdGUKICAgIH07CiAgfQogIGFzeW5jIGdldEltYWdlQnl0ZXMobGVuZ3RoLCB7CiAgICBkcmF3V2lkdGgsCiAgICBkcmF3SGVpZ2h0LAogICAgZm9yY2VSR0JBID0gZmFsc2UsCiAgICBmb3JjZVJHQiA9IGZhbHNlLAogICAgaW50ZXJuYWwgPSBmYWxzZQogIH0pIHsKICAgIHRoaXMuaW1hZ2UucmVzZXQoKTsKICAgIHRoaXMuaW1hZ2UuZHJhd1dpZHRoID0gZHJhd1dpZHRoIHx8IHRoaXMud2lkdGg7CiAgICB0aGlzLmltYWdlLmRyYXdIZWlnaHQgPSBkcmF3SGVpZ2h0IHx8IHRoaXMuaGVpZ2h0OwogICAgdGhpcy5pbWFnZS5mb3JjZVJHQkEgPSAhIWZvcmNlUkdCQTsKICAgIHRoaXMuaW1hZ2UuZm9yY2VSR0IgPSAhIWZvcmNlUkdCOwogICAgY29uc3QgaW1hZ2VCeXRlcyA9IGF3YWl0IHRoaXMuaW1hZ2UuZ2V0SW1hZ2VEYXRhKGxlbmd0aCwgdGhpcy5qcHhEZWNvZGVyT3B0aW9ucyk7CiAgICBpZiAoaW50ZXJuYWwgfHwgdGhpcy5pbWFnZSBpbnN0YW5jZW9mIERlY29kZVN0cmVhbSkgewogICAgICByZXR1cm4gaW1hZ2VCeXRlczsKICAgIH0KICAgIGFzc2VydChpbWFnZUJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSwgJ1BERkltYWdlLmdldEltYWdlQnl0ZXM6IFVuc3VwcG9ydGVkICJpbWFnZUJ5dGVzIiB0eXBlLicpOwogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGltYWdlQnl0ZXMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZXZhbHVhdG9yLmpzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNvbnN0IERlZmF1bHRQYXJ0aWFsRXZhbHVhdG9yT3B0aW9ucyA9IE9iamVjdC5mcmVlemUoewogIG1heEltYWdlU2l6ZTogLTEsCiAgZGlzYWJsZUZvbnRGYWNlOiBmYWxzZSwKICBpZ25vcmVFcnJvcnM6IGZhbHNlLAogIGlzRXZhbFN1cHBvcnRlZDogdHJ1ZSwKICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDogZmFsc2UsCiAgaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQ6IGZhbHNlLAogIGNhbnZhc01heEFyZWFJbkJ5dGVzOiAtMSwKICBmb250RXh0cmFQcm9wZXJ0aWVzOiBmYWxzZSwKICB1c2VTeXN0ZW1Gb250czogdHJ1ZSwKICB1c2VXYXNtOiB0cnVlLAogIHVzZVdvcmtlckZldGNoOiB0cnVlLAogIGNNYXBVcmw6IG51bGwsCiAgaWNjVXJsOiBudWxsLAogIHN0YW5kYXJkRm9udERhdGFVcmw6IG51bGwsCiAgd2FzbVVybDogbnVsbAp9KTsKY29uc3QgUGF0dGVyblR5cGUgPSB7CiAgVElMSU5HOiAxLAogIFNIQURJTkc6IDIKfTsKY29uc3QgVEVYVF9DSFVOS19CQVRDSF9TSVpFID0gMTA7CmNvbnN0IGRlZmVycmVkID0gUHJvbWlzZS5yZXNvbHZlKCk7CmZ1bmN0aW9uIG5vcm1hbGl6ZUJsZW5kTW9kZSh2YWx1ZSwgcGFyc2luZ0FycmF5ID0gZmFsc2UpIHsKICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlKSB7CiAgICAgIGNvbnN0IG1heWJlQk0gPSBub3JtYWxpemVCbGVuZE1vZGUodmFsLCB0cnVlKTsKICAgICAgaWYgKG1heWJlQk0pIHsKICAgICAgICByZXR1cm4gbWF5YmVCTTsKICAgICAgfQogICAgfQogICAgd2FybihgVW5zdXBwb3J0ZWQgYmxlbmQgbW9kZSBBcnJheTogJHt2YWx1ZX1gKTsKICAgIHJldHVybiAic291cmNlLW92ZXIiOwogIH0KICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICBpZiAocGFyc2luZ0FycmF5KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuICJzb3VyY2Utb3ZlciI7CiAgfQogIHN3aXRjaCAodmFsdWUubmFtZSkgewogICAgY2FzZSAiTm9ybWFsIjoKICAgIGNhc2UgIkNvbXBhdGlibGUiOgogICAgICByZXR1cm4gInNvdXJjZS1vdmVyIjsKICAgIGNhc2UgIk11bHRpcGx5IjoKICAgICAgcmV0dXJuICJtdWx0aXBseSI7CiAgICBjYXNlICJTY3JlZW4iOgogICAgICByZXR1cm4gInNjcmVlbiI7CiAgICBjYXNlICJPdmVybGF5IjoKICAgICAgcmV0dXJuICJvdmVybGF5IjsKICAgIGNhc2UgIkRhcmtlbiI6CiAgICAgIHJldHVybiAiZGFya2VuIjsKICAgIGNhc2UgIkxpZ2h0ZW4iOgogICAgICByZXR1cm4gImxpZ2h0ZW4iOwogICAgY2FzZSAiQ29sb3JEb2RnZSI6CiAgICAgIHJldHVybiAiY29sb3ItZG9kZ2UiOwogICAgY2FzZSAiQ29sb3JCdXJuIjoKICAgICAgcmV0dXJuICJjb2xvci1idXJuIjsKICAgIGNhc2UgIkhhcmRMaWdodCI6CiAgICAgIHJldHVybiAiaGFyZC1saWdodCI7CiAgICBjYXNlICJTb2Z0TGlnaHQiOgogICAgICByZXR1cm4gInNvZnQtbGlnaHQiOwogICAgY2FzZSAiRGlmZmVyZW5jZSI6CiAgICAgIHJldHVybiAiZGlmZmVyZW5jZSI7CiAgICBjYXNlICJFeGNsdXNpb24iOgogICAgICByZXR1cm4gImV4Y2x1c2lvbiI7CiAgICBjYXNlICJIdWUiOgogICAgICByZXR1cm4gImh1ZSI7CiAgICBjYXNlICJTYXR1cmF0aW9uIjoKICAgICAgcmV0dXJuICJzYXR1cmF0aW9uIjsKICAgIGNhc2UgIkNvbG9yIjoKICAgICAgcmV0dXJuICJjb2xvciI7CiAgICBjYXNlICJMdW1pbm9zaXR5IjoKICAgICAgcmV0dXJuICJsdW1pbm9zaXR5IjsKICB9CiAgaWYgKHBhcnNpbmdBcnJheSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHdhcm4oYFVuc3VwcG9ydGVkIGJsZW5kIG1vZGU6ICR7dmFsdWUubmFtZX1gKTsKICByZXR1cm4gInNvdXJjZS1vdmVyIjsKfQpmdW5jdGlvbiBhZGRMb2NhbGx5Q2FjaGVkSW1hZ2VPcHMob3BMaXN0LCBkYXRhKSB7CiAgaWYgKGRhdGEub2JqSWQpIHsKICAgIG9wTGlzdC5hZGREZXBlbmRlbmN5KGRhdGEub2JqSWQpOwogIH0KICBvcExpc3QuYWRkSW1hZ2VPcHMoZGF0YS5mbiwgZGF0YS5hcmdzLCBkYXRhLm9wdGlvbmFsQ29udGVudCwgZGF0YS5oYXNNYXNrKTsKICBpZiAoZGF0YS5mbiA9PT0gT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCAmJiBkYXRhLmFyZ3NbMF0/LmNvdW50ID4gMCkgewogICAgZGF0YS5hcmdzWzBdLmNvdW50Kys7CiAgfQp9CmNsYXNzIFRpbWVTbG90TWFuYWdlciB7CiAgc3RhdGljIFRJTUVfU0xPVF9EVVJBVElPTl9NUyA9IDIwOwogIHN0YXRpYyBDSEVDS19USU1FX0VWRVJZID0gMTAwOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5yZXNldCgpOwogIH0KICBjaGVjaygpIHsKICAgIGlmICgrK3RoaXMuY2hlY2tlZCA8IFRpbWVTbG90TWFuYWdlci5DSEVDS19USU1FX0VWRVJZKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRoaXMuY2hlY2tlZCA9IDA7CiAgICByZXR1cm4gdGhpcy5lbmRUaW1lIDw9IERhdGUubm93KCk7CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5lbmRUaW1lID0gRGF0ZS5ub3coKSArIFRpbWVTbG90TWFuYWdlci5USU1FX1NMT1RfRFVSQVRJT05fTVM7CiAgICB0aGlzLmNoZWNrZWQgPSAwOwogIH0KfQpjbGFzcyBQYXJ0aWFsRXZhbHVhdG9yIHsKICBjb25zdHJ1Y3Rvcih7CiAgICB4cmVmLAogICAgaGFuZGxlciwKICAgIHBhZ2VJbmRleCwKICAgIGlkRmFjdG9yeSwKICAgIGZvbnRDYWNoZSwKICAgIGJ1aWx0SW5DTWFwQ2FjaGUsCiAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICBnbG9iYWxJbWFnZUNhY2hlLAogICAgc3lzdGVtRm9udENhY2hlLAogICAgb3B0aW9ucyA9IG51bGwKICB9KSB7CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4OwogICAgdGhpcy5pZEZhY3RvcnkgPSBpZEZhY3Rvcnk7CiAgICB0aGlzLmZvbnRDYWNoZSA9IGZvbnRDYWNoZTsKICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IGJ1aWx0SW5DTWFwQ2FjaGU7CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZSA9IHN0YW5kYXJkRm9udERhdGFDYWNoZTsKICAgIHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlID0gZ2xvYmFsQ29sb3JTcGFjZUNhY2hlOwogICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlID0gZ2xvYmFsSW1hZ2VDYWNoZTsKICAgIHRoaXMuc3lzdGVtRm9udENhY2hlID0gc3lzdGVtRm9udENhY2hlOwogICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnM7CiAgICB0aGlzLnR5cGUzRm9udFJlZnMgPSBudWxsOwogICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlID0gbmV3IFJlZ2lvbmFsSW1hZ2VDYWNoZSgpOwogICAgdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kID0gdGhpcy5mZXRjaEJ1aWx0SW5DTWFwLmJpbmQodGhpcyk7CiAgfQogIGdldCBfcGRmRnVuY3Rpb25GYWN0b3J5KCkgewogICAgY29uc3QgcGRmRnVuY3Rpb25GYWN0b3J5ID0gbmV3IFBERkZ1bmN0aW9uRmFjdG9yeSh7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaXNFdmFsU3VwcG9ydGVkOiB0aGlzLm9wdGlvbnMuaXNFdmFsU3VwcG9ydGVkCiAgICB9KTsKICAgIHJldHVybiBzaGFkb3codGhpcywgIl9wZGZGdW5jdGlvbkZhY3RvcnkiLCBwZGZGdW5jdGlvbkZhY3RvcnkpOwogIH0KICBnZXQgcGFyc2luZ1R5cGUzRm9udCgpIHsKICAgIHJldHVybiAhIXRoaXMudHlwZTNGb250UmVmczsKICB9CiAgY2xvbmUobmV3T3B0aW9ucyA9IG51bGwpIHsKICAgIGNvbnN0IG5ld0V2YWx1YXRvciA9IE9iamVjdC5jcmVhdGUodGhpcyk7CiAgICBuZXdFdmFsdWF0b3Iub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgdGhpcy5vcHRpb25zLCBuZXdPcHRpb25zKTsKICAgIHJldHVybiBuZXdFdmFsdWF0b3I7CiAgfQogIGhhc0JsZW5kTW9kZXMocmVzb3VyY2VzLCBub25CbGVuZE1vZGVzU2V0KSB7CiAgICBpZiAoIShyZXNvdXJjZXMgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAocmVzb3VyY2VzLm9iaklkICYmIG5vbkJsZW5kTW9kZXNTZXQuaGFzKHJlc291cmNlcy5vYmpJZCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IFJlZlNldChub25CbGVuZE1vZGVzU2V0KTsKICAgIGlmIChyZXNvdXJjZXMub2JqSWQpIHsKICAgICAgcHJvY2Vzc2VkLnB1dChyZXNvdXJjZXMub2JqSWQpOwogICAgfQogICAgY29uc3Qgbm9kZXMgPSBbcmVzb3VyY2VzXSwKICAgICAgeHJlZiA9IHRoaXMueHJlZjsKICAgIHdoaWxlIChub2Rlcy5sZW5ndGgpIHsKICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLnNoaWZ0KCk7CiAgICAgIGNvbnN0IGdyYXBoaWNTdGF0ZXMgPSBub2RlLmdldCgiRXh0R1N0YXRlIik7CiAgICAgIGlmIChncmFwaGljU3RhdGVzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGZvciAobGV0IGdyYXBoaWNTdGF0ZSBvZiBncmFwaGljU3RhdGVzLmdldFJhd1ZhbHVlcygpKSB7CiAgICAgICAgICBpZiAoZ3JhcGhpY1N0YXRlIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIGlmIChwcm9jZXNzZWQuaGFzKGdyYXBoaWNTdGF0ZSkpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGdyYXBoaWNTdGF0ZSA9IHhyZWYuZmV0Y2goZ3JhcGhpY1N0YXRlKTsKICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgICAgICBwcm9jZXNzZWQucHV0KGdyYXBoaWNTdGF0ZSk7CiAgICAgICAgICAgICAgaW5mbyhgaGFzQmxlbmRNb2RlcyAtIGlnbm9yaW5nIEV4dEdTdGF0ZTogIiR7ZXh9Ii5gKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCEoZ3JhcGhpY1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZ3JhcGhpY1N0YXRlLm9iaklkKSB7CiAgICAgICAgICAgIHByb2Nlc3NlZC5wdXQoZ3JhcGhpY1N0YXRlLm9iaklkKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGJtID0gZ3JhcGhpY1N0YXRlLmdldCgiQk0iKTsKICAgICAgICAgIGlmIChibSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgaWYgKGJtLm5hbWUgIT09ICJOb3JtYWwiKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYm0gIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KGJtKSkgewogICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYm0pIHsKICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5hbWUgJiYgZWxlbWVudC5uYW1lICE9PSAiTm9ybWFsIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHhPYmplY3RzID0gbm9kZS5nZXQoIlhPYmplY3QiKTsKICAgICAgaWYgKCEoeE9iamVjdHMgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IHhPYmplY3Qgb2YgeE9iamVjdHMuZ2V0UmF3VmFsdWVzKCkpIHsKICAgICAgICBpZiAoeE9iamVjdCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgaWYgKHByb2Nlc3NlZC5oYXMoeE9iamVjdCkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB4T2JqZWN0ID0geHJlZi5mZXRjaCh4T2JqZWN0KTsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIHByb2Nlc3NlZC5wdXQoeE9iamVjdCk7CiAgICAgICAgICAgIGluZm8oYGhhc0JsZW5kTW9kZXMgLSBpZ25vcmluZyBYT2JqZWN0OiAiJHtleH0iLmApOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCEoeE9iamVjdCBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHhPYmplY3QuZGljdC5vYmpJZCkgewogICAgICAgICAgcHJvY2Vzc2VkLnB1dCh4T2JqZWN0LmRpY3Qub2JqSWQpOwogICAgICAgIH0KICAgICAgICBjb25zdCB4UmVzb3VyY2VzID0geE9iamVjdC5kaWN0LmdldCgiUmVzb3VyY2VzIik7CiAgICAgICAgaWYgKCEoeFJlc291cmNlcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHhSZXNvdXJjZXMub2JqSWQgJiYgcHJvY2Vzc2VkLmhhcyh4UmVzb3VyY2VzLm9iaklkKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIG5vZGVzLnB1c2goeFJlc291cmNlcyk7CiAgICAgICAgaWYgKHhSZXNvdXJjZXMub2JqSWQpIHsKICAgICAgICAgIHByb2Nlc3NlZC5wdXQoeFJlc291cmNlcy5vYmpJZCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IHJlZiBvZiBwcm9jZXNzZWQpIHsKICAgICAgbm9uQmxlbmRNb2Rlc1NldC5wdXQocmVmKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgZmV0Y2hCdWlsdEluQ01hcChuYW1lKSB7CiAgICBjb25zdCBjYWNoZWREYXRhID0gdGhpcy5idWlsdEluQ01hcENhY2hlLmdldChuYW1lKTsKICAgIGlmIChjYWNoZWREYXRhKSB7CiAgICAgIHJldHVybiBjYWNoZWREYXRhOwogICAgfQogICAgbGV0IGRhdGE7CiAgICBpZiAodGhpcy5vcHRpb25zLnVzZVdvcmtlckZldGNoKSB7CiAgICAgIGRhdGEgPSB7CiAgICAgICAgY01hcERhdGE6IGF3YWl0IGZldGNoQmluYXJ5RGF0YShgJHt0aGlzLm9wdGlvbnMuY01hcFVybH0ke25hbWV9LmJjbWFwYCksCiAgICAgICAgaXNDb21wcmVzc2VkOiB0cnVlCiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBkYXRhID0gYXdhaXQgdGhpcy5oYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiRmV0Y2hCaW5hcnlEYXRhIiwgewogICAgICAgIHR5cGU6ICJjTWFwUmVhZGVyRmFjdG9yeSIsCiAgICAgICAgbmFtZQogICAgICB9KTsKICAgIH0KICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZS5zZXQobmFtZSwgZGF0YSk7CiAgICByZXR1cm4gZGF0YTsKICB9CiAgYXN5bmMgZmV0Y2hTdGFuZGFyZEZvbnREYXRhKG5hbWUpIHsKICAgIGNvbnN0IGNhY2hlZERhdGEgPSB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5nZXQobmFtZSk7CiAgICBpZiAoY2FjaGVkRGF0YSkgewogICAgICByZXR1cm4gbmV3IFN0cmVhbShjYWNoZWREYXRhKTsKICAgIH0KICAgIGlmICh0aGlzLm9wdGlvbnMudXNlU3lzdGVtRm9udHMgJiYgbmFtZSAhPT0gIlN5bWJvbCIgJiYgbmFtZSAhPT0gIlphcGZEaW5nYmF0cyIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBzdGFuZGFyZEZvbnROYW1lVG9GaWxlTmFtZSA9IGdldEZvbnROYW1lVG9GaWxlTWFwKCksCiAgICAgIGZpbGVuYW1lID0gc3RhbmRhcmRGb250TmFtZVRvRmlsZU5hbWVbbmFtZV07CiAgICBsZXQgZGF0YTsKICAgIHRyeSB7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMudXNlV29ya2VyRmV0Y2gpIHsKICAgICAgICBkYXRhID0gYXdhaXQgZmV0Y2hCaW5hcnlEYXRhKGAke3RoaXMub3B0aW9ucy5zdGFuZGFyZEZvbnREYXRhVXJsfSR7ZmlsZW5hbWV9YCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuaGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkZldGNoQmluYXJ5RGF0YSIsIHsKICAgICAgICAgIHR5cGU6ICJzdGFuZGFyZEZvbnREYXRhRmFjdG9yeSIsCiAgICAgICAgICBmaWxlbmFtZQogICAgICAgIH0pOwogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICB3YXJuKGV4KTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5zZXQobmFtZSwgZGF0YSk7CiAgICByZXR1cm4gbmV3IFN0cmVhbShkYXRhKTsKICB9CiAgYXN5bmMgYnVpbGRGb3JtWE9iamVjdChyZXNvdXJjZXMsIHhvYmosIHNtYXNrLCBvcGVyYXRvckxpc3QsIHRhc2ssIGluaXRpYWxTdGF0ZSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKICAgIGNvbnN0IGRpY3QgPSB4b2JqLmRpY3Q7CiAgICBjb25zdCBtYXRyaXggPSBsb29rdXBNYXRyaXgoZGljdC5nZXRBcnJheSgiTWF0cml4IiksIG51bGwpOwogICAgY29uc3QgYmJveCA9IGxvb2t1cE5vcm1hbFJlY3QoZGljdC5nZXRBcnJheSgiQkJveCIpLCBudWxsKTsKICAgIGxldCBvcHRpb25hbENvbnRlbnQsIGdyb3VwT3B0aW9uczsKICAgIGlmIChkaWN0LmhhcygiT0MiKSkgewogICAgICBvcHRpb25hbENvbnRlbnQgPSBhd2FpdCB0aGlzLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGRpY3QuZ2V0KCJPQyIpLCByZXNvdXJjZXMpOwogICAgfQogICAgaWYgKG9wdGlvbmFsQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBvcHRpb25hbENvbnRlbnRdKTsKICAgIH0KICAgIGNvbnN0IGdyb3VwID0gZGljdC5nZXQoIkdyb3VwIik7CiAgICBpZiAoZ3JvdXApIHsKICAgICAgZ3JvdXBPcHRpb25zID0gewogICAgICAgIG1hdHJpeCwKICAgICAgICBiYm94LAogICAgICAgIHNtYXNrLAogICAgICAgIGlzb2xhdGVkOiBmYWxzZSwKICAgICAgICBrbm9ja291dDogZmFsc2UKICAgICAgfTsKICAgICAgY29uc3QgZ3JvdXBTdWJ0eXBlID0gZ3JvdXAuZ2V0KCJTIik7CiAgICAgIGxldCBjb2xvclNwYWNlID0gbnVsbDsKICAgICAgaWYgKGlzTmFtZShncm91cFN1YnR5cGUsICJUcmFuc3BhcmVuY3kiKSkgewogICAgICAgIGdyb3VwT3B0aW9ucy5pc29sYXRlZCA9IGdyb3VwLmdldCgiSSIpIHx8IGZhbHNlOwogICAgICAgIGdyb3VwT3B0aW9ucy5rbm9ja291dCA9IGdyb3VwLmdldCgiSyIpIHx8IGZhbHNlOwogICAgICAgIGlmIChncm91cC5oYXMoIkNTIikpIHsKICAgICAgICAgIGNvbnN0IGNzID0gdGhpcy5fZ2V0Q29sb3JTcGFjZShncm91cC5nZXRSYXcoIkNTIiksIHJlc291cmNlcywgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOwogICAgICAgICAgY29sb3JTcGFjZSA9IGNzIGluc3RhbmNlb2YgQ29sb3JTcGFjZSA/IGNzIDogYXdhaXQgdGhpcy5faGFuZGxlQ29sb3JTcGFjZShjcyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzbWFzaz8uYmFja2Ryb3ApIHsKICAgICAgICBjb2xvclNwYWNlIHx8PSBDb2xvclNwYWNlVXRpbHMucmdiOwogICAgICAgIHNtYXNrLmJhY2tkcm9wID0gY29sb3JTcGFjZS5nZXRSZ2Ioc21hc2suYmFja2Ryb3AsIDApOwogICAgICB9CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5Hcm91cCwgW2dyb3VwT3B0aW9uc10pOwogICAgfQogICAgY29uc3QgYXJncyA9IGdyb3VwID8gW21hdHJpeCwgbnVsbF0gOiBbbWF0cml4LCBiYm94XTsKICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucGFpbnRGb3JtWE9iamVjdEJlZ2luLCBhcmdzKTsKICAgIGF3YWl0IHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgc3RyZWFtOiB4b2JqLAogICAgICB0YXNrLAogICAgICByZXNvdXJjZXM6IGRpY3QuZ2V0KCJSZXNvdXJjZXMiKSB8fCByZXNvdXJjZXMsCiAgICAgIG9wZXJhdG9yTGlzdCwKICAgICAgaW5pdGlhbFN0YXRlCiAgICB9KTsKICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucGFpbnRGb3JtWE9iamVjdEVuZCwgW10pOwogICAgaWYgKGdyb3VwKSB7CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuZW5kR3JvdXAsIFtncm91cE9wdGlvbnNdKTsKICAgIH0KICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLmVuZE1hcmtlZENvbnRlbnQsIFtdKTsKICAgIH0KICB9CiAgX3NlbmRJbWdEYXRhKG9iaklkLCBpbWdEYXRhLCBjYWNoZUdsb2JhbGx5ID0gZmFsc2UpIHsKICAgIGNvbnN0IHRyYW5zZmVycyA9IGltZ0RhdGEgPyBbaW1nRGF0YS5iaXRtYXAgfHwgaW1nRGF0YS5kYXRhLmJ1ZmZlcl0gOiBudWxsOwogICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCB8fCBjYWNoZUdsb2JhbGx5KSB7CiAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIiwgW29iaklkLCAiSW1hZ2UiLCBpbWdEYXRhXSwgdHJhbnNmZXJzKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZCgib2JqIiwgW29iaklkLCB0aGlzLnBhZ2VJbmRleCwgIkltYWdlIiwgaW1nRGF0YV0sIHRyYW5zZmVycyk7CiAgfQogIGFzeW5jIGJ1aWxkUGFpbnRJbWFnZVhPYmplY3QoewogICAgcmVzb3VyY2VzLAogICAgaW1hZ2UsCiAgICBpc0lubGluZSA9IGZhbHNlLAogICAgb3BlcmF0b3JMaXN0LAogICAgY2FjaGVLZXksCiAgICBsb2NhbEltYWdlQ2FjaGUsCiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogIH0pIHsKICAgIGNvbnN0IGRpY3QgPSBpbWFnZS5kaWN0OwogICAgY29uc3QgaW1hZ2VSZWYgPSBkaWN0Lm9iaklkOwogICAgY29uc3QgdyA9IGRpY3QuZ2V0KCJXIiwgIldpZHRoIik7CiAgICBjb25zdCBoID0gZGljdC5nZXQoIkgiLCAiSGVpZ2h0Iik7CiAgICBpZiAoISh3ICYmIHR5cGVvZiB3ID09PSAibnVtYmVyIikgfHwgIShoICYmIHR5cGVvZiBoID09PSAibnVtYmVyIikpIHsKICAgICAgd2FybigiSW1hZ2UgZGltZW5zaW9ucyBhcmUgbWlzc2luZywgb3Igbm90IG51bWJlcnMuIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG1heEltYWdlU2l6ZSA9IHRoaXMub3B0aW9ucy5tYXhJbWFnZVNpemU7CiAgICBpZiAobWF4SW1hZ2VTaXplICE9PSAtMSAmJiB3ICogaCA+IG1heEltYWdlU2l6ZSkgewogICAgICBjb25zdCBtc2cgPSAiSW1hZ2UgZXhjZWVkZWQgbWF4aW11bSBhbGxvd2VkIHNpemUgYW5kIHdhcyByZW1vdmVkLiI7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgd2Fybihtc2cpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKICAgIH0KICAgIGxldCBvcHRpb25hbENvbnRlbnQ7CiAgICBpZiAoZGljdC5oYXMoIk9DIikpIHsKICAgICAgb3B0aW9uYWxDb250ZW50ID0gYXdhaXQgdGhpcy5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhkaWN0LmdldCgiT0MiKSwgcmVzb3VyY2VzKTsKICAgIH0KICAgIGNvbnN0IGltYWdlTWFzayA9IGRpY3QuZ2V0KCJJTSIsICJJbWFnZU1hc2siKSB8fCBmYWxzZTsKICAgIGxldCBpbWdEYXRhLCBmbiwgYXJnczsKICAgIGlmIChpbWFnZU1hc2spIHsKICAgICAgY29uc3QgaW50ZXJwb2xhdGUgPSBkaWN0LmdldCgiSSIsICJJbnRlcnBvbGF0ZSIpOwogICAgICBjb25zdCBiaXRTdHJpZGVMZW5ndGggPSB3ICsgNyA+PiAzOwogICAgICBjb25zdCBpbWdBcnJheSA9IGltYWdlLmdldEJ5dGVzKGJpdFN0cmlkZUxlbmd0aCAqIGgpOwogICAgICBjb25zdCBkZWNvZGUgPSBkaWN0LmdldEFycmF5KCJEIiwgIkRlY29kZSIpOwogICAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgICAgaW1nRGF0YSA9IFBERkltYWdlLmNyZWF0ZVJhd01hc2soewogICAgICAgICAgaW1nQXJyYXksCiAgICAgICAgICB3aWR0aDogdywKICAgICAgICAgIGhlaWdodDogaCwKICAgICAgICAgIGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOiBpbWFnZSBpbnN0YW5jZW9mIERlY29kZVN0cmVhbSwKICAgICAgICAgIGludmVyc2VEZWNvZGU6IGRlY29kZT8uWzBdID4gMCwKICAgICAgICAgIGludGVycG9sYXRlCiAgICAgICAgfSk7CiAgICAgICAgaW1nRGF0YS5jYWNoZWQgPSAhIWNhY2hlS2V5OwogICAgICAgIGZuID0gT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDsKICAgICAgICBhcmdzID0gW2ltZ0RhdGFdOwogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhmbiwgYXJncywgb3B0aW9uYWxDb250ZW50KTsKICAgICAgICBpZiAoY2FjaGVLZXkpIHsKICAgICAgICAgIGNvbnN0IGNhY2hlRGF0YSA9IHsKICAgICAgICAgICAgZm4sCiAgICAgICAgICAgIGFyZ3MsCiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudAogICAgICAgICAgfTsKICAgICAgICAgIGxvY2FsSW1hZ2VDYWNoZS5zZXQoY2FjaGVLZXksIGltYWdlUmVmLCBjYWNoZURhdGEpOwogICAgICAgICAgaWYgKGltYWdlUmVmKSB7CiAgICAgICAgICAgIHRoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQobnVsbCwgaW1hZ2VSZWYsIGNhY2hlRGF0YSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpbWdEYXRhID0gYXdhaXQgUERGSW1hZ2UuY3JlYXRlTWFzayh7CiAgICAgICAgaW1nQXJyYXksCiAgICAgICAgd2lkdGg6IHcsCiAgICAgICAgaGVpZ2h0OiBoLAogICAgICAgIGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOiBpbWFnZSBpbnN0YW5jZW9mIERlY29kZVN0cmVhbSwKICAgICAgICBpbnZlcnNlRGVjb2RlOiBkZWNvZGU/LlswXSA+IDAsCiAgICAgICAgaW50ZXJwb2xhdGUsCiAgICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6IHRoaXMub3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZAogICAgICB9KTsKICAgICAgaWYgKGltZ0RhdGEuaXNTaW5nbGVPcGFxdWVQaXhlbCkgewogICAgICAgIGZuID0gT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzazsKICAgICAgICBhcmdzID0gW107CiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZEltYWdlT3BzKGZuLCBhcmdzLCBvcHRpb25hbENvbnRlbnQpOwogICAgICAgIGlmIChjYWNoZUtleSkgewogICAgICAgICAgY29uc3QgY2FjaGVEYXRhID0gewogICAgICAgICAgICBmbiwKICAgICAgICAgICAgYXJncywKICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50CiAgICAgICAgICB9OwogICAgICAgICAgbG9jYWxJbWFnZUNhY2hlLnNldChjYWNoZUtleSwgaW1hZ2VSZWYsIGNhY2hlRGF0YSk7CiAgICAgICAgICBpZiAoaW1hZ2VSZWYpIHsKICAgICAgICAgICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IG9iaklkID0gYG1hc2tfJHt0aGlzLmlkRmFjdG9yeS5jcmVhdGVPYmpJZCgpfWA7CiAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KG9iaklkKTsKICAgICAgaW1nRGF0YS5kYXRhTGVuID0gaW1nRGF0YS5iaXRtYXAgPyBpbWdEYXRhLndpZHRoICogaW1nRGF0YS5oZWlnaHQgKiA0IDogaW1nRGF0YS5kYXRhLmxlbmd0aDsKICAgICAgdGhpcy5fc2VuZEltZ0RhdGEob2JqSWQsIGltZ0RhdGEpOwogICAgICBmbiA9IE9QUy5wYWludEltYWdlTWFza1hPYmplY3Q7CiAgICAgIGFyZ3MgPSBbewogICAgICAgIGRhdGE6IG9iaklkLAogICAgICAgIHdpZHRoOiBpbWdEYXRhLndpZHRoLAogICAgICAgIGhlaWdodDogaW1nRGF0YS5oZWlnaHQsCiAgICAgICAgaW50ZXJwb2xhdGU6IGltZ0RhdGEuaW50ZXJwb2xhdGUsCiAgICAgICAgY291bnQ6IDEKICAgICAgfV07CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhmbiwgYXJncywgb3B0aW9uYWxDb250ZW50KTsKICAgICAgaWYgKGNhY2hlS2V5KSB7CiAgICAgICAgY29uc3QgY2FjaGVEYXRhID0gewogICAgICAgICAgb2JqSWQsCiAgICAgICAgICBmbiwKICAgICAgICAgIGFyZ3MsCiAgICAgICAgICBvcHRpb25hbENvbnRlbnQKICAgICAgICB9OwogICAgICAgIGxvY2FsSW1hZ2VDYWNoZS5zZXQoY2FjaGVLZXksIGltYWdlUmVmLCBjYWNoZURhdGEpOwogICAgICAgIGlmIChpbWFnZVJlZikgewogICAgICAgICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgU01BTExfSU1BR0VfRElNRU5TSU9OUyA9IDIwMDsKICAgIGNvbnN0IGhhc01hc2sgPSBkaWN0LmhhcygiU01hc2siKSB8fCBkaWN0LmhhcygiTWFzayIpOwogICAgaWYgKGlzSW5saW5lICYmIHcgKyBoIDwgU01BTExfSU1BR0VfRElNRU5TSU9OUyAmJiAhaGFzTWFzaykgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IGltYWdlT2JqID0gbmV3IFBERkltYWdlKHsKICAgICAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgICAgIHJlczogcmVzb3VyY2VzLAogICAgICAgICAgaW1hZ2UsCiAgICAgICAgICBpc0lubGluZSwKICAgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeTogdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlOiB0aGlzLmdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgfSk7CiAgICAgICAgaW1nRGF0YSA9IGF3YWl0IGltYWdlT2JqLmNyZWF0ZUltYWdlRGF0YSh0cnVlLCBmYWxzZSk7CiAgICAgICAgb3BlcmF0b3JMaXN0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gdGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOwogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhPUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QsIFtpbWdEYXRhXSwgb3B0aW9uYWxDb250ZW50KTsKICAgICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgICAgY29uc3QgbXNnID0gYFVuYWJsZSB0byBkZWNvZGUgaW5saW5lIGltYWdlOiAiJHtyZWFzb259Ii5gOwogICAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CiAgICAgICAgfQogICAgICAgIHdhcm4obXNnKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgb2JqSWQgPSBgaW1nXyR7dGhpcy5pZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gLAogICAgICBjYWNoZUdsb2JhbGx5ID0gZmFsc2U7CiAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgIG9iaklkID0gYCR7dGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKX1fdHlwZTNfJHtvYmpJZH1gOwogICAgfSBlbHNlIGlmIChjYWNoZUtleSAmJiBpbWFnZVJlZikgewogICAgICBjYWNoZUdsb2JhbGx5ID0gdGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNob3VsZENhY2hlKGltYWdlUmVmLCB0aGlzLnBhZ2VJbmRleCk7CiAgICAgIGlmIChjYWNoZUdsb2JhbGx5KSB7CiAgICAgICAgYXNzZXJ0KCFpc0lubGluZSwgIkNhbm5vdCBjYWNoZSBhbiBpbmxpbmUgaW1hZ2UgZ2xvYmFsbHkuIik7CiAgICAgICAgb2JqSWQgPSBgJHt0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpfV8ke29iaklkfWA7CiAgICAgIH0KICAgIH0KICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KG9iaklkKTsKICAgIGZuID0gT1BTLnBhaW50SW1hZ2VYT2JqZWN0OwogICAgYXJncyA9IFtvYmpJZCwgdywgaF07CiAgICBvcGVyYXRvckxpc3QuYWRkSW1hZ2VPcHMoZm4sIGFyZ3MsIG9wdGlvbmFsQ29udGVudCwgaGFzTWFzayk7CiAgICBpZiAoY2FjaGVHbG9iYWxseSkgewogICAgICBpZiAodGhpcy5nbG9iYWxJbWFnZUNhY2hlLmhhc0RlY29kZUZhaWxlZChpbWFnZVJlZikpIHsKICAgICAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YShpbWFnZVJlZiwgewogICAgICAgICAgb2JqSWQsCiAgICAgICAgICBmbiwKICAgICAgICAgIGFyZ3MsCiAgICAgICAgICBvcHRpb25hbENvbnRlbnQsCiAgICAgICAgICBoYXNNYXNrLAogICAgICAgICAgYnl0ZVNpemU6IDAKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgbnVsbCwgY2FjaGVHbG9iYWxseSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh3ICogaCA+IDI1MDAwMCB8fCBoYXNNYXNrKSB7CiAgICAgICAgY29uc3QgbG9jYWxMZW5ndGggPSBhd2FpdCB0aGlzLmhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJjb21tb25vYmoiLCBbb2JqSWQsICJDb3B5TG9jYWxJbWFnZSIsIHsKICAgICAgICAgIGltYWdlUmVmCiAgICAgICAgfV0pOwogICAgICAgIGlmIChsb2NhbExlbmd0aCkgewogICAgICAgICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNldERhdGEoaW1hZ2VSZWYsIHsKICAgICAgICAgICAgb2JqSWQsCiAgICAgICAgICAgIGZuLAogICAgICAgICAgICBhcmdzLAogICAgICAgICAgICBvcHRpb25hbENvbnRlbnQsCiAgICAgICAgICAgIGhhc01hc2ssCiAgICAgICAgICAgIGJ5dGVTaXplOiAwCiAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGRCeXRlU2l6ZShpbWFnZVJlZiwgbG9jYWxMZW5ndGgpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgUERGSW1hZ2UuYnVpbGRJbWFnZSh7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgcmVzOiByZXNvdXJjZXMsCiAgICAgIGltYWdlLAogICAgICBpc0lubGluZSwKICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICB9KS50aGVuKGFzeW5jIGltYWdlT2JqID0+IHsKICAgICAgaW1nRGF0YSA9IGF3YWl0IGltYWdlT2JqLmNyZWF0ZUltYWdlRGF0YShmYWxzZSwgdGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTsKICAgICAgaW1nRGF0YS5kYXRhTGVuID0gaW1nRGF0YS5iaXRtYXAgPyBpbWdEYXRhLndpZHRoICogaW1nRGF0YS5oZWlnaHQgKiA0IDogaW1nRGF0YS5kYXRhLmxlbmd0aDsKICAgICAgaW1nRGF0YS5yZWYgPSBpbWFnZVJlZjsKICAgICAgaWYgKGNhY2hlR2xvYmFsbHkpIHsKICAgICAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuYWRkQnl0ZVNpemUoaW1hZ2VSZWYsIGltZ0RhdGEuZGF0YUxlbik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3NlbmRJbWdEYXRhKG9iaklkLCBpbWdEYXRhLCBjYWNoZUdsb2JhbGx5KTsKICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CiAgICAgIHdhcm4oYFVuYWJsZSB0byBkZWNvZGUgaW1hZ2UgIiR7b2JqSWR9IjogIiR7cmVhc29ufSIuYCk7CiAgICAgIGlmIChpbWFnZVJlZikgewogICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGREZWNvZGVGYWlsZWQoaW1hZ2VSZWYpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgbnVsbCwgY2FjaGVHbG9iYWxseSk7CiAgICB9KTsKICAgIGlmIChjYWNoZUtleSkgewogICAgICBjb25zdCBjYWNoZURhdGEgPSB7CiAgICAgICAgb2JqSWQsCiAgICAgICAgZm4sCiAgICAgICAgYXJncywKICAgICAgICBvcHRpb25hbENvbnRlbnQsCiAgICAgICAgaGFzTWFzawogICAgICB9OwogICAgICBsb2NhbEltYWdlQ2FjaGUuc2V0KGNhY2hlS2V5LCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgaWYgKGltYWdlUmVmKSB7CiAgICAgICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICBpZiAoY2FjaGVHbG9iYWxseSkgewogICAgICAgICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNldERhdGEoaW1hZ2VSZWYsIHsKICAgICAgICAgICAgb2JqSWQsCiAgICAgICAgICAgIGZuLAogICAgICAgICAgICBhcmdzLAogICAgICAgICAgICBvcHRpb25hbENvbnRlbnQsCiAgICAgICAgICAgIGhhc01hc2ssCiAgICAgICAgICAgIGJ5dGVTaXplOiAwCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgaGFuZGxlU01hc2soc21hc2ssIHJlc291cmNlcywgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBjb25zdCBzbWFza0NvbnRlbnQgPSBzbWFzay5nZXQoIkciKTsKICAgIGNvbnN0IHNtYXNrT3B0aW9ucyA9IHsKICAgICAgc3VidHlwZTogc21hc2suZ2V0KCJTIikubmFtZSwKICAgICAgYmFja2Ryb3A6IHNtYXNrLmdldCgiQkMiKQogICAgfTsKICAgIGNvbnN0IHRyYW5zZmVyT2JqID0gc21hc2suZ2V0KCJUUiIpOwogICAgaWYgKGlzUERGRnVuY3Rpb24odHJhbnNmZXJPYmopKSB7CiAgICAgIGNvbnN0IHRyYW5zZmVyRm4gPSB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKHRyYW5zZmVyT2JqKTsKICAgICAgY29uc3QgdHJhbnNmZXJNYXAgPSBuZXcgVWludDhBcnJheSgyNTYpOwogICAgICBjb25zdCB0bXAgPSBuZXcgRmxvYXQzMkFycmF5KDEpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CiAgICAgICAgdG1wWzBdID0gaSAvIDI1NTsKICAgICAgICB0cmFuc2ZlckZuKHRtcCwgMCwgdG1wLCAwKTsKICAgICAgICB0cmFuc2Zlck1hcFtpXSA9IHRtcFswXSAqIDI1NSB8IDA7CiAgICAgIH0KICAgICAgc21hc2tPcHRpb25zLnRyYW5zZmVyTWFwID0gdHJhbnNmZXJNYXA7CiAgICB9CiAgICByZXR1cm4gdGhpcy5idWlsZEZvcm1YT2JqZWN0KHJlc291cmNlcywgc21hc2tDb250ZW50LCBzbWFza09wdGlvbnMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKHsKICAgICAgbmV3UGF0aDogdHJ1ZQogICAgfSksIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKICB9CiAgaGFuZGxlVHJhbnNmZXJGdW5jdGlvbih0cikgewogICAgbGV0IHRyYW5zZmVyQXJyYXk7CiAgICBpZiAoQXJyYXkuaXNBcnJheSh0cikpIHsKICAgICAgdHJhbnNmZXJBcnJheSA9IHRyOwogICAgfSBlbHNlIGlmIChpc1BERkZ1bmN0aW9uKHRyKSkgewogICAgICB0cmFuc2ZlckFycmF5ID0gW3RyXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgdHJhbnNmZXJNYXBzID0gW107CiAgICBsZXQgbnVtRm5zID0gMCwKICAgICAgbnVtRWZmZWN0ZnVsRm5zID0gMDsKICAgIGZvciAoY29uc3QgZW50cnkgb2YgdHJhbnNmZXJBcnJheSkgewogICAgICBjb25zdCB0cmFuc2Zlck9iaiA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGVudHJ5KTsKICAgICAgbnVtRm5zKys7CiAgICAgIGlmIChpc05hbWUodHJhbnNmZXJPYmosICJJZGVudGl0eSIpKSB7CiAgICAgICAgdHJhbnNmZXJNYXBzLnB1c2gobnVsbCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoIWlzUERGRnVuY3Rpb24odHJhbnNmZXJPYmopKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgdHJhbnNmZXJGbiA9IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUodHJhbnNmZXJPYmopOwogICAgICBjb25zdCB0cmFuc2Zlck1hcCA9IG5ldyBVaW50OEFycmF5KDI1NiksCiAgICAgICAgdG1wID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAyNTY7IGorKykgewogICAgICAgIHRtcFswXSA9IGogLyAyNTU7CiAgICAgICAgdHJhbnNmZXJGbih0bXAsIDAsIHRtcCwgMCk7CiAgICAgICAgdHJhbnNmZXJNYXBbal0gPSB0bXBbMF0gKiAyNTUgfCAwOwogICAgICB9CiAgICAgIHRyYW5zZmVyTWFwcy5wdXNoKHRyYW5zZmVyTWFwKTsKICAgICAgbnVtRWZmZWN0ZnVsRm5zKys7CiAgICB9CiAgICBpZiAoIShudW1GbnMgPT09IDEgfHwgbnVtRm5zID09PSA0KSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChudW1FZmZlY3RmdWxGbnMgPT09IDApIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gdHJhbnNmZXJNYXBzOwogIH0KICBoYW5kbGVUaWxpbmdUeXBlKGZuLCBjb2xvciwgcmVzb3VyY2VzLCBwYXR0ZXJuLCBwYXR0ZXJuRGljdCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBsb2NhbFRpbGluZ1BhdHRlcm5DYWNoZSkgewogICAgY29uc3QgdGlsaW5nT3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpOwogICAgY29uc3QgcGF0dGVyblJlc291cmNlcyA9IERpY3QubWVyZ2UoewogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIGRpY3RBcnJheTogW3BhdHRlcm5EaWN0LmdldCgiUmVzb3VyY2VzIiksIHJlc291cmNlc10KICAgIH0pOwogICAgcmV0dXJuIHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgc3RyZWFtOiBwYXR0ZXJuLAogICAgICB0YXNrLAogICAgICByZXNvdXJjZXM6IHBhdHRlcm5SZXNvdXJjZXMsCiAgICAgIG9wZXJhdG9yTGlzdDogdGlsaW5nT3BMaXN0CiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgY29uc3Qgb3BlcmF0b3JMaXN0SVIgPSB0aWxpbmdPcExpc3QuZ2V0SVIoKTsKICAgICAgY29uc3QgdGlsaW5nUGF0dGVybklSID0gZ2V0VGlsaW5nUGF0dGVybklSKG9wZXJhdG9yTGlzdElSLCBwYXR0ZXJuRGljdCwgY29sb3IpOwogICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jaWVzKHRpbGluZ09wTGlzdC5kZXBlbmRlbmNpZXMpOwogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIHRpbGluZ1BhdHRlcm5JUik7CiAgICAgIGlmIChwYXR0ZXJuRGljdC5vYmpJZCkgewogICAgICAgIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlLnNldChudWxsLCBwYXR0ZXJuRGljdC5vYmpJZCwgewogICAgICAgICAgb3BlcmF0b3JMaXN0SVIsCiAgICAgICAgICBkaWN0OiBwYXR0ZXJuRGljdAogICAgICAgIH0pOwogICAgICB9CiAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB3YXJuKGBoYW5kbGVUaWxpbmdUeXBlIC0gaWdub3JpbmcgcGF0dGVybjogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRocm93IHJlYXNvbjsKICAgIH0pOwogIH0KICBhc3luYyBoYW5kbGVTZXRGb250KHJlc291cmNlcywgZm9udEFyZ3MsIGZvbnRSZWYsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGUsIGZhbGxiYWNrRm9udERpY3QgPSBudWxsLCBjc3NGb250SW5mbyA9IG51bGwpIHsKICAgIGNvbnN0IGZvbnROYW1lID0gZm9udEFyZ3M/LlswXSBpbnN0YW5jZW9mIE5hbWUgPyBmb250QXJnc1swXS5uYW1lIDogbnVsbDsKICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSBhd2FpdCB0aGlzLmxvYWRGb250KGZvbnROYW1lLCBmb250UmVmLCByZXNvdXJjZXMsIHRhc2ssIGZhbGxiYWNrRm9udERpY3QsIGNzc0ZvbnRJbmZvKTsKICAgIGlmICh0cmFuc2xhdGVkLmZvbnQuaXNUeXBlM0ZvbnQpIHsKICAgICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY2llcyh0cmFuc2xhdGVkLnR5cGUzRGVwZW5kZW5jaWVzKTsKICAgIH0KICAgIHN0YXRlLmZvbnQgPSB0cmFuc2xhdGVkLmZvbnQ7CiAgICB0cmFuc2xhdGVkLnNlbmQodGhpcy5oYW5kbGVyKTsKICAgIHJldHVybiB0cmFuc2xhdGVkLmxvYWRlZE5hbWU7CiAgfQogIGhhbmRsZVRleHQoY2hhcnMsIHN0YXRlKSB7CiAgICBjb25zdCBmb250ID0gc3RhdGUuZm9udDsKICAgIGNvbnN0IGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFycyk7CiAgICBpZiAoZm9udC5kYXRhKSB7CiAgICAgIGNvbnN0IGlzQWRkVG9QYXRoU2V0ID0gISEoc3RhdGUudGV4dFJlbmRlcmluZ01vZGUgJiBUZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKTsKICAgICAgaWYgKGlzQWRkVG9QYXRoU2V0IHx8IHN0YXRlLmZpbGxDb2xvclNwYWNlLm5hbWUgPT09ICJQYXR0ZXJuIiB8fCBmb250LmRpc2FibGVGb250RmFjZSkgewogICAgICAgIFBhcnRpYWxFdmFsdWF0b3IuYnVpbGRGb250UGF0aHMoZm9udCwgZ2x5cGhzLCB0aGlzLmhhbmRsZXIsIHRoaXMub3B0aW9ucyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBnbHlwaHM7CiAgfQogIGVuc3VyZVN0YXRlRm9udChzdGF0ZSkgewogICAgaWYgKHN0YXRlLmZvbnQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcmVhc29uID0gbmV3IEZvcm1hdEVycm9yKCJNaXNzaW5nIHNldEZvbnQgKFRmKSBvcGVyYXRvciBiZWZvcmUgdGV4dCByZW5kZXJpbmcgb3BlcmF0b3IuIik7CiAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICB3YXJuKGBlbnN1cmVTdGF0ZUZvbnQ6ICIke3JlYXNvbn0iLmApOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aHJvdyByZWFzb247CiAgfQogIGFzeW5jIHNldEdTdGF0ZSh7CiAgICByZXNvdXJjZXMsCiAgICBnU3RhdGUsCiAgICBvcGVyYXRvckxpc3QsCiAgICBjYWNoZUtleSwKICAgIHRhc2ssCiAgICBzdGF0ZU1hbmFnZXIsCiAgICBsb2NhbEdTdGF0ZUNhY2hlLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICB9KSB7CiAgICBjb25zdCBnU3RhdGVSZWYgPSBnU3RhdGUub2JqSWQ7CiAgICBsZXQgaXNTaW1wbGVHU3RhdGUgPSB0cnVlOwogICAgY29uc3QgZ1N0YXRlT2JqID0gW107CiAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpOwogICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZ1N0YXRlKSB7CiAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgY2FzZSAiVHlwZSI6CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJMVyI6CiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAibnVtYmVyIikgewogICAgICAgICAgICB3YXJuKGBJbnZhbGlkIExXIChsaW5lIHdpZHRoKTogJHt2YWx1ZX1gKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBNYXRoLmFicyh2YWx1ZSldKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkxDIjoKICAgICAgICBjYXNlICJMSiI6CiAgICAgICAgY2FzZSAiTUwiOgogICAgICAgIGNhc2UgIkQiOgogICAgICAgIGNhc2UgIlJJIjoKICAgICAgICBjYXNlICJGTCI6CiAgICAgICAgY2FzZSAiQ0EiOgogICAgICAgIGNhc2UgImNhIjoKICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIHZhbHVlXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJGb250IjoKICAgICAgICAgIGlzU2ltcGxlR1N0YXRlID0gZmFsc2U7CiAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKCgpID0+IHRoaXMuaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIG51bGwsIHZhbHVlWzBdLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlci5zdGF0ZSkudGhlbihmdW5jdGlvbiAobG9hZGVkTmFtZSkgewogICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShsb2FkZWROYW1lKTsKICAgICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgW2xvYWRlZE5hbWUsIHZhbHVlWzFdXV0pOwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQk0iOgogICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgbm9ybWFsaXplQmxlbmRNb2RlKHZhbHVlKV0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiU01hc2siOgogICAgICAgICAgaWYgKGlzTmFtZSh2YWx1ZSwgIk5vbmUiKSkgewogICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBmYWxzZV0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgaXNTaW1wbGVHU3RhdGUgPSBmYWxzZTsKICAgICAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbigoKSA9PiB0aGlzLmhhbmRsZVNNYXNrKHZhbHVlLCByZXNvdXJjZXMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkpOwogICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB0cnVlXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3YXJuKCJVbnN1cHBvcnRlZCBTTWFzayB0eXBlIik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJUUiI6CiAgICAgICAgICBjb25zdCB0cmFuc2Zlck1hcHMgPSB0aGlzLmhhbmRsZVRyYW5zZmVyRnVuY3Rpb24odmFsdWUpOwogICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgdHJhbnNmZXJNYXBzXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJPUCI6CiAgICAgICAgY2FzZSAib3AiOgogICAgICAgIGNhc2UgIk9QTSI6CiAgICAgICAgY2FzZSAiQkciOgogICAgICAgIGNhc2UgIkJHMiI6CiAgICAgICAgY2FzZSAiVUNSIjoKICAgICAgICBjYXNlICJVQ1IyIjoKICAgICAgICBjYXNlICJUUjIiOgogICAgICAgIGNhc2UgIkhUIjoKICAgICAgICBjYXNlICJTTSI6CiAgICAgICAgY2FzZSAiU0EiOgogICAgICAgIGNhc2UgIkFJUyI6CiAgICAgICAgY2FzZSAiVEsiOgogICAgICAgICAgaW5mbygiZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAiICsga2V5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpbmZvKCJVbmtub3duIGdyYXBoaWMgc3RhdGUgb3BlcmF0b3IgIiArIGtleSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgYXdhaXQgcHJvbWlzZTsKICAgIGlmIChnU3RhdGVPYmoubGVuZ3RoID4gMCkgewogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldEdTdGF0ZSwgW2dTdGF0ZU9ial0pOwogICAgfQogICAgaWYgKGlzU2ltcGxlR1N0YXRlKSB7CiAgICAgIGxvY2FsR1N0YXRlQ2FjaGUuc2V0KGNhY2hlS2V5LCBnU3RhdGVSZWYsIGdTdGF0ZU9iaik7CiAgICB9CiAgfQogIGxvYWRGb250KGZvbnROYW1lLCBmb250LCByZXNvdXJjZXMsIHRhc2ssIGZhbGxiYWNrRm9udERpY3QgPSBudWxsLCBjc3NGb250SW5mbyA9IG51bGwpIHsKICAgIGNvbnN0IGVycm9yRm9udCA9IGFzeW5jICgpID0+IG5ldyBUcmFuc2xhdGVkRm9udCh7CiAgICAgIGxvYWRlZE5hbWU6ICJnX2ZvbnRfZXJyb3IiLAogICAgICBmb250OiBuZXcgRXJyb3JGb250KGBGb250ICIke2ZvbnROYW1lfSIgaXMgbm90IGF2YWlsYWJsZS5gKSwKICAgICAgZGljdDogZm9udAogICAgfSk7CiAgICBsZXQgZm9udFJlZjsKICAgIGlmIChmb250KSB7CiAgICAgIGlmIChmb250IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgZm9udFJlZiA9IGZvbnQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGZvbnRSZXMgPSByZXNvdXJjZXMuZ2V0KCJGb250Iik7CiAgICAgIGlmIChmb250UmVzKSB7CiAgICAgICAgZm9udFJlZiA9IGZvbnRSZXMuZ2V0UmF3KGZvbnROYW1lKTsKICAgICAgfQogICAgfQogICAgaWYgKGZvbnRSZWYpIHsKICAgICAgaWYgKHRoaXMudHlwZTNGb250UmVmcz8uaGFzKGZvbnRSZWYpKSB7CiAgICAgICAgcmV0dXJuIGVycm9yRm9udCgpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmZvbnRDYWNoZS5oYXMoZm9udFJlZikpIHsKICAgICAgICByZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGZvbnRSZWYpOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgZm9udCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGZvbnRSZWYpOwogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIHdhcm4oYGxvYWRGb250IC0gbG9va3VwIGZhaWxlZDogIiR7ZXh9Ii5gKTsKICAgICAgfQogICAgfQogICAgaWYgKCEoZm9udCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyAmJiAhdGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgICAgd2FybihgRm9udCAiJHtmb250TmFtZX0iIGlzIG5vdCBhdmFpbGFibGUuYCk7CiAgICAgICAgcmV0dXJuIGVycm9yRm9udCgpOwogICAgICB9CiAgICAgIHdhcm4oYEZvbnQgIiR7Zm9udE5hbWV9IiBpcyBub3QgYXZhaWxhYmxlIC0tIGF0dGVtcHRpbmcgdG8gZmFsbGJhY2sgdG8gYSBkZWZhdWx0IGZvbnQuYCk7CiAgICAgIGZvbnQgPSBmYWxsYmFja0ZvbnREaWN0IHx8IFBhcnRpYWxFdmFsdWF0b3IuZmFsbGJhY2tGb250RGljdDsKICAgIH0KICAgIGlmIChmb250LmNhY2hlS2V5ICYmIHRoaXMuZm9udENhY2hlLmhhcyhmb250LmNhY2hlS2V5KSkgewogICAgICByZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGZvbnQuY2FjaGVLZXkpOwogICAgfQogICAgY29uc3QgewogICAgICBwcm9taXNlLAogICAgICByZXNvbHZlCiAgICB9ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgICBsZXQgcHJlRXZhbHVhdGVkRm9udDsKICAgIHRyeSB7CiAgICAgIHByZUV2YWx1YXRlZEZvbnQgPSB0aGlzLnByZUV2YWx1YXRlRm9udChmb250KTsKICAgICAgcHJlRXZhbHVhdGVkRm9udC5jc3NGb250SW5mbyA9IGNzc0ZvbnRJbmZvOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHdhcm4oYGxvYWRGb250IC0gcHJlRXZhbHVhdGVGb250IGZhaWxlZDogIiR7cmVhc29ufSIuYCk7CiAgICAgIHJldHVybiBlcnJvckZvbnQoKTsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgZGVzY3JpcHRvciwKICAgICAgaGFzaAogICAgfSA9IHByZUV2YWx1YXRlZEZvbnQ7CiAgICBjb25zdCBmb250UmVmSXNSZWYgPSBmb250UmVmIGluc3RhbmNlb2YgUmVmOwogICAgbGV0IGZvbnRJRDsKICAgIGlmIChoYXNoICYmIGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGNvbnN0IGZvbnRBbGlhc2VzID0gZGVzY3JpcHRvci5mb250QWxpYXNlcyB8fD0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgaWYgKGZvbnRBbGlhc2VzW2hhc2hdKSB7CiAgICAgICAgY29uc3QgYWxpYXNGb250UmVmID0gZm9udEFsaWFzZXNbaGFzaF0uYWxpYXNSZWY7CiAgICAgICAgaWYgKGZvbnRSZWZJc1JlZiAmJiBhbGlhc0ZvbnRSZWYgJiYgdGhpcy5mb250Q2FjaGUuaGFzKGFsaWFzRm9udFJlZikpIHsKICAgICAgICAgIHRoaXMuZm9udENhY2hlLnB1dEFsaWFzKGZvbnRSZWYsIGFsaWFzRm9udFJlZik7CiAgICAgICAgICByZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGZvbnRSZWYpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb250QWxpYXNlc1toYXNoXSA9IHsKICAgICAgICAgIGZvbnRJRDogdGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCkKICAgICAgICB9OwogICAgICB9CiAgICAgIGlmIChmb250UmVmSXNSZWYpIHsKICAgICAgICBmb250QWxpYXNlc1toYXNoXS5hbGlhc1JlZiA9IGZvbnRSZWY7CiAgICAgIH0KICAgICAgZm9udElEID0gZm9udEFsaWFzZXNbaGFzaF0uZm9udElEOwogICAgfSBlbHNlIHsKICAgICAgZm9udElEID0gdGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCk7CiAgICB9CiAgICBhc3NlcnQoZm9udElEPy5zdGFydHNXaXRoKCJmIiksICdUaGUgImZvbnRJRCIgbXVzdCBiZSAoY29ycmVjdGx5KSBkZWZpbmVkLicpOwogICAgaWYgKGZvbnRSZWZJc1JlZikgewogICAgICB0aGlzLmZvbnRDYWNoZS5wdXQoZm9udFJlZiwgcHJvbWlzZSk7CiAgICB9IGVsc2UgewogICAgICBmb250LmNhY2hlS2V5ID0gYGNhY2hlS2V5XyR7Zm9udElEfWA7CiAgICAgIHRoaXMuZm9udENhY2hlLnB1dChmb250LmNhY2hlS2V5LCBwcm9taXNlKTsKICAgIH0KICAgIGZvbnQubG9hZGVkTmFtZSA9IGAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9XyR7Zm9udElEfWA7CiAgICB0aGlzLnRyYW5zbGF0ZUZvbnQocHJlRXZhbHVhdGVkRm9udCkudGhlbihhc3luYyB0cmFuc2xhdGVkRm9udCA9PiB7CiAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSBuZXcgVHJhbnNsYXRlZEZvbnQoewogICAgICAgIGxvYWRlZE5hbWU6IGZvbnQubG9hZGVkTmFtZSwKICAgICAgICBmb250OiB0cmFuc2xhdGVkRm9udCwKICAgICAgICBkaWN0OiBmb250CiAgICAgIH0pOwogICAgICBpZiAodHJhbnNsYXRlZEZvbnQuaXNUeXBlM0ZvbnQpIHsKICAgICAgICB0cnkgewogICAgICAgICAgYXdhaXQgdHJhbnNsYXRlZC5sb2FkVHlwZTNEYXRhKHRoaXMsIHJlc291cmNlcywgdGFzayk7CiAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFR5cGUzIGZvbnQgbG9hZCBlcnJvcjogJHtyZWFzb259YCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlc29sdmUodHJhbnNsYXRlZCk7CiAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICB3YXJuKGBsb2FkRm9udCAtIHRyYW5zbGF0ZUZvbnQgZmFpbGVkOiAiJHtyZWFzb259Ii5gKTsKICAgICAgcmVzb2x2ZShuZXcgVHJhbnNsYXRlZEZvbnQoewogICAgICAgIGxvYWRlZE5hbWU6IGZvbnQubG9hZGVkTmFtZSwKICAgICAgICBmb250OiBuZXcgRXJyb3JGb250KHJlYXNvbj8ubWVzc2FnZSksCiAgICAgICAgZGljdDogZm9udAogICAgICB9KSk7CiAgICB9KTsKICAgIHJldHVybiBwcm9taXNlOwogIH0KICBidWlsZFBhdGgoZm4sIGFyZ3MsIHN0YXRlKSB7CiAgICBjb25zdCB7CiAgICAgIHBhdGhNaW5NYXg6IG1pbk1heCwKICAgICAgcGF0aEJ1ZmZlcgogICAgfSA9IHN0YXRlOwogICAgc3dpdGNoIChmbiB8IDApIHsKICAgICAgY2FzZSBPUFMucmVjdGFuZ2xlOgogICAgICAgIHsKICAgICAgICAgIGNvbnN0IHggPSBzdGF0ZS5jdXJyZW50UG9pbnRYID0gYXJnc1swXTsKICAgICAgICAgIGNvbnN0IHkgPSBzdGF0ZS5jdXJyZW50UG9pbnRZID0gYXJnc1sxXTsKICAgICAgICAgIGNvbnN0IHdpZHRoID0gYXJnc1syXTsKICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGFyZ3NbM107CiAgICAgICAgICBjb25zdCB4dyA9IHggKyB3aWR0aDsKICAgICAgICAgIGNvbnN0IHloID0geSArIGhlaWdodDsKICAgICAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHsKICAgICAgICAgICAgcGF0aEJ1ZmZlci5wdXNoKERyYXdPUFMubW92ZVRvLCB4LCB5LCBEcmF3T1BTLmxpbmVUbywgeHcsIHloLCBEcmF3T1BTLmNsb3NlUGF0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5tb3ZlVG8sIHgsIHksIERyYXdPUFMubGluZVRvLCB4dywgeSwgRHJhd09QUy5saW5lVG8sIHh3LCB5aCwgRHJhd09QUy5saW5lVG8sIHgsIHloLCBEcmF3T1BTLmNsb3NlUGF0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBVdGlsLnJlY3RCb3VuZGluZ0JveCh4LCB5LCB4dywgeWgsIG1pbk1heCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgT1BTLm1vdmVUbzoKICAgICAgICB7CiAgICAgICAgICBjb25zdCB4ID0gc3RhdGUuY3VycmVudFBvaW50WCA9IGFyZ3NbMF07CiAgICAgICAgICBjb25zdCB5ID0gc3RhdGUuY3VycmVudFBvaW50WSA9IGFyZ3NbMV07CiAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5tb3ZlVG8sIHgsIHkpOwogICAgICAgICAgVXRpbC5wb2ludEJvdW5kaW5nQm94KHgsIHksIG1pbk1heCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgT1BTLmxpbmVUbzoKICAgICAgICB7CiAgICAgICAgICBjb25zdCB4ID0gc3RhdGUuY3VycmVudFBvaW50WCA9IGFyZ3NbMF07CiAgICAgICAgICBjb25zdCB5ID0gc3RhdGUuY3VycmVudFBvaW50WSA9IGFyZ3NbMV07CiAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5saW5lVG8sIHgsIHkpOwogICAgICAgICAgVXRpbC5wb2ludEJvdW5kaW5nQm94KHgsIHksIG1pbk1heCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgT1BTLmN1cnZlVG86CiAgICAgICAgewogICAgICAgICAgY29uc3Qgc3RhcnRYID0gc3RhdGUuY3VycmVudFBvaW50WDsKICAgICAgICAgIGNvbnN0IHN0YXJ0WSA9IHN0YXRlLmN1cnJlbnRQb2ludFk7CiAgICAgICAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTIsIHgsIHldID0gYXJnczsKICAgICAgICAgIHN0YXRlLmN1cnJlbnRQb2ludFggPSB4OwogICAgICAgICAgc3RhdGUuY3VycmVudFBvaW50WSA9IHk7CiAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5jdXJ2ZVRvLCB4MSwgeTEsIHgyLCB5MiwgeCwgeSk7CiAgICAgICAgICBVdGlsLmJlemllckJvdW5kaW5nQm94KHN0YXJ0WCwgc3RhcnRZLCB4MSwgeTEsIHgyLCB5MiwgeCwgeSwgbWluTWF4KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBPUFMuY3VydmVUbzI6CiAgICAgICAgewogICAgICAgICAgY29uc3Qgc3RhcnRYID0gc3RhdGUuY3VycmVudFBvaW50WDsKICAgICAgICAgIGNvbnN0IHN0YXJ0WSA9IHN0YXRlLmN1cnJlbnRQb2ludFk7CiAgICAgICAgICBjb25zdCBbeDEsIHkxLCB4LCB5XSA9IGFyZ3M7CiAgICAgICAgICBzdGF0ZS5jdXJyZW50UG9pbnRYID0geDsKICAgICAgICAgIHN0YXRlLmN1cnJlbnRQb2ludFkgPSB5OwogICAgICAgICAgcGF0aEJ1ZmZlci5wdXNoKERyYXdPUFMuY3VydmVUbywgc3RhcnRYLCBzdGFydFksIHgxLCB5MSwgeCwgeSk7CiAgICAgICAgICBVdGlsLmJlemllckJvdW5kaW5nQm94KHN0YXJ0WCwgc3RhcnRZLCBzdGFydFgsIHN0YXJ0WSwgeDEsIHkxLCB4LCB5LCBtaW5NYXgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIE9QUy5jdXJ2ZVRvMzoKICAgICAgICB7CiAgICAgICAgICBjb25zdCBzdGFydFggPSBzdGF0ZS5jdXJyZW50UG9pbnRYOwogICAgICAgICAgY29uc3Qgc3RhcnRZID0gc3RhdGUuY3VycmVudFBvaW50WTsKICAgICAgICAgIGNvbnN0IFt4MSwgeTEsIHgsIHldID0gYXJnczsKICAgICAgICAgIHN0YXRlLmN1cnJlbnRQb2ludFggPSB4OwogICAgICAgICAgc3RhdGUuY3VycmVudFBvaW50WSA9IHk7CiAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5jdXJ2ZVRvLCB4MSwgeTEsIHgsIHksIHgsIHkpOwogICAgICAgICAgVXRpbC5iZXppZXJCb3VuZGluZ0JveChzdGFydFgsIHN0YXJ0WSwgeDEsIHkxLCB4LCB5LCB4LCB5LCBtaW5NYXgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIE9QUy5jbG9zZVBhdGg6CiAgICAgICAgcGF0aEJ1ZmZlci5wdXNoKERyYXdPUFMuY2xvc2VQYXRoKTsKICAgICAgICBicmVhazsKICAgIH0KICB9CiAgX2dldENvbG9yU3BhY2UoY3MsIHJlc291cmNlcywgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKICAgIHJldHVybiBDb2xvclNwYWNlVXRpbHMucGFyc2UoewogICAgICBjcywKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICByZXNvdXJjZXMsCiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeTogdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGU6IHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgYXN5bmNJZk5vdENhY2hlZDogdHJ1ZQogICAgfSk7CiAgfQogIGFzeW5jIF9oYW5kbGVDb2xvclNwYWNlKGNzUHJvbWlzZSkgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGF3YWl0IGNzUHJvbWlzZTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB3YXJuKGBfaGFuZGxlQ29sb3JTcGFjZSAtIGlnbm9yaW5nIENvbG9yU3BhY2U6ICIke2V4fSIuYCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdGhyb3cgZXg7CiAgICB9CiAgfQogIHBhcnNlU2hhZGluZyh7CiAgICBzaGFkaW5nLAogICAgcmVzb3VyY2VzLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsCiAgICBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUKICB9KSB7CiAgICBsZXQgaWQgPSBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUuZ2V0KHNoYWRpbmcpOwogICAgaWYgKGlkKSB7CiAgICAgIHJldHVybiBpZDsKICAgIH0KICAgIGxldCBwYXR0ZXJuSVI7CiAgICB0cnkgewogICAgICBjb25zdCBzaGFkaW5nRmlsbCA9IFBhdHRlcm4ucGFyc2VTaGFkaW5nKHNoYWRpbmcsIHRoaXMueHJlZiwgcmVzb3VyY2VzLCB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksIHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgIHBhdHRlcm5JUiA9IHNoYWRpbmdGaWxsLmdldElSKCk7CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB3YXJuKGBwYXJzZVNoYWRpbmcgLSBpZ25vcmluZyBzaGFkaW5nOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUuc2V0KHNoYWRpbmcsIG51bGwpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHRocm93IHJlYXNvbjsKICAgIH0KICAgIGlkID0gYHBhdHRlcm5fJHt0aGlzLmlkRmFjdG9yeS5jcmVhdGVPYmpJZCgpfWA7CiAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgIGlkID0gYCR7dGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKX1fdHlwZTNfJHtpZH1gOwogICAgfQogICAgbG9jYWxTaGFkaW5nUGF0dGVybkNhY2hlLnNldChzaGFkaW5nLCBpZCk7CiAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgIHRoaXMuaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbaWQsICJQYXR0ZXJuIiwgcGF0dGVybklSXSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmhhbmRsZXIuc2VuZCgib2JqIiwgW2lkLCB0aGlzLnBhZ2VJbmRleCwgIlBhdHRlcm4iLCBwYXR0ZXJuSVJdKTsKICAgIH0KICAgIHJldHVybiBpZDsKICB9CiAgaGFuZGxlQ29sb3JOKG9wZXJhdG9yTGlzdCwgZm4sIGFyZ3MsIGNzLCBwYXR0ZXJucywgcmVzb3VyY2VzLCB0YXNrLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUsIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZSkgewogICAgY29uc3QgcGF0dGVybk5hbWUgPSBhcmdzLnBvcCgpOwogICAgaWYgKHBhdHRlcm5OYW1lIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBjb25zdCByYXdQYXR0ZXJuID0gcGF0dGVybnMuZ2V0UmF3KHBhdHRlcm5OYW1lLm5hbWUpOwogICAgICBjb25zdCBsb2NhbFRpbGluZ1BhdHRlcm4gPSByYXdQYXR0ZXJuIGluc3RhbmNlb2YgUmVmICYmIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlLmdldEJ5UmVmKHJhd1BhdHRlcm4pOwogICAgICBpZiAobG9jYWxUaWxpbmdQYXR0ZXJuKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IGNvbG9yID0gY3MuYmFzZSA/IGNzLmJhc2UuZ2V0UmdiKGFyZ3MsIDApIDogbnVsbDsKICAgICAgICAgIGNvbnN0IHRpbGluZ1BhdHRlcm5JUiA9IGdldFRpbGluZ1BhdHRlcm5JUihsb2NhbFRpbGluZ1BhdHRlcm4ub3BlcmF0b3JMaXN0SVIsIGxvY2FsVGlsaW5nUGF0dGVybi5kaWN0LCBjb2xvcik7CiAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIHRpbGluZ1BhdHRlcm5JUik7CiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0gY2F0Y2gge30KICAgICAgfQogICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy54cmVmLmZldGNoSWZSZWYocmF3UGF0dGVybik7CiAgICAgIGlmIChwYXR0ZXJuKSB7CiAgICAgICAgY29uc3QgZGljdCA9IHBhdHRlcm4gaW5zdGFuY2VvZiBCYXNlU3RyZWFtID8gcGF0dGVybi5kaWN0IDogcGF0dGVybjsKICAgICAgICBjb25zdCB0eXBlTnVtID0gZGljdC5nZXQoIlBhdHRlcm5UeXBlIik7CiAgICAgICAgaWYgKHR5cGVOdW0gPT09IFBhdHRlcm5UeXBlLlRJTElORykgewogICAgICAgICAgY29uc3QgY29sb3IgPSBjcy5iYXNlID8gY3MuYmFzZS5nZXRSZ2IoYXJncywgMCkgOiBudWxsOwogICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlVGlsaW5nVHlwZShmbiwgY29sb3IsIHJlc291cmNlcywgcGF0dGVybiwgZGljdCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBsb2NhbFRpbGluZ1BhdHRlcm5DYWNoZSk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlTnVtID09PSBQYXR0ZXJuVHlwZS5TSEFESU5HKSB7CiAgICAgICAgICBjb25zdCBzaGFkaW5nID0gZGljdC5nZXQoIlNoYWRpbmciKTsKICAgICAgICAgIGNvbnN0IG9iaklkID0gdGhpcy5wYXJzZVNoYWRpbmcoewogICAgICAgICAgICBzaGFkaW5nLAogICAgICAgICAgICByZXNvdXJjZXMsCiAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgICBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKG9iaklkKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IGxvb2t1cE1hdHJpeChkaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgbnVsbCk7CiAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChmbiwgWyJTaGFkaW5nIiwgb2JqSWQsIG1hdHJpeF0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbmtub3duIFBhdHRlcm5UeXBlOiAke3R5cGVOdW19YCk7CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBQYXR0ZXJuTmFtZTogJHtwYXR0ZXJuTmFtZX1gKTsKICB9CiAgX3BhcnNlVmlzaWJpbGl0eUV4cHJlc3Npb24oYXJyYXksIG5lc3RpbmdDb3VudGVyLCBjdXJyZW50UmVzdWx0KSB7CiAgICBjb25zdCBNQVhfTkVTVElORyA9IDEwOwogICAgaWYgKCsrbmVzdGluZ0NvdW50ZXIgPiBNQVhfTkVTVElORykgewogICAgICB3YXJuKCJWaXNpYmlsaXR5IGV4cHJlc3Npb24gaXMgdG9vIGRlZXBseSBuZXN0ZWQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgY29uc3Qgb3BlcmF0b3IgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihhcnJheVswXSk7CiAgICBpZiAobGVuZ3RoIDwgMiB8fCAhKG9wZXJhdG9yIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgd2FybigiSW52YWxpZCB2aXNpYmlsaXR5IGV4cHJlc3Npb24iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3dpdGNoIChvcGVyYXRvci5uYW1lKSB7CiAgICAgIGNhc2UgIkFuZCI6CiAgICAgIGNhc2UgIk9yIjoKICAgICAgY2FzZSAiTm90IjoKICAgICAgICBjdXJyZW50UmVzdWx0LnB1c2gob3BlcmF0b3IubmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgd2FybihgSW52YWxpZCBvcGVyYXRvciAke29wZXJhdG9yLm5hbWV9IGluIHZpc2liaWxpdHkgZXhwcmVzc2lvbmApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgcmF3ID0gYXJyYXlbaV07CiAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHJhdyk7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHsKICAgICAgICBjb25zdCBuZXN0ZWRSZXN1bHQgPSBbXTsKICAgICAgICBjdXJyZW50UmVzdWx0LnB1c2gobmVzdGVkUmVzdWx0KTsKICAgICAgICB0aGlzLl9wYXJzZVZpc2liaWxpdHlFeHByZXNzaW9uKG9iamVjdCwgbmVzdGluZ0NvdW50ZXIsIG5lc3RlZFJlc3VsdCk7CiAgICAgIH0gZWxzZSBpZiAocmF3IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgY3VycmVudFJlc3VsdC5wdXNoKHJhdy50b1N0cmluZygpKTsKICAgICAgfQogICAgfQogIH0KICBhc3luYyBwYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhjb250ZW50UHJvcGVydGllcywgcmVzb3VyY2VzKSB7CiAgICBsZXQgb3B0aW9uYWxDb250ZW50OwogICAgaWYgKGNvbnRlbnRQcm9wZXJ0aWVzIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBjb25zdCBwcm9wZXJ0aWVzID0gcmVzb3VyY2VzLmdldCgiUHJvcGVydGllcyIpOwogICAgICBvcHRpb25hbENvbnRlbnQgPSBwcm9wZXJ0aWVzLmdldChjb250ZW50UHJvcGVydGllcy5uYW1lKTsKICAgIH0gZWxzZSBpZiAoY29udGVudFByb3BlcnRpZXMgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGNvbnRlbnRQcm9wZXJ0aWVzOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJPcHRpb25hbCBjb250ZW50IHByb3BlcnRpZXMgbWFsZm9ybWVkLiIpOwogICAgfQogICAgY29uc3Qgb3B0aW9uYWxDb250ZW50VHlwZSA9IG9wdGlvbmFsQ29udGVudC5nZXQoIlR5cGUiKT8ubmFtZTsKICAgIGlmIChvcHRpb25hbENvbnRlbnRUeXBlID09PSAiT0NHIikgewogICAgICByZXR1cm4gewogICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsCiAgICAgICAgaWQ6IG9wdGlvbmFsQ29udGVudC5vYmpJZAogICAgICB9OwogICAgfSBlbHNlIGlmIChvcHRpb25hbENvbnRlbnRUeXBlID09PSAiT0NNRCIpIHsKICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IG9wdGlvbmFsQ29udGVudC5nZXQoIlZFIik7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cHJlc3Npb24pKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgICAgdGhpcy5fcGFyc2VWaXNpYmlsaXR5RXhwcmVzc2lvbihleHByZXNzaW9uLCAwLCByZXN1bHQpOwogICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdHlwZTogIk9DTUQiLAogICAgICAgICAgICBleHByZXNzaW9uOiByZXN1bHQKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IG9wdGlvbmFsQ29udGVudEdyb3VwcyA9IG9wdGlvbmFsQ29udGVudC5nZXQoIk9DR3MiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uYWxDb250ZW50R3JvdXBzKSB8fCBvcHRpb25hbENvbnRlbnRHcm91cHMgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgY29uc3QgZ3JvdXBJZHMgPSBbXTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25hbENvbnRlbnRHcm91cHMpKSB7CiAgICAgICAgICBmb3IgKGNvbnN0IG9jZyBvZiBvcHRpb25hbENvbnRlbnRHcm91cHMpIHsKICAgICAgICAgICAgZ3JvdXBJZHMucHVzaChvY2cudG9TdHJpbmcoKSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGdyb3VwSWRzLnB1c2gob3B0aW9uYWxDb250ZW50R3JvdXBzLm9iaklkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsCiAgICAgICAgICBpZHM6IGdyb3VwSWRzLAogICAgICAgICAgcG9saWN5OiBvcHRpb25hbENvbnRlbnQuZ2V0KCJQIikgaW5zdGFuY2VvZiBOYW1lID8gb3B0aW9uYWxDb250ZW50LmdldCgiUCIpLm5hbWUgOiBudWxsLAogICAgICAgICAgZXhwcmVzc2lvbjogbnVsbAogICAgICAgIH07CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWxDb250ZW50R3JvdXBzIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsCiAgICAgICAgICBpZDogb3B0aW9uYWxDb250ZW50R3JvdXBzLnRvU3RyaW5nKCkKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZ2V0T3BlcmF0b3JMaXN0KHsKICAgIHN0cmVhbSwKICAgIHRhc2ssCiAgICByZXNvdXJjZXMsCiAgICBvcGVyYXRvckxpc3QsCiAgICBpbml0aWFsU3RhdGUgPSBudWxsLAogICAgZmFsbGJhY2tGb250RGljdCA9IG51bGwKICB9KSB7CiAgICByZXNvdXJjZXMgfHw9IERpY3QuZW1wdHk7CiAgICBpbml0aWFsU3RhdGUgfHw9IG5ldyBFdmFsU3RhdGUoKTsKICAgIGlmICghb3BlcmF0b3JMaXN0KSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0T3BlcmF0b3JMaXN0OiBtaXNzaW5nICJvcGVyYXRvckxpc3QiIHBhcmFtZXRlcicpOwogICAgfQogICAgY29uc3Qgc2VsZiA9IHRoaXM7CiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOwogICAgY29uc3QgbG9jYWxJbWFnZUNhY2hlID0gbmV3IExvY2FsSW1hZ2VDYWNoZSgpOwogICAgY29uc3QgbG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBuZXcgTG9jYWxDb2xvclNwYWNlQ2FjaGUoKTsKICAgIGNvbnN0IGxvY2FsR1N0YXRlQ2FjaGUgPSBuZXcgTG9jYWxHU3RhdGVDYWNoZSgpOwogICAgY29uc3QgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUgPSBuZXcgTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUoKTsKICAgIGNvbnN0IGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZSA9IG5ldyBNYXAoKTsKICAgIGNvbnN0IHhvYmpzID0gcmVzb3VyY2VzLmdldCgiWE9iamVjdCIpIHx8IERpY3QuZW1wdHk7CiAgICBjb25zdCBwYXR0ZXJucyA9IHJlc291cmNlcy5nZXQoIlBhdHRlcm4iKSB8fCBEaWN0LmVtcHR5OwogICAgY29uc3Qgc3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcihpbml0aWFsU3RhdGUpOwogICAgY29uc3QgcHJlcHJvY2Vzc29yID0gbmV3IEV2YWx1YXRvclByZXByb2Nlc3NvcihzdHJlYW0sIHhyZWYsIHN0YXRlTWFuYWdlcik7CiAgICBjb25zdCB0aW1lU2xvdE1hbmFnZXIgPSBuZXcgVGltZVNsb3RNYW5hZ2VyKCk7CiAgICBmdW5jdGlvbiBjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKGFyZ3VtZW50KSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHByZXByb2Nlc3Nvci5zYXZlZFN0YXRlc0RlcHRoOyBpIDwgaWk7IGkrKykgewogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucmVzdG9yZSwgW10pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIGNvbnN0IG5leHQgPSBmdW5jdGlvbiAocHJvbWlzZSkgewogICAgICAgIFByb21pc2UuYWxsKFtwcm9taXNlLCBvcGVyYXRvckxpc3QucmVhZHldKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHByb21pc2VCb2R5KHJlc29sdmUsIHJlamVjdCk7CiAgICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgICByZWplY3QoZXgpOwogICAgICAgICAgfQogICAgICAgIH0sIHJlamVjdCk7CiAgICAgIH07CiAgICAgIHRhc2suZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICB0aW1lU2xvdE1hbmFnZXIucmVzZXQoKTsKICAgICAgY29uc3Qgb3BlcmF0aW9uID0ge307CiAgICAgIGxldCBzdG9wLCBpLCBpaSwgY3MsIG5hbWUsIGlzVmFsaWROYW1lOwogICAgICB3aGlsZSAoIShzdG9wID0gdGltZVNsb3RNYW5hZ2VyLmNoZWNrKCkpKSB7CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBudWxsOwogICAgICAgIGlmICghcHJlcHJvY2Vzc29yLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGxldCBhcmdzID0gb3BlcmF0aW9uLmFyZ3M7CiAgICAgICAgbGV0IGZuID0gb3BlcmF0aW9uLmZuOwogICAgICAgIHN3aXRjaCAoZm4gfCAwKSB7CiAgICAgICAgICBjYXNlIE9QUy5wYWludFhPYmplY3Q6CiAgICAgICAgICAgIGlzVmFsaWROYW1lID0gYXJnc1swXSBpbnN0YW5jZW9mIE5hbWU7CiAgICAgICAgICAgIG5hbWUgPSBhcmdzWzBdLm5hbWU7CiAgICAgICAgICAgIGlmIChpc1ZhbGlkTmFtZSkgewogICAgICAgICAgICAgIGNvbnN0IGxvY2FsSW1hZ2UgPSBsb2NhbEltYWdlQ2FjaGUuZ2V0QnlOYW1lKG5hbWUpOwogICAgICAgICAgICAgIGlmIChsb2NhbEltYWdlKSB7CiAgICAgICAgICAgICAgICBhZGRMb2NhbGx5Q2FjaGVkSW1hZ2VPcHMob3BlcmF0b3JMaXN0LCBsb2NhbEltYWdlKTsKICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVYT2JqZWN0LCByZWplY3RYT2JqZWN0KSB7CiAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbGV0IHhvYmogPSB4b2Jqcy5nZXRSYXcobmFtZSk7CiAgICAgICAgICAgICAgaWYgKHhvYmogaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsSW1hZ2UgPSBsb2NhbEltYWdlQ2FjaGUuZ2V0QnlSZWYoeG9iaikgfHwgc2VsZi5fcmVnaW9uYWxJbWFnZUNhY2hlLmdldEJ5UmVmKHhvYmopOwogICAgICAgICAgICAgICAgaWYgKGxvY2FsSW1hZ2UpIHsKICAgICAgICAgICAgICAgICAgYWRkTG9jYWxseUNhY2hlZEltYWdlT3BzKG9wZXJhdG9yTGlzdCwgbG9jYWxJbWFnZSk7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbEltYWdlID0gc2VsZi5nbG9iYWxJbWFnZUNhY2hlLmdldERhdGEoeG9iaiwgc2VsZi5wYWdlSW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKGdsb2JhbEltYWdlKSB7CiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KGdsb2JhbEltYWdlLm9iaklkKTsKICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZEltYWdlT3BzKGdsb2JhbEltYWdlLmZuLCBnbG9iYWxJbWFnZS5hcmdzLCBnbG9iYWxJbWFnZS5vcHRpb25hbENvbnRlbnQsIGdsb2JhbEltYWdlLmhhc01hc2spOwogICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOwogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB4b2JqID0geHJlZi5mZXRjaCh4b2JqKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCEoeG9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB4b2JqLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CiAgICAgICAgICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGhhdmUgYSBOYW1lIHN1YnR5cGUiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHR5cGUubmFtZSA9PT0gIkZvcm0iKSB7CiAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc2F2ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5idWlsZEZvcm1YT2JqZWN0KHJlc291cmNlcywgeG9iaiwgbnVsbCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIuc3RhdGUuY2xvbmUoewogICAgICAgICAgICAgICAgICBuZXdQYXRoOiB0cnVlCiAgICAgICAgICAgICAgICB9KSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIucmVzdG9yZSgpOwogICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOwogICAgICAgICAgICAgICAgfSwgcmVqZWN0WE9iamVjdCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLm5hbWUgPT09ICJJbWFnZSIpIHsKICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRQYWludEltYWdlWE9iamVjdCh7CiAgICAgICAgICAgICAgICAgIHJlc291cmNlcywKICAgICAgICAgICAgICAgICAgaW1hZ2U6IHhvYmosCiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCwKICAgICAgICAgICAgICAgICAgY2FjaGVLZXk6IG5hbWUsCiAgICAgICAgICAgICAgICAgIGxvY2FsSW1hZ2VDYWNoZSwKICAgICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5uYW1lID09PSAiUFMiKSB7CiAgICAgICAgICAgICAgICBpbmZvKCJJZ25vcmVkIFhPYmplY3Qgc3VidHlwZSBQUyIpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVuaGFuZGxlZCBYT2JqZWN0IHN1YnR5cGUgJHt0eXBlLm5hbWV9YCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgICAgICAgIHdhcm4oYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIFhPYmplY3Q6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuc2V0Rm9udDoKICAgICAgICAgICAgY29uc3QgZm9udFNpemUgPSBhcmdzWzFdOwogICAgICAgICAgICBuZXh0KHNlbGYuaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIGFyZ3MsIG51bGwsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLnN0YXRlLCBmYWxsYmFja0ZvbnREaWN0KS50aGVuKGZ1bmN0aW9uIChsb2FkZWROYW1lKSB7CiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY3kobG9hZGVkTmFtZSk7CiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5zZXRGb250LCBbbG9hZGVkTmFtZSwgZm9udFNpemVdKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjYXNlIE9QUy5lbmRJbmxpbmVJbWFnZToKICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBhcmdzWzBdLmNhY2hlS2V5OwogICAgICAgICAgICBpZiAoY2FjaGVLZXkpIHsKICAgICAgICAgICAgICBjb25zdCBsb2NhbEltYWdlID0gbG9jYWxJbWFnZUNhY2hlLmdldEJ5TmFtZShjYWNoZUtleSk7CiAgICAgICAgICAgICAgaWYgKGxvY2FsSW1hZ2UpIHsKICAgICAgICAgICAgICAgIGFkZExvY2FsbHlDYWNoZWRJbWFnZU9wcyhvcGVyYXRvckxpc3QsIGxvY2FsSW1hZ2UpOwogICAgICAgICAgICAgICAgYXJncyA9IG51bGw7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dChzZWxmLmJ1aWxkUGFpbnRJbWFnZVhPYmplY3QoewogICAgICAgICAgICAgIHJlc291cmNlcywKICAgICAgICAgICAgICBpbWFnZTogYXJnc1swXSwKICAgICAgICAgICAgICBpc0lubGluZTogdHJ1ZSwKICAgICAgICAgICAgICBvcGVyYXRvckxpc3QsCiAgICAgICAgICAgICAgY2FjaGVLZXksCiAgICAgICAgICAgICAgbG9jYWxJbWFnZUNhY2hlLAogICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFyZ3NbMF0gPSBzZWxmLmhhbmRsZVRleHQoYXJnc1swXSwgc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zaG93U3BhY2VkVGV4dDoKICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgewogICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY29tYmluZWRHbHlwaHMgPSBbXSwKICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlTWFuYWdlci5zdGF0ZTsKICAgICAgICAgICAgZm9yIChjb25zdCBhcnJJdGVtIG9mIGFyZ3NbMF0pIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyckl0ZW0gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICBjb21iaW5lZEdseXBocy5wdXNoKC4uLnNlbGYuaGFuZGxlVGV4dChhcnJJdGVtLCBzdGF0ZSkpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyckl0ZW0gPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgICBjb21iaW5lZEdseXBocy5wdXNoKGFyckl0ZW0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzWzBdID0gY29tYmluZWRHbHlwaHM7CiAgICAgICAgICAgIGZuID0gT1BTLnNob3dUZXh0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lU2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMubmV4dExpbmUpOwogICAgICAgICAgICBhcmdzWzBdID0gc2VsZi5oYW5kbGVUZXh0KGFyZ3NbMF0sIHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgIGZuID0gT1BTLnNob3dUZXh0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OgogICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLm5leHRMaW5lKTsKICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5zZXRXb3JkU3BhY2luZywgW2FyZ3Muc2hpZnQoKV0pOwogICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldENoYXJTcGFjaW5nLCBbYXJncy5zaGlmdCgpXSk7CiAgICAgICAgICAgIGFyZ3NbMF0gPSBzZWxmLmhhbmRsZVRleHQoYXJnc1swXSwgc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgZm4gPSBPUFMuc2hvd1RleHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dFJlbmRlcmluZ01vZGU6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS50ZXh0UmVuZGVyaW5nTW9kZSA9IGFyZ3NbMF07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yU3BhY2U6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjb25zdCBmaWxsQ1MgPSBzZWxmLl9nZXRDb2xvclNwYWNlKGFyZ3NbMF0sIHJlc291cmNlcywgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOwogICAgICAgICAgICAgIGlmIChmaWxsQ1MgaW5zdGFuY2VvZiBDb2xvclNwYWNlKSB7CiAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBmaWxsQ1M7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbmV4dChzZWxmLl9oYW5kbGVDb2xvclNwYWNlKGZpbGxDUykudGhlbihjb2xvclNwYWNlID0+IHsKICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IGNvbG9yU3BhY2UgfHwgQ29sb3JTcGFjZVV0aWxzLmdyYXk7CiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ29sb3JTcGFjZToKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNvbnN0IHN0cm9rZUNTID0gc2VsZi5fZ2V0Q29sb3JTcGFjZShhcmdzWzBdLCByZXNvdXJjZXMsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKICAgICAgICAgICAgICBpZiAoc3Ryb2tlQ1MgaW5zdGFuY2VvZiBDb2xvclNwYWNlKSB7CiAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IHN0cm9rZUNTOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG5leHQoc2VsZi5faGFuZGxlQ29sb3JTcGFjZShzdHJva2VDUykudGhlbihjb2xvclNwYWNlID0+IHsKICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gY29sb3JTcGFjZSB8fCBDb2xvclNwYWNlVXRpbHMuZ3JheTsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3I6CiAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlOwogICAgICAgICAgICBhcmdzID0gY3MuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRGaWxsUkdCQ29sb3I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ29sb3I6CiAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U7CiAgICAgICAgICAgIGFyZ3MgPSBjcy5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxHcmF5OgogICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBDb2xvclNwYWNlVXRpbHMuZ3JheTsKICAgICAgICAgICAgYXJncyA9IENvbG9yU3BhY2VVdGlscy5ncmF5LmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgZm4gPSBPUFMuc2V0RmlsbFJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUdyYXk6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZVV0aWxzLmdyYXk7CiAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlVXRpbHMuZ3JheS5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxDTVlLQ29sb3I6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IENvbG9yU3BhY2VVdGlscy5jbXlrOwogICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZVV0aWxzLmNteWsuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRGaWxsUkdCQ29sb3I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yOgogICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IENvbG9yU3BhY2VVdGlscy5jbXlrOwogICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZVV0aWxzLmNteWsuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VSR0JDb2xvcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsUkdCQ29sb3I6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IENvbG9yU3BhY2VVdGlscy5yZ2I7CiAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlVXRpbHMucmdiLmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VSR0JDb2xvcjoKICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBDb2xvclNwYWNlVXRpbHMucmdiOwogICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZVV0aWxzLnJnYi5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yTjoKICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUucGF0dGVybkZpbGxDb2xvclNwYWNlOwogICAgICAgICAgICBpZiAoIWNzKSB7CiAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyQXJyYXkoYXJncywgbnVsbCkpIHsKICAgICAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlVXRpbHMuZ3JheS5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgICAgICBmbiA9IE9QUy5zZXRGaWxsUkdCQ29sb3I7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYXJncyA9IFtdOwogICAgICAgICAgICAgIGZuID0gT1BTLnNldEZpbGxUcmFuc3BhcmVudDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3MubmFtZSA9PT0gIlBhdHRlcm4iKSB7CiAgICAgICAgICAgICAgbmV4dChzZWxmLmhhbmRsZUNvbG9yTihvcGVyYXRvckxpc3QsIE9QUy5zZXRGaWxsQ29sb3JOLCBhcmdzLCBjcywgcGF0dGVybnMsIHJlc291cmNlcywgdGFzaywgbG9jYWxDb2xvclNwYWNlQ2FjaGUsIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlLCBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUpKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgZm4gPSBPUFMuc2V0RmlsbFJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yTjoKICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUucGF0dGVyblN0cm9rZUNvbG9yU3BhY2U7CiAgICAgICAgICAgIGlmICghY3MpIHsKICAgICAgICAgICAgICBpZiAoaXNOdW1iZXJBcnJheShhcmdzLCBudWxsKSkgewogICAgICAgICAgICAgICAgYXJncyA9IENvbG9yU3BhY2VVdGlscy5ncmF5LmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGFyZ3MgPSBbXTsKICAgICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VUcmFuc3BhcmVudDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3MubmFtZSA9PT0gIlBhdHRlcm4iKSB7CiAgICAgICAgICAgICAgbmV4dChzZWxmLmhhbmRsZUNvbG9yTihvcGVyYXRvckxpc3QsIE9QUy5zZXRTdHJva2VDb2xvck4sIGFyZ3MsIGNzLCBwYXR0ZXJucywgcmVzb3VyY2VzLCB0YXNrLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUsIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZSkpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzID0gY3MuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VSR0JDb2xvcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zaGFkaW5nRmlsbDoKICAgICAgICAgICAgbGV0IHNoYWRpbmc7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgY29uc3Qgc2hhZGluZ1JlcyA9IHJlc291cmNlcy5nZXQoIlNoYWRpbmciKTsKICAgICAgICAgICAgICBpZiAoIXNoYWRpbmdSZXMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gc2hhZGluZyByZXNvdXJjZSBmb3VuZCIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzaGFkaW5nID0gc2hhZGluZ1Jlcy5nZXQoYXJnc1swXS5uYW1lKTsKICAgICAgICAgICAgICBpZiAoIXNoYWRpbmcpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gc2hhZGluZyBvYmplY3QgZm91bmQiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICAgICAgICB3YXJuKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBTaGFkaW5nOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcGF0dGVybklkID0gc2VsZi5wYXJzZVNoYWRpbmcoewogICAgICAgICAgICAgIHNoYWRpbmcsCiAgICAgICAgICAgICAgcmVzb3VyY2VzLAogICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgICAgIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKCFwYXR0ZXJuSWQpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzID0gW3BhdHRlcm5JZF07CiAgICAgICAgICAgIGZuID0gT1BTLnNoYWRpbmdGaWxsOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEdTdGF0ZToKICAgICAgICAgICAgaXNWYWxpZE5hbWUgPSBhcmdzWzBdIGluc3RhbmNlb2YgTmFtZTsKICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTsKICAgICAgICAgICAgaWYgKGlzVmFsaWROYW1lKSB7CiAgICAgICAgICAgICAgY29uc3QgbG9jYWxHU3RhdGVPYmogPSBsb2NhbEdTdGF0ZUNhY2hlLmdldEJ5TmFtZShuYW1lKTsKICAgICAgICAgICAgICBpZiAobG9jYWxHU3RhdGVPYmopIHsKICAgICAgICAgICAgICAgIGlmIChsb2NhbEdTdGF0ZU9iai5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuc2V0R1N0YXRlLCBbbG9jYWxHU3RhdGVPYmpdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSkgewogICAgICAgICAgICAgIGlmICghaXNWYWxpZE5hbWUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgZXh0R1N0YXRlID0gcmVzb3VyY2VzLmdldCgiRXh0R1N0YXRlIik7CiAgICAgICAgICAgICAgaWYgKCEoZXh0R1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZSA9IGV4dEdTdGF0ZS5nZXQobmFtZSk7CiAgICAgICAgICAgICAgaWYgKCEoZ1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNlbGYuc2V0R1N0YXRlKHsKICAgICAgICAgICAgICAgIHJlc291cmNlcywKICAgICAgICAgICAgICAgIGdTdGF0ZSwKICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCwKICAgICAgICAgICAgICAgIGNhY2hlS2V5OiBuYW1lLAogICAgICAgICAgICAgICAgdGFzaywKICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlciwKICAgICAgICAgICAgICAgIGxvY2FsR1N0YXRlQ2FjaGUsCiAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgICAgICAgICAgIH0pLnRoZW4ocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgd2FybihgZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgRXh0R1N0YXRlOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhyb3cgcmVhc29uOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNhc2UgT1BTLnNldExpbmVXaWR0aDoKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNvbnN0IFt0aGlja25lc3NdID0gYXJnczsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaWNrbmVzcyAhPT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgIHdhcm4oYEludmFsaWQgc2V0TGluZVdpZHRoOiAke3RoaWNrbmVzc31gKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBhcmdzWzBdID0gTWF0aC5hYnModGhpY2tuZXNzKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSBPUFMubW92ZVRvOgogICAgICAgICAgY2FzZSBPUFMubGluZVRvOgogICAgICAgICAgY2FzZSBPUFMuY3VydmVUbzoKICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG8yOgogICAgICAgICAgY2FzZSBPUFMuY3VydmVUbzM6CiAgICAgICAgICBjYXNlIE9QUy5jbG9zZVBhdGg6CiAgICAgICAgICBjYXNlIE9QUy5yZWN0YW5nbGU6CiAgICAgICAgICAgIHNlbGYuYnVpbGRQYXRoKGZuLCBhcmdzLCBzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGNhc2UgT1BTLnN0cm9rZToKICAgICAgICAgIGNhc2UgT1BTLmNsb3NlU3Ryb2tlOgogICAgICAgICAgY2FzZSBPUFMuZmlsbDoKICAgICAgICAgIGNhc2UgT1BTLmVvRmlsbDoKICAgICAgICAgIGNhc2UgT1BTLmZpbGxTdHJva2U6CiAgICAgICAgICBjYXNlIE9QUy5lb0ZpbGxTdHJva2U6CiAgICAgICAgICBjYXNlIE9QUy5jbG9zZUZpbGxTdHJva2U6CiAgICAgICAgICBjYXNlIE9QUy5jbG9zZUVPRmlsbFN0cm9rZToKICAgICAgICAgIGNhc2UgT1BTLmVuZFBhdGg6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICBzdGF0ZTogewogICAgICAgICAgICAgICAgICBwYXRoQnVmZmVyLAogICAgICAgICAgICAgICAgICBwYXRoTWluTWF4CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSA9IHN0YXRlTWFuYWdlcjsKICAgICAgICAgICAgICBpZiAoZm4gPT09IE9QUy5jbG9zZVN0cm9rZSB8fCBmbiA9PT0gT1BTLmNsb3NlRmlsbFN0cm9rZSB8fCBmbiA9PT0gT1BTLmNsb3NlRU9GaWxsU3Ryb2tlKSB7CiAgICAgICAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5jbG9zZVBhdGgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAocGF0aEJ1ZmZlci5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuY29uc3RydWN0UGF0aCwgW2ZuLCBbbnVsbF0sIG51bGxdKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5jb25zdHJ1Y3RQYXRoLCBbZm4sIFtuZXcgRmxvYXQzMkFycmF5KHBhdGhCdWZmZXIpXSwgcGF0aE1pbk1heC5zbGljZSgpXSk7CiAgICAgICAgICAgICAgICBwYXRoQnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICBwYXRoTWluTWF4LnNldChbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV0sIDApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSBPUFMubWFya1BvaW50OgogICAgICAgICAgY2FzZSBPUFMubWFya1BvaW50UHJvcHM6CiAgICAgICAgICBjYXNlIE9QUy5iZWdpbkNvbXBhdDoKICAgICAgICAgIGNhc2UgT1BTLmVuZENvbXBhdDoKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICBjYXNlIE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wczoKICAgICAgICAgICAgaWYgKCEoYXJnc1swXSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgICAgICAgd2FybihgRXhwZWN0ZWQgbmFtZSBmb3IgYmVnaW5NYXJrZWRDb250ZW50UHJvcHMgYXJnMD0ke2FyZ3NbMF19YCk7CiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG51bGxdKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJnc1swXS5uYW1lID09PSAiT0MiKSB7CiAgICAgICAgICAgICAgbmV4dChzZWxmLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGFyZ3NbMV0sIHJlc291cmNlcykudGhlbihkYXRhID0+IHsKICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBkYXRhXSk7CiAgICAgICAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgICB3YXJuKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBiZWdpbk1hcmtlZENvbnRlbnRQcm9wczogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBudWxsXSk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFyZ3MgPSBbYXJnc1swXS5uYW1lLCBhcmdzWzFdIGluc3RhbmNlb2YgRGljdCA/IGFyZ3NbMV0uZ2V0KCJNQ0lEIikgOiBudWxsXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5iZWdpbk1hcmtlZENvbnRlbnQ6CiAgICAgICAgICBjYXNlIE9QUy5lbmRNYXJrZWRDb250ZW50OgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgaWYgKGFyZ3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGFyZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaSA8IGlpKSB7CiAgICAgICAgICAgICAgICB3YXJuKCJnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBvcGVyYXRvcjogIiArIGZuKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIGFyZ3MpOwogICAgICB9CiAgICAgIGlmIChzdG9wKSB7CiAgICAgICAgbmV4dChkZWZlcnJlZCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoKTsKICAgICAgcmVzb2x2ZSgpOwogICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgd2FybihgZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgZXJyb3JzIGR1cmluZyAiJHt0YXNrLm5hbWV9IiBgICsgYHRhc2s6ICIke3JlYXNvbn0iLmApOwogICAgICAgIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIGdldFRleHRDb250ZW50KHsKICAgIHN0cmVhbSwKICAgIHRhc2ssCiAgICByZXNvdXJjZXMsCiAgICBzdGF0ZU1hbmFnZXIgPSBudWxsLAogICAgaW5jbHVkZU1hcmtlZENvbnRlbnQgPSBmYWxzZSwKICAgIHNpbmssCiAgICBzZWVuU3R5bGVzID0gbmV3IFNldCgpLAogICAgdmlld0JveCwKICAgIGxhbmcgPSBudWxsLAogICAgbWFya2VkQ29udGVudERhdGEgPSBudWxsLAogICAgZGlzYWJsZU5vcm1hbGl6YXRpb24gPSBmYWxzZSwKICAgIGtlZXBXaGl0ZVNwYWNlID0gZmFsc2UKICB9KSB7CiAgICByZXNvdXJjZXMgfHw9IERpY3QuZW1wdHk7CiAgICBzdGF0ZU1hbmFnZXIgfHw9IG5ldyBTdGF0ZU1hbmFnZXIobmV3IFRleHRTdGF0ZSgpKTsKICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICBtYXJrZWRDb250ZW50RGF0YSB8fD0gewogICAgICAgIGxldmVsOiAwCiAgICAgIH07CiAgICB9CiAgICBjb25zdCB0ZXh0Q29udGVudCA9IHsKICAgICAgaXRlbXM6IFtdLAogICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgIGxhbmcKICAgIH07CiAgICBjb25zdCB0ZXh0Q29udGVudEl0ZW0gPSB7CiAgICAgIGluaXRpYWxpemVkOiBmYWxzZSwKICAgICAgc3RyOiBbXSwKICAgICAgdG90YWxXaWR0aDogMCwKICAgICAgdG90YWxIZWlnaHQ6IDAsCiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAsCiAgICAgIHZlcnRpY2FsOiBmYWxzZSwKICAgICAgcHJldlRyYW5zZm9ybTogbnVsbCwKICAgICAgdGV4dEFkdmFuY2VTY2FsZTogMCwKICAgICAgc3BhY2VJbkZsb3dNaW46IDAsCiAgICAgIHNwYWNlSW5GbG93TWF4OiAwLAogICAgICB0cmFja2luZ1NwYWNlTWluOiBJbmZpbml0eSwKICAgICAgbmVnYXRpdmVTcGFjZU1heDogLUluZmluaXR5LAogICAgICBub3RBU3BhY2U6IC1JbmZpbml0eSwKICAgICAgdHJhbnNmb3JtOiBudWxsLAogICAgICBmb250TmFtZTogbnVsbCwKICAgICAgaGFzRU9MOiBmYWxzZQogICAgfTsKICAgIGNvbnN0IHR3b0xhc3RDaGFycyA9IFsiICIsICIgIl07CiAgICBsZXQgdHdvTGFzdENoYXJzUG9zID0gMDsKICAgIGZ1bmN0aW9uIHNhdmVMYXN0Q2hhcihjaGFyKSB7CiAgICAgIGNvbnN0IG5leHRQb3MgPSAodHdvTGFzdENoYXJzUG9zICsgMSkgJSAyOwogICAgICBjb25zdCByZXQgPSB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSAhPT0gIiAiICYmIHR3b0xhc3RDaGFyc1tuZXh0UG9zXSA9PT0gIiAiOwogICAgICB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSA9IGNoYXI7CiAgICAgIHR3b0xhc3RDaGFyc1BvcyA9IG5leHRQb3M7CiAgICAgIHJldHVybiAha2VlcFdoaXRlU3BhY2UgJiYgcmV0OwogICAgfQogICAgZnVuY3Rpb24gc2hvdWxkQWRkV2hpdGVwc2FjZSgpIHsKICAgICAgcmV0dXJuICFrZWVwV2hpdGVTcGFjZSAmJiB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSAhPT0gIiAiICYmIHR3b0xhc3RDaGFyc1sodHdvTGFzdENoYXJzUG9zICsgMSkgJSAyXSA9PT0gIiAiOwogICAgfQogICAgZnVuY3Rpb24gcmVzZXRMYXN0Q2hhcnMoKSB7CiAgICAgIHR3b0xhc3RDaGFyc1swXSA9IHR3b0xhc3RDaGFyc1sxXSA9ICIgIjsKICAgICAgdHdvTGFzdENoYXJzUG9zID0gMDsKICAgIH0KICAgIGNvbnN0IFRSQUNLSU5HX1NQQUNFX0ZBQ1RPUiA9IDAuMTAyOwogICAgY29uc3QgTk9UX0FfU1BBQ0VfRkFDVE9SID0gMC4wMzsKICAgIGNvbnN0IE5FR0FUSVZFX1NQQUNFX0ZBQ1RPUiA9IC0wLjI7CiAgICBjb25zdCBTUEFDRV9JTl9GTE9XX01JTl9GQUNUT1IgPSAwLjEwMjsKICAgIGNvbnN0IFNQQUNFX0lOX0ZMT1dfTUFYX0ZBQ1RPUiA9IDAuNjsKICAgIGNvbnN0IFZFUlRJQ0FMX1NISUZUX1JBVElPID0gMC4yNTsKICAgIGNvbnN0IHNlbGYgPSB0aGlzOwogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGNvbnN0IHNob3dTcGFjZWRUZXh0QnVmZmVyID0gW107CiAgICBsZXQgeG9ianMgPSBudWxsOwogICAgY29uc3QgZW1wdHlYT2JqZWN0Q2FjaGUgPSBuZXcgTG9jYWxJbWFnZUNhY2hlKCk7CiAgICBjb25zdCBlbXB0eUdTdGF0ZUNhY2hlID0gbmV3IExvY2FsR1N0YXRlQ2FjaGUoKTsKICAgIGNvbnN0IHByZXByb2Nlc3NvciA9IG5ldyBFdmFsdWF0b3JQcmVwcm9jZXNzb3Ioc3RyZWFtLCB4cmVmLCBzdGF0ZU1hbmFnZXIpOwogICAgbGV0IHRleHRTdGF0ZTsKICAgIGZ1bmN0aW9uIHB1c2hXaGl0ZXNwYWNlKHsKICAgICAgd2lkdGggPSAwLAogICAgICBoZWlnaHQgPSAwLAogICAgICB0cmFuc2Zvcm0gPSB0ZXh0Q29udGVudEl0ZW0ucHJldlRyYW5zZm9ybSwKICAgICAgZm9udE5hbWUgPSB0ZXh0Q29udGVudEl0ZW0uZm9udE5hbWUKICAgIH0pIHsKICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaCh7CiAgICAgICAgc3RyOiAiICIsCiAgICAgICAgZGlyOiAibHRyIiwKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgdHJhbnNmb3JtLAogICAgICAgIGZvbnROYW1lLAogICAgICAgIGhhc0VPTDogZmFsc2UKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRDdXJyZW50VGV4dFRyYW5zZm9ybSgpIHsKICAgICAgY29uc3QgZm9udCA9IHRleHRTdGF0ZS5mb250OwogICAgICBjb25zdCB0c20gPSBbdGV4dFN0YXRlLmZvbnRTaXplICogdGV4dFN0YXRlLnRleHRIU2NhbGUsIDAsIDAsIHRleHRTdGF0ZS5mb250U2l6ZSwgMCwgdGV4dFN0YXRlLnRleHRSaXNlXTsKICAgICAgaWYgKGZvbnQuaXNUeXBlM0ZvbnQgJiYgKHRleHRTdGF0ZS5mb250U2l6ZSA8PSAxIHx8IGZvbnQuaXNDaGFyQkJveCkgJiYgIWlzQXJyYXlFcXVhbCh0ZXh0U3RhdGUuZm9udE1hdHJpeCwgRk9OVF9JREVOVElUWV9NQVRSSVgpKSB7CiAgICAgICAgY29uc3QgZ2x5cGhIZWlnaHQgPSBmb250LmJib3hbM10gLSBmb250LmJib3hbMV07CiAgICAgICAgaWYgKGdseXBoSGVpZ2h0ID4gMCkgewogICAgICAgICAgdHNtWzNdICo9IGdseXBoSGVpZ2h0ICogdGV4dFN0YXRlLmZvbnRNYXRyaXhbM107CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBVdGlsLnRyYW5zZm9ybSh0ZXh0U3RhdGUuY3RtLCBVdGlsLnRyYW5zZm9ybSh0ZXh0U3RhdGUudGV4dE1hdHJpeCwgdHNtKSk7CiAgICB9CiAgICBmdW5jdGlvbiBlbnN1cmVUZXh0Q29udGVudEl0ZW0oKSB7CiAgICAgIGlmICh0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQpIHsKICAgICAgICByZXR1cm4gdGV4dENvbnRlbnRJdGVtOwogICAgICB9CiAgICAgIGNvbnN0IHsKICAgICAgICBmb250LAogICAgICAgIGxvYWRlZE5hbWUKICAgICAgfSA9IHRleHRTdGF0ZTsKICAgICAgaWYgKCFzZWVuU3R5bGVzLmhhcyhsb2FkZWROYW1lKSkgewogICAgICAgIHNlZW5TdHlsZXMuYWRkKGxvYWRlZE5hbWUpOwogICAgICAgIHRleHRDb250ZW50LnN0eWxlc1tsb2FkZWROYW1lXSA9IHsKICAgICAgICAgIGZvbnRGYW1pbHk6IGZvbnQuZmFsbGJhY2tOYW1lLAogICAgICAgICAgYXNjZW50OiBmb250LmFzY2VudCwKICAgICAgICAgIGRlc2NlbnQ6IGZvbnQuZGVzY2VudCwKICAgICAgICAgIHZlcnRpY2FsOiBmb250LnZlcnRpY2FsCiAgICAgICAgfTsKICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMgJiYgZm9udC5zeXN0ZW1Gb250SW5mbykgewogICAgICAgICAgY29uc3Qgc3R5bGUgPSB0ZXh0Q29udGVudC5zdHlsZXNbbG9hZGVkTmFtZV07CiAgICAgICAgICBzdHlsZS5mb250U3Vic3RpdHV0aW9uID0gZm9udC5zeXN0ZW1Gb250SW5mby5jc3M7CiAgICAgICAgICBzdHlsZS5mb250U3Vic3RpdHV0aW9uTG9hZGVkTmFtZSA9IGZvbnQuc3lzdGVtRm9udEluZm8ubG9hZGVkTmFtZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGV4dENvbnRlbnRJdGVtLmZvbnROYW1lID0gbG9hZGVkTmFtZTsKICAgICAgY29uc3QgdHJtID0gdGV4dENvbnRlbnRJdGVtLnRyYW5zZm9ybSA9IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7CiAgICAgIGlmICghZm9udC52ZXJ0aWNhbCkgewogICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCA9IHRleHRDb250ZW50SXRlbS50b3RhbFdpZHRoID0gMDsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ID0gdGV4dENvbnRlbnRJdGVtLnRvdGFsSGVpZ2h0ID0gTWF0aC5oeXBvdCh0cm1bMl0sIHRybVszXSk7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnZlcnRpY2FsID0gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoID0gdGV4dENvbnRlbnRJdGVtLnRvdGFsV2lkdGggPSBNYXRoLmh5cG90KHRybVswXSwgdHJtWzFdKTsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ID0gdGV4dENvbnRlbnRJdGVtLnRvdGFsSGVpZ2h0ID0gMDsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0udmVydGljYWwgPSB0cnVlOwogICAgICB9CiAgICAgIGNvbnN0IHNjYWxlTGluZVggPSBNYXRoLmh5cG90KHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeFswXSwgdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4WzFdKTsKICAgICAgY29uc3Qgc2NhbGVDdG1YID0gTWF0aC5oeXBvdCh0ZXh0U3RhdGUuY3RtWzBdLCB0ZXh0U3RhdGUuY3RtWzFdKTsKICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUgPSBzY2FsZUN0bVggKiBzY2FsZUxpbmVYOwogICAgICBjb25zdCB7CiAgICAgICAgZm9udFNpemUKICAgICAgfSA9IHRleHRTdGF0ZTsKICAgICAgdGV4dENvbnRlbnRJdGVtLnRyYWNraW5nU3BhY2VNaW4gPSBmb250U2l6ZSAqIFRSQUNLSU5HX1NQQUNFX0ZBQ1RPUjsKICAgICAgdGV4dENvbnRlbnRJdGVtLm5vdEFTcGFjZSA9IGZvbnRTaXplICogTk9UX0FfU1BBQ0VfRkFDVE9SOwogICAgICB0ZXh0Q29udGVudEl0ZW0ubmVnYXRpdmVTcGFjZU1heCA9IGZvbnRTaXplICogTkVHQVRJVkVfU1BBQ0VfRkFDVE9SOwogICAgICB0ZXh0Q29udGVudEl0ZW0uc3BhY2VJbkZsb3dNaW4gPSBmb250U2l6ZSAqIFNQQUNFX0lOX0ZMT1dfTUlOX0ZBQ1RPUjsKICAgICAgdGV4dENvbnRlbnRJdGVtLnNwYWNlSW5GbG93TWF4ID0gZm9udFNpemUgKiBTUEFDRV9JTl9GTE9XX01BWF9GQUNUT1I7CiAgICAgIHRleHRDb250ZW50SXRlbS5oYXNFT0wgPSBmYWxzZTsKICAgICAgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRleHRDb250ZW50SXRlbTsKICAgIH0KICAgIGZ1bmN0aW9uIHVwZGF0ZUFkdmFuY2VTY2FsZSgpIHsKICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgc2NhbGVMaW5lWCA9IE1hdGguaHlwb3QodGV4dFN0YXRlLnRleHRMaW5lTWF0cml4WzBdLCB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXhbMV0pOwogICAgICBjb25zdCBzY2FsZUN0bVggPSBNYXRoLmh5cG90KHRleHRTdGF0ZS5jdG1bMF0sIHRleHRTdGF0ZS5jdG1bMV0pOwogICAgICBjb25zdCBzY2FsZUZhY3RvciA9IHNjYWxlQ3RtWCAqIHNjYWxlTGluZVg7CiAgICAgIGlmIChzY2FsZUZhY3RvciA9PT0gdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0udmVydGljYWwpIHsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0udG90YWxXaWR0aCArPSB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKiB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIHRleHRDb250ZW50SXRlbS50b3RhbEhlaWdodCArPSB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICogdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCA9IDA7CiAgICAgIH0KICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUgPSBzY2FsZUZhY3RvcjsKICAgIH0KICAgIGZ1bmN0aW9uIHJ1bkJpZGlUcmFuc2Zvcm0odGV4dENodW5rKSB7CiAgICAgIGxldCB0ZXh0ID0gdGV4dENodW5rLnN0ci5qb2luKCIiKTsKICAgICAgaWYgKCFkaXNhYmxlTm9ybWFsaXphdGlvbikgewogICAgICAgIHRleHQgPSBub3JtYWxpemVVbmljb2RlKHRleHQpOwogICAgICB9CiAgICAgIGNvbnN0IGJpZGlSZXN1bHQgPSBiaWRpKHRleHQsIC0xLCB0ZXh0Q2h1bmsudmVydGljYWwpOwogICAgICByZXR1cm4gewogICAgICAgIHN0cjogYmlkaVJlc3VsdC5zdHIsCiAgICAgICAgZGlyOiBiaWRpUmVzdWx0LmRpciwKICAgICAgICB3aWR0aDogTWF0aC5hYnModGV4dENodW5rLnRvdGFsV2lkdGgpLAogICAgICAgIGhlaWdodDogTWF0aC5hYnModGV4dENodW5rLnRvdGFsSGVpZ2h0KSwKICAgICAgICB0cmFuc2Zvcm06IHRleHRDaHVuay50cmFuc2Zvcm0sCiAgICAgICAgZm9udE5hbWU6IHRleHRDaHVuay5mb250TmFtZSwKICAgICAgICBoYXNFT0w6IHRleHRDaHVuay5oYXNFT0wKICAgICAgfTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVNldEZvbnQoZm9udE5hbWUsIGZvbnRSZWYpIHsKICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IGF3YWl0IHNlbGYubG9hZEZvbnQoZm9udE5hbWUsIGZvbnRSZWYsIHJlc291cmNlcywgdGFzayk7CiAgICAgIHRleHRTdGF0ZS5sb2FkZWROYW1lID0gdHJhbnNsYXRlZC5sb2FkZWROYW1lOwogICAgICB0ZXh0U3RhdGUuZm9udCA9IHRyYW5zbGF0ZWQuZm9udDsKICAgICAgdGV4dFN0YXRlLmZvbnRNYXRyaXggPSB0cmFuc2xhdGVkLmZvbnQuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWDsKICAgIH0KICAgIGZ1bmN0aW9uIGFwcGx5SW52ZXJzZVJvdGF0aW9uKHgsIHksIG1hdHJpeCkgewogICAgICBjb25zdCBzY2FsZSA9IE1hdGguaHlwb3QobWF0cml4WzBdLCBtYXRyaXhbMV0pOwogICAgICByZXR1cm4gWyhtYXRyaXhbMF0gKiB4ICsgbWF0cml4WzFdICogeSkgLyBzY2FsZSwgKG1hdHJpeFsyXSAqIHggKyBtYXRyaXhbM10gKiB5KSAvIHNjYWxlXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXBhcmVXaXRoTGFzdFBvc2l0aW9uKGdseXBoV2lkdGgpIHsKICAgICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7CiAgICAgIGxldCBwb3NYID0gY3VycmVudFRyYW5zZm9ybVs0XTsKICAgICAgbGV0IHBvc1kgPSBjdXJyZW50VHJhbnNmb3JtWzVdOwogICAgICBpZiAodGV4dFN0YXRlLmZvbnQ/LnZlcnRpY2FsKSB7CiAgICAgICAgaWYgKHBvc1ggPCB2aWV3Qm94WzBdIHx8IHBvc1ggPiB2aWV3Qm94WzJdIHx8IHBvc1kgKyBnbHlwaFdpZHRoIDwgdmlld0JveFsxXSB8fCBwb3NZID4gdmlld0JveFszXSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwb3NYICsgZ2x5cGhXaWR0aCA8IHZpZXdCb3hbMF0gfHwgcG9zWCA+IHZpZXdCb3hbMl0gfHwgcG9zWSA8IHZpZXdCb3hbMV0gfHwgcG9zWSA+IHZpZXdCb3hbM10pIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCF0ZXh0U3RhdGUuZm9udCB8fCAhdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0pIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbGFzdFBvc1ggPSB0ZXh0Q29udGVudEl0ZW0ucHJldlRyYW5zZm9ybVs0XTsKICAgICAgbGV0IGxhc3RQb3NZID0gdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm1bNV07CiAgICAgIGlmIChsYXN0UG9zWCA9PT0gcG9zWCAmJiBsYXN0UG9zWSA9PT0gcG9zWSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCByb3RhdGUgPSAtMTsKICAgICAgaWYgKGN1cnJlbnRUcmFuc2Zvcm1bMF0gJiYgY3VycmVudFRyYW5zZm9ybVsxXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzJdID09PSAwKSB7CiAgICAgICAgcm90YXRlID0gY3VycmVudFRyYW5zZm9ybVswXSA+IDAgPyAwIDogMTgwOwogICAgICB9IGVsc2UgaWYgKGN1cnJlbnRUcmFuc2Zvcm1bMV0gJiYgY3VycmVudFRyYW5zZm9ybVswXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzNdID09PSAwKSB7CiAgICAgICAgcm90YXRlID0gY3VycmVudFRyYW5zZm9ybVsxXSA+IDAgPyA5MCA6IDI3MDsKICAgICAgfQogICAgICBzd2l0Y2ggKHJvdGF0ZSkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgOTA6CiAgICAgICAgICBbcG9zWCwgcG9zWV0gPSBbcG9zWSwgcG9zWF07CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFtsYXN0UG9zWSwgbGFzdFBvc1hdOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICBbcG9zWCwgcG9zWSwgbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFstcG9zWCwgLXBvc1ksIC1sYXN0UG9zWCwgLWxhc3RQb3NZXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjcwOgogICAgICAgICAgW3Bvc1gsIHBvc1ldID0gWy1wb3NZLCAtcG9zWF07CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFstbGFzdFBvc1ksIC1sYXN0UG9zWF07CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgW3Bvc1gsIHBvc1ldID0gYXBwbHlJbnZlcnNlUm90YXRpb24ocG9zWCwgcG9zWSwgY3VycmVudFRyYW5zZm9ybSk7CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IGFwcGx5SW52ZXJzZVJvdGF0aW9uKGxhc3RQb3NYLCBsYXN0UG9zWSwgdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0pOwogICAgICB9CiAgICAgIGlmICh0ZXh0U3RhdGUuZm9udC52ZXJ0aWNhbCkgewogICAgICAgIGNvbnN0IGFkdmFuY2VZID0gKGxhc3RQb3NZIC0gcG9zWSkgLyB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgICBjb25zdCBhZHZhbmNlWCA9IHBvc1ggLSBsYXN0UG9zWDsKICAgICAgICBjb25zdCB0ZXh0T3JpZW50YXRpb24gPSBNYXRoLnNpZ24odGV4dENvbnRlbnRJdGVtLmhlaWdodCk7CiAgICAgICAgaWYgKGFkdmFuY2VZIDwgdGV4dE9yaWVudGF0aW9uICogdGV4dENvbnRlbnRJdGVtLm5lZ2F0aXZlU3BhY2VNYXgpIHsKICAgICAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWCkgPiAwLjUgKiB0ZXh0Q29udGVudEl0ZW0ud2lkdGgpIHsKICAgICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKE1hdGguYWJzKGFkdmFuY2VYKSA+IHRleHRDb250ZW50SXRlbS53aWR0aCkgewogICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGFkdmFuY2VZIDw9IHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5ub3RBU3BhY2UpIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgfQogICAgICAgIGlmIChhZHZhbmNlWSA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0udHJhY2tpbmdTcGFjZU1pbikgewogICAgICAgICAgaWYgKHNob3VsZEFkZFdoaXRlcHNhY2UoKSkgewogICAgICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICBwdXNoV2hpdGVzcGFjZSh7CiAgICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyhhZHZhbmNlWSkKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICs9IGFkdmFuY2VZOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIWFkZEZha2VTcGFjZXMoYWR2YW5jZVksIHRleHRDb250ZW50SXRlbS5wcmV2VHJhbnNmb3JtLCB0ZXh0T3JpZW50YXRpb24pKSB7CiAgICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLnN0ci5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgICAgICAgIGhlaWdodDogTWF0aC5hYnMoYWR2YW5jZVkpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCArPSBhZHZhbmNlWTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKE1hdGguYWJzKGFkdmFuY2VYKSA+IHRleHRDb250ZW50SXRlbS53aWR0aCAqIFZFUlRJQ0FMX1NISUZUX1JBVElPKSB7CiAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBjb25zdCBhZHZhbmNlWCA9IChwb3NYIC0gbGFzdFBvc1gpIC8gdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgIGNvbnN0IGFkdmFuY2VZID0gcG9zWSAtIGxhc3RQb3NZOwogICAgICBjb25zdCB0ZXh0T3JpZW50YXRpb24gPSBNYXRoLnNpZ24odGV4dENvbnRlbnRJdGVtLndpZHRoKTsKICAgICAgaWYgKGFkdmFuY2VYIDwgdGV4dE9yaWVudGF0aW9uICogdGV4dENvbnRlbnRJdGVtLm5lZ2F0aXZlU3BhY2VNYXgpIHsKICAgICAgICBpZiAoTWF0aC5hYnMoYWR2YW5jZVkpID4gMC41ICogdGV4dENvbnRlbnRJdGVtLmhlaWdodCkgewogICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWSkgPiB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0KSB7CiAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGFkdmFuY2VYIDw9IHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5ub3RBU3BhY2UpIHsKICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICB9CiAgICAgIGlmIChhZHZhbmNlWCA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0udHJhY2tpbmdTcGFjZU1pbikgewogICAgICAgIGlmIChzaG91bGRBZGRXaGl0ZXBzYWNlKCkpIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgICAgICB3aWR0aDogTWF0aC5hYnMoYWR2YW5jZVgpCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoICs9IGFkdmFuY2VYOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghYWRkRmFrZVNwYWNlcyhhZHZhbmNlWCwgdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0sIHRleHRPcmllbnRhdGlvbikpIHsKICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLnN0ci5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgICBwdXNoV2hpdGVzcGFjZSh7CiAgICAgICAgICAgIHdpZHRoOiBNYXRoLmFicyhhZHZhbmNlWCkKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKz0gYWR2YW5jZVg7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWSkgPiB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICogVkVSVElDQUxfU0hJRlRfUkFUSU8pIHsKICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYnVpbGRUZXh0Q29udGVudEl0ZW0oewogICAgICBjaGFycywKICAgICAgZXh0cmFTcGFjaW5nCiAgICB9KSB7CiAgICAgIGNvbnN0IGZvbnQgPSB0ZXh0U3RhdGUuZm9udDsKICAgICAgaWYgKCFjaGFycykgewogICAgICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gdGV4dFN0YXRlLmNoYXJTcGFjaW5nICsgZXh0cmFTcGFjaW5nOwogICAgICAgIGlmIChjaGFyU3BhY2luZykgewogICAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KGNoYXJTcGFjaW5nICogdGV4dFN0YXRlLnRleHRIU2NhbGUsIDApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwgLWNoYXJTcGFjaW5nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGtlZXBXaGl0ZVNwYWNlKSB7CiAgICAgICAgICBjb21wYXJlV2l0aExhc3RQb3NpdGlvbigwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFycyk7CiAgICAgIGNvbnN0IHNjYWxlID0gdGV4dFN0YXRlLmZvbnRNYXRyaXhbMF0gKiB0ZXh0U3RhdGUuZm9udFNpemU7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGdseXBocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgZ2x5cGggPSBnbHlwaHNbaV07CiAgICAgICAgY29uc3QgewogICAgICAgICAgY2F0ZWdvcnkKICAgICAgICB9ID0gZ2x5cGg7CiAgICAgICAgaWYgKGNhdGVnb3J5LmlzSW52aXNpYmxlRm9ybWF0TWFyaykgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCBjaGFyU3BhY2luZyA9IHRleHRTdGF0ZS5jaGFyU3BhY2luZyArIChpICsgMSA9PT0gaWkgPyBleHRyYVNwYWNpbmcgOiAwKTsKICAgICAgICBsZXQgZ2x5cGhXaWR0aCA9IGdseXBoLndpZHRoOwogICAgICAgIGlmIChmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICBnbHlwaFdpZHRoID0gZ2x5cGgudm1ldHJpYyA/IGdseXBoLnZtZXRyaWNbMF0gOiAtZ2x5cGhXaWR0aDsKICAgICAgICB9CiAgICAgICAgbGV0IHNjYWxlZERpbSA9IGdseXBoV2lkdGggKiBzY2FsZTsKICAgICAgICBpZiAoIWtlZXBXaGl0ZVNwYWNlICYmIGNhdGVnb3J5LmlzV2hpdGVzcGFjZSkgewogICAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICAgIGNoYXJTcGFjaW5nICs9IHNjYWxlZERpbSArIHRleHRTdGF0ZS53b3JkU3BhY2luZzsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoY2hhclNwYWNpbmcgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZSwgMCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaGFyU3BhY2luZyArPSAtc2NhbGVkRGltICsgdGV4dFN0YXRlLndvcmRTcGFjaW5nOwogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCgwLCAtY2hhclNwYWNpbmcpOwogICAgICAgICAgfQogICAgICAgICAgc2F2ZUxhc3RDaGFyKCIgIik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFjYXRlZ29yeS5pc1plcm9XaWR0aERpYWNyaXRpYyAmJiAhY29tcGFyZVdpdGhMYXN0UG9zaXRpb24oc2NhbGVkRGltKSkgewogICAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KHNjYWxlZERpbSAqIHRleHRTdGF0ZS50ZXh0SFNjYWxlLCAwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KDAsIHNjYWxlZERpbSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdGV4dENodW5rID0gZW5zdXJlVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgaWYgKGNhdGVnb3J5LmlzWmVyb1dpZHRoRGlhY3JpdGljKSB7CiAgICAgICAgICBzY2FsZWREaW0gPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHsKICAgICAgICAgIHNjYWxlZERpbSAqPSB0ZXh0U3RhdGUudGV4dEhTY2FsZTsKICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KHNjYWxlZERpbSwgMCk7CiAgICAgICAgICB0ZXh0Q2h1bmsud2lkdGggKz0gc2NhbGVkRGltOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCgwLCBzY2FsZWREaW0pOwogICAgICAgICAgc2NhbGVkRGltID0gTWF0aC5hYnMoc2NhbGVkRGltKTsKICAgICAgICAgIHRleHRDaHVuay5oZWlnaHQgKz0gc2NhbGVkRGltOwogICAgICAgIH0KICAgICAgICBpZiAoc2NhbGVkRGltKSB7CiAgICAgICAgICB0ZXh0Q2h1bmsucHJldlRyYW5zZm9ybSA9IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGdseXBoVW5pY29kZSA9IGdseXBoLnVuaWNvZGU7CiAgICAgICAgaWYgKHNhdmVMYXN0Q2hhcihnbHlwaFVuaWNvZGUpKSB7CiAgICAgICAgICB0ZXh0Q2h1bmsuc3RyLnB1c2goIiAiKTsKICAgICAgICB9CiAgICAgICAgdGV4dENodW5rLnN0ci5wdXNoKGdseXBoVW5pY29kZSk7CiAgICAgICAgaWYgKGNoYXJTcGFjaW5nKSB7CiAgICAgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoY2hhclNwYWNpbmcgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZSwgMCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCgwLCAtY2hhclNwYWNpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYXBwZW5kRU9MKCkgewogICAgICByZXNldExhc3RDaGFycygpOwogICAgICBpZiAodGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhhc0VPTCA9IHRydWU7CiAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKHsKICAgICAgICAgIHN0cjogIiIsCiAgICAgICAgICBkaXI6ICJsdHIiLAogICAgICAgICAgd2lkdGg6IDAsCiAgICAgICAgICBoZWlnaHQ6IDAsCiAgICAgICAgICB0cmFuc2Zvcm06IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCksCiAgICAgICAgICBmb250TmFtZTogdGV4dFN0YXRlLmxvYWRlZE5hbWUsCiAgICAgICAgICBoYXNFT0w6IHRydWUKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYWRkRmFrZVNwYWNlcyh3aWR0aCwgdHJhbnNmLCB0ZXh0T3JpZW50YXRpb24pIHsKICAgICAgaWYgKHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5zcGFjZUluRmxvd01pbiA8PSB3aWR0aCAmJiB3aWR0aCA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0uc3BhY2VJbkZsb3dNYXgpIHsKICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7CiAgICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICAgICAgdGV4dENvbnRlbnRJdGVtLnN0ci5wdXNoKCIgIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjb25zdCBmb250TmFtZSA9IHRleHRDb250ZW50SXRlbS5mb250TmFtZTsKICAgICAgbGV0IGhlaWdodCA9IDA7CiAgICAgIGlmICh0ZXh0Q29udGVudEl0ZW0udmVydGljYWwpIHsKICAgICAgICBoZWlnaHQgPSB3aWR0aDsKICAgICAgICB3aWR0aCA9IDA7CiAgICAgIH0KICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgIHdpZHRoOiBNYXRoLmFicyh3aWR0aCksCiAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyhoZWlnaHQpLAogICAgICAgIHRyYW5zZm9ybTogdHJhbnNmIHx8IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCksCiAgICAgICAgZm9udE5hbWUKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gZmx1c2hUZXh0Q29udGVudEl0ZW0oKSB7CiAgICAgIGlmICghdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkIHx8ICF0ZXh0Q29udGVudEl0ZW0uc3RyKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghdGV4dENvbnRlbnRJdGVtLnZlcnRpY2FsKSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRvdGFsV2lkdGggKz0gdGV4dENvbnRlbnRJdGVtLndpZHRoICogdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRvdGFsSGVpZ2h0ICs9IHRleHRDb250ZW50SXRlbS5oZWlnaHQgKiB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgfQogICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKHJ1bkJpZGlUcmFuc2Zvcm0odGV4dENvbnRlbnRJdGVtKSk7CiAgICAgIHRleHRDb250ZW50SXRlbS5pbml0aWFsaXplZCA9IGZhbHNlOwogICAgICB0ZXh0Q29udGVudEl0ZW0uc3RyLmxlbmd0aCA9IDA7CiAgICB9CiAgICBmdW5jdGlvbiBlbnF1ZXVlQ2h1bmsoYmF0Y2ggPSBmYWxzZSkgewogICAgICBjb25zdCBsZW5ndGggPSB0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGg7CiAgICAgIGlmIChsZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGJhdGNoICYmIGxlbmd0aCA8IFRFWFRfQ0hVTktfQkFUQ0hfU0laRSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBzaW5rLmVucXVldWUodGV4dENvbnRlbnQsIGxlbmd0aCk7CiAgICAgIHRleHRDb250ZW50Lml0ZW1zID0gW107CiAgICAgIHRleHRDb250ZW50LnN0eWxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB9CiAgICBjb25zdCB0aW1lU2xvdE1hbmFnZXIgPSBuZXcgVGltZVNsb3RNYW5hZ2VyKCk7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIGNvbnN0IG5leHQgPSBmdW5jdGlvbiAocHJvbWlzZSkgewogICAgICAgIGVucXVldWVDaHVuayh0cnVlKTsKICAgICAgICBQcm9taXNlLmFsbChbcHJvbWlzZSwgc2luay5yZWFkeV0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIHJlamVjdChleCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgfTsKICAgICAgdGFzay5lbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgIHRpbWVTbG90TWFuYWdlci5yZXNldCgpOwogICAgICBjb25zdCBvcGVyYXRpb24gPSB7fTsKICAgICAgbGV0IHN0b3AsCiAgICAgICAgbmFtZSwKICAgICAgICBpc1ZhbGlkTmFtZSwKICAgICAgICBhcmdzID0gW107CiAgICAgIHdoaWxlICghKHN0b3AgPSB0aW1lU2xvdE1hbmFnZXIuY2hlY2soKSkpIHsKICAgICAgICBhcmdzLmxlbmd0aCA9IDA7CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBhcmdzOwogICAgICAgIGlmICghcHJlcHJvY2Vzc29yLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSB0ZXh0U3RhdGU7CiAgICAgICAgdGV4dFN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlOwogICAgICAgIGNvbnN0IGZuID0gb3BlcmF0aW9uLmZuOwogICAgICAgIGFyZ3MgPSBvcGVyYXRpb24uYXJnczsKICAgICAgICBzd2l0Y2ggKGZuIHwgMCkgewogICAgICAgICAgY2FzZSBPUFMuc2V0Rm9udDoKICAgICAgICAgICAgY29uc3QgZm9udE5hbWVBcmcgPSBhcmdzWzBdLm5hbWUsCiAgICAgICAgICAgICAgZm9udFNpemVBcmcgPSBhcmdzWzFdOwogICAgICAgICAgICBpZiAodGV4dFN0YXRlLmZvbnQgJiYgZm9udE5hbWVBcmcgPT09IHRleHRTdGF0ZS5mb250TmFtZSAmJiBmb250U2l6ZUFyZyA9PT0gdGV4dFN0YXRlLmZvbnRTaXplKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnROYW1lID0gZm9udE5hbWVBcmc7CiAgICAgICAgICAgIHRleHRTdGF0ZS5mb250U2l6ZSA9IGZvbnRTaXplQXJnOwogICAgICAgICAgICBuZXh0KGhhbmRsZVNldEZvbnQoZm9udE5hbWVBcmcsIG51bGwpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dFJpc2U6CiAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0UmlzZSA9IGFyZ3NbMF07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0SFNjYWxlOgogICAgICAgICAgICB0ZXh0U3RhdGUudGV4dEhTY2FsZSA9IGFyZ3NbMF0gLyAxMDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0TGVhZGluZzoKICAgICAgICAgICAgdGV4dFN0YXRlLmxlYWRpbmcgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLm1vdmVUZXh0OgogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSk7CiAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0TWF0cml4ID0gdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0TGVhZGluZ01vdmVUZXh0OgogICAgICAgICAgICB0ZXh0U3RhdGUubGVhZGluZyA9IC1hcmdzWzFdOwogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSk7CiAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0TWF0cml4ID0gdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmU6CiAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFRleHRNYXRyaXg6CiAgICAgICAgICAgIHRleHRTdGF0ZS5zZXRUZXh0TWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pOwogICAgICAgICAgICB0ZXh0U3RhdGUuc2V0VGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7CiAgICAgICAgICAgIHVwZGF0ZUFkdmFuY2VTY2FsZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldENoYXJTcGFjaW5nOgogICAgICAgICAgICB0ZXh0U3RhdGUuY2hhclNwYWNpbmcgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFdvcmRTcGFjaW5nOgogICAgICAgICAgICB0ZXh0U3RhdGUud29yZFNwYWNpbmcgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLmJlZ2luVGV4dDoKICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRNYXRyaXggPSBJREVOVElUWV9NQVRSSVguc2xpY2UoKTsKICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4ID0gSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1NwYWNlZFRleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHNwYWNlRmFjdG9yID0gKHRleHRTdGF0ZS5mb250LnZlcnRpY2FsID8gMSA6IC0xKSAqIHRleHRTdGF0ZS5mb250U2l6ZSAvIDEwMDA7CiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXJnc1swXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50c1tpXTsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICBzaG93U3BhY2VkVGV4dEJ1ZmZlci5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09ICJudW1iZXIiICYmIGl0ZW0gIT09IDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IHNob3dTcGFjZWRUZXh0QnVmZmVyLmpvaW4oIiIpOwogICAgICAgICAgICAgICAgc2hvd1NwYWNlZFRleHRCdWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHsKICAgICAgICAgICAgICAgICAgY2hhcnM6IHN0ciwKICAgICAgICAgICAgICAgICAgZXh0cmFTcGFjaW5nOiBpdGVtICogc3BhY2VGYWN0b3IKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2hvd1NwYWNlZFRleHRCdWZmZXIubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGNvbnN0IHN0ciA9IHNob3dTcGFjZWRUZXh0QnVmZmVyLmpvaW4oIiIpOwogICAgICAgICAgICAgIHNob3dTcGFjZWRUZXh0QnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgYnVpbGRUZXh0Q29udGVudEl0ZW0oewogICAgICAgICAgICAgICAgY2hhcnM6IHN0ciwKICAgICAgICAgICAgICAgIGV4dHJhU3BhY2luZzogMAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHsKICAgICAgICAgICAgICBjaGFyczogYXJnc1swXSwKICAgICAgICAgICAgICBleHRyYVNwYWNpbmc6IDAKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTaG93VGV4dDoKICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgewogICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGV4dFN0YXRlLmNhcnJpYWdlUmV0dXJuKCk7CiAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHsKICAgICAgICAgICAgICBjaGFyczogYXJnc1swXSwKICAgICAgICAgICAgICBleHRyYVNwYWNpbmc6IDAKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRleHRTdGF0ZS53b3JkU3BhY2luZyA9IGFyZ3NbMF07CiAgICAgICAgICAgIHRleHRTdGF0ZS5jaGFyU3BhY2luZyA9IGFyZ3NbMV07CiAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpOwogICAgICAgICAgICBidWlsZFRleHRDb250ZW50SXRlbSh7CiAgICAgICAgICAgICAgY2hhcnM6IGFyZ3NbMl0sCiAgICAgICAgICAgICAgZXh0cmFTcGFjaW5nOiAwCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnBhaW50WE9iamVjdDoKICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgeG9ianMgPz89IHJlc291cmNlcy5nZXQoIlhPYmplY3QiKSB8fCBEaWN0LmVtcHR5OwogICAgICAgICAgICBpc1ZhbGlkTmFtZSA9IGFyZ3NbMF0gaW5zdGFuY2VvZiBOYW1lOwogICAgICAgICAgICBuYW1lID0gYXJnc1swXS5uYW1lOwogICAgICAgICAgICBpZiAoaXNWYWxpZE5hbWUgJiYgZW1wdHlYT2JqZWN0Q2FjaGUuZ2V0QnlOYW1lKG5hbWUpKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dChuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpIHsKICAgICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlhPYmplY3QgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsZXQgeG9iaiA9IHhvYmpzLmdldFJhdyhuYW1lKTsKICAgICAgICAgICAgICBpZiAoeG9iaiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgICAgaWYgKGVtcHR5WE9iamVjdENhY2hlLmdldEJ5UmVmKHhvYmopKSB7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbEltYWdlID0gc2VsZi5nbG9iYWxJbWFnZUNhY2hlLmdldERhdGEoeG9iaiwgc2VsZi5wYWdlSW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKGdsb2JhbEltYWdlKSB7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHhvYmogPSB4cmVmLmZldGNoKHhvYmopOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoISh4b2JqIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgYmUgYSBzdHJlYW0iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHhvYmouZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgICAgICAgICBpZiAoISh0eXBlIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodHlwZS5uYW1lICE9PSAiRm9ybSIpIHsKICAgICAgICAgICAgICAgIGVtcHR5WE9iamVjdENhY2hlLnNldChuYW1lLCB4b2JqLmRpY3Qub2JqSWQsIHRydWUpOwogICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKCk7CiAgICAgICAgICAgICAgY29uc3QgeE9ialN0YXRlTWFuYWdlciA9IG5ldyBTdGF0ZU1hbmFnZXIoY3VycmVudFN0YXRlKTsKICAgICAgICAgICAgICBjb25zdCBtYXRyaXggPSBsb29rdXBNYXRyaXgoeG9iai5kaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgbnVsbCk7CiAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgewogICAgICAgICAgICAgICAgeE9ialN0YXRlTWFuYWdlci50cmFuc2Zvcm0obWF0cml4KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZW5xdWV1ZUNodW5rKCk7CiAgICAgICAgICAgICAgY29uc3Qgc2lua1dyYXBwZXIgPSB7CiAgICAgICAgICAgICAgICBlbnF1ZXVlSW52b2tlZDogZmFsc2UsCiAgICAgICAgICAgICAgICBlbnF1ZXVlKGNodW5rLCBzaXplKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuZW5xdWV1ZUludm9rZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICBzaW5rLmVucXVldWUoY2h1bmssIHNpemUpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldCBkZXNpcmVkU2l6ZSgpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbmsuZGVzaXJlZFNpemU7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0IHJlYWR5KCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gc2luay5yZWFkeTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHNlbGYuZ2V0VGV4dENvbnRlbnQoewogICAgICAgICAgICAgICAgc3RyZWFtOiB4b2JqLAogICAgICAgICAgICAgICAgdGFzaywKICAgICAgICAgICAgICAgIHJlc291cmNlczogeG9iai5kaWN0LmdldCgiUmVzb3VyY2VzIikgfHwgcmVzb3VyY2VzLAogICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyOiB4T2JqU3RhdGVNYW5hZ2VyLAogICAgICAgICAgICAgICAgaW5jbHVkZU1hcmtlZENvbnRlbnQsCiAgICAgICAgICAgICAgICBzaW5rOiBzaW5rV3JhcHBlciwKICAgICAgICAgICAgICAgIHNlZW5TdHlsZXMsCiAgICAgICAgICAgICAgICB2aWV3Qm94LAogICAgICAgICAgICAgICAgbGFuZywKICAgICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLAogICAgICAgICAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24sCiAgICAgICAgICAgICAgICBrZWVwV2hpdGVTcGFjZQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCFzaW5rV3JhcHBlci5lbnF1ZXVlSW52b2tlZCkgewogICAgICAgICAgICAgICAgICBlbXB0eVhPYmplY3RDYWNoZS5zZXQobmFtZSwgeG9iai5kaWN0Lm9iaklkLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgfSwgcmVqZWN0WE9iamVjdCk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgICAgICAgIHdhcm4oYGdldFRleHRDb250ZW50IC0gaWdub3JpbmcgWE9iamVjdDogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjYXNlIE9QUy5zZXRHU3RhdGU6CiAgICAgICAgICAgIGlzVmFsaWROYW1lID0gYXJnc1swXSBpbnN0YW5jZW9mIE5hbWU7CiAgICAgICAgICAgIG5hbWUgPSBhcmdzWzBdLm5hbWU7CiAgICAgICAgICAgIGlmIChpc1ZhbGlkTmFtZSAmJiBlbXB0eUdTdGF0ZUNhY2hlLmdldEJ5TmFtZShuYW1lKSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSkgewogICAgICAgICAgICAgIGlmICghaXNWYWxpZE5hbWUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgZXh0R1N0YXRlID0gcmVzb3VyY2VzLmdldCgiRXh0R1N0YXRlIik7CiAgICAgICAgICAgICAgaWYgKCEoZXh0R1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZSA9IGV4dEdTdGF0ZS5nZXQobmFtZSk7CiAgICAgICAgICAgICAgaWYgKCEoZ1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZUZvbnQgPSBnU3RhdGUuZ2V0KCJGb250Iik7CiAgICAgICAgICAgICAgaWYgKCFnU3RhdGVGb250KSB7CiAgICAgICAgICAgICAgICBlbXB0eUdTdGF0ZUNhY2hlLnNldChuYW1lLCBnU3RhdGUub2JqSWQsIHRydWUpOwogICAgICAgICAgICAgICAgcmVzb2x2ZUdTdGF0ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICAgIHRleHRTdGF0ZS5mb250TmFtZSA9IG51bGw7CiAgICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnRTaXplID0gZ1N0YXRlRm9udFsxXTsKICAgICAgICAgICAgICBoYW5kbGVTZXRGb250KG51bGwsIGdTdGF0ZUZvbnRbMF0pLnRoZW4ocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgd2FybihgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuYmVnaW5NYXJrZWRDb250ZW50OgogICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICBpZiAoaW5jbHVkZU1hcmtlZENvbnRlbnQpIHsKICAgICAgICAgICAgICBtYXJrZWRDb250ZW50RGF0YS5sZXZlbCsrOwogICAgICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goewogICAgICAgICAgICAgICAgdHlwZTogImJlZ2luTWFya2VkQ29udGVudCIsCiAgICAgICAgICAgICAgICB0YWc6IGFyZ3NbMF0gaW5zdGFuY2VvZiBOYW1lID8gYXJnc1swXS5uYW1lIDogbnVsbAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6CiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLmxldmVsKys7CiAgICAgICAgICAgICAgbGV0IG1jaWQgPSBudWxsOwogICAgICAgICAgICAgIGlmIChhcmdzWzFdIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICAgICAgbWNpZCA9IGFyZ3NbMV0uZ2V0KCJNQ0lEIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goewogICAgICAgICAgICAgICAgdHlwZTogImJlZ2luTWFya2VkQ29udGVudFByb3BzIiwKICAgICAgICAgICAgICAgIGlkOiBOdW1iZXIuaXNJbnRlZ2VyKG1jaWQpID8gYCR7c2VsZi5pZEZhY3RvcnkuZ2V0UGFnZU9iaklkKCl9X21jJHttY2lkfWAgOiBudWxsLAogICAgICAgICAgICAgICAgdGFnOiBhcmdzWzBdIGluc3RhbmNlb2YgTmFtZSA/IGFyZ3NbMF0ubmFtZSA6IG51bGwKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLmVuZE1hcmtlZENvbnRlbnQ6CiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICAgICAgICAgIGlmIChtYXJrZWRDb250ZW50RGF0YS5sZXZlbCA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLmxldmVsLS07CiAgICAgICAgICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaCh7CiAgICAgICAgICAgICAgICB0eXBlOiAiZW5kTWFya2VkQ29udGVudCIKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnJlc3RvcmU6CiAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXRlICYmIChwcmV2aW91c1N0YXRlLmZvbnQgIT09IHRleHRTdGF0ZS5mb250IHx8IHByZXZpb3VzU3RhdGUuZm9udFNpemUgIT09IHRleHRTdGF0ZS5mb250U2l6ZSB8fCBwcmV2aW91c1N0YXRlLmZvbnROYW1lICE9PSB0ZXh0U3RhdGUuZm9udE5hbWUpKSB7CiAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHRleHRDb250ZW50Lml0ZW1zLmxlbmd0aCA+PSBzaW5rLmRlc2lyZWRTaXplKSB7CiAgICAgICAgICBzdG9wID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc3RvcCkgewogICAgICAgIG5leHQoZGVmZXJyZWQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICBlbnF1ZXVlQ2h1bmsoKTsKICAgICAgcmVzb2x2ZSgpOwogICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgd2FybihgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBlcnJvcnMgZHVyaW5nICIke3Rhc2submFtZX0iIGAgKyBgdGFzazogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICBlbnF1ZXVlQ2h1bmsoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIGFzeW5jIGV4dHJhY3REYXRhU3RydWN0dXJlcyhkaWN0LCBwcm9wZXJ0aWVzKSB7CiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOwogICAgbGV0IGNpZFRvR2lkQnl0ZXM7CiAgICBjb25zdCB0b1VuaWNvZGVQcm9taXNlID0gdGhpcy5yZWFkVG9Vbmljb2RlKHByb3BlcnRpZXMudG9Vbmljb2RlKTsKICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgewogICAgICBjb25zdCBjaWRTeXN0ZW1JbmZvID0gZGljdC5nZXQoIkNJRFN5c3RlbUluZm8iKTsKICAgICAgaWYgKGNpZFN5c3RlbUluZm8gaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvID0gewogICAgICAgICAgcmVnaXN0cnk6IHN0cmluZ1RvUERGU3RyaW5nKGNpZFN5c3RlbUluZm8uZ2V0KCJSZWdpc3RyeSIpKSwKICAgICAgICAgIG9yZGVyaW5nOiBzdHJpbmdUb1BERlN0cmluZyhjaWRTeXN0ZW1JbmZvLmdldCgiT3JkZXJpbmciKSksCiAgICAgICAgICBzdXBwbGVtZW50OiBjaWRTeXN0ZW1JbmZvLmdldCgiU3VwcGxlbWVudCIpCiAgICAgICAgfTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIGNvbnN0IGNpZFRvR2lkTWFwID0gZGljdC5nZXQoIkNJRFRvR0lETWFwIik7CiAgICAgICAgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgICAgY2lkVG9HaWRCeXRlcyA9IGNpZFRvR2lkTWFwLmdldEJ5dGVzKCk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgfQogICAgICAgIHdhcm4oYGV4dHJhY3REYXRhU3RydWN0dXJlcyAtIGlnbm9yaW5nIENJRFRvR0lETWFwIGRhdGE6ICIke2V4fSIuYCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGRpZmZlcmVuY2VzID0gW107CiAgICBsZXQgYmFzZUVuY29kaW5nTmFtZSA9IG51bGw7CiAgICBsZXQgZW5jb2Rpbmc7CiAgICBpZiAoZGljdC5oYXMoIkVuY29kaW5nIikpIHsKICAgICAgZW5jb2RpbmcgPSBkaWN0LmdldCgiRW5jb2RpbmciKTsKICAgICAgaWYgKGVuY29kaW5nIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBlbmNvZGluZy5nZXQoIkJhc2VFbmNvZGluZyIpOwogICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBiYXNlRW5jb2RpbmdOYW1lIGluc3RhbmNlb2YgTmFtZSA/IGJhc2VFbmNvZGluZ05hbWUubmFtZSA6IG51bGw7CiAgICAgICAgaWYgKGVuY29kaW5nLmhhcygiRGlmZmVyZW5jZXMiKSkgewogICAgICAgICAgY29uc3QgZGlmZkVuY29kaW5nID0gZW5jb2RpbmcuZ2V0KCJEaWZmZXJlbmNlcyIpOwogICAgICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZGlmZkVuY29kaW5nKSB7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB4cmVmLmZldGNoSWZSZWYoZW50cnkpOwogICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgaW5kZXggPSBkYXRhOwogICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgICAgZGlmZmVyZW5jZXNbaW5kZXgrK10gPSBkYXRhLm5hbWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGVudHJ5IGluICdEaWZmZXJlbmNlcycgYXJyYXk6ICR7ZGF0YX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBiYXNlRW5jb2RpbmdOYW1lID0gZW5jb2RpbmcubmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBtc2cgPSAiRW5jb2RpbmcgaXMgbm90IGEgTmFtZSBub3IgYSBEaWN0IjsKICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihtc2cpOwogICAgICAgIH0KICAgICAgICB3YXJuKG1zZyk7CiAgICAgIH0KICAgICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgIT09ICJNYWNSb21hbkVuY29kaW5nIiAmJiBiYXNlRW5jb2RpbmdOYW1lICE9PSAiTWFjRXhwZXJ0RW5jb2RpbmciICYmIGJhc2VFbmNvZGluZ05hbWUgIT09ICJXaW5BbnNpRW5jb2RpbmciKSB7CiAgICAgICAgYmFzZUVuY29kaW5nTmFtZSA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG5vbkVtYmVkZGVkRm9udCA9ICFwcm9wZXJ0aWVzLmZpbGUgfHwgcHJvcGVydGllcy5pc0ludGVybmFsRm9udCwKICAgICAgaXNTeW1ib2xzRm9udE5hbWUgPSBnZXRTeW1ib2xzRm9udHMoKVtwcm9wZXJ0aWVzLm5hbWVdOwogICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgJiYgbm9uRW1iZWRkZWRGb250ICYmIGlzU3ltYm9sc0ZvbnROYW1lKSB7CiAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBudWxsOwogICAgfQogICAgaWYgKGJhc2VFbmNvZGluZ05hbWUpIHsKICAgICAgcHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmcgPSBnZXRFbmNvZGluZyhiYXNlRW5jb2RpbmdOYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7CiAgICAgIGNvbnN0IGlzTm9uc3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5Ob25zeW1ib2xpYyk7CiAgICAgIGVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZzsKICAgICAgaWYgKHByb3BlcnRpZXMudHlwZSA9PT0gIlRydWVUeXBlIiAmJiAhaXNOb25zeW1ib2xpY0ZvbnQpIHsKICAgICAgICBlbmNvZGluZyA9IFdpbkFuc2lFbmNvZGluZzsKICAgICAgfQogICAgICBpZiAoaXNTeW1ib2xpY0ZvbnQgfHwgaXNTeW1ib2xzRm9udE5hbWUpIHsKICAgICAgICBlbmNvZGluZyA9IE1hY1JvbWFuRW5jb2Rpbmc7CiAgICAgICAgaWYgKG5vbkVtYmVkZGVkRm9udCkgewogICAgICAgICAgaWYgKC9TeW1ib2wvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBTeW1ib2xTZXRFbmNvZGluZzsKICAgICAgICAgIH0gZWxzZSBpZiAoL0RpbmdiYXRzL2kudGVzdChwcm9wZXJ0aWVzLm5hbWUpKSB7CiAgICAgICAgICAgIGVuY29kaW5nID0gWmFwZkRpbmdiYXRzRW5jb2Rpbmc7CiAgICAgICAgICB9IGVsc2UgaWYgKC9XaW5nZGluZ3MvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBXaW5BbnNpRW5jb2Rpbmc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7CiAgICB9CiAgICBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzID0gZGlmZmVyZW5jZXM7CiAgICBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgPSBiYXNlRW5jb2RpbmdOYW1lOwogICAgcHJvcGVydGllcy5oYXNFbmNvZGluZyA9ICEhYmFzZUVuY29kaW5nTmFtZSB8fCBkaWZmZXJlbmNlcy5sZW5ndGggPiAwOwogICAgcHJvcGVydGllcy5kaWN0ID0gZGljdDsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlID0gYXdhaXQgdG9Vbmljb2RlUHJvbWlzZTsKICAgIGNvbnN0IGJ1aWx0VG9Vbmljb2RlID0gYXdhaXQgdGhpcy5idWlsZFRvVW5pY29kZShwcm9wZXJ0aWVzKTsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlID0gYnVpbHRUb1VuaWNvZGU7CiAgICBpZiAoY2lkVG9HaWRCeXRlcykgewogICAgICBwcm9wZXJ0aWVzLmNpZFRvR2lkTWFwID0gdGhpcy5yZWFkQ2lkVG9HaWRNYXAoY2lkVG9HaWRCeXRlcywgYnVpbHRUb1VuaWNvZGUpOwogICAgfQogICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgfQogIF9zaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMsIGZvcmNlR2x5cGhzID0gZmFsc2UpIHsKICAgIGFzc2VydCghcHJvcGVydGllcy5jb21wb3NpdGUsICJNdXN0IGJlIGEgc2ltcGxlIGZvbnQuIik7CiAgICBjb25zdCB0b1VuaWNvZGUgPSBbXTsKICAgIGNvbnN0IGVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmcuc2xpY2UoKTsKICAgIGNvbnN0IGJhc2VFbmNvZGluZ05hbWUgPSBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWU7CiAgICBjb25zdCBkaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CiAgICBmb3IgKGNvbnN0IGNoYXJjb2RlIGluIGRpZmZlcmVuY2VzKSB7CiAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGRpZmZlcmVuY2VzW2NoYXJjb2RlXTsKICAgICAgaWYgKGdseXBoTmFtZSA9PT0gIi5ub3RkZWYiKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZW5jb2RpbmdbY2hhcmNvZGVdID0gZ2x5cGhOYW1lOwogICAgfQogICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTsKICAgIGZvciAoY29uc3QgY2hhcmNvZGUgaW4gZW5jb2RpbmcpIHsKICAgICAgbGV0IGdseXBoTmFtZSA9IGVuY29kaW5nW2NoYXJjb2RlXTsKICAgICAgaWYgKGdseXBoTmFtZSA9PT0gIiIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgdW5pY29kZSA9IGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXTsKICAgICAgaWYgKHVuaWNvZGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxldCBjb2RlID0gMDsKICAgICAgc3dpdGNoIChnbHlwaE5hbWVbMF0pIHsKICAgICAgICBjYXNlICJHIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID09PSAzKSB7CiAgICAgICAgICAgIGNvZGUgPSBwYXJzZUludChnbHlwaE5hbWUuc3Vic3RyaW5nKDEpLCAxNik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJnIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID09PSA1KSB7CiAgICAgICAgICAgIGNvZGUgPSBwYXJzZUludChnbHlwaE5hbWUuc3Vic3RyaW5nKDEpLCAxNik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJDIjoKICAgICAgICBjYXNlICJjIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID49IDMgJiYgZ2x5cGhOYW1lLmxlbmd0aCA8PSA0KSB7CiAgICAgICAgICAgIGNvbnN0IGNvZGVTdHIgPSBnbHlwaE5hbWUuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICBpZiAoZm9yY2VHbHlwaHMpIHsKICAgICAgICAgICAgICBjb2RlID0gcGFyc2VJbnQoY29kZVN0ciwgMTYpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvZGUgPSArY29kZVN0cjsKICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihjb2RlKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlSW50KGNvZGVTdHIsIDE2KSkpIHsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2ltcGxlRm9udFRvVW5pY29kZShwcm9wZXJ0aWVzLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAidSI6CiAgICAgICAgICB1bmljb2RlID0gZ2V0VW5pY29kZUZvckdseXBoKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgICAgICAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKICAgICAgICAgICAgY29kZSA9IHVuaWNvZGU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgc3dpdGNoIChnbHlwaE5hbWUpIHsKICAgICAgICAgICAgY2FzZSAiZl9oIjoKICAgICAgICAgICAgY2FzZSAiZl90IjoKICAgICAgICAgICAgY2FzZSAiVF9oIjoKICAgICAgICAgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gZ2x5cGhOYW1lLnJlcGxhY2VBbGwoIl8iLCAiIik7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoY29kZSA+IDAgJiYgY29kZSA8PSAweDEwZmZmZiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpKSB7CiAgICAgICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgJiYgY29kZSA9PT0gK2NoYXJjb2RlKSB7CiAgICAgICAgICBjb25zdCBiYXNlRW5jb2RpbmcgPSBnZXRFbmNvZGluZyhiYXNlRW5jb2RpbmdOYW1lKTsKICAgICAgICAgIGlmIChiYXNlRW5jb2RpbmcgJiYgKGdseXBoTmFtZSA9IGJhc2VFbmNvZGluZ1tjaGFyY29kZV0pKSB7CiAgICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b1VuaWNvZGU7CiAgfQogIGFzeW5jIGJ1aWxkVG9Vbmljb2RlKHByb3BlcnRpZXMpIHsKICAgIHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXAgPSBwcm9wZXJ0aWVzLnRvVW5pY29kZT8ubGVuZ3RoID4gMDsKICAgIGlmIChwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKSB7CiAgICAgIGlmICghcHJvcGVydGllcy5jb21wb3NpdGUgJiYgcHJvcGVydGllcy5oYXNFbmNvZGluZykgewogICAgICAgIHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGUgPSB0aGlzLl9zaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMpOwogICAgICB9CiAgICAgIHJldHVybiBwcm9wZXJ0aWVzLnRvVW5pY29kZTsKICAgIH0KICAgIGlmICghcHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAodGhpcy5fc2ltcGxlRm9udFRvVW5pY29kZShwcm9wZXJ0aWVzKSk7CiAgICB9CiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUgJiYgKHByb3BlcnRpZXMuY01hcC5idWlsdEluQ01hcCAmJiAhKHByb3BlcnRpZXMuY01hcCBpbnN0YW5jZW9mIElkZW50aXR5Q01hcCkgfHwgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvPy5yZWdpc3RyeSA9PT0gIkFkb2JlIiAmJiAocHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nID09PSAiR0IxIiB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJDTlMxIiB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJKYXBhbjEiIHx8IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZyA9PT0gIktvcmVhMSIpKSkgewogICAgICBjb25zdCB7CiAgICAgICAgcmVnaXN0cnksCiAgICAgICAgb3JkZXJpbmcKICAgICAgfSA9IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mbzsKICAgICAgY29uc3QgdWNzMkNNYXBOYW1lID0gTmFtZS5nZXQoYCR7cmVnaXN0cnl9LSR7b3JkZXJpbmd9LVVDUzJgKTsKICAgICAgY29uc3QgdWNzMkNNYXAgPSBhd2FpdCBDTWFwRmFjdG9yeS5jcmVhdGUoewogICAgICAgIGVuY29kaW5nOiB1Y3MyQ01hcE5hbWUsCiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgIHVzZUNNYXA6IG51bGwKICAgICAgfSk7CiAgICAgIGNvbnN0IHRvVW5pY29kZSA9IFtdLAogICAgICAgIGJ1ZiA9IFtdOwogICAgICBwcm9wZXJ0aWVzLmNNYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhcmNvZGUsIGNpZCkgewogICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpOwogICAgICAgIH0KICAgICAgICBjb25zdCB1Y3MyID0gdWNzMkNNYXAubG9va3VwKGNpZCk7CiAgICAgICAgaWYgKHVjczIpIHsKICAgICAgICAgIGJ1Zi5sZW5ndGggPSAwOwogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdWNzMi5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgICAgIGJ1Zi5wdXNoKCh1Y3MyLmNoYXJDb2RlQXQoaSkgPDwgOCkgKyB1Y3MyLmNoYXJDb2RlQXQoaSArIDEpKTsKICAgICAgICAgIH0KICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAodG9Vbmljb2RlKTsKICAgIH0KICAgIHJldHVybiBuZXcgSWRlbnRpdHlUb1VuaWNvZGVNYXAocHJvcGVydGllcy5maXJzdENoYXIsIHByb3BlcnRpZXMubGFzdENoYXIpOwogIH0KICBhc3luYyByZWFkVG9Vbmljb2RlKGNtYXBPYmopIHsKICAgIGlmICghY21hcE9iaikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChjbWFwT2JqIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBjb25zdCBjbWFwID0gYXdhaXQgQ01hcEZhY3RvcnkuY3JlYXRlKHsKICAgICAgICBlbmNvZGluZzogY21hcE9iaiwKICAgICAgICBmZXRjaEJ1aWx0SW5DTWFwOiB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsCiAgICAgICAgdXNlQ01hcDogbnVsbAogICAgICB9KTsKICAgICAgaWYgKGNtYXAgaW5zdGFuY2VvZiBJZGVudGl0eUNNYXApIHsKICAgICAgICByZXR1cm4gbmV3IElkZW50aXR5VG9Vbmljb2RlTWFwKDAsIDB4ZmZmZik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAoY21hcC5nZXRNYXAoKSk7CiAgICB9CiAgICBpZiAoY21hcE9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBjbWFwID0gYXdhaXQgQ01hcEZhY3RvcnkuY3JlYXRlKHsKICAgICAgICAgIGVuY29kaW5nOiBjbWFwT2JqLAogICAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgICAgdXNlQ01hcDogbnVsbAogICAgICAgIH0pOwogICAgICAgIGlmIChjbWFwIGluc3RhbmNlb2YgSWRlbnRpdHlDTWFwKSB7CiAgICAgICAgICByZXR1cm4gbmV3IElkZW50aXR5VG9Vbmljb2RlTWFwKDAsIDB4ZmZmZik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hcCA9IG5ldyBBcnJheShjbWFwLmxlbmd0aCk7CiAgICAgICAgY21hcC5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgdG9rZW4pIHsKICAgICAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIG1hcFtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludCh0b2tlbik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0b2tlbi5sZW5ndGggJSAyICE9PSAwKSB7CiAgICAgICAgICAgIHRva2VuID0gIlx1MDAwMCIgKyB0b2tlbjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHN0ciA9IFtdOwogICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB0b2tlbi5sZW5ndGg7IGsgKz0gMikgewogICAgICAgICAgICBjb25zdCB3MSA9IHRva2VuLmNoYXJDb2RlQXQoaykgPDwgOCB8IHRva2VuLmNoYXJDb2RlQXQoayArIDEpOwogICAgICAgICAgICBpZiAoKHcxICYgMHhmODAwKSAhPT0gMHhkODAwKSB7CiAgICAgICAgICAgICAgc3RyLnB1c2godzEpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGsgKz0gMjsKICAgICAgICAgICAgY29uc3QgdzIgPSB0b2tlbi5jaGFyQ29kZUF0KGspIDw8IDggfCB0b2tlbi5jaGFyQ29kZUF0KGsgKyAxKTsKICAgICAgICAgICAgc3RyLnB1c2goKCh3MSAmIDB4M2ZmKSA8PCAxMCkgKyAodzIgJiAweDNmZikgKyAweDEwMDAwKTsKICAgICAgICAgIH0KICAgICAgICAgIG1hcFtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5zdHIpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBuZXcgVG9Vbmljb2RlTWFwKG1hcCk7CiAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICB3YXJuKGByZWFkVG9Vbmljb2RlIC0gaWdub3JpbmcgVG9Vbmljb2RlIGRhdGE6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHJlYWRDaWRUb0dpZE1hcChnbHlwaHNEYXRhLCB0b1VuaWNvZGUpIHsKICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgZm9yIChsZXQgaiA9IDAsIGpqID0gZ2x5cGhzRGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIGNvbnN0IGdseXBoSUQgPSBnbHlwaHNEYXRhW2orK10gPDwgOCB8IGdseXBoc0RhdGFbal07CiAgICAgIGNvbnN0IGNvZGUgPSBqID4+IDE7CiAgICAgIGlmIChnbHlwaElEID09PSAwICYmICF0b1VuaWNvZGUuaGFzKGNvZGUpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgcmVzdWx0W2NvZGVdID0gZ2x5cGhJRDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGV4dHJhY3RXaWR0aHMoZGljdCwgZGVzY3JpcHRvciwgcHJvcGVydGllcykgewogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGxldCBnbHlwaHNXaWR0aHMgPSBbXTsKICAgIGxldCBkZWZhdWx0V2lkdGggPSAwOwogICAgY29uc3QgZ2x5cGhzVk1ldHJpY3MgPSBbXTsKICAgIGxldCBkZWZhdWx0Vk1ldHJpY3M7CiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgY29uc3QgZHcgPSBkaWN0LmdldCgiRFciKTsKICAgICAgZGVmYXVsdFdpZHRoID0gdHlwZW9mIGR3ID09PSAibnVtYmVyIiA/IE1hdGguY2VpbChkdykgOiAxMDAwOwogICAgICBjb25zdCB3aWR0aHMgPSBkaWN0LmdldCgiVyIpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheSh3aWR0aHMpKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gd2lkdGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGxldCBzdGFydCA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbaSsrXSk7CiAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoc3RhcnQpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgY29kZSA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbaV0pOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29kZSkpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvZGUpIHsKICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IHhyZWYuZmV0Y2hJZlJlZihjKTsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgZ2x5cGhzV2lkdGhzW3N0YXJ0XSA9IHdpZHRoOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKE51bWJlci5pc0ludGVnZXIoY29kZSkpIHsKICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzWysraV0pOwogICAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoICE9PSAibnVtYmVyIikgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAobGV0IGogPSBzdGFydDsgaiA8PSBjb2RlOyBqKyspIHsKICAgICAgICAgICAgICBnbHlwaHNXaWR0aHNbal0gPSB3aWR0aDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwcm9wZXJ0aWVzLnZlcnRpY2FsKSB7CiAgICAgICAgY29uc3QgZHcyID0gZGljdC5nZXRBcnJheSgiRFcyIik7CiAgICAgICAgbGV0IHZtZXRyaWNzID0gaXNOdW1iZXJBcnJheShkdzIsIDIpID8gZHcyIDogWzg4MCwgLTEwMDBdOwogICAgICAgIGRlZmF1bHRWTWV0cmljcyA9IFt2bWV0cmljc1sxXSwgZGVmYXVsdFdpZHRoICogMC41LCB2bWV0cmljc1swXV07CiAgICAgICAgdm1ldHJpY3MgPSBkaWN0LmdldCgiVzIiKTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2bWV0cmljcykpIHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZtZXRyaWNzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgbGV0IHN0YXJ0ID0geHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzW2krK10pOwogICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoc3RhcnQpKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY29kZSA9IHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1tpXSk7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvZGUpKSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gY29kZS5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgICAgICAgICAgICBjb25zdCB2bWV0cmljID0gW3hyZWYuZmV0Y2hJZlJlZihjb2RlW2orK10pLCB4cmVmLmZldGNoSWZSZWYoY29kZVtqKytdKSwgeHJlZi5mZXRjaElmUmVmKGNvZGVbal0pXTsKICAgICAgICAgICAgICAgIGlmIChpc051bWJlckFycmF5KHZtZXRyaWMsIG51bGwpKSB7CiAgICAgICAgICAgICAgICAgIGdseXBoc1ZNZXRyaWNzW3N0YXJ0XSA9IHZtZXRyaWM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpKSB7CiAgICAgICAgICAgICAgY29uc3Qgdm1ldHJpYyA9IFt4cmVmLmZldGNoSWZSZWYodm1ldHJpY3NbKytpXSksIHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1srK2ldKSwgeHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzWysraV0pXTsKICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyQXJyYXkodm1ldHJpYywgbnVsbCkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmb3IgKGxldCBqID0gc3RhcnQ7IGogPD0gY29kZTsgaisrKSB7CiAgICAgICAgICAgICAgICBnbHlwaHNWTWV0cmljc1tqXSA9IHZtZXRyaWM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCB3aWR0aHMgPSBkaWN0LmdldCgiV2lkdGhzIik7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHdpZHRocykpIHsKICAgICAgICBsZXQgaiA9IHByb3BlcnRpZXMuZmlyc3RDaGFyOwogICAgICAgIGZvciAoY29uc3QgdyBvZiB3aWR0aHMpIHsKICAgICAgICAgIGNvbnN0IHdpZHRoID0geHJlZi5mZXRjaElmUmVmKHcpOwogICAgICAgICAgaWYgKHR5cGVvZiB3aWR0aCA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgZ2x5cGhzV2lkdGhzW2pdID0gd2lkdGg7CiAgICAgICAgICB9CiAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1pc3NpbmdXaWR0aCA9IGRlc2NyaXB0b3IuZ2V0KCJNaXNzaW5nV2lkdGgiKTsKICAgICAgICBkZWZhdWx0V2lkdGggPSB0eXBlb2YgbWlzc2luZ1dpZHRoID09PSAibnVtYmVyIiA/IG1pc3NpbmdXaWR0aCA6IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgYmFzZUZvbnROYW1lID0gZGljdC5nZXQoIkJhc2VGb250Iik7CiAgICAgICAgaWYgKGJhc2VGb250TmFtZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUubmFtZSk7CiAgICAgICAgICBnbHlwaHNXaWR0aHMgPSB0aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKG1ldHJpY3Mud2lkdGhzLCBwcm9wZXJ0aWVzKTsKICAgICAgICAgIGRlZmF1bHRXaWR0aCA9IG1ldHJpY3MuZGVmYXVsdFdpZHRoOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgbGV0IGlzTW9ub3NwYWNlID0gdHJ1ZTsKICAgIGxldCBmaXJzdFdpZHRoID0gZGVmYXVsdFdpZHRoOwogICAgZm9yIChjb25zdCBnbHlwaCBpbiBnbHlwaHNXaWR0aHMpIHsKICAgICAgY29uc3QgZ2x5cGhXaWR0aCA9IGdseXBoc1dpZHRoc1tnbHlwaF07CiAgICAgIGlmICghZ2x5cGhXaWR0aCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghZmlyc3RXaWR0aCkgewogICAgICAgIGZpcnN0V2lkdGggPSBnbHlwaFdpZHRoOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChmaXJzdFdpZHRoICE9PSBnbHlwaFdpZHRoKSB7CiAgICAgICAgaXNNb25vc3BhY2UgPSBmYWxzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGlzTW9ub3NwYWNlKSB7CiAgICAgIHByb3BlcnRpZXMuZmxhZ3MgfD0gRm9udEZsYWdzLkZpeGVkUGl0Y2g7CiAgICB9IGVsc2UgewogICAgICBwcm9wZXJ0aWVzLmZsYWdzICY9IH5Gb250RmxhZ3MuRml4ZWRQaXRjaDsKICAgIH0KICAgIHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoID0gZGVmYXVsdFdpZHRoOwogICAgcHJvcGVydGllcy53aWR0aHMgPSBnbHlwaHNXaWR0aHM7CiAgICBwcm9wZXJ0aWVzLmRlZmF1bHRWTWV0cmljcyA9IGRlZmF1bHRWTWV0cmljczsKICAgIHByb3BlcnRpZXMudm1ldHJpY3MgPSBnbHlwaHNWTWV0cmljczsKICB9CiAgaXNTZXJpZkZvbnQoYmFzZUZvbnROYW1lKSB7CiAgICBjb25zdCBmb250TmFtZVdvU3R5bGUgPSBiYXNlRm9udE5hbWUuc3BsaXQoIi0iLCAxKVswXTsKICAgIHJldHVybiBmb250TmFtZVdvU3R5bGUgaW4gZ2V0U2VyaWZGb250cygpIHx8IC9zZXJpZi9naS50ZXN0KGZvbnROYW1lV29TdHlsZSk7CiAgfQogIGdldEJhc2VGb250TWV0cmljcyhuYW1lKSB7CiAgICBsZXQgZGVmYXVsdFdpZHRoID0gMDsKICAgIGxldCB3aWR0aHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IG1vbm9zcGFjZSA9IGZhbHNlOwogICAgY29uc3Qgc3RkRm9udE1hcCA9IGdldFN0ZEZvbnRNYXAoKTsKICAgIGxldCBsb29rdXBOYW1lID0gc3RkRm9udE1hcFtuYW1lXSB8fCBuYW1lOwogICAgY29uc3QgTWV0cmljcyA9IGdldE1ldHJpY3MoKTsKICAgIGlmICghKGxvb2t1cE5hbWUgaW4gTWV0cmljcykpIHsKICAgICAgbG9va3VwTmFtZSA9IHRoaXMuaXNTZXJpZkZvbnQobmFtZSkgPyAiVGltZXMtUm9tYW4iIDogIkhlbHZldGljYSI7CiAgICB9CiAgICBjb25zdCBnbHlwaFdpZHRocyA9IE1ldHJpY3NbbG9va3VwTmFtZV07CiAgICBpZiAodHlwZW9mIGdseXBoV2lkdGhzID09PSAibnVtYmVyIikgewogICAgICBkZWZhdWx0V2lkdGggPSBnbHlwaFdpZHRoczsKICAgICAgbW9ub3NwYWNlID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHdpZHRocyA9IGdseXBoV2lkdGhzKCk7CiAgICB9CiAgICByZXR1cm4gewogICAgICBkZWZhdWx0V2lkdGgsCiAgICAgIG1vbm9zcGFjZSwKICAgICAgd2lkdGhzCiAgICB9OwogIH0KICBidWlsZENoYXJDb2RlVG9XaWR0aCh3aWR0aHNCeUdseXBoTmFtZSwgcHJvcGVydGllcykgewogICAgY29uc3Qgd2lkdGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IGRpZmZlcmVuY2VzID0gcHJvcGVydGllcy5kaWZmZXJlbmNlczsKICAgIGNvbnN0IGVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmc7CiAgICBmb3IgKGxldCBjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgMjU2OyBjaGFyQ29kZSsrKSB7CiAgICAgIGlmIChjaGFyQ29kZSBpbiBkaWZmZXJlbmNlcyAmJiB3aWR0aHNCeUdseXBoTmFtZVtkaWZmZXJlbmNlc1tjaGFyQ29kZV1dKSB7CiAgICAgICAgd2lkdGhzW2NoYXJDb2RlXSA9IHdpZHRoc0J5R2x5cGhOYW1lW2RpZmZlcmVuY2VzW2NoYXJDb2RlXV07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGNoYXJDb2RlIGluIGVuY29kaW5nICYmIHdpZHRoc0J5R2x5cGhOYW1lW2VuY29kaW5nW2NoYXJDb2RlXV0pIHsKICAgICAgICB3aWR0aHNbY2hhckNvZGVdID0gd2lkdGhzQnlHbHlwaE5hbWVbZW5jb2RpbmdbY2hhckNvZGVdXTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHdpZHRoczsKICB9CiAgcHJlRXZhbHVhdGVGb250KGRpY3QpIHsKICAgIGNvbnN0IGJhc2VEaWN0ID0gZGljdDsKICAgIGxldCB0eXBlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBOYW1lKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBTdWJ0eXBlIik7CiAgICB9CiAgICBsZXQgY29tcG9zaXRlID0gZmFsc2U7CiAgICBsZXQgaGFzaDsKICAgIGlmICh0eXBlLm5hbWUgPT09ICJUeXBlMCIpIHsKICAgICAgY29uc3QgZGYgPSBkaWN0LmdldCgiRGVzY2VuZGFudEZvbnRzIik7CiAgICAgIGlmICghZGYpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkRlc2NlbmRhbnQgZm9udHMgYXJlIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgfQogICAgICBkaWN0ID0gQXJyYXkuaXNBcnJheShkZikgPyB0aGlzLnhyZWYuZmV0Y2hJZlJlZihkZlswXSkgOiBkZjsKICAgICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJEZXNjZW5kYW50IGZvbnQgaXMgbm90IGEgZGljdGlvbmFyeS4iKTsKICAgICAgfQogICAgICB0eXBlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgU3VidHlwZSIpOwogICAgICB9CiAgICAgIGNvbXBvc2l0ZSA9IHRydWU7CiAgICB9CiAgICBsZXQgZmlyc3RDaGFyID0gZGljdC5nZXQoIkZpcnN0Q2hhciIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0Q2hhcikpIHsKICAgICAgZmlyc3RDaGFyID0gMDsKICAgIH0KICAgIGxldCBsYXN0Q2hhciA9IGRpY3QuZ2V0KCJMYXN0Q2hhciIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGxhc3RDaGFyKSkgewogICAgICBsYXN0Q2hhciA9IGNvbXBvc2l0ZSA/IDB4ZmZmZiA6IDB4ZmY7CiAgICB9CiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGljdC5nZXQoIkZvbnREZXNjcmlwdG9yIik7CiAgICBjb25zdCB0b1VuaWNvZGUgPSBkaWN0LmdldCgiVG9Vbmljb2RlIikgfHwgYmFzZURpY3QuZ2V0KCJUb1VuaWNvZGUiKTsKICAgIGlmIChkZXNjcmlwdG9yKSB7CiAgICAgIGhhc2ggPSBuZXcgTXVybXVySGFzaDNfNjQoKTsKICAgICAgY29uc3QgZW5jb2RpbmcgPSBiYXNlRGljdC5nZXRSYXcoIkVuY29kaW5nIik7CiAgICAgIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBoYXNoLnVwZGF0ZShlbmNvZGluZy5uYW1lKTsKICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGhhc2gudXBkYXRlKGVuY29kaW5nLnRvU3RyaW5nKCkpOwogICAgICB9IGVsc2UgaWYgKGVuY29kaW5nIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW5jb2RpbmcuZ2V0UmF3VmFsdWVzKCkpIHsKICAgICAgICAgIGlmIChlbnRyeSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgaGFzaC51cGRhdGUoZW50cnkubmFtZSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIGhhc2gudXBkYXRlKGVudHJ5LnRvU3RyaW5nKCkpOwogICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkgewogICAgICAgICAgICBjb25zdCBkaWZmTGVuZ3RoID0gZW50cnkubGVuZ3RoLAogICAgICAgICAgICAgIGRpZmZCdWYgPSBuZXcgQXJyYXkoZGlmZkxlbmd0aCk7CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGlmZkxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgY29uc3QgZGlmZkVudHJ5ID0gZW50cnlbal07CiAgICAgICAgICAgICAgaWYgKGRpZmZFbnRyeSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICAgIGRpZmZCdWZbal0gPSBkaWZmRW50cnkubmFtZTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkaWZmRW50cnkgPT09ICJudW1iZXIiIHx8IGRpZmZFbnRyeSBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgICAgZGlmZkJ1ZltqXSA9IGRpZmZFbnRyeS50b1N0cmluZygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBoYXNoLnVwZGF0ZShkaWZmQnVmLmpvaW4oKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGhhc2gudXBkYXRlKGAke2ZpcnN0Q2hhcn0tJHtsYXN0Q2hhcn1gKTsKICAgICAgaWYgKHRvVW5pY29kZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICBjb25zdCBzdHJlYW0gPSB0b1VuaWNvZGUuc3RyIHx8IHRvVW5pY29kZTsKICAgICAgICBjb25zdCB1aW50OGFycmF5ID0gc3RyZWFtLmJ1ZmZlciA/IG5ldyBVaW50OEFycmF5KHN0cmVhbS5idWZmZXIuYnVmZmVyLCAwLCBzdHJlYW0uYnVmZmVyTGVuZ3RoKSA6IG5ldyBVaW50OEFycmF5KHN0cmVhbS5ieXRlcy5idWZmZXIsIHN0cmVhbS5zdGFydCwgc3RyZWFtLmVuZCAtIHN0cmVhbS5zdGFydCk7CiAgICAgICAgaGFzaC51cGRhdGUodWludDhhcnJheSk7CiAgICAgIH0gZWxzZSBpZiAodG9Vbmljb2RlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgIGhhc2gudXBkYXRlKHRvVW5pY29kZS5uYW1lKTsKICAgICAgfQogICAgICBjb25zdCB3aWR0aHMgPSBkaWN0LmdldCgiV2lkdGhzIikgfHwgYmFzZURpY3QuZ2V0KCJXaWR0aHMiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2lkdGhzKSkgewogICAgICAgIGNvbnN0IHdpZHRoc0J1ZiA9IFtdOwogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2Ygd2lkdGhzKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAibnVtYmVyIiB8fCBlbnRyeSBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICB3aWR0aHNCdWYucHVzaChlbnRyeS50b1N0cmluZygpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaGFzaC51cGRhdGUod2lkdGhzQnVmLmpvaW4oKSk7CiAgICAgIH0KICAgICAgaWYgKGNvbXBvc2l0ZSkgewogICAgICAgIGhhc2gudXBkYXRlKCJjb21wb3NpdGVGb250Iik7CiAgICAgICAgY29uc3QgY29tcG9zaXRlV2lkdGhzID0gZGljdC5nZXQoIlciKSB8fCBiYXNlRGljdC5nZXQoIlciKTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb21wb3NpdGVXaWR0aHMpKSB7CiAgICAgICAgICBjb25zdCB3aWR0aHNCdWYgPSBbXTsKICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY29tcG9zaXRlV2lkdGhzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICJudW1iZXIiIHx8IGVudHJ5IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgICAgd2lkdGhzQnVmLnB1c2goZW50cnkudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkpIHsKICAgICAgICAgICAgICBjb25zdCBzdWJXaWR0aHNCdWYgPSBbXTsKICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZW50cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gIm51bWJlciIgfHwgZWxlbWVudCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgICAgICBzdWJXaWR0aHNCdWYucHVzaChlbGVtZW50LnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB3aWR0aHNCdWYucHVzaChgWyR7c3ViV2lkdGhzQnVmLmpvaW4oKX1dYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGhhc2gudXBkYXRlKHdpZHRoc0J1Zi5qb2luKCkpOwogICAgICAgIH0KICAgICAgICBjb25zdCBjaWRUb0dpZE1hcCA9IGRpY3QuZ2V0UmF3KCJDSURUb0dJRE1hcCIpIHx8IGJhc2VEaWN0LmdldFJhdygiQ0lEVG9HSURNYXAiKTsKICAgICAgICBpZiAoY2lkVG9HaWRNYXAgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICBoYXNoLnVwZGF0ZShjaWRUb0dpZE1hcC5uYW1lKTsKICAgICAgICB9IGVsc2UgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICBoYXNoLnVwZGF0ZShjaWRUb0dpZE1hcC50b1N0cmluZygpKTsKICAgICAgICB9IGVsc2UgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgICAgaGFzaC51cGRhdGUoY2lkVG9HaWRNYXAucGVla0J5dGVzKCkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHsKICAgICAgZGVzY3JpcHRvciwKICAgICAgZGljdCwKICAgICAgYmFzZURpY3QsCiAgICAgIGNvbXBvc2l0ZSwKICAgICAgdHlwZTogdHlwZS5uYW1lLAogICAgICBmaXJzdENoYXIsCiAgICAgIGxhc3RDaGFyLAogICAgICB0b1VuaWNvZGUsCiAgICAgIGhhc2g6IGhhc2ggPyBoYXNoLmhleGRpZ2VzdCgpIDogIiIKICAgIH07CiAgfQogIGFzeW5jIHRyYW5zbGF0ZUZvbnQoewogICAgZGVzY3JpcHRvciwKICAgIGRpY3QsCiAgICBiYXNlRGljdCwKICAgIGNvbXBvc2l0ZSwKICAgIHR5cGUsCiAgICBmaXJzdENoYXIsCiAgICBsYXN0Q2hhciwKICAgIHRvVW5pY29kZSwKICAgIGNzc0ZvbnRJbmZvCiAgfSkgewogICAgY29uc3QgaXNUeXBlM0ZvbnQgPSB0eXBlID09PSAiVHlwZTMiOwogICAgaWYgKCFkZXNjcmlwdG9yKSB7CiAgICAgIGlmIChpc1R5cGUzRm9udCkgewogICAgICAgIGNvbnN0IGJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGRpY3QuZ2V0QXJyYXkoIkZvbnRCQm94IiksIFswLCAwLCAwLCAwXSk7CiAgICAgICAgZGVzY3JpcHRvciA9IG5ldyBEaWN0KG51bGwpOwogICAgICAgIGRlc2NyaXB0b3Iuc2V0KCJGb250TmFtZSIsIE5hbWUuZ2V0KHR5cGUpKTsKICAgICAgICBkZXNjcmlwdG9yLnNldCgiRm9udEJCb3giLCBiYm94KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgYmFzZUZvbnROYW1lID0gZGljdC5nZXQoIkJhc2VGb250Iik7CiAgICAgICAgaWYgKCEoYmFzZUZvbnROYW1lIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFzZSBmb250IGlzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9CiAgICAgICAgYmFzZUZvbnROYW1lID0gYmFzZUZvbnROYW1lLm5hbWUucmVwbGFjZUFsbCgvWyxfXS9nLCAiLSIpOwogICAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUpOwogICAgICAgIGNvbnN0IGZvbnROYW1lV29TdHlsZSA9IGJhc2VGb250TmFtZS5zcGxpdCgiLSIsIDEpWzBdOwogICAgICAgIGNvbnN0IGZsYWdzID0gKHRoaXMuaXNTZXJpZkZvbnQoZm9udE5hbWVXb1N0eWxlKSA/IEZvbnRGbGFncy5TZXJpZiA6IDApIHwgKG1ldHJpY3MubW9ub3NwYWNlID8gRm9udEZsYWdzLkZpeGVkUGl0Y2ggOiAwKSB8IChnZXRTeW1ib2xzRm9udHMoKVtmb250TmFtZVdvU3R5bGVdID8gRm9udEZsYWdzLlN5bWJvbGljIDogRm9udEZsYWdzLk5vbnN5bWJvbGljKTsKICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gewogICAgICAgICAgdHlwZSwKICAgICAgICAgIG5hbWU6IGJhc2VGb250TmFtZSwKICAgICAgICAgIGxvYWRlZE5hbWU6IGJhc2VEaWN0LmxvYWRlZE5hbWUsCiAgICAgICAgICBzeXN0ZW1Gb250SW5mbzogbnVsbCwKICAgICAgICAgIHdpZHRoczogbWV0cmljcy53aWR0aHMsCiAgICAgICAgICBkZWZhdWx0V2lkdGg6IG1ldHJpY3MuZGVmYXVsdFdpZHRoLAogICAgICAgICAgaXNTaW11bGF0ZWRGbGFnczogdHJ1ZSwKICAgICAgICAgIGZsYWdzLAogICAgICAgICAgZmlyc3RDaGFyLAogICAgICAgICAgbGFzdENoYXIsCiAgICAgICAgICB0b1VuaWNvZGUsCiAgICAgICAgICB4SGVpZ2h0OiAwLAogICAgICAgICAgY2FwSGVpZ2h0OiAwLAogICAgICAgICAgaXRhbGljQW5nbGU6IDAsCiAgICAgICAgICBpc1R5cGUzRm9udAogICAgICAgIH07CiAgICAgICAgY29uc3Qgd2lkdGhzID0gZGljdC5nZXQoIldpZHRocyIpOwogICAgICAgIGNvbnN0IHN0YW5kYXJkRm9udE5hbWUgPSBnZXRTdGFuZGFyZEZvbnROYW1lKGJhc2VGb250TmFtZSk7CiAgICAgICAgbGV0IGZpbGUgPSBudWxsOwogICAgICAgIGlmIChzdGFuZGFyZEZvbnROYW1lKSB7CiAgICAgICAgICBmaWxlID0gYXdhaXQgdGhpcy5mZXRjaFN0YW5kYXJkRm9udERhdGEoc3RhbmRhcmRGb250TmFtZSk7CiAgICAgICAgICBwcm9wZXJ0aWVzLmlzSW50ZXJuYWxGb250ID0gISFmaWxlOwogICAgICAgIH0KICAgICAgICBpZiAoIXByb3BlcnRpZXMuaXNJbnRlcm5hbEZvbnQgJiYgdGhpcy5vcHRpb25zLnVzZVN5c3RlbUZvbnRzKSB7CiAgICAgICAgICBwcm9wZXJ0aWVzLnN5c3RlbUZvbnRJbmZvID0gZ2V0Rm9udFN1YnN0aXR1dGlvbih0aGlzLnN5c3RlbUZvbnRDYWNoZSwgdGhpcy5pZEZhY3RvcnksIHRoaXMub3B0aW9ucy5zdGFuZGFyZEZvbnREYXRhVXJsLCBiYXNlRm9udE5hbWUsIHN0YW5kYXJkRm9udE5hbWUsIHR5cGUpOwogICAgICAgIH0KICAgICAgICBjb25zdCBuZXdQcm9wZXJ0aWVzID0gYXdhaXQgdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoZGljdCwgcHJvcGVydGllcyk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2lkdGhzKSkgewogICAgICAgICAgY29uc3QgZ2x5cGhXaWR0aHMgPSBbXTsKICAgICAgICAgIGxldCBqID0gZmlyc3RDaGFyOwogICAgICAgICAgZm9yIChjb25zdCB3IG9mIHdpZHRocykgewogICAgICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHcpOwogICAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgIGdseXBoV2lkdGhzW2pdID0gd2lkdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaisrOwogICAgICAgICAgfQogICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSBnbHlwaFdpZHRoczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSB0aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKG1ldHJpY3Mud2lkdGhzLCBuZXdQcm9wZXJ0aWVzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBGb250KGJhc2VGb250TmFtZSwgZmlsZSwgbmV3UHJvcGVydGllcywgdGhpcy5vcHRpb25zKTsKICAgICAgfQogICAgfQogICAgbGV0IGZvbnROYW1lID0gZGVzY3JpcHRvci5nZXQoIkZvbnROYW1lIik7CiAgICBsZXQgYmFzZUZvbnQgPSBkaWN0LmdldCgiQmFzZUZvbnQiKTsKICAgIGlmICh0eXBlb2YgZm9udE5hbWUgPT09ICJzdHJpbmciKSB7CiAgICAgIGZvbnROYW1lID0gTmFtZS5nZXQoZm9udE5hbWUpOwogICAgfQogICAgaWYgKHR5cGVvZiBiYXNlRm9udCA9PT0gInN0cmluZyIpIHsKICAgICAgYmFzZUZvbnQgPSBOYW1lLmdldChiYXNlRm9udCk7CiAgICB9CiAgICBjb25zdCBmb250TmFtZVN0ciA9IGZvbnROYW1lPy5uYW1lOwogICAgY29uc3QgYmFzZUZvbnRTdHIgPSBiYXNlRm9udD8ubmFtZTsKICAgIGlmICghaXNUeXBlM0ZvbnQgJiYgZm9udE5hbWVTdHIgIT09IGJhc2VGb250U3RyKSB7CiAgICAgIGluZm8oYFRoZSBGb250RGVzY3JpcHRvcidzIEZvbnROYW1lIGlzICIke2ZvbnROYW1lU3RyfSIgYnV0IGAgKyBgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBGb250J3MgQmFzZUZvbnQgIiR7YmFzZUZvbnRTdHJ9Ii5gKTsKICAgICAgaWYgKGZvbnROYW1lU3RyICYmIGJhc2VGb250U3RyICYmIChiYXNlRm9udFN0ci5zdGFydHNXaXRoKGZvbnROYW1lU3RyKSB8fCAhaXNLbm93bkZvbnROYW1lKGZvbnROYW1lU3RyKSAmJiBpc0tub3duRm9udE5hbWUoYmFzZUZvbnRTdHIpKSkgewogICAgICAgIGZvbnROYW1lID0gbnVsbDsKICAgICAgfQogICAgfQogICAgZm9udE5hbWUgfHw9IGJhc2VGb250OwogICAgaWYgKCEoZm9udE5hbWUgaW5zdGFuY2VvZiBOYW1lKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBuYW1lIik7CiAgICB9CiAgICBsZXQgZm9udEZpbGUsIHN1YnR5cGUsIGxlbmd0aDEsIGxlbmd0aDIsIGxlbmd0aDM7CiAgICB0cnkgewogICAgICBmb250RmlsZSA9IGRlc2NyaXB0b3IuZ2V0KCJGb250RmlsZSIsICJGb250RmlsZTIiLCAiRm9udEZpbGUzIik7CiAgICAgIGlmIChmb250RmlsZSkgewogICAgICAgIGlmICghKGZvbnRGaWxlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRm9udEZpbGUgc2hvdWxkIGJlIGEgc3RyZWFtIik7CiAgICAgICAgfSBlbHNlIGlmIChmb250RmlsZS5pc0VtcHR5KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkZvbnRGaWxlIGlzIGVtcHR5Iik7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKGB0cmFuc2xhdGVGb250IC0gZmV0Y2hpbmcgIiR7Zm9udE5hbWUubmFtZX0iIGZvbnQgZmlsZTogIiR7ZXh9Ii5gKTsKICAgICAgZm9udEZpbGUgPSBudWxsOwogICAgfQogICAgbGV0IGlzSW50ZXJuYWxGb250ID0gZmFsc2U7CiAgICBsZXQgZ2x5cGhTY2FsZUZhY3RvcnMgPSBudWxsOwogICAgbGV0IHN5c3RlbUZvbnRJbmZvID0gbnVsbDsKICAgIGlmIChmb250RmlsZSkgewogICAgICBpZiAoZm9udEZpbGUuZGljdCkgewogICAgICAgIGNvbnN0IHN1YnR5cGVFbnRyeSA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CiAgICAgICAgaWYgKHN1YnR5cGVFbnRyeSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIHN1YnR5cGUgPSBzdWJ0eXBlRW50cnkubmFtZTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoMSA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJMZW5ndGgxIik7CiAgICAgICAgbGVuZ3RoMiA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJMZW5ndGgyIik7CiAgICAgICAgbGVuZ3RoMyA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJMZW5ndGgzIik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY3NzRm9udEluZm8pIHsKICAgICAgY29uc3Qgc3RhbmRhcmRGb250TmFtZSA9IGdldFhmYUZvbnROYW1lKGZvbnROYW1lLm5hbWUpOwogICAgICBpZiAoc3RhbmRhcmRGb250TmFtZSkgewogICAgICAgIGNzc0ZvbnRJbmZvLmZvbnRGYW1pbHkgPSBgJHtjc3NGb250SW5mby5mb250RmFtaWx5fS1QZGZKUy1YRkFgOwogICAgICAgIGNzc0ZvbnRJbmZvLm1ldHJpY3MgPSBzdGFuZGFyZEZvbnROYW1lLm1ldHJpY3MgfHwgbnVsbDsKICAgICAgICBnbHlwaFNjYWxlRmFjdG9ycyA9IHN0YW5kYXJkRm9udE5hbWUuZmFjdG9ycyB8fCBudWxsOwogICAgICAgIGZvbnRGaWxlID0gYXdhaXQgdGhpcy5mZXRjaFN0YW5kYXJkRm9udERhdGEoc3RhbmRhcmRGb250TmFtZS5uYW1lKTsKICAgICAgICBpc0ludGVybmFsRm9udCA9ICEhZm9udEZpbGU7CiAgICAgICAgYmFzZURpY3QgPSBkaWN0ID0gZ2V0WGZhRm9udERpY3QoZm9udE5hbWUubmFtZSk7CiAgICAgICAgY29tcG9zaXRlID0gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIGlmICghaXNUeXBlM0ZvbnQpIHsKICAgICAgY29uc3Qgc3RhbmRhcmRGb250TmFtZSA9IGdldFN0YW5kYXJkRm9udE5hbWUoZm9udE5hbWUubmFtZSk7CiAgICAgIGlmIChzdGFuZGFyZEZvbnROYW1lKSB7CiAgICAgICAgZm9udEZpbGUgPSBhd2FpdCB0aGlzLmZldGNoU3RhbmRhcmRGb250RGF0YShzdGFuZGFyZEZvbnROYW1lKTsKICAgICAgICBpc0ludGVybmFsRm9udCA9ICEhZm9udEZpbGU7CiAgICAgIH0KICAgICAgaWYgKCFpc0ludGVybmFsRm9udCAmJiB0aGlzLm9wdGlvbnMudXNlU3lzdGVtRm9udHMpIHsKICAgICAgICBzeXN0ZW1Gb250SW5mbyA9IGdldEZvbnRTdWJzdGl0dXRpb24odGhpcy5zeXN0ZW1Gb250Q2FjaGUsIHRoaXMuaWRGYWN0b3J5LCB0aGlzLm9wdGlvbnMuc3RhbmRhcmRGb250RGF0YVVybCwgZm9udE5hbWUubmFtZSwgc3RhbmRhcmRGb250TmFtZSwgdHlwZSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGZvbnRNYXRyaXggPSBsb29rdXBNYXRyaXgoZGljdC5nZXRBcnJheSgiRm9udE1hdHJpeCIpLCBGT05UX0lERU5USVRZX01BVFJJWCk7CiAgICBjb25zdCBiYm94ID0gbG9va3VwTm9ybWFsUmVjdChkZXNjcmlwdG9yLmdldEFycmF5KCJGb250QkJveCIpIHx8IGRpY3QuZ2V0QXJyYXkoIkZvbnRCQm94IiksIHVuZGVmaW5lZCk7CiAgICBsZXQgYXNjZW50ID0gZGVzY3JpcHRvci5nZXQoIkFzY2VudCIpOwogICAgaWYgKHR5cGVvZiBhc2NlbnQgIT09ICJudW1iZXIiKSB7CiAgICAgIGFzY2VudCA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGxldCBkZXNjZW50ID0gZGVzY3JpcHRvci5nZXQoIkRlc2NlbnQiKTsKICAgIGlmICh0eXBlb2YgZGVzY2VudCAhPT0gIm51bWJlciIpIHsKICAgICAgZGVzY2VudCA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGxldCB4SGVpZ2h0ID0gZGVzY3JpcHRvci5nZXQoIlhIZWlnaHQiKTsKICAgIGlmICh0eXBlb2YgeEhlaWdodCAhPT0gIm51bWJlciIpIHsKICAgICAgeEhlaWdodCA9IDA7CiAgICB9CiAgICBsZXQgY2FwSGVpZ2h0ID0gZGVzY3JpcHRvci5nZXQoIkNhcEhlaWdodCIpOwogICAgaWYgKHR5cGVvZiBjYXBIZWlnaHQgIT09ICJudW1iZXIiKSB7CiAgICAgIGNhcEhlaWdodCA9IDA7CiAgICB9CiAgICBsZXQgZmxhZ3MgPSBkZXNjcmlwdG9yLmdldCgiRmxhZ3MiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmbGFncykpIHsKICAgICAgZmxhZ3MgPSAwOwogICAgfQogICAgbGV0IGl0YWxpY0FuZ2xlID0gZGVzY3JpcHRvci5nZXQoIkl0YWxpY0FuZ2xlIik7CiAgICBpZiAodHlwZW9mIGl0YWxpY0FuZ2xlICE9PSAibnVtYmVyIikgewogICAgICBpdGFsaWNBbmdsZSA9IDA7CiAgICB9CiAgICBjb25zdCBwcm9wZXJ0aWVzID0gewogICAgICB0eXBlLAogICAgICBuYW1lOiBmb250TmFtZS5uYW1lLAogICAgICBzdWJ0eXBlLAogICAgICBmaWxlOiBmb250RmlsZSwKICAgICAgbGVuZ3RoMSwKICAgICAgbGVuZ3RoMiwKICAgICAgbGVuZ3RoMywKICAgICAgaXNJbnRlcm5hbEZvbnQsCiAgICAgIGxvYWRlZE5hbWU6IGJhc2VEaWN0LmxvYWRlZE5hbWUsCiAgICAgIGNvbXBvc2l0ZSwKICAgICAgZml4ZWRQaXRjaDogZmFsc2UsCiAgICAgIGZvbnRNYXRyaXgsCiAgICAgIGZpcnN0Q2hhciwKICAgICAgbGFzdENoYXIsCiAgICAgIHRvVW5pY29kZSwKICAgICAgYmJveCwKICAgICAgYXNjZW50LAogICAgICBkZXNjZW50LAogICAgICB4SGVpZ2h0LAogICAgICBjYXBIZWlnaHQsCiAgICAgIGZsYWdzLAogICAgICBpdGFsaWNBbmdsZSwKICAgICAgaXNUeXBlM0ZvbnQsCiAgICAgIGNzc0ZvbnRJbmZvLAogICAgICBzY2FsZUZhY3RvcnM6IGdseXBoU2NhbGVGYWN0b3JzLAogICAgICBzeXN0ZW1Gb250SW5mbwogICAgfTsKICAgIGlmIChjb21wb3NpdGUpIHsKICAgICAgY29uc3QgY2lkRW5jb2RpbmcgPSBiYXNlRGljdC5nZXQoIkVuY29kaW5nIik7CiAgICAgIGlmIChjaWRFbmNvZGluZyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBwcm9wZXJ0aWVzLmNpZEVuY29kaW5nID0gY2lkRW5jb2RpbmcubmFtZTsKICAgICAgfQogICAgICBjb25zdCBjTWFwID0gYXdhaXQgQ01hcEZhY3RvcnkuY3JlYXRlKHsKICAgICAgICBlbmNvZGluZzogY2lkRW5jb2RpbmcsCiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgIHVzZUNNYXA6IG51bGwKICAgICAgfSk7CiAgICAgIHByb3BlcnRpZXMuY01hcCA9IGNNYXA7CiAgICAgIHByb3BlcnRpZXMudmVydGljYWwgPSBwcm9wZXJ0aWVzLmNNYXAudmVydGljYWw7CiAgICB9CiAgICBjb25zdCBuZXdQcm9wZXJ0aWVzID0gYXdhaXQgdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoZGljdCwgcHJvcGVydGllcyk7CiAgICB0aGlzLmV4dHJhY3RXaWR0aHMoZGljdCwgZGVzY3JpcHRvciwgbmV3UHJvcGVydGllcyk7CiAgICByZXR1cm4gbmV3IEZvbnQoZm9udE5hbWUubmFtZSwgZm9udEZpbGUsIG5ld1Byb3BlcnRpZXMsIHRoaXMub3B0aW9ucyk7CiAgfQogIHN0YXRpYyBidWlsZEZvbnRQYXRocyhmb250LCBnbHlwaHMsIGhhbmRsZXIsIGV2YWx1YXRvck9wdGlvbnMpIHsKICAgIGZ1bmN0aW9uIGJ1aWxkUGF0aChmb250Q2hhcikgewogICAgICBjb25zdCBnbHlwaE5hbWUgPSBgJHtmb250LmxvYWRlZE5hbWV9X3BhdGhfJHtmb250Q2hhcn1gOwogICAgICB0cnkgewogICAgICAgIGlmIChmb250LnJlbmRlcmVyLmhhc0J1aWx0UGF0aChmb250Q2hhcikpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbZ2x5cGhOYW1lLCAiRm9udFBhdGgiLCBmb250LnJlbmRlcmVyLmdldFBhdGhKcyhmb250Q2hhcildKTsKICAgICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgICAgaWYgKGV2YWx1YXRvck9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICB3YXJuKGBidWlsZEZvbnRQYXRocyAtIGlnbm9yaW5nICR7Z2x5cGhOYW1lfSBnbHlwaDogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgfQogICAgfQogICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHsKICAgICAgYnVpbGRQYXRoKGdseXBoLmZvbnRDaGFyKTsKICAgICAgY29uc3QgYWNjZW50ID0gZ2x5cGguYWNjZW50OwogICAgICBpZiAoYWNjZW50Py5mb250Q2hhcikgewogICAgICAgIGJ1aWxkUGF0aChhY2NlbnQuZm9udENoYXIpOwogICAgICB9CiAgICB9CiAgfQogIHN0YXRpYyBnZXQgZmFsbGJhY2tGb250RGljdCgpIHsKICAgIGNvbnN0IGRpY3QgPSBuZXcgRGljdCgpOwogICAgZGljdC5zZXQoIkJhc2VGb250IiwgTmFtZS5nZXQoIkhlbHZldGljYSIpKTsKICAgIGRpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKTsKICAgIGRpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKTsKICAgIGRpY3Quc2V0KCJFbmNvZGluZyIsIE5hbWUuZ2V0KCJXaW5BbnNpRW5jb2RpbmciKSk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmYWxsYmFja0ZvbnREaWN0IiwgZGljdCk7CiAgfQp9CmNsYXNzIFRyYW5zbGF0ZWRGb250IHsKICAjc2VudCA9IGZhbHNlOwogICN0eXBlM0xvYWRlZCA9IG51bGw7CiAgY29uc3RydWN0b3IoewogICAgbG9hZGVkTmFtZSwKICAgIGZvbnQsCiAgICBkaWN0CiAgfSkgewogICAgdGhpcy5sb2FkZWROYW1lID0gbG9hZGVkTmFtZTsKICAgIHRoaXMuZm9udCA9IGZvbnQ7CiAgICB0aGlzLmRpY3QgPSBkaWN0OwogICAgdGhpcy50eXBlM0RlcGVuZGVuY2llcyA9IGZvbnQuaXNUeXBlM0ZvbnQgPyBuZXcgU2V0KCkgOiBudWxsOwogIH0KICBzZW5kKGhhbmRsZXIpIHsKICAgIGlmICh0aGlzLiNzZW50KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuI3NlbnQgPSB0cnVlOwogICAgaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbdGhpcy5sb2FkZWROYW1lLCAiRm9udCIsIHRoaXMuZm9udC5leHBvcnREYXRhKCldKTsKICB9CiAgZmFsbGJhY2soaGFuZGxlciwgZXZhbHVhdG9yT3B0aW9ucykgewogICAgaWYgKCF0aGlzLmZvbnQuZGF0YSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmZvbnQuZGlzYWJsZUZvbnRGYWNlID0gdHJ1ZTsKICAgIFBhcnRpYWxFdmFsdWF0b3IuYnVpbGRGb250UGF0aHModGhpcy5mb250LCB0aGlzLmZvbnQuZ2x5cGhDYWNoZVZhbHVlcywgaGFuZGxlciwgZXZhbHVhdG9yT3B0aW9ucyk7CiAgfQogIGxvYWRUeXBlM0RhdGEoZXZhbHVhdG9yLCByZXNvdXJjZXMsIHRhc2spIHsKICAgIGlmICh0aGlzLiN0eXBlM0xvYWRlZCkgewogICAgICByZXR1cm4gdGhpcy4jdHlwZTNMb2FkZWQ7CiAgICB9CiAgICBjb25zdCB7CiAgICAgIGZvbnQsCiAgICAgIHR5cGUzRGVwZW5kZW5jaWVzCiAgICB9ID0gdGhpczsKICAgIGFzc2VydChmb250LmlzVHlwZTNGb250LCAiTXVzdCBiZSBhIFR5cGUzIGZvbnQuIik7CiAgICBjb25zdCB0eXBlM0V2YWx1YXRvciA9IGV2YWx1YXRvci5jbG9uZSh7CiAgICAgIGlnbm9yZUVycm9yczogZmFsc2UKICAgIH0pOwogICAgY29uc3QgdHlwZTNGb250UmVmcyA9IG5ldyBSZWZTZXQoZXZhbHVhdG9yLnR5cGUzRm9udFJlZnMpOwogICAgaWYgKHRoaXMuZGljdC5vYmpJZCAmJiAhdHlwZTNGb250UmVmcy5oYXModGhpcy5kaWN0Lm9iaklkKSkgewogICAgICB0eXBlM0ZvbnRSZWZzLnB1dCh0aGlzLmRpY3Qub2JqSWQpOwogICAgfQogICAgdHlwZTNFdmFsdWF0b3IudHlwZTNGb250UmVmcyA9IHR5cGUzRm9udFJlZnM7CiAgICBsZXQgbG9hZENoYXJQcm9jc1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTsKICAgIGNvbnN0IGNoYXJQcm9jcyA9IHRoaXMuZGljdC5nZXQoIkNoYXJQcm9jcyIpOwogICAgY29uc3QgZm9udFJlc291cmNlcyA9IHRoaXMuZGljdC5nZXQoIlJlc291cmNlcyIpIHx8IHJlc291cmNlczsKICAgIGNvbnN0IGNoYXJQcm9jT3BlcmF0b3JMaXN0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IGZvbnRCQm94ID0gVXRpbC5ub3JtYWxpemVSZWN0KGZvbnQuYmJveCB8fCBbMCwgMCwgMCwgMF0pLAogICAgICB3aWR0aCA9IGZvbnRCQm94WzJdIC0gZm9udEJCb3hbMF0sCiAgICAgIGhlaWdodCA9IGZvbnRCQm94WzNdIC0gZm9udEJCb3hbMV07CiAgICBjb25zdCBmb250QkJveFNpemUgPSBNYXRoLmh5cG90KHdpZHRoLCBoZWlnaHQpOwogICAgZm9yIChjb25zdCBrZXkgb2YgY2hhclByb2NzLmdldEtleXMoKSkgewogICAgICBsb2FkQ2hhclByb2NzUHJvbWlzZSA9IGxvYWRDaGFyUHJvY3NQcm9taXNlLnRoZW4oKCkgPT4gewogICAgICAgIGNvbnN0IGdseXBoU3RyZWFtID0gY2hhclByb2NzLmdldChrZXkpOwogICAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoKTsKICAgICAgICByZXR1cm4gdHlwZTNFdmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgICAgIHN0cmVhbTogZ2x5cGhTdHJlYW0sCiAgICAgICAgICB0YXNrLAogICAgICAgICAgcmVzb3VyY2VzOiBmb250UmVzb3VyY2VzLAogICAgICAgICAgb3BlcmF0b3JMaXN0CiAgICAgICAgfSkudGhlbigoKSA9PiB7CiAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yTGlzdC5mbkFycmF5WzBdKSB7CiAgICAgICAgICAgIGNhc2UgT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kczoKICAgICAgICAgICAgICB0aGlzLiNyZW1vdmVUeXBlM0NvbG9yT3BlcmF0b3JzKG9wZXJhdG9yTGlzdCwgZm9udEJCb3hTaXplKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBPUFMuc2V0Q2hhcldpZHRoOgogICAgICAgICAgICAgIGlmICghZm9udEJCb3hTaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNndWVzc1R5cGUzRm9udEJCb3gob3BlcmF0b3JMaXN0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjaGFyUHJvY09wZXJhdG9yTGlzdFtrZXldID0gb3BlcmF0b3JMaXN0LmdldElSKCk7CiAgICAgICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygb3BlcmF0b3JMaXN0LmRlcGVuZGVuY2llcykgewogICAgICAgICAgICB0eXBlM0RlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7CiAgICAgICAgICB9CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgd2FybihgVHlwZTMgZm9udCByZXNvdXJjZSAiJHtrZXl9IiBpcyBub3QgYXZhaWxhYmxlLmApOwogICAgICAgICAgY29uc3QgZHVtbXlPcGVyYXRvckxpc3QgPSBuZXcgT3BlcmF0b3JMaXN0KCk7CiAgICAgICAgICBjaGFyUHJvY09wZXJhdG9yTGlzdFtrZXldID0gZHVtbXlPcGVyYXRvckxpc3QuZ2V0SVIoKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICB0aGlzLiN0eXBlM0xvYWRlZCA9IGxvYWRDaGFyUHJvY3NQcm9taXNlLnRoZW4oKCkgPT4gewogICAgICBmb250LmNoYXJQcm9jT3BlcmF0b3JMaXN0ID0gY2hhclByb2NPcGVyYXRvckxpc3Q7CiAgICAgIGlmICh0aGlzLl9iYm94KSB7CiAgICAgICAgZm9udC5pc0NoYXJCQm94ID0gdHJ1ZTsKICAgICAgICBmb250LmJib3ggPSB0aGlzLl9iYm94OwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0aGlzLiN0eXBlM0xvYWRlZDsKICB9CiAgI3JlbW92ZVR5cGUzQ29sb3JPcGVyYXRvcnMob3BlcmF0b3JMaXN0LCBmb250QkJveFNpemUgPSBOYU4pIHsKICAgIGNvbnN0IGNoYXJCQm94ID0gVXRpbC5ub3JtYWxpemVSZWN0KG9wZXJhdG9yTGlzdC5hcmdzQXJyYXlbMF0uc2xpY2UoMikpLAogICAgICB3aWR0aCA9IGNoYXJCQm94WzJdIC0gY2hhckJCb3hbMF0sCiAgICAgIGhlaWdodCA9IGNoYXJCQm94WzNdIC0gY2hhckJCb3hbMV07CiAgICBjb25zdCBjaGFyQkJveFNpemUgPSBNYXRoLmh5cG90KHdpZHRoLCBoZWlnaHQpOwogICAgaWYgKHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCkgewogICAgICBvcGVyYXRvckxpc3QuZm5BcnJheS5zcGxpY2UoMCwgMSk7CiAgICAgIG9wZXJhdG9yTGlzdC5hcmdzQXJyYXkuc3BsaWNlKDAsIDEpOwogICAgfSBlbHNlIGlmIChmb250QkJveFNpemUgPT09IDAgfHwgTWF0aC5yb3VuZChjaGFyQkJveFNpemUgLyBmb250QkJveFNpemUpID49IDEwKSB7CiAgICAgIHRoaXMuX2Jib3ggPz89IFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XTsKICAgICAgVXRpbC5yZWN0Qm91bmRpbmdCb3goLi4uY2hhckJCb3gsIHRoaXMuX2Jib3gpOwogICAgfQogICAgbGV0IGkgPSAwLAogICAgICBpaSA9IG9wZXJhdG9yTGlzdC5sZW5ndGg7CiAgICB3aGlsZSAoaSA8IGlpKSB7CiAgICAgIHN3aXRjaCAob3BlcmF0b3JMaXN0LmZuQXJyYXlbaV0pIHsKICAgICAgICBjYXNlIE9QUy5zZXRDaGFyV2lkdGhBbmRCb3VuZHM6CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VDb2xvclNwYWNlOgogICAgICAgIGNhc2UgT1BTLnNldEZpbGxDb2xvclNwYWNlOgogICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yOgogICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yTjoKICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3I6CiAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yTjoKICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VHcmF5OgogICAgICAgIGNhc2UgT1BTLnNldEZpbGxHcmF5OgogICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZVJHQkNvbG9yOgogICAgICAgIGNhc2UgT1BTLnNldEZpbGxSR0JDb2xvcjoKICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VDTVlLQ29sb3I6CiAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENNWUtDb2xvcjoKICAgICAgICBjYXNlIE9QUy5zaGFkaW5nRmlsbDoKICAgICAgICBjYXNlIE9QUy5zZXRSZW5kZXJpbmdJbnRlbnQ6CiAgICAgICAgICBvcGVyYXRvckxpc3QuZm5BcnJheS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICBvcGVyYXRvckxpc3QuYXJnc0FycmF5LnNwbGljZShpLCAxKTsKICAgICAgICAgIGlpLS07CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlIE9QUy5zZXRHU3RhdGU6CiAgICAgICAgICBjb25zdCBbZ1N0YXRlT2JqXSA9IG9wZXJhdG9yTGlzdC5hcmdzQXJyYXlbaV07CiAgICAgICAgICBsZXQgaiA9IDAsCiAgICAgICAgICAgIGpqID0gZ1N0YXRlT2JqLmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChqIDwgamopIHsKICAgICAgICAgICAgY29uc3QgW2dTdGF0ZUtleV0gPSBnU3RhdGVPYmpbal07CiAgICAgICAgICAgIHN3aXRjaCAoZ1N0YXRlS2V5KSB7CiAgICAgICAgICAgICAgY2FzZSAiVFIiOgogICAgICAgICAgICAgIGNhc2UgIlRSMiI6CiAgICAgICAgICAgICAgY2FzZSAiSFQiOgogICAgICAgICAgICAgIGNhc2UgIkJHIjoKICAgICAgICAgICAgICBjYXNlICJCRzIiOgogICAgICAgICAgICAgIGNhc2UgIlVDUiI6CiAgICAgICAgICAgICAgY2FzZSAiVUNSMiI6CiAgICAgICAgICAgICAgICBnU3RhdGVPYmouc3BsaWNlKGosIDEpOwogICAgICAgICAgICAgICAgamotLTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGorKzsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGkrKzsKICAgIH0KICB9CiAgI2d1ZXNzVHlwZTNGb250QkJveChvcGVyYXRvckxpc3QpIHsKICAgIGxldCBpID0gMTsKICAgIGNvbnN0IGlpID0gb3BlcmF0b3JMaXN0Lmxlbmd0aDsKICAgIHdoaWxlIChpIDwgaWkpIHsKICAgICAgc3dpdGNoIChvcGVyYXRvckxpc3QuZm5BcnJheVtpXSkgewogICAgICAgIGNhc2UgT1BTLmNvbnN0cnVjdFBhdGg6CiAgICAgICAgICBjb25zdCBtaW5NYXggPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5W2ldWzJdOwogICAgICAgICAgdGhpcy5fYmJveCA/Pz0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldOwogICAgICAgICAgVXRpbC5yZWN0Qm91bmRpbmdCb3goLi4ubWluTWF4LCB0aGlzLl9iYm94KTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGkrKzsKICAgIH0KICB9Cn0KY2xhc3MgU3RhdGVNYW5hZ2VyIHsKICBjb25zdHJ1Y3Rvcihpbml0aWFsU3RhdGUgPSBuZXcgRXZhbFN0YXRlKCkpIHsKICAgIHRoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7CiAgICB0aGlzLnN0YXRlU3RhY2sgPSBbXTsKICB9CiAgc2F2ZSgpIHsKICAgIGNvbnN0IG9sZCA9IHRoaXMuc3RhdGU7CiAgICB0aGlzLnN0YXRlU3RhY2sucHVzaCh0aGlzLnN0YXRlKTsKICAgIHRoaXMuc3RhdGUgPSBvbGQuY2xvbmUoKTsKICB9CiAgcmVzdG9yZSgpIHsKICAgIGNvbnN0IHByZXYgPSB0aGlzLnN0YXRlU3RhY2sucG9wKCk7CiAgICBpZiAocHJldikgewogICAgICB0aGlzLnN0YXRlID0gcHJldjsKICAgIH0KICB9CiAgdHJhbnNmb3JtKGFyZ3MpIHsKICAgIHRoaXMuc3RhdGUuY3RtID0gVXRpbC50cmFuc2Zvcm0odGhpcy5zdGF0ZS5jdG0sIGFyZ3MpOwogIH0KfQpjbGFzcyBUZXh0U3RhdGUgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5jdG0gPSBuZXcgRmxvYXQzMkFycmF5KElERU5USVRZX01BVFJJWCk7CiAgICB0aGlzLmZvbnROYW1lID0gbnVsbDsKICAgIHRoaXMuZm9udFNpemUgPSAwOwogICAgdGhpcy5sb2FkZWROYW1lID0gbnVsbDsKICAgIHRoaXMuZm9udCA9IG51bGw7CiAgICB0aGlzLmZvbnRNYXRyaXggPSBGT05UX0lERU5USVRZX01BVFJJWDsKICAgIHRoaXMudGV4dE1hdHJpeCA9IElERU5USVRZX01BVFJJWC5zbGljZSgpOwogICAgdGhpcy50ZXh0TGluZU1hdHJpeCA9IElERU5USVRZX01BVFJJWC5zbGljZSgpOwogICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7CiAgICB0aGlzLndvcmRTcGFjaW5nID0gMDsKICAgIHRoaXMubGVhZGluZyA9IDA7CiAgICB0aGlzLnRleHRIU2NhbGUgPSAxOwogICAgdGhpcy50ZXh0UmlzZSA9IDA7CiAgfQogIHNldFRleHRNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikgewogICAgY29uc3QgbSA9IHRoaXMudGV4dE1hdHJpeDsKICAgIG1bMF0gPSBhOwogICAgbVsxXSA9IGI7CiAgICBtWzJdID0gYzsKICAgIG1bM10gPSBkOwogICAgbVs0XSA9IGU7CiAgICBtWzVdID0gZjsKICB9CiAgc2V0VGV4dExpbmVNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikgewogICAgY29uc3QgbSA9IHRoaXMudGV4dExpbmVNYXRyaXg7CiAgICBtWzBdID0gYTsKICAgIG1bMV0gPSBiOwogICAgbVsyXSA9IGM7CiAgICBtWzNdID0gZDsKICAgIG1bNF0gPSBlOwogICAgbVs1XSA9IGY7CiAgfQogIHRyYW5zbGF0ZVRleHRNYXRyaXgoeCwgeSkgewogICAgY29uc3QgbSA9IHRoaXMudGV4dE1hdHJpeDsKICAgIG1bNF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTsKICAgIG1bNV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTsKICB9CiAgdHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoeCwgeSkgewogICAgY29uc3QgbSA9IHRoaXMudGV4dExpbmVNYXRyaXg7CiAgICBtWzRdID0gbVswXSAqIHggKyBtWzJdICogeSArIG1bNF07CiAgICBtWzVdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07CiAgfQogIGNhcnJpYWdlUmV0dXJuKCkgewogICAgdGhpcy50cmFuc2xhdGVUZXh0TGluZU1hdHJpeCgwLCAtdGhpcy5sZWFkaW5nKTsKICAgIHRoaXMudGV4dE1hdHJpeCA9IHRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKTsKICB9CiAgY2xvbmUoKSB7CiAgICBjb25zdCBjbG9uZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7CiAgICBjbG9uZS50ZXh0TWF0cml4ID0gdGhpcy50ZXh0TWF0cml4LnNsaWNlKCk7CiAgICBjbG9uZS50ZXh0TGluZU1hdHJpeCA9IHRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKTsKICAgIGNsb25lLmZvbnRNYXRyaXggPSB0aGlzLmZvbnRNYXRyaXguc2xpY2UoKTsKICAgIHJldHVybiBjbG9uZTsKICB9Cn0KY2xhc3MgRXZhbFN0YXRlIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuY3RtID0gbmV3IEZsb2F0MzJBcnJheShJREVOVElUWV9NQVRSSVgpOwogICAgdGhpcy5mb250ID0gbnVsbDsKICAgIHRoaXMudGV4dFJlbmRlcmluZ01vZGUgPSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMOwogICAgdGhpcy5fZmlsbENvbG9yU3BhY2UgPSB0aGlzLl9zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZVV0aWxzLmdyYXk7CiAgICB0aGlzLnBhdHRlcm5GaWxsQ29sb3JTcGFjZSA9IG51bGw7CiAgICB0aGlzLnBhdHRlcm5TdHJva2VDb2xvclNwYWNlID0gbnVsbDsKICAgIHRoaXMuY3VycmVudFBvaW50WCA9IHRoaXMuY3VycmVudFBvaW50WSA9IDA7CiAgICB0aGlzLnBhdGhNaW5NYXggPSBuZXcgRmxvYXQzMkFycmF5KFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XSk7CiAgICB0aGlzLnBhdGhCdWZmZXIgPSBbXTsKICB9CiAgZ2V0IGZpbGxDb2xvclNwYWNlKCkgewogICAgcmV0dXJuIHRoaXMuX2ZpbGxDb2xvclNwYWNlOwogIH0KICBzZXQgZmlsbENvbG9yU3BhY2UoY29sb3JTcGFjZSkgewogICAgdGhpcy5fZmlsbENvbG9yU3BhY2UgPSB0aGlzLnBhdHRlcm5GaWxsQ29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7CiAgfQogIGdldCBzdHJva2VDb2xvclNwYWNlKCkgewogICAgcmV0dXJuIHRoaXMuX3N0cm9rZUNvbG9yU3BhY2U7CiAgfQogIHNldCBzdHJva2VDb2xvclNwYWNlKGNvbG9yU3BhY2UpIHsKICAgIHRoaXMuX3N0cm9rZUNvbG9yU3BhY2UgPSB0aGlzLnBhdHRlcm5TdHJva2VDb2xvclNwYWNlID0gY29sb3JTcGFjZTsKICB9CiAgY2xvbmUoewogICAgbmV3UGF0aCA9IGZhbHNlCiAgfSA9IHt9KSB7CiAgICBjb25zdCBjbG9uZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7CiAgICBpZiAobmV3UGF0aCkgewogICAgICBjbG9uZS5wYXRoQnVmZmVyID0gW107CiAgICAgIGNsb25lLnBhdGhNaW5NYXggPSBuZXcgRmxvYXQzMkFycmF5KFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XSk7CiAgICB9CiAgICByZXR1cm4gY2xvbmU7CiAgfQp9CmNsYXNzIEV2YWx1YXRvclByZXByb2Nlc3NvciB7CiAgc3RhdGljIGdldCBvcE1hcCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIm9wTWFwIiwgT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCB7CiAgICAgIHc6IHsKICAgICAgICBpZDogT1BTLnNldExpbmVXaWR0aCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgSjogewogICAgICAgIGlkOiBPUFMuc2V0TGluZUNhcCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgajogewogICAgICAgIGlkOiBPUFMuc2V0TGluZUpvaW4sCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIE06IHsKICAgICAgICBpZDogT1BTLnNldE1pdGVyTGltaXQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGQ6IHsKICAgICAgICBpZDogT1BTLnNldERhc2gsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIHJpOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRSZW5kZXJpbmdJbnRlbnQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGk6IHsKICAgICAgICBpZDogT1BTLnNldEZsYXRuZXNzLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBnczogewogICAgICAgIGlkOiBPUFMuc2V0R1N0YXRlLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBxOiB7CiAgICAgICAgaWQ6IE9QUy5zYXZlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBROiB7CiAgICAgICAgaWQ6IE9QUy5yZXN0b3JlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBjbTogewogICAgICAgIGlkOiBPUFMudHJhbnNmb3JtLAogICAgICAgIG51bUFyZ3M6IDYsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBtOiB7CiAgICAgICAgaWQ6IE9QUy5tb3ZlVG8sCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGw6IHsKICAgICAgICBpZDogT1BTLmxpbmVUbywKICAgICAgICBudW1BcmdzOiAyLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgYzogewogICAgICAgIGlkOiBPUFMuY3VydmVUbywKICAgICAgICBudW1BcmdzOiA2LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgdjogewogICAgICAgIGlkOiBPUFMuY3VydmVUbzIsCiAgICAgICAgbnVtQXJnczogNCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIHk6IHsKICAgICAgICBpZDogT1BTLmN1cnZlVG8zLAogICAgICAgIG51bUFyZ3M6IDQsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBoOiB7CiAgICAgICAgaWQ6IE9QUy5jbG9zZVBhdGgsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIHJlOiB7CiAgICAgICAgaWQ6IE9QUy5yZWN0YW5nbGUsCiAgICAgICAgbnVtQXJnczogNCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFM6IHsKICAgICAgICBpZDogT1BTLnN0cm9rZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgczogewogICAgICAgIGlkOiBPUFMuY2xvc2VTdHJva2UsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGY6IHsKICAgICAgICBpZDogT1BTLmZpbGwsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEY6IHsKICAgICAgICBpZDogT1BTLmZpbGwsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgICJmKiI6IHsKICAgICAgICBpZDogT1BTLmVvRmlsbCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgQjogewogICAgICAgIGlkOiBPUFMuZmlsbFN0cm9rZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgIkIqIjogewogICAgICAgIGlkOiBPUFMuZW9GaWxsU3Ryb2tlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBiOiB7CiAgICAgICAgaWQ6IE9QUy5jbG9zZUZpbGxTdHJva2UsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgICJiKiI6IHsKICAgICAgICBpZDogT1BTLmNsb3NlRU9GaWxsU3Ryb2tlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBuOiB7CiAgICAgICAgaWQ6IE9QUy5lbmRQYXRoLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBXOiB7CiAgICAgICAgaWQ6IE9QUy5jbGlwLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICAiVyoiOiB7CiAgICAgICAgaWQ6IE9QUy5lb0NsaXAsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEJUOiB7CiAgICAgICAgaWQ6IE9QUy5iZWdpblRleHQsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEVUOiB7CiAgICAgICAgaWQ6IE9QUy5lbmRUZXh0LAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBUYzogewogICAgICAgIGlkOiBPUFMuc2V0Q2hhclNwYWNpbmcsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFR3OiB7CiAgICAgICAgaWQ6IE9QUy5zZXRXb3JkU3BhY2luZywKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVHo6IHsKICAgICAgICBpZDogT1BTLnNldEhTY2FsZSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVEw6IHsKICAgICAgICBpZDogT1BTLnNldExlYWRpbmcsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFRmOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRGb250LAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBUcjogewogICAgICAgIGlkOiBPUFMuc2V0VGV4dFJlbmRlcmluZ01vZGUsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFRzOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRUZXh0UmlzZSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVGQ6IHsKICAgICAgICBpZDogT1BTLm1vdmVUZXh0LAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBURDogewogICAgICAgIGlkOiBPUFMuc2V0TGVhZGluZ01vdmVUZXh0LAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBUbTogewogICAgICAgIGlkOiBPUFMuc2V0VGV4dE1hdHJpeCwKICAgICAgICBudW1BcmdzOiA2LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgIlQqIjogewogICAgICAgIGlkOiBPUFMubmV4dExpbmUsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFRqOiB7CiAgICAgICAgaWQ6IE9QUy5zaG93VGV4dCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVEo6IHsKICAgICAgICBpZDogT1BTLnNob3dTcGFjZWRUZXh0LAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICAiJyI6IHsKICAgICAgICBpZDogT1BTLm5leHRMaW5lU2hvd1RleHQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgICciJzogewogICAgICAgIGlkOiBPUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQsCiAgICAgICAgbnVtQXJnczogMywKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGQwOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRDaGFyV2lkdGgsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGQxOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRDaGFyV2lkdGhBbmRCb3VuZHMsCiAgICAgICAgbnVtQXJnczogNiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIENTOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRTdHJva2VDb2xvclNwYWNlLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBjczogewogICAgICAgIGlkOiBPUFMuc2V0RmlsbENvbG9yU3BhY2UsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFNDOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRTdHJva2VDb2xvciwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogdHJ1ZQogICAgICB9LAogICAgICBTQ046IHsKICAgICAgICBpZDogT1BTLnNldFN0cm9rZUNvbG9yTiwKICAgICAgICBudW1BcmdzOiAzMywKICAgICAgICB2YXJpYWJsZUFyZ3M6IHRydWUKICAgICAgfSwKICAgICAgc2M6IHsKICAgICAgICBpZDogT1BTLnNldEZpbGxDb2xvciwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogdHJ1ZQogICAgICB9LAogICAgICBzY246IHsKICAgICAgICBpZDogT1BTLnNldEZpbGxDb2xvck4sCiAgICAgICAgbnVtQXJnczogMzMsCiAgICAgICAgdmFyaWFibGVBcmdzOiB0cnVlCiAgICAgIH0sCiAgICAgIEc6IHsKICAgICAgICBpZDogT1BTLnNldFN0cm9rZUdyYXksCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGc6IHsKICAgICAgICBpZDogT1BTLnNldEZpbGxHcmF5LAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBSRzogewogICAgICAgIGlkOiBPUFMuc2V0U3Ryb2tlUkdCQ29sb3IsCiAgICAgICAgbnVtQXJnczogMywKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIHJnOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRGaWxsUkdCQ29sb3IsCiAgICAgICAgbnVtQXJnczogMywKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEs6IHsKICAgICAgICBpZDogT1BTLnNldFN0cm9rZUNNWUtDb2xvciwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgazogewogICAgICAgIGlkOiBPUFMuc2V0RmlsbENNWUtDb2xvciwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgc2g6IHsKICAgICAgICBpZDogT1BTLnNoYWRpbmdGaWxsLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBCSTogewogICAgICAgIGlkOiBPUFMuYmVnaW5JbmxpbmVJbWFnZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgSUQ6IHsKICAgICAgICBpZDogT1BTLmJlZ2luSW1hZ2VEYXRhLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBFSTogewogICAgICAgIGlkOiBPUFMuZW5kSW5saW5lSW1hZ2UsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIERvOiB7CiAgICAgICAgaWQ6IE9QUy5wYWludFhPYmplY3QsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIE1QOiB7CiAgICAgICAgaWQ6IE9QUy5tYXJrUG9pbnQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIERQOiB7CiAgICAgICAgaWQ6IE9QUy5tYXJrUG9pbnRQcm9wcywKICAgICAgICBudW1BcmdzOiAyLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgQk1DOiB7CiAgICAgICAgaWQ6IE9QUy5iZWdpbk1hcmtlZENvbnRlbnQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEJEQzogewogICAgICAgIGlkOiBPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEVNQzogewogICAgICAgIGlkOiBPUFMuZW5kTWFya2VkQ29udGVudCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgQlg6IHsKICAgICAgICBpZDogT1BTLmJlZ2luQ29tcGF0LAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBFWDogewogICAgICAgIGlkOiBPUFMuZW5kQ29tcGF0LAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBCTTogbnVsbCwKICAgICAgQkQ6IG51bGwsCiAgICAgIHRydWU6IG51bGwsCiAgICAgIGZhOiBudWxsLAogICAgICBmYWw6IG51bGwsCiAgICAgIGZhbHM6IG51bGwsCiAgICAgIGZhbHNlOiBudWxsLAogICAgICBudTogbnVsbCwKICAgICAgbnVsOiBudWxsLAogICAgICBudWxsOiBudWxsCiAgICB9KSk7CiAgfQogIHN0YXRpYyBNQVhfSU5WQUxJRF9QQVRIX09QUyA9IDEwOwogIGNvbnN0cnVjdG9yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcigpKSB7CiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSwgRXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwKSwKICAgICAgeHJlZgogICAgfSk7CiAgICB0aGlzLnN0YXRlTWFuYWdlciA9IHN0YXRlTWFuYWdlcjsKICAgIHRoaXMubm9uUHJvY2Vzc2VkQXJncyA9IFtdOwogICAgdGhpcy5faXNQYXRoT3AgPSBmYWxzZTsKICAgIHRoaXMuX251bUludmFsaWRQYXRoT1BTID0gMDsKICB9CiAgZ2V0IHNhdmVkU3RhdGVzRGVwdGgoKSB7CiAgICByZXR1cm4gdGhpcy5zdGF0ZU1hbmFnZXIuc3RhdGVTdGFjay5sZW5ndGg7CiAgfQogIHJlYWQob3BlcmF0aW9uKSB7CiAgICBsZXQgYXJncyA9IG9wZXJhdGlvbi5hcmdzOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgY29uc3Qgb2JqID0gdGhpcy5wYXJzZXIuZ2V0T2JqKCk7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDbWQpIHsKICAgICAgICBjb25zdCBjbWQgPSBvYmouY21kOwogICAgICAgIGNvbnN0IG9wU3BlYyA9IEV2YWx1YXRvclByZXByb2Nlc3Nvci5vcE1hcFtjbWRdOwogICAgICAgIGlmICghb3BTcGVjKSB7CiAgICAgICAgICB3YXJuKGBVbmtub3duIGNvbW1hbmQgIiR7Y21kfSIuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZm4gPSBvcFNwZWMuaWQ7CiAgICAgICAgY29uc3QgbnVtQXJncyA9IG9wU3BlYy5udW1BcmdzOwogICAgICAgIGxldCBhcmdzTGVuZ3RoID0gYXJncyAhPT0gbnVsbCA/IGFyZ3MubGVuZ3RoIDogMDsKICAgICAgICBpZiAoIXRoaXMuX2lzUGF0aE9wKSB7CiAgICAgICAgICB0aGlzLl9udW1JbnZhbGlkUGF0aE9QUyA9IDA7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2lzUGF0aE9wID0gZm4gPj0gT1BTLm1vdmVUbyAmJiBmbiA8PSBPUFMuZW5kUGF0aDsKICAgICAgICBpZiAoIW9wU3BlYy52YXJpYWJsZUFyZ3MpIHsKICAgICAgICAgIGlmIChhcmdzTGVuZ3RoICE9PSBudW1BcmdzKSB7CiAgICAgICAgICAgIGNvbnN0IG5vblByb2Nlc3NlZEFyZ3MgPSB0aGlzLm5vblByb2Nlc3NlZEFyZ3M7CiAgICAgICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoID4gbnVtQXJncykgewogICAgICAgICAgICAgIG5vblByb2Nlc3NlZEFyZ3MucHVzaChhcmdzLnNoaWZ0KCkpOwogICAgICAgICAgICAgIGFyZ3NMZW5ndGgtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoYXJnc0xlbmd0aCA8IG51bUFyZ3MgJiYgbm9uUHJvY2Vzc2VkQXJncy5sZW5ndGggIT09IDApIHsKICAgICAgICAgICAgICBpZiAoYXJncyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgYXJncyA9IFtdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBhcmdzLnVuc2hpZnQobm9uUHJvY2Vzc2VkQXJncy5wb3AoKSk7CiAgICAgICAgICAgICAgYXJnc0xlbmd0aCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYXJnc0xlbmd0aCA8IG51bUFyZ3MpIHsKICAgICAgICAgICAgY29uc3QgcGFydGlhbE1zZyA9IGBjb21tYW5kICR7Y21kfTogZXhwZWN0ZWQgJHtudW1BcmdzfSBhcmdzLCBgICsgYGJ1dCByZWNlaXZlZCAke2FyZ3NMZW5ndGh9IGFyZ3MuYDsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzUGF0aE9wICYmICsrdGhpcy5fbnVtSW52YWxpZFBhdGhPUFMgPiBFdmFsdWF0b3JQcmVwcm9jZXNzb3IuTUFYX0lOVkFMSURfUEFUSF9PUFMpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgJHtwYXJ0aWFsTXNnfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdhcm4oYFNraXBwaW5nICR7cGFydGlhbE1zZ31gKTsKICAgICAgICAgICAgaWYgKGFyZ3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICBhcmdzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChhcmdzTGVuZ3RoID4gbnVtQXJncykgewogICAgICAgICAgaW5mbyhgQ29tbWFuZCAke2NtZH06IGV4cGVjdGVkIFswLCAke251bUFyZ3N9XSBhcmdzLCBgICsgYGJ1dCByZWNlaXZlZCAke2FyZ3NMZW5ndGh9IGFyZ3MuYCk7CiAgICAgICAgfQogICAgICAgIHRoaXMucHJlcHJvY2Vzc0NvbW1hbmQoZm4sIGFyZ3MpOwogICAgICAgIG9wZXJhdGlvbi5mbiA9IGZuOwogICAgICAgIG9wZXJhdGlvbi5hcmdzID0gYXJnczsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAob2JqID09PSBFT0YpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKG9iaiAhPT0gbnVsbCkgewogICAgICAgIGlmIChhcmdzID09PSBudWxsKSB7CiAgICAgICAgICBhcmdzID0gW107CiAgICAgICAgfQogICAgICAgIGFyZ3MucHVzaChvYmopOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDMzKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBwcmVwcm9jZXNzQ29tbWFuZChmbiwgYXJncykgewogICAgc3dpdGNoIChmbiB8IDApIHsKICAgICAgY2FzZSBPUFMuc2F2ZToKICAgICAgICB0aGlzLnN0YXRlTWFuYWdlci5zYXZlKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgT1BTLnJlc3RvcmU6CiAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIucmVzdG9yZSgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE9QUy50cmFuc2Zvcm06CiAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIudHJhbnNmb3JtKGFyZ3MpOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZGVmYXVsdF9hcHBlYXJhbmNlLmpzCgoKCgoKCgoKY2xhc3MgRGVmYXVsdEFwcGVhcmFuY2VFdmFsdWF0b3IgZXh0ZW5kcyBFdmFsdWF0b3JQcmVwcm9jZXNzb3IgewogIGNvbnN0cnVjdG9yKHN0cikgewogICAgc3VwZXIobmV3IFN0cmluZ1N0cmVhbShzdHIpKTsKICB9CiAgcGFyc2UoKSB7CiAgICBjb25zdCBvcGVyYXRpb24gPSB7CiAgICAgIGZuOiAwLAogICAgICBhcmdzOiBbXQogICAgfTsKICAgIGNvbnN0IHJlc3VsdCA9IHsKICAgICAgZm9udFNpemU6IDAsCiAgICAgIGZvbnROYW1lOiAiIiwKICAgICAgZm9udENvbG9yOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMykKICAgIH07CiAgICB0cnkgewogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIG9wZXJhdGlvbi5hcmdzLmxlbmd0aCA9IDA7CiAgICAgICAgaWYgKCF0aGlzLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnNhdmVkU3RhdGVzRGVwdGggIT09IDApIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCB7CiAgICAgICAgICBmbiwKICAgICAgICAgIGFyZ3MKICAgICAgICB9ID0gb3BlcmF0aW9uOwogICAgICAgIHN3aXRjaCAoZm4gfCAwKSB7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGb250OgogICAgICAgICAgICBjb25zdCBbZm9udE5hbWUsIGZvbnRTaXplXSA9IGFyZ3M7CiAgICAgICAgICAgIGlmIChmb250TmFtZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICByZXN1bHQuZm9udE5hbWUgPSBmb250TmFtZS5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgZm9udFNpemUgPT09ICJudW1iZXIiICYmIGZvbnRTaXplID4gMCkgewogICAgICAgICAgICAgIHJlc3VsdC5mb250U2l6ZSA9IGZvbnRTaXplOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbFJHQkNvbG9yOgogICAgICAgICAgICBDb2xvclNwYWNlVXRpbHMucmdiLmdldFJnYkl0ZW0oYXJncywgMCwgcmVzdWx0LmZvbnRDb2xvciwgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbEdyYXk6CiAgICAgICAgICAgIENvbG9yU3BhY2VVdGlscy5ncmF5LmdldFJnYkl0ZW0oYXJncywgMCwgcmVzdWx0LmZvbnRDb2xvciwgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENNWUtDb2xvcjoKICAgICAgICAgICAgQ29sb3JTcGFjZVV0aWxzLmNteWsuZ2V0UmdiSXRlbShhcmdzLCAwLCByZXN1bHQuZm9udENvbG9yLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgd2FybihgcGFyc2VEZWZhdWx0QXBwZWFyYW5jZSAtIGlnbm9yaW5nIGVycm9yczogIiR7cmVhc29ufSIuYCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQpmdW5jdGlvbiBwYXJzZURlZmF1bHRBcHBlYXJhbmNlKHN0cikgewogIHJldHVybiBuZXcgRGVmYXVsdEFwcGVhcmFuY2VFdmFsdWF0b3Ioc3RyKS5wYXJzZSgpOwp9CmNsYXNzIEFwcGVhcmFuY2VTdHJlYW1FdmFsdWF0b3IgZXh0ZW5kcyBFdmFsdWF0b3JQcmVwcm9jZXNzb3IgewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgZXZhbHVhdG9yT3B0aW9ucywgeHJlZiwgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBzdXBlcihzdHJlYW0pOwogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLmV2YWx1YXRvck9wdGlvbnMgPSBldmFsdWF0b3JPcHRpb25zOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlID0gZ2xvYmFsQ29sb3JTcGFjZUNhY2hlOwogICAgdGhpcy5yZXNvdXJjZXMgPSBzdHJlYW0uZGljdD8uZ2V0KCJSZXNvdXJjZXMiKTsKICB9CiAgcGFyc2UoKSB7CiAgICBjb25zdCBvcGVyYXRpb24gPSB7CiAgICAgIGZuOiAwLAogICAgICBhcmdzOiBbXQogICAgfTsKICAgIGxldCByZXN1bHQgPSB7CiAgICAgIHNjYWxlRmFjdG9yOiAxLAogICAgICBmb250U2l6ZTogMCwKICAgICAgZm9udE5hbWU6ICIiLAogICAgICBmb250Q29sb3I6IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKSwKICAgICAgZmlsbENvbG9yU3BhY2U6IENvbG9yU3BhY2VVdGlscy5ncmF5CiAgICB9OwogICAgbGV0IGJyZWFrTG9vcCA9IGZhbHNlOwogICAgY29uc3Qgc3RhY2sgPSBbXTsKICAgIHRyeSB7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MubGVuZ3RoID0gMDsKICAgICAgICBpZiAoYnJlYWtMb29wIHx8ICF0aGlzLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHsKICAgICAgICAgIGZuLAogICAgICAgICAgYXJncwogICAgICAgIH0gPSBvcGVyYXRpb247CiAgICAgICAgc3dpdGNoIChmbiB8IDApIHsKICAgICAgICAgIGNhc2UgT1BTLnNhdmU6CiAgICAgICAgICAgIHN0YWNrLnB1c2goewogICAgICAgICAgICAgIHNjYWxlRmFjdG9yOiByZXN1bHQuc2NhbGVGYWN0b3IsCiAgICAgICAgICAgICAgZm9udFNpemU6IHJlc3VsdC5mb250U2l6ZSwKICAgICAgICAgICAgICBmb250TmFtZTogcmVzdWx0LmZvbnROYW1lLAogICAgICAgICAgICAgIGZvbnRDb2xvcjogcmVzdWx0LmZvbnRDb2xvci5zbGljZSgpLAogICAgICAgICAgICAgIGZpbGxDb2xvclNwYWNlOiByZXN1bHQuZmlsbENvbG9yU3BhY2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMucmVzdG9yZToKICAgICAgICAgICAgcmVzdWx0ID0gc3RhY2sucG9wKCkgfHwgcmVzdWx0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFRleHRNYXRyaXg6CiAgICAgICAgICAgIHJlc3VsdC5zY2FsZUZhY3RvciAqPSBNYXRoLmh5cG90KGFyZ3NbMF0sIGFyZ3NbMV0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZvbnQ6CiAgICAgICAgICAgIGNvbnN0IFtmb250TmFtZSwgZm9udFNpemVdID0gYXJnczsKICAgICAgICAgICAgaWYgKGZvbnROYW1lIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICAgIHJlc3VsdC5mb250TmFtZSA9IGZvbnROYW1lLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiBmb250U2l6ZSA9PT0gIm51bWJlciIgJiYgZm9udFNpemUgPiAwKSB7CiAgICAgICAgICAgICAgcmVzdWx0LmZvbnRTaXplID0gZm9udFNpemUgKiByZXN1bHQuc2NhbGVGYWN0b3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3JTcGFjZToKICAgICAgICAgICAgcmVzdWx0LmZpbGxDb2xvclNwYWNlID0gQ29sb3JTcGFjZVV0aWxzLnBhcnNlKHsKICAgICAgICAgICAgICBjczogYXJnc1swXSwKICAgICAgICAgICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgICAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcywKICAgICAgICAgICAgICBwZGZGdW5jdGlvbkZhY3Rvcnk6IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGU6IHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlOiB0aGlzLl9sb2NhbENvbG9yU3BhY2VDYWNoZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3I6CiAgICAgICAgICAgIGNvbnN0IGNzID0gcmVzdWx0LmZpbGxDb2xvclNwYWNlOwogICAgICAgICAgICBjcy5nZXRSZ2JJdGVtKGFyZ3MsIDAsIHJlc3VsdC5mb250Q29sb3IsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxSR0JDb2xvcjoKICAgICAgICAgICAgQ29sb3JTcGFjZVV0aWxzLnJnYi5nZXRSZ2JJdGVtKGFyZ3MsIDAsIHJlc3VsdC5mb250Q29sb3IsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxHcmF5OgogICAgICAgICAgICBDb2xvclNwYWNlVXRpbHMuZ3JheS5nZXRSZ2JJdGVtKGFyZ3MsIDAsIHJlc3VsdC5mb250Q29sb3IsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxDTVlLQ29sb3I6CiAgICAgICAgICAgIENvbG9yU3BhY2VVdGlscy5jbXlrLmdldFJnYkl0ZW0oYXJncywgMCwgcmVzdWx0LmZvbnRDb2xvciwgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1RleHQ6CiAgICAgICAgICBjYXNlIE9QUy5zaG93U3BhY2VkVGV4dDoKICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lU2hvd1RleHQ6CiAgICAgICAgICBjYXNlIE9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDoKICAgICAgICAgICAgYnJlYWtMb29wID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgd2FybihgcGFyc2VBcHBlYXJhbmNlU3RyZWFtIC0gaWdub3JpbmcgZXJyb3JzOiAiJHtyZWFzb259Ii5gKTsKICAgIH0KICAgIHRoaXMuc3RyZWFtLnJlc2V0KCk7CiAgICBkZWxldGUgcmVzdWx0LnNjYWxlRmFjdG9yOwogICAgZGVsZXRlIHJlc3VsdC5maWxsQ29sb3JTcGFjZTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGdldCBfbG9jYWxDb2xvclNwYWNlQ2FjaGUoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJfbG9jYWxDb2xvclNwYWNlQ2FjaGUiLCBuZXcgTG9jYWxDb2xvclNwYWNlQ2FjaGUoKSk7CiAgfQogIGdldCBfcGRmRnVuY3Rpb25GYWN0b3J5KCkgewogICAgY29uc3QgcGRmRnVuY3Rpb25GYWN0b3J5ID0gbmV3IFBERkZ1bmN0aW9uRmFjdG9yeSh7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaXNFdmFsU3VwcG9ydGVkOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMuaXNFdmFsU3VwcG9ydGVkCiAgICB9KTsKICAgIHJldHVybiBzaGFkb3codGhpcywgIl9wZGZGdW5jdGlvbkZhY3RvcnkiLCBwZGZGdW5jdGlvbkZhY3RvcnkpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUFwcGVhcmFuY2VTdHJlYW0oc3RyZWFtLCBldmFsdWF0b3JPcHRpb25zLCB4cmVmLCBnbG9iYWxDb2xvclNwYWNlQ2FjaGUpIHsKICByZXR1cm4gbmV3IEFwcGVhcmFuY2VTdHJlYW1FdmFsdWF0b3Ioc3RyZWFtLCBldmFsdWF0b3JPcHRpb25zLCB4cmVmLCBnbG9iYWxDb2xvclNwYWNlQ2FjaGUpLnBhcnNlKCk7Cn0KZnVuY3Rpb24gZ2V0UGRmQ29sb3IoY29sb3IsIGlzRmlsbCkgewogIGlmIChjb2xvclswXSA9PT0gY29sb3JbMV0gJiYgY29sb3JbMV0gPT09IGNvbG9yWzJdKSB7CiAgICBjb25zdCBncmF5ID0gY29sb3JbMF0gLyAyNTU7CiAgICByZXR1cm4gYCR7bnVtYmVyVG9TdHJpbmcoZ3JheSl9ICR7aXNGaWxsID8gImciIDogIkcifWA7CiAgfQogIHJldHVybiBBcnJheS5mcm9tKGNvbG9yLCBjID0+IG51bWJlclRvU3RyaW5nKGMgLyAyNTUpKS5qb2luKCIgIikgKyBgICR7aXNGaWxsID8gInJnIiA6ICJSRyJ9YDsKfQpmdW5jdGlvbiBjcmVhdGVEZWZhdWx0QXBwZWFyYW5jZSh7CiAgZm9udFNpemUsCiAgZm9udE5hbWUsCiAgZm9udENvbG9yCn0pIHsKICByZXR1cm4gYC8ke2VzY2FwZVBERk5hbWUoZm9udE5hbWUpfSAke2ZvbnRTaXplfSBUZiAke2dldFBkZkNvbG9yKGZvbnRDb2xvciwgdHJ1ZSl9YDsKfQpjbGFzcyBGYWtlVW5pY29kZUZvbnQgewogIGNvbnN0cnVjdG9yKHhyZWYsIGZvbnRGYW1pbHkpIHsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLndpZHRocyA9IG51bGw7CiAgICB0aGlzLmZpcnN0Q2hhciA9IEluZmluaXR5OwogICAgdGhpcy5sYXN0Q2hhciA9IC1JbmZpbml0eTsKICAgIHRoaXMuZm9udEZhbWlseSA9IGZvbnRGYW1pbHk7CiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDEpOwogICAgdGhpcy5jdHhNZWFzdXJlID0gY2FudmFzLmdldENvbnRleHQoIjJkIiwgewogICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUKICAgIH0pOwogICAgaWYgKCFGYWtlVW5pY29kZUZvbnQuX2ZvbnROYW1lSWQpIHsKICAgICAgRmFrZVVuaWNvZGVGb250Ll9mb250TmFtZUlkID0gMTsKICAgIH0KICAgIHRoaXMuZm9udE5hbWUgPSBOYW1lLmdldChgSW52YWxpZFBERmpzRm9udF8ke2ZvbnRGYW1pbHl9XyR7RmFrZVVuaWNvZGVGb250Ll9mb250TmFtZUlkKyt9YCk7CiAgfQogIGdldCBmb250RGVzY3JpcHRvclJlZigpIHsKICAgIGlmICghRmFrZVVuaWNvZGVGb250Ll9mb250RGVzY3JpcHRvclJlZikgewogICAgICBjb25zdCBmb250RGVzY3JpcHRvciA9IG5ldyBEaWN0KHRoaXMueHJlZik7CiAgICAgIGZvbnREZXNjcmlwdG9yLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGb250RGVzY3JpcHRvciIpKTsKICAgICAgZm9udERlc2NyaXB0b3Iuc2V0KCJGb250TmFtZSIsIHRoaXMuZm9udE5hbWUpOwogICAgICBmb250RGVzY3JpcHRvci5zZXQoIkZvbnRGYW1pbHkiLCAiTXlyaWFkUHJvIFJlZ3VsYXIiKTsKICAgICAgZm9udERlc2NyaXB0b3Iuc2V0KCJGb250QkJveCIsIFswLCAwLCAwLCAwXSk7CiAgICAgIGZvbnREZXNjcmlwdG9yLnNldCgiRm9udFN0cmV0Y2giLCBOYW1lLmdldCgiTm9ybWFsIikpOwogICAgICBmb250RGVzY3JpcHRvci5zZXQoIkZvbnRXZWlnaHQiLCA0MDApOwogICAgICBmb250RGVzY3JpcHRvci5zZXQoIkl0YWxpY0FuZ2xlIiwgMCk7CiAgICAgIEZha2VVbmljb2RlRm9udC5fZm9udERlc2NyaXB0b3JSZWYgPSB0aGlzLnhyZWYuZ2V0TmV3UGVyc2lzdGVudFJlZihmb250RGVzY3JpcHRvcik7CiAgICB9CiAgICByZXR1cm4gRmFrZVVuaWNvZGVGb250Ll9mb250RGVzY3JpcHRvclJlZjsKICB9CiAgZ2V0IGRlc2NlbmRhbnRGb250UmVmKCkgewogICAgY29uc3QgZGVzY2VuZGFudEZvbnQgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJCYXNlRm9udCIsIHRoaXMuZm9udE5hbWUpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkZvbnQiKSk7CiAgICBkZXNjZW5kYW50Rm9udC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiQ0lERm9udFR5cGUwIikpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJDSURUb0dJRE1hcCIsIE5hbWUuZ2V0KCJJZGVudGl0eSIpKTsKICAgIGRlc2NlbmRhbnRGb250LnNldCgiRmlyc3RDaGFyIiwgdGhpcy5maXJzdENoYXIpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJMYXN0Q2hhciIsIHRoaXMubGFzdENoYXIpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJGb250RGVzY3JpcHRvciIsIHRoaXMuZm9udERlc2NyaXB0b3JSZWYpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJEVyIsIDEwMDApOwogICAgY29uc3Qgd2lkdGhzID0gW107CiAgICBjb25zdCBjaGFycyA9IFsuLi50aGlzLndpZHRocy5lbnRyaWVzKCldLnNvcnQoKTsKICAgIGxldCBjdXJyZW50Q2hhciA9IG51bGw7CiAgICBsZXQgY3VycmVudFdpZHRocyA9IG51bGw7CiAgICBmb3IgKGNvbnN0IFtjaGFyLCB3aWR0aF0gb2YgY2hhcnMpIHsKICAgICAgaWYgKCFjdXJyZW50Q2hhcikgewogICAgICAgIGN1cnJlbnRDaGFyID0gY2hhcjsKICAgICAgICBjdXJyZW50V2lkdGhzID0gW3dpZHRoXTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoY2hhciA9PT0gY3VycmVudENoYXIgKyBjdXJyZW50V2lkdGhzLmxlbmd0aCkgewogICAgICAgIGN1cnJlbnRXaWR0aHMucHVzaCh3aWR0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2lkdGhzLnB1c2goY3VycmVudENoYXIsIGN1cnJlbnRXaWR0aHMpOwogICAgICAgIGN1cnJlbnRDaGFyID0gY2hhcjsKICAgICAgICBjdXJyZW50V2lkdGhzID0gW3dpZHRoXTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRDaGFyKSB7CiAgICAgIHdpZHRocy5wdXNoKGN1cnJlbnRDaGFyLCBjdXJyZW50V2lkdGhzKTsKICAgIH0KICAgIGRlc2NlbmRhbnRGb250LnNldCgiVyIsIHdpZHRocyk7CiAgICBjb25zdCBjaWRTeXN0ZW1JbmZvID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgIGNpZFN5c3RlbUluZm8uc2V0KCJPcmRlcmluZyIsICJJZGVudGl0eSIpOwogICAgY2lkU3lzdGVtSW5mby5zZXQoIlJlZ2lzdHJ5IiwgIkFkb2JlIik7CiAgICBjaWRTeXN0ZW1JbmZvLnNldCgiU3VwcGxlbWVudCIsIDApOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJDSURTeXN0ZW1JbmZvIiwgY2lkU3lzdGVtSW5mbyk7CiAgICByZXR1cm4gdGhpcy54cmVmLmdldE5ld1BlcnNpc3RlbnRSZWYoZGVzY2VuZGFudEZvbnQpOwogIH0KICBnZXQgYmFzZUZvbnRSZWYoKSB7CiAgICBjb25zdCBiYXNlRm9udCA9IG5ldyBEaWN0KHRoaXMueHJlZik7CiAgICBiYXNlRm9udC5zZXQoIkJhc2VGb250IiwgdGhpcy5mb250TmFtZSk7CiAgICBiYXNlRm9udC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRm9udCIpKTsKICAgIGJhc2VGb250LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJUeXBlMCIpKTsKICAgIGJhc2VGb250LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiSWRlbnRpdHktSCIpKTsKICAgIGJhc2VGb250LnNldCgiRGVzY2VuZGFudEZvbnRzIiwgW3RoaXMuZGVzY2VuZGFudEZvbnRSZWZdKTsKICAgIGJhc2VGb250LnNldCgiVG9Vbmljb2RlIiwgTmFtZS5nZXQoIklkZW50aXR5LUgiKSk7CiAgICByZXR1cm4gdGhpcy54cmVmLmdldE5ld1BlcnNpc3RlbnRSZWYoYmFzZUZvbnQpOwogIH0KICBnZXQgcmVzb3VyY2VzKCkgewogICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgIGNvbnN0IGZvbnQgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgZm9udC5zZXQodGhpcy5mb250TmFtZS5uYW1lLCB0aGlzLmJhc2VGb250UmVmKTsKICAgIHJlc291cmNlcy5zZXQoIkZvbnQiLCBmb250KTsKICAgIHJldHVybiByZXNvdXJjZXM7CiAgfQogIF9jcmVhdGVDb250ZXh0KCkgewogICAgdGhpcy53aWR0aHMgPSBuZXcgTWFwKCk7CiAgICB0aGlzLmN0eE1lYXN1cmUuZm9udCA9IGAxMDAwcHggJHt0aGlzLmZvbnRGYW1pbHl9YDsKICAgIHJldHVybiB0aGlzLmN0eE1lYXN1cmU7CiAgfQogIGNyZWF0ZUZvbnRSZXNvdXJjZXModGV4dCkgewogICAgY29uc3QgY3R4ID0gdGhpcy5fY3JlYXRlQ29udGV4dCgpOwogICAgZm9yIChjb25zdCBsaW5lIG9mIHRleHQuc3BsaXQoL1xyXG4/fFxuLykpIHsKICAgICAgZm9yIChjb25zdCBjaGFyIG9mIGxpbmUuc3BsaXQoIiIpKSB7CiAgICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTsKICAgICAgICBpZiAodGhpcy53aWR0aHMuaGFzKGNvZGUpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWV0cmljcyA9IGN0eC5tZWFzdXJlVGV4dChjaGFyKTsKICAgICAgICBjb25zdCB3aWR0aCA9IE1hdGguY2VpbChtZXRyaWNzLndpZHRoKTsKICAgICAgICB0aGlzLndpZHRocy5zZXQoY29kZSwgd2lkdGgpOwogICAgICAgIHRoaXMuZmlyc3RDaGFyID0gTWF0aC5taW4oY29kZSwgdGhpcy5maXJzdENoYXIpOwogICAgICAgIHRoaXMubGFzdENoYXIgPSBNYXRoLm1heChjb2RlLCB0aGlzLmxhc3RDaGFyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzOwogIH0KICBzdGF0aWMgZ2V0Rmlyc3RQb3NpdGlvbkluZm8ocmVjdCwgcm90YXRpb24sIGZvbnRTaXplKSB7CiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gcmVjdDsKICAgIGxldCB3ID0geDIgLSB4MTsKICAgIGxldCBoID0geTIgLSB5MTsKICAgIGlmIChyb3RhdGlvbiAlIDE4MCAhPT0gMCkgewogICAgICBbdywgaF0gPSBbaCwgd107CiAgICB9CiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gTElORV9GQUNUT1IgKiBmb250U2l6ZTsKICAgIGNvbnN0IGxpbmVEZXNjZW50ID0gTElORV9ERVNDRU5UX0ZBQ1RPUiAqIGZvbnRTaXplOwogICAgcmV0dXJuIHsKICAgICAgY29vcmRzOiBbMCwgaCArIGxpbmVEZXNjZW50IC0gbGluZUhlaWdodF0sCiAgICAgIGJib3g6IFswLCAwLCB3LCBoXSwKICAgICAgbWF0cml4OiByb3RhdGlvbiAhPT0gMCA/IGdldFJvdGF0aW9uTWF0cml4KHJvdGF0aW9uLCBoLCBsaW5lSGVpZ2h0KSA6IHVuZGVmaW5lZAogICAgfTsKICB9CiAgY3JlYXRlQXBwZWFyYW5jZSh0ZXh0LCByZWN0LCByb3RhdGlvbiwgZm9udFNpemUsIGJnQ29sb3IsIHN0cm9rZUFscGhhKSB7CiAgICBjb25zdCBjdHggPSB0aGlzLl9jcmVhdGVDb250ZXh0KCk7CiAgICBjb25zdCBsaW5lcyA9IFtdOwogICAgbGV0IG1heFdpZHRoID0gLUluZmluaXR5OwogICAgZm9yIChjb25zdCBsaW5lIG9mIHRleHQuc3BsaXQoL1xyXG4/fFxuLykpIHsKICAgICAgbGluZXMucHVzaChsaW5lKTsKICAgICAgY29uc3QgbGluZVdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGxpbmUpLndpZHRoOwogICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBsaW5lV2lkdGgpOwogICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgY29kZVBvaW50SXRlcihsaW5lKSkgewogICAgICAgIGNvbnN0IGNoYXIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlKTsKICAgICAgICBsZXQgd2lkdGggPSB0aGlzLndpZHRocy5nZXQoY29kZSk7CiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGNvbnN0IG1ldHJpY3MgPSBjdHgubWVhc3VyZVRleHQoY2hhcik7CiAgICAgICAgICB3aWR0aCA9IE1hdGguY2VpbChtZXRyaWNzLndpZHRoKTsKICAgICAgICAgIHRoaXMud2lkdGhzLnNldChjb2RlLCB3aWR0aCk7CiAgICAgICAgICB0aGlzLmZpcnN0Q2hhciA9IE1hdGgubWluKGNvZGUsIHRoaXMuZmlyc3RDaGFyKTsKICAgICAgICAgIHRoaXMubGFzdENoYXIgPSBNYXRoLm1heChjb2RlLCB0aGlzLmxhc3RDaGFyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1heFdpZHRoICo9IGZvbnRTaXplIC8gMTAwMDsKICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSByZWN0OwogICAgbGV0IHcgPSB4MiAtIHgxOwogICAgbGV0IGggPSB5MiAtIHkxOwogICAgaWYgKHJvdGF0aW9uICUgMTgwICE9PSAwKSB7CiAgICAgIFt3LCBoXSA9IFtoLCB3XTsKICAgIH0KICAgIGxldCBoc2NhbGUgPSAxOwogICAgaWYgKG1heFdpZHRoID4gdykgewogICAgICBoc2NhbGUgPSB3IC8gbWF4V2lkdGg7CiAgICB9CiAgICBsZXQgdnNjYWxlID0gMTsKICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBMSU5FX0ZBQ1RPUiAqIGZvbnRTaXplOwogICAgY29uc3QgbGluZURlc2NlbnQgPSBMSU5FX0RFU0NFTlRfRkFDVE9SICogZm9udFNpemU7CiAgICBjb25zdCBtYXhIZWlnaHQgPSBsaW5lSGVpZ2h0ICogbGluZXMubGVuZ3RoOwogICAgaWYgKG1heEhlaWdodCA+IGgpIHsKICAgICAgdnNjYWxlID0gaCAvIG1heEhlaWdodDsKICAgIH0KICAgIGNvbnN0IGZzY2FsZSA9IE1hdGgubWluKGhzY2FsZSwgdnNjYWxlKTsKICAgIGNvbnN0IG5ld0ZvbnRTaXplID0gZm9udFNpemUgKiBmc2NhbGU7CiAgICBjb25zdCBidWZmZXIgPSBbInEiLCBgMCAwICR7bnVtYmVyVG9TdHJpbmcodyl9ICR7bnVtYmVyVG9TdHJpbmcoaCl9IHJlIFcgbmAsIGBCVGAsIGAxIDAgMCAxIDAgJHtudW1iZXJUb1N0cmluZyhoICsgbGluZURlc2NlbnQpfSBUbSAwIFRjICR7Z2V0UGRmQ29sb3IoYmdDb2xvciwgdHJ1ZSl9YCwgYC8ke3RoaXMuZm9udE5hbWUubmFtZX0gJHtudW1iZXJUb1N0cmluZyhuZXdGb250U2l6ZSl9IFRmYF07CiAgICBjb25zdCB7CiAgICAgIHJlc291cmNlcwogICAgfSA9IHRoaXM7CiAgICBzdHJva2VBbHBoYSA9IHR5cGVvZiBzdHJva2VBbHBoYSA9PT0gIm51bWJlciIgJiYgc3Ryb2tlQWxwaGEgPj0gMCAmJiBzdHJva2VBbHBoYSA8PSAxID8gc3Ryb2tlQWxwaGEgOiAxOwogICAgaWYgKHN0cm9rZUFscGhhICE9PSAxKSB7CiAgICAgIGJ1ZmZlci5wdXNoKCIvUjAgZ3MiKTsKICAgICAgY29uc3QgZXh0R1N0YXRlID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgICAgY29uc3QgcjAgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgICByMC5zZXQoImNhIiwgc3Ryb2tlQWxwaGEpOwogICAgICByMC5zZXQoIkNBIiwgc3Ryb2tlQWxwaGEpOwogICAgICByMC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRXh0R1N0YXRlIikpOwogICAgICBleHRHU3RhdGUuc2V0KCJSMCIsIHIwKTsKICAgICAgcmVzb3VyY2VzLnNldCgiRXh0R1N0YXRlIiwgZXh0R1N0YXRlKTsKICAgIH0KICAgIGNvbnN0IHZTaGlmdCA9IG51bWJlclRvU3RyaW5nKGxpbmVIZWlnaHQpOwogICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGAwIC0ke3ZTaGlmdH0gVGQgPCR7c3RyaW5nVG9VVEYxNkhleFN0cmluZyhsaW5lKX0+IFRqYCk7CiAgICB9CiAgICBidWZmZXIucHVzaCgiRVQiLCAiUSIpOwogICAgY29uc3QgYXBwZWFyYW5jZSA9IGJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiWE9iamVjdCIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiQkJveCIsIFswLCAwLCB3LCBoXSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgIGlmIChyb3RhdGlvbikgewogICAgICBjb25zdCBtYXRyaXggPSBnZXRSb3RhdGlvbk1hdHJpeChyb3RhdGlvbiwgdywgaCk7CiAgICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTWF0cml4IiwgbWF0cml4KTsKICAgIH0KICAgIGNvbnN0IGFwID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgIGFwLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIHJldHVybiBhcDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL25hbWVfbnVtYmVyX3RyZWUuanMKCgpjbGFzcyBOYW1lT3JOdW1iZXJUcmVlIHsKICBjb25zdHJ1Y3Rvcihyb290LCB4cmVmLCB0eXBlKSB7CiAgICB0aGlzLnJvb3QgPSByb290OwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuX3R5cGUgPSB0eXBlOwogIH0KICBnZXRBbGwoKSB7CiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7CiAgICBpZiAoIXRoaXMucm9vdCkgewogICAgICByZXR1cm4gbWFwOwogICAgfQogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGNvbnN0IHByb2Nlc3NlZCA9IG5ldyBSZWZTZXQoKTsKICAgIHByb2Nlc3NlZC5wdXQodGhpcy5yb290KTsKICAgIGNvbnN0IHF1ZXVlID0gW3RoaXMucm9vdF07CiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBvYmogPSB4cmVmLmZldGNoSWZSZWYocXVldWUuc2hpZnQoKSk7CiAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKG9iai5oYXMoIktpZHMiKSkgewogICAgICAgIGNvbnN0IGtpZHMgPSBvYmouZ2V0KCJLaWRzIik7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtpZHMpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgICAgaWYgKHByb2Nlc3NlZC5oYXMoa2lkKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYER1cGxpY2F0ZSBlbnRyeSBpbiAiJHt0aGlzLl90eXBlfSIgdHJlZS5gKTsKICAgICAgICAgIH0KICAgICAgICAgIHF1ZXVlLnB1c2goa2lkKTsKICAgICAgICAgIHByb2Nlc3NlZC5wdXQoa2lkKTsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgZW50cmllcyA9IG9iai5nZXQodGhpcy5fdHlwZSk7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGVudHJpZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICAgIG1hcC5zZXQoeHJlZi5mZXRjaElmUmVmKGVudHJpZXNbaV0pLCB4cmVmLmZldGNoSWZSZWYoZW50cmllc1tpICsgMV0pKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CiAgZ2V0UmF3KGtleSkgewogICAgaWYgKCF0aGlzLnJvb3QpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOwogICAgbGV0IGtpZHNPckVudHJpZXMgPSB4cmVmLmZldGNoSWZSZWYodGhpcy5yb290KTsKICAgIGxldCBsb29wQ291bnQgPSAwOwogICAgY29uc3QgTUFYX0xFVkVMUyA9IDEwOwogICAgd2hpbGUgKGtpZHNPckVudHJpZXMuaGFzKCJLaWRzIikpIHsKICAgICAgaWYgKCsrbG9vcENvdW50ID4gTUFYX0xFVkVMUykgewogICAgICAgIHdhcm4oYFNlYXJjaCBkZXB0aCBsaW1pdCByZWFjaGVkIGZvciAiJHt0aGlzLl90eXBlfSIgdHJlZS5gKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBraWRzID0ga2lkc09yRW50cmllcy5nZXQoIktpZHMiKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtpZHMpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgbGV0IGwgPSAwLAogICAgICAgIHIgPSBraWRzLmxlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChsIDw9IHIpIHsKICAgICAgICBjb25zdCBtID0gbCArIHIgPj4gMTsKICAgICAgICBjb25zdCBraWQgPSB4cmVmLmZldGNoSWZSZWYoa2lkc1ttXSk7CiAgICAgICAgY29uc3QgbGltaXRzID0ga2lkLmdldCgiTGltaXRzIik7CiAgICAgICAgaWYgKGtleSA8IHhyZWYuZmV0Y2hJZlJlZihsaW1pdHNbMF0pKSB7CiAgICAgICAgICByID0gbSAtIDE7CiAgICAgICAgfSBlbHNlIGlmIChrZXkgPiB4cmVmLmZldGNoSWZSZWYobGltaXRzWzFdKSkgewogICAgICAgICAgbCA9IG0gKyAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBraWRzT3JFbnRyaWVzID0ga2lkOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChsID4gcikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBjb25zdCBlbnRyaWVzID0ga2lkc09yRW50cmllcy5nZXQodGhpcy5fdHlwZSk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgewogICAgICBsZXQgbCA9IDAsCiAgICAgICAgciA9IGVudHJpZXMubGVuZ3RoIC0gMjsKICAgICAgd2hpbGUgKGwgPD0gcikgewogICAgICAgIGNvbnN0IHRtcCA9IGwgKyByID4+IDEsCiAgICAgICAgICBtID0gdG1wICsgKHRtcCAmIDEpOwogICAgICAgIGNvbnN0IGN1cnJlbnRLZXkgPSB4cmVmLmZldGNoSWZSZWYoZW50cmllc1ttXSk7CiAgICAgICAgaWYgKGtleSA8IGN1cnJlbnRLZXkpIHsKICAgICAgICAgIHIgPSBtIC0gMjsKICAgICAgICB9IGVsc2UgaWYgKGtleSA+IGN1cnJlbnRLZXkpIHsKICAgICAgICAgIGwgPSBtICsgMjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGVudHJpZXNbbSArIDFdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldChrZXkpIHsKICAgIHJldHVybiB0aGlzLnhyZWYuZmV0Y2hJZlJlZih0aGlzLmdldFJhdyhrZXkpKTsKICB9Cn0KY2xhc3MgTmFtZVRyZWUgZXh0ZW5kcyBOYW1lT3JOdW1iZXJUcmVlIHsKICBjb25zdHJ1Y3Rvcihyb290LCB4cmVmKSB7CiAgICBzdXBlcihyb290LCB4cmVmLCAiTmFtZXMiKTsKICB9Cn0KY2xhc3MgTnVtYmVyVHJlZSBleHRlbmRzIE5hbWVPck51bWJlclRyZWUgewogIGNvbnN0cnVjdG9yKHJvb3QsIHhyZWYpIHsKICAgIHN1cGVyKHJvb3QsIHhyZWYsICJOdW1zIik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jbGVhbnVwX2hlbHBlci5qcwoKCgoKZnVuY3Rpb24gY2xlYXJHbG9iYWxDYWNoZXMoKSB7CiAgY2xlYXJQYXR0ZXJuQ2FjaGVzKCk7CiAgY2xlYXJQcmltaXRpdmVDYWNoZXMoKTsKICBjbGVhclVuaWNvZGVDYWNoZXMoKTsKICBKcHhJbWFnZS5jbGVhbnVwKCk7Cn0KCjsvLyAuL3NyYy9jb3JlL2ZpbGVfc3BlYy5qcwoKCgpmdW5jdGlvbiBwaWNrUGxhdGZvcm1JdGVtKGRpY3QpIHsKICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBpZiAoZGljdC5oYXMoIlVGIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiVUYiKTsKICB9IGVsc2UgaWYgKGRpY3QuaGFzKCJGIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiRiIpOwogIH0gZWxzZSBpZiAoZGljdC5oYXMoIlVuaXgiKSkgewogICAgcmV0dXJuIGRpY3QuZ2V0KCJVbml4Iik7CiAgfSBlbHNlIGlmIChkaWN0LmhhcygiTWFjIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiTWFjIik7CiAgfSBlbHNlIGlmIChkaWN0LmhhcygiRE9TIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiRE9TIik7CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIHN0cmlwUGF0aChzdHIpIHsKICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGFzdEluZGV4T2YoIi8iKSArIDEpOwp9CmNsYXNzIEZpbGVTcGVjIHsKICAjY29udGVudEF2YWlsYWJsZSA9IGZhbHNlOwogIGNvbnN0cnVjdG9yKHJvb3QsIHhyZWYsIHNraXBDb250ZW50ID0gZmFsc2UpIHsKICAgIGlmICghKHJvb3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5yb290ID0gcm9vdDsKICAgIGlmIChyb290LmhhcygiRlMiKSkgewogICAgICB0aGlzLmZzID0gcm9vdC5nZXQoIkZTIik7CiAgICB9CiAgICBpZiAocm9vdC5oYXMoIlJGIikpIHsKICAgICAgd2FybigiUmVsYXRlZCBmaWxlIHNwZWNpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIik7CiAgICB9CiAgICBpZiAoIXNraXBDb250ZW50KSB7CiAgICAgIGlmIChyb290LmhhcygiRUYiKSkgewogICAgICAgIHRoaXMuI2NvbnRlbnRBdmFpbGFibGUgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIk5vbi1lbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIik7CiAgICAgIH0KICAgIH0KICB9CiAgZ2V0IGZpbGVuYW1lKCkgewogICAgbGV0IGZpbGVuYW1lID0gIiI7CiAgICBjb25zdCBpdGVtID0gcGlja1BsYXRmb3JtSXRlbSh0aGlzLnJvb3QpOwogICAgaWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICJzdHJpbmciKSB7CiAgICAgIGZpbGVuYW1lID0gc3RyaW5nVG9QREZTdHJpbmcoaXRlbSkucmVwbGFjZUFsbCgiXFxcXCIsICJcXCIpLnJlcGxhY2VBbGwoIlxcLyIsICIvIikucmVwbGFjZUFsbCgiXFwiLCAiLyIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZmlsZW5hbWUiLCBmaWxlbmFtZSB8fCAidW5uYW1lZCIpOwogIH0KICBnZXQgY29udGVudCgpIHsKICAgIGlmICghdGhpcy4jY29udGVudEF2YWlsYWJsZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHRoaXMuX2NvbnRlbnRSZWYgfHw9IHBpY2tQbGF0Zm9ybUl0ZW0odGhpcy5yb290Py5nZXQoIkVGIikpOwogICAgbGV0IGNvbnRlbnQgPSBudWxsOwogICAgaWYgKHRoaXMuX2NvbnRlbnRSZWYpIHsKICAgICAgY29uc3QgZmlsZU9iaiA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHRoaXMuX2NvbnRlbnRSZWYpOwogICAgICBpZiAoZmlsZU9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICBjb250ZW50ID0gZmlsZU9iai5nZXRCeXRlcygpOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIkVtYmVkZGVkIGZpbGUgc3BlY2lmaWNhdGlvbiBwb2ludHMgdG8gbm9uLWV4aXN0aW5nL2ludmFsaWQgY29udGVudCIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB3YXJuKCJFbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgaGF2ZSBhbnkgY29udGVudCIpOwogICAgfQogICAgcmV0dXJuIGNvbnRlbnQ7CiAgfQogIGdldCBkZXNjcmlwdGlvbigpIHsKICAgIGxldCBkZXNjcmlwdGlvbiA9ICIiOwogICAgY29uc3QgZGVzYyA9IHRoaXMucm9vdD8uZ2V0KCJEZXNjIik7CiAgICBpZiAoZGVzYyAmJiB0eXBlb2YgZGVzYyA9PT0gInN0cmluZyIpIHsKICAgICAgZGVzY3JpcHRpb24gPSBzdHJpbmdUb1BERlN0cmluZyhkZXNjKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOwogIH0KICBnZXQgc2VyaWFsaXphYmxlKCkgewogICAgcmV0dXJuIHsKICAgICAgcmF3RmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsCiAgICAgIGZpbGVuYW1lOiBzdHJpcFBhdGgodGhpcy5maWxlbmFtZSksCiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCwKICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24KICAgIH07CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94bWxfcGFyc2VyLmpzCgpjb25zdCBYTUxQYXJzZXJFcnJvckNvZGUgPSB7CiAgTm9FcnJvcjogMCwKICBFbmRPZkRvY3VtZW50OiAtMSwKICBVbnRlcm1pbmF0ZWRDZGF0OiAtMiwKICBVbnRlcm1pbmF0ZWRYbWxEZWNsYXJhdGlvbjogLTMsCiAgVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uOiAtNCwKICBVbnRlcm1pbmF0ZWRDb21tZW50OiAtNSwKICBNYWxmb3JtZWRFbGVtZW50OiAtNiwKICBPdXRPZk1lbW9yeTogLTcsCiAgVW50ZXJtaW5hdGVkQXR0cmlidXRlVmFsdWU6IC04LAogIFVudGVybWluYXRlZEVsZW1lbnQ6IC05LAogIEVsZW1lbnROZXZlckJlZ3VuOiAtMTAKfTsKZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKHMsIGluZGV4KSB7CiAgY29uc3QgY2ggPSBzW2luZGV4XTsKICByZXR1cm4gY2ggPT09ICIgIiB8fCBjaCA9PT0gIlxuIiB8fCBjaCA9PT0gIlxyIiB8fCBjaCA9PT0gIlx0IjsKfQpmdW5jdGlvbiBpc1doaXRlc3BhY2VTdHJpbmcocykgewogIGZvciAobGV0IGkgPSAwLCBpaSA9IHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgaWYgKCFpc1doaXRlc3BhY2UocywgaSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQpjbGFzcyBYTUxQYXJzZXJCYXNlIHsKICBfcmVzb2x2ZUVudGl0aWVzKHMpIHsKICAgIHJldHVybiBzLnJlcGxhY2VBbGwoLyYoW147XSspOy9nLCAoYWxsLCBlbnRpdHkpID0+IHsKICAgICAgaWYgKGVudGl0eS5zdWJzdHJpbmcoMCwgMikgPT09ICIjeCIpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygyKSwgMTYpKTsKICAgICAgfSBlbHNlIGlmIChlbnRpdHkuc3Vic3RyaW5nKDAsIDEpID09PSAiIyIpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygxKSwgMTApKTsKICAgICAgfQogICAgICBzd2l0Y2ggKGVudGl0eSkgewogICAgICAgIGNhc2UgImx0IjoKICAgICAgICAgIHJldHVybiAiPCI7CiAgICAgICAgY2FzZSAiZ3QiOgogICAgICAgICAgcmV0dXJuICI+IjsKICAgICAgICBjYXNlICJhbXAiOgogICAgICAgICAgcmV0dXJuICImIjsKICAgICAgICBjYXNlICJxdW90IjoKICAgICAgICAgIHJldHVybiAnIic7CiAgICAgICAgY2FzZSAiYXBvcyI6CiAgICAgICAgICByZXR1cm4gIiciOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLm9uUmVzb2x2ZUVudGl0eShlbnRpdHkpOwogICAgfSk7CiAgfQogIF9wYXJzZUNvbnRlbnQocywgc3RhcnQpIHsKICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbXTsKICAgIGxldCBwb3MgPSBzdGFydDsKICAgIGZ1bmN0aW9uIHNraXBXcygpIHsKICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIGlzV2hpdGVzcGFjZShzLCBwb3MpKSB7CiAgICAgICAgKytwb3M7CiAgICAgIH0KICAgIH0KICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSAiPiIgJiYgc1twb3NdICE9PSAiLyIpIHsKICAgICAgKytwb3M7CiAgICB9CiAgICBjb25zdCBuYW1lID0gcy5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7CiAgICBza2lwV3MoKTsKICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiBzW3Bvc10gIT09ICI+IiAmJiBzW3Bvc10gIT09ICIvIiAmJiBzW3Bvc10gIT09ICI/IikgewogICAgICBza2lwV3MoKTsKICAgICAgbGV0IGF0dHJOYW1lID0gIiIsCiAgICAgICAgYXR0clZhbHVlID0gIiI7CiAgICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSAiPSIpIHsKICAgICAgICBhdHRyTmFtZSArPSBzW3Bvc107CiAgICAgICAgKytwb3M7CiAgICAgIH0KICAgICAgc2tpcFdzKCk7CiAgICAgIGlmIChzW3Bvc10gIT09ICI9IikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgICsrcG9zOwogICAgICBza2lwV3MoKTsKICAgICAgY29uc3QgYXR0ckVuZENoYXIgPSBzW3Bvc107CiAgICAgIGlmIChhdHRyRW5kQ2hhciAhPT0gJyInICYmIGF0dHJFbmRDaGFyICE9PSAiJyIpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBhdHRyRW5kSW5kZXggPSBzLmluZGV4T2YoYXR0ckVuZENoYXIsICsrcG9zKTsKICAgICAgaWYgKGF0dHJFbmRJbmRleCA8IDApIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBhdHRyVmFsdWUgPSBzLnN1YnN0cmluZyhwb3MsIGF0dHJFbmRJbmRleCk7CiAgICAgIGF0dHJpYnV0ZXMucHVzaCh7CiAgICAgICAgbmFtZTogYXR0ck5hbWUsCiAgICAgICAgdmFsdWU6IHRoaXMuX3Jlc29sdmVFbnRpdGllcyhhdHRyVmFsdWUpCiAgICAgIH0pOwogICAgICBwb3MgPSBhdHRyRW5kSW5kZXggKyAxOwogICAgICBza2lwV3MoKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIG5hbWUsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIHBhcnNlZDogcG9zIC0gc3RhcnQKICAgIH07CiAgfQogIF9wYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihzLCBzdGFydCkgewogICAgbGV0IHBvcyA9IHN0YXJ0OwogICAgZnVuY3Rpb24gc2tpcFdzKCkgewogICAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgaXNXaGl0ZXNwYWNlKHMsIHBvcykpIHsKICAgICAgICArK3BvczsKICAgICAgfQogICAgfQogICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmICFpc1doaXRlc3BhY2UocywgcG9zKSAmJiBzW3Bvc10gIT09ICI+IiAmJiBzW3Bvc10gIT09ICI/IiAmJiBzW3Bvc10gIT09ICIvIikgewogICAgICArK3BvczsKICAgIH0KICAgIGNvbnN0IG5hbWUgPSBzLnN1YnN0cmluZyhzdGFydCwgcG9zKTsKICAgIHNraXBXcygpOwogICAgY29uc3QgYXR0clN0YXJ0ID0gcG9zOwogICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIChzW3Bvc10gIT09ICI/IiB8fCBzW3BvcyArIDFdICE9PSAiPiIpKSB7CiAgICAgICsrcG9zOwogICAgfQogICAgY29uc3QgdmFsdWUgPSBzLnN1YnN0cmluZyhhdHRyU3RhcnQsIHBvcyk7CiAgICByZXR1cm4gewogICAgICBuYW1lLAogICAgICB2YWx1ZSwKICAgICAgcGFyc2VkOiBwb3MgLSBzdGFydAogICAgfTsKICB9CiAgcGFyc2VYbWwocykgewogICAgbGV0IGkgPSAwOwogICAgd2hpbGUgKGkgPCBzLmxlbmd0aCkgewogICAgICBjb25zdCBjaCA9IHNbaV07CiAgICAgIGxldCBqID0gaTsKICAgICAgaWYgKGNoID09PSAiPCIpIHsKICAgICAgICArK2o7CiAgICAgICAgY29uc3QgY2gyID0gc1tqXTsKICAgICAgICBsZXQgcTsKICAgICAgICBzd2l0Y2ggKGNoMikgewogICAgICAgICAgY2FzZSAiLyI6CiAgICAgICAgICAgICsrajsKICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGopOwogICAgICAgICAgICBpZiAocSA8IDApIHsKICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZEVsZW1lbnQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uRW5kRWxlbWVudChzLnN1YnN0cmluZyhqLCBxKSk7CiAgICAgICAgICAgIGogPSBxICsgMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICI/IjoKICAgICAgICAgICAgKytqOwogICAgICAgICAgICBjb25zdCBwaSA9IHRoaXMuX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHMsIGopOwogICAgICAgICAgICBpZiAocy5zdWJzdHJpbmcoaiArIHBpLnBhcnNlZCwgaiArIHBpLnBhcnNlZCArIDIpICE9PSAiPz4iKSB7CiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWRYbWxEZWNsYXJhdGlvbik7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMub25QaShwaS5uYW1lLCBwaS52YWx1ZSk7CiAgICAgICAgICAgIGogKz0gcGkucGFyc2VkICsgMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICIhIjoKICAgICAgICAgICAgaWYgKHMuc3Vic3RyaW5nKGogKyAxLCBqICsgMykgPT09ICItLSIpIHsKICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKCItLT4iLCBqICsgMyk7CiAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZENvbW1lbnQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLm9uQ29tbWVudChzLnN1YnN0cmluZyhqICsgMywgcSkpOwogICAgICAgICAgICAgIGogPSBxICsgMzsKICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgMSwgaiArIDgpID09PSAiW0NEQVRBWyIpIHsKICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKCJdXT4iLCBqICsgOCk7CiAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZENkYXQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLm9uQ2RhdGEocy5zdWJzdHJpbmcoaiArIDgsIHEpKTsKICAgICAgICAgICAgICBqID0gcSArIDM7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocy5zdWJzdHJpbmcoaiArIDEsIGogKyA4KSA9PT0gIkRPQ1RZUEUiKSB7CiAgICAgICAgICAgICAgY29uc3QgcTIgPSBzLmluZGV4T2YoIlsiLCBqICsgOCk7CiAgICAgICAgICAgICAgbGV0IGNvbXBsZXhEb2N0eXBlID0gZmFsc2U7CiAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGogKyA4KTsKICAgICAgICAgICAgICBpZiAocSA8IDApIHsKICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHEyID4gMCAmJiBxID4gcTIpIHsKICAgICAgICAgICAgICAgIHEgPSBzLmluZGV4T2YoIl0+IiwgaiArIDgpOwogICAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29tcGxleERvY3R5cGUgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBkb2N0eXBlQ29udGVudCA9IHMuc3Vic3RyaW5nKGogKyA4LCBxICsgKGNvbXBsZXhEb2N0eXBlID8gMSA6IDApKTsKICAgICAgICAgICAgICB0aGlzLm9uRG9jdHlwZShkb2N0eXBlQ29udGVudCk7CiAgICAgICAgICAgICAgaiA9IHEgKyAoY29tcGxleERvY3R5cGUgPyAyIDogMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5NYWxmb3JtZWRFbGVtZW50KTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fcGFyc2VDb250ZW50KHMsIGopOwogICAgICAgICAgICBpZiAoY29udGVudCA9PT0gbnVsbCkgewogICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuTWFsZm9ybWVkRWxlbWVudCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBpc0Nsb3NlZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAocy5zdWJzdHJpbmcoaiArIGNvbnRlbnQucGFyc2VkLCBqICsgY29udGVudC5wYXJzZWQgKyAyKSA9PT0gIi8+IikgewogICAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgY29udGVudC5wYXJzZWQsIGogKyBjb250ZW50LnBhcnNlZCArIDEpICE9PSAiPiIpIHsKICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZEVsZW1lbnQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uQmVnaW5FbGVtZW50KGNvbnRlbnQubmFtZSwgY29udGVudC5hdHRyaWJ1dGVzLCBpc0Nsb3NlZCk7CiAgICAgICAgICAgIGogKz0gY29udGVudC5wYXJzZWQgKyAoaXNDbG9zZWQgPyAyIDogMSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoaiA8IHMubGVuZ3RoICYmIHNbal0gIT09ICI8IikgewogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBjb25zdCB0ZXh0ID0gcy5zdWJzdHJpbmcoaSwgaik7CiAgICAgICAgdGhpcy5vblRleHQodGhpcy5fcmVzb2x2ZUVudGl0aWVzKHRleHQpKTsKICAgICAgfQogICAgICBpID0gajsKICAgIH0KICB9CiAgb25SZXNvbHZlRW50aXR5KG5hbWUpIHsKICAgIHJldHVybiBgJiR7bmFtZX07YDsKICB9CiAgb25QaShuYW1lLCB2YWx1ZSkge30KICBvbkNvbW1lbnQodGV4dCkge30KICBvbkNkYXRhKHRleHQpIHt9CiAgb25Eb2N0eXBlKGRvY3R5cGVDb250ZW50KSB7fQogIG9uVGV4dCh0ZXh0KSB7fQogIG9uQmVnaW5FbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlzRW1wdHkpIHt9CiAgb25FbmRFbGVtZW50KG5hbWUpIHt9CiAgb25FcnJvcihjb2RlKSB7fQp9CmNsYXNzIFNpbXBsZURPTU5vZGUgewogIGNvbnN0cnVjdG9yKG5vZGVOYW1lLCBub2RlVmFsdWUpIHsKICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKICAgIHRoaXMubm9kZVZhbHVlID0gbm9kZVZhbHVlOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJwYXJlbnROb2RlIiwgewogICAgICB2YWx1ZTogbnVsbCwKICAgICAgd3JpdGFibGU6IHRydWUKICAgIH0pOwogIH0KICBnZXQgZmlyc3RDaGlsZCgpIHsKICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXM/LlswXTsKICB9CiAgZ2V0IG5leHRTaWJsaW5nKCkgewogICAgY29uc3QgY2hpbGROb2RlcyA9IHRoaXMucGFyZW50Tm9kZS5jaGlsZE5vZGVzOwogICAgaWYgKCFjaGlsZE5vZGVzKSB7CiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICBjb25zdCBpbmRleCA9IGNoaWxkTm9kZXMuaW5kZXhPZih0aGlzKTsKICAgIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiBjaGlsZE5vZGVzW2luZGV4ICsgMV07CiAgfQogIGdldCB0ZXh0Q29udGVudCgpIHsKICAgIGlmICghdGhpcy5jaGlsZE5vZGVzKSB7CiAgICAgIHJldHVybiB0aGlzLm5vZGVWYWx1ZSB8fCAiIjsKICAgIH0KICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXMubWFwKGNoaWxkID0+IGNoaWxkLnRleHRDb250ZW50KS5qb2luKCIiKTsKICB9CiAgZ2V0IGNoaWxkcmVuKCkgewogICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlcyB8fCBbXTsKICB9CiAgaGFzQ2hpbGROb2RlcygpIHsKICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXM/Lmxlbmd0aCA+IDA7CiAgfQogIHNlYXJjaE5vZGUocGF0aHMsIHBvcykgewogICAgaWYgKHBvcyA+PSBwYXRocy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjb25zdCBjb21wb25lbnQgPSBwYXRoc1twb3NdOwogICAgaWYgKGNvbXBvbmVudC5uYW1lLnN0YXJ0c1dpdGgoIiMiKSAmJiBwb3MgPCBwYXRocy5sZW5ndGggLSAxKSB7CiAgICAgIHJldHVybiB0aGlzLnNlYXJjaE5vZGUocGF0aHMsIHBvcyArIDEpOwogICAgfQogICAgY29uc3Qgc3RhY2sgPSBbXTsKICAgIGxldCBub2RlID0gdGhpczsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChjb21wb25lbnQubmFtZSA9PT0gbm9kZS5ub2RlTmFtZSkgewogICAgICAgIGlmIChjb21wb25lbnQucG9zID09PSAwKSB7CiAgICAgICAgICBjb25zdCByZXMgPSBub2RlLnNlYXJjaE5vZGUocGF0aHMsIHBvcyArIDEpOwogICAgICAgICAgaWYgKHJlcyAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgW3BhcmVudF0gPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGxldCBzaWJsaW5nUG9zID0gMDsKICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgcGFyZW50LmNoaWxkTm9kZXMpIHsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5uYW1lID09PSBjaGlsZC5ub2RlTmFtZSkgewogICAgICAgICAgICAgIGlmIChzaWJsaW5nUG9zID09PSBjb21wb25lbnQucG9zKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuc2VhcmNoTm9kZShwYXRocywgcG9zICsgMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNpYmxpbmdQb3MrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5vZGUuc2VhcmNoTm9kZShwYXRocywgcG9zICsgMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChub2RlLmNoaWxkTm9kZXM/Lmxlbmd0aCA+IDApIHsKICAgICAgICBzdGFjay5wdXNoKFtub2RlLCAwXSk7CiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1swXTsKICAgICAgfSBlbHNlIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICBjb25zdCBbcGFyZW50LCBjdXJyZW50UG9zXSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgY29uc3QgbmV3UG9zID0gY3VycmVudFBvcyArIDE7CiAgICAgICAgICBpZiAobmV3UG9zIDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goW3BhcmVudCwgbmV3UG9zXSk7CiAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQuY2hpbGROb2Rlc1tuZXdQb3NdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGR1bXAoYnVmZmVyKSB7CiAgICBpZiAodGhpcy5ub2RlTmFtZSA9PT0gIiN0ZXh0IikgewogICAgICBidWZmZXIucHVzaChlbmNvZGVUb1htbFN0cmluZyh0aGlzLm5vZGVWYWx1ZSkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBidWZmZXIucHVzaChgPCR7dGhpcy5ub2RlTmFtZX1gKTsKICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMpIHsKICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgdGhpcy5hdHRyaWJ1dGVzKSB7CiAgICAgICAgYnVmZmVyLnB1c2goYCAke2F0dHJpYnV0ZS5uYW1lfT0iJHtlbmNvZGVUb1htbFN0cmluZyhhdHRyaWJ1dGUudmFsdWUpfSJgKTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMuaGFzQ2hpbGROb2RlcygpKSB7CiAgICAgIGJ1ZmZlci5wdXNoKCI+Iik7CiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZE5vZGVzKSB7CiAgICAgICAgY2hpbGQuZHVtcChidWZmZXIpOwogICAgICB9CiAgICAgIGJ1ZmZlci5wdXNoKGA8LyR7dGhpcy5ub2RlTmFtZX0+YCk7CiAgICB9IGVsc2UgaWYgKHRoaXMubm9kZVZhbHVlKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGA+JHtlbmNvZGVUb1htbFN0cmluZyh0aGlzLm5vZGVWYWx1ZSl9PC8ke3RoaXMubm9kZU5hbWV9PmApOwogICAgfSBlbHNlIHsKICAgICAgYnVmZmVyLnB1c2goIi8+Iik7CiAgICB9CiAgfQp9CmNsYXNzIFNpbXBsZVhNTFBhcnNlciBleHRlbmRzIFhNTFBhcnNlckJhc2UgewogIGNvbnN0cnVjdG9yKHsKICAgIGhhc0F0dHJpYnV0ZXMgPSBmYWxzZSwKICAgIGxvd2VyQ2FzZU5hbWUgPSBmYWxzZQogIH0pIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQgPSBudWxsOwogICAgdGhpcy5fc3RhY2sgPSBudWxsOwogICAgdGhpcy5fZXJyb3JDb2RlID0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7CiAgICB0aGlzLl9oYXNBdHRyaWJ1dGVzID0gaGFzQXR0cmlidXRlczsKICAgIHRoaXMuX2xvd2VyQ2FzZU5hbWUgPSBsb3dlckNhc2VOYW1lOwogIH0KICBwYXJzZUZyb21TdHJpbmcoZGF0YSkgewogICAgdGhpcy5fY3VycmVudEZyYWdtZW50ID0gW107CiAgICB0aGlzLl9zdGFjayA9IFtdOwogICAgdGhpcy5fZXJyb3JDb2RlID0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7CiAgICB0aGlzLnBhcnNlWG1sKGRhdGEpOwogICAgaWYgKHRoaXMuX2Vycm9yQ29kZSAhPT0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3IpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbnN0IFtkb2N1bWVudEVsZW1lbnRdID0gdGhpcy5fY3VycmVudEZyYWdtZW50OwogICAgaWYgKCFkb2N1bWVudEVsZW1lbnQpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGRvY3VtZW50RWxlbWVudAogICAgfTsKICB9CiAgb25UZXh0KHRleHQpIHsKICAgIGlmIChpc1doaXRlc3BhY2VTdHJpbmcodGV4dCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKCIjdGV4dCIsIHRleHQpOwogICAgdGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobm9kZSk7CiAgfQogIG9uQ2RhdGEodGV4dCkgewogICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKCIjdGV4dCIsIHRleHQpOwogICAgdGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobm9kZSk7CiAgfQogIG9uQmVnaW5FbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlzRW1wdHkpIHsKICAgIGlmICh0aGlzLl9sb3dlckNhc2VOYW1lKSB7CiAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICB9CiAgICBjb25zdCBub2RlID0gbmV3IFNpbXBsZURPTU5vZGUobmFtZSk7CiAgICBub2RlLmNoaWxkTm9kZXMgPSBbXTsKICAgIGlmICh0aGlzLl9oYXNBdHRyaWJ1dGVzKSB7CiAgICAgIG5vZGUuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CiAgICB9CiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaChub2RlKTsKICAgIGlmIChpc0VtcHR5KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX3N0YWNrLnB1c2godGhpcy5fY3VycmVudEZyYWdtZW50KTsKICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IG5vZGUuY2hpbGROb2RlczsKICB9CiAgb25FbmRFbGVtZW50KG5hbWUpIHsKICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IHRoaXMuX3N0YWNrLnBvcCgpIHx8IFtdOwogICAgY29uc3QgbGFzdEVsZW1lbnQgPSB0aGlzLl9jdXJyZW50RnJhZ21lbnQuYXQoLTEpOwogICAgaWYgKCFsYXN0RWxlbWVudCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIGxhc3RFbGVtZW50LmNoaWxkTm9kZXMpIHsKICAgICAgY2hpbGROb2RlLnBhcmVudE5vZGUgPSBsYXN0RWxlbWVudDsKICAgIH0KICAgIHJldHVybiBsYXN0RWxlbWVudDsKICB9CiAgb25FcnJvcihjb2RlKSB7CiAgICB0aGlzLl9lcnJvckNvZGUgPSBjb2RlOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvbWV0YWRhdGFfcGFyc2VyLmpzCgpjbGFzcyBNZXRhZGF0YVBhcnNlciB7CiAgY29uc3RydWN0b3IoZGF0YSkgewogICAgZGF0YSA9IHRoaXMuX3JlcGFpcihkYXRhKTsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBTaW1wbGVYTUxQYXJzZXIoewogICAgICBsb3dlckNhc2VOYW1lOiB0cnVlCiAgICB9KTsKICAgIGNvbnN0IHhtbERvY3VtZW50ID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhkYXRhKTsKICAgIHRoaXMuX21ldGFkYXRhTWFwID0gbmV3IE1hcCgpOwogICAgdGhpcy5fZGF0YSA9IGRhdGE7CiAgICBpZiAoeG1sRG9jdW1lbnQpIHsKICAgICAgdGhpcy5fcGFyc2UoeG1sRG9jdW1lbnQpOwogICAgfQogIH0KICBfcmVwYWlyKGRhdGEpIHsKICAgIHJldHVybiBkYXRhLnJlcGxhY2UoL15bXjxdKy8sICIiKS5yZXBsYWNlQWxsKC8+XFwzNzZcXDM3NyhbXjxdKykvZywgZnVuY3Rpb24gKGFsbCwgY29kZXMpIHsKICAgICAgY29uc3QgYnl0ZXMgPSBjb2Rlcy5yZXBsYWNlQWxsKC9cXChbMC0zXSkoWzAtN10pKFswLTddKS9nLCBmdW5jdGlvbiAoY29kZSwgZDEsIGQyLCBkMykgewogICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGQxICogNjQgKyBkMiAqIDggKyBkMyAqIDEpOwogICAgICB9KS5yZXBsYWNlQWxsKC8mKGFtcHxhcG9zfGd0fGx0fHF1b3QpOy9nLCBmdW5jdGlvbiAoc3RyLCBuYW1lKSB7CiAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICBjYXNlICJhbXAiOgogICAgICAgICAgICByZXR1cm4gIiYiOwogICAgICAgICAgY2FzZSAiYXBvcyI6CiAgICAgICAgICAgIHJldHVybiAiJyI7CiAgICAgICAgICBjYXNlICJndCI6CiAgICAgICAgICAgIHJldHVybiAiPiI7CiAgICAgICAgICBjYXNlICJsdCI6CiAgICAgICAgICAgIHJldHVybiAiPCI7CiAgICAgICAgICBjYXNlICJxdW90IjoKICAgICAgICAgICAgcmV0dXJuICciJzsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBfcmVwYWlyOiAke25hbWV9IGlzbid0IGRlZmluZWQuYCk7CiAgICAgIH0pOwogICAgICBjb25zdCBjaGFyQnVmID0gWyI+Il07CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGJ5dGVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICBjb25zdCBjb2RlID0gYnl0ZXMuY2hhckNvZGVBdChpKSAqIDI1NiArIGJ5dGVzLmNoYXJDb2RlQXQoaSArIDEpOwogICAgICAgIGlmIChjb2RlID49IDMyICYmIGNvZGUgPCAxMjcgJiYgY29kZSAhPT0gNjAgJiYgY29kZSAhPT0gNjIgJiYgY29kZSAhPT0gMzgpIHsKICAgICAgICAgIGNoYXJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2hhckJ1Zi5wdXNoKCImI3giICsgKDB4MTAwMDAgKyBjb2RlKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpICsgIjsiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGNoYXJCdWYuam9pbigiIik7CiAgICB9KTsKICB9CiAgX2dldFNlcXVlbmNlKGVudHJ5KSB7CiAgICBjb25zdCBuYW1lID0gZW50cnkubm9kZU5hbWU7CiAgICBpZiAobmFtZSAhPT0gInJkZjpiYWciICYmIG5hbWUgIT09ICJyZGY6c2VxIiAmJiBuYW1lICE9PSAicmRmOmFsdCIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gZW50cnkuY2hpbGROb2Rlcy5maWx0ZXIobm9kZSA9PiBub2RlLm5vZGVOYW1lID09PSAicmRmOmxpIik7CiAgfQogIF9wYXJzZUFycmF5KGVudHJ5KSB7CiAgICBpZiAoIWVudHJ5Lmhhc0NoaWxkTm9kZXMoKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBbc2VxTm9kZV0gPSBlbnRyeS5jaGlsZE5vZGVzOwogICAgY29uc3Qgc2VxdWVuY2UgPSB0aGlzLl9nZXRTZXF1ZW5jZShzZXFOb2RlKSB8fCBbXTsKICAgIHRoaXMuX21ldGFkYXRhTWFwLnNldChlbnRyeS5ub2RlTmFtZSwgc2VxdWVuY2UubWFwKG5vZGUgPT4gbm9kZS50ZXh0Q29udGVudC50cmltKCkpKTsKICB9CiAgX3BhcnNlKHhtbERvY3VtZW50KSB7CiAgICBsZXQgcmRmID0geG1sRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgaWYgKHJkZi5ub2RlTmFtZSAhPT0gInJkZjpyZGYiKSB7CiAgICAgIHJkZiA9IHJkZi5maXJzdENoaWxkOwogICAgICB3aGlsZSAocmRmICYmIHJkZi5ub2RlTmFtZSAhPT0gInJkZjpyZGYiKSB7CiAgICAgICAgcmRmID0gcmRmLm5leHRTaWJsaW5nOwogICAgICB9CiAgICB9CiAgICBpZiAoIXJkZiB8fCByZGYubm9kZU5hbWUgIT09ICJyZGY6cmRmIiB8fCAhcmRmLmhhc0NoaWxkTm9kZXMoKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGRlc2Mgb2YgcmRmLmNoaWxkTm9kZXMpIHsKICAgICAgaWYgKGRlc2Mubm9kZU5hbWUgIT09ICJyZGY6ZGVzY3JpcHRpb24iKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBkZXNjLmNoaWxkTm9kZXMpIHsKICAgICAgICBjb25zdCBuYW1lID0gZW50cnkubm9kZU5hbWU7CiAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICBjYXNlICIjdGV4dCI6CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgY2FzZSAiZGM6Y3JlYXRvciI6CiAgICAgICAgICBjYXNlICJkYzpzdWJqZWN0IjoKICAgICAgICAgICAgdGhpcy5fcGFyc2VBcnJheShlbnRyeSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB0aGlzLl9tZXRhZGF0YU1hcC5zZXQobmFtZSwgZW50cnkudGV4dENvbnRlbnQudHJpbSgpKTsKICAgICAgfQogICAgfQogIH0KICBnZXQgc2VyaWFsaXphYmxlKCkgewogICAgcmV0dXJuIHsKICAgICAgcGFyc2VkRGF0YTogdGhpcy5fbWV0YWRhdGFNYXAsCiAgICAgIHJhd0RhdGE6IHRoaXMuX2RhdGEKICAgIH07CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9zdHJ1Y3RfdHJlZS5qcwoKCgoKY29uc3QgTUFYX0RFUFRIID0gNDA7CmNvbnN0IFN0cnVjdEVsZW1lbnRUeXBlID0gewogIFBBR0VfQ09OVEVOVDogMSwKICBTVFJFQU1fQ09OVEVOVDogMiwKICBPQkpFQ1Q6IDMsCiAgQU5OT1RBVElPTjogNCwKICBFTEVNRU5UOiA1Cn07CmNsYXNzIFN0cnVjdFRyZWVSb290IHsKICBjb25zdHJ1Y3Rvcih4cmVmLCByb290RGljdCwgcm9vdFJlZikgewogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuZGljdCA9IHJvb3REaWN0OwogICAgdGhpcy5yZWYgPSByb290UmVmIGluc3RhbmNlb2YgUmVmID8gcm9vdFJlZiA6IG51bGw7CiAgICB0aGlzLnJvbGVNYXAgPSBuZXcgTWFwKCk7CiAgICB0aGlzLnN0cnVjdFBhcmVudElkcyA9IG51bGw7CiAgfQogIGluaXQoKSB7CiAgICB0aGlzLnJlYWRSb2xlTWFwKCk7CiAgfQogICNhZGRJZFRvUGFnZShwYWdlUmVmLCBpZCwgdHlwZSkgewogICAgaWYgKCEocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikgfHwgaWQgPCAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuc3RydWN0UGFyZW50SWRzIHx8PSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIGxldCBpZHMgPSB0aGlzLnN0cnVjdFBhcmVudElkcy5nZXQocGFnZVJlZik7CiAgICBpZiAoIWlkcykgewogICAgICBpZHMgPSBbXTsKICAgICAgdGhpcy5zdHJ1Y3RQYXJlbnRJZHMucHV0KHBhZ2VSZWYsIGlkcyk7CiAgICB9CiAgICBpZHMucHVzaChbaWQsIHR5cGVdKTsKICB9CiAgYWRkQW5ub3RhdGlvbklkVG9QYWdlKHBhZ2VSZWYsIGlkKSB7CiAgICB0aGlzLiNhZGRJZFRvUGFnZShwYWdlUmVmLCBpZCwgU3RydWN0RWxlbWVudFR5cGUuQU5OT1RBVElPTik7CiAgfQogIHJlYWRSb2xlTWFwKCkgewogICAgY29uc3Qgcm9sZU1hcERpY3QgPSB0aGlzLmRpY3QuZ2V0KCJSb2xlTWFwIik7CiAgICBpZiAoIShyb2xlTWFwRGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJvbGVNYXBEaWN0KSB7CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICB0aGlzLnJvbGVNYXAuc2V0KGtleSwgdmFsdWUubmFtZSk7CiAgICAgIH0KICAgIH0KICB9CiAgc3RhdGljIGFzeW5jIGNhbkNyZWF0ZVN0cnVjdHVyZVRyZWUoewogICAgY2F0YWxvZ1JlZiwKICAgIHBkZk1hbmFnZXIsCiAgICBuZXdBbm5vdGF0aW9uc0J5UGFnZQogIH0pIHsKICAgIGlmICghKGNhdGFsb2dSZWYgaW5zdGFuY2VvZiBSZWYpKSB7CiAgICAgIHdhcm4oIkNhbm5vdCBzYXZlIHRoZSBzdHJ1Y3QgdHJlZTogbm8gY2F0YWxvZyByZWZlcmVuY2UuIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGxldCBuZXh0S2V5ID0gMDsKICAgIGxldCBoYXNOb3RoaW5nVG9VcGRhdGUgPSB0cnVlOwogICAgZm9yIChjb25zdCBbcGFnZUluZGV4LCBlbGVtZW50c10gb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UpIHsKICAgICAgY29uc3QgewogICAgICAgIHJlZjogcGFnZVJlZgogICAgICB9ID0gYXdhaXQgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCk7CiAgICAgIGlmICghKHBhZ2VSZWYgaW5zdGFuY2VvZiBSZWYpKSB7CiAgICAgICAgd2FybihgQ2Fubm90IHNhdmUgdGhlIHN0cnVjdCB0cmVlOiBwYWdlICR7cGFnZUluZGV4fSBoYXMgbm8gcmVmLmApOwogICAgICAgIGhhc05vdGhpbmdUb1VwZGF0ZSA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuYWNjZXNzaWJpbGl0eURhdGE/LnR5cGUpIHsKICAgICAgICAgIGVsZW1lbnQucGFyZW50VHJlZUlkID0gbmV4dEtleSsrOwogICAgICAgICAgaGFzTm90aGluZ1RvVXBkYXRlID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoaGFzTm90aGluZ1RvVXBkYXRlKSB7CiAgICAgIGZvciAoY29uc3QgZWxlbWVudHMgb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UudmFsdWVzKCkpIHsKICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHsKICAgICAgICAgIGRlbGV0ZSBlbGVtZW50LnBhcmVudFRyZWVJZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVTdHJ1Y3R1cmVUcmVlKHsKICAgIG5ld0Fubm90YXRpb25zQnlQYWdlLAogICAgeHJlZiwKICAgIGNhdGFsb2dSZWYsCiAgICBwZGZNYW5hZ2VyLAogICAgY2hhbmdlcwogIH0pIHsKICAgIGNvbnN0IHJvb3QgPSBwZGZNYW5hZ2VyLmNhdGFsb2cuY2xvbmVEaWN0KCk7CiAgICBjb25zdCBjYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgY2FjaGUucHV0KGNhdGFsb2dSZWYsIHJvb3QpOwogICAgY29uc3Qgc3RydWN0VHJlZVJvb3RSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgcm9vdC5zZXQoIlN0cnVjdFRyZWVSb290Iiwgc3RydWN0VHJlZVJvb3RSZWYpOwogICAgY29uc3Qgc3RydWN0VHJlZVJvb3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIHN0cnVjdFRyZWVSb290LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJTdHJ1Y3RUcmVlUm9vdCIpKTsKICAgIGNvbnN0IHBhcmVudFRyZWVSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgc3RydWN0VHJlZVJvb3Quc2V0KCJQYXJlbnRUcmVlIiwgcGFyZW50VHJlZVJlZik7CiAgICBjb25zdCBraWRzID0gW107CiAgICBzdHJ1Y3RUcmVlUm9vdC5zZXQoIksiLCBraWRzKTsKICAgIGNhY2hlLnB1dChzdHJ1Y3RUcmVlUm9vdFJlZiwgc3RydWN0VHJlZVJvb3QpOwogICAgY29uc3QgcGFyZW50VHJlZSA9IG5ldyBEaWN0KHhyZWYpOwogICAgY29uc3QgbnVtcyA9IFtdOwogICAgcGFyZW50VHJlZS5zZXQoIk51bXMiLCBudW1zKTsKICAgIGNvbnN0IG5leHRLZXkgPSBhd2FpdCB0aGlzLiN3cml0ZUtpZHMoewogICAgICBuZXdBbm5vdGF0aW9uc0J5UGFnZSwKICAgICAgc3RydWN0VHJlZVJvb3RSZWYsCiAgICAgIHN0cnVjdFRyZWVSb290OiBudWxsLAogICAgICBraWRzLAogICAgICBudW1zLAogICAgICB4cmVmLAogICAgICBwZGZNYW5hZ2VyLAogICAgICBjaGFuZ2VzLAogICAgICBjYWNoZQogICAgfSk7CiAgICBzdHJ1Y3RUcmVlUm9vdC5zZXQoIlBhcmVudFRyZWVOZXh0S2V5IiwgbmV4dEtleSk7CiAgICBjYWNoZS5wdXQocGFyZW50VHJlZVJlZiwgcGFyZW50VHJlZSk7CiAgICBmb3IgKGNvbnN0IFtyZWYsIG9ial0gb2YgY2FjaGUuaXRlbXMoKSkgewogICAgICBjaGFuZ2VzLnB1dChyZWYsIHsKICAgICAgICBkYXRhOiBvYmoKICAgICAgfSk7CiAgICB9CiAgfQogIGFzeW5jIGNhblVwZGF0ZVN0cnVjdFRyZWUoewogICAgcGRmTWFuYWdlciwKICAgIG5ld0Fubm90YXRpb25zQnlQYWdlCiAgfSkgewogICAgaWYgKCF0aGlzLnJlZikgewogICAgICB3YXJuKCJDYW5ub3QgdXBkYXRlIHRoZSBzdHJ1Y3QgdHJlZTogbm8gcm9vdCByZWZlcmVuY2UuIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGxldCBuZXh0S2V5ID0gdGhpcy5kaWN0LmdldCgiUGFyZW50VHJlZU5leHRLZXkiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihuZXh0S2V5KSB8fCBuZXh0S2V5IDwgMCkgewogICAgICB3YXJuKCJDYW5ub3QgdXBkYXRlIHRoZSBzdHJ1Y3QgdHJlZTogaW52YWxpZCBuZXh0IGtleS4iKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgcGFyZW50VHJlZSA9IHRoaXMuZGljdC5nZXQoIlBhcmVudFRyZWUiKTsKICAgIGlmICghKHBhcmVudFRyZWUgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICB3YXJuKCJDYW5ub3QgdXBkYXRlIHRoZSBzdHJ1Y3QgdHJlZTogUGFyZW50VHJlZSBpc24ndCBhIGRpY3QuIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IG51bXMgPSBwYXJlbnRUcmVlLmdldCgiTnVtcyIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KG51bXMpKSB7CiAgICAgIHdhcm4oIkNhbm5vdCB1cGRhdGUgdGhlIHN0cnVjdCB0cmVlOiBudW1zIGlzbid0IGFuIGFycmF5LiIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjb25zdCBudW1iZXJUcmVlID0gbmV3IE51bWJlclRyZWUocGFyZW50VHJlZSwgdGhpcy54cmVmKTsKICAgIGZvciAoY29uc3QgcGFnZUluZGV4IG9mIG5ld0Fubm90YXRpb25zQnlQYWdlLmtleXMoKSkgewogICAgICBjb25zdCB7CiAgICAgICAgcGFnZURpY3QKICAgICAgfSA9IGF3YWl0IHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpOwogICAgICBpZiAoIXBhZ2VEaWN0LmhhcygiU3RydWN0UGFyZW50cyIpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgaWQgPSBwYWdlRGljdC5nZXQoIlN0cnVjdFBhcmVudHMiKTsKICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlkKSB8fCAhQXJyYXkuaXNBcnJheShudW1iZXJUcmVlLmdldChpZCkpKSB7CiAgICAgICAgd2FybihgQ2Fubm90IHNhdmUgdGhlIHN0cnVjdCB0cmVlOiBwYWdlICR7cGFnZUluZGV4fSBoYXMgYSB3cm9uZyBpZC5gKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGxldCBoYXNOb3RoaW5nVG9VcGRhdGUgPSB0cnVlOwogICAgZm9yIChjb25zdCBbcGFnZUluZGV4LCBlbGVtZW50c10gb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UpIHsKICAgICAgY29uc3QgewogICAgICAgIHBhZ2VEaWN0CiAgICAgIH0gPSBhd2FpdCBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KTsKICAgICAgU3RydWN0VHJlZVJvb3QuI2NvbGxlY3RQYXJlbnRzKHsKICAgICAgICBlbGVtZW50cywKICAgICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgICAgcGFnZURpY3QsCiAgICAgICAgbnVtYmVyVHJlZQogICAgICB9KTsKICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuYWNjZXNzaWJpbGl0eURhdGE/LnR5cGUpIHsKICAgICAgICAgIGlmICghKGVsZW1lbnQuYWNjZXNzaWJpbGl0eURhdGEuc3RydWN0UGFyZW50ID49IDApKSB7CiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50VHJlZUlkID0gbmV4dEtleSsrOwogICAgICAgICAgfQogICAgICAgICAgaGFzTm90aGluZ1RvVXBkYXRlID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoaGFzTm90aGluZ1RvVXBkYXRlKSB7CiAgICAgIGZvciAoY29uc3QgZWxlbWVudHMgb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UudmFsdWVzKCkpIHsKICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHsKICAgICAgICAgIGRlbGV0ZSBlbGVtZW50LnBhcmVudFRyZWVJZDsKICAgICAgICAgIGRlbGV0ZSBlbGVtZW50LnN0cnVjdFRyZWVQYXJlbnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBhc3luYyB1cGRhdGVTdHJ1Y3R1cmVUcmVlKHsKICAgIG5ld0Fubm90YXRpb25zQnlQYWdlLAogICAgcGRmTWFuYWdlciwKICAgIGNoYW5nZXMKICB9KSB7CiAgICBjb25zdCB7CiAgICAgIHJlZjogc3RydWN0VHJlZVJvb3RSZWYsCiAgICAgIHhyZWYKICAgIH0gPSB0aGlzOwogICAgY29uc3Qgc3RydWN0VHJlZVJvb3QgPSB0aGlzLmRpY3QuY2xvbmUoKTsKICAgIGNvbnN0IGNhY2hlID0gbmV3IFJlZlNldENhY2hlKCk7CiAgICBjYWNoZS5wdXQoc3RydWN0VHJlZVJvb3RSZWYsIHN0cnVjdFRyZWVSb290KTsKICAgIGxldCBwYXJlbnRUcmVlUmVmID0gc3RydWN0VHJlZVJvb3QuZ2V0UmF3KCJQYXJlbnRUcmVlIik7CiAgICBsZXQgcGFyZW50VHJlZTsKICAgIGlmIChwYXJlbnRUcmVlUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHBhcmVudFRyZWUgPSB4cmVmLmZldGNoKHBhcmVudFRyZWVSZWYpOwogICAgfSBlbHNlIHsKICAgICAgcGFyZW50VHJlZSA9IHBhcmVudFRyZWVSZWY7CiAgICAgIHBhcmVudFRyZWVSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICBzdHJ1Y3RUcmVlUm9vdC5zZXQoIlBhcmVudFRyZWUiLCBwYXJlbnRUcmVlUmVmKTsKICAgIH0KICAgIHBhcmVudFRyZWUgPSBwYXJlbnRUcmVlLmNsb25lKCk7CiAgICBjYWNoZS5wdXQocGFyZW50VHJlZVJlZiwgcGFyZW50VHJlZSk7CiAgICBsZXQgbnVtcyA9IHBhcmVudFRyZWUuZ2V0UmF3KCJOdW1zIik7CiAgICBsZXQgbnVtc1JlZiA9IG51bGw7CiAgICBpZiAobnVtcyBpbnN0YW5jZW9mIFJlZikgewogICAgICBudW1zUmVmID0gbnVtczsKICAgICAgbnVtcyA9IHhyZWYuZmV0Y2gobnVtc1JlZik7CiAgICB9CiAgICBudW1zID0gbnVtcy5zbGljZSgpOwogICAgaWYgKCFudW1zUmVmKSB7CiAgICAgIHBhcmVudFRyZWUuc2V0KCJOdW1zIiwgbnVtcyk7CiAgICB9CiAgICBjb25zdCBuZXdOZXh0S2V5ID0gYXdhaXQgU3RydWN0VHJlZVJvb3QuI3dyaXRlS2lkcyh7CiAgICAgIG5ld0Fubm90YXRpb25zQnlQYWdlLAogICAgICBzdHJ1Y3RUcmVlUm9vdFJlZiwKICAgICAgc3RydWN0VHJlZVJvb3Q6IHRoaXMsCiAgICAgIGtpZHM6IG51bGwsCiAgICAgIG51bXMsCiAgICAgIHhyZWYsCiAgICAgIHBkZk1hbmFnZXIsCiAgICAgIGNoYW5nZXMsCiAgICAgIGNhY2hlCiAgICB9KTsKICAgIGlmIChuZXdOZXh0S2V5ID09PSAtMSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBzdHJ1Y3RUcmVlUm9vdC5zZXQoIlBhcmVudFRyZWVOZXh0S2V5IiwgbmV3TmV4dEtleSk7CiAgICBpZiAobnVtc1JlZikgewogICAgICBjYWNoZS5wdXQobnVtc1JlZiwgbnVtcyk7CiAgICB9CiAgICBmb3IgKGNvbnN0IFtyZWYsIG9ial0gb2YgY2FjaGUuaXRlbXMoKSkgewogICAgICBjaGFuZ2VzLnB1dChyZWYsIHsKICAgICAgICBkYXRhOiBvYmoKICAgICAgfSk7CiAgICB9CiAgfQogIHN0YXRpYyBhc3luYyAjd3JpdGVLaWRzKHsKICAgIG5ld0Fubm90YXRpb25zQnlQYWdlLAogICAgc3RydWN0VHJlZVJvb3RSZWYsCiAgICBzdHJ1Y3RUcmVlUm9vdCwKICAgIGtpZHMsCiAgICBudW1zLAogICAgeHJlZiwKICAgIHBkZk1hbmFnZXIsCiAgICBjaGFuZ2VzLAogICAgY2FjaGUKICB9KSB7CiAgICBjb25zdCBvYmpyID0gTmFtZS5nZXQoIk9CSlIiKTsKICAgIGxldCBuZXh0S2V5ID0gLTE7CiAgICBsZXQgc3RydWN0VHJlZVBhZ2VPYmpzOwogICAgZm9yIChjb25zdCBbcGFnZUluZGV4LCBlbGVtZW50c10gb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UpIHsKICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpOwogICAgICBjb25zdCB7CiAgICAgICAgcmVmOiBwYWdlUmVmCiAgICAgIH0gPSBwYWdlOwogICAgICBjb25zdCBpc1BhZ2VSZWYgPSBwYWdlUmVmIGluc3RhbmNlb2YgUmVmOwogICAgICBmb3IgKGNvbnN0IHsKICAgICAgICBhY2Nlc3NpYmlsaXR5RGF0YSwKICAgICAgICByZWYsCiAgICAgICAgcGFyZW50VHJlZUlkLAogICAgICAgIHN0cnVjdFRyZWVQYXJlbnQKICAgICAgfSBvZiBlbGVtZW50cykgewogICAgICAgIGlmICghYWNjZXNzaWJpbGl0eURhdGE/LnR5cGUpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCB7CiAgICAgICAgICBzdHJ1Y3RQYXJlbnQKICAgICAgICB9ID0gYWNjZXNzaWJpbGl0eURhdGE7CiAgICAgICAgaWYgKHN0cnVjdFRyZWVSb290ICYmIE51bWJlci5pc0ludGVnZXIoc3RydWN0UGFyZW50KSAmJiBzdHJ1Y3RQYXJlbnQgPj0gMCkgewogICAgICAgICAgbGV0IG9ianMgPSAoc3RydWN0VHJlZVBhZ2VPYmpzIHx8PSBuZXcgTWFwKCkpLmdldChwYWdlSW5kZXgpOwogICAgICAgICAgaWYgKG9ianMgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjb25zdCBzdHJ1Y3RUcmVlUGFnZSA9IG5ldyBTdHJ1Y3RUcmVlUGFnZShzdHJ1Y3RUcmVlUm9vdCwgcGFnZS5wYWdlRGljdCk7CiAgICAgICAgICAgIG9ianMgPSBzdHJ1Y3RUcmVlUGFnZS5jb2xsZWN0T2JqZWN0cyhwYWdlUmVmKTsKICAgICAgICAgICAgc3RydWN0VHJlZVBhZ2VPYmpzLnNldChwYWdlSW5kZXgsIG9ianMpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3Qgb2JqUmVmID0gb2Jqcz8uZ2V0KHN0cnVjdFBhcmVudCk7CiAgICAgICAgICBpZiAob2JqUmVmKSB7CiAgICAgICAgICAgIGNvbnN0IHRhZ0RpY3QgPSB4cmVmLmZldGNoKG9ialJlZikuY2xvbmUoKTsKICAgICAgICAgICAgU3RydWN0VHJlZVJvb3QuI3dyaXRlUHJvcGVydGllcyh0YWdEaWN0LCBhY2Nlc3NpYmlsaXR5RGF0YSk7CiAgICAgICAgICAgIGNoYW5nZXMucHV0KG9ialJlZiwgewogICAgICAgICAgICAgIGRhdGE6IHRhZ0RpY3QKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuZXh0S2V5ID0gTWF0aC5tYXgobmV4dEtleSwgcGFyZW50VHJlZUlkKTsKICAgICAgICBjb25zdCB0YWdSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgIGNvbnN0IHRhZ0RpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgICAgICBTdHJ1Y3RUcmVlUm9vdC4jd3JpdGVQcm9wZXJ0aWVzKHRhZ0RpY3QsIGFjY2Vzc2liaWxpdHlEYXRhKTsKICAgICAgICBhd2FpdCB0aGlzLiN1cGRhdGVQYXJlbnRUYWcoewogICAgICAgICAgc3RydWN0VHJlZVBhcmVudCwKICAgICAgICAgIHRhZ0RpY3QsCiAgICAgICAgICBuZXdUYWdSZWY6IHRhZ1JlZiwKICAgICAgICAgIHN0cnVjdFRyZWVSb290UmVmLAogICAgICAgICAgZmFsbGJhY2tLaWRzOiBraWRzLAogICAgICAgICAgeHJlZiwKICAgICAgICAgIGNhY2hlCiAgICAgICAgfSk7CiAgICAgICAgY29uc3Qgb2JqRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgICAgIHRhZ0RpY3Quc2V0KCJLIiwgb2JqRGljdCk7CiAgICAgICAgb2JqRGljdC5zZXQoIlR5cGUiLCBvYmpyKTsKICAgICAgICBpZiAoaXNQYWdlUmVmKSB7CiAgICAgICAgICBvYmpEaWN0LnNldCgiUGciLCBwYWdlUmVmKTsKICAgICAgICB9CiAgICAgICAgb2JqRGljdC5zZXQoIk9iaiIsIHJlZik7CiAgICAgICAgY2FjaGUucHV0KHRhZ1JlZiwgdGFnRGljdCk7CiAgICAgICAgbnVtcy5wdXNoKHBhcmVudFRyZWVJZCwgdGFnUmVmKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5leHRLZXkgKyAxOwogIH0KICBzdGF0aWMgI3dyaXRlUHJvcGVydGllcyh0YWdEaWN0LCB7CiAgICB0eXBlLAogICAgdGl0bGUsCiAgICBsYW5nLAogICAgYWx0LAogICAgZXhwYW5kZWQsCiAgICBhY3R1YWxUZXh0CiAgfSkgewogICAgdGFnRGljdC5zZXQoIlMiLCBOYW1lLmdldCh0eXBlKSk7CiAgICBpZiAodGl0bGUpIHsKICAgICAgdGFnRGljdC5zZXQoIlQiLCBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKHRpdGxlKSk7CiAgICB9CiAgICBpZiAobGFuZykgewogICAgICB0YWdEaWN0LnNldCgiTGFuZyIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUobGFuZykpOwogICAgfQogICAgaWYgKGFsdCkgewogICAgICB0YWdEaWN0LnNldCgiQWx0Iiwgc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRShhbHQpKTsKICAgIH0KICAgIGlmIChleHBhbmRlZCkgewogICAgICB0YWdEaWN0LnNldCgiRSIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUoZXhwYW5kZWQpKTsKICAgIH0KICAgIGlmIChhY3R1YWxUZXh0KSB7CiAgICAgIHRhZ0RpY3Quc2V0KCJBY3R1YWxUZXh0Iiwgc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRShhY3R1YWxUZXh0KSk7CiAgICB9CiAgfQogIHN0YXRpYyAjY29sbGVjdFBhcmVudHMoewogICAgZWxlbWVudHMsCiAgICB4cmVmLAogICAgcGFnZURpY3QsCiAgICBudW1iZXJUcmVlCiAgfSkgewogICAgY29uc3QgaWRUb0VsZW1lbnRzID0gbmV3IE1hcCgpOwogICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7CiAgICAgIGlmIChlbGVtZW50LnN0cnVjdFRyZWVQYXJlbnRJZCkgewogICAgICAgIGNvbnN0IGlkID0gcGFyc2VJbnQoZWxlbWVudC5zdHJ1Y3RUcmVlUGFyZW50SWQuc3BsaXQoIl9tYyIpWzFdLCAxMCk7CiAgICAgICAgbGV0IGVsZW1zID0gaWRUb0VsZW1lbnRzLmdldChpZCk7CiAgICAgICAgaWYgKCFlbGVtcykgewogICAgICAgICAgZWxlbXMgPSBbXTsKICAgICAgICAgIGlkVG9FbGVtZW50cy5zZXQoaWQsIGVsZW1zKTsKICAgICAgICB9CiAgICAgICAgZWxlbXMucHVzaChlbGVtZW50KTsKICAgICAgfQogICAgfQogICAgY29uc3QgaWQgPSBwYWdlRGljdC5nZXQoIlN0cnVjdFBhcmVudHMiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpZCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGFyZW50QXJyYXkgPSBudW1iZXJUcmVlLmdldChpZCk7CiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gKGtpZCwgcGFnZUtpZCwga2lkUmVmKSA9PiB7CiAgICAgIGNvbnN0IGVsZW1zID0gaWRUb0VsZW1lbnRzLmdldChraWQpOwogICAgICBpZiAoZWxlbXMpIHsKICAgICAgICBjb25zdCBwYXJlbnRSZWYgPSBwYWdlS2lkLmdldFJhdygiUCIpOwogICAgICAgIGNvbnN0IHBhcmVudERpY3QgPSB4cmVmLmZldGNoSWZSZWYocGFyZW50UmVmKTsKICAgICAgICBpZiAocGFyZW50UmVmIGluc3RhbmNlb2YgUmVmICYmIHBhcmVudERpY3QgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7CiAgICAgICAgICAgIHJlZjoga2lkUmVmLAogICAgICAgICAgICBkaWN0OiBwYWdlS2lkCiAgICAgICAgICB9OwogICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1zKSB7CiAgICAgICAgICAgIGVsZW1lbnQuc3RydWN0VHJlZVBhcmVudCA9IHBhcmFtczsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKICAgIGZvciAoY29uc3Qga2lkUmVmIG9mIHBhcmVudEFycmF5KSB7CiAgICAgIGlmICghKGtpZFJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBwYWdlS2lkID0geHJlZi5mZXRjaChraWRSZWYpOwogICAgICBjb25zdCBrID0gcGFnZUtpZC5nZXQoIksiKTsKICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaykpIHsKICAgICAgICB1cGRhdGVFbGVtZW50KGssIHBhZ2VLaWQsIGtpZFJlZik7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGspKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZm9yIChsZXQga2lkIG9mIGspIHsKICAgICAgICBraWQgPSB4cmVmLmZldGNoSWZSZWYoa2lkKTsKICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihraWQpICYmIHVwZGF0ZUVsZW1lbnQoa2lkLCBwYWdlS2lkLCBraWRSZWYpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCEoa2lkIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzTmFtZShraWQuZ2V0KCJUeXBlIiksICJNQ1IiKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1jaWQgPSBraWQuZ2V0KCJNQ0lEIik7CiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIobWNpZCkgJiYgdXBkYXRlRWxlbWVudChtY2lkLCBwYWdlS2lkLCBraWRSZWYpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgc3RhdGljIGFzeW5jICN1cGRhdGVQYXJlbnRUYWcoewogICAgc3RydWN0VHJlZVBhcmVudCwKICAgIHRhZ0RpY3QsCiAgICBuZXdUYWdSZWYsCiAgICBzdHJ1Y3RUcmVlUm9vdFJlZiwKICAgIGZhbGxiYWNrS2lkcywKICAgIHhyZWYsCiAgICBjYWNoZQogIH0pIHsKICAgIGxldCByZWYgPSBudWxsOwogICAgbGV0IHBhcmVudFJlZjsKICAgIGlmIChzdHJ1Y3RUcmVlUGFyZW50KSB7CiAgICAgICh7CiAgICAgICAgcmVmCiAgICAgIH0gPSBzdHJ1Y3RUcmVlUGFyZW50KTsKICAgICAgcGFyZW50UmVmID0gc3RydWN0VHJlZVBhcmVudC5kaWN0LmdldFJhdygiUCIpIHx8IHN0cnVjdFRyZWVSb290UmVmOwogICAgfSBlbHNlIHsKICAgICAgcGFyZW50UmVmID0gc3RydWN0VHJlZVJvb3RSZWY7CiAgICB9CiAgICB0YWdEaWN0LnNldCgiUCIsIHBhcmVudFJlZik7CiAgICBjb25zdCBwYXJlbnREaWN0ID0geHJlZi5mZXRjaElmUmVmKHBhcmVudFJlZik7CiAgICBpZiAoIXBhcmVudERpY3QpIHsKICAgICAgZmFsbGJhY2tLaWRzLnB1c2gobmV3VGFnUmVmKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IGNhY2hlZFBhcmVudERpY3QgPSBjYWNoZS5nZXQocGFyZW50UmVmKTsKICAgIGlmICghY2FjaGVkUGFyZW50RGljdCkgewogICAgICBjYWNoZWRQYXJlbnREaWN0ID0gcGFyZW50RGljdC5jbG9uZSgpOwogICAgICBjYWNoZS5wdXQocGFyZW50UmVmLCBjYWNoZWRQYXJlbnREaWN0KTsKICAgIH0KICAgIGNvbnN0IHBhcmVudEtpZHNSYXcgPSBjYWNoZWRQYXJlbnREaWN0LmdldFJhdygiSyIpOwogICAgbGV0IGNhY2hlZFBhcmVudEtpZHMgPSBwYXJlbnRLaWRzUmF3IGluc3RhbmNlb2YgUmVmID8gY2FjaGUuZ2V0KHBhcmVudEtpZHNSYXcpIDogbnVsbDsKICAgIGlmICghY2FjaGVkUGFyZW50S2lkcykgewogICAgICBjYWNoZWRQYXJlbnRLaWRzID0geHJlZi5mZXRjaElmUmVmKHBhcmVudEtpZHNSYXcpOwogICAgICBjYWNoZWRQYXJlbnRLaWRzID0gQXJyYXkuaXNBcnJheShjYWNoZWRQYXJlbnRLaWRzKSA/IGNhY2hlZFBhcmVudEtpZHMuc2xpY2UoKSA6IFtwYXJlbnRLaWRzUmF3XTsKICAgICAgY29uc3QgcGFyZW50S2lkc1JlZiA9IHhyZWYuZ2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICAgIGNhY2hlZFBhcmVudERpY3Quc2V0KCJLIiwgcGFyZW50S2lkc1JlZik7CiAgICAgIGNhY2hlLnB1dChwYXJlbnRLaWRzUmVmLCBjYWNoZWRQYXJlbnRLaWRzKTsKICAgIH0KICAgIGNvbnN0IGluZGV4ID0gY2FjaGVkUGFyZW50S2lkcy5pbmRleE9mKHJlZik7CiAgICBjYWNoZWRQYXJlbnRLaWRzLnNwbGljZShpbmRleCA+PSAwID8gaW5kZXggKyAxIDogY2FjaGVkUGFyZW50S2lkcy5sZW5ndGgsIDAsIG5ld1RhZ1JlZik7CiAgfQp9CmNsYXNzIFN0cnVjdEVsZW1lbnROb2RlIHsKICBjb25zdHJ1Y3Rvcih0cmVlLCBkaWN0KSB7CiAgICB0aGlzLnRyZWUgPSB0cmVlOwogICAgdGhpcy54cmVmID0gdHJlZS54cmVmOwogICAgdGhpcy5kaWN0ID0gZGljdDsKICAgIHRoaXMua2lkcyA9IFtdOwogICAgdGhpcy5wYXJzZUtpZHMoKTsKICB9CiAgZ2V0IHJvbGUoKSB7CiAgICBjb25zdCBuYW1lT2JqID0gdGhpcy5kaWN0LmdldCgiUyIpOwogICAgY29uc3QgbmFtZSA9IG5hbWVPYmogaW5zdGFuY2VvZiBOYW1lID8gbmFtZU9iai5uYW1lIDogIiI7CiAgICBjb25zdCB7CiAgICAgIHJvb3QKICAgIH0gPSB0aGlzLnRyZWU7CiAgICByZXR1cm4gcm9vdC5yb2xlTWFwLmdldChuYW1lKSA/PyBuYW1lOwogIH0KICBwYXJzZUtpZHMoKSB7CiAgICBsZXQgcGFnZU9iaklkID0gbnVsbDsKICAgIGNvbnN0IG9ialJlZiA9IHRoaXMuZGljdC5nZXRSYXcoIlBnIik7CiAgICBpZiAob2JqUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHBhZ2VPYmpJZCA9IG9ialJlZi50b1N0cmluZygpOwogICAgfQogICAgY29uc3Qga2lkcyA9IHRoaXMuZGljdC5nZXQoIksiKTsKICAgIGlmIChBcnJheS5pc0FycmF5KGtpZHMpKSB7CiAgICAgIGZvciAoY29uc3Qga2lkIG9mIGtpZHMpIHsKICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wYXJzZUtpZChwYWdlT2JqSWQsIHRoaXMueHJlZi5mZXRjaElmUmVmKGtpZCkpOwogICAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgICB0aGlzLmtpZHMucHVzaChlbGVtZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnBhcnNlS2lkKHBhZ2VPYmpJZCwga2lkcyk7CiAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgdGhpcy5raWRzLnB1c2goZWxlbWVudCk7CiAgICAgIH0KICAgIH0KICB9CiAgcGFyc2VLaWQocGFnZU9iaklkLCBraWQpIHsKICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGtpZCkpIHsKICAgICAgaWYgKHRoaXMudHJlZS5wYWdlRGljdC5vYmpJZCAhPT0gcGFnZU9iaklkKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3RFbGVtZW50KHsKICAgICAgICB0eXBlOiBTdHJ1Y3RFbGVtZW50VHlwZS5QQUdFX0NPTlRFTlQsCiAgICAgICAgbWNpZDoga2lkLAogICAgICAgIHBhZ2VPYmpJZAogICAgICB9KTsKICAgIH0KICAgIGlmICghKGtpZCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgcGFnZVJlZiA9IGtpZC5nZXRSYXcoIlBnIik7CiAgICBpZiAocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikgewogICAgICBwYWdlT2JqSWQgPSBwYWdlUmVmLnRvU3RyaW5nKCk7CiAgICB9CiAgICBjb25zdCB0eXBlID0ga2lkLmdldCgiVHlwZSIpIGluc3RhbmNlb2YgTmFtZSA/IGtpZC5nZXQoIlR5cGUiKS5uYW1lIDogbnVsbDsKICAgIGlmICh0eXBlID09PSAiTUNSIikgewogICAgICBpZiAodGhpcy50cmVlLnBhZ2VEaWN0Lm9iaklkICE9PSBwYWdlT2JqSWQpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBraWRSZWYgPSBraWQuZ2V0UmF3KCJTdG0iKTsKICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3RFbGVtZW50KHsKICAgICAgICB0eXBlOiBTdHJ1Y3RFbGVtZW50VHlwZS5TVFJFQU1fQ09OVEVOVCwKICAgICAgICByZWZPYmpJZDoga2lkUmVmIGluc3RhbmNlb2YgUmVmID8ga2lkUmVmLnRvU3RyaW5nKCkgOiBudWxsLAogICAgICAgIHBhZ2VPYmpJZCwKICAgICAgICBtY2lkOiBraWQuZ2V0KCJNQ0lEIikKICAgICAgfSk7CiAgICB9CiAgICBpZiAodHlwZSA9PT0gIk9CSlIiKSB7CiAgICAgIGlmICh0aGlzLnRyZWUucGFnZURpY3Qub2JqSWQgIT09IHBhZ2VPYmpJZCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IGtpZFJlZiA9IGtpZC5nZXRSYXcoIk9iaiIpOwogICAgICByZXR1cm4gbmV3IFN0cnVjdEVsZW1lbnQoewogICAgICAgIHR5cGU6IFN0cnVjdEVsZW1lbnRUeXBlLk9CSkVDVCwKICAgICAgICByZWZPYmpJZDoga2lkUmVmIGluc3RhbmNlb2YgUmVmID8ga2lkUmVmLnRvU3RyaW5nKCkgOiBudWxsLAogICAgICAgIHBhZ2VPYmpJZAogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBuZXcgU3RydWN0RWxlbWVudCh7CiAgICAgIHR5cGU6IFN0cnVjdEVsZW1lbnRUeXBlLkVMRU1FTlQsCiAgICAgIGRpY3Q6IGtpZAogICAgfSk7CiAgfQp9CmNsYXNzIFN0cnVjdEVsZW1lbnQgewogIGNvbnN0cnVjdG9yKHsKICAgIHR5cGUsCiAgICBkaWN0ID0gbnVsbCwKICAgIG1jaWQgPSBudWxsLAogICAgcGFnZU9iaklkID0gbnVsbCwKICAgIHJlZk9iaklkID0gbnVsbAogIH0pIHsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB0aGlzLmRpY3QgPSBkaWN0OwogICAgdGhpcy5tY2lkID0gbWNpZDsKICAgIHRoaXMucGFnZU9iaklkID0gcGFnZU9iaklkOwogICAgdGhpcy5yZWZPYmpJZCA9IHJlZk9iaklkOwogICAgdGhpcy5wYXJlbnROb2RlID0gbnVsbDsKICB9Cn0KY2xhc3MgU3RydWN0VHJlZVBhZ2UgewogIGNvbnN0cnVjdG9yKHN0cnVjdFRyZWVSb290LCBwYWdlRGljdCkgewogICAgdGhpcy5yb290ID0gc3RydWN0VHJlZVJvb3Q7CiAgICB0aGlzLnhyZWYgPSBzdHJ1Y3RUcmVlUm9vdD8ueHJlZiA/PyBudWxsOwogICAgdGhpcy5yb290RGljdCA9IHN0cnVjdFRyZWVSb290Py5kaWN0ID8/IG51bGw7CiAgICB0aGlzLnBhZ2VEaWN0ID0gcGFnZURpY3Q7CiAgICB0aGlzLm5vZGVzID0gW107CiAgfQogIGNvbGxlY3RPYmplY3RzKHBhZ2VSZWYpIHsKICAgIGlmICghdGhpcy5yb290IHx8ICF0aGlzLnJvb3REaWN0IHx8ICEocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwYXJlbnRUcmVlID0gdGhpcy5yb290RGljdC5nZXQoIlBhcmVudFRyZWUiKTsKICAgIGlmICghcGFyZW50VHJlZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGlkcyA9IHRoaXMucm9vdC5zdHJ1Y3RQYXJlbnRJZHM/LmdldChwYWdlUmVmKTsKICAgIGlmICghaWRzKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgbWFwID0gbmV3IE1hcCgpOwogICAgY29uc3QgbnVtYmVyVHJlZSA9IG5ldyBOdW1iZXJUcmVlKHBhcmVudFRyZWUsIHRoaXMueHJlZik7CiAgICBmb3IgKGNvbnN0IFtlbGVtSWRdIG9mIGlkcykgewogICAgICBjb25zdCBvYmogPSBudW1iZXJUcmVlLmdldFJhdyhlbGVtSWQpOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgbWFwLnNldChlbGVtSWQsIG9iaik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQogIHBhcnNlKHBhZ2VSZWYpIHsKICAgIGlmICghdGhpcy5yb290IHx8ICF0aGlzLnJvb3REaWN0IHx8ICEocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGFyZW50VHJlZSA9IHRoaXMucm9vdERpY3QuZ2V0KCJQYXJlbnRUcmVlIik7CiAgICBpZiAoIXBhcmVudFRyZWUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgaWQgPSB0aGlzLnBhZ2VEaWN0LmdldCgiU3RydWN0UGFyZW50cyIpOwogICAgY29uc3QgaWRzID0gdGhpcy5yb290LnN0cnVjdFBhcmVudElkcz8uZ2V0KHBhZ2VSZWYpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlkKSAmJiAhaWRzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTsKICAgIGNvbnN0IG51bWJlclRyZWUgPSBuZXcgTnVtYmVyVHJlZShwYXJlbnRUcmVlLCB0aGlzLnhyZWYpOwogICAgaWYgKE51bWJlci5pc0ludGVnZXIoaWQpKSB7CiAgICAgIGNvbnN0IHBhcmVudEFycmF5ID0gbnVtYmVyVHJlZS5nZXQoaWQpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJlbnRBcnJheSkpIHsKICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiBwYXJlbnRBcnJheSkgewogICAgICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICB0aGlzLmFkZE5vZGUodGhpcy54cmVmLmZldGNoKHJlZiksIG1hcCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIWlkcykgewogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IFtlbGVtSWQsIHR5cGVdIG9mIGlkcykgewogICAgICBjb25zdCBvYmogPSBudW1iZXJUcmVlLmdldChlbGVtSWQpOwogICAgICBpZiAob2JqKSB7CiAgICAgICAgY29uc3QgZWxlbSA9IHRoaXMuYWRkTm9kZSh0aGlzLnhyZWYuZmV0Y2hJZlJlZihvYmopLCBtYXApOwogICAgICAgIGlmIChlbGVtPy5raWRzPy5sZW5ndGggPT09IDEgJiYgZWxlbS5raWRzWzBdLnR5cGUgPT09IFN0cnVjdEVsZW1lbnRUeXBlLk9CSkVDVCkgewogICAgICAgICAgZWxlbS5raWRzWzBdLnR5cGUgPSB0eXBlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBhZGROb2RlKGRpY3QsIG1hcCwgbGV2ZWwgPSAwKSB7CiAgICBpZiAobGV2ZWwgPiBNQVhfREVQVEgpIHsKICAgICAgd2FybigiU3RydWN0VHJlZSBNQVhfREVQVEggcmVhY2hlZC4iKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAobWFwLmhhcyhkaWN0KSkgewogICAgICByZXR1cm4gbWFwLmdldChkaWN0KTsKICAgIH0KICAgIGNvbnN0IGVsZW1lbnQgPSBuZXcgU3RydWN0RWxlbWVudE5vZGUodGhpcywgZGljdCk7CiAgICBtYXAuc2V0KGRpY3QsIGVsZW1lbnQpOwogICAgY29uc3QgcGFyZW50ID0gZGljdC5nZXQoIlAiKTsKICAgIGlmICghcGFyZW50IHx8IGlzTmFtZShwYXJlbnQuZ2V0KCJUeXBlIiksICJTdHJ1Y3RUcmVlUm9vdCIpKSB7CiAgICAgIGlmICghdGhpcy5hZGRUb3BMZXZlbE5vZGUoZGljdCwgZWxlbWVudCkpIHsKICAgICAgICBtYXAuZGVsZXRlKGRpY3QpOwogICAgICB9CiAgICAgIHJldHVybiBlbGVtZW50OwogICAgfQogICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXJlbnQsIG1hcCwgbGV2ZWwgKyAxKTsKICAgIGlmICghcGFyZW50Tm9kZSkgewogICAgICByZXR1cm4gZWxlbWVudDsKICAgIH0KICAgIGxldCBzYXZlID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IGtpZCBvZiBwYXJlbnROb2RlLmtpZHMpIHsKICAgICAgaWYgKGtpZC50eXBlID09PSBTdHJ1Y3RFbGVtZW50VHlwZS5FTEVNRU5UICYmIGtpZC5kaWN0ID09PSBkaWN0KSB7CiAgICAgICAga2lkLnBhcmVudE5vZGUgPSBlbGVtZW50OwogICAgICAgIHNhdmUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoIXNhdmUpIHsKICAgICAgbWFwLmRlbGV0ZShkaWN0KTsKICAgIH0KICAgIHJldHVybiBlbGVtZW50OwogIH0KICBhZGRUb3BMZXZlbE5vZGUoZGljdCwgZWxlbWVudCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5yb290RGljdC5nZXQoIksiKTsKICAgIGlmICghb2JqKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGlmIChvYmoub2JqSWQgIT09IGRpY3Qub2JqSWQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdGhpcy5ub2Rlc1swXSA9IGVsZW1lbnQ7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKCFBcnJheS5pc0FycmF5KG9iaikpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBsZXQgc2F2ZSA9IGZhbHNlOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3Qga2lkUmVmID0gb2JqW2ldOwogICAgICBpZiAoa2lkUmVmPy50b1N0cmluZygpID09PSBkaWN0Lm9iaklkKSB7CiAgICAgICAgdGhpcy5ub2Rlc1tpXSA9IGVsZW1lbnQ7CiAgICAgICAgc2F2ZSA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzYXZlOwogIH0KICBnZXQgc2VyaWFsaXphYmxlKCkgewogICAgZnVuY3Rpb24gbm9kZVRvU2VyaWFsaXphYmxlKG5vZGUsIHBhcmVudCwgbGV2ZWwgPSAwKSB7CiAgICAgIGlmIChsZXZlbCA+IE1BWF9ERVBUSCkgewogICAgICAgIHdhcm4oIlN0cnVjdFRyZWUgdG9vIGRlZXAgdG8gYmUgZnVsbHkgc2VyaWFsaXplZC4iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgb2JqLnJvbGUgPSBub2RlLnJvbGU7CiAgICAgIG9iai5jaGlsZHJlbiA9IFtdOwogICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChvYmopOwogICAgICBsZXQgYWx0ID0gbm9kZS5kaWN0LmdldCgiQWx0Iik7CiAgICAgIGlmICh0eXBlb2YgYWx0ICE9PSAic3RyaW5nIikgewogICAgICAgIGFsdCA9IG5vZGUuZGljdC5nZXQoIkFjdHVhbFRleHQiKTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIGFsdCA9PT0gInN0cmluZyIpIHsKICAgICAgICBvYmouYWx0ID0gc3RyaW5nVG9QREZTdHJpbmcoYWx0KTsKICAgICAgfQogICAgICBjb25zdCBhID0gbm9kZS5kaWN0LmdldCgiQSIpOwogICAgICBpZiAoYSBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBjb25zdCBiYm94ID0gbG9va3VwTm9ybWFsUmVjdChhLmdldEFycmF5KCJCQm94IiksIG51bGwpOwogICAgICAgIGlmIChiYm94KSB7CiAgICAgICAgICBvYmouYmJveCA9IGJib3g7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHdpZHRoID0gYS5nZXQoIldpZHRoIik7CiAgICAgICAgICBjb25zdCBoZWlnaHQgPSBhLmdldCgiSGVpZ2h0Iik7CiAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIiAmJiB3aWR0aCA+IDAgJiYgdHlwZW9mIGhlaWdodCA9PT0gIm51bWJlciIgJiYgaGVpZ2h0ID4gMCkgewogICAgICAgICAgICBvYmouYmJveCA9IFswLCAwLCB3aWR0aCwgaGVpZ2h0XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgbGFuZyA9IG5vZGUuZGljdC5nZXQoIkxhbmciKTsKICAgICAgaWYgKHR5cGVvZiBsYW5nID09PSAic3RyaW5nIikgewogICAgICAgIG9iai5sYW5nID0gc3RyaW5nVG9QREZTdHJpbmcobGFuZyk7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBraWQgb2Ygbm9kZS5raWRzKSB7CiAgICAgICAgY29uc3Qga2lkRWxlbWVudCA9IGtpZC50eXBlID09PSBTdHJ1Y3RFbGVtZW50VHlwZS5FTEVNRU5UID8ga2lkLnBhcmVudE5vZGUgOiBudWxsOwogICAgICAgIGlmIChraWRFbGVtZW50KSB7CiAgICAgICAgICBub2RlVG9TZXJpYWxpemFibGUoa2lkRWxlbWVudCwgb2JqLCBsZXZlbCArIDEpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBlbHNlIGlmIChraWQudHlwZSA9PT0gU3RydWN0RWxlbWVudFR5cGUuUEFHRV9DT05URU5UIHx8IGtpZC50eXBlID09PSBTdHJ1Y3RFbGVtZW50VHlwZS5TVFJFQU1fQ09OVEVOVCkgewogICAgICAgICAgb2JqLmNoaWxkcmVuLnB1c2goewogICAgICAgICAgICB0eXBlOiAiY29udGVudCIsCiAgICAgICAgICAgIGlkOiBgcCR7a2lkLnBhZ2VPYmpJZH1fbWMke2tpZC5tY2lkfWAKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAoa2lkLnR5cGUgPT09IFN0cnVjdEVsZW1lbnRUeXBlLk9CSkVDVCkgewogICAgICAgICAgb2JqLmNoaWxkcmVuLnB1c2goewogICAgICAgICAgICB0eXBlOiAib2JqZWN0IiwKICAgICAgICAgICAgaWQ6IGtpZC5yZWZPYmpJZAogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmIChraWQudHlwZSA9PT0gU3RydWN0RWxlbWVudFR5cGUuQU5OT1RBVElPTikgewogICAgICAgICAgb2JqLmNoaWxkcmVuLnB1c2goewogICAgICAgICAgICB0eXBlOiAiYW5ub3RhdGlvbiIsCiAgICAgICAgICAgIGlkOiBgJHtBbm5vdGF0aW9uUHJlZml4fSR7a2lkLnJlZk9iaklkfWAKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3Qgcm9vdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICByb290LmNoaWxkcmVuID0gW107CiAgICByb290LnJvbGUgPSAiUm9vdCI7CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMubm9kZXMpIHsKICAgICAgaWYgKCFjaGlsZCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIG5vZGVUb1NlcmlhbGl6YWJsZShjaGlsZCwgcm9vdCk7CiAgICB9CiAgICByZXR1cm4gcm9vdDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NhdGFsb2cuanMKCgoKCgoKCgoKCgpjb25zdCBpc1JlZiA9IHYgPT4gdiBpbnN0YW5jZW9mIFJlZjsKY29uc3QgaXNWYWxpZEV4cGxpY2l0RGVzdCA9IF9pc1ZhbGlkRXhwbGljaXREZXN0LmJpbmQobnVsbCwgaXNSZWYsIGlzTmFtZSk7CmZ1bmN0aW9uIGZldGNoRGVzdChkZXN0KSB7CiAgaWYgKGRlc3QgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBkZXN0ID0gZGVzdC5nZXQoIkQiKTsKICB9CiAgcmV0dXJuIGlzVmFsaWRFeHBsaWNpdERlc3QoZGVzdCkgPyBkZXN0IDogbnVsbDsKfQpmdW5jdGlvbiBmZXRjaFJlbW90ZURlc3QoYWN0aW9uKSB7CiAgbGV0IGRlc3QgPSBhY3Rpb24uZ2V0KCJEIik7CiAgaWYgKGRlc3QpIHsKICAgIGlmIChkZXN0IGluc3RhbmNlb2YgTmFtZSkgewogICAgICBkZXN0ID0gZGVzdC5uYW1lOwogICAgfQogICAgaWYgKHR5cGVvZiBkZXN0ID09PSAic3RyaW5nIikgewogICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZGVzdCk7CiAgICB9IGVsc2UgaWYgKGlzVmFsaWRFeHBsaWNpdERlc3QoZGVzdCkpIHsKICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRlc3QpOwogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfQpjbGFzcyBDYXRhbG9nIHsKICBjb25zdHJ1Y3RvcihwZGZNYW5hZ2VyLCB4cmVmKSB7CiAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuX2NhdERpY3QgPSB4cmVmLmdldENhdGFsb2dPYmooKTsKICAgIGlmICghKHRoaXMuX2NhdERpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkNhdGFsb2cgb2JqZWN0IGlzIG5vdCBhIGRpY3Rpb25hcnkuIik7CiAgICB9CiAgICB0aGlzLnRvcGxldmVsUGFnZXNEaWN0OwogICAgdGhpcy5fYWN0dWFsTnVtUGFnZXMgPSBudWxsOwogICAgdGhpcy5mb250Q2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IG5ldyBNYXAoKTsKICAgIHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlID0gbmV3IE1hcCgpOwogICAgdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUgPSBuZXcgR2xvYmFsQ29sb3JTcGFjZUNhY2hlKCk7CiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUgPSBuZXcgR2xvYmFsSW1hZ2VDYWNoZSgpOwogICAgdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIHRoaXMucGFnZUluZGV4Q2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIHRoaXMucGFnZURpY3RDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgdGhpcy5ub25CbGVuZE1vZGVzU2V0ID0gbmV3IFJlZlNldCgpOwogICAgdGhpcy5zeXN0ZW1Gb250Q2FjaGUgPSBuZXcgTWFwKCk7CiAgfQogIGNsb25lRGljdCgpIHsKICAgIHJldHVybiB0aGlzLl9jYXREaWN0LmNsb25lKCk7CiAgfQogIGdldCB2ZXJzaW9uKCkgewogICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJWZXJzaW9uIik7CiAgICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgaWYgKFBERl9WRVJTSU9OX1JFR0VYUC50ZXN0KHZlcnNpb24ubmFtZSkpIHsKICAgICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2ZXJzaW9uIiwgdmVyc2lvbi5uYW1lKTsKICAgICAgfQogICAgICB3YXJuKGBJbnZhbGlkIFBERiBjYXRhbG9nIHZlcnNpb246ICR7dmVyc2lvbi5uYW1lfWApOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmVyc2lvbiIsIG51bGwpOwogIH0KICBnZXQgbGFuZygpIHsKICAgIGNvbnN0IGxhbmcgPSB0aGlzLl9jYXREaWN0LmdldCgiTGFuZyIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibGFuZyIsIGxhbmcgJiYgdHlwZW9mIGxhbmcgPT09ICJzdHJpbmciID8gc3RyaW5nVG9QREZTdHJpbmcobGFuZykgOiBudWxsKTsKICB9CiAgZ2V0IG5lZWRzUmVuZGVyaW5nKCkgewogICAgY29uc3QgbmVlZHNSZW5kZXJpbmcgPSB0aGlzLl9jYXREaWN0LmdldCgiTmVlZHNSZW5kZXJpbmciKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgIm5lZWRzUmVuZGVyaW5nIiwgdHlwZW9mIG5lZWRzUmVuZGVyaW5nID09PSAiYm9vbGVhbiIgPyBuZWVkc1JlbmRlcmluZyA6IGZhbHNlKTsKICB9CiAgZ2V0IGNvbGxlY3Rpb24oKSB7CiAgICBsZXQgY29sbGVjdGlvbiA9IG51bGw7CiAgICB0cnkgewogICAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiQ29sbGVjdGlvbiIpOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCAmJiBvYmouc2l6ZSA+IDApIHsKICAgICAgICBjb2xsZWN0aW9uID0gb2JqOwogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIGluZm8oIkNhbm5vdCBmZXRjaCBDb2xsZWN0aW9uIGVudHJ5OyBhc3N1bWluZyBubyBjb2xsZWN0aW9uIGlzIHByZXNlbnQuIik7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjb2xsZWN0aW9uIiwgY29sbGVjdGlvbik7CiAgfQogIGdldCBhY3JvRm9ybSgpIHsKICAgIGxldCBhY3JvRm9ybSA9IG51bGw7CiAgICB0cnkgewogICAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiQWNyb0Zvcm0iKTsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERpY3QgJiYgb2JqLnNpemUgPiAwKSB7CiAgICAgICAgYWNyb0Zvcm0gPSBvYmo7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgaW5mbygiQ2Fubm90IGZldGNoIEFjcm9Gb3JtIGVudHJ5OyBhc3N1bWluZyBubyBmb3JtcyBhcmUgcHJlc2VudC4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImFjcm9Gb3JtIiwgYWNyb0Zvcm0pOwogIH0KICBnZXQgYWNyb0Zvcm1SZWYoKSB7CiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJBY3JvRm9ybSIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYWNyb0Zvcm1SZWYiLCB2YWx1ZSBpbnN0YW5jZW9mIFJlZiA/IHZhbHVlIDogbnVsbCk7CiAgfQogIGdldCBtZXRhZGF0YSgpIHsKICAgIGNvbnN0IHN0cmVhbVJlZiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJNZXRhZGF0YSIpOwogICAgaWYgKCEoc3RyZWFtUmVmIGluc3RhbmNlb2YgUmVmKSkgewogICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJtZXRhZGF0YSIsIG51bGwpOwogICAgfQogICAgbGV0IG1ldGFkYXRhID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMueHJlZi5mZXRjaChzdHJlYW1SZWYsICF0aGlzLnhyZWYuZW5jcnlwdD8uZW5jcnlwdE1ldGFkYXRhKTsKICAgICAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0gJiYgc3RyZWFtLmRpY3QgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgY29uc3QgdHlwZSA9IHN0cmVhbS5kaWN0LmdldCgiVHlwZSIpOwogICAgICAgIGNvbnN0IHN1YnR5cGUgPSBzdHJlYW0uZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgICBpZiAoaXNOYW1lKHR5cGUsICJNZXRhZGF0YSIpICYmIGlzTmFtZShzdWJ0eXBlLCAiWE1MIikpIHsKICAgICAgICAgIGNvbnN0IGRhdGEgPSBzdHJpbmdUb1VURjhTdHJpbmcoc3RyZWFtLmdldFN0cmluZygpKTsKICAgICAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgICAgIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhUGFyc2VyKGRhdGEpLnNlcmlhbGl6YWJsZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgaW5mbyhgU2tpcHBpbmcgaW52YWxpZCBNZXRhZGF0YTogIiR7ZXh9Ii5gKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgIm1ldGFkYXRhIiwgbWV0YWRhdGEpOwogIH0KICBnZXQgbWFya0luZm8oKSB7CiAgICBsZXQgbWFya0luZm8gPSBudWxsOwogICAgdHJ5IHsKICAgICAgbWFya0luZm8gPSB0aGlzLl9yZWFkTWFya0luZm8oKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybigiVW5hYmxlIHRvIHJlYWQgbWFyayBpbmZvLiIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibWFya0luZm8iLCBtYXJrSW5mbyk7CiAgfQogIF9yZWFkTWFya0luZm8oKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiTWFya0luZm8iKTsKICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgbWFya0luZm8gPSB7CiAgICAgIE1hcmtlZDogZmFsc2UsCiAgICAgIFVzZXJQcm9wZXJ0aWVzOiBmYWxzZSwKICAgICAgU3VzcGVjdHM6IGZhbHNlCiAgICB9OwogICAgZm9yIChjb25zdCBrZXkgaW4gbWFya0luZm8pIHsKICAgICAgY29uc3QgdmFsdWUgPSBvYmouZ2V0KGtleSk7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJib29sZWFuIikgewogICAgICAgIG1hcmtJbmZvW2tleV0gPSB2YWx1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hcmtJbmZvOwogIH0KICBnZXQgc3RydWN0VHJlZVJvb3QoKSB7CiAgICBsZXQgc3RydWN0VHJlZSA9IG51bGw7CiAgICB0cnkgewogICAgICBzdHJ1Y3RUcmVlID0gdGhpcy4jcmVhZFN0cnVjdFRyZWVSb290KCk7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIHdhcm4oIlVuYWJsZSByZWFkIHRvIHN0cnVjdFRyZWVSb290IGluZm8uIik7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJzdHJ1Y3RUcmVlUm9vdCIsIHN0cnVjdFRyZWUpOwogIH0KICAjcmVhZFN0cnVjdFRyZWVSb290KCkgewogICAgY29uc3QgcmF3T2JqID0gdGhpcy5fY2F0RGljdC5nZXRSYXcoIlN0cnVjdFRyZWVSb290Iik7CiAgICBjb25zdCBvYmogPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihyYXdPYmopOwogICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCByb290ID0gbmV3IFN0cnVjdFRyZWVSb290KHRoaXMueHJlZiwgb2JqLCByYXdPYmopOwogICAgcm9vdC5pbml0KCk7CiAgICByZXR1cm4gcm9vdDsKICB9CiAgZ2V0IHRvcGxldmVsUGFnZXNEaWN0KCkgewogICAgY29uc3QgcGFnZXNPYmogPSB0aGlzLl9jYXREaWN0LmdldCgiUGFnZXMiKTsKICAgIGlmICghKHBhZ2VzT2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIHRvcC1sZXZlbCBwYWdlcyBkaWN0aW9uYXJ5LiIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidG9wbGV2ZWxQYWdlc0RpY3QiLCBwYWdlc09iaik7CiAgfQogIGdldCBkb2N1bWVudE91dGxpbmUoKSB7CiAgICBsZXQgb2JqID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIG9iaiA9IHRoaXMuX3JlYWREb2N1bWVudE91dGxpbmUoKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybigiVW5hYmxlIHRvIHJlYWQgZG9jdW1lbnQgb3V0bGluZS4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImRvY3VtZW50T3V0bGluZSIsIG9iaik7CiAgfQogIF9yZWFkRG9jdW1lbnRPdXRsaW5lKCkgewogICAgbGV0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPdXRsaW5lcyIpOwogICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBvYmogPSBvYmouZ2V0UmF3KCJGaXJzdCIpOwogICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUmVmKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHJvb3QgPSB7CiAgICAgIGl0ZW1zOiBbXQogICAgfTsKICAgIGNvbnN0IHF1ZXVlID0gW3sKICAgICAgb2JqLAogICAgICBwYXJlbnQ6IHJvb3QKICAgIH1dOwogICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IFJlZlNldCgpOwogICAgcHJvY2Vzc2VkLnB1dChvYmopOwogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZiwKICAgICAgYmxhY2tDb2xvciA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTsKICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGkgPSBxdWV1ZS5zaGlmdCgpOwogICAgICBjb25zdCBvdXRsaW5lRGljdCA9IHhyZWYuZmV0Y2hJZlJlZihpLm9iaik7CiAgICAgIGlmIChvdXRsaW5lRGljdCA9PT0gbnVsbCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghb3V0bGluZURpY3QuaGFzKCJUaXRsZSIpKSB7CiAgICAgICAgd2FybigiSW52YWxpZCBvdXRsaW5lIGl0ZW0gZW5jb3VudGVyZWQuIik7CiAgICAgIH0KICAgICAgY29uc3QgZGF0YSA9IHsKICAgICAgICB1cmw6IG51bGwsCiAgICAgICAgZGVzdDogbnVsbCwKICAgICAgICBhY3Rpb246IG51bGwKICAgICAgfTsKICAgICAgQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKICAgICAgICBkZXN0RGljdDogb3V0bGluZURpY3QsCiAgICAgICAgcmVzdWx0T2JqOiBkYXRhLAogICAgICAgIGRvY0Jhc2VVcmw6IHRoaXMuYmFzZVVybCwKICAgICAgICBkb2NBdHRhY2htZW50czogdGhpcy5hdHRhY2htZW50cwogICAgICB9KTsKICAgICAgY29uc3QgdGl0bGUgPSBvdXRsaW5lRGljdC5nZXQoIlRpdGxlIik7CiAgICAgIGNvbnN0IGZsYWdzID0gb3V0bGluZURpY3QuZ2V0KCJGIikgfHwgMDsKICAgICAgY29uc3QgY29sb3IgPSBvdXRsaW5lRGljdC5nZXRBcnJheSgiQyIpOwogICAgICBjb25zdCBjb3VudCA9IG91dGxpbmVEaWN0LmdldCgiQ291bnQiKTsKICAgICAgbGV0IHJnYkNvbG9yID0gYmxhY2tDb2xvcjsKICAgICAgaWYgKGlzTnVtYmVyQXJyYXkoY29sb3IsIDMpICYmIChjb2xvclswXSAhPT0gMCB8fCBjb2xvclsxXSAhPT0gMCB8fCBjb2xvclsyXSAhPT0gMCkpIHsKICAgICAgICByZ2JDb2xvciA9IENvbG9yU3BhY2VVdGlscy5yZ2IuZ2V0UmdiKGNvbG9yLCAwKTsKICAgICAgfQogICAgICBjb25zdCBvdXRsaW5lSXRlbSA9IHsKICAgICAgICBhY3Rpb246IGRhdGEuYWN0aW9uLAogICAgICAgIGF0dGFjaG1lbnQ6IGRhdGEuYXR0YWNobWVudCwKICAgICAgICBkZXN0OiBkYXRhLmRlc3QsCiAgICAgICAgdXJsOiBkYXRhLnVybCwKICAgICAgICB1bnNhZmVVcmw6IGRhdGEudW5zYWZlVXJsLAogICAgICAgIG5ld1dpbmRvdzogZGF0YS5uZXdXaW5kb3csCiAgICAgICAgc2V0T0NHU3RhdGU6IGRhdGEuc2V0T0NHU3RhdGUsCiAgICAgICAgdGl0bGU6IHR5cGVvZiB0aXRsZSA9PT0gInN0cmluZyIgPyBzdHJpbmdUb1BERlN0cmluZyh0aXRsZSkgOiAiIiwKICAgICAgICBjb2xvcjogcmdiQ29sb3IsCiAgICAgICAgY291bnQ6IE51bWJlci5pc0ludGVnZXIoY291bnQpID8gY291bnQgOiB1bmRlZmluZWQsCiAgICAgICAgYm9sZDogISEoZmxhZ3MgJiAyKSwKICAgICAgICBpdGFsaWM6ICEhKGZsYWdzICYgMSksCiAgICAgICAgaXRlbXM6IFtdCiAgICAgIH07CiAgICAgIGkucGFyZW50Lml0ZW1zLnB1c2gob3V0bGluZUl0ZW0pOwogICAgICBvYmogPSBvdXRsaW5lRGljdC5nZXRSYXcoIkZpcnN0Iik7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZWYgJiYgIXByb2Nlc3NlZC5oYXMob2JqKSkgewogICAgICAgIHF1ZXVlLnB1c2goewogICAgICAgICAgb2JqLAogICAgICAgICAgcGFyZW50OiBvdXRsaW5lSXRlbQogICAgICAgIH0pOwogICAgICAgIHByb2Nlc3NlZC5wdXQob2JqKTsKICAgICAgfQogICAgICBvYmogPSBvdXRsaW5lRGljdC5nZXRSYXcoIk5leHQiKTsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZiAmJiAhcHJvY2Vzc2VkLmhhcyhvYmopKSB7CiAgICAgICAgcXVldWUucHVzaCh7CiAgICAgICAgICBvYmosCiAgICAgICAgICBwYXJlbnQ6IGkucGFyZW50CiAgICAgICAgfSk7CiAgICAgICAgcHJvY2Vzc2VkLnB1dChvYmopOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcm9vdC5pdGVtcy5sZW5ndGggPiAwID8gcm9vdC5pdGVtcyA6IG51bGw7CiAgfQogIGdldCBwZXJtaXNzaW9ucygpIHsKICAgIGxldCBwZXJtaXNzaW9ucyA9IG51bGw7CiAgICB0cnkgewogICAgICBwZXJtaXNzaW9ucyA9IHRoaXMuX3JlYWRQZXJtaXNzaW9ucygpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKCJVbmFibGUgdG8gcmVhZCBwZXJtaXNzaW9ucy4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInBlcm1pc3Npb25zIiwgcGVybWlzc2lvbnMpOwogIH0KICBfcmVhZFBlcm1pc3Npb25zKCkgewogICAgY29uc3QgZW5jcnlwdCA9IHRoaXMueHJlZi50cmFpbGVyLmdldCgiRW5jcnlwdCIpOwogICAgaWYgKCEoZW5jcnlwdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbGV0IGZsYWdzID0gZW5jcnlwdC5nZXQoIlAiKTsKICAgIGlmICh0eXBlb2YgZmxhZ3MgIT09ICJudW1iZXIiKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZmxhZ3MgKz0gMiAqKiAzMjsKICAgIGNvbnN0IHBlcm1pc3Npb25zID0gW107CiAgICBmb3IgKGNvbnN0IGtleSBpbiBQZXJtaXNzaW9uRmxhZykgewogICAgICBjb25zdCB2YWx1ZSA9IFBlcm1pc3Npb25GbGFnW2tleV07CiAgICAgIGlmIChmbGFncyAmIHZhbHVlKSB7CiAgICAgICAgcGVybWlzc2lvbnMucHVzaCh2YWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwZXJtaXNzaW9uczsKICB9CiAgZ2V0IG9wdGlvbmFsQ29udGVudENvbmZpZygpIHsKICAgIGxldCBjb25maWcgPSBudWxsOwogICAgdHJ5IHsKICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPQ1Byb3BlcnRpZXMiKTsKICAgICAgaWYgKCFwcm9wZXJ0aWVzKSB7CiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAib3B0aW9uYWxDb250ZW50Q29uZmlnIiwgbnVsbCk7CiAgICAgIH0KICAgICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IHByb3BlcnRpZXMuZ2V0KCJEIik7CiAgICAgIGlmICghZGVmYXVsdENvbmZpZykgewogICAgICAgIHJldHVybiBzaGFkb3codGhpcywgIm9wdGlvbmFsQ29udGVudENvbmZpZyIsIG51bGwpOwogICAgICB9CiAgICAgIGNvbnN0IGdyb3Vwc0RhdGEgPSBwcm9wZXJ0aWVzLmdldCgiT0NHcyIpOwogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZ3JvdXBzRGF0YSkpIHsKICAgICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJvcHRpb25hbENvbnRlbnRDb25maWciLCBudWxsKTsKICAgICAgfQogICAgICBjb25zdCBncm91cFJlZkNhY2hlID0gbmV3IFJlZlNldENhY2hlKCk7CiAgICAgIGZvciAoY29uc3QgZ3JvdXBSZWYgb2YgZ3JvdXBzRGF0YSkgewogICAgICAgIGlmICghKGdyb3VwUmVmIGluc3RhbmNlb2YgUmVmKSB8fCBncm91cFJlZkNhY2hlLmhhcyhncm91cFJlZikpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBncm91cFJlZkNhY2hlLnB1dChncm91cFJlZiwgdGhpcy4jcmVhZE9wdGlvbmFsQ29udGVudEdyb3VwKGdyb3VwUmVmKSk7CiAgICAgIH0KICAgICAgY29uZmlnID0gdGhpcy4jcmVhZE9wdGlvbmFsQ29udGVudENvbmZpZyhkZWZhdWx0Q29uZmlnLCBncm91cFJlZkNhY2hlKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihgVW5hYmxlIHRvIHJlYWQgb3B0aW9uYWwgY29udGVudCBjb25maWc6ICR7ZXh9YCk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJvcHRpb25hbENvbnRlbnRDb25maWciLCBjb25maWcpOwogIH0KICAjcmVhZE9wdGlvbmFsQ29udGVudEdyb3VwKGdyb3VwUmVmKSB7CiAgICBjb25zdCBncm91cCA9IHRoaXMueHJlZi5mZXRjaChncm91cFJlZik7CiAgICBjb25zdCBvYmogPSB7CiAgICAgIGlkOiBncm91cFJlZi50b1N0cmluZygpLAogICAgICBuYW1lOiBudWxsLAogICAgICBpbnRlbnQ6IG51bGwsCiAgICAgIHVzYWdlOiB7CiAgICAgICAgcHJpbnQ6IG51bGwsCiAgICAgICAgdmlldzogbnVsbAogICAgICB9LAogICAgICByYkdyb3VwczogW10KICAgIH07CiAgICBjb25zdCBuYW1lID0gZ3JvdXAuZ2V0KCJOYW1lIik7CiAgICBpZiAodHlwZW9mIG5hbWUgPT09ICJzdHJpbmciKSB7CiAgICAgIG9iai5uYW1lID0gc3RyaW5nVG9QREZTdHJpbmcobmFtZSk7CiAgICB9CiAgICBsZXQgaW50ZW50ID0gZ3JvdXAuZ2V0QXJyYXkoIkludGVudCIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KGludGVudCkpIHsKICAgICAgaW50ZW50ID0gW2ludGVudF07CiAgICB9CiAgICBpZiAoaW50ZW50LmV2ZXJ5KGkgPT4gaSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgIG9iai5pbnRlbnQgPSBpbnRlbnQubWFwKGkgPT4gaS5uYW1lKTsKICAgIH0KICAgIGNvbnN0IHVzYWdlID0gZ3JvdXAuZ2V0KCJVc2FnZSIpOwogICAgaWYgKCEodXNhZ2UgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm4gb2JqOwogICAgfQogICAgY29uc3QgdXNhZ2VPYmogPSBvYmoudXNhZ2U7CiAgICBjb25zdCBwcmludCA9IHVzYWdlLmdldCgiUHJpbnQiKTsKICAgIGlmIChwcmludCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3QgcHJpbnRTdGF0ZSA9IHByaW50LmdldCgiUHJpbnRTdGF0ZSIpOwogICAgICBpZiAocHJpbnRTdGF0ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBzd2l0Y2ggKHByaW50U3RhdGUubmFtZSkgewogICAgICAgICAgY2FzZSAiT04iOgogICAgICAgICAgY2FzZSAiT0ZGIjoKICAgICAgICAgICAgdXNhZ2VPYmoucHJpbnQgPSB7CiAgICAgICAgICAgICAgcHJpbnRTdGF0ZTogcHJpbnRTdGF0ZS5uYW1lCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCB2aWV3ID0gdXNhZ2UuZ2V0KCJWaWV3Iik7CiAgICBpZiAodmlldyBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3Qgdmlld1N0YXRlID0gdmlldy5nZXQoIlZpZXdTdGF0ZSIpOwogICAgICBpZiAodmlld1N0YXRlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgIHN3aXRjaCAodmlld1N0YXRlLm5hbWUpIHsKICAgICAgICAgIGNhc2UgIk9OIjoKICAgICAgICAgIGNhc2UgIk9GRiI6CiAgICAgICAgICAgIHVzYWdlT2JqLnZpZXcgPSB7CiAgICAgICAgICAgICAgdmlld1N0YXRlOiB2aWV3U3RhdGUubmFtZQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG9iajsKICB9CiAgI3JlYWRPcHRpb25hbENvbnRlbnRDb25maWcoY29uZmlnLCBncm91cFJlZkNhY2hlKSB7CiAgICBmdW5jdGlvbiBwYXJzZU9uT2ZmKHJlZnMpIHsKICAgICAgY29uc3Qgb25QYXJzZWQgPSBbXTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVmcykpIHsKICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlZnMpIHsKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiBncm91cFJlZkNhY2hlLmhhcyh2YWx1ZSkpIHsKICAgICAgICAgICAgb25QYXJzZWQucHVzaCh2YWx1ZS50b1N0cmluZygpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG9uUGFyc2VkOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VPcmRlcihyZWZzLCBuZXN0ZWRMZXZlbHMgPSAwKSB7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZWZzKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IG9yZGVyID0gW107CiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVmcykgewogICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiBncm91cFJlZkNhY2hlLmhhcyh2YWx1ZSkpIHsKICAgICAgICAgIHBhcnNlZE9yZGVyUmVmcy5wdXQodmFsdWUpOwogICAgICAgICAgb3JkZXIucHVzaCh2YWx1ZS50b1N0cmluZygpKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBuZXN0ZWRPcmRlciA9IHBhcnNlTmVzdGVkT3JkZXIodmFsdWUsIG5lc3RlZExldmVscyk7CiAgICAgICAgaWYgKG5lc3RlZE9yZGVyKSB7CiAgICAgICAgICBvcmRlci5wdXNoKG5lc3RlZE9yZGVyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG5lc3RlZExldmVscyA+IDApIHsKICAgICAgICByZXR1cm4gb3JkZXI7CiAgICAgIH0KICAgICAgY29uc3QgaGlkZGVuR3JvdXBzID0gW107CiAgICAgIGZvciAoY29uc3QgW2dyb3VwUmVmXSBvZiBncm91cFJlZkNhY2hlLml0ZW1zKCkpIHsKICAgICAgICBpZiAocGFyc2VkT3JkZXJSZWZzLmhhcyhncm91cFJlZikpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBoaWRkZW5Hcm91cHMucHVzaChncm91cFJlZi50b1N0cmluZygpKTsKICAgICAgfQogICAgICBpZiAoaGlkZGVuR3JvdXBzLmxlbmd0aCkgewogICAgICAgIG9yZGVyLnB1c2goewogICAgICAgICAgbmFtZTogbnVsbCwKICAgICAgICAgIG9yZGVyOiBoaWRkZW5Hcm91cHMKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gb3JkZXI7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZU5lc3RlZE9yZGVyKHJlZiwgbmVzdGVkTGV2ZWxzKSB7CiAgICAgIGlmICgrK25lc3RlZExldmVscyA+IE1BWF9ORVNURURfTEVWRUxTKSB7CiAgICAgICAgd2FybigicGFyc2VOZXN0ZWRPcmRlciAtIHJlYWNoZWQgTUFYX05FU1RFRF9MRVZFTFMuIik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgdmFsdWUgPSB4cmVmLmZldGNoSWZSZWYocmVmKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IG5lc3RlZE5hbWUgPSB4cmVmLmZldGNoSWZSZWYodmFsdWVbMF0pOwogICAgICBpZiAodHlwZW9mIG5lc3RlZE5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgbmVzdGVkT3JkZXIgPSBwYXJzZU9yZGVyKHZhbHVlLnNsaWNlKDEpLCBuZXN0ZWRMZXZlbHMpOwogICAgICBpZiAoIW5lc3RlZE9yZGVyPy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIG5hbWU6IHN0cmluZ1RvUERGU3RyaW5nKG5lc3RlZE5hbWUpLAogICAgICAgIG9yZGVyOiBuZXN0ZWRPcmRlcgogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VSQkdyb3VwcyhyYkdyb3VwcykgewogICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmJHcm91cHMpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmJHcm91cHMpIHsKICAgICAgICBjb25zdCByYkdyb3VwID0geHJlZi5mZXRjaElmUmVmKHZhbHVlKTsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmJHcm91cCkgfHwgIXJiR3JvdXAubGVuZ3RoKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGFyc2VkUmJHcm91cCA9IG5ldyBTZXQoKTsKICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiByYkdyb3VwKSB7CiAgICAgICAgICBpZiAocmVmIGluc3RhbmNlb2YgUmVmICYmIGdyb3VwUmVmQ2FjaGUuaGFzKHJlZikgJiYgIXBhcnNlZFJiR3JvdXAuaGFzKHJlZi50b1N0cmluZygpKSkgewogICAgICAgICAgICBwYXJzZWRSYkdyb3VwLmFkZChyZWYudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIGdyb3VwUmVmQ2FjaGUuZ2V0KHJlZikucmJHcm91cHMucHVzaChwYXJzZWRSYkdyb3VwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWYsCiAgICAgIHBhcnNlZE9yZGVyUmVmcyA9IG5ldyBSZWZTZXQoKSwKICAgICAgTUFYX05FU1RFRF9MRVZFTFMgPSAxMDsKICAgIHBhcnNlUkJHcm91cHMoY29uZmlnLmdldCgiUkJHcm91cHMiKSk7CiAgICByZXR1cm4gewogICAgICBuYW1lOiB0eXBlb2YgY29uZmlnLmdldCgiTmFtZSIpID09PSAic3RyaW5nIiA/IHN0cmluZ1RvUERGU3RyaW5nKGNvbmZpZy5nZXQoIk5hbWUiKSkgOiBudWxsLAogICAgICBjcmVhdG9yOiB0eXBlb2YgY29uZmlnLmdldCgiQ3JlYXRvciIpID09PSAic3RyaW5nIiA/IHN0cmluZ1RvUERGU3RyaW5nKGNvbmZpZy5nZXQoIkNyZWF0b3IiKSkgOiBudWxsLAogICAgICBiYXNlU3RhdGU6IGNvbmZpZy5nZXQoIkJhc2VTdGF0ZSIpIGluc3RhbmNlb2YgTmFtZSA/IGNvbmZpZy5nZXQoIkJhc2VTdGF0ZSIpLm5hbWUgOiBudWxsLAogICAgICBvbjogcGFyc2VPbk9mZihjb25maWcuZ2V0KCJPTiIpKSwKICAgICAgb2ZmOiBwYXJzZU9uT2ZmKGNvbmZpZy5nZXQoIk9GRiIpKSwKICAgICAgb3JkZXI6IHBhcnNlT3JkZXIoY29uZmlnLmdldCgiT3JkZXIiKSksCiAgICAgIGdyb3VwczogWy4uLmdyb3VwUmVmQ2FjaGVdCiAgICB9OwogIH0KICBzZXRBY3R1YWxOdW1QYWdlcyhudW0gPSBudWxsKSB7CiAgICB0aGlzLl9hY3R1YWxOdW1QYWdlcyA9IG51bTsKICB9CiAgZ2V0IGhhc0FjdHVhbE51bVBhZ2VzKCkgewogICAgcmV0dXJuIHRoaXMuX2FjdHVhbE51bVBhZ2VzICE9PSBudWxsOwogIH0KICBnZXQgX3BhZ2VzQ291bnQoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLnRvcGxldmVsUGFnZXNEaWN0LmdldCgiQ291bnQiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiUGFnZSBjb3VudCBpbiB0b3AtbGV2ZWwgcGFnZXMgZGljdGlvbmFyeSBpcyBub3QgYW4gaW50ZWdlci4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgIl9wYWdlc0NvdW50Iiwgb2JqKTsKICB9CiAgZ2V0IG51bVBhZ2VzKCkgewogICAgcmV0dXJuIHRoaXMuaGFzQWN0dWFsTnVtUGFnZXMgPyB0aGlzLl9hY3R1YWxOdW1QYWdlcyA6IHRoaXMuX3BhZ2VzQ291bnQ7CiAgfQogIGdldCBkZXN0aW5hdGlvbnMoKSB7CiAgICBjb25zdCByYXdEZXN0cyA9IHRoaXMuI3JlYWREZXN0cygpLAogICAgICBkZXN0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmb3IgKGNvbnN0IG9iaiBvZiByYXdEZXN0cykgewogICAgICBpZiAob2JqIGluc3RhbmNlb2YgTmFtZVRyZWUpIHsKICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmouZ2V0QWxsKCkpIHsKICAgICAgICAgIGNvbnN0IGRlc3QgPSBmZXRjaERlc3QodmFsdWUpOwogICAgICAgICAgaWYgKGRlc3QpIHsKICAgICAgICAgICAgZGVzdHNbc3RyaW5nVG9QREZTdHJpbmcoa2V5KV0gPSBkZXN0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb2JqKSB7CiAgICAgICAgICBjb25zdCBkZXN0ID0gZmV0Y2hEZXN0KHZhbHVlKTsKICAgICAgICAgIGlmIChkZXN0KSB7CiAgICAgICAgICAgIGRlc3RzW2tleV0gfHw9IGRlc3Q7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJkZXN0aW5hdGlvbnMiLCBkZXN0cyk7CiAgfQogIGdldERlc3RpbmF0aW9uKGlkKSB7CiAgICBjb25zdCByYXdEZXN0cyA9IHRoaXMuI3JlYWREZXN0cygpOwogICAgZm9yIChjb25zdCBvYmogb2YgcmF3RGVzdHMpIHsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVUcmVlIHx8IG9iaiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBjb25zdCBkZXN0ID0gZmV0Y2hEZXN0KG9iai5nZXQoaWQpKTsKICAgICAgICBpZiAoZGVzdCkgewogICAgICAgICAgcmV0dXJuIGRlc3Q7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAocmF3RGVzdHNbMF0gaW5zdGFuY2VvZiBOYW1lVHJlZSkgewogICAgICBjb25zdCBkZXN0ID0gdGhpcy5kZXN0aW5hdGlvbnNbaWRdOwogICAgICBpZiAoZGVzdCkgewogICAgICAgIHdhcm4oYEZvdW5kICIke2lkfSIgYXQgYW4gaW5jb3JyZWN0IHBvc2l0aW9uIGluIHRoZSBOYW1lVHJlZS5gKTsKICAgICAgICByZXR1cm4gZGVzdDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogICNyZWFkRGVzdHMoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTsKICAgIGNvbnN0IHJhd0Rlc3RzID0gW107CiAgICBpZiAob2JqPy5oYXMoIkRlc3RzIikpIHsKICAgICAgcmF3RGVzdHMucHVzaChuZXcgTmFtZVRyZWUob2JqLmdldFJhdygiRGVzdHMiKSwgdGhpcy54cmVmKSk7CiAgICB9CiAgICBpZiAodGhpcy5fY2F0RGljdC5oYXMoIkRlc3RzIikpIHsKICAgICAgcmF3RGVzdHMucHVzaCh0aGlzLl9jYXREaWN0LmdldCgiRGVzdHMiKSk7CiAgICB9CiAgICByZXR1cm4gcmF3RGVzdHM7CiAgfQogIGdldCBwYWdlTGFiZWxzKCkgewogICAgbGV0IG9iaiA9IG51bGw7CiAgICB0cnkgewogICAgICBvYmogPSB0aGlzLl9yZWFkUGFnZUxhYmVscygpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKCJVbmFibGUgdG8gcmVhZCBwYWdlIGxhYmVscy4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInBhZ2VMYWJlbHMiLCBvYmopOwogIH0KICBfcmVhZFBhZ2VMYWJlbHMoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldFJhdygiUGFnZUxhYmVscyIpOwogICAgaWYgKCFvYmopIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwYWdlTGFiZWxzID0gbmV3IEFycmF5KHRoaXMubnVtUGFnZXMpOwogICAgbGV0IHN0eWxlID0gbnVsbCwKICAgICAgcHJlZml4ID0gIiI7CiAgICBjb25zdCBudW1iZXJUcmVlID0gbmV3IE51bWJlclRyZWUob2JqLCB0aGlzLnhyZWYpOwogICAgY29uc3QgbnVtcyA9IG51bWJlclRyZWUuZ2V0QWxsKCk7CiAgICBsZXQgY3VycmVudExhYmVsID0gIiIsCiAgICAgIGN1cnJlbnRJbmRleCA9IDE7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLm51bVBhZ2VzOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCBsYWJlbERpY3QgPSBudW1zLmdldChpKTsKICAgICAgaWYgKGxhYmVsRGljdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgaWYgKCEobGFiZWxEaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiUGFnZUxhYmVsIGlzIG5vdCBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgfQogICAgICAgIGlmIChsYWJlbERpY3QuaGFzKCJUeXBlIikgJiYgIWlzTmFtZShsYWJlbERpY3QuZ2V0KCJUeXBlIiksICJQYWdlTGFiZWwiKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIHR5cGUgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7CiAgICAgICAgfQogICAgICAgIGlmIChsYWJlbERpY3QuaGFzKCJTIikpIHsKICAgICAgICAgIGNvbnN0IHMgPSBsYWJlbERpY3QuZ2V0KCJTIik7CiAgICAgICAgICBpZiAoIShzIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIHN0eWxlIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgfQogICAgICAgICAgc3R5bGUgPSBzLm5hbWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0eWxlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlAiKSkgewogICAgICAgICAgY29uc3QgcCA9IGxhYmVsRGljdC5nZXQoIlAiKTsKICAgICAgICAgIGlmICh0eXBlb2YgcCAhPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIHByZWZpeCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIHByZWZpeCA9IHN0cmluZ1RvUERGU3RyaW5nKHApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmVmaXggPSAiIjsKICAgICAgICB9CiAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlN0IikpIHsKICAgICAgICAgIGNvbnN0IHN0ID0gbGFiZWxEaWN0LmdldCgiU3QiKTsKICAgICAgICAgIGlmICghKE51bWJlci5pc0ludGVnZXIoc3QpICYmIHN0ID49IDEpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBzdGFydCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGN1cnJlbnRJbmRleCA9IHN0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50SW5kZXggPSAxOwogICAgICAgIH0KICAgICAgfQogICAgICBzd2l0Y2ggKHN0eWxlKSB7CiAgICAgICAgY2FzZSAiRCI6CiAgICAgICAgICBjdXJyZW50TGFiZWwgPSBjdXJyZW50SW5kZXg7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJSIjoKICAgICAgICBjYXNlICJyIjoKICAgICAgICAgIGN1cnJlbnRMYWJlbCA9IHRvUm9tYW5OdW1lcmFscyhjdXJyZW50SW5kZXgsIHN0eWxlID09PSAiciIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQSI6CiAgICAgICAgY2FzZSAiYSI6CiAgICAgICAgICBjb25zdCBMSU1JVCA9IDI2OwogICAgICAgICAgY29uc3QgQV9VUFBFUl9DQVNFID0gMHg0MSwKICAgICAgICAgICAgQV9MT1dFUl9DQVNFID0gMHg2MTsKICAgICAgICAgIGNvbnN0IGJhc2VDaGFyQ29kZSA9IHN0eWxlID09PSAiYSIgPyBBX0xPV0VSX0NBU0UgOiBBX1VQUEVSX0NBU0U7CiAgICAgICAgICBjb25zdCBsZXR0ZXJJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7CiAgICAgICAgICBjb25zdCBjaGFyYWN0ZXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJhc2VDaGFyQ29kZSArIGxldHRlckluZGV4ICUgTElNSVQpOwogICAgICAgICAgY3VycmVudExhYmVsID0gY2hhcmFjdGVyLnJlcGVhdChNYXRoLmZsb29yKGxldHRlckluZGV4IC8gTElNSVQpICsgMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKHN0eWxlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBzdHlsZSAiJHtzdHlsZX0iIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LmApOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudExhYmVsID0gIiI7CiAgICAgIH0KICAgICAgcGFnZUxhYmVsc1tpXSA9IHByZWZpeCArIGN1cnJlbnRMYWJlbDsKICAgICAgY3VycmVudEluZGV4Kys7CiAgICB9CiAgICByZXR1cm4gcGFnZUxhYmVsczsKICB9CiAgZ2V0IHBhZ2VMYXlvdXQoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiUGFnZUxheW91dCIpOwogICAgbGV0IHBhZ2VMYXlvdXQgPSAiIjsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHN3aXRjaCAob2JqLm5hbWUpIHsKICAgICAgICBjYXNlICJTaW5nbGVQYWdlIjoKICAgICAgICBjYXNlICJPbmVDb2x1bW4iOgogICAgICAgIGNhc2UgIlR3b0NvbHVtbkxlZnQiOgogICAgICAgIGNhc2UgIlR3b0NvbHVtblJpZ2h0IjoKICAgICAgICBjYXNlICJUd29QYWdlTGVmdCI6CiAgICAgICAgY2FzZSAiVHdvUGFnZVJpZ2h0IjoKICAgICAgICAgIHBhZ2VMYXlvdXQgPSBvYmoubmFtZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicGFnZUxheW91dCIsIHBhZ2VMYXlvdXQpOwogIH0KICBnZXQgcGFnZU1vZGUoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiUGFnZU1vZGUiKTsKICAgIGxldCBwYWdlTW9kZSA9ICJVc2VOb25lIjsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHN3aXRjaCAob2JqLm5hbWUpIHsKICAgICAgICBjYXNlICJVc2VOb25lIjoKICAgICAgICBjYXNlICJVc2VPdXRsaW5lcyI6CiAgICAgICAgY2FzZSAiVXNlVGh1bWJzIjoKICAgICAgICBjYXNlICJGdWxsU2NyZWVuIjoKICAgICAgICBjYXNlICJVc2VPQyI6CiAgICAgICAgY2FzZSAiVXNlQXR0YWNobWVudHMiOgogICAgICAgICAgcGFnZU1vZGUgPSBvYmoubmFtZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicGFnZU1vZGUiLCBwYWdlTW9kZSk7CiAgfQogIGdldCB2aWV3ZXJQcmVmZXJlbmNlcygpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJWaWV3ZXJQcmVmZXJlbmNlcyIpOwogICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmlld2VyUHJlZmVyZW5jZXMiLCBudWxsKTsKICAgIH0KICAgIGxldCBwcmVmcyA9IG51bGw7CiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmopIHsKICAgICAgbGV0IHByZWZWYWx1ZTsKICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICBjYXNlICJIaWRlVG9vbGJhciI6CiAgICAgICAgY2FzZSAiSGlkZU1lbnViYXIiOgogICAgICAgIGNhc2UgIkhpZGVXaW5kb3dVSSI6CiAgICAgICAgY2FzZSAiRml0V2luZG93IjoKICAgICAgICBjYXNlICJDZW50ZXJXaW5kb3ciOgogICAgICAgIGNhc2UgIkRpc3BsYXlEb2NUaXRsZSI6CiAgICAgICAgY2FzZSAiUGlja1RyYXlCeVBERlNpemUiOgogICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiTm9uRnVsbFNjcmVlblBhZ2VNb2RlIjoKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CiAgICAgICAgICAgICAgY2FzZSAiVXNlTm9uZSI6CiAgICAgICAgICAgICAgY2FzZSAiVXNlT3V0bGluZXMiOgogICAgICAgICAgICAgIGNhc2UgIlVzZVRodW1icyI6CiAgICAgICAgICAgICAgY2FzZSAiVXNlT0MiOgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSAiVXNlTm9uZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkRpcmVjdGlvbiI6CiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkgewogICAgICAgICAgICAgIGNhc2UgIkwyUiI6CiAgICAgICAgICAgICAgY2FzZSAiUjJMIjoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIkwyUiI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlZpZXdBcmVhIjoKICAgICAgICBjYXNlICJWaWV3Q2xpcCI6CiAgICAgICAgY2FzZSAiUHJpbnRBcmVhIjoKICAgICAgICBjYXNlICJQcmludENsaXAiOgogICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKICAgICAgICAgICAgICBjYXNlICJNZWRpYUJveCI6CiAgICAgICAgICAgICAgY2FzZSAiQ3JvcEJveCI6CiAgICAgICAgICAgICAgY2FzZSAiQmxlZWRCb3giOgogICAgICAgICAgICAgIGNhc2UgIlRyaW1Cb3giOgogICAgICAgICAgICAgIGNhc2UgIkFydEJveCI6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJDcm9wQm94IjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUHJpbnRTY2FsaW5nIjoKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CiAgICAgICAgICAgICAgY2FzZSAiTm9uZSI6CiAgICAgICAgICAgICAgY2FzZSAiQXBwRGVmYXVsdCI6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJBcHBEZWZhdWx0IjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiRHVwbGV4IjoKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CiAgICAgICAgICAgICAgY2FzZSAiU2ltcGxleCI6CiAgICAgICAgICAgICAgY2FzZSAiRHVwbGV4RmxpcFNob3J0RWRnZSI6CiAgICAgICAgICAgICAgY2FzZSAiRHVwbGV4RmxpcExvbmdFZGdlIjoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIk5vbmUiOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJQcmludFBhZ2VSYW5nZSI6CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoICUgMiA9PT0gMCkgewogICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gdmFsdWUuZXZlcnkoKHBhZ2UsIGksIGFycikgPT4gTnVtYmVyLmlzSW50ZWdlcihwYWdlKSAmJiBwYWdlID4gMCAmJiAoaSA9PT0gMCB8fCBwYWdlID49IGFycltpIC0gMV0pICYmIHBhZ2UgPD0gdGhpcy5udW1QYWdlcyk7CiAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7CiAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIk51bUNvcGllcyI6CiAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPiAwKSB7CiAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHdhcm4oYElnbm9yaW5nIG5vbi1zdGFuZGFyZCBrZXkgaW4gVmlld2VyUHJlZmVyZW5jZXM6ICR7a2V5fS5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChwcmVmVmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHdhcm4oYEJhZCB2YWx1ZSwgZm9yIGtleSAiJHtrZXl9IiwgaW4gVmlld2VyUHJlZmVyZW5jZXM6ICR7dmFsdWV9LmApOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghcHJlZnMpIHsKICAgICAgICBwcmVmcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIH0KICAgICAgcHJlZnNba2V5XSA9IHByZWZWYWx1ZTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInZpZXdlclByZWZlcmVuY2VzIiwgcHJlZnMpOwogIH0KICBnZXQgb3BlbkFjdGlvbigpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPcGVuQWN0aW9uIik7CiAgICBjb25zdCBvcGVuQWN0aW9uID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGNvbnN0IGRlc3REaWN0ID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgICAgZGVzdERpY3Quc2V0KCJBIiwgb2JqKTsKICAgICAgY29uc3QgcmVzdWx0T2JqID0gewogICAgICAgIHVybDogbnVsbCwKICAgICAgICBkZXN0OiBudWxsLAogICAgICAgIGFjdGlvbjogbnVsbAogICAgICB9OwogICAgICBDYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoewogICAgICAgIGRlc3REaWN0LAogICAgICAgIHJlc3VsdE9iagogICAgICB9KTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0T2JqLmRlc3QpKSB7CiAgICAgICAgb3BlbkFjdGlvbi5kZXN0ID0gcmVzdWx0T2JqLmRlc3Q7CiAgICAgIH0gZWxzZSBpZiAocmVzdWx0T2JqLmFjdGlvbikgewogICAgICAgIG9wZW5BY3Rpb24uYWN0aW9uID0gcmVzdWx0T2JqLmFjdGlvbjsKICAgICAgfQogICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHsKICAgICAgb3BlbkFjdGlvbi5kZXN0ID0gb2JqOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAib3BlbkFjdGlvbiIsIG9iamVjdFNpemUob3BlbkFjdGlvbikgPiAwID8gb3BlbkFjdGlvbiA6IG51bGwpOwogIH0KICBnZXQgYXR0YWNobWVudHMoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTsKICAgIGxldCBhdHRhY2htZW50cyA9IG51bGw7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCAmJiBvYmouaGFzKCJFbWJlZGRlZEZpbGVzIikpIHsKICAgICAgY29uc3QgbmFtZVRyZWUgPSBuZXcgTmFtZVRyZWUob2JqLmdldFJhdygiRW1iZWRkZWRGaWxlcyIpLCB0aGlzLnhyZWYpOwogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuYW1lVHJlZS5nZXRBbGwoKSkgewogICAgICAgIGNvbnN0IGZzID0gbmV3IEZpbGVTcGVjKHZhbHVlLCB0aGlzLnhyZWYpOwogICAgICAgIGlmICghYXR0YWNobWVudHMpIHsKICAgICAgICAgIGF0dGFjaG1lbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB9CiAgICAgICAgYXR0YWNobWVudHNbc3RyaW5nVG9QREZTdHJpbmcoa2V5KV0gPSBmcy5zZXJpYWxpemFibGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImF0dGFjaG1lbnRzIiwgYXR0YWNobWVudHMpOwogIH0KICBnZXQgeGZhSW1hZ2VzKCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7CiAgICBsZXQgeGZhSW1hZ2VzID0gbnVsbDsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0ICYmIG9iai5oYXMoIlhGQUltYWdlcyIpKSB7CiAgICAgIGNvbnN0IG5hbWVUcmVlID0gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoIlhGQUltYWdlcyIpLCB0aGlzLnhyZWYpOwogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuYW1lVHJlZS5nZXRBbGwoKSkgewogICAgICAgIGlmICgheGZhSW1hZ2VzKSB7CiAgICAgICAgICB4ZmFJbWFnZXMgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgICAgIH0KICAgICAgICB4ZmFJbWFnZXMuc2V0KHN0cmluZ1RvUERGU3RyaW5nKGtleSksIHZhbHVlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAieGZhSW1hZ2VzIiwgeGZhSW1hZ2VzKTsKICB9CiAgX2NvbGxlY3RKYXZhU2NyaXB0KCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7CiAgICBsZXQgamF2YVNjcmlwdCA9IG51bGw7CiAgICBmdW5jdGlvbiBhcHBlbmRJZkphdmFTY3JpcHREaWN0KG5hbWUsIGpzRGljdCkgewogICAgICBpZiAoIShqc0RpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWlzTmFtZShqc0RpY3QuZ2V0KCJTIiksICJKYXZhU2NyaXB0IikpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGpzID0ganNEaWN0LmdldCgiSlMiKTsKICAgICAgaWYgKGpzIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgIGpzID0ganMuZ2V0U3RyaW5nKCk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGpzICE9PSAic3RyaW5nIikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBqcyA9IHN0cmluZ1RvUERGU3RyaW5nKGpzKS5yZXBsYWNlQWxsKCJceDAwIiwgIiIpOwogICAgICBpZiAoanMpIHsKICAgICAgICAoamF2YVNjcmlwdCB8fD0gbmV3IE1hcCgpKS5zZXQobmFtZSwganMpOwogICAgICB9CiAgICB9CiAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCAmJiBvYmouaGFzKCJKYXZhU2NyaXB0IikpIHsKICAgICAgY29uc3QgbmFtZVRyZWUgPSBuZXcgTmFtZVRyZWUob2JqLmdldFJhdygiSmF2YVNjcmlwdCIpLCB0aGlzLnhyZWYpOwogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuYW1lVHJlZS5nZXRBbGwoKSkgewogICAgICAgIGFwcGVuZElmSmF2YVNjcmlwdERpY3Qoc3RyaW5nVG9QREZTdHJpbmcoa2V5KSwgdmFsdWUpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBvcGVuQWN0aW9uID0gdGhpcy5fY2F0RGljdC5nZXQoIk9wZW5BY3Rpb24iKTsKICAgIGlmIChvcGVuQWN0aW9uKSB7CiAgICAgIGFwcGVuZElmSmF2YVNjcmlwdERpY3QoIk9wZW5BY3Rpb24iLCBvcGVuQWN0aW9uKTsKICAgIH0KICAgIHJldHVybiBqYXZhU2NyaXB0OwogIH0KICBnZXQganNBY3Rpb25zKCkgewogICAgY29uc3QgamF2YVNjcmlwdCA9IHRoaXMuX2NvbGxlY3RKYXZhU2NyaXB0KCk7CiAgICBsZXQgYWN0aW9ucyA9IGNvbGxlY3RBY3Rpb25zKHRoaXMueHJlZiwgdGhpcy5fY2F0RGljdCwgRG9jdW1lbnRBY3Rpb25FdmVudFR5cGUpOwogICAgaWYgKGphdmFTY3JpcHQpIHsKICAgICAgYWN0aW9ucyB8fD0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIGphdmFTY3JpcHQpIHsKICAgICAgICBpZiAoa2V5IGluIGFjdGlvbnMpIHsKICAgICAgICAgIGFjdGlvbnNba2V5XS5wdXNoKHZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFjdGlvbnNba2V5XSA9IFt2YWxdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAianNBY3Rpb25zIiwgYWN0aW9ucyk7CiAgfQogIGFzeW5jIGNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQgPSBmYWxzZSkgewogICAgY2xlYXJHbG9iYWxDYWNoZXMoKTsKICAgIHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLmNsZWFyKCk7CiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuY2xlYXIobWFudWFsbHlUcmlnZ2VyZWQpOwogICAgdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUuY2xlYXIoKTsKICAgIHRoaXMucGFnZUluZGV4Q2FjaGUuY2xlYXIoKTsKICAgIHRoaXMucGFnZURpY3RDYWNoZS5jbGVhcigpOwogICAgdGhpcy5ub25CbGVuZE1vZGVzU2V0LmNsZWFyKCk7CiAgICBmb3IgKGNvbnN0IHsKICAgICAgZGljdAogICAgfSBvZiBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmZvbnRDYWNoZSkpIHsKICAgICAgZGVsZXRlIGRpY3QuY2FjaGVLZXk7CiAgICB9CiAgICB0aGlzLmZvbnRDYWNoZS5jbGVhcigpOwogICAgdGhpcy5idWlsdEluQ01hcENhY2hlLmNsZWFyKCk7CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5jbGVhcigpOwogICAgdGhpcy5zeXN0ZW1Gb250Q2FjaGUuY2xlYXIoKTsKICB9CiAgYXN5bmMgZ2V0UGFnZURpY3QocGFnZUluZGV4KSB7CiAgICBjb25zdCBub2Rlc1RvVmlzaXQgPSBbdGhpcy50b3BsZXZlbFBhZ2VzRGljdF07CiAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgUmVmU2V0KCk7CiAgICBjb25zdCBwYWdlc1JlZiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlcyIpOwogICAgaWYgKHBhZ2VzUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHZpc2l0ZWROb2Rlcy5wdXQocGFnZXNSZWYpOwogICAgfQogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZiwKICAgICAgcGFnZUtpZHNDb3VudENhY2hlID0gdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUsCiAgICAgIHBhZ2VJbmRleENhY2hlID0gdGhpcy5wYWdlSW5kZXhDYWNoZSwKICAgICAgcGFnZURpY3RDYWNoZSA9IHRoaXMucGFnZURpY3RDYWNoZTsKICAgIGxldCBjdXJyZW50UGFnZUluZGV4ID0gMDsKICAgIHdoaWxlIChub2Rlc1RvVmlzaXQubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Zpc2l0LnBvcCgpOwogICAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICBjb25zdCBjb3VudCA9IHBhZ2VLaWRzQ291bnRDYWNoZS5nZXQoY3VycmVudE5vZGUpOwogICAgICAgIGlmIChjb3VudCA+PSAwICYmIGN1cnJlbnRQYWdlSW5kZXggKyBjb3VudCA8PSBwYWdlSW5kZXgpIHsKICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggKz0gY291bnQ7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHZpc2l0ZWROb2Rlcy5oYXMoY3VycmVudE5vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlBhZ2VzIHRyZWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOwogICAgICAgIH0KICAgICAgICB2aXNpdGVkTm9kZXMucHV0KGN1cnJlbnROb2RlKTsKICAgICAgICBjb25zdCBvYmogPSBhd2FpdCAocGFnZURpY3RDYWNoZS5nZXQoY3VycmVudE5vZGUpIHx8IHhyZWYuZmV0Y2hBc3luYyhjdXJyZW50Tm9kZSkpOwogICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICBsZXQgdHlwZSA9IG9iai5nZXRSYXcoIlR5cGUiKTsKICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNOYW1lKHR5cGUsICJQYWdlIikgfHwgIW9iai5oYXMoIktpZHMiKSkgewogICAgICAgICAgICBpZiAoIXBhZ2VLaWRzQ291bnRDYWNoZS5oYXMoY3VycmVudE5vZGUpKSB7CiAgICAgICAgICAgICAgcGFnZUtpZHNDb3VudENhY2hlLnB1dChjdXJyZW50Tm9kZSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFwYWdlSW5kZXhDYWNoZS5oYXMoY3VycmVudE5vZGUpKSB7CiAgICAgICAgICAgICAgcGFnZUluZGV4Q2FjaGUucHV0KGN1cnJlbnROb2RlLCBjdXJyZW50UGFnZUluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3VycmVudFBhZ2VJbmRleCA9PT0gcGFnZUluZGV4KSB7CiAgICAgICAgICAgICAgcmV0dXJuIFtvYmosIGN1cnJlbnROb2RlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50UGFnZUluZGV4Kys7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBub2Rlc1RvVmlzaXQucHVzaChvYmopOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlBhZ2UgZGljdGlvbmFyeSBraWQgcmVmZXJlbmNlIHBvaW50cyB0byB3cm9uZyB0eXBlIG9mIG9iamVjdC4iKTsKICAgICAgfQogICAgICBjb25zdCB7CiAgICAgICAgb2JqSWQKICAgICAgfSA9IGN1cnJlbnROb2RlOwogICAgICBsZXQgY291bnQgPSBjdXJyZW50Tm9kZS5nZXRSYXcoIkNvdW50Iik7CiAgICAgIGlmIChjb3VudCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGNvdW50ID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGNvdW50KTsKICAgICAgfQogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihjb3VudCkgJiYgY291bnQgPj0gMCkgewogICAgICAgIGlmIChvYmpJZCAmJiAhcGFnZUtpZHNDb3VudENhY2hlLmhhcyhvYmpJZCkpIHsKICAgICAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZS5wdXQob2JqSWQsIGNvdW50KTsKICAgICAgICB9CiAgICAgICAgaWYgKGN1cnJlbnRQYWdlSW5kZXggKyBjb3VudCA8PSBwYWdlSW5kZXgpIHsKICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggKz0gY291bnQ7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbGV0IGtpZHMgPSBjdXJyZW50Tm9kZS5nZXRSYXcoIktpZHMiKTsKICAgICAgaWYgKGtpZHMgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICBraWRzID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGtpZHMpOwogICAgICB9CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShraWRzKSkgewogICAgICAgIGxldCB0eXBlID0gY3VycmVudE5vZGUuZ2V0UmF3KCJUeXBlIik7CiAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmIChpc05hbWUodHlwZSwgIlBhZ2UiKSB8fCAhY3VycmVudE5vZGUuaGFzKCJLaWRzIikpIHsKICAgICAgICAgIGlmIChjdXJyZW50UGFnZUluZGV4ID09PSBwYWdlSW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIFtjdXJyZW50Tm9kZSwgbnVsbF07CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50UGFnZUluZGV4Kys7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkcyBvYmplY3QgaXMgbm90IGFuIGFycmF5LiIpOwogICAgICB9CiAgICAgIGZvciAobGV0IGxhc3QgPSBraWRzLmxlbmd0aCAtIDE7IGxhc3QgPj0gMDsgbGFzdC0tKSB7CiAgICAgICAgY29uc3QgbGFzdEtpZCA9IGtpZHNbbGFzdF07CiAgICAgICAgbm9kZXNUb1Zpc2l0LnB1c2gobGFzdEtpZCk7CiAgICAgICAgaWYgKGN1cnJlbnROb2RlID09PSB0aGlzLnRvcGxldmVsUGFnZXNEaWN0ICYmIGxhc3RLaWQgaW5zdGFuY2VvZiBSZWYgJiYgIXBhZ2VEaWN0Q2FjaGUuaGFzKGxhc3RLaWQpKSB7CiAgICAgICAgICBwYWdlRGljdENhY2hlLnB1dChsYXN0S2lkLCB4cmVmLmZldGNoQXN5bmMobGFzdEtpZCkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKGBQYWdlIGluZGV4ICR7cGFnZUluZGV4fSBub3QgZm91bmQuYCk7CiAgfQogIGFzeW5jIGdldEFsbFBhZ2VEaWN0cyhyZWNvdmVyeU1vZGUgPSBmYWxzZSkgewogICAgY29uc3QgewogICAgICBpZ25vcmVFcnJvcnMKICAgIH0gPSB0aGlzLnBkZk1hbmFnZXIuZXZhbHVhdG9yT3B0aW9uczsKICAgIGNvbnN0IHF1ZXVlID0gW3sKICAgICAgY3VycmVudE5vZGU6IHRoaXMudG9wbGV2ZWxQYWdlc0RpY3QsCiAgICAgIHBvc0luS2lkczogMAogICAgfV07CiAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgUmVmU2V0KCk7CiAgICBjb25zdCBwYWdlc1JlZiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlcyIpOwogICAgaWYgKHBhZ2VzUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHZpc2l0ZWROb2Rlcy5wdXQocGFnZXNSZWYpOwogICAgfQogICAgY29uc3QgbWFwID0gbmV3IE1hcCgpLAogICAgICB4cmVmID0gdGhpcy54cmVmLAogICAgICBwYWdlSW5kZXhDYWNoZSA9IHRoaXMucGFnZUluZGV4Q2FjaGU7CiAgICBsZXQgcGFnZUluZGV4ID0gMDsKICAgIGZ1bmN0aW9uIGFkZFBhZ2VEaWN0KHBhZ2VEaWN0LCBwYWdlUmVmKSB7CiAgICAgIGlmIChwYWdlUmVmICYmICFwYWdlSW5kZXhDYWNoZS5oYXMocGFnZVJlZikpIHsKICAgICAgICBwYWdlSW5kZXhDYWNoZS5wdXQocGFnZVJlZiwgcGFnZUluZGV4KTsKICAgICAgfQogICAgICBtYXAuc2V0KHBhZ2VJbmRleCsrLCBbcGFnZURpY3QsIHBhZ2VSZWZdKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZFBhZ2VFcnJvcihlcnJvcikgewogICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBYUmVmRW50cnlFeGNlcHRpb24gJiYgIXJlY292ZXJ5TW9kZSkgewogICAgICAgIHRocm93IGVycm9yOwogICAgICB9CiAgICAgIGlmIChyZWNvdmVyeU1vZGUgJiYgaWdub3JlRXJyb3JzICYmIHBhZ2VJbmRleCA9PT0gMCkgewogICAgICAgIHdhcm4oYGdldEFsbFBhZ2VEaWN0cyAtIFNraXBwaW5nIGludmFsaWQgZmlyc3QgcGFnZTogIiR7ZXJyb3J9Ii5gKTsKICAgICAgICBlcnJvciA9IERpY3QuZW1wdHk7CiAgICAgIH0KICAgICAgbWFwLnNldChwYWdlSW5kZXgrKywgW2Vycm9yLCBudWxsXSk7CiAgICB9CiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBxdWV1ZS5hdCgtMSk7CiAgICAgIGNvbnN0IHsKICAgICAgICBjdXJyZW50Tm9kZSwKICAgICAgICBwb3NJbktpZHMKICAgICAgfSA9IHF1ZXVlSXRlbTsKICAgICAgbGV0IGtpZHMgPSBjdXJyZW50Tm9kZS5nZXRSYXcoIktpZHMiKTsKICAgICAgaWYgKGtpZHMgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICB0cnkgewogICAgICAgICAga2lkcyA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyhraWRzKTsKICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgYWRkUGFnZUVycm9yKGV4KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgICBhZGRQYWdlRXJyb3IobmV3IEZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkcyBvYmplY3QgaXMgbm90IGFuIGFycmF5LiIpKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAocG9zSW5LaWRzID49IGtpZHMubGVuZ3RoKSB7CiAgICAgICAgcXVldWUucG9wKCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3Qga2lkT2JqID0ga2lkc1twb3NJbktpZHNdOwogICAgICBsZXQgb2JqOwogICAgICBpZiAoa2lkT2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgaWYgKHZpc2l0ZWROb2Rlcy5oYXMoa2lkT2JqKSkgewogICAgICAgICAgYWRkUGFnZUVycm9yKG5ldyBGb3JtYXRFcnJvcigiUGFnZXMgdHJlZSBjb250YWlucyBjaXJjdWxhciByZWZlcmVuY2UuIikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHZpc2l0ZWROb2Rlcy5wdXQoa2lkT2JqKTsKICAgICAgICB0cnkgewogICAgICAgICAgb2JqID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGtpZE9iaik7CiAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgIGFkZFBhZ2VFcnJvcihleCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb2JqID0ga2lkT2JqOwogICAgICB9CiAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgYWRkUGFnZUVycm9yKG5ldyBGb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZCByZWZlcmVuY2UgcG9pbnRzIHRvIHdyb25nIHR5cGUgb2Ygb2JqZWN0LiIpKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBsZXQgdHlwZSA9IG9iai5nZXRSYXcoIlR5cGUiKTsKICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdHlwZSA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyh0eXBlKTsKICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgYWRkUGFnZUVycm9yKGV4KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNOYW1lKHR5cGUsICJQYWdlIikgfHwgIW9iai5oYXMoIktpZHMiKSkgewogICAgICAgIGFkZFBhZ2VEaWN0KG9iaiwga2lkT2JqIGluc3RhbmNlb2YgUmVmID8ga2lkT2JqIDogbnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcXVldWUucHVzaCh7CiAgICAgICAgICBjdXJyZW50Tm9kZTogb2JqLAogICAgICAgICAgcG9zSW5LaWRzOiAwCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcXVldWVJdGVtLnBvc0luS2lkcysrOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CiAgZ2V0UGFnZUluZGV4KHBhZ2VSZWYpIHsKICAgIGNvbnN0IGNhY2hlZFBhZ2VJbmRleCA9IHRoaXMucGFnZUluZGV4Q2FjaGUuZ2V0KHBhZ2VSZWYpOwogICAgaWYgKGNhY2hlZFBhZ2VJbmRleCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FjaGVkUGFnZUluZGV4KTsKICAgIH0KICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CiAgICBmdW5jdGlvbiBwYWdlc0JlZm9yZVJlZihraWRSZWYpIHsKICAgICAgbGV0IHRvdGFsID0gMCwKICAgICAgICBwYXJlbnRSZWY7CiAgICAgIHJldHVybiB4cmVmLmZldGNoQXN5bmMoa2lkUmVmKS50aGVuKGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgaWYgKGlzUmVmc0VxdWFsKGtpZFJlZiwgcGFnZVJlZikgJiYgIWlzRGljdChub2RlLCAiUGFnZSIpICYmICEobm9kZSBpbnN0YW5jZW9mIERpY3QgJiYgIW5vZGUuaGFzKCJUeXBlIikgJiYgbm9kZS5oYXMoIkNvbnRlbnRzIikpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlRoZSByZWZlcmVuY2UgZG9lcyBub3QgcG9pbnQgdG8gYSAvUGFnZSBkaWN0aW9uYXJ5LiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm9kZSBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKICAgICAgICB9CiAgICAgICAgcGFyZW50UmVmID0gbm9kZS5nZXRSYXcoIlBhcmVudCIpOwogICAgICAgIHJldHVybiBub2RlLmdldEFzeW5jKCJQYXJlbnQiKTsKICAgICAgfSkudGhlbihmdW5jdGlvbiAocGFyZW50KSB7CiAgICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQYXJlbnQgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJlbnQuZ2V0QXN5bmMoIktpZHMiKTsKICAgICAgfSkudGhlbihmdW5jdGlvbiAoa2lkcykgewogICAgICAgIGlmICgha2lkcykgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGtpZFByb21pc2VzID0gW107CiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7CiAgICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgICAgaWYgKCEoa2lkIGluc3RhbmNlb2YgUmVmKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIktpZCBtdXN0IGJlIGEgcmVmZXJlbmNlLiIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzUmVmc0VxdWFsKGtpZCwga2lkUmVmKSkgewogICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAga2lkUHJvbWlzZXMucHVzaCh4cmVmLmZldGNoQXN5bmMoa2lkKS50aGVuKGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIktpZCBub2RlIG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvYmouaGFzKCJDb3VudCIpKSB7CiAgICAgICAgICAgICAgdG90YWwgKz0gb2JqLmdldCgiQ291bnQiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0b3RhbCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiS2lkIHJlZmVyZW5jZSBub3QgZm91bmQgaW4gcGFyZW50J3Mga2lkcy4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGtpZFByb21pc2VzKS50aGVuKCgpID0+IFt0b3RhbCwgcGFyZW50UmVmXSk7CiAgICAgIH0pOwogICAgfQogICAgbGV0IHRvdGFsID0gMDsKICAgIGNvbnN0IG5leHQgPSByZWYgPT4gcGFnZXNCZWZvcmVSZWYocmVmKS50aGVuKGFyZ3MgPT4gewogICAgICBpZiAoIWFyZ3MpIHsKICAgICAgICB0aGlzLnBhZ2VJbmRleENhY2hlLnB1dChwYWdlUmVmLCB0b3RhbCk7CiAgICAgICAgcmV0dXJuIHRvdGFsOwogICAgICB9CiAgICAgIGNvbnN0IFtjb3VudCwgcGFyZW50UmVmXSA9IGFyZ3M7CiAgICAgIHRvdGFsICs9IGNvdW50OwogICAgICByZXR1cm4gbmV4dChwYXJlbnRSZWYpOwogICAgfSk7CiAgICByZXR1cm4gbmV4dChwYWdlUmVmKTsKICB9CiAgZ2V0IGJhc2VVcmwoKSB7CiAgICBjb25zdCB1cmkgPSB0aGlzLl9jYXREaWN0LmdldCgiVVJJIik7CiAgICBpZiAodXJpIGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCBiYXNlID0gdXJpLmdldCgiQmFzZSIpOwogICAgICBpZiAodHlwZW9mIGJhc2UgPT09ICJzdHJpbmciKSB7CiAgICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsKGJhc2UsIG51bGwsIHsKICAgICAgICAgIHRyeUNvbnZlcnRFbmNvZGluZzogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIGlmIChhYnNvbHV0ZVVybCkgewogICAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYmFzZVVybCIsIGFic29sdXRlVXJsLmhyZWYpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYmFzZVVybCIsIHRoaXMucGRmTWFuYWdlci5kb2NCYXNlVXJsKTsKICB9CiAgc3RhdGljIHBhcnNlRGVzdERpY3Rpb25hcnkoewogICAgZGVzdERpY3QsCiAgICByZXN1bHRPYmosCiAgICBkb2NCYXNlVXJsID0gbnVsbCwKICAgIGRvY0F0dGFjaG1lbnRzID0gbnVsbAogIH0pIHsKICAgIGlmICghKGRlc3REaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgd2FybigicGFyc2VEZXN0RGljdGlvbmFyeTogYGRlc3REaWN0YCBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IGFjdGlvbiA9IGRlc3REaWN0LmdldCgiQSIpLAogICAgICB1cmwsCiAgICAgIGRlc3Q7CiAgICBpZiAoIShhY3Rpb24gaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICBpZiAoZGVzdERpY3QuaGFzKCJEZXN0IikpIHsKICAgICAgICBhY3Rpb24gPSBkZXN0RGljdC5nZXQoIkRlc3QiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY3Rpb24gPSBkZXN0RGljdC5nZXQoIkFBIik7CiAgICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgIGlmIChhY3Rpb24uaGFzKCJEIikpIHsKICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uLmdldCgiRCIpOwogICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uaGFzKCJVIikpIHsKICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uLmdldCgiVSIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3QgYWN0aW9uVHlwZSA9IGFjdGlvbi5nZXQoIlMiKTsKICAgICAgaWYgKCEoYWN0aW9uVHlwZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgd2FybigicGFyc2VEZXN0RGljdGlvbmFyeTogSW52YWxpZCB0eXBlIGluIEFjdGlvbiBkaWN0aW9uYXJ5LiIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBhY3Rpb25OYW1lID0gYWN0aW9uVHlwZS5uYW1lOwogICAgICBzd2l0Y2ggKGFjdGlvbk5hbWUpIHsKICAgICAgICBjYXNlICJSZXNldEZvcm0iOgogICAgICAgICAgY29uc3QgZmxhZ3MgPSBhY3Rpb24uZ2V0KCJGbGFncyIpOwogICAgICAgICAgY29uc3QgaW5jbHVkZSA9ICgodHlwZW9mIGZsYWdzID09PSAibnVtYmVyIiA/IGZsYWdzIDogMCkgJiAxKSA9PT0gMDsKICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IFtdOwogICAgICAgICAgY29uc3QgcmVmcyA9IFtdOwogICAgICAgICAgZm9yIChjb25zdCBvYmogb2YgYWN0aW9uLmdldCgiRmllbGRzIikgfHwgW10pIHsKICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgIHJlZnMucHVzaChvYmoudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICBmaWVsZHMucHVzaChzdHJpbmdUb1BERlN0cmluZyhvYmopKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0T2JqLnJlc2V0Rm9ybSA9IHsKICAgICAgICAgICAgZmllbGRzLAogICAgICAgICAgICByZWZzLAogICAgICAgICAgICBpbmNsdWRlCiAgICAgICAgICB9OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiVVJJIjoKICAgICAgICAgIHVybCA9IGFjdGlvbi5nZXQoIlVSSSIpOwogICAgICAgICAgaWYgKHVybCBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgdXJsID0gIi8iICsgdXJsLm5hbWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJHb1RvIjoKICAgICAgICAgIGRlc3QgPSBhY3Rpb24uZ2V0KCJEIik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJMYXVuY2giOgogICAgICAgIGNhc2UgIkdvVG9SIjoKICAgICAgICAgIGNvbnN0IHVybERpY3QgPSBhY3Rpb24uZ2V0KCJGIik7CiAgICAgICAgICBpZiAodXJsRGljdCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgY29uc3QgZnMgPSBuZXcgRmlsZVNwZWModXJsRGljdCwgbnVsbCwgdHJ1ZSk7CiAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICByYXdGaWxlbmFtZQogICAgICAgICAgICB9ID0gZnMuc2VyaWFsaXphYmxlOwogICAgICAgICAgICB1cmwgPSByYXdGaWxlbmFtZTsKICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHVybERpY3QgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIHVybCA9IHVybERpY3Q7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCByZW1vdGVEZXN0ID0gZmV0Y2hSZW1vdGVEZXN0KGFjdGlvbik7CiAgICAgICAgICBpZiAocmVtb3RlRGVzdCAmJiB0eXBlb2YgdXJsID09PSAic3RyaW5nIikgewogICAgICAgICAgICB1cmwgPSB1cmwuc3BsaXQoIiMiLCAxKVswXSArICIjIiArIHJlbW90ZURlc3Q7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBuZXdXaW5kb3cgPSBhY3Rpb24uZ2V0KCJOZXdXaW5kb3ciKTsKICAgICAgICAgIGlmICh0eXBlb2YgbmV3V2luZG93ID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgcmVzdWx0T2JqLm5ld1dpbmRvdyA9IG5ld1dpbmRvdzsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkdvVG9FIjoKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGFjdGlvbi5nZXQoIlQiKTsKICAgICAgICAgIGxldCBhdHRhY2htZW50OwogICAgICAgICAgaWYgKGRvY0F0dGFjaG1lbnRzICYmIHRhcmdldCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gdGFyZ2V0LmdldCgiUiIpOwogICAgICAgICAgICBjb25zdCBuYW1lID0gdGFyZ2V0LmdldCgiTiIpOwogICAgICAgICAgICBpZiAoaXNOYW1lKHJlbGF0aW9uc2hpcCwgIkMiKSAmJiB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICBhdHRhY2htZW50ID0gZG9jQXR0YWNobWVudHNbc3RyaW5nVG9QREZTdHJpbmcobmFtZSldOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYXR0YWNobWVudCkgewogICAgICAgICAgICByZXN1bHRPYmouYXR0YWNobWVudCA9IGF0dGFjaG1lbnQ7CiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnREZXN0ID0gZmV0Y2hSZW1vdGVEZXN0KGFjdGlvbik7CiAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzdCkgewogICAgICAgICAgICAgIHJlc3VsdE9iai5hdHRhY2htZW50RGVzdCA9IGF0dGFjaG1lbnREZXN0OwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3YXJuKGBwYXJzZURlc3REaWN0aW9uYXJ5IC0gdW5pbXBsZW1lbnRlZCAiR29Ub0UiIGFjdGlvbi5gKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIk5hbWVkIjoKICAgICAgICAgIGNvbnN0IG5hbWVkQWN0aW9uID0gYWN0aW9uLmdldCgiTiIpOwogICAgICAgICAgaWYgKG5hbWVkQWN0aW9uIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICByZXN1bHRPYmouYWN0aW9uID0gbmFtZWRBY3Rpb24ubmFtZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlNldE9DR1N0YXRlIjoKICAgICAgICAgIGNvbnN0IHN0YXRlID0gYWN0aW9uLmdldCgiU3RhdGUiKTsKICAgICAgICAgIGNvbnN0IHByZXNlcnZlUkIgPSBhY3Rpb24uZ2V0KCJQcmVzZXJ2ZVJCIik7CiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3RhdGUpIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHN0YXRlQXJyID0gW107CiAgICAgICAgICBmb3IgKGNvbnN0IGVsZW0gb2Ygc3RhdGUpIHsKICAgICAgICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgICAgc3dpdGNoIChlbGVtLm5hbWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgIk9OIjoKICAgICAgICAgICAgICAgIGNhc2UgIk9GRiI6CiAgICAgICAgICAgICAgICBjYXNlICJUb2dnbGUiOgogICAgICAgICAgICAgICAgICBzdGF0ZUFyci5wdXNoKGVsZW0ubmFtZSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgICAgc3RhdGVBcnIucHVzaChlbGVtLnRvU3RyaW5nKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3RhdGVBcnIubGVuZ3RoICE9PSBzdGF0ZS5sZW5ndGgpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHRPYmouc2V0T0NHU3RhdGUgPSB7CiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZUFyciwKICAgICAgICAgICAgcHJlc2VydmVSQjogdHlwZW9mIHByZXNlcnZlUkIgPT09ICJib29sZWFuIiA/IHByZXNlcnZlUkIgOiB0cnVlCiAgICAgICAgICB9OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiSmF2YVNjcmlwdCI6CiAgICAgICAgICBjb25zdCBqc0FjdGlvbiA9IGFjdGlvbi5nZXQoIkpTIik7CiAgICAgICAgICBsZXQganM7CiAgICAgICAgICBpZiAoanNBY3Rpb24gaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgICAgIGpzID0ganNBY3Rpb24uZ2V0U3RyaW5nKCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBqc0FjdGlvbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAganMgPSBqc0FjdGlvbjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGpzVVJMID0ganMgJiYgcmVjb3ZlckpzVVJMKHN0cmluZ1RvUERGU3RyaW5nKGpzKSk7CiAgICAgICAgICBpZiAoanNVUkwpIHsKICAgICAgICAgICAgdXJsID0ganNVUkwudXJsOwogICAgICAgICAgICByZXN1bHRPYmoubmV3V2luZG93ID0ganNVUkwubmV3V2luZG93OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKGFjdGlvbk5hbWUgPT09ICJKYXZhU2NyaXB0IiB8fCBhY3Rpb25OYW1lID09PSAiU3VibWl0Rm9ybSIpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB3YXJuKGBwYXJzZURlc3REaWN0aW9uYXJ5IC0gdW5zdXBwb3J0ZWQgYWN0aW9uOiAiJHthY3Rpb25OYW1lfSIuYCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSBlbHNlIGlmIChkZXN0RGljdC5oYXMoIkRlc3QiKSkgewogICAgICBkZXN0ID0gZGVzdERpY3QuZ2V0KCJEZXN0Iik7CiAgICB9CiAgICBpZiAodHlwZW9mIHVybCA9PT0gInN0cmluZyIpIHsKICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCwgZG9jQmFzZVVybCwgewogICAgICAgIGFkZERlZmF1bHRQcm90b2NvbDogdHJ1ZSwKICAgICAgICB0cnlDb252ZXJ0RW5jb2Rpbmc6IHRydWUKICAgICAgfSk7CiAgICAgIGlmIChhYnNvbHV0ZVVybCkgewogICAgICAgIHJlc3VsdE9iai51cmwgPSBhYnNvbHV0ZVVybC5ocmVmOwogICAgICB9CiAgICAgIHJlc3VsdE9iai51bnNhZmVVcmwgPSB1cmw7CiAgICB9CiAgICBpZiAoZGVzdCkgewogICAgICBpZiAoZGVzdCBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBkZXN0ID0gZGVzdC5uYW1lOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgZGVzdCA9PT0gInN0cmluZyIpIHsKICAgICAgICByZXN1bHRPYmouZGVzdCA9IHN0cmluZ1RvUERGU3RyaW5nKGRlc3QpOwogICAgICB9IGVsc2UgaWYgKGlzVmFsaWRFeHBsaWNpdERlc3QoZGVzdCkpIHsKICAgICAgICByZXN1bHRPYmouZGVzdCA9IGRlc3Q7CiAgICAgIH0KICAgIH0KICB9Cn0KCjsvLyAuL3NyYy9jb3JlL29iamVjdF9sb2FkZXIuanMKCgoKCmZ1bmN0aW9uIG1heUhhdmVDaGlsZHJlbih2YWx1ZSkgewogIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFJlZiB8fCB2YWx1ZSBpbnN0YW5jZW9mIERpY3QgfHwgdmFsdWUgaW5zdGFuY2VvZiBCYXNlU3RyZWFtIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpOwp9CmZ1bmN0aW9uIGFkZENoaWxkcmVuKG5vZGUsIG5vZGVzVG9WaXNpdCkgewogIGlmIChub2RlIGluc3RhbmNlb2YgRGljdCkgewogICAgbm9kZSA9IG5vZGUuZ2V0UmF3VmFsdWVzKCk7CiAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgbm9kZSA9IG5vZGUuZGljdC5nZXRSYXdWYWx1ZXMoKTsKICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUpKSB7CiAgICByZXR1cm47CiAgfQogIGZvciAoY29uc3QgcmF3VmFsdWUgb2Ygbm9kZSkgewogICAgaWYgKG1heUhhdmVDaGlsZHJlbihyYXdWYWx1ZSkpIHsKICAgICAgbm9kZXNUb1Zpc2l0LnB1c2gocmF3VmFsdWUpOwogICAgfQogIH0KfQpjbGFzcyBPYmplY3RMb2FkZXIgewogIGNvbnN0cnVjdG9yKGRpY3QsIGtleXMsIHhyZWYpIHsKICAgIHRoaXMuZGljdCA9IGRpY3Q7CiAgICB0aGlzLmtleXMgPSBrZXlzOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMucmVmU2V0ID0gbnVsbDsKICB9CiAgYXN5bmMgbG9hZCgpIHsKICAgIGlmICh0aGlzLnhyZWYuc3RyZWFtLmlzRGF0YUxvYWRlZCkgewogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogICAgY29uc3QgewogICAgICBrZXlzLAogICAgICBkaWN0CiAgICB9ID0gdGhpczsKICAgIHRoaXMucmVmU2V0ID0gbmV3IFJlZlNldCgpOwogICAgY29uc3Qgbm9kZXNUb1Zpc2l0ID0gW107CiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7CiAgICAgIGNvbnN0IHJhd1ZhbHVlID0gZGljdC5nZXRSYXcoa2V5KTsKICAgICAgaWYgKHJhd1ZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBub2Rlc1RvVmlzaXQucHVzaChyYXdWYWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzLl93YWxrKG5vZGVzVG9WaXNpdCk7CiAgfQogIGFzeW5jIF93YWxrKG5vZGVzVG9WaXNpdCkgewogICAgY29uc3Qgbm9kZXNUb1JldmlzaXQgPSBbXTsKICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0cyA9IFtdOwogICAgd2hpbGUgKG5vZGVzVG9WaXNpdC5sZW5ndGgpIHsKICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Zpc2l0LnBvcCgpOwogICAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICBpZiAodGhpcy5yZWZTZXQuaGFzKGN1cnJlbnROb2RlKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLnJlZlNldC5wdXQoY3VycmVudE5vZGUpOwogICAgICAgICAgY3VycmVudE5vZGUgPSB0aGlzLnhyZWYuZmV0Y2goY3VycmVudE5vZGUpOwogICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICBpZiAoIShleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSkgewogICAgICAgICAgICB3YXJuKGBPYmplY3RMb2FkZXIuX3dhbGsgLSByZXF1ZXN0aW5nIGFsbCBkYXRhOiAiJHtleH0iLmApOwogICAgICAgICAgICB0aGlzLnJlZlNldCA9IG51bGw7CiAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICBtYW5hZ2VyCiAgICAgICAgICAgIH0gPSB0aGlzLnhyZWYuc3RyZWFtOwogICAgICAgICAgICByZXR1cm4gbWFuYWdlci5yZXF1ZXN0QWxsQ2h1bmtzKCk7CiAgICAgICAgICB9CiAgICAgICAgICBub2Rlc1RvUmV2aXNpdC5wdXNoKGN1cnJlbnROb2RlKTsKICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5wdXNoKHsKICAgICAgICAgICAgYmVnaW46IGV4LmJlZ2luLAogICAgICAgICAgICBlbmQ6IGV4LmVuZAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICBjb25zdCBiYXNlU3RyZWFtcyA9IGN1cnJlbnROb2RlLmdldEJhc2VTdHJlYW1zKCk7CiAgICAgICAgaWYgKGJhc2VTdHJlYW1zKSB7CiAgICAgICAgICBsZXQgZm91bmRNaXNzaW5nRGF0YSA9IGZhbHNlOwogICAgICAgICAgZm9yIChjb25zdCBzdHJlYW0gb2YgYmFzZVN0cmVhbXMpIHsKICAgICAgICAgICAgaWYgKHN0cmVhbS5pc0RhdGFMb2FkZWQpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3VuZE1pc3NpbmdEYXRhID0gdHJ1ZTsKICAgICAgICAgICAgcGVuZGluZ1JlcXVlc3RzLnB1c2goewogICAgICAgICAgICAgIGJlZ2luOiBzdHJlYW0uc3RhcnQsCiAgICAgICAgICAgICAgZW5kOiBzdHJlYW0uZW5kCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGZvdW5kTWlzc2luZ0RhdGEpIHsKICAgICAgICAgICAgbm9kZXNUb1JldmlzaXQucHVzaChjdXJyZW50Tm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGFkZENoaWxkcmVuKGN1cnJlbnROb2RlLCBub2Rlc1RvVmlzaXQpOwogICAgfQogICAgaWYgKHBlbmRpbmdSZXF1ZXN0cy5sZW5ndGgpIHsKICAgICAgYXdhaXQgdGhpcy54cmVmLnN0cmVhbS5tYW5hZ2VyLnJlcXVlc3RSYW5nZXMocGVuZGluZ1JlcXVlc3RzKTsKICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzVG9SZXZpc2l0KSB7CiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIHRoaXMucmVmU2V0LnJlbW92ZShub2RlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3dhbGsobm9kZXNUb1JldmlzaXQpOwogICAgfQogICAgdGhpcy5yZWZTZXQgPSBudWxsOwogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9zeW1ib2xfdXRpbHMuanMKY29uc3QgJGFjY2VwdFdoaXRlc3BhY2UgPSBTeW1ib2woKTsKY29uc3QgJGFkZEhUTUwgPSBTeW1ib2woKTsKY29uc3QgJGFwcGVuZENoaWxkID0gU3ltYm9sKCk7CmNvbnN0ICRjaGlsZHJlblRvSFRNTCA9IFN5bWJvbCgpOwpjb25zdCAkY2xlYW4gPSBTeW1ib2woKTsKY29uc3QgJGNsZWFuUGFnZSA9IFN5bWJvbCgpOwpjb25zdCAkY2xlYW51cCA9IFN5bWJvbCgpOwpjb25zdCAkY2xvbmUgPSBTeW1ib2woKTsKY29uc3QgJGNvbnN1bWVkID0gU3ltYm9sKCk7CmNvbnN0ICRjb250ZW50ID0gU3ltYm9sKCJjb250ZW50Iik7CmNvbnN0ICRkYXRhID0gU3ltYm9sKCJkYXRhIik7CmNvbnN0ICRkdW1wID0gU3ltYm9sKCk7CmNvbnN0ICRleHRyYSA9IFN5bWJvbCgiZXh0cmEiKTsKY29uc3QgJGZpbmFsaXplID0gU3ltYm9sKCk7CmNvbnN0ICRmbHVzaEhUTUwgPSBTeW1ib2woKTsKY29uc3QgJGdldEF0dHJpYnV0ZUl0ID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRBdHRyaWJ1dGVzID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRBdmFpbGFibGVTcGFjZSA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0Q2hpbGRyZW5CeUNsYXNzID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRDaGlsZHJlbkJ5TmFtZSA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0Q2hpbGRyZW5CeU5hbWVJdCA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0RGF0YVZhbHVlID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRFeHRyYSA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXQgPSBTeW1ib2woKTsKY29uc3QgJGdldENoaWxkcmVuID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRDb250YWluZWRDaGlsZHJlbiA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0TmV4dFBhZ2UgPSBTeW1ib2woKTsKY29uc3QgJGdldFN1YmZvcm1QYXJlbnQgPSBTeW1ib2woKTsKY29uc3QgJGdldFBhcmVudCA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0VGVtcGxhdGVSb290ID0gU3ltYm9sKCk7CmNvbnN0ICRnbG9iYWxEYXRhID0gU3ltYm9sKCk7CmNvbnN0ICRoYXNTZXR0YWJsZVZhbHVlID0gU3ltYm9sKCk7CmNvbnN0ICRpZHMgPSBTeW1ib2woKTsKY29uc3QgJGluZGV4T2YgPSBTeW1ib2woKTsKY29uc3QgJGluc2VydEF0ID0gU3ltYm9sKCk7CmNvbnN0ICRpc0NEQVRBWG1sID0gU3ltYm9sKCk7CmNvbnN0ICRpc0JpbmRhYmxlID0gU3ltYm9sKCk7CmNvbnN0ICRpc0RhdGFWYWx1ZSA9IFN5bWJvbCgpOwpjb25zdCAkaXNEZXNjZW5kZW50ID0gU3ltYm9sKCk7CmNvbnN0ICRpc05zQWdub3N0aWMgPSBTeW1ib2woKTsKY29uc3QgJGlzU3BsaXR0YWJsZSA9IFN5bWJvbCgpOwpjb25zdCAkaXNUaGVyZU1vcmVXaWR0aCA9IFN5bWJvbCgpOwpjb25zdCAkaXNUcmFuc3BhcmVudCA9IFN5bWJvbCgpOwpjb25zdCAkaXNVc2FibGUgPSBTeW1ib2woKTsKY29uc3QgJGxhc3RBdHRyaWJ1dGUgPSBTeW1ib2woKTsKY29uc3QgJG5hbWVzcGFjZUlkID0gU3ltYm9sKCJuYW1lc3BhY2VJZCIpOwpjb25zdCAkbm9kZU5hbWUgPSBTeW1ib2woIm5vZGVOYW1lIik7CmNvbnN0ICRuc0F0dHJpYnV0ZXMgPSBTeW1ib2woKTsKY29uc3QgJG9uQ2hpbGQgPSBTeW1ib2woKTsKY29uc3QgJG9uQ2hpbGRDaGVjayA9IFN5bWJvbCgpOwpjb25zdCAkb25UZXh0ID0gU3ltYm9sKCk7CmNvbnN0ICRwdXNoR2x5cGhzID0gU3ltYm9sKCk7CmNvbnN0ICRwb3BQYXJhID0gU3ltYm9sKCk7CmNvbnN0ICRwdXNoUGFyYSA9IFN5bWJvbCgpOwpjb25zdCAkcmVtb3ZlQ2hpbGQgPSBTeW1ib2woKTsKY29uc3QgJHJvb3QgPSBTeW1ib2woInJvb3QiKTsKY29uc3QgJHJlc29sdmVQcm90b3R5cGVzID0gU3ltYm9sKCk7CmNvbnN0ICRzZWFyY2hOb2RlID0gU3ltYm9sKCk7CmNvbnN0ICRzZXRJZCA9IFN5bWJvbCgpOwpjb25zdCAkc2V0U2V0QXR0cmlidXRlcyA9IFN5bWJvbCgpOwpjb25zdCAkc2V0VmFsdWUgPSBTeW1ib2woKTsKY29uc3QgJHRhYkluZGV4ID0gU3ltYm9sKCk7CmNvbnN0ICR0ZXh0ID0gU3ltYm9sKCk7CmNvbnN0ICR0b1BhZ2VzID0gU3ltYm9sKCk7CmNvbnN0ICR0b0hUTUwgPSBTeW1ib2woKTsKY29uc3QgJHRvU3RyaW5nID0gU3ltYm9sKCk7CmNvbnN0ICR0b1N0eWxlID0gU3ltYm9sKCk7CmNvbnN0ICR1aWQgPSBTeW1ib2woInVpZCIpOwoKOy8vIC4vc3JjL2NvcmUveGZhL25hbWVzcGFjZXMuanMKY29uc3QgJGJ1aWxkWEZBT2JqZWN0ID0gU3ltYm9sKCk7CmNvbnN0IE5hbWVzcGFjZUlkcyA9IHsKICBjb25maWc6IHsKICAgIGlkOiAwLAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGNpLyIpCiAgfSwKICBjb25uZWN0aW9uU2V0OiB7CiAgICBpZDogMSwKICAgIGNoZWNrOiBucyA9PiBucy5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1jb25uZWN0aW9uLXNldC8iKQogIH0sCiAgZGF0YXNldHM6IHsKICAgIGlkOiAyLAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvIikKICB9LAogIGZvcm06IHsKICAgIGlkOiAzLAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWZvcm0vIikKICB9LAogIGxvY2FsZVNldDogewogICAgaWQ6IDQsCiAgICBjaGVjazogbnMgPT4gbnMuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtbG9jYWxlLXNldC8iKQogIH0sCiAgcGRmOiB7CiAgICBpZDogNSwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly9ucy5hZG9iZS5jb20veGRwL3BkZi8iCiAgfSwKICBzaWduYXR1cmU6IHsKICAgIGlkOiA2LAogICAgY2hlY2s6IG5zID0+IG5zID09PSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKICB9LAogIHNvdXJjZVNldDogewogICAgaWQ6IDcsCiAgICBjaGVjazogbnMgPT4gbnMuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtc291cmNlLXNldC8iKQogIH0sCiAgc3R5bGVzaGVldDogewogICAgaWQ6IDgsCiAgICBjaGVjazogbnMgPT4gbnMgPT09ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCiAgfSwKICB0ZW1wbGF0ZTogewogICAgaWQ6IDksCiAgICBjaGVjazogbnMgPT4gbnMuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtdGVtcGxhdGUvIikKICB9LAogIHhkYzogewogICAgaWQ6IDEwLAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGRjLyIpCiAgfSwKICB4ZHA6IHsKICAgIGlkOiAxMSwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly9ucy5hZG9iZS5jb20veGRwLyIKICB9LAogIHhmZGY6IHsKICAgIGlkOiAxMiwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly9ucy5hZG9iZS5jb20veGZkZi8iCiAgfSwKICB4aHRtbDogewogICAgaWQ6IDEzLAogICAgY2hlY2s6IG5zID0+IG5zID09PSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKICB9LAogIHhtcG1ldGE6IHsKICAgIGlkOiAxNCwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly9ucy5hZG9iZS5jb20veG1wbWV0YS8iCiAgfQp9OwoKOy8vIC4vc3JjL2NvcmUveGZhL3V0aWxzLmpzCgpjb25zdCBkaW1Db252ZXJ0ZXJzID0gewogIHB0OiB4ID0+IHgsCiAgY206IHggPT4geCAvIDIuNTQgKiA3MiwKICBtbTogeCA9PiB4IC8gKDEwICogMi41NCkgKiA3MiwKICBpbjogeCA9PiB4ICogNzIsCiAgcHg6IHggPT4geAp9Owpjb25zdCBtZWFzdXJlbWVudFBhdHRlcm4gPSAvKFsrLV0/XGQrXC4/XGQqKSguKikvOwpmdW5jdGlvbiBzdHJpcFF1b3RlcyhzdHIpIHsKICBpZiAoc3RyLnN0YXJ0c1dpdGgoIiciKSB8fCBzdHIuc3RhcnRzV2l0aCgnIicpKSB7CiAgICByZXR1cm4gc3RyLnNsaWNlKDEsIC0xKTsKICB9CiAgcmV0dXJuIHN0cjsKfQpmdW5jdGlvbiBnZXRJbnRlZ2VyKHsKICBkYXRhLAogIGRlZmF1bHRWYWx1ZSwKICB2YWxpZGF0ZQp9KSB7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwogIH0KICBkYXRhID0gZGF0YS50cmltKCk7CiAgY29uc3QgbiA9IHBhcnNlSW50KGRhdGEsIDEwKTsKICBpZiAoIWlzTmFOKG4pICYmIHZhbGlkYXRlKG4pKSB7CiAgICByZXR1cm4gbjsKICB9CiAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKfQpmdW5jdGlvbiBnZXRGbG9hdCh7CiAgZGF0YSwKICBkZWZhdWx0VmFsdWUsCiAgdmFsaWRhdGUKfSkgewogIGlmICghZGF0YSkgewogICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKICB9CiAgZGF0YSA9IGRhdGEudHJpbSgpOwogIGNvbnN0IG4gPSBwYXJzZUZsb2F0KGRhdGEpOwogIGlmICghaXNOYU4obikgJiYgdmFsaWRhdGUobikpIHsKICAgIHJldHVybiBuOwogIH0KICByZXR1cm4gZGVmYXVsdFZhbHVlOwp9CmZ1bmN0aW9uIGdldEtleXdvcmQoewogIGRhdGEsCiAgZGVmYXVsdFZhbHVlLAogIHZhbGlkYXRlCn0pIHsKICBpZiAoIWRhdGEpIHsKICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CiAgfQogIGRhdGEgPSBkYXRhLnRyaW0oKTsKICBpZiAodmFsaWRhdGUoZGF0YSkpIHsKICAgIHJldHVybiBkYXRhOwogIH0KICByZXR1cm4gZGVmYXVsdFZhbHVlOwp9CmZ1bmN0aW9uIGdldFN0cmluZ09wdGlvbihkYXRhLCBvcHRpb25zKSB7CiAgcmV0dXJuIGdldEtleXdvcmQoewogICAgZGF0YSwKICAgIGRlZmF1bHRWYWx1ZTogb3B0aW9uc1swXSwKICAgIHZhbGlkYXRlOiBrID0+IG9wdGlvbnMuaW5jbHVkZXMoaykKICB9KTsKfQpmdW5jdGlvbiBnZXRNZWFzdXJlbWVudChzdHIsIGRlZiA9ICIwIikgewogIGRlZiB8fD0gIjAiOwogIGlmICghc3RyKSB7CiAgICByZXR1cm4gZ2V0TWVhc3VyZW1lbnQoZGVmKTsKICB9CiAgY29uc3QgbWF0Y2ggPSBzdHIudHJpbSgpLm1hdGNoKG1lYXN1cmVtZW50UGF0dGVybik7CiAgaWYgKCFtYXRjaCkgewogICAgcmV0dXJuIGdldE1lYXN1cmVtZW50KGRlZik7CiAgfQogIGNvbnN0IFssIHZhbHVlU3RyLCB1bml0XSA9IG1hdGNoOwogIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZVN0cik7CiAgaWYgKGlzTmFOKHZhbHVlKSkgewogICAgcmV0dXJuIGdldE1lYXN1cmVtZW50KGRlZik7CiAgfQogIGlmICh2YWx1ZSA9PT0gMCkgewogICAgcmV0dXJuIDA7CiAgfQogIGNvbnN0IGNvbnYgPSBkaW1Db252ZXJ0ZXJzW3VuaXRdOwogIGlmIChjb252KSB7CiAgICByZXR1cm4gY29udih2YWx1ZSk7CiAgfQogIHJldHVybiB2YWx1ZTsKfQpmdW5jdGlvbiBnZXRSYXRpbyhkYXRhKSB7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gewogICAgICBudW06IDEsCiAgICAgIGRlbjogMQogICAgfTsKICB9CiAgY29uc3QgcmF0aW8gPSBkYXRhLnNwbGl0KCI6IiwgMikubWFwKHggPT4gcGFyc2VGbG9hdCh4LnRyaW0oKSkpLmZpbHRlcih4ID0+ICFpc05hTih4KSk7CiAgaWYgKHJhdGlvLmxlbmd0aCA9PT0gMSkgewogICAgcmF0aW8ucHVzaCgxKTsKICB9CiAgaWYgKHJhdGlvLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIHsKICAgICAgbnVtOiAxLAogICAgICBkZW46IDEKICAgIH07CiAgfQogIGNvbnN0IFtudW0sIGRlbl0gPSByYXRpbzsKICByZXR1cm4gewogICAgbnVtLAogICAgZGVuCiAgfTsKfQpmdW5jdGlvbiBnZXRSZWxldmFudChkYXRhKSB7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gW107CiAgfQogIHJldHVybiBkYXRhLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKGUgPT4gKHsKICAgIGV4Y2x1ZGVkOiBlWzBdID09PSAiLSIsCiAgICB2aWV3bmFtZTogZS5zdWJzdHJpbmcoMSkKICB9KSk7Cn0KZnVuY3Rpb24gZ2V0Q29sb3IoZGF0YSwgZGVmID0gWzAsIDAsIDBdKSB7CiAgbGV0IFtyLCBnLCBiXSA9IGRlZjsKICBpZiAoIWRhdGEpIHsKICAgIHJldHVybiB7CiAgICAgIHIsCiAgICAgIGcsCiAgICAgIGIKICAgIH07CiAgfQogIGNvbnN0IGNvbG9yID0gZGF0YS5zcGxpdCgiLCIsIDMpLm1hcChjID0+IE1hdGhDbGFtcChwYXJzZUludChjLnRyaW0oKSwgMTApLCAwLCAyNTUpKS5tYXAoYyA9PiBpc05hTihjKSA/IDAgOiBjKTsKICBpZiAoY29sb3IubGVuZ3RoIDwgMykgewogICAgcmV0dXJuIHsKICAgICAgciwKICAgICAgZywKICAgICAgYgogICAgfTsKICB9CiAgW3IsIGcsIGJdID0gY29sb3I7CiAgcmV0dXJuIHsKICAgIHIsCiAgICBnLAogICAgYgogIH07Cn0KZnVuY3Rpb24gZ2V0QkJveChkYXRhKSB7CiAgY29uc3QgZGVmID0gLTE7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gewogICAgICB4OiBkZWYsCiAgICAgIHk6IGRlZiwKICAgICAgd2lkdGg6IGRlZiwKICAgICAgaGVpZ2h0OiBkZWYKICAgIH07CiAgfQogIGNvbnN0IGJib3ggPSBkYXRhLnNwbGl0KCIsIiwgNCkubWFwKG0gPT4gZ2V0TWVhc3VyZW1lbnQobS50cmltKCksICItMSIpKTsKICBpZiAoYmJveC5sZW5ndGggPCA0IHx8IGJib3hbMl0gPCAwIHx8IGJib3hbM10gPCAwKSB7CiAgICByZXR1cm4gewogICAgICB4OiBkZWYsCiAgICAgIHk6IGRlZiwKICAgICAgd2lkdGg6IGRlZiwKICAgICAgaGVpZ2h0OiBkZWYKICAgIH07CiAgfQogIGNvbnN0IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSA9IGJib3g7CiAgcmV0dXJuIHsKICAgIHgsCiAgICB5LAogICAgd2lkdGgsCiAgICBoZWlnaHQKICB9Owp9CmNsYXNzIEhUTUxSZXN1bHQgewogIHN0YXRpYyBnZXQgRkFJTFVSRSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIkZBSUxVUkUiLCBuZXcgSFRNTFJlc3VsdChmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwogIH0KICBzdGF0aWMgZ2V0IEVNUFRZKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiRU1QVFkiLCBuZXcgSFRNTFJlc3VsdCh0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7CiAgfQogIGNvbnN0cnVjdG9yKHN1Y2Nlc3MsIGh0bWwsIGJib3gsIGJyZWFrTm9kZSkgewogICAgdGhpcy5zdWNjZXNzID0gc3VjY2VzczsKICAgIHRoaXMuaHRtbCA9IGh0bWw7CiAgICB0aGlzLmJib3ggPSBiYm94OwogICAgdGhpcy5icmVha05vZGUgPSBicmVha05vZGU7CiAgfQogIGlzQnJlYWsoKSB7CiAgICByZXR1cm4gISF0aGlzLmJyZWFrTm9kZTsKICB9CiAgc3RhdGljIGJyZWFrTm9kZShub2RlKSB7CiAgICByZXR1cm4gbmV3IEhUTUxSZXN1bHQoZmFsc2UsIG51bGwsIG51bGwsIG5vZGUpOwogIH0KICBzdGF0aWMgc3VjY2VzcyhodG1sLCBiYm94ID0gbnVsbCkgewogICAgcmV0dXJuIG5ldyBIVE1MUmVzdWx0KHRydWUsIGh0bWwsIGJib3gsIG51bGwpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2ZvbnRzLmpzCgoKCmNsYXNzIEZvbnRGaW5kZXIgewogIGNvbnN0cnVjdG9yKHBkZkZvbnRzKSB7CiAgICB0aGlzLmZvbnRzID0gbmV3IE1hcCgpOwogICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTsKICAgIHRoaXMud2FybmVkID0gbmV3IFNldCgpOwogICAgdGhpcy5kZWZhdWx0Rm9udCA9IG51bGw7CiAgICB0aGlzLmFkZChwZGZGb250cyk7CiAgfQogIGFkZChwZGZGb250cywgcmVhbGx5TWlzc2luZ0ZvbnRzID0gbnVsbCkgewogICAgZm9yIChjb25zdCBwZGZGb250IG9mIHBkZkZvbnRzKSB7CiAgICAgIHRoaXMuYWRkUGRmRm9udChwZGZGb250KTsKICAgIH0KICAgIGZvciAoY29uc3QgcGRmRm9udCBvZiB0aGlzLmZvbnRzLnZhbHVlcygpKSB7CiAgICAgIGlmICghcGRmRm9udC5yZWd1bGFyKSB7CiAgICAgICAgcGRmRm9udC5yZWd1bGFyID0gcGRmRm9udC5pdGFsaWMgfHwgcGRmRm9udC5ib2xkIHx8IHBkZkZvbnQuYm9sZGl0YWxpYzsKICAgICAgfQogICAgfQogICAgaWYgKCFyZWFsbHlNaXNzaW5nRm9udHMgfHwgcmVhbGx5TWlzc2luZ0ZvbnRzLnNpemUgPT09IDApIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbXlyaWFkID0gdGhpcy5mb250cy5nZXQoIlBkZkpTLUZhbGxiYWNrLVBkZkpTLVhGQSIpOwogICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIHJlYWxseU1pc3NpbmdGb250cykgewogICAgICB0aGlzLmZvbnRzLnNldChtaXNzaW5nLCBteXJpYWQpOwogICAgfQogIH0KICBhZGRQZGZGb250KHBkZkZvbnQpIHsKICAgIGNvbnN0IGNzc0ZvbnRJbmZvID0gcGRmRm9udC5jc3NGb250SW5mbzsKICAgIGNvbnN0IG5hbWUgPSBjc3NGb250SW5mby5mb250RmFtaWx5OwogICAgbGV0IGZvbnQgPSB0aGlzLmZvbnRzLmdldChuYW1lKTsKICAgIGlmICghZm9udCkgewogICAgICBmb250ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgdGhpcy5mb250cy5zZXQobmFtZSwgZm9udCk7CiAgICAgIGlmICghdGhpcy5kZWZhdWx0Rm9udCkgewogICAgICAgIHRoaXMuZGVmYXVsdEZvbnQgPSBmb250OwogICAgICB9CiAgICB9CiAgICBsZXQgcHJvcGVydHkgPSAiIjsKICAgIGNvbnN0IGZvbnRXZWlnaHQgPSBwYXJzZUZsb2F0KGNzc0ZvbnRJbmZvLmZvbnRXZWlnaHQpOwogICAgaWYgKHBhcnNlRmxvYXQoY3NzRm9udEluZm8uaXRhbGljQW5nbGUpICE9PSAwKSB7CiAgICAgIHByb3BlcnR5ID0gZm9udFdlaWdodCA+PSA3MDAgPyAiYm9sZGl0YWxpYyIgOiAiaXRhbGljIjsKICAgIH0gZWxzZSBpZiAoZm9udFdlaWdodCA+PSA3MDApIHsKICAgICAgcHJvcGVydHkgPSAiYm9sZCI7CiAgICB9CiAgICBpZiAoIXByb3BlcnR5KSB7CiAgICAgIGlmIChwZGZGb250Lm5hbWUuaW5jbHVkZXMoIkJvbGQiKSB8fCBwZGZGb250LnBzTmFtZT8uaW5jbHVkZXMoIkJvbGQiKSkgewogICAgICAgIHByb3BlcnR5ID0gImJvbGQiOwogICAgICB9CiAgICAgIGlmIChwZGZGb250Lm5hbWUuaW5jbHVkZXMoIkl0YWxpYyIpIHx8IHBkZkZvbnQubmFtZS5lbmRzV2l0aCgiSXQiKSB8fCBwZGZGb250LnBzTmFtZT8uaW5jbHVkZXMoIkl0YWxpYyIpIHx8IHBkZkZvbnQucHNOYW1lPy5lbmRzV2l0aCgiSXQiKSkgewogICAgICAgIHByb3BlcnR5ICs9ICJpdGFsaWMiOwogICAgICB9CiAgICB9CiAgICBpZiAoIXByb3BlcnR5KSB7CiAgICAgIHByb3BlcnR5ID0gInJlZ3VsYXIiOwogICAgfQogICAgZm9udFtwcm9wZXJ0eV0gPSBwZGZGb250OwogIH0KICBnZXREZWZhdWx0KCkgewogICAgcmV0dXJuIHRoaXMuZGVmYXVsdEZvbnQ7CiAgfQogIGZpbmQoZm9udE5hbWUsIG11c3RXYXJuID0gdHJ1ZSkgewogICAgbGV0IGZvbnQgPSB0aGlzLmZvbnRzLmdldChmb250TmFtZSkgfHwgdGhpcy5jYWNoZS5nZXQoZm9udE5hbWUpOwogICAgaWYgKGZvbnQpIHsKICAgICAgcmV0dXJuIGZvbnQ7CiAgICB9CiAgICBjb25zdCBwYXR0ZXJuID0gLyx8LXxffCB8Ym9sZGl0YWxpY3xib2xkfGl0YWxpY3xyZWd1bGFyfGl0L2dpOwogICAgbGV0IG5hbWUgPSBmb250TmFtZS5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKTsKICAgIGZvbnQgPSB0aGlzLmZvbnRzLmdldChuYW1lKTsKICAgIGlmIChmb250KSB7CiAgICAgIHRoaXMuY2FjaGUuc2V0KGZvbnROYW1lLCBmb250KTsKICAgICAgcmV0dXJuIGZvbnQ7CiAgICB9CiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwogICAgY29uc3QgbWF5YmUgPSBbXTsKICAgIGZvciAoY29uc3QgW2ZhbWlseSwgcGRmRm9udF0gb2YgdGhpcy5mb250cy5lbnRyaWVzKCkpIHsKICAgICAgaWYgKGZhbWlseS5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobmFtZSkpIHsKICAgICAgICBtYXliZS5wdXNoKHBkZkZvbnQpOwogICAgICB9CiAgICB9CiAgICBpZiAobWF5YmUubGVuZ3RoID09PSAwKSB7CiAgICAgIGZvciAoY29uc3QgWywgcGRmRm9udF0gb2YgdGhpcy5mb250cy5lbnRyaWVzKCkpIHsKICAgICAgICBpZiAocGRmRm9udC5yZWd1bGFyLm5hbWU/LnJlcGxhY2VBbGwocGF0dGVybiwgIiIpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChuYW1lKSkgewogICAgICAgICAgbWF5YmUucHVzaChwZGZGb250KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChtYXliZS5sZW5ndGggPT09IDApIHsKICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgvcHNtdHxtdC9naSwgIiIpOwogICAgICBmb3IgKGNvbnN0IFtmYW1pbHksIHBkZkZvbnRdIG9mIHRoaXMuZm9udHMuZW50cmllcygpKSB7CiAgICAgICAgaWYgKGZhbWlseS5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobmFtZSkpIHsKICAgICAgICAgIG1heWJlLnB1c2gocGRmRm9udCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobWF5YmUubGVuZ3RoID09PSAwKSB7CiAgICAgIGZvciAoY29uc3QgcGRmRm9udCBvZiB0aGlzLmZvbnRzLnZhbHVlcygpKSB7CiAgICAgICAgaWYgKHBkZkZvbnQucmVndWxhci5uYW1lPy5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobmFtZSkpIHsKICAgICAgICAgIG1heWJlLnB1c2gocGRmRm9udCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobWF5YmUubGVuZ3RoID49IDEpIHsKICAgICAgaWYgKG1heWJlLmxlbmd0aCAhPT0gMSAmJiBtdXN0V2FybikgewogICAgICAgIHdhcm4oYFhGQSAtIFRvbyBtYW55IGNob2ljZXMgdG8gZ3Vlc3MgdGhlIGNvcnJlY3QgZm9udDogJHtmb250TmFtZX1gKTsKICAgICAgfQogICAgICB0aGlzLmNhY2hlLnNldChmb250TmFtZSwgbWF5YmVbMF0pOwogICAgICByZXR1cm4gbWF5YmVbMF07CiAgICB9CiAgICBpZiAobXVzdFdhcm4gJiYgIXRoaXMud2FybmVkLmhhcyhmb250TmFtZSkpIHsKICAgICAgdGhpcy53YXJuZWQuYWRkKGZvbnROYW1lKTsKICAgICAgd2FybihgWEZBIC0gQ2Fubm90IGZpbmQgdGhlIGZvbnQ6ICR7Zm9udE5hbWV9YCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KZnVuY3Rpb24gc2VsZWN0Rm9udCh4ZmFGb250LCB0eXBlZmFjZSkgewogIGlmICh4ZmFGb250LnBvc3R1cmUgPT09ICJpdGFsaWMiKSB7CiAgICBpZiAoeGZhRm9udC53ZWlnaHQgPT09ICJib2xkIikgewogICAgICByZXR1cm4gdHlwZWZhY2UuYm9sZGl0YWxpYzsKICAgIH0KICAgIHJldHVybiB0eXBlZmFjZS5pdGFsaWM7CiAgfSBlbHNlIGlmICh4ZmFGb250LndlaWdodCA9PT0gImJvbGQiKSB7CiAgICByZXR1cm4gdHlwZWZhY2UuYm9sZDsKICB9CiAgcmV0dXJuIHR5cGVmYWNlLnJlZ3VsYXI7Cn0KZnVuY3Rpb24gZm9udHNfZ2V0TWV0cmljcyh4ZmFGb250LCByZWFsID0gZmFsc2UpIHsKICBsZXQgcGRmRm9udCA9IG51bGw7CiAgaWYgKHhmYUZvbnQpIHsKICAgIGNvbnN0IG5hbWUgPSBzdHJpcFF1b3Rlcyh4ZmFGb250LnR5cGVmYWNlKTsKICAgIGNvbnN0IHR5cGVmYWNlID0geGZhRm9udFskZ2xvYmFsRGF0YV0uZm9udEZpbmRlci5maW5kKG5hbWUpOwogICAgcGRmRm9udCA9IHNlbGVjdEZvbnQoeGZhRm9udCwgdHlwZWZhY2UpOwogIH0KICBpZiAoIXBkZkZvbnQpIHsKICAgIHJldHVybiB7CiAgICAgIGxpbmVIZWlnaHQ6IDEyLAogICAgICBsaW5lR2FwOiAyLAogICAgICBsaW5lTm9HYXA6IDEwCiAgICB9OwogIH0KICBjb25zdCBzaXplID0geGZhRm9udC5zaXplIHx8IDEwOwogIGNvbnN0IGxpbmVIZWlnaHQgPSBwZGZGb250LmxpbmVIZWlnaHQgPyBNYXRoLm1heChyZWFsID8gMCA6IDEuMiwgcGRmRm9udC5saW5lSGVpZ2h0KSA6IDEuMjsKICBjb25zdCBsaW5lR2FwID0gcGRmRm9udC5saW5lR2FwID09PSB1bmRlZmluZWQgPyAwLjIgOiBwZGZGb250LmxpbmVHYXA7CiAgcmV0dXJuIHsKICAgIGxpbmVIZWlnaHQ6IGxpbmVIZWlnaHQgKiBzaXplLAogICAgbGluZUdhcDogbGluZUdhcCAqIHNpemUsCiAgICBsaW5lTm9HYXA6IE1hdGgubWF4KDEsIGxpbmVIZWlnaHQgLSBsaW5lR2FwKSAqIHNpemUKICB9Owp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvdGV4dC5qcwoKY29uc3QgV0lEVEhfRkFDVE9SID0gMS4wMjsKY2xhc3MgRm9udEluZm8gewogIGNvbnN0cnVjdG9yKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlcikgewogICAgdGhpcy5saW5lSGVpZ2h0ID0gbGluZUhlaWdodDsKICAgIHRoaXMucGFyYU1hcmdpbiA9IG1hcmdpbiB8fCB7CiAgICAgIHRvcDogMCwKICAgICAgYm90dG9tOiAwLAogICAgICBsZWZ0OiAwLAogICAgICByaWdodDogMAogICAgfTsKICAgIGlmICgheGZhRm9udCkgewogICAgICBbdGhpcy5wZGZGb250LCB0aGlzLnhmYUZvbnRdID0gdGhpcy5kZWZhdWx0Rm9udChmb250RmluZGVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy54ZmFGb250ID0gewogICAgICB0eXBlZmFjZTogeGZhRm9udC50eXBlZmFjZSwKICAgICAgcG9zdHVyZTogeGZhRm9udC5wb3N0dXJlLAogICAgICB3ZWlnaHQ6IHhmYUZvbnQud2VpZ2h0LAogICAgICBzaXplOiB4ZmFGb250LnNpemUsCiAgICAgIGxldHRlclNwYWNpbmc6IHhmYUZvbnQubGV0dGVyU3BhY2luZwogICAgfTsKICAgIGNvbnN0IHR5cGVmYWNlID0gZm9udEZpbmRlci5maW5kKHhmYUZvbnQudHlwZWZhY2UpOwogICAgaWYgKCF0eXBlZmFjZSkgewogICAgICBbdGhpcy5wZGZGb250LCB0aGlzLnhmYUZvbnRdID0gdGhpcy5kZWZhdWx0Rm9udChmb250RmluZGVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5wZGZGb250ID0gc2VsZWN0Rm9udCh4ZmFGb250LCB0eXBlZmFjZSk7CiAgICBpZiAoIXRoaXMucGRmRm9udCkgewogICAgICBbdGhpcy5wZGZGb250LCB0aGlzLnhmYUZvbnRdID0gdGhpcy5kZWZhdWx0Rm9udChmb250RmluZGVyKTsKICAgIH0KICB9CiAgZGVmYXVsdEZvbnQoZm9udEZpbmRlcikgewogICAgY29uc3QgZm9udCA9IGZvbnRGaW5kZXIuZmluZCgiSGVsdmV0aWNhIiwgZmFsc2UpIHx8IGZvbnRGaW5kZXIuZmluZCgiTXlyaWFkIFBybyIsIGZhbHNlKSB8fCBmb250RmluZGVyLmZpbmQoIkFyaWFsIiwgZmFsc2UpIHx8IGZvbnRGaW5kZXIuZ2V0RGVmYXVsdCgpOwogICAgaWYgKGZvbnQ/LnJlZ3VsYXIpIHsKICAgICAgY29uc3QgcGRmRm9udCA9IGZvbnQucmVndWxhcjsKICAgICAgY29uc3QgaW5mbyA9IHBkZkZvbnQuY3NzRm9udEluZm87CiAgICAgIGNvbnN0IHhmYUZvbnQgPSB7CiAgICAgICAgdHlwZWZhY2U6IGluZm8uZm9udEZhbWlseSwKICAgICAgICBwb3N0dXJlOiAibm9ybWFsIiwKICAgICAgICB3ZWlnaHQ6ICJub3JtYWwiLAogICAgICAgIHNpemU6IDEwLAogICAgICAgIGxldHRlclNwYWNpbmc6IDAKICAgICAgfTsKICAgICAgcmV0dXJuIFtwZGZGb250LCB4ZmFGb250XTsKICAgIH0KICAgIGNvbnN0IHhmYUZvbnQgPSB7CiAgICAgIHR5cGVmYWNlOiAiQ291cmllciIsCiAgICAgIHBvc3R1cmU6ICJub3JtYWwiLAogICAgICB3ZWlnaHQ6ICJub3JtYWwiLAogICAgICBzaXplOiAxMCwKICAgICAgbGV0dGVyU3BhY2luZzogMAogICAgfTsKICAgIHJldHVybiBbbnVsbCwgeGZhRm9udF07CiAgfQp9CmNsYXNzIEZvbnRTZWxlY3RvciB7CiAgY29uc3RydWN0b3IoZGVmYXVsdFhmYUZvbnQsIGRlZmF1bHRQYXJhTWFyZ2luLCBkZWZhdWx0TGluZUhlaWdodCwgZm9udEZpbmRlcikgewogICAgdGhpcy5mb250RmluZGVyID0gZm9udEZpbmRlcjsKICAgIHRoaXMuc3RhY2sgPSBbbmV3IEZvbnRJbmZvKGRlZmF1bHRYZmFGb250LCBkZWZhdWx0UGFyYU1hcmdpbiwgZGVmYXVsdExpbmVIZWlnaHQsIGZvbnRGaW5kZXIpXTsKICB9CiAgcHVzaERhdGEoeGZhRm9udCwgbWFyZ2luLCBsaW5lSGVpZ2h0KSB7CiAgICBjb25zdCBsYXN0Rm9udCA9IHRoaXMuc3RhY2suYXQoLTEpOwogICAgZm9yIChjb25zdCBuYW1lIG9mIFsidHlwZWZhY2UiLCAicG9zdHVyZSIsICJ3ZWlnaHQiLCAic2l6ZSIsICJsZXR0ZXJTcGFjaW5nIl0pIHsKICAgICAgaWYgKCF4ZmFGb250W25hbWVdKSB7CiAgICAgICAgeGZhRm9udFtuYW1lXSA9IGxhc3RGb250LnhmYUZvbnRbbmFtZV07CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBbInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCJdKSB7CiAgICAgIGlmIChpc05hTihtYXJnaW5bbmFtZV0pKSB7CiAgICAgICAgbWFyZ2luW25hbWVdID0gbGFzdEZvbnQucGFyYU1hcmdpbltuYW1lXTsKICAgICAgfQogICAgfQogICAgY29uc3QgZm9udEluZm8gPSBuZXcgRm9udEluZm8oeGZhRm9udCwgbWFyZ2luLCBsaW5lSGVpZ2h0IHx8IGxhc3RGb250LmxpbmVIZWlnaHQsIHRoaXMuZm9udEZpbmRlcik7CiAgICBpZiAoIWZvbnRJbmZvLnBkZkZvbnQpIHsKICAgICAgZm9udEluZm8ucGRmRm9udCA9IGxhc3RGb250LnBkZkZvbnQ7CiAgICB9CiAgICB0aGlzLnN0YWNrLnB1c2goZm9udEluZm8pOwogIH0KICBwb3BGb250KCkgewogICAgdGhpcy5zdGFjay5wb3AoKTsKICB9CiAgdG9wRm9udCgpIHsKICAgIHJldHVybiB0aGlzLnN0YWNrLmF0KC0xKTsKICB9Cn0KY2xhc3MgVGV4dE1lYXN1cmUgewogIGNvbnN0cnVjdG9yKGRlZmF1bHRYZmFGb250LCBkZWZhdWx0UGFyYU1hcmdpbiwgZGVmYXVsdExpbmVIZWlnaHQsIGZvbnRzKSB7CiAgICB0aGlzLmdseXBocyA9IFtdOwogICAgdGhpcy5mb250U2VsZWN0b3IgPSBuZXcgRm9udFNlbGVjdG9yKGRlZmF1bHRYZmFGb250LCBkZWZhdWx0UGFyYU1hcmdpbiwgZGVmYXVsdExpbmVIZWlnaHQsIGZvbnRzKTsKICAgIHRoaXMuZXh0cmFIZWlnaHQgPSAwOwogIH0KICBwdXNoRGF0YSh4ZmFGb250LCBtYXJnaW4sIGxpbmVIZWlnaHQpIHsKICAgIHRoaXMuZm9udFNlbGVjdG9yLnB1c2hEYXRhKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCk7CiAgfQogIHBvcEZvbnQoeGZhRm9udCkgewogICAgcmV0dXJuIHRoaXMuZm9udFNlbGVjdG9yLnBvcEZvbnQoKTsKICB9CiAgYWRkUGFyYSgpIHsKICAgIGNvbnN0IGxhc3RGb250ID0gdGhpcy5mb250U2VsZWN0b3IudG9wRm9udCgpOwogICAgdGhpcy5leHRyYUhlaWdodCArPSBsYXN0Rm9udC5wYXJhTWFyZ2luLnRvcCArIGxhc3RGb250LnBhcmFNYXJnaW4uYm90dG9tOwogIH0KICBhZGRTdHJpbmcoc3RyKSB7CiAgICBpZiAoIXN0cikgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBsYXN0Rm9udCA9IHRoaXMuZm9udFNlbGVjdG9yLnRvcEZvbnQoKTsKICAgIGNvbnN0IGZvbnRTaXplID0gbGFzdEZvbnQueGZhRm9udC5zaXplOwogICAgaWYgKGxhc3RGb250LnBkZkZvbnQpIHsKICAgICAgY29uc3QgbGV0dGVyU3BhY2luZyA9IGxhc3RGb250LnhmYUZvbnQubGV0dGVyU3BhY2luZzsKICAgICAgY29uc3QgcGRmRm9udCA9IGxhc3RGb250LnBkZkZvbnQ7CiAgICAgIGNvbnN0IGZvbnRMaW5lSGVpZ2h0ID0gcGRmRm9udC5saW5lSGVpZ2h0IHx8IDEuMjsKICAgICAgY29uc3QgbGluZUhlaWdodCA9IGxhc3RGb250LmxpbmVIZWlnaHQgfHwgTWF0aC5tYXgoMS4yLCBmb250TGluZUhlaWdodCkgKiBmb250U2l6ZTsKICAgICAgY29uc3QgbGluZUdhcCA9IHBkZkZvbnQubGluZUdhcCA9PT0gdW5kZWZpbmVkID8gMC4yIDogcGRmRm9udC5saW5lR2FwOwogICAgICBjb25zdCBub0dhcCA9IGZvbnRMaW5lSGVpZ2h0IC0gbGluZUdhcDsKICAgICAgY29uc3QgZmlyc3RMaW5lSGVpZ2h0ID0gTWF0aC5tYXgoMSwgbm9HYXApICogZm9udFNpemU7CiAgICAgIGNvbnN0IHNjYWxlID0gZm9udFNpemUgLyAxMDAwOwogICAgICBjb25zdCBmYWxsYmFja1dpZHRoID0gcGRmRm9udC5kZWZhdWx0V2lkdGggfHwgcGRmRm9udC5jaGFyc1RvR2x5cGhzKCIgIilbMF0ud2lkdGg7CiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBzdHIuc3BsaXQoL1tcdTIwMjlcbl0vKSkgewogICAgICAgIGNvbnN0IGVuY29kZWRMaW5lID0gcGRmRm9udC5lbmNvZGVTdHJpbmcobGluZSkuam9pbigiIik7CiAgICAgICAgY29uc3QgZ2x5cGhzID0gcGRmRm9udC5jaGFyc1RvR2x5cGhzKGVuY29kZWRMaW5lKTsKICAgICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykgewogICAgICAgICAgY29uc3Qgd2lkdGggPSBnbHlwaC53aWR0aCB8fCBmYWxsYmFja1dpZHRoOwogICAgICAgICAgdGhpcy5nbHlwaHMucHVzaChbd2lkdGggKiBzY2FsZSArIGxldHRlclNwYWNpbmcsIGxpbmVIZWlnaHQsIGZpcnN0TGluZUhlaWdodCwgZ2x5cGgudW5pY29kZSwgZmFsc2VdKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5nbHlwaHMucHVzaChbMCwgMCwgMCwgIlxuIiwgdHJ1ZV0pOwogICAgICB9CiAgICAgIHRoaXMuZ2x5cGhzLnBvcCgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyLnNwbGl0KC9bXHUyMDI5XG5dLykpIHsKICAgICAgZm9yIChjb25zdCBjaGFyIG9mIGxpbmUuc3BsaXQoIiIpKSB7CiAgICAgICAgdGhpcy5nbHlwaHMucHVzaChbZm9udFNpemUsIDEuMiAqIGZvbnRTaXplLCBmb250U2l6ZSwgY2hhciwgZmFsc2VdKTsKICAgICAgfQogICAgICB0aGlzLmdseXBocy5wdXNoKFswLCAwLCAwLCAiXG4iLCB0cnVlXSk7CiAgICB9CiAgICB0aGlzLmdseXBocy5wb3AoKTsKICB9CiAgY29tcHV0ZShtYXhXaWR0aCkgewogICAgbGV0IGxhc3RTcGFjZVBvcyA9IC0xLAogICAgICBsYXN0U3BhY2VXaWR0aCA9IDAsCiAgICAgIHdpZHRoID0gMCwKICAgICAgaGVpZ2h0ID0gMCwKICAgICAgY3VycmVudExpbmVXaWR0aCA9IDAsCiAgICAgIGN1cnJlbnRMaW5lSGVpZ2h0ID0gMDsKICAgIGxldCBpc0Jyb2tlbiA9IGZhbHNlOwogICAgbGV0IGlzRmlyc3RMaW5lID0gdHJ1ZTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgW2dseXBoV2lkdGgsIGxpbmVIZWlnaHQsIGZpcnN0TGluZUhlaWdodCwgY2hhciwgaXNFT0xdID0gdGhpcy5nbHlwaHNbaV07CiAgICAgIGNvbnN0IGlzU3BhY2UgPSBjaGFyID09PSAiICI7CiAgICAgIGNvbnN0IGdseXBoSGVpZ2h0ID0gaXNGaXJzdExpbmUgPyBmaXJzdExpbmVIZWlnaHQgOiBsaW5lSGVpZ2h0OwogICAgICBpZiAoaXNFT0wpIHsKICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjdXJyZW50TGluZVdpZHRoKTsKICAgICAgICBjdXJyZW50TGluZVdpZHRoID0gMDsKICAgICAgICBoZWlnaHQgKz0gY3VycmVudExpbmVIZWlnaHQ7CiAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBnbHlwaEhlaWdodDsKICAgICAgICBsYXN0U3BhY2VQb3MgPSAtMTsKICAgICAgICBsYXN0U3BhY2VXaWR0aCA9IDA7CiAgICAgICAgaXNGaXJzdExpbmUgPSBmYWxzZTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoaXNTcGFjZSkgewogICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoICsgZ2x5cGhXaWR0aCA+IG1heFdpZHRoKSB7CiAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjdXJyZW50TGluZVdpZHRoKTsKICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGggPSAwOwogICAgICAgICAgaGVpZ2h0ICs9IGN1cnJlbnRMaW5lSGVpZ2h0OwogICAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBnbHlwaEhlaWdodDsKICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IC0xOwogICAgICAgICAgbGFzdFNwYWNlV2lkdGggPSAwOwogICAgICAgICAgaXNCcm9rZW4gPSB0cnVlOwogICAgICAgICAgaXNGaXJzdExpbmUgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBNYXRoLm1heChnbHlwaEhlaWdodCwgY3VycmVudExpbmVIZWlnaHQpOwogICAgICAgICAgbGFzdFNwYWNlV2lkdGggPSBjdXJyZW50TGluZVdpZHRoOwogICAgICAgICAgY3VycmVudExpbmVXaWR0aCArPSBnbHlwaFdpZHRoOwogICAgICAgICAgbGFzdFNwYWNlUG9zID0gaTsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGggKyBnbHlwaFdpZHRoID4gbWF4V2lkdGgpIHsKICAgICAgICBoZWlnaHQgKz0gY3VycmVudExpbmVIZWlnaHQ7CiAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBnbHlwaEhlaWdodDsKICAgICAgICBpZiAobGFzdFNwYWNlUG9zICE9PSAtMSkgewogICAgICAgICAgaSA9IGxhc3RTcGFjZVBvczsKICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGxhc3RTcGFjZVdpZHRoKTsKICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGggPSAwOwogICAgICAgICAgbGFzdFNwYWNlUG9zID0gLTE7CiAgICAgICAgICBsYXN0U3BhY2VXaWR0aCA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGN1cnJlbnRMaW5lV2lkdGgpOwogICAgICAgICAgY3VycmVudExpbmVXaWR0aCA9IGdseXBoV2lkdGg7CiAgICAgICAgfQogICAgICAgIGlzQnJva2VuID0gdHJ1ZTsKICAgICAgICBpc0ZpcnN0TGluZSA9IGZhbHNlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGN1cnJlbnRMaW5lV2lkdGggKz0gZ2x5cGhXaWR0aDsKICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBNYXRoLm1heChnbHlwaEhlaWdodCwgY3VycmVudExpbmVIZWlnaHQpOwogICAgfQogICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY3VycmVudExpbmVXaWR0aCk7CiAgICBoZWlnaHQgKz0gY3VycmVudExpbmVIZWlnaHQgKyB0aGlzLmV4dHJhSGVpZ2h0OwogICAgcmV0dXJuIHsKICAgICAgd2lkdGg6IFdJRFRIX0ZBQ1RPUiAqIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGlzQnJva2VuCiAgICB9OwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL3NvbS5qcwoKCmNvbnN0IG5hbWVQYXR0ZXJuID0gL15bXi5bXSsvOwpjb25zdCBpbmRleFBhdHRlcm4gPSAvXlteXF1dKy87CmNvbnN0IG9wZXJhdG9ycyA9IHsKICBkb3Q6IDAsCiAgZG90RG90OiAxLAogIGRvdEhhc2g6IDIsCiAgZG90QnJhY2tldDogMywKICBkb3RQYXJlbjogNAp9Owpjb25zdCBzaG9ydGN1dHMgPSBuZXcgTWFwKFtbIiRkYXRhIiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3QuZGF0YXNldHMgPyByb290LmRhdGFzZXRzLmRhdGEgOiByb290XSwgWyIkcmVjb3JkIiwgKHJvb3QsIGN1cnJlbnQpID0+IChyb290LmRhdGFzZXRzID8gcm9vdC5kYXRhc2V0cy5kYXRhIDogcm9vdClbJGdldENoaWxkcmVuXSgpWzBdXSwgWyIkdGVtcGxhdGUiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC50ZW1wbGF0ZV0sIFsiJGNvbm5lY3Rpb25TZXQiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5jb25uZWN0aW9uU2V0XSwgWyIkZm9ybSIsIChyb290LCBjdXJyZW50KSA9PiByb290LmZvcm1dLCBbIiRsYXlvdXQiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5sYXlvdXRdLCBbIiRob3N0IiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3QuaG9zdF0sIFsiJGRhdGFXaW5kb3ciLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5kYXRhV2luZG93XSwgWyIkZXZlbnQiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5ldmVudF0sIFsiISIsIChyb290LCBjdXJyZW50KSA9PiByb290LmRhdGFzZXRzXSwgWyIkeGZhIiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3RdLCBbInhmYSIsIChyb290LCBjdXJyZW50KSA9PiByb290XSwgWyIkIiwgKHJvb3QsIGN1cnJlbnQpID0+IGN1cnJlbnRdXSk7CmNvbnN0IHNvbUNhY2hlID0gbmV3IFdlYWtNYXAoKTsKZnVuY3Rpb24gcGFyc2VJbmRleChpbmRleCkgewogIGluZGV4ID0gaW5kZXgudHJpbSgpOwogIGlmIChpbmRleCA9PT0gIioiKSB7CiAgICByZXR1cm4gSW5maW5pdHk7CiAgfQogIHJldHVybiBwYXJzZUludChpbmRleCwgMTApIHx8IDA7Cn0KZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHIsIGRvdERvdEFsbG93ZWQsIG5vRXhwciA9IHRydWUpIHsKICBsZXQgbWF0Y2ggPSBleHByLm1hdGNoKG5hbWVQYXR0ZXJuKTsKICBpZiAoIW1hdGNoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgbGV0IFtuYW1lXSA9IG1hdGNoOwogIGNvbnN0IHBhcnNlZCA9IFt7CiAgICBuYW1lLAogICAgY2FjaGVOYW1lOiAiLiIgKyBuYW1lLAogICAgaW5kZXg6IDAsCiAgICBqczogbnVsbCwKICAgIGZvcm1DYWxjOiBudWxsLAogICAgb3BlcmF0b3I6IG9wZXJhdG9ycy5kb3QKICB9XTsKICBsZXQgcG9zID0gbmFtZS5sZW5ndGg7CiAgd2hpbGUgKHBvcyA8IGV4cHIubGVuZ3RoKSB7CiAgICBjb25zdCBzcG9zID0gcG9zOwogICAgY29uc3QgY2hhciA9IGV4cHIuY2hhckF0KHBvcysrKTsKICAgIGlmIChjaGFyID09PSAiWyIpIHsKICAgICAgbWF0Y2ggPSBleHByLnNsaWNlKHBvcykubWF0Y2goaW5kZXhQYXR0ZXJuKTsKICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgIHdhcm4oIlhGQSAtIEludmFsaWQgaW5kZXggaW4gU09NIGV4cHJlc3Npb24iKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBwYXJzZWQuYXQoLTEpLmluZGV4ID0gcGFyc2VJbmRleChtYXRjaFswXSk7CiAgICAgIHBvcyArPSBtYXRjaFswXS5sZW5ndGggKyAxOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGxldCBvcGVyYXRvcjsKICAgIHN3aXRjaCAoZXhwci5jaGFyQXQocG9zKSkgewogICAgICBjYXNlICIuIjoKICAgICAgICBpZiAoIWRvdERvdEFsbG93ZWQpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBwb3MrKzsKICAgICAgICBvcGVyYXRvciA9IG9wZXJhdG9ycy5kb3REb3Q7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIiMiOgogICAgICAgIHBvcysrOwogICAgICAgIG9wZXJhdG9yID0gb3BlcmF0b3JzLmRvdEhhc2g7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIlsiOgogICAgICAgIGlmIChub0V4cHIpIHsKICAgICAgICAgIHdhcm4oIlhGQSAtIFNPTSBleHByZXNzaW9uIGNvbnRhaW5zIGEgRm9ybUNhbGMgc3ViZXhwcmVzc2lvbiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGZvciBub3cuIik7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgb3BlcmF0b3IgPSBvcGVyYXRvcnMuZG90QnJhY2tldDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiKCI6CiAgICAgICAgaWYgKG5vRXhwcikgewogICAgICAgICAgd2FybigiWEZBIC0gU09NIGV4cHJlc3Npb24gY29udGFpbnMgYSBKYXZhU2NyaXB0IHN1YmV4cHJlc3Npb24gd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBmb3Igbm93LiIpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIG9wZXJhdG9yID0gb3BlcmF0b3JzLmRvdFBhcmVuOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIG9wZXJhdG9yID0gb3BlcmF0b3JzLmRvdDsKICAgICAgICBicmVhazsKICAgIH0KICAgIG1hdGNoID0gZXhwci5zbGljZShwb3MpLm1hdGNoKG5hbWVQYXR0ZXJuKTsKICAgIGlmICghbWF0Y2gpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBbbmFtZV0gPSBtYXRjaDsKICAgIHBvcyArPSBuYW1lLmxlbmd0aDsKICAgIHBhcnNlZC5wdXNoKHsKICAgICAgbmFtZSwKICAgICAgY2FjaGVOYW1lOiBleHByLnNsaWNlKHNwb3MsIHBvcyksCiAgICAgIG9wZXJhdG9yLAogICAgICBpbmRleDogMCwKICAgICAganM6IG51bGwsCiAgICAgIGZvcm1DYWxjOiBudWxsCiAgICB9KTsKICB9CiAgcmV0dXJuIHBhcnNlZDsKfQpmdW5jdGlvbiBzZWFyY2hOb2RlKHJvb3QsIGNvbnRhaW5lciwgZXhwciwgZG90RG90QWxsb3dlZCA9IHRydWUsIHVzZUNhY2hlID0gdHJ1ZSkgewogIGNvbnN0IHBhcnNlZCA9IHBhcnNlRXhwcmVzc2lvbihleHByLCBkb3REb3RBbGxvd2VkKTsKICBpZiAoIXBhcnNlZCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGNvbnN0IGZuID0gc2hvcnRjdXRzLmdldChwYXJzZWRbMF0ubmFtZSk7CiAgbGV0IGkgPSAwOwogIGxldCBpc1F1YWxpZmllZDsKICBpZiAoZm4pIHsKICAgIGlzUXVhbGlmaWVkID0gdHJ1ZTsKICAgIHJvb3QgPSBbZm4ocm9vdCwgY29udGFpbmVyKV07CiAgICBpID0gMTsKICB9IGVsc2UgewogICAgaXNRdWFsaWZpZWQgPSBjb250YWluZXIgPT09IG51bGw7CiAgICByb290ID0gW2NvbnRhaW5lciB8fCByb290XTsKICB9CiAgZm9yIChsZXQgaWkgPSBwYXJzZWQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgewogICAgICBuYW1lLAogICAgICBjYWNoZU5hbWUsCiAgICAgIG9wZXJhdG9yLAogICAgICBpbmRleAogICAgfSA9IHBhcnNlZFtpXTsKICAgIGNvbnN0IG5vZGVzID0gW107CiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygcm9vdCkgewogICAgICBpZiAoIW5vZGUuaXNYRkFPYmplY3QpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgY2hpbGRyZW4sIGNhY2hlZDsKICAgICAgaWYgKHVzZUNhY2hlKSB7CiAgICAgICAgY2FjaGVkID0gc29tQ2FjaGUuZ2V0KG5vZGUpOwogICAgICAgIGlmICghY2FjaGVkKSB7CiAgICAgICAgICBjYWNoZWQgPSBuZXcgTWFwKCk7CiAgICAgICAgICBzb21DYWNoZS5zZXQobm9kZSwgY2FjaGVkKTsKICAgICAgICB9CiAgICAgICAgY2hpbGRyZW4gPSBjYWNoZWQuZ2V0KGNhY2hlTmFtZSk7CiAgICAgIH0KICAgICAgaWYgKCFjaGlsZHJlbikgewogICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHsKICAgICAgICAgIGNhc2Ugb3BlcmF0b3JzLmRvdDoKICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlWyRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgZmFsc2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2Ugb3BlcmF0b3JzLmRvdERvdDoKICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlWyRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBvcGVyYXRvcnMuZG90SGFzaDoKICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlWyRnZXRDaGlsZHJlbkJ5Q2xhc3NdKG5hbWUpOwogICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmlzWEZBT2JqZWN0QXJyYXkgPyBjaGlsZHJlbi5jaGlsZHJlbiA6IFtjaGlsZHJlbl07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh1c2VDYWNoZSkgewogICAgICAgICAgY2FjaGVkLnNldChjYWNoZU5hbWUsIGNoaWxkcmVuKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuKTsKICAgICAgfQogICAgfQogICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMCAmJiAhaXNRdWFsaWZpZWQgJiYgaSA9PT0gMCkgewogICAgICBjb25zdCBwYXJlbnQgPSBjb250YWluZXJbJGdldFBhcmVudF0oKTsKICAgICAgY29udGFpbmVyID0gcGFyZW50OwogICAgICBpZiAoIWNvbnRhaW5lcikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGkgPSAtMTsKICAgICAgcm9vdCA9IFtjb250YWluZXJdOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIHJvb3QgPSBpc0Zpbml0ZShpbmRleCkgPyBub2Rlcy5maWx0ZXIobm9kZSA9PiBpbmRleCA8IG5vZGUubGVuZ3RoKS5tYXAobm9kZSA9PiBub2RlW2luZGV4XSkgOiBub2Rlcy5mbGF0KCk7CiAgfQogIGlmIChyb290Lmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiByb290Owp9CmZ1bmN0aW9uIGNyZWF0ZURhdGFOb2RlKHJvb3QsIGNvbnRhaW5lciwgZXhwcikgewogIGNvbnN0IHBhcnNlZCA9IHBhcnNlRXhwcmVzc2lvbihleHByKTsKICBpZiAoIXBhcnNlZCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGlmIChwYXJzZWQuc29tZSh4ID0+IHgub3BlcmF0b3IgPT09IG9wZXJhdG9ycy5kb3REb3QpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgZm4gPSBzaG9ydGN1dHMuZ2V0KHBhcnNlZFswXS5uYW1lKTsKICBsZXQgaSA9IDA7CiAgaWYgKGZuKSB7CiAgICByb290ID0gZm4ocm9vdCwgY29udGFpbmVyKTsKICAgIGkgPSAxOwogIH0gZWxzZSB7CiAgICByb290ID0gY29udGFpbmVyIHx8IHJvb3Q7CiAgfQogIGZvciAobGV0IGlpID0gcGFyc2VkLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHsKICAgICAgbmFtZSwKICAgICAgb3BlcmF0b3IsCiAgICAgIGluZGV4CiAgICB9ID0gcGFyc2VkW2ldOwogICAgaWYgKCFpc0Zpbml0ZShpbmRleCkpIHsKICAgICAgcGFyc2VkW2ldLmluZGV4ID0gMDsKICAgICAgcmV0dXJuIHJvb3QuY3JlYXRlTm9kZXMocGFyc2VkLnNsaWNlKGkpKTsKICAgIH0KICAgIGxldCBjaGlsZHJlbjsKICAgIHN3aXRjaCAob3BlcmF0b3IpIHsKICAgICAgY2FzZSBvcGVyYXRvcnMuZG90OgogICAgICAgIGNoaWxkcmVuID0gcm9vdFskZ2V0Q2hpbGRyZW5CeU5hbWVdKG5hbWUsIGZhbHNlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBvcGVyYXRvcnMuZG90RG90OgogICAgICAgIGNoaWxkcmVuID0gcm9vdFskZ2V0Q2hpbGRyZW5CeU5hbWVdKG5hbWUsIHRydWUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIG9wZXJhdG9ycy5kb3RIYXNoOgogICAgICAgIGNoaWxkcmVuID0gcm9vdFskZ2V0Q2hpbGRyZW5CeUNsYXNzXShuYW1lKTsKICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmlzWEZBT2JqZWN0QXJyYXkgPyBjaGlsZHJlbi5jaGlsZHJlbiA6IFtjaGlsZHJlbl07CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiByb290LmNyZWF0ZU5vZGVzKHBhcnNlZC5zbGljZShpKSk7CiAgICB9CiAgICBpZiAoaW5kZXggPCBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpbmRleF07CiAgICAgIGlmICghY2hpbGQuaXNYRkFPYmplY3QpIHsKICAgICAgICB3YXJuKGBYRkEgLSBDYW5ub3QgY3JlYXRlIGEgbm9kZS5gKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICByb290ID0gY2hpbGQ7CiAgICB9IGVsc2UgewogICAgICBwYXJzZWRbaV0uaW5kZXggPSBpbmRleCAtIGNoaWxkcmVuLmxlbmd0aDsKICAgICAgcmV0dXJuIHJvb3QuY3JlYXRlTm9kZXMocGFyc2VkLnNsaWNlKGkpKTsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS94ZmFfb2JqZWN0LmpzCgoKCgoKCmNvbnN0IF9hcHBseVByb3RvdHlwZSA9IFN5bWJvbCgpOwpjb25zdCBfYXR0cmlidXRlcyA9IFN5bWJvbCgpOwpjb25zdCBfYXR0cmlidXRlTmFtZXMgPSBTeW1ib2woKTsKY29uc3QgX2NoaWxkcmVuID0gU3ltYm9sKCJfY2hpbGRyZW4iKTsKY29uc3QgX2Nsb25lQXR0cmlidXRlID0gU3ltYm9sKCk7CmNvbnN0IF9kYXRhVmFsdWUgPSBTeW1ib2woKTsKY29uc3QgX2RlZmF1bHRWYWx1ZSA9IFN5bWJvbCgpOwpjb25zdCBfZmlsdGVyZWRDaGlsZHJlbkdlbmVyYXRvciA9IFN5bWJvbCgpOwpjb25zdCBfZ2V0UHJvdG90eXBlID0gU3ltYm9sKCk7CmNvbnN0IF9nZXRVbnNldEF0dHJpYnV0ZXMgPSBTeW1ib2woKTsKY29uc3QgX2hhc0NoaWxkcmVuID0gU3ltYm9sKCk7CmNvbnN0IF9tYXggPSBTeW1ib2woKTsKY29uc3QgX29wdGlvbnMgPSBTeW1ib2woKTsKY29uc3QgX3BhcmVudCA9IFN5bWJvbCgicGFyZW50Iik7CmNvbnN0IF9yZXNvbHZlUHJvdG90eXBlc0hlbHBlciA9IFN5bWJvbCgpOwpjb25zdCBfc2V0QXR0cmlidXRlcyA9IFN5bWJvbCgpOwpjb25zdCBfdmFsaWRhdG9yID0gU3ltYm9sKCk7CmxldCB1aWQgPSAwOwpjb25zdCBOU19EQVRBU0VUUyA9IE5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZDsKY2xhc3MgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3Rvcihuc0lkLCBuYW1lLCBoYXNDaGlsZHJlbiA9IGZhbHNlKSB7CiAgICB0aGlzWyRuYW1lc3BhY2VJZF0gPSBuc0lkOwogICAgdGhpc1skbm9kZU5hbWVdID0gbmFtZTsKICAgIHRoaXNbX2hhc0NoaWxkcmVuXSA9IGhhc0NoaWxkcmVuOwogICAgdGhpc1tfcGFyZW50XSA9IG51bGw7CiAgICB0aGlzW19jaGlsZHJlbl0gPSBbXTsKICAgIHRoaXNbJHVpZF0gPSBgJHtuYW1lfSR7dWlkKyt9YDsKICAgIHRoaXNbJGdsb2JhbERhdGFdID0gbnVsbDsKICB9CiAgZ2V0IGlzWEZBT2JqZWN0KCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGdldCBpc1hGQU9iamVjdEFycmF5KCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjcmVhdGVOb2RlcyhwYXRoKSB7CiAgICBsZXQgcm9vdCA9IHRoaXMsCiAgICAgIG5vZGUgPSBudWxsOwogICAgZm9yIChjb25zdCB7CiAgICAgIG5hbWUsCiAgICAgIGluZGV4CiAgICB9IG9mIHBhdGgpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaXNGaW5pdGUoaW5kZXgpID8gaW5kZXggOiAwOyBpIDw9IGlpOyBpKyspIHsKICAgICAgICBjb25zdCBuc0lkID0gcm9vdFskbmFtZXNwYWNlSWRdID09PSBOU19EQVRBU0VUUyA/IC0xIDogcm9vdFskbmFtZXNwYWNlSWRdOwogICAgICAgIG5vZGUgPSBuZXcgWG1sT2JqZWN0KG5zSWQsIG5hbWUpOwogICAgICAgIHJvb3RbJGFwcGVuZENoaWxkXShub2RlKTsKICAgICAgfQogICAgICByb290ID0gbm9kZTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KICBbJG9uQ2hpbGRdKGNoaWxkKSB7CiAgICBpZiAoIXRoaXNbX2hhc0NoaWxkcmVuXSB8fCAhdGhpc1skb25DaGlsZENoZWNrXShjaGlsZCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgbmFtZSA9IGNoaWxkWyRub2RlTmFtZV07CiAgICBjb25zdCBub2RlID0gdGhpc1tuYW1lXTsKICAgIGlmIChub2RlIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpIHsKICAgICAgaWYgKG5vZGUucHVzaChjaGlsZCkpIHsKICAgICAgICB0aGlzWyRhcHBlbmRDaGlsZF0oY2hpbGQpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAobm9kZSAhPT0gbnVsbCkgewogICAgICAgIHRoaXNbJHJlbW92ZUNoaWxkXShub2RlKTsKICAgICAgfQogICAgICB0aGlzW25hbWVdID0gY2hpbGQ7CiAgICAgIHRoaXNbJGFwcGVuZENoaWxkXShjaGlsZCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgbGV0IGlkID0gIiI7CiAgICBpZiAodGhpcy5pZCkgewogICAgICBpZCA9IGAgKGlkOiAke3RoaXMuaWR9KWA7CiAgICB9IGVsc2UgaWYgKHRoaXMubmFtZSkgewogICAgICBpZCA9IGAgKG5hbWU6ICR7dGhpcy5uYW1lfSAke3RoaXMuaC52YWx1ZX0pYDsKICAgIH0KICAgIHdhcm4oYFhGQSAtIG5vZGUgIiR7dGhpc1skbm9kZU5hbWVdfSIke2lkfSBoYXMgYWxyZWFkeSBlbm91Z2ggIiR7bmFtZX0iIWApOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJG9uQ2hpbGRDaGVja10oY2hpbGQpIHsKICAgIHJldHVybiB0aGlzLmhhc093blByb3BlcnR5KGNoaWxkWyRub2RlTmFtZV0pICYmIGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IHRoaXNbJG5hbWVzcGFjZUlkXTsKICB9CiAgWyRpc05zQWdub3N0aWNdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJGFjY2VwdFdoaXRlc3BhY2VdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJGlzQ0RBVEFYbWxdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJHBvcFBhcmFdKCkgewogICAgaWYgKHRoaXMucGFyYSkgewogICAgICB0aGlzWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5wYXJhU3RhY2sucG9wKCk7CiAgICB9CiAgfQogIFskcHVzaFBhcmFdKCkgewogICAgdGhpc1skZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ucGFyYVN0YWNrLnB1c2godGhpcy5wYXJhKTsKICB9CiAgWyRzZXRJZF0oaWRzKSB7CiAgICBpZiAodGhpcy5pZCAmJiB0aGlzWyRuYW1lc3BhY2VJZF0gPT09IE5hbWVzcGFjZUlkcy50ZW1wbGF0ZS5pZCkgewogICAgICBpZHMuc2V0KHRoaXMuaWQsIHRoaXMpOwogICAgfQogIH0KICBbJGdldFRlbXBsYXRlUm9vdF0oKSB7CiAgICByZXR1cm4gdGhpc1skZ2xvYmFsRGF0YV0udGVtcGxhdGU7CiAgfQogIFskaXNTcGxpdHRhYmxlXSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRpc1RoZXJlTW9yZVdpZHRoXSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRhcHBlbmRDaGlsZF0oY2hpbGQpIHsKICAgIGNoaWxkW19wYXJlbnRdID0gdGhpczsKICAgIHRoaXNbX2NoaWxkcmVuXS5wdXNoKGNoaWxkKTsKICAgIGlmICghY2hpbGRbJGdsb2JhbERhdGFdICYmIHRoaXNbJGdsb2JhbERhdGFdKSB7CiAgICAgIGNoaWxkWyRnbG9iYWxEYXRhXSA9IHRoaXNbJGdsb2JhbERhdGFdOwogICAgfQogIH0KICBbJHJlbW92ZUNoaWxkXShjaGlsZCkgewogICAgY29uc3QgaSA9IHRoaXNbX2NoaWxkcmVuXS5pbmRleE9mKGNoaWxkKTsKICAgIHRoaXNbX2NoaWxkcmVuXS5zcGxpY2UoaSwgMSk7CiAgfQogIFskaGFzU2V0dGFibGVWYWx1ZV0oKSB7CiAgICByZXR1cm4gdGhpcy5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKTsKICB9CiAgWyRzZXRWYWx1ZV0oXykge30KICBbJG9uVGV4dF0oXykge30KICBbJGZpbmFsaXplXSgpIHt9CiAgWyRjbGVhbl0oYnVpbGRlcikgewogICAgZGVsZXRlIHRoaXNbX2hhc0NoaWxkcmVuXTsKICAgIGlmICh0aGlzWyRjbGVhbnVwXSkgewogICAgICBidWlsZGVyLmNsZWFuKHRoaXNbJGNsZWFudXBdKTsKICAgICAgZGVsZXRlIHRoaXNbJGNsZWFudXBdOwogICAgfQogIH0KICBbJGluZGV4T2ZdKGNoaWxkKSB7CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmluZGV4T2YoY2hpbGQpOwogIH0KICBbJGluc2VydEF0XShpLCBjaGlsZCkgewogICAgY2hpbGRbX3BhcmVudF0gPSB0aGlzOwogICAgdGhpc1tfY2hpbGRyZW5dLnNwbGljZShpLCAwLCBjaGlsZCk7CiAgICBpZiAoIWNoaWxkWyRnbG9iYWxEYXRhXSAmJiB0aGlzWyRnbG9iYWxEYXRhXSkgewogICAgICBjaGlsZFskZ2xvYmFsRGF0YV0gPSB0aGlzWyRnbG9iYWxEYXRhXTsKICAgIH0KICB9CiAgWyRpc1RyYW5zcGFyZW50XSgpIHsKICAgIHJldHVybiAhdGhpcy5uYW1lOwogIH0KICBbJGxhc3RBdHRyaWJ1dGVdKCkgewogICAgcmV0dXJuICIiOwogIH0KICBbJHRleHRdKCkgewogICAgaWYgKHRoaXNbX2NoaWxkcmVuXS5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdOwogICAgfQogICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXS5tYXAoYyA9PiBjWyR0ZXh0XSgpKS5qb2luKCIiKTsKICB9CiAgZ2V0IFtfYXR0cmlidXRlTmFtZXNdKCkgewogICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7CiAgICBpZiAoIXByb3RvLl9hdHRyaWJ1dGVzKSB7CiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwcm90by5fYXR0cmlidXRlcyA9IG5ldyBTZXQoKTsKICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7CiAgICAgICAgaWYgKHRoaXNbbmFtZV0gPT09IG51bGwgfHwgdGhpc1tuYW1lXSBpbnN0YW5jZW9mIFhGQU9iamVjdCB8fCB0aGlzW25hbWVdIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBhdHRyaWJ1dGVzLmFkZChuYW1lKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBfYXR0cmlidXRlTmFtZXMsIHByb3RvLl9hdHRyaWJ1dGVzKTsKICB9CiAgWyRpc0Rlc2NlbmRlbnRdKHBhcmVudCkgewogICAgbGV0IG5vZGUgPSB0aGlzOwogICAgd2hpbGUgKG5vZGUpIHsKICAgICAgaWYgKG5vZGUgPT09IHBhcmVudCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIG5vZGUgPSBub2RlWyRnZXRQYXJlbnRdKCk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIFskZ2V0UGFyZW50XSgpIHsKICAgIHJldHVybiB0aGlzW19wYXJlbnRdOwogIH0KICBbJGdldFN1YmZvcm1QYXJlbnRdKCkgewogICAgcmV0dXJuIHRoaXNbJGdldFBhcmVudF0oKTsKICB9CiAgWyRnZXRDaGlsZHJlbl0obmFtZSA9IG51bGwpIHsKICAgIGlmICghbmFtZSkgewogICAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dOwogICAgfQogICAgcmV0dXJuIHRoaXNbbmFtZV07CiAgfQogIFskZHVtcF0oKSB7CiAgICBjb25zdCBkdW1wZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKHRoaXNbJGNvbnRlbnRdKSB7CiAgICAgIGR1bXBlZC4kY29udGVudCA9IHRoaXNbJGNvbnRlbnRdOwogICAgfQogICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7CiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXTsKICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgICAgZHVtcGVkW25hbWVdID0gdmFsdWVbJGR1bXBdKCk7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBYRkFPYmplY3RBcnJheSkgewogICAgICAgIGlmICghdmFsdWUuaXNFbXB0eSgpKSB7CiAgICAgICAgICBkdW1wZWRbbmFtZV0gPSB2YWx1ZS5kdW1wKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGR1bXBlZFtuYW1lXSA9IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZHVtcGVkOwogIH0KICBbJHRvU3R5bGVdKCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIFskdG9IVE1MXSgpIHsKICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogIH0KICAqWyRnZXRDb250YWluZWRDaGlsZHJlbl0oKSB7CiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpc1skZ2V0Q2hpbGRyZW5dKCkpIHsKICAgICAgeWllbGQgbm9kZTsKICAgIH0KICB9CiAgKltfZmlsdGVyZWRDaGlsZHJlbkdlbmVyYXRvcl0oZmlsdGVyLCBpbmNsdWRlKSB7CiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpc1skZ2V0Q29udGFpbmVkQ2hpbGRyZW5dKCkpIHsKICAgICAgaWYgKCFmaWx0ZXIgfHwgaW5jbHVkZSA9PT0gZmlsdGVyLmhhcyhub2RlWyRub2RlTmFtZV0pKSB7CiAgICAgICAgY29uc3QgYXZhaWxhYmxlU3BhY2UgPSB0aGlzWyRnZXRBdmFpbGFibGVTcGFjZV0oKTsKICAgICAgICBjb25zdCByZXMgPSBub2RlWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICAgICAgICBpZiAoIXJlcy5zdWNjZXNzKSB7CiAgICAgICAgICB0aGlzWyRleHRyYV0uZmFpbGluZ05vZGUgPSBub2RlOwogICAgICAgIH0KICAgICAgICB5aWVsZCByZXM7CiAgICAgIH0KICAgIH0KICB9CiAgWyRmbHVzaEhUTUxdKCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIFskYWRkSFRNTF0oaHRtbCwgYmJveCkgewogICAgdGhpc1skZXh0cmFdLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgfQogIFskZ2V0QXZhaWxhYmxlU3BhY2VdKCkge30KICBbJGNoaWxkcmVuVG9IVE1MXSh7CiAgICBmaWx0ZXIgPSBudWxsLAogICAgaW5jbHVkZSA9IHRydWUKICB9KSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXS5nZW5lcmF0b3IpIHsKICAgICAgdGhpc1skZXh0cmFdLmdlbmVyYXRvciA9IHRoaXNbX2ZpbHRlcmVkQ2hpbGRyZW5HZW5lcmF0b3JdKGZpbHRlciwgaW5jbHVkZSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBhdmFpbGFibGVTcGFjZSA9IHRoaXNbJGdldEF2YWlsYWJsZVNwYWNlXSgpOwogICAgICBjb25zdCByZXMgPSB0aGlzWyRleHRyYV0uZmFpbGluZ05vZGVbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpOwogICAgICBpZiAoIXJlcy5zdWNjZXNzKSB7CiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfQogICAgICBpZiAocmVzLmh0bWwpIHsKICAgICAgICB0aGlzWyRhZGRIVE1MXShyZXMuaHRtbCwgcmVzLmJib3gpOwogICAgICB9CiAgICAgIGRlbGV0ZSB0aGlzWyRleHRyYV0uZmFpbGluZ05vZGU7CiAgICB9CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBjb25zdCBnZW4gPSB0aGlzWyRleHRyYV0uZ2VuZXJhdG9yLm5leHQoKTsKICAgICAgaWYgKGdlbi5kb25lKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY29uc3QgcmVzID0gZ2VuLnZhbHVlOwogICAgICBpZiAoIXJlcy5zdWNjZXNzKSB7CiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfQogICAgICBpZiAocmVzLmh0bWwpIHsKICAgICAgICB0aGlzWyRhZGRIVE1MXShyZXMuaHRtbCwgcmVzLmJib3gpOwogICAgICB9CiAgICB9CiAgICB0aGlzWyRleHRyYV0uZ2VuZXJhdG9yID0gbnVsbDsKICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogIH0KICBbJHNldFNldEF0dHJpYnV0ZXNdKGF0dHJpYnV0ZXMpIHsKICAgIHRoaXNbX3NldEF0dHJpYnV0ZXNdID0gbmV3IFNldChPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSk7CiAgfQogIFtfZ2V0VW5zZXRBdHRyaWJ1dGVzXShwcm90b0F0dHJpYnV0ZXMpIHsKICAgIGNvbnN0IGFsbEF0dHIgPSB0aGlzW19hdHRyaWJ1dGVOYW1lc107CiAgICBjb25zdCBzZXRBdHRyID0gdGhpc1tfc2V0QXR0cmlidXRlc107CiAgICByZXR1cm4gWy4uLnByb3RvQXR0cmlidXRlc10uZmlsdGVyKHggPT4gYWxsQXR0ci5oYXMoeCkgJiYgIXNldEF0dHIuaGFzKHgpKTsKICB9CiAgWyRyZXNvbHZlUHJvdG90eXBlc10oaWRzLCBhbmNlc3RvcnMgPSBuZXcgU2V0KCkpIHsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1tfY2hpbGRyZW5dKSB7CiAgICAgIGNoaWxkW19yZXNvbHZlUHJvdG90eXBlc0hlbHBlcl0oaWRzLCBhbmNlc3RvcnMpOwogICAgfQogIH0KICBbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycykgewogICAgY29uc3QgcHJvdG8gPSB0aGlzW19nZXRQcm90b3R5cGVdKGlkcywgYW5jZXN0b3JzKTsKICAgIGlmIChwcm90bykgewogICAgICB0aGlzW19hcHBseVByb3RvdHlwZV0ocHJvdG8sIGlkcywgYW5jZXN0b3JzKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXNbJHJlc29sdmVQcm90b3R5cGVzXShpZHMsIGFuY2VzdG9ycyk7CiAgICB9CiAgfQogIFtfZ2V0UHJvdG90eXBlXShpZHMsIGFuY2VzdG9ycykgewogICAgY29uc3QgewogICAgICB1c2UsCiAgICAgIHVzZWhyZWYKICAgIH0gPSB0aGlzOwogICAgaWYgKCF1c2UgJiYgIXVzZWhyZWYpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgcHJvdG8gPSBudWxsOwogICAgbGV0IHNvbUV4cHJlc3Npb24gPSBudWxsOwogICAgbGV0IGlkID0gbnVsbDsKICAgIGxldCByZWYgPSB1c2U7CiAgICBpZiAodXNlaHJlZikgewogICAgICByZWYgPSB1c2VocmVmOwogICAgICBpZiAodXNlaHJlZi5zdGFydHNXaXRoKCIjc29tKCIpICYmIHVzZWhyZWYuZW5kc1dpdGgoIikiKSkgewogICAgICAgIHNvbUV4cHJlc3Npb24gPSB1c2VocmVmLnNsaWNlKCIjc29tKCIubGVuZ3RoLCAtMSk7CiAgICAgIH0gZWxzZSBpZiAodXNlaHJlZi5zdGFydHNXaXRoKCIuI3NvbSgiKSAmJiB1c2VocmVmLmVuZHNXaXRoKCIpIikpIHsKICAgICAgICBzb21FeHByZXNzaW9uID0gdXNlaHJlZi5zbGljZSgiLiNzb20oIi5sZW5ndGgsIC0xKTsKICAgICAgfSBlbHNlIGlmICh1c2VocmVmLnN0YXJ0c1dpdGgoIiMiKSkgewogICAgICAgIGlkID0gdXNlaHJlZi5zbGljZSgxKTsKICAgICAgfSBlbHNlIGlmICh1c2VocmVmLnN0YXJ0c1dpdGgoIi4jIikpIHsKICAgICAgICBpZCA9IHVzZWhyZWYuc2xpY2UoMik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodXNlLnN0YXJ0c1dpdGgoIiMiKSkgewogICAgICBpZCA9IHVzZS5zbGljZSgxKTsKICAgIH0gZWxzZSB7CiAgICAgIHNvbUV4cHJlc3Npb24gPSB1c2U7CiAgICB9CiAgICB0aGlzLnVzZSA9IHRoaXMudXNlaHJlZiA9ICIiOwogICAgaWYgKGlkKSB7CiAgICAgIHByb3RvID0gaWRzLmdldChpZCk7CiAgICB9IGVsc2UgewogICAgICBwcm90byA9IHNlYXJjaE5vZGUoaWRzLmdldCgkcm9vdCksIHRoaXMsIHNvbUV4cHJlc3Npb24sIHRydWUsIGZhbHNlKTsKICAgICAgaWYgKHByb3RvKSB7CiAgICAgICAgcHJvdG8gPSBwcm90b1swXTsKICAgICAgfQogICAgfQogICAgaWYgKCFwcm90bykgewogICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIHByb3RvdHlwZSByZWZlcmVuY2U6ICR7cmVmfS5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAocHJvdG9bJG5vZGVOYW1lXSAhPT0gdGhpc1skbm9kZU5hbWVdKSB7CiAgICAgIHdhcm4oYFhGQSAtIEluY29tcGF0aWJsZSBwcm90b3R5cGU6ICR7cHJvdG9bJG5vZGVOYW1lXX0gIT09ICR7dGhpc1skbm9kZU5hbWVdfS5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoYW5jZXN0b3JzLmhhcyhwcm90bykpIHsKICAgICAgd2FybihgWEZBIC0gQ3ljbGUgZGV0ZWN0ZWQgaW4gcHJvdG90eXBlcyB1c2UuYCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgYW5jZXN0b3JzLmFkZChwcm90byk7CiAgICBjb25zdCBwcm90b1Byb3RvID0gcHJvdG9bX2dldFByb3RvdHlwZV0oaWRzLCBhbmNlc3RvcnMpOwogICAgaWYgKHByb3RvUHJvdG8pIHsKICAgICAgcHJvdG9bX2FwcGx5UHJvdG90eXBlXShwcm90b1Byb3RvLCBpZHMsIGFuY2VzdG9ycyk7CiAgICB9CiAgICBwcm90b1skcmVzb2x2ZVByb3RvdHlwZXNdKGlkcywgYW5jZXN0b3JzKTsKICAgIGFuY2VzdG9ycy5kZWxldGUocHJvdG8pOwogICAgcmV0dXJuIHByb3RvOwogIH0KICBbX2FwcGx5UHJvdG90eXBlXShwcm90bywgaWRzLCBhbmNlc3RvcnMpIHsKICAgIGlmIChhbmNlc3RvcnMuaGFzKHByb3RvKSkgewogICAgICB3YXJuKGBYRkEgLSBDeWNsZSBkZXRlY3RlZCBpbiBwcm90b3R5cGVzIHVzZS5gKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCF0aGlzWyRjb250ZW50XSAmJiBwcm90b1skY29udGVudF0pIHsKICAgICAgdGhpc1skY29udGVudF0gPSBwcm90b1skY29udGVudF07CiAgICB9CiAgICBjb25zdCBuZXdBbmNlc3RvcnMgPSBuZXcgU2V0KGFuY2VzdG9ycyk7CiAgICBuZXdBbmNlc3RvcnMuYWRkKHByb3RvKTsKICAgIGZvciAoY29uc3QgdW5zZXRBdHRyTmFtZSBvZiB0aGlzW19nZXRVbnNldEF0dHJpYnV0ZXNdKHByb3RvW19zZXRBdHRyaWJ1dGVzXSkpIHsKICAgICAgdGhpc1t1bnNldEF0dHJOYW1lXSA9IHByb3RvW3Vuc2V0QXR0ck5hbWVdOwogICAgICBpZiAodGhpc1tfc2V0QXR0cmlidXRlc10pIHsKICAgICAgICB0aGlzW19zZXRBdHRyaWJ1dGVzXS5hZGQodW5zZXRBdHRyTmFtZSk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkgewogICAgICBpZiAodGhpc1tfYXR0cmlidXRlTmFtZXNdLmhhcyhuYW1lKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXTsKICAgICAgY29uc3QgcHJvdG9WYWx1ZSA9IHByb3RvW25hbWVdOwogICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBYRkFPYmplY3RBcnJheSkgewogICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdmFsdWVbX2NoaWxkcmVuXSkgewogICAgICAgICAgY2hpbGRbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSB2YWx1ZVtfY2hpbGRyZW5dLmxlbmd0aCwgaWkgPSBwcm90b1ZhbHVlW19jaGlsZHJlbl0ubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgY29uc3QgY2hpbGQgPSBwcm90b1tfY2hpbGRyZW5dW2ldWyRjbG9uZV0oKTsKICAgICAgICAgIGlmICh2YWx1ZS5wdXNoKGNoaWxkKSkgewogICAgICAgICAgICBjaGlsZFtfcGFyZW50XSA9IHRoaXM7CiAgICAgICAgICAgIHRoaXNbX2NoaWxkcmVuXS5wdXNoKGNoaWxkKTsKICAgICAgICAgICAgY2hpbGRbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgdmFsdWVbJHJlc29sdmVQcm90b3R5cGVzXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgICAgaWYgKHByb3RvVmFsdWUpIHsKICAgICAgICAgIHZhbHVlW19hcHBseVByb3RvdHlwZV0ocHJvdG9WYWx1ZSwgaWRzLCBhbmNlc3RvcnMpOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAocHJvdG9WYWx1ZSAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IGNoaWxkID0gcHJvdG9WYWx1ZVskY2xvbmVdKCk7CiAgICAgICAgY2hpbGRbX3BhcmVudF0gPSB0aGlzOwogICAgICAgIHRoaXNbbmFtZV0gPSBjaGlsZDsKICAgICAgICB0aGlzW19jaGlsZHJlbl0ucHVzaChjaGlsZCk7CiAgICAgICAgY2hpbGRbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgIH0KICAgIH0KICB9CiAgc3RhdGljIFtfY2xvbmVBdHRyaWJ1dGVdKG9iaikgewogICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgewogICAgICByZXR1cm4gb2JqLm1hcCh4ID0+IFhGQU9iamVjdFtfY2xvbmVBdHRyaWJ1dGVdKHgpKTsKICAgIH0KICAgIGlmICh0eXBlb2Ygb2JqID09PSAib2JqZWN0IiAmJiBvYmogIT09IG51bGwpIHsKICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9iaik7CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0KICBbJGNsb25lXSgpIHsKICAgIGNvbnN0IGNsb25lID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpOwogICAgZm9yIChjb25zdCAkc3ltYm9sIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGhpcykpIHsKICAgICAgdHJ5IHsKICAgICAgICBjbG9uZVskc3ltYm9sXSA9IHRoaXNbJHN5bWJvbF07CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHNoYWRvdyhjbG9uZSwgJHN5bWJvbCwgdGhpc1skc3ltYm9sXSk7CiAgICAgIH0KICAgIH0KICAgIGNsb25lWyR1aWRdID0gYCR7Y2xvbmVbJG5vZGVOYW1lXX0ke3VpZCsrfWA7CiAgICBjbG9uZVtfY2hpbGRyZW5dID0gW107CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgaWYgKHRoaXNbX2F0dHJpYnV0ZU5hbWVzXS5oYXMobmFtZSkpIHsKICAgICAgICBjbG9uZVtuYW1lXSA9IFhGQU9iamVjdFtfY2xvbmVBdHRyaWJ1dGVdKHRoaXNbbmFtZV0pOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXTsKICAgICAgY2xvbmVbbmFtZV0gPSB2YWx1ZSBpbnN0YW5jZW9mIFhGQU9iamVjdEFycmF5ID8gbmV3IFhGQU9iamVjdEFycmF5KHZhbHVlW19tYXhdKSA6IG51bGw7CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBjb25zdCBuYW1lID0gY2hpbGRbJG5vZGVOYW1lXTsKICAgICAgY29uc3QgY2xvbmVkQ2hpbGQgPSBjaGlsZFskY2xvbmVdKCk7CiAgICAgIGNsb25lW19jaGlsZHJlbl0ucHVzaChjbG9uZWRDaGlsZCk7CiAgICAgIGNsb25lZENoaWxkW19wYXJlbnRdID0gY2xvbmU7CiAgICAgIGlmIChjbG9uZVtuYW1lXSA9PT0gbnVsbCkgewogICAgICAgIGNsb25lW25hbWVdID0gY2xvbmVkQ2hpbGQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2xvbmVbbmFtZV1bX2NoaWxkcmVuXS5wdXNoKGNsb25lZENoaWxkKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNsb25lOwogIH0KICBbJGdldENoaWxkcmVuXShuYW1lID0gbnVsbCkgewogICAgaWYgKCFuYW1lKSB7CiAgICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl07CiAgICB9CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmZpbHRlcihjID0+IGNbJG5vZGVOYW1lXSA9PT0gbmFtZSk7CiAgfQogIFskZ2V0Q2hpbGRyZW5CeUNsYXNzXShuYW1lKSB7CiAgICByZXR1cm4gdGhpc1tuYW1lXTsKICB9CiAgWyRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgYWxsVHJhbnNwYXJlbnQsIGZpcnN0ID0gdHJ1ZSkgewogICAgcmV0dXJuIEFycmF5LmZyb20odGhpc1skZ2V0Q2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQsIGZpcnN0KSk7CiAgfQogICpbJGdldENoaWxkcmVuQnlOYW1lSXRdKG5hbWUsIGFsbFRyYW5zcGFyZW50LCBmaXJzdCA9IHRydWUpIHsKICAgIGlmIChuYW1lID09PSAicGFyZW50IikgewogICAgICB5aWVsZCB0aGlzW19wYXJlbnRdOwogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBpZiAoY2hpbGRbJG5vZGVOYW1lXSA9PT0gbmFtZSkgewogICAgICAgIHlpZWxkIGNoaWxkOwogICAgICB9CiAgICAgIGlmIChjaGlsZC5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgeWllbGQgY2hpbGQ7CiAgICAgIH0KICAgICAgaWYgKGFsbFRyYW5zcGFyZW50IHx8IGNoaWxkWyRpc1RyYW5zcGFyZW50XSgpKSB7CiAgICAgICAgeWllbGQqIGNoaWxkWyRnZXRDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCwgZmFsc2UpOwogICAgICB9CiAgICB9CiAgICBpZiAoZmlyc3QgJiYgdGhpc1tfYXR0cmlidXRlTmFtZXNdLmhhcyhuYW1lKSkgewogICAgICB5aWVsZCBuZXcgWEZBQXR0cmlidXRlKHRoaXMsIG5hbWUsIHRoaXNbbmFtZV0pOwogICAgfQogIH0KfQpjbGFzcyBYRkFPYmplY3RBcnJheSB7CiAgY29uc3RydWN0b3IobWF4ID0gSW5maW5pdHkpIHsKICAgIHRoaXNbX21heF0gPSBtYXg7CiAgICB0aGlzW19jaGlsZHJlbl0gPSBbXTsKICB9CiAgZ2V0IGlzWEZBT2JqZWN0KCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBnZXQgaXNYRkFPYmplY3RBcnJheSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBwdXNoKGNoaWxkKSB7CiAgICBjb25zdCBsZW4gPSB0aGlzW19jaGlsZHJlbl0ubGVuZ3RoOwogICAgaWYgKGxlbiA8PSB0aGlzW19tYXhdKSB7CiAgICAgIHRoaXNbX2NoaWxkcmVuXS5wdXNoKGNoaWxkKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB3YXJuKGBYRkEgLSBub2RlICIke2NoaWxkWyRub2RlTmFtZV19IiBhY2NlcHRzIG5vIG1vcmUgdGhhbiAke3RoaXNbX21heF19IGNoaWxkcmVuYCk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlzRW1wdHkoKSB7CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9PT0gMDsKICB9CiAgZHVtcCgpIHsKICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl0ubGVuZ3RoID09PSAxID8gdGhpc1tfY2hpbGRyZW5dWzBdWyRkdW1wXSgpIDogdGhpc1tfY2hpbGRyZW5dLm1hcCh4ID0+IHhbJGR1bXBdKCkpOwogIH0KICBbJGNsb25lXSgpIHsKICAgIGNvbnN0IGNsb25lID0gbmV3IFhGQU9iamVjdEFycmF5KHRoaXNbX21heF0pOwogICAgY2xvbmVbX2NoaWxkcmVuXSA9IHRoaXNbX2NoaWxkcmVuXS5tYXAoYyA9PiBjWyRjbG9uZV0oKSk7CiAgICByZXR1cm4gY2xvbmU7CiAgfQogIGdldCBjaGlsZHJlbigpIHsKICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl07CiAgfQogIGNsZWFyKCkgewogICAgdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9IDA7CiAgfQp9CmNsYXNzIFhGQUF0dHJpYnV0ZSB7CiAgY29uc3RydWN0b3Iobm9kZSwgbmFtZSwgdmFsdWUpIHsKICAgIHRoaXNbX3BhcmVudF0gPSBub2RlOwogICAgdGhpc1skbm9kZU5hbWVdID0gbmFtZTsKICAgIHRoaXNbJGNvbnRlbnRdID0gdmFsdWU7CiAgICB0aGlzWyRjb25zdW1lZF0gPSBmYWxzZTsKICAgIHRoaXNbJHVpZF0gPSBgYXR0cmlidXRlJHt1aWQrK31gOwogIH0KICBbJGdldFBhcmVudF0oKSB7CiAgICByZXR1cm4gdGhpc1tfcGFyZW50XTsKICB9CiAgWyRpc0RhdGFWYWx1ZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRnZXREYXRhVmFsdWVdKCkgewogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdLnRyaW0oKTsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIHZhbHVlID0gdmFsdWUudmFsdWUgfHwgIiI7CiAgICB0aGlzWyRjb250ZW50XSA9IHZhbHVlLnRvU3RyaW5nKCk7CiAgfQogIFskdGV4dF0oKSB7CiAgICByZXR1cm4gdGhpc1skY29udGVudF07CiAgfQogIFskaXNEZXNjZW5kZW50XShwYXJlbnQpIHsKICAgIHJldHVybiB0aGlzW19wYXJlbnRdID09PSBwYXJlbnQgfHwgdGhpc1tfcGFyZW50XVskaXNEZXNjZW5kZW50XShwYXJlbnQpOwogIH0KfQpjbGFzcyBYbWxPYmplY3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKG5zSWQsIG5hbWUsIGF0dHJpYnV0ZXMgPSB7fSkgewogICAgc3VwZXIobnNJZCwgbmFtZSk7CiAgICB0aGlzWyRjb250ZW50XSA9ICIiOwogICAgdGhpc1tfZGF0YVZhbHVlXSA9IG51bGw7CiAgICBpZiAobmFtZSAhPT0gIiN0ZXh0IikgewogICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7CiAgICAgIHRoaXNbX2F0dHJpYnV0ZXNdID0gbWFwOwogICAgICBmb3IgKGNvbnN0IFthdHRyTmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7CiAgICAgICAgbWFwLnNldChhdHRyTmFtZSwgbmV3IFhGQUF0dHJpYnV0ZSh0aGlzLCBhdHRyTmFtZSwgdmFsdWUpKTsKICAgICAgfQogICAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eSgkbnNBdHRyaWJ1dGVzKSkgewogICAgICAgIGNvbnN0IGRhdGFOb2RlID0gYXR0cmlidXRlc1skbnNBdHRyaWJ1dGVzXS54ZmEuZGF0YU5vZGU7CiAgICAgICAgaWYgKGRhdGFOb2RlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGlmIChkYXRhTm9kZSA9PT0gImRhdGFHcm91cCIpIHsKICAgICAgICAgICAgdGhpc1tfZGF0YVZhbHVlXSA9IGZhbHNlOwogICAgICAgICAgfSBlbHNlIGlmIChkYXRhTm9kZSA9PT0gImRhdGFWYWx1ZSIpIHsKICAgICAgICAgICAgdGhpc1tfZGF0YVZhbHVlXSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzWyRjb25zdW1lZF0gPSBmYWxzZTsKICB9CiAgWyR0b1N0cmluZ10oYnVmKSB7CiAgICBjb25zdCB0YWdOYW1lID0gdGhpc1skbm9kZU5hbWVdOwogICAgaWYgKHRhZ05hbWUgPT09ICIjdGV4dCIpIHsKICAgICAgYnVmLnB1c2goZW5jb2RlVG9YbWxTdHJpbmcodGhpc1skY29udGVudF0pKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgdXRmOFRhZ05hbWUgPSB1dGY4U3RyaW5nVG9TdHJpbmcodGFnTmFtZSk7CiAgICBjb25zdCBwcmVmaXggPSB0aGlzWyRuYW1lc3BhY2VJZF0gPT09IE5TX0RBVEFTRVRTID8gInhmYToiIDogIiI7CiAgICBidWYucHVzaChgPCR7cHJlZml4fSR7dXRmOFRhZ05hbWV9YCk7CiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdGhpc1tfYXR0cmlidXRlc10uZW50cmllcygpKSB7CiAgICAgIGNvbnN0IHV0ZjhOYW1lID0gdXRmOFN0cmluZ1RvU3RyaW5nKG5hbWUpOwogICAgICBidWYucHVzaChgICR7dXRmOE5hbWV9PSIke2VuY29kZVRvWG1sU3RyaW5nKHZhbHVlWyRjb250ZW50XSl9ImApOwogICAgfQogICAgaWYgKHRoaXNbX2RhdGFWYWx1ZV0gIT09IG51bGwpIHsKICAgICAgaWYgKHRoaXNbX2RhdGFWYWx1ZV0pIHsKICAgICAgICBidWYucHVzaChgIHhmYTpkYXRhTm9kZT0iZGF0YVZhbHVlImApOwogICAgICB9IGVsc2UgewogICAgICAgIGJ1Zi5wdXNoKGAgeGZhOmRhdGFOb2RlPSJkYXRhR3JvdXAiYCk7CiAgICAgIH0KICAgIH0KICAgIGlmICghdGhpc1skY29udGVudF0gJiYgdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9PT0gMCkgewogICAgICBidWYucHVzaCgiLz4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYnVmLnB1c2goIj4iKTsKICAgIGlmICh0aGlzWyRjb250ZW50XSkgewogICAgICBpZiAodHlwZW9mIHRoaXNbJGNvbnRlbnRdID09PSAic3RyaW5nIikgewogICAgICAgIGJ1Zi5wdXNoKGVuY29kZVRvWG1sU3RyaW5nKHRoaXNbJGNvbnRlbnRdKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpc1skY29udGVudF1bJHRvU3RyaW5nXShidWYpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICAgIGNoaWxkWyR0b1N0cmluZ10oYnVmKTsKICAgICAgfQogICAgfQogICAgYnVmLnB1c2goYDwvJHtwcmVmaXh9JHt1dGY4VGFnTmFtZX0+YCk7CiAgfQogIFskb25DaGlsZF0oY2hpbGQpIHsKICAgIGlmICh0aGlzWyRjb250ZW50XSkgewogICAgICBjb25zdCBub2RlID0gbmV3IFhtbE9iamVjdCh0aGlzWyRuYW1lc3BhY2VJZF0sICIjdGV4dCIpOwogICAgICB0aGlzWyRhcHBlbmRDaGlsZF0obm9kZSk7CiAgICAgIG5vZGVbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF07CiAgICAgIHRoaXNbJGNvbnRlbnRdID0gIiI7CiAgICB9CiAgICB0aGlzWyRhcHBlbmRDaGlsZF0oY2hpbGQpOwogICAgcmV0dXJuIHRydWU7CiAgfQogIFskb25UZXh0XShzdHIpIHsKICAgIHRoaXNbJGNvbnRlbnRdICs9IHN0cjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBpZiAodGhpc1skY29udGVudF0gJiYgdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3Qgbm9kZSA9IG5ldyBYbWxPYmplY3QodGhpc1skbmFtZXNwYWNlSWRdLCAiI3RleHQiKTsKICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgICBub2RlWyRjb250ZW50XSA9IHRoaXNbJGNvbnRlbnRdOwogICAgICBkZWxldGUgdGhpc1skY29udGVudF07CiAgICB9CiAgfQogIFskdG9IVE1MXSgpIHsKICAgIGlmICh0aGlzWyRub2RlTmFtZV0gPT09ICIjdGV4dCIpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgICAgbmFtZTogIiN0ZXh0IiwKICAgICAgICB2YWx1ZTogdGhpc1skY29udGVudF0KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICB9CiAgWyRnZXRDaGlsZHJlbl0obmFtZSA9IG51bGwpIHsKICAgIGlmICghbmFtZSkgewogICAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dOwogICAgfQogICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXS5maWx0ZXIoYyA9PiBjWyRub2RlTmFtZV0gPT09IG5hbWUpOwogIH0KICBbJGdldEF0dHJpYnV0ZXNdKCkgewogICAgcmV0dXJuIHRoaXNbX2F0dHJpYnV0ZXNdOwogIH0KICBbJGdldENoaWxkcmVuQnlDbGFzc10obmFtZSkgewogICAgY29uc3QgdmFsdWUgPSB0aGlzW19hdHRyaWJ1dGVzXS5nZXQobmFtZSk7CiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gdGhpc1skZ2V0Q2hpbGRyZW5dKG5hbWUpOwogIH0KICAqWyRnZXRDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCkgewogICAgY29uc3QgdmFsdWUgPSB0aGlzW19hdHRyaWJ1dGVzXS5nZXQobmFtZSk7CiAgICBpZiAodmFsdWUpIHsKICAgICAgeWllbGQgdmFsdWU7CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBpZiAoY2hpbGRbJG5vZGVOYW1lXSA9PT0gbmFtZSkgewogICAgICAgIHlpZWxkIGNoaWxkOwogICAgICB9CiAgICAgIGlmIChhbGxUcmFuc3BhcmVudCkgewogICAgICAgIHlpZWxkKiBjaGlsZFskZ2V0Q2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQpOwogICAgICB9CiAgICB9CiAgfQogICpbJGdldEF0dHJpYnV0ZUl0XShuYW1lLCBza2lwQ29uc3VtZWQpIHsKICAgIGNvbnN0IHZhbHVlID0gdGhpc1tfYXR0cmlidXRlc10uZ2V0KG5hbWUpOwogICAgaWYgKHZhbHVlICYmICghc2tpcENvbnN1bWVkIHx8ICF2YWx1ZVskY29uc3VtZWRdKSkgewogICAgICB5aWVsZCB2YWx1ZTsKICAgIH0KICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1tfY2hpbGRyZW5dKSB7CiAgICAgIHlpZWxkKiBjaGlsZFskZ2V0QXR0cmlidXRlSXRdKG5hbWUsIHNraXBDb25zdW1lZCk7CiAgICB9CiAgfQogICpbJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCwgc2tpcENvbnN1bWVkKSB7CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBpZiAoY2hpbGRbJG5vZGVOYW1lXSA9PT0gbmFtZSAmJiAoIXNraXBDb25zdW1lZCB8fCAhY2hpbGRbJGNvbnN1bWVkXSkpIHsKICAgICAgICB5aWVsZCBjaGlsZDsKICAgICAgfQogICAgICBpZiAoYWxsVHJhbnNwYXJlbnQpIHsKICAgICAgICB5aWVsZCogY2hpbGRbJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCwgc2tpcENvbnN1bWVkKTsKICAgICAgfQogICAgfQogIH0KICBbJGlzRGF0YVZhbHVlXSgpIHsKICAgIGlmICh0aGlzW19kYXRhVmFsdWVdID09PSBudWxsKSB7CiAgICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl0ubGVuZ3RoID09PSAwIHx8IHRoaXNbX2NoaWxkcmVuXVswXVskbmFtZXNwYWNlSWRdID09PSBOYW1lc3BhY2VJZHMueGh0bWwuaWQ7CiAgICB9CiAgICByZXR1cm4gdGhpc1tfZGF0YVZhbHVlXTsKICB9CiAgWyRnZXREYXRhVmFsdWVdKCkgewogICAgaWYgKHRoaXNbX2RhdGFWYWx1ZV0gPT09IG51bGwpIHsKICAgICAgaWYgKHRoaXNbX2NoaWxkcmVuXS5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gdGhpc1skY29udGVudF0udHJpbSgpOwogICAgICB9CiAgICAgIGlmICh0aGlzW19jaGlsZHJlbl1bMF1bJG5hbWVzcGFjZUlkXSA9PT0gTmFtZXNwYWNlSWRzLnhodG1sLmlkKSB7CiAgICAgICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXVswXVskdGV4dF0oKS50cmltKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gdGhpc1skY29udGVudF0udHJpbSgpOwogIH0KICBbJHNldFZhbHVlXSh2YWx1ZSkgewogICAgdmFsdWUgPSB2YWx1ZS52YWx1ZSB8fCAiIjsKICAgIHRoaXNbJGNvbnRlbnRdID0gdmFsdWUudG9TdHJpbmcoKTsKICB9CiAgWyRkdW1wXShoYXNOUyA9IGZhbHNlKSB7CiAgICBjb25zdCBkdW1wZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKGhhc05TKSB7CiAgICAgIGR1bXBlZC4kbnMgPSB0aGlzWyRuYW1lc3BhY2VJZF07CiAgICB9CiAgICBpZiAodGhpc1skY29udGVudF0pIHsKICAgICAgZHVtcGVkLiRjb250ZW50ID0gdGhpc1skY29udGVudF07CiAgICB9CiAgICBkdW1wZWQuJG5hbWUgPSB0aGlzWyRub2RlTmFtZV07CiAgICBkdW1wZWQuY2hpbGRyZW4gPSBbXTsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1tfY2hpbGRyZW5dKSB7CiAgICAgIGR1bXBlZC5jaGlsZHJlbi5wdXNoKGNoaWxkWyRkdW1wXShoYXNOUykpOwogICAgfQogICAgZHVtcGVkLmF0dHJpYnV0ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHRoaXNbX2F0dHJpYnV0ZXNdKSB7CiAgICAgIGR1bXBlZC5hdHRyaWJ1dGVzW25hbWVdID0gdmFsdWVbJGNvbnRlbnRdOwogICAgfQogICAgcmV0dXJuIGR1bXBlZDsKICB9Cn0KY2xhc3MgQ29udGVudE9iamVjdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IobnNJZCwgbmFtZSkgewogICAgc3VwZXIobnNJZCwgbmFtZSk7CiAgICB0aGlzWyRjb250ZW50XSA9ICIiOwogIH0KICBbJG9uVGV4dF0odGV4dCkgewogICAgdGhpc1skY29udGVudF0gKz0gdGV4dDsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7fQp9CmNsYXNzIE9wdGlvbk9iamVjdCBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKG5zSWQsIG5hbWUsIG9wdGlvbnMpIHsKICAgIHN1cGVyKG5zSWQsIG5hbWUpOwogICAgdGhpc1tfb3B0aW9uc10gPSBvcHRpb25zOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbnRlbnRdID0gZ2V0S2V5d29yZCh7CiAgICAgIGRhdGE6IHRoaXNbJGNvbnRlbnRdLAogICAgICBkZWZhdWx0VmFsdWU6IHRoaXNbX29wdGlvbnNdWzBdLAogICAgICB2YWxpZGF0ZTogayA9PiB0aGlzW19vcHRpb25zXS5pbmNsdWRlcyhrKQogICAgfSk7CiAgfQogIFskY2xlYW5dKGJ1aWxkZXIpIHsKICAgIHN1cGVyWyRjbGVhbl0oYnVpbGRlcik7CiAgICBkZWxldGUgdGhpc1tfb3B0aW9uc107CiAgfQp9CmNsYXNzIFN0cmluZ09iamVjdCBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgfQp9CmNsYXNzIEludGVnZXJPYmplY3QgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3Rvcihuc0lkLCBuYW1lLCBkZWZhdWx0VmFsdWUsIHZhbGlkYXRvcikgewogICAgc3VwZXIobnNJZCwgbmFtZSk7CiAgICB0aGlzW19kZWZhdWx0VmFsdWVdID0gZGVmYXVsdFZhbHVlOwogICAgdGhpc1tfdmFsaWRhdG9yXSA9IHZhbGlkYXRvcjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiB0aGlzWyRjb250ZW50XSwKICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzW19kZWZhdWx0VmFsdWVdLAogICAgICB2YWxpZGF0ZTogdGhpc1tfdmFsaWRhdG9yXQogICAgfSk7CiAgfQogIFskY2xlYW5dKGJ1aWxkZXIpIHsKICAgIHN1cGVyWyRjbGVhbl0oYnVpbGRlcik7CiAgICBkZWxldGUgdGhpc1tfZGVmYXVsdFZhbHVlXTsKICAgIGRlbGV0ZSB0aGlzW192YWxpZGF0b3JdOwogIH0KfQpjbGFzcyBPcHRpb24wMSBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKG5zSWQsIG5hbWUpIHsKICAgIHN1cGVyKG5zSWQsIG5hbWUsIDAsIG4gPT4gbiA9PT0gMSk7CiAgfQp9CmNsYXNzIE9wdGlvbjEwIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IobnNJZCwgbmFtZSkgewogICAgc3VwZXIobnNJZCwgbmFtZSwgMSwgbiA9PiBuID09PSAwKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9odG1sX3V0aWxzLmpzCgoKCgoKCmZ1bmN0aW9uIG1lYXN1cmVUb1N0cmluZyhtKSB7CiAgaWYgKHR5cGVvZiBtID09PSAic3RyaW5nIikgewogICAgcmV0dXJuICIwcHgiOwogIH0KICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihtKSA/IGAke219cHhgIDogYCR7bS50b0ZpeGVkKDIpfXB4YDsKfQpjb25zdCBjb252ZXJ0ZXJzID0gewogIGFuY2hvclR5cGUobm9kZSwgc3R5bGUpIHsKICAgIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQubGF5b3V0ICYmIHBhcmVudC5sYXlvdXQgIT09ICJwb3NpdGlvbiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCEoInRyYW5zZm9ybSIgaW4gc3R5bGUpKSB7CiAgICAgIHN0eWxlLnRyYW5zZm9ybSA9ICIiOwogICAgfQogICAgc3dpdGNoIChub2RlLmFuY2hvclR5cGUpIHsKICAgICAgY2FzZSAiYm90dG9tQ2VudGVyIjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgtNTAlLCAtMTAwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJib3R0b21MZWZ0IjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgwLC0xMDAlKSI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImJvdHRvbVJpZ2h0IjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgtMTAwJSwtMTAwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJtaWRkbGVDZW50ZXIiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC01MCUsLTUwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJtaWRkbGVMZWZ0IjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgwLC01MCUpIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibWlkZGxlUmlnaHQiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC0xMDAlLC01MCUpIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAidG9wQ2VudGVyIjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgtNTAlLDApIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAidG9wUmlnaHQiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC0xMDAlLDApIjsKICAgICAgICBicmVhazsKICAgIH0KICB9LAogIGRpbWVuc2lvbnMobm9kZSwgc3R5bGUpIHsKICAgIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBsZXQgd2lkdGggPSBub2RlLnc7CiAgICBjb25zdCBoZWlnaHQgPSBub2RlLmg7CiAgICBpZiAocGFyZW50LmxheW91dD8uaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIGNvbnN0IGV4dHJhID0gcGFyZW50WyRleHRyYV07CiAgICAgIGNvbnN0IGNvbFNwYW4gPSBub2RlLmNvbFNwYW47CiAgICAgIGxldCB3OwogICAgICBpZiAoY29sU3BhbiA9PT0gLTEpIHsKICAgICAgICB3ID0gTWF0aC5zdW1QcmVjaXNlKGV4dHJhLmNvbHVtbldpZHRocy5zbGljZShleHRyYS5jdXJyZW50Q29sdW1uKSk7CiAgICAgICAgZXh0cmEuY3VycmVudENvbHVtbiA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdyA9IE1hdGguc3VtUHJlY2lzZShleHRyYS5jb2x1bW5XaWR0aHMuc2xpY2UoZXh0cmEuY3VycmVudENvbHVtbiwgZXh0cmEuY3VycmVudENvbHVtbiArIGNvbFNwYW4pKTsKICAgICAgICBleHRyYS5jdXJyZW50Q29sdW1uID0gKGV4dHJhLmN1cnJlbnRDb2x1bW4gKyBub2RlLmNvbFNwYW4pICUgZXh0cmEuY29sdW1uV2lkdGhzLmxlbmd0aDsKICAgICAgfQogICAgICBpZiAoIWlzTmFOKHcpKSB7CiAgICAgICAgd2lkdGggPSBub2RlLncgPSB3OwogICAgICB9CiAgICB9CiAgICBzdHlsZS53aWR0aCA9IHdpZHRoICE9PSAiIiA/IG1lYXN1cmVUb1N0cmluZyh3aWR0aCkgOiAiYXV0byI7CiAgICBzdHlsZS5oZWlnaHQgPSBoZWlnaHQgIT09ICIiID8gbWVhc3VyZVRvU3RyaW5nKGhlaWdodCkgOiAiYXV0byI7CiAgfSwKICBwb3NpdGlvbihub2RlLCBzdHlsZSkgewogICAgY29uc3QgcGFyZW50ID0gbm9kZVskZ2V0U3ViZm9ybVBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQ/LmxheW91dCAmJiBwYXJlbnQubGF5b3V0ICE9PSAicG9zaXRpb24iKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIHN0eWxlLmxlZnQgPSBtZWFzdXJlVG9TdHJpbmcobm9kZS54KTsKICAgIHN0eWxlLnRvcCA9IG1lYXN1cmVUb1N0cmluZyhub2RlLnkpOwogIH0sCiAgcm90YXRlKG5vZGUsIHN0eWxlKSB7CiAgICBpZiAobm9kZS5yb3RhdGUpIHsKICAgICAgaWYgKCEoInRyYW5zZm9ybSIgaW4gc3R5bGUpKSB7CiAgICAgICAgc3R5bGUudHJhbnNmb3JtID0gIiI7CiAgICAgIH0KICAgICAgc3R5bGUudHJhbnNmb3JtICs9IGByb3RhdGUoLSR7bm9kZS5yb3RhdGV9ZGVnKWA7CiAgICAgIHN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9ICJ0b3AgbGVmdCI7CiAgICB9CiAgfSwKICBwcmVzZW5jZShub2RlLCBzdHlsZSkgewogICAgc3dpdGNoIChub2RlLnByZXNlbmNlKSB7CiAgICAgIGNhc2UgImludmlzaWJsZSI6CiAgICAgICAgc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJoaWRkZW4iOgogICAgICBjYXNlICJpbmFjdGl2ZSI6CiAgICAgICAgc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICBicmVhazsKICAgIH0KICB9LAogIGhBbGlnbihub2RlLCBzdHlsZSkgewogICAgaWYgKG5vZGVbJG5vZGVOYW1lXSA9PT0gInBhcmEiKSB7CiAgICAgIHN3aXRjaCAobm9kZS5oQWxpZ24pIHsKICAgICAgICBjYXNlICJqdXN0aWZ5QWxsIjoKICAgICAgICAgIHN0eWxlLnRleHRBbGlnbiA9ICJqdXN0aWZ5LWFsbCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyYWRpeCI6CiAgICAgICAgICBzdHlsZS50ZXh0QWxpZ24gPSAibGVmdCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgc3R5bGUudGV4dEFsaWduID0gbm9kZS5oQWxpZ247CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHN3aXRjaCAobm9kZS5oQWxpZ24pIHsKICAgICAgICBjYXNlICJsZWZ0IjoKICAgICAgICAgIHN0eWxlLmFsaWduU2VsZiA9ICJzdGFydCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjZW50ZXIiOgogICAgICAgICAgc3R5bGUuYWxpZ25TZWxmID0gImNlbnRlciI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgICBzdHlsZS5hbGlnblNlbGYgPSAiZW5kIjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfSwKICBtYXJnaW4obm9kZSwgc3R5bGUpIHsKICAgIGlmIChub2RlLm1hcmdpbikgewogICAgICBzdHlsZS5tYXJnaW4gPSBub2RlLm1hcmdpblskdG9TdHlsZV0oKS5tYXJnaW47CiAgICB9CiAgfQp9OwpmdW5jdGlvbiBzZXRNaW5NYXhEaW1lbnNpb25zKG5vZGUsIHN0eWxlKSB7CiAgY29uc3QgcGFyZW50ID0gbm9kZVskZ2V0U3ViZm9ybVBhcmVudF0oKTsKICBpZiAocGFyZW50LmxheW91dCA9PT0gInBvc2l0aW9uIikgewogICAgaWYgKG5vZGUubWluVyA+IDApIHsKICAgICAgc3R5bGUubWluV2lkdGggPSBtZWFzdXJlVG9TdHJpbmcobm9kZS5taW5XKTsKICAgIH0KICAgIGlmIChub2RlLm1heFcgPiAwKSB7CiAgICAgIHN0eWxlLm1heFdpZHRoID0gbWVhc3VyZVRvU3RyaW5nKG5vZGUubWF4Vyk7CiAgICB9CiAgICBpZiAobm9kZS5taW5IID4gMCkgewogICAgICBzdHlsZS5taW5IZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcobm9kZS5taW5IKTsKICAgIH0KICAgIGlmIChub2RlLm1heEggPiAwKSB7CiAgICAgIHN0eWxlLm1heEhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyhub2RlLm1heEgpOwogICAgfQogIH0KfQpmdW5jdGlvbiBsYXlvdXRUZXh0KHRleHQsIHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlciwgd2lkdGgpIHsKICBjb25zdCBtZWFzdXJlID0gbmV3IFRleHRNZWFzdXJlKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlcik7CiAgaWYgKHR5cGVvZiB0ZXh0ID09PSAic3RyaW5nIikgewogICAgbWVhc3VyZS5hZGRTdHJpbmcodGV4dCk7CiAgfSBlbHNlIHsKICAgIHRleHRbJHB1c2hHbHlwaHNdKG1lYXN1cmUpOwogIH0KICByZXR1cm4gbWVhc3VyZS5jb21wdXRlKHdpZHRoKTsKfQpmdW5jdGlvbiBsYXlvdXROb2RlKG5vZGUsIGF2YWlsYWJsZVNwYWNlKSB7CiAgbGV0IGhlaWdodCA9IG51bGw7CiAgbGV0IHdpZHRoID0gbnVsbDsKICBsZXQgaXNCcm9rZW4gPSBmYWxzZTsKICBpZiAoKCFub2RlLncgfHwgIW5vZGUuaCkgJiYgbm9kZS52YWx1ZSkgewogICAgbGV0IG1hcmdpbkggPSAwOwogICAgbGV0IG1hcmdpblYgPSAwOwogICAgaWYgKG5vZGUubWFyZ2luKSB7CiAgICAgIG1hcmdpbkggPSBub2RlLm1hcmdpbi5sZWZ0SW5zZXQgKyBub2RlLm1hcmdpbi5yaWdodEluc2V0OwogICAgICBtYXJnaW5WID0gbm9kZS5tYXJnaW4udG9wSW5zZXQgKyBub2RlLm1hcmdpbi5ib3R0b21JbnNldDsKICAgIH0KICAgIGxldCBsaW5lSGVpZ2h0ID0gbnVsbDsKICAgIGxldCBtYXJnaW4gPSBudWxsOwogICAgaWYgKG5vZGUucGFyYSkgewogICAgICBtYXJnaW4gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBsaW5lSGVpZ2h0ID0gbm9kZS5wYXJhLmxpbmVIZWlnaHQgPT09ICIiID8gbnVsbCA6IG5vZGUucGFyYS5saW5lSGVpZ2h0OwogICAgICBtYXJnaW4udG9wID0gbm9kZS5wYXJhLnNwYWNlQWJvdmUgPT09ICIiID8gMCA6IG5vZGUucGFyYS5zcGFjZUFib3ZlOwogICAgICBtYXJnaW4uYm90dG9tID0gbm9kZS5wYXJhLnNwYWNlQmVsb3cgPT09ICIiID8gMCA6IG5vZGUucGFyYS5zcGFjZUJlbG93OwogICAgICBtYXJnaW4ubGVmdCA9IG5vZGUucGFyYS5tYXJnaW5MZWZ0ID09PSAiIiA/IDAgOiBub2RlLnBhcmEubWFyZ2luTGVmdDsKICAgICAgbWFyZ2luLnJpZ2h0ID0gbm9kZS5wYXJhLm1hcmdpblJpZ2h0ID09PSAiIiA/IDAgOiBub2RlLnBhcmEubWFyZ2luUmlnaHQ7CiAgICB9CiAgICBsZXQgZm9udCA9IG5vZGUuZm9udDsKICAgIGlmICghZm9udCkgewogICAgICBjb25zdCByb290ID0gbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpOwogICAgICBsZXQgcGFyZW50ID0gbm9kZVskZ2V0UGFyZW50XSgpOwogICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudCAhPT0gcm9vdCkgewogICAgICAgIGlmIChwYXJlbnQuZm9udCkgewogICAgICAgICAgZm9udCA9IHBhcmVudC5mb250OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHBhcmVudCA9IHBhcmVudFskZ2V0UGFyZW50XSgpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBtYXhXaWR0aCA9IChub2RlLncgfHwgYXZhaWxhYmxlU3BhY2Uud2lkdGgpIC0gbWFyZ2luSDsKICAgIGNvbnN0IGZvbnRGaW5kZXIgPSBub2RlWyRnbG9iYWxEYXRhXS5mb250RmluZGVyOwogICAgaWYgKG5vZGUudmFsdWUuZXhEYXRhICYmIG5vZGUudmFsdWUuZXhEYXRhWyRjb250ZW50XSAmJiBub2RlLnZhbHVlLmV4RGF0YS5jb250ZW50VHlwZSA9PT0gInRleHQvaHRtbCIpIHsKICAgICAgY29uc3QgcmVzID0gbGF5b3V0VGV4dChub2RlLnZhbHVlLmV4RGF0YVskY29udGVudF0sIGZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlciwgbWF4V2lkdGgpOwogICAgICB3aWR0aCA9IHJlcy53aWR0aDsKICAgICAgaGVpZ2h0ID0gcmVzLmhlaWdodDsKICAgICAgaXNCcm9rZW4gPSByZXMuaXNCcm9rZW47CiAgICB9IGVsc2UgewogICAgICBjb25zdCB0ZXh0ID0gbm9kZS52YWx1ZVskdGV4dF0oKTsKICAgICAgaWYgKHRleHQpIHsKICAgICAgICBjb25zdCByZXMgPSBsYXlvdXRUZXh0KHRleHQsIGZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlciwgbWF4V2lkdGgpOwogICAgICAgIHdpZHRoID0gcmVzLndpZHRoOwogICAgICAgIGhlaWdodCA9IHJlcy5oZWlnaHQ7CiAgICAgICAgaXNCcm9rZW4gPSByZXMuaXNCcm9rZW47CiAgICAgIH0KICAgIH0KICAgIGlmICh3aWR0aCAhPT0gbnVsbCAmJiAhbm9kZS53KSB7CiAgICAgIHdpZHRoICs9IG1hcmdpbkg7CiAgICB9CiAgICBpZiAoaGVpZ2h0ICE9PSBudWxsICYmICFub2RlLmgpIHsKICAgICAgaGVpZ2h0ICs9IG1hcmdpblY7CiAgICB9CiAgfQogIHJldHVybiB7CiAgICB3OiB3aWR0aCwKICAgIGg6IGhlaWdodCwKICAgIGlzQnJva2VuCiAgfTsKfQpmdW5jdGlvbiBjb21wdXRlQmJveChub2RlLCBodG1sLCBhdmFpbGFibGVTcGFjZSkgewogIGxldCBiYm94OwogIGlmIChub2RlLncgIT09ICIiICYmIG5vZGUuaCAhPT0gIiIpIHsKICAgIGJib3ggPSBbbm9kZS54LCBub2RlLnksIG5vZGUudywgbm9kZS5oXTsKICB9IGVsc2UgewogICAgaWYgKCFhdmFpbGFibGVTcGFjZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGxldCB3aWR0aCA9IG5vZGUudzsKICAgIGlmICh3aWR0aCA9PT0gIiIpIHsKICAgICAgaWYgKG5vZGUubWF4VyA9PT0gMCkgewogICAgICAgIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICAgICAgd2lkdGggPSBwYXJlbnQubGF5b3V0ID09PSAicG9zaXRpb24iICYmIHBhcmVudC53ICE9PSAiIiA/IDAgOiBub2RlLm1pblc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2lkdGggPSBNYXRoLm1pbihub2RlLm1heFcsIGF2YWlsYWJsZVNwYWNlLndpZHRoKTsKICAgICAgfQogICAgICBodG1sLmF0dHJpYnV0ZXMuc3R5bGUud2lkdGggPSBtZWFzdXJlVG9TdHJpbmcod2lkdGgpOwogICAgfQogICAgbGV0IGhlaWdodCA9IG5vZGUuaDsKICAgIGlmIChoZWlnaHQgPT09ICIiKSB7CiAgICAgIGlmIChub2RlLm1heEggPT09IDApIHsKICAgICAgICBjb25zdCBwYXJlbnQgPSBub2RlWyRnZXRTdWJmb3JtUGFyZW50XSgpOwogICAgICAgIGhlaWdodCA9IHBhcmVudC5sYXlvdXQgPT09ICJwb3NpdGlvbiIgJiYgcGFyZW50LmggIT09ICIiID8gMCA6IG5vZGUubWluSDsKICAgICAgfSBlbHNlIHsKICAgICAgICBoZWlnaHQgPSBNYXRoLm1pbihub2RlLm1heEgsIGF2YWlsYWJsZVNwYWNlLmhlaWdodCk7CiAgICAgIH0KICAgICAgaHRtbC5hdHRyaWJ1dGVzLnN0eWxlLmhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyhoZWlnaHQpOwogICAgfQogICAgYmJveCA9IFtub2RlLngsIG5vZGUueSwgd2lkdGgsIGhlaWdodF07CiAgfQogIHJldHVybiBiYm94Owp9CmZ1bmN0aW9uIGZpeERpbWVuc2lvbnMobm9kZSkgewogIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgaWYgKHBhcmVudC5sYXlvdXQ/LmluY2x1ZGVzKCJyb3ciKSkgewogICAgY29uc3QgZXh0cmEgPSBwYXJlbnRbJGV4dHJhXTsKICAgIGNvbnN0IGNvbFNwYW4gPSBub2RlLmNvbFNwYW47CiAgICBsZXQgd2lkdGg7CiAgICBpZiAoY29sU3BhbiA9PT0gLTEpIHsKICAgICAgd2lkdGggPSBNYXRoLnN1bVByZWNpc2UoZXh0cmEuY29sdW1uV2lkdGhzLnNsaWNlKGV4dHJhLmN1cnJlbnRDb2x1bW4pKTsKICAgIH0gZWxzZSB7CiAgICAgIHdpZHRoID0gTWF0aC5zdW1QcmVjaXNlKGV4dHJhLmNvbHVtbldpZHRocy5zbGljZShleHRyYS5jdXJyZW50Q29sdW1uLCBleHRyYS5jdXJyZW50Q29sdW1uICsgY29sU3BhbikpOwogICAgfQogICAgaWYgKCFpc05hTih3aWR0aCkpIHsKICAgICAgbm9kZS53ID0gd2lkdGg7CiAgICB9CiAgfQogIGlmIChwYXJlbnQubGF5b3V0ICYmIHBhcmVudC5sYXlvdXQgIT09ICJwb3NpdGlvbiIpIHsKICAgIG5vZGUueCA9IG5vZGUueSA9IDA7CiAgfQogIGlmIChub2RlLmxheW91dCA9PT0gInRhYmxlIikgewogICAgaWYgKG5vZGUudyA9PT0gIiIgJiYgQXJyYXkuaXNBcnJheShub2RlLmNvbHVtbldpZHRocykpIHsKICAgICAgbm9kZS53ID0gTWF0aC5zdW1QcmVjaXNlKG5vZGUuY29sdW1uV2lkdGhzKTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gbGF5b3V0Q2xhc3Mobm9kZSkgewogIHN3aXRjaCAobm9kZS5sYXlvdXQpIHsKICAgIGNhc2UgInBvc2l0aW9uIjoKICAgICAgcmV0dXJuICJ4ZmFQb3NpdGlvbiI7CiAgICBjYXNlICJsci10YiI6CiAgICAgIHJldHVybiAieGZhTHJUYiI7CiAgICBjYXNlICJybC1yb3ciOgogICAgICByZXR1cm4gInhmYVJsUm93IjsKICAgIGNhc2UgInJsLXRiIjoKICAgICAgcmV0dXJuICJ4ZmFSbFRiIjsKICAgIGNhc2UgInJvdyI6CiAgICAgIHJldHVybiAieGZhUm93IjsKICAgIGNhc2UgInRhYmxlIjoKICAgICAgcmV0dXJuICJ4ZmFUYWJsZSI7CiAgICBjYXNlICJ0YiI6CiAgICAgIHJldHVybiAieGZhVGIiOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuICJ4ZmFQb3NpdGlvbiI7CiAgfQp9CmZ1bmN0aW9uIHRvU3R5bGUobm9kZSwgLi4ubmFtZXMpIHsKICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7CiAgICBjb25zdCB2YWx1ZSA9IG5vZGVbbmFtZV07CiAgICBpZiAodmFsdWUgPT09IG51bGwpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoY29udmVydGVycy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICBjb252ZXJ0ZXJzW25hbWVdKG5vZGUsIHN0eWxlKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBYRkFPYmplY3QpIHsKICAgICAgY29uc3QgbmV3U3R5bGUgPSB2YWx1ZVskdG9TdHlsZV0oKTsKICAgICAgaWYgKG5ld1N0eWxlKSB7CiAgICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgbmV3U3R5bGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oYChERUJVRykgLSBYRkEgLSBzdHlsZSBmb3IgJHtuYW1lfSBub3QgaW1wbGVtZW50ZWQgeWV0YCk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHN0eWxlOwp9CmZ1bmN0aW9uIGNyZWF0ZVdyYXBwZXIobm9kZSwgaHRtbCkgewogIGNvbnN0IHsKICAgIGF0dHJpYnV0ZXMKICB9ID0gaHRtbDsKICBjb25zdCB7CiAgICBzdHlsZQogIH0gPSBhdHRyaWJ1dGVzOwogIGNvbnN0IHdyYXBwZXIgPSB7CiAgICBuYW1lOiAiZGl2IiwKICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgY2xhc3M6IFsieGZhV3JhcHBlciJdLAogICAgICBzdHlsZTogT2JqZWN0LmNyZWF0ZShudWxsKQogICAgfSwKICAgIGNoaWxkcmVuOiBbXQogIH07CiAgYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFXcmFwcGVkIik7CiAgaWYgKG5vZGUuYm9yZGVyKSB7CiAgICBjb25zdCB7CiAgICAgIHdpZHRocywKICAgICAgaW5zZXRzCiAgICB9ID0gbm9kZS5ib3JkZXJbJGV4dHJhXTsKICAgIGxldCB3aWR0aCwgaGVpZ2h0OwogICAgbGV0IHRvcCA9IGluc2V0c1swXTsKICAgIGxldCBsZWZ0ID0gaW5zZXRzWzNdOwogICAgY29uc3QgaW5zZXRzSCA9IGluc2V0c1swXSArIGluc2V0c1syXTsKICAgIGNvbnN0IGluc2V0c1cgPSBpbnNldHNbMV0gKyBpbnNldHNbM107CiAgICBzd2l0Y2ggKG5vZGUuYm9yZGVyLmhhbmQpIHsKICAgICAgY2FzZSAiZXZlbiI6CiAgICAgICAgdG9wIC09IHdpZHRoc1swXSAvIDI7CiAgICAgICAgbGVmdCAtPSB3aWR0aHNbM10gLyAyOwogICAgICAgIHdpZHRoID0gYGNhbGMoMTAwJSArICR7KHdpZHRoc1sxXSArIHdpZHRoc1szXSkgLyAyIC0gaW5zZXRzV31weClgOwogICAgICAgIGhlaWdodCA9IGBjYWxjKDEwMCUgKyAkeyh3aWR0aHNbMF0gKyB3aWR0aHNbMl0pIC8gMiAtIGluc2V0c0h9cHgpYDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgdG9wIC09IHdpZHRoc1swXTsKICAgICAgICBsZWZ0IC09IHdpZHRoc1szXTsKICAgICAgICB3aWR0aCA9IGBjYWxjKDEwMCUgKyAke3dpZHRoc1sxXSArIHdpZHRoc1szXSAtIGluc2V0c1d9cHgpYDsKICAgICAgICBoZWlnaHQgPSBgY2FsYygxMDAlICsgJHt3aWR0aHNbMF0gKyB3aWR0aHNbMl0gLSBpbnNldHNIfXB4KWA7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICB3aWR0aCA9IGluc2V0c1cgPyBgY2FsYygxMDAlIC0gJHtpbnNldHNXfXB4KWAgOiAiMTAwJSI7CiAgICAgICAgaGVpZ2h0ID0gaW5zZXRzSCA/IGBjYWxjKDEwMCUgLSAke2luc2V0c0h9cHgpYCA6ICIxMDAlIjsKICAgICAgICBicmVhazsKICAgIH0KICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbInhmYUJvcmRlciJdOwogICAgaWYgKGlzUHJpbnRPbmx5KG5vZGUuYm9yZGVyKSkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgY29uc3QgYm9yZGVyID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBjbGFzc05hbWVzLAogICAgICAgIHN0eWxlOiB7CiAgICAgICAgICB0b3A6IGAke3RvcH1weGAsCiAgICAgICAgICBsZWZ0OiBgJHtsZWZ0fXB4YCwKICAgICAgICAgIHdpZHRoLAogICAgICAgICAgaGVpZ2h0CiAgICAgICAgfQogICAgICB9LAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgICBmb3IgKGNvbnN0IGtleSBvZiBbImJvcmRlciIsICJib3JkZXJXaWR0aCIsICJib3JkZXJDb2xvciIsICJib3JkZXJSYWRpdXMiLCAiYm9yZGVyU3R5bGUiXSkgewogICAgICBpZiAoc3R5bGVba2V5XSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgYm9yZGVyLmF0dHJpYnV0ZXMuc3R5bGVba2V5XSA9IHN0eWxlW2tleV07CiAgICAgICAgZGVsZXRlIHN0eWxlW2tleV07CiAgICAgIH0KICAgIH0KICAgIHdyYXBwZXIuY2hpbGRyZW4ucHVzaChib3JkZXIsIGh0bWwpOwogIH0gZWxzZSB7CiAgICB3cmFwcGVyLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgfQogIGZvciAoY29uc3Qga2V5IG9mIFsiYmFja2dyb3VuZCIsICJiYWNrZ3JvdW5kQ2xpcCIsICJ0b3AiLCAibGVmdCIsICJ3aWR0aCIsICJoZWlnaHQiLCAibWluV2lkdGgiLCAibWluSGVpZ2h0IiwgIm1heFdpZHRoIiwgIm1heEhlaWdodCIsICJ0cmFuc2Zvcm0iLCAidHJhbnNmb3JtT3JpZ2luIiwgInZpc2liaWxpdHkiXSkgewogICAgaWYgKHN0eWxlW2tleV0gIT09IHVuZGVmaW5lZCkgewogICAgICB3cmFwcGVyLmF0dHJpYnV0ZXMuc3R5bGVba2V5XSA9IHN0eWxlW2tleV07CiAgICAgIGRlbGV0ZSBzdHlsZVtrZXldOwogICAgfQogIH0KICB3cmFwcGVyLmF0dHJpYnV0ZXMuc3R5bGUucG9zaXRpb24gPSBzdHlsZS5wb3NpdGlvbiA9PT0gImFic29sdXRlIiA/ICJhYnNvbHV0ZSIgOiAicmVsYXRpdmUiOwogIGRlbGV0ZSBzdHlsZS5wb3NpdGlvbjsKICBpZiAoc3R5bGUuYWxpZ25TZWxmKSB7CiAgICB3cmFwcGVyLmF0dHJpYnV0ZXMuc3R5bGUuYWxpZ25TZWxmID0gc3R5bGUuYWxpZ25TZWxmOwogICAgZGVsZXRlIHN0eWxlLmFsaWduU2VsZjsKICB9CiAgcmV0dXJuIHdyYXBwZXI7Cn0KZnVuY3Rpb24gZml4VGV4dEluZGVudChzdHlsZXMpIHsKICBjb25zdCBpbmRlbnQgPSBnZXRNZWFzdXJlbWVudChzdHlsZXMudGV4dEluZGVudCwgIjBweCIpOwogIGlmIChpbmRlbnQgPj0gMCkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCBhbGlnbiA9IHN0eWxlcy50ZXh0QWxpZ24gPT09ICJyaWdodCIgPyAicmlnaHQiIDogImxlZnQiOwogIGNvbnN0IG5hbWUgPSAicGFkZGluZyIgKyAoYWxpZ24gPT09ICJsZWZ0IiA/ICJMZWZ0IiA6ICJSaWdodCIpOwogIGNvbnN0IHBhZGRpbmcgPSBnZXRNZWFzdXJlbWVudChzdHlsZXNbbmFtZV0sICIwcHgiKTsKICBzdHlsZXNbbmFtZV0gPSBgJHtwYWRkaW5nIC0gaW5kZW50fXB4YDsKfQpmdW5jdGlvbiBzZXRBY2Nlc3Mobm9kZSwgY2xhc3NOYW1lcykgewogIHN3aXRjaCAobm9kZS5hY2Nlc3MpIHsKICAgIGNhc2UgIm5vbkludGVyYWN0aXZlIjoKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFOb25JbnRlcmFjdGl2ZSIpOwogICAgICBicmVhazsKICAgIGNhc2UgInJlYWRPbmx5IjoKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFSZWFkT25seSIpOwogICAgICBicmVhazsKICAgIGNhc2UgInByb3RlY3RlZCI6CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhRGlzYWJsZWQiKTsKICAgICAgYnJlYWs7CiAgfQp9CmZ1bmN0aW9uIGlzUHJpbnRPbmx5KG5vZGUpIHsKICByZXR1cm4gbm9kZS5yZWxldmFudC5sZW5ndGggPiAwICYmICFub2RlLnJlbGV2YW50WzBdLmV4Y2x1ZGVkICYmIG5vZGUucmVsZXZhbnRbMF0udmlld25hbWUgPT09ICJwcmludCI7Cn0KZnVuY3Rpb24gZ2V0Q3VycmVudFBhcmEobm9kZSkgewogIGNvbnN0IHN0YWNrID0gbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ucGFyYVN0YWNrOwogIHJldHVybiBzdGFjay5sZW5ndGggPyBzdGFjay5hdCgtMSkgOiBudWxsOwp9CmZ1bmN0aW9uIHNldFBhcmEobm9kZSwgbm9kZVN0eWxlLCB2YWx1ZSkgewogIGlmICh2YWx1ZS5hdHRyaWJ1dGVzLmNsYXNzPy5pbmNsdWRlcygieGZhUmljaCIpKSB7CiAgICBpZiAobm9kZVN0eWxlKSB7CiAgICAgIGlmIChub2RlLmggPT09ICIiKSB7CiAgICAgICAgbm9kZVN0eWxlLmhlaWdodCA9ICJhdXRvIjsKICAgICAgfQogICAgICBpZiAobm9kZS53ID09PSAiIikgewogICAgICAgIG5vZGVTdHlsZS53aWR0aCA9ICJhdXRvIjsKICAgICAgfQogICAgfQogICAgY29uc3QgcGFyYSA9IGdldEN1cnJlbnRQYXJhKG5vZGUpOwogICAgaWYgKHBhcmEpIHsKICAgICAgY29uc3QgdmFsdWVTdHlsZSA9IHZhbHVlLmF0dHJpYnV0ZXMuc3R5bGU7CiAgICAgIHZhbHVlU3R5bGUuZGlzcGxheSA9ICJmbGV4IjsKICAgICAgdmFsdWVTdHlsZS5mbGV4RGlyZWN0aW9uID0gImNvbHVtbiI7CiAgICAgIHN3aXRjaCAocGFyYS52QWxpZ24pIHsKICAgICAgICBjYXNlICJ0b3AiOgogICAgICAgICAgdmFsdWVTdHlsZS5qdXN0aWZ5Q29udGVudCA9ICJzdGFydCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJib3R0b20iOgogICAgICAgICAgdmFsdWVTdHlsZS5qdXN0aWZ5Q29udGVudCA9ICJlbmQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWlkZGxlIjoKICAgICAgICAgIHZhbHVlU3R5bGUuanVzdGlmeUNvbnRlbnQgPSAiY2VudGVyIjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNvbnN0IHBhcmFTdHlsZSA9IHBhcmFbJHRvU3R5bGVdKCk7CiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhwYXJhU3R5bGUpKSB7CiAgICAgICAgaWYgKCEoa2V5IGluIHZhbHVlU3R5bGUpKSB7CiAgICAgICAgICB2YWx1ZVN0eWxlW2tleV0gPSB2YWw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CmZ1bmN0aW9uIHNldEZvbnRGYW1pbHkoeGZhRm9udCwgbm9kZSwgZm9udEZpbmRlciwgc3R5bGUpIHsKICBpZiAoIWZvbnRGaW5kZXIpIHsKICAgIGRlbGV0ZSBzdHlsZS5mb250RmFtaWx5OwogICAgcmV0dXJuOwogIH0KICBjb25zdCBuYW1lID0gc3RyaXBRdW90ZXMoeGZhRm9udC50eXBlZmFjZSk7CiAgc3R5bGUuZm9udEZhbWlseSA9IGAiJHtuYW1lfSJgOwogIGNvbnN0IHR5cGVmYWNlID0gZm9udEZpbmRlci5maW5kKG5hbWUpOwogIGlmICh0eXBlZmFjZSkgewogICAgY29uc3QgewogICAgICBmb250RmFtaWx5CiAgICB9ID0gdHlwZWZhY2UucmVndWxhci5jc3NGb250SW5mbzsKICAgIGlmIChmb250RmFtaWx5ICE9PSBuYW1lKSB7CiAgICAgIHN0eWxlLmZvbnRGYW1pbHkgPSBgIiR7Zm9udEZhbWlseX0iYDsKICAgIH0KICAgIGNvbnN0IHBhcmEgPSBnZXRDdXJyZW50UGFyYShub2RlKTsKICAgIGlmIChwYXJhICYmIHBhcmEubGluZUhlaWdodCAhPT0gIiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHN0eWxlLmxpbmVIZWlnaHQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGRmRm9udCA9IHNlbGVjdEZvbnQoeGZhRm9udCwgdHlwZWZhY2UpOwogICAgaWYgKHBkZkZvbnQpIHsKICAgICAgc3R5bGUubGluZUhlaWdodCA9IE1hdGgubWF4KDEuMiwgcGRmRm9udC5saW5lSGVpZ2h0KTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gZml4VVJMKHN0cikgewogIGNvbnN0IGFic29sdXRlVXJsID0gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybChzdHIsIG51bGwsIHsKICAgIGFkZERlZmF1bHRQcm90b2NvbDogdHJ1ZSwKICAgIHRyeUNvbnZlcnRFbmNvZGluZzogdHJ1ZQogIH0pOwogIHJldHVybiBhYnNvbHV0ZVVybCA/IGFic29sdXRlVXJsLmhyZWYgOiBudWxsOwp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvbGF5b3V0LmpzCgoKCmZ1bmN0aW9uIGNyZWF0ZUxpbmUobm9kZSwgY2hpbGRyZW4pIHsKICByZXR1cm4gewogICAgbmFtZTogImRpdiIsCiAgICBhdHRyaWJ1dGVzOiB7CiAgICAgIGNsYXNzOiBbbm9kZS5sYXlvdXQgPT09ICJsci10YiIgPyAieGZhTHIiIDogInhmYVJsIl0KICAgIH0sCiAgICBjaGlsZHJlbgogIH07Cn0KZnVuY3Rpb24gZmx1c2hIVE1MKG5vZGUpIHsKICBpZiAoIW5vZGVbJGV4dHJhXSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGNvbnN0IGF0dHJpYnV0ZXMgPSBub2RlWyRleHRyYV0uYXR0cmlidXRlczsKICBjb25zdCBodG1sID0gewogICAgbmFtZTogImRpdiIsCiAgICBhdHRyaWJ1dGVzLAogICAgY2hpbGRyZW46IG5vZGVbJGV4dHJhXS5jaGlsZHJlbgogIH07CiAgaWYgKG5vZGVbJGV4dHJhXS5mYWlsaW5nTm9kZSkgewogICAgY29uc3QgaHRtbEZyb21GYWlsaW5nID0gbm9kZVskZXh0cmFdLmZhaWxpbmdOb2RlWyRmbHVzaEhUTUxdKCk7CiAgICBpZiAoaHRtbEZyb21GYWlsaW5nKSB7CiAgICAgIGlmIChub2RlLmxheW91dC5lbmRzV2l0aCgiLXRiIikpIHsKICAgICAgICBodG1sLmNoaWxkcmVuLnB1c2goY3JlYXRlTGluZShub2RlLCBbaHRtbEZyb21GYWlsaW5nXSkpOwogICAgICB9IGVsc2UgewogICAgICAgIGh0bWwuY2hpbGRyZW4ucHVzaChodG1sRnJvbUZhaWxpbmcpOwogICAgICB9CiAgICB9CiAgfQogIGlmIChodG1sLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiBodG1sOwp9CmZ1bmN0aW9uIGFkZEhUTUwobm9kZSwgaHRtbCwgYmJveCkgewogIGNvbnN0IGV4dHJhID0gbm9kZVskZXh0cmFdOwogIGNvbnN0IGF2YWlsYWJsZVNwYWNlID0gZXh0cmEuYXZhaWxhYmxlU3BhY2U7CiAgY29uc3QgW3gsIHksIHcsIGhdID0gYmJveDsKICBzd2l0Y2ggKG5vZGUubGF5b3V0KSB7CiAgICBjYXNlICJwb3NpdGlvbiI6CiAgICAgIHsKICAgICAgICBleHRyYS53aWR0aCA9IE1hdGgubWF4KGV4dHJhLndpZHRoLCB4ICsgdyk7CiAgICAgICAgZXh0cmEuaGVpZ2h0ID0gTWF0aC5tYXgoZXh0cmEuaGVpZ2h0LCB5ICsgaCk7CiAgICAgICAgZXh0cmEuY2hpbGRyZW4ucHVzaChodG1sKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAibHItdGIiOgogICAgY2FzZSAicmwtdGIiOgogICAgICBpZiAoIWV4dHJhLmxpbmUgfHwgZXh0cmEuYXR0ZW1wdCA9PT0gMSkgewogICAgICAgIGV4dHJhLmxpbmUgPSBjcmVhdGVMaW5lKG5vZGUsIFtdKTsKICAgICAgICBleHRyYS5jaGlsZHJlbi5wdXNoKGV4dHJhLmxpbmUpOwogICAgICAgIGV4dHJhLm51bWJlckluTGluZSA9IDA7CiAgICAgIH0KICAgICAgZXh0cmEubnVtYmVySW5MaW5lICs9IDE7CiAgICAgIGV4dHJhLmxpbmUuY2hpbGRyZW4ucHVzaChodG1sKTsKICAgICAgaWYgKGV4dHJhLmF0dGVtcHQgPT09IDApIHsKICAgICAgICBleHRyYS5jdXJyZW50V2lkdGggKz0gdzsKICAgICAgICBleHRyYS5oZWlnaHQgPSBNYXRoLm1heChleHRyYS5oZWlnaHQsIGV4dHJhLnByZXZIZWlnaHQgKyBoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBleHRyYS5jdXJyZW50V2lkdGggPSB3OwogICAgICAgIGV4dHJhLnByZXZIZWlnaHQgPSBleHRyYS5oZWlnaHQ7CiAgICAgICAgZXh0cmEuaGVpZ2h0ICs9IGg7CiAgICAgICAgZXh0cmEuYXR0ZW1wdCA9IDA7CiAgICAgIH0KICAgICAgZXh0cmEud2lkdGggPSBNYXRoLm1heChleHRyYS53aWR0aCwgZXh0cmEuY3VycmVudFdpZHRoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJybC1yb3ciOgogICAgY2FzZSAicm93IjoKICAgICAgewogICAgICAgIGV4dHJhLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgICAgICAgZXh0cmEud2lkdGggKz0gdzsKICAgICAgICBleHRyYS5oZWlnaHQgPSBNYXRoLm1heChleHRyYS5oZWlnaHQsIGgpOwogICAgICAgIGNvbnN0IGhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyhleHRyYS5oZWlnaHQpOwogICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZXh0cmEuY2hpbGRyZW4pIHsKICAgICAgICAgIGNoaWxkLmF0dHJpYnV0ZXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAidGFibGUiOgogICAgICB7CiAgICAgICAgZXh0cmEud2lkdGggPSBNYXRoQ2xhbXAodywgZXh0cmEud2lkdGgsIGF2YWlsYWJsZVNwYWNlLndpZHRoKTsKICAgICAgICBleHRyYS5oZWlnaHQgKz0gaDsKICAgICAgICBleHRyYS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICBjYXNlICJ0YiI6CiAgICAgIHsKICAgICAgICBleHRyYS53aWR0aCA9IE1hdGhDbGFtcCh3LCBleHRyYS53aWR0aCwgYXZhaWxhYmxlU3BhY2Uud2lkdGgpOwogICAgICAgIGV4dHJhLmhlaWdodCArPSBoOwogICAgICAgIGV4dHJhLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICB9Cn0KZnVuY3Rpb24gZ2V0QXZhaWxhYmxlU3BhY2Uobm9kZSkgewogIGNvbnN0IGF2YWlsYWJsZVNwYWNlID0gbm9kZVskZXh0cmFdLmF2YWlsYWJsZVNwYWNlOwogIGNvbnN0IG1hcmdpblYgPSBub2RlLm1hcmdpbiA/IG5vZGUubWFyZ2luLnRvcEluc2V0ICsgbm9kZS5tYXJnaW4uYm90dG9tSW5zZXQgOiAwOwogIGNvbnN0IG1hcmdpbkggPSBub2RlLm1hcmdpbiA/IG5vZGUubWFyZ2luLmxlZnRJbnNldCArIG5vZGUubWFyZ2luLnJpZ2h0SW5zZXQgOiAwOwogIHN3aXRjaCAobm9kZS5sYXlvdXQpIHsKICAgIGNhc2UgImxyLXRiIjoKICAgIGNhc2UgInJsLXRiIjoKICAgICAgaWYgKG5vZGVbJGV4dHJhXS5hdHRlbXB0ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHdpZHRoOiBhdmFpbGFibGVTcGFjZS53aWR0aCAtIG1hcmdpbkggLSBub2RlWyRleHRyYV0uY3VycmVudFdpZHRoLAogICAgICAgICAgaGVpZ2h0OiBhdmFpbGFibGVTcGFjZS5oZWlnaHQgLSBtYXJnaW5WIC0gbm9kZVskZXh0cmFdLnByZXZIZWlnaHQKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgd2lkdGg6IGF2YWlsYWJsZVNwYWNlLndpZHRoIC0gbWFyZ2luSCwKICAgICAgICBoZWlnaHQ6IGF2YWlsYWJsZVNwYWNlLmhlaWdodCAtIG1hcmdpblYgLSBub2RlWyRleHRyYV0uaGVpZ2h0CiAgICAgIH07CiAgICBjYXNlICJybC1yb3ciOgogICAgY2FzZSAicm93IjoKICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLnN1bVByZWNpc2Uobm9kZVskZXh0cmFdLmNvbHVtbldpZHRocy5zbGljZShub2RlWyRleHRyYV0uY3VycmVudENvbHVtbikpOwogICAgICByZXR1cm4gewogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodDogYXZhaWxhYmxlU3BhY2UuaGVpZ2h0IC0gbWFyZ2luSAogICAgICB9OwogICAgY2FzZSAidGFibGUiOgogICAgY2FzZSAidGIiOgogICAgICByZXR1cm4gewogICAgICAgIHdpZHRoOiBhdmFpbGFibGVTcGFjZS53aWR0aCAtIG1hcmdpbkgsCiAgICAgICAgaGVpZ2h0OiBhdmFpbGFibGVTcGFjZS5oZWlnaHQgLSBtYXJnaW5WIC0gbm9kZVskZXh0cmFdLmhlaWdodAogICAgICB9OwogICAgY2FzZSAicG9zaXRpb24iOgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGF2YWlsYWJsZVNwYWNlOwogIH0KfQpmdW5jdGlvbiBnZXRUcmFuc2Zvcm1lZEJCb3gobm9kZSkgewogIGxldCB3ID0gbm9kZS53ID09PSAiIiA/IE5hTiA6IG5vZGUudzsKICBsZXQgaCA9IG5vZGUuaCA9PT0gIiIgPyBOYU4gOiBub2RlLmg7CiAgbGV0IFtjZW50ZXJYLCBjZW50ZXJZXSA9IFswLCAwXTsKICBzd2l0Y2ggKG5vZGUuYW5jaG9yVHlwZSB8fCAiIikgewogICAgY2FzZSAiYm90dG9tQ2VudGVyIjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3cgLyAyLCBoXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJib3R0b21MZWZ0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gWzAsIGhdOwogICAgICBicmVhazsKICAgIGNhc2UgImJvdHRvbVJpZ2h0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3csIGhdOwogICAgICBicmVhazsKICAgIGNhc2UgIm1pZGRsZUNlbnRlciI6CiAgICAgIFtjZW50ZXJYLCBjZW50ZXJZXSA9IFt3IC8gMiwgaCAvIDJdOwogICAgICBicmVhazsKICAgIGNhc2UgIm1pZGRsZUxlZnQiOgogICAgICBbY2VudGVyWCwgY2VudGVyWV0gPSBbMCwgaCAvIDJdOwogICAgICBicmVhazsKICAgIGNhc2UgIm1pZGRsZVJpZ2h0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3csIGggLyAyXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJ0b3BDZW50ZXIiOgogICAgICBbY2VudGVyWCwgY2VudGVyWV0gPSBbdyAvIDIsIDBdOwogICAgICBicmVhazsKICAgIGNhc2UgInRvcFJpZ2h0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3csIDBdOwogICAgICBicmVhazsKICB9CiAgbGV0IHgsIHk7CiAgc3dpdGNoIChub2RlLnJvdGF0ZSB8fCAwKSB7CiAgICBjYXNlIDA6CiAgICAgIFt4LCB5XSA9IFstY2VudGVyWCwgLWNlbnRlclldOwogICAgICBicmVhazsKICAgIGNhc2UgOTA6CiAgICAgIFt4LCB5XSA9IFstY2VudGVyWSwgY2VudGVyWF07CiAgICAgIFt3LCBoXSA9IFtoLCAtd107CiAgICAgIGJyZWFrOwogICAgY2FzZSAxODA6CiAgICAgIFt4LCB5XSA9IFtjZW50ZXJYLCBjZW50ZXJZXTsKICAgICAgW3csIGhdID0gWy13LCAtaF07CiAgICAgIGJyZWFrOwogICAgY2FzZSAyNzA6CiAgICAgIFt4LCB5XSA9IFtjZW50ZXJZLCAtY2VudGVyWF07CiAgICAgIFt3LCBoXSA9IFstaCwgd107CiAgICAgIGJyZWFrOwogIH0KICByZXR1cm4gW25vZGUueCArIHggKyBNYXRoLm1pbigwLCB3KSwgbm9kZS55ICsgeSArIE1hdGgubWluKDAsIGgpLCBNYXRoLmFicyh3KSwgTWF0aC5hYnMoaCldOwp9CmZ1bmN0aW9uIGNoZWNrRGltZW5zaW9ucyhub2RlLCBzcGFjZSkgewogIGlmIChub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSA9PT0gbnVsbCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGlmIChub2RlLncgPT09IDAgfHwgbm9kZS5oID09PSAwKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgY29uc3QgRVJST1IgPSAyOwogIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgY29uc3QgYXR0ZW1wdCA9IHBhcmVudFskZXh0cmFdPy5hdHRlbXB0IHx8IDA7CiAgY29uc3QgWywgeSwgdywgaF0gPSBnZXRUcmFuc2Zvcm1lZEJCb3gobm9kZSk7CiAgc3dpdGNoIChwYXJlbnQubGF5b3V0KSB7CiAgICBjYXNlICJsci10YiI6CiAgICBjYXNlICJybC10YiI6CiAgICAgIGlmIChhdHRlbXB0ID09PSAwKSB7CiAgICAgICAgaWYgKCFub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpIHsKICAgICAgICAgIGlmIChub2RlLmggIT09ICIiICYmIE1hdGgucm91bmQoaCAtIHNwYWNlLmhlaWdodCkgPiBFUlJPUikgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobm9kZS53ICE9PSAiIikgewogICAgICAgICAgICBpZiAoTWF0aC5yb3VuZCh3IC0gc3BhY2Uud2lkdGgpIDw9IEVSUk9SKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhcmVudFskZXh0cmFdLm51bWJlckluTGluZSA9PT0gMCkgewogICAgICAgICAgICAgIHJldHVybiBzcGFjZS5oZWlnaHQgPiBFUlJPUjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3BhY2Uud2lkdGggPiBFUlJPUjsKICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUudyAhPT0gIiIpIHsKICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHcgLSBzcGFjZS53aWR0aCkgPD0gRVJST1I7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcGFjZS53aWR0aCA+IEVSUk9SOwogICAgICB9CiAgICAgIGlmIChub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAobm9kZS5oICE9PSAiIiAmJiBNYXRoLnJvdW5kKGggLSBzcGFjZS5oZWlnaHQpID4gRVJST1IpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKG5vZGUudyA9PT0gIiIgfHwgTWF0aC5yb3VuZCh3IC0gc3BhY2Uud2lkdGgpIDw9IEVSUk9SKSB7CiAgICAgICAgcmV0dXJuIHNwYWNlLmhlaWdodCA+IEVSUk9SOwogICAgICB9CiAgICAgIGlmIChwYXJlbnRbJGlzVGhlcmVNb3JlV2lkdGhdKCkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHNwYWNlLmhlaWdodCA+IEVSUk9SOwogICAgY2FzZSAidGFibGUiOgogICAgY2FzZSAidGIiOgogICAgICBpZiAobm9kZVskZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKG5vZGUuaCAhPT0gIiIgJiYgIW5vZGVbJGlzU3BsaXR0YWJsZV0oKSkgewogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGggLSBzcGFjZS5oZWlnaHQpIDw9IEVSUk9SOwogICAgICB9CiAgICAgIGlmIChub2RlLncgPT09ICIiIHx8IE1hdGgucm91bmQodyAtIHNwYWNlLndpZHRoKSA8PSBFUlJPUikgewogICAgICAgIHJldHVybiBzcGFjZS5oZWlnaHQgPiBFUlJPUjsKICAgICAgfQogICAgICBpZiAocGFyZW50WyRpc1RoZXJlTW9yZVdpZHRoXSgpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiBzcGFjZS5oZWlnaHQgPiBFUlJPUjsKICAgIGNhc2UgInBvc2l0aW9uIjoKICAgICAgaWYgKG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKVskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChub2RlLmggPT09ICIiIHx8IE1hdGgucm91bmQoaCArIHkgLSBzcGFjZS5oZWlnaHQpIDw9IEVSUk9SKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgY29uc3QgYXJlYSA9IG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKVskZXh0cmFdLmN1cnJlbnRDb250ZW50QXJlYTsKICAgICAgcmV0dXJuIGggKyB5ID4gYXJlYS5oOwogICAgY2FzZSAicmwtcm93IjoKICAgIGNhc2UgInJvdyI6CiAgICAgIGlmIChub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAobm9kZS5oICE9PSAiIikgewogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGggLSBzcGFjZS5oZWlnaHQpIDw9IEVSUk9SOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIHRydWU7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvdGVtcGxhdGUuanMKCgoKCgoKCgoKCmNvbnN0IFRFTVBMQVRFX05TX0lEID0gTmFtZXNwYWNlSWRzLnRlbXBsYXRlLmlkOwpjb25zdCBTVkdfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciOwpjb25zdCBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUID0gMjsKY29uc3QgTUFYX0VNUFRZX1BBR0VTID0gMzsKY29uc3QgREVGQVVMVF9UQUJfSU5ERVggPSA1MDAwOwpjb25zdCBIRUFESU5HX1BBVFRFUk4gPSAvXkgoXGQrKSQvOwpjb25zdCBNSU1FUyA9IG5ldyBTZXQoWyJpbWFnZS9naWYiLCAiaW1hZ2UvanBlZyIsICJpbWFnZS9qcGciLCAiaW1hZ2UvcGpwZWciLCAiaW1hZ2UvcG5nIiwgImltYWdlL2FwbmciLCAiaW1hZ2UveC1wbmciLCAiaW1hZ2UvYm1wIiwgImltYWdlL3gtbXMtYm1wIiwgImltYWdlL3RpZmYiLCAiaW1hZ2UvdGlmIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSJdKTsKY29uc3QgSU1BR0VTX0hFQURFUlMgPSBbW1sweDQyLCAweDRkXSwgImltYWdlL2JtcCJdLCBbWzB4ZmYsIDB4ZDgsIDB4ZmZdLCAiaW1hZ2UvanBlZyJdLCBbWzB4NDksIDB4NDksIDB4MmEsIDB4MDBdLCAiaW1hZ2UvdGlmZiJdLCBbWzB4NGQsIDB4NGQsIDB4MDAsIDB4MmFdLCAiaW1hZ2UvdGlmZiJdLCBbWzB4NDcsIDB4NDksIDB4NDYsIDB4MzgsIDB4MzksIDB4NjFdLCAiaW1hZ2UvZ2lmIl0sIFtbMHg4OSwgMHg1MCwgMHg0ZSwgMHg0NywgMHgwZCwgMHgwYSwgMHgxYSwgMHgwYV0sICJpbWFnZS9wbmciXV07CmZ1bmN0aW9uIGdldEJvcmRlckRpbXMobm9kZSkgewogIGlmICghbm9kZSB8fCAhbm9kZS5ib3JkZXIpIHsKICAgIHJldHVybiB7CiAgICAgIHc6IDAsCiAgICAgIGg6IDAKICAgIH07CiAgfQogIGNvbnN0IGJvcmRlckV4dHJhID0gbm9kZS5ib3JkZXJbJGdldEV4dHJhXSgpOwogIGlmICghYm9yZGVyRXh0cmEpIHsKICAgIHJldHVybiB7CiAgICAgIHc6IDAsCiAgICAgIGg6IDAKICAgIH07CiAgfQogIHJldHVybiB7CiAgICB3OiBib3JkZXJFeHRyYS53aWR0aHNbMF0gKyBib3JkZXJFeHRyYS53aWR0aHNbMl0gKyBib3JkZXJFeHRyYS5pbnNldHNbMF0gKyBib3JkZXJFeHRyYS5pbnNldHNbMl0sCiAgICBoOiBib3JkZXJFeHRyYS53aWR0aHNbMV0gKyBib3JkZXJFeHRyYS53aWR0aHNbM10gKyBib3JkZXJFeHRyYS5pbnNldHNbMV0gKyBib3JkZXJFeHRyYS5pbnNldHNbM10KICB9Owp9CmZ1bmN0aW9uIGhhc01hcmdpbihub2RlKSB7CiAgcmV0dXJuIG5vZGUubWFyZ2luICYmIChub2RlLm1hcmdpbi50b3BJbnNldCB8fCBub2RlLm1hcmdpbi5yaWdodEluc2V0IHx8IG5vZGUubWFyZ2luLmJvdHRvbUluc2V0IHx8IG5vZGUubWFyZ2luLmxlZnRJbnNldCk7Cn0KZnVuY3Rpb24gX3NldFZhbHVlKHRlbXBsYXRlTm9kZSwgdmFsdWUpIHsKICBpZiAoIXRlbXBsYXRlTm9kZS52YWx1ZSkgewogICAgY29uc3Qgbm9kZVZhbHVlID0gbmV3IFZhbHVlKHt9KTsKICAgIHRlbXBsYXRlTm9kZVskYXBwZW5kQ2hpbGRdKG5vZGVWYWx1ZSk7CiAgICB0ZW1wbGF0ZU5vZGUudmFsdWUgPSBub2RlVmFsdWU7CiAgfQogIHRlbXBsYXRlTm9kZS52YWx1ZVskc2V0VmFsdWVdKHZhbHVlKTsKfQpmdW5jdGlvbiogZ2V0Q29udGFpbmVkQ2hpbGRyZW4obm9kZSkgewogIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZVskZ2V0Q2hpbGRyZW5dKCkpIHsKICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFN1YmZvcm1TZXQpIHsKICAgICAgeWllbGQqIGNoaWxkWyRnZXRDb250YWluZWRDaGlsZHJlbl0oKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICB5aWVsZCBjaGlsZDsKICB9Cn0KZnVuY3Rpb24gaXNSZXF1aXJlZChub2RlKSB7CiAgcmV0dXJuIG5vZGUudmFsaWRhdGU/Lm51bGxUZXN0ID09PSAiZXJyb3IiOwp9CmZ1bmN0aW9uIHNldFRhYkluZGV4KG5vZGUpIHsKICB3aGlsZSAobm9kZSkgewogICAgaWYgKCFub2RlLnRyYXZlcnNhbCkgewogICAgICBub2RlWyR0YWJJbmRleF0gPSBub2RlWyRnZXRQYXJlbnRdKClbJHRhYkluZGV4XTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG5vZGVbJHRhYkluZGV4XSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgbmV4dCA9IG51bGw7CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUudHJhdmVyc2FsWyRnZXRDaGlsZHJlbl0oKSkgewogICAgICBpZiAoY2hpbGQub3BlcmF0aW9uID09PSAibmV4dCIpIHsKICAgICAgICBuZXh0ID0gY2hpbGQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghbmV4dCB8fCAhbmV4dC5yZWYpIHsKICAgICAgbm9kZVskdGFiSW5kZXhdID0gbm9kZVskZ2V0UGFyZW50XSgpWyR0YWJJbmRleF07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHJvb3QgPSBub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgICBub2RlWyR0YWJJbmRleF0gPSArK3Jvb3RbJHRhYkluZGV4XTsKICAgIGNvbnN0IHJlZiA9IHJvb3RbJHNlYXJjaE5vZGVdKG5leHQucmVmLCBub2RlKTsKICAgIGlmICghcmVmKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIG5vZGUgPSByZWZbMF07CiAgfQp9CmZ1bmN0aW9uIGFwcGx5QXNzaXN0KG9iaiwgYXR0cmlidXRlcykgewogIGNvbnN0IGFzc2lzdCA9IG9iai5hc3Npc3Q7CiAgaWYgKGFzc2lzdCkgewogICAgY29uc3QgYXNzaXN0VGl0bGUgPSBhc3Npc3RbJHRvSFRNTF0oKTsKICAgIGlmIChhc3Npc3RUaXRsZSkgewogICAgICBhdHRyaWJ1dGVzLnRpdGxlID0gYXNzaXN0VGl0bGU7CiAgICB9CiAgICBjb25zdCByb2xlID0gYXNzaXN0LnJvbGU7CiAgICBjb25zdCBtYXRjaCA9IHJvbGUubWF0Y2goSEVBRElOR19QQVRURVJOKTsKICAgIGlmIChtYXRjaCkgewogICAgICBjb25zdCBhcmlhUm9sZSA9ICJoZWFkaW5nIjsKICAgICAgY29uc3QgYXJpYUxldmVsID0gbWF0Y2hbMV07CiAgICAgIGF0dHJpYnV0ZXMucm9sZSA9IGFyaWFSb2xlOwogICAgICBhdHRyaWJ1dGVzWyJhcmlhLWxldmVsIl0gPSBhcmlhTGV2ZWw7CiAgICB9CiAgfQogIGlmIChvYmoubGF5b3V0ID09PSAidGFibGUiKSB7CiAgICBhdHRyaWJ1dGVzLnJvbGUgPSAidGFibGUiOwogIH0gZWxzZSBpZiAob2JqLmxheW91dCA9PT0gInJvdyIpIHsKICAgIGF0dHJpYnV0ZXMucm9sZSA9ICJyb3ciOwogIH0gZWxzZSB7CiAgICBjb25zdCBwYXJlbnQgPSBvYmpbJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQubGF5b3V0ID09PSAicm93IikgewogICAgICBhdHRyaWJ1dGVzLnJvbGUgPSBwYXJlbnQuYXNzaXN0Py5yb2xlID09PSAiVEgiID8gImNvbHVtbmhlYWRlciIgOiAiY2VsbCI7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGFyaWFMYWJlbChvYmopIHsKICBpZiAoIW9iai5hc3Npc3QpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCBhc3Npc3QgPSBvYmouYXNzaXN0OwogIGlmIChhc3Npc3Quc3BlYWsgJiYgYXNzaXN0LnNwZWFrWyRjb250ZW50XSAhPT0gIiIpIHsKICAgIHJldHVybiBhc3Npc3Quc3BlYWtbJGNvbnRlbnRdOwogIH0KICBpZiAoYXNzaXN0LnRvb2xUaXApIHsKICAgIHJldHVybiBhc3Npc3QudG9vbFRpcFskY29udGVudF07CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIHZhbHVlVG9IdG1sKHZhbHVlKSB7CiAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICBuYW1lOiAiZGl2IiwKICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgY2xhc3M6IFsieGZhUmljaCJdLAogICAgICBzdHlsZTogT2JqZWN0LmNyZWF0ZShudWxsKQogICAgfSwKICAgIGNoaWxkcmVuOiBbewogICAgICBuYW1lOiAic3BhbiIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBzdHlsZTogT2JqZWN0LmNyZWF0ZShudWxsKQogICAgICB9LAogICAgICB2YWx1ZQogICAgfV0KICB9KTsKfQpmdW5jdGlvbiBzZXRGaXJzdFVuc3BsaXR0YWJsZShub2RlKSB7CiAgY29uc3Qgcm9vdCA9IG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKTsKICBpZiAocm9vdFskZXh0cmFdLmZpcnN0VW5zcGxpdHRhYmxlID09PSBudWxsKSB7CiAgICByb290WyRleHRyYV0uZmlyc3RVbnNwbGl0dGFibGUgPSBub2RlOwogICAgcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IHRydWU7CiAgfQp9CmZ1bmN0aW9uIHVuc2V0Rmlyc3RVbnNwbGl0dGFibGUobm9kZSkgewogIGNvbnN0IHJvb3QgPSBub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgaWYgKHJvb3RbJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSA9PT0gbm9kZSkgewogICAgcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IGZhbHNlOwogIH0KfQpmdW5jdGlvbiBoYW5kbGVCcmVhayhub2RlKSB7CiAgaWYgKG5vZGVbJGV4dHJhXSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBub2RlWyRleHRyYV0gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIGlmIChub2RlLnRhcmdldFR5cGUgPT09ICJhdXRvIikgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCByb290ID0gbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpOwogIGxldCB0YXJnZXQgPSBudWxsOwogIGlmIChub2RlLnRhcmdldCkgewogICAgdGFyZ2V0ID0gcm9vdFskc2VhcmNoTm9kZV0obm9kZS50YXJnZXQsIG5vZGVbJGdldFBhcmVudF0oKSk7CiAgICBpZiAoIXRhcmdldCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB0YXJnZXQgPSB0YXJnZXRbMF07CiAgfQogIGNvbnN0IHsKICAgIGN1cnJlbnRQYWdlQXJlYSwKICAgIGN1cnJlbnRDb250ZW50QXJlYQogIH0gPSByb290WyRleHRyYV07CiAgaWYgKG5vZGUudGFyZ2V0VHlwZSA9PT0gInBhZ2VBcmVhIikgewogICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgUGFnZUFyZWEpKSB7CiAgICAgIHRhcmdldCA9IG51bGw7CiAgICB9CiAgICBpZiAobm9kZS5zdGFydE5ldykgewogICAgICBub2RlWyRleHRyYV0udGFyZ2V0ID0gdGFyZ2V0IHx8IGN1cnJlbnRQYWdlQXJlYTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IGN1cnJlbnRQYWdlQXJlYSkgewogICAgICBub2RlWyRleHRyYV0udGFyZ2V0ID0gdGFyZ2V0OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgQ29udGVudEFyZWEpKSB7CiAgICB0YXJnZXQgPSBudWxsOwogIH0KICBjb25zdCBwYWdlQXJlYSA9IHRhcmdldCAmJiB0YXJnZXRbJGdldFBhcmVudF0oKTsKICBsZXQgaW5kZXg7CiAgbGV0IG5leHRQYWdlQXJlYSA9IHBhZ2VBcmVhOwogIGlmIChub2RlLnN0YXJ0TmV3KSB7CiAgICBpZiAodGFyZ2V0KSB7CiAgICAgIGNvbnN0IGNvbnRlbnRBcmVhcyA9IHBhZ2VBcmVhLmNvbnRlbnRBcmVhLmNoaWxkcmVuOwogICAgICBjb25zdCBpbmRleEZvckN1cnJlbnQgPSBjb250ZW50QXJlYXMuaW5kZXhPZihjdXJyZW50Q29udGVudEFyZWEpOwogICAgICBjb25zdCBpbmRleEZvclRhcmdldCA9IGNvbnRlbnRBcmVhcy5pbmRleE9mKHRhcmdldCk7CiAgICAgIGlmIChpbmRleEZvckN1cnJlbnQgIT09IC0xICYmIGluZGV4Rm9yQ3VycmVudCA8IGluZGV4Rm9yVGFyZ2V0KSB7CiAgICAgICAgbmV4dFBhZ2VBcmVhID0gbnVsbDsKICAgICAgfQogICAgICBpbmRleCA9IGluZGV4Rm9yVGFyZ2V0IC0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGluZGV4ID0gY3VycmVudFBhZ2VBcmVhLmNvbnRlbnRBcmVhLmNoaWxkcmVuLmluZGV4T2YoY3VycmVudENvbnRlbnRBcmVhKTsKICAgIH0KICB9IGVsc2UgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IGN1cnJlbnRDb250ZW50QXJlYSkgewogICAgY29uc3QgY29udGVudEFyZWFzID0gcGFnZUFyZWEuY29udGVudEFyZWEuY2hpbGRyZW47CiAgICBpbmRleCA9IGNvbnRlbnRBcmVhcy5pbmRleE9mKHRhcmdldCkgLSAxOwogICAgbmV4dFBhZ2VBcmVhID0gcGFnZUFyZWEgPT09IGN1cnJlbnRQYWdlQXJlYSA/IG51bGwgOiBwYWdlQXJlYTsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBub2RlWyRleHRyYV0udGFyZ2V0ID0gbmV4dFBhZ2VBcmVhOwogIG5vZGVbJGV4dHJhXS5pbmRleCA9IGluZGV4OwogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIGhhbmRsZU92ZXJmbG93KG5vZGUsIGV4dHJhTm9kZSwgc3BhY2UpIHsKICBjb25zdCByb290ID0gbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpOwogIGNvbnN0IHNhdmVkID0gcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZTsKICBjb25zdCBzYXZlZE1ldGhvZCA9IGV4dHJhTm9kZVskZ2V0U3ViZm9ybVBhcmVudF07CiAgZXh0cmFOb2RlWyRnZXRTdWJmb3JtUGFyZW50XSA9ICgpID0+IG5vZGU7CiAgcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IHRydWU7CiAgY29uc3QgcmVzID0gZXh0cmFOb2RlWyR0b0hUTUxdKHNwYWNlKTsKICBub2RlWyRhZGRIVE1MXShyZXMuaHRtbCwgcmVzLmJib3gpOwogIHJvb3RbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUgPSBzYXZlZDsKICBleHRyYU5vZGVbJGdldFN1YmZvcm1QYXJlbnRdID0gc2F2ZWRNZXRob2Q7Cn0KY2xhc3MgQXBwZWFyYW5jZUZpbHRlciBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJhcHBlYXJhbmNlRmlsdGVyIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBBcmMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYXJjIiwgdHJ1ZSk7CiAgICB0aGlzLmNpcmN1bGFyID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY2lyY3VsYXIsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmhhbmQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oYW5kLCBbImV2ZW4iLCAibGVmdCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5zdGFydEFuZ2xlID0gZ2V0RmxvYXQoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnN0YXJ0QW5nbGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSk7CiAgICB0aGlzLnN3ZWVwQW5nbGUgPSBnZXRGbG9hdCh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc3dlZXBBbmdsZSwKICAgICAgZGVmYXVsdFZhbHVlOiAzNjAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZWRnZSA9IG51bGw7CiAgICB0aGlzLmZpbGwgPSBudWxsOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBjb25zdCBlZGdlID0gdGhpcy5lZGdlIHx8IG5ldyBFZGdlKHt9KTsKICAgIGNvbnN0IGVkZ2VTdHlsZSA9IGVkZ2VbJHRvU3R5bGVdKCk7CiAgICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBpZiAodGhpcy5maWxsPy5wcmVzZW5jZSA9PT0gInZpc2libGUiKSB7CiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHRoaXMuZmlsbFskdG9TdHlsZV0oKSk7CiAgICB9IGVsc2UgewogICAgICBzdHlsZS5maWxsID0gInRyYW5zcGFyZW50IjsKICAgIH0KICAgIHN0eWxlLnN0cm9rZVdpZHRoID0gbWVhc3VyZVRvU3RyaW5nKGVkZ2UucHJlc2VuY2UgPT09ICJ2aXNpYmxlIiA/IGVkZ2UudGhpY2tuZXNzIDogMCk7CiAgICBzdHlsZS5zdHJva2UgPSBlZGdlU3R5bGUuY29sb3I7CiAgICBsZXQgYXJjOwogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgeG1sbnM6IFNWR19OUywKICAgICAgc3R5bGU6IHsKICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgIGhlaWdodDogIjEwMCUiLAogICAgICAgIG92ZXJmbG93OiAidmlzaWJsZSIKICAgICAgfQogICAgfTsKICAgIGlmICh0aGlzLnN3ZWVwQW5nbGUgPT09IDM2MCkgewogICAgICBhcmMgPSB7CiAgICAgICAgbmFtZTogImVsbGlwc2UiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIHhtbG5zOiBTVkdfTlMsCiAgICAgICAgICBjeDogIjUwJSIsCiAgICAgICAgICBjeTogIjUwJSIsCiAgICAgICAgICByeDogIjUwJSIsCiAgICAgICAgICByeTogIjUwJSIsCiAgICAgICAgICBzdHlsZQogICAgICAgIH0KICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHN0YXJ0QW5nbGUgPSB0aGlzLnN0YXJ0QW5nbGUgKiBNYXRoLlBJIC8gMTgwOwogICAgICBjb25zdCBzd2VlcEFuZ2xlID0gdGhpcy5zd2VlcEFuZ2xlICogTWF0aC5QSSAvIDE4MDsKICAgICAgY29uc3QgbGFyZ2VBcmMgPSB0aGlzLnN3ZWVwQW5nbGUgPiAxODAgPyAxIDogMDsKICAgICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IFs1MCAqICgxICsgTWF0aC5jb3Moc3RhcnRBbmdsZSkpLCA1MCAqICgxIC0gTWF0aC5zaW4oc3RhcnRBbmdsZSkpLCA1MCAqICgxICsgTWF0aC5jb3Moc3RhcnRBbmdsZSArIHN3ZWVwQW5nbGUpKSwgNTAgKiAoMSAtIE1hdGguc2luKHN0YXJ0QW5nbGUgKyBzd2VlcEFuZ2xlKSldOwogICAgICBhcmMgPSB7CiAgICAgICAgbmFtZTogInBhdGgiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIHhtbG5zOiBTVkdfTlMsCiAgICAgICAgICBkOiBgTSAke3gxfSAke3kxfSBBIDUwIDUwIDAgJHtsYXJnZUFyY30gMCAke3gyfSAke3kyfWAsCiAgICAgICAgICB2ZWN0b3JFZmZlY3Q6ICJub24tc2NhbGluZy1zdHJva2UiLAogICAgICAgICAgc3R5bGUKICAgICAgICB9CiAgICAgIH07CiAgICAgIE9iamVjdC5hc3NpZ24oYXR0cmlidXRlcywgewogICAgICAgIHZpZXdCb3g6ICIwIDAgMTAwIDEwMCIsCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbzogIm5vbmUiCiAgICAgIH0pOwogICAgfQogICAgY29uc3Qgc3ZnID0gewogICAgICBuYW1lOiAic3ZnIiwKICAgICAgY2hpbGRyZW46IFthcmNdLAogICAgICBhdHRyaWJ1dGVzCiAgICB9OwogICAgY29uc3QgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBpZiAoaGFzTWFyZ2luKHBhcmVudCkpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgICAgbmFtZTogImRpdiIsCiAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgc3R5bGU6IHsKICAgICAgICAgICAgZGlzcGxheTogImlubGluZSIsCiAgICAgICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgICAgIGhlaWdodDogIjEwMCUiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjaGlsZHJlbjogW3N2Z10KICAgICAgfSk7CiAgICB9CiAgICBzdmcuYXR0cmlidXRlcy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHN2Zyk7CiAgfQp9CmNsYXNzIEFyZWEgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYXJlYSIsIHRydWUpOwogICAgdGhpcy5jb2xTcGFuID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy54ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmFyZWEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZHJhdyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leE9iamVjdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leGNsR3JvdXAgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmllbGQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtU2V0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQogICpbJGdldENvbnRhaW5lZENoaWxkcmVuXSgpIHsKICAgIHlpZWxkKiBnZXRDb250YWluZWRDaGlsZHJlbih0aGlzKTsKICB9CiAgWyRpc1RyYW5zcGFyZW50XSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskYWRkSFRNTF0oaHRtbCwgYmJveCkgewogICAgY29uc3QgW3gsIHksIHcsIGhdID0gYmJveDsKICAgIHRoaXNbJGV4dHJhXS53aWR0aCA9IE1hdGgubWF4KHRoaXNbJGV4dHJhXS53aWR0aCwgeCArIHcpOwogICAgdGhpc1skZXh0cmFdLmhlaWdodCA9IE1hdGgubWF4KHRoaXNbJGV4dHJhXS5oZWlnaHQsIHkgKyBoKTsKICAgIHRoaXNbJGV4dHJhXS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogIH0KICBbJGdldEF2YWlsYWJsZVNwYWNlXSgpIHsKICAgIHJldHVybiB0aGlzWyRleHRyYV0uYXZhaWxhYmxlU3BhY2U7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJwb3NpdGlvbiIpOwogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgc3R5bGUsCiAgICAgIGlkOiB0aGlzWyR1aWRdLAogICAgICBjbGFzczogWyJ4ZmFBcmVhIl0KICAgIH07CiAgICBpZiAoaXNQcmludE9ubHkodGhpcykpIHsKICAgICAgYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFQcmludE9ubHkiKTsKICAgIH0KICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgYXR0cmlidXRlcy54ZmFOYW1lID0gdGhpcy5uYW1lOwogICAgfQogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIHRoaXNbJGV4dHJhXSA9IHsKICAgICAgY2hpbGRyZW4sCiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAsCiAgICAgIGF2YWlsYWJsZVNwYWNlCiAgICB9OwogICAgY29uc3QgcmVzdWx0ID0gdGhpc1skY2hpbGRyZW5Ub0hUTUxdKHsKICAgICAgZmlsdGVyOiBuZXcgU2V0KFsiYXJlYSIsICJkcmF3IiwgImZpZWxkIiwgImV4Y2xHcm91cCIsICJzdWJmb3JtIiwgInN1YmZvcm1TZXQiXSksCiAgICAgIGluY2x1ZGU6IHRydWUKICAgIH0pOwogICAgaWYgKCFyZXN1bHQuc3VjY2VzcykgewogICAgICBpZiAocmVzdWx0LmlzQnJlYWsoKSkgewogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRkFJTFVSRTsKICAgIH0KICAgIHN0eWxlLndpZHRoID0gbWVhc3VyZVRvU3RyaW5nKHRoaXNbJGV4dHJhXS53aWR0aCk7CiAgICBzdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcodGhpc1skZXh0cmFdLmhlaWdodCk7CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlcywKICAgICAgY2hpbGRyZW4KICAgIH07CiAgICBjb25zdCBiYm94ID0gW3RoaXMueCwgdGhpcy55LCB0aGlzWyRleHRyYV0ud2lkdGgsIHRoaXNbJGV4dHJhXS5oZWlnaHRdOwogICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoaHRtbCwgYmJveCk7CiAgfQp9CmNsYXNzIEFzc2lzdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJhc3Npc3QiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5yb2xlID0gYXR0cmlidXRlcy5yb2xlIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuc3BlYWsgPSBudWxsOwogICAgdGhpcy50b29sVGlwID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKCkgewogICAgcmV0dXJuIHRoaXMudG9vbFRpcD8uWyRjb250ZW50XSB8fCBudWxsOwogIH0KfQpjbGFzcyBCYXJjb2RlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJhcmNvZGUiLCB0cnVlKTsKICAgIHRoaXMuY2hhckVuY29kaW5nID0gZ2V0S2V5d29yZCh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY2hhckVuY29kaW5nID8gYXR0cmlidXRlcy5jaGFyRW5jb2RpbmcudG9Mb3dlckNhc2UoKSA6ICIiLAogICAgICBkZWZhdWx0VmFsdWU6ICIiLAogICAgICB2YWxpZGF0ZTogayA9PiBbInV0Zi04IiwgImJpZy1maXZlIiwgImZvbnRzcGVjaWZpYyIsICJnYmsiLCAiZ2ItMTgwMzAiLCAiZ2ItMjMxMiIsICJrc2MtNTYwMSIsICJub25lIiwgInNoaWZ0LWppcyIsICJ1Y3MtMiIsICJ1dGYtMTYiXS5pbmNsdWRlcyhrKSB8fCBrLm1hdGNoKC9pc28tODg1OS1cZHsyfS8pCiAgICB9KTsKICAgIHRoaXMuY2hlY2tzdW0gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5jaGVja3N1bSwgWyJub25lIiwgIjFtb2QxMCIsICIxbW9kMTBfMW1vZDExIiwgIjJtb2QxMCIsICJhdXRvIl0pOwogICAgdGhpcy5kYXRhQ29sdW1uQ291bnQgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5kYXRhQ29sdW1uQ291bnQsCiAgICAgIGRlZmF1bHRWYWx1ZTogLTEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLmRhdGFMZW5ndGggPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5kYXRhTGVuZ3RoLAogICAgICBkZWZhdWx0VmFsdWU6IC0xLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5kYXRhUHJlcCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmRhdGFQcmVwLCBbIm5vbmUiLCAiZmxhdGVDb21wcmVzcyJdKTsKICAgIHRoaXMuZGF0YVJvd0NvdW50ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZGF0YVJvd0NvdW50LAogICAgICBkZWZhdWx0VmFsdWU6IC0xLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5lbmRDaGFyID0gYXR0cmlidXRlcy5lbmRDaGFyIHx8ICIiOwogICAgdGhpcy5lcnJvckNvcnJlY3Rpb25MZXZlbCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmVycm9yQ29ycmVjdGlvbkxldmVsLAogICAgICBkZWZhdWx0VmFsdWU6IC0xLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAgJiYgeCA8PSA4CiAgICB9KTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5tb2R1bGVIZWlnaHQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1vZHVsZUhlaWdodCwgIjVtbSIpOwogICAgdGhpcy5tb2R1bGVXaWR0aCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubW9kdWxlV2lkdGgsICIwLjI1bW0iKTsKICAgIHRoaXMucHJpbnRDaGVja0RpZ2l0ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucHJpbnRDaGVja0RpZ2l0LAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5yb3dDb2x1bW5SYXRpbyA9IGdldFJhdGlvKGF0dHJpYnV0ZXMucm93Q29sdW1uUmF0aW8pOwogICAgdGhpcy5zdGFydENoYXIgPSBhdHRyaWJ1dGVzLnN0YXJ0Q2hhciB8fCAiIjsKICAgIHRoaXMudGV4dExvY2F0aW9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudGV4dExvY2F0aW9uLCBbImJlbG93IiwgImFib3ZlIiwgImFib3ZlRW1iZWRkZWQiLCAiYmVsb3dFbWJlZGRlZCIsICJub25lIl0pOwogICAgdGhpcy50cnVuY2F0ZSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnRydW5jYXRlLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSA/IGF0dHJpYnV0ZXMudHlwZS50b0xvd2VyQ2FzZSgpIDogIiIsIFsiYXp0ZWMiLCAiY29kYWJhciIsICJjb2RlMm9mNWluZHVzdHJpYWwiLCAiY29kZTJvZjVpbnRlcmxlYXZlZCIsICJjb2RlMm9mNW1hdHJpeCIsICJjb2RlMm9mNXN0YW5kYXJkIiwgImNvZGUzb2Y5IiwgImNvZGUzb2Y5ZXh0ZW5kZWQiLCAiY29kZTExIiwgImNvZGU0OSIsICJjb2RlOTMiLCAiY29kZTEyOCIsICJjb2RlMTI4YSIsICJjb2RlMTI4YiIsICJjb2RlMTI4YyIsICJjb2RlMTI4c3NjYyIsICJkYXRhbWF0cml4IiwgImVhbjgiLCAiZWFuOGFkZDIiLCAiZWFuOGFkZDUiLCAiZWFuMTMiLCAiZWFuMTNhZGQyIiwgImVhbjEzYWRkNSIsICJlYW4xM3B3Y2QiLCAiZmltIiwgImxvZ21hcnMiLCAibWF4aWNvZGUiLCAibXNpIiwgInBkZjQxNyIsICJwZGY0MTdtYWNybyIsICJwbGVzc2V5IiwgInBvc3RhdXNjdXN0MiIsICJwb3N0YXVzY3VzdDMiLCAicG9zdGF1c3JlcGx5cGFpZCIsICJwb3N0YXVzc3RhbmRhcmQiLCAicG9zdHVrcm00c2NjIiwgInBvc3R1c2RwYmMiLCAicG9zdHVzaW1iIiwgInBvc3R1c3N0YW5kYXJkIiwgInBvc3R1czV6aXAiLCAicXJjb2RlIiwgInJmaWQiLCAicnNzMTQiLCAicnNzMTRleHBhbmRlZCIsICJyc3MxNGxpbWl0ZWQiLCAicnNzMTRzdGFja2VkIiwgInJzczE0c3RhY2tlZG9tbmkiLCAicnNzMTR0cnVuY2F0ZWQiLCAidGVsZXBlbiIsICJ1Y2MxMjgiLCAidWNjMTI4cmFuZG9tIiwgInVjYzEyOHNzY2MiLCAidXBjYSIsICJ1cGNhYWRkMiIsICJ1cGNhYWRkNSIsICJ1cGNhcHdjZCIsICJ1cGNlIiwgInVwY2VhZGQyIiwgInVwY2VhZGQ1IiwgInVwY2VhbjIiLCAidXBjZWFuNSIsICJ1cHNtYXhpY29kZSJdKTsKICAgIHRoaXMudXBzTW9kZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnVwc01vZGUsIFsidXNDYXJyaWVyIiwgImludGVybmF0aW9uYWxDYXJyaWVyIiwgInNlY3VyZVN5bWJvbCIsICJzdGFuZGFyZFN5bWJvbCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLndpZGVOYXJyb3dSYXRpbyA9IGdldFJhdGlvKGF0dHJpYnV0ZXMud2lkZU5hcnJvd1JhdGlvKTsKICAgIHRoaXMuZW5jcnlwdCA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQp9CmNsYXNzIEJpbmQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYmluZCIsIHRydWUpOwogICAgdGhpcy5tYXRjaCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm1hdGNoLCBbIm9uY2UiLCAiZGF0YVJlZiIsICJnbG9iYWwiLCAibm9uZSJdKTsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnBpY3R1cmUgPSBudWxsOwogIH0KfQpjbGFzcyBCaW5kSXRlbXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYmluZEl0ZW1zIik7CiAgICB0aGlzLmNvbm5lY3Rpb24gPSBhdHRyaWJ1dGVzLmNvbm5lY3Rpb24gfHwgIiI7CiAgICB0aGlzLmxhYmVsUmVmID0gYXR0cmlidXRlcy5sYWJlbFJlZiB8fCAiIjsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnZhbHVlUmVmID0gYXR0cmlidXRlcy52YWx1ZVJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgQm9va2VuZCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJib29rZW5kIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVhZGVyID0gYXR0cmlidXRlcy5sZWFkZXIgfHwgIiI7CiAgICB0aGlzLnRyYWlsZXIgPSBhdHRyaWJ1dGVzLnRyYWlsZXIgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBCb29sZWFuRWxlbWVudCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJvb2xlYW4iKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gdmFsdWVUb0h0bWwodGhpc1skY29udGVudF0gPT09IDEgPyAiMSIgOiAiMCIpOwogIH0KfQpjbGFzcyBCb3JkZXIgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYm9yZGVyIiwgdHJ1ZSk7CiAgICB0aGlzLmJyZWFrID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuYnJlYWssIFsiY2xvc2UiLCAib3BlbiJdKTsKICAgIHRoaXMuaGFuZCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmhhbmQsIFsiZXZlbiIsICJsZWZ0IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29ybmVyID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogICAgdGhpcy5lZGdlID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5maWxsID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICB9CiAgWyRnZXRFeHRyYV0oKSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXSkgewogICAgICBjb25zdCBlZGdlcyA9IHRoaXMuZWRnZS5jaGlsZHJlbi5zbGljZSgpOwogICAgICBpZiAoZWRnZXMubGVuZ3RoIDwgNCkgewogICAgICAgIGNvbnN0IGRlZmF1bHRFZGdlID0gZWRnZXMuYXQoLTEpIHx8IG5ldyBFZGdlKHt9KTsKICAgICAgICBmb3IgKGxldCBpID0gZWRnZXMubGVuZ3RoOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICBlZGdlcy5wdXNoKGRlZmF1bHRFZGdlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3Qgd2lkdGhzID0gZWRnZXMubWFwKGVkZ2UgPT4gZWRnZS50aGlja25lc3MpOwogICAgICBjb25zdCBpbnNldHMgPSBbMCwgMCwgMCwgMF07CiAgICAgIGlmICh0aGlzLm1hcmdpbikgewogICAgICAgIGluc2V0c1swXSA9IHRoaXMubWFyZ2luLnRvcEluc2V0OwogICAgICAgIGluc2V0c1sxXSA9IHRoaXMubWFyZ2luLnJpZ2h0SW5zZXQ7CiAgICAgICAgaW5zZXRzWzJdID0gdGhpcy5tYXJnaW4uYm90dG9tSW5zZXQ7CiAgICAgICAgaW5zZXRzWzNdID0gdGhpcy5tYXJnaW4ubGVmdEluc2V0OwogICAgICB9CiAgICAgIHRoaXNbJGV4dHJhXSA9IHsKICAgICAgICB3aWR0aHMsCiAgICAgICAgaW5zZXRzLAogICAgICAgIGVkZ2VzCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gdGhpc1skZXh0cmFdOwogIH0KICBbJHRvU3R5bGVdKCkgewogICAgY29uc3QgewogICAgICBlZGdlcwogICAgfSA9IHRoaXNbJGdldEV4dHJhXSgpOwogICAgY29uc3QgZWRnZVN0eWxlcyA9IGVkZ2VzLm1hcChub2RlID0+IHsKICAgICAgY29uc3Qgc3R5bGUgPSBub2RlWyR0b1N0eWxlXSgpOwogICAgICBzdHlsZS5jb2xvciB8fD0gIiMwMDAwMDAiOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9KTsKICAgIGNvbnN0IHN0eWxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmICh0aGlzLm1hcmdpbikgewogICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCB0aGlzLm1hcmdpblskdG9TdHlsZV0oKSk7CiAgICB9CiAgICBpZiAodGhpcy5maWxsPy5wcmVzZW5jZSA9PT0gInZpc2libGUiKSB7CiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHRoaXMuZmlsbFskdG9TdHlsZV0oKSk7CiAgICB9CiAgICBpZiAodGhpcy5jb3JuZXIuY2hpbGRyZW4uc29tZShub2RlID0+IG5vZGUucmFkaXVzICE9PSAwKSkgewogICAgICBjb25zdCBjb3JuZXJTdHlsZXMgPSB0aGlzLmNvcm5lci5jaGlsZHJlbi5tYXAobm9kZSA9PiBub2RlWyR0b1N0eWxlXSgpKTsKICAgICAgaWYgKGNvcm5lclN0eWxlcy5sZW5ndGggPT09IDIgfHwgY29ybmVyU3R5bGVzLmxlbmd0aCA9PT0gMykgewogICAgICAgIGNvbnN0IGxhc3QgPSBjb3JuZXJTdHlsZXMuYXQoLTEpOwogICAgICAgIGZvciAobGV0IGkgPSBjb3JuZXJTdHlsZXMubGVuZ3RoOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICBjb3JuZXJTdHlsZXMucHVzaChsYXN0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3R5bGUuYm9yZGVyUmFkaXVzID0gY29ybmVyU3R5bGVzLm1hcChzID0+IHMucmFkaXVzKS5qb2luKCIgIik7CiAgICB9CiAgICBzd2l0Y2ggKHRoaXMucHJlc2VuY2UpIHsKICAgICAgY2FzZSAiaW52aXNpYmxlIjoKICAgICAgY2FzZSAiaGlkZGVuIjoKICAgICAgICBzdHlsZS5ib3JkZXJTdHlsZSA9ICIiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJpbmFjdGl2ZSI6CiAgICAgICAgc3R5bGUuYm9yZGVyU3R5bGUgPSAibm9uZSI7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgc3R5bGUuYm9yZGVyU3R5bGUgPSBlZGdlU3R5bGVzLm1hcChzID0+IHMuc3R5bGUpLmpvaW4oIiAiKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHN0eWxlLmJvcmRlcldpZHRoID0gZWRnZVN0eWxlcy5tYXAocyA9PiBzLndpZHRoKS5qb2luKCIgIik7CiAgICBzdHlsZS5ib3JkZXJDb2xvciA9IGVkZ2VTdHlsZXMubWFwKHMgPT4gcy5jb2xvcikuam9pbigiICIpOwogICAgcmV0dXJuIHN0eWxlOwogIH0KfQpjbGFzcyBCcmVhayBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJicmVhayIsIHRydWUpOwogICAgdGhpcy5hZnRlciA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFmdGVyLCBbImF1dG8iLCAiY29udGVudEFyZWEiLCAicGFnZUFyZWEiLCAicGFnZUV2ZW4iLCAicGFnZU9kZCJdKTsKICAgIHRoaXMuYWZ0ZXJUYXJnZXQgPSBhdHRyaWJ1dGVzLmFmdGVyVGFyZ2V0IHx8ICIiOwogICAgdGhpcy5iZWZvcmUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5iZWZvcmUsIFsiYXV0byIsICJjb250ZW50QXJlYSIsICJwYWdlQXJlYSIsICJwYWdlRXZlbiIsICJwYWdlT2RkIl0pOwogICAgdGhpcy5iZWZvcmVUYXJnZXQgPSBhdHRyaWJ1dGVzLmJlZm9yZVRhcmdldCB8fCAiIjsKICAgIHRoaXMuYm9va2VuZExlYWRlciA9IGF0dHJpYnV0ZXMuYm9va2VuZExlYWRlciB8fCAiIjsKICAgIHRoaXMuYm9va2VuZFRyYWlsZXIgPSBhdHRyaWJ1dGVzLmJvb2tlbmRUcmFpbGVyIHx8ICIiOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm92ZXJmbG93TGVhZGVyID0gYXR0cmlidXRlcy5vdmVyZmxvd0xlYWRlciB8fCAiIjsKICAgIHRoaXMub3ZlcmZsb3dUYXJnZXQgPSBhdHRyaWJ1dGVzLm92ZXJmbG93VGFyZ2V0IHx8ICIiOwogICAgdGhpcy5vdmVyZmxvd1RyYWlsZXIgPSBhdHRyaWJ1dGVzLm92ZXJmbG93VHJhaWxlciB8fCAiIjsKICAgIHRoaXMuc3RhcnROZXcgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5zdGFydE5ldywKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQp9CmNsYXNzIEJyZWFrQWZ0ZXIgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYnJlYWtBZnRlciIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxlYWRlciA9IGF0dHJpYnV0ZXMubGVhZGVyIHx8ICIiOwogICAgdGhpcy5zdGFydE5ldyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnN0YXJ0TmV3LAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy50YXJnZXQgPSBhdHRyaWJ1dGVzLnRhcmdldCB8fCAiIjsKICAgIHRoaXMudGFyZ2V0VHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnRhcmdldFR5cGUsIFsiYXV0byIsICJjb250ZW50QXJlYSIsICJwYWdlQXJlYSJdKTsKICAgIHRoaXMudHJhaWxlciA9IGF0dHJpYnV0ZXMudHJhaWxlciB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnNjcmlwdCA9IG51bGw7CiAgfQp9CmNsYXNzIEJyZWFrQmVmb3JlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJyZWFrQmVmb3JlIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVhZGVyID0gYXR0cmlidXRlcy5sZWFkZXIgfHwgIiI7CiAgICB0aGlzLnN0YXJ0TmV3ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc3RhcnROZXcsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnRhcmdldCA9IGF0dHJpYnV0ZXMudGFyZ2V0IHx8ICIiOwogICAgdGhpcy50YXJnZXRUeXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudGFyZ2V0VHlwZSwgWyJhdXRvIiwgImNvbnRlbnRBcmVhIiwgInBhZ2VBcmVhIl0pOwogICAgdGhpcy50cmFpbGVyID0gYXR0cmlidXRlcy50cmFpbGVyIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuc2NyaXB0ID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICB0aGlzWyRleHRyYV0gPSB7fTsKICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgfQp9CmNsYXNzIEJ1dHRvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJidXR0b24iLCB0cnVlKTsKICAgIHRoaXMuaGlnaGxpZ2h0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaGlnaGxpZ2h0LCBbImludmVydGVkIiwgIm5vbmUiLCAib3V0bGluZSIsICJwdXNoIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGdyYW5kcGEgPSBwYXJlbnRbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGh0bWxCdXR0b24gPSB7CiAgICAgIG5hbWU6ICJidXR0b24iLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgaWQ6IHRoaXNbJHVpZF0sCiAgICAgICAgY2xhc3M6IFsieGZhQnV0dG9uIl0sCiAgICAgICAgc3R5bGU6IHt9CiAgICAgIH0sCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZ3JhbmRwYS5ldmVudC5jaGlsZHJlbikgewogICAgICBpZiAoZXZlbnQuYWN0aXZpdHkgIT09ICJjbGljayIgfHwgIWV2ZW50LnNjcmlwdCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGpzVVJMID0gcmVjb3ZlckpzVVJMKGV2ZW50LnNjcmlwdFskY29udGVudF0pOwogICAgICBpZiAoIWpzVVJMKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgaHJlZiA9IGZpeFVSTChqc1VSTC51cmwpOwogICAgICBpZiAoIWhyZWYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBodG1sQnV0dG9uLmNoaWxkcmVuLnB1c2goewogICAgICAgIG5hbWU6ICJhIiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBpZDogImxpbmsiICsgdGhpc1skdWlkXSwKICAgICAgICAgIGhyZWYsCiAgICAgICAgICBuZXdXaW5kb3c6IGpzVVJMLm5ld1dpbmRvdywKICAgICAgICAgIGNsYXNzOiBbInhmYUxpbmsiXSwKICAgICAgICAgIHN0eWxlOiB7fQogICAgICAgIH0sCiAgICAgICAgY2hpbGRyZW46IFtdCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhodG1sQnV0dG9uKTsKICB9Cn0KY2xhc3MgQ2FsY3VsYXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNhbGN1bGF0ZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm92ZXJyaWRlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMub3ZlcnJpZGUsIFsiZGlzYWJsZWQiLCAiZXJyb3IiLCAiaWdub3JlIiwgIndhcm5pbmciXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tZXNzYWdlID0gbnVsbDsKICAgIHRoaXMuc2NyaXB0ID0gbnVsbDsKICB9Cn0KY2xhc3MgQ2FwdGlvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjYXB0aW9uIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucGxhY2VtZW50ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucGxhY2VtZW50LCBbImxlZnQiLCAiYm90dG9tIiwgImlubGluZSIsICJyaWdodCIsICJ0b3AiXSk7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZXNlcnZlID0gTWF0aC5jZWlsKGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMucmVzZXJ2ZSkpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuZm9udCA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgICB0aGlzLnBhcmEgPSBudWxsOwogICAgdGhpcy52YWx1ZSA9IG51bGw7CiAgfQogIFskc2V0VmFsdWVdKHZhbHVlKSB7CiAgICBfc2V0VmFsdWUodGhpcywgdmFsdWUpOwogIH0KICBbJGdldEV4dHJhXShhdmFpbGFibGVTcGFjZSkgewogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgbGV0IHsKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQKICAgICAgfSA9IGF2YWlsYWJsZVNwYWNlOwogICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7CiAgICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgIGNhc2UgImlubGluZSI6CiAgICAgICAgICB3aWR0aCA9IHRoaXMucmVzZXJ2ZSA8PSAwID8gd2lkdGggOiB0aGlzLnJlc2VydmU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ0b3AiOgogICAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgICBoZWlnaHQgPSB0aGlzLnJlc2VydmUgPD0gMCA/IGhlaWdodCA6IHRoaXMucmVzZXJ2ZTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRoaXNbJGV4dHJhXSA9IGxheW91dE5vZGUodGhpcywgewogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodAogICAgICB9KTsKICAgIH0KICAgIHJldHVybiB0aGlzWyRleHRyYV07CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgaWYgKCF0aGlzLnZhbHVlKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgdGhpc1skcHVzaFBhcmFdKCk7CiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWVbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpLmh0bWw7CiAgICBpZiAoIXZhbHVlKSB7CiAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgY29uc3Qgc2F2ZWRSZXNlcnZlID0gdGhpcy5yZXNlcnZlOwogICAgaWYgKHRoaXMucmVzZXJ2ZSA8PSAwKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICB3LAogICAgICAgIGgKICAgICAgfSA9IHRoaXNbJGdldEV4dHJhXShhdmFpbGFibGVTcGFjZSk7CiAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHsKICAgICAgICBjYXNlICJsZWZ0IjoKICAgICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgY2FzZSAiaW5saW5lIjoKICAgICAgICAgIHRoaXMucmVzZXJ2ZSA9IHc7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ0b3AiOgogICAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgICB0aGlzLnJlc2VydmUgPSBoOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgewogICAgICBjaGlsZHJlbi5wdXNoKHsKICAgICAgICBuYW1lOiAiI3RleHQiLAogICAgICAgIHZhbHVlCiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgY2hpbGRyZW4ucHVzaCh2YWx1ZSk7CiAgICB9CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImZvbnQiLCAibWFyZ2luIiwgInZpc2liaWxpdHkiKTsKICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHsKICAgICAgY2FzZSAibGVmdCI6CiAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICBpZiAodGhpcy5yZXNlcnZlID4gMCkgewogICAgICAgICAgc3R5bGUud2lkdGggPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5yZXNlcnZlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInRvcCI6CiAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgaWYgKHRoaXMucmVzZXJ2ZSA+IDApIHsKICAgICAgICAgIHN0eWxlLmhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLnJlc2VydmUpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KICAgIHNldFBhcmEodGhpcywgbnVsbCwgdmFsdWUpOwogICAgdGhpc1skcG9wUGFyYV0oKTsKICAgIHRoaXMucmVzZXJ2ZSA9IHNhdmVkUmVzZXJ2ZTsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHN0eWxlLAogICAgICAgIGNsYXNzOiBbInhmYUNhcHRpb24iXQogICAgICB9LAogICAgICBjaGlsZHJlbgogICAgfSk7CiAgfQp9CmNsYXNzIENlcnRpZmljYXRlIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNlcnRpZmljYXRlIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIENlcnRpZmljYXRlcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjZXJ0aWZpY2F0ZXMiLCB0cnVlKTsKICAgIHRoaXMuY3JlZGVudGlhbFNlcnZlclBvbGljeSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmNyZWRlbnRpYWxTZXJ2ZXJQb2xpY3ksIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXJsID0gYXR0cmlidXRlcy51cmwgfHwgIiI7CiAgICB0aGlzLnVybFBvbGljeSA9IGF0dHJpYnV0ZXMudXJsUG9saWN5IHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZW5jcnlwdGlvbiA9IG51bGw7CiAgICB0aGlzLmlzc3VlcnMgPSBudWxsOwogICAgdGhpcy5rZXlVc2FnZSA9IG51bGw7CiAgICB0aGlzLm9pZHMgPSBudWxsOwogICAgdGhpcy5zaWduaW5nID0gbnVsbDsKICAgIHRoaXMuc3ViamVjdEROcyA9IG51bGw7CiAgfQp9CmNsYXNzIENoZWNrQnV0dG9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNoZWNrQnV0dG9uIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubWFyayA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm1hcmssIFsiZGVmYXVsdCIsICJjaGVjayIsICJjaXJjbGUiLCAiY3Jvc3MiLCAiZGlhbW9uZCIsICJzcXVhcmUiLCAic3RhciJdKTsKICAgIHRoaXMuc2hhcGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zaGFwZSwgWyJzcXVhcmUiLCAicm91bmQiXSk7CiAgICB0aGlzLnNpemUgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnNpemUsICIxMHB0Iik7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSgibWFyZ2luIik7CiAgICBjb25zdCBzaXplID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMuc2l6ZSk7CiAgICBzdHlsZS53aWR0aCA9IHN0eWxlLmhlaWdodCA9IHNpemU7CiAgICBsZXQgdHlwZTsKICAgIGxldCBjbGFzc05hbWU7CiAgICBsZXQgZ3JvdXBJZDsKICAgIGNvbnN0IGZpZWxkID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBpdGVtcyA9IGZpZWxkLml0ZW1zLmNoaWxkcmVuLmxlbmd0aCAmJiBmaWVsZC5pdGVtcy5jaGlsZHJlblswXVskdG9IVE1MXSgpLmh0bWwgfHwgW107CiAgICBjb25zdCBleHBvcnRlZFZhbHVlID0gewogICAgICBvbjogKGl0ZW1zWzBdICE9PSB1bmRlZmluZWQgPyBpdGVtc1swXSA6ICJvbiIpLnRvU3RyaW5nKCksCiAgICAgIG9mZjogKGl0ZW1zWzFdICE9PSB1bmRlZmluZWQgPyBpdGVtc1sxXSA6ICJvZmYiKS50b1N0cmluZygpCiAgICB9OwogICAgY29uc3QgdmFsdWUgPSBmaWVsZC52YWx1ZT8uWyR0ZXh0XSgpIHx8ICJvZmYiOwogICAgY29uc3QgY2hlY2tlZCA9IHZhbHVlID09PSBleHBvcnRlZFZhbHVlLm9uIHx8IHVuZGVmaW5lZDsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGZpZWxkWyRnZXRTdWJmb3JtUGFyZW50XSgpOwogICAgY29uc3QgZmllbGRJZCA9IGZpZWxkWyR1aWRdOwogICAgbGV0IGRhdGFJZDsKICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFeGNsR3JvdXApIHsKICAgICAgZ3JvdXBJZCA9IGNvbnRhaW5lclskdWlkXTsKICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgIGNsYXNzTmFtZSA9ICJ4ZmFSYWRpbyI7CiAgICAgIGRhdGFJZCA9IGNvbnRhaW5lclskZGF0YV0/LlskdWlkXSB8fCBjb250YWluZXJbJHVpZF07CiAgICB9IGVsc2UgewogICAgICB0eXBlID0gImNoZWNrYm94IjsKICAgICAgY2xhc3NOYW1lID0gInhmYUNoZWNrYm94IjsKICAgICAgZGF0YUlkID0gZmllbGRbJGRhdGFdPy5bJHVpZF0gfHwgZmllbGRbJHVpZF07CiAgICB9CiAgICBjb25zdCBpbnB1dCA9IHsKICAgICAgbmFtZTogImlucHV0IiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbY2xhc3NOYW1lXSwKICAgICAgICBzdHlsZSwKICAgICAgICBmaWVsZElkLAogICAgICAgIGRhdGFJZCwKICAgICAgICB0eXBlLAogICAgICAgIGNoZWNrZWQsCiAgICAgICAgeGZhT246IGV4cG9ydGVkVmFsdWUub24sCiAgICAgICAgeGZhT2ZmOiBleHBvcnRlZFZhbHVlLm9mZiwKICAgICAgICAiYXJpYS1sYWJlbCI6IGFyaWFMYWJlbChmaWVsZCksCiAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICB9CiAgICB9OwogICAgaWYgKGdyb3VwSWQpIHsKICAgICAgaW5wdXQuYXR0cmlidXRlcy5uYW1lID0gZ3JvdXBJZDsKICAgIH0KICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBpbnB1dC5hdHRyaWJ1dGVzWyJhcmlhLXJlcXVpcmVkIl0gPSB0cnVlOwogICAgICBpbnB1dC5hdHRyaWJ1dGVzLnJlcXVpcmVkID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAibGFiZWwiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFsieGZhTGFiZWwiXQogICAgICB9LAogICAgICBjaGlsZHJlbjogW2lucHV0XQogICAgfSk7CiAgfQp9CmNsYXNzIENob2ljZUxpc3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY2hvaWNlTGlzdCIsIHRydWUpOwogICAgdGhpcy5jb21taXRPbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmNvbW1pdE9uLCBbInNlbGVjdCIsICJleGl0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm9wZW4gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5vcGVuLCBbInVzZXJDb250cm9sIiwgImFsd2F5cyIsICJtdWx0aVNlbGVjdCIsICJvbkVudHJ5Il0pOwogICAgdGhpcy50ZXh0RW50cnkgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy50ZXh0RW50cnksCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSh0aGlzLCAiYm9yZGVyIiwgIm1hcmdpbiIpOwogICAgY29uc3QgdWkgPSB0aGlzWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBmaWVsZCA9IHVpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBmb250U2l6ZSA9IGZpZWxkLmZvbnQ/LnNpemUgfHwgMTA7CiAgICBjb25zdCBvcHRpb25TdHlsZSA9IHsKICAgICAgZm9udFNpemU6IGBjYWxjKCR7Zm9udFNpemV9cHggKiB2YXIoLS10b3RhbC1zY2FsZS1mYWN0b3IpKWAKICAgIH07CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgaWYgKGZpZWxkLml0ZW1zLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgaXRlbXMgPSBmaWVsZC5pdGVtczsKICAgICAgbGV0IGRpc3BsYXllZEluZGV4ID0gMDsKICAgICAgbGV0IHNhdmVJbmRleCA9IDA7CiAgICAgIGlmIChpdGVtcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHsKICAgICAgICBkaXNwbGF5ZWRJbmRleCA9IGl0ZW1zLmNoaWxkcmVuWzBdLnNhdmU7CiAgICAgICAgc2F2ZUluZGV4ID0gMSAtIGRpc3BsYXllZEluZGV4OwogICAgICB9CiAgICAgIGNvbnN0IGRpc3BsYXllZCA9IGl0ZW1zLmNoaWxkcmVuW2Rpc3BsYXllZEluZGV4XVskdG9IVE1MXSgpLmh0bWw7CiAgICAgIGNvbnN0IHZhbHVlcyA9IGl0ZW1zLmNoaWxkcmVuW3NhdmVJbmRleF1bJHRvSFRNTF0oKS5odG1sOwogICAgICBsZXQgc2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC52YWx1ZT8uWyR0ZXh0XSgpIHx8ICIiOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBkaXNwbGF5ZWQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IG9wdGlvbiA9IHsKICAgICAgICAgIG5hbWU6ICJvcHRpb24iLAogICAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgICB2YWx1ZTogdmFsdWVzW2ldIHx8IGRpc3BsYXllZFtpXSwKICAgICAgICAgICAgc3R5bGU6IG9wdGlvblN0eWxlCiAgICAgICAgICB9LAogICAgICAgICAgdmFsdWU6IGRpc3BsYXllZFtpXQogICAgICAgIH07CiAgICAgICAgaWYgKHZhbHVlc1tpXSA9PT0gdmFsdWUpIHsKICAgICAgICAgIG9wdGlvbi5hdHRyaWJ1dGVzLnNlbGVjdGVkID0gc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBjaGlsZHJlbi5wdXNoKG9wdGlvbik7CiAgICAgIH0KICAgICAgaWYgKCFzZWxlY3RlZCkgewogICAgICAgIGNoaWxkcmVuLnNwbGljZSgwLCAwLCB7CiAgICAgICAgICBuYW1lOiAib3B0aW9uIiwKICAgICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgICAgaGlkZGVuOiB0cnVlLAogICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgIHZhbHVlOiAiICIKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgY29uc3Qgc2VsZWN0QXR0cmlidXRlcyA9IHsKICAgICAgY2xhc3M6IFsieGZhU2VsZWN0Il0sCiAgICAgIGZpZWxkSWQ6IGZpZWxkWyR1aWRdLAogICAgICBkYXRhSWQ6IGZpZWxkWyRkYXRhXT8uWyR1aWRdIHx8IGZpZWxkWyR1aWRdLAogICAgICBzdHlsZSwKICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAiYXJpYS1yZXF1aXJlZCI6IGZhbHNlCiAgICB9OwogICAgaWYgKGlzUmVxdWlyZWQoZmllbGQpKSB7CiAgICAgIHNlbGVjdEF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIHNlbGVjdEF0dHJpYnV0ZXMucmVxdWlyZWQgPSB0cnVlOwogICAgfQogICAgaWYgKHRoaXMub3BlbiA9PT0gIm11bHRpU2VsZWN0IikgewogICAgICBzZWxlY3RBdHRyaWJ1dGVzLm11bHRpcGxlID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAibGFiZWwiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFsieGZhTGFiZWwiXQogICAgICB9LAogICAgICBjaGlsZHJlbjogW3sKICAgICAgICBuYW1lOiAic2VsZWN0IiwKICAgICAgICBjaGlsZHJlbiwKICAgICAgICBhdHRyaWJ1dGVzOiBzZWxlY3RBdHRyaWJ1dGVzCiAgICAgIH1dCiAgICB9KTsKICB9Cn0KY2xhc3MgQ29sb3IgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY29sb3IiLCB0cnVlKTsKICAgIHRoaXMuY1NwYWNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuY1NwYWNlLCBbIlNSR0IiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnZhbHVlID0gYXR0cmlidXRlcy52YWx1ZSA/IGdldENvbG9yKGF0dHJpYnV0ZXMudmFsdWUpIDogIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskaGFzU2V0dGFibGVWYWx1ZV0oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICByZXR1cm4gdGhpcy52YWx1ZSA/IFV0aWwubWFrZUhleENvbG9yKHRoaXMudmFsdWUuciwgdGhpcy52YWx1ZS5nLCB0aGlzLnZhbHVlLmIpIDogbnVsbDsKICB9Cn0KY2xhc3MgQ29tYiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjb21iIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubnVtYmVyT2ZDZWxscyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm51bWJlck9mQ2VsbHMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIENvbm5lY3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY29ubmVjdCIsIHRydWUpOwogICAgdGhpcy5jb25uZWN0aW9uID0gYXR0cmlidXRlcy5jb25uZWN0aW9uIHx8ICIiOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnJlZiA9IGF0dHJpYnV0ZXMucmVmIHx8ICIiOwogICAgdGhpcy51c2FnZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnVzYWdlLCBbImV4cG9ydEFuZEltcG9ydCIsICJleHBvcnRPbmx5IiwgImltcG9ydE9ubHkiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICB9Cn0KY2xhc3MgQ29udGVudEFyZWEgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY29udGVudEFyZWEiLCB0cnVlKTsKICAgIHRoaXMuaCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuaCk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmVsZXZhbnQgPSBnZXRSZWxldmFudChhdHRyaWJ1dGVzLnJlbGV2YW50KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLncgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLncpOwogICAgdGhpcy54ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3QgbGVmdCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLngpOwogICAgY29uc3QgdG9wID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMueSk7CiAgICBjb25zdCBzdHlsZSA9IHsKICAgICAgbGVmdCwKICAgICAgdG9wLAogICAgICB3aWR0aDogbWVhc3VyZVRvU3RyaW5nKHRoaXMudyksCiAgICAgIGhlaWdodDogbWVhc3VyZVRvU3RyaW5nKHRoaXMuaCkKICAgIH07CiAgICBjb25zdCBjbGFzc05hbWVzID0gWyJ4ZmFDb250ZW50YXJlYSJdOwogICAgaWYgKGlzUHJpbnRPbmx5KHRoaXMpKSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhUHJpbnRPbmx5Iik7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGNoaWxkcmVuOiBbXSwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHN0eWxlLAogICAgICAgIGNsYXNzOiBjbGFzc05hbWVzLAogICAgICAgIGlkOiB0aGlzWyR1aWRdCiAgICAgIH0KICAgIH0pOwogIH0KfQpjbGFzcyBDb3JuZXIgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY29ybmVyIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMuaW52ZXJ0ZWQgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5pbnZlcnRlZCwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMuam9pbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmpvaW4sIFsic3F1YXJlIiwgInJvdW5kIl0pOwogICAgdGhpcy5wcmVzZW5jZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnByZXNlbmNlLCBbInZpc2libGUiLCAiaGlkZGVuIiwgImluYWN0aXZlIiwgImludmlzaWJsZSJdKTsKICAgIHRoaXMucmFkaXVzID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5yYWRpdXMpOwogICAgdGhpcy5zdHJva2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zdHJva2UsIFsic29saWQiLCAiZGFzaERvdCIsICJkYXNoRG90RG90IiwgImRhc2hlZCIsICJkb3R0ZWQiLCAiZW1ib3NzZWQiLCAiZXRjaGVkIiwgImxvd2VyZWQiLCAicmFpc2VkIl0pOwogICAgdGhpcy50aGlja25lc3MgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnRoaWNrbmVzcywgIjAuNXB0Iik7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgInZpc2liaWxpdHkiKTsKICAgIHN0eWxlLnJhZGl1cyA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLmpvaW4gPT09ICJzcXVhcmUiID8gMCA6IHRoaXMucmFkaXVzKTsKICAgIHJldHVybiBzdHlsZTsKICB9Cn0KY2xhc3MgRGF0ZUVsZW1lbnQgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRhdGUiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBjb25zdCBkYXRlID0gdGhpc1skY29udGVudF0udHJpbSgpOwogICAgdGhpc1skY29udGVudF0gPSBkYXRlID8gbmV3IERhdGUoZGF0ZSkgOiBudWxsOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHJldHVybiB2YWx1ZVRvSHRtbCh0aGlzWyRjb250ZW50XSA/IHRoaXNbJGNvbnRlbnRdLnRvU3RyaW5nKCkgOiAiIik7CiAgfQp9CmNsYXNzIERhdGVUaW1lIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkYXRlVGltZSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IGRhdGUgPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICB0aGlzWyRjb250ZW50XSA9IGRhdGUgPyBuZXcgRGF0ZShkYXRlKSA6IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbJGNvbnRlbnRdID8gdGhpc1skY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgRGF0ZVRpbWVFZGl0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRhdGVUaW1lRWRpdCIsIHRydWUpOwogICAgdGhpcy5oU2Nyb2xsUG9saWN5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaFNjcm9sbFBvbGljeSwgWyJhdXRvIiwgIm9mZiIsICJvbiJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5waWNrZXIgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5waWNrZXIsIFsiaG9zdCIsICJub25lIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuY29tYiA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJib3JkZXIiLCAiZm9udCIsICJtYXJnaW4iKTsKICAgIGNvbnN0IGZpZWxkID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiaW5wdXQiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgdHlwZTogInRleHQiLAogICAgICAgIGZpZWxkSWQ6IGZpZWxkWyR1aWRdLAogICAgICAgIGRhdGFJZDogZmllbGRbJGRhdGFdPy5bJHVpZF0gfHwgZmllbGRbJHVpZF0sCiAgICAgICAgY2xhc3M6IFsieGZhVGV4dGZpZWxkIl0sCiAgICAgICAgc3R5bGUsCiAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICJhcmlhLXJlcXVpcmVkIjogZmFsc2UKICAgICAgfQogICAgfTsKICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBodG1sLmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIGh0bWwuYXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImxhYmVsIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbInhmYUxhYmVsIl0KICAgICAgfSwKICAgICAgY2hpbGRyZW46IFtodG1sXQogICAgfSk7CiAgfQp9CmNsYXNzIERlY2ltYWwgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRlY2ltYWwiKTsKICAgIHRoaXMuZnJhY0RpZ2l0cyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmZyYWNEaWdpdHMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMiwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVhZERpZ2l0cyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmxlYWREaWdpdHMsCiAgICAgIGRlZmF1bHRWYWx1ZTogLTEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBjb25zdCBudW1iZXIgPSBwYXJzZUZsb2F0KHRoaXNbJGNvbnRlbnRdLnRyaW0oKSk7CiAgICB0aGlzWyRjb250ZW50XSA9IGlzTmFOKG51bWJlcikgPyBudWxsIDogbnVtYmVyOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHJldHVybiB2YWx1ZVRvSHRtbCh0aGlzWyRjb250ZW50XSAhPT0gbnVsbCA/IHRoaXNbJGNvbnRlbnRdLnRvU3RyaW5nKCkgOiAiIik7CiAgfQp9CmNsYXNzIERlZmF1bHRVaSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkZWZhdWx0VWkiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9Cn0KY2xhc3MgRGVzYyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkZXNjIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBEaWdlc3RNZXRob2QgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZGlnZXN0TWV0aG9kIiwgWyIiLCAiU0hBMSIsICJTSEEyNTYiLCAiU0hBNTEyIiwgIlJJUEVNRDE2MCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgRGlnZXN0TWV0aG9kcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkaWdlc3RNZXRob2RzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5kaWdlc3RNZXRob2QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRHJhdyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkcmF3IiwgdHJ1ZSk7CiAgICB0aGlzLmFuY2hvclR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hbmNob3JUeXBlLCBbInRvcExlZnQiLCAiYm90dG9tQ2VudGVyIiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAibWlkZGxlQ2VudGVyIiwgIm1pZGRsZUxlZnQiLCAibWlkZGxlUmlnaHQiLCAidG9wQ2VudGVyIiwgInRvcFJpZ2h0Il0pOwogICAgdGhpcy5jb2xTcGFuID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5oID0gYXR0cmlidXRlcy5oID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5oKSA6ICIiOwogICAgdGhpcy5oQWxpZ24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oQWxpZ24sIFsibGVmdCIsICJjZW50ZXIiLCAianVzdGlmeSIsICJqdXN0aWZ5QWxsIiwgInJhZGl4IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxvY2FsZSA9IGF0dHJpYnV0ZXMubG9jYWxlIHx8ICIiOwogICAgdGhpcy5tYXhIID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhILCAiMHB0Iik7CiAgICB0aGlzLm1heFcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1heFcsICIwcHQiKTsKICAgIHRoaXMubWluSCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWluSCwgIjBwdCIpOwogICAgdGhpcy5taW5XID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5taW5XLCAiMHB0Iik7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy5yb3RhdGUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5yb3RhdGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCAlIDkwID09PSAwCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLncgPSBhdHRyaWJ1dGVzLncgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLncpIDogIiI7CiAgICB0aGlzLnggPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLngsICIwcHQiKTsKICAgIHRoaXMueSA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMueSwgIjBwdCIpOwogICAgdGhpcy5hc3Npc3QgPSBudWxsOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jYXB0aW9uID0gbnVsbDsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmZvbnQgPSBudWxsOwogICAgdGhpcy5rZWVwID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICAgIHRoaXMucGFyYSA9IG51bGw7CiAgICB0aGlzLnRyYXZlcnNhbCA9IG51bGw7CiAgICB0aGlzLnVpID0gbnVsbDsKICAgIHRoaXMudmFsdWUgPSBudWxsOwogICAgdGhpcy5zZXRQcm9wZXJ0eSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KICBbJHNldFZhbHVlXSh2YWx1ZSkgewogICAgX3NldFZhbHVlKHRoaXMsIHZhbHVlKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBzZXRUYWJJbmRleCh0aGlzKTsKICAgIGlmICh0aGlzLnByZXNlbmNlID09PSAiaGlkZGVuIiB8fCB0aGlzLnByZXNlbmNlID09PSAiaW5hY3RpdmUiKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgZml4RGltZW5zaW9ucyh0aGlzKTsKICAgIHRoaXNbJHB1c2hQYXJhXSgpOwogICAgY29uc3Qgc2F2ZWRXID0gdGhpcy53OwogICAgY29uc3Qgc2F2ZWRIID0gdGhpcy5oOwogICAgY29uc3QgewogICAgICB3LAogICAgICBoLAogICAgICBpc0Jyb2tlbgogICAgfSA9IGxheW91dE5vZGUodGhpcywgYXZhaWxhYmxlU3BhY2UpOwogICAgaWYgKHcgJiYgdGhpcy53ID09PSAiIikgewogICAgICBpZiAoaXNCcm9rZW4gJiYgdGhpc1skZ2V0U3ViZm9ybVBhcmVudF0oKVskaXNUaGVyZU1vcmVXaWR0aF0oKSkgewogICAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRkFJTFVSRTsKICAgICAgfQogICAgICB0aGlzLncgPSB3OwogICAgfQogICAgaWYgKGggJiYgdGhpcy5oID09PSAiIikgewogICAgICB0aGlzLmggPSBoOwogICAgfQogICAgc2V0Rmlyc3RVbnNwbGl0dGFibGUodGhpcyk7CiAgICBpZiAoIWNoZWNrRGltZW5zaW9ucyh0aGlzLCBhdmFpbGFibGVTcGFjZSkpIHsKICAgICAgdGhpcy53ID0gc2F2ZWRXOwogICAgICB0aGlzLmggPSBzYXZlZEg7CiAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICB1bnNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJmb250IiwgImhBbGlnbiIsICJkaW1lbnNpb25zIiwgInBvc2l0aW9uIiwgInByZXNlbmNlIiwgInJvdGF0ZSIsICJhbmNob3JUeXBlIiwgImJvcmRlciIsICJtYXJnaW4iKTsKICAgIHNldE1pbk1heERpbWVuc2lvbnModGhpcywgc3R5bGUpOwogICAgaWYgKHN0eWxlLm1hcmdpbikgewogICAgICBzdHlsZS5wYWRkaW5nID0gc3R5bGUubWFyZ2luOwogICAgICBkZWxldGUgc3R5bGUubWFyZ2luOwogICAgfQogICAgY29uc3QgY2xhc3NOYW1lcyA9IFsieGZhRHJhdyJdOwogICAgaWYgKHRoaXMuZm9udCkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYUZvbnQiKTsKICAgIH0KICAgIGlmIChpc1ByaW50T25seSh0aGlzKSkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgc3R5bGUsCiAgICAgIGlkOiB0aGlzWyR1aWRdLAogICAgICBjbGFzczogY2xhc3NOYW1lcwogICAgfTsKICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgYXR0cmlidXRlcy54ZmFOYW1lID0gdGhpcy5uYW1lOwogICAgfQogICAgY29uc3QgaHRtbCA9IHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICAgIGFwcGx5QXNzaXN0KHRoaXMsIGF0dHJpYnV0ZXMpOwogICAgY29uc3QgYmJveCA9IGNvbXB1dGVCYm94KHRoaXMsIGh0bWwsIGF2YWlsYWJsZVNwYWNlKTsKICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWVbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpLmh0bWwgOiBudWxsOwogICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgIHRoaXMudyA9IHNhdmVkVzsKICAgICAgdGhpcy5oID0gc2F2ZWRIOwogICAgICB0aGlzWyRwb3BQYXJhXSgpOwogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGNyZWF0ZVdyYXBwZXIodGhpcywgaHRtbCksIGJib3gpOwogICAgfQogICAgaHRtbC5jaGlsZHJlbi5wdXNoKHZhbHVlKTsKICAgIHNldFBhcmEodGhpcywgc3R5bGUsIHZhbHVlKTsKICAgIHRoaXMudyA9IHNhdmVkVzsKICAgIHRoaXMuaCA9IHNhdmVkSDsKICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGNyZWF0ZVdyYXBwZXIodGhpcywgaHRtbCksIGJib3gpOwogIH0KfQpjbGFzcyBFZGdlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVkZ2UiLCB0cnVlKTsKICAgIHRoaXMuY2FwID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuY2FwLCBbInNxdWFyZSIsICJidXR0IiwgInJvdW5kIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5zdHJva2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zdHJva2UsIFsic29saWQiLCAiZGFzaERvdCIsICJkYXNoRG90RG90IiwgImRhc2hlZCIsICJkb3R0ZWQiLCAiZW1ib3NzZWQiLCAiZXRjaGVkIiwgImxvd2VyZWQiLCAicmFpc2VkIl0pOwogICAgdGhpcy50aGlja25lc3MgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnRoaWNrbmVzcywgIjAuNXB0Iik7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgInZpc2liaWxpdHkiKTsKICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHsKICAgICAgbGluZWNhcDogdGhpcy5jYXAsCiAgICAgIHdpZHRoOiBtZWFzdXJlVG9TdHJpbmcodGhpcy50aGlja25lc3MpLAogICAgICBjb2xvcjogdGhpcy5jb2xvciA/IHRoaXMuY29sb3JbJHRvU3R5bGVdKCkgOiAiIzAwMDAwMCIsCiAgICAgIHN0eWxlOiAiIgogICAgfSk7CiAgICBpZiAodGhpcy5wcmVzZW5jZSAhPT0gInZpc2libGUiKSB7CiAgICAgIHN0eWxlLnN0eWxlID0gIm5vbmUiOwogICAgfSBlbHNlIHsKICAgICAgc3dpdGNoICh0aGlzLnN0cm9rZSkgewogICAgICAgIGNhc2UgInNvbGlkIjoKICAgICAgICAgIHN0eWxlLnN0eWxlID0gInNvbGlkIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhc2hEb3QiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiZGFzaGVkIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhc2hEb3REb3QiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiZGFzaGVkIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhc2hlZCI6CiAgICAgICAgICBzdHlsZS5zdHlsZSA9ICJkYXNoZWQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZG90dGVkIjoKICAgICAgICAgIHN0eWxlLnN0eWxlID0gImRvdHRlZCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJlbWJvc3NlZCI6CiAgICAgICAgICBzdHlsZS5zdHlsZSA9ICJyaWRnZSI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJldGNoZWQiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiZ3Jvb3ZlIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxvd2VyZWQiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiaW5zZXQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicmFpc2VkIjoKICAgICAgICAgIHN0eWxlLnN0eWxlID0gIm91dHNldCI7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0eWxlOwogIH0KfQpjbGFzcyBFbmNvZGluZyBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJlbmNvZGluZyIsIFsiYWRiZS54NTA5LnJzYV9zaGExIiwgImFkYmUucGtjczcuZGV0YWNoZWQiLCAiYWRiZS5wa2NzNy5zaGExIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBFbmNvZGluZ3MgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZW5jb2RpbmdzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lbmNvZGluZyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBFbmNyeXB0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY3J5cHQiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY2VydGlmaWNhdGUgPSBudWxsOwogIH0KfQpjbGFzcyBFbmNyeXB0RGF0YSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJlbmNyeXB0RGF0YSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm9wZXJhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm9wZXJhdGlvbiwgWyJlbmNyeXB0IiwgImRlY3J5cHQiXSk7CiAgICB0aGlzLnRhcmdldCA9IGF0dHJpYnV0ZXMudGFyZ2V0IHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZmlsdGVyID0gbnVsbDsKICAgIHRoaXMubWFuaWZlc3QgPSBudWxsOwogIH0KfQpjbGFzcyBFbmNyeXB0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY3J5cHRpb24iLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb25NZXRob2QgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZW5jcnlwdGlvbk1ldGhvZCIsIFsiIiwgIkFFUzI1Ni1DQkMiLCAiVFJJUExFREVTLUNCQyIsICJBRVMxMjgtQ0JDIiwgIkFFUzE5Mi1DQkMiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb25NZXRob2RzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY3J5cHRpb25NZXRob2RzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lbmNyeXB0aW9uTWV0aG9kID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEV2ZW50IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImV2ZW50IiwgdHJ1ZSk7CiAgICB0aGlzLmFjdGl2aXR5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuYWN0aXZpdHksIFsiY2xpY2siLCAiY2hhbmdlIiwgImRvY0Nsb3NlIiwgImRvY1JlYWR5IiwgImVudGVyIiwgImV4aXQiLCAiZnVsbCIsICJpbmRleENoYW5nZSIsICJpbml0aWFsaXplIiwgIm1vdXNlRG93biIsICJtb3VzZUVudGVyIiwgIm1vdXNlRXhpdCIsICJtb3VzZVVwIiwgInBvc3RFeGVjdXRlIiwgInBvc3RPcGVuIiwgInBvc3RQcmludCIsICJwb3N0U2F2ZSIsICJwb3N0U2lnbiIsICJwb3N0U3VibWl0IiwgInByZUV4ZWN1dGUiLCAicHJlT3BlbiIsICJwcmVQcmludCIsICJwcmVTYXZlIiwgInByZVNpZ24iLCAicHJlU3VibWl0IiwgInJlYWR5IiwgInZhbGlkYXRpb25TdGF0ZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5saXN0ZW4gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5saXN0ZW4sIFsicmVmT25seSIsICJyZWZBbmREZXNjZW5kZW50cyJdKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5lbmNyeXB0RGF0YSA9IG51bGw7CiAgICB0aGlzLmV4ZWN1dGUgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogICAgdGhpcy5zaWduRGF0YSA9IG51bGw7CiAgICB0aGlzLnN1Ym1pdCA9IG51bGw7CiAgfQp9CmNsYXNzIEV4RGF0YSBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZXhEYXRhIik7CiAgICB0aGlzLmNvbnRlbnRUeXBlID0gYXR0cmlidXRlcy5jb250ZW50VHlwZSB8fCAiIjsKICAgIHRoaXMuaHJlZiA9IGF0dHJpYnV0ZXMuaHJlZiB8fCAiIjsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5tYXhMZW5ndGggPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5tYXhMZW5ndGgsCiAgICAgIGRlZmF1bHRWYWx1ZTogLTEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gLTEKICAgIH0pOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5yaWQgPSBhdHRyaWJ1dGVzLnJpZCB8fCAiIjsKICAgIHRoaXMudHJhbnNmZXJFbmNvZGluZyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnRyYW5zZmVyRW5jb2RpbmcsIFsibm9uZSIsICJiYXNlNjQiLCAicGFja2FnZSJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFskaXNDREFUQVhtbF0oKSB7CiAgICByZXR1cm4gdGhpcy5jb250ZW50VHlwZSA9PT0gInRleHQvaHRtbCI7CiAgfQogIFskb25DaGlsZF0oY2hpbGQpIHsKICAgIGlmICh0aGlzLmNvbnRlbnRUeXBlID09PSAidGV4dC9odG1sIiAmJiBjaGlsZFskbmFtZXNwYWNlSWRdID09PSBOYW1lc3BhY2VJZHMueGh0bWwuaWQpIHsKICAgICAgdGhpc1skY29udGVudF0gPSBjaGlsZDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAodGhpcy5jb250ZW50VHlwZSA9PT0gInRleHQveG1sIikgewogICAgICB0aGlzWyRjb250ZW50XSA9IGNoaWxkOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBpZiAodGhpcy5jb250ZW50VHlwZSAhPT0gInRleHQvaHRtbCIgfHwgIXRoaXNbJGNvbnRlbnRdKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICB9Cn0KY2xhc3MgRXhPYmplY3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZXhPYmplY3QiLCB0cnVlKTsKICAgIHRoaXMuYXJjaGl2ZSA9IGF0dHJpYnV0ZXMuYXJjaGl2ZSB8fCAiIjsKICAgIHRoaXMuY2xhc3NJZCA9IGF0dHJpYnV0ZXMuY2xhc3NJZCB8fCAiIjsKICAgIHRoaXMuY29kZUJhc2UgPSBhdHRyaWJ1dGVzLmNvZGVCYXNlIHx8ICIiOwogICAgdGhpcy5jb2RlVHlwZSA9IGF0dHJpYnV0ZXMuY29kZVR5cGUgfHwgIiI7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leE9iamVjdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBFeGNsR3JvdXAgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZXhjbEdyb3VwIiwgdHJ1ZSk7CiAgICB0aGlzLmFjY2VzcyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFjY2VzcywgWyJvcGVuIiwgIm5vbkludGVyYWN0aXZlIiwgInByb3RlY3RlZCIsICJyZWFkT25seSJdKTsKICAgIHRoaXMuYWNjZXNzS2V5ID0gYXR0cmlidXRlcy5hY2Nlc3NLZXkgfHwgIiI7CiAgICB0aGlzLmFuY2hvclR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hbmNob3JUeXBlLCBbInRvcExlZnQiLCAiYm90dG9tQ2VudGVyIiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAibWlkZGxlQ2VudGVyIiwgIm1pZGRsZUxlZnQiLCAibWlkZGxlUmlnaHQiLCAidG9wQ2VudGVyIiwgInRvcFJpZ2h0Il0pOwogICAgdGhpcy5jb2xTcGFuID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5oID0gYXR0cmlidXRlcy5oID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5oKSA6ICIiOwogICAgdGhpcy5oQWxpZ24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oQWxpZ24sIFsibGVmdCIsICJjZW50ZXIiLCAianVzdGlmeSIsICJqdXN0aWZ5QWxsIiwgInJhZGl4IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxheW91dCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmxheW91dCwgWyJwb3NpdGlvbiIsICJsci10YiIsICJybC1yb3ciLCAicmwtdGIiLCAicm93IiwgInRhYmxlIiwgInRiIl0pOwogICAgdGhpcy5tYXhIID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhILCAiMHB0Iik7CiAgICB0aGlzLm1heFcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1heFcsICIwcHQiKTsKICAgIHRoaXMubWluSCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWluSCwgIjBwdCIpOwogICAgdGhpcy5taW5XID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5taW5XLCAiMHB0Iik7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudyA9IGF0dHJpYnV0ZXMudyA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMudykgOiAiIjsKICAgIHRoaXMueCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMueCwgIjBwdCIpOwogICAgdGhpcy55ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy55LCAiMHB0Iik7CiAgICB0aGlzLmFzc2lzdCA9IG51bGw7CiAgICB0aGlzLmJpbmQgPSBudWxsOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jYWxjdWxhdGUgPSBudWxsOwogICAgdGhpcy5jYXB0aW9uID0gbnVsbDsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgICB0aGlzLnBhcmEgPSBudWxsOwogICAgdGhpcy50cmF2ZXJzYWwgPSBudWxsOwogICAgdGhpcy52YWxpZGF0ZSA9IG51bGw7CiAgICB0aGlzLmNvbm5lY3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXZlbnQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmllbGQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2V0UHJvcGVydHkgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRpc0JpbmRhYmxlXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJGhhc1NldHRhYmxlVmFsdWVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskc2V0VmFsdWVdKHZhbHVlKSB7CiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZmllbGQuY2hpbGRyZW4pIHsKICAgICAgaWYgKCFmaWVsZC52YWx1ZSkgewogICAgICAgIGNvbnN0IG5vZGVWYWx1ZSA9IG5ldyBWYWx1ZSh7fSk7CiAgICAgICAgZmllbGRbJGFwcGVuZENoaWxkXShub2RlVmFsdWUpOwogICAgICAgIGZpZWxkLnZhbHVlID0gbm9kZVZhbHVlOwogICAgICB9CiAgICAgIGZpZWxkLnZhbHVlWyRzZXRWYWx1ZV0odmFsdWUpOwogICAgfQogIH0KICBbJGlzVGhlcmVNb3JlV2lkdGhdKCkgewogICAgcmV0dXJuIHRoaXMubGF5b3V0LmVuZHNXaXRoKCItdGIiKSAmJiB0aGlzWyRleHRyYV0uYXR0ZW1wdCA9PT0gMCAmJiB0aGlzWyRleHRyYV0ubnVtYmVySW5MaW5lID4gMCB8fCB0aGlzWyRnZXRQYXJlbnRdKClbJGlzVGhlcmVNb3JlV2lkdGhdKCk7CiAgfQogIFskaXNTcGxpdHRhYmxlXSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBpZiAoIXBhcmVudFskaXNTcGxpdHRhYmxlXSgpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzWyRleHRyYV0uX2lzU3BsaXR0YWJsZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiB0aGlzWyRleHRyYV0uX2lzU3BsaXR0YWJsZTsKICAgIH0KICAgIGlmICh0aGlzLmxheW91dCA9PT0gInBvc2l0aW9uIiB8fCB0aGlzLmxheW91dC5pbmNsdWRlcygicm93IikpIHsKICAgICAgdGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGUgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHBhcmVudC5sYXlvdXQ/LmVuZHNXaXRoKCItdGIiKSAmJiBwYXJlbnRbJGV4dHJhXS5udW1iZXJJbkxpbmUgIT09IDApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGUgPSB0cnVlOwogICAgcmV0dXJuIHRydWU7CiAgfQogIFskZmx1c2hIVE1MXSgpIHsKICAgIHJldHVybiBmbHVzaEhUTUwodGhpcyk7CiAgfQogIFskYWRkSFRNTF0oaHRtbCwgYmJveCkgewogICAgYWRkSFRNTCh0aGlzLCBodG1sLCBiYm94KTsKICB9CiAgWyRnZXRBdmFpbGFibGVTcGFjZV0oKSB7CiAgICByZXR1cm4gZ2V0QXZhaWxhYmxlU3BhY2UodGhpcyk7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgc2V0VGFiSW5kZXgodGhpcyk7CiAgICBpZiAodGhpcy5wcmVzZW5jZSA9PT0gImhpZGRlbiIgfHwgdGhpcy5wcmVzZW5jZSA9PT0gImluYWN0aXZlIiB8fCB0aGlzLmggPT09IDAgfHwgdGhpcy53ID09PSAwKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgZml4RGltZW5zaW9ucyh0aGlzKTsKICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gewogICAgICBpZDogdGhpc1skdWlkXSwKICAgICAgY2xhc3M6IFtdCiAgICB9OwogICAgc2V0QWNjZXNzKHRoaXMsIGF0dHJpYnV0ZXMuY2xhc3MpOwogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgdGhpc1skZXh0cmFdID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIE9iamVjdC5hc3NpZ24odGhpc1skZXh0cmFdLCB7CiAgICAgIGNoaWxkcmVuLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBhdHRlbXB0OiAwLAogICAgICBsaW5lOiBudWxsLAogICAgICBudW1iZXJJbkxpbmU6IDAsCiAgICAgIGF2YWlsYWJsZVNwYWNlOiB7CiAgICAgICAgd2lkdGg6IE1hdGgubWluKHRoaXMudyB8fCBJbmZpbml0eSwgYXZhaWxhYmxlU3BhY2Uud2lkdGgpLAogICAgICAgIGhlaWdodDogTWF0aC5taW4odGhpcy5oIHx8IEluZmluaXR5LCBhdmFpbGFibGVTcGFjZS5oZWlnaHQpCiAgICAgIH0sCiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAsCiAgICAgIHByZXZIZWlnaHQ6IDAsCiAgICAgIGN1cnJlbnRXaWR0aDogMAogICAgfSk7CiAgICBjb25zdCBpc1NwbGl0dGFibGUgPSB0aGlzWyRpc1NwbGl0dGFibGVdKCk7CiAgICBpZiAoIWlzU3BsaXR0YWJsZSkgewogICAgICBzZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIH0KICAgIGlmICghY2hlY2tEaW1lbnNpb25zKHRoaXMsIGF2YWlsYWJsZVNwYWNlKSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgfQogICAgY29uc3QgZmlsdGVyID0gbmV3IFNldChbImZpZWxkIl0pOwogICAgaWYgKHRoaXMubGF5b3V0LmluY2x1ZGVzKCJyb3ciKSkgewogICAgICBjb25zdCBjb2x1bW5XaWR0aHMgPSB0aGlzWyRnZXRTdWJmb3JtUGFyZW50XSgpLmNvbHVtbldpZHRoczsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sdW1uV2lkdGhzKSAmJiBjb2x1bW5XaWR0aHMubGVuZ3RoID4gMCkgewogICAgICAgIHRoaXNbJGV4dHJhXS5jb2x1bW5XaWR0aHMgPSBjb2x1bW5XaWR0aHM7CiAgICAgICAgdGhpc1skZXh0cmFdLmN1cnJlbnRDb2x1bW4gPSAwOwogICAgICB9CiAgICB9CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImFuY2hvclR5cGUiLCAiZGltZW5zaW9ucyIsICJwb3NpdGlvbiIsICJwcmVzZW5jZSIsICJib3JkZXIiLCAibWFyZ2luIiwgImhBbGlnbiIpOwogICAgY29uc3QgY2xhc3NOYW1lcyA9IFsieGZhRXhjbGdyb3VwIl07CiAgICBjb25zdCBjbCA9IGxheW91dENsYXNzKHRoaXMpOwogICAgaWYgKGNsKSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaChjbCk7CiAgICB9CiAgICBpZiAoaXNQcmludE9ubHkodGhpcykpIHsKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFQcmludE9ubHkiKTsKICAgIH0KICAgIGF0dHJpYnV0ZXMuc3R5bGUgPSBzdHlsZTsKICAgIGF0dHJpYnV0ZXMuY2xhc3MgPSBjbGFzc05hbWVzOwogICAgaWYgKHRoaXMubmFtZSkgewogICAgICBhdHRyaWJ1dGVzLnhmYU5hbWUgPSB0aGlzLm5hbWU7CiAgICB9CiAgICB0aGlzWyRwdXNoUGFyYV0oKTsKICAgIGNvbnN0IGlzTHJUYiA9IHRoaXMubGF5b3V0ID09PSAibHItdGIiIHx8IHRoaXMubGF5b3V0ID09PSAicmwtdGIiOwogICAgY29uc3QgbWF4UnVuID0gaXNMclRiID8gTUFYX0FUVEVNUFRTX0ZPUl9MUlRCX0xBWU9VVCA6IDE7CiAgICBmb3IgKDsgdGhpc1skZXh0cmFdLmF0dGVtcHQgPCBtYXhSdW47IHRoaXNbJGV4dHJhXS5hdHRlbXB0KyspIHsKICAgICAgaWYgKGlzTHJUYiAmJiB0aGlzWyRleHRyYV0uYXR0ZW1wdCA9PT0gTUFYX0FUVEVNUFRTX0ZPUl9MUlRCX0xBWU9VVCAtIDEpIHsKICAgICAgICB0aGlzWyRleHRyYV0ubnVtYmVySW5MaW5lID0gMDsKICAgICAgfQogICAgICBjb25zdCByZXN1bHQgPSB0aGlzWyRjaGlsZHJlblRvSFRNTF0oewogICAgICAgIGZpbHRlciwKICAgICAgICBpbmNsdWRlOiB0cnVlCiAgICAgIH0pOwogICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAocmVzdWx0LmlzQnJlYWsoKSkgewogICAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBpZiAoaXNMclRiICYmIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID09PSAwICYmIHRoaXNbJGV4dHJhXS5udW1iZXJJbkxpbmUgPT09IDAgJiYgIXRoaXNbJGdldFRlbXBsYXRlUm9vdF0oKVskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSkgewogICAgICAgIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID0gbWF4UnVuOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICB0aGlzWyRwb3BQYXJhXSgpOwogICAgaWYgKCFpc1NwbGl0dGFibGUpIHsKICAgICAgdW5zZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIH0KICAgIGlmICh0aGlzWyRleHRyYV0uYXR0ZW1wdCA9PT0gbWF4UnVuKSB7CiAgICAgIGlmICghaXNTcGxpdHRhYmxlKSB7CiAgICAgICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgICAgfQogICAgICByZXR1cm4gSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgfQogICAgbGV0IG1hcmdpbkggPSAwOwogICAgbGV0IG1hcmdpblYgPSAwOwogICAgaWYgKHRoaXMubWFyZ2luKSB7CiAgICAgIG1hcmdpbkggPSB0aGlzLm1hcmdpbi5sZWZ0SW5zZXQgKyB0aGlzLm1hcmdpbi5yaWdodEluc2V0OwogICAgICBtYXJnaW5WID0gdGhpcy5tYXJnaW4udG9wSW5zZXQgKyB0aGlzLm1hcmdpbi5ib3R0b21JbnNldDsKICAgIH0KICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgodGhpc1skZXh0cmFdLndpZHRoICsgbWFyZ2luSCwgdGhpcy53IHx8IDApOwogICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgodGhpc1skZXh0cmFdLmhlaWdodCArIG1hcmdpblYsIHRoaXMuaCB8fCAwKTsKICAgIGNvbnN0IGJib3ggPSBbdGhpcy54LCB0aGlzLnksIHdpZHRoLCBoZWlnaHRdOwogICAgaWYgKHRoaXMudyA9PT0gIiIpIHsKICAgICAgc3R5bGUud2lkdGggPSBtZWFzdXJlVG9TdHJpbmcod2lkdGgpOwogICAgfQogICAgaWYgKHRoaXMuaCA9PT0gIiIpIHsKICAgICAgc3R5bGUuaGVpZ2h0ID0gbWVhc3VyZVRvU3RyaW5nKGhlaWdodCk7CiAgICB9CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlcywKICAgICAgY2hpbGRyZW4KICAgIH07CiAgICBhcHBseUFzc2lzdCh0aGlzLCBhdHRyaWJ1dGVzKTsKICAgIGRlbGV0ZSB0aGlzWyRleHRyYV07CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGNyZWF0ZVdyYXBwZXIodGhpcywgaHRtbCksIGJib3gpOwogIH0KfQpjbGFzcyBFeGVjdXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImV4ZWN1dGUiKTsKICAgIHRoaXMuY29ubmVjdGlvbiA9IGF0dHJpYnV0ZXMuY29ubmVjdGlvbiB8fCAiIjsKICAgIHRoaXMuZXhlY3V0ZVR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5leGVjdXRlVHlwZSwgWyJpbXBvcnQiLCAicmVtZXJnZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5ydW5BdCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnJ1bkF0LCBbImNsaWVudCIsICJib3RoIiwgInNlcnZlciJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIEV4dHJhcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJleHRyYXMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9vbGVhbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRhdGVUaW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRlY2ltYWwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhEYXRhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4dHJhcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBGaWVsZCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmaWVsZCIsIHRydWUpOwogICAgdGhpcy5hY2Nlc3MgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hY2Nlc3MsIFsib3BlbiIsICJub25JbnRlcmFjdGl2ZSIsICJwcm90ZWN0ZWQiLCAicmVhZE9ubHkiXSk7CiAgICB0aGlzLmFjY2Vzc0tleSA9IGF0dHJpYnV0ZXMuYWNjZXNzS2V5IHx8ICIiOwogICAgdGhpcy5hbmNob3JUeXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuYW5jaG9yVHlwZSwgWyJ0b3BMZWZ0IiwgImJvdHRvbUNlbnRlciIsICJib3R0b21MZWZ0IiwgImJvdHRvbVJpZ2h0IiwgIm1pZGRsZUNlbnRlciIsICJtaWRkbGVMZWZ0IiwgIm1pZGRsZVJpZ2h0IiwgInRvcENlbnRlciIsICJ0b3BSaWdodCJdKTsKICAgIHRoaXMuY29sU3BhbiA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmNvbFNwYW4sCiAgICAgIGRlZmF1bHRWYWx1ZTogMSwKICAgICAgdmFsaWRhdGU6IG4gPT4gbiA+PSAxIHx8IG4gPT09IC0xCiAgICB9KTsKICAgIHRoaXMuaCA9IGF0dHJpYnV0ZXMuaCA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuaCkgOiAiIjsKICAgIHRoaXMuaEFsaWduID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaEFsaWduLCBbImxlZnQiLCAiY2VudGVyIiwgImp1c3RpZnkiLCAianVzdGlmeUFsbCIsICJyYWRpeCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sb2NhbGUgPSBhdHRyaWJ1dGVzLmxvY2FsZSB8fCAiIjsKICAgIHRoaXMubWF4SCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWF4SCwgIjBwdCIpOwogICAgdGhpcy5tYXhXID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhXLCAiMHB0Iik7CiAgICB0aGlzLm1pbkggPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1pbkgsICIwcHQiKTsKICAgIHRoaXMubWluVyA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWluVywgIjBwdCIpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5wcmVzZW5jZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnByZXNlbmNlLCBbInZpc2libGUiLCAiaGlkZGVuIiwgImluYWN0aXZlIiwgImludmlzaWJsZSJdKTsKICAgIHRoaXMucmVsZXZhbnQgPSBnZXRSZWxldmFudChhdHRyaWJ1dGVzLnJlbGV2YW50KTsKICAgIHRoaXMucm90YXRlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucm90YXRlLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggJSA5MCA9PT0gMAogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy53ID0gYXR0cmlidXRlcy53ID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy53KSA6ICIiOwogICAgdGhpcy54ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuYXNzaXN0ID0gbnVsbDsKICAgIHRoaXMuYmluZCA9IG51bGw7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmNhbGN1bGF0ZSA9IG51bGw7CiAgICB0aGlzLmNhcHRpb24gPSBudWxsOwogICAgdGhpcy5kZXNjID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuZm9udCA9IG51bGw7CiAgICB0aGlzLmZvcm1hdCA9IG51bGw7CiAgICB0aGlzLml0ZW1zID0gbmV3IFhGQU9iamVjdEFycmF5KDIpOwogICAgdGhpcy5rZWVwID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICAgIHRoaXMucGFyYSA9IG51bGw7CiAgICB0aGlzLnRyYXZlcnNhbCA9IG51bGw7CiAgICB0aGlzLnVpID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGUgPSBudWxsOwogICAgdGhpcy52YWx1ZSA9IG51bGw7CiAgICB0aGlzLmJpbmRJdGVtcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb25uZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV2ZW50ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNldFByb3BlcnR5ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQogIFskaXNCaW5kYWJsZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIF9zZXRWYWx1ZSh0aGlzLCB2YWx1ZSk7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgc2V0VGFiSW5kZXgodGhpcyk7CiAgICBpZiAoIXRoaXMudWkpIHsKICAgICAgdGhpcy51aSA9IG5ldyBVaSh7fSk7CiAgICAgIHRoaXMudWlbJGdsb2JhbERhdGFdID0gdGhpc1skZ2xvYmFsRGF0YV07CiAgICAgIHRoaXNbJGFwcGVuZENoaWxkXSh0aGlzLnVpKTsKICAgICAgbGV0IG5vZGU7CiAgICAgIHN3aXRjaCAodGhpcy5pdGVtcy5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBub2RlID0gbmV3IFRleHRFZGl0KHt9KTsKICAgICAgICAgIHRoaXMudWkudGV4dEVkaXQgPSBub2RlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgbm9kZSA9IG5ldyBDaGVja0J1dHRvbih7fSk7CiAgICAgICAgICB0aGlzLnVpLmNoZWNrQnV0dG9uID0gbm9kZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIG5vZGUgPSBuZXcgQ2hvaWNlTGlzdCh7fSk7CiAgICAgICAgICB0aGlzLnVpLmNob2ljZUxpc3QgPSBub2RlOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdGhpcy51aVskYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgfQogICAgaWYgKCF0aGlzLnVpIHx8IHRoaXMucHJlc2VuY2UgPT09ICJoaWRkZW4iIHx8IHRoaXMucHJlc2VuY2UgPT09ICJpbmFjdGl2ZSIgfHwgdGhpcy5oID09PSAwIHx8IHRoaXMudyA9PT0gMCkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGlmICh0aGlzLmNhcHRpb24pIHsKICAgICAgZGVsZXRlIHRoaXMuY2FwdGlvblskZXh0cmFdOwogICAgfQogICAgdGhpc1skcHVzaFBhcmFdKCk7CiAgICBjb25zdCBjYXB0aW9uID0gdGhpcy5jYXB0aW9uID8gdGhpcy5jYXB0aW9uWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKS5odG1sIDogbnVsbDsKICAgIGNvbnN0IHNhdmVkVyA9IHRoaXMudzsKICAgIGNvbnN0IHNhdmVkSCA9IHRoaXMuaDsKICAgIGxldCBtYXJnaW5IID0gMDsKICAgIGxldCBtYXJnaW5WID0gMDsKICAgIGlmICh0aGlzLm1hcmdpbikgewogICAgICBtYXJnaW5IID0gdGhpcy5tYXJnaW4ubGVmdEluc2V0ICsgdGhpcy5tYXJnaW4ucmlnaHRJbnNldDsKICAgICAgbWFyZ2luViA9IHRoaXMubWFyZ2luLnRvcEluc2V0ICsgdGhpcy5tYXJnaW4uYm90dG9tSW5zZXQ7CiAgICB9CiAgICBsZXQgYm9yZGVyRGltcyA9IG51bGw7CiAgICBpZiAodGhpcy53ID09PSAiIiB8fCB0aGlzLmggPT09ICIiKSB7CiAgICAgIGxldCB3aWR0aCA9IG51bGw7CiAgICAgIGxldCBoZWlnaHQgPSBudWxsOwogICAgICBsZXQgdWlXID0gMDsKICAgICAgbGV0IHVpSCA9IDA7CiAgICAgIGlmICh0aGlzLnVpLmNoZWNrQnV0dG9uKSB7CiAgICAgICAgdWlXID0gdWlIID0gdGhpcy51aS5jaGVja0J1dHRvbi5zaXplOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIHcsCiAgICAgICAgICBoCiAgICAgICAgfSA9IGxheW91dE5vZGUodGhpcywgYXZhaWxhYmxlU3BhY2UpOwogICAgICAgIGlmICh3ICE9PSBudWxsKSB7CiAgICAgICAgICB1aVcgPSB3OwogICAgICAgICAgdWlIID0gaDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdWlIID0gZm9udHNfZ2V0TWV0cmljcyh0aGlzLmZvbnQsIHRydWUpLmxpbmVOb0dhcDsKICAgICAgICB9CiAgICAgIH0KICAgICAgYm9yZGVyRGltcyA9IGdldEJvcmRlckRpbXModGhpcy51aVskZ2V0RXh0cmFdKCkpOwogICAgICB1aVcgKz0gYm9yZGVyRGltcy53OwogICAgICB1aUggKz0gYm9yZGVyRGltcy5oOwogICAgICBpZiAodGhpcy5jYXB0aW9uKSB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgdywKICAgICAgICAgIGgsCiAgICAgICAgICBpc0Jyb2tlbgogICAgICAgIH0gPSB0aGlzLmNhcHRpb25bJGdldEV4dHJhXShhdmFpbGFibGVTcGFjZSk7CiAgICAgICAgaWYgKGlzQnJva2VuICYmIHRoaXNbJGdldFN1YmZvcm1QYXJlbnRdKClbJGlzVGhlcmVNb3JlV2lkdGhdKCkpIHsKICAgICAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgICAgICByZXR1cm4gSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgICAgIH0KICAgICAgICB3aWR0aCA9IHc7CiAgICAgICAgaGVpZ2h0ID0gaDsKICAgICAgICBzd2l0Y2ggKHRoaXMuY2FwdGlvbi5wbGFjZW1lbnQpIHsKICAgICAgICAgIGNhc2UgImxlZnQiOgogICAgICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgICAgY2FzZSAiaW5saW5lIjoKICAgICAgICAgICAgd2lkdGggKz0gdWlXOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgInRvcCI6CiAgICAgICAgICBjYXNlICJib3R0b20iOgogICAgICAgICAgICBoZWlnaHQgKz0gdWlIOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2lkdGggPSB1aVc7CiAgICAgICAgaGVpZ2h0ID0gdWlIOwogICAgICB9CiAgICAgIGlmICh3aWR0aCAmJiB0aGlzLncgPT09ICIiKSB7CiAgICAgICAgd2lkdGggKz0gbWFyZ2luSDsKICAgICAgICB0aGlzLncgPSBNYXRoLm1pbih0aGlzLm1heFcgPD0gMCA/IEluZmluaXR5IDogdGhpcy5tYXhXLCB0aGlzLm1pblcgKyAxIDwgd2lkdGggPyB3aWR0aCA6IHRoaXMubWluVyk7CiAgICAgIH0KICAgICAgaWYgKGhlaWdodCAmJiB0aGlzLmggPT09ICIiKSB7CiAgICAgICAgaGVpZ2h0ICs9IG1hcmdpblY7CiAgICAgICAgdGhpcy5oID0gTWF0aC5taW4odGhpcy5tYXhIIDw9IDAgPyBJbmZpbml0eSA6IHRoaXMubWF4SCwgdGhpcy5taW5IICsgMSA8IGhlaWdodCA/IGhlaWdodCA6IHRoaXMubWluSCk7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICBmaXhEaW1lbnNpb25zKHRoaXMpOwogICAgc2V0Rmlyc3RVbnNwbGl0dGFibGUodGhpcyk7CiAgICBpZiAoIWNoZWNrRGltZW5zaW9ucyh0aGlzLCBhdmFpbGFibGVTcGFjZSkpIHsKICAgICAgdGhpcy53ID0gc2F2ZWRXOwogICAgICB0aGlzLmggPSBzYXZlZEg7CiAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICB1bnNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJmb250IiwgImRpbWVuc2lvbnMiLCAicG9zaXRpb24iLCAicm90YXRlIiwgImFuY2hvclR5cGUiLCAicHJlc2VuY2UiLCAibWFyZ2luIiwgImhBbGlnbiIpOwogICAgc2V0TWluTWF4RGltZW5zaW9ucyh0aGlzLCBzdHlsZSk7CiAgICBjb25zdCBjbGFzc05hbWVzID0gWyJ4ZmFGaWVsZCJdOwogICAgaWYgKHRoaXMuZm9udCkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYUZvbnQiKTsKICAgIH0KICAgIGlmIChpc1ByaW50T25seSh0aGlzKSkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgc3R5bGUsCiAgICAgIGlkOiB0aGlzWyR1aWRdLAogICAgICBjbGFzczogY2xhc3NOYW1lcwogICAgfTsKICAgIGlmIChzdHlsZS5tYXJnaW4pIHsKICAgICAgc3R5bGUucGFkZGluZyA9IHN0eWxlLm1hcmdpbjsKICAgICAgZGVsZXRlIHN0eWxlLm1hcmdpbjsKICAgIH0KICAgIHNldEFjY2Vzcyh0aGlzLCBjbGFzc05hbWVzKTsKICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgYXR0cmlidXRlcy54ZmFOYW1lID0gdGhpcy5uYW1lOwogICAgfQogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIGNvbnN0IGh0bWwgPSB7CiAgICAgIG5hbWU6ICJkaXYiLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBjaGlsZHJlbgogICAgfTsKICAgIGFwcGx5QXNzaXN0KHRoaXMsIGF0dHJpYnV0ZXMpOwogICAgY29uc3QgYm9yZGVyU3R5bGUgPSB0aGlzLmJvcmRlciA/IHRoaXMuYm9yZGVyWyR0b1N0eWxlXSgpIDogbnVsbDsKICAgIGNvbnN0IGJib3ggPSBjb21wdXRlQmJveCh0aGlzLCBodG1sLCBhdmFpbGFibGVTcGFjZSk7CiAgICBjb25zdCB1aSA9IHRoaXMudWlbJHRvSFRNTF0oKS5odG1sOwogICAgaWYgKCF1aSkgewogICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCBib3JkZXJTdHlsZSk7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoY3JlYXRlV3JhcHBlcih0aGlzLCBodG1sKSwgYmJveCk7CiAgICB9CiAgICBpZiAodGhpc1skdGFiSW5kZXhdKSB7CiAgICAgIGlmICh1aS5jaGlsZHJlbj8uWzBdKSB7CiAgICAgICAgdWkuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy50YWJpbmRleCA9IHRoaXNbJHRhYkluZGV4XTsKICAgICAgfSBlbHNlIHsKICAgICAgICB1aS5hdHRyaWJ1dGVzLnRhYmluZGV4ID0gdGhpc1skdGFiSW5kZXhdOwogICAgICB9CiAgICB9CiAgICBpZiAoIXVpLmF0dHJpYnV0ZXMuc3R5bGUpIHsKICAgICAgdWkuYXR0cmlidXRlcy5zdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB9CiAgICBsZXQgYUVsZW1lbnQgPSBudWxsOwogICAgaWYgKHRoaXMudWkuYnV0dG9uKSB7CiAgICAgIGlmICh1aS5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHsKICAgICAgICBbYUVsZW1lbnRdID0gdWkuY2hpbGRyZW4uc3BsaWNlKDAsIDEpOwogICAgICB9CiAgICAgIE9iamVjdC5hc3NpZ24odWkuYXR0cmlidXRlcy5zdHlsZSwgYm9yZGVyU3R5bGUpOwogICAgfSBlbHNlIHsKICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgYm9yZGVyU3R5bGUpOwogICAgfQogICAgY2hpbGRyZW4ucHVzaCh1aSk7CiAgICBpZiAodGhpcy52YWx1ZSkgewogICAgICBpZiAodGhpcy51aS5pbWFnZUVkaXQpIHsKICAgICAgICB1aS5jaGlsZHJlbi5wdXNoKHRoaXMudmFsdWVbJHRvSFRNTF0oKS5odG1sKTsKICAgICAgfSBlbHNlIGlmICghdGhpcy51aS5idXR0b24pIHsKICAgICAgICBsZXQgdmFsdWUgPSAiIjsKICAgICAgICBpZiAodGhpcy52YWx1ZS5leERhdGEpIHsKICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZS5leERhdGFbJHRleHRdKCk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlLnRleHQpIHsKICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZS50ZXh0WyRnZXRFeHRyYV0oKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgaHRtbFZhbHVlID0gdGhpcy52YWx1ZVskdG9IVE1MXSgpLmh0bWw7CiAgICAgICAgICBpZiAoaHRtbFZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgICAgIHZhbHVlID0gaHRtbFZhbHVlLmNoaWxkcmVuWzBdLnZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhpcy51aS50ZXh0RWRpdCAmJiB0aGlzLnZhbHVlLnRleHQ/Lm1heENoYXJzKSB7CiAgICAgICAgICB1aS5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLm1heExlbmd0aCA9IHRoaXMudmFsdWUudGV4dC5tYXhDaGFyczsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICBpZiAodGhpcy51aS5udW1lcmljRWRpdCkgewogICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpOwogICAgICAgICAgICB2YWx1ZSA9IGlzTmFOKHZhbHVlKSA/ICIiIDogdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh1aS5jaGlsZHJlblswXS5uYW1lID09PSAidGV4dGFyZWEiKSB7CiAgICAgICAgICAgIHVpLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMudGV4dENvbnRlbnQgPSB2YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVpLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICghdGhpcy51aS5pbWFnZUVkaXQgJiYgdWkuY2hpbGRyZW4/LlswXSAmJiB0aGlzLmgpIHsKICAgICAgYm9yZGVyRGltcyA9IGJvcmRlckRpbXMgfHwgZ2V0Qm9yZGVyRGltcyh0aGlzLnVpWyRnZXRFeHRyYV0oKSk7CiAgICAgIGxldCBjYXB0aW9uSGVpZ2h0ID0gMDsKICAgICAgaWYgKHRoaXMuY2FwdGlvbiAmJiBbInRvcCIsICJib3R0b20iXS5pbmNsdWRlcyh0aGlzLmNhcHRpb24ucGxhY2VtZW50KSkgewogICAgICAgIGNhcHRpb25IZWlnaHQgPSB0aGlzLmNhcHRpb24ucmVzZXJ2ZTsKICAgICAgICBpZiAoY2FwdGlvbkhlaWdodCA8PSAwKSB7CiAgICAgICAgICBjYXB0aW9uSGVpZ2h0ID0gdGhpcy5jYXB0aW9uWyRnZXRFeHRyYV0oYXZhaWxhYmxlU3BhY2UpLmg7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gdGhpcy5oIC0gY2FwdGlvbkhlaWdodCAtIG1hcmdpblYgLSBib3JkZXJEaW1zLmg7CiAgICAgICAgdWkuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy5zdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcoaW5wdXRIZWlnaHQpOwogICAgICB9IGVsc2UgewogICAgICAgIHVpLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CiAgICB9CiAgICBpZiAoYUVsZW1lbnQpIHsKICAgICAgdWkuY2hpbGRyZW4ucHVzaChhRWxlbWVudCk7CiAgICB9CiAgICBpZiAoIWNhcHRpb24pIHsKICAgICAgaWYgKHVpLmF0dHJpYnV0ZXMuY2xhc3MpIHsKICAgICAgICB1aS5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYUxlZnQiKTsKICAgICAgfQogICAgICB0aGlzLncgPSBzYXZlZFc7CiAgICAgIHRoaXMuaCA9IHNhdmVkSDsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhjcmVhdGVXcmFwcGVyKHRoaXMsIGh0bWwpLCBiYm94KTsKICAgIH0KICAgIGlmICh0aGlzLnVpLmJ1dHRvbikgewogICAgICBpZiAoc3R5bGUucGFkZGluZykgewogICAgICAgIGRlbGV0ZSBzdHlsZS5wYWRkaW5nOwogICAgICB9CiAgICAgIGlmIChjYXB0aW9uLm5hbWUgPT09ICJkaXYiKSB7CiAgICAgICAgY2FwdGlvbi5uYW1lID0gInNwYW4iOwogICAgICB9CiAgICAgIHVpLmNoaWxkcmVuLnB1c2goY2FwdGlvbik7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoaHRtbCwgYmJveCk7CiAgICB9IGVsc2UgaWYgKHRoaXMudWkuY2hlY2tCdXR0b24pIHsKICAgICAgY2FwdGlvbi5hdHRyaWJ1dGVzLmNsYXNzWzBdID0gInhmYUNhcHRpb25Gb3JDaGVja0J1dHRvbiI7CiAgICB9CiAgICBpZiAoIXVpLmF0dHJpYnV0ZXMuY2xhc3MpIHsKICAgICAgdWkuYXR0cmlidXRlcy5jbGFzcyA9IFtdOwogICAgfQogICAgdWkuY2hpbGRyZW4uc3BsaWNlKDAsIDAsIGNhcHRpb24pOwogICAgc3dpdGNoICh0aGlzLmNhcHRpb24ucGxhY2VtZW50KSB7CiAgICAgIGNhc2UgImxlZnQiOgogICAgICAgIHVpLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhTGVmdCIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgdWkuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFSaWdodCIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ0b3AiOgogICAgICAgIHVpLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhVG9wIik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgdWkuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFCb3R0b20iKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiaW5saW5lIjoKICAgICAgICB1aS5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYUxlZnQiKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHRoaXMudyA9IHNhdmVkVzsKICAgIHRoaXMuaCA9IHNhdmVkSDsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoY3JlYXRlV3JhcHBlcih0aGlzLCBodG1sKSwgYmJveCk7CiAgfQp9CmNsYXNzIEZpbGwgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZmlsbCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29sb3IgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5saW5lYXIgPSBudWxsOwogICAgdGhpcy5wYXR0ZXJuID0gbnVsbDsKICAgIHRoaXMucmFkaWFsID0gbnVsbDsKICAgIHRoaXMuc29saWQgPSBudWxsOwogICAgdGhpcy5zdGlwcGxlID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGdyYW5kcGEgPSBwYXJlbnRbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGdncmFuZHBhID0gZ3JhbmRwYVskZ2V0UGFyZW50XSgpOwogICAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IHByb3BOYW1lID0gImNvbG9yIjsKICAgIGxldCBhbHRQcm9wTmFtZSA9IHByb3BOYW1lOwogICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJvcmRlcikgewogICAgICBwcm9wTmFtZSA9ICJiYWNrZ3JvdW5kLWNvbG9yIjsKICAgICAgYWx0UHJvcE5hbWUgPSAiYmFja2dyb3VuZCI7CiAgICAgIGlmIChnZ3JhbmRwYSBpbnN0YW5jZW9mIFVpKSB7CiAgICAgICAgc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIndoaXRlIjsKICAgICAgfQogICAgfQogICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFJlY3RhbmdsZSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBBcmMpIHsKICAgICAgcHJvcE5hbWUgPSBhbHRQcm9wTmFtZSA9ICJmaWxsIjsKICAgICAgc3R5bGUuZmlsbCA9ICJ3aGl0ZSI7CiAgICB9CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgaWYgKG5hbWUgPT09ICJleHRyYXMiIHx8IG5hbWUgPT09ICJjb2xvciIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBvYmogPSB0aGlzW25hbWVdOwogICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBYRkFPYmplY3QpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgY29sb3IgPSBvYmpbJHRvU3R5bGVdKHRoaXMuY29sb3IpOwogICAgICBpZiAoY29sb3IpIHsKICAgICAgICBzdHlsZVtjb2xvci5zdGFydHNXaXRoKCIjIikgPyBwcm9wTmFtZSA6IGFsdFByb3BOYW1lXSA9IGNvbG9yOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KICAgIGlmICh0aGlzLmNvbG9yPy52YWx1ZSkgewogICAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3JbJHRvU3R5bGVdKCk7CiAgICAgIHN0eWxlW2NvbG9yLnN0YXJ0c1dpdGgoIiMiKSA/IHByb3BOYW1lIDogYWx0UHJvcE5hbWVdID0gY29sb3I7CiAgICB9CiAgICByZXR1cm4gc3R5bGU7CiAgfQp9CmNsYXNzIEZpbHRlciBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmaWx0ZXIiLCB0cnVlKTsKICAgIHRoaXMuYWRkUmV2b2NhdGlvbkluZm8gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hZGRSZXZvY2F0aW9uSW5mbywgWyIiLCAicmVxdWlyZWQiLCAib3B0aW9uYWwiLCAibm9uZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudmVyc2lvbiA9IGdldEludGVnZXIoewogICAgICBkYXRhOiB0aGlzLnZlcnNpb24sCiAgICAgIGRlZmF1bHRWYWx1ZTogNSwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAxICYmIHggPD0gNQogICAgfSk7CiAgICB0aGlzLmFwcGVhcmFuY2VGaWx0ZXIgPSBudWxsOwogICAgdGhpcy5jZXJ0aWZpY2F0ZXMgPSBudWxsOwogICAgdGhpcy5kaWdlc3RNZXRob2RzID0gbnVsbDsKICAgIHRoaXMuZW5jb2RpbmdzID0gbnVsbDsKICAgIHRoaXMuZW5jcnlwdGlvbk1ldGhvZHMgPSBudWxsOwogICAgdGhpcy5oYW5kbGVyID0gbnVsbDsKICAgIHRoaXMubG9ja0RvY3VtZW50ID0gbnVsbDsKICAgIHRoaXMubWRwID0gbnVsbDsKICAgIHRoaXMucmVhc29ucyA9IG51bGw7CiAgICB0aGlzLnRpbWVTdGFtcCA9IG51bGw7CiAgfQp9CmNsYXNzIEZsb2F0IGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmbG9hdCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IG51bWJlciA9IHBhcnNlRmxvYXQodGhpc1skY29udGVudF0udHJpbSgpKTsKICAgIHRoaXNbJGNvbnRlbnRdID0gaXNOYU4obnVtYmVyKSA/IG51bGwgOiBudW1iZXI7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbJGNvbnRlbnRdICE9PSBudWxsID8gdGhpc1skY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgdGVtcGxhdGVfRm9udCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmb250IiwgdHJ1ZSk7CiAgICB0aGlzLmJhc2VsaW5lU2hpZnQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLmJhc2VsaW5lU2hpZnQpOwogICAgdGhpcy5mb250SG9yaXpvbnRhbFNjYWxlID0gZ2V0RmxvYXQoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmZvbnRIb3Jpem9udGFsU2NhbGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMTAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5mb250VmVydGljYWxTY2FsZSA9IGdldEZsb2F0KHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5mb250VmVydGljYWxTY2FsZSwKICAgICAgZGVmYXVsdFZhbHVlOiAxMDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMua2VybmluZ01vZGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5rZXJuaW5nTW9kZSwgWyJub25lIiwgInBhaXIiXSk7CiAgICB0aGlzLmxldHRlclNwYWNpbmcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLmxldHRlclNwYWNpbmcsICIwIik7CiAgICB0aGlzLmxpbmVUaHJvdWdoID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubGluZVRocm91Z2gsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMSB8fCB4ID09PSAyCiAgICB9KTsKICAgIHRoaXMubGluZVRocm91Z2hQZXJpb2QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5saW5lVGhyb3VnaFBlcmlvZCwgWyJhbGwiLCAid29yZCJdKTsKICAgIHRoaXMub3ZlcmxpbmUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5vdmVybGluZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxIHx8IHggPT09IDIKICAgIH0pOwogICAgdGhpcy5vdmVybGluZVBlcmlvZCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm92ZXJsaW5lUGVyaW9kLCBbImFsbCIsICJ3b3JkIl0pOwogICAgdGhpcy5wb3N0dXJlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucG9zdHVyZSwgWyJub3JtYWwiLCAiaXRhbGljIl0pOwogICAgdGhpcy5zaXplID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5zaXplLCAiMTBwdCIpOwogICAgdGhpcy50eXBlZmFjZSA9IGF0dHJpYnV0ZXMudHlwZWZhY2UgfHwgIkNvdXJpZXIiOwogICAgdGhpcy51bmRlcmxpbmUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy51bmRlcmxpbmUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMSB8fCB4ID09PSAyCiAgICB9KTsKICAgIHRoaXMudW5kZXJsaW5lUGVyaW9kID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudW5kZXJsaW5lUGVyaW9kLCBbImFsbCIsICJ3b3JkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMud2VpZ2h0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMud2VpZ2h0LCBbIm5vcm1hbCIsICJib2xkIl0pOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5maWxsID0gbnVsbDsKICB9CiAgWyRjbGVhbl0oYnVpbGRlcikgewogICAgc3VwZXJbJGNsZWFuXShidWlsZGVyKTsKICAgIHRoaXNbJGdsb2JhbERhdGFdLnVzZWRUeXBlZmFjZXMuYWRkKHRoaXMudHlwZWZhY2UpOwogIH0KICBbJHRvU3R5bGVdKCkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJmaWxsIik7CiAgICBjb25zdCBjb2xvciA9IHN0eWxlLmNvbG9yOwogICAgaWYgKGNvbG9yKSB7CiAgICAgIGlmIChjb2xvciA9PT0gIiMwMDAwMDAiKSB7CiAgICAgICAgZGVsZXRlIHN0eWxlLmNvbG9yOwogICAgICB9IGVsc2UgaWYgKCFjb2xvci5zdGFydHNXaXRoKCIjIikpIHsKICAgICAgICBzdHlsZS5iYWNrZ3JvdW5kID0gY29sb3I7CiAgICAgICAgc3R5bGUuYmFja2dyb3VuZENsaXAgPSAidGV4dCI7CiAgICAgICAgc3R5bGUuY29sb3IgPSAidHJhbnNwYXJlbnQiOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5iYXNlbGluZVNoaWZ0KSB7CiAgICAgIHN0eWxlLnZlcnRpY2FsQWxpZ24gPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5iYXNlbGluZVNoaWZ0KTsKICAgIH0KICAgIHN0eWxlLmZvbnRLZXJuaW5nID0gdGhpcy5rZXJuaW5nTW9kZSA9PT0gIm5vbmUiID8gIm5vbmUiIDogIm5vcm1hbCI7CiAgICBzdHlsZS5sZXR0ZXJTcGFjaW5nID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubGV0dGVyU3BhY2luZyk7CiAgICBpZiAodGhpcy5saW5lVGhyb3VnaCAhPT0gMCkgewogICAgICBzdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICJsaW5lLXRocm91Z2giOwogICAgICBpZiAodGhpcy5saW5lVGhyb3VnaCA9PT0gMikgewogICAgICAgIHN0eWxlLnRleHREZWNvcmF0aW9uU3R5bGUgPSAiZG91YmxlIjsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMub3ZlcmxpbmUgIT09IDApIHsKICAgICAgc3R5bGUudGV4dERlY29yYXRpb24gPSAib3ZlcmxpbmUiOwogICAgICBpZiAodGhpcy5vdmVybGluZSA9PT0gMikgewogICAgICAgIHN0eWxlLnRleHREZWNvcmF0aW9uU3R5bGUgPSAiZG91YmxlIjsKICAgICAgfQogICAgfQogICAgc3R5bGUuZm9udFN0eWxlID0gdGhpcy5wb3N0dXJlOwogICAgc3R5bGUuZm9udFNpemUgPSBtZWFzdXJlVG9TdHJpbmcoMC45OSAqIHRoaXMuc2l6ZSk7CiAgICBzZXRGb250RmFtaWx5KHRoaXMsIHRoaXMsIHRoaXNbJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIsIHN0eWxlKTsKICAgIGlmICh0aGlzLnVuZGVybGluZSAhPT0gMCkgewogICAgICBzdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICJ1bmRlcmxpbmUiOwogICAgICBpZiAodGhpcy51bmRlcmxpbmUgPT09IDIpIHsKICAgICAgICBzdHlsZS50ZXh0RGVjb3JhdGlvblN0eWxlID0gImRvdWJsZSI7CiAgICAgIH0KICAgIH0KICAgIHN0eWxlLmZvbnRXZWlnaHQgPSB0aGlzLndlaWdodDsKICAgIHJldHVybiBzdHlsZTsKICB9Cn0KY2xhc3MgRm9ybWF0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImZvcm1hdCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICB9Cn0KY2xhc3MgSGFuZGxlciBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJoYW5kbGVyIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBIeXBoZW5hdGlvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJoeXBoZW5hdGlvbiIpOwogICAgdGhpcy5leGNsdWRlQWxsQ2FwcyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmV4Y2x1ZGVBbGxDYXBzLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5leGNsdWRlSW5pdGlhbENhcCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmV4Y2x1ZGVJbml0aWFsQ2FwLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5oeXBoZW5hdGUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5oeXBoZW5hdGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucHVzaENoYXJhY3RlckNvdW50ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucHVzaENoYXJhY3RlckNvdW50LAogICAgICBkZWZhdWx0VmFsdWU6IDMsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLnJlbWFpbkNoYXJhY3RlckNvdW50ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucmVtYWluQ2hhcmFjdGVyQ291bnQsCiAgICAgIGRlZmF1bHRWYWx1ZTogMywKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLndvcmRDaGFyYWN0ZXJDb3VudCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLndvcmRDaGFyYWN0ZXJDb3VudCwKICAgICAgZGVmYXVsdFZhbHVlOiA3LAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogIH0KfQpjbGFzcyBJbWFnZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJpbWFnZSIpOwogICAgdGhpcy5hc3BlY3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hc3BlY3QsIFsiZml0IiwgImFjdHVhbCIsICJoZWlnaHQiLCAibm9uZSIsICJ3aWR0aCJdKTsKICAgIHRoaXMuY29udGVudFR5cGUgPSBhdHRyaWJ1dGVzLmNvbnRlbnRUeXBlIHx8ICIiOwogICAgdGhpcy5ocmVmID0gYXR0cmlidXRlcy5ocmVmIHx8ICIiOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnRyYW5zZmVyRW5jb2RpbmcgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50cmFuc2ZlckVuY29kaW5nLCBbImJhc2U2NCIsICJub25lIiwgInBhY2thZ2UiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBpZiAodGhpcy5jb250ZW50VHlwZSAmJiAhTUlNRVMuaGFzKHRoaXMuY29udGVudFR5cGUudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBsZXQgYnVmZmVyID0gdGhpc1skZ2xvYmFsRGF0YV0uaW1hZ2VzICYmIHRoaXNbJGdsb2JhbERhdGFdLmltYWdlcy5nZXQodGhpcy5ocmVmKTsKICAgIGlmICghYnVmZmVyICYmICh0aGlzLmhyZWYgfHwgIXRoaXNbJGNvbnRlbnRdKSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGlmICghYnVmZmVyICYmIHRoaXMudHJhbnNmZXJFbmNvZGluZyA9PT0gImJhc2U2NCIpIHsKICAgICAgYnVmZmVyID0gZnJvbUJhc2U2NFV0aWwodGhpc1skY29udGVudF0pOwogICAgfQogICAgaWYgKCFidWZmZXIpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBpZiAoIXRoaXMuY29udGVudFR5cGUpIHsKICAgICAgZm9yIChjb25zdCBbaGVhZGVyLCB0eXBlXSBvZiBJTUFHRVNfSEVBREVSUykgewogICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gaGVhZGVyLmxlbmd0aCAmJiBoZWFkZXIuZXZlcnkoKHgsIGkpID0+IHggPT09IGJ1ZmZlcltpXSkpIHsKICAgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSB0eXBlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGhpcy5jb250ZW50VHlwZSkgewogICAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgICB9CiAgICB9CiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsKICAgICAgdHlwZTogdGhpcy5jb250ZW50VHlwZQogICAgfSk7CiAgICBsZXQgc3R5bGU7CiAgICBzd2l0Y2ggKHRoaXMuYXNwZWN0KSB7CiAgICAgIGNhc2UgImZpdCI6CiAgICAgIGNhc2UgImFjdHVhbCI6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImhlaWdodCI6CiAgICAgICAgc3R5bGUgPSB7CiAgICAgICAgICBoZWlnaHQ6ICIxMDAlIiwKICAgICAgICAgIG9iamVjdEZpdDogImZpbGwiCiAgICAgICAgfTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibm9uZSI6CiAgICAgICAgc3R5bGUgPSB7CiAgICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgICAgaGVpZ2h0OiAiMTAwJSIsCiAgICAgICAgICBvYmplY3RGaXQ6ICJmaWxsIgogICAgICAgIH07CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIndpZHRoIjoKICAgICAgICBzdHlsZSA9IHsKICAgICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgICBvYmplY3RGaXQ6ICJmaWxsIgogICAgICAgIH07CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRQYXJlbnRdKCk7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImltZyIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFJbWFnZSJdLAogICAgICAgIHN0eWxlLAogICAgICAgIHNyYzogVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSwKICAgICAgICBhbHQ6IHBhcmVudCA/IGFyaWFMYWJlbChwYXJlbnRbJGdldFBhcmVudF0oKSkgOiBudWxsCiAgICAgIH0KICAgIH0pOwogIH0KfQpjbGFzcyBJbWFnZUVkaXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiaW1hZ2VFZGl0IiwgdHJ1ZSk7CiAgICB0aGlzLmRhdGEgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5kYXRhLCBbImxpbmsiLCAiZW1iZWQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgaWYgKHRoaXMuZGF0YSA9PT0gImVtYmVkIikgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBjaGlsZHJlbjogW10sCiAgICAgICAgYXR0cmlidXRlczoge30KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICB9Cn0KY2xhc3MgSW50ZWdlciBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiaW50ZWdlciIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IG51bWJlciA9IHBhcnNlSW50KHRoaXNbJGNvbnRlbnRdLnRyaW0oKSwgMTApOwogICAgdGhpc1skY29udGVudF0gPSBpc05hTihudW1iZXIpID8gbnVsbCA6IG51bWJlcjsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gdmFsdWVUb0h0bWwodGhpc1skY29udGVudF0gIT09IG51bGwgPyB0aGlzWyRjb250ZW50XS50b1N0cmluZygpIDogIiIpOwogIH0KfQpjbGFzcyBJc3N1ZXJzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImlzc3VlcnMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEl0ZW1zIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIml0ZW1zIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlZiA9IGF0dHJpYnV0ZXMucmVmIHx8ICIiOwogICAgdGhpcy5zYXZlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc2F2ZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBjb25zdCBvdXRwdXQgPSBbXTsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1skZ2V0Q2hpbGRyZW5dKCkpIHsKICAgICAgb3V0cHV0LnB1c2goY2hpbGRbJHRleHRdKCkpOwogICAgfQogICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhvdXRwdXQpOwogIH0KfQpjbGFzcyBLZWVwIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImtlZXAiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgY29uc3Qgb3B0aW9ucyA9IFsibm9uZSIsICJjb250ZW50QXJlYSIsICJwYWdlQXJlYSJdOwogICAgdGhpcy5pbnRhY3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5pbnRhY3QsIG9wdGlvbnMpOwogICAgdGhpcy5uZXh0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubmV4dCwgb3B0aW9ucyk7CiAgICB0aGlzLnByZXZpb3VzID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJldmlvdXMsIG9wdGlvbnMpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9Cn0KY2xhc3MgS2V5VXNhZ2UgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAia2V5VXNhZ2UiKTsKICAgIGNvbnN0IG9wdGlvbnMgPSBbIiIsICJ5ZXMiLCAibm8iXTsKICAgIHRoaXMuY3JsU2lnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmNybFNpZ24sIG9wdGlvbnMpOwogICAgdGhpcy5kYXRhRW5jaXBoZXJtZW50ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuZGF0YUVuY2lwaGVybWVudCwgb3B0aW9ucyk7CiAgICB0aGlzLmRlY2lwaGVyT25seSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmRlY2lwaGVyT25seSwgb3B0aW9ucyk7CiAgICB0aGlzLmRpZ2l0YWxTaWduYXR1cmUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5kaWdpdGFsU2lnbmF0dXJlLCBvcHRpb25zKTsKICAgIHRoaXMuZW5jaXBoZXJPbmx5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuZW5jaXBoZXJPbmx5LCBvcHRpb25zKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5rZXlBZ3JlZW1lbnQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5rZXlBZ3JlZW1lbnQsIG9wdGlvbnMpOwogICAgdGhpcy5rZXlDZXJ0U2lnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmtleUNlcnRTaWduLCBvcHRpb25zKTsKICAgIHRoaXMua2V5RW5jaXBoZXJtZW50ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMua2V5RW5jaXBoZXJtZW50LCBvcHRpb25zKTsKICAgIHRoaXMubm9uUmVwdWRpYXRpb24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5ub25SZXB1ZGlhdGlvbiwgb3B0aW9ucyk7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbIm9wdGlvbmFsIiwgInJlcXVpcmVkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgTGluZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJsaW5lIiwgdHJ1ZSk7CiAgICB0aGlzLmhhbmQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oYW5kLCBbImV2ZW4iLCAibGVmdCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5zbG9wZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnNsb3BlLCBbIlxcIiwgIi8iXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lZGdlID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKCkgewogICAgY29uc3QgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBlZGdlID0gdGhpcy5lZGdlIHx8IG5ldyBFZGdlKHt9KTsKICAgIGNvbnN0IGVkZ2VTdHlsZSA9IGVkZ2VbJHRvU3R5bGVdKCk7CiAgICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBjb25zdCB0aGlja25lc3MgPSBlZGdlLnByZXNlbmNlID09PSAidmlzaWJsZSIgPyBlZGdlLnRoaWNrbmVzcyA6IDA7CiAgICBzdHlsZS5zdHJva2VXaWR0aCA9IG1lYXN1cmVUb1N0cmluZyh0aGlja25lc3MpOwogICAgc3R5bGUuc3Ryb2tlID0gZWRnZVN0eWxlLmNvbG9yOwogICAgbGV0IHgxLCB5MSwgeDIsIHkyOwogICAgbGV0IHdpZHRoID0gIjEwMCUiOwogICAgbGV0IGhlaWdodCA9ICIxMDAlIjsKICAgIGlmIChwYXJlbnQudyA8PSB0aGlja25lc3MpIHsKICAgICAgW3gxLCB5MSwgeDIsIHkyXSA9IFsiNTAlIiwgMCwgIjUwJSIsICIxMDAlIl07CiAgICAgIHdpZHRoID0gc3R5bGUuc3Ryb2tlV2lkdGg7CiAgICB9IGVsc2UgaWYgKHBhcmVudC5oIDw9IHRoaWNrbmVzcykgewogICAgICBbeDEsIHkxLCB4MiwgeTJdID0gWzAsICI1MCUiLCAiMTAwJSIsICI1MCUiXTsKICAgICAgaGVpZ2h0ID0gc3R5bGUuc3Ryb2tlV2lkdGg7CiAgICB9IGVsc2UgaWYgKHRoaXMuc2xvcGUgPT09ICJcXCIpIHsKICAgICAgW3gxLCB5MSwgeDIsIHkyXSA9IFswLCAwLCAiMTAwJSIsICIxMDAlIl07CiAgICB9IGVsc2UgewogICAgICBbeDEsIHkxLCB4MiwgeTJdID0gWzAsICIxMDAlIiwgIjEwMCUiLCAwXTsKICAgIH0KICAgIGNvbnN0IGxpbmUgPSB7CiAgICAgIG5hbWU6ICJsaW5lIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHhtbG5zOiBTVkdfTlMsCiAgICAgICAgeDEsCiAgICAgICAgeTEsCiAgICAgICAgeDIsCiAgICAgICAgeTIsCiAgICAgICAgc3R5bGUKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN2ZyA9IHsKICAgICAgbmFtZTogInN2ZyIsCiAgICAgIGNoaWxkcmVuOiBbbGluZV0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICB4bWxuczogU1ZHX05TLAogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBzdHlsZTogewogICAgICAgICAgb3ZlcmZsb3c6ICJ2aXNpYmxlIgogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGlmIChoYXNNYXJnaW4ocGFyZW50KSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICBkaXNwbGF5OiAiaW5saW5lIiwKICAgICAgICAgICAgd2lkdGg6ICIxMDAlIiwKICAgICAgICAgICAgaGVpZ2h0OiAiMTAwJSIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNoaWxkcmVuOiBbc3ZnXQogICAgICB9KTsKICAgIH0KICAgIHN2Zy5hdHRyaWJ1dGVzLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3Moc3ZnKTsKICB9Cn0KY2xhc3MgTGluZWFyIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImxpbmVhciIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbInRvUmlnaHQiLCAidG9Cb3R0b20iLCAidG9MZWZ0IiwgInRvVG9wIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29sb3IgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbJHRvU3R5bGVdKHN0YXJ0Q29sb3IpIHsKICAgIHN0YXJ0Q29sb3IgPSBzdGFydENvbG9yID8gc3RhcnRDb2xvclskdG9TdHlsZV0oKSA6ICIjRkZGRkZGIjsKICAgIGNvbnN0IHRyYW5zZiA9IHRoaXMudHlwZS5yZXBsYWNlKC8oW1JCTFRdKS8sICIgJDEiKS50b0xvd2VyQ2FzZSgpOwogICAgY29uc3QgZW5kQ29sb3IgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvclskdG9TdHlsZV0oKSA6ICIjMDAwMDAwIjsKICAgIHJldHVybiBgbGluZWFyLWdyYWRpZW50KCR7dHJhbnNmfSwgJHtzdGFydENvbG9yfSwgJHtlbmRDb2xvcn0pYDsKICB9Cn0KY2xhc3MgTG9ja0RvY3VtZW50IGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJsb2NrRG9jdW1lbnQiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSBnZXRTdHJpbmdPcHRpb24odGhpc1skY29udGVudF0sIFsiYXV0byIsICIwIiwgIjEiXSk7CiAgfQp9CmNsYXNzIE1hbmlmZXN0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm1hbmlmZXN0IiwgdHJ1ZSk7CiAgICB0aGlzLmFjdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFjdGlvbiwgWyJpbmNsdWRlIiwgImFsbCIsICJleGNsdWRlIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5yZWYgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgTWFyZ2luIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm1hcmdpbiIsIHRydWUpOwogICAgdGhpcy5ib3R0b21JbnNldCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuYm90dG9tSW5zZXQsICIwIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVmdEluc2V0ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5sZWZ0SW5zZXQsICIwIik7CiAgICB0aGlzLnJpZ2h0SW5zZXQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnJpZ2h0SW5zZXQsICIwIik7CiAgICB0aGlzLnRvcEluc2V0ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy50b3BJbnNldCwgIjAiKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICByZXR1cm4gewogICAgICBtYXJnaW46IG1lYXN1cmVUb1N0cmluZyh0aGlzLnRvcEluc2V0KSArICIgIiArIG1lYXN1cmVUb1N0cmluZyh0aGlzLnJpZ2h0SW5zZXQpICsgIiAiICsgbWVhc3VyZVRvU3RyaW5nKHRoaXMuYm90dG9tSW5zZXQpICsgIiAiICsgbWVhc3VyZVRvU3RyaW5nKHRoaXMubGVmdEluc2V0KQogICAgfTsKICB9Cn0KY2xhc3MgTWRwIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm1kcCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnBlcm1pc3Npb25zID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucGVybWlzc2lvbnMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMiwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMSB8fCB4ID09PSAzCiAgICB9KTsKICAgIHRoaXMuc2lnbmF0dXJlVHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnNpZ25hdHVyZVR5cGUsIFsiZmlsbGVyIiwgImF1dGhvciJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIE1lZGl1bSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJtZWRpdW0iKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5pbWFnaW5nQkJveCA9IGdldEJCb3goYXR0cmlidXRlcy5pbWFnaW5nQkJveCk7CiAgICB0aGlzLmxvbmcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLmxvbmcpOwogICAgdGhpcy5vcmllbnRhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm9yaWVudGF0aW9uLCBbInBvcnRyYWl0IiwgImxhbmRzY2FwZSJdKTsKICAgIHRoaXMuc2hvcnQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnNob3J0KTsKICAgIHRoaXMuc3RvY2sgPSBhdHRyaWJ1dGVzLnN0b2NrIHx8ICIiOwogICAgdGhpcy50cmF5SW4gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50cmF5SW4sIFsiYXV0byIsICJkZWxlZ2F0ZSIsICJwYWdlRnJvbnQiXSk7CiAgICB0aGlzLnRyYXlPdXQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50cmF5T3V0LCBbImF1dG8iLCAiZGVsZWdhdGUiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBNZXNzYWdlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm1lc3NhZ2UiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudGV4dCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBOdW1lcmljRWRpdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJudW1lcmljRWRpdCIsIHRydWUpOwogICAgdGhpcy5oU2Nyb2xsUG9saWN5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaFNjcm9sbFBvbGljeSwgWyJhdXRvIiwgIm9mZiIsICJvbiJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuY29tYiA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJib3JkZXIiLCAiZm9udCIsICJtYXJnaW4iKTsKICAgIGNvbnN0IGZpZWxkID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiaW5wdXQiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgdHlwZTogInRleHQiLAogICAgICAgIGZpZWxkSWQ6IGZpZWxkWyR1aWRdLAogICAgICAgIGRhdGFJZDogZmllbGRbJGRhdGFdPy5bJHVpZF0gfHwgZmllbGRbJHVpZF0sCiAgICAgICAgY2xhc3M6IFsieGZhVGV4dGZpZWxkIl0sCiAgICAgICAgc3R5bGUsCiAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICJhcmlhLXJlcXVpcmVkIjogZmFsc2UKICAgICAgfQogICAgfTsKICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBodG1sLmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIGh0bWwuYXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImxhYmVsIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbInhmYUxhYmVsIl0KICAgICAgfSwKICAgICAgY2hpbGRyZW46IFtodG1sXQogICAgfSk7CiAgfQp9CmNsYXNzIE9jY3VyIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm9jY3VyIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMuaW5pdGlhbCA9IGF0dHJpYnV0ZXMuaW5pdGlhbCAhPT0gIiIgPyBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5pbml0aWFsLAogICAgICBkZWZhdWx0VmFsdWU6ICIiLAogICAgICB2YWxpZGF0ZTogeCA9PiB0cnVlCiAgICB9KSA6ICIiOwogICAgdGhpcy5tYXggPSBhdHRyaWJ1dGVzLm1heCAhPT0gIiIgPyBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5tYXgsCiAgICAgIGRlZmF1bHRWYWx1ZTogMSwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSkgOiAiIjsKICAgIHRoaXMubWluID0gYXR0cmlidXRlcy5taW4gIT09ICIiID8gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubWluLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pIDogIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbJGNsZWFuXSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IG9yaWdpbmFsTWluID0gdGhpcy5taW47CiAgICBpZiAodGhpcy5taW4gPT09ICIiKSB7CiAgICAgIHRoaXMubWluID0gcGFyZW50IGluc3RhbmNlb2YgUGFnZUFyZWEgfHwgcGFyZW50IGluc3RhbmNlb2YgUGFnZVNldCA/IDAgOiAxOwogICAgfQogICAgaWYgKHRoaXMubWF4ID09PSAiIikgewogICAgICBpZiAob3JpZ2luYWxNaW4gPT09ICIiKSB7CiAgICAgICAgdGhpcy5tYXggPSBwYXJlbnQgaW5zdGFuY2VvZiBQYWdlQXJlYSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBQYWdlU2V0ID8gLTEgOiAxOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMubWF4ID0gdGhpcy5taW47CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzLm1heCAhPT0gLTEgJiYgdGhpcy5tYXggPCB0aGlzLm1pbikgewogICAgICB0aGlzLm1heCA9IHRoaXMubWluOwogICAgfQogICAgaWYgKHRoaXMuaW5pdGlhbCA9PT0gIiIpIHsKICAgICAgdGhpcy5pbml0aWFsID0gcGFyZW50IGluc3RhbmNlb2YgVGVtcGxhdGUgPyAxIDogdGhpcy5taW47CiAgICB9CiAgfQp9CmNsYXNzIE9pZCBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJvaWQiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgT2lkcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJvaWRzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5vaWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgT3ZlcmZsb3cgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAib3ZlcmZsb3ciKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sZWFkZXIgPSBhdHRyaWJ1dGVzLmxlYWRlciB8fCAiIjsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgICB0aGlzLnRyYWlsZXIgPSBhdHRyaWJ1dGVzLnRyYWlsZXIgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGdldEV4dHJhXSgpIHsKICAgIGlmICghdGhpc1skZXh0cmFdKSB7CiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgICAgY29uc3Qgcm9vdCA9IHRoaXNbJGdldFRlbXBsYXRlUm9vdF0oKTsKICAgICAgY29uc3QgdGFyZ2V0ID0gcm9vdFskc2VhcmNoTm9kZV0odGhpcy50YXJnZXQsIHBhcmVudCk7CiAgICAgIGNvbnN0IGxlYWRlciA9IHJvb3RbJHNlYXJjaE5vZGVdKHRoaXMubGVhZGVyLCBwYXJlbnQpOwogICAgICBjb25zdCB0cmFpbGVyID0gcm9vdFskc2VhcmNoTm9kZV0odGhpcy50cmFpbGVyLCBwYXJlbnQpOwogICAgICB0aGlzWyRleHRyYV0gPSB7CiAgICAgICAgdGFyZ2V0OiB0YXJnZXQ/LlswXSB8fCBudWxsLAogICAgICAgIGxlYWRlcjogbGVhZGVyPy5bMF0gfHwgbnVsbCwKICAgICAgICB0cmFpbGVyOiB0cmFpbGVyPy5bMF0gfHwgbnVsbCwKICAgICAgICBhZGRMZWFkZXI6IGZhbHNlLAogICAgICAgIGFkZFRyYWlsZXI6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gdGhpc1skZXh0cmFdOwogIH0KfQpjbGFzcyBQYWdlQXJlYSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwYWdlQXJlYSIsIHRydWUpOwogICAgdGhpcy5ibGFua09yTm90QmxhbmsgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5ibGFua09yTm90QmxhbmssIFsiYW55IiwgImJsYW5rIiwgIm5vdEJsYW5rIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmluaXRpYWxOdW1iZXIgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5pbml0aWFsTnVtYmVyLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5udW1iZXJlZCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm51bWJlcmVkLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pOwogICAgdGhpcy5vZGRPckV2ZW4gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5vZGRPckV2ZW4sIFsiYW55IiwgImV2ZW4iLCAib2RkIl0pOwogICAgdGhpcy5wYWdlUG9zaXRpb24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wYWdlUG9zaXRpb24sIFsiYW55IiwgImZpcnN0IiwgImxhc3QiLCAib25seSIsICJyZXN0Il0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1lZGl1bSA9IG51bGw7CiAgICB0aGlzLm9jY3VyID0gbnVsbDsKICAgIHRoaXMuYXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb250ZW50QXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kcmF3ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4Y2xHcm91cCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWVsZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQogIFskaXNVc2FibGVdKCkgewogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgdGhpc1skZXh0cmFdID0gewogICAgICAgIG51bWJlck9mVXNlOiAwCiAgICAgIH07CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuICF0aGlzLm9jY3VyIHx8IHRoaXMub2NjdXIubWF4ID09PSAtMSB8fCB0aGlzWyRleHRyYV0ubnVtYmVyT2ZVc2UgPCB0aGlzLm9jY3VyLm1heDsKICB9CiAgWyRjbGVhblBhZ2VdKCkgewogICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICB9CiAgWyRnZXROZXh0UGFnZV0oKSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXSkgewogICAgICB0aGlzWyRleHRyYV0gPSB7CiAgICAgICAgbnVtYmVyT2ZVc2U6IDAKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQucmVsYXRpb24gPT09ICJvcmRlcmVkT2NjdXJyZW5jZSIpIHsKICAgICAgaWYgKHRoaXNbJGlzVXNhYmxlXSgpKSB7CiAgICAgICAgdGhpc1skZXh0cmFdLm51bWJlck9mVXNlICs9IDE7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwYXJlbnRbJGdldE5leHRQYWdlXSgpOwogIH0KICBbJGdldEF2YWlsYWJsZVNwYWNlXSgpIHsKICAgIHJldHVybiB0aGlzWyRleHRyYV0uc3BhY2UgfHwgewogICAgICB3aWR0aDogMCwKICAgICAgaGVpZ2h0OiAwCiAgICB9OwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXSkgewogICAgICB0aGlzWyRleHRyYV0gPSB7CiAgICAgICAgbnVtYmVyT2ZVc2U6IDEKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICB0aGlzWyRleHRyYV0uY2hpbGRyZW4gPSBjaGlsZHJlbjsKICAgIGNvbnN0IHN0eWxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmICh0aGlzLm1lZGl1bSAmJiB0aGlzLm1lZGl1bS5zaG9ydCAmJiB0aGlzLm1lZGl1bS5sb25nKSB7CiAgICAgIHN0eWxlLndpZHRoID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubWVkaXVtLnNob3J0KTsKICAgICAgc3R5bGUuaGVpZ2h0ID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubWVkaXVtLmxvbmcpOwogICAgICB0aGlzWyRleHRyYV0uc3BhY2UgPSB7CiAgICAgICAgd2lkdGg6IHRoaXMubWVkaXVtLnNob3J0LAogICAgICAgIGhlaWdodDogdGhpcy5tZWRpdW0ubG9uZwogICAgICB9OwogICAgICBpZiAodGhpcy5tZWRpdW0ub3JpZW50YXRpb24gPT09ICJsYW5kc2NhcGUiKSB7CiAgICAgICAgY29uc3QgeCA9IHN0eWxlLndpZHRoOwogICAgICAgIHN0eWxlLndpZHRoID0gc3R5bGUuaGVpZ2h0OwogICAgICAgIHN0eWxlLmhlaWdodCA9IHg7CiAgICAgICAgdGhpc1skZXh0cmFdLnNwYWNlID0gewogICAgICAgICAgd2lkdGg6IHRoaXMubWVkaXVtLmxvbmcsCiAgICAgICAgICBoZWlnaHQ6IHRoaXMubWVkaXVtLnNob3J0CiAgICAgICAgfTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd2FybigiWEZBIC0gTm8gbWVkaXVtIHNwZWNpZmllZCBpbiBwYWdlQXJlYTogcGxlYXNlIGZpbGUgYSBidWcuIik7CiAgICB9CiAgICB0aGlzWyRjaGlsZHJlblRvSFRNTF0oewogICAgICBmaWx0ZXI6IG5ldyBTZXQoWyJhcmVhIiwgImRyYXciLCAiZmllbGQiLCAic3ViZm9ybSJdKSwKICAgICAgaW5jbHVkZTogdHJ1ZQogICAgfSk7CiAgICB0aGlzWyRjaGlsZHJlblRvSFRNTF0oewogICAgICBmaWx0ZXI6IG5ldyBTZXQoWyJjb250ZW50QXJlYSJdKSwKICAgICAgaW5jbHVkZTogdHJ1ZQogICAgfSk7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGNoaWxkcmVuLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFsieGZhUGFnZSJdLAogICAgICAgIGlkOiB0aGlzWyR1aWRdLAogICAgICAgIHN0eWxlLAogICAgICAgIHhmYU5hbWU6IHRoaXMubmFtZQogICAgICB9CiAgICB9KTsKICB9Cn0KY2xhc3MgUGFnZVNldCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwYWdlU2V0IiwgdHJ1ZSk7CiAgICB0aGlzLmR1cGxleEltcG9zaXRpb24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5kdXBsZXhJbXBvc2l0aW9uLCBbImxvbmdFZGdlIiwgInNob3J0RWRnZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5yZWxhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnJlbGF0aW9uLCBbIm9yZGVyZWRPY2N1cnJlbmNlIiwgImR1cGxleFBhZ2luYXRlZCIsICJzaW1wbGV4UGFnaW5hdGVkIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMub2NjdXIgPSBudWxsOwogICAgdGhpcy5wYWdlQXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wYWdlU2V0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQogIFskY2xlYW5QYWdlXSgpIHsKICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuKSB7CiAgICAgIHBhZ2VbJGNsZWFuUGFnZV0oKTsKICAgIH0KICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLnBhZ2VTZXQuY2hpbGRyZW4pIHsKICAgICAgcGFnZVskY2xlYW5QYWdlXSgpOwogICAgfQogIH0KICBbJGlzVXNhYmxlXSgpIHsKICAgIHJldHVybiAhdGhpcy5vY2N1ciB8fCB0aGlzLm9jY3VyLm1heCA9PT0gLTEgfHwgdGhpc1skZXh0cmFdLm51bWJlck9mVXNlIDwgdGhpcy5vY2N1ci5tYXg7CiAgfQogIFskZ2V0TmV4dFBhZ2VdKCkgewogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgdGhpc1skZXh0cmFdID0gewogICAgICAgIG51bWJlck9mVXNlOiAxLAogICAgICAgIHBhZ2VJbmRleDogLTEsCiAgICAgICAgcGFnZVNldEluZGV4OiAtMQogICAgICB9OwogICAgfQogICAgaWYgKHRoaXMucmVsYXRpb24gPT09ICJvcmRlcmVkT2NjdXJyZW5jZSIpIHsKICAgICAgaWYgKHRoaXNbJGV4dHJhXS5wYWdlSW5kZXggKyAxIDwgdGhpcy5wYWdlQXJlYS5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICB0aGlzWyRleHRyYV0ucGFnZUluZGV4ICs9IDE7CiAgICAgICAgY29uc3QgcGFnZUFyZWEgPSB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuW3RoaXNbJGV4dHJhXS5wYWdlSW5kZXhdOwogICAgICAgIHJldHVybiBwYWdlQXJlYVskZ2V0TmV4dFBhZ2VdKCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXNbJGV4dHJhXS5wYWdlU2V0SW5kZXggKyAxIDwgdGhpcy5wYWdlU2V0LmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIHRoaXNbJGV4dHJhXS5wYWdlU2V0SW5kZXggKz0gMTsKICAgICAgICByZXR1cm4gdGhpcy5wYWdlU2V0LmNoaWxkcmVuW3RoaXNbJGV4dHJhXS5wYWdlU2V0SW5kZXhdWyRnZXROZXh0UGFnZV0oKTsKICAgICAgfQogICAgICBpZiAodGhpc1skaXNVc2FibGVdKCkpIHsKICAgICAgICB0aGlzWyRleHRyYV0ubnVtYmVyT2ZVc2UgKz0gMTsKICAgICAgICB0aGlzWyRleHRyYV0ucGFnZUluZGV4ID0gLTE7CiAgICAgICAgdGhpc1skZXh0cmFdLnBhZ2VTZXRJbmRleCA9IC0xOwogICAgICAgIHJldHVybiB0aGlzWyRnZXROZXh0UGFnZV0oKTsKICAgICAgfQogICAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRQYXJlbnRdKCk7CiAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBQYWdlU2V0KSB7CiAgICAgICAgcmV0dXJuIHBhcmVudFskZ2V0TmV4dFBhZ2VdKCk7CiAgICAgIH0KICAgICAgdGhpc1skY2xlYW5QYWdlXSgpOwogICAgICByZXR1cm4gdGhpc1skZ2V0TmV4dFBhZ2VdKCk7CiAgICB9CiAgICBjb25zdCBwYWdlTnVtYmVyID0gdGhpc1skZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ucGFnZU51bWJlcjsKICAgIGNvbnN0IHBhcml0eSA9IHBhZ2VOdW1iZXIgJSAyID09PSAwID8gImV2ZW4iIDogIm9kZCI7CiAgICBjb25zdCBwb3NpdGlvbiA9IHBhZ2VOdW1iZXIgPT09IDAgPyAiZmlyc3QiIDogInJlc3QiOwogICAgbGV0IHBhZ2UgPSB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuLmZpbmQocCA9PiBwLm9kZE9yRXZlbiA9PT0gcGFyaXR5ICYmIHAucGFnZVBvc2l0aW9uID09PSBwb3NpdGlvbik7CiAgICBpZiAocGFnZSkgewogICAgICByZXR1cm4gcGFnZTsKICAgIH0KICAgIHBhZ2UgPSB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuLmZpbmQocCA9PiBwLm9kZE9yRXZlbiA9PT0gImFueSIgJiYgcC5wYWdlUG9zaXRpb24gPT09IHBvc2l0aW9uKTsKICAgIGlmIChwYWdlKSB7CiAgICAgIHJldHVybiBwYWdlOwogICAgfQogICAgcGFnZSA9IHRoaXMucGFnZUFyZWEuY2hpbGRyZW4uZmluZChwID0+IHAub2RkT3JFdmVuID09PSAiYW55IiAmJiBwLnBhZ2VQb3NpdGlvbiA9PT0gImFueSIpOwogICAgaWYgKHBhZ2UpIHsKICAgICAgcmV0dXJuIHBhZ2U7CiAgICB9CiAgICByZXR1cm4gdGhpcy5wYWdlQXJlYS5jaGlsZHJlblswXTsKICB9Cn0KY2xhc3MgUGFyYSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwYXJhIiwgdHJ1ZSk7CiAgICB0aGlzLmhBbGlnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmhBbGlnbiwgWyJsZWZ0IiwgImNlbnRlciIsICJqdXN0aWZ5IiwgImp1c3RpZnlBbGwiLCAicmFkaXgiLCAicmlnaHQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGluZUhlaWdodCA9IGF0dHJpYnV0ZXMubGluZUhlaWdodCA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubGluZUhlaWdodCwgIjBwdCIpIDogIiI7CiAgICB0aGlzLm1hcmdpbkxlZnQgPSBhdHRyaWJ1dGVzLm1hcmdpbkxlZnQgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1hcmdpbkxlZnQsICIwcHQiKSA6ICIiOwogICAgdGhpcy5tYXJnaW5SaWdodCA9IGF0dHJpYnV0ZXMubWFyZ2luUmlnaHQgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1hcmdpblJpZ2h0LCAiMHB0IikgOiAiIjsKICAgIHRoaXMub3JwaGFucyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm9ycGhhbnMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMucHJlc2VydmUgPSBhdHRyaWJ1dGVzLnByZXNlcnZlIHx8ICIiOwogICAgdGhpcy5yYWRpeE9mZnNldCA9IGF0dHJpYnV0ZXMucmFkaXhPZmZzZXQgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnJhZGl4T2Zmc2V0LCAiMHB0IikgOiAiIjsKICAgIHRoaXMuc3BhY2VBYm92ZSA9IGF0dHJpYnV0ZXMuc3BhY2VBYm92ZSA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuc3BhY2VBYm92ZSwgIjBwdCIpIDogIiI7CiAgICB0aGlzLnNwYWNlQmVsb3cgPSBhdHRyaWJ1dGVzLnNwYWNlQmVsb3cgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnNwYWNlQmVsb3csICIwcHQiKSA6ICIiOwogICAgdGhpcy50YWJEZWZhdWx0ID0gYXR0cmlidXRlcy50YWJEZWZhdWx0ID8gZ2V0TWVhc3VyZW1lbnQodGhpcy50YWJEZWZhdWx0KSA6ICIiOwogICAgdGhpcy50YWJTdG9wcyA9IChhdHRyaWJ1dGVzLnRhYlN0b3BzIHx8ICIiKS50cmltKCkuc3BsaXQoL1xzKy8pLm1hcCgoeCwgaSkgPT4gaSAlIDIgPT09IDEgPyBnZXRNZWFzdXJlbWVudCh4KSA6IHgpOwogICAgdGhpcy50ZXh0SW5kZW50ID0gYXR0cmlidXRlcy50ZXh0SW5kZW50ID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy50ZXh0SW5kZW50LCAiMHB0IikgOiAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnZBbGlnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnZBbGlnbiwgWyJ0b3AiLCAiYm90dG9tIiwgIm1pZGRsZSJdKTsKICAgIHRoaXMud2lkb3dzID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMud2lkb3dzLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLmh5cGhlbmF0aW9uID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXSgpIHsKICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSh0aGlzLCAiaEFsaWduIik7CiAgICBpZiAodGhpcy5tYXJnaW5MZWZ0ICE9PSAiIikgewogICAgICBzdHlsZS5wYWRkaW5nTGVmdCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLm1hcmdpbkxlZnQpOwogICAgfQogICAgaWYgKHRoaXMubWFyZ2luUmlnaHQgIT09ICIiKSB7CiAgICAgIHN0eWxlLnBhZGRpbmdSaWdodCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLm1hcmdpblJpZ2h0KTsKICAgIH0KICAgIGlmICh0aGlzLnNwYWNlQWJvdmUgIT09ICIiKSB7CiAgICAgIHN0eWxlLnBhZGRpbmdUb3AgPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5zcGFjZUFib3ZlKTsKICAgIH0KICAgIGlmICh0aGlzLnNwYWNlQmVsb3cgIT09ICIiKSB7CiAgICAgIHN0eWxlLnBhZGRpbmdCb3R0b20gPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5zcGFjZUJlbG93KTsKICAgIH0KICAgIGlmICh0aGlzLnRleHRJbmRlbnQgIT09ICIiKSB7CiAgICAgIHN0eWxlLnRleHRJbmRlbnQgPSBtZWFzdXJlVG9TdHJpbmcodGhpcy50ZXh0SW5kZW50KTsKICAgICAgZml4VGV4dEluZGVudChzdHlsZSk7CiAgICB9CiAgICBpZiAodGhpcy5saW5lSGVpZ2h0ID4gMCkgewogICAgICBzdHlsZS5saW5lSGVpZ2h0ID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubGluZUhlaWdodCk7CiAgICB9CiAgICBpZiAodGhpcy50YWJEZWZhdWx0ICE9PSAiIikgewogICAgICBzdHlsZS50YWJTaXplID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMudGFiRGVmYXVsdCk7CiAgICB9CiAgICBpZiAodGhpcy50YWJTdG9wcy5sZW5ndGggPiAwKSB7fQogICAgaWYgKHRoaXMuaHlwaGVuYXRhdGlvbikgewogICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCB0aGlzLmh5cGhlbmF0YXRpb25bJHRvU3R5bGVdKCkpOwogICAgfQogICAgcmV0dXJuIHN0eWxlOwogIH0KfQpjbGFzcyBQYXNzd29yZEVkaXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicGFzc3dvcmRFZGl0IiwgdHJ1ZSk7CiAgICB0aGlzLmhTY3JvbGxQb2xpY3kgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oU2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnBhc3N3b3JkQ2hhciA9IGF0dHJpYnV0ZXMucGFzc3dvcmRDaGFyIHx8ICIqIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQp9CmNsYXNzIHRlbXBsYXRlX1BhdHRlcm4gZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicGF0dGVybiIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbImNyb3NzSGF0Y2giLCAiY3Jvc3NEaWFnb25hbCIsICJkaWFnb25hbExlZnQiLCAiZGlhZ29uYWxSaWdodCIsICJob3Jpem9udGFsIiwgInZlcnRpY2FsIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29sb3IgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbJHRvU3R5bGVdKHN0YXJ0Q29sb3IpIHsKICAgIHN0YXJ0Q29sb3IgPSBzdGFydENvbG9yID8gc3RhcnRDb2xvclskdG9TdHlsZV0oKSA6ICIjRkZGRkZGIjsKICAgIGNvbnN0IGVuZENvbG9yID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3JbJHRvU3R5bGVdKCkgOiAiIzAwMDAwMCI7CiAgICBjb25zdCB3aWR0aCA9IDU7CiAgICBjb25zdCBjbWQgPSAicmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCI7CiAgICBjb25zdCBjb2xvcnMgPSBgJHtzdGFydENvbG9yfSwke3N0YXJ0Q29sb3J9ICR7d2lkdGh9cHgsJHtlbmRDb2xvcn0gJHt3aWR0aH1weCwke2VuZENvbG9yfSAkezIgKiB3aWR0aH1weGA7CiAgICBzd2l0Y2ggKHRoaXMudHlwZSkgewogICAgICBjYXNlICJjcm9zc0hhdGNoIjoKICAgICAgICByZXR1cm4gYCR7Y21kfSh0byB0b3AsJHtjb2xvcnN9KSAke2NtZH0odG8gcmlnaHQsJHtjb2xvcnN9KWA7CiAgICAgIGNhc2UgImNyb3NzRGlhZ29uYWwiOgogICAgICAgIHJldHVybiBgJHtjbWR9KDQ1ZGVnLCR7Y29sb3JzfSkgJHtjbWR9KC00NWRlZywke2NvbG9yc30pYDsKICAgICAgY2FzZSAiZGlhZ29uYWxMZWZ0IjoKICAgICAgICByZXR1cm4gYCR7Y21kfSg0NWRlZywke2NvbG9yc30pYDsKICAgICAgY2FzZSAiZGlhZ29uYWxSaWdodCI6CiAgICAgICAgcmV0dXJuIGAke2NtZH0oLTQ1ZGVnLCR7Y29sb3JzfSlgOwogICAgICBjYXNlICJob3Jpem9udGFsIjoKICAgICAgICByZXR1cm4gYCR7Y21kfSh0byB0b3AsJHtjb2xvcnN9KWA7CiAgICAgIGNhc2UgInZlcnRpY2FsIjoKICAgICAgICByZXR1cm4gYCR7Y21kfSh0byByaWdodCwke2NvbG9yc30pYDsKICAgIH0KICAgIHJldHVybiAiIjsKICB9Cn0KY2xhc3MgUGljdHVyZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwaWN0dXJlIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFByb3RvIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInByb3RvIiwgdHJ1ZSk7CiAgICB0aGlzLmFwcGVhcmFuY2VGaWx0ZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYXJjID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmFyZWEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYXNzaXN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJhcmNvZGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYmluZEl0ZW1zID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJvb2tlbmQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYm9vbGVhbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5ib3JkZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnJlYWsgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnJlYWtBZnRlciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5icmVha0JlZm9yZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5idXR0b24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY2FsY3VsYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNhcHRpb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY2VydGlmaWNhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY2VydGlmaWNhdGVzID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNoZWNrQnV0dG9uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNob2ljZUxpc3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29sb3IgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29tYiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb25uZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNvbnRlbnRBcmVhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNvcm5lciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRhdGVUaW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRhdGVUaW1lRWRpdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRlZmF1bHRVaSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZXNjID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRpZ2VzdE1ldGhvZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kaWdlc3RNZXRob2RzID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRyYXcgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZWRnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNvZGluZyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNvZGluZ3MgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZW5jcnlwdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNyeXB0RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNyeXB0aW9uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmVuY3J5cHRpb25NZXRob2QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZW5jcnlwdGlvbk1ldGhvZHMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXZlbnQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhEYXRhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4T2JqZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4Y2xHcm91cCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leGVjdXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4dHJhcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWVsZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWxsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZpbHRlciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mb250ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZvcm1hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5oYW5kbGVyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmh5cGhlbmF0aW9uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmltYWdlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmltYWdlRWRpdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmlzc3VlcnMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuaXRlbXMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMua2VlcCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5rZXlVc2FnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5saW5lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmxpbmVhciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5sb2NrRG9jdW1lbnQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubWFuaWZlc3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubWFyZ2luID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm1kcCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5tZWRpdW0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubWVzc2FnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5udW1lcmljRWRpdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5vY2N1ciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5vaWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMub2lkcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5vdmVyZmxvdyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wYWdlQXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wYWdlU2V0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBhcmEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGFzc3dvcmRFZGl0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBhdHRlcm4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGljdHVyZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5yYWRpYWwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucmVhc29uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnJlYXNvbnMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucmVjdGFuZ2xlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnJlZiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zY3JpcHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2V0UHJvcGVydHkgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2lnbkRhdGEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2lnbmF0dXJlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNpZ25pbmcgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc29saWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3BlYWsgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3RpcHBsZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmZvcm1TZXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViamVjdEROID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmplY3RETnMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3VibWl0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGV4dEVkaXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50aW1lU3RhbXAgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudG9vbFRpcCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50cmF2ZXJzYWwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudHJhdmVyc2UgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudWkgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudmFsaWRhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudmFsdWUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudmFyaWFibGVzID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIFJhZGlhbCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJyYWRpYWwiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJ0b0VkZ2UiLCAidG9DZW50ZXIiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oc3RhcnRDb2xvcikgewogICAgc3RhcnRDb2xvciA9IHN0YXJ0Q29sb3IgPyBzdGFydENvbG9yWyR0b1N0eWxlXSgpIDogIiNGRkZGRkYiOwogICAgY29uc3QgZW5kQ29sb3IgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvclskdG9TdHlsZV0oKSA6ICIjMDAwMDAwIjsKICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMudHlwZSA9PT0gInRvRWRnZSIgPyBgJHtzdGFydENvbG9yfSwke2VuZENvbG9yfWAgOiBgJHtlbmRDb2xvcn0sJHtzdGFydENvbG9yfWA7CiAgICByZXR1cm4gYHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgY2VudGVyLCAke2NvbG9yc30pYDsKICB9Cn0KY2xhc3MgUmVhc29uIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInJlYXNvbiIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBSZWFzb25zIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInJlYXNvbnMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnJlYXNvbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBSZWN0YW5nbGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicmVjdGFuZ2xlIiwgdHJ1ZSk7CiAgICB0aGlzLmhhbmQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oYW5kLCBbImV2ZW4iLCAibGVmdCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29ybmVyID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogICAgdGhpcy5lZGdlID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogICAgdGhpcy5maWxsID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKCkgewogICAgY29uc3QgZWRnZSA9IHRoaXMuZWRnZS5jaGlsZHJlbi5sZW5ndGggPyB0aGlzLmVkZ2UuY2hpbGRyZW5bMF0gOiBuZXcgRWRnZSh7fSk7CiAgICBjb25zdCBlZGdlU3R5bGUgPSBlZGdlWyR0b1N0eWxlXSgpOwogICAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKHRoaXMuZmlsbD8ucHJlc2VuY2UgPT09ICJ2aXNpYmxlIikgewogICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCB0aGlzLmZpbGxbJHRvU3R5bGVdKCkpOwogICAgfSBlbHNlIHsKICAgICAgc3R5bGUuZmlsbCA9ICJ0cmFuc3BhcmVudCI7CiAgICB9CiAgICBzdHlsZS5zdHJva2VXaWR0aCA9IG1lYXN1cmVUb1N0cmluZyhlZGdlLnByZXNlbmNlID09PSAidmlzaWJsZSIgPyBlZGdlLnRoaWNrbmVzcyA6IDApOwogICAgc3R5bGUuc3Ryb2tlID0gZWRnZVN0eWxlLmNvbG9yOwogICAgY29uc3QgY29ybmVyID0gdGhpcy5jb3JuZXIuY2hpbGRyZW4ubGVuZ3RoID8gdGhpcy5jb3JuZXIuY2hpbGRyZW5bMF0gOiBuZXcgQ29ybmVyKHt9KTsKICAgIGNvbnN0IGNvcm5lclN0eWxlID0gY29ybmVyWyR0b1N0eWxlXSgpOwogICAgY29uc3QgcmVjdCA9IHsKICAgICAgbmFtZTogInJlY3QiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgeG1sbnM6IFNWR19OUywKICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgIGhlaWdodDogIjEwMCUiLAogICAgICAgIHg6IDAsCiAgICAgICAgeTogMCwKICAgICAgICByeDogY29ybmVyU3R5bGUucmFkaXVzLAogICAgICAgIHJ5OiBjb3JuZXJTdHlsZS5yYWRpdXMsCiAgICAgICAgc3R5bGUKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN2ZyA9IHsKICAgICAgbmFtZTogInN2ZyIsCiAgICAgIGNoaWxkcmVuOiBbcmVjdF0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICB4bWxuczogU1ZHX05TLAogICAgICAgIHN0eWxlOiB7CiAgICAgICAgICBvdmVyZmxvdzogInZpc2libGUiCiAgICAgICAgfSwKICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgIGhlaWdodDogIjEwMCUiCiAgICAgIH0KICAgIH07CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRQYXJlbnRdKClbJGdldFBhcmVudF0oKTsKICAgIGlmIChoYXNNYXJnaW4ocGFyZW50KSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICBkaXNwbGF5OiAiaW5saW5lIiwKICAgICAgICAgICAgd2lkdGg6ICIxMDAlIiwKICAgICAgICAgICAgaGVpZ2h0OiAiMTAwJSIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNoaWxkcmVuOiBbc3ZnXQogICAgICB9KTsKICAgIH0KICAgIHN2Zy5hdHRyaWJ1dGVzLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3Moc3ZnKTsKICB9Cn0KY2xhc3MgUmVmRWxlbWVudCBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJyZWYiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgU2NyaXB0IGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNjcmlwdCIpOwogICAgdGhpcy5iaW5kaW5nID0gYXR0cmlidXRlcy5iaW5kaW5nIHx8ICIiOwogICAgdGhpcy5jb250ZW50VHlwZSA9IGF0dHJpYnV0ZXMuY29udGVudFR5cGUgfHwgIiI7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucnVuQXQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5ydW5BdCwgWyJjbGllbnQiLCAiYm90aCIsICJzZXJ2ZXIiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBTZXRQcm9wZXJ0eSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzZXRQcm9wZXJ0eSIpOwogICAgdGhpcy5jb25uZWN0aW9uID0gYXR0cmlidXRlcy5jb25uZWN0aW9uIHx8ICIiOwogICAgdGhpcy5yZWYgPSBhdHRyaWJ1dGVzLnJlZiB8fCAiIjsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgfQp9CmNsYXNzIFNpZ25EYXRhIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNpZ25EYXRhIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMub3BlcmF0aW9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMub3BlcmF0aW9uLCBbInNpZ24iLCAiY2xlYXIiLCAidmVyaWZ5Il0pOwogICAgdGhpcy5yZWYgPSBhdHRyaWJ1dGVzLnJlZiB8fCAiIjsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5maWx0ZXIgPSBudWxsOwogICAgdGhpcy5tYW5pZmVzdCA9IG51bGw7CiAgfQp9CmNsYXNzIFNpZ25hdHVyZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzaWduYXR1cmUiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJQREYxLjMiLCAiUERGMS42Il0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuZmlsdGVyID0gbnVsbDsKICAgIHRoaXMubWFuaWZlc3QgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KfQpjbGFzcyBTaWduaW5nIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNpZ25pbmciLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIFNvbGlkIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNvbGlkIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oc3RhcnRDb2xvcikgewogICAgcmV0dXJuIHN0YXJ0Q29sb3IgPyBzdGFydENvbG9yWyR0b1N0eWxlXSgpIDogIiNGRkZGRkYiOwogIH0KfQpjbGFzcyBTcGVhayBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzcGVhayIpOwogICAgdGhpcy5kaXNhYmxlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZGlzYWJsZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5wcmlvcml0eSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnByaW9yaXR5LCBbImN1c3RvbSIsICJjYXB0aW9uIiwgIm5hbWUiLCAidG9vbFRpcCJdKTsKICAgIHRoaXMucmlkID0gYXR0cmlidXRlcy5yaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBTdGlwcGxlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInN0aXBwbGUiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5yYXRlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucmF0ZSwKICAgICAgZGVmYXVsdFZhbHVlOiA1MCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwICYmIHggPD0gMTAwCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNvbG9yID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXShiZ0NvbG9yKSB7CiAgICBjb25zdCBhbHBoYSA9IHRoaXMucmF0ZSAvIDEwMDsKICAgIHJldHVybiBVdGlsLm1ha2VIZXhDb2xvcihNYXRoLnJvdW5kKGJnQ29sb3IudmFsdWUuciAqICgxIC0gYWxwaGEpICsgdGhpcy52YWx1ZS5yICogYWxwaGEpLCBNYXRoLnJvdW5kKGJnQ29sb3IudmFsdWUuZyAqICgxIC0gYWxwaGEpICsgdGhpcy52YWx1ZS5nICogYWxwaGEpLCBNYXRoLnJvdW5kKGJnQ29sb3IudmFsdWUuYiAqICgxIC0gYWxwaGEpICsgdGhpcy52YWx1ZS5iICogYWxwaGEpKTsKICB9Cn0KY2xhc3MgU3ViZm9ybSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzdWJmb3JtIiwgdHJ1ZSk7CiAgICB0aGlzLmFjY2VzcyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFjY2VzcywgWyJvcGVuIiwgIm5vbkludGVyYWN0aXZlIiwgInByb3RlY3RlZCIsICJyZWFkT25seSJdKTsKICAgIHRoaXMuYWxsb3dNYWNybyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmFsbG93TWFjcm8sCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmFuY2hvclR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hbmNob3JUeXBlLCBbInRvcExlZnQiLCAiYm90dG9tQ2VudGVyIiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAibWlkZGxlQ2VudGVyIiwgIm1pZGRsZUxlZnQiLCAibWlkZGxlUmlnaHQiLCAidG9wQ2VudGVyIiwgInRvcFJpZ2h0Il0pOwogICAgdGhpcy5jb2xTcGFuID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5jb2x1bW5XaWR0aHMgPSAoYXR0cmlidXRlcy5jb2x1bW5XaWR0aHMgfHwgIiIpLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKHggPT4geCA9PT0gIi0xIiA/IC0xIDogZ2V0TWVhc3VyZW1lbnQoeCkpOwogICAgdGhpcy5oID0gYXR0cmlidXRlcy5oID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5oKSA6ICIiOwogICAgdGhpcy5oQWxpZ24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oQWxpZ24sIFsibGVmdCIsICJjZW50ZXIiLCAianVzdGlmeSIsICJqdXN0aWZ5QWxsIiwgInJhZGl4IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxheW91dCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmxheW91dCwgWyJwb3NpdGlvbiIsICJsci10YiIsICJybC1yb3ciLCAicmwtdGIiLCAicm93IiwgInRhYmxlIiwgInRiIl0pOwogICAgdGhpcy5sb2NhbGUgPSBhdHRyaWJ1dGVzLmxvY2FsZSB8fCAiIjsKICAgIHRoaXMubWF4SCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWF4SCwgIjBwdCIpOwogICAgdGhpcy5tYXhXID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhXLCAiMHB0Iik7CiAgICB0aGlzLm1lcmdlTW9kZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm1lcmdlTW9kZSwgWyJjb25zdW1lRGF0YSIsICJtYXRjaFRlbXBsYXRlIl0pOwogICAgdGhpcy5taW5IID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5taW5ILCAiMHB0Iik7CiAgICB0aGlzLm1pblcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1pblcsICIwcHQiKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnJlc3RvcmVTdGF0ZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnJlc3RvcmVTdGF0ZSwgWyJtYW51YWwiLCAiYXV0byJdKTsKICAgIHRoaXMuc2NvcGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zY29wZSwgWyJuYW1lIiwgIm5vbmUiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy53ID0gYXR0cmlidXRlcy53ID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy53KSA6ICIiOwogICAgdGhpcy54ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuYXNzaXN0ID0gbnVsbDsKICAgIHRoaXMuYmluZCA9IG51bGw7CiAgICB0aGlzLmJvb2tlbmQgPSBudWxsOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5icmVhayA9IG51bGw7CiAgICB0aGlzLmNhbGN1bGF0ZSA9IG51bGw7CiAgICB0aGlzLmRlc2MgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5rZWVwID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICAgIHRoaXMub2NjdXIgPSBudWxsOwogICAgdGhpcy5vdmVyZmxvdyA9IG51bGw7CiAgICB0aGlzLnBhZ2VTZXQgPSBudWxsOwogICAgdGhpcy5wYXJhID0gbnVsbDsKICAgIHRoaXMudHJhdmVyc2FsID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGUgPSBudWxsOwogICAgdGhpcy52YXJpYWJsZXMgPSBudWxsOwogICAgdGhpcy5hcmVhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJyZWFrQWZ0ZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnJlYWtCZWZvcmUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29ubmVjdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kcmF3ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV2ZW50ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4T2JqZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4Y2xHcm91cCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWVsZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wcm90byA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zZXRQcm9wZXJ0eSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmZvcm1TZXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRnZXRTdWJmb3JtUGFyZW50XSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTdWJmb3JtU2V0KSB7CiAgICAgIHJldHVybiBwYXJlbnRbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICB9CiAgICByZXR1cm4gcGFyZW50OwogIH0KICBbJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskaXNUaGVyZU1vcmVXaWR0aF0oKSB7CiAgICByZXR1cm4gdGhpcy5sYXlvdXQuZW5kc1dpdGgoIi10YiIpICYmIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID09PSAwICYmIHRoaXNbJGV4dHJhXS5udW1iZXJJbkxpbmUgPiAwIHx8IHRoaXNbJGdldFBhcmVudF0oKVskaXNUaGVyZU1vcmVXaWR0aF0oKTsKICB9CiAgKlskZ2V0Q29udGFpbmVkQ2hpbGRyZW5dKCkgewogICAgeWllbGQqIGdldENvbnRhaW5lZENoaWxkcmVuKHRoaXMpOwogIH0KICBbJGZsdXNoSFRNTF0oKSB7CiAgICByZXR1cm4gZmx1c2hIVE1MKHRoaXMpOwogIH0KICBbJGFkZEhUTUxdKGh0bWwsIGJib3gpIHsKICAgIGFkZEhUTUwodGhpcywgaHRtbCwgYmJveCk7CiAgfQogIFskZ2V0QXZhaWxhYmxlU3BhY2VdKCkgewogICAgcmV0dXJuIGdldEF2YWlsYWJsZVNwYWNlKHRoaXMpOwogIH0KICBbJGlzU3BsaXR0YWJsZV0oKSB7CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRTdWJmb3JtUGFyZW50XSgpOwogICAgaWYgKCFwYXJlbnRbJGlzU3BsaXR0YWJsZV0oKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGUgIT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gdGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGU7CiAgICB9CiAgICBpZiAodGhpcy5sYXlvdXQgPT09ICJwb3NpdGlvbiIgfHwgdGhpcy5sYXlvdXQuaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIHRoaXNbJGV4dHJhXS5faXNTcGxpdHRhYmxlID0gZmFsc2U7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzLmtlZXAgJiYgdGhpcy5rZWVwLmludGFjdCAhPT0gIm5vbmUiKSB7CiAgICAgIHRoaXNbJGV4dHJhXS5faXNTcGxpdHRhYmxlID0gZmFsc2U7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChwYXJlbnQubGF5b3V0Py5lbmRzV2l0aCgiLXRiIikgJiYgcGFyZW50WyRleHRyYV0ubnVtYmVySW5MaW5lICE9PSAwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRoaXNbJGV4dHJhXS5faXNTcGxpdHRhYmxlID0gdHJ1ZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHNldFRhYkluZGV4KHRoaXMpOwogICAgaWYgKHRoaXMuYnJlYWspIHsKICAgICAgaWYgKHRoaXMuYnJlYWsuYWZ0ZXIgIT09ICJhdXRvIiB8fCB0aGlzLmJyZWFrLmFmdGVyVGFyZ2V0ICE9PSAiIikgewogICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgQnJlYWtBZnRlcih7CiAgICAgICAgICB0YXJnZXRUeXBlOiB0aGlzLmJyZWFrLmFmdGVyLAogICAgICAgICAgdGFyZ2V0OiB0aGlzLmJyZWFrLmFmdGVyVGFyZ2V0LAogICAgICAgICAgc3RhcnROZXc6IHRoaXMuYnJlYWsuc3RhcnROZXcudG9TdHJpbmcoKQogICAgICAgIH0pOwogICAgICAgIG5vZGVbJGdsb2JhbERhdGFdID0gdGhpc1skZ2xvYmFsRGF0YV07CiAgICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgICAgIHRoaXMuYnJlYWtBZnRlci5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmJyZWFrLmJlZm9yZSAhPT0gImF1dG8iIHx8IHRoaXMuYnJlYWsuYmVmb3JlVGFyZ2V0ICE9PSAiIikgewogICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgQnJlYWtCZWZvcmUoewogICAgICAgICAgdGFyZ2V0VHlwZTogdGhpcy5icmVhay5iZWZvcmUsCiAgICAgICAgICB0YXJnZXQ6IHRoaXMuYnJlYWsuYmVmb3JlVGFyZ2V0LAogICAgICAgICAgc3RhcnROZXc6IHRoaXMuYnJlYWsuc3RhcnROZXcudG9TdHJpbmcoKQogICAgICAgIH0pOwogICAgICAgIG5vZGVbJGdsb2JhbERhdGFdID0gdGhpc1skZ2xvYmFsRGF0YV07CiAgICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgICAgIHRoaXMuYnJlYWtCZWZvcmUucHVzaChub2RlKTsKICAgICAgfQogICAgICBpZiAodGhpcy5icmVhay5vdmVyZmxvd1RhcmdldCAhPT0gIiIpIHsKICAgICAgICBjb25zdCBub2RlID0gbmV3IE92ZXJmbG93KHsKICAgICAgICAgIHRhcmdldDogdGhpcy5icmVhay5vdmVyZmxvd1RhcmdldCwKICAgICAgICAgIGxlYWRlcjogdGhpcy5icmVhay5vdmVyZmxvd0xlYWRlciwKICAgICAgICAgIHRyYWlsZXI6IHRoaXMuYnJlYWsub3ZlcmZsb3dUcmFpbGVyCiAgICAgICAgfSk7CiAgICAgICAgbm9kZVskZ2xvYmFsRGF0YV0gPSB0aGlzWyRnbG9iYWxEYXRhXTsKICAgICAgICB0aGlzWyRhcHBlbmRDaGlsZF0obm9kZSk7CiAgICAgICAgdGhpcy5vdmVyZmxvdy5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIHRoaXNbJHJlbW92ZUNoaWxkXSh0aGlzLmJyZWFrKTsKICAgICAgdGhpcy5icmVhayA9IG51bGw7CiAgICB9CiAgICBpZiAodGhpcy5wcmVzZW5jZSA9PT0gImhpZGRlbiIgfHwgdGhpcy5wcmVzZW5jZSA9PT0gImluYWN0aXZlIikgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGlmICh0aGlzLmJyZWFrQmVmb3JlLmNoaWxkcmVuLmxlbmd0aCA+IDEgfHwgdGhpcy5icmVha0FmdGVyLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgd2FybigiWEZBIC0gU2V2ZXJhbCBicmVha0JlZm9yZSBvciBicmVha0FmdGVyIGluIHN1YmZvcm1zOiBwbGVhc2UgZmlsZSBhIGJ1Zy4iKTsKICAgIH0KICAgIGlmICh0aGlzLmJyZWFrQmVmb3JlLmNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7CiAgICAgIGNvbnN0IGJyZWFrQmVmb3JlID0gdGhpcy5icmVha0JlZm9yZS5jaGlsZHJlblswXTsKICAgICAgaWYgKGhhbmRsZUJyZWFrKGJyZWFrQmVmb3JlKSkgewogICAgICAgIHJldHVybiBIVE1MUmVzdWx0LmJyZWFrTm9kZShicmVha0JlZm9yZSk7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzWyRleHRyYV0/LmFmdGVyQnJlYWtBZnRlcikgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGZpeERpbWVuc2lvbnModGhpcyk7CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgaWQ6IHRoaXNbJHVpZF0sCiAgICAgIGNsYXNzOiBbXQogICAgfTsKICAgIHNldEFjY2Vzcyh0aGlzLCBhdHRyaWJ1dGVzLmNsYXNzKTsKICAgIGlmICghdGhpc1skZXh0cmFdKSB7CiAgICAgIHRoaXNbJGV4dHJhXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB9CiAgICBPYmplY3QuYXNzaWduKHRoaXNbJGV4dHJhXSwgewogICAgICBjaGlsZHJlbiwKICAgICAgbGluZTogbnVsbCwKICAgICAgYXR0cmlidXRlcywKICAgICAgYXR0ZW1wdDogMCwKICAgICAgbnVtYmVySW5MaW5lOiAwLAogICAgICBhdmFpbGFibGVTcGFjZTogewogICAgICAgIHdpZHRoOiBNYXRoLm1pbih0aGlzLncgfHwgSW5maW5pdHksIGF2YWlsYWJsZVNwYWNlLndpZHRoKSwKICAgICAgICBoZWlnaHQ6IE1hdGgubWluKHRoaXMuaCB8fCBJbmZpbml0eSwgYXZhaWxhYmxlU3BhY2UuaGVpZ2h0KQogICAgICB9LAogICAgICB3aWR0aDogMCwKICAgICAgaGVpZ2h0OiAwLAogICAgICBwcmV2SGVpZ2h0OiAwLAogICAgICBjdXJyZW50V2lkdGg6IDAKICAgIH0pOwogICAgY29uc3Qgcm9vdCA9IHRoaXNbJGdldFRlbXBsYXRlUm9vdF0oKTsKICAgIGNvbnN0IHNhdmVkTm9MYXlvdXRGYWlsdXJlID0gcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZTsKICAgIGNvbnN0IGlzU3BsaXR0YWJsZSA9IHRoaXNbJGlzU3BsaXR0YWJsZV0oKTsKICAgIGlmICghaXNTcGxpdHRhYmxlKSB7CiAgICAgIHNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgfQogICAgaWYgKCFjaGVja0RpbWVuc2lvbnModGhpcywgYXZhaWxhYmxlU3BhY2UpKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICBjb25zdCBmaWx0ZXIgPSBuZXcgU2V0KFsiYXJlYSIsICJkcmF3IiwgImV4Y2xHcm91cCIsICJmaWVsZCIsICJzdWJmb3JtIiwgInN1YmZvcm1TZXQiXSk7CiAgICBpZiAodGhpcy5sYXlvdXQuaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IHRoaXNbJGdldFN1YmZvcm1QYXJlbnRdKCkuY29sdW1uV2lkdGhzOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5XaWR0aHMpICYmIGNvbHVtbldpZHRocy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpc1skZXh0cmFdLmNvbHVtbldpZHRocyA9IGNvbHVtbldpZHRoczsKICAgICAgICB0aGlzWyRleHRyYV0uY3VycmVudENvbHVtbiA9IDA7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSh0aGlzLCAiYW5jaG9yVHlwZSIsICJkaW1lbnNpb25zIiwgInBvc2l0aW9uIiwgInByZXNlbmNlIiwgImJvcmRlciIsICJtYXJnaW4iLCAiaEFsaWduIik7CiAgICBjb25zdCBjbGFzc05hbWVzID0gWyJ4ZmFTdWJmb3JtIl07CiAgICBjb25zdCBjbCA9IGxheW91dENsYXNzKHRoaXMpOwogICAgaWYgKGNsKSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaChjbCk7CiAgICB9CiAgICBhdHRyaWJ1dGVzLnN0eWxlID0gc3R5bGU7CiAgICBhdHRyaWJ1dGVzLmNsYXNzID0gY2xhc3NOYW1lczsKICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgYXR0cmlidXRlcy54ZmFOYW1lID0gdGhpcy5uYW1lOwogICAgfQogICAgaWYgKHRoaXMub3ZlcmZsb3cpIHsKICAgICAgY29uc3Qgb3ZlcmZsb3dFeHRyYSA9IHRoaXMub3ZlcmZsb3dbJGdldEV4dHJhXSgpOwogICAgICBpZiAob3ZlcmZsb3dFeHRyYS5hZGRMZWFkZXIpIHsKICAgICAgICBvdmVyZmxvd0V4dHJhLmFkZExlYWRlciA9IGZhbHNlOwogICAgICAgIGhhbmRsZU92ZXJmbG93KHRoaXMsIG92ZXJmbG93RXh0cmEubGVhZGVyLCBhdmFpbGFibGVTcGFjZSk7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbJHB1c2hQYXJhXSgpOwogICAgY29uc3QgaXNMclRiID0gdGhpcy5sYXlvdXQgPT09ICJsci10YiIgfHwgdGhpcy5sYXlvdXQgPT09ICJybC10YiI7CiAgICBjb25zdCBtYXhSdW4gPSBpc0xyVGIgPyBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUIDogMTsKICAgIGZvciAoOyB0aGlzWyRleHRyYV0uYXR0ZW1wdCA8IG1heFJ1bjsgdGhpc1skZXh0cmFdLmF0dGVtcHQrKykgewogICAgICBpZiAoaXNMclRiICYmIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID09PSBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUIC0gMSkgewogICAgICAgIHRoaXNbJGV4dHJhXS5udW1iZXJJbkxpbmUgPSAwOwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXNbJGNoaWxkcmVuVG9IVE1MXSh7CiAgICAgICAgZmlsdGVyLAogICAgICAgIGluY2x1ZGU6IHRydWUKICAgICAgfSk7CiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChyZXN1bHQuaXNCcmVhaygpKSB7CiAgICAgICAgdGhpc1skcG9wUGFyYV0oKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIGlmIChpc0xyVGIgJiYgdGhpc1skZXh0cmFdLmF0dGVtcHQgPT09IDAgJiYgdGhpc1skZXh0cmFdLm51bWJlckluTGluZSA9PT0gMCAmJiAhcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSkgewogICAgICAgIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID0gbWF4UnVuOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICB0aGlzWyRwb3BQYXJhXSgpOwogICAgaWYgKCFpc1NwbGl0dGFibGUpIHsKICAgICAgdW5zZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIH0KICAgIHJvb3RbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUgPSBzYXZlZE5vTGF5b3V0RmFpbHVyZTsKICAgIGlmICh0aGlzWyRleHRyYV0uYXR0ZW1wdCA9PT0gbWF4UnVuKSB7CiAgICAgIGlmICh0aGlzLm92ZXJmbG93KSB7CiAgICAgICAgdGhpc1skZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ub3ZlcmZsb3dOb2RlID0gdGhpcy5vdmVyZmxvdzsKICAgICAgfQogICAgICBpZiAoIWlzU3BsaXR0YWJsZSkgewogICAgICAgIGRlbGV0ZSB0aGlzWyRleHRyYV07CiAgICAgIH0KICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRkFJTFVSRTsKICAgIH0KICAgIGlmICh0aGlzLm92ZXJmbG93KSB7CiAgICAgIGNvbnN0IG92ZXJmbG93RXh0cmEgPSB0aGlzLm92ZXJmbG93WyRnZXRFeHRyYV0oKTsKICAgICAgaWYgKG92ZXJmbG93RXh0cmEuYWRkVHJhaWxlcikgewogICAgICAgIG92ZXJmbG93RXh0cmEuYWRkVHJhaWxlciA9IGZhbHNlOwogICAgICAgIGhhbmRsZU92ZXJmbG93KHRoaXMsIG92ZXJmbG93RXh0cmEudHJhaWxlciwgYXZhaWxhYmxlU3BhY2UpOwogICAgICB9CiAgICB9CiAgICBsZXQgbWFyZ2luSCA9IDA7CiAgICBsZXQgbWFyZ2luViA9IDA7CiAgICBpZiAodGhpcy5tYXJnaW4pIHsKICAgICAgbWFyZ2luSCA9IHRoaXMubWFyZ2luLmxlZnRJbnNldCArIHRoaXMubWFyZ2luLnJpZ2h0SW5zZXQ7CiAgICAgIG1hcmdpblYgPSB0aGlzLm1hcmdpbi50b3BJbnNldCArIHRoaXMubWFyZ2luLmJvdHRvbUluc2V0OwogICAgfQogICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCh0aGlzWyRleHRyYV0ud2lkdGggKyBtYXJnaW5ILCB0aGlzLncgfHwgMCk7CiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCh0aGlzWyRleHRyYV0uaGVpZ2h0ICsgbWFyZ2luViwgdGhpcy5oIHx8IDApOwogICAgY29uc3QgYmJveCA9IFt0aGlzLngsIHRoaXMueSwgd2lkdGgsIGhlaWdodF07CiAgICBpZiAodGhpcy53ID09PSAiIikgewogICAgICBzdHlsZS53aWR0aCA9IG1lYXN1cmVUb1N0cmluZyh3aWR0aCk7CiAgICB9CiAgICBpZiAodGhpcy5oID09PSAiIikgewogICAgICBzdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcoaGVpZ2h0KTsKICAgIH0KICAgIGlmICgoc3R5bGUud2lkdGggPT09ICIwcHgiIHx8IHN0eWxlLmhlaWdodCA9PT0gIjBweCIpICYmIGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGNvbnN0IGh0bWwgPSB7CiAgICAgIG5hbWU6ICJkaXYiLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBjaGlsZHJlbgogICAgfTsKICAgIGFwcGx5QXNzaXN0KHRoaXMsIGF0dHJpYnV0ZXMpOwogICAgY29uc3QgcmVzdWx0ID0gSFRNTFJlc3VsdC5zdWNjZXNzKGNyZWF0ZVdyYXBwZXIodGhpcywgaHRtbCksIGJib3gpOwogICAgaWYgKHRoaXMuYnJlYWtBZnRlci5jaGlsZHJlbi5sZW5ndGggPj0gMSkgewogICAgICBjb25zdCBicmVha0FmdGVyID0gdGhpcy5icmVha0FmdGVyLmNoaWxkcmVuWzBdOwogICAgICBpZiAoaGFuZGxlQnJlYWsoYnJlYWtBZnRlcikpIHsKICAgICAgICB0aGlzWyRleHRyYV0uYWZ0ZXJCcmVha0FmdGVyID0gcmVzdWx0OwogICAgICAgIHJldHVybiBIVE1MUmVzdWx0LmJyZWFrTm9kZShicmVha0FmdGVyKTsKICAgICAgfQogICAgfQogICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CmNsYXNzIFN1YmZvcm1TZXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic3ViZm9ybVNldCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnJlbGF0aW9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucmVsYXRpb24sIFsib3JkZXJlZCIsICJjaG9pY2UiLCAidW5vcmRlcmVkIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9va2VuZCA9IG51bGw7CiAgICB0aGlzLmJyZWFrID0gbnVsbDsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm9jY3VyID0gbnVsbDsKICAgIHRoaXMub3ZlcmZsb3cgPSBudWxsOwogICAgdGhpcy5icmVha0FmdGVyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJyZWFrQmVmb3JlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmZvcm0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybVNldCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KICAqWyRnZXRDb250YWluZWRDaGlsZHJlbl0oKSB7CiAgICB5aWVsZCogZ2V0Q29udGFpbmVkQ2hpbGRyZW4odGhpcyk7CiAgfQogIFskZ2V0U3ViZm9ybVBhcmVudF0oKSB7CiAgICBsZXQgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpOwogICAgd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgU3ViZm9ybSkpIHsKICAgICAgcGFyZW50ID0gcGFyZW50WyRnZXRQYXJlbnRdKCk7CiAgICB9CiAgICByZXR1cm4gcGFyZW50OwogIH0KICBbJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQp9CmNsYXNzIFN1YmplY3RETiBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic3ViamVjdEROIik7CiAgICB0aGlzLmRlbGltaXRlciA9IGF0dHJpYnV0ZXMuZGVsaW1pdGVyIHx8ICIsIjsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IG5ldyBNYXAodGhpc1skY29udGVudF0uc3BsaXQodGhpcy5kZWxpbWl0ZXIpLm1hcChrdiA9PiB7CiAgICAgIGt2ID0ga3Yuc3BsaXQoIj0iLCAyKTsKICAgICAga3ZbMF0gPSBrdlswXS50cmltKCk7CiAgICAgIHJldHVybiBrdjsKICAgIH0pKTsKICB9Cn0KY2xhc3MgU3ViamVjdEROcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzdWJqZWN0RE5zIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5zdWJqZWN0RE4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgU3VibWl0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInN1Ym1pdCIsIHRydWUpOwogICAgdGhpcy5lbWJlZFBERiA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmVtYmVkUERGLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5mb3JtYXQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5mb3JtYXQsIFsieGRwIiwgImZvcm1kYXRhIiwgInBkZiIsICJ1cmxlbmNvZGVkIiwgInhmZCIsICJ4bWwiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgICB0aGlzLnRleHRFbmNvZGluZyA9IGdldEtleXdvcmQoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnRleHRFbmNvZGluZyA/IGF0dHJpYnV0ZXMudGV4dEVuY29kaW5nLnRvTG93ZXJDYXNlKCkgOiAiIiwKICAgICAgZGVmYXVsdFZhbHVlOiAiIiwKICAgICAgdmFsaWRhdGU6IGsgPT4gWyJ1dGYtOCIsICJiaWctZml2ZSIsICJmb250c3BlY2lmaWMiLCAiZ2JrIiwgImdiLTE4MDMwIiwgImdiLTIzMTIiLCAia3NjLTU2MDEiLCAibm9uZSIsICJzaGlmdC1qaXMiLCAidWNzLTIiLCAidXRmLTE2Il0uaW5jbHVkZXMoaykgfHwgay5tYXRjaCgvaXNvLTg4NTktXGR7Mn0vKQogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy54ZHBDb250ZW50ID0gYXR0cmlidXRlcy54ZHBDb250ZW50IHx8ICIiOwogICAgdGhpcy5lbmNyeXB0ID0gbnVsbDsKICAgIHRoaXMuZW5jcnlwdERhdGEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2lnbkRhdGEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgVGVtcGxhdGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGVtcGxhdGUiLCB0cnVlKTsKICAgIHRoaXMuYmFzZVByb2ZpbGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5iYXNlUHJvZmlsZSwgWyJmdWxsIiwgImludGVyYWN0aXZlRm9ybXMiXSk7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLnN1YmZvcm0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBpZiAodGhpcy5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgICB3YXJuKCJYRkEgLSBObyBzdWJmb3JtcyBpbiB0ZW1wbGF0ZSBub2RlLiIpOwogICAgfQogICAgaWYgKHRoaXMuc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGggPj0gMikgewogICAgICB3YXJuKCJYRkEgLSBTZXZlcmFsIHN1YmZvcm1zIGluIHRlbXBsYXRlIG5vZGU6IHBsZWFzZSBmaWxlIGEgYnVnLiIpOwogICAgfQogICAgdGhpc1skdGFiSW5kZXhdID0gREVGQVVMVF9UQUJfSU5ERVg7CiAgfQogIFskaXNTcGxpdHRhYmxlXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJHNlYXJjaE5vZGVdKGV4cHIsIGNvbnRhaW5lcikgewogICAgaWYgKGV4cHIuc3RhcnRzV2l0aCgiIyIpKSB7CiAgICAgIHJldHVybiBbdGhpc1skaWRzXS5nZXQoZXhwci5zbGljZSgxKSldOwogICAgfQogICAgcmV0dXJuIHNlYXJjaE5vZGUodGhpcywgY29udGFpbmVyLCBleHByLCB0cnVlLCB0cnVlKTsKICB9CiAgKlskdG9QYWdlc10oKSB7CiAgICBpZiAoIXRoaXMuc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgICAgbmFtZTogImRpdiIsCiAgICAgICAgY2hpbGRyZW46IFtdCiAgICAgIH0pOwogICAgfQogICAgdGhpc1skZXh0cmFdID0gewogICAgICBvdmVyZmxvd05vZGU6IG51bGwsCiAgICAgIGZpcnN0VW5zcGxpdHRhYmxlOiBudWxsLAogICAgICBjdXJyZW50Q29udGVudEFyZWE6IG51bGwsCiAgICAgIGN1cnJlbnRQYWdlQXJlYTogbnVsbCwKICAgICAgbm9MYXlvdXRGYWlsdXJlOiBmYWxzZSwKICAgICAgcGFnZU51bWJlcjogMSwKICAgICAgcGFnZVBvc2l0aW9uOiAiZmlyc3QiLAogICAgICBvZGRPckV2ZW46ICJvZGQiLAogICAgICBibGFua09yTm90Qmxhbms6ICJub25CbGFuayIsCiAgICAgIHBhcmFTdGFjazogW10KICAgIH07CiAgICBjb25zdCByb290ID0gdGhpcy5zdWJmb3JtLmNoaWxkcmVuWzBdOwogICAgcm9vdC5wYWdlU2V0WyRjbGVhblBhZ2VdKCk7CiAgICBjb25zdCBwYWdlQXJlYXMgPSByb290LnBhZ2VTZXQucGFnZUFyZWEuY2hpbGRyZW47CiAgICBjb25zdCBtYWluSHRtbCA9IHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICAgIGxldCBwYWdlQXJlYSA9IG51bGw7CiAgICBsZXQgYnJlYWtCZWZvcmUgPSBudWxsOwogICAgbGV0IGJyZWFrQmVmb3JlVGFyZ2V0ID0gbnVsbDsKICAgIGlmIChyb290LmJyZWFrQmVmb3JlLmNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7CiAgICAgIGJyZWFrQmVmb3JlID0gcm9vdC5icmVha0JlZm9yZS5jaGlsZHJlblswXTsKICAgICAgYnJlYWtCZWZvcmVUYXJnZXQgPSBicmVha0JlZm9yZS50YXJnZXQ7CiAgICB9IGVsc2UgaWYgKHJvb3Quc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGggPj0gMSAmJiByb290LnN1YmZvcm0uY2hpbGRyZW5bMF0uYnJlYWtCZWZvcmUuY2hpbGRyZW4ubGVuZ3RoID49IDEpIHsKICAgICAgYnJlYWtCZWZvcmUgPSByb290LnN1YmZvcm0uY2hpbGRyZW5bMF0uYnJlYWtCZWZvcmUuY2hpbGRyZW5bMF07CiAgICAgIGJyZWFrQmVmb3JlVGFyZ2V0ID0gYnJlYWtCZWZvcmUudGFyZ2V0OwogICAgfSBlbHNlIGlmIChyb290LmJyZWFrPy5iZWZvcmVUYXJnZXQpIHsKICAgICAgYnJlYWtCZWZvcmUgPSByb290LmJyZWFrOwogICAgICBicmVha0JlZm9yZVRhcmdldCA9IGJyZWFrQmVmb3JlLmJlZm9yZVRhcmdldDsKICAgIH0gZWxzZSBpZiAocm9vdC5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aCA+PSAxICYmIHJvb3Quc3ViZm9ybS5jaGlsZHJlblswXS5icmVhaz8uYmVmb3JlVGFyZ2V0KSB7CiAgICAgIGJyZWFrQmVmb3JlID0gcm9vdC5zdWJmb3JtLmNoaWxkcmVuWzBdLmJyZWFrOwogICAgICBicmVha0JlZm9yZVRhcmdldCA9IGJyZWFrQmVmb3JlLmJlZm9yZVRhcmdldDsKICAgIH0KICAgIGlmIChicmVha0JlZm9yZSkgewogICAgICBjb25zdCB0YXJnZXQgPSB0aGlzWyRzZWFyY2hOb2RlXShicmVha0JlZm9yZVRhcmdldCwgYnJlYWtCZWZvcmVbJGdldFBhcmVudF0oKSk7CiAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQYWdlQXJlYSkgewogICAgICAgIHBhZ2VBcmVhID0gdGFyZ2V0OwogICAgICAgIGJyZWFrQmVmb3JlWyRleHRyYV0gPSB7fTsKICAgICAgfQogICAgfQogICAgaWYgKCFwYWdlQXJlYSkgewogICAgICBwYWdlQXJlYSA9IHBhZ2VBcmVhc1swXTsKICAgIH0KICAgIHBhZ2VBcmVhWyRleHRyYV0gPSB7CiAgICAgIG51bWJlck9mVXNlOiAxCiAgICB9OwogICAgY29uc3QgcGFnZUFyZWFQYXJlbnQgPSBwYWdlQXJlYVskZ2V0UGFyZW50XSgpOwogICAgcGFnZUFyZWFQYXJlbnRbJGV4dHJhXSA9IHsKICAgICAgbnVtYmVyT2ZVc2U6IDEsCiAgICAgIHBhZ2VJbmRleDogcGFnZUFyZWFQYXJlbnQucGFnZUFyZWEuY2hpbGRyZW4uaW5kZXhPZihwYWdlQXJlYSksCiAgICAgIHBhZ2VTZXRJbmRleDogMAogICAgfTsKICAgIGxldCB0YXJnZXRQYWdlQXJlYTsKICAgIGxldCBsZWFkZXIgPSBudWxsOwogICAgbGV0IHRyYWlsZXIgPSBudWxsOwogICAgbGV0IGhhc1NvbWV0aGluZyA9IHRydWU7CiAgICBsZXQgaGFzU29tZXRoaW5nQ291bnRlciA9IDA7CiAgICBsZXQgc3RhcnRJbmRleCA9IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoIWhhc1NvbWV0aGluZykgewogICAgICAgIG1haW5IdG1sLmNoaWxkcmVuLnBvcCgpOwogICAgICAgIGlmICgrK2hhc1NvbWV0aGluZ0NvdW50ZXIgPT09IE1BWF9FTVBUWV9QQUdFUykgewogICAgICAgICAgd2FybigiWEZBIC0gU29tZXRoaW5nIGdvZXMgd3Jvbmc6IHBsZWFzZSBmaWxlIGEgYnVnLiIpOwogICAgICAgICAgcmV0dXJuIG1haW5IdG1sOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBoYXNTb21ldGhpbmdDb3VudGVyID0gMDsKICAgICAgfQogICAgICB0YXJnZXRQYWdlQXJlYSA9IG51bGw7CiAgICAgIHRoaXNbJGV4dHJhXS5jdXJyZW50UGFnZUFyZWEgPSBwYWdlQXJlYTsKICAgICAgY29uc3QgcGFnZSA9IHBhZ2VBcmVhWyR0b0hUTUxdKCkuaHRtbDsKICAgICAgbWFpbkh0bWwuY2hpbGRyZW4ucHVzaChwYWdlKTsKICAgICAgaWYgKGxlYWRlcikgewogICAgICAgIHRoaXNbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUgPSB0cnVlOwogICAgICAgIHBhZ2UuY2hpbGRyZW4ucHVzaChsZWFkZXJbJHRvSFRNTF0ocGFnZUFyZWFbJGV4dHJhXS5zcGFjZSkuaHRtbCk7CiAgICAgICAgbGVhZGVyID0gbnVsbDsKICAgICAgfQogICAgICBpZiAodHJhaWxlcikgewogICAgICAgIHRoaXNbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUgPSB0cnVlOwogICAgICAgIHBhZ2UuY2hpbGRyZW4ucHVzaCh0cmFpbGVyWyR0b0hUTUxdKHBhZ2VBcmVhWyRleHRyYV0uc3BhY2UpLmh0bWwpOwogICAgICAgIHRyYWlsZXIgPSBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IGNvbnRlbnRBcmVhcyA9IHBhZ2VBcmVhLmNvbnRlbnRBcmVhLmNoaWxkcmVuOwogICAgICBjb25zdCBodG1sQ29udGVudEFyZWFzID0gcGFnZS5jaGlsZHJlbi5maWx0ZXIobm9kZSA9PiBub2RlLmF0dHJpYnV0ZXMuY2xhc3MuaW5jbHVkZXMoInhmYUNvbnRlbnRhcmVhIikpOwogICAgICBoYXNTb21ldGhpbmcgPSBmYWxzZTsKICAgICAgdGhpc1skZXh0cmFdLmZpcnN0VW5zcGxpdHRhYmxlID0gbnVsbDsKICAgICAgdGhpc1skZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IGZhbHNlOwogICAgICBjb25zdCBmbHVzaCA9IGluZGV4ID0+IHsKICAgICAgICBjb25zdCBodG1sID0gcm9vdFskZmx1c2hIVE1MXSgpOwogICAgICAgIGlmIChodG1sKSB7CiAgICAgICAgICBoYXNTb21ldGhpbmcgfHw9IGh0bWwuY2hpbGRyZW4/Lmxlbmd0aCA+IDA7CiAgICAgICAgICBodG1sQ29udGVudEFyZWFzW2luZGV4XS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXgsIGlpID0gY29udGVudEFyZWFzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb25zdCBjb250ZW50QXJlYSA9IHRoaXNbJGV4dHJhXS5jdXJyZW50Q29udGVudEFyZWEgPSBjb250ZW50QXJlYXNbaV07CiAgICAgICAgY29uc3Qgc3BhY2UgPSB7CiAgICAgICAgICB3aWR0aDogY29udGVudEFyZWEudywKICAgICAgICAgIGhlaWdodDogY29udGVudEFyZWEuaAogICAgICAgIH07CiAgICAgICAgc3RhcnRJbmRleCA9IDA7CiAgICAgICAgaWYgKGxlYWRlcikgewogICAgICAgICAgaHRtbENvbnRlbnRBcmVhc1tpXS5jaGlsZHJlbi5wdXNoKGxlYWRlclskdG9IVE1MXShzcGFjZSkuaHRtbCk7CiAgICAgICAgICBsZWFkZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAodHJhaWxlcikgewogICAgICAgICAgaHRtbENvbnRlbnRBcmVhc1tpXS5jaGlsZHJlbi5wdXNoKHRyYWlsZXJbJHRvSFRNTF0oc3BhY2UpLmh0bWwpOwogICAgICAgICAgdHJhaWxlciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGh0bWwgPSByb290WyR0b0hUTUxdKHNwYWNlKTsKICAgICAgICBpZiAoaHRtbC5zdWNjZXNzKSB7CiAgICAgICAgICBpZiAoaHRtbC5odG1sKSB7CiAgICAgICAgICAgIGhhc1NvbWV0aGluZyB8fD0gaHRtbC5odG1sLmNoaWxkcmVuPy5sZW5ndGggPiAwOwogICAgICAgICAgICBodG1sQ29udGVudEFyZWFzW2ldLmNoaWxkcmVuLnB1c2goaHRtbC5odG1sKTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1NvbWV0aGluZyAmJiBtYWluSHRtbC5jaGlsZHJlbi5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIG1haW5IdG1sLmNoaWxkcmVuLnBvcCgpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG1haW5IdG1sOwogICAgICAgIH0KICAgICAgICBpZiAoaHRtbC5pc0JyZWFrKCkpIHsKICAgICAgICAgIGNvbnN0IG5vZGUgPSBodG1sLmJyZWFrTm9kZTsKICAgICAgICAgIGZsdXNoKGkpOwogICAgICAgICAgaWYgKG5vZGUudGFyZ2V0VHlwZSA9PT0gImF1dG8iKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUubGVhZGVyKSB7CiAgICAgICAgICAgIGxlYWRlciA9IHRoaXNbJHNlYXJjaE5vZGVdKG5vZGUubGVhZGVyLCBub2RlWyRnZXRQYXJlbnRdKCkpOwogICAgICAgICAgICBsZWFkZXIgPSBsZWFkZXIgPyBsZWFkZXJbMF0gOiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUudHJhaWxlcikgewogICAgICAgICAgICB0cmFpbGVyID0gdGhpc1skc2VhcmNoTm9kZV0obm9kZS50cmFpbGVyLCBub2RlWyRnZXRQYXJlbnRdKCkpOwogICAgICAgICAgICB0cmFpbGVyID0gdHJhaWxlciA/IHRyYWlsZXJbMF0gOiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUudGFyZ2V0VHlwZSA9PT0gInBhZ2VBcmVhIikgewogICAgICAgICAgICB0YXJnZXRQYWdlQXJlYSA9IG5vZGVbJGV4dHJhXS50YXJnZXQ7CiAgICAgICAgICAgIGkgPSBJbmZpbml0eTsKICAgICAgICAgIH0gZWxzZSBpZiAoIW5vZGVbJGV4dHJhXS50YXJnZXQpIHsKICAgICAgICAgICAgaSA9IG5vZGVbJGV4dHJhXS5pbmRleDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRhcmdldFBhZ2VBcmVhID0gbm9kZVskZXh0cmFdLnRhcmdldDsKICAgICAgICAgICAgc3RhcnRJbmRleCA9IG5vZGVbJGV4dHJhXS5pbmRleCArIDE7CiAgICAgICAgICAgIGkgPSBJbmZpbml0eTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodGhpc1skZXh0cmFdLm92ZXJmbG93Tm9kZSkgewogICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXNbJGV4dHJhXS5vdmVyZmxvd05vZGU7CiAgICAgICAgICB0aGlzWyRleHRyYV0ub3ZlcmZsb3dOb2RlID0gbnVsbDsKICAgICAgICAgIGNvbnN0IG92ZXJmbG93RXh0cmEgPSBub2RlWyRnZXRFeHRyYV0oKTsKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IG92ZXJmbG93RXh0cmEudGFyZ2V0OwogICAgICAgICAgb3ZlcmZsb3dFeHRyYS5hZGRMZWFkZXIgPSBvdmVyZmxvd0V4dHJhLmxlYWRlciAhPT0gbnVsbDsKICAgICAgICAgIG92ZXJmbG93RXh0cmEuYWRkVHJhaWxlciA9IG92ZXJmbG93RXh0cmEudHJhaWxlciAhPT0gbnVsbDsKICAgICAgICAgIGZsdXNoKGkpOwogICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gaTsKICAgICAgICAgIGkgPSBJbmZpbml0eTsKICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQYWdlQXJlYSkgewogICAgICAgICAgICB0YXJnZXRQYWdlQXJlYSA9IHRhcmdldDsKICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ29udGVudEFyZWEpIHsKICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjb250ZW50QXJlYXMuaW5kZXhPZih0YXJnZXQpOwogICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgICAgaWYgKGluZGV4ID4gY3VycmVudEluZGV4KSB7CiAgICAgICAgICAgICAgICBpID0gaW5kZXggLSAxOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRhcmdldFBhZ2VBcmVhID0gdGFyZ2V0WyRnZXRQYXJlbnRdKCk7CiAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IHRhcmdldFBhZ2VBcmVhLmNvbnRlbnRBcmVhLmNoaWxkcmVuLmluZGV4T2YodGFyZ2V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZsdXNoKGkpOwogICAgICB9CiAgICAgIHRoaXNbJGV4dHJhXS5wYWdlTnVtYmVyICs9IDE7CiAgICAgIGlmICh0YXJnZXRQYWdlQXJlYSkgewogICAgICAgIGlmICh0YXJnZXRQYWdlQXJlYVskaXNVc2FibGVdKCkpIHsKICAgICAgICAgIHRhcmdldFBhZ2VBcmVhWyRleHRyYV0ubnVtYmVyT2ZVc2UgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0UGFnZUFyZWEgPSBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgICBwYWdlQXJlYSA9IHRhcmdldFBhZ2VBcmVhIHx8IHBhZ2VBcmVhWyRnZXROZXh0UGFnZV0oKTsKICAgICAgeWllbGQgbnVsbDsKICAgIH0KICB9Cn0KY2xhc3MgVGV4dCBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGV4dCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm1heENoYXJzID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubWF4Q2hhcnMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmlkID0gYXR0cmlidXRlcy5yaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGFjY2VwdFdoaXRlc3BhY2VdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskb25DaGlsZF0oY2hpbGQpIHsKICAgIGlmIChjaGlsZFskbmFtZXNwYWNlSWRdID09PSBOYW1lc3BhY2VJZHMueGh0bWwuaWQpIHsKICAgICAgdGhpc1skY29udGVudF0gPSBjaGlsZDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIGNvbnRlbnQgaW4gVGV4dDogJHtjaGlsZFskbm9kZU5hbWVdfS5gKTsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRvblRleHRdKHN0cikgewogICAgaWYgKHRoaXNbJGNvbnRlbnRdIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN1cGVyWyRvblRleHRdKHN0cik7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgaWYgKHR5cGVvZiB0aGlzWyRjb250ZW50XSA9PT0gInN0cmluZyIpIHsKICAgICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS5yZXBsYWNlQWxsKCJcclxuIiwgIlxuIik7CiAgICB9CiAgfQogIFskZ2V0RXh0cmFdKCkgewogICAgaWYgKHR5cGVvZiB0aGlzWyRjb250ZW50XSA9PT0gInN0cmluZyIpIHsKICAgICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdLnNwbGl0KC9bXHUyMDI5XHUyMDI4XG5dLykuZmlsdGVyKGxpbmUgPT4gISFsaW5lKS5qb2luKCJcbiIpOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdWyR0ZXh0XSgpOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGlmICh0eXBlb2YgdGhpc1skY29udGVudF0gPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IGh0bWwgPSB2YWx1ZVRvSHRtbCh0aGlzWyRjb250ZW50XSkuaHRtbDsKICAgICAgaWYgKHRoaXNbJGNvbnRlbnRdLmluY2x1ZGVzKCJcdTIwMjkiKSkgewogICAgICAgIGh0bWwubmFtZSA9ICJkaXYiOwogICAgICAgIGh0bWwuY2hpbGRyZW4gPSBbXTsKICAgICAgICB0aGlzWyRjb250ZW50XS5zcGxpdCgiXHUyMDI5IikubWFwKHBhcmEgPT4gcGFyYS5zcGxpdCgvW1x1MjAyOFxuXS8pLmZsYXRNYXAobGluZSA9PiBbewogICAgICAgICAgbmFtZTogInNwYW4iLAogICAgICAgICAgdmFsdWU6IGxpbmUKICAgICAgICB9LCB7CiAgICAgICAgICBuYW1lOiAiYnIiCiAgICAgICAgfV0pKS5mb3JFYWNoKGxpbmVzID0+IHsKICAgICAgICAgIGh0bWwuY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIG5hbWU6ICJwIiwKICAgICAgICAgICAgY2hpbGRyZW46IGxpbmVzCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICgvW1x1MjAyOFxuXS8udGVzdCh0aGlzWyRjb250ZW50XSkpIHsKICAgICAgICBodG1sLm5hbWUgPSAiZGl2IjsKICAgICAgICBodG1sLmNoaWxkcmVuID0gW107CiAgICAgICAgdGhpc1skY29udGVudF0uc3BsaXQoL1tcdTIwMjhcbl0vKS5mb3JFYWNoKGxpbmUgPT4gewogICAgICAgICAgaHRtbC5jaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgbmFtZTogInNwYW4iLAogICAgICAgICAgICB2YWx1ZTogbGluZQogICAgICAgICAgfSwgewogICAgICAgICAgICBuYW1lOiAiYnIiCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGh0bWwpOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICB9Cn0KY2xhc3MgVGV4dEVkaXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGV4dEVkaXQiLCB0cnVlKTsKICAgIHRoaXMuYWxsb3dSaWNoVGV4dCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmFsbG93UmljaFRleHQsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmhTY3JvbGxQb2xpY3kgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oU2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm11bHRpTGluZSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm11bHRpTGluZSwKICAgICAgZGVmYXVsdFZhbHVlOiAiIiwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMCB8fCB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnZTY3JvbGxQb2xpY3kgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy52U2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jb21iID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImJvcmRlciIsICJmb250IiwgIm1hcmdpbiIpOwogICAgbGV0IGh0bWw7CiAgICBjb25zdCBmaWVsZCA9IHRoaXNbJGdldFBhcmVudF0oKVskZ2V0UGFyZW50XSgpOwogICAgaWYgKHRoaXMubXVsdGlMaW5lID09PSAiIikgewogICAgICB0aGlzLm11bHRpTGluZSA9IGZpZWxkIGluc3RhbmNlb2YgRHJhdyA/IDEgOiAwOwogICAgfQogICAgaWYgKHRoaXMubXVsdGlMaW5lID09PSAxKSB7CiAgICAgIGh0bWwgPSB7CiAgICAgICAgbmFtZTogInRleHRhcmVhIiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBkYXRhSWQ6IGZpZWxkWyRkYXRhXT8uWyR1aWRdIHx8IGZpZWxkWyR1aWRdLAogICAgICAgICAgZmllbGRJZDogZmllbGRbJHVpZF0sCiAgICAgICAgICBjbGFzczogWyJ4ZmFUZXh0ZmllbGQiXSwKICAgICAgICAgIHN0eWxlLAogICAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICAgIH0KICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGh0bWwgPSB7CiAgICAgICAgbmFtZTogImlucHV0IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICBkYXRhSWQ6IGZpZWxkWyRkYXRhXT8uWyR1aWRdIHx8IGZpZWxkWyR1aWRdLAogICAgICAgICAgZmllbGRJZDogZmllbGRbJHVpZF0sCiAgICAgICAgICBjbGFzczogWyJ4ZmFUZXh0ZmllbGQiXSwKICAgICAgICAgIHN0eWxlLAogICAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBodG1sLmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIGh0bWwuYXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImxhYmVsIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbInhmYUxhYmVsIl0KICAgICAgfSwKICAgICAgY2hpbGRyZW46IFtodG1sXQogICAgfSk7CiAgfQp9CmNsYXNzIFRpbWUgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGltZSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IGRhdGUgPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICB0aGlzWyRjb250ZW50XSA9IGRhdGUgPyBuZXcgRGF0ZShkYXRlKSA6IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbJGNvbnRlbnRdID8gdGhpc1skY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgVGltZVN0YW1wIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInRpbWVTdGFtcCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnNlcnZlciA9IGF0dHJpYnV0ZXMuc2VydmVyIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFRvb2xUaXAgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidG9vbFRpcCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnJpZCA9IGF0dHJpYnV0ZXMucmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgVHJhdmVyc2FsIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInRyYXZlcnNhbCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy50cmF2ZXJzZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBUcmF2ZXJzZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ0cmF2ZXJzZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm9wZXJhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm9wZXJhdGlvbiwgWyJuZXh0IiwgImJhY2siLCAiZG93biIsICJmaXJzdCIsICJsZWZ0IiwgInJpZ2h0IiwgInVwIl0pOwogICAgdGhpcy5yZWYgPSBhdHRyaWJ1dGVzLnJlZiB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLnNjcmlwdCA9IG51bGw7CiAgfQogIGdldCBuYW1lKCkgewogICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uOwogIH0KICBbJGlzVHJhbnNwYXJlbnRdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQpjbGFzcyBVaSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ1aSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICAgIHRoaXMuYmFyY29kZSA9IG51bGw7CiAgICB0aGlzLmJ1dHRvbiA9IG51bGw7CiAgICB0aGlzLmNoZWNrQnV0dG9uID0gbnVsbDsKICAgIHRoaXMuY2hvaWNlTGlzdCA9IG51bGw7CiAgICB0aGlzLmRhdGVUaW1lRWRpdCA9IG51bGw7CiAgICB0aGlzLmRlZmF1bHRVaSA9IG51bGw7CiAgICB0aGlzLmltYWdlRWRpdCA9IG51bGw7CiAgICB0aGlzLm51bWVyaWNFZGl0ID0gbnVsbDsKICAgIHRoaXMucGFzc3dvcmRFZGl0ID0gbnVsbDsKICAgIHRoaXMuc2lnbmF0dXJlID0gbnVsbDsKICAgIHRoaXMudGV4dEVkaXQgPSBudWxsOwogIH0KICBbJGdldEV4dHJhXSgpIHsKICAgIGlmICh0aGlzWyRleHRyYV0gPT09IHVuZGVmaW5lZCkgewogICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgICBpZiAobmFtZSA9PT0gImV4dHJhcyIgfHwgbmFtZSA9PT0gInBpY3R1cmUiKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb2JqID0gdGhpc1tuYW1lXTsKICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBYRkFPYmplY3QpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGhpc1skZXh0cmFdID0gb2JqOwogICAgICAgIHJldHVybiBvYmo7CiAgICAgIH0KICAgICAgdGhpc1skZXh0cmFdID0gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzWyRleHRyYV07CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgb2JqID0gdGhpc1skZ2V0RXh0cmFdKCk7CiAgICBpZiAob2JqKSB7CiAgICAgIHJldHVybiBvYmpbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpOwogICAgfQogICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgfQp9CmNsYXNzIFZhbGlkYXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInZhbGlkYXRlIiwgdHJ1ZSk7CiAgICB0aGlzLmZvcm1hdFRlc3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5mb3JtYXRUZXN0LCBbIndhcm5pbmciLCAiZGlzYWJsZWQiLCAiZXJyb3IiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubnVsbFRlc3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5udWxsVGVzdCwgWyJkaXNhYmxlZCIsICJlcnJvciIsICJ3YXJuaW5nIl0pOwogICAgdGhpcy5zY3JpcHRUZXN0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuc2NyaXB0VGVzdCwgWyJlcnJvciIsICJkaXNhYmxlZCIsICJ3YXJuaW5nIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWVzc2FnZSA9IG51bGw7CiAgICB0aGlzLnBpY3R1cmUgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogIH0KfQpjbGFzcyBWYWx1ZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ2YWx1ZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm92ZXJyaWRlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMub3ZlcnJpZGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5hcmMgPSBudWxsOwogICAgdGhpcy5ib29sZWFuID0gbnVsbDsKICAgIHRoaXMuZGF0ZSA9IG51bGw7CiAgICB0aGlzLmRhdGVUaW1lID0gbnVsbDsKICAgIHRoaXMuZGVjaW1hbCA9IG51bGw7CiAgICB0aGlzLmV4RGF0YSA9IG51bGw7CiAgICB0aGlzLmZsb2F0ID0gbnVsbDsKICAgIHRoaXMuaW1hZ2UgPSBudWxsOwogICAgdGhpcy5pbnRlZ2VyID0gbnVsbDsKICAgIHRoaXMubGluZSA9IG51bGw7CiAgICB0aGlzLnJlY3RhbmdsZSA9IG51bGw7CiAgICB0aGlzLnRleHQgPSBudWxsOwogICAgdGhpcy50aW1lID0gbnVsbDsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBGaWVsZCkgewogICAgICBpZiAocGFyZW50LnVpPy5pbWFnZUVkaXQpIHsKICAgICAgICBpZiAoIXRoaXMuaW1hZ2UpIHsKICAgICAgICAgIHRoaXMuaW1hZ2UgPSBuZXcgSW1hZ2Uoe30pOwogICAgICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKHRoaXMuaW1hZ2UpOwogICAgICAgIH0KICAgICAgICB0aGlzLmltYWdlWyRjb250ZW50XSA9IHZhbHVlWyRjb250ZW50XTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHZhbHVlTmFtZSA9IHZhbHVlWyRub2RlTmFtZV07CiAgICBpZiAodGhpc1t2YWx1ZU5hbWVdICE9PSBudWxsKSB7CiAgICAgIHRoaXNbdmFsdWVOYW1lXVskY29udGVudF0gPSB2YWx1ZVskY29udGVudF07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkgewogICAgICBjb25zdCBvYmogPSB0aGlzW25hbWVdOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgICAgdGhpc1tuYW1lXSA9IG51bGw7CiAgICAgICAgdGhpc1skcmVtb3ZlQ2hpbGRdKG9iaik7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbdmFsdWVbJG5vZGVOYW1lXV0gPSB2YWx1ZTsKICAgIHRoaXNbJGFwcGVuZENoaWxkXSh2YWx1ZSk7CiAgfQogIFskdGV4dF0oKSB7CiAgICBpZiAodGhpcy5leERhdGEpIHsKICAgICAgaWYgKHR5cGVvZiB0aGlzLmV4RGF0YVskY29udGVudF0gPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZXhEYXRhWyRjb250ZW50XS50cmltKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuZXhEYXRhWyRjb250ZW50XVskdGV4dF0oKS50cmltKCk7CiAgICB9CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgaWYgKG5hbWUgPT09ICJpbWFnZSIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBvYmogPSB0aGlzW25hbWVdOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIChvYmpbJGNvbnRlbnRdIHx8ICIiKS50b1N0cmluZygpLnRyaW0oKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7CiAgICAgIGNvbnN0IG9iaiA9IHRoaXNbbmFtZV07CiAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFhGQU9iamVjdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICByZXR1cm4gb2JqWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogIH0KfQpjbGFzcyBWYXJpYWJsZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidmFyaWFibGVzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm1hbmlmZXN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNjcmlwdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50ZXh0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRpbWUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRpc1RyYW5zcGFyZW50XSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBUZW1wbGF0ZU5hbWVzcGFjZSB7CiAgc3RhdGljIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChUZW1wbGF0ZU5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICBjb25zdCBub2RlID0gVGVtcGxhdGVOYW1lc3BhY2VbbmFtZV0oYXR0cmlidXRlcyk7CiAgICAgIG5vZGVbJHNldFNldEF0dHJpYnV0ZXNdKGF0dHJpYnV0ZXMpOwogICAgICByZXR1cm4gbm9kZTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIHN0YXRpYyBhcHBlYXJhbmNlRmlsdGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFwcGVhcmFuY2VGaWx0ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgYXJjKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFyYyhhdHRycyk7CiAgfQogIHN0YXRpYyBhcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFyZWEoYXR0cnMpOwogIH0KICBzdGF0aWMgYXNzaXN0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFzc2lzdChhdHRycyk7CiAgfQogIHN0YXRpYyBiYXJjb2RlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJhcmNvZGUoYXR0cnMpOwogIH0KICBzdGF0aWMgYmluZChhdHRycykgewogICAgcmV0dXJuIG5ldyBCaW5kKGF0dHJzKTsKICB9CiAgc3RhdGljIGJpbmRJdGVtcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBCaW5kSXRlbXMoYXR0cnMpOwogIH0KICBzdGF0aWMgYm9va2VuZChhdHRycykgewogICAgcmV0dXJuIG5ldyBCb29rZW5kKGF0dHJzKTsKICB9CiAgc3RhdGljIGJvb2xlYW4oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQm9vbGVhbkVsZW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgYm9yZGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJvcmRlcihhdHRycyk7CiAgfQogIHN0YXRpYyBicmVhayhhdHRycykgewogICAgcmV0dXJuIG5ldyBCcmVhayhhdHRycyk7CiAgfQogIHN0YXRpYyBicmVha0FmdGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJyZWFrQWZ0ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgYnJlYWtCZWZvcmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQnJlYWtCZWZvcmUoYXR0cnMpOwogIH0KICBzdGF0aWMgYnV0dG9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJ1dHRvbihhdHRycyk7CiAgfQogIHN0YXRpYyBjYWxjdWxhdGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2FsY3VsYXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNhcHRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2FwdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBjZXJ0aWZpY2F0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBDZXJ0aWZpY2F0ZShhdHRycyk7CiAgfQogIHN0YXRpYyBjZXJ0aWZpY2F0ZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2VydGlmaWNhdGVzKGF0dHJzKTsKICB9CiAgc3RhdGljIGNoZWNrQnV0dG9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENoZWNrQnV0dG9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGNob2ljZUxpc3QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2hvaWNlTGlzdChhdHRycyk7CiAgfQogIHN0YXRpYyBjb2xvcihhdHRycykgewogICAgcmV0dXJuIG5ldyBDb2xvcihhdHRycyk7CiAgfQogIHN0YXRpYyBjb21iKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbWIoYXR0cnMpOwogIH0KICBzdGF0aWMgY29ubmVjdChhdHRycykgewogICAgcmV0dXJuIG5ldyBDb25uZWN0KGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbnRlbnRBcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbnRlbnRBcmVhKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvcm5lcihhdHRycykgewogICAgcmV0dXJuIG5ldyBDb3JuZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlRWxlbWVudChhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlVGltZShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlVGltZShhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlVGltZUVkaXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF0ZVRpbWVFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIGRlY2ltYWwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVjaW1hbChhdHRycyk7CiAgfQogIHN0YXRpYyBkZWZhdWx0VWkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVmYXVsdFVpKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlc2MoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVzYyhhdHRycyk7CiAgfQogIHN0YXRpYyBkaWdlc3RNZXRob2QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGlnZXN0TWV0aG9kKGF0dHJzKTsKICB9CiAgc3RhdGljIGRpZ2VzdE1ldGhvZHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGlnZXN0TWV0aG9kcyhhdHRycyk7CiAgfQogIHN0YXRpYyBkcmF3KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERyYXcoYXR0cnMpOwogIH0KICBzdGF0aWMgZWRnZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFZGdlKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY29kaW5nKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY29kaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY29kaW5ncyhhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNvZGluZ3MoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdChhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNyeXB0KGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHREYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY3J5cHREYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jcnlwdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBlbmNyeXB0aW9uTWV0aG9kKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY3J5cHRpb25NZXRob2QoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdGlvbk1ldGhvZHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jcnlwdGlvbk1ldGhvZHMoYXR0cnMpOwogIH0KICBzdGF0aWMgZXZlbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXZlbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgZXhEYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEV4RGF0YShhdHRycyk7CiAgfQogIHN0YXRpYyBleE9iamVjdChhdHRycykgewogICAgcmV0dXJuIG5ldyBFeE9iamVjdChhdHRycyk7CiAgfQogIHN0YXRpYyBleGNsR3JvdXAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXhjbEdyb3VwKGF0dHJzKTsKICB9CiAgc3RhdGljIGV4ZWN1dGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXhlY3V0ZShhdHRycyk7CiAgfQogIHN0YXRpYyBleHRyYXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXh0cmFzKGF0dHJzKTsKICB9CiAgc3RhdGljIGZpZWxkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEZpZWxkKGF0dHJzKTsKICB9CiAgc3RhdGljIGZpbGwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRmlsbChhdHRycyk7CiAgfQogIHN0YXRpYyBmaWx0ZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRmlsdGVyKGF0dHJzKTsKICB9CiAgc3RhdGljIGZsb2F0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0KGF0dHJzKTsKICB9CiAgc3RhdGljIGZvbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgdGVtcGxhdGVfRm9udChhdHRycyk7CiAgfQogIHN0YXRpYyBmb3JtYXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRm9ybWF0KGF0dHJzKTsKICB9CiAgc3RhdGljIGhhbmRsZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSGFuZGxlcihhdHRycyk7CiAgfQogIHN0YXRpYyBoeXBoZW5hdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBIeXBoZW5hdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBpbWFnZShhdHRycykgewogICAgcmV0dXJuIG5ldyBJbWFnZShhdHRycyk7CiAgfQogIHN0YXRpYyBpbWFnZUVkaXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW1hZ2VFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIGludGVnZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW50ZWdlcihhdHRycyk7CiAgfQogIHN0YXRpYyBpc3N1ZXJzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IElzc3VlcnMoYXR0cnMpOwogIH0KICBzdGF0aWMgaXRlbXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSXRlbXMoYXR0cnMpOwogIH0KICBzdGF0aWMga2VlcChhdHRycykgewogICAgcmV0dXJuIG5ldyBLZWVwKGF0dHJzKTsKICB9CiAgc3RhdGljIGtleVVzYWdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEtleVVzYWdlKGF0dHJzKTsKICB9CiAgc3RhdGljIGxpbmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTGluZShhdHRycyk7CiAgfQogIHN0YXRpYyBsaW5lYXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTGluZWFyKGF0dHJzKTsKICB9CiAgc3RhdGljIGxvY2tEb2N1bWVudChhdHRycykgewogICAgcmV0dXJuIG5ldyBMb2NrRG9jdW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgbWFuaWZlc3QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWFuaWZlc3QoYXR0cnMpOwogIH0KICBzdGF0aWMgbWFyZ2luKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1hcmdpbihhdHRycyk7CiAgfQogIHN0YXRpYyBtZHAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWRwKGF0dHJzKTsKICB9CiAgc3RhdGljIG1lZGl1bShhdHRycykgewogICAgcmV0dXJuIG5ldyBNZWRpdW0oYXR0cnMpOwogIH0KICBzdGF0aWMgbWVzc2FnZShhdHRycykgewogICAgcmV0dXJuIG5ldyBNZXNzYWdlKGF0dHJzKTsKICB9CiAgc3RhdGljIG51bWVyaWNFZGl0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWVyaWNFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIG9jY3VyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE9jY3VyKGF0dHJzKTsKICB9CiAgc3RhdGljIG9pZChhdHRycykgewogICAgcmV0dXJuIG5ldyBPaWQoYXR0cnMpOwogIH0KICBzdGF0aWMgb2lkcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBPaWRzKGF0dHJzKTsKICB9CiAgc3RhdGljIG92ZXJmbG93KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE92ZXJmbG93KGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2VBcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhZ2VBcmVhKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2VTZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnZVNldChhdHRycyk7CiAgfQogIHN0YXRpYyBwYXJhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhcmEoYXR0cnMpOwogIH0KICBzdGF0aWMgcGFzc3dvcmRFZGl0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhc3N3b3JkRWRpdChhdHRycyk7CiAgfQogIHN0YXRpYyBwYXR0ZXJuKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IHRlbXBsYXRlX1BhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgcGljdHVyZShhdHRycykgewogICAgcmV0dXJuIG5ldyBQaWN0dXJlKGF0dHJzKTsKICB9CiAgc3RhdGljIHByb3RvKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByb3RvKGF0dHJzKTsKICB9CiAgc3RhdGljIHJhZGlhbChhdHRycykgewogICAgcmV0dXJuIG5ldyBSYWRpYWwoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVhc29uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlYXNvbihhdHRycyk7CiAgfQogIHN0YXRpYyByZWFzb25zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlYXNvbnMoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVjdGFuZ2xlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlY3RhbmdsZShhdHRycyk7CiAgfQogIHN0YXRpYyByZWYoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVmRWxlbWVudChhdHRycyk7CiAgfQogIHN0YXRpYyBzY3JpcHQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU2NyaXB0KGF0dHJzKTsKICB9CiAgc3RhdGljIHNldFByb3BlcnR5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNldFByb3BlcnR5KGF0dHJzKTsKICB9CiAgc3RhdGljIHNpZ25EYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNpZ25EYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIHNpZ25hdHVyZShhdHRycykgewogICAgcmV0dXJuIG5ldyBTaWduYXR1cmUoYXR0cnMpOwogIH0KICBzdGF0aWMgc2lnbmluZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBTaWduaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIHNvbGlkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNvbGlkKGF0dHJzKTsKICB9CiAgc3RhdGljIHNwZWFrKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNwZWFrKGF0dHJzKTsKICB9CiAgc3RhdGljIHN0aXBwbGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3RpcHBsZShhdHRycyk7CiAgfQogIHN0YXRpYyBzdWJmb3JtKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN1YmZvcm0oYXR0cnMpOwogIH0KICBzdGF0aWMgc3ViZm9ybVNldChhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJmb3JtU2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIHN1YmplY3RETihhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJqZWN0RE4oYXR0cnMpOwogIH0KICBzdGF0aWMgc3ViamVjdEROcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJqZWN0RE5zKGF0dHJzKTsKICB9CiAgc3RhdGljIHN1Ym1pdChhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJtaXQoYXR0cnMpOwogIH0KICBzdGF0aWMgdGVtcGxhdGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGVtcGxhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdGV4dChhdHRycykgewogICAgcmV0dXJuIG5ldyBUZXh0KGF0dHJzKTsKICB9CiAgc3RhdGljIHRleHRFZGl0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRleHRFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIHRpbWUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGltZShhdHRycyk7CiAgfQogIHN0YXRpYyB0aW1lU3RhbXAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGltZVN0YW1wKGF0dHJzKTsKICB9CiAgc3RhdGljIHRvb2xUaXAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVG9vbFRpcChhdHRycyk7CiAgfQogIHN0YXRpYyB0cmF2ZXJzYWwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHJhdmVyc2FsKGF0dHJzKTsKICB9CiAgc3RhdGljIHRyYXZlcnNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRyYXZlcnNlKGF0dHJzKTsKICB9CiAgc3RhdGljIHVpKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFVpKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhbGlkYXRlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZhbGlkYXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhbHVlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZhbHVlKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhcmlhYmxlcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBWYXJpYWJsZXMoYXR0cnMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2JpbmQuanMKCgoKCgoKY29uc3QgYmluZF9OU19EQVRBU0VUUyA9IE5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZDsKZnVuY3Rpb24gY3JlYXRlVGV4dChjb250ZW50KSB7CiAgY29uc3Qgbm9kZSA9IG5ldyBUZXh0KHt9KTsKICBub2RlWyRjb250ZW50XSA9IGNvbnRlbnQ7CiAgcmV0dXJuIG5vZGU7Cn0KY2xhc3MgQmluZGVyIHsKICBjb25zdHJ1Y3Rvcihyb290KSB7CiAgICB0aGlzLnJvb3QgPSByb290OwogICAgdGhpcy5kYXRhc2V0cyA9IHJvb3QuZGF0YXNldHM7CiAgICB0aGlzLmRhdGEgPSByb290LmRhdGFzZXRzPy5kYXRhIHx8IG5ldyBYbWxPYmplY3QoTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkLCAiZGF0YSIpOwogICAgdGhpcy5lbXB0eU1lcmdlID0gdGhpcy5kYXRhWyRnZXRDaGlsZHJlbl0oKS5sZW5ndGggPT09IDA7CiAgICB0aGlzLnJvb3QuZm9ybSA9IHRoaXMuZm9ybSA9IHJvb3QudGVtcGxhdGVbJGNsb25lXSgpOwogIH0KICBfaXNDb25zdW1lRGF0YSgpIHsKICAgIHJldHVybiAhdGhpcy5lbXB0eU1lcmdlICYmIHRoaXMuX21lcmdlTW9kZTsKICB9CiAgX2lzTWF0Y2hUZW1wbGF0ZSgpIHsKICAgIHJldHVybiAhdGhpcy5faXNDb25zdW1lRGF0YSgpOwogIH0KICBiaW5kKCkgewogICAgdGhpcy5fYmluZEVsZW1lbnQodGhpcy5mb3JtLCB0aGlzLmRhdGEpOwogICAgcmV0dXJuIHRoaXMuZm9ybTsKICB9CiAgZ2V0RGF0YSgpIHsKICAgIHJldHVybiB0aGlzLmRhdGE7CiAgfQogIF9iaW5kVmFsdWUoZm9ybU5vZGUsIGRhdGEsIHBpY3R1cmUpIHsKICAgIGZvcm1Ob2RlWyRkYXRhXSA9IGRhdGE7CiAgICBpZiAoZm9ybU5vZGVbJGhhc1NldHRhYmxlVmFsdWVdKCkpIHsKICAgICAgaWYgKGRhdGFbJGlzRGF0YVZhbHVlXSgpKSB7CiAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhWyRnZXREYXRhVmFsdWVdKCk7CiAgICAgICAgZm9ybU5vZGVbJHNldFZhbHVlXShjcmVhdGVUZXh0KHZhbHVlKSk7CiAgICAgIH0gZWxzZSBpZiAoZm9ybU5vZGUgaW5zdGFuY2VvZiBGaWVsZCAmJiBmb3JtTm9kZS51aT8uY2hvaWNlTGlzdD8ub3BlbiA9PT0gIm11bHRpU2VsZWN0IikgewogICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVskZ2V0Q2hpbGRyZW5dKCkubWFwKGNoaWxkID0+IGNoaWxkWyRjb250ZW50XS50cmltKCkpLmpvaW4oIlxuIik7CiAgICAgICAgZm9ybU5vZGVbJHNldFZhbHVlXShjcmVhdGVUZXh0KHZhbHVlKSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5faXNDb25zdW1lRGF0YSgpKSB7CiAgICAgICAgd2FybihgWEZBIC0gTm9kZXMgaGF2ZW4ndCB0aGUgc2FtZSB0eXBlLmApOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCFkYXRhWyRpc0RhdGFWYWx1ZV0oKSB8fCB0aGlzLl9pc01hdGNoVGVtcGxhdGUoKSkgewogICAgICB0aGlzLl9iaW5kRWxlbWVudChmb3JtTm9kZSwgZGF0YSk7CiAgICB9IGVsc2UgewogICAgICB3YXJuKGBYRkEgLSBOb2RlcyBoYXZlbid0IHRoZSBzYW1lIHR5cGUuYCk7CiAgICB9CiAgfQogIF9maW5kRGF0YUJ5TmFtZVRvQ29uc3VtZShuYW1lLCBpc1ZhbHVlLCBkYXRhTm9kZSwgZ2xvYmFsKSB7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgZ2VuZXJhdG9yLCBtYXRjaDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgIGdlbmVyYXRvciA9IGRhdGFOb2RlWyRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgZmFsc2UsIHRydWUpOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIG1hdGNoID0gZ2VuZXJhdG9yLm5leHQoKS52YWx1ZTsKICAgICAgICBpZiAoIW1hdGNoKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGlzVmFsdWUgPT09IG1hdGNoWyRpc0RhdGFWYWx1ZV0oKSkgewogICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGF0YU5vZGVbJG5hbWVzcGFjZUlkXSA9PT0gTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkICYmIGRhdGFOb2RlWyRub2RlTmFtZV0gPT09ICJkYXRhIikgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGRhdGFOb2RlID0gZGF0YU5vZGVbJGdldFBhcmVudF0oKTsKICAgIH0KICAgIGlmICghZ2xvYmFsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZ2VuZXJhdG9yID0gdGhpcy5kYXRhWyRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgdHJ1ZSwgZmFsc2UpOwogICAgbWF0Y2ggPSBnZW5lcmF0b3IubmV4dCgpLnZhbHVlOwogICAgaWYgKG1hdGNoKSB7CiAgICAgIHJldHVybiBtYXRjaDsKICAgIH0KICAgIGdlbmVyYXRvciA9IHRoaXMuZGF0YVskZ2V0QXR0cmlidXRlSXRdKG5hbWUsIHRydWUpOwogICAgbWF0Y2ggPSBnZW5lcmF0b3IubmV4dCgpLnZhbHVlOwogICAgaWYgKG1hdGNoPy5bJGlzRGF0YVZhbHVlXSgpKSB7CiAgICAgIHJldHVybiBtYXRjaDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBfc2V0UHJvcGVydGllcyhmb3JtTm9kZSwgZGF0YU5vZGUpIHsKICAgIGlmICghZm9ybU5vZGUuaGFzT3duUHJvcGVydHkoInNldFByb3BlcnR5IikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCB7CiAgICAgIHJlZiwKICAgICAgdGFyZ2V0LAogICAgICBjb25uZWN0aW9uCiAgICB9IG9mIGZvcm1Ob2RlLnNldFByb3BlcnR5LmNoaWxkcmVuKSB7CiAgICAgIGlmIChjb25uZWN0aW9uKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFyZWYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBub2RlcyA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBkYXRhTm9kZSwgcmVmLCBmYWxzZSwgZmFsc2UpOwogICAgICBpZiAoIW5vZGVzKSB7CiAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCByZWZlcmVuY2U6ICR7cmVmfS5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBbbm9kZV0gPSBub2RlczsKICAgICAgaWYgKCFub2RlWyRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YSkpIHsKICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIG5vZGU6IG11c3QgYmUgYSBkYXRhIG5vZGUuYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgdGFyZ2V0Tm9kZXMgPSBzZWFyY2hOb2RlKHRoaXMucm9vdCwgZm9ybU5vZGUsIHRhcmdldCwgZmFsc2UsIGZhbHNlKTsKICAgICAgaWYgKCF0YXJnZXROb2RlcykgewogICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgdGFyZ2V0OiAke3RhcmdldH0uYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgW3RhcmdldE5vZGVdID0gdGFyZ2V0Tm9kZXM7CiAgICAgIGlmICghdGFyZ2V0Tm9kZVskaXNEZXNjZW5kZW50XShmb3JtTm9kZSkpIHsKICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIHRhcmdldDogbXVzdCBiZSBhIHByb3BlcnR5IG9yIHN1YnByb3BlcnR5LmApOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHRhcmdldFBhcmVudCA9IHRhcmdldE5vZGVbJGdldFBhcmVudF0oKTsKICAgICAgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBTZXRQcm9wZXJ0eSB8fCB0YXJnZXRQYXJlbnQgaW5zdGFuY2VvZiBTZXRQcm9wZXJ0eSkgewogICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgdGFyZ2V0OiBjYW5ub3QgYmUgYSBzZXRQcm9wZXJ0eSBvciBvbmUgb2YgaXRzIHByb3BlcnRpZXMuYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBCaW5kSXRlbXMgfHwgdGFyZ2V0UGFyZW50IGluc3RhbmNlb2YgQmluZEl0ZW1zKSB7CiAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCB0YXJnZXQ6IGNhbm5vdCBiZSBhIGJpbmRJdGVtcyBvciBvbmUgb2YgaXRzIHByb3BlcnRpZXMuYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgY29udGVudCA9IG5vZGVbJHRleHRdKCk7CiAgICAgIGNvbnN0IG5hbWUgPSB0YXJnZXROb2RlWyRub2RlTmFtZV07CiAgICAgIGlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgWEZBQXR0cmlidXRlKSB7CiAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIGF0dHJzW25hbWVdID0gY29udGVudDsKICAgICAgICBjb25zdCBvYmogPSBSZWZsZWN0LmNvbnN0cnVjdChPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0UGFyZW50KS5jb25zdHJ1Y3RvciwgW2F0dHJzXSk7CiAgICAgICAgdGFyZ2V0UGFyZW50W25hbWVdID0gb2JqW25hbWVdOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghdGFyZ2V0Tm9kZS5oYXNPd25Qcm9wZXJ0eSgkY29udGVudCkpIHsKICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIG5vZGUgdG8gdXNlIGluIHNldFByb3BlcnR5YCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdGFyZ2V0Tm9kZVskZGF0YV0gPSBub2RlOwogICAgICB0YXJnZXROb2RlWyRjb250ZW50XSA9IGNvbnRlbnQ7CiAgICAgIHRhcmdldE5vZGVbJGZpbmFsaXplXSgpOwogICAgfQogIH0KICBfYmluZEl0ZW1zKGZvcm1Ob2RlLCBkYXRhTm9kZSkgewogICAgaWYgKCFmb3JtTm9kZS5oYXNPd25Qcm9wZXJ0eSgiaXRlbXMiKSB8fCAhZm9ybU5vZGUuaGFzT3duUHJvcGVydHkoImJpbmRJdGVtcyIpIHx8IGZvcm1Ob2RlLmJpbmRJdGVtcy5pc0VtcHR5KCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBpdGVtIG9mIGZvcm1Ob2RlLml0ZW1zLmNoaWxkcmVuKSB7CiAgICAgIGZvcm1Ob2RlWyRyZW1vdmVDaGlsZF0oaXRlbSk7CiAgICB9CiAgICBmb3JtTm9kZS5pdGVtcy5jbGVhcigpOwogICAgY29uc3QgbGFiZWxzID0gbmV3IEl0ZW1zKHt9KTsKICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBJdGVtcyh7fSk7CiAgICBmb3JtTm9kZVskYXBwZW5kQ2hpbGRdKGxhYmVscyk7CiAgICBmb3JtTm9kZS5pdGVtcy5wdXNoKGxhYmVscyk7CiAgICBmb3JtTm9kZVskYXBwZW5kQ2hpbGRdKHZhbHVlcyk7CiAgICBmb3JtTm9kZS5pdGVtcy5wdXNoKHZhbHVlcyk7CiAgICBmb3IgKGNvbnN0IHsKICAgICAgcmVmLAogICAgICBsYWJlbFJlZiwKICAgICAgdmFsdWVSZWYsCiAgICAgIGNvbm5lY3Rpb24KICAgIH0gb2YgZm9ybU5vZGUuYmluZEl0ZW1zLmNoaWxkcmVuKSB7CiAgICAgIGlmIChjb25uZWN0aW9uKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFyZWYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBub2RlcyA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBkYXRhTm9kZSwgcmVmLCBmYWxzZSwgZmFsc2UpOwogICAgICBpZiAoIW5vZGVzKSB7CiAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCByZWZlcmVuY2U6ICR7cmVmfS5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHsKICAgICAgICBpZiAoIW5vZGVbJGlzRGVzY2VuZGVudF0odGhpcy5kYXRhc2V0cykpIHsKICAgICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgcmVmICgke3JlZn0pOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGFiZWxOb2RlcyA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBub2RlLCBsYWJlbFJlZiwgdHJ1ZSwgZmFsc2UpOwogICAgICAgIGlmICghbGFiZWxOb2RlcykgewogICAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCBsYWJlbDogJHtsYWJlbFJlZn0uYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgW2xhYmVsTm9kZV0gPSBsYWJlbE5vZGVzOwogICAgICAgIGlmICghbGFiZWxOb2RlWyRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YXNldHMpKSB7CiAgICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIGxhYmVsOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdmFsdWVOb2RlcyA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBub2RlLCB2YWx1ZVJlZiwgdHJ1ZSwgZmFsc2UpOwogICAgICAgIGlmICghdmFsdWVOb2RlcykgewogICAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCB2YWx1ZTogJHt2YWx1ZVJlZn0uYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgW3ZhbHVlTm9kZV0gPSB2YWx1ZU5vZGVzOwogICAgICAgIGlmICghdmFsdWVOb2RlWyRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YXNldHMpKSB7CiAgICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIHZhbHVlOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGFiZWwgPSBjcmVhdGVUZXh0KGxhYmVsTm9kZVskdGV4dF0oKSk7CiAgICAgICAgY29uc3QgdmFsdWUgPSBjcmVhdGVUZXh0KHZhbHVlTm9kZVskdGV4dF0oKSk7CiAgICAgICAgbGFiZWxzWyRhcHBlbmRDaGlsZF0obGFiZWwpOwogICAgICAgIGxhYmVscy50ZXh0LnB1c2gobGFiZWwpOwogICAgICAgIHZhbHVlc1skYXBwZW5kQ2hpbGRdKHZhbHVlKTsKICAgICAgICB2YWx1ZXMudGV4dC5wdXNoKHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KICBfYmluZE9jY3VycmVuY2VzKGZvcm1Ob2RlLCBtYXRjaGVzLCBwaWN0dXJlKSB7CiAgICBsZXQgYmFzZUNsb25lOwogICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMSkgewogICAgICBiYXNlQ2xvbmUgPSBmb3JtTm9kZVskY2xvbmVdKCk7CiAgICAgIGJhc2VDbG9uZVskcmVtb3ZlQ2hpbGRdKGJhc2VDbG9uZS5vY2N1cik7CiAgICAgIGJhc2VDbG9uZS5vY2N1ciA9IG51bGw7CiAgICB9CiAgICB0aGlzLl9iaW5kVmFsdWUoZm9ybU5vZGUsIG1hdGNoZXNbMF0sIHBpY3R1cmUpOwogICAgdGhpcy5fc2V0UHJvcGVydGllcyhmb3JtTm9kZSwgbWF0Y2hlc1swXSk7CiAgICB0aGlzLl9iaW5kSXRlbXMoZm9ybU5vZGUsIG1hdGNoZXNbMF0pOwogICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAxKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHBhcmVudCA9IGZvcm1Ob2RlWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBuYW1lID0gZm9ybU5vZGVbJG5vZGVOYW1lXTsKICAgIGNvbnN0IHBvcyA9IHBhcmVudFskaW5kZXhPZl0oZm9ybU5vZGUpOwogICAgZm9yIChsZXQgaSA9IDEsIGlpID0gbWF0Y2hlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlc1tpXTsKICAgICAgY29uc3QgY2xvbmUgPSBiYXNlQ2xvbmVbJGNsb25lXSgpOwogICAgICBwYXJlbnRbbmFtZV0ucHVzaChjbG9uZSk7CiAgICAgIHBhcmVudFskaW5zZXJ0QXRdKHBvcyArIGksIGNsb25lKTsKICAgICAgdGhpcy5fYmluZFZhbHVlKGNsb25lLCBtYXRjaCwgcGljdHVyZSk7CiAgICAgIHRoaXMuX3NldFByb3BlcnRpZXMoY2xvbmUsIG1hdGNoKTsKICAgICAgdGhpcy5fYmluZEl0ZW1zKGNsb25lLCBtYXRjaCk7CiAgICB9CiAgfQogIF9jcmVhdGVPY2N1cnJlbmNlcyhmb3JtTm9kZSkgewogICAgaWYgKCF0aGlzLmVtcHR5TWVyZ2UpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgewogICAgICBvY2N1cgogICAgfSA9IGZvcm1Ob2RlOwogICAgaWYgKCFvY2N1ciB8fCBvY2N1ci5pbml0aWFsIDw9IDEpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGFyZW50ID0gZm9ybU5vZGVbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IG5hbWUgPSBmb3JtTm9kZVskbm9kZU5hbWVdOwogICAgaWYgKCEocGFyZW50W25hbWVdIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBjdXJyZW50TnVtYmVyOwogICAgaWYgKGZvcm1Ob2RlLm5hbWUpIHsKICAgICAgY3VycmVudE51bWJlciA9IHBhcmVudFtuYW1lXS5jaGlsZHJlbi5maWx0ZXIoZSA9PiBlLm5hbWUgPT09IGZvcm1Ob2RlLm5hbWUpLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnROdW1iZXIgPSBwYXJlbnRbbmFtZV0uY2hpbGRyZW4ubGVuZ3RoOwogICAgfQogICAgY29uc3QgcG9zID0gcGFyZW50WyRpbmRleE9mXShmb3JtTm9kZSkgKyAxOwogICAgY29uc3QgaWkgPSBvY2N1ci5pbml0aWFsIC0gY3VycmVudE51bWJlcjsKICAgIGlmIChpaSkgewogICAgICBjb25zdCBub2RlQ2xvbmUgPSBmb3JtTm9kZVskY2xvbmVdKCk7CiAgICAgIG5vZGVDbG9uZVskcmVtb3ZlQ2hpbGRdKG5vZGVDbG9uZS5vY2N1cik7CiAgICAgIG5vZGVDbG9uZS5vY2N1ciA9IG51bGw7CiAgICAgIHBhcmVudFtuYW1lXS5wdXNoKG5vZGVDbG9uZSk7CiAgICAgIHBhcmVudFskaW5zZXJ0QXRdKHBvcywgbm9kZUNsb25lKTsKICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgY2xvbmUgPSBub2RlQ2xvbmVbJGNsb25lXSgpOwogICAgICAgIHBhcmVudFtuYW1lXS5wdXNoKGNsb25lKTsKICAgICAgICBwYXJlbnRbJGluc2VydEF0XShwb3MgKyBpLCBjbG9uZSk7CiAgICAgIH0KICAgIH0KICB9CiAgX2dldE9jY3VySW5mbyhmb3JtTm9kZSkgewogICAgY29uc3QgewogICAgICBuYW1lLAogICAgICBvY2N1cgogICAgfSA9IGZvcm1Ob2RlOwogICAgaWYgKCFvY2N1ciB8fCAhbmFtZSkgewogICAgICByZXR1cm4gWzEsIDFdOwogICAgfQogICAgY29uc3QgbWF4ID0gb2NjdXIubWF4ID09PSAtMSA/IEluZmluaXR5IDogb2NjdXIubWF4OwogICAgcmV0dXJuIFtvY2N1ci5taW4sIG1heF07CiAgfQogIF9zZXRBbmRCaW5kKGZvcm1Ob2RlLCBkYXRhTm9kZSkgewogICAgdGhpcy5fc2V0UHJvcGVydGllcyhmb3JtTm9kZSwgZGF0YU5vZGUpOwogICAgdGhpcy5fYmluZEl0ZW1zKGZvcm1Ob2RlLCBkYXRhTm9kZSk7CiAgICB0aGlzLl9iaW5kRWxlbWVudChmb3JtTm9kZSwgZGF0YU5vZGUpOwogIH0KICBfYmluZEVsZW1lbnQoZm9ybU5vZGUsIGRhdGFOb2RlKSB7CiAgICBjb25zdCB1c2VsZXNzTm9kZXMgPSBbXTsKICAgIHRoaXMuX2NyZWF0ZU9jY3VycmVuY2VzKGZvcm1Ob2RlKTsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZm9ybU5vZGVbJGdldENoaWxkcmVuXSgpKSB7CiAgICAgIGlmIChjaGlsZFskZGF0YV0pIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAodGhpcy5fbWVyZ2VNb2RlID09PSB1bmRlZmluZWQgJiYgY2hpbGRbJG5vZGVOYW1lXSA9PT0gInN1YmZvcm0iKSB7CiAgICAgICAgdGhpcy5fbWVyZ2VNb2RlID0gY2hpbGQubWVyZ2VNb2RlID09PSAiY29uc3VtZURhdGEiOwogICAgICAgIGNvbnN0IGRhdGFDaGlsZHJlbiA9IGRhdGFOb2RlWyRnZXRDaGlsZHJlbl0oKTsKICAgICAgICBpZiAoZGF0YUNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMuX2JpbmRPY2N1cnJlbmNlcyhjaGlsZCwgW2RhdGFDaGlsZHJlblswXV0sIG51bGwpOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbXB0eU1lcmdlKSB7CiAgICAgICAgICBjb25zdCBuc0lkID0gZGF0YU5vZGVbJG5hbWVzcGFjZUlkXSA9PT0gYmluZF9OU19EQVRBU0VUUyA/IC0xIDogZGF0YU5vZGVbJG5hbWVzcGFjZUlkXTsKICAgICAgICAgIGNvbnN0IGRhdGFDaGlsZCA9IGNoaWxkWyRkYXRhXSA9IG5ldyBYbWxPYmplY3QobnNJZCwgY2hpbGQubmFtZSB8fCAicm9vdCIpOwogICAgICAgICAgZGF0YU5vZGVbJGFwcGVuZENoaWxkXShkYXRhQ2hpbGQpOwogICAgICAgICAgdGhpcy5fYmluZEVsZW1lbnQoY2hpbGQsIGRhdGFDaGlsZCk7CiAgICAgICAgfQogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghY2hpbGRbJGlzQmluZGFibGVdKCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgZ2xvYmFsID0gZmFsc2U7CiAgICAgIGxldCBwaWN0dXJlID0gbnVsbDsKICAgICAgbGV0IHJlZiA9IG51bGw7CiAgICAgIGxldCBtYXRjaCA9IG51bGw7CiAgICAgIGlmIChjaGlsZC5iaW5kKSB7CiAgICAgICAgc3dpdGNoIChjaGlsZC5iaW5kLm1hdGNoKSB7CiAgICAgICAgICBjYXNlICJub25lIjoKICAgICAgICAgICAgdGhpcy5fc2V0QW5kQmluZChjaGlsZCwgZGF0YU5vZGUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGNhc2UgImdsb2JhbCI6CiAgICAgICAgICAgIGdsb2JhbCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiZGF0YVJlZiI6CiAgICAgICAgICAgIGlmICghY2hpbGQuYmluZC5yZWYpIHsKICAgICAgICAgICAgICB3YXJuKGBYRkEgLSByZWYgaXMgZW1wdHkgaW4gbm9kZSAke2NoaWxkWyRub2RlTmFtZV19LmApOwogICAgICAgICAgICAgIHRoaXMuX3NldEFuZEJpbmQoY2hpbGQsIGRhdGFOb2RlKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWYgPSBjaGlsZC5iaW5kLnJlZjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGNoaWxkLmJpbmQucGljdHVyZSkgewogICAgICAgICAgcGljdHVyZSA9IGNoaWxkLmJpbmQucGljdHVyZVskY29udGVudF07CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB0aGlzLl9nZXRPY2N1ckluZm8oY2hpbGQpOwogICAgICBpZiAocmVmKSB7CiAgICAgICAgbWF0Y2ggPSBzZWFyY2hOb2RlKHRoaXMucm9vdCwgZGF0YU5vZGUsIHJlZiwgdHJ1ZSwgZmFsc2UpOwogICAgICAgIGlmIChtYXRjaCA9PT0gbnVsbCkgewogICAgICAgICAgbWF0Y2ggPSBjcmVhdGVEYXRhTm9kZSh0aGlzLmRhdGEsIGRhdGFOb2RlLCByZWYpOwogICAgICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLl9pc0NvbnN1bWVEYXRhKCkpIHsKICAgICAgICAgICAgbWF0Y2hbJGNvbnN1bWVkXSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9zZXRBbmRCaW5kKGNoaWxkLCBtYXRjaCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuX2lzQ29uc3VtZURhdGEoKSkgewogICAgICAgICAgICBtYXRjaCA9IG1hdGNoLmZpbHRlcihub2RlID0+ICFub2RlWyRjb25zdW1lZF0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IG1heCkgewogICAgICAgICAgICBtYXRjaCA9IG1hdGNoLnNsaWNlKDAsIG1heCk7CiAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBtYXRjaCA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWF0Y2ggJiYgdGhpcy5faXNDb25zdW1lRGF0YSgpKSB7CiAgICAgICAgICAgIG1hdGNoLmZvckVhY2gobm9kZSA9PiB7CiAgICAgICAgICAgICAgbm9kZVskY29uc3VtZWRdID0gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICghY2hpbGQubmFtZSkgewogICAgICAgICAgdGhpcy5fc2V0QW5kQmluZChjaGlsZCwgZGF0YU5vZGUpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9pc0NvbnN1bWVEYXRhKCkpIHsKICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBbXTsKICAgICAgICAgIHdoaWxlIChtYXRjaGVzLmxlbmd0aCA8IG1heCkgewogICAgICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuX2ZpbmREYXRhQnlOYW1lVG9Db25zdW1lKGNoaWxkLm5hbWUsIGNoaWxkWyRoYXNTZXR0YWJsZVZhbHVlXSgpLCBkYXRhTm9kZSwgZ2xvYmFsKTsKICAgICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvdW5kWyRjb25zdW1lZF0gPSB0cnVlOwogICAgICAgICAgICBtYXRjaGVzLnB1c2goZm91bmQpOwogICAgICAgICAgfQogICAgICAgICAgbWF0Y2ggPSBtYXRjaGVzLmxlbmd0aCA+IDAgPyBtYXRjaGVzIDogbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWF0Y2ggPSBkYXRhTm9kZVskZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXRdKGNoaWxkLm5hbWUsIGZhbHNlLCB0aGlzLmVtcHR5TWVyZ2UpLm5leHQoKS52YWx1ZTsKICAgICAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAgICAgaWYgKG1pbiA9PT0gMCkgewogICAgICAgICAgICAgIHVzZWxlc3NOb2Rlcy5wdXNoKGNoaWxkKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBuc0lkID0gZGF0YU5vZGVbJG5hbWVzcGFjZUlkXSA9PT0gYmluZF9OU19EQVRBU0VUUyA/IC0xIDogZGF0YU5vZGVbJG5hbWVzcGFjZUlkXTsKICAgICAgICAgICAgbWF0Y2ggPSBjaGlsZFskZGF0YV0gPSBuZXcgWG1sT2JqZWN0KG5zSWQsIGNoaWxkLm5hbWUpOwogICAgICAgICAgICBpZiAodGhpcy5lbXB0eU1lcmdlKSB7CiAgICAgICAgICAgICAgbWF0Y2hbJGNvbnN1bWVkXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YU5vZGVbJGFwcGVuZENoaWxkXShtYXRjaCk7CiAgICAgICAgICAgIHRoaXMuX3NldEFuZEJpbmQoY2hpbGQsIG1hdGNoKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5lbXB0eU1lcmdlKSB7CiAgICAgICAgICAgIG1hdGNoWyRjb25zdW1lZF0gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgbWF0Y2ggPSBbbWF0Y2hdOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobWF0Y2gpIHsKICAgICAgICB0aGlzLl9iaW5kT2NjdXJyZW5jZXMoY2hpbGQsIG1hdGNoLCBwaWN0dXJlKTsKICAgICAgfSBlbHNlIGlmIChtaW4gPiAwKSB7CiAgICAgICAgdGhpcy5fc2V0QW5kQmluZChjaGlsZCwgZGF0YU5vZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHVzZWxlc3NOb2Rlcy5wdXNoKGNoaWxkKTsKICAgICAgfQogICAgfQogICAgdXNlbGVzc05vZGVzLmZvckVhY2gobm9kZSA9PiBub2RlWyRnZXRQYXJlbnRdKClbJHJlbW92ZUNoaWxkXShub2RlKSk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvZGF0YS5qcwoKY2xhc3MgRGF0YUhhbmRsZXIgewogIGNvbnN0cnVjdG9yKHJvb3QsIGRhdGEpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLmRhdGFzZXQgPSByb290LmRhdGFzZXRzIHx8IG51bGw7CiAgfQogIHNlcmlhbGl6ZShzdG9yYWdlKSB7CiAgICBjb25zdCBzdGFjayA9IFtbLTEsIHRoaXMuZGF0YVskZ2V0Q2hpbGRyZW5dKCldXTsKICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGxhc3QgPSBzdGFjay5hdCgtMSk7CiAgICAgIGNvbnN0IFtpLCBjaGlsZHJlbl0gPSBsYXN0OwogICAgICBpZiAoaSArIDEgPT09IGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bKytsYXN0WzBdXTsKICAgICAgY29uc3Qgc3RvcmFnZUVudHJ5ID0gc3RvcmFnZS5nZXQoY2hpbGRbJHVpZF0pOwogICAgICBpZiAoc3RvcmFnZUVudHJ5KSB7CiAgICAgICAgY2hpbGRbJHNldFZhbHVlXShzdG9yYWdlRW50cnkpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjaGlsZFskZ2V0QXR0cmlidXRlc10oKTsKICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGF0dHJpYnV0ZXMudmFsdWVzKCkpIHsKICAgICAgICAgIGNvbnN0IGVudHJ5ID0gc3RvcmFnZS5nZXQodmFsdWVbJHVpZF0pOwogICAgICAgICAgaWYgKGVudHJ5KSB7CiAgICAgICAgICAgIHZhbHVlWyRzZXRWYWx1ZV0oZW50cnkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3Qgbm9kZXMgPSBjaGlsZFskZ2V0Q2hpbGRyZW5dKCk7CiAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgc3RhY2sucHVzaChbLTEsIG5vZGVzXSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGJ1ZiA9IFtgPHhmYTpkYXRhc2V0cyB4bWxuczp4ZmE9Imh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyI+YF07CiAgICBpZiAodGhpcy5kYXRhc2V0KSB7CiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5kYXRhc2V0WyRnZXRDaGlsZHJlbl0oKSkgewogICAgICAgIGlmIChjaGlsZFskbm9kZU5hbWVdICE9PSAiZGF0YSIpIHsKICAgICAgICAgIGNoaWxkWyR0b1N0cmluZ10oYnVmKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZGF0YVskdG9TdHJpbmddKGJ1Zik7CiAgICBidWYucHVzaCgiPC94ZmE6ZGF0YXNldHM+Iik7CiAgICByZXR1cm4gYnVmLmpvaW4oIiIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2NvbmZpZy5qcwoKCgoKCmNvbnN0IENPTkZJR19OU19JRCA9IE5hbWVzcGFjZUlkcy5jb25maWcuaWQ7CmNsYXNzIEFjcm9iYXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFjcm9iYXQiLCB0cnVlKTsKICAgIHRoaXMuYWNyb2JhdDcgPSBudWxsOwogICAgdGhpcy5hdXRvU2F2ZSA9IG51bGw7CiAgICB0aGlzLmNvbW1vbiA9IG51bGw7CiAgICB0aGlzLnZhbGlkYXRlID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMgPSBudWxsOwogICAgdGhpcy5zdWJtaXRVcmwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgQWNyb2JhdDcgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFjcm9iYXQ3IiwgdHJ1ZSk7CiAgICB0aGlzLmR5bmFtaWNSZW5kZXIgPSBudWxsOwogIH0KfQpjbGFzcyBBREJFX0pTQ29uc29sZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiQURCRV9KU0NvbnNvbGUiLCBbImRlbGVnYXRlIiwgIkVuYWJsZSIsICJEaXNhYmxlIl0pOwogIH0KfQpjbGFzcyBBREJFX0pTRGVidWdnZXIgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIkFEQkVfSlNEZWJ1Z2dlciIsIFsiZGVsZWdhdGUiLCAiRW5hYmxlIiwgIkRpc2FibGUiXSk7CiAgfQp9CmNsYXNzIEFkZFNpbGVudFByaW50IGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFkZFNpbGVudFByaW50Iik7CiAgfQp9CmNsYXNzIEFkZFZpZXdlclByZWZlcmVuY2VzIGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFkZFZpZXdlclByZWZlcmVuY2VzIik7CiAgfQp9CmNsYXNzIEFkanVzdERhdGEgZXh0ZW5kcyBPcHRpb24xMCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYWRqdXN0RGF0YSIpOwogIH0KfQpjbGFzcyBBZG9iZUV4dGVuc2lvbkxldmVsIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYWRvYmVFeHRlbnNpb25MZXZlbCIsIDAsIG4gPT4gbiA+PSAxICYmIG4gPD0gOCk7CiAgfQp9CmNsYXNzIEFnZW50IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhZ2VudCIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lID8gYXR0cmlidXRlcy5uYW1lLnRyaW0oKSA6ICIiOwogICAgdGhpcy5jb21tb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgQWx3YXlzRW1iZWQgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhbHdheXNFbWJlZCIpOwogIH0KfQpjbGFzcyBBbWQgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFtZCIpOwogIH0KfQpjbGFzcyBjb25maWdfQXJlYSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYXJlYSIpOwogICAgdGhpcy5sZXZlbCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmxldmVsLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiBuID0+IG4gPj0gMSAmJiBuIDw9IDMKICAgIH0pOwogICAgdGhpcy5uYW1lID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubmFtZSwgWyIiLCAiYmFyY29kZSIsICJjb3JlaW5pdCIsICJkZXZpY2VEcml2ZXIiLCAiZm9udCIsICJnZW5lcmFsIiwgImxheW91dCIsICJtZXJnZSIsICJzY3JpcHQiLCAic2lnbmF0dXJlIiwgInNvdXJjZVNldCIsICJ0ZW1wbGF0ZUNhY2hlIl0pOwogIH0KfQpjbGFzcyBBdHRyaWJ1dGVzIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhdHRyaWJ1dGVzIiwgWyJwcmVzZXJ2ZSIsICJkZWxlZ2F0ZSIsICJpZ25vcmUiXSk7CiAgfQp9CmNsYXNzIEF1dG9TYXZlIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhdXRvU2F2ZSIsIFsiZGlzYWJsZWQiLCAiZW5hYmxlZCJdKTsKICB9Cn0KY2xhc3MgQmFzZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYmFzZSIpOwogIH0KfQpjbGFzcyBCYXRjaE91dHB1dCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYmF0Y2hPdXRwdXQiKTsKICAgIHRoaXMuZm9ybWF0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuZm9ybWF0LCBbIm5vbmUiLCAiY29uY2F0IiwgInppcCIsICJ6aXBDb21wcmVzcyJdKTsKICB9Cn0KY2xhc3MgQmVoYXZpb3JPdmVycmlkZSBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImJlaGF2aW9yT3ZlcnJpZGUiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IG5ldyBNYXAodGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoeCA9PiB4LmluY2x1ZGVzKCI6IikpLm1hcCh4ID0+IHguc3BsaXQoIjoiLCAyKSkpOwogIH0KfQpjbGFzcyBDYWNoZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY2FjaGUiLCB0cnVlKTsKICAgIHRoaXMudGVtcGxhdGVDYWNoZSA9IG51bGw7CiAgfQp9CmNsYXNzIENoYW5nZSBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjaGFuZ2UiKTsKICB9Cn0KY2xhc3MgQ29tbW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjb21tb24iLCB0cnVlKTsKICAgIHRoaXMuZGF0YSA9IG51bGw7CiAgICB0aGlzLmxvY2FsZSA9IG51bGw7CiAgICB0aGlzLmxvY2FsZVNldCA9IG51bGw7CiAgICB0aGlzLm1lc3NhZ2luZyA9IG51bGw7CiAgICB0aGlzLnN1cHByZXNzQmFubmVyID0gbnVsbDsKICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnaW5nID0gbnVsbDsKICAgIHRoaXMudmVyc2lvbkNvbnRyb2wgPSBudWxsOwogICAgdGhpcy5sb2cgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgQ29tcHJlc3MgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNvbXByZXNzIik7CiAgICB0aGlzLnNjb3BlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuc2NvcGUsIFsiaW1hZ2VPbmx5IiwgImRvY3VtZW50Il0pOwogIH0KfQpjbGFzcyBDb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29tcHJlc3NMb2dpY2FsU3RydWN0dXJlIik7CiAgfQp9CmNsYXNzIENvbXByZXNzT2JqZWN0U3RyZWFtIGV4dGVuZHMgT3B0aW9uMTAgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNvbXByZXNzT2JqZWN0U3RyZWFtIik7CiAgfQp9CmNsYXNzIENvbXByZXNzaW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjb21wcmVzc2lvbiIsIHRydWUpOwogICAgdGhpcy5jb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUgPSBudWxsOwogICAgdGhpcy5jb21wcmVzc09iamVjdFN0cmVhbSA9IG51bGw7CiAgICB0aGlzLmxldmVsID0gbnVsbDsKICAgIHRoaXMudHlwZSA9IG51bGw7CiAgfQp9CmNsYXNzIENvbmZpZyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29uZmlnIiwgdHJ1ZSk7CiAgICB0aGlzLmFjcm9iYXQgPSBudWxsOwogICAgdGhpcy5wcmVzZW50ID0gbnVsbDsKICAgIHRoaXMudHJhY2UgPSBudWxsOwogICAgdGhpcy5hZ2VudCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBDb25mb3JtYW5jZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29uZm9ybWFuY2UiLCBbIkEiLCAiQiJdKTsKICB9Cn0KY2xhc3MgQ29udGVudENvcHkgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29udGVudENvcHkiKTsKICB9Cn0KY2xhc3MgQ29waWVzIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29waWVzIiwgMSwgbiA9PiBuID49IDEpOwogIH0KfQpjbGFzcyBDcmVhdG9yIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjcmVhdG9yIik7CiAgfQp9CmNsYXNzIEN1cnJlbnRQYWdlIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY3VycmVudFBhZ2UiLCAwLCBuID0+IG4gPj0gMCk7CiAgfQp9CmNsYXNzIERhdGEgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRhdGEiLCB0cnVlKTsKICAgIHRoaXMuYWRqdXN0RGF0YSA9IG51bGw7CiAgICB0aGlzLmF0dHJpYnV0ZXMgPSBudWxsOwogICAgdGhpcy5pbmNyZW1lbnRhbExvYWQgPSBudWxsOwogICAgdGhpcy5vdXRwdXRYU0wgPSBudWxsOwogICAgdGhpcy5yYW5nZSA9IG51bGw7CiAgICB0aGlzLnJlY29yZCA9IG51bGw7CiAgICB0aGlzLnN0YXJ0Tm9kZSA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgICB0aGlzLndpbmRvdyA9IG51bGw7CiAgICB0aGlzLnhzbCA9IG51bGw7CiAgICB0aGlzLmV4Y2x1ZGVOUyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50cmFuc2Zvcm0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRGVidWcgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRlYnVnIiwgdHJ1ZSk7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIERlZmF1bHRUeXBlZmFjZSBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRlZmF1bHRUeXBlZmFjZSIpOwogICAgdGhpcy53cml0aW5nU2NyaXB0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMud3JpdGluZ1NjcmlwdCwgWyIqIiwgIkFyYWJpYyIsICJDeXJpbGxpYyIsICJFYXN0RXVyb3BlYW5Sb21hbiIsICJHcmVlayIsICJIZWJyZXciLCAiSmFwYW5lc2UiLCAiS29yZWFuIiwgIlJvbWFuIiwgIlNpbXBsaWZpZWRDaGluZXNlIiwgIlRoYWkiLCAiVHJhZGl0aW9uYWxDaGluZXNlIiwgIlZpZXRuYW1lc2UiXSk7CiAgfQp9CmNsYXNzIERlc3RpbmF0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJkZXN0aW5hdGlvbiIsIFsicGRmIiwgInBjbCIsICJwcyIsICJ3ZWJDbGllbnQiLCAienBsIl0pOwogIH0KfQpjbGFzcyBEb2N1bWVudEFzc2VtYmx5IGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRvY3VtZW50QXNzZW1ibHkiKTsKICB9Cn0KY2xhc3MgRHJpdmVyIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJkcml2ZXIiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSA/IGF0dHJpYnV0ZXMubmFtZS50cmltKCkgOiAiIjsKICAgIHRoaXMuZm9udEluZm8gPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBEdXBsZXhPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImR1cGxleE9wdGlvbiIsIFsic2ltcGxleCIsICJkdXBsZXhGbGlwTG9uZ0VkZ2UiLCAiZHVwbGV4RmxpcFNob3J0RWRnZSJdKTsKICB9Cn0KY2xhc3MgRHluYW1pY1JlbmRlciBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZHluYW1pY1JlbmRlciIsIFsiZm9yYmlkZGVuIiwgInJlcXVpcmVkIl0pOwogIH0KfQpjbGFzcyBFbWJlZCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbWJlZCIpOwogIH0KfQpjbGFzcyBjb25maWdfRW5jcnlwdCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbmNyeXB0Iik7CiAgfQp9CmNsYXNzIGNvbmZpZ19FbmNyeXB0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbmNyeXB0aW9uIiwgdHJ1ZSk7CiAgICB0aGlzLmVuY3J5cHQgPSBudWxsOwogICAgdGhpcy5lbmNyeXB0aW9uTGV2ZWwgPSBudWxsOwogICAgdGhpcy5wZXJtaXNzaW9ucyA9IG51bGw7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb25MZXZlbCBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZW5jcnlwdGlvbkxldmVsIiwgWyI0MGJpdCIsICIxMjhiaXQiXSk7CiAgfQp9CmNsYXNzIEVuZm9yY2UgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImVuZm9yY2UiKTsKICB9Cn0KY2xhc3MgRXF1YXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlcXVhdGUiKTsKICAgIHRoaXMuZm9yY2UgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5mb3JjZSwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID09PSAwCiAgICB9KTsKICAgIHRoaXMuZnJvbSA9IGF0dHJpYnV0ZXMuZnJvbSB8fCAiIjsKICAgIHRoaXMudG8gPSBhdHRyaWJ1dGVzLnRvIHx8ICIiOwogIH0KfQpjbGFzcyBFcXVhdGVSYW5nZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZXF1YXRlUmFuZ2UiKTsKICAgIHRoaXMuZnJvbSA9IGF0dHJpYnV0ZXMuZnJvbSB8fCAiIjsKICAgIHRoaXMudG8gPSBhdHRyaWJ1dGVzLnRvIHx8ICIiOwogICAgdGhpcy5fdW5pY29kZVJhbmdlID0gYXR0cmlidXRlcy51bmljb2RlUmFuZ2UgfHwgIiI7CiAgfQogIGdldCB1bmljb2RlUmFuZ2UoKSB7CiAgICBjb25zdCByYW5nZXMgPSBbXTsKICAgIGNvbnN0IHVuaWNvZGVSZWdleCA9IC9VXCsoWzAtOWEtZkEtRl0rKS87CiAgICBjb25zdCB1bmljb2RlUmFuZ2UgPSB0aGlzLl91bmljb2RlUmFuZ2U7CiAgICBmb3IgKGxldCByYW5nZSBvZiB1bmljb2RlUmFuZ2Uuc3BsaXQoIiwiKS5tYXAoeCA9PiB4LnRyaW0oKSkuZmlsdGVyKHggPT4gISF4KSkgewogICAgICByYW5nZSA9IHJhbmdlLnNwbGl0KCItIiwgMikubWFwKHggPT4gewogICAgICAgIGNvbnN0IGZvdW5kID0geC5tYXRjaCh1bmljb2RlUmVnZXgpOwogICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyc2VJbnQoZm91bmRbMV0sIDE2KTsKICAgICAgfSk7CiAgICAgIGlmIChyYW5nZS5sZW5ndGggPT09IDEpIHsKICAgICAgICByYW5nZS5wdXNoKHJhbmdlWzBdKTsKICAgICAgfQogICAgICByYW5nZXMucHVzaChyYW5nZSk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ1bmljb2RlUmFuZ2UiLCByYW5nZXMpOwogIH0KfQpjbGFzcyBFeGNsdWRlIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZXhjbHVkZSIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoeCA9PiB4ICYmIFsiY2FsY3VsYXRlIiwgImNsb3NlIiwgImVudGVyIiwgImV4aXQiLCAiaW5pdGlhbGl6ZSIsICJyZWFkeSIsICJ2YWxpZGF0ZSJdLmluY2x1ZGVzKHgpKTsKICB9Cn0KY2xhc3MgRXhjbHVkZU5TIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJleGNsdWRlTlMiKTsKICB9Cn0KY2xhc3MgRmxpcExhYmVsIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmbGlwTGFiZWwiLCBbInVzZVByaW50ZXJTZXR0aW5nIiwgIm9uIiwgIm9mZiJdKTsKICB9Cn0KY2xhc3MgY29uZmlnX0ZvbnRJbmZvIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmb250SW5mbyIsIHRydWUpOwogICAgdGhpcy5lbWJlZCA9IG51bGw7CiAgICB0aGlzLm1hcCA9IG51bGw7CiAgICB0aGlzLnN1YnNldEJlbG93ID0gbnVsbDsKICAgIHRoaXMuYWx3YXlzRW1iZWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGVmYXVsdFR5cGVmYWNlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm5ldmVyRW1iZWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRm9ybUZpZWxkRmlsbGluZyBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmb3JtRmllbGRGaWxsaW5nIik7CiAgfQp9CmNsYXNzIEdyb3VwUGFyZW50IGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJncm91cFBhcmVudCIpOwogIH0KfQpjbGFzcyBJZkVtcHR5IGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpZkVtcHR5IiwgWyJkYXRhVmFsdWUiLCAiZGF0YUdyb3VwIiwgImlnbm9yZSIsICJyZW1vdmUiXSk7CiAgfQp9CmNsYXNzIEluY2x1ZGVYRFBDb250ZW50IGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpbmNsdWRlWERQQ29udGVudCIpOwogIH0KfQpjbGFzcyBJbmNyZW1lbnRhbExvYWQgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImluY3JlbWVudGFsTG9hZCIsIFsibm9uZSIsICJmb3J3YXJkT25seSJdKTsKICB9Cn0KY2xhc3MgSW5jcmVtZW50YWxNZXJnZSBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpbmNyZW1lbnRhbE1lcmdlIik7CiAgfQp9CmNsYXNzIEludGVyYWN0aXZlIGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImludGVyYWN0aXZlIik7CiAgfQp9CmNsYXNzIEpvZyBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiam9nIiwgWyJ1c2VQcmludGVyU2V0dGluZyIsICJub25lIiwgInBhZ2VTZXQiXSk7CiAgfQp9CmNsYXNzIExhYmVsUHJpbnRlciBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibGFiZWxQcmludGVyIiwgdHJ1ZSk7CiAgICB0aGlzLm5hbWUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5uYW1lLCBbInpwbCIsICJkcGwiLCAiaXBsIiwgInRjcGwiXSk7CiAgICB0aGlzLmJhdGNoT3V0cHV0ID0gbnVsbDsKICAgIHRoaXMuZmxpcExhYmVsID0gbnVsbDsKICAgIHRoaXMuZm9udEluZm8gPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBMYXlvdXQgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImxheW91dCIsIFsicGFnaW5hdGUiLCAicGFuZWwiXSk7CiAgfQp9CmNsYXNzIExldmVsIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibGV2ZWwiLCAwLCBuID0+IG4gPiAwKTsKICB9Cn0KY2xhc3MgTGluZWFyaXplZCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJsaW5lYXJpemVkIik7CiAgfQp9CmNsYXNzIExvY2FsZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9jYWxlIik7CiAgfQp9CmNsYXNzIExvY2FsZVNldCBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9jYWxlU2V0Iik7CiAgfQp9CmNsYXNzIExvZyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9nIiwgdHJ1ZSk7CiAgICB0aGlzLm1vZGUgPSBudWxsOwogICAgdGhpcy50aHJlc2hvbGQgPSBudWxsOwogICAgdGhpcy50byA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIE1hcEVsZW1lbnQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIm1hcCIsIHRydWUpOwogICAgdGhpcy5lcXVhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXF1YXRlUmFuZ2UgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgTWVkaXVtSW5mbyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibWVkaXVtSW5mbyIsIHRydWUpOwogICAgdGhpcy5tYXAgPSBudWxsOwogIH0KfQpjbGFzcyBjb25maWdfTWVzc2FnZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibWVzc2FnZSIsIHRydWUpOwogICAgdGhpcy5tc2dJZCA9IG51bGw7CiAgICB0aGlzLnNldmVyaXR5ID0gbnVsbDsKICB9Cn0KY2xhc3MgTWVzc2FnaW5nIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJtZXNzYWdpbmciLCB0cnVlKTsKICAgIHRoaXMubWVzc2FnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBNb2RlIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJtb2RlIiwgWyJhcHBlbmQiLCAib3ZlcndyaXRlIl0pOwogIH0KfQpjbGFzcyBNb2RpZnlBbm5vdHMgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibW9kaWZ5QW5ub3RzIik7CiAgfQp9CmNsYXNzIE1zZ0lkIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibXNnSWQiLCAxLCBuID0+IG4gPj0gMSk7CiAgfQp9CmNsYXNzIE5hbWVBdHRyIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJuYW1lQXR0ciIpOwogIH0KfQpjbGFzcyBOZXZlckVtYmVkIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibmV2ZXJFbWJlZCIpOwogIH0KfQpjbGFzcyBOdW1iZXJPZkNvcGllcyBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIm51bWJlck9mQ29waWVzIiwgbnVsbCwgbiA9PiBuID49IDIgJiYgbiA8PSA1KTsKICB9Cn0KY2xhc3MgT3BlbkFjdGlvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3BlbkFjdGlvbiIsIHRydWUpOwogICAgdGhpcy5kZXN0aW5hdGlvbiA9IG51bGw7CiAgfQp9CmNsYXNzIE91dHB1dCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3V0cHV0IiwgdHJ1ZSk7CiAgICB0aGlzLnRvID0gbnVsbDsKICAgIHRoaXMudHlwZSA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIE91dHB1dEJpbiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3V0cHV0QmluIik7CiAgfQp9CmNsYXNzIE91dHB1dFhTTCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3V0cHV0WFNMIiwgdHJ1ZSk7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIE92ZXJwcmludCBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3ZlcnByaW50IiwgWyJub25lIiwgImJvdGgiLCAiZHJhdyIsICJmaWVsZCJdKTsKICB9Cn0KY2xhc3MgUGFja2V0cyBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGFja2V0cyIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGlmICh0aGlzWyRjb250ZW50XSA9PT0gIioiKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXNbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoeCA9PiBbImNvbmZpZyIsICJkYXRhc2V0cyIsICJ0ZW1wbGF0ZSIsICJ4ZmRmIiwgInhzbHQiXS5pbmNsdWRlcyh4KSk7CiAgfQp9CmNsYXNzIFBhZ2VPZmZzZXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhZ2VPZmZzZXQiKTsKICAgIHRoaXMueCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLngsCiAgICAgIGRlZmF1bHRWYWx1ZTogInVzZVhEQ1NldHRpbmciLAogICAgICB2YWxpZGF0ZTogbiA9PiB0cnVlCiAgICB9KTsKICAgIHRoaXMueSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnksCiAgICAgIGRlZmF1bHRWYWx1ZTogInVzZVhEQ1NldHRpbmciLAogICAgICB2YWxpZGF0ZTogbiA9PiB0cnVlCiAgICB9KTsKICB9Cn0KY2xhc3MgUGFnZVJhbmdlIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwYWdlUmFuZ2UiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBjb25zdCBudW1iZXJzID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5tYXAoeCA9PiBwYXJzZUludCh4LCAxMCkpOwogICAgY29uc3QgcmFuZ2VzID0gW107CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBudW1iZXJzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgcmFuZ2VzLnB1c2gobnVtYmVycy5zbGljZShpLCBpICsgMikpOwogICAgfQogICAgdGhpc1skY29udGVudF0gPSByYW5nZXM7CiAgfQp9CmNsYXNzIFBhZ2luYXRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhZ2luYXRpb24iLCBbInNpbXBsZXgiLCAiZHVwbGV4U2hvcnRFZGdlIiwgImR1cGxleExvbmdFZGdlIl0pOwogIH0KfQpjbGFzcyBQYWdpbmF0aW9uT3ZlcnJpZGUgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhZ2luYXRpb25PdmVycmlkZSIsIFsibm9uZSIsICJmb3JjZUR1cGxleCIsICJmb3JjZUR1cGxleExvbmdFZGdlIiwgImZvcmNlRHVwbGV4U2hvcnRFZGdlIiwgImZvcmNlU2ltcGxleCJdKTsKICB9Cn0KY2xhc3MgUGFydCBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhcnQiLCAxLCBuID0+IGZhbHNlKTsKICB9Cn0KY2xhc3MgUGNsIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwY2wiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMuYmF0Y2hPdXRwdXQgPSBudWxsOwogICAgdGhpcy5mb250SW5mbyA9IG51bGw7CiAgICB0aGlzLmpvZyA9IG51bGw7CiAgICB0aGlzLm1lZGl1bUluZm8gPSBudWxsOwogICAgdGhpcy5vdXRwdXRCaW4gPSBudWxsOwogICAgdGhpcy5wYWdlT2Zmc2V0ID0gbnVsbDsKICAgIHRoaXMuc3RhcGxlID0gbnVsbDsKICAgIHRoaXMueGRjID0gbnVsbDsKICB9Cn0KY2xhc3MgUGRmIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwZGYiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMuYWRvYmVFeHRlbnNpb25MZXZlbCA9IG51bGw7CiAgICB0aGlzLmJhdGNoT3V0cHV0ID0gbnVsbDsKICAgIHRoaXMuY29tcHJlc3Npb24gPSBudWxsOwogICAgdGhpcy5jcmVhdG9yID0gbnVsbDsKICAgIHRoaXMuZW5jcnlwdGlvbiA9IG51bGw7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMuaW50ZXJhY3RpdmUgPSBudWxsOwogICAgdGhpcy5saW5lYXJpemVkID0gbnVsbDsKICAgIHRoaXMub3BlbkFjdGlvbiA9IG51bGw7CiAgICB0aGlzLnBkZmEgPSBudWxsOwogICAgdGhpcy5wcm9kdWNlciA9IG51bGw7CiAgICB0aGlzLnJlbmRlclBvbGljeSA9IG51bGw7CiAgICB0aGlzLnNjcmlwdE1vZGVsID0gbnVsbDsKICAgIHRoaXMuc2lsZW50UHJpbnQgPSBudWxsOwogICAgdGhpcy5zdWJtaXRGb3JtYXQgPSBudWxsOwogICAgdGhpcy50YWdnZWQgPSBudWxsOwogICAgdGhpcy52ZXJzaW9uID0gbnVsbDsKICAgIHRoaXMudmlld2VyUHJlZmVyZW5jZXMgPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBQZGZhIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwZGZhIiwgdHJ1ZSk7CiAgICB0aGlzLmFtZCA9IG51bGw7CiAgICB0aGlzLmNvbmZvcm1hbmNlID0gbnVsbDsKICAgIHRoaXMuaW5jbHVkZVhEUENvbnRlbnQgPSBudWxsOwogICAgdGhpcy5wYXJ0ID0gbnVsbDsKICB9Cn0KY2xhc3MgUGVybWlzc2lvbnMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBlcm1pc3Npb25zIiwgdHJ1ZSk7CiAgICB0aGlzLmFjY2Vzc2libGVDb250ZW50ID0gbnVsbDsKICAgIHRoaXMuY2hhbmdlID0gbnVsbDsKICAgIHRoaXMuY29udGVudENvcHkgPSBudWxsOwogICAgdGhpcy5kb2N1bWVudEFzc2VtYmx5ID0gbnVsbDsKICAgIHRoaXMuZm9ybUZpZWxkRmlsbGluZyA9IG51bGw7CiAgICB0aGlzLm1vZGlmeUFubm90cyA9IG51bGw7CiAgICB0aGlzLnBsYWludGV4dE1ldGFkYXRhID0gbnVsbDsKICAgIHRoaXMucHJpbnQgPSBudWxsOwogICAgdGhpcy5wcmludEhpZ2hRdWFsaXR5ID0gbnVsbDsKICB9Cn0KY2xhc3MgUGlja1RyYXlCeVBERlNpemUgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGlja1RyYXlCeVBERlNpemUiKTsKICB9Cn0KY2xhc3MgY29uZmlnX1BpY3R1cmUgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBpY3R1cmUiKTsKICB9Cn0KY2xhc3MgUGxhaW50ZXh0TWV0YWRhdGEgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGxhaW50ZXh0TWV0YWRhdGEiKTsKICB9Cn0KY2xhc3MgUHJlc2VuY2UgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInByZXNlbmNlIiwgWyJwcmVzZXJ2ZSIsICJkaXNzb2x2ZSIsICJkaXNzb2x2ZVN0cnVjdHVyZSIsICJpZ25vcmUiLCAicmVtb3ZlIl0pOwogIH0KfQpjbGFzcyBQcmVzZW50IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmVzZW50IiwgdHJ1ZSk7CiAgICB0aGlzLmJlaGF2aW9yT3ZlcnJpZGUgPSBudWxsOwogICAgdGhpcy5jYWNoZSA9IG51bGw7CiAgICB0aGlzLmNvbW1vbiA9IG51bGw7CiAgICB0aGlzLmNvcGllcyA9IG51bGw7CiAgICB0aGlzLmRlc3RpbmF0aW9uID0gbnVsbDsKICAgIHRoaXMuaW5jcmVtZW50YWxNZXJnZSA9IG51bGw7CiAgICB0aGlzLmxheW91dCA9IG51bGw7CiAgICB0aGlzLm91dHB1dCA9IG51bGw7CiAgICB0aGlzLm92ZXJwcmludCA9IG51bGw7CiAgICB0aGlzLnBhZ2luYXRpb24gPSBudWxsOwogICAgdGhpcy5wYWdpbmF0aW9uT3ZlcnJpZGUgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogICAgdGhpcy52YWxpZGF0ZSA9IG51bGw7CiAgICB0aGlzLnhkcCA9IG51bGw7CiAgICB0aGlzLmRyaXZlciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5sYWJlbFByaW50ZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGNsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBkZiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJtaXRVcmwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMud2ViQ2xpZW50ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnpwbCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBQcmludCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmludCIpOwogIH0KfQpjbGFzcyBQcmludEhpZ2hRdWFsaXR5IGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInByaW50SGlnaFF1YWxpdHkiKTsKICB9Cn0KY2xhc3MgUHJpbnRTY2FsaW5nIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmludFNjYWxpbmciLCBbImFwcGRlZmF1bHQiLCAibm9TY2FsaW5nIl0pOwogIH0KfQpjbGFzcyBQcmludGVyTmFtZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicHJpbnRlck5hbWUiKTsKICB9Cn0KY2xhc3MgUHJvZHVjZXIgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInByb2R1Y2VyIik7CiAgfQp9CmNsYXNzIFBzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcyIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5iYXRjaE91dHB1dCA9IG51bGw7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMuam9nID0gbnVsbDsKICAgIHRoaXMubWVkaXVtSW5mbyA9IG51bGw7CiAgICB0aGlzLm91dHB1dEJpbiA9IG51bGw7CiAgICB0aGlzLnN0YXBsZSA9IG51bGw7CiAgICB0aGlzLnhkYyA9IG51bGw7CiAgfQp9CmNsYXNzIFJhbmdlIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicmFuZ2UiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IHRoaXNbJGNvbnRlbnRdLnNwbGl0KCIsIiwgMikubWFwKHJhbmdlID0+IHJhbmdlLnNwbGl0KCItIikubWFwKHggPT4gcGFyc2VJbnQoeC50cmltKCksIDEwKSkpLmZpbHRlcihyYW5nZSA9PiByYW5nZS5ldmVyeSh4ID0+ICFpc05hTih4KSkpLm1hcChyYW5nZSA9PiB7CiAgICAgIGlmIChyYW5nZS5sZW5ndGggPT09IDEpIHsKICAgICAgICByYW5nZS5wdXNoKHJhbmdlWzBdKTsKICAgICAgfQogICAgICByZXR1cm4gcmFuZ2U7CiAgICB9KTsKICB9Cn0KY2xhc3MgUmVjb3JkIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicmVjb3JkIik7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICBjb25zdCBuID0gcGFyc2VJbnQodGhpc1skY29udGVudF0sIDEwKTsKICAgIGlmICghaXNOYU4obikgJiYgbiA+PSAwKSB7CiAgICAgIHRoaXNbJGNvbnRlbnRdID0gbjsKICAgIH0KICB9Cn0KY2xhc3MgUmVsZXZhbnQgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJyZWxldmFudCIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKTsKICB9Cn0KY2xhc3MgUmVuYW1lIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicmVuYW1lIik7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICBpZiAodGhpc1skY29udGVudF0udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJ4bWwiKSB8fCBuZXcgUmVnRXhwKCJbXFxwe0x9X11bXFxwe0x9XFxkLl9cXHB7TX0tXSoiLCAidSIpLnRlc3QodGhpc1skY29udGVudF0pKSB7CiAgICAgIHdhcm4oIlhGQSAtIFJlbmFtZTogaW52YWxpZCBYRkEgbmFtZSIpOwogICAgfQogIH0KfQpjbGFzcyBSZW5kZXJQb2xpY3kgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInJlbmRlclBvbGljeSIsIFsic2VydmVyIiwgImNsaWVudCJdKTsKICB9Cn0KY2xhc3MgUnVuU2NyaXB0cyBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicnVuU2NyaXB0cyIsIFsiYm90aCIsICJjbGllbnQiLCAibm9uZSIsICJzZXJ2ZXIiXSk7CiAgfQp9CmNsYXNzIGNvbmZpZ19TY3JpcHQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNjcmlwdCIsIHRydWUpOwogICAgdGhpcy5jdXJyZW50UGFnZSA9IG51bGw7CiAgICB0aGlzLmV4Y2x1ZGUgPSBudWxsOwogICAgdGhpcy5ydW5TY3JpcHRzID0gbnVsbDsKICB9Cn0KY2xhc3MgU2NyaXB0TW9kZWwgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNjcmlwdE1vZGVsIiwgWyJYRkEiLCAibm9uZSJdKTsKICB9Cn0KY2xhc3MgU2V2ZXJpdHkgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNldmVyaXR5IiwgWyJpZ25vcmUiLCAiZXJyb3IiLCAiaW5mb3JtYXRpb24iLCAidHJhY2UiLCAid2FybmluZyJdKTsKICB9Cn0KY2xhc3MgU2lsZW50UHJpbnQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNpbGVudFByaW50IiwgdHJ1ZSk7CiAgICB0aGlzLmFkZFNpbGVudFByaW50ID0gbnVsbDsKICAgIHRoaXMucHJpbnRlck5hbWUgPSBudWxsOwogIH0KfQpjbGFzcyBTdGFwbGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN0YXBsZSIpOwogICAgdGhpcy5tb2RlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubW9kZSwgWyJ1c2VQcmludGVyU2V0dGluZyIsICJvbiIsICJvZmYiXSk7CiAgfQp9CmNsYXNzIFN0YXJ0Tm9kZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAic3RhcnROb2RlIik7CiAgfQp9CmNsYXNzIFN0YXJ0UGFnZSBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN0YXJ0UGFnZSIsIDAsIG4gPT4gdHJ1ZSk7CiAgfQp9CmNsYXNzIFN1Ym1pdEZvcm1hdCBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAic3VibWl0Rm9ybWF0IiwgWyJodG1sIiwgImRlbGVnYXRlIiwgImZkZiIsICJ4bWwiLCAicGRmIl0pOwogIH0KfQpjbGFzcyBTdWJtaXRVcmwgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN1Ym1pdFVybCIpOwogIH0KfQpjbGFzcyBTdWJzZXRCZWxvdyBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN1YnNldEJlbG93IiwgMTAwLCBuID0+IG4gPj0gMCAmJiBuIDw9IDEwMCk7CiAgfQp9CmNsYXNzIFN1cHByZXNzQmFubmVyIGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN1cHByZXNzQmFubmVyIik7CiAgfQp9CmNsYXNzIFRhZ2dlZCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0YWdnZWQiKTsKICB9Cn0KY2xhc3MgY29uZmlnX1RlbXBsYXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0ZW1wbGF0ZSIsIHRydWUpOwogICAgdGhpcy5iYXNlID0gbnVsbDsKICAgIHRoaXMucmVsZXZhbnQgPSBudWxsOwogICAgdGhpcy5zdGFydFBhZ2UgPSBudWxsOwogICAgdGhpcy51cmkgPSBudWxsOwogICAgdGhpcy54c2wgPSBudWxsOwogIH0KfQpjbGFzcyBUaHJlc2hvbGQgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRocmVzaG9sZCIsIFsidHJhY2UiLCAiZXJyb3IiLCAiaW5mb3JtYXRpb24iLCAid2FybmluZyJdKTsKICB9Cn0KY2xhc3MgVG8gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRvIiwgWyJudWxsIiwgIm1lbW9yeSIsICJzdGRlcnIiLCAic3Rkb3V0IiwgInN5c3RlbSIsICJ1cmkiXSk7CiAgfQp9CmNsYXNzIFRlbXBsYXRlQ2FjaGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRlbXBsYXRlQ2FjaGUiKTsKICAgIHRoaXMubWF4RW50cmllcyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm1heEVudHJpZXMsCiAgICAgIGRlZmF1bHRWYWx1ZTogNSwKICAgICAgdmFsaWRhdGU6IG4gPT4gbiA+PSAwCiAgICB9KTsKICB9Cn0KY2xhc3MgVHJhY2UgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRyYWNlIiwgdHJ1ZSk7CiAgICB0aGlzLmFyZWEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgVHJhbnNmb3JtIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0cmFuc2Zvcm0iLCB0cnVlKTsKICAgIHRoaXMuZ3JvdXBQYXJlbnQgPSBudWxsOwogICAgdGhpcy5pZkVtcHR5ID0gbnVsbDsKICAgIHRoaXMubmFtZUF0dHIgPSBudWxsOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICAgIHRoaXMucHJlc2VuY2UgPSBudWxsOwogICAgdGhpcy5yZW5hbWUgPSBudWxsOwogICAgdGhpcy53aGl0ZXNwYWNlID0gbnVsbDsKICB9Cn0KY2xhc3MgVHlwZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidHlwZSIsIFsibm9uZSIsICJhc2NpaTg1IiwgImFzY2lpSGV4IiwgImNjaXR0ZmF4IiwgImZsYXRlIiwgImx6dyIsICJydW5MZW5ndGgiLCAibmF0aXZlIiwgInhkcCIsICJtZXJnZWRYRFAiXSk7CiAgfQp9CmNsYXNzIFVyaSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidXJpIik7CiAgfQp9CmNsYXNzIGNvbmZpZ19WYWxpZGF0ZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidmFsaWRhdGUiLCBbInByZVN1Ym1pdCIsICJwcmVQcmludCIsICJwcmVFeGVjdXRlIiwgInByZVNhdmUiXSk7CiAgfQp9CmNsYXNzIFZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IHRoaXNbJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMrLykuZmlsdGVyKHggPT4gWyJkb2NSZWFkeSIsICJwb3N0U2lnbiJdLmluY2x1ZGVzKHgpKTsKICB9Cn0KY2xhc3MgVmFsaWRhdGlvbk1lc3NhZ2luZyBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidmFsaWRhdGlvbk1lc3NhZ2luZyIsIFsiYWxsTWVzc2FnZXNJbmRpdmlkdWFsbHkiLCAiYWxsTWVzc2FnZXNUb2dldGhlciIsICJmaXJzdE1lc3NhZ2VPbmx5IiwgIm5vTWVzc2FnZXMiXSk7CiAgfQp9CmNsYXNzIFZlcnNpb24gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInZlcnNpb24iLCBbIjEuNyIsICIxLjYiLCAiMS41IiwgIjEuNCIsICIxLjMiLCAiMS4yIl0pOwogIH0KfQpjbGFzcyBWZXJzaW9uQ29udHJvbCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiVmVyc2lvbkNvbnRyb2wiKTsKICAgIHRoaXMub3V0cHV0QmVsb3cgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5vdXRwdXRCZWxvdywgWyJ3YXJuIiwgImVycm9yIiwgInVwZGF0ZSJdKTsKICAgIHRoaXMuc291cmNlQWJvdmUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zb3VyY2VBYm92ZSwgWyJ3YXJuIiwgImVycm9yIl0pOwogICAgdGhpcy5zb3VyY2VCZWxvdyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnNvdXJjZUJlbG93LCBbInVwZGF0ZSIsICJtYWludGFpbiJdKTsKICB9Cn0KY2xhc3MgVmlld2VyUHJlZmVyZW5jZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInZpZXdlclByZWZlcmVuY2VzIiwgdHJ1ZSk7CiAgICB0aGlzLkFEQkVfSlNDb25zb2xlID0gbnVsbDsKICAgIHRoaXMuQURCRV9KU0RlYnVnZ2VyID0gbnVsbDsKICAgIHRoaXMuYWRkVmlld2VyUHJlZmVyZW5jZXMgPSBudWxsOwogICAgdGhpcy5kdXBsZXhPcHRpb24gPSBudWxsOwogICAgdGhpcy5lbmZvcmNlID0gbnVsbDsKICAgIHRoaXMubnVtYmVyT2ZDb3BpZXMgPSBudWxsOwogICAgdGhpcy5wYWdlUmFuZ2UgPSBudWxsOwogICAgdGhpcy5waWNrVHJheUJ5UERGU2l6ZSA9IG51bGw7CiAgICB0aGlzLnByaW50U2NhbGluZyA9IG51bGw7CiAgfQp9CmNsYXNzIFdlYkNsaWVudCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAid2ViQ2xpZW50IiwgdHJ1ZSk7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgPyBhdHRyaWJ1dGVzLm5hbWUudHJpbSgpIDogIiI7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMueGRjID0gbnVsbDsKICB9Cn0KY2xhc3MgV2hpdGVzcGFjZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAid2hpdGVzcGFjZSIsIFsicHJlc2VydmUiLCAibHRyaW0iLCAibm9ybWFsaXplIiwgInJ0cmltIiwgInRyaW0iXSk7CiAgfQp9CmNsYXNzIFdpbmRvdyBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIndpbmRvdyIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IHBhaXIgPSB0aGlzWyRjb250ZW50XS5zcGxpdCgiLCIsIDIpLm1hcCh4ID0+IHBhcnNlSW50KHgudHJpbSgpLCAxMCkpOwogICAgaWYgKHBhaXIuc29tZSh4ID0+IGlzTmFOKHgpKSkgewogICAgICB0aGlzWyRjb250ZW50XSA9IFswLCAwXTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHBhaXIubGVuZ3RoID09PSAxKSB7CiAgICAgIHBhaXIucHVzaChwYWlyWzBdKTsKICAgIH0KICAgIHRoaXNbJGNvbnRlbnRdID0gcGFpcjsKICB9Cn0KY2xhc3MgWGRjIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ4ZGMiLCB0cnVlKTsKICAgIHRoaXMudXJpID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnhzbCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBYZHAgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInhkcCIsIHRydWUpOwogICAgdGhpcy5wYWNrZXRzID0gbnVsbDsKICB9Cn0KY2xhc3MgWHNsIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ4c2wiLCB0cnVlKTsKICAgIHRoaXMuZGVidWcgPSBudWxsOwogICAgdGhpcy51cmkgPSBudWxsOwogIH0KfQpjbGFzcyBacGwgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInpwbCIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lID8gYXR0cmlidXRlcy5uYW1lLnRyaW0oKSA6ICIiOwogICAgdGhpcy5iYXRjaE91dHB1dCA9IG51bGw7CiAgICB0aGlzLmZsaXBMYWJlbCA9IG51bGw7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMueGRjID0gbnVsbDsKICB9Cn0KY2xhc3MgQ29uZmlnTmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKENvbmZpZ05hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICByZXR1cm4gQ29uZmlnTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGFjcm9iYXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWNyb2JhdChhdHRycyk7CiAgfQogIHN0YXRpYyBhY3JvYmF0NyhhdHRycykgewogICAgcmV0dXJuIG5ldyBBY3JvYmF0NyhhdHRycyk7CiAgfQogIHN0YXRpYyBBREJFX0pTQ29uc29sZShhdHRycykgewogICAgcmV0dXJuIG5ldyBBREJFX0pTQ29uc29sZShhdHRycyk7CiAgfQogIHN0YXRpYyBBREJFX0pTRGVidWdnZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQURCRV9KU0RlYnVnZ2VyKGF0dHJzKTsKICB9CiAgc3RhdGljIGFkZFNpbGVudFByaW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFkZFNpbGVudFByaW50KGF0dHJzKTsKICB9CiAgc3RhdGljIGFkZFZpZXdlclByZWZlcmVuY2VzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFkZFZpZXdlclByZWZlcmVuY2VzKGF0dHJzKTsKICB9CiAgc3RhdGljIGFkanVzdERhdGEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWRqdXN0RGF0YShhdHRycyk7CiAgfQogIHN0YXRpYyBhZG9iZUV4dGVuc2lvbkxldmVsKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFkb2JlRXh0ZW5zaW9uTGV2ZWwoYXR0cnMpOwogIH0KICBzdGF0aWMgYWdlbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWdlbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgYWx3YXlzRW1iZWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWx3YXlzRW1iZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgYW1kKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFtZChhdHRycyk7CiAgfQogIHN0YXRpYyBhcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IGNvbmZpZ19BcmVhKGF0dHJzKTsKICB9CiAgc3RhdGljIGF0dHJpYnV0ZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQXR0cmlidXRlcyhhdHRycyk7CiAgfQogIHN0YXRpYyBhdXRvU2F2ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBBdXRvU2F2ZShhdHRycyk7CiAgfQogIHN0YXRpYyBiYXNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJhc2UoYXR0cnMpOwogIH0KICBzdGF0aWMgYmF0Y2hPdXRwdXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQmF0Y2hPdXRwdXQoYXR0cnMpOwogIH0KICBzdGF0aWMgYmVoYXZpb3JPdmVycmlkZShhdHRycykgewogICAgcmV0dXJuIG5ldyBCZWhhdmlvck92ZXJyaWRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNhY2hlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENhY2hlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNoYW5nZShhdHRycykgewogICAgcmV0dXJuIG5ldyBDaGFuZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgY29tbW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbW1vbihhdHRycyk7CiAgfQogIHN0YXRpYyBjb21wcmVzcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDb21wcmVzcyhhdHRycyk7CiAgfQogIHN0YXRpYyBjb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29tcHJlc3NMb2dpY2FsU3RydWN0dXJlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbXByZXNzT2JqZWN0U3RyZWFtKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbXByZXNzT2JqZWN0U3RyZWFtKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbXByZXNzaW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbXByZXNzaW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbmZpZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDb25maWcoYXR0cnMpOwogIH0KICBzdGF0aWMgY29uZm9ybWFuY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29uZm9ybWFuY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgY29udGVudENvcHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29udGVudENvcHkoYXR0cnMpOwogIH0KICBzdGF0aWMgY29waWVzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvcGllcyhhdHRycyk7CiAgfQogIHN0YXRpYyBjcmVhdG9yKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENyZWF0b3IoYXR0cnMpOwogIH0KICBzdGF0aWMgY3VycmVudFBhZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ3VycmVudFBhZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF0YShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlYnVnKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERlYnVnKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlZmF1bHRUeXBlZmFjZShhdHRycykgewogICAgcmV0dXJuIG5ldyBEZWZhdWx0VHlwZWZhY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgZGVzdGluYXRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVzdGluYXRpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgZG9jdW1lbnRBc3NlbWJseShhdHRycykgewogICAgcmV0dXJuIG5ldyBEb2N1bWVudEFzc2VtYmx5KGF0dHJzKTsKICB9CiAgc3RhdGljIGRyaXZlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBEcml2ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgZHVwbGV4T3B0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IER1cGxleE9wdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBkeW5hbWljUmVuZGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IER5bmFtaWNSZW5kZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgZW1iZWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW1iZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdChhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfRW5jcnlwdChhdHRycyk7CiAgfQogIHN0YXRpYyBlbmNyeXB0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IGNvbmZpZ19FbmNyeXB0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHRpb25MZXZlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNyeXB0aW9uTGV2ZWwoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5mb3JjZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmZvcmNlKGF0dHJzKTsKICB9CiAgc3RhdGljIGVxdWF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFcXVhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgZXF1YXRlUmFuZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXF1YXRlUmFuZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgZXhjbHVkZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFeGNsdWRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGV4Y2x1ZGVOUyhhdHRycykgewogICAgcmV0dXJuIG5ldyBFeGNsdWRlTlMoYXR0cnMpOwogIH0KICBzdGF0aWMgZmxpcExhYmVsKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEZsaXBMYWJlbChhdHRycyk7CiAgfQogIHN0YXRpYyBmb250SW5mbyhhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfRm9udEluZm8oYXR0cnMpOwogIH0KICBzdGF0aWMgZm9ybUZpZWxkRmlsbGluZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBGb3JtRmllbGRGaWxsaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIGdyb3VwUGFyZW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEdyb3VwUGFyZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIGlmRW1wdHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSWZFbXB0eShhdHRycyk7CiAgfQogIHN0YXRpYyBpbmNsdWRlWERQQ29udGVudChhdHRycykgewogICAgcmV0dXJuIG5ldyBJbmNsdWRlWERQQ29udGVudChhdHRycyk7CiAgfQogIHN0YXRpYyBpbmNyZW1lbnRhbExvYWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW5jcmVtZW50YWxMb2FkKGF0dHJzKTsKICB9CiAgc3RhdGljIGluY3JlbWVudGFsTWVyZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW5jcmVtZW50YWxNZXJnZShhdHRycyk7CiAgfQogIHN0YXRpYyBpbnRlcmFjdGl2ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBJbnRlcmFjdGl2ZShhdHRycyk7CiAgfQogIHN0YXRpYyBqb2coYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSm9nKGF0dHJzKTsKICB9CiAgc3RhdGljIGxhYmVsUHJpbnRlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBMYWJlbFByaW50ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgbGF5b3V0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExheW91dChhdHRycyk7CiAgfQogIHN0YXRpYyBsZXZlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBMZXZlbChhdHRycyk7CiAgfQogIHN0YXRpYyBsaW5lYXJpemVkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExpbmVhcml6ZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgbG9jYWxlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExvY2FsZShhdHRycyk7CiAgfQogIHN0YXRpYyBsb2NhbGVTZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTG9jYWxlU2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIGxvZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBMb2coYXR0cnMpOwogIH0KICBzdGF0aWMgbWFwKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1hcEVsZW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgbWVkaXVtSW5mbyhhdHRycykgewogICAgcmV0dXJuIG5ldyBNZWRpdW1JbmZvKGF0dHJzKTsKICB9CiAgc3RhdGljIG1lc3NhZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgY29uZmlnX01lc3NhZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgbWVzc2FnaW5nKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1lc3NhZ2luZyhhdHRycyk7CiAgfQogIHN0YXRpYyBtb2RlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1vZGUoYXR0cnMpOwogIH0KICBzdGF0aWMgbW9kaWZ5QW5ub3RzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1vZGlmeUFubm90cyhhdHRycyk7CiAgfQogIHN0YXRpYyBtc2dJZChhdHRycykgewogICAgcmV0dXJuIG5ldyBNc2dJZChhdHRycyk7CiAgfQogIHN0YXRpYyBuYW1lQXR0cihhdHRycykgewogICAgcmV0dXJuIG5ldyBOYW1lQXR0cihhdHRycyk7CiAgfQogIHN0YXRpYyBuZXZlckVtYmVkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE5ldmVyRW1iZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtYmVyT2ZDb3BpZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTnVtYmVyT2ZDb3BpZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgb3BlbkFjdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBPcGVuQWN0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIG91dHB1dChhdHRycykgewogICAgcmV0dXJuIG5ldyBPdXRwdXQoYXR0cnMpOwogIH0KICBzdGF0aWMgb3V0cHV0QmluKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE91dHB1dEJpbihhdHRycyk7CiAgfQogIHN0YXRpYyBvdXRwdXRYU0woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgT3V0cHV0WFNMKGF0dHJzKTsKICB9CiAgc3RhdGljIG92ZXJwcmludChhdHRycykgewogICAgcmV0dXJuIG5ldyBPdmVycHJpbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgcGFja2V0cyhhdHRycykgewogICAgcmV0dXJuIG5ldyBQYWNrZXRzKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2VPZmZzZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnZU9mZnNldChhdHRycyk7CiAgfQogIHN0YXRpYyBwYWdlUmFuZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnZVJhbmdlKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2luYXRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBwYWdpbmF0aW9uT3ZlcnJpZGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbk92ZXJyaWRlKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhcnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFydChhdHRycyk7CiAgfQogIHN0YXRpYyBwY2woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGNsKGF0dHJzKTsKICB9CiAgc3RhdGljIHBkZihhdHRycykgewogICAgcmV0dXJuIG5ldyBQZGYoYXR0cnMpOwogIH0KICBzdGF0aWMgcGRmYShhdHRycykgewogICAgcmV0dXJuIG5ldyBQZGZhKGF0dHJzKTsKICB9CiAgc3RhdGljIHBlcm1pc3Npb25zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25zKGF0dHJzKTsKICB9CiAgc3RhdGljIHBpY2tUcmF5QnlQREZTaXplKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBpY2tUcmF5QnlQREZTaXplKGF0dHJzKTsKICB9CiAgc3RhdGljIHBpY3R1cmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgY29uZmlnX1BpY3R1cmUoYXR0cnMpOwogIH0KICBzdGF0aWMgcGxhaW50ZXh0TWV0YWRhdGEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGxhaW50ZXh0TWV0YWRhdGEoYXR0cnMpOwogIH0KICBzdGF0aWMgcHJlc2VuY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUHJlc2VuY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgcHJlc2VudChhdHRycykgewogICAgcmV0dXJuIG5ldyBQcmVzZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIHByaW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByaW50KGF0dHJzKTsKICB9CiAgc3RhdGljIHByaW50SGlnaFF1YWxpdHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUHJpbnRIaWdoUXVhbGl0eShhdHRycyk7CiAgfQogIHN0YXRpYyBwcmludFNjYWxpbmcoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUHJpbnRTY2FsaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIHByaW50ZXJOYW1lKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByaW50ZXJOYW1lKGF0dHJzKTsKICB9CiAgc3RhdGljIHByb2R1Y2VyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByb2R1Y2VyKGF0dHJzKTsKICB9CiAgc3RhdGljIHBzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBzKGF0dHJzKTsKICB9CiAgc3RhdGljIHJhbmdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJhbmdlKGF0dHJzKTsKICB9CiAgc3RhdGljIHJlY29yZChhdHRycykgewogICAgcmV0dXJuIG5ldyBSZWNvcmQoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVsZXZhbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVsZXZhbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVuYW1lKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlbmFtZShhdHRycyk7CiAgfQogIHN0YXRpYyByZW5kZXJQb2xpY3koYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVuZGVyUG9saWN5KGF0dHJzKTsKICB9CiAgc3RhdGljIHJ1blNjcmlwdHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUnVuU2NyaXB0cyhhdHRycyk7CiAgfQogIHN0YXRpYyBzY3JpcHQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgY29uZmlnX1NjcmlwdChhdHRycyk7CiAgfQogIHN0YXRpYyBzY3JpcHRNb2RlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBTY3JpcHRNb2RlbChhdHRycyk7CiAgfQogIHN0YXRpYyBzZXZlcml0eShhdHRycykgewogICAgcmV0dXJuIG5ldyBTZXZlcml0eShhdHRycyk7CiAgfQogIHN0YXRpYyBzaWxlbnRQcmludChhdHRycykgewogICAgcmV0dXJuIG5ldyBTaWxlbnRQcmludChhdHRycyk7CiAgfQogIHN0YXRpYyBzdGFwbGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3RhcGxlKGF0dHJzKTsKICB9CiAgc3RhdGljIHN0YXJ0Tm9kZShhdHRycykgewogICAgcmV0dXJuIG5ldyBTdGFydE5vZGUoYXR0cnMpOwogIH0KICBzdGF0aWMgc3RhcnRQYWdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN0YXJ0UGFnZShhdHRycyk7CiAgfQogIHN0YXRpYyBzdWJtaXRGb3JtYXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3VibWl0Rm9ybWF0KGF0dHJzKTsKICB9CiAgc3RhdGljIHN1Ym1pdFVybChhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJtaXRVcmwoYXR0cnMpOwogIH0KICBzdGF0aWMgc3Vic2V0QmVsb3coYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3Vic2V0QmVsb3coYXR0cnMpOwogIH0KICBzdGF0aWMgc3VwcHJlc3NCYW5uZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3VwcHJlc3NCYW5uZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgdGFnZ2VkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRhZ2dlZChhdHRycyk7CiAgfQogIHN0YXRpYyB0ZW1wbGF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfVGVtcGxhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdGVtcGxhdGVDYWNoZShhdHRycykgewogICAgcmV0dXJuIG5ldyBUZW1wbGF0ZUNhY2hlKGF0dHJzKTsKICB9CiAgc3RhdGljIHRocmVzaG9sZChhdHRycykgewogICAgcmV0dXJuIG5ldyBUaHJlc2hvbGQoYXR0cnMpOwogIH0KICBzdGF0aWMgdG8oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVG8oYXR0cnMpOwogIH0KICBzdGF0aWMgdHJhY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHJhY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgdHJhbnNmb3JtKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRyYW5zZm9ybShhdHRycyk7CiAgfQogIHN0YXRpYyB0eXBlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFR5cGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdXJpKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFVyaShhdHRycyk7CiAgfQogIHN0YXRpYyB2YWxpZGF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfVmFsaWRhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgdmFsaWRhdGlvbk1lc3NhZ2luZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uTWVzc2FnaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIHZlcnNpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmVyc2lvbihhdHRycyk7CiAgfQogIHN0YXRpYyB2ZXJzaW9uQ29udHJvbChhdHRycykgewogICAgcmV0dXJuIG5ldyBWZXJzaW9uQ29udHJvbChhdHRycyk7CiAgfQogIHN0YXRpYyB2aWV3ZXJQcmVmZXJlbmNlcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBWaWV3ZXJQcmVmZXJlbmNlcyhhdHRycyk7CiAgfQogIHN0YXRpYyB3ZWJDbGllbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgV2ViQ2xpZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIHdoaXRlc3BhY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgV2hpdGVzcGFjZShhdHRycyk7CiAgfQogIHN0YXRpYyB3aW5kb3coYXR0cnMpIHsKICAgIHJldHVybiBuZXcgV2luZG93KGF0dHJzKTsKICB9CiAgc3RhdGljIHhkYyhhdHRycykgewogICAgcmV0dXJuIG5ldyBYZGMoYXR0cnMpOwogIH0KICBzdGF0aWMgeGRwKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFhkcChhdHRycyk7CiAgfQogIHN0YXRpYyB4c2woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgWHNsKGF0dHJzKTsKICB9CiAgc3RhdGljIHpwbChhdHRycykgewogICAgcmV0dXJuIG5ldyBacGwoYXR0cnMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2Nvbm5lY3Rpb25fc2V0LmpzCgoKY29uc3QgQ09OTkVDVElPTl9TRVRfTlNfSUQgPSBOYW1lc3BhY2VJZHMuY29ubmVjdGlvblNldC5pZDsKY2xhc3MgQ29ubmVjdGlvblNldCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJjb25uZWN0aW9uU2V0IiwgdHJ1ZSk7CiAgICB0aGlzLndzZGxDb25uZWN0aW9uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnhtbENvbm5lY3Rpb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMueHNkQ29ubmVjdGlvbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBFZmZlY3RpdmVJbnB1dFBvbGljeSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJlZmZlY3RpdmVJbnB1dFBvbGljeSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBFZmZlY3RpdmVPdXRwdXRQb2xpY3kgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAiZWZmZWN0aXZlT3V0cHV0UG9saWN5Iik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIE9wZXJhdGlvbiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJvcGVyYXRpb24iKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5pbnB1dCA9IGF0dHJpYnV0ZXMuaW5wdXQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLm91dHB1dCA9IGF0dHJpYnV0ZXMub3V0cHV0IHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgUm9vdEVsZW1lbnQgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAicm9vdEVsZW1lbnQiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgU29hcEFjdGlvbiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJzb2FwQWN0aW9uIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFNvYXBBZGRyZXNzIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgInNvYXBBZGRyZXNzIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIGNvbm5lY3Rpb25fc2V0X1VyaSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJ1cmkiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgV3NkbEFkZHJlc3MgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAid3NkbEFkZHJlc3MiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgV3NkbENvbm5lY3Rpb24gZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAid3NkbENvbm5lY3Rpb24iLCB0cnVlKTsKICAgIHRoaXMuZGF0YURlc2NyaXB0aW9uID0gYXR0cmlidXRlcy5kYXRhRGVzY3JpcHRpb24gfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLmVmZmVjdGl2ZUlucHV0UG9saWN5ID0gbnVsbDsKICAgIHRoaXMuZWZmZWN0aXZlT3V0cHV0UG9saWN5ID0gbnVsbDsKICAgIHRoaXMub3BlcmF0aW9uID0gbnVsbDsKICAgIHRoaXMuc29hcEFjdGlvbiA9IG51bGw7CiAgICB0aGlzLnNvYXBBZGRyZXNzID0gbnVsbDsKICAgIHRoaXMud3NkbEFkZHJlc3MgPSBudWxsOwogIH0KfQpjbGFzcyBYbWxDb25uZWN0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgInhtbENvbm5lY3Rpb24iLCB0cnVlKTsKICAgIHRoaXMuZGF0YURlc2NyaXB0aW9uID0gYXR0cmlidXRlcy5kYXRhRGVzY3JpcHRpb24gfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIFhzZENvbm5lY3Rpb24gZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAieHNkQ29ubmVjdGlvbiIsIHRydWUpOwogICAgdGhpcy5kYXRhRGVzY3JpcHRpb24gPSBhdHRyaWJ1dGVzLmRhdGFEZXNjcmlwdGlvbiB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucm9vdEVsZW1lbnQgPSBudWxsOwogICAgdGhpcy51cmkgPSBudWxsOwogIH0KfQpjbGFzcyBDb25uZWN0aW9uU2V0TmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKENvbm5lY3Rpb25TZXROYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIENvbm5lY3Rpb25TZXROYW1lc3BhY2VbbmFtZV0oYXR0cmlidXRlcyk7CiAgICB9CiAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0KICBzdGF0aWMgY29ubmVjdGlvblNldChhdHRycykgewogICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uU2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIGVmZmVjdGl2ZUlucHV0UG9saWN5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVmZmVjdGl2ZUlucHV0UG9saWN5KGF0dHJzKTsKICB9CiAgc3RhdGljIGVmZmVjdGl2ZU91dHB1dFBvbGljeShhdHRycykgewogICAgcmV0dXJuIG5ldyBFZmZlY3RpdmVPdXRwdXRQb2xpY3koYXR0cnMpOwogIH0KICBzdGF0aWMgb3BlcmF0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE9wZXJhdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyByb290RWxlbWVudChhdHRycykgewogICAgcmV0dXJuIG5ldyBSb290RWxlbWVudChhdHRycyk7CiAgfQogIHN0YXRpYyBzb2FwQWN0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNvYXBBY3Rpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgc29hcEFkZHJlc3MoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU29hcEFkZHJlc3MoYXR0cnMpOwogIH0KICBzdGF0aWMgdXJpKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IGNvbm5lY3Rpb25fc2V0X1VyaShhdHRycyk7CiAgfQogIHN0YXRpYyB3c2RsQWRkcmVzcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBXc2RsQWRkcmVzcyhhdHRycyk7CiAgfQogIHN0YXRpYyB3c2RsQ29ubmVjdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBXc2RsQ29ubmVjdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyB4bWxDb25uZWN0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFhtbENvbm5lY3Rpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgeHNkQ29ubmVjdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBYc2RDb25uZWN0aW9uKGF0dHJzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9kYXRhc2V0cy5qcwoKCgpjb25zdCBEQVRBU0VUU19OU19JRCA9IE5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZDsKY2xhc3MgZGF0YXNldHNfRGF0YSBleHRlbmRzIFhtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoREFUQVNFVFNfTlNfSUQsICJkYXRhIiwgYXR0cmlidXRlcyk7CiAgfQogIFskaXNOc0Fnbm9zdGljXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBEYXRhc2V0cyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoREFUQVNFVFNfTlNfSUQsICJkYXRhc2V0cyIsIHRydWUpOwogICAgdGhpcy5kYXRhID0gbnVsbDsKICAgIHRoaXMuU2lnbmF0dXJlID0gbnVsbDsKICB9CiAgWyRvbkNoaWxkXShjaGlsZCkgewogICAgY29uc3QgbmFtZSA9IGNoaWxkWyRub2RlTmFtZV07CiAgICBpZiAobmFtZSA9PT0gImRhdGEiICYmIGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IERBVEFTRVRTX05TX0lEIHx8IG5hbWUgPT09ICJTaWduYXR1cmUiICYmIGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IE5hbWVzcGFjZUlkcy5zaWduYXR1cmUuaWQpIHsKICAgICAgdGhpc1tuYW1lXSA9IGNoaWxkOwogICAgfQogICAgdGhpc1skYXBwZW5kQ2hpbGRdKGNoaWxkKTsKICB9Cn0KY2xhc3MgRGF0YXNldHNOYW1lc3BhY2UgewogIHN0YXRpYyBbJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB7CiAgICBpZiAoRGF0YXNldHNOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIERhdGFzZXRzTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGRhdGFzZXRzKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgRGF0YXNldHMoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBkYXRhKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgZGF0YXNldHNfRGF0YShhdHRyaWJ1dGVzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9sb2NhbGVfc2V0LmpzCgoKCmNvbnN0IExPQ0FMRV9TRVRfTlNfSUQgPSBOYW1lc3BhY2VJZHMubG9jYWxlU2V0LmlkOwpjbGFzcyBDYWxlbmRhclN5bWJvbHMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJjYWxlbmRhclN5bWJvbHMiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9ICJncmVnb3JpYW4iOwogICAgdGhpcy5kYXlOYW1lcyA9IG5ldyBYRkFPYmplY3RBcnJheSgyKTsKICAgIHRoaXMuZXJhTmFtZXMgPSBudWxsOwogICAgdGhpcy5tZXJpZGllbU5hbWVzID0gbnVsbDsKICAgIHRoaXMubW9udGhOYW1lcyA9IG5ldyBYRkFPYmplY3RBcnJheSgyKTsKICB9Cn0KY2xhc3MgQ3VycmVuY3lTeW1ib2wgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJjdXJyZW5jeVN5bWJvbCIpOwogICAgdGhpcy5uYW1lID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubmFtZSwgWyJzeW1ib2wiLCAiaXNvbmFtZSIsICJkZWNpbWFsIl0pOwogIH0KfQpjbGFzcyBDdXJyZW5jeVN5bWJvbHMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJjdXJyZW5jeVN5bWJvbHMiLCB0cnVlKTsKICAgIHRoaXMuY3VycmVuY3lTeW1ib2wgPSBuZXcgWEZBT2JqZWN0QXJyYXkoMyk7CiAgfQp9CmNsYXNzIERhdGVQYXR0ZXJuIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiZGF0ZVBhdHRlcm4iKTsKICAgIHRoaXMubmFtZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm5hbWUsIFsiZnVsbCIsICJsb25nIiwgIm1lZCIsICJzaG9ydCJdKTsKICB9Cn0KY2xhc3MgRGF0ZVBhdHRlcm5zIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiZGF0ZVBhdHRlcm5zIiwgdHJ1ZSk7CiAgICB0aGlzLmRhdGVQYXR0ZXJuID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogIH0KfQpjbGFzcyBEYXRlVGltZVN5bWJvbHMgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiZGF0ZVRpbWVTeW1ib2xzIik7CiAgfQp9CmNsYXNzIERheSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImRheSIpOwogIH0KfQpjbGFzcyBEYXlOYW1lcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImRheU5hbWVzIiwgdHJ1ZSk7CiAgICB0aGlzLmFiYnIgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5hYmJyLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5kYXkgPSBuZXcgWEZBT2JqZWN0QXJyYXkoNyk7CiAgfQp9CmNsYXNzIEVyYSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImVyYSIpOwogIH0KfQpjbGFzcyBFcmFOYW1lcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImVyYU5hbWVzIiwgdHJ1ZSk7CiAgICB0aGlzLmVyYSA9IG5ldyBYRkFPYmplY3RBcnJheSgyKTsKICB9Cn0KY2xhc3MgbG9jYWxlX3NldF9Mb2NhbGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJsb2NhbGUiLCB0cnVlKTsKICAgIHRoaXMuZGVzYyA9IGF0dHJpYnV0ZXMuZGVzYyB8fCAiIjsKICAgIHRoaXMubmFtZSA9ICJpc29uYW1lIjsKICAgIHRoaXMuY2FsZW5kYXJTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMuY3VycmVuY3lTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMuZGF0ZVBhdHRlcm5zID0gbnVsbDsKICAgIHRoaXMuZGF0ZVRpbWVTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMubnVtYmVyUGF0dGVybnMgPSBudWxsOwogICAgdGhpcy5udW1iZXJTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMudGltZVBhdHRlcm5zID0gbnVsbDsKICAgIHRoaXMudHlwZUZhY2VzID0gbnVsbDsKICB9Cn0KY2xhc3MgbG9jYWxlX3NldF9Mb2NhbGVTZXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJsb2NhbGVTZXQiLCB0cnVlKTsKICAgIHRoaXMubG9jYWxlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIE1lcmlkaWVtIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibWVyaWRpZW0iKTsKICB9Cn0KY2xhc3MgTWVyaWRpZW1OYW1lcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgIm1lcmlkaWVtTmFtZXMiLCB0cnVlKTsKICAgIHRoaXMubWVyaWRpZW0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoMik7CiAgfQp9CmNsYXNzIE1vbnRoIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibW9udGgiKTsKICB9Cn0KY2xhc3MgTW9udGhOYW1lcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgIm1vbnRoTmFtZXMiLCB0cnVlKTsKICAgIHRoaXMuYWJiciA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmFiYnIsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLm1vbnRoID0gbmV3IFhGQU9iamVjdEFycmF5KDEyKTsKICB9Cn0KY2xhc3MgTnVtYmVyUGF0dGVybiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgIm51bWJlclBhdHRlcm4iKTsKICAgIHRoaXMubmFtZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm5hbWUsIFsiZnVsbCIsICJsb25nIiwgIm1lZCIsICJzaG9ydCJdKTsKICB9Cn0KY2xhc3MgTnVtYmVyUGF0dGVybnMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJudW1iZXJQYXR0ZXJucyIsIHRydWUpOwogICAgdGhpcy5udW1iZXJQYXR0ZXJuID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogIH0KfQpjbGFzcyBOdW1iZXJTeW1ib2wgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJudW1iZXJTeW1ib2wiKTsKICAgIHRoaXMubmFtZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm5hbWUsIFsiZGVjaW1hbCIsICJncm91cGluZyIsICJwZXJjZW50IiwgIm1pbnVzIiwgInplcm8iXSk7CiAgfQp9CmNsYXNzIE51bWJlclN5bWJvbHMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJudW1iZXJTeW1ib2xzIiwgdHJ1ZSk7CiAgICB0aGlzLm51bWJlclN5bWJvbCA9IG5ldyBYRkFPYmplY3RBcnJheSg1KTsKICB9Cn0KY2xhc3MgVGltZVBhdHRlcm4gZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJ0aW1lUGF0dGVybiIpOwogICAgdGhpcy5uYW1lID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubmFtZSwgWyJmdWxsIiwgImxvbmciLCAibWVkIiwgInNob3J0Il0pOwogIH0KfQpjbGFzcyBUaW1lUGF0dGVybnMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJ0aW1lUGF0dGVybnMiLCB0cnVlKTsKICAgIHRoaXMudGltZVBhdHRlcm4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoNCk7CiAgfQp9CmNsYXNzIFR5cGVGYWNlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAidHlwZUZhY2UiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8ICIiOwogIH0KfQpjbGFzcyBUeXBlRmFjZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJ0eXBlRmFjZXMiLCB0cnVlKTsKICAgIHRoaXMudHlwZUZhY2UgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgTG9jYWxlU2V0TmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKExvY2FsZVNldE5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICByZXR1cm4gTG9jYWxlU2V0TmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGNhbGVuZGFyU3ltYm9scyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDYWxlbmRhclN5bWJvbHMoYXR0cnMpOwogIH0KICBzdGF0aWMgY3VycmVuY3lTeW1ib2woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ3VycmVuY3lTeW1ib2woYXR0cnMpOwogIH0KICBzdGF0aWMgY3VycmVuY3lTeW1ib2xzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEN1cnJlbmN5U3ltYm9scyhhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlUGF0dGVybihhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlUGF0dGVybihhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlUGF0dGVybnMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF0ZVBhdHRlcm5zKGF0dHJzKTsKICB9CiAgc3RhdGljIGRhdGVUaW1lU3ltYm9scyhhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlVGltZVN5bWJvbHMoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERheShhdHRycyk7CiAgfQogIHN0YXRpYyBkYXlOYW1lcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXlOYW1lcyhhdHRycyk7CiAgfQogIHN0YXRpYyBlcmEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXJhKGF0dHJzKTsKICB9CiAgc3RhdGljIGVyYU5hbWVzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVyYU5hbWVzKGF0dHJzKTsKICB9CiAgc3RhdGljIGxvY2FsZShhdHRycykgewogICAgcmV0dXJuIG5ldyBsb2NhbGVfc2V0X0xvY2FsZShhdHRycyk7CiAgfQogIHN0YXRpYyBsb2NhbGVTZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgbG9jYWxlX3NldF9Mb2NhbGVTZXQoYXR0cnMpOwogIH0KICBzdGF0aWMgbWVyaWRpZW0oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWVyaWRpZW0oYXR0cnMpOwogIH0KICBzdGF0aWMgbWVyaWRpZW1OYW1lcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBNZXJpZGllbU5hbWVzKGF0dHJzKTsKICB9CiAgc3RhdGljIG1vbnRoKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1vbnRoKGF0dHJzKTsKICB9CiAgc3RhdGljIG1vbnRoTmFtZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTW9udGhOYW1lcyhhdHRycyk7CiAgfQogIHN0YXRpYyBudW1iZXJQYXR0ZXJuKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlclBhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtYmVyUGF0dGVybnMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTnVtYmVyUGF0dGVybnMoYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtYmVyU3ltYm9sKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlclN5bWJvbChhdHRycyk7CiAgfQogIHN0YXRpYyBudW1iZXJTeW1ib2xzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlclN5bWJvbHMoYXR0cnMpOwogIH0KICBzdGF0aWMgdGltZVBhdHRlcm4oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGltZVBhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgdGltZVBhdHRlcm5zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRpbWVQYXR0ZXJucyhhdHRycyk7CiAgfQogIHN0YXRpYyB0eXBlRmFjZShhdHRycykgewogICAgcmV0dXJuIG5ldyBUeXBlRmFjZShhdHRycyk7CiAgfQogIHN0YXRpYyB0eXBlRmFjZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHlwZUZhY2VzKGF0dHJzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9zaWduYXR1cmUuanMKCgpjb25zdCBTSUdOQVRVUkVfTlNfSUQgPSBOYW1lc3BhY2VJZHMuc2lnbmF0dXJlLmlkOwpjbGFzcyBzaWduYXR1cmVfU2lnbmF0dXJlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihTSUdOQVRVUkVfTlNfSUQsICJzaWduYXR1cmUiLCB0cnVlKTsKICB9Cn0KY2xhc3MgU2lnbmF0dXJlTmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKFNpZ25hdHVyZU5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICByZXR1cm4gU2lnbmF0dXJlTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIHNpZ25hdHVyZShhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gbmV3IHNpZ25hdHVyZV9TaWduYXR1cmUoYXR0cmlidXRlcyk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvc3R5bGVzaGVldC5qcwoKCmNvbnN0IFNUWUxFU0hFRVRfTlNfSUQgPSBOYW1lc3BhY2VJZHMuc3R5bGVzaGVldC5pZDsKY2xhc3MgU3R5bGVzaGVldCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoU1RZTEVTSEVFVF9OU19JRCwgInN0eWxlc2hlZXQiLCB0cnVlKTsKICB9Cn0KY2xhc3MgU3R5bGVzaGVldE5hbWVzcGFjZSB7CiAgc3RhdGljIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChTdHlsZXNoZWV0TmFtZXNwYWNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgIHJldHVybiBTdHlsZXNoZWV0TmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIHN0eWxlc2hlZXQoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBTdHlsZXNoZWV0KGF0dHJpYnV0ZXMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL3hkcC5qcwoKCgpjb25zdCBYRFBfTlNfSUQgPSBOYW1lc3BhY2VJZHMueGRwLmlkOwpjbGFzcyB4ZHBfWGRwIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihYRFBfTlNfSUQsICJ4ZHAiLCB0cnVlKTsKICAgIHRoaXMudXVpZCA9IGF0dHJpYnV0ZXMudXVpZCB8fCAiIjsKICAgIHRoaXMudGltZVN0YW1wID0gYXR0cmlidXRlcy50aW1lU3RhbXAgfHwgIiI7CiAgICB0aGlzLmNvbmZpZyA9IG51bGw7CiAgICB0aGlzLmNvbm5lY3Rpb25TZXQgPSBudWxsOwogICAgdGhpcy5kYXRhc2V0cyA9IG51bGw7CiAgICB0aGlzLmxvY2FsZVNldCA9IG51bGw7CiAgICB0aGlzLnN0eWxlc2hlZXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogIH0KICBbJG9uQ2hpbGRDaGVja10oY2hpbGQpIHsKICAgIGNvbnN0IG5zID0gTmFtZXNwYWNlSWRzW2NoaWxkWyRub2RlTmFtZV1dOwogICAgcmV0dXJuIG5zICYmIGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IG5zLmlkOwogIH0KfQpjbGFzcyBYZHBOYW1lc3BhY2UgewogIHN0YXRpYyBbJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB7CiAgICBpZiAoWGRwTmFtZXNwYWNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgIHJldHVybiBYZHBOYW1lc3BhY2VbbmFtZV0oYXR0cmlidXRlcyk7CiAgICB9CiAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0KICBzdGF0aWMgeGRwKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgeGRwX1hkcChhdHRyaWJ1dGVzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS94aHRtbC5qcwoKCgoKCmNvbnN0IFhIVE1MX05TX0lEID0gTmFtZXNwYWNlSWRzLnhodG1sLmlkOwpjb25zdCAkcmljaFRleHQgPSBTeW1ib2woKTsKY29uc3QgVkFMSURfU1RZTEVTID0gbmV3IFNldChbImNvbG9yIiwgImZvbnQiLCAiZm9udC1mYW1pbHkiLCAiZm9udC1zaXplIiwgImZvbnQtc3RyZXRjaCIsICJmb250LXN0eWxlIiwgImZvbnQtd2VpZ2h0IiwgIm1hcmdpbiIsICJtYXJnaW4tYm90dG9tIiwgIm1hcmdpbi1sZWZ0IiwgIm1hcmdpbi1yaWdodCIsICJtYXJnaW4tdG9wIiwgImxldHRlci1zcGFjaW5nIiwgImxpbmUtaGVpZ2h0IiwgIm9ycGhhbnMiLCAicGFnZS1icmVhay1hZnRlciIsICJwYWdlLWJyZWFrLWJlZm9yZSIsICJwYWdlLWJyZWFrLWluc2lkZSIsICJ0YWItaW50ZXJ2YWwiLCAidGFiLXN0b3AiLCAidGV4dC1hbGlnbiIsICJ0ZXh0LWRlY29yYXRpb24iLCAidGV4dC1pbmRlbnQiLCAidmVydGljYWwtYWxpZ24iLCAid2lkb3dzIiwgImtlcm5pbmctbW9kZSIsICJ4ZmEtZm9udC1ob3Jpem9udGFsLXNjYWxlIiwgInhmYS1mb250LXZlcnRpY2FsLXNjYWxlIiwgInhmYS1zcGFjZXJ1biIsICJ4ZmEtdGFiLXN0b3BzIl0pOwpjb25zdCBTdHlsZU1hcHBpbmcgPSBuZXcgTWFwKFtbInBhZ2UtYnJlYWstYWZ0ZXIiLCAiYnJlYWtBZnRlciJdLCBbInBhZ2UtYnJlYWstYmVmb3JlIiwgImJyZWFrQmVmb3JlIl0sIFsicGFnZS1icmVhay1pbnNpZGUiLCAiYnJlYWtJbnNpZGUiXSwgWyJrZXJuaW5nLW1vZGUiLCB2YWx1ZSA9PiB2YWx1ZSA9PT0gIm5vbmUiID8gIm5vbmUiIDogIm5vcm1hbCJdLCBbInhmYS1mb250LWhvcml6b250YWwtc2NhbGUiLCB2YWx1ZSA9PiBgc2NhbGVYKCR7TWF0aC5tYXgoMCwgcGFyc2VJbnQodmFsdWUpIC8gMTAwKS50b0ZpeGVkKDIpfSlgXSwgWyJ4ZmEtZm9udC12ZXJ0aWNhbC1zY2FsZSIsIHZhbHVlID0+IGBzY2FsZVkoJHtNYXRoLm1heCgwLCBwYXJzZUludCh2YWx1ZSkgLyAxMDApLnRvRml4ZWQoMil9KWBdLCBbInhmYS1zcGFjZXJ1biIsICIiXSwgWyJ4ZmEtdGFiLXN0b3BzIiwgIiJdLCBbImZvbnQtc2l6ZSIsICh2YWx1ZSwgb3JpZ2luYWwpID0+IHsKICB2YWx1ZSA9IG9yaWdpbmFsLmZvbnRTaXplID0gTWF0aC5hYnMoZ2V0TWVhc3VyZW1lbnQodmFsdWUpKTsKICByZXR1cm4gbWVhc3VyZVRvU3RyaW5nKDAuOTkgKiB2YWx1ZSk7Cn1dLCBbImxldHRlci1zcGFjaW5nIiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbImxpbmUtaGVpZ2h0IiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbIm1hcmdpbiIsIHZhbHVlID0+IG1lYXN1cmVUb1N0cmluZyhnZXRNZWFzdXJlbWVudCh2YWx1ZSkpXSwgWyJtYXJnaW4tYm90dG9tIiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbIm1hcmdpbi1sZWZ0IiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbIm1hcmdpbi1yaWdodCIsIHZhbHVlID0+IG1lYXN1cmVUb1N0cmluZyhnZXRNZWFzdXJlbWVudCh2YWx1ZSkpXSwgWyJtYXJnaW4tdG9wIiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbInRleHQtaW5kZW50IiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbImZvbnQtZmFtaWx5IiwgdmFsdWUgPT4gdmFsdWVdLCBbInZlcnRpY2FsLWFsaWduIiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldXSk7CmNvbnN0IHNwYWNlc1JlZ0V4cCA9IC9ccysvZzsKY29uc3QgY3JsZlJlZ0V4cCA9IC9bXHJcbl0rL2c7CmNvbnN0IGNybGZGb3JSaWNoVGV4dFJlZ0V4cCA9IC9cclxuPy9nOwpmdW5jdGlvbiBtYXBTdHlsZShzdHlsZVN0ciwgbm9kZSwgcmljaFRleHQpIHsKICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgaWYgKCFzdHlsZVN0cikgewogICAgcmV0dXJuIHN0eWxlOwogIH0KICBjb25zdCBvcmlnaW5hbCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc3R5bGVTdHIuc3BsaXQoIjsiKS5tYXAocyA9PiBzLnNwbGl0KCI6IiwgMikpKSB7CiAgICBjb25zdCBtYXBwaW5nID0gU3R5bGVNYXBwaW5nLmdldChrZXkpOwogICAgaWYgKG1hcHBpbmcgPT09ICIiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbGV0IG5ld1ZhbHVlID0gdmFsdWU7CiAgICBpZiAobWFwcGluZykgewogICAgICBuZXdWYWx1ZSA9IHR5cGVvZiBtYXBwaW5nID09PSAic3RyaW5nIiA/IG1hcHBpbmcgOiBtYXBwaW5nKHZhbHVlLCBvcmlnaW5hbCk7CiAgICB9CiAgICBpZiAoa2V5LmVuZHNXaXRoKCJzY2FsZSIpKSB7CiAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlLnRyYW5zZm9ybSA/IGAke3N0eWxlW2tleV19ICR7bmV3VmFsdWV9YCA6IG5ld1ZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgc3R5bGVba2V5LnJlcGxhY2VBbGwoLy0oW2EtekEtWl0pL2csIChfLCB4KSA9PiB4LnRvVXBwZXJDYXNlKCkpXSA9IG5ld1ZhbHVlOwogICAgfQogIH0KICBpZiAoc3R5bGUuZm9udEZhbWlseSkgewogICAgc2V0Rm9udEZhbWlseSh7CiAgICAgIHR5cGVmYWNlOiBzdHlsZS5mb250RmFtaWx5LAogICAgICB3ZWlnaHQ6IHN0eWxlLmZvbnRXZWlnaHQgfHwgIm5vcm1hbCIsCiAgICAgIHBvc3R1cmU6IHN0eWxlLmZvbnRTdHlsZSB8fCAibm9ybWFsIiwKICAgICAgc2l6ZTogb3JpZ2luYWwuZm9udFNpemUgfHwgMAogICAgfSwgbm9kZSwgbm9kZVskZ2xvYmFsRGF0YV0uZm9udEZpbmRlciwgc3R5bGUpOwogIH0KICBpZiAocmljaFRleHQgJiYgc3R5bGUudmVydGljYWxBbGlnbiAmJiBzdHlsZS52ZXJ0aWNhbEFsaWduICE9PSAiMHB4IiAmJiBzdHlsZS5mb250U2l6ZSkgewogICAgY29uc3QgU1VCX1NVUEVSX1NDUklQVF9GQUNUT1IgPSAwLjU4MzsKICAgIGNvbnN0IFZFUlRJQ0FMX0ZBQ1RPUiA9IDAuMzMzOwogICAgY29uc3QgZm9udFNpemUgPSBnZXRNZWFzdXJlbWVudChzdHlsZS5mb250U2l6ZSk7CiAgICBzdHlsZS5mb250U2l6ZSA9IG1lYXN1cmVUb1N0cmluZyhmb250U2l6ZSAqIFNVQl9TVVBFUl9TQ1JJUFRfRkFDVE9SKTsKICAgIHN0eWxlLnZlcnRpY2FsQWxpZ24gPSBtZWFzdXJlVG9TdHJpbmcoTWF0aC5zaWduKGdldE1lYXN1cmVtZW50KHN0eWxlLnZlcnRpY2FsQWxpZ24pKSAqIGZvbnRTaXplICogVkVSVElDQUxfRkFDVE9SKTsKICB9CiAgaWYgKHJpY2hUZXh0ICYmIHN0eWxlLmZvbnRTaXplKSB7CiAgICBzdHlsZS5mb250U2l6ZSA9IGBjYWxjKCR7c3R5bGUuZm9udFNpemV9ICogdmFyKC0tdG90YWwtc2NhbGUtZmFjdG9yKSlgOwogIH0KICBmaXhUZXh0SW5kZW50KHN0eWxlKTsKICByZXR1cm4gc3R5bGU7Cn0KZnVuY3Rpb24gY2hlY2tTdHlsZShub2RlKSB7CiAgaWYgKCFub2RlLnN0eWxlKSB7CiAgICByZXR1cm4gIiI7CiAgfQogIHJldHVybiBub2RlLnN0eWxlLnNwbGl0KCI7IikuZmlsdGVyKHMgPT4gISFzLnRyaW0oKSkubWFwKHMgPT4gcy5zcGxpdCgiOiIsIDIpLm1hcCh0ID0+IHQudHJpbSgpKSkuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHsKICAgIGlmIChrZXkgPT09ICJmb250LWZhbWlseSIpIHsKICAgICAgbm9kZVskZ2xvYmFsRGF0YV0udXNlZFR5cGVmYWNlcy5hZGQodmFsdWUpOwogICAgfQogICAgcmV0dXJuIFZBTElEX1NUWUxFUy5oYXMoa2V5KTsKICB9KS5tYXAoa3YgPT4ga3Yuam9pbigiOiIpKS5qb2luKCI7Iik7Cn0KY29uc3QgTm9XaGl0ZXMgPSBuZXcgU2V0KFsiYm9keSIsICJodG1sIl0pOwpjbGFzcyBYaHRtbE9iamVjdCBleHRlbmRzIFhtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcywgbmFtZSkgewogICAgc3VwZXIoWEhUTUxfTlNfSUQsIG5hbWUpOwogICAgdGhpc1skcmljaFRleHRdID0gZmFsc2U7CiAgICB0aGlzLnN0eWxlID0gYXR0cmlidXRlcy5zdHlsZSB8fCAiIjsKICB9CiAgWyRjbGVhbl0oYnVpbGRlcikgewogICAgc3VwZXJbJGNsZWFuXShidWlsZGVyKTsKICAgIHRoaXMuc3R5bGUgPSBjaGVja1N0eWxlKHRoaXMpOwogIH0KICBbJGFjY2VwdFdoaXRlc3BhY2VdKCkgewogICAgcmV0dXJuICFOb1doaXRlcy5oYXModGhpc1skbm9kZU5hbWVdKTsKICB9CiAgWyRvblRleHRdKHN0ciwgcmljaFRleHQgPSBmYWxzZSkgewogICAgaWYgKCFyaWNoVGV4dCkgewogICAgICBzdHIgPSBzdHIucmVwbGFjZUFsbChjcmxmUmVnRXhwLCAiIik7CiAgICAgIGlmICghdGhpcy5zdHlsZS5pbmNsdWRlcygieGZhLXNwYWNlcnVuOnllcyIpKSB7CiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2VBbGwoc3BhY2VzUmVnRXhwLCAiICIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzWyRyaWNoVGV4dF0gPSB0cnVlOwogICAgfQogICAgaWYgKHN0cikgewogICAgICB0aGlzWyRjb250ZW50XSArPSBzdHI7CiAgICB9CiAgfQogIFskcHVzaEdseXBoc10obWVhc3VyZSwgbXVzdFBvcCA9IHRydWUpIHsKICAgIGNvbnN0IHhmYUZvbnQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgY29uc3QgbWFyZ2luID0gewogICAgICB0b3A6IE5hTiwKICAgICAgYm90dG9tOiBOYU4sCiAgICAgIGxlZnQ6IE5hTiwKICAgICAgcmlnaHQ6IE5hTgogICAgfTsKICAgIGxldCBsaW5lSGVpZ2h0ID0gbnVsbDsKICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuc3R5bGUuc3BsaXQoIjsiKS5tYXAocyA9PiBzLnNwbGl0KCI6IiwgMikpKSB7CiAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgY2FzZSAiZm9udC1mYW1pbHkiOgogICAgICAgICAgeGZhRm9udC50eXBlZmFjZSA9IHN0cmlwUXVvdGVzKHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImZvbnQtc2l6ZSI6CiAgICAgICAgICB4ZmFGb250LnNpemUgPSBnZXRNZWFzdXJlbWVudCh2YWx1ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJmb250LXdlaWdodCI6CiAgICAgICAgICB4ZmFGb250LndlaWdodCA9IHZhbHVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZm9udC1zdHlsZSI6CiAgICAgICAgICB4ZmFGb250LnBvc3R1cmUgPSB2YWx1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxldHRlci1zcGFjaW5nIjoKICAgICAgICAgIHhmYUZvbnQubGV0dGVyU3BhY2luZyA9IGdldE1lYXN1cmVtZW50KHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm1hcmdpbiI6CiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgvIFx0LykubWFwKHggPT4gZ2V0TWVhc3VyZW1lbnQoeCkpOwogICAgICAgICAgc3dpdGNoICh2YWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gbWFyZ2luLmJvdHRvbSA9IG1hcmdpbi5sZWZ0ID0gbWFyZ2luLnJpZ2h0ID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgbWFyZ2luLnRvcCA9IG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMF07CiAgICAgICAgICAgICAgbWFyZ2luLmxlZnQgPSBtYXJnaW4ucmlnaHQgPSB2YWx1ZXNbMV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMl07CiAgICAgICAgICAgICAgbWFyZ2luLmxlZnQgPSBtYXJnaW4ucmlnaHQgPSB2YWx1ZXNbMV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIG1hcmdpbi5sZWZ0ID0gdmFsdWVzWzFdOwogICAgICAgICAgICAgIG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMl07CiAgICAgICAgICAgICAgbWFyZ2luLnJpZ2h0ID0gdmFsdWVzWzNdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLXRvcCI6CiAgICAgICAgICBtYXJnaW4udG9wID0gZ2V0TWVhc3VyZW1lbnQodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLWJvdHRvbSI6CiAgICAgICAgICBtYXJnaW4uYm90dG9tID0gZ2V0TWVhc3VyZW1lbnQodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLWxlZnQiOgogICAgICAgICAgbWFyZ2luLmxlZnQgPSBnZXRNZWFzdXJlbWVudCh2YWx1ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtYXJnaW4tcmlnaHQiOgogICAgICAgICAgbWFyZ2luLnJpZ2h0ID0gZ2V0TWVhc3VyZW1lbnQodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibGluZS1oZWlnaHQiOgogICAgICAgICAgbGluZUhlaWdodCA9IGdldE1lYXN1cmVtZW50KHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBtZWFzdXJlLnB1c2hEYXRhKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCk7CiAgICBpZiAodGhpc1skY29udGVudF0pIHsKICAgICAgbWVhc3VyZS5hZGRTdHJpbmcodGhpc1skY29udGVudF0pOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzWyRnZXRDaGlsZHJlbl0oKSkgewogICAgICAgIGlmIChjaGlsZFskbm9kZU5hbWVdID09PSAiI3RleHQiKSB7CiAgICAgICAgICBtZWFzdXJlLmFkZFN0cmluZyhjaGlsZFskY29udGVudF0pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNoaWxkWyRwdXNoR2x5cGhzXShtZWFzdXJlKTsKICAgICAgfQogICAgfQogICAgaWYgKG11c3RQb3ApIHsKICAgICAgbWVhc3VyZS5wb3BGb250KCk7CiAgICB9CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIHRoaXNbJGV4dHJhXSA9IHsKICAgICAgY2hpbGRyZW4KICAgIH07CiAgICB0aGlzWyRjaGlsZHJlblRvSFRNTF0oe30pOwogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpc1skY29udGVudF0pIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBsZXQgdmFsdWU7CiAgICBpZiAodGhpc1skcmljaFRleHRdKSB7CiAgICAgIHZhbHVlID0gdGhpc1skY29udGVudF0gPyB0aGlzWyRjb250ZW50XS5yZXBsYWNlQWxsKGNybGZGb3JSaWNoVGV4dFJlZ0V4cCwgIlxuIikgOiB1bmRlZmluZWQ7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZSA9IHRoaXNbJGNvbnRlbnRdIHx8IHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiB0aGlzWyRub2RlTmFtZV0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBocmVmOiB0aGlzLmhyZWYsCiAgICAgICAgc3R5bGU6IG1hcFN0eWxlKHRoaXMuc3R5bGUsIHRoaXMsIHRoaXNbJHJpY2hUZXh0XSkKICAgICAgfSwKICAgICAgY2hpbGRyZW4sCiAgICAgIHZhbHVlCiAgICB9KTsKICB9Cn0KY2xhc3MgQSBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAiYSIpOwogICAgdGhpcy5ocmVmID0gZml4VVJMKGF0dHJpYnV0ZXMuaHJlZikgfHwgIiI7CiAgfQp9CmNsYXNzIEIgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImIiKTsKICB9CiAgWyRwdXNoR2x5cGhzXShtZWFzdXJlKSB7CiAgICBtZWFzdXJlLnB1c2hGb250KHsKICAgICAgd2VpZ2h0OiAiYm9sZCIKICAgIH0pOwogICAgc3VwZXJbJHB1c2hHbHlwaHNdKG1lYXN1cmUpOwogICAgbWVhc3VyZS5wb3BGb250KCk7CiAgfQp9CmNsYXNzIEJvZHkgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImJvZHkiKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCByZXMgPSBzdXBlclskdG9IVE1MXShhdmFpbGFibGVTcGFjZSk7CiAgICBjb25zdCB7CiAgICAgIGh0bWwKICAgIH0gPSByZXM7CiAgICBpZiAoIWh0bWwpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBodG1sLm5hbWUgPSAiZGl2IjsKICAgIGh0bWwuYXR0cmlidXRlcy5jbGFzcyA9IFsieGZhUmljaCJdOwogICAgcmV0dXJuIHJlczsKICB9Cn0KY2xhc3MgQnIgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImJyIik7CiAgfQogIFskdGV4dF0oKSB7CiAgICByZXR1cm4gIlxuIjsKICB9CiAgWyRwdXNoR2x5cGhzXShtZWFzdXJlKSB7CiAgICBtZWFzdXJlLmFkZFN0cmluZygiXG4iKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImJyIgogICAgfSk7CiAgfQp9CmNsYXNzIEh0bWwgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImh0bWwiKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgdGhpc1skZXh0cmFdID0gewogICAgICBjaGlsZHJlbgogICAgfTsKICAgIHRoaXNbJGNoaWxkcmVuVG9IVE1MXSh7fSk7CiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICAgIG5hbWU6ICJkaXYiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIGNsYXNzOiBbInhmYVJpY2giXSwKICAgICAgICAgIHN0eWxlOiB7fQogICAgICAgIH0sCiAgICAgICAgdmFsdWU6IHRoaXNbJGNvbnRlbnRdIHx8ICIiCiAgICAgIH0pOwogICAgfQogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkgewogICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuWzBdOwogICAgICBpZiAoY2hpbGQuYXR0cmlidXRlcz8uY2xhc3MuaW5jbHVkZXMoInhmYVJpY2giKSkgewogICAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoY2hpbGQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFSaWNoIl0sCiAgICAgICAgc3R5bGU6IHt9CiAgICAgIH0sCiAgICAgIGNoaWxkcmVuCiAgICB9KTsKICB9Cn0KY2xhc3MgSSBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAiaSIpOwogIH0KICBbJHB1c2hHbHlwaHNdKG1lYXN1cmUpIHsKICAgIG1lYXN1cmUucHVzaEZvbnQoewogICAgICBwb3N0dXJlOiAiaXRhbGljIgogICAgfSk7CiAgICBzdXBlclskcHVzaEdseXBoc10obWVhc3VyZSk7CiAgICBtZWFzdXJlLnBvcEZvbnQoKTsKICB9Cn0KY2xhc3MgTGkgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImxpIik7CiAgfQp9CmNsYXNzIE9sIGV4dGVuZHMgWGh0bWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKGF0dHJpYnV0ZXMsICJvbCIpOwogIH0KfQpjbGFzcyBQIGV4dGVuZHMgWGh0bWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKGF0dHJpYnV0ZXMsICJwIik7CiAgfQogIFskcHVzaEdseXBoc10obWVhc3VyZSkgewogICAgc3VwZXJbJHB1c2hHbHlwaHNdKG1lYXN1cmUsIGZhbHNlKTsKICAgIG1lYXN1cmUuYWRkU3RyaW5nKCJcbiIpOwogICAgbWVhc3VyZS5hZGRQYXJhKCk7CiAgICBtZWFzdXJlLnBvcEZvbnQoKTsKICB9CiAgWyR0ZXh0XSgpIHsKICAgIGNvbnN0IHNpYmxpbmdzID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRDaGlsZHJlbl0oKTsKICAgIGlmIChzaWJsaW5ncy5hdCgtMSkgPT09IHRoaXMpIHsKICAgICAgcmV0dXJuIHN1cGVyWyR0ZXh0XSgpOwogICAgfQogICAgcmV0dXJuIHN1cGVyWyR0ZXh0XSgpICsgIlxuIjsKICB9Cn0KY2xhc3MgU3BhbiBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAic3BhbiIpOwogIH0KfQpjbGFzcyBTdWIgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgInN1YiIpOwogIH0KfQpjbGFzcyBTdXAgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgInN1cCIpOwogIH0KfQpjbGFzcyBVbCBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAidWwiKTsKICB9Cn0KY2xhc3MgWGh0bWxOYW1lc3BhY2UgewogIHN0YXRpYyBbJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB7CiAgICBpZiAoWGh0bWxOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIFhodG1sTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGEoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBBKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgYihhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gbmV3IEIoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBib2R5KGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgQm9keShhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIGJyKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgQnIoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBodG1sKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgSHRtbChhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIGkoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBJKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgbGkoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBMaShhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIG9sKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgT2woYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBwKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgUChhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIHNwYW4oYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBTcGFuKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgc3ViKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgU3ViKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgc3VwKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgU3VwKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgdWwoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBVbChhdHRyaWJ1dGVzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9zZXR1cC5qcwoKCgoKCgoKCgpjb25zdCBOYW1lc3BhY2VTZXRVcCA9IHsKICBjb25maWc6IENvbmZpZ05hbWVzcGFjZSwKICBjb25uZWN0aW9uOiBDb25uZWN0aW9uU2V0TmFtZXNwYWNlLAogIGRhdGFzZXRzOiBEYXRhc2V0c05hbWVzcGFjZSwKICBsb2NhbGVTZXQ6IExvY2FsZVNldE5hbWVzcGFjZSwKICBzaWduYXR1cmU6IFNpZ25hdHVyZU5hbWVzcGFjZSwKICBzdHlsZXNoZWV0OiBTdHlsZXNoZWV0TmFtZXNwYWNlLAogIHRlbXBsYXRlOiBUZW1wbGF0ZU5hbWVzcGFjZSwKICB4ZHA6IFhkcE5hbWVzcGFjZSwKICB4aHRtbDogWGh0bWxOYW1lc3BhY2UKfTsKCjsvLyAuL3NyYy9jb3JlL3hmYS91bmtub3duLmpzCgoKY2xhc3MgVW5rbm93bk5hbWVzcGFjZSB7CiAgY29uc3RydWN0b3IobnNJZCkgewogICAgdGhpcy5uYW1lc3BhY2VJZCA9IG5zSWQ7CiAgfQogIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgWG1sT2JqZWN0KHRoaXMubmFtZXNwYWNlSWQsIG5hbWUsIGF0dHJpYnV0ZXMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2J1aWxkZXIuanMKCgoKCgoKCmNsYXNzIFJvb3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGlkcykgewogICAgc3VwZXIoLTEsICJyb290IiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7CiAgICB0aGlzLmVsZW1lbnQgPSBudWxsOwogICAgdGhpc1skaWRzXSA9IGlkczsKICB9CiAgWyRvbkNoaWxkXShjaGlsZCkgewogICAgdGhpcy5lbGVtZW50ID0gY2hpbGQ7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBzdXBlclskZmluYWxpemVdKCk7CiAgICBpZiAodGhpcy5lbGVtZW50LnRlbXBsYXRlIGluc3RhbmNlb2YgVGVtcGxhdGUpIHsKICAgICAgdGhpc1skaWRzXS5zZXQoJHJvb3QsIHRoaXMuZWxlbWVudCk7CiAgICAgIHRoaXMuZWxlbWVudC50ZW1wbGF0ZVskcmVzb2x2ZVByb3RvdHlwZXNdKHRoaXNbJGlkc10pOwogICAgICB0aGlzLmVsZW1lbnQudGVtcGxhdGVbJGlkc10gPSB0aGlzWyRpZHNdOwogICAgfQogIH0KfQpjbGFzcyBFbXB0eSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlcigtMSwgIiIsIE9iamVjdC5jcmVhdGUobnVsbCkpOwogIH0KICBbJG9uQ2hpbGRdKF8pIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KY2xhc3MgQnVpbGRlciB7CiAgY29uc3RydWN0b3Iocm9vdE5hbWVTcGFjZSA9IG51bGwpIHsKICAgIHRoaXMuX25hbWVzcGFjZVN0YWNrID0gW107CiAgICB0aGlzLl9uc0Fnbm9zdGljTGV2ZWwgPSAwOwogICAgdGhpcy5fbmFtZXNwYWNlUHJlZml4ZXMgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9uYW1lc3BhY2VzID0gbmV3IE1hcCgpOwogICAgdGhpcy5fbmV4dE5zSWQgPSBNYXRoLm1heCguLi5PYmplY3QudmFsdWVzKE5hbWVzcGFjZUlkcykubWFwKCh7CiAgICAgIGlkCiAgICB9KSA9PiBpZCkpOwogICAgdGhpcy5fY3VycmVudE5hbWVzcGFjZSA9IHJvb3ROYW1lU3BhY2UgfHwgbmV3IFVua25vd25OYW1lc3BhY2UoKyt0aGlzLl9uZXh0TnNJZCk7CiAgfQogIGJ1aWxkUm9vdChpZHMpIHsKICAgIHJldHVybiBuZXcgUm9vdChpZHMpOwogIH0KICBidWlsZCh7CiAgICBuc1ByZWZpeCwKICAgIG5hbWUsCiAgICBhdHRyaWJ1dGVzLAogICAgbmFtZXNwYWNlLAogICAgcHJlZml4ZXMKICB9KSB7CiAgICBjb25zdCBoYXNOYW1lc3BhY2VEZWYgPSBuYW1lc3BhY2UgIT09IG51bGw7CiAgICBpZiAoaGFzTmFtZXNwYWNlRGVmKSB7CiAgICAgIHRoaXMuX25hbWVzcGFjZVN0YWNrLnB1c2godGhpcy5fY3VycmVudE5hbWVzcGFjZSk7CiAgICAgIHRoaXMuX2N1cnJlbnROYW1lc3BhY2UgPSB0aGlzLl9zZWFyY2hOYW1lc3BhY2UobmFtZXNwYWNlKTsKICAgIH0KICAgIGlmIChwcmVmaXhlcykgewogICAgICB0aGlzLl9hZGROYW1lc3BhY2VQcmVmaXgocHJlZml4ZXMpOwogICAgfQogICAgaWYgKGF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoJG5zQXR0cmlidXRlcykpIHsKICAgICAgY29uc3QgZGF0YVRlbXBsYXRlID0gTmFtZXNwYWNlU2V0VXAuZGF0YXNldHM7CiAgICAgIGNvbnN0IG5zQXR0cnMgPSBhdHRyaWJ1dGVzWyRuc0F0dHJpYnV0ZXNdOwogICAgICBsZXQgeGZhQXR0cnMgPSBudWxsOwogICAgICBmb3IgKGNvbnN0IFtucywgYXR0cnNdIG9mIE9iamVjdC5lbnRyaWVzKG5zQXR0cnMpKSB7CiAgICAgICAgY29uc3QgbnNUb1VzZSA9IHRoaXMuX2dldE5hbWVzcGFjZVRvVXNlKG5zKTsKICAgICAgICBpZiAobnNUb1VzZSA9PT0gZGF0YVRlbXBsYXRlKSB7CiAgICAgICAgICB4ZmFBdHRycyA9IHsKICAgICAgICAgICAgeGZhOiBhdHRycwogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoeGZhQXR0cnMpIHsKICAgICAgICBhdHRyaWJ1dGVzWyRuc0F0dHJpYnV0ZXNdID0geGZhQXR0cnM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXNbJG5zQXR0cmlidXRlc107CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG5hbWVzcGFjZVRvVXNlID0gdGhpcy5fZ2V0TmFtZXNwYWNlVG9Vc2UobnNQcmVmaXgpOwogICAgY29uc3Qgbm9kZSA9IG5hbWVzcGFjZVRvVXNlPy5bJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB8fCBuZXcgRW1wdHkoKTsKICAgIGlmIChub2RlWyRpc05zQWdub3N0aWNdKCkpIHsKICAgICAgdGhpcy5fbnNBZ25vc3RpY0xldmVsKys7CiAgICB9CiAgICBpZiAoaGFzTmFtZXNwYWNlRGVmIHx8IHByZWZpeGVzIHx8IG5vZGVbJGlzTnNBZ25vc3RpY10oKSkgewogICAgICBub2RlWyRjbGVhbnVwXSA9IHsKICAgICAgICBoYXNOYW1lc3BhY2U6IGhhc05hbWVzcGFjZURlZiwKICAgICAgICBwcmVmaXhlcywKICAgICAgICBuc0Fnbm9zdGljOiBub2RlWyRpc05zQWdub3N0aWNdKCkKICAgICAgfTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KICBpc05zQWdub3N0aWMoKSB7CiAgICByZXR1cm4gdGhpcy5fbnNBZ25vc3RpY0xldmVsID4gMDsKICB9CiAgX3NlYXJjaE5hbWVzcGFjZShuc05hbWUpIHsKICAgIGxldCBucyA9IHRoaXMuX25hbWVzcGFjZXMuZ2V0KG5zTmFtZSk7CiAgICBpZiAobnMpIHsKICAgICAgcmV0dXJuIG5zOwogICAgfQogICAgZm9yIChjb25zdCBbbmFtZSwgewogICAgICBjaGVjawogICAgfV0gb2YgT2JqZWN0LmVudHJpZXMoTmFtZXNwYWNlSWRzKSkgewogICAgICBpZiAoY2hlY2sobnNOYW1lKSkgewogICAgICAgIG5zID0gTmFtZXNwYWNlU2V0VXBbbmFtZV07CiAgICAgICAgaWYgKG5zKSB7CiAgICAgICAgICB0aGlzLl9uYW1lc3BhY2VzLnNldChuc05hbWUsIG5zKTsKICAgICAgICAgIHJldHVybiBuczsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIG5zID0gbmV3IFVua25vd25OYW1lc3BhY2UoKyt0aGlzLl9uZXh0TnNJZCk7CiAgICB0aGlzLl9uYW1lc3BhY2VzLnNldChuc05hbWUsIG5zKTsKICAgIHJldHVybiBuczsKICB9CiAgX2FkZE5hbWVzcGFjZVByZWZpeChwcmVmaXhlcykgewogICAgZm9yIChjb25zdCB7CiAgICAgIHByZWZpeCwKICAgICAgdmFsdWUKICAgIH0gb2YgcHJlZml4ZXMpIHsKICAgICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5fc2VhcmNoTmFtZXNwYWNlKHZhbHVlKTsKICAgICAgbGV0IHByZWZpeFN0YWNrID0gdGhpcy5fbmFtZXNwYWNlUHJlZml4ZXMuZ2V0KHByZWZpeCk7CiAgICAgIGlmICghcHJlZml4U3RhY2spIHsKICAgICAgICBwcmVmaXhTdGFjayA9IFtdOwogICAgICAgIHRoaXMuX25hbWVzcGFjZVByZWZpeGVzLnNldChwcmVmaXgsIHByZWZpeFN0YWNrKTsKICAgICAgfQogICAgICBwcmVmaXhTdGFjay5wdXNoKG5hbWVzcGFjZSk7CiAgICB9CiAgfQogIF9nZXROYW1lc3BhY2VUb1VzZShwcmVmaXgpIHsKICAgIGlmICghcHJlZml4KSB7CiAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50TmFtZXNwYWNlOwogICAgfQogICAgY29uc3QgcHJlZml4U3RhY2sgPSB0aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5nZXQocHJlZml4KTsKICAgIGlmIChwcmVmaXhTdGFjaz8ubGVuZ3RoID4gMCkgewogICAgICByZXR1cm4gcHJlZml4U3RhY2suYXQoLTEpOwogICAgfQogICAgd2FybihgVW5rbm93biBuYW1lc3BhY2UgcHJlZml4OiAke3ByZWZpeH0uYCk7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY2xlYW4oZGF0YSkgewogICAgY29uc3QgewogICAgICBoYXNOYW1lc3BhY2UsCiAgICAgIHByZWZpeGVzLAogICAgICBuc0Fnbm9zdGljCiAgICB9ID0gZGF0YTsKICAgIGlmIChoYXNOYW1lc3BhY2UpIHsKICAgICAgdGhpcy5fY3VycmVudE5hbWVzcGFjZSA9IHRoaXMuX25hbWVzcGFjZVN0YWNrLnBvcCgpOwogICAgfQogICAgaWYgKHByZWZpeGVzKSB7CiAgICAgIHByZWZpeGVzLmZvckVhY2goKHsKICAgICAgICBwcmVmaXgKICAgICAgfSkgPT4gewogICAgICAgIHRoaXMuX25hbWVzcGFjZVByZWZpeGVzLmdldChwcmVmaXgpLnBvcCgpOwogICAgICB9KTsKICAgIH0KICAgIGlmIChuc0Fnbm9zdGljKSB7CiAgICAgIHRoaXMuX25zQWdub3N0aWNMZXZlbC0tOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL3BhcnNlci5qcwoKCgoKY2xhc3MgWEZBUGFyc2VyIGV4dGVuZHMgWE1MUGFyc2VyQmFzZSB7CiAgY29uc3RydWN0b3Iocm9vdE5hbWVTcGFjZSA9IG51bGwsIHJpY2hUZXh0ID0gZmFsc2UpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9idWlsZGVyID0gbmV3IEJ1aWxkZXIocm9vdE5hbWVTcGFjZSk7CiAgICB0aGlzLl9zdGFjayA9IFtdOwogICAgdGhpcy5fZ2xvYmFsRGF0YSA9IHsKICAgICAgdXNlZFR5cGVmYWNlczogbmV3IFNldCgpCiAgICB9OwogICAgdGhpcy5faWRzID0gbmV3IE1hcCgpOwogICAgdGhpcy5fY3VycmVudCA9IHRoaXMuX2J1aWxkZXIuYnVpbGRSb290KHRoaXMuX2lkcyk7CiAgICB0aGlzLl9lcnJvckNvZGUgPSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcjsKICAgIHRoaXMuX3doaXRlUmVnZXggPSAvXlxzKyQvOwogICAgdGhpcy5fbmJzcHMgPSAvXHhhMCsvZzsKICAgIHRoaXMuX3JpY2hUZXh0ID0gcmljaFRleHQ7CiAgfQogIHBhcnNlKGRhdGEpIHsKICAgIHRoaXMucGFyc2VYbWwoZGF0YSk7CiAgICBpZiAodGhpcy5fZXJyb3JDb2RlICE9PSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcikgewogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogICAgdGhpcy5fY3VycmVudFskZmluYWxpemVdKCk7CiAgICByZXR1cm4gdGhpcy5fY3VycmVudC5lbGVtZW50OwogIH0KICBvblRleHQodGV4dCkgewogICAgdGV4dCA9IHRleHQucmVwbGFjZSh0aGlzLl9uYnNwcywgbWF0Y2ggPT4gbWF0Y2guc2xpY2UoMSkgKyAiICIpOwogICAgaWYgKHRoaXMuX3JpY2hUZXh0IHx8IHRoaXMuX2N1cnJlbnRbJGFjY2VwdFdoaXRlc3BhY2VdKCkpIHsKICAgICAgdGhpcy5fY3VycmVudFskb25UZXh0XSh0ZXh0LCB0aGlzLl9yaWNoVGV4dCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLl93aGl0ZVJlZ2V4LnRlc3QodGV4dCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5fY3VycmVudFskb25UZXh0XSh0ZXh0LnRyaW0oKSk7CiAgfQogIG9uQ2RhdGEodGV4dCkgewogICAgdGhpcy5fY3VycmVudFskb25UZXh0XSh0ZXh0KTsKICB9CiAgX21rQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCB0YWdOYW1lKSB7CiAgICBsZXQgbmFtZXNwYWNlID0gbnVsbDsKICAgIGxldCBwcmVmaXhlcyA9IG51bGw7CiAgICBjb25zdCBhdHRyaWJ1dGVPYmogPSBPYmplY3QuY3JlYXRlKHt9KTsKICAgIGZvciAoY29uc3QgewogICAgICBuYW1lLAogICAgICB2YWx1ZQogICAgfSBvZiBhdHRyaWJ1dGVzKSB7CiAgICAgIGlmIChuYW1lID09PSAieG1sbnMiKSB7CiAgICAgICAgaWYgKCFuYW1lc3BhY2UpIHsKICAgICAgICAgIG5hbWVzcGFjZSA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3YXJuKGBYRkEgLSBtdWx0aXBsZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBpbiA8JHt0YWdOYW1lfT5gKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSkgewogICAgICAgIGNvbnN0IHByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKCJ4bWxuczoiLmxlbmd0aCk7CiAgICAgICAgaWYgKCFwcmVmaXhlcykgewogICAgICAgICAgcHJlZml4ZXMgPSBbXTsKICAgICAgICB9CiAgICAgICAgcHJlZml4ZXMucHVzaCh7CiAgICAgICAgICBwcmVmaXgsCiAgICAgICAgICB2YWx1ZQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGkgPSBuYW1lLmluZGV4T2YoIjoiKTsKICAgICAgICBpZiAoaSA9PT0gLTEpIHsKICAgICAgICAgIGF0dHJpYnV0ZU9ialtuYW1lXSA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsZXQgbnNBdHRycyA9IGF0dHJpYnV0ZU9ialskbnNBdHRyaWJ1dGVzXTsKICAgICAgICAgIGlmICghbnNBdHRycykgewogICAgICAgICAgICBuc0F0dHJzID0gYXR0cmlidXRlT2JqWyRuc0F0dHJpYnV0ZXNdID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IFtucywgYXR0ck5hbWVdID0gW25hbWUuc2xpY2UoMCwgaSksIG5hbWUuc2xpY2UoaSArIDEpXTsKICAgICAgICAgIGNvbnN0IGF0dHJzID0gbnNBdHRyc1tuc10gfHw9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICBhdHRyc1thdHRyTmFtZV0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBbbmFtZXNwYWNlLCBwcmVmaXhlcywgYXR0cmlidXRlT2JqXTsKICB9CiAgX2dldE5hbWVBbmRQcmVmaXgobmFtZSwgbnNBZ25vc3RpYykgewogICAgY29uc3QgaSA9IG5hbWUuaW5kZXhPZigiOiIpOwogICAgaWYgKGkgPT09IC0xKSB7CiAgICAgIHJldHVybiBbbmFtZSwgbnVsbF07CiAgICB9CiAgICByZXR1cm4gW25hbWUuc3Vic3RyaW5nKGkgKyAxKSwgbnNBZ25vc3RpYyA/ICIiIDogbmFtZS5zdWJzdHJpbmcoMCwgaSldOwogIH0KICBvbkJlZ2luRWxlbWVudCh0YWdOYW1lLCBhdHRyaWJ1dGVzLCBpc0VtcHR5KSB7CiAgICBjb25zdCBbbmFtZXNwYWNlLCBwcmVmaXhlcywgYXR0cmlidXRlc09ial0gPSB0aGlzLl9ta0F0dHJpYnV0ZXMoYXR0cmlidXRlcywgdGFnTmFtZSk7CiAgICBjb25zdCBbbmFtZSwgbnNQcmVmaXhdID0gdGhpcy5fZ2V0TmFtZUFuZFByZWZpeCh0YWdOYW1lLCB0aGlzLl9idWlsZGVyLmlzTnNBZ25vc3RpYygpKTsKICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9idWlsZGVyLmJ1aWxkKHsKICAgICAgbnNQcmVmaXgsCiAgICAgIG5hbWUsCiAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXNPYmosCiAgICAgIG5hbWVzcGFjZSwKICAgICAgcHJlZml4ZXMKICAgIH0pOwogICAgbm9kZVskZ2xvYmFsRGF0YV0gPSB0aGlzLl9nbG9iYWxEYXRhOwogICAgaWYgKGlzRW1wdHkpIHsKICAgICAgbm9kZVskZmluYWxpemVdKCk7CiAgICAgIGlmICh0aGlzLl9jdXJyZW50WyRvbkNoaWxkXShub2RlKSkgewogICAgICAgIG5vZGVbJHNldElkXSh0aGlzLl9pZHMpOwogICAgICB9CiAgICAgIG5vZGVbJGNsZWFuXSh0aGlzLl9idWlsZGVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5fc3RhY2sucHVzaCh0aGlzLl9jdXJyZW50KTsKICAgIHRoaXMuX2N1cnJlbnQgPSBub2RlOwogIH0KICBvbkVuZEVsZW1lbnQobmFtZSkgewogICAgY29uc3Qgbm9kZSA9IHRoaXMuX2N1cnJlbnQ7CiAgICBpZiAobm9kZVskaXNDREFUQVhtbF0oKSAmJiB0eXBlb2Ygbm9kZVskY29udGVudF0gPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBYRkFQYXJzZXIoKTsKICAgICAgcGFyc2VyLl9nbG9iYWxEYXRhID0gdGhpcy5fZ2xvYmFsRGF0YTsKICAgICAgY29uc3Qgcm9vdCA9IHBhcnNlci5wYXJzZShub2RlWyRjb250ZW50XSk7CiAgICAgIG5vZGVbJGNvbnRlbnRdID0gbnVsbDsKICAgICAgbm9kZVskb25DaGlsZF0ocm9vdCk7CiAgICB9CiAgICBub2RlWyRmaW5hbGl6ZV0oKTsKICAgIHRoaXMuX2N1cnJlbnQgPSB0aGlzLl9zdGFjay5wb3AoKTsKICAgIGlmICh0aGlzLl9jdXJyZW50WyRvbkNoaWxkXShub2RlKSkgewogICAgICBub2RlWyRzZXRJZF0odGhpcy5faWRzKTsKICAgIH0KICAgIG5vZGVbJGNsZWFuXSh0aGlzLl9idWlsZGVyKTsKICB9CiAgb25FcnJvcihjb2RlKSB7CiAgICB0aGlzLl9lcnJvckNvZGUgPSBjb2RlOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2ZhY3RvcnkuanMKCgoKCgoKCgpjbGFzcyBYRkFGYWN0b3J5IHsKICBjb25zdHJ1Y3RvcihkYXRhKSB7CiAgICB0cnkgewogICAgICB0aGlzLnJvb3QgPSBuZXcgWEZBUGFyc2VyKCkucGFyc2UoWEZBRmFjdG9yeS5fY3JlYXRlRG9jdW1lbnQoZGF0YSkpOwogICAgICBjb25zdCBiaW5kZXIgPSBuZXcgQmluZGVyKHRoaXMucm9vdCk7CiAgICAgIHRoaXMuZm9ybSA9IGJpbmRlci5iaW5kKCk7CiAgICAgIHRoaXMuZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIodGhpcy5yb290LCBiaW5kZXIuZ2V0RGF0YSgpKTsKICAgICAgdGhpcy5mb3JtWyRnbG9iYWxEYXRhXS50ZW1wbGF0ZSA9IHRoaXMuZm9ybTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgd2FybihgWEZBIC0gYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBhcnNpbmcgYW5kIGJpbmRpbmc6ICR7ZX1gKTsKICAgIH0KICB9CiAgaXNWYWxpZCgpIHsKICAgIHJldHVybiB0aGlzLnJvb3QgJiYgdGhpcy5mb3JtOwogIH0KICBfY3JlYXRlUGFnZXNIZWxwZXIoKSB7CiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuZm9ybVskdG9QYWdlc10oKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgIGNvbnN0IG5leHRJdGVyYXRpb24gPSAoKSA9PiB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHZhbHVlID0gaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgaWYgKHZhbHVlLmRvbmUpIHsKICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZS52YWx1ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXRUaW1lb3V0KG5leHRJdGVyYXRpb24sIDApOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHJlamVjdChlKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHNldFRpbWVvdXQobmV4dEl0ZXJhdGlvbiwgMCk7CiAgICB9KTsKICB9CiAgYXN5bmMgX2NyZWF0ZVBhZ2VzKCkgewogICAgdHJ5IHsKICAgICAgdGhpcy5wYWdlcyA9IGF3YWl0IHRoaXMuX2NyZWF0ZVBhZ2VzSGVscGVyKCk7CiAgICAgIHRoaXMuZGltcyA9IHRoaXMucGFnZXMuY2hpbGRyZW4ubWFwKGMgPT4gewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIHdpZHRoLAogICAgICAgICAgaGVpZ2h0CiAgICAgICAgfSA9IGMuYXR0cmlidXRlcy5zdHlsZTsKICAgICAgICByZXR1cm4gWzAsIDAsIHBhcnNlSW50KHdpZHRoKSwgcGFyc2VJbnQoaGVpZ2h0KV07CiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICB3YXJuKGBYRkEgLSBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgbGF5b3V0OiAke2V9YCk7CiAgICB9CiAgfQogIGdldEJvdW5kaW5nQm94KHBhZ2VJbmRleCkgewogICAgcmV0dXJuIHRoaXMuZGltc1twYWdlSW5kZXhdOwogIH0KICBhc3luYyBnZXROdW1QYWdlcygpIHsKICAgIGlmICghdGhpcy5wYWdlcykgewogICAgICBhd2FpdCB0aGlzLl9jcmVhdGVQYWdlcygpOwogICAgfQogICAgcmV0dXJuIHRoaXMuZGltcy5sZW5ndGg7CiAgfQogIHNldEltYWdlcyhpbWFnZXMpIHsKICAgIHRoaXMuZm9ybVskZ2xvYmFsRGF0YV0uaW1hZ2VzID0gaW1hZ2VzOwogIH0KICBzZXRGb250cyhmb250cykgewogICAgdGhpcy5mb3JtWyRnbG9iYWxEYXRhXS5mb250RmluZGVyID0gbmV3IEZvbnRGaW5kZXIoZm9udHMpOwogICAgY29uc3QgbWlzc2luZ0ZvbnRzID0gW107CiAgICBmb3IgKGxldCB0eXBlZmFjZSBvZiB0aGlzLmZvcm1bJGdsb2JhbERhdGFdLnVzZWRUeXBlZmFjZXMpIHsKICAgICAgdHlwZWZhY2UgPSBzdHJpcFF1b3Rlcyh0eXBlZmFjZSk7CiAgICAgIGNvbnN0IGZvbnQgPSB0aGlzLmZvcm1bJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIuZmluZCh0eXBlZmFjZSk7CiAgICAgIGlmICghZm9udCkgewogICAgICAgIG1pc3NpbmdGb250cy5wdXNoKHR5cGVmYWNlKTsKICAgICAgfQogICAgfQogICAgaWYgKG1pc3NpbmdGb250cy5sZW5ndGggPiAwKSB7CiAgICAgIHJldHVybiBtaXNzaW5nRm9udHM7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgYXBwZW5kRm9udHMoZm9udHMsIHJlYWxseU1pc3NpbmdGb250cykgewogICAgdGhpcy5mb3JtWyRnbG9iYWxEYXRhXS5mb250RmluZGVyLmFkZChmb250cywgcmVhbGx5TWlzc2luZ0ZvbnRzKTsKICB9CiAgYXN5bmMgZ2V0UGFnZXMoKSB7CiAgICBpZiAoIXRoaXMucGFnZXMpIHsKICAgICAgYXdhaXQgdGhpcy5fY3JlYXRlUGFnZXMoKTsKICAgIH0KICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5wYWdlczsKICAgIHRoaXMucGFnZXMgPSBudWxsOwogICAgcmV0dXJuIHBhZ2VzOwogIH0KICBzZXJpYWxpemVEYXRhKHN0b3JhZ2UpIHsKICAgIHJldHVybiB0aGlzLmRhdGFIYW5kbGVyLnNlcmlhbGl6ZShzdG9yYWdlKTsKICB9CiAgc3RhdGljIF9jcmVhdGVEb2N1bWVudChkYXRhKSB7CiAgICBpZiAoIWRhdGFbIi94ZHA6eGRwIl0pIHsKICAgICAgcmV0dXJuIGRhdGFbInhkcDp4ZHAiXTsKICAgIH0KICAgIHJldHVybiBPYmplY3QudmFsdWVzKGRhdGEpLmpvaW4oIiIpOwogIH0KICBzdGF0aWMgZ2V0UmljaFRleHRBc0h0bWwocmMpIHsKICAgIGlmICghcmMgfHwgdHlwZW9mIHJjICE9PSAic3RyaW5nIikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHRyeSB7CiAgICAgIGxldCByb290ID0gbmV3IFhGQVBhcnNlcihYaHRtbE5hbWVzcGFjZSwgdHJ1ZSkucGFyc2UocmMpOwogICAgICBpZiAoIVsiYm9keSIsICJ4aHRtbCJdLmluY2x1ZGVzKHJvb3RbJG5vZGVOYW1lXSkpIHsKICAgICAgICBjb25zdCBuZXdSb290ID0gWGh0bWxOYW1lc3BhY2UuYm9keSh7fSk7CiAgICAgICAgbmV3Um9vdFskYXBwZW5kQ2hpbGRdKHJvb3QpOwogICAgICAgIHJvb3QgPSBuZXdSb290OwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IHJvb3RbJHRvSFRNTF0oKTsKICAgICAgaWYgKCFyZXN1bHQuc3VjY2VzcykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IHsKICAgICAgICBodG1sCiAgICAgIH0gPSByZXN1bHQ7CiAgICAgIGNvbnN0IHsKICAgICAgICBhdHRyaWJ1dGVzCiAgICAgIH0gPSBodG1sOwogICAgICBpZiAoYXR0cmlidXRlcykgewogICAgICAgIGlmIChhdHRyaWJ1dGVzLmNsYXNzKSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzID0gYXR0cmlidXRlcy5jbGFzcy5maWx0ZXIoYXR0ciA9PiAhYXR0ci5zdGFydHNXaXRoKCJ4ZmEiKSk7CiAgICAgICAgfQogICAgICAgIGF0dHJpYnV0ZXMuZGlyID0gImF1dG8iOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgaHRtbCwKICAgICAgICBzdHI6IHJvb3RbJHRleHRdKCkKICAgICAgfTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgd2FybihgWEZBIC0gYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBhcnNpbmcgb2YgcmljaCB0ZXh0OiAke2V9YCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2Fubm90YXRpb24uanMKCgoKCgoKCgoKCgoKCgpjbGFzcyBBbm5vdGF0aW9uRmFjdG9yeSB7CiAgc3RhdGljIGNyZWF0ZUdsb2JhbHMocGRmTWFuYWdlcikgewogICAgcmV0dXJuIFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIiksIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJ4ZmFEYXRhc2V0cyIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInN0cnVjdFRyZWVSb290IiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYmFzZVVybCIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImF0dGFjaG1lbnRzIiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZ2xvYmFsQ29sb3JTcGFjZUNhY2hlIildKS50aGVuKChbYWNyb0Zvcm0sIHhmYURhdGFzZXRzLCBzdHJ1Y3RUcmVlUm9vdCwgYmFzZVVybCwgYXR0YWNobWVudHMsIGdsb2JhbENvbG9yU3BhY2VDYWNoZV0pID0+ICh7CiAgICAgIHBkZk1hbmFnZXIsCiAgICAgIGFjcm9Gb3JtOiBhY3JvRm9ybSBpbnN0YW5jZW9mIERpY3QgPyBhY3JvRm9ybSA6IERpY3QuZW1wdHksCiAgICAgIHhmYURhdGFzZXRzLAogICAgICBzdHJ1Y3RUcmVlUm9vdCwKICAgICAgYmFzZVVybCwKICAgICAgYXR0YWNobWVudHMsCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZQogICAgfSksIHJlYXNvbiA9PiB7CiAgICAgIHdhcm4oYGNyZWF0ZUdsb2JhbHM6ICIke3JlYXNvbn0iLmApOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0pOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlKHhyZWYsIHJlZiwgYW5ub3RhdGlvbkdsb2JhbHMsIGlkRmFjdG9yeSwgY29sbGVjdEZpZWxkcywgb3JwaGFuRmllbGRzLCBwYWdlUmVmKSB7CiAgICBjb25zdCBwYWdlSW5kZXggPSBjb2xsZWN0RmllbGRzID8gYXdhaXQgdGhpcy5fZ2V0UGFnZUluZGV4KHhyZWYsIHJlZiwgYW5ub3RhdGlvbkdsb2JhbHMucGRmTWFuYWdlcikgOiBudWxsOwogICAgcmV0dXJuIGFubm90YXRpb25HbG9iYWxzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJfY3JlYXRlIiwgW3hyZWYsIHJlZiwgYW5ub3RhdGlvbkdsb2JhbHMsIGlkRmFjdG9yeSwgY29sbGVjdEZpZWxkcywgb3JwaGFuRmllbGRzLCBwYWdlSW5kZXgsIHBhZ2VSZWZdKTsKICB9CiAgc3RhdGljIF9jcmVhdGUoeHJlZiwgcmVmLCBhbm5vdGF0aW9uR2xvYmFscywgaWRGYWN0b3J5LCBjb2xsZWN0RmllbGRzID0gZmFsc2UsIG9ycGhhbkZpZWxkcyA9IG51bGwsIHBhZ2VJbmRleCA9IG51bGwsIHBhZ2VSZWYgPSBudWxsKSB7CiAgICBjb25zdCBkaWN0ID0geHJlZi5mZXRjaElmUmVmKHJlZik7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgYWNyb0Zvcm0sCiAgICAgIHBkZk1hbmFnZXIKICAgIH0gPSBhbm5vdGF0aW9uR2xvYmFsczsKICAgIGNvbnN0IGlkID0gcmVmIGluc3RhbmNlb2YgUmVmID8gcmVmLnRvU3RyaW5nKCkgOiBgYW5ub3RfJHtpZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gOwogICAgbGV0IHN1YnR5cGUgPSBkaWN0LmdldCgiU3VidHlwZSIpOwogICAgc3VidHlwZSA9IHN1YnR5cGUgaW5zdGFuY2VvZiBOYW1lID8gc3VidHlwZS5uYW1lIDogbnVsbDsKICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7CiAgICAgIHhyZWYsCiAgICAgIHJlZiwKICAgICAgZGljdCwKICAgICAgc3VidHlwZSwKICAgICAgaWQsCiAgICAgIGFubm90YXRpb25HbG9iYWxzLAogICAgICBjb2xsZWN0RmllbGRzLAogICAgICBvcnBoYW5GaWVsZHMsCiAgICAgIG5lZWRBcHBlYXJhbmNlczogIWNvbGxlY3RGaWVsZHMgJiYgYWNyb0Zvcm0uZ2V0KCJOZWVkQXBwZWFyYW5jZXMiKSA9PT0gdHJ1ZSwKICAgICAgcGFnZUluZGV4LAogICAgICBldmFsdWF0b3JPcHRpb25zOiBwZGZNYW5hZ2VyLmV2YWx1YXRvck9wdGlvbnMsCiAgICAgIHBhZ2VSZWYKICAgIH07CiAgICBzd2l0Y2ggKHN1YnR5cGUpIHsKICAgICAgY2FzZSAiTGluayI6CiAgICAgICAgcmV0dXJuIG5ldyBMaW5rQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiVGV4dCI6CiAgICAgICAgcmV0dXJuIG5ldyBUZXh0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiV2lkZ2V0IjoKICAgICAgICBsZXQgZmllbGRUeXBlID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgICAgICBkaWN0LAogICAgICAgICAga2V5OiAiRlQiCiAgICAgICAgfSk7CiAgICAgICAgZmllbGRUeXBlID0gZmllbGRUeXBlIGluc3RhbmNlb2YgTmFtZSA/IGZpZWxkVHlwZS5uYW1lIDogbnVsbDsKICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgewogICAgICAgICAgY2FzZSAiVHgiOgogICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICAgICAgY2FzZSAiQnRuIjoKICAgICAgICAgICAgcmV0dXJuIG5ldyBCdXR0b25XaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICAgICAgY2FzZSAiQ2giOgogICAgICAgICAgICByZXR1cm4gbmV3IENob2ljZVdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgICAgICBjYXNlICJTaWciOgogICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZVdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgICAgfQogICAgICAgIHdhcm4oYFVuaW1wbGVtZW50ZWQgd2lkZ2V0IGZpZWxkIHR5cGUgIiR7ZmllbGRUeXBlfSIsIGAgKyAiZmFsbGluZyBiYWNrIHRvIGJhc2UgZmllbGQgdHlwZS4iKTsKICAgICAgICByZXR1cm4gbmV3IFdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlBvcHVwIjoKICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiRnJlZVRleHQiOgogICAgICAgIHJldHVybiBuZXcgRnJlZVRleHRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJMaW5lIjoKICAgICAgICByZXR1cm4gbmV3IExpbmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJTcXVhcmUiOgogICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiQ2lyY2xlIjoKICAgICAgICByZXR1cm4gbmV3IENpcmNsZUFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlBvbHlMaW5lIjoKICAgICAgICByZXR1cm4gbmV3IFBvbHlsaW5lQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiUG9seWdvbiI6CiAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiQ2FyZXQiOgogICAgICAgIHJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJJbmsiOgogICAgICAgIHJldHVybiBuZXcgSW5rQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiSGlnaGxpZ2h0IjoKICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlVuZGVybGluZSI6CiAgICAgICAgcmV0dXJuIG5ldyBVbmRlcmxpbmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJTcXVpZ2dseSI6CiAgICAgICAgcmV0dXJuIG5ldyBTcXVpZ2dseUFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlN0cmlrZU91dCI6CiAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJTdGFtcCI6CiAgICAgICAgcmV0dXJuIG5ldyBTdGFtcEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIkZpbGVBdHRhY2htZW50IjoKICAgICAgICByZXR1cm4gbmV3IEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgZGVmYXVsdDoKICAgICAgICBpZiAoIWNvbGxlY3RGaWVsZHMpIHsKICAgICAgICAgIGlmICghc3VidHlwZSkgewogICAgICAgICAgICB3YXJuKCJBbm5vdGF0aW9uIGlzIG1pc3NpbmcgdGhlIHJlcXVpcmVkIC9TdWJ0eXBlLiIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2FybihgVW5pbXBsZW1lbnRlZCBhbm5vdGF0aW9uIHR5cGUgIiR7c3VidHlwZX0iLCBgICsgImZhbGxpbmcgYmFjayB0byBiYXNlIGFubm90YXRpb24uIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgIH0KICB9CiAgc3RhdGljIGFzeW5jIF9nZXRQYWdlSW5kZXgoeHJlZiwgcmVmLCBwZGZNYW5hZ2VyKSB7CiAgICB0cnkgewogICAgICBjb25zdCBhbm5vdERpY3QgPSBhd2FpdCB4cmVmLmZldGNoSWZSZWZBc3luYyhyZWYpOwogICAgICBpZiAoIShhbm5vdERpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBjb25zdCBwYWdlUmVmID0gYW5ub3REaWN0LmdldFJhdygiUCIpOwogICAgICBpZiAocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBwYWdlSW5kZXggPSBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsIFtwYWdlUmVmXSk7CiAgICAgICAgICByZXR1cm4gcGFnZUluZGV4OwogICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICBpbmZvKGBfZ2V0UGFnZUluZGV4IC0tIG5vdCBhIHZhbGlkIHBhZ2UgcmVmZXJlbmNlOiAiJHtleH0iLmApOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYW5ub3REaWN0LmhhcygiS2lkcyIpKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIGNvbnN0IG51bVBhZ2VzID0gYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoIm51bVBhZ2VzIik7CiAgICAgIGZvciAobGV0IHBhZ2VJbmRleCA9IDA7IHBhZ2VJbmRleCA8IG51bVBhZ2VzOyBwYWdlSW5kZXgrKykgewogICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KTsKICAgICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJhbm5vdGF0aW9ucyIpOwogICAgICAgIGZvciAoY29uc3QgYW5ub3RSZWYgb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgICAgIGlmIChhbm5vdFJlZiBpbnN0YW5jZW9mIFJlZiAmJiBpc1JlZnNFcXVhbChhbm5vdFJlZiwgcmVmKSkgewogICAgICAgICAgICByZXR1cm4gcGFnZUluZGV4OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgd2FybihgX2dldFBhZ2VJbmRleDogIiR7ZXh9Ii5gKTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgc3RhdGljIGdlbmVyYXRlSW1hZ2VzKGFubm90YXRpb25zLCB4cmVmLCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgaWYgKCFpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgICB3YXJuKCJnZW5lcmF0ZUltYWdlczogT2Zmc2NyZWVuQ2FudmFzIGlzIG5vdCBzdXBwb3J0ZWQsIGNhbm5vdCBzYXZlIG9yIHByaW50IHNvbWUgYW5ub3RhdGlvbnMgd2l0aCBpbWFnZXMuIik7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbGV0IGltYWdlUHJvbWlzZXM7CiAgICBmb3IgKGNvbnN0IHsKICAgICAgYml0bWFwSWQsCiAgICAgIGJpdG1hcAogICAgfSBvZiBhbm5vdGF0aW9ucykgewogICAgICBpZiAoIWJpdG1hcCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGltYWdlUHJvbWlzZXMgfHw9IG5ldyBNYXAoKTsKICAgICAgaW1hZ2VQcm9taXNlcy5zZXQoYml0bWFwSWQsIFN0YW1wQW5ub3RhdGlvbi5jcmVhdGVJbWFnZShiaXRtYXAsIHhyZWYpKTsKICAgIH0KICAgIHJldHVybiBpbWFnZVByb21pc2VzOwogIH0KICBzdGF0aWMgYXN5bmMgc2F2ZU5ld0Fubm90YXRpb25zKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvbnMsIGltYWdlUHJvbWlzZXMsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHhyZWYgPSBldmFsdWF0b3IueHJlZjsKICAgIGxldCBiYXNlRm9udFJlZjsKICAgIGNvbnN0IHByb21pc2VzID0gW107CiAgICBjb25zdCB7CiAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkCiAgICB9ID0gZXZhbHVhdG9yLm9wdGlvbnM7CiAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgaWYgKGFubm90YXRpb24uZGVsZXRlZCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHN3aXRjaCAoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSkgewogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ6CiAgICAgICAgICBpZiAoIWJhc2VGb250UmVmKSB7CiAgICAgICAgICAgIGNvbnN0IGJhc2VGb250ID0gbmV3IERpY3QoeHJlZik7CiAgICAgICAgICAgIGJhc2VGb250LnNldCgiQmFzZUZvbnQiLCBOYW1lLmdldCgiSGVsdmV0aWNhIikpOwogICAgICAgICAgICBiYXNlRm9udC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRm9udCIpKTsKICAgICAgICAgICAgYmFzZUZvbnQuc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIlR5cGUxIikpOwogICAgICAgICAgICBiYXNlRm9udC5zZXQoIkVuY29kaW5nIiwgTmFtZS5nZXQoIldpbkFuc2lFbmNvZGluZyIpKTsKICAgICAgICAgICAgYmFzZUZvbnRSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgICAgICBjaGFuZ2VzLnB1dChiYXNlRm9udFJlZiwgewogICAgICAgICAgICAgIGRhdGE6IGJhc2VGb250CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgcHJvbWlzZXMucHVzaChGcmVlVGV4dEFubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzLCB7CiAgICAgICAgICAgIGV2YWx1YXRvciwKICAgICAgICAgICAgdGFzaywKICAgICAgICAgICAgYmFzZUZvbnRSZWYKICAgICAgICAgIH0pKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUOgogICAgICAgICAgaWYgKGFubm90YXRpb24ucXVhZFBvaW50cykgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKEhpZ2hsaWdodEFubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKElua0Fubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLklOSzoKICAgICAgICAgIHByb21pc2VzLnB1c2goSW5rQW5ub3RhdGlvbi5jcmVhdGVOZXdBbm5vdGF0aW9uKHhyZWYsIGFubm90YXRpb24sIGNoYW5nZXMpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVA6CiAgICAgICAgICBjb25zdCBpbWFnZSA9IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID8gYXdhaXQgaW1hZ2VQcm9taXNlcz8uZ2V0KGFubm90YXRpb24uYml0bWFwSWQpIDogbnVsbDsKICAgICAgICAgIGlmIChpbWFnZT8uaW1hZ2VTdHJlYW0pIHsKICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgIGltYWdlU3RyZWFtLAogICAgICAgICAgICAgIHNtYXNrU3RyZWFtCiAgICAgICAgICAgIH0gPSBpbWFnZTsKICAgICAgICAgICAgaWYgKHNtYXNrU3RyZWFtKSB7CiAgICAgICAgICAgICAgY29uc3Qgc21hc2tSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgICAgICAgIGNoYW5nZXMucHV0KHNtYXNrUmVmLCB7CiAgICAgICAgICAgICAgICBkYXRhOiBzbWFza1N0cmVhbQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGltYWdlU3RyZWFtLmRpY3Quc2V0KCJTTWFzayIsIHNtYXNrUmVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBpbWFnZVJlZiA9IGltYWdlLmltYWdlUmVmID0geHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgICAgICAgICAgY2hhbmdlcy5wdXQoaW1hZ2VSZWYsIHsKICAgICAgICAgICAgICBkYXRhOiBpbWFnZVN0cmVhbQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaW1hZ2UuaW1hZ2VTdHJlYW0gPSBpbWFnZS5zbWFza1N0cmVhbSA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBwcm9taXNlcy5wdXNoKFN0YW1wQW5ub3RhdGlvbi5jcmVhdGVOZXdBbm5vdGF0aW9uKHhyZWYsIGFubm90YXRpb24sIGNoYW5nZXMsIHsKICAgICAgICAgICAgaW1hZ2UKICAgICAgICAgIH0pKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuU0lHTkFUVVJFOgogICAgICAgICAgcHJvbWlzZXMucHVzaChTdGFtcEFubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzLCB7fSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGFubm90YXRpb25zOiBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcykKICAgIH07CiAgfQogIHN0YXRpYyBhc3luYyBwcmludE5ld0Fubm90YXRpb25zKGFubm90YXRpb25HbG9iYWxzLCBldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25zLCBpbWFnZVByb21pc2VzKSB7CiAgICBpZiAoIWFubm90YXRpb25zKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgewogICAgICBvcHRpb25zLAogICAgICB4cmVmCiAgICB9ID0gZXZhbHVhdG9yOwogICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgewogICAgICBpZiAoYW5ub3RhdGlvbi5kZWxldGVkKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgc3dpdGNoIChhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKSB7CiAgICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVDoKICAgICAgICAgIHByb21pc2VzLnB1c2goRnJlZVRleHRBbm5vdGF0aW9uLmNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihhbm5vdGF0aW9uR2xvYmFscywgeHJlZiwgYW5ub3RhdGlvbiwgewogICAgICAgICAgICBldmFsdWF0b3IsCiAgICAgICAgICAgIHRhc2ssCiAgICAgICAgICAgIGV2YWx1YXRvck9wdGlvbnM6IG9wdGlvbnMKICAgICAgICAgIH0pKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUOgogICAgICAgICAgaWYgKGFubm90YXRpb24ucXVhZFBvaW50cykgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKEhpZ2hsaWdodEFubm90YXRpb24uY3JlYXRlTmV3UHJpbnRBbm5vdGF0aW9uKGFubm90YXRpb25HbG9iYWxzLCB4cmVmLCBhbm5vdGF0aW9uLCB7CiAgICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgICB9KSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKElua0Fubm90YXRpb24uY3JlYXRlTmV3UHJpbnRBbm5vdGF0aW9uKGFubm90YXRpb25HbG9iYWxzLCB4cmVmLCBhbm5vdGF0aW9uLCB7CiAgICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgICB9KSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLklOSzoKICAgICAgICAgIHByb21pc2VzLnB1c2goSW5rQW5ub3RhdGlvbi5jcmVhdGVOZXdQcmludEFubm90YXRpb24oYW5ub3RhdGlvbkdsb2JhbHMsIHhyZWYsIGFubm90YXRpb24sIHsKICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUDoKICAgICAgICAgIGNvbnN0IGltYWdlID0gb3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA/IGF3YWl0IGltYWdlUHJvbWlzZXM/LmdldChhbm5vdGF0aW9uLmJpdG1hcElkKSA6IG51bGw7CiAgICAgICAgICBpZiAoaW1hZ2U/LmltYWdlU3RyZWFtKSB7CiAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICBpbWFnZVN0cmVhbSwKICAgICAgICAgICAgICBzbWFza1N0cmVhbQogICAgICAgICAgICB9ID0gaW1hZ2U7CiAgICAgICAgICAgIGlmIChzbWFza1N0cmVhbSkgewogICAgICAgICAgICAgIGltYWdlU3RyZWFtLmRpY3Quc2V0KCJTTWFzayIsIHNtYXNrU3RyZWFtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbWFnZS5pbWFnZVJlZiA9IG5ldyBKcGVnU3RyZWFtKGltYWdlU3RyZWFtLCBpbWFnZVN0cmVhbS5sZW5ndGgpOwogICAgICAgICAgICBpbWFnZS5pbWFnZVN0cmVhbSA9IGltYWdlLnNtYXNrU3RyZWFtID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHByb21pc2VzLnB1c2goU3RhbXBBbm5vdGF0aW9uLmNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihhbm5vdGF0aW9uR2xvYmFscywgeHJlZiwgYW5ub3RhdGlvbiwgewogICAgICAgICAgICBpbWFnZSwKICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5TSUdOQVRVUkU6CiAgICAgICAgICBwcm9taXNlcy5wdXNoKFN0YW1wQW5ub3RhdGlvbi5jcmVhdGVOZXdQcmludEFubm90YXRpb24oYW5ub3RhdGlvbkdsb2JhbHMsIHhyZWYsIGFubm90YXRpb24sIHsKICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgfQp9CmZ1bmN0aW9uIGdldFJnYkNvbG9yKGNvbG9yLCBkZWZhdWx0Q29sb3IgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMykpIHsKICBpZiAoIUFycmF5LmlzQXJyYXkoY29sb3IpKSB7CiAgICByZXR1cm4gZGVmYXVsdENvbG9yOwogIH0KICBjb25zdCByZ2JDb2xvciA9IGRlZmF1bHRDb2xvciB8fCBuZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7CiAgc3dpdGNoIChjb2xvci5sZW5ndGgpIHsKICAgIGNhc2UgMDoKICAgICAgcmV0dXJuIG51bGw7CiAgICBjYXNlIDE6CiAgICAgIENvbG9yU3BhY2VVdGlscy5ncmF5LmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTsKICAgICAgcmV0dXJuIHJnYkNvbG9yOwogICAgY2FzZSAzOgogICAgICBDb2xvclNwYWNlVXRpbHMucmdiLmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTsKICAgICAgcmV0dXJuIHJnYkNvbG9yOwogICAgY2FzZSA0OgogICAgICBDb2xvclNwYWNlVXRpbHMuY215ay5nZXRSZ2JJdGVtKGNvbG9yLCAwLCByZ2JDb2xvciwgMCk7CiAgICAgIHJldHVybiByZ2JDb2xvcjsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBkZWZhdWx0Q29sb3I7CiAgfQp9CmZ1bmN0aW9uIGdldFBkZkNvbG9yQXJyYXkoY29sb3IpIHsKICByZXR1cm4gQXJyYXkuZnJvbShjb2xvciwgYyA9PiBjIC8gMjU1KTsKfQpmdW5jdGlvbiBnZXRRdWFkUG9pbnRzKGRpY3QsIHJlY3QpIHsKICBjb25zdCBxdWFkUG9pbnRzID0gZGljdC5nZXRBcnJheSgiUXVhZFBvaW50cyIpOwogIGlmICghaXNOdW1iZXJBcnJheShxdWFkUG9pbnRzLCBudWxsKSB8fCBxdWFkUG9pbnRzLmxlbmd0aCA9PT0gMCB8fCBxdWFkUG9pbnRzLmxlbmd0aCAlIDggPiAwKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgbmV3UXVhZFBvaW50cyA9IG5ldyBGbG9hdDMyQXJyYXkocXVhZFBvaW50cy5sZW5ndGgpOwogIGZvciAobGV0IGkgPSAwLCBpaSA9IHF1YWRQb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gOCkgewogICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NF0gPSBxdWFkUG9pbnRzLnNsaWNlKGksIGkgKyA4KTsKICAgIGNvbnN0IG1pblggPSBNYXRoLm1pbih4MSwgeDIsIHgzLCB4NCk7CiAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeDEsIHgyLCB4MywgeDQpOwogICAgY29uc3QgbWluWSA9IE1hdGgubWluKHkxLCB5MiwgeTMsIHk0KTsKICAgIGNvbnN0IG1heFkgPSBNYXRoLm1heCh5MSwgeTIsIHkzLCB5NCk7CiAgICBpZiAocmVjdCAhPT0gbnVsbCAmJiAobWluWCA8IHJlY3RbMF0gfHwgbWF4WCA+IHJlY3RbMl0gfHwgbWluWSA8IHJlY3RbMV0gfHwgbWF4WSA+IHJlY3RbM10pKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbmV3UXVhZFBvaW50cy5zZXQoW21pblgsIG1heFksIG1heFgsIG1heFksIG1pblgsIG1pblksIG1heFgsIG1pblldLCBpKTsKICB9CiAgcmV0dXJuIG5ld1F1YWRQb2ludHM7Cn0KZnVuY3Rpb24gZ2V0VHJhbnNmb3JtTWF0cml4KHJlY3QsIGJib3gsIG1hdHJpeCkgewogIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IFV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goYmJveCwgbWF0cml4KTsKICBpZiAobWluWCA9PT0gbWF4WCB8fCBtaW5ZID09PSBtYXhZKSB7CiAgICByZXR1cm4gWzEsIDAsIDAsIDEsIHJlY3RbMF0sIHJlY3RbMV1dOwogIH0KICBjb25zdCB4UmF0aW8gPSAocmVjdFsyXSAtIHJlY3RbMF0pIC8gKG1heFggLSBtaW5YKTsKICBjb25zdCB5UmF0aW8gPSAocmVjdFszXSAtIHJlY3RbMV0pIC8gKG1heFkgLSBtaW5ZKTsKICByZXR1cm4gW3hSYXRpbywgMCwgMCwgeVJhdGlvLCByZWN0WzBdIC0gbWluWCAqIHhSYXRpbywgcmVjdFsxXSAtIG1pblkgKiB5UmF0aW9dOwp9CmNsYXNzIEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmLAogICAgICBhbm5vdGF0aW9uR2xvYmFscywKICAgICAgcmVmLAogICAgICBvcnBoYW5GaWVsZHMKICAgIH0gPSBwYXJhbXM7CiAgICBjb25zdCBwYXJlbnRSZWYgPSBvcnBoYW5GaWVsZHM/LmdldChyZWYpOwogICAgaWYgKHBhcmVudFJlZikgewogICAgICBkaWN0LnNldCgiUGFyZW50IiwgcGFyZW50UmVmKTsKICAgIH0KICAgIHRoaXMuc2V0VGl0bGUoZGljdC5nZXQoIlQiKSk7CiAgICB0aGlzLnNldENvbnRlbnRzKGRpY3QuZ2V0KCJDb250ZW50cyIpKTsKICAgIHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShkaWN0LmdldCgiTSIpKTsKICAgIHRoaXMuc2V0RmxhZ3MoZGljdC5nZXQoIkYiKSk7CiAgICB0aGlzLnNldFJlY3RhbmdsZShkaWN0LmdldEFycmF5KCJSZWN0IikpOwogICAgdGhpcy5zZXRDb2xvcihkaWN0LmdldEFycmF5KCJDIikpOwogICAgdGhpcy5zZXRCb3JkZXJTdHlsZShkaWN0KTsKICAgIHRoaXMuc2V0QXBwZWFyYW5jZShkaWN0KTsKICAgIHRoaXMuc2V0T3B0aW9uYWxDb250ZW50KGRpY3QpOwogICAgY29uc3QgTUsgPSBkaWN0LmdldCgiTUsiKTsKICAgIHRoaXMuc2V0Qm9yZGVyQW5kQmFja2dyb3VuZENvbG9ycyhNSyk7CiAgICB0aGlzLnNldFJvdGF0aW9uKE1LLCBkaWN0KTsKICAgIHRoaXMucmVmID0gcGFyYW1zLnJlZiBpbnN0YW5jZW9mIFJlZiA/IHBhcmFtcy5yZWYgOiBudWxsOwogICAgdGhpcy5fc3RyZWFtcyA9IFtdOwogICAgaWYgKHRoaXMuYXBwZWFyYW5jZSkgewogICAgICB0aGlzLl9zdHJlYW1zLnB1c2godGhpcy5hcHBlYXJhbmNlKTsKICAgIH0KICAgIGNvbnN0IGlzTG9ja2VkID0gISEodGhpcy5mbGFncyAmIEFubm90YXRpb25GbGFnLkxPQ0tFRCk7CiAgICBjb25zdCBpc0NvbnRlbnRMb2NrZWQgPSAhISh0aGlzLmZsYWdzICYgQW5ub3RhdGlvbkZsYWcuTE9DS0VEQ09OVEVOVFMpOwogICAgdGhpcy5kYXRhID0gewogICAgICBhbm5vdGF0aW9uRmxhZ3M6IHRoaXMuZmxhZ3MsCiAgICAgIGJvcmRlclN0eWxlOiB0aGlzLmJvcmRlclN0eWxlLAogICAgICBjb2xvcjogdGhpcy5jb2xvciwKICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2tncm91bmRDb2xvciwKICAgICAgYm9yZGVyQ29sb3I6IHRoaXMuYm9yZGVyQ29sb3IsCiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLAogICAgICBjb250ZW50c09iajogdGhpcy5fY29udGVudHMsCiAgICAgIGhhc0FwcGVhcmFuY2U6ICEhdGhpcy5hcHBlYXJhbmNlLAogICAgICBpZDogcGFyYW1zLmlkLAogICAgICBtb2RpZmljYXRpb25EYXRlOiB0aGlzLm1vZGlmaWNhdGlvbkRhdGUsCiAgICAgIHJlY3Q6IHRoaXMucmVjdGFuZ2xlLAogICAgICBzdWJ0eXBlOiBwYXJhbXMuc3VidHlwZSwKICAgICAgaGFzT3duQ2FudmFzOiBmYWxzZSwKICAgICAgbm9Sb3RhdGU6ICEhKHRoaXMuZmxhZ3MgJiBBbm5vdGF0aW9uRmxhZy5OT1JPVEFURSksCiAgICAgIG5vSFRNTDogaXNMb2NrZWQgJiYgaXNDb250ZW50TG9ja2VkLAogICAgICBpc0VkaXRhYmxlOiBmYWxzZSwKICAgICAgc3RydWN0UGFyZW50OiAtMQogICAgfTsKICAgIGlmIChhbm5vdGF0aW9uR2xvYmFscy5zdHJ1Y3RUcmVlUm9vdCkgewogICAgICBsZXQgc3RydWN0UGFyZW50ID0gZGljdC5nZXQoIlN0cnVjdFBhcmVudCIpOwogICAgICB0aGlzLmRhdGEuc3RydWN0UGFyZW50ID0gc3RydWN0UGFyZW50ID0gTnVtYmVyLmlzSW50ZWdlcihzdHJ1Y3RQYXJlbnQpICYmIHN0cnVjdFBhcmVudCA+PSAwID8gc3RydWN0UGFyZW50IDogLTE7CiAgICAgIGFubm90YXRpb25HbG9iYWxzLnN0cnVjdFRyZWVSb290LmFkZEFubm90YXRpb25JZFRvUGFnZShwYXJhbXMucGFnZVJlZiwgc3RydWN0UGFyZW50KTsKICAgIH0KICAgIGlmIChwYXJhbXMuY29sbGVjdEZpZWxkcykgewogICAgICBjb25zdCBraWRzID0gZGljdC5nZXQoIktpZHMiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgICBjb25zdCBraWRJZHMgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGtpZCBvZiBraWRzKSB7CiAgICAgICAgICBpZiAoa2lkIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIGtpZElkcy5wdXNoKGtpZC50b1N0cmluZygpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGtpZElkcy5sZW5ndGggIT09IDApIHsKICAgICAgICAgIHRoaXMuZGF0YS5raWRJZHMgPSBraWRJZHM7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuZGF0YS5hY3Rpb25zID0gY29sbGVjdEFjdGlvbnMoeHJlZiwgZGljdCwgQW5ub3RhdGlvbkFjdGlvbkV2ZW50VHlwZSk7CiAgICAgIHRoaXMuZGF0YS5maWVsZE5hbWUgPSB0aGlzLl9jb25zdHJ1Y3RGaWVsZE5hbWUoZGljdCk7CiAgICAgIHRoaXMuZGF0YS5wYWdlSW5kZXggPSBwYXJhbXMucGFnZUluZGV4OwogICAgfQogICAgY29uc3QgaXQgPSBkaWN0LmdldCgiSVQiKTsKICAgIGlmIChpdCBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgdGhpcy5kYXRhLml0ID0gaXQubmFtZTsKICAgIH0KICAgIHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gcGFyYW1zLmV2YWx1YXRvck9wdGlvbnMuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ7CiAgICB0aGlzLl9mYWxsYmFja0ZvbnREaWN0ID0gbnVsbDsKICAgIHRoaXMuX25lZWRBcHBlYXJhbmNlcyA9IGZhbHNlOwogIH0KICBfaGFzRmxhZyhmbGFncywgZmxhZykgewogICAgcmV0dXJuICEhKGZsYWdzICYgZmxhZyk7CiAgfQogIF9idWlsZEZsYWdzKG5vVmlldywgbm9QcmludCkgewogICAgbGV0IHsKICAgICAgZmxhZ3MKICAgIH0gPSB0aGlzOwogICAgaWYgKG5vVmlldyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGlmIChub1ByaW50ID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICB9CiAgICAgIGlmIChub1ByaW50KSB7CiAgICAgICAgcmV0dXJuIGZsYWdzICYgfkFubm90YXRpb25GbGFnLlBSSU5UOwogICAgICB9CiAgICAgIHJldHVybiBmbGFncyAmIH5Bbm5vdGF0aW9uRmxhZy5ISURERU4gfCBBbm5vdGF0aW9uRmxhZy5QUklOVDsKICAgIH0KICAgIGlmIChub1ZpZXcpIHsKICAgICAgZmxhZ3MgfD0gQW5ub3RhdGlvbkZsYWcuUFJJTlQ7CiAgICAgIGlmIChub1ByaW50KSB7CiAgICAgICAgcmV0dXJuIGZsYWdzICYgfkFubm90YXRpb25GbGFnLk5PVklFVyB8IEFubm90YXRpb25GbGFnLkhJRERFTjsKICAgICAgfQogICAgICByZXR1cm4gZmxhZ3MgJiB+QW5ub3RhdGlvbkZsYWcuSElEREVOIHwgQW5ub3RhdGlvbkZsYWcuTk9WSUVXOwogICAgfQogICAgZmxhZ3MgJj0gfihBbm5vdGF0aW9uRmxhZy5ISURERU4gfCBBbm5vdGF0aW9uRmxhZy5OT1ZJRVcpOwogICAgaWYgKG5vUHJpbnQpIHsKICAgICAgcmV0dXJuIGZsYWdzICYgfkFubm90YXRpb25GbGFnLlBSSU5UOwogICAgfQogICAgcmV0dXJuIGZsYWdzIHwgQW5ub3RhdGlvbkZsYWcuUFJJTlQ7CiAgfQogIF9pc1ZpZXdhYmxlKGZsYWdzKSB7CiAgICByZXR1cm4gIXRoaXMuX2hhc0ZsYWcoZmxhZ3MsIEFubm90YXRpb25GbGFnLklOVklTSUJMRSkgJiYgIXRoaXMuX2hhc0ZsYWcoZmxhZ3MsIEFubm90YXRpb25GbGFnLk5PVklFVyk7CiAgfQogIF9pc1ByaW50YWJsZShmbGFncykgewogICAgcmV0dXJuIHRoaXMuX2hhc0ZsYWcoZmxhZ3MsIEFubm90YXRpb25GbGFnLlBSSU5UKSAmJiAhdGhpcy5faGFzRmxhZyhmbGFncywgQW5ub3RhdGlvbkZsYWcuSElEREVOKSAmJiAhdGhpcy5faGFzRmxhZyhmbGFncywgQW5ub3RhdGlvbkZsYWcuSU5WSVNJQkxFKTsKICB9CiAgbXVzdEJlVmlld2VkKGFubm90YXRpb25TdG9yYWdlLCBfcmVuZGVyRm9ybXMpIHsKICAgIGNvbnN0IG5vVmlldyA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8ubm9WaWV3OwogICAgaWYgKG5vVmlldyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiAhbm9WaWV3OwogICAgfQogICAgcmV0dXJuIHRoaXMudmlld2FibGUgJiYgIXRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncywgQW5ub3RhdGlvbkZsYWcuSElEREVOKTsKICB9CiAgbXVzdEJlUHJpbnRlZChhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgY29uc3Qgbm9QcmludCA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8ubm9QcmludDsKICAgIGlmIChub1ByaW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuICFub1ByaW50OwogICAgfQogICAgcmV0dXJuIHRoaXMucHJpbnRhYmxlOwogIH0KICBtdXN0QmVWaWV3ZWRXaGVuRWRpdGluZyhpc0VkaXRpbmcsIG1vZGlmaWVkSWRzID0gbnVsbCkgewogICAgcmV0dXJuIGlzRWRpdGluZyA/ICF0aGlzLmRhdGEuaXNFZGl0YWJsZSA6ICFtb2RpZmllZElkcz8uaGFzKHRoaXMuZGF0YS5pZCk7CiAgfQogIGdldCB2aWV3YWJsZSgpIHsKICAgIGlmICh0aGlzLmRhdGEucXVhZFBvaW50cyA9PT0gbnVsbCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy5mbGFncyA9PT0gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB0aGlzLl9pc1ZpZXdhYmxlKHRoaXMuZmxhZ3MpOwogIH0KICBnZXQgcHJpbnRhYmxlKCkgewogICAgaWYgKHRoaXMuZGF0YS5xdWFkUG9pbnRzID09PSBudWxsKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzLmZsYWdzID09PSAwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0aGlzLl9pc1ByaW50YWJsZSh0aGlzLmZsYWdzKTsKICB9CiAgX3BhcnNlU3RyaW5nSGVscGVyKGRhdGEpIHsKICAgIGNvbnN0IHN0ciA9IHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiA/IHN0cmluZ1RvUERGU3RyaW5nKGRhdGEpIDogIiI7CiAgICBjb25zdCBkaXIgPSBzdHIgJiYgYmlkaShzdHIpLmRpciA9PT0gInJ0bCIgPyAicnRsIiA6ICJsdHIiOwogICAgcmV0dXJuIHsKICAgICAgc3RyLAogICAgICBkaXIKICAgIH07CiAgfQogIHNldERlZmF1bHRBcHBlYXJhbmNlKHBhcmFtcykgewogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICBhbm5vdGF0aW9uR2xvYmFscwogICAgfSA9IHBhcmFtczsKICAgIGNvbnN0IGRlZmF1bHRBcHBlYXJhbmNlID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIkRBIgogICAgfSkgfHwgYW5ub3RhdGlvbkdsb2JhbHMuYWNyb0Zvcm0uZ2V0KCJEQSIpOwogICAgdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UgPSB0eXBlb2YgZGVmYXVsdEFwcGVhcmFuY2UgPT09ICJzdHJpbmciID8gZGVmYXVsdEFwcGVhcmFuY2UgOiAiIjsKICAgIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEgPSBwYXJzZURlZmF1bHRBcHBlYXJhbmNlKHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlKTsKICB9CiAgc2V0VGl0bGUodGl0bGUpIHsKICAgIHRoaXMuX3RpdGxlID0gdGhpcy5fcGFyc2VTdHJpbmdIZWxwZXIodGl0bGUpOwogIH0KICBzZXRDb250ZW50cyhjb250ZW50cykgewogICAgdGhpcy5fY29udGVudHMgPSB0aGlzLl9wYXJzZVN0cmluZ0hlbHBlcihjb250ZW50cyk7CiAgfQogIHNldE1vZGlmaWNhdGlvbkRhdGUobW9kaWZpY2F0aW9uRGF0ZSkgewogICAgdGhpcy5tb2RpZmljYXRpb25EYXRlID0gdHlwZW9mIG1vZGlmaWNhdGlvbkRhdGUgPT09ICJzdHJpbmciID8gbW9kaWZpY2F0aW9uRGF0ZSA6IG51bGw7CiAgfQogIHNldEZsYWdzKGZsYWdzKSB7CiAgICB0aGlzLmZsYWdzID0gTnVtYmVyLmlzSW50ZWdlcihmbGFncykgJiYgZmxhZ3MgPiAwID8gZmxhZ3MgOiAwOwogICAgaWYgKHRoaXMuZmxhZ3MgJiBBbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUgJiYgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAiQW5ub3RhdGlvbiIpIHsKICAgICAgdGhpcy5mbGFncyBePSBBbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEU7CiAgICB9CiAgfQogIGhhc0ZsYWcoZmxhZykgewogICAgcmV0dXJuIHRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncywgZmxhZyk7CiAgfQogIHNldFJlY3RhbmdsZShyZWN0YW5nbGUpIHsKICAgIHRoaXMucmVjdGFuZ2xlID0gbG9va3VwTm9ybWFsUmVjdChyZWN0YW5nbGUsIFswLCAwLCAwLCAwXSk7CiAgfQogIHNldENvbG9yKGNvbG9yKSB7CiAgICB0aGlzLmNvbG9yID0gZ2V0UmdiQ29sb3IoY29sb3IpOwogIH0KICBzZXRMaW5lRW5kaW5ncyhsaW5lRW5kaW5ncykgewogICAgdGhpcy5saW5lRW5kaW5ncyA9IFsiTm9uZSIsICJOb25lIl07CiAgICBpZiAoQXJyYXkuaXNBcnJheShsaW5lRW5kaW5ncykgJiYgbGluZUVuZGluZ3MubGVuZ3RoID09PSAyKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgY29uc3Qgb2JqID0gbGluZUVuZGluZ3NbaV07CiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIHN3aXRjaCAob2JqLm5hbWUpIHsKICAgICAgICAgICAgY2FzZSAiTm9uZSI6CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGNhc2UgIlNxdWFyZSI6CiAgICAgICAgICAgIGNhc2UgIkNpcmNsZSI6CiAgICAgICAgICAgIGNhc2UgIkRpYW1vbmQiOgogICAgICAgICAgICBjYXNlICJPcGVuQXJyb3ciOgogICAgICAgICAgICBjYXNlICJDbG9zZWRBcnJvdyI6CiAgICAgICAgICAgIGNhc2UgIkJ1dHQiOgogICAgICAgICAgICBjYXNlICJST3BlbkFycm93IjoKICAgICAgICAgICAgY2FzZSAiUkNsb3NlZEFycm93IjoKICAgICAgICAgICAgY2FzZSAiU2xhc2giOgogICAgICAgICAgICAgIHRoaXMubGluZUVuZGluZ3NbaV0gPSBvYmoubmFtZTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2FybihgSWdub3JpbmcgaW52YWxpZCBsaW5lRW5kaW5nOiAke29ian1gKTsKICAgICAgfQogICAgfQogIH0KICBzZXRSb3RhdGlvbihtaywgZGljdCkgewogICAgdGhpcy5yb3RhdGlvbiA9IDA7CiAgICBsZXQgYW5nbGUgPSBtayBpbnN0YW5jZW9mIERpY3QgPyBtay5nZXQoIlIiKSB8fCAwIDogZGljdC5nZXQoIlJvdGF0ZSIpIHx8IDA7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihhbmdsZSkgJiYgYW5nbGUgIT09IDApIHsKICAgICAgYW5nbGUgJT0gMzYwOwogICAgICBpZiAoYW5nbGUgPCAwKSB7CiAgICAgICAgYW5nbGUgKz0gMzYwOwogICAgICB9CiAgICAgIGlmIChhbmdsZSAlIDkwID09PSAwKSB7CiAgICAgICAgdGhpcy5yb3RhdGlvbiA9IGFuZ2xlOwogICAgICB9CiAgICB9CiAgfQogIHNldEJvcmRlckFuZEJhY2tncm91bmRDb2xvcnMobWspIHsKICAgIGlmIChtayBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgdGhpcy5ib3JkZXJDb2xvciA9IGdldFJnYkNvbG9yKG1rLmdldEFycmF5KCJCQyIpLCBudWxsKTsKICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBnZXRSZ2JDb2xvcihtay5nZXRBcnJheSgiQkciKSwgbnVsbCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmJvcmRlckNvbG9yID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwogICAgfQogIH0KICBzZXRCb3JkZXJTdHlsZShib3JkZXJTdHlsZSkgewogICAgdGhpcy5ib3JkZXJTdHlsZSA9IG5ldyBBbm5vdGF0aW9uQm9yZGVyU3R5bGUoKTsKICAgIGlmICghKGJvcmRlclN0eWxlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGJvcmRlclN0eWxlLmhhcygiQlMiKSkgewogICAgICBjb25zdCBkaWN0ID0gYm9yZGVyU3R5bGUuZ2V0KCJCUyIpOwogICAgICBpZiAoZGljdCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBjb25zdCBkaWN0VHlwZSA9IGRpY3QuZ2V0KCJUeXBlIik7CiAgICAgICAgaWYgKCFkaWN0VHlwZSB8fCBpc05hbWUoZGljdFR5cGUsICJCb3JkZXIiKSkgewogICAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRXaWR0aChkaWN0LmdldCgiVyIpLCB0aGlzLnJlY3RhbmdsZSk7CiAgICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFN0eWxlKGRpY3QuZ2V0KCJTIikpOwogICAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoZGljdC5nZXRBcnJheSgiRCIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYm9yZGVyU3R5bGUuaGFzKCJCb3JkZXIiKSkgewogICAgICBjb25zdCBhcnJheSA9IGJvcmRlclN0eWxlLmdldEFycmF5KCJCb3JkZXIiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpICYmIGFycmF5Lmxlbmd0aCA+PSAzKSB7CiAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKGFycmF5WzBdKTsKICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFZlcnRpY2FsQ29ybmVyUmFkaXVzKGFycmF5WzFdKTsKICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKGFycmF5WzJdLCB0aGlzLnJlY3RhbmdsZSk7CiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gNCkgewogICAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoYXJyYXlbM10sIHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRXaWR0aCgwKTsKICAgIH0KICB9CiAgc2V0QXBwZWFyYW5jZShkaWN0KSB7CiAgICB0aGlzLmFwcGVhcmFuY2UgPSBudWxsOwogICAgY29uc3QgYXBwZWFyYW5jZVN0YXRlcyA9IGRpY3QuZ2V0KCJBUCIpOwogICAgaWYgKCEoYXBwZWFyYW5jZVN0YXRlcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSA9IGFwcGVhcmFuY2VTdGF0ZXMuZ2V0KCJOIik7CiAgICBpZiAobm9ybWFsQXBwZWFyYW5jZVN0YXRlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICB0aGlzLmFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlU3RhdGU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghKG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFzID0gZGljdC5nZXQoIkFTIik7CiAgICBpZiAoIShhcyBpbnN0YW5jZW9mIE5hbWUpIHx8ICFub3JtYWxBcHBlYXJhbmNlU3RhdGUuaGFzKGFzLm5hbWUpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlU3RhdGUuZ2V0KGFzLm5hbWUpOwogICAgaWYgKGFwcGVhcmFuY2UgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IGFwcGVhcmFuY2U7CiAgICB9CiAgfQogIHNldE9wdGlvbmFsQ29udGVudChkaWN0KSB7CiAgICB0aGlzLm9jID0gbnVsbDsKICAgIGNvbnN0IG9jID0gZGljdC5nZXQoIk9DIik7CiAgICBpZiAob2MgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHdhcm4oInNldE9wdGlvbmFsQ29udGVudDogU3VwcG9ydCBmb3IgL05hbWUtZW50cnkgaXMgbm90IGltcGxlbWVudGVkLiIpOwogICAgfSBlbHNlIGlmIChvYyBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgdGhpcy5vYyA9IG9jOwogICAgfQogIH0KICBsb2FkUmVzb3VyY2VzKGtleXMsIGFwcGVhcmFuY2UpIHsKICAgIHJldHVybiBhcHBlYXJhbmNlLmRpY3QuZ2V0QXN5bmMoIlJlc291cmNlcyIpLnRoZW4ocmVzb3VyY2VzID0+IHsKICAgICAgaWYgKCFyZXNvdXJjZXMpIHsKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICB9CiAgICAgIGNvbnN0IG9iamVjdExvYWRlciA9IG5ldyBPYmplY3RMb2FkZXIocmVzb3VyY2VzLCBrZXlzLCByZXNvdXJjZXMueHJlZik7CiAgICAgIHJldHVybiBvYmplY3RMb2FkZXIubG9hZCgpLnRoZW4oKCkgPT4gcmVzb3VyY2VzKTsKICAgIH0pOwogIH0KICBhc3luYyBnZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBjb25zdCB7CiAgICAgIGhhc093bkNhbnZhcywKICAgICAgaWQsCiAgICAgIHJlY3QKICAgIH0gPSB0aGlzLmRhdGE7CiAgICBsZXQgYXBwZWFyYW5jZSA9IHRoaXMuYXBwZWFyYW5jZTsKICAgIGNvbnN0IGlzVXNpbmdPd25DYW52YXMgPSAhIShoYXNPd25DYW52YXMgJiYgaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5ESVNQTEFZKTsKICAgIGlmIChpc1VzaW5nT3duQ2FudmFzICYmICh0aGlzLndpZHRoID09PSAwIHx8IHRoaXMuaGVpZ2h0ID09PSAwKSkgewogICAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gZmFsc2U7CiAgICAgIHJldHVybiB7CiAgICAgICAgb3BMaXN0OiBuZXcgT3BlcmF0b3JMaXN0KCksCiAgICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgICBzZXBhcmF0ZUNhbnZhczogZmFsc2UKICAgICAgfTsKICAgIH0KICAgIGlmICghYXBwZWFyYW5jZSkgewogICAgICBpZiAoIWlzVXNpbmdPd25DYW52YXMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgb3BMaXN0OiBuZXcgT3BlcmF0b3JMaXN0KCksCiAgICAgICAgICBzZXBhcmF0ZUZvcm06IGZhbHNlLAogICAgICAgICAgc2VwYXJhdGVDYW52YXM6IGZhbHNlCiAgICAgICAgfTsKICAgICAgfQogICAgICBhcHBlYXJhbmNlID0gbmV3IFN0cmluZ1N0cmVhbSgiIik7CiAgICAgIGFwcGVhcmFuY2UuZGljdCA9IG5ldyBEaWN0KCk7CiAgICB9CiAgICBjb25zdCBhcHBlYXJhbmNlRGljdCA9IGFwcGVhcmFuY2UuZGljdDsKICAgIGNvbnN0IHJlc291cmNlcyA9IGF3YWl0IHRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsICJDb2xvclNwYWNlIiwgIlBhdHRlcm4iLCAiU2hhZGluZyIsICJYT2JqZWN0IiwgIkZvbnQiXSwgYXBwZWFyYW5jZSk7CiAgICBjb25zdCBiYm94ID0gbG9va3VwUmVjdChhcHBlYXJhbmNlRGljdC5nZXRBcnJheSgiQkJveCIpLCBbMCwgMCwgMSwgMV0pOwogICAgY29uc3QgbWF0cml4ID0gbG9va3VwTWF0cml4KGFwcGVhcmFuY2VEaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgSURFTlRJVFlfTUFUUklYKTsKICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybU1hdHJpeChyZWN0LCBiYm94LCBtYXRyaXgpOwogICAgY29uc3Qgb3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpOwogICAgbGV0IG9wdGlvbmFsQ29udGVudDsKICAgIGlmICh0aGlzLm9jKSB7CiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGF3YWl0IGV2YWx1YXRvci5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyh0aGlzLm9jLCBudWxsKTsKICAgIH0KICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcExpc3QuYWRkT3AoT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzLCBbIk9DIiwgb3B0aW9uYWxDb250ZW50XSk7CiAgICB9CiAgICBvcExpc3QuYWRkT3AoT1BTLmJlZ2luQW5ub3RhdGlvbiwgW2lkLCByZWN0LCB0cmFuc2Zvcm0sIG1hdHJpeCwgaXNVc2luZ093bkNhbnZhc10pOwogICAgYXdhaXQgZXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgIHN0cmVhbTogYXBwZWFyYW5jZSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzLAogICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdCwKICAgICAgZmFsbGJhY2tGb250RGljdDogdGhpcy5fZmFsbGJhY2tGb250RGljdAogICAgfSk7CiAgICBvcExpc3QuYWRkT3AoT1BTLmVuZEFubm90YXRpb24sIFtdKTsKICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcExpc3QuYWRkT3AoT1BTLmVuZE1hcmtlZENvbnRlbnQsIFtdKTsKICAgIH0KICAgIHRoaXMucmVzZXQoKTsKICAgIHJldHVybiB7CiAgICAgIG9wTGlzdCwKICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgc2VwYXJhdGVDYW52YXM6IGlzVXNpbmdPd25DYW52YXMKICAgIH07CiAgfQogIGFzeW5jIHNhdmUoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldCBoYXNUZXh0Q29udGVudCgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgZXh0cmFjdFRleHRDb250ZW50KGV2YWx1YXRvciwgdGFzaywgdmlld0JveCkgewogICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcmVzb3VyY2VzID0gYXdhaXQgdGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwgIkZvbnQiLCAiUHJvcGVydGllcyIsICJYT2JqZWN0Il0sIHRoaXMuYXBwZWFyYW5jZSk7CiAgICBjb25zdCB0ZXh0ID0gW107CiAgICBjb25zdCBidWZmZXIgPSBbXTsKICAgIGxldCBmaXJzdFBvc2l0aW9uID0gbnVsbDsKICAgIGNvbnN0IHNpbmsgPSB7CiAgICAgIGRlc2lyZWRTaXplOiBNYXRoLkluZmluaXR5LAogICAgICByZWFkeTogdHJ1ZSwKICAgICAgZW5xdWV1ZShjaHVuaywgc2l6ZSkgewogICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjaHVuay5pdGVtcykgewogICAgICAgICAgaWYgKGl0ZW0uc3RyID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBmaXJzdFBvc2l0aW9uIHx8PSBpdGVtLnRyYW5zZm9ybS5zbGljZSgtMik7CiAgICAgICAgICBidWZmZXIucHVzaChpdGVtLnN0cik7CiAgICAgICAgICBpZiAoaXRlbS5oYXNFT0wpIHsKICAgICAgICAgICAgdGV4dC5wdXNoKGJ1ZmZlci5qb2luKCIiKS50cmltRW5kKCkpOwogICAgICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBhd2FpdCBldmFsdWF0b3IuZ2V0VGV4dENvbnRlbnQoewogICAgICBzdHJlYW06IHRoaXMuYXBwZWFyYW5jZSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzLAogICAgICBpbmNsdWRlTWFya2VkQ29udGVudDogdHJ1ZSwKICAgICAga2VlcFdoaXRlU3BhY2U6IHRydWUsCiAgICAgIHNpbmssCiAgICAgIHZpZXdCb3gKICAgIH0pOwogICAgdGhpcy5yZXNldCgpOwogICAgaWYgKGJ1ZmZlci5sZW5ndGgpIHsKICAgICAgdGV4dC5wdXNoKGJ1ZmZlci5qb2luKCIiKS50cmltRW5kKCkpOwogICAgfQogICAgaWYgKHRleHQubGVuZ3RoID4gMSB8fCB0ZXh0WzBdKSB7CiAgICAgIGNvbnN0IGFwcGVhcmFuY2VEaWN0ID0gdGhpcy5hcHBlYXJhbmNlLmRpY3Q7CiAgICAgIGNvbnN0IGJib3ggPSBsb29rdXBSZWN0KGFwcGVhcmFuY2VEaWN0LmdldEFycmF5KCJCQm94IiksIG51bGwpOwogICAgICBjb25zdCBtYXRyaXggPSBsb29rdXBNYXRyaXgoYXBwZWFyYW5jZURpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpLCBudWxsKTsKICAgICAgdGhpcy5kYXRhLnRleHRQb3NpdGlvbiA9IHRoaXMuX3RyYW5zZm9ybVBvaW50KGZpcnN0UG9zaXRpb24sIGJib3gsIG1hdHJpeCk7CiAgICAgIHRoaXMuZGF0YS50ZXh0Q29udGVudCA9IHRleHQ7CiAgICB9CiAgfQogIF90cmFuc2Zvcm1Qb2ludChjb29yZHMsIGJib3gsIG1hdHJpeCkgewogICAgY29uc3QgewogICAgICByZWN0CiAgICB9ID0gdGhpcy5kYXRhOwogICAgYmJveCB8fD0gWzAsIDAsIDEsIDFdOwogICAgbWF0cml4IHx8PSBbMSwgMCwgMCwgMSwgMCwgMF07CiAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1NYXRyaXgocmVjdCwgYmJveCwgbWF0cml4KTsKICAgIHRyYW5zZm9ybVs0XSAtPSByZWN0WzBdOwogICAgdHJhbnNmb3JtWzVdIC09IHJlY3RbMV07CiAgICBjb29yZHMgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKGNvb3JkcywgdHJhbnNmb3JtKTsKICAgIHJldHVybiBVdGlsLmFwcGx5VHJhbnNmb3JtKGNvb3JkcywgbWF0cml4KTsKICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICBpZiAodGhpcy5kYXRhLmtpZElkcykgewogICAgICByZXR1cm4gewogICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsCiAgICAgICAgYWN0aW9uczogdGhpcy5kYXRhLmFjdGlvbnMsCiAgICAgICAgbmFtZTogdGhpcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgICBzdHJva2VDb2xvcjogdGhpcy5kYXRhLmJvcmRlckNvbG9yLAogICAgICAgIGZpbGxDb2xvcjogdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciwKICAgICAgICB0eXBlOiAiIiwKICAgICAgICBraWRJZHM6IHRoaXMuZGF0YS5raWRJZHMsCiAgICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbgogICAgICB9OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHJlc2V0KCkgewogICAgZm9yIChjb25zdCBzdHJlYW0gb2YgdGhpcy5fc3RyZWFtcykgewogICAgICBzdHJlYW0ucmVzZXQoKTsKICAgIH0KICB9CiAgX2NvbnN0cnVjdEZpZWxkTmFtZShkaWN0KSB7CiAgICBpZiAoIWRpY3QuaGFzKCJUIikgJiYgIWRpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICB3YXJuKCJVbmtub3duIGZpZWxkIG5hbWUsIGZhbGxpbmcgYmFjayB0byBlbXB0eSBmaWVsZCBuYW1lLiIpOwogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBpZiAoIWRpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZGljdC5nZXQoIlQiKSk7CiAgICB9CiAgICBjb25zdCBmaWVsZE5hbWUgPSBbXTsKICAgIGlmIChkaWN0LmhhcygiVCIpKSB7CiAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KHN0cmluZ1RvUERGU3RyaW5nKGRpY3QuZ2V0KCJUIikpKTsKICAgIH0KICAgIGxldCBsb29wRGljdCA9IGRpY3Q7CiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFJlZlNldCgpOwogICAgaWYgKGRpY3Qub2JqSWQpIHsKICAgICAgdmlzaXRlZC5wdXQoZGljdC5vYmpJZCk7CiAgICB9CiAgICB3aGlsZSAobG9vcERpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICBsb29wRGljdCA9IGxvb3BEaWN0LmdldCgiUGFyZW50Iik7CiAgICAgIGlmICghKGxvb3BEaWN0IGluc3RhbmNlb2YgRGljdCkgfHwgbG9vcERpY3Qub2JqSWQgJiYgdmlzaXRlZC5oYXMobG9vcERpY3Qub2JqSWQpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGxvb3BEaWN0Lm9iaklkKSB7CiAgICAgICAgdmlzaXRlZC5wdXQobG9vcERpY3Qub2JqSWQpOwogICAgICB9CiAgICAgIGlmIChsb29wRGljdC5oYXMoIlQiKSkgewogICAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KHN0cmluZ1RvUERGU3RyaW5nKGxvb3BEaWN0LmdldCgiVCIpKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmaWVsZE5hbWUuam9pbigiLiIpOwogIH0KICBnZXQgd2lkdGgoKSB7CiAgICByZXR1cm4gdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXTsKICB9CiAgZ2V0IGhlaWdodCgpIHsKICAgIHJldHVybiB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdOwogIH0KfQpjbGFzcyBBbm5vdGF0aW9uQm9yZGVyU3R5bGUgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy53aWR0aCA9IDE7CiAgICB0aGlzLnJhd1dpZHRoID0gMTsKICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOwogICAgdGhpcy5kYXNoQXJyYXkgPSBbM107CiAgICB0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXMgPSAwOwogICAgdGhpcy52ZXJ0aWNhbENvcm5lclJhZGl1cyA9IDA7CiAgfQogIHNldFdpZHRoKHdpZHRoLCByZWN0ID0gWzAsIDAsIDAsIDBdKSB7CiAgICBpZiAod2lkdGggaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHRoaXMud2lkdGggPSAwOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIikgewogICAgICBpZiAod2lkdGggPiAwKSB7CiAgICAgICAgdGhpcy5yYXdXaWR0aCA9IHdpZHRoOwogICAgICAgIGNvbnN0IG1heFdpZHRoID0gKHJlY3RbMl0gLSByZWN0WzBdKSAvIDI7CiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gKHJlY3RbM10gLSByZWN0WzFdKSAvIDI7CiAgICAgICAgaWYgKG1heFdpZHRoID4gMCAmJiBtYXhIZWlnaHQgPiAwICYmICh3aWR0aCA+IG1heFdpZHRoIHx8IHdpZHRoID4gbWF4SGVpZ2h0KSkgewogICAgICAgICAgd2FybihgQW5ub3RhdGlvbkJvcmRlclN0eWxlLnNldFdpZHRoIC0gaWdub3Jpbmcgd2lkdGg6ICR7d2lkdGh9YCk7CiAgICAgICAgICB3aWR0aCA9IDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKICAgIH0KICB9CiAgc2V0U3R5bGUoc3R5bGUpIHsKICAgIGlmICghKHN0eWxlIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3dpdGNoIChzdHlsZS5uYW1lKSB7CiAgICAgIGNhc2UgIlMiOgogICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJEIjoKICAgICAgICB0aGlzLnN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkIiOgogICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkJFVkVMRUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkkiOgogICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLklOU0VUOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJVIjoKICAgICAgICB0aGlzLnN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkU7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHNldERhc2hBcnJheShkYXNoQXJyYXksIGZvcmNlU3R5bGUgPSBmYWxzZSkgewogICAgaWYgKEFycmF5LmlzQXJyYXkoZGFzaEFycmF5KSkgewogICAgICBsZXQgaXNWYWxpZCA9IHRydWU7CiAgICAgIGxldCBhbGxaZXJvcyA9IHRydWU7CiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkYXNoQXJyYXkpIHsKICAgICAgICBjb25zdCB2YWxpZE51bWJlciA9ICtlbGVtZW50ID49IDA7CiAgICAgICAgaWYgKCF2YWxpZE51bWJlcikgewogICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID4gMCkgewogICAgICAgICAgYWxsWmVyb3MgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRhc2hBcnJheS5sZW5ndGggPT09IDAgfHwgaXNWYWxpZCAmJiAhYWxsWmVyb3MpIHsKICAgICAgICB0aGlzLmRhc2hBcnJheSA9IGRhc2hBcnJheTsKICAgICAgICBpZiAoZm9yY2VTdHlsZSkgewogICAgICAgICAgdGhpcy5zZXRTdHlsZShOYW1lLmdldCgiRCIpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy53aWR0aCA9IDA7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGFzaEFycmF5KSB7CiAgICAgIHRoaXMud2lkdGggPSAwOwogICAgfQogIH0KICBzZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKHJhZGl1cykgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkgewogICAgICB0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXMgPSByYWRpdXM7CiAgICB9CiAgfQogIHNldFZlcnRpY2FsQ29ybmVyUmFkaXVzKHJhZGl1cykgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkgewogICAgICB0aGlzLnZlcnRpY2FsQ29ybmVyUmFkaXVzID0gcmFkaXVzOwogICAgfQogIH0KfQpjbGFzcyBNYXJrdXBBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0CiAgICB9ID0gcGFyYW1zOwogICAgaWYgKGRpY3QuaGFzKCJJUlQiKSkgewogICAgICBjb25zdCByYXdJUlQgPSBkaWN0LmdldFJhdygiSVJUIik7CiAgICAgIHRoaXMuZGF0YS5pblJlcGx5VG8gPSByYXdJUlQgaW5zdGFuY2VvZiBSZWYgPyByYXdJUlQudG9TdHJpbmcoKSA6IG51bGw7CiAgICAgIGNvbnN0IHJ0ID0gZGljdC5nZXQoIlJUIik7CiAgICAgIHRoaXMuZGF0YS5yZXBseVR5cGUgPSBydCBpbnN0YW5jZW9mIE5hbWUgPyBydC5uYW1lIDogQW5ub3RhdGlvblJlcGx5VHlwZS5SRVBMWTsKICAgIH0KICAgIGxldCBwb3B1cFJlZiA9IG51bGw7CiAgICBpZiAodGhpcy5kYXRhLnJlcGx5VHlwZSA9PT0gQW5ub3RhdGlvblJlcGx5VHlwZS5HUk9VUCkgewogICAgICBjb25zdCBwYXJlbnQgPSBkaWN0LmdldCgiSVJUIik7CiAgICAgIHRoaXMuc2V0VGl0bGUocGFyZW50LmdldCgiVCIpKTsKICAgICAgdGhpcy5kYXRhLnRpdGxlT2JqID0gdGhpcy5fdGl0bGU7CiAgICAgIHRoaXMuc2V0Q29udGVudHMocGFyZW50LmdldCgiQ29udGVudHMiKSk7CiAgICAgIHRoaXMuZGF0YS5jb250ZW50c09iaiA9IHRoaXMuX2NvbnRlbnRzOwogICAgICBpZiAoIXBhcmVudC5oYXMoIkNyZWF0aW9uRGF0ZSIpKSB7CiAgICAgICAgdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZSA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUocGFyZW50LmdldCgiQ3JlYXRpb25EYXRlIikpOwogICAgICAgIHRoaXMuZGF0YS5jcmVhdGlvbkRhdGUgPSB0aGlzLmNyZWF0aW9uRGF0ZTsKICAgICAgfQogICAgICBpZiAoIXBhcmVudC5oYXMoIk0iKSkgewogICAgICAgIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUocGFyZW50LmdldCgiTSIpKTsKICAgICAgICB0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSA9IHRoaXMubW9kaWZpY2F0aW9uRGF0ZTsKICAgICAgfQogICAgICBwb3B1cFJlZiA9IHBhcmVudC5nZXRSYXcoIlBvcHVwIik7CiAgICAgIGlmICghcGFyZW50LmhhcygiQyIpKSB7CiAgICAgICAgdGhpcy5kYXRhLmNvbG9yID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNldENvbG9yKHBhcmVudC5nZXRBcnJheSgiQyIpKTsKICAgICAgICB0aGlzLmRhdGEuY29sb3IgPSB0aGlzLmNvbG9yOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEudGl0bGVPYmogPSB0aGlzLl90aXRsZTsKICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUoZGljdC5nZXQoIkNyZWF0aW9uRGF0ZSIpKTsKICAgICAgdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZSA9IHRoaXMuY3JlYXRpb25EYXRlOwogICAgICBwb3B1cFJlZiA9IGRpY3QuZ2V0UmF3KCJQb3B1cCIpOwogICAgICBpZiAoIWRpY3QuaGFzKCJDIikpIHsKICAgICAgICB0aGlzLmRhdGEuY29sb3IgPSBudWxsOwogICAgICB9CiAgICB9CiAgICB0aGlzLmRhdGEucG9wdXBSZWYgPSBwb3B1cFJlZiBpbnN0YW5jZW9mIFJlZiA/IHBvcHVwUmVmLnRvU3RyaW5nKCkgOiBudWxsOwogICAgaWYgKGRpY3QuaGFzKCJSQyIpKSB7CiAgICAgIHRoaXMuZGF0YS5yaWNoVGV4dCA9IFhGQUZhY3RvcnkuZ2V0UmljaFRleHRBc0h0bWwoZGljdC5nZXQoIlJDIikpOwogICAgfQogIH0KICBzZXRDcmVhdGlvbkRhdGUoY3JlYXRpb25EYXRlKSB7CiAgICB0aGlzLmNyZWF0aW9uRGF0ZSA9IHR5cGVvZiBjcmVhdGlvbkRhdGUgPT09ICJzdHJpbmciID8gY3JlYXRpb25EYXRlIDogbnVsbDsKICB9CiAgX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgIHhyZWYsCiAgICBleHRyYSwKICAgIHN0cm9rZUNvbG9yLAogICAgZmlsbENvbG9yLAogICAgYmxlbmRNb2RlLAogICAgc3Ryb2tlQWxwaGEsCiAgICBmaWxsQWxwaGEsCiAgICBwb2ludHNDYWxsYmFjawogIH0pIHsKICAgIGNvbnN0IGJib3ggPSB0aGlzLmRhdGEucmVjdCA9IFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XTsKICAgIGNvbnN0IGJ1ZmZlciA9IFsicSJdOwogICAgaWYgKGV4dHJhKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGV4dHJhKTsKICAgIH0KICAgIGlmIChzdHJva2VDb2xvcikgewogICAgICBidWZmZXIucHVzaChgJHtzdHJva2VDb2xvclswXX0gJHtzdHJva2VDb2xvclsxXX0gJHtzdHJva2VDb2xvclsyXX0gUkdgKTsKICAgIH0KICAgIGlmIChmaWxsQ29sb3IpIHsKICAgICAgYnVmZmVyLnB1c2goYCR7ZmlsbENvbG9yWzBdfSAke2ZpbGxDb2xvclsxXX0gJHtmaWxsQ29sb3JbMl19IHJnYCk7CiAgICB9CiAgICBjb25zdCBwb2ludHNBcnJheSA9IHRoaXMuZGF0YS5xdWFkUG9pbnRzIHx8IEZsb2F0MzJBcnJheS5mcm9tKFt0aGlzLnJlY3RhbmdsZVswXSwgdGhpcy5yZWN0YW5nbGVbM10sIHRoaXMucmVjdGFuZ2xlWzJdLCB0aGlzLnJlY3RhbmdsZVszXSwgdGhpcy5yZWN0YW5nbGVbMF0sIHRoaXMucmVjdGFuZ2xlWzFdLCB0aGlzLnJlY3RhbmdsZVsyXSwgdGhpcy5yZWN0YW5nbGVbMV1dKTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50c0FycmF5Lmxlbmd0aDsgaSA8IGlpOyBpICs9IDgpIHsKICAgICAgY29uc3QgcG9pbnRzID0gcG9pbnRzQ2FsbGJhY2soYnVmZmVyLCBwb2ludHNBcnJheS5zdWJhcnJheShpLCBpICsgOCkpOwogICAgICBVdGlsLnJlY3RCb3VuZGluZ0JveCguLi5wb2ludHMsIGJib3gpOwogICAgfQogICAgYnVmZmVyLnB1c2goIlEiKTsKICAgIGNvbnN0IGZvcm1EaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBjb25zdCBhcHBlYXJhbmNlU3RyZWFtRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBjb25zdCBhcHBlYXJhbmNlU3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbShidWZmZXIuam9pbigiICIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW0uZGljdCA9IGFwcGVhcmFuY2VTdHJlYW1EaWN0OwogICAgZm9ybURpY3Quc2V0KCJGbTAiLCBhcHBlYXJhbmNlU3RyZWFtKTsKICAgIGNvbnN0IGdzRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgaWYgKGJsZW5kTW9kZSkgewogICAgICBnc0RpY3Quc2V0KCJCTSIsIE5hbWUuZ2V0KGJsZW5kTW9kZSkpOwogICAgfQogICAgaWYgKHR5cGVvZiBzdHJva2VBbHBoYSA9PT0gIm51bWJlciIpIHsKICAgICAgZ3NEaWN0LnNldCgiQ0EiLCBzdHJva2VBbHBoYSk7CiAgICB9CiAgICBpZiAodHlwZW9mIGZpbGxBbHBoYSA9PT0gIm51bWJlciIpIHsKICAgICAgZ3NEaWN0LnNldCgiY2EiLCBmaWxsQWxwaGEpOwogICAgfQogICAgY29uc3Qgc3RhdGVEaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBzdGF0ZURpY3Quc2V0KCJHUzAiLCBnc0RpY3QpOwogICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QoeHJlZik7CiAgICByZXNvdXJjZXMuc2V0KCJFeHRHU3RhdGUiLCBzdGF0ZURpY3QpOwogICAgcmVzb3VyY2VzLnNldCgiWE9iamVjdCIsIGZvcm1EaWN0KTsKICAgIGNvbnN0IGFwcGVhcmFuY2VEaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBhcHBlYXJhbmNlRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICBhcHBlYXJhbmNlRGljdC5zZXQoIkJCb3giLCBiYm94KTsKICAgIHRoaXMuYXBwZWFyYW5jZSA9IG5ldyBTdHJpbmdTdHJlYW0oIi9HUzAgZ3MgL0ZtMCBEbyIpOwogICAgdGhpcy5hcHBlYXJhbmNlLmRpY3QgPSBhcHBlYXJhbmNlRGljdDsKICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmFwcGVhcmFuY2UsIGFwcGVhcmFuY2VTdHJlYW0pOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzLCBwYXJhbXMpIHsKICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBhbm5vdGF0aW9uLnJlZiB8fD0geHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgIGNvbnN0IGFwID0gYXdhaXQgdGhpcy5jcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGFubm90YXRpb24sIHhyZWYsIHBhcmFtcyk7CiAgICBsZXQgYW5ub3RhdGlvbkRpY3Q7CiAgICBpZiAoYXApIHsKICAgICAgY29uc3QgYXBSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICBhbm5vdGF0aW9uRGljdCA9IHRoaXMuY3JlYXRlTmV3RGljdChhbm5vdGF0aW9uLCB4cmVmLCB7CiAgICAgICAgYXBSZWYKICAgICAgfSk7CiAgICAgIGNoYW5nZXMucHV0KGFwUmVmLCB7CiAgICAgICAgZGF0YTogYXAKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBhbm5vdGF0aW9uRGljdCA9IHRoaXMuY3JlYXRlTmV3RGljdChhbm5vdGF0aW9uLCB4cmVmLCB7fSk7CiAgICB9CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihhbm5vdGF0aW9uLnBhcmVudFRyZWVJZCkpIHsKICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJTdHJ1Y3RQYXJlbnQiLCBhbm5vdGF0aW9uLnBhcmVudFRyZWVJZCk7CiAgICB9CiAgICBjaGFuZ2VzLnB1dChhbm5vdGF0aW9uUmVmLCB7CiAgICAgIGRhdGE6IGFubm90YXRpb25EaWN0CiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgIHJlZjogYW5ub3RhdGlvblJlZgogICAgfTsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihhbm5vdGF0aW9uR2xvYmFscywgeHJlZiwgYW5ub3RhdGlvbiwgcGFyYW1zKSB7CiAgICBjb25zdCBhcCA9IGF3YWl0IHRoaXMuY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShhbm5vdGF0aW9uLCB4cmVmLCBwYXJhbXMpOwogICAgY29uc3QgYW5ub3RhdGlvbkRpY3QgPSB0aGlzLmNyZWF0ZU5ld0RpY3QoYW5ub3RhdGlvbiwgeHJlZiwgYXAgPyB7CiAgICAgIGFwCiAgICB9IDoge30pOwogICAgY29uc3QgbmV3QW5ub3RhdGlvbiA9IG5ldyB0aGlzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcih7CiAgICAgIGRpY3Q6IGFubm90YXRpb25EaWN0LAogICAgICB4cmVmLAogICAgICBhbm5vdGF0aW9uR2xvYmFscywKICAgICAgZXZhbHVhdG9yT3B0aW9uczogcGFyYW1zLmV2YWx1YXRvck9wdGlvbnMKICAgIH0pOwogICAgaWYgKGFubm90YXRpb24ucmVmKSB7CiAgICAgIG5ld0Fubm90YXRpb24ucmVmID0gbmV3QW5ub3RhdGlvbi5yZWZUb1JlcGxhY2UgPSBhbm5vdGF0aW9uLnJlZjsKICAgIH0KICAgIHJldHVybiBuZXdBbm5vdGF0aW9uOwogIH0KfQpjbGFzcyBXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmLAogICAgICBhbm5vdGF0aW9uR2xvYmFscwogICAgfSA9IHBhcmFtczsKICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CiAgICB0aGlzLl9uZWVkQXBwZWFyYW5jZXMgPSBwYXJhbXMubmVlZEFwcGVhcmFuY2VzOwogICAgZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLldJREdFVDsKICAgIGlmIChkYXRhLmZpZWxkTmFtZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGRhdGEuZmllbGROYW1lID0gdGhpcy5fY29uc3RydWN0RmllbGROYW1lKGRpY3QpOwogICAgfQogICAgaWYgKGRhdGEuYWN0aW9ucyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGRhdGEuYWN0aW9ucyA9IGNvbGxlY3RBY3Rpb25zKHhyZWYsIGRpY3QsIEFubm90YXRpb25BY3Rpb25FdmVudFR5cGUpOwogICAgfQogICAgbGV0IGZpZWxkVmFsdWUgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiViIsCiAgICAgIGdldEFycmF5OiB0cnVlCiAgICB9KTsKICAgIGRhdGEuZmllbGRWYWx1ZSA9IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShmaWVsZFZhbHVlKTsKICAgIGNvbnN0IGRlZmF1bHRGaWVsZFZhbHVlID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIkRWIiwKICAgICAgZ2V0QXJyYXk6IHRydWUKICAgIH0pOwogICAgZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSA9IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShkZWZhdWx0RmllbGRWYWx1ZSk7CiAgICBpZiAoZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25HbG9iYWxzLnhmYURhdGFzZXRzKSB7CiAgICAgIGNvbnN0IHBhdGggPSB0aGlzLl90aXRsZS5zdHI7CiAgICAgIGlmIChwYXRoKSB7CiAgICAgICAgdGhpcy5faGFzVmFsdWVGcm9tWEZBID0gdHJ1ZTsKICAgICAgICBkYXRhLmZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlID0gYW5ub3RhdGlvbkdsb2JhbHMueGZhRGF0YXNldHMuZ2V0VmFsdWUocGF0aCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChmaWVsZFZhbHVlID09PSB1bmRlZmluZWQgJiYgZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSAhPT0gbnVsbCkgewogICAgICBkYXRhLmZpZWxkVmFsdWUgPSBkYXRhLmRlZmF1bHRGaWVsZFZhbHVlOwogICAgfQogICAgZGF0YS5hbHRlcm5hdGl2ZVRleHQgPSBzdHJpbmdUb1BERlN0cmluZyhkaWN0LmdldCgiVFUiKSB8fCAiIik7CiAgICB0aGlzLnNldERlZmF1bHRBcHBlYXJhbmNlKHBhcmFtcyk7CiAgICBkYXRhLmhhc0FwcGVhcmFuY2UgfHw9IHRoaXMuX25lZWRBcHBlYXJhbmNlcyAmJiBkYXRhLmZpZWxkVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBkYXRhLmZpZWxkVmFsdWUgIT09IG51bGw7CiAgICBjb25zdCBmaWVsZFR5cGUgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiRlQiCiAgICB9KTsKICAgIGRhdGEuZmllbGRUeXBlID0gZmllbGRUeXBlIGluc3RhbmNlb2YgTmFtZSA/IGZpZWxkVHlwZS5uYW1lIDogbnVsbDsKICAgIGNvbnN0IGxvY2FsUmVzb3VyY2VzID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIkRSIgogICAgfSk7CiAgICBjb25zdCBhY3JvRm9ybVJlc291cmNlcyA9IGFubm90YXRpb25HbG9iYWxzLmFjcm9Gb3JtLmdldCgiRFIiKTsKICAgIGNvbnN0IGFwcGVhcmFuY2VSZXNvdXJjZXMgPSB0aGlzLmFwcGVhcmFuY2U/LmRpY3QuZ2V0KCJSZXNvdXJjZXMiKTsKICAgIHRoaXMuX2ZpZWxkUmVzb3VyY2VzID0gewogICAgICBsb2NhbFJlc291cmNlcywKICAgICAgYWNyb0Zvcm1SZXNvdXJjZXMsCiAgICAgIGFwcGVhcmFuY2VSZXNvdXJjZXMsCiAgICAgIG1lcmdlZFJlc291cmNlczogRGljdC5tZXJnZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBkaWN0QXJyYXk6IFtsb2NhbFJlc291cmNlcywgYXBwZWFyYW5jZVJlc291cmNlcywgYWNyb0Zvcm1SZXNvdXJjZXNdLAogICAgICAgIG1lcmdlU3ViRGljdHM6IHRydWUKICAgICAgfSkKICAgIH07CiAgICBkYXRhLmZpZWxkRmxhZ3MgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiRmYiCiAgICB9KTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihkYXRhLmZpZWxkRmxhZ3MpIHx8IGRhdGEuZmllbGRGbGFncyA8IDApIHsKICAgICAgZGF0YS5maWVsZEZsYWdzID0gMDsKICAgIH0KICAgIGRhdGEucGFzc3dvcmQgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKTsKICAgIGRhdGEucmVhZE9ubHkgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlJFQURPTkxZKTsKICAgIGRhdGEucmVxdWlyZWQgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlJFUVVJUkVEKTsKICAgIGRhdGEuaGlkZGVuID0gdGhpcy5faGFzRmxhZyhkYXRhLmFubm90YXRpb25GbGFncywgQW5ub3RhdGlvbkZsYWcuSElEREVOKSB8fCB0aGlzLl9oYXNGbGFnKGRhdGEuYW5ub3RhdGlvbkZsYWdzLCBBbm5vdGF0aW9uRmxhZy5OT1ZJRVcpOwogIH0KICBfZGVjb2RlRm9ybVZhbHVlKGZvcm1WYWx1ZSkgewogICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybVZhbHVlKSkgewogICAgICByZXR1cm4gZm9ybVZhbHVlLmZpbHRlcihpdGVtID0+IHR5cGVvZiBpdGVtID09PSAic3RyaW5nIikubWFwKGl0ZW0gPT4gc3RyaW5nVG9QREZTdHJpbmcoaXRlbSkpOwogICAgfSBlbHNlIGlmIChmb3JtVmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHJldHVybiBzdHJpbmdUb1BERlN0cmluZyhmb3JtVmFsdWUubmFtZSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmb3JtVmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgIHJldHVybiBzdHJpbmdUb1BERlN0cmluZyhmb3JtVmFsdWUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGhhc0ZpZWxkRmxhZyhmbGFnKSB7CiAgICByZXR1cm4gISEodGhpcy5kYXRhLmZpZWxkRmxhZ3MgJiBmbGFnKTsKICB9CiAgX2lzVmlld2FibGUoZmxhZ3MpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBtdXN0QmVWaWV3ZWQoYW5ub3RhdGlvblN0b3JhZ2UsIHJlbmRlckZvcm1zKSB7CiAgICBpZiAocmVuZGVyRm9ybXMpIHsKICAgICAgcmV0dXJuIHRoaXMudmlld2FibGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIubXVzdEJlVmlld2VkKGFubm90YXRpb25TdG9yYWdlLCByZW5kZXJGb3JtcykgJiYgIXRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncywgQW5ub3RhdGlvbkZsYWcuTk9WSUVXKTsKICB9CiAgZ2V0Um90YXRpb25NYXRyaXgoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGxldCByb3RhdGlvbiA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8ucm90YXRpb247CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCkgewogICAgICByb3RhdGlvbiA9IHRoaXMucm90YXRpb247CiAgICB9CiAgICByZXR1cm4gcm90YXRpb24gPT09IDAgPyBJREVOVElUWV9NQVRSSVggOiBnZXRSb3RhdGlvbk1hdHJpeChyb3RhdGlvbiwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpOwogIH0KICBnZXRCb3JkZXJBbmRCYWNrZ3JvdW5kQXBwZWFyYW5jZXMoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGxldCByb3RhdGlvbiA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8ucm90YXRpb247CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCkgewogICAgICByb3RhdGlvbiA9IHRoaXMucm90YXRpb247CiAgICB9CiAgICBpZiAoIXRoaXMuYmFja2dyb3VuZENvbG9yICYmICF0aGlzLmJvcmRlckNvbG9yKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGNvbnN0IHJlY3QgPSByb3RhdGlvbiA9PT0gMCB8fCByb3RhdGlvbiA9PT0gMTgwID8gYDAgMCAke3RoaXMud2lkdGh9ICR7dGhpcy5oZWlnaHR9IHJlYCA6IGAwIDAgJHt0aGlzLmhlaWdodH0gJHt0aGlzLndpZHRofSByZWA7CiAgICBsZXQgc3RyID0gIiI7CiAgICBpZiAodGhpcy5iYWNrZ3JvdW5kQ29sb3IpIHsKICAgICAgc3RyID0gYCR7Z2V0UGRmQ29sb3IodGhpcy5iYWNrZ3JvdW5kQ29sb3IsIHRydWUpfSAke3JlY3R9IGYgYDsKICAgIH0KICAgIGlmICh0aGlzLmJvcmRlckNvbG9yKSB7CiAgICAgIGNvbnN0IGJvcmRlcldpZHRoID0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aCB8fCAxOwogICAgICBzdHIgKz0gYCR7Ym9yZGVyV2lkdGh9IHcgJHtnZXRQZGZDb2xvcih0aGlzLmJvcmRlckNvbG9yLCBmYWxzZSl9ICR7cmVjdH0gUyBgOwogICAgfQogICAgcmV0dXJuIHN0cjsKICB9CiAgYXN5bmMgZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgaWYgKGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRk9STVMgJiYgISh0aGlzIGluc3RhbmNlb2YgU2lnbmF0dXJlV2lkZ2V0QW5ub3RhdGlvbikgJiYgIXRoaXMuZGF0YS5ub0hUTUwgJiYgIXRoaXMuZGF0YS5oYXNPd25DYW52YXMpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBvcExpc3Q6IG5ldyBPcGVyYXRvckxpc3QoKSwKICAgICAgICBzZXBhcmF0ZUZvcm06IHRydWUsCiAgICAgICAgc2VwYXJhdGVDYW52YXM6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgICBpZiAoIXRoaXMuX2hhc1RleHQpIHsKICAgICAgcmV0dXJuIHN1cGVyLmdldE9wZXJhdG9yTGlzdChldmFsdWF0b3IsIHRhc2ssIGludGVudCwgYW5ub3RhdGlvblN0b3JhZ2UpOwogICAgfQogICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIGlmICh0aGlzLmFwcGVhcmFuY2UgJiYgY29udGVudCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBjb25zdCBvcExpc3QgPSBuZXcgT3BlcmF0b3JMaXN0KCk7CiAgICBpZiAoIXRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlIHx8IGNvbnRlbnQgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBvcExpc3QsCiAgICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgICBzZXBhcmF0ZUNhbnZhczogZmFsc2UKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IGlzVXNpbmdPd25DYW52YXMgPSAhISh0aGlzLmRhdGEuaGFzT3duQ2FudmFzICYmIGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSk7CiAgICBjb25zdCBtYXRyaXggPSBbMSwgMCwgMCwgMSwgMCwgMF07CiAgICBjb25zdCBiYm94ID0gWzAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XTsKICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybU1hdHJpeCh0aGlzLmRhdGEucmVjdCwgYmJveCwgbWF0cml4KTsKICAgIGxldCBvcHRpb25hbENvbnRlbnQ7CiAgICBpZiAodGhpcy5vYykgewogICAgICBvcHRpb25hbENvbnRlbnQgPSBhd2FpdCBldmFsdWF0b3IucGFyc2VNYXJrZWRDb250ZW50UHJvcHModGhpcy5vYywgbnVsbCk7CiAgICB9CiAgICBpZiAob3B0aW9uYWxDb250ZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgb3BMaXN0LmFkZE9wKE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG9wdGlvbmFsQ29udGVudF0pOwogICAgfQogICAgb3BMaXN0LmFkZE9wKE9QUy5iZWdpbkFubm90YXRpb24sIFt0aGlzLmRhdGEuaWQsIHRoaXMuZGF0YS5yZWN0LCB0cmFuc2Zvcm0sIHRoaXMuZ2V0Um90YXRpb25NYXRyaXgoYW5ub3RhdGlvblN0b3JhZ2UpLCBpc1VzaW5nT3duQ2FudmFzXSk7CiAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKGNvbnRlbnQpOwogICAgYXdhaXQgZXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgIHN0cmVhbSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzOiB0aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMsCiAgICAgIG9wZXJhdG9yTGlzdDogb3BMaXN0CiAgICB9KTsKICAgIG9wTGlzdC5hZGRPcChPUFMuZW5kQW5ub3RhdGlvbiwgW10pOwogICAgaWYgKG9wdGlvbmFsQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIG9wTGlzdC5hZGRPcChPUFMuZW5kTWFya2VkQ29udGVudCwgW10pOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgb3BMaXN0LAogICAgICBzZXBhcmF0ZUZvcm06IGZhbHNlLAogICAgICBzZXBhcmF0ZUNhbnZhczogaXNVc2luZ093bkNhbnZhcwogICAgfTsKICB9CiAgX2dldE1LRGljdChyb3RhdGlvbikgewogICAgY29uc3QgbWsgPSBuZXcgRGljdChudWxsKTsKICAgIGlmIChyb3RhdGlvbikgewogICAgICBtay5zZXQoIlIiLCByb3RhdGlvbik7CiAgICB9CiAgICBpZiAodGhpcy5ib3JkZXJDb2xvcikgewogICAgICBtay5zZXQoIkJDIiwgZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmJvcmRlckNvbG9yKSk7CiAgICB9CiAgICBpZiAodGhpcy5iYWNrZ3JvdW5kQ29sb3IpIHsKICAgICAgbWsuc2V0KCJCRyIsIGdldFBkZkNvbG9yQXJyYXkodGhpcy5iYWNrZ3JvdW5kQ29sb3IpKTsKICAgIH0KICAgIHJldHVybiBtay5zaXplID4gMCA/IG1rIDogbnVsbDsKICB9CiAgYW1lbmRTYXZlZERpY3QoYW5ub3RhdGlvblN0b3JhZ2UsIGRpY3QpIHt9CiAgc2V0VmFsdWUoZGljdCwgdmFsdWUsIHhyZWYsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHsKICAgICAgZGljdDogcGFyZW50RGljdCwKICAgICAgcmVmOiBwYXJlbnRSZWYKICAgIH0gPSBnZXRQYXJlbnRUb1VwZGF0ZShkaWN0LCB0aGlzLnJlZiwgeHJlZik7CiAgICBpZiAoIXBhcmVudERpY3QpIHsKICAgICAgZGljdC5zZXQoIlYiLCB2YWx1ZSk7CiAgICB9IGVsc2UgaWYgKCFjaGFuZ2VzLmhhcyhwYXJlbnRSZWYpKSB7CiAgICAgIGNvbnN0IG5ld1BhcmVudERpY3QgPSBwYXJlbnREaWN0LmNsb25lKCk7CiAgICAgIG5ld1BhcmVudERpY3Quc2V0KCJWIiwgdmFsdWUpOwogICAgICBjaGFuZ2VzLnB1dChwYXJlbnRSZWYsIHsKICAgICAgICBkYXRhOiBuZXdQYXJlbnREaWN0CiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3UGFyZW50RGljdDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBhc3luYyBzYXZlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHN0b3JhZ2VFbnRyeSA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGNvbnN0IGZsYWdzID0gdGhpcy5fYnVpbGRGbGFncyhzdG9yYWdlRW50cnk/Lm5vVmlldywgc3RvcmFnZUVudHJ5Py5ub1ByaW50KTsKICAgIGxldCB2YWx1ZSA9IHN0b3JhZ2VFbnRyeT8udmFsdWUsCiAgICAgIHJvdGF0aW9uID0gc3RvcmFnZUVudHJ5Py5yb3RhdGlvbjsKICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICBpZiAoIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQSAmJiByb3RhdGlvbiA9PT0gdW5kZWZpbmVkICYmIGZsYWdzID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFsdWUgfHw9IHRoaXMuZGF0YS5maWVsZFZhbHVlOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQgJiYgIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5maWVsZFZhbHVlKSAmJiBpc0FycmF5RXF1YWwodmFsdWUsIHRoaXMuZGF0YS5maWVsZFZhbHVlKSAmJiBmbGFncyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgIH0KICAgIGxldCBhcHBlYXJhbmNlID0gbnVsbDsKICAgIGlmICghdGhpcy5fbmVlZEFwcGVhcmFuY2VzKSB7CiAgICAgIGFwcGVhcmFuY2UgPSBhd2FpdCB0aGlzLl9nZXRBcHBlYXJhbmNlKGV2YWx1YXRvciwgdGFzaywgUmVuZGVyaW5nSW50ZW50RmxhZy5TQVZFLCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICAgIGlmIChhcHBlYXJhbmNlID09PSBudWxsICYmIGZsYWdzID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0gZWxzZSB7fQogICAgbGV0IG5lZWRBcHBlYXJhbmNlcyA9IGZhbHNlOwogICAgaWYgKGFwcGVhcmFuY2U/Lm5lZWRBcHBlYXJhbmNlcykgewogICAgICBuZWVkQXBwZWFyYW5jZXMgPSB0cnVlOwogICAgICBhcHBlYXJhbmNlID0gbnVsbDsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgeHJlZgogICAgfSA9IGV2YWx1YXRvcjsKICAgIGNvbnN0IG9yaWdpbmFsRGljdCA9IHhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7CiAgICBpZiAoIShvcmlnaW5hbERpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBkaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBmb3IgKGNvbnN0IGtleSBvZiBvcmlnaW5hbERpY3QuZ2V0S2V5cygpKSB7CiAgICAgIGlmIChrZXkgIT09ICJBUCIpIHsKICAgICAgICBkaWN0LnNldChrZXksIG9yaWdpbmFsRGljdC5nZXRSYXcoa2V5KSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChmbGFncyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGRpY3Quc2V0KCJGIiwgZmxhZ3MpOwogICAgICBpZiAoYXBwZWFyYW5jZSA9PT0gbnVsbCAmJiAhbmVlZEFwcGVhcmFuY2VzKSB7CiAgICAgICAgY29uc3QgYXAgPSBvcmlnaW5hbERpY3QuZ2V0UmF3KCJBUCIpOwogICAgICAgIGlmIChhcCkgewogICAgICAgICAgZGljdC5zZXQoIkFQIiwgYXApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3QgeGZhID0gewogICAgICBwYXRoOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICB2YWx1ZQogICAgfTsKICAgIGNvbnN0IG5ld1BhcmVudERpY3QgPSB0aGlzLnNldFZhbHVlKGRpY3QsIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKHN0cmluZ1RvQXNjaWlPclVURjE2QkUpIDogc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRSh2YWx1ZSksIHhyZWYsIGNoYW5nZXMpOwogICAgdGhpcy5hbWVuZFNhdmVkRGljdChhbm5vdGF0aW9uU3RvcmFnZSwgbmV3UGFyZW50RGljdCB8fCBkaWN0KTsKICAgIGNvbnN0IG1heWJlTUsgPSB0aGlzLl9nZXRNS0RpY3Qocm90YXRpb24pOwogICAgaWYgKG1heWJlTUspIHsKICAgICAgZGljdC5zZXQoIk1LIiwgbWF5YmVNSyk7CiAgICB9CiAgICBjaGFuZ2VzLnB1dCh0aGlzLnJlZiwgewogICAgICBkYXRhOiBkaWN0LAogICAgICB4ZmEsCiAgICAgIG5lZWRBcHBlYXJhbmNlcwogICAgfSk7CiAgICBpZiAoYXBwZWFyYW5jZSAhPT0gbnVsbCkgewogICAgICBjb25zdCBuZXdSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICBjb25zdCBBUCA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBkaWN0LnNldCgiQVAiLCBBUCk7CiAgICAgIEFQLnNldCgiTiIsIG5ld1JlZik7CiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMuX2dldFNhdmVGaWVsZFJlc291cmNlcyh4cmVmKTsKICAgICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICAgIGNvbnN0IGFwcGVhcmFuY2VEaWN0ID0gYXBwZWFyYW5jZVN0cmVhbS5kaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgICBhcHBlYXJhbmNlRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiQkJveCIsIFswLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodF0pOwogICAgICBjb25zdCByb3RhdGlvbk1hdHJpeCA9IHRoaXMuZ2V0Um90YXRpb25NYXRyaXgoYW5ub3RhdGlvblN0b3JhZ2UpOwogICAgICBpZiAocm90YXRpb25NYXRyaXggIT09IElERU5USVRZX01BVFJJWCkgewogICAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiTWF0cml4Iiwgcm90YXRpb25NYXRyaXgpOwogICAgICB9CiAgICAgIGNoYW5nZXMucHV0KG5ld1JlZiwgewogICAgICAgIGRhdGE6IGFwcGVhcmFuY2VTdHJlYW0sCiAgICAgICAgeGZhOiBudWxsLAogICAgICAgIG5lZWRBcHBlYXJhbmNlczogZmFsc2UKICAgICAgfSk7CiAgICB9CiAgICBkaWN0LnNldCgiTSIsIGBEOiR7Z2V0TW9kaWZpY2F0aW9uRGF0ZSgpfWApOwogIH0KICBhc3luYyBfZ2V0QXBwZWFyYW5jZShldmFsdWF0b3IsIHRhc2ssIGludGVudCwgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGlmICh0aGlzLmRhdGEucGFzc3dvcmQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZT8uZ2V0KHRoaXMuZGF0YS5pZCk7CiAgICBsZXQgdmFsdWUsIHJvdGF0aW9uOwogICAgaWYgKHN0b3JhZ2VFbnRyeSkgewogICAgICB2YWx1ZSA9IHN0b3JhZ2VFbnRyeS5mb3JtYXR0ZWRWYWx1ZSB8fCBzdG9yYWdlRW50cnkudmFsdWU7CiAgICAgIHJvdGF0aW9uID0gc3RvcmFnZUVudHJ5LnJvdGF0aW9uOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhdGhpcy5fbmVlZEFwcGVhcmFuY2VzKSB7CiAgICAgIGlmICghdGhpcy5faGFzVmFsdWVGcm9tWEZBIHx8IHRoaXMuYXBwZWFyYW5jZSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmdldEJvcmRlckFuZEJhY2tncm91bmRBcHBlYXJhbmNlcyhhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlOwogICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGAvVHggQk1DIHEgJHtjb2xvcnN9USBFTUNgOwogICAgICB9CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAxKSB7CiAgICAgIHZhbHVlID0gdmFsdWVbMF07CiAgICB9CiAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiwgIkV4cGVjdGVkIGB2YWx1ZWAgdG8gYmUgYSBzdHJpbmcuIik7CiAgICB2YWx1ZSA9IHZhbHVlLnRyaW1FbmQoKTsKICAgIGlmICh0aGlzLmRhdGEuY29tYm8pIHsKICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5kYXRhLm9wdGlvbnMuZmluZCgoewogICAgICAgIGV4cG9ydFZhbHVlCiAgICAgIH0pID0+IHZhbHVlID09PSBleHBvcnRWYWx1ZSk7CiAgICAgIHZhbHVlID0gb3B0aW9uPy5kaXNwbGF5VmFsdWUgfHwgdmFsdWU7CiAgICB9CiAgICBpZiAodmFsdWUgPT09ICIiKSB7CiAgICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfVEgRU1DYDsKICAgIH0KICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgIH0KICAgIGxldCBsaW5lQ291bnQgPSAtMTsKICAgIGxldCBsaW5lczsKICAgIGlmICh0aGlzLmRhdGEubXVsdGlMaW5lKSB7CiAgICAgIGxpbmVzID0gdmFsdWUuc3BsaXQoL1xyXG4/fFxuLykubWFwKGxpbmUgPT4gbGluZS5ub3JtYWxpemUoIk5GQyIpKTsKICAgICAgbGluZUNvdW50ID0gbGluZXMubGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgbGluZXMgPSBbdmFsdWUucmVwbGFjZSgvXHJcbj98XG4vLCAiIikubm9ybWFsaXplKCJORkMiKV07CiAgICB9CiAgICBjb25zdCBkZWZhdWx0UGFkZGluZyA9IDE7CiAgICBjb25zdCBkZWZhdWx0SFBhZGRpbmcgPSAyOwogICAgbGV0IHsKICAgICAgd2lkdGg6IHRvdGFsV2lkdGgsCiAgICAgIGhlaWdodDogdG90YWxIZWlnaHQKICAgIH0gPSB0aGlzOwogICAgaWYgKHJvdGF0aW9uID09PSA5MCB8fCByb3RhdGlvbiA9PT0gMjcwKSB7CiAgICAgIFt0b3RhbFdpZHRoLCB0b3RhbEhlaWdodF0gPSBbdG90YWxIZWlnaHQsIHRvdGFsV2lkdGhdOwogICAgfQogICAgaWYgKCF0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSkgewogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhID0gcGFyc2VEZWZhdWx0QXBwZWFyYW5jZSh0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9ICIvSGVsdmV0aWNhIDAgVGYgMCBnIik7CiAgICB9CiAgICBsZXQgZm9udCA9IGF3YWl0IFdpZGdldEFubm90YXRpb24uX2dldEZvbnREYXRhKGV2YWx1YXRvciwgdGFzaywgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSwgdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzKTsKICAgIGxldCBkZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemUsIGxpbmVIZWlnaHQ7CiAgICBjb25zdCBlbmNvZGVkTGluZXMgPSBbXTsKICAgIGxldCBlbmNvZGluZ0Vycm9yID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHsKICAgICAgY29uc3QgZW5jb2RlZFN0cmluZyA9IGZvbnQuZW5jb2RlU3RyaW5nKGxpbmUpOwogICAgICBpZiAoZW5jb2RlZFN0cmluZy5sZW5ndGggPiAxKSB7CiAgICAgICAgZW5jb2RpbmdFcnJvciA9IHRydWU7CiAgICAgIH0KICAgICAgZW5jb2RlZExpbmVzLnB1c2goZW5jb2RlZFN0cmluZy5qb2luKCIiKSk7CiAgICB9CiAgICBpZiAoZW5jb2RpbmdFcnJvciAmJiBpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlNBVkUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBuZWVkQXBwZWFyYW5jZXM6IHRydWUKICAgICAgfTsKICAgIH0KICAgIGlmIChlbmNvZGluZ0Vycm9yICYmIHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmRhdGEuY29tYiA/ICJtb25vc3BhY2UiIDogInNhbnMtc2VyaWYiOwogICAgICBjb25zdCBmYWtlVW5pY29kZUZvbnQgPSBuZXcgRmFrZVVuaWNvZGVGb250KGV2YWx1YXRvci54cmVmLCBmb250RmFtaWx5KTsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gZmFrZVVuaWNvZGVGb250LmNyZWF0ZUZvbnRSZXNvdXJjZXMobGluZXMuam9pbigiIikpOwogICAgICBjb25zdCBuZXdGb250ID0gcmVzb3VyY2VzLmdldFJhdygiRm9udCIpOwogICAgICBpZiAodGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzLmhhcygiRm9udCIpKSB7CiAgICAgICAgY29uc3Qgb2xkRm9udCA9IHRoaXMuX2ZpZWxkUmVzb3VyY2VzLm1lcmdlZFJlc291cmNlcy5nZXQoIkZvbnQiKTsKICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBuZXdGb250LmdldEtleXMoKSkgewogICAgICAgICAgb2xkRm9udC5zZXQoa2V5LCBuZXdGb250LmdldFJhdyhrZXkpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzLnNldCgiRm9udCIsIG5ld0ZvbnQpOwogICAgICB9CiAgICAgIGNvbnN0IGZvbnROYW1lID0gZmFrZVVuaWNvZGVGb250LmZvbnROYW1lLm5hbWU7CiAgICAgIGZvbnQgPSBhd2FpdCBXaWRnZXRBbm5vdGF0aW9uLl9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIHsKICAgICAgICBmb250TmFtZSwKICAgICAgICBmb250U2l6ZTogMAogICAgICB9LCByZXNvdXJjZXMpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBlbmNvZGVkTGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGVuY29kZWRMaW5lc1tpXSA9IHN0cmluZ1RvVVRGMTZTdHJpbmcobGluZXNbaV0pOwogICAgICB9CiAgICAgIGNvbnN0IHNhdmVkRGVmYXVsdEFwcGVhcmFuY2UgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEpOwogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLmZvbnRTaXplID0gMDsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250TmFtZSA9IGZvbnROYW1lOwogICAgICBbZGVmYXVsdEFwcGVhcmFuY2UsIGZvbnRTaXplLCBsaW5lSGVpZ2h0XSA9IHRoaXMuX2NvbXB1dGVGb250U2l6ZSh0b3RhbEhlaWdodCAtIDIgKiBkZWZhdWx0UGFkZGluZywgdG90YWxXaWR0aCAtIDIgKiBkZWZhdWx0SFBhZGRpbmcsIHZhbHVlLCBmb250LCBsaW5lQ291bnQpOwogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhID0gc2F2ZWREZWZhdWx0QXBwZWFyYW5jZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghdGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHsKICAgICAgICB3YXJuKCJfZ2V0QXBwZWFyYW5jZTogT2Zmc2NyZWVuQ2FudmFzIGlzIG5vdCBzdXBwb3J0ZWQsIGFubm90YXRpb24gbWF5IG5vdCByZW5kZXIgY29ycmVjdGx5LiIpOwogICAgICB9CiAgICAgIFtkZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemUsIGxpbmVIZWlnaHRdID0gdGhpcy5fY29tcHV0ZUZvbnRTaXplKHRvdGFsSGVpZ2h0IC0gMiAqIGRlZmF1bHRQYWRkaW5nLCB0b3RhbFdpZHRoIC0gMiAqIGRlZmF1bHRIUGFkZGluZywgdmFsdWUsIGZvbnQsIGxpbmVDb3VudCk7CiAgICB9CiAgICBsZXQgZGVzY2VudCA9IGZvbnQuZGVzY2VudDsKICAgIGlmIChpc05hTihkZXNjZW50KSkgewogICAgICBkZXNjZW50ID0gQkFTRUxJTkVfRkFDVE9SICogbGluZUhlaWdodDsKICAgIH0gZWxzZSB7CiAgICAgIGRlc2NlbnQgPSBNYXRoLm1heChCQVNFTElORV9GQUNUT1IgKiBsaW5lSGVpZ2h0LCBNYXRoLmFicyhkZXNjZW50KSAqIGZvbnRTaXplKTsKICAgIH0KICAgIGNvbnN0IGRlZmF1bHRWUGFkZGluZyA9IE1hdGgubWluKE1hdGguZmxvb3IoKHRvdGFsSGVpZ2h0IC0gZm9udFNpemUpIC8gMiksIGRlZmF1bHRQYWRkaW5nKTsKICAgIGNvbnN0IGFsaWdubWVudCA9IHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50OwogICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHsKICAgICAgcmV0dXJuIHRoaXMuX2dldE11bHRpbGluZUFwcGVhcmFuY2UoZGVmYXVsdEFwcGVhcmFuY2UsIGVuY29kZWRMaW5lcywgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIHRvdGFsSGVpZ2h0LCBhbGlnbm1lbnQsIGRlZmF1bHRIUGFkZGluZywgZGVmYXVsdFZQYWRkaW5nLCBkZXNjZW50LCBsaW5lSGVpZ2h0LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBpZiAodGhpcy5kYXRhLmNvbWIpIHsKICAgICAgcmV0dXJuIHRoaXMuX2dldENvbWJBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCBmb250LCBlbmNvZGVkTGluZXNbMF0sIGZvbnRTaXplLCB0b3RhbFdpZHRoLCB0b3RhbEhlaWdodCwgZGVmYXVsdEhQYWRkaW5nLCBkZWZhdWx0VlBhZGRpbmcsIGRlc2NlbnQsIGxpbmVIZWlnaHQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIH0KICAgIGNvbnN0IGJvdHRvbVBhZGRpbmcgPSBkZWZhdWx0VlBhZGRpbmcgKyBkZXNjZW50OwogICAgaWYgKGFsaWdubWVudCA9PT0gMCB8fCBhbGlnbm1lbnQgPiAyKSB7CiAgICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfUJUIGAgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAke251bWJlclRvU3RyaW5nKGRlZmF1bHRIUGFkZGluZyl9ICR7bnVtYmVyVG9TdHJpbmcoYm90dG9tUGFkZGluZyl9IFRtICgke2VzY2FwZVN0cmluZyhlbmNvZGVkTGluZXNbMF0pfSkgVGpgICsgIiBFVCBRIEVNQyI7CiAgICB9CiAgICBjb25zdCBwcmV2SW5mbyA9IHsKICAgICAgc2hpZnQ6IDAKICAgIH07CiAgICBjb25zdCByZW5kZXJlZFRleHQgPSB0aGlzLl9yZW5kZXJUZXh0KGVuY29kZWRMaW5lc1swXSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIGFsaWdubWVudCwgcHJldkluZm8sIGRlZmF1bHRIUGFkZGluZywgYm90dG9tUGFkZGluZyk7CiAgICByZXR1cm4gYC9UeCBCTUMgcSAke2NvbG9yc31CVCBgICsgZGVmYXVsdEFwcGVhcmFuY2UgKyBgIDEgMCAwIDEgMCAwIFRtICR7cmVuZGVyZWRUZXh0fWAgKyAiIEVUIFEgRU1DIjsKICB9CiAgc3RhdGljIGFzeW5jIF9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIGFwcGVhcmFuY2VEYXRhLCByZXNvdXJjZXMpIHsKICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoKTsKICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHsKICAgICAgZm9udDogbnVsbCwKICAgICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCB7CiAgICAgIGZvbnROYW1lLAogICAgICBmb250U2l6ZQogICAgfSA9IGFwcGVhcmFuY2VEYXRhOwogICAgYXdhaXQgZXZhbHVhdG9yLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBbZm9udE5hbWUgJiYgTmFtZS5nZXQoZm9udE5hbWUpLCBmb250U2l6ZV0sIG51bGwsIG9wZXJhdG9yTGlzdCwgdGFzaywgaW5pdGlhbFN0YXRlLCBudWxsKTsKICAgIHJldHVybiBpbml0aWFsU3RhdGUuZm9udDsKICB9CiAgX2dldFRleHRXaWR0aCh0ZXh0LCBmb250KSB7CiAgICByZXR1cm4gTWF0aC5zdW1QcmVjaXNlKGZvbnQuY2hhcnNUb0dseXBocyh0ZXh0KS5tYXAoZyA9PiBnLndpZHRoKSkgLyAxMDAwOwogIH0KICBfY29tcHV0ZUZvbnRTaXplKGhlaWdodCwgd2lkdGgsIHRleHQsIGZvbnQsIGxpbmVDb3VudCkgewogICAgbGV0IHsKICAgICAgZm9udFNpemUKICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhOwogICAgbGV0IGxpbmVIZWlnaHQgPSAoZm9udFNpemUgfHwgMTIpICogTElORV9GQUNUT1IsCiAgICAgIG51bWJlck9mTGluZXMgPSBNYXRoLnJvdW5kKGhlaWdodCAvIGxpbmVIZWlnaHQpOwogICAgaWYgKCFmb250U2l6ZSkgewogICAgICBjb25zdCByb3VuZFdpdGhUd29EaWdpdHMgPSB4ID0+IE1hdGguZmxvb3IoeCAqIDEwMCkgLyAxMDA7CiAgICAgIGlmIChsaW5lQ291bnQgPT09IC0xKSB7CiAgICAgICAgY29uc3QgdGV4dFdpZHRoID0gdGhpcy5fZ2V0VGV4dFdpZHRoKHRleHQsIGZvbnQpOwogICAgICAgIGZvbnRTaXplID0gcm91bmRXaXRoVHdvRGlnaXRzKE1hdGgubWluKGhlaWdodCAvIExJTkVfRkFDVE9SLCB3aWR0aCAvIHRleHRXaWR0aCkpOwogICAgICAgIG51bWJlck9mTGluZXMgPSAxOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgvXHJcbj98XG4vKTsKICAgICAgICBjb25zdCBjYWNoZWRMaW5lcyA9IFtdOwogICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykgewogICAgICAgICAgY29uc3QgZW5jb2RlZCA9IGZvbnQuZW5jb2RlU3RyaW5nKGxpbmUpLmpvaW4oIiIpOwogICAgICAgICAgY29uc3QgZ2x5cGhzID0gZm9udC5jaGFyc1RvR2x5cGhzKGVuY29kZWQpOwogICAgICAgICAgY29uc3QgcG9zaXRpb25zID0gZm9udC5nZXRDaGFyUG9zaXRpb25zKGVuY29kZWQpOwogICAgICAgICAgY2FjaGVkTGluZXMucHVzaCh7CiAgICAgICAgICAgIGxpbmU6IGVuY29kZWQsCiAgICAgICAgICAgIGdseXBocywKICAgICAgICAgICAgcG9zaXRpb25zCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaXNUb29CaWcgPSBmc2l6ZSA9PiB7CiAgICAgICAgICBsZXQgdG90YWxIZWlnaHQgPSAwOwogICAgICAgICAgZm9yIChjb25zdCBjYWNoZSBvZiBjYWNoZWRMaW5lcykgewogICAgICAgICAgICBjb25zdCBjaHVua3MgPSB0aGlzLl9zcGxpdExpbmUobnVsbCwgZm9udCwgZnNpemUsIHdpZHRoLCBjYWNoZSk7CiAgICAgICAgICAgIHRvdGFsSGVpZ2h0ICs9IGNodW5rcy5sZW5ndGggKiBmc2l6ZTsKICAgICAgICAgICAgaWYgKHRvdGFsSGVpZ2h0ID4gaGVpZ2h0KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9OwogICAgICAgIG51bWJlck9mTGluZXMgPSBNYXRoLm1heChudW1iZXJPZkxpbmVzLCBsaW5lQ291bnQpOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICBsaW5lSGVpZ2h0ID0gaGVpZ2h0IC8gbnVtYmVyT2ZMaW5lczsKICAgICAgICAgIGZvbnRTaXplID0gcm91bmRXaXRoVHdvRGlnaXRzKGxpbmVIZWlnaHQgLyBMSU5FX0ZBQ1RPUik7CiAgICAgICAgICBpZiAoaXNUb29CaWcoZm9udFNpemUpKSB7CiAgICAgICAgICAgIG51bWJlck9mTGluZXMrKzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgewogICAgICAgIGZvbnROYW1lLAogICAgICAgIGZvbnRDb2xvcgogICAgICB9ID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YTsKICAgICAgdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UgPSBjcmVhdGVEZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgZm9udFNpemUsCiAgICAgICAgZm9udE5hbWUsCiAgICAgICAgZm9udENvbG9yCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIFt0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemUsIGhlaWdodCAvIG51bWJlck9mTGluZXNdOwogIH0KICBfcmVuZGVyVGV4dCh0ZXh0LCBmb250LCBmb250U2l6ZSwgdG90YWxXaWR0aCwgYWxpZ25tZW50LCBwcmV2SW5mbywgaFBhZGRpbmcsIHZQYWRkaW5nKSB7CiAgICBsZXQgc2hpZnQ7CiAgICBpZiAoYWxpZ25tZW50ID09PSAxKSB7CiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fZ2V0VGV4dFdpZHRoKHRleHQsIGZvbnQpICogZm9udFNpemU7CiAgICAgIHNoaWZ0ID0gKHRvdGFsV2lkdGggLSB3aWR0aCkgLyAyOwogICAgfSBlbHNlIGlmIChhbGlnbm1lbnQgPT09IDIpIHsKICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLl9nZXRUZXh0V2lkdGgodGV4dCwgZm9udCkgKiBmb250U2l6ZTsKICAgICAgc2hpZnQgPSB0b3RhbFdpZHRoIC0gd2lkdGggLSBoUGFkZGluZzsKICAgIH0gZWxzZSB7CiAgICAgIHNoaWZ0ID0gaFBhZGRpbmc7CiAgICB9CiAgICBjb25zdCBzaGlmdFN0ciA9IG51bWJlclRvU3RyaW5nKHNoaWZ0IC0gcHJldkluZm8uc2hpZnQpOwogICAgcHJldkluZm8uc2hpZnQgPSBzaGlmdDsKICAgIHZQYWRkaW5nID0gbnVtYmVyVG9TdHJpbmcodlBhZGRpbmcpOwogICAgcmV0dXJuIGAke3NoaWZ0U3RyfSAke3ZQYWRkaW5nfSBUZCAoJHtlc2NhcGVTdHJpbmcodGV4dCl9KSBUamA7CiAgfQogIF9nZXRTYXZlRmllbGRSZXNvdXJjZXMoeHJlZikgewogICAgY29uc3QgewogICAgICBsb2NhbFJlc291cmNlcywKICAgICAgYXBwZWFyYW5jZVJlc291cmNlcywKICAgICAgYWNyb0Zvcm1SZXNvdXJjZXMKICAgIH0gPSB0aGlzLl9maWVsZFJlc291cmNlczsKICAgIGNvbnN0IGZvbnROYW1lID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YT8uZm9udE5hbWU7CiAgICBpZiAoIWZvbnROYW1lKSB7CiAgICAgIHJldHVybiBsb2NhbFJlc291cmNlcyB8fCBEaWN0LmVtcHR5OwogICAgfQogICAgZm9yIChjb25zdCByZXNvdXJjZXMgb2YgW2xvY2FsUmVzb3VyY2VzLCBhcHBlYXJhbmNlUmVzb3VyY2VzXSkgewogICAgICBpZiAocmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGNvbnN0IGxvY2FsRm9udCA9IHJlc291cmNlcy5nZXQoIkZvbnQiKTsKICAgICAgICBpZiAobG9jYWxGb250IGluc3RhbmNlb2YgRGljdCAmJiBsb2NhbEZvbnQuaGFzKGZvbnROYW1lKSkgewogICAgICAgICAgcmV0dXJuIHJlc291cmNlczsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChhY3JvRm9ybVJlc291cmNlcyBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3QgYWNyb0Zvcm1Gb250ID0gYWNyb0Zvcm1SZXNvdXJjZXMuZ2V0KCJGb250Iik7CiAgICAgIGlmIChhY3JvRm9ybUZvbnQgaW5zdGFuY2VvZiBEaWN0ICYmIGFjcm9Gb3JtRm9udC5oYXMoZm9udE5hbWUpKSB7CiAgICAgICAgY29uc3Qgc3ViRm9udERpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgICAgICBzdWJGb250RGljdC5zZXQoZm9udE5hbWUsIGFjcm9Gb3JtRm9udC5nZXRSYXcoZm9udE5hbWUpKTsKICAgICAgICBjb25zdCBzdWJSZXNvdXJjZXNEaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICAgICAgc3ViUmVzb3VyY2VzRGljdC5zZXQoIkZvbnQiLCBzdWJGb250RGljdCk7CiAgICAgICAgcmV0dXJuIERpY3QubWVyZ2UoewogICAgICAgICAgeHJlZiwKICAgICAgICAgIGRpY3RBcnJheTogW3N1YlJlc291cmNlc0RpY3QsIGxvY2FsUmVzb3VyY2VzXSwKICAgICAgICAgIG1lcmdlU3ViRGljdHM6IHRydWUKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGxvY2FsUmVzb3VyY2VzIHx8IERpY3QuZW1wdHk7CiAgfQogIGdldEZpZWxkT2JqZWN0KCkgewogICAgcmV0dXJuIG51bGw7CiAgfQp9CmNsYXNzIFRleHRXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0CiAgICB9ID0gcGFyYW1zOwogICAgaWYgKGRpY3QuaGFzKCJQTUQiKSkgewogICAgICB0aGlzLmZsYWdzIHw9IEFubm90YXRpb25GbGFnLkhJRERFTjsKICAgICAgdGhpcy5kYXRhLmhpZGRlbiA9IHRydWU7CiAgICAgIHdhcm4oIkJhcmNvZGVzIGFyZSBub3Qgc3VwcG9ydGVkIik7CiAgICB9CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLnJlYWRPbmx5ICYmICF0aGlzLmRhdGEubm9IVE1MOwogICAgdGhpcy5faGFzVGV4dCA9IHRydWU7CiAgICBpZiAodHlwZW9mIHRoaXMuZGF0YS5maWVsZFZhbHVlICE9PSAic3RyaW5nIikgewogICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9ICIiOwogICAgfQogICAgbGV0IGFsaWdubWVudCA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICBkaWN0LAogICAgICBrZXk6ICJRIgogICAgfSk7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYWxpZ25tZW50KSB8fCBhbGlnbm1lbnQgPCAwIHx8IGFsaWdubWVudCA+IDIpIHsKICAgICAgYWxpZ25tZW50ID0gbnVsbDsKICAgIH0KICAgIHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50ID0gYWxpZ25tZW50OwogICAgbGV0IG1heGltdW1MZW5ndGggPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiTWF4TGVuIgogICAgfSk7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4aW11bUxlbmd0aCkgfHwgbWF4aW11bUxlbmd0aCA8IDApIHsKICAgICAgbWF4aW11bUxlbmd0aCA9IDA7CiAgICB9CiAgICB0aGlzLmRhdGEubWF4TGVuID0gbWF4aW11bUxlbmd0aDsKICAgIHRoaXMuZGF0YS5tdWx0aUxpbmUgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJTElORSk7CiAgICB0aGlzLmRhdGEuY29tYiA9IHRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuQ09NQikgJiYgIXRoaXMuZGF0YS5tdWx0aUxpbmUgJiYgIXRoaXMuZGF0YS5wYXNzd29yZCAmJiAhdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5GSUxFU0VMRUNUKSAmJiB0aGlzLmRhdGEubWF4TGVuICE9PSAwOwogICAgdGhpcy5kYXRhLmRvTm90U2Nyb2xsID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5ET05PVFNDUk9MTCk7CiAgfQogIGdldCBoYXNUZXh0Q29udGVudCgpIHsKICAgIHJldHVybiAhIXRoaXMuYXBwZWFyYW5jZSAmJiAhdGhpcy5fbmVlZEFwcGVhcmFuY2VzOwogIH0KICBfZ2V0Q29tYkFwcGVhcmFuY2UoZGVmYXVsdEFwcGVhcmFuY2UsIGZvbnQsIHRleHQsIGZvbnRTaXplLCB3aWR0aCwgaGVpZ2h0LCBoUGFkZGluZywgdlBhZGRpbmcsIGRlc2NlbnQsIGxpbmVIZWlnaHQsIGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBjb25zdCBjb21iV2lkdGggPSB3aWR0aCAvIHRoaXMuZGF0YS5tYXhMZW47CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmdldEJvcmRlckFuZEJhY2tncm91bmRBcHBlYXJhbmNlcyhhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICBjb25zdCBidWYgPSBbXTsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IGZvbnQuZ2V0Q2hhclBvc2l0aW9ucyh0ZXh0KTsKICAgIGZvciAoY29uc3QgW3N0YXJ0LCBlbmRdIG9mIHBvc2l0aW9ucykgewogICAgICBidWYucHVzaChgKCR7ZXNjYXBlU3RyaW5nKHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKX0pIFRqYCk7CiAgICB9CiAgICBjb25zdCByZW5kZXJlZENvbWIgPSBidWYuam9pbihgICR7bnVtYmVyVG9TdHJpbmcoY29tYldpZHRoKX0gMCBUZCBgKTsKICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfUJUIGAgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAke251bWJlclRvU3RyaW5nKGhQYWRkaW5nKX0gJHtudW1iZXJUb1N0cmluZyh2UGFkZGluZyArIGRlc2NlbnQpfSBUbSAke3JlbmRlcmVkQ29tYn1gICsgIiBFVCBRIEVNQyI7CiAgfQogIF9nZXRNdWx0aWxpbmVBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCBsaW5lcywgZm9udCwgZm9udFNpemUsIHdpZHRoLCBoZWlnaHQsIGFsaWdubWVudCwgaFBhZGRpbmcsIHZQYWRkaW5nLCBkZXNjZW50LCBsaW5lSGVpZ2h0LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgY29uc3QgYnVmID0gW107CiAgICBjb25zdCB0b3RhbFdpZHRoID0gd2lkdGggLSAyICogaFBhZGRpbmc7CiAgICBjb25zdCBwcmV2SW5mbyA9IHsKICAgICAgc2hpZnQ6IDAKICAgIH07CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgY29uc3QgY2h1bmtzID0gdGhpcy5fc3BsaXRMaW5lKGxpbmUsIGZvbnQsIGZvbnRTaXplLCB0b3RhbFdpZHRoKTsKICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gY2h1bmtzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICBjb25zdCBjaHVuayA9IGNodW5rc1tqXTsKICAgICAgICBjb25zdCB2U2hpZnQgPSBpID09PSAwICYmIGogPT09IDAgPyAtdlBhZGRpbmcgLSAobGluZUhlaWdodCAtIGRlc2NlbnQpIDogLWxpbmVIZWlnaHQ7CiAgICAgICAgYnVmLnB1c2godGhpcy5fcmVuZGVyVGV4dChjaHVuaywgZm9udCwgZm9udFNpemUsIHdpZHRoLCBhbGlnbm1lbnQsIHByZXZJbmZvLCBoUGFkZGluZywgdlNoaWZ0KSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGFubm90YXRpb25TdG9yYWdlKTsKICAgIGNvbnN0IHJlbmRlcmVkVGV4dCA9IGJ1Zi5qb2luKCJcbiIpOwogICAgcmV0dXJuIGAvVHggQk1DIHEgJHtjb2xvcnN9QlQgYCArIGRlZmF1bHRBcHBlYXJhbmNlICsgYCAxIDAgMCAxIDAgJHtudW1iZXJUb1N0cmluZyhoZWlnaHQpfSBUbSAke3JlbmRlcmVkVGV4dH1gICsgIiBFVCBRIEVNQyI7CiAgfQogIF9zcGxpdExpbmUobGluZSwgZm9udCwgZm9udFNpemUsIHdpZHRoLCBjYWNoZSA9IHt9KSB7CiAgICBsaW5lID0gY2FjaGUubGluZSB8fCBsaW5lOwogICAgY29uc3QgZ2x5cGhzID0gY2FjaGUuZ2x5cGhzIHx8IGZvbnQuY2hhcnNUb0dseXBocyhsaW5lKTsKICAgIGlmIChnbHlwaHMubGVuZ3RoIDw9IDEpIHsKICAgICAgcmV0dXJuIFtsaW5lXTsKICAgIH0KICAgIGNvbnN0IHBvc2l0aW9ucyA9IGNhY2hlLnBvc2l0aW9ucyB8fCBmb250LmdldENoYXJQb3NpdGlvbnMobGluZSk7CiAgICBjb25zdCBzY2FsZSA9IGZvbnRTaXplIC8gMTAwMDsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgbGV0IGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSAtMSwKICAgICAgbGFzdFNwYWNlUG9zSW5TdHJpbmdFbmQgPSAtMSwKICAgICAgbGFzdFNwYWNlUG9zID0gLTEsCiAgICAgIHN0YXJ0Q2h1bmsgPSAwLAogICAgICBjdXJyZW50V2lkdGggPSAwOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gcG9zaXRpb25zW2ldOwogICAgICBjb25zdCBnbHlwaCA9IGdseXBoc1tpXTsKICAgICAgY29uc3QgZ2x5cGhXaWR0aCA9IGdseXBoLndpZHRoICogc2NhbGU7CiAgICAgIGlmIChnbHlwaC51bmljb2RlID09PSAiICIpIHsKICAgICAgICBpZiAoY3VycmVudFdpZHRoICsgZ2x5cGhXaWR0aCA+IHdpZHRoKSB7CiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBzdGFydCkpOwogICAgICAgICAgc3RhcnRDaHVuayA9IHN0YXJ0OwogICAgICAgICAgY3VycmVudFdpZHRoID0gZ2x5cGhXaWR0aDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSAtMTsKICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IC0xOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50V2lkdGggKz0gZ2x5cGhXaWR0aDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSBzdGFydDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nRW5kID0gZW5kOwogICAgICAgICAgbGFzdFNwYWNlUG9zID0gaTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFdpZHRoICsgZ2x5cGhXaWR0aCA+IHdpZHRoKSB7CiAgICAgICAgaWYgKGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgIT09IC0xKSB7CiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBsYXN0U3BhY2VQb3NJblN0cmluZ0VuZCkpOwogICAgICAgICAgc3RhcnRDaHVuayA9IGxhc3RTcGFjZVBvc0luU3RyaW5nRW5kOwogICAgICAgICAgaSA9IGxhc3RTcGFjZVBvcyArIDE7CiAgICAgICAgICBsYXN0U3BhY2VQb3NJblN0cmluZ1N0YXJ0ID0gLTE7CiAgICAgICAgICBjdXJyZW50V2lkdGggPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBzdGFydCkpOwogICAgICAgICAgc3RhcnRDaHVuayA9IHN0YXJ0OwogICAgICAgICAgY3VycmVudFdpZHRoID0gZ2x5cGhXaWR0aDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFdpZHRoICs9IGdseXBoV2lkdGg7CiAgICAgIH0KICAgIH0KICAgIGlmIChzdGFydENodW5rIDwgbGluZS5sZW5ndGgpIHsKICAgICAgY2h1bmtzLnB1c2gobGluZS5zdWJzdHJpbmcoc3RhcnRDaHVuaywgbGluZS5sZW5ndGgpKTsKICAgIH0KICAgIHJldHVybiBjaHVua3M7CiAgfQogIGFzeW5jIGV4dHJhY3RUZXh0Q29udGVudChldmFsdWF0b3IsIHRhc2ssIHZpZXdCb3gpIHsKICAgIGF3YWl0IHN1cGVyLmV4dHJhY3RUZXh0Q29udGVudChldmFsdWF0b3IsIHRhc2ssIHZpZXdCb3gpOwogICAgY29uc3QgdGV4dCA9IHRoaXMuZGF0YS50ZXh0Q29udGVudDsKICAgIGlmICghdGV4dCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBhbGxUZXh0ID0gdGV4dC5qb2luKCJcbiIpOwogICAgaWYgKGFsbFRleHQgPT09IHRoaXMuZGF0YS5maWVsZFZhbHVlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHJlZ2V4ID0gYWxsVGV4dC5yZXBsYWNlQWxsKC8oWy4qKz9eJHt9KCl8W1xdXFxdKXwoXHMrKS9nLCAoX20sIHAxKSA9PiBwMSA/IGBcXCR7cDF9YCA6ICJcXHMrIik7CiAgICBpZiAobmV3IFJlZ0V4cChgXlxccyoke3JlZ2V4fVxccyokYCkudGVzdCh0aGlzLmRhdGEuZmllbGRWYWx1ZSkpIHsKICAgICAgdGhpcy5kYXRhLnRleHRDb250ZW50ID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUuc3BsaXQoIlxuIik7CiAgICB9CiAgfQogIGdldEZpZWxkT2JqZWN0KCkgewogICAgcmV0dXJuIHsKICAgICAgaWQ6IHRoaXMuZGF0YS5pZCwKICAgICAgdmFsdWU6IHRoaXMuZGF0YS5maWVsZFZhbHVlLAogICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSB8fCAiIiwKICAgICAgbXVsdGlsaW5lOiB0aGlzLmRhdGEubXVsdGlMaW5lLAogICAgICBwYXNzd29yZDogdGhpcy5kYXRhLnBhc3N3b3JkLAogICAgICBjaGFyTGltaXQ6IHRoaXMuZGF0YS5tYXhMZW4sCiAgICAgIGNvbWI6IHRoaXMuZGF0YS5jb21iLAogICAgICBlZGl0YWJsZTogIXRoaXMuZGF0YS5yZWFkT25seSwKICAgICAgaGlkZGVuOiB0aGlzLmRhdGEuaGlkZGVuLAogICAgICBuYW1lOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICByZWN0OiB0aGlzLmRhdGEucmVjdCwKICAgICAgYWN0aW9uczogdGhpcy5kYXRhLmFjdGlvbnMsCiAgICAgIHBhZ2U6IHRoaXMuZGF0YS5wYWdlSW5kZXgsCiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLmRhdGEuYm9yZGVyQ29sb3IsCiAgICAgIGZpbGxDb2xvcjogdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciwKICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sCiAgICAgIHR5cGU6ICJ0ZXh0IgogICAgfTsKICB9Cn0KY2xhc3MgQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBudWxsOwogICAgdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlID0gbnVsbDsKICAgIGNvbnN0IGlzUmFkaW8gPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlJBRElPKSwKICAgICAgaXNQdXNoQnV0dG9uID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5QVVNIQlVUVE9OKTsKICAgIHRoaXMuZGF0YS5jaGVja0JveCA9ICFpc1JhZGlvICYmICFpc1B1c2hCdXR0b247CiAgICB0aGlzLmRhdGEucmFkaW9CdXR0b24gPSBpc1JhZGlvICYmICFpc1B1c2hCdXR0b247CiAgICB0aGlzLmRhdGEucHVzaEJ1dHRvbiA9IGlzUHVzaEJ1dHRvbjsKICAgIHRoaXMuZGF0YS5pc1Rvb2x0aXBPbmx5ID0gZmFsc2U7CiAgICBpZiAodGhpcy5kYXRhLmNoZWNrQm94KSB7CiAgICAgIHRoaXMuX3Byb2Nlc3NDaGVja0JveChwYXJhbXMpOwogICAgfSBlbHNlIGlmICh0aGlzLmRhdGEucmFkaW9CdXR0b24pIHsKICAgICAgdGhpcy5fcHJvY2Vzc1JhZGlvQnV0dG9uKHBhcmFtcyk7CiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5wdXNoQnV0dG9uKSB7CiAgICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0cnVlOwogICAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICAgIHRoaXMuX3Byb2Nlc3NQdXNoQnV0dG9uKHBhcmFtcyk7CiAgICB9IGVsc2UgewogICAgICB3YXJuKCJJbnZhbGlkIGZpZWxkIGZsYWdzIGZvciBidXR0b24gd2lkZ2V0IGFubm90YXRpb24iKTsKICAgIH0KICB9CiAgYXN5bmMgZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgaWYgKHRoaXMuZGF0YS5wdXNoQnV0dG9uKSB7CiAgICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGZhbHNlLCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBsZXQgdmFsdWUgPSBudWxsOwogICAgbGV0IHJvdGF0aW9uID0gbnVsbDsKICAgIGlmIChhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZS5nZXQodGhpcy5kYXRhLmlkKTsKICAgICAgdmFsdWUgPSBzdG9yYWdlRW50cnkgPyBzdG9yYWdlRW50cnkudmFsdWUgOiBudWxsOwogICAgICByb3RhdGlvbiA9IHN0b3JhZ2VFbnRyeSA/IHN0b3JhZ2VFbnRyeS5yb3RhdGlvbiA6IG51bGw7CiAgICB9CiAgICBpZiAodmFsdWUgPT09IG51bGwgJiYgdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIH0KICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5kYXRhLmNoZWNrQm94ID8gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5leHBvcnRWYWx1ZSA6IHRoaXMuZGF0YS5maWVsZFZhbHVlID09PSB0aGlzLmRhdGEuYnV0dG9uVmFsdWU7CiAgICB9CiAgICBjb25zdCBhcHBlYXJhbmNlID0gdmFsdWUgPyB0aGlzLmNoZWNrZWRBcHBlYXJhbmNlIDogdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlOwogICAgaWYgKGFwcGVhcmFuY2UpIHsKICAgICAgY29uc3Qgc2F2ZWRBcHBlYXJhbmNlID0gdGhpcy5hcHBlYXJhbmNlOwogICAgICBjb25zdCBzYXZlZE1hdHJpeCA9IGxvb2t1cE1hdHJpeChhcHBlYXJhbmNlLmRpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpLCBJREVOVElUWV9NQVRSSVgpOwogICAgICBpZiAocm90YXRpb24pIHsKICAgICAgICBhcHBlYXJhbmNlLmRpY3Quc2V0KCJNYXRyaXgiLCB0aGlzLmdldFJvdGF0aW9uTWF0cml4KGFubm90YXRpb25TdG9yYWdlKSk7CiAgICAgIH0KICAgICAgdGhpcy5hcHBlYXJhbmNlID0gYXBwZWFyYW5jZTsKICAgICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IHNhdmVkQXBwZWFyYW5jZTsKICAgICAgYXBwZWFyYW5jZS5kaWN0LnNldCgiTWF0cml4Iiwgc2F2ZWRNYXRyaXgpOwogICAgICByZXR1cm4gb3BlcmF0b3JMaXN0OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgb3BMaXN0OiBuZXcgT3BlcmF0b3JMaXN0KCksCiAgICAgIHNlcGFyYXRlRm9ybTogZmFsc2UsCiAgICAgIHNlcGFyYXRlQ2FudmFzOiBmYWxzZQogICAgfTsKICB9CiAgYXN5bmMgc2F2ZShldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlLCBjaGFuZ2VzKSB7CiAgICBpZiAodGhpcy5kYXRhLmNoZWNrQm94KSB7CiAgICAgIHRoaXMuX3NhdmVDaGVja2JveChldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlLCBjaGFuZ2VzKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuZGF0YS5yYWRpb0J1dHRvbikgewogICAgICB0aGlzLl9zYXZlUmFkaW9CdXR0b24oZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcyk7CiAgICB9CiAgfQogIGFzeW5jIF9zYXZlQ2hlY2tib3goZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykgewogICAgaWYgKCFhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZS5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGNvbnN0IGZsYWdzID0gdGhpcy5fYnVpbGRGbGFncyhzdG9yYWdlRW50cnk/Lm5vVmlldywgc3RvcmFnZUVudHJ5Py5ub1ByaW50KTsKICAgIGxldCByb3RhdGlvbiA9IHN0b3JhZ2VFbnRyeT8ucm90YXRpb24sCiAgICAgIHZhbHVlID0gc3RvcmFnZUVudHJ5Py52YWx1ZTsKICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkICYmIGZsYWdzID09PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5leHBvcnRWYWx1ZTsKICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdmFsdWUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGxldCBkaWN0ID0gZXZhbHVhdG9yLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZGljdCA9IGRpY3QuY2xvbmUoKTsKICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgIH0KICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5leHBvcnRWYWx1ZTsKICAgIH0KICAgIGNvbnN0IHhmYSA9IHsKICAgICAgcGF0aDogdGhpcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgdmFsdWU6IHZhbHVlID8gdGhpcy5kYXRhLmV4cG9ydFZhbHVlIDogIiIKICAgIH07CiAgICBjb25zdCBuYW1lID0gTmFtZS5nZXQodmFsdWUgPyB0aGlzLmRhdGEuZXhwb3J0VmFsdWUgOiAiT2ZmIik7CiAgICB0aGlzLnNldFZhbHVlKGRpY3QsIG5hbWUsIGV2YWx1YXRvci54cmVmLCBjaGFuZ2VzKTsKICAgIGRpY3Quc2V0KCJBUyIsIG5hbWUpOwogICAgZGljdC5zZXQoIk0iLCBgRDoke2dldE1vZGlmaWNhdGlvbkRhdGUoKX1gKTsKICAgIGlmIChmbGFncyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGRpY3Quc2V0KCJGIiwgZmxhZ3MpOwogICAgfQogICAgY29uc3QgbWF5YmVNSyA9IHRoaXMuX2dldE1LRGljdChyb3RhdGlvbik7CiAgICBpZiAobWF5YmVNSykgewogICAgICBkaWN0LnNldCgiTUsiLCBtYXliZU1LKTsKICAgIH0KICAgIGNoYW5nZXMucHV0KHRoaXMucmVmLCB7CiAgICAgIGRhdGE6IGRpY3QsCiAgICAgIHhmYSwKICAgICAgbmVlZEFwcGVhcmFuY2VzOiBmYWxzZQogICAgfSk7CiAgfQogIGFzeW5jIF9zYXZlUmFkaW9CdXR0b24oZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykgewogICAgaWYgKCFhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZS5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGNvbnN0IGZsYWdzID0gdGhpcy5fYnVpbGRGbGFncyhzdG9yYWdlRW50cnk/Lm5vVmlldywgc3RvcmFnZUVudHJ5Py5ub1ByaW50KTsKICAgIGxldCByb3RhdGlvbiA9IHN0b3JhZ2VFbnRyeT8ucm90YXRpb24sCiAgICAgIHZhbHVlID0gc3RvcmFnZUVudHJ5Py52YWx1ZTsKICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkICYmIGZsYWdzID09PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5idXR0b25WYWx1ZTsKICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdmFsdWUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGxldCBkaWN0ID0gZXZhbHVhdG9yLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZGljdCA9IGRpY3QuY2xvbmUoKTsKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5idXR0b25WYWx1ZTsKICAgIH0KICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgIH0KICAgIGNvbnN0IHhmYSA9IHsKICAgICAgcGF0aDogdGhpcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgdmFsdWU6IHZhbHVlID8gdGhpcy5kYXRhLmJ1dHRvblZhbHVlIDogIiIKICAgIH07CiAgICBjb25zdCBuYW1lID0gTmFtZS5nZXQodmFsdWUgPyB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgOiAiT2ZmIik7CiAgICBpZiAodmFsdWUpIHsKICAgICAgdGhpcy5zZXRWYWx1ZShkaWN0LCBuYW1lLCBldmFsdWF0b3IueHJlZiwgY2hhbmdlcyk7CiAgICB9CiAgICBkaWN0LnNldCgiQVMiLCBuYW1lKTsKICAgIGRpY3Quc2V0KCJNIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICBpZiAoZmxhZ3MgIT09IHVuZGVmaW5lZCkgewogICAgICBkaWN0LnNldCgiRiIsIGZsYWdzKTsKICAgIH0KICAgIGNvbnN0IG1heWJlTUsgPSB0aGlzLl9nZXRNS0RpY3Qocm90YXRpb24pOwogICAgaWYgKG1heWJlTUspIHsKICAgICAgZGljdC5zZXQoIk1LIiwgbWF5YmVNSyk7CiAgICB9CiAgICBjaGFuZ2VzLnB1dCh0aGlzLnJlZiwgewogICAgICBkYXRhOiBkaWN0LAogICAgICB4ZmEsCiAgICAgIG5lZWRBcHBlYXJhbmNlczogZmFsc2UKICAgIH0pOwogIH0KICBfZ2V0RGVmYXVsdENoZWNrZWRBcHBlYXJhbmNlKHBhcmFtcywgdHlwZSkgewogICAgY29uc3QgewogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0CiAgICB9ID0gdGhpczsKICAgIGNvbnN0IGJib3ggPSBbMCwgMCwgd2lkdGgsIGhlaWdodF07CiAgICBjb25zdCBGT05UX1JBVElPID0gMC44OwogICAgY29uc3QgZm9udFNpemUgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAqIEZPTlRfUkFUSU87CiAgICBsZXQgbWV0cmljcywgY2hhcjsKICAgIGlmICh0eXBlID09PSAiY2hlY2siKSB7CiAgICAgIG1ldHJpY3MgPSB7CiAgICAgICAgd2lkdGg6IDAuNzU1ICogZm9udFNpemUsCiAgICAgICAgaGVpZ2h0OiAwLjcwNSAqIGZvbnRTaXplCiAgICAgIH07CiAgICAgIGNoYXIgPSAiXHgzMyI7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJkaXNjIikgewogICAgICBtZXRyaWNzID0gewogICAgICAgIHdpZHRoOiAwLjc5MSAqIGZvbnRTaXplLAogICAgICAgIGhlaWdodDogMC43MDUgKiBmb250U2l6ZQogICAgICB9OwogICAgICBjaGFyID0gIlx4NkMiOwogICAgfSBlbHNlIHsKICAgICAgdW5yZWFjaGFibGUoYF9nZXREZWZhdWx0Q2hlY2tlZEFwcGVhcmFuY2UgLSB1bnN1cHBvcnRlZCB0eXBlOiAke3R5cGV9YCk7CiAgICB9CiAgICBjb25zdCB4U2hpZnQgPSBudW1iZXJUb1N0cmluZygod2lkdGggLSBtZXRyaWNzLndpZHRoKSAvIDIpOwogICAgY29uc3QgeVNoaWZ0ID0gbnVtYmVyVG9TdHJpbmcoKGhlaWdodCAtIG1ldHJpY3MuaGVpZ2h0KSAvIDIpOwogICAgY29uc3QgYXBwZWFyYW5jZSA9IGBxIEJUIC9QZGZKc1phRGIgJHtmb250U2l6ZX0gVGYgMCBnICR7eFNoaWZ0fSAke3lTaGlmdH0gVGQgKCR7Y2hhcn0pIFRqIEVUIFFgOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdChwYXJhbXMueHJlZik7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkZvcm1UeXBlIiwgMSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRm9ybSIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYT2JqZWN0IikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJCQm94IiwgYmJveCk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIk1hdHJpeCIsIFsxLCAwLCAwLCAxLCAwLCAwXSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBEaWN0KHBhcmFtcy54cmVmKTsKICAgIGNvbnN0IGZvbnQgPSBuZXcgRGljdChwYXJhbXMueHJlZik7CiAgICBmb250LnNldCgiUGRmSnNaYURiIiwgdGhpcy5mYWxsYmFja0ZvbnREaWN0KTsKICAgIHJlc291cmNlcy5zZXQoIkZvbnQiLCBmb250KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBuZXcgU3RyaW5nU3RyZWFtKGFwcGVhcmFuY2UpOwogICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZS5kaWN0ID0gYXBwZWFyYW5jZVN0cmVhbURpY3Q7CiAgICB0aGlzLl9zdHJlYW1zLnB1c2godGhpcy5jaGVja2VkQXBwZWFyYW5jZSk7CiAgfQogIF9wcm9jZXNzQ2hlY2tCb3gocGFyYW1zKSB7CiAgICBjb25zdCBjdXN0b21BcHBlYXJhbmNlID0gcGFyYW1zLmRpY3QuZ2V0KCJBUCIpOwogICAgaWYgKCEoY3VzdG9tQXBwZWFyYW5jZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2UgPSBjdXN0b21BcHBlYXJhbmNlLmdldCgiTiIpOwogICAgaWYgKCEobm9ybWFsQXBwZWFyYW5jZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFzVmFsdWUgPSB0aGlzLl9kZWNvZGVGb3JtVmFsdWUocGFyYW1zLmRpY3QuZ2V0KCJBUyIpKTsKICAgIGlmICh0eXBlb2YgYXNWYWx1ZSA9PT0gInN0cmluZyIpIHsKICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSBhc1ZhbHVlOwogICAgfQogICAgY29uc3QgeWVzID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgIT09IG51bGwgJiYgdGhpcy5kYXRhLmZpZWxkVmFsdWUgIT09ICJPZmYiID8gdGhpcy5kYXRhLmZpZWxkVmFsdWUgOiAiWWVzIjsKICAgIGNvbnN0IGV4cG9ydFZhbHVlcyA9IG5vcm1hbEFwcGVhcmFuY2UuZ2V0S2V5cygpOwogICAgaWYgKGV4cG9ydFZhbHVlcy5sZW5ndGggPT09IDApIHsKICAgICAgZXhwb3J0VmFsdWVzLnB1c2goIk9mZiIsIHllcyk7CiAgICB9IGVsc2UgaWYgKGV4cG9ydFZhbHVlcy5sZW5ndGggPT09IDEpIHsKICAgICAgaWYgKGV4cG9ydFZhbHVlc1swXSA9PT0gIk9mZiIpIHsKICAgICAgICBleHBvcnRWYWx1ZXMucHVzaCh5ZXMpOwogICAgICB9IGVsc2UgewogICAgICAgIGV4cG9ydFZhbHVlcy51bnNoaWZ0KCJPZmYiKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChleHBvcnRWYWx1ZXMuaW5jbHVkZXMoeWVzKSkgewogICAgICBleHBvcnRWYWx1ZXMubGVuZ3RoID0gMDsKICAgICAgZXhwb3J0VmFsdWVzLnB1c2goIk9mZiIsIHllcyk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBvdGhlclllcyA9IGV4cG9ydFZhbHVlcy5maW5kKHYgPT4gdiAhPT0gIk9mZiIpOwogICAgICBleHBvcnRWYWx1ZXMubGVuZ3RoID0gMDsKICAgICAgZXhwb3J0VmFsdWVzLnB1c2goIk9mZiIsIG90aGVyWWVzKTsKICAgIH0KICAgIGlmICghZXhwb3J0VmFsdWVzLmluY2x1ZGVzKHRoaXMuZGF0YS5maWVsZFZhbHVlKSkgewogICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9ICJPZmYiOwogICAgfQogICAgdGhpcy5kYXRhLmV4cG9ydFZhbHVlID0gZXhwb3J0VmFsdWVzWzFdOwogICAgY29uc3QgY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCh0aGlzLmRhdGEuZXhwb3J0VmFsdWUpOwogICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA9IGNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSA/IGNoZWNrZWRBcHBlYXJhbmNlIDogbnVsbDsKICAgIGNvbnN0IHVuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCgiT2ZmIik7CiAgICB0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UgPSB1bmNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSA/IHVuY2hlY2tlZEFwcGVhcmFuY2UgOiBudWxsOwogICAgaWYgKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpIHsKICAgICAgdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5fZ2V0RGVmYXVsdENoZWNrZWRBcHBlYXJhbmNlKHBhcmFtcywgImNoZWNrIik7CiAgICB9CiAgICBpZiAodGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlKSB7CiAgICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UpOwogICAgfQogICAgdGhpcy5fZmFsbGJhY2tGb250RGljdCA9IHRoaXMuZmFsbGJhY2tGb250RGljdDsKICAgIGlmICh0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgPT09IG51bGwpIHsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlID0gIk9mZiI7CiAgICB9CiAgfQogIF9wcm9jZXNzUmFkaW9CdXR0b24ocGFyYW1zKSB7CiAgICB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgPSBudWxsOwogICAgY29uc3QgZmllbGRQYXJlbnQgPSBwYXJhbXMuZGljdC5nZXQoIlBhcmVudCIpOwogICAgaWYgKGZpZWxkUGFyZW50IGluc3RhbmNlb2YgRGljdCkgewogICAgICB0aGlzLnBhcmVudCA9IHBhcmFtcy5kaWN0LmdldFJhdygiUGFyZW50Iik7CiAgICAgIGNvbnN0IGZpZWxkUGFyZW50VmFsdWUgPSBmaWVsZFBhcmVudC5nZXQoIlYiKTsKICAgICAgaWYgKGZpZWxkUGFyZW50VmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoZmllbGRQYXJlbnRWYWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGFwcGVhcmFuY2VTdGF0ZXMgPSBwYXJhbXMuZGljdC5nZXQoIkFQIik7CiAgICBpZiAoIShhcHBlYXJhbmNlU3RhdGVzIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZSA9IGFwcGVhcmFuY2VTdGF0ZXMuZ2V0KCJOIik7CiAgICBpZiAoIShub3JtYWxBcHBlYXJhbmNlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBrZXkgb2Ygbm9ybWFsQXBwZWFyYW5jZS5nZXRLZXlzKCkpIHsKICAgICAgaWYgKGtleSAhPT0gIk9mZiIpIHsKICAgICAgICB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgPSB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoa2V5KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgY29uc3QgY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCh0aGlzLmRhdGEuYnV0dG9uVmFsdWUpOwogICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA9IGNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSA/IGNoZWNrZWRBcHBlYXJhbmNlIDogbnVsbDsKICAgIGNvbnN0IHVuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCgiT2ZmIik7CiAgICB0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UgPSB1bmNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSA/IHVuY2hlY2tlZEFwcGVhcmFuY2UgOiBudWxsOwogICAgaWYgKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpIHsKICAgICAgdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5fZ2V0RGVmYXVsdENoZWNrZWRBcHBlYXJhbmNlKHBhcmFtcywgImRpc2MiKTsKICAgIH0KICAgIGlmICh0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UpIHsKICAgICAgdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSk7CiAgICB9CiAgICB0aGlzLl9mYWxsYmFja0ZvbnREaWN0ID0gdGhpcy5mYWxsYmFja0ZvbnREaWN0OwogICAgaWYgKHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSA9PT0gbnVsbCkgewogICAgICB0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgPSAiT2ZmIjsKICAgIH0KICB9CiAgX3Byb2Nlc3NQdXNoQnV0dG9uKHBhcmFtcykgewogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICBhbm5vdGF0aW9uR2xvYmFscwogICAgfSA9IHBhcmFtczsKICAgIGlmICghZGljdC5oYXMoIkEiKSAmJiAhZGljdC5oYXMoIkFBIikgJiYgIXRoaXMuZGF0YS5hbHRlcm5hdGl2ZVRleHQpIHsKICAgICAgd2FybigiUHVzaCBidXR0b25zIHdpdGhvdXQgYWN0aW9uIGRpY3Rpb25hcmllcyBhcmUgbm90IHN1cHBvcnRlZCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmRhdGEuaXNUb29sdGlwT25seSA9ICFkaWN0LmhhcygiQSIpICYmICFkaWN0LmhhcygiQUEiKTsKICAgIENhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7CiAgICAgIGRlc3REaWN0OiBkaWN0LAogICAgICByZXN1bHRPYmo6IHRoaXMuZGF0YSwKICAgICAgZG9jQmFzZVVybDogYW5ub3RhdGlvbkdsb2JhbHMuYmFzZVVybCwKICAgICAgZG9jQXR0YWNobWVudHM6IGFubm90YXRpb25HbG9iYWxzLmF0dGFjaG1lbnRzCiAgICB9KTsKICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICBsZXQgdHlwZSA9ICJidXR0b24iOwogICAgbGV0IGV4cG9ydFZhbHVlczsKICAgIGlmICh0aGlzLmRhdGEuY2hlY2tCb3gpIHsKICAgICAgdHlwZSA9ICJjaGVja2JveCI7CiAgICAgIGV4cG9ydFZhbHVlcyA9IHRoaXMuZGF0YS5leHBvcnRWYWx1ZTsKICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLnJhZGlvQnV0dG9uKSB7CiAgICAgIHR5cGUgPSAicmFkaW9idXR0b24iOwogICAgICBleHBvcnRWYWx1ZXMgPSB0aGlzLmRhdGEuYnV0dG9uVmFsdWU7CiAgICB9CiAgICByZXR1cm4gewogICAgICBpZDogdGhpcy5kYXRhLmlkLAogICAgICB2YWx1ZTogdGhpcy5kYXRhLmZpZWxkVmFsdWUgfHwgIk9mZiIsCiAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlLAogICAgICBleHBvcnRWYWx1ZXMsCiAgICAgIGVkaXRhYmxlOiAhdGhpcy5kYXRhLnJlYWRPbmx5LAogICAgICBuYW1lOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICByZWN0OiB0aGlzLmRhdGEucmVjdCwKICAgICAgaGlkZGVuOiB0aGlzLmRhdGEuaGlkZGVuLAogICAgICBhY3Rpb25zOiB0aGlzLmRhdGEuYWN0aW9ucywKICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuZGF0YS5ib3JkZXJDb2xvciwKICAgICAgZmlsbENvbG9yOiB0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yLAogICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbiwKICAgICAgdHlwZQogICAgfTsKICB9CiAgZ2V0IGZhbGxiYWNrRm9udERpY3QoKSB7CiAgICBjb25zdCBkaWN0ID0gbmV3IERpY3QoKTsKICAgIGRpY3Quc2V0KCJCYXNlRm9udCIsIE5hbWUuZ2V0KCJaYXBmRGluZ2JhdHMiKSk7CiAgICBkaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGYWxsYmFja1R5cGUiKSk7CiAgICBkaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGYWxsYmFja1R5cGUiKSk7CiAgICBkaWN0LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiWmFwZkRpbmdiYXRzRW5jb2RpbmciKSk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmYWxsYmFja0ZvbnREaWN0IiwgZGljdCk7CiAgfQp9CmNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb24gZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmluZGljZXMgPSBkaWN0LmdldEFycmF5KCJJIik7CiAgICB0aGlzLmhhc0luZGljZXMgPSBBcnJheS5pc0FycmF5KHRoaXMuaW5kaWNlcykgJiYgdGhpcy5pbmRpY2VzLmxlbmd0aCA+IDA7CiAgICB0aGlzLmRhdGEub3B0aW9ucyA9IFtdOwogICAgY29uc3Qgb3B0aW9ucyA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICBkaWN0LAogICAgICBrZXk6ICJPcHQiCiAgICB9KTsKICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMpKSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG9wdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IG9wdGlvbiA9IHhyZWYuZmV0Y2hJZlJlZihvcHRpb25zW2ldKTsKICAgICAgICBjb25zdCBpc09wdGlvbkFycmF5ID0gQXJyYXkuaXNBcnJheShvcHRpb24pOwogICAgICAgIHRoaXMuZGF0YS5vcHRpb25zW2ldID0gewogICAgICAgICAgZXhwb3J0VmFsdWU6IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShpc09wdGlvbkFycmF5ID8geHJlZi5mZXRjaElmUmVmKG9wdGlvblswXSkgOiBvcHRpb24pLAogICAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoaXNPcHRpb25BcnJheSA/IHhyZWYuZmV0Y2hJZlJlZihvcHRpb25bMV0pIDogb3B0aW9uKQogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGlmICghdGhpcy5oYXNJbmRpY2VzKSB7CiAgICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSBbdGhpcy5kYXRhLmZpZWxkVmFsdWVdOwogICAgICB9IGVsc2UgaWYgKCF0aGlzLmRhdGEuZmllbGRWYWx1ZSkgewogICAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gW107CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gW107CiAgICAgIGNvbnN0IGlpID0gdGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoOwogICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5pbmRpY2VzKSB7CiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaSkgJiYgaSA+PSAwICYmIGkgPCBpaSkgewogICAgICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUucHVzaCh0aGlzLmRhdGEub3B0aW9uc1tpXS5leHBvcnRWYWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoID09PSAwICYmIHRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCA+IDApIHsKICAgICAgdGhpcy5kYXRhLm9wdGlvbnMgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZS5tYXAodmFsdWUgPT4gKHsKICAgICAgICBleHBvcnRWYWx1ZTogdmFsdWUsCiAgICAgICAgZGlzcGxheVZhbHVlOiB2YWx1ZQogICAgICB9KSk7CiAgICB9CiAgICB0aGlzLmRhdGEuY29tYm8gPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLkNPTUJPKTsKICAgIHRoaXMuZGF0YS5tdWx0aVNlbGVjdCA9IHRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuTVVMVElTRUxFQ1QpOwogICAgdGhpcy5faGFzVGV4dCA9IHRydWU7CiAgfQogIGdldEZpZWxkT2JqZWN0KCkgewogICAgY29uc3QgdHlwZSA9IHRoaXMuZGF0YS5jb21ibyA/ICJjb21ib2JveCIgOiAibGlzdGJveCI7CiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCA+IDAgPyB0aGlzLmRhdGEuZmllbGRWYWx1ZVswXSA6IG51bGw7CiAgICByZXR1cm4gewogICAgICBpZDogdGhpcy5kYXRhLmlkLAogICAgICB2YWx1ZSwKICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUsCiAgICAgIGVkaXRhYmxlOiAhdGhpcy5kYXRhLnJlYWRPbmx5LAogICAgICBuYW1lOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICByZWN0OiB0aGlzLmRhdGEucmVjdCwKICAgICAgbnVtSXRlbXM6IHRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCwKICAgICAgbXVsdGlwbGVTZWxlY3Rpb246IHRoaXMuZGF0YS5tdWx0aVNlbGVjdCwKICAgICAgaGlkZGVuOiB0aGlzLmRhdGEuaGlkZGVuLAogICAgICBhY3Rpb25zOiB0aGlzLmRhdGEuYWN0aW9ucywKICAgICAgaXRlbXM6IHRoaXMuZGF0YS5vcHRpb25zLAogICAgICBwYWdlOiB0aGlzLmRhdGEucGFnZUluZGV4LAogICAgICBzdHJva2VDb2xvcjogdGhpcy5kYXRhLmJvcmRlckNvbG9yLAogICAgICBmaWxsQ29sb3I6IHRoaXMuZGF0YS5iYWNrZ3JvdW5kQ29sb3IsCiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLAogICAgICB0eXBlCiAgICB9OwogIH0KICBhbWVuZFNhdmVkRGljdChhbm5vdGF0aW9uU3RvcmFnZSwgZGljdCkgewogICAgaWYgKCF0aGlzLmhhc0luZGljZXMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IHZhbHVlcyA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8udmFsdWU7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkgewogICAgICB2YWx1ZXMgPSBbdmFsdWVzXTsKICAgIH0KICAgIGNvbnN0IGluZGljZXMgPSBbXTsKICAgIGNvbnN0IHsKICAgICAgb3B0aW9ucwogICAgfSA9IHRoaXMuZGF0YTsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSBvcHRpb25zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgaWYgKG9wdGlvbnNbaV0uZXhwb3J0VmFsdWUgPT09IHZhbHVlc1tqXSkgewogICAgICAgIGluZGljZXMucHVzaChpKTsKICAgICAgICBqICs9IDE7CiAgICAgIH0KICAgIH0KICAgIGRpY3Quc2V0KCJJIiwgaW5kaWNlcyk7CiAgfQogIGFzeW5jIF9nZXRBcHBlYXJhbmNlKGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgaWYgKHRoaXMuZGF0YS5jb21ibykgewogICAgICByZXR1cm4gc3VwZXIuX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIH0KICAgIGxldCBleHBvcnRlZFZhbHVlLCByb3RhdGlvbjsKICAgIGNvbnN0IHN0b3JhZ2VFbnRyeSA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGlmIChzdG9yYWdlRW50cnkpIHsKICAgICAgcm90YXRpb24gPSBzdG9yYWdlRW50cnkucm90YXRpb247CiAgICAgIGV4cG9ydGVkVmFsdWUgPSBzdG9yYWdlRW50cnkudmFsdWU7CiAgICB9CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCAmJiBleHBvcnRlZFZhbHVlID09PSB1bmRlZmluZWQgJiYgIXRoaXMuX25lZWRBcHBlYXJhbmNlcykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChleHBvcnRlZFZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgZXhwb3J0ZWRWYWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlOwogICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShleHBvcnRlZFZhbHVlKSkgewogICAgICBleHBvcnRlZFZhbHVlID0gW2V4cG9ydGVkVmFsdWVdOwogICAgfQogICAgY29uc3QgZGVmYXVsdFBhZGRpbmcgPSAxOwogICAgY29uc3QgZGVmYXVsdEhQYWRkaW5nID0gMjsKICAgIGxldCB7CiAgICAgIHdpZHRoOiB0b3RhbFdpZHRoLAogICAgICBoZWlnaHQ6IHRvdGFsSGVpZ2h0CiAgICB9ID0gdGhpczsKICAgIGlmIChyb3RhdGlvbiA9PT0gOTAgfHwgcm90YXRpb24gPT09IDI3MCkgewogICAgICBbdG90YWxXaWR0aCwgdG90YWxIZWlnaHRdID0gW3RvdGFsSGVpZ2h0LCB0b3RhbFdpZHRoXTsKICAgIH0KICAgIGNvbnN0IGxpbmVDb3VudCA9IHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aDsKICAgIGNvbnN0IHZhbHVlSW5kaWNlcyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykgewogICAgICBjb25zdCB7CiAgICAgICAgZXhwb3J0VmFsdWUKICAgICAgfSA9IHRoaXMuZGF0YS5vcHRpb25zW2ldOwogICAgICBpZiAoZXhwb3J0ZWRWYWx1ZS5pbmNsdWRlcyhleHBvcnRWYWx1ZSkpIHsKICAgICAgICB2YWx1ZUluZGljZXMucHVzaChpKTsKICAgICAgfQogICAgfQogICAgaWYgKCF0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSkgewogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhID0gcGFyc2VEZWZhdWx0QXBwZWFyYW5jZSh0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9ICIvSGVsdmV0aWNhIDAgVGYgMCBnIik7CiAgICB9CiAgICBjb25zdCBmb250ID0gYXdhaXQgV2lkZ2V0QW5ub3RhdGlvbi5fZ2V0Rm9udERhdGEoZXZhbHVhdG9yLCB0YXNrLCB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLCB0aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMpOwogICAgbGV0IGRlZmF1bHRBcHBlYXJhbmNlOwogICAgbGV0IHsKICAgICAgZm9udFNpemUKICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhOwogICAgaWYgKCFmb250U2l6ZSkgewogICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gKHRvdGFsSGVpZ2h0IC0gZGVmYXVsdFBhZGRpbmcpIC8gbGluZUNvdW50OwogICAgICBsZXQgbGluZVdpZHRoID0gLTE7CiAgICAgIGxldCB2YWx1ZTsKICAgICAgZm9yIChjb25zdCB7CiAgICAgICAgZGlzcGxheVZhbHVlCiAgICAgIH0gb2YgdGhpcy5kYXRhLm9wdGlvbnMpIHsKICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuX2dldFRleHRXaWR0aChkaXNwbGF5VmFsdWUsIGZvbnQpOwogICAgICAgIGlmICh3aWR0aCA+IGxpbmVXaWR0aCkgewogICAgICAgICAgbGluZVdpZHRoID0gd2lkdGg7CiAgICAgICAgICB2YWx1ZSA9IGRpc3BsYXlWYWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgW2RlZmF1bHRBcHBlYXJhbmNlLCBmb250U2l6ZV0gPSB0aGlzLl9jb21wdXRlRm9udFNpemUobGluZUhlaWdodCwgdG90YWxXaWR0aCAtIDIgKiBkZWZhdWx0SFBhZGRpbmcsIHZhbHVlLCBmb250LCAtMSk7CiAgICB9IGVsc2UgewogICAgICBkZWZhdWx0QXBwZWFyYW5jZSA9IHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlOwogICAgfQogICAgY29uc3QgbGluZUhlaWdodCA9IGZvbnRTaXplICogTElORV9GQUNUT1I7CiAgICBjb25zdCB2UGFkZGluZyA9IChsaW5lSGVpZ2h0IC0gZm9udFNpemUpIC8gMjsKICAgIGNvbnN0IG51bWJlck9mVmlzaWJsZUxpbmVzID0gTWF0aC5mbG9vcih0b3RhbEhlaWdodCAvIGxpbmVIZWlnaHQpOwogICAgbGV0IGZpcnN0SW5kZXggPSAwOwogICAgaWYgKHZhbHVlSW5kaWNlcy5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IG1pbkluZGV4ID0gTWF0aC5taW4oLi4udmFsdWVJbmRpY2VzKTsKICAgICAgY29uc3QgbWF4SW5kZXggPSBNYXRoLm1heCguLi52YWx1ZUluZGljZXMpOwogICAgICBmaXJzdEluZGV4ID0gTWF0aC5tYXgoMCwgbWF4SW5kZXggLSBudW1iZXJPZlZpc2libGVMaW5lcyArIDEpOwogICAgICBpZiAoZmlyc3RJbmRleCA+IG1pbkluZGV4KSB7CiAgICAgICAgZmlyc3RJbmRleCA9IG1pbkluZGV4OwogICAgICB9CiAgICB9CiAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihmaXJzdEluZGV4ICsgbnVtYmVyT2ZWaXNpYmxlTGluZXMgKyAxLCBsaW5lQ291bnQpOwogICAgY29uc3QgYnVmID0gWyIvVHggQk1DIHEiLCBgMSAxICR7dG90YWxXaWR0aH0gJHt0b3RhbEhlaWdodH0gcmUgVyBuYF07CiAgICBpZiAodmFsdWVJbmRpY2VzLmxlbmd0aCkgewogICAgICBidWYucHVzaCgiMC42MDAwMDYgMC43NTY4NjYgMC44NTQ5MDQgcmciKTsKICAgICAgZm9yIChjb25zdCBpbmRleCBvZiB2YWx1ZUluZGljZXMpIHsKICAgICAgICBpZiAoZmlyc3RJbmRleCA8PSBpbmRleCAmJiBpbmRleCA8IGVuZCkgewogICAgICAgICAgYnVmLnB1c2goYDEgJHt0b3RhbEhlaWdodCAtIChpbmRleCAtIGZpcnN0SW5kZXggKyAxKSAqIGxpbmVIZWlnaHR9ICR7dG90YWxXaWR0aH0gJHtsaW5lSGVpZ2h0fSByZSBmYCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBidWYucHVzaCgiQlQiLCBkZWZhdWx0QXBwZWFyYW5jZSwgYDEgMCAwIDEgMCAke3RvdGFsSGVpZ2h0fSBUbWApOwogICAgY29uc3QgcHJldkluZm8gPSB7CiAgICAgIHNoaWZ0OiAwCiAgICB9OwogICAgZm9yIChsZXQgaSA9IGZpcnN0SW5kZXg7IGkgPCBlbmQ7IGkrKykgewogICAgICBjb25zdCB7CiAgICAgICAgZGlzcGxheVZhbHVlCiAgICAgIH0gPSB0aGlzLmRhdGEub3B0aW9uc1tpXTsKICAgICAgY29uc3QgdnBhZGRpbmcgPSBpID09PSBmaXJzdEluZGV4ID8gdlBhZGRpbmcgOiAwOwogICAgICBidWYucHVzaCh0aGlzLl9yZW5kZXJUZXh0KGRpc3BsYXlWYWx1ZSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIDAsIHByZXZJbmZvLCBkZWZhdWx0SFBhZGRpbmcsIC1saW5lSGVpZ2h0ICsgdnBhZGRpbmcpKTsKICAgIH0KICAgIGJ1Zi5wdXNoKCJFVCBRIEVNQyIpOwogICAgcmV0dXJuIGJ1Zi5qb2luKCJcbiIpOwogIH0KfQpjbGFzcyBTaWduYXR1cmVXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSBudWxsOwogICAgdGhpcy5kYXRhLmhhc093bkNhbnZhcyA9IHRoaXMuZGF0YS5ub1JvdGF0ZTsKICAgIHRoaXMuZGF0YS5ub0hUTUwgPSAhdGhpcy5kYXRhLmhhc093bkNhbnZhczsKICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICByZXR1cm4gewogICAgICBpZDogdGhpcy5kYXRhLmlkLAogICAgICB2YWx1ZTogbnVsbCwKICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgdHlwZTogInNpZ25hdHVyZSIKICAgIH07CiAgfQp9CmNsYXNzIFRleHRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBjb25zdCBERUZBVUxUX0lDT05fU0laRSA9IDIyOwogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5ub1JvdGF0ZSA9IHRydWU7CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLm5vUm90YXRlOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogICAgY29uc3QgewogICAgICBkaWN0CiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuVEVYVDsKICAgIGlmICh0aGlzLmRhdGEuaGFzQXBwZWFyYW5jZSkgewogICAgICB0aGlzLmRhdGEubmFtZSA9ICJOb0ljb24iOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLnJlY3RbMV0gPSB0aGlzLmRhdGEucmVjdFszXSAtIERFRkFVTFRfSUNPTl9TSVpFOwogICAgICB0aGlzLmRhdGEucmVjdFsyXSA9IHRoaXMuZGF0YS5yZWN0WzBdICsgREVGQVVMVF9JQ09OX1NJWkU7CiAgICAgIHRoaXMuZGF0YS5uYW1lID0gZGljdC5oYXMoIk5hbWUiKSA/IGRpY3QuZ2V0KCJOYW1lIikubmFtZSA6ICJOb3RlIjsKICAgIH0KICAgIGlmIChkaWN0LmhhcygiU3RhdGUiKSkgewogICAgICB0aGlzLmRhdGEuc3RhdGUgPSBkaWN0LmdldCgiU3RhdGUiKSB8fCBudWxsOwogICAgICB0aGlzLmRhdGEuc3RhdGVNb2RlbCA9IGRpY3QuZ2V0KCJTdGF0ZU1vZGVsIikgfHwgbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5zdGF0ZSA9IG51bGw7CiAgICAgIHRoaXMuZGF0YS5zdGF0ZU1vZGVsID0gbnVsbDsKICAgIH0KICB9Cn0KY2xhc3MgTGlua0Fubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIGFubm90YXRpb25HbG9iYWxzCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuTElOSzsKICAgIHRoaXMuZGF0YS5ub0hUTUwgPSBmYWxzZTsKICAgIGNvbnN0IHF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKGRpY3QsIHRoaXMucmVjdGFuZ2xlKTsKICAgIGlmIChxdWFkUG9pbnRzKSB7CiAgICAgIHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gcXVhZFBvaW50czsKICAgIH0KICAgIHRoaXMuZGF0YS5ib3JkZXJDb2xvciB8fD0gdGhpcy5kYXRhLmNvbG9yOwogICAgQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKICAgICAgZGVzdERpY3Q6IGRpY3QsCiAgICAgIHJlc3VsdE9iajogdGhpcy5kYXRhLAogICAgICBkb2NCYXNlVXJsOiBhbm5vdGF0aW9uR2xvYmFscy5iYXNlVXJsLAogICAgICBkb2NBdHRhY2htZW50czogYW5ub3RhdGlvbkdsb2JhbHMuYXR0YWNobWVudHMKICAgIH0pOwogIH0KfQpjbGFzcyBQb3B1cEFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5QT1BVUDsKICAgIHRoaXMuZGF0YS5ub0hUTUwgPSBmYWxzZTsKICAgIGlmICh0aGlzLndpZHRoID09PSAwIHx8IHRoaXMuaGVpZ2h0ID09PSAwKSB7CiAgICAgIHRoaXMuZGF0YS5yZWN0ID0gbnVsbDsKICAgIH0KICAgIGxldCBwYXJlbnRJdGVtID0gZGljdC5nZXQoIlBhcmVudCIpOwogICAgaWYgKCFwYXJlbnRJdGVtKSB7CiAgICAgIHdhcm4oIlBvcHVwIGFubm90YXRpb24gaGFzIGEgbWlzc2luZyBvciBpbnZhbGlkIHBhcmVudCBhbm5vdGF0aW9uLiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmRhdGEucGFyZW50UmVjdCA9IGxvb2t1cE5vcm1hbFJlY3QocGFyZW50SXRlbS5nZXRBcnJheSgiUmVjdCIpLCBudWxsKTsKICAgIGNvbnN0IHJ0ID0gcGFyZW50SXRlbS5nZXQoIlJUIik7CiAgICBpZiAoaXNOYW1lKHJ0LCBBbm5vdGF0aW9uUmVwbHlUeXBlLkdST1VQKSkgewogICAgICBwYXJlbnRJdGVtID0gcGFyZW50SXRlbS5nZXQoIklSVCIpOwogICAgfQogICAgaWYgKCFwYXJlbnRJdGVtLmhhcygiTSIpKSB7CiAgICAgIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShwYXJlbnRJdGVtLmdldCgiTSIpKTsKICAgICAgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSB0aGlzLm1vZGlmaWNhdGlvbkRhdGU7CiAgICB9CiAgICBpZiAoIXBhcmVudEl0ZW0uaGFzKCJDIikpIHsKICAgICAgdGhpcy5kYXRhLmNvbG9yID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuc2V0Q29sb3IocGFyZW50SXRlbS5nZXRBcnJheSgiQyIpKTsKICAgICAgdGhpcy5kYXRhLmNvbG9yID0gdGhpcy5jb2xvcjsKICAgIH0KICAgIGlmICghdGhpcy52aWV3YWJsZSkgewogICAgICBjb25zdCBwYXJlbnRGbGFncyA9IHBhcmVudEl0ZW0uZ2V0KCJGIik7CiAgICAgIGlmICh0aGlzLl9pc1ZpZXdhYmxlKHBhcmVudEZsYWdzKSkgewogICAgICAgIHRoaXMuc2V0RmxhZ3MocGFyZW50RmxhZ3MpOwogICAgICB9CiAgICB9CiAgICB0aGlzLnNldFRpdGxlKHBhcmVudEl0ZW0uZ2V0KCJUIikpOwogICAgdGhpcy5kYXRhLnRpdGxlT2JqID0gdGhpcy5fdGl0bGU7CiAgICB0aGlzLnNldENvbnRlbnRzKHBhcmVudEl0ZW0uZ2V0KCJDb250ZW50cyIpKTsKICAgIHRoaXMuZGF0YS5jb250ZW50c09iaiA9IHRoaXMuX2NvbnRlbnRzOwogICAgaWYgKHBhcmVudEl0ZW0uaGFzKCJSQyIpKSB7CiAgICAgIHRoaXMuZGF0YS5yaWNoVGV4dCA9IFhGQUZhY3RvcnkuZ2V0UmljaFRleHRBc0h0bWwocGFyZW50SXRlbS5nZXQoIlJDIikpOwogICAgfQogICAgdGhpcy5kYXRhLm9wZW4gPSAhIWRpY3QuZ2V0KCJPcGVuIik7CiAgfQp9CmNsYXNzIEZyZWVUZXh0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEuaXNFZGl0YWJsZSA9ICF0aGlzLmRhdGEubm9IVE1MOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogICAgY29uc3QgewogICAgICBhbm5vdGF0aW9uR2xvYmFscywKICAgICAgZXZhbHVhdG9yT3B0aW9ucywKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkZSRUVURVhUOwogICAgdGhpcy5zZXREZWZhdWx0QXBwZWFyYW5jZShwYXJhbXMpOwogICAgdGhpcy5faGFzQXBwZWFyYW5jZSA9ICEhdGhpcy5hcHBlYXJhbmNlOwogICAgaWYgKHRoaXMuX2hhc0FwcGVhcmFuY2UpIHsKICAgICAgY29uc3QgewogICAgICAgIGZvbnRDb2xvciwKICAgICAgICBmb250U2l6ZQogICAgICB9ID0gcGFyc2VBcHBlYXJhbmNlU3RyZWFtKHRoaXMuYXBwZWFyYW5jZSwgZXZhbHVhdG9yT3B0aW9ucywgeHJlZiwgYW5ub3RhdGlvbkdsb2JhbHMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlKTsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250Q29sb3IgPSBmb250Q29sb3I7CiAgICAgIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udFNpemUgPSBmb250U2l6ZSB8fCAxMDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udFNpemUgfHw9IDEwOwogICAgICBjb25zdCB7CiAgICAgICAgZm9udENvbG9yLAogICAgICAgIGZvbnRTaXplCiAgICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhOwogICAgICBpZiAodGhpcy5fY29udGVudHMuc3RyKSB7CiAgICAgICAgdGhpcy5kYXRhLnRleHRDb250ZW50ID0gdGhpcy5fY29udGVudHMuc3RyLnNwbGl0KC9cclxuP3xcbi8pLm1hcChsaW5lID0+IGxpbmUudHJpbUVuZCgpKTsKICAgICAgICBjb25zdCB7CiAgICAgICAgICBjb29yZHMsCiAgICAgICAgICBiYm94LAogICAgICAgICAgbWF0cml4CiAgICAgICAgfSA9IEZha2VVbmljb2RlRm9udC5nZXRGaXJzdFBvc2l0aW9uSW5mbyh0aGlzLnJlY3RhbmdsZSwgdGhpcy5yb3RhdGlvbiwgZm9udFNpemUpOwogICAgICAgIHRoaXMuZGF0YS50ZXh0UG9zaXRpb24gPSB0aGlzLl90cmFuc2Zvcm1Qb2ludChjb29yZHMsIGJib3gsIG1hdHJpeCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBwYXJhbXMuZGljdC5nZXQoIkNBIik7CiAgICAgICAgY29uc3QgZmFrZVVuaWNvZGVGb250ID0gbmV3IEZha2VVbmljb2RlRm9udCh4cmVmLCAic2Fucy1zZXJpZiIpOwogICAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IGZha2VVbmljb2RlRm9udC5jcmVhdGVBcHBlYXJhbmNlKHRoaXMuX2NvbnRlbnRzLnN0ciwgdGhpcy5yZWN0YW5nbGUsIHRoaXMucm90YXRpb24sIGZvbnRTaXplLCBmb250Q29sb3IsIHN0cm9rZUFscGhhKTsKICAgICAgICB0aGlzLl9zdHJlYW1zLnB1c2godGhpcy5hcHBlYXJhbmNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3YXJuKCJGcmVlVGV4dEFubm90YXRpb246IE9mZnNjcmVlbkNhbnZhcyBpcyBub3Qgc3VwcG9ydGVkLCBhbm5vdGF0aW9uIG1heSBub3QgcmVuZGVyIGNvcnJlY3RseS4iKTsKICAgICAgfQogICAgfQogIH0KICBnZXQgaGFzVGV4dENvbnRlbnQoKSB7CiAgICByZXR1cm4gdGhpcy5faGFzQXBwZWFyYW5jZTsKICB9CiAgc3RhdGljIGNyZWF0ZU5ld0RpY3QoYW5ub3RhdGlvbiwgeHJlZiwgewogICAgYXBSZWYsCiAgICBhcAogIH0pIHsKICAgIGNvbnN0IHsKICAgICAgY29sb3IsCiAgICAgIGZvbnRTaXplLAogICAgICBvbGRBbm5vdGF0aW9uLAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdXNlciwKICAgICAgdmFsdWUKICAgIH0gPSBhbm5vdGF0aW9uOwogICAgY29uc3QgZnJlZXRleHQgPSBvbGRBbm5vdGF0aW9uIHx8IG5ldyBEaWN0KHhyZWYpOwogICAgZnJlZXRleHQuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkFubm90IikpOwogICAgZnJlZXRleHQuc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZyZWVUZXh0IikpOwogICAgaWYgKG9sZEFubm90YXRpb24pIHsKICAgICAgZnJlZXRleHQuc2V0KCJNIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICAgIGZyZWV0ZXh0LmRlbGV0ZSgiUkMiKTsKICAgIH0gZWxzZSB7CiAgICAgIGZyZWV0ZXh0LnNldCgiQ3JlYXRpb25EYXRlIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICB9CiAgICBmcmVldGV4dC5zZXQoIlJlY3QiLCByZWN0KTsKICAgIGNvbnN0IGRhID0gYC9IZWx2ICR7Zm9udFNpemV9IFRmICR7Z2V0UGRmQ29sb3IoY29sb3IsIHRydWUpfWA7CiAgICBmcmVldGV4dC5zZXQoIkRBIiwgZGEpOwogICAgZnJlZXRleHQuc2V0KCJDb250ZW50cyIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUodmFsdWUpKTsKICAgIGZyZWV0ZXh0LnNldCgiRiIsIDQpOwogICAgZnJlZXRleHQuc2V0KCJCb3JkZXIiLCBbMCwgMCwgMF0pOwogICAgZnJlZXRleHQuc2V0KCJSb3RhdGUiLCByb3RhdGlvbik7CiAgICBpZiAodXNlcikgewogICAgICBmcmVldGV4dC5zZXQoIlQiLCBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKHVzZXIpKTsKICAgIH0KICAgIGlmIChhcFJlZiB8fCBhcCkgewogICAgICBjb25zdCBuID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGZyZWV0ZXh0LnNldCgiQVAiLCBuKTsKICAgICAgaWYgKGFwUmVmKSB7CiAgICAgICAgbi5zZXQoIk4iLCBhcFJlZik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbi5zZXQoIk4iLCBhcCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmcmVldGV4dDsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW0oYW5ub3RhdGlvbiwgeHJlZiwgcGFyYW1zKSB7CiAgICBjb25zdCB7CiAgICAgIGJhc2VGb250UmVmLAogICAgICBldmFsdWF0b3IsCiAgICAgIHRhc2sKICAgIH0gPSBwYXJhbXM7CiAgICBjb25zdCB7CiAgICAgIGNvbG9yLAogICAgICBmb250U2l6ZSwKICAgICAgcmVjdCwKICAgICAgcm90YXRpb24sCiAgICAgIHZhbHVlCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBEaWN0KHhyZWYpOwogICAgY29uc3QgZm9udCA9IG5ldyBEaWN0KHhyZWYpOwogICAgaWYgKGJhc2VGb250UmVmKSB7CiAgICAgIGZvbnQuc2V0KCJIZWx2IiwgYmFzZUZvbnRSZWYpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgYmFzZUZvbnQgPSBuZXcgRGljdCh4cmVmKTsKICAgICAgYmFzZUZvbnQuc2V0KCJCYXNlRm9udCIsIE5hbWUuZ2V0KCJIZWx2ZXRpY2EiKSk7CiAgICAgIGJhc2VGb250LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGb250IikpOwogICAgICBiYXNlRm9udC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiVHlwZTEiKSk7CiAgICAgIGJhc2VGb250LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiV2luQW5zaUVuY29kaW5nIikpOwogICAgICBmb250LnNldCgiSGVsdiIsIGJhc2VGb250KTsKICAgIH0KICAgIHJlc291cmNlcy5zZXQoIkZvbnQiLCBmb250KTsKICAgIGNvbnN0IGhlbHYgPSBhd2FpdCBXaWRnZXRBbm5vdGF0aW9uLl9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIHsKICAgICAgZm9udE5hbWU6ICJIZWx2IiwKICAgICAgZm9udFNpemUKICAgIH0sIHJlc291cmNlcyk7CiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gcmVjdDsKICAgIGxldCB3ID0geDIgLSB4MTsKICAgIGxldCBoID0geTIgLSB5MTsKICAgIGlmIChyb3RhdGlvbiAlIDE4MCAhPT0gMCkgewogICAgICBbdywgaF0gPSBbaCwgd107CiAgICB9CiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnNwbGl0KCJcbiIpOwogICAgY29uc3Qgc2NhbGUgPSBmb250U2l6ZSAvIDEwMDA7CiAgICBsZXQgdG90YWxXaWR0aCA9IC1JbmZpbml0eTsKICAgIGNvbnN0IGVuY29kZWRMaW5lcyA9IFtdOwogICAgZm9yIChsZXQgbGluZSBvZiBsaW5lcykgewogICAgICBjb25zdCBlbmNvZGVkID0gaGVsdi5lbmNvZGVTdHJpbmcobGluZSk7CiAgICAgIGlmIChlbmNvZGVkLmxlbmd0aCA+IDEpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBsaW5lID0gZW5jb2RlZC5qb2luKCIiKTsKICAgICAgZW5jb2RlZExpbmVzLnB1c2gobGluZSk7CiAgICAgIGxldCBsaW5lV2lkdGggPSAwOwogICAgICBjb25zdCBnbHlwaHMgPSBoZWx2LmNoYXJzVG9HbHlwaHMobGluZSk7CiAgICAgIGZvciAoY29uc3QgZ2x5cGggb2YgZ2x5cGhzKSB7CiAgICAgICAgbGluZVdpZHRoICs9IGdseXBoLndpZHRoICogc2NhbGU7CiAgICAgIH0KICAgICAgdG90YWxXaWR0aCA9IE1hdGgubWF4KHRvdGFsV2lkdGgsIGxpbmVXaWR0aCk7CiAgICB9CiAgICBsZXQgaHNjYWxlID0gMTsKICAgIGlmICh0b3RhbFdpZHRoID4gdykgewogICAgICBoc2NhbGUgPSB3IC8gdG90YWxXaWR0aDsKICAgIH0KICAgIGxldCB2c2NhbGUgPSAxOwogICAgY29uc3QgbGluZUhlaWdodCA9IExJTkVfRkFDVE9SICogZm9udFNpemU7CiAgICBjb25zdCBsaW5lQXNjZW50ID0gKExJTkVfRkFDVE9SIC0gTElORV9ERVNDRU5UX0ZBQ1RPUikgKiBmb250U2l6ZTsKICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gbGluZUhlaWdodCAqIGxpbmVzLmxlbmd0aDsKICAgIGlmICh0b3RhbEhlaWdodCA+IGgpIHsKICAgICAgdnNjYWxlID0gaCAvIHRvdGFsSGVpZ2h0OwogICAgfQogICAgY29uc3QgZnNjYWxlID0gTWF0aC5taW4oaHNjYWxlLCB2c2NhbGUpOwogICAgY29uc3QgbmV3Rm9udFNpemUgPSBmb250U2l6ZSAqIGZzY2FsZTsKICAgIGxldCBmaXJzdFBvaW50LCBjbGlwQm94LCBtYXRyaXg7CiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBtYXRyaXggPSBbMSwgMCwgMCwgMV07CiAgICAgICAgY2xpcEJveCA9IFtyZWN0WzBdLCByZWN0WzFdLCB3LCBoXTsKICAgICAgICBmaXJzdFBvaW50ID0gW3JlY3RbMF0sIHJlY3RbM10gLSBsaW5lQXNjZW50XTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA5MDoKICAgICAgICBtYXRyaXggPSBbMCwgMSwgLTEsIDBdOwogICAgICAgIGNsaXBCb3ggPSBbcmVjdFsxXSwgLXJlY3RbMl0sIHcsIGhdOwogICAgICAgIGZpcnN0UG9pbnQgPSBbcmVjdFsxXSwgLXJlY3RbMF0gLSBsaW5lQXNjZW50XTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAxODA6CiAgICAgICAgbWF0cml4ID0gWy0xLCAwLCAwLCAtMV07CiAgICAgICAgY2xpcEJveCA9IFstcmVjdFsyXSwgLXJlY3RbM10sIHcsIGhdOwogICAgICAgIGZpcnN0UG9pbnQgPSBbLXJlY3RbMl0sIC1yZWN0WzFdIC0gbGluZUFzY2VudF07CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjcwOgogICAgICAgIG1hdHJpeCA9IFswLCAtMSwgMSwgMF07CiAgICAgICAgY2xpcEJveCA9IFstcmVjdFszXSwgcmVjdFswXSwgdywgaF07CiAgICAgICAgZmlyc3RQb2ludCA9IFstcmVjdFszXSwgcmVjdFsyXSAtIGxpbmVBc2NlbnRdOwogICAgICAgIGJyZWFrOwogICAgfQogICAgY29uc3QgYnVmZmVyID0gWyJxIiwgYCR7bWF0cml4LmpvaW4oIiAiKX0gMCAwIGNtYCwgYCR7Y2xpcEJveC5qb2luKCIgIil9IHJlIFcgbmAsIGBCVGAsIGAke2dldFBkZkNvbG9yKGNvbG9yLCB0cnVlKX1gLCBgMCBUYyAvSGVsdiAke251bWJlclRvU3RyaW5nKG5ld0ZvbnRTaXplKX0gVGZgXTsKICAgIGJ1ZmZlci5wdXNoKGAke2ZpcnN0UG9pbnQuam9pbigiICIpfSBUZCAoJHtlc2NhcGVTdHJpbmcoZW5jb2RlZExpbmVzWzBdKX0pIFRqYCk7CiAgICBjb25zdCB2U2hpZnQgPSBudW1iZXJUb1N0cmluZyhsaW5lSGVpZ2h0KTsKICAgIGZvciAobGV0IGkgPSAxLCBpaSA9IGVuY29kZWRMaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGxpbmUgPSBlbmNvZGVkTGluZXNbaV07CiAgICAgIGJ1ZmZlci5wdXNoKGAwIC0ke3ZTaGlmdH0gVGQgKCR7ZXNjYXBlU3RyaW5nKGxpbmUpfSkgVGpgKTsKICAgIH0KICAgIGJ1ZmZlci5wdXNoKCJFVCIsICJRIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYnVmZmVyLmpvaW4oIlxuIik7CiAgICBjb25zdCBhcHBlYXJhbmNlU3RyZWFtRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJGb3JtVHlwZSIsIDEpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiWE9iamVjdCIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiQkJveCIsIHJlY3QpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJSZXNvdXJjZXMiLCByZXNvdXJjZXMpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJNYXRyaXgiLCBbMSwgMCwgMCwgMSwgLXJlY3RbMF0sIC1yZWN0WzFdXSk7CiAgICBjb25zdCBhcCA9IG5ldyBTdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICBhcC5kaWN0ID0gYXBwZWFyYW5jZVN0cmVhbURpY3Q7CiAgICByZXR1cm4gYXA7CiAgfQp9CmNsYXNzIExpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuTElORTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICBjb25zdCBsaW5lQ29vcmRpbmF0ZXMgPSBsb29rdXBSZWN0KGRpY3QuZ2V0QXJyYXkoIkwiKSwgWzAsIDAsIDAsIDBdKTsKICAgIHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXMgPSBVdGlsLm5vcm1hbGl6ZVJlY3QobGluZUNvb3JkaW5hdGVzKTsKICAgIHRoaXMuc2V0TGluZUVuZGluZ3MoZGljdC5nZXRBcnJheSgiTEUiKSk7CiAgICB0aGlzLmRhdGEubGluZUVuZGluZ3MgPSB0aGlzLmxpbmVFbmRpbmdzOwogICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6IFswLCAwLCAwXTsKICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgY29uc3QgaW50ZXJpb3JDb2xvciA9IGdldFJnYkNvbG9yKGRpY3QuZ2V0QXJyYXkoIklDIiksIG51bGwpOwogICAgICBjb25zdCBmaWxsQ29sb3IgPSBpbnRlcmlvckNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheShpbnRlcmlvckNvbG9yKSA6IG51bGw7CiAgICAgIGNvbnN0IGZpbGxBbHBoYSA9IGZpbGxDb2xvciA/IHN0cm9rZUFscGhhIDogbnVsbDsKICAgICAgY29uc3QgYm9yZGVyV2lkdGggPSB0aGlzLmJvcmRlclN0eWxlLndpZHRoIHx8IDEsCiAgICAgICAgYm9yZGVyQWRqdXN0ID0gMiAqIGJvcmRlcldpZHRoOwogICAgICBjb25zdCBiYm94ID0gW3RoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbMF0gLSBib3JkZXJBZGp1c3QsIHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbMV0gLSBib3JkZXJBZGp1c3QsIHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbMl0gKyBib3JkZXJBZGp1c3QsIHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbM10gKyBib3JkZXJBZGp1c3RdOwogICAgICBpZiAoIVV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLCBiYm94KSkgewogICAgICAgIHRoaXMucmVjdGFuZ2xlID0gYmJveDsKICAgICAgfQogICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBleHRyYTogYCR7Ym9yZGVyV2lkdGh9IHdgLAogICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgIGZpbGxDb2xvciwKICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICBmaWxsQWxwaGEsCiAgICAgICAgcG9pbnRzQ2FsbGJhY2s6IChidWZmZXIsIHBvaW50cykgPT4gewogICAgICAgICAgYnVmZmVyLnB1c2goYCR7bGluZUNvb3JkaW5hdGVzWzBdfSAke2xpbmVDb29yZGluYXRlc1sxXX0gbWAsIGAke2xpbmVDb29yZGluYXRlc1syXX0gJHtsaW5lQ29vcmRpbmF0ZXNbM119IGxgLCAiUyIpOwogICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0gLSBib3JkZXJXaWR0aCwgcG9pbnRzWzddIC0gYm9yZGVyV2lkdGgsIHBvaW50c1syXSArIGJvcmRlcldpZHRoLCBwb2ludHNbM10gKyBib3JkZXJXaWR0aF07CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9Cn0KY2xhc3MgU3F1YXJlQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlNRVUFSRTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBpbnRlcmlvckNvbG9yID0gZ2V0UmdiQ29sb3IoZGljdC5nZXRBcnJheSgiSUMiKSwgbnVsbCk7CiAgICAgIGNvbnN0IGZpbGxDb2xvciA9IGludGVyaW9yQ29sb3IgPyBnZXRQZGZDb2xvckFycmF5KGludGVyaW9yQ29sb3IpIDogbnVsbDsKICAgICAgY29uc3QgZmlsbEFscGhhID0gZmlsbENvbG9yID8gc3Ryb2tlQWxwaGEgOiBudWxsOwogICAgICBpZiAodGhpcy5ib3JkZXJTdHlsZS53aWR0aCA9PT0gMCAmJiAhZmlsbENvbG9yKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICB4cmVmLAogICAgICAgIGV4dHJhOiBgJHt0aGlzLmJvcmRlclN0eWxlLndpZHRofSB3YCwKICAgICAgICBzdHJva2VDb2xvciwKICAgICAgICBmaWxsQ29sb3IsCiAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgZmlsbEFscGhhLAogICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgIGNvbnN0IHggPSBwb2ludHNbNF0gKyB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHkgPSBwb2ludHNbNV0gKyB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHdpZHRoID0gcG9pbnRzWzZdIC0gcG9pbnRzWzRdIC0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aDsKICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHBvaW50c1szXSAtIHBvaW50c1s3XSAtIHRoaXMuYm9yZGVyU3R5bGUud2lkdGg7CiAgICAgICAgICBidWZmZXIucHVzaChgJHt4fSAke3l9ICR7d2lkdGh9ICR7aGVpZ2h0fSByZWApOwogICAgICAgICAgaWYgKGZpbGxDb2xvcikgewogICAgICAgICAgICBidWZmZXIucHVzaCgiQiIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goIlMiKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbcG9pbnRzWzBdLCBwb2ludHNbN10sIHBvaW50c1syXSwgcG9pbnRzWzNdXTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KfQpjbGFzcyBDaXJjbGVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuQ0lSQ0xFOwogICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6IFswLCAwLCAwXTsKICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgY29uc3QgaW50ZXJpb3JDb2xvciA9IGdldFJnYkNvbG9yKGRpY3QuZ2V0QXJyYXkoIklDIiksIG51bGwpOwogICAgICBjb25zdCBmaWxsQ29sb3IgPSBpbnRlcmlvckNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheShpbnRlcmlvckNvbG9yKSA6IG51bGw7CiAgICAgIGNvbnN0IGZpbGxBbHBoYSA9IGZpbGxDb2xvciA/IHN0cm9rZUFscGhhIDogbnVsbDsKICAgICAgaWYgKHRoaXMuYm9yZGVyU3R5bGUud2lkdGggPT09IDAgJiYgIWZpbGxDb2xvcikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBjb250cm9sUG9pbnRzRGlzdGFuY2UgPSA0IC8gMyAqIE1hdGgudGFuKE1hdGguUEkgLyAoMiAqIDQpKTsKICAgICAgdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2UoewogICAgICAgIHhyZWYsCiAgICAgICAgZXh0cmE6IGAke3RoaXMuYm9yZGVyU3R5bGUud2lkdGh9IHdgLAogICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgIGZpbGxDb2xvciwKICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICBmaWxsQWxwaGEsCiAgICAgICAgcG9pbnRzQ2FsbGJhY2s6IChidWZmZXIsIHBvaW50cykgPT4gewogICAgICAgICAgY29uc3QgeDAgPSBwb2ludHNbMF0gKyB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHkwID0gcG9pbnRzWzFdIC0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aCAvIDI7CiAgICAgICAgICBjb25zdCB4MSA9IHBvaW50c1s2XSAtIHRoaXMuYm9yZGVyU3R5bGUud2lkdGggLyAyOwogICAgICAgICAgY29uc3QgeTEgPSBwb2ludHNbN10gKyB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHhNaWQgPSB4MCArICh4MSAtIHgwKSAvIDI7CiAgICAgICAgICBjb25zdCB5TWlkID0geTAgKyAoeTEgLSB5MCkgLyAyOwogICAgICAgICAgY29uc3QgeE9mZnNldCA9ICh4MSAtIHgwKSAvIDIgKiBjb250cm9sUG9pbnRzRGlzdGFuY2U7CiAgICAgICAgICBjb25zdCB5T2Zmc2V0ID0gKHkxIC0geTApIC8gMiAqIGNvbnRyb2xQb2ludHNEaXN0YW5jZTsKICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3hNaWR9ICR7eTF9IG1gLCBgJHt4TWlkICsgeE9mZnNldH0gJHt5MX0gJHt4MX0gJHt5TWlkICsgeU9mZnNldH0gJHt4MX0gJHt5TWlkfSBjYCwgYCR7eDF9ICR7eU1pZCAtIHlPZmZzZXR9ICR7eE1pZCArIHhPZmZzZXR9ICR7eTB9ICR7eE1pZH0gJHt5MH0gY2AsIGAke3hNaWQgLSB4T2Zmc2V0fSAke3kwfSAke3gwfSAke3lNaWQgLSB5T2Zmc2V0fSAke3gwfSAke3lNaWR9IGNgLCBgJHt4MH0gJHt5TWlkICsgeU9mZnNldH0gJHt4TWlkIC0geE9mZnNldH0gJHt5MX0gJHt4TWlkfSAke3kxfSBjYCwgImgiKTsKICAgICAgICAgIGlmIChmaWxsQ29sb3IpIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goIkIiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKCJTIik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gW3BvaW50c1swXSwgcG9pbnRzWzddLCBwb2ludHNbMl0sIHBvaW50c1szXV07CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9Cn0KY2xhc3MgUG9seWxpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuUE9MWUxJTkU7CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLm5vUm90YXRlOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogICAgdGhpcy5kYXRhLnZlcnRpY2VzID0gbnVsbDsKICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQb2x5Z29uQW5ub3RhdGlvbikpIHsKICAgICAgdGhpcy5zZXRMaW5lRW5kaW5ncyhkaWN0LmdldEFycmF5KCJMRSIpKTsKICAgICAgdGhpcy5kYXRhLmxpbmVFbmRpbmdzID0gdGhpcy5saW5lRW5kaW5nczsKICAgIH0KICAgIGNvbnN0IHJhd1ZlcnRpY2VzID0gZGljdC5nZXRBcnJheSgiVmVydGljZXMiKTsKICAgIGlmICghaXNOdW1iZXJBcnJheShyYXdWZXJ0aWNlcywgbnVsbCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgdmVydGljZXMgPSB0aGlzLmRhdGEudmVydGljZXMgPSBGbG9hdDMyQXJyYXkuZnJvbShyYXdWZXJ0aWNlcyk7CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuYm9yZGVyU3R5bGUud2lkdGggfHwgMSwKICAgICAgICBib3JkZXJBZGp1c3QgPSAyICogYm9yZGVyV2lkdGg7CiAgICAgIGNvbnN0IGJib3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICBVdGlsLnJlY3RCb3VuZGluZ0JveCh2ZXJ0aWNlc1tpXSAtIGJvcmRlckFkanVzdCwgdmVydGljZXNbaSArIDFdIC0gYm9yZGVyQWRqdXN0LCB2ZXJ0aWNlc1tpXSArIGJvcmRlckFkanVzdCwgdmVydGljZXNbaSArIDFdICsgYm9yZGVyQWRqdXN0LCBiYm94KTsKICAgICAgfQogICAgICBpZiAoIVV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLCBiYm94KSkgewogICAgICAgIHRoaXMucmVjdGFuZ2xlID0gYmJveDsKICAgICAgfQogICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBleHRyYTogYCR7Ym9yZGVyV2lkdGh9IHdgLAogICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgIHN0cm9rZUFscGhhLAogICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7dmVydGljZXNbaV19ICR7dmVydGljZXNbaSArIDFdfSAke2kgPT09IDAgPyAibSIgOiAibCJ9YCk7CiAgICAgICAgICB9CiAgICAgICAgICBidWZmZXIucHVzaCgiUyIpOwogICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0sIHBvaW50c1s3XSwgcG9pbnRzWzJdLCBwb2ludHNbM11dOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQp9CmNsYXNzIFBvbHlnb25Bbm5vdGF0aW9uIGV4dGVuZHMgUG9seWxpbmVBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5QT0xZR09OOwogIH0KfQpjbGFzcyBDYXJldEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5DQVJFVDsKICB9Cn0KY2xhc3MgSW5rQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5JTks7CiAgICB0aGlzLmRhdGEuaW5rTGlzdHMgPSBbXTsKICAgIHRoaXMuZGF0YS5pc0VkaXRhYmxlID0gIXRoaXMuZGF0YS5ub0hUTUw7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICB0aGlzLmRhdGEub3BhY2l0eSA9IGRpY3QuZ2V0KCJDQSIpIHx8IDE7CiAgICBjb25zdCByYXdJbmtMaXN0cyA9IGRpY3QuZ2V0QXJyYXkoIklua0xpc3QiKTsKICAgIGlmICghQXJyYXkuaXNBcnJheShyYXdJbmtMaXN0cykpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcmF3SW5rTGlzdHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmF3SW5rTGlzdHNbaV0pKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgaW5rTGlzdCA9IG5ldyBGbG9hdDMyQXJyYXkocmF3SW5rTGlzdHNbaV0ubGVuZ3RoKTsKICAgICAgdGhpcy5kYXRhLmlua0xpc3RzLnB1c2goaW5rTGlzdCk7CiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHJhd0lua0xpc3RzW2ldLmxlbmd0aDsgaiA8IGpqOyBqICs9IDIpIHsKICAgICAgICBjb25zdCB4ID0geHJlZi5mZXRjaElmUmVmKHJhd0lua0xpc3RzW2ldW2pdKSwKICAgICAgICAgIHkgPSB4cmVmLmZldGNoSWZSZWYocmF3SW5rTGlzdHNbaV1baiArIDFdKTsKICAgICAgICBpZiAodHlwZW9mIHggPT09ICJudW1iZXIiICYmIHR5cGVvZiB5ID09PSAibnVtYmVyIikgewogICAgICAgICAgaW5rTGlzdFtqXSA9IHg7CiAgICAgICAgICBpbmtMaXN0W2ogKyAxXSA9IHk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuYm9yZGVyU3R5bGUud2lkdGggfHwgMSwKICAgICAgICBib3JkZXJBZGp1c3QgPSAyICogYm9yZGVyV2lkdGg7CiAgICAgIGNvbnN0IGJib3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07CiAgICAgIGZvciAoY29uc3QgaW5rTGlzdCBvZiB0aGlzLmRhdGEuaW5rTGlzdHMpIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbmtMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICAgIFV0aWwucmVjdEJvdW5kaW5nQm94KGlua0xpc3RbaV0gLSBib3JkZXJBZGp1c3QsIGlua0xpc3RbaSArIDFdIC0gYm9yZGVyQWRqdXN0LCBpbmtMaXN0W2ldICsgYm9yZGVyQWRqdXN0LCBpbmtMaXN0W2kgKyAxXSArIGJvcmRlckFkanVzdCwgYmJveCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghVXRpbC5pbnRlcnNlY3QodGhpcy5yZWN0YW5nbGUsIGJib3gpKSB7CiAgICAgICAgdGhpcy5yZWN0YW5nbGUgPSBiYm94OwogICAgICB9CiAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICB4cmVmLAogICAgICAgIGV4dHJhOiBgJHtib3JkZXJXaWR0aH0gd2AsCiAgICAgICAgc3Ryb2tlQ29sb3IsCiAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgcG9pbnRzQ2FsbGJhY2s6IChidWZmZXIsIHBvaW50cykgPT4gewogICAgICAgICAgZm9yIChjb25zdCBpbmtMaXN0IG9mIHRoaXMuZGF0YS5pbmtMaXN0cykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbmtMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICAgICAgICBidWZmZXIucHVzaChgJHtpbmtMaXN0W2ldfSAke2lua0xpc3RbaSArIDFdfSAke2kgPT09IDAgPyAibSIgOiAibCJ9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnVmZmVyLnB1c2goIlMiKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbcG9pbnRzWzBdLCBwb2ludHNbN10sIHBvaW50c1syXSwgcG9pbnRzWzNdXTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KICBzdGF0aWMgY3JlYXRlTmV3RGljdChhbm5vdGF0aW9uLCB4cmVmLCB7CiAgICBhcFJlZiwKICAgIGFwCiAgfSkgewogICAgY29uc3QgewogICAgICBvbGRBbm5vdGF0aW9uLAogICAgICBjb2xvciwKICAgICAgb3BhY2l0eSwKICAgICAgcGF0aHMsCiAgICAgIG91dGxpbmVzLAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdGhpY2tuZXNzLAogICAgICB1c2VyCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IGluayA9IG9sZEFubm90YXRpb24gfHwgbmV3IERpY3QoeHJlZik7CiAgICBpbmsuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkFubm90IikpOwogICAgaW5rLnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJJbmsiKSk7CiAgICBpbmsuc2V0KG9sZEFubm90YXRpb24gPyAiTSIgOiAiQ3JlYXRpb25EYXRlIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICBpbmsuc2V0KCJSZWN0IiwgcmVjdCk7CiAgICBpbmsuc2V0KCJJbmtMaXN0Iiwgb3V0bGluZXM/LnBvaW50cyB8fCBwYXRocy5wb2ludHMpOwogICAgaW5rLnNldCgiRiIsIDQpOwogICAgaW5rLnNldCgiUm90YXRlIiwgcm90YXRpb24pOwogICAgaWYgKHVzZXIpIHsKICAgICAgaW5rLnNldCgiVCIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUodXNlcikpOwogICAgfQogICAgaWYgKG91dGxpbmVzKSB7CiAgICAgIGluay5zZXQoIklUIiwgTmFtZS5nZXQoIklua0hpZ2hsaWdodCIpKTsKICAgIH0KICAgIGNvbnN0IGJzID0gbmV3IERpY3QoeHJlZik7CiAgICBpbmsuc2V0KCJCUyIsIGJzKTsKICAgIGJzLnNldCgiVyIsIHRoaWNrbmVzcyk7CiAgICBpbmsuc2V0KCJDIiwgZ2V0UGRmQ29sb3JBcnJheShjb2xvcikpOwogICAgaW5rLnNldCgiQ0EiLCBvcGFjaXR5KTsKICAgIGNvbnN0IG4gPSBuZXcgRGljdCh4cmVmKTsKICAgIGluay5zZXQoIkFQIiwgbik7CiAgICBpZiAoYXBSZWYpIHsKICAgICAgbi5zZXQoIk4iLCBhcFJlZik7CiAgICB9IGVsc2UgewogICAgICBuLnNldCgiTiIsIGFwKTsKICAgIH0KICAgIHJldHVybiBpbms7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGFubm90YXRpb24sIHhyZWYsIHBhcmFtcykgewogICAgaWYgKGFubm90YXRpb24ub3V0bGluZXMpIHsKICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbUZvckhpZ2hsaWdodChhbm5vdGF0aW9uLCB4cmVmLCBwYXJhbXMpOwogICAgfQogICAgY29uc3QgewogICAgICBjb2xvciwKICAgICAgcmVjdCwKICAgICAgcGF0aHMsCiAgICAgIHRoaWNrbmVzcywKICAgICAgb3BhY2l0eQogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBhcHBlYXJhbmNlQnVmZmVyID0gW2Ake3RoaWNrbmVzc30gdyAxIEogMSBqYCwgYCR7Z2V0UGRmQ29sb3IoY29sb3IsIGZhbHNlKX1gXTsKICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7CiAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaCgiL1IwIGdzIik7CiAgICB9CiAgICBmb3IgKGNvbnN0IG91dGxpbmUgb2YgcGF0aHMubGluZXMpIHsKICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNF0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNV0pfSBtYCk7CiAgICAgIGZvciAobGV0IGkgPSA2LCBpaSA9IG91dGxpbmUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNikgewogICAgICAgIGlmIChpc05hTihvdXRsaW5lW2ldKSkgewogICAgICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaSArIDRdKX0gJHtudW1iZXJUb1N0cmluZyhvdXRsaW5lW2kgKyA1XSl9IGxgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgW2MxeCwgYzF5LCBjMngsIGMyeSwgeCwgeV0gPSBvdXRsaW5lLnNsaWNlKGksIGkgKyA2KTsKICAgICAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChbYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5XS5tYXAobnVtYmVyVG9TdHJpbmcpLmpvaW4oIiAiKSArICIgYyIpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAob3V0bGluZS5sZW5ndGggPT09IDYpIHsKICAgICAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goYCR7bnVtYmVyVG9TdHJpbmcob3V0bGluZVs0XSl9ICR7bnVtYmVyVG9TdHJpbmcob3V0bGluZVs1XSl9IGxgKTsKICAgICAgfQogICAgfQogICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKCJTIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXBwZWFyYW5jZUJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiRm9ybVR5cGUiLCAxKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIlhPYmplY3QiKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkJCb3giLCByZWN0KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTGVuZ3RoIiwgYXBwZWFyYW5jZS5sZW5ndGgpOwogICAgaWYgKG9wYWNpdHkgIT09IDEpIHsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGNvbnN0IGV4dEdTdGF0ZSA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBjb25zdCByMCA9IG5ldyBEaWN0KHhyZWYpOwogICAgICByMC5zZXQoIkNBIiwgb3BhY2l0eSk7CiAgICAgIHIwLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJFeHRHU3RhdGUiKSk7CiAgICAgIGV4dEdTdGF0ZS5zZXQoIlIwIiwgcjApOwogICAgICByZXNvdXJjZXMuc2V0KCJFeHRHU3RhdGUiLCBleHRHU3RhdGUpOwogICAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICB9CiAgICBjb25zdCBhcCA9IG5ldyBTdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICBhcC5kaWN0ID0gYXBwZWFyYW5jZVN0cmVhbURpY3Q7CiAgICByZXR1cm4gYXA7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtRm9ySGlnaGxpZ2h0KGFubm90YXRpb24sIHhyZWYsIHBhcmFtcykgewogICAgY29uc3QgewogICAgICBjb2xvciwKICAgICAgcmVjdCwKICAgICAgb3V0bGluZXM6IHsKICAgICAgICBvdXRsaW5lCiAgICAgIH0sCiAgICAgIG9wYWNpdHkKICAgIH0gPSBhbm5vdGF0aW9uOwogICAgY29uc3QgYXBwZWFyYW5jZUJ1ZmZlciA9IFtgJHtnZXRQZGZDb2xvcihjb2xvciwgdHJ1ZSl9YCwgIi9SMCBncyJdOwogICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNF0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNV0pfSBtYCk7CiAgICBmb3IgKGxldCBpID0gNiwgaWkgPSBvdXRsaW5lLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHsKICAgICAgaWYgKGlzTmFOKG91dGxpbmVbaV0pKSB7CiAgICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaSArIDRdKX0gJHtudW1iZXJUb1N0cmluZyhvdXRsaW5lW2kgKyA1XSl9IGxgKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBbYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5XSA9IG91dGxpbmUuc2xpY2UoaSwgaSArIDYpOwogICAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChbYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5XS5tYXAobnVtYmVyVG9TdHJpbmcpLmpvaW4oIiAiKSArICIgYyIpOwogICAgICB9CiAgICB9CiAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goImggZiIpOwogICAgY29uc3QgYXBwZWFyYW5jZSA9IGFwcGVhcmFuY2VCdWZmZXIuam9pbigiXG4iKTsKICAgIGNvbnN0IGFwcGVhcmFuY2VTdHJlYW1EaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkZvcm1UeXBlIiwgMSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRm9ybSIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYT2JqZWN0IikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJCQm94IiwgcmVjdCk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBEaWN0KHhyZWYpOwogICAgY29uc3QgZXh0R1N0YXRlID0gbmV3IERpY3QoeHJlZik7CiAgICByZXNvdXJjZXMuc2V0KCJFeHRHU3RhdGUiLCBleHRHU3RhdGUpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJSZXNvdXJjZXMiLCByZXNvdXJjZXMpOwogICAgY29uc3QgcjAgPSBuZXcgRGljdCh4cmVmKTsKICAgIGV4dEdTdGF0ZS5zZXQoIlIwIiwgcjApOwogICAgcjAuc2V0KCJCTSIsIE5hbWUuZ2V0KCJNdWx0aXBseSIpKTsKICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7CiAgICAgIHIwLnNldCgiY2EiLCBvcGFjaXR5KTsKICAgICAgcjAuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkV4dEdTdGF0ZSIpKTsKICAgIH0KICAgIGNvbnN0IGFwID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgIGFwLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIHJldHVybiBhcDsKICB9Cn0KY2xhc3MgSGlnaGxpZ2h0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkhJR0hMSUdIVDsKICAgIHRoaXMuZGF0YS5pc0VkaXRhYmxlID0gIXRoaXMuZGF0YS5ub0hUTUw7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICB0aGlzLmRhdGEub3BhY2l0eSA9IGRpY3QuZ2V0KCJDQSIpIHx8IDE7CiAgICBjb25zdCBxdWFkUG9pbnRzID0gdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKGRpY3QsIG51bGwpOwogICAgaWYgKHF1YWRQb2ludHMpIHsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy5hcHBlYXJhbmNlPy5kaWN0LmdldCgiUmVzb3VyY2VzIik7CiAgICAgIGlmICghdGhpcy5hcHBlYXJhbmNlIHx8ICFyZXNvdXJjZXM/LmhhcygiRXh0R1N0YXRlIikpIHsKICAgICAgICBpZiAodGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgICAgICB3YXJuKCJIaWdobGlnaHRBbm5vdGF0aW9uIC0gaWdub3JpbmcgYnVpbHQtaW4gYXBwZWFyYW5jZSBzdHJlYW0uIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzEsIDEsIDBdOwogICAgICAgIGNvbnN0IGZpbGxBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBmaWxsQ29sb3IsCiAgICAgICAgICBibGVuZE1vZGU6ICJNdWx0aXBseSIsCiAgICAgICAgICBmaWxsQWxwaGEsCiAgICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3BvaW50c1swXX0gJHtwb2ludHNbMV19IG1gLCBgJHtwb2ludHNbMl19ICR7cG9pbnRzWzNdfSBsYCwgYCR7cG9pbnRzWzZdfSAke3BvaW50c1s3XX0gbGAsIGAke3BvaW50c1s0XX0gJHtwb2ludHNbNV19IGxgLCAiZiIpOwogICAgICAgICAgICByZXR1cm4gW3BvaW50c1swXSwgcG9pbnRzWzddLCBwb2ludHNbMl0sIHBvaW50c1szXV07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiA9IG51bGw7CiAgICB9CiAgfQogIHN0YXRpYyBjcmVhdGVOZXdEaWN0KGFubm90YXRpb24sIHhyZWYsIHsKICAgIGFwUmVmLAogICAgYXAKICB9KSB7CiAgICBjb25zdCB7CiAgICAgIGNvbG9yLAogICAgICBvbGRBbm5vdGF0aW9uLAogICAgICBvcGFjaXR5LAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdXNlciwKICAgICAgcXVhZFBvaW50cwogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBoaWdobGlnaHQgPSBvbGRBbm5vdGF0aW9uIHx8IG5ldyBEaWN0KHhyZWYpOwogICAgaGlnaGxpZ2h0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJBbm5vdCIpKTsKICAgIGhpZ2hsaWdodC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiSGlnaGxpZ2h0IikpOwogICAgaGlnaGxpZ2h0LnNldChvbGRBbm5vdGF0aW9uID8gIk0iIDogIkNyZWF0aW9uRGF0ZSIsIGBEOiR7Z2V0TW9kaWZpY2F0aW9uRGF0ZSgpfWApOwogICAgaGlnaGxpZ2h0LnNldCgiQ3JlYXRpb25EYXRlIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICBoaWdobGlnaHQuc2V0KCJSZWN0IiwgcmVjdCk7CiAgICBoaWdobGlnaHQuc2V0KCJGIiwgNCk7CiAgICBoaWdobGlnaHQuc2V0KCJCb3JkZXIiLCBbMCwgMCwgMF0pOwogICAgaGlnaGxpZ2h0LnNldCgiUm90YXRlIiwgcm90YXRpb24pOwogICAgaGlnaGxpZ2h0LnNldCgiUXVhZFBvaW50cyIsIHF1YWRQb2ludHMpOwogICAgaGlnaGxpZ2h0LnNldCgiQyIsIGdldFBkZkNvbG9yQXJyYXkoY29sb3IpKTsKICAgIGhpZ2hsaWdodC5zZXQoIkNBIiwgb3BhY2l0eSk7CiAgICBpZiAodXNlcikgewogICAgICBoaWdobGlnaHQuc2V0KCJUIiwgc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRSh1c2VyKSk7CiAgICB9CiAgICBpZiAoYXBSZWYgfHwgYXApIHsKICAgICAgY29uc3QgbiA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBoaWdobGlnaHQuc2V0KCJBUCIsIG4pOwogICAgICBuLnNldCgiTiIsIGFwUmVmIHx8IGFwKTsKICAgIH0KICAgIHJldHVybiBoaWdobGlnaHQ7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGFubm90YXRpb24sIHhyZWYsIHBhcmFtcykgewogICAgY29uc3QgewogICAgICBjb2xvciwKICAgICAgcmVjdCwKICAgICAgb3V0bGluZXMsCiAgICAgIG9wYWNpdHkKICAgIH0gPSBhbm5vdGF0aW9uOwogICAgY29uc3QgYXBwZWFyYW5jZUJ1ZmZlciA9IFtgJHtnZXRQZGZDb2xvcihjb2xvciwgdHJ1ZSl9YCwgIi9SMCBncyJdOwogICAgY29uc3QgYnVmZmVyID0gW107CiAgICBmb3IgKGNvbnN0IG91dGxpbmUgb2Ygb3V0bGluZXMpIHsKICAgICAgYnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgIGJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbMF0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbMV0pfSBtYCk7CiAgICAgIGZvciAobGV0IGkgPSAyLCBpaSA9IG91dGxpbmUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICAgIGJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaV0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaSArIDFdKX0gbGApOwogICAgICB9CiAgICAgIGJ1ZmZlci5wdXNoKCJoIik7CiAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChidWZmZXIuam9pbigiXG4iKSk7CiAgICB9CiAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goImYqIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXBwZWFyYW5jZUJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiRm9ybVR5cGUiLCAxKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIlhPYmplY3QiKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkJCb3giLCByZWN0KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTGVuZ3RoIiwgYXBwZWFyYW5jZS5sZW5ndGgpOwogICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QoeHJlZik7CiAgICBjb25zdCBleHRHU3RhdGUgPSBuZXcgRGljdCh4cmVmKTsKICAgIHJlc291cmNlcy5zZXQoIkV4dEdTdGF0ZSIsIGV4dEdTdGF0ZSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICBjb25zdCByMCA9IG5ldyBEaWN0KHhyZWYpOwogICAgZXh0R1N0YXRlLnNldCgiUjAiLCByMCk7CiAgICByMC5zZXQoIkJNIiwgTmFtZS5nZXQoIk11bHRpcGx5IikpOwogICAgaWYgKG9wYWNpdHkgIT09IDEpIHsKICAgICAgcjAuc2V0KCJjYSIsIG9wYWNpdHkpOwogICAgICByMC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRXh0R1N0YXRlIikpOwogICAgfQogICAgY29uc3QgYXAgPSBuZXcgU3RyaW5nU3RyZWFtKGFwcGVhcmFuY2UpOwogICAgYXAuZGljdCA9IGFwcGVhcmFuY2VTdHJlYW1EaWN0OwogICAgcmV0dXJuIGFwOwogIH0KfQpjbGFzcyBVbmRlcmxpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FOwogICAgY29uc3QgcXVhZFBvaW50cyA9IHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhkaWN0LCBudWxsKTsKICAgIGlmIChxdWFkUG9pbnRzKSB7CiAgICAgIGlmICghdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6IFswLCAwLCAwXTsKICAgICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBleHRyYTogIltdIDAgZCAwLjU3MSB3IiwKICAgICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3BvaW50c1s0XX0gJHtwb2ludHNbNV0gKyAxLjN9IG1gLCBgJHtwb2ludHNbNl19ICR7cG9pbnRzWzddICsgMS4zfSBsYCwgIlMiKTsKICAgICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0sIHBvaW50c1s3XSwgcG9pbnRzWzJdLCBwb2ludHNbM11dOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEucG9wdXBSZWYgPSBudWxsOwogICAgfQogIH0KfQpjbGFzcyBTcXVpZ2dseUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5TUVVJR0dMWTsKICAgIGNvbnN0IHF1YWRQb2ludHMgPSB0aGlzLmRhdGEucXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMoZGljdCwgbnVsbCk7CiAgICBpZiAocXVhZFBvaW50cykgewogICAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gdGhpcy5jb2xvciA/IGdldFBkZkNvbG9yQXJyYXkodGhpcy5jb2xvcikgOiBbMCwgMCwgMF07CiAgICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgICB4cmVmLAogICAgICAgICAgZXh0cmE6ICJbXSAwIGQgMSB3IiwKICAgICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGR5ID0gKHBvaW50c1sxXSAtIHBvaW50c1s1XSkgLyA2OwogICAgICAgICAgICBsZXQgc2hpZnQgPSBkeTsKICAgICAgICAgICAgbGV0IHggPSBwb2ludHNbNF07CiAgICAgICAgICAgIGNvbnN0IHkgPSBwb2ludHNbNV07CiAgICAgICAgICAgIGNvbnN0IHhFbmQgPSBwb2ludHNbNl07CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3h9ICR7eSArIHNoaWZ0fSBtYCk7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICB4ICs9IDI7CiAgICAgICAgICAgICAgc2hpZnQgPSBzaGlmdCA9PT0gMCA/IGR5IDogMDsKICAgICAgICAgICAgICBidWZmZXIucHVzaChgJHt4fSAke3kgKyBzaGlmdH0gbGApOwogICAgICAgICAgICB9IHdoaWxlICh4IDwgeEVuZCk7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKCJTIik7CiAgICAgICAgICAgIHJldHVybiBbcG9pbnRzWzRdLCB5IC0gMiAqIGR5LCB4RW5kLCB5ICsgMiAqIGR5XTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmID0gbnVsbDsKICAgIH0KICB9Cn0KY2xhc3MgU3RyaWtlT3V0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlNUUklLRU9VVDsKICAgIGNvbnN0IHF1YWRQb2ludHMgPSB0aGlzLmRhdGEucXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMoZGljdCwgbnVsbCk7CiAgICBpZiAocXVhZFBvaW50cykgewogICAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gdGhpcy5jb2xvciA/IGdldFBkZkNvbG9yQXJyYXkodGhpcy5jb2xvcikgOiBbMCwgMCwgMF07CiAgICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgICB4cmVmLAogICAgICAgICAgZXh0cmE6ICJbXSAwIGQgMSB3IiwKICAgICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAkeyhwb2ludHNbMF0gKyBwb2ludHNbNF0pIC8gMn0gYCArIGAkeyhwb2ludHNbMV0gKyBwb2ludHNbNV0pIC8gMn0gbWAsIGAkeyhwb2ludHNbMl0gKyBwb2ludHNbNl0pIC8gMn0gYCArIGAkeyhwb2ludHNbM10gKyBwb2ludHNbN10pIC8gMn0gbGAsICJTIik7CiAgICAgICAgICAgIHJldHVybiBbcG9pbnRzWzBdLCBwb2ludHNbN10sIHBvaW50c1syXSwgcG9pbnRzWzNdXTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmID0gbnVsbDsKICAgIH0KICB9Cn0KY2xhc3MgU3RhbXBBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgI3NhdmVkSGFzT3duQ2FudmFzID0gbnVsbDsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5TVEFNUDsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEuaXNFZGl0YWJsZSA9ICF0aGlzLmRhdGEubm9IVE1MOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogIH0KICBtdXN0QmVWaWV3ZWRXaGVuRWRpdGluZyhpc0VkaXRpbmcsIG1vZGlmaWVkSWRzID0gbnVsbCkgewogICAgaWYgKGlzRWRpdGluZykgewogICAgICBpZiAoIXRoaXMuZGF0YS5pc0VkaXRhYmxlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgdGhpcy4jc2F2ZWRIYXNPd25DYW52YXMgPz89IHRoaXMuZGF0YS5oYXNPd25DYW52YXM7CiAgICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0cnVlOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh0aGlzLiNzYXZlZEhhc093bkNhbnZhcyAhPT0gbnVsbCkgewogICAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy4jc2F2ZWRIYXNPd25DYW52YXM7CiAgICAgIHRoaXMuI3NhdmVkSGFzT3duQ2FudmFzID0gbnVsbDsKICAgIH0KICAgIHJldHVybiAhbW9kaWZpZWRJZHM/Lmhhcyh0aGlzLmRhdGEuaWQpOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlSW1hZ2UoYml0bWFwLCB4cmVmKSB7CiAgICBjb25zdCB7CiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQKICAgIH0gPSBiaXRtYXA7CiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOwogICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIiwgewogICAgICBhbHBoYTogdHJ1ZQogICAgfSk7CiAgICBjdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCk7CiAgICBjb25zdCBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhOwogICAgY29uc3QgYnVmMzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIpOwogICAgY29uc3QgaGFzQWxwaGEgPSBidWYzMi5zb21lKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8geCA9PiB4ID4+PiAyNCAhPT0gMHhmZiA6IHggPT4gKHggJiAweGZmKSAhPT0gMHhmZik7CiAgICBpZiAoaGFzQWxwaGEpIHsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICJ3aGl0ZSI7CiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApOwogICAgfQogICAgY29uc3QganBlZ0J1ZmZlclByb21pc2UgPSBjYW52YXMuY29udmVydFRvQmxvYih7CiAgICAgIHR5cGU6ICJpbWFnZS9qcGVnIiwKICAgICAgcXVhbGl0eTogMQogICAgfSkudGhlbihibG9iID0+IGJsb2IuYXJyYXlCdWZmZXIoKSk7CiAgICBjb25zdCB4b2JqZWN0TmFtZSA9IE5hbWUuZ2V0KCJYT2JqZWN0Iik7CiAgICBjb25zdCBpbWFnZU5hbWUgPSBOYW1lLmdldCgiSW1hZ2UiKTsKICAgIGNvbnN0IGltYWdlID0gbmV3IERpY3QoeHJlZik7CiAgICBpbWFnZS5zZXQoIlR5cGUiLCB4b2JqZWN0TmFtZSk7CiAgICBpbWFnZS5zZXQoIlN1YnR5cGUiLCBpbWFnZU5hbWUpOwogICAgaW1hZ2Uuc2V0KCJCaXRzUGVyQ29tcG9uZW50IiwgOCk7CiAgICBpbWFnZS5zZXQoIkNvbG9yU3BhY2UiLCBOYW1lLmdldCgiRGV2aWNlUkdCIikpOwogICAgaW1hZ2Uuc2V0KCJGaWx0ZXIiLCBOYW1lLmdldCgiRENURGVjb2RlIikpOwogICAgaW1hZ2Uuc2V0KCJCQm94IiwgWzAsIDAsIHdpZHRoLCBoZWlnaHRdKTsKICAgIGltYWdlLnNldCgiV2lkdGgiLCB3aWR0aCk7CiAgICBpbWFnZS5zZXQoIkhlaWdodCIsIGhlaWdodCk7CiAgICBsZXQgc21hc2tTdHJlYW0gPSBudWxsOwogICAgaWYgKGhhc0FscGhhKSB7CiAgICAgIGNvbnN0IGFscGhhQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYnVmMzIubGVuZ3RoKTsKICAgICAgaWYgKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYnVmMzIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgYWxwaGFCdWZmZXJbaV0gPSBidWYzMltpXSA+Pj4gMjQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGJ1ZjMyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGFscGhhQnVmZmVyW2ldID0gYnVmMzJbaV0gJiAweGZmOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBzbWFzayA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBzbWFzay5zZXQoIlR5cGUiLCB4b2JqZWN0TmFtZSk7CiAgICAgIHNtYXNrLnNldCgiU3VidHlwZSIsIGltYWdlTmFtZSk7CiAgICAgIHNtYXNrLnNldCgiQml0c1BlckNvbXBvbmVudCIsIDgpOwogICAgICBzbWFzay5zZXQoIkNvbG9yU3BhY2UiLCBOYW1lLmdldCgiRGV2aWNlR3JheSIpKTsKICAgICAgc21hc2suc2V0KCJXaWR0aCIsIHdpZHRoKTsKICAgICAgc21hc2suc2V0KCJIZWlnaHQiLCBoZWlnaHQpOwogICAgICBzbWFza1N0cmVhbSA9IG5ldyBTdHJlYW0oYWxwaGFCdWZmZXIsIDAsIDAsIHNtYXNrKTsKICAgIH0KICAgIGNvbnN0IGltYWdlU3RyZWFtID0gbmV3IFN0cmVhbShhd2FpdCBqcGVnQnVmZmVyUHJvbWlzZSwgMCwgMCwgaW1hZ2UpOwogICAgcmV0dXJuIHsKICAgICAgaW1hZ2VTdHJlYW0sCiAgICAgIHNtYXNrU3RyZWFtLAogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0CiAgICB9OwogIH0KICBzdGF0aWMgY3JlYXRlTmV3RGljdChhbm5vdGF0aW9uLCB4cmVmLCB7CiAgICBhcFJlZiwKICAgIGFwCiAgfSkgewogICAgY29uc3QgewogICAgICBvbGRBbm5vdGF0aW9uLAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdXNlcgogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBzdGFtcCA9IG9sZEFubm90YXRpb24gfHwgbmV3IERpY3QoeHJlZik7CiAgICBzdGFtcC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiQW5ub3QiKSk7CiAgICBzdGFtcC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiU3RhbXAiKSk7CiAgICBzdGFtcC5zZXQob2xkQW5ub3RhdGlvbiA/ICJNIiA6ICJDcmVhdGlvbkRhdGUiLCBgRDoke2dldE1vZGlmaWNhdGlvbkRhdGUoKX1gKTsKICAgIHN0YW1wLnNldCgiUmVjdCIsIHJlY3QpOwogICAgc3RhbXAuc2V0KCJGIiwgNCk7CiAgICBzdGFtcC5zZXQoIkJvcmRlciIsIFswLCAwLCAwXSk7CiAgICBzdGFtcC5zZXQoIlJvdGF0ZSIsIHJvdGF0aW9uKTsKICAgIGlmICh1c2VyKSB7CiAgICAgIHN0YW1wLnNldCgiVCIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUodXNlcikpOwogICAgfQogICAgaWYgKGFwUmVmIHx8IGFwKSB7CiAgICAgIGNvbnN0IG4gPSBuZXcgRGljdCh4cmVmKTsKICAgICAgc3RhbXAuc2V0KCJBUCIsIG4pOwogICAgICBpZiAoYXBSZWYpIHsKICAgICAgICBuLnNldCgiTiIsIGFwUmVmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuLnNldCgiTiIsIGFwKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0YW1wOwogIH0KICBzdGF0aWMgYXN5bmMgI2NyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW1Gb3JEcmF3aW5nKGFubm90YXRpb24sIHhyZWYpIHsKICAgIGNvbnN0IHsKICAgICAgYXJlQ29udG91cnMsCiAgICAgIGNvbG9yLAogICAgICByZWN0LAogICAgICBsaW5lcywKICAgICAgdGhpY2tuZXNzCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IGFwcGVhcmFuY2VCdWZmZXIgPSBbYCR7dGhpY2tuZXNzfSB3IDEgSiAxIGpgLCBgJHtnZXRQZGZDb2xvcihjb2xvciwgYXJlQ29udG91cnMpfWBdOwogICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChgJHtudW1iZXJUb1N0cmluZyhsaW5lWzRdKX0gJHtudW1iZXJUb1N0cmluZyhsaW5lWzVdKX0gbWApOwogICAgICBmb3IgKGxldCBpID0gNiwgaWkgPSBsaW5lLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHsKICAgICAgICBpZiAoaXNOYU4obGluZVtpXSkpIHsKICAgICAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChgJHtudW1iZXJUb1N0cmluZyhsaW5lW2kgKyA0XSl9ICR7bnVtYmVyVG9TdHJpbmcobGluZVtpICsgNV0pfSBsYCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IFtjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHldID0gbGluZS5zbGljZShpLCBpICsgNik7CiAgICAgICAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goW2MxeCwgYzF5LCBjMngsIGMyeSwgeCwgeV0ubWFwKG51bWJlclRvU3RyaW5nKS5qb2luKCIgIikgKyAiIGMiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSA2KSB7CiAgICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKGxpbmVbNF0pfSAke251bWJlclRvU3RyaW5nKGxpbmVbNV0pfSBsYCk7CiAgICAgIH0KICAgIH0KICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChhcmVDb250b3VycyA/ICJGIiA6ICJTIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXBwZWFyYW5jZUJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiRm9ybVR5cGUiLCAxKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIlhPYmplY3QiKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkJCb3giLCByZWN0KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTGVuZ3RoIiwgYXBwZWFyYW5jZS5sZW5ndGgpOwogICAgY29uc3QgYXAgPSBuZXcgU3RyaW5nU3RyZWFtKGFwcGVhcmFuY2UpOwogICAgYXAuZGljdCA9IGFwcGVhcmFuY2VTdHJlYW1EaWN0OwogICAgcmV0dXJuIGFwOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShhbm5vdGF0aW9uLCB4cmVmLCBwYXJhbXMpIHsKICAgIGlmIChhbm5vdGF0aW9uLm9sZEFubm90YXRpb24pIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoYW5ub3RhdGlvbi5pc1NpZ25hdHVyZSkgewogICAgICByZXR1cm4gdGhpcy4jY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbUZvckRyYXdpbmcoYW5ub3RhdGlvbiwgeHJlZik7CiAgICB9CiAgICBjb25zdCB7CiAgICAgIHJvdGF0aW9uCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IHsKICAgICAgaW1hZ2VSZWYsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQKICAgIH0gPSBwYXJhbXMuaW1hZ2U7CiAgICBjb25zdCByZXNvdXJjZXMgPSBuZXcgRGljdCh4cmVmKTsKICAgIGNvbnN0IHhvYmplY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIHJlc291cmNlcy5zZXQoIlhPYmplY3QiLCB4b2JqZWN0KTsKICAgIHhvYmplY3Quc2V0KCJJbTAiLCBpbWFnZVJlZik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYHEgJHt3aWR0aH0gMCAwICR7aGVpZ2h0fSAwIDAgY20gL0ltMCBEbyBRYDsKICAgIGNvbnN0IGFwcGVhcmFuY2VTdHJlYW1EaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkZvcm1UeXBlIiwgMSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRm9ybSIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYT2JqZWN0IikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJCQm94IiwgWzAsIDAsIHdpZHRoLCBoZWlnaHRdKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgIGlmIChyb3RhdGlvbikgewogICAgICBjb25zdCBtYXRyaXggPSBnZXRSb3RhdGlvbk1hdHJpeChyb3RhdGlvbiwgd2lkdGgsIGhlaWdodCk7CiAgICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTWF0cml4IiwgbWF0cml4KTsKICAgIH0KICAgIGNvbnN0IGFwID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgIGFwLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIHJldHVybiBhcDsKICB9Cn0KY2xhc3MgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlU3BlYyhkaWN0LmdldCgiRlMiKSwgeHJlZik7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5GSUxFQVRUQUNITUVOVDsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICB0aGlzLmRhdGEuZmlsZSA9IGZpbGUuc2VyaWFsaXphYmxlOwogICAgY29uc3QgbmFtZSA9IGRpY3QuZ2V0KCJOYW1lIik7CiAgICB0aGlzLmRhdGEubmFtZSA9IG5hbWUgaW5zdGFuY2VvZiBOYW1lID8gc3RyaW5nVG9QREZTdHJpbmcobmFtZS5uYW1lKSA6ICJQdXNoUGluIjsKICAgIGNvbnN0IGZpbGxBbHBoYSA9IGRpY3QuZ2V0KCJjYSIpOwogICAgdGhpcy5kYXRhLmZpbGxBbHBoYSA9IHR5cGVvZiBmaWxsQWxwaGEgPT09ICJudW1iZXIiICYmIGZpbGxBbHBoYSA+PSAwICYmIGZpbGxBbHBoYSA8PSAxID8gZmlsbEFscGhhIDogbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NhbGN1bGF0ZV9tZDUuanMKCmNvbnN0IFBBUkFNUyA9IHsKICBnZXQgcigpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgInIiLCBuZXcgVWludDhBcnJheShbNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNSwgOSwgMTQsIDIwLCA1LCA5LCAxNCwgMjAsIDUsIDksIDE0LCAyMCwgNSwgOSwgMTQsIDIwLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxXSkpOwogIH0sCiAgZ2V0IGsoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJrIiwgbmV3IEludDMyQXJyYXkoWy02ODA4NzY5MzYsIC0zODk1NjQ1ODYsIDYwNjEwNTgxOSwgLTEwNDQ1MjUzMzAsIC0xNzY0MTg4OTcsIDEyMDAwODA0MjYsIC0xNDczMjMxMzQxLCAtNDU3MDU5ODMsIDE3NzAwMzU0MTYsIC0xOTU4NDE0NDE3LCAtNDIwNjMsIC0xOTkwNDA0MTYyLCAxODA0NjAzNjgyLCAtNDAzNDExMDEsIC0xNTAyMDAyMjkwLCAxMjM2NTM1MzI5LCAtMTY1Nzk2NTEwLCAtMTA2OTUwMTYzMiwgNjQzNzE3NzEzLCAtMzczODk3MzAyLCAtNzAxNTU4NjkxLCAzODAxNjA4MywgLTY2MDQ3ODMzNSwgLTQwNTUzNzg0OCwgNTY4NDQ2NDM4LCAtMTAxOTgwMzY5MCwgLTE4NzM2Mzk2MSwgMTE2MzUzMTUwMSwgLTE0NDQ2ODE0NjcsIC01MTQwMzc4NCwgMTczNTMyODQ3MywgLTE5MjY2MDc3MzQsIC0zNzg1NTgsIC0yMDIyNTc0NDYzLCAxODM5MDMwNTYyLCAtMzUzMDk1NTYsIC0xNTMwOTkyMDYwLCAxMjcyODkzMzUzLCAtMTU1NDk3NjMyLCAtMTA5NDczMDY0MCwgNjgxMjc5MTc0LCAtMzU4NTM3MjIyLCAtNzIyNTIxOTc5LCA3NjAyOTE4OSwgLTY0MDM2NDQ4NywgLTQyMTgxNTgzNSwgNTMwNzQyNTIwLCAtOTk1MzM4NjUxLCAtMTk4NjMwODQ0LCAxMTI2ODkxNDE1LCAtMTQxNjM1NDkwNSwgLTU3NDM0MDU1LCAxNzAwNDg1NTcxLCAtMTg5NDk4NjYwNiwgLTEwNTE1MjMsIC0yMDU0OTIyNzk5LCAxODczMzEzMzU5LCAtMzA2MTE3NDQsIC0xNTYwMTk4MzgwLCAxMzA5MTUxNjQ5LCAtMTQ1NTIzMDcwLCAtMTEyMDIxMDM3OSwgNzE4Nzg3MjU5LCAtMzQzNDg1NTUxXSkpOwogIH0KfTsKZnVuY3Rpb24gY2FsY3VsYXRlTUQ1KGRhdGEsIG9mZnNldCwgbGVuZ3RoKSB7CiAgbGV0IGgwID0gMTczMjU4NDE5MywKICAgIGgxID0gLTI3MTczMzg3OSwKICAgIGgyID0gLTE3MzI1ODQxOTQsCiAgICBoMyA9IDI3MTczMzg3ODsKICBjb25zdCBwYWRkZWRMZW5ndGggPSBsZW5ndGggKyA3MiAmIH42MzsKICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShwYWRkZWRMZW5ndGgpOwogIGxldCBpLCBqOwogIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgcGFkZGVkW2ldID0gZGF0YVtvZmZzZXQrK107CiAgfQogIHBhZGRlZFtpKytdID0gMHg4MDsKICBjb25zdCBuID0gcGFkZGVkTGVuZ3RoIC0gODsKICBpZiAoaSA8IG4pIHsKICAgIGkgPSBuOwogIH0KICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA8PCAzICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiA1ICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAxMyAmIDB4ZmY7CiAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMjEgJiAweGZmOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+PiAyOSAmIDB4ZmY7CiAgaSArPSAzOwogIGNvbnN0IHcgPSBuZXcgSW50MzJBcnJheSgxNik7CiAgY29uc3QgewogICAgaywKICAgIHIKICB9ID0gUEFSQU1TOwogIGZvciAoaSA9IDA7IGkgPCBwYWRkZWRMZW5ndGg7KSB7CiAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraiwgaSArPSA0KSB7CiAgICAgIHdbal0gPSBwYWRkZWRbaV0gfCBwYWRkZWRbaSArIDFdIDw8IDggfCBwYWRkZWRbaSArIDJdIDw8IDE2IHwgcGFkZGVkW2kgKyAzXSA8PCAyNDsKICAgIH0KICAgIGxldCBhID0gaDAsCiAgICAgIGIgPSBoMSwKICAgICAgYyA9IGgyLAogICAgICBkID0gaDMsCiAgICAgIGYsCiAgICAgIGc7CiAgICBmb3IgKGogPSAwOyBqIDwgNjQ7ICsraikgewogICAgICBpZiAoaiA8IDE2KSB7CiAgICAgICAgZiA9IGIgJiBjIHwgfmIgJiBkOwogICAgICAgIGcgPSBqOwogICAgICB9IGVsc2UgaWYgKGogPCAzMikgewogICAgICAgIGYgPSBkICYgYiB8IH5kICYgYzsKICAgICAgICBnID0gNSAqIGogKyAxICYgMTU7CiAgICAgIH0gZWxzZSBpZiAoaiA8IDQ4KSB7CiAgICAgICAgZiA9IGIgXiBjIF4gZDsKICAgICAgICBnID0gMyAqIGogKyA1ICYgMTU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZiA9IGMgXiAoYiB8IH5kKTsKICAgICAgICBnID0gNyAqIGogJiAxNTsKICAgICAgfQogICAgICBjb25zdCB0bXAgPSBkLAogICAgICAgIHJvdGF0ZUFyZyA9IGEgKyBmICsga1tqXSArIHdbZ10gfCAwLAogICAgICAgIHJvdGF0ZSA9IHJbal07CiAgICAgIGQgPSBjOwogICAgICBjID0gYjsKICAgICAgYiA9IGIgKyAocm90YXRlQXJnIDw8IHJvdGF0ZSB8IHJvdGF0ZUFyZyA+Pj4gMzIgLSByb3RhdGUpIHwgMDsKICAgICAgYSA9IHRtcDsKICAgIH0KICAgIGgwID0gaDAgKyBhIHwgMDsKICAgIGgxID0gaDEgKyBiIHwgMDsKICAgIGgyID0gaDIgKyBjIHwgMDsKICAgIGgzID0gaDMgKyBkIHwgMDsKICB9CiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFtoMCAmIDB4RkYsIGgwID4+IDggJiAweEZGLCBoMCA+PiAxNiAmIDB4RkYsIGgwID4+PiAyNCAmIDB4RkYsIGgxICYgMHhGRiwgaDEgPj4gOCAmIDB4RkYsIGgxID4+IDE2ICYgMHhGRiwgaDEgPj4+IDI0ICYgMHhGRiwgaDIgJiAweEZGLCBoMiA+PiA4ICYgMHhGRiwgaDIgPj4gMTYgJiAweEZGLCBoMiA+Pj4gMjQgJiAweEZGLCBoMyAmIDB4RkYsIGgzID4+IDggJiAweEZGLCBoMyA+PiAxNiAmIDB4RkYsIGgzID4+PiAyNCAmIDB4RkZdKTsKfQoKOy8vIC4vc3JjL2NvcmUvZGF0YXNldF9yZWFkZXIuanMKCgoKZnVuY3Rpb24gZGVjb2RlU3RyaW5nKHN0cikgewogIHRyeSB7CiAgICByZXR1cm4gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cik7CiAgfSBjYXRjaCAoZXgpIHsKICAgIHdhcm4oYFVURi04IGRlY29kaW5nIGZhaWxlZDogIiR7ZXh9Ii5gKTsKICAgIHJldHVybiBzdHI7CiAgfQp9CmNsYXNzIERhdGFzZXRYTUxQYXJzZXIgZXh0ZW5kcyBTaW1wbGVYTUxQYXJzZXIgewogIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIHN1cGVyKG9wdGlvbnMpOwogICAgdGhpcy5ub2RlID0gbnVsbDsKICB9CiAgb25FbmRFbGVtZW50KG5hbWUpIHsKICAgIGNvbnN0IG5vZGUgPSBzdXBlci5vbkVuZEVsZW1lbnQobmFtZSk7CiAgICBpZiAobm9kZSAmJiBuYW1lID09PSAieGZhOmRhdGFzZXRzIikgewogICAgICB0aGlzLm5vZGUgPSBub2RlOwogICAgICB0aHJvdyBuZXcgRXJyb3IoIkFib3J0aW5nIERhdGFzZXRYTUxQYXJzZXIuIik7CiAgICB9CiAgfQp9CmNsYXNzIERhdGFzZXRSZWFkZXIgewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIGlmIChkYXRhLmRhdGFzZXRzKSB7CiAgICAgIHRoaXMubm9kZSA9IG5ldyBTaW1wbGVYTUxQYXJzZXIoewogICAgICAgIGhhc0F0dHJpYnV0ZXM6IHRydWUKICAgICAgfSkucGFyc2VGcm9tU3RyaW5nKGRhdGEuZGF0YXNldHMpLmRvY3VtZW50RWxlbWVudDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBEYXRhc2V0WE1MUGFyc2VyKHsKICAgICAgICBoYXNBdHRyaWJ1dGVzOiB0cnVlCiAgICAgIH0pOwogICAgICB0cnkgewogICAgICAgIHBhcnNlci5wYXJzZUZyb21TdHJpbmcoZGF0YVsieGRwOnhkcCJdKTsKICAgICAgfSBjYXRjaCB7fQogICAgICB0aGlzLm5vZGUgPSBwYXJzZXIubm9kZTsKICAgIH0KICB9CiAgZ2V0VmFsdWUocGF0aCkgewogICAgaWYgKCF0aGlzLm5vZGUgfHwgIXBhdGgpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgY29uc3Qgbm9kZSA9IHRoaXMubm9kZS5zZWFyY2hOb2RlKHBhcnNlWEZBUGF0aChwYXRoKSwgMCk7CiAgICBpZiAoIW5vZGUpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgY29uc3QgZmlyc3QgPSBub2RlLmZpcnN0Q2hpbGQ7CiAgICBpZiAoZmlyc3Q/Lm5vZGVOYW1lID09PSAidmFsdWUiKSB7CiAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiBkZWNvZGVTdHJpbmcoY2hpbGQudGV4dENvbnRlbnQpKTsKICAgIH0KICAgIHJldHVybiBkZWNvZGVTdHJpbmcobm9kZS50ZXh0Q29udGVudCk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jYWxjdWxhdGVfc2hhX290aGVyLmpzCgpjbGFzcyBXb3JkNjQgewogIGNvbnN0cnVjdG9yKGhpZ2hJbnRlZ2VyLCBsb3dJbnRlZ2VyKSB7CiAgICB0aGlzLmhpZ2ggPSBoaWdoSW50ZWdlciB8IDA7CiAgICB0aGlzLmxvdyA9IGxvd0ludGVnZXIgfCAwOwogIH0KICBhbmQod29yZCkgewogICAgdGhpcy5oaWdoICY9IHdvcmQuaGlnaDsKICAgIHRoaXMubG93ICY9IHdvcmQubG93OwogIH0KICB4b3Iod29yZCkgewogICAgdGhpcy5oaWdoIF49IHdvcmQuaGlnaDsKICAgIHRoaXMubG93IF49IHdvcmQubG93OwogIH0KICBzaGlmdFJpZ2h0KHBsYWNlcykgewogICAgaWYgKHBsYWNlcyA+PSAzMikgewogICAgICB0aGlzLmxvdyA9IHRoaXMuaGlnaCA+Pj4gcGxhY2VzIC0gMzIgfCAwOwogICAgICB0aGlzLmhpZ2ggPSAwOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5sb3cgPSB0aGlzLmxvdyA+Pj4gcGxhY2VzIHwgdGhpcy5oaWdoIDw8IDMyIC0gcGxhY2VzOwogICAgICB0aGlzLmhpZ2ggPSB0aGlzLmhpZ2ggPj4+IHBsYWNlcyB8IDA7CiAgICB9CiAgfQogIHJvdGF0ZVJpZ2h0KHBsYWNlcykgewogICAgbGV0IGxvdywgaGlnaDsKICAgIGlmIChwbGFjZXMgJiAzMikgewogICAgICBoaWdoID0gdGhpcy5sb3c7CiAgICAgIGxvdyA9IHRoaXMuaGlnaDsKICAgIH0gZWxzZSB7CiAgICAgIGxvdyA9IHRoaXMubG93OwogICAgICBoaWdoID0gdGhpcy5oaWdoOwogICAgfQogICAgcGxhY2VzICY9IDMxOwogICAgdGhpcy5sb3cgPSBsb3cgPj4+IHBsYWNlcyB8IGhpZ2ggPDwgMzIgLSBwbGFjZXM7CiAgICB0aGlzLmhpZ2ggPSBoaWdoID4+PiBwbGFjZXMgfCBsb3cgPDwgMzIgLSBwbGFjZXM7CiAgfQogIG5vdCgpIHsKICAgIHRoaXMuaGlnaCA9IH50aGlzLmhpZ2g7CiAgICB0aGlzLmxvdyA9IH50aGlzLmxvdzsKICB9CiAgYWRkKHdvcmQpIHsKICAgIGNvbnN0IGxvd0FkZCA9ICh0aGlzLmxvdyA+Pj4gMCkgKyAod29yZC5sb3cgPj4+IDApOwogICAgbGV0IGhpZ2hBZGQgPSAodGhpcy5oaWdoID4+PiAwKSArICh3b3JkLmhpZ2ggPj4+IDApOwogICAgaWYgKGxvd0FkZCA+IDB4ZmZmZmZmZmYpIHsKICAgICAgaGlnaEFkZCArPSAxOwogICAgfQogICAgdGhpcy5sb3cgPSBsb3dBZGQgfCAwOwogICAgdGhpcy5oaWdoID0gaGlnaEFkZCB8IDA7CiAgfQogIGNvcHlUbyhieXRlcywgb2Zmc2V0KSB7CiAgICBieXRlc1tvZmZzZXRdID0gdGhpcy5oaWdoID4+PiAyNCAmIDB4ZmY7CiAgICBieXRlc1tvZmZzZXQgKyAxXSA9IHRoaXMuaGlnaCA+PiAxNiAmIDB4ZmY7CiAgICBieXRlc1tvZmZzZXQgKyAyXSA9IHRoaXMuaGlnaCA+PiA4ICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDNdID0gdGhpcy5oaWdoICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDRdID0gdGhpcy5sb3cgPj4+IDI0ICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDVdID0gdGhpcy5sb3cgPj4gMTYgJiAweGZmOwogICAgYnl0ZXNbb2Zmc2V0ICsgNl0gPSB0aGlzLmxvdyA+PiA4ICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDddID0gdGhpcy5sb3cgJiAweGZmOwogIH0KICBhc3NpZ24od29yZCkgewogICAgdGhpcy5oaWdoID0gd29yZC5oaWdoOwogICAgdGhpcy5sb3cgPSB3b3JkLmxvdzsKICB9Cn0KY29uc3QgY2FsY3VsYXRlX3NoYV9vdGhlcl9QQVJBTVMgPSB7CiAgZ2V0IGsoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJrIiwgW25ldyBXb3JkNjQoMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiksIG5ldyBXb3JkNjQoMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCksIG5ldyBXb3JkNjQoMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiksIG5ldyBXb3JkNjQoMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyksIG5ldyBXb3JkNjQoMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCksIG5ldyBXb3JkNjQoMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSksIG5ldyBXb3JkNjQoMHg5MjNmODJhNCwgMHhhZjE5NGY5YiksIG5ldyBXb3JkNjQoMHhhYjFjNWVkNSwgMHhkYTZkODExOCksIG5ldyBXb3JkNjQoMHhkODA3YWE5OCwgMHhhMzAzMDI0MiksIG5ldyBXb3JkNjQoMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSksIG5ldyBXb3JkNjQoMHgyNDMxODViZSwgMHg0ZWU0YjI4YyksIG5ldyBXb3JkNjQoMHg1NTBjN2RjMywgMHhkNWZmYjRlMiksIG5ldyBXb3JkNjQoMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiksIG5ldyBXb3JkNjQoMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSksIG5ldyBXb3JkNjQoMHg5YmRjMDZhNywgMHgyNWM3MTIzNSksIG5ldyBXb3JkNjQoMHhjMTliZjE3NCwgMHhjZjY5MjY5NCksIG5ldyBXb3JkNjQoMHhlNDliNjljMSwgMHg5ZWYxNGFkMiksIG5ldyBXb3JkNjQoMHhlZmJlNDc4NiwgMHgzODRmMjVlMyksIG5ldyBXb3JkNjQoMHgwZmMxOWRjNiwgMHg4YjhjZDViNSksIG5ldyBXb3JkNjQoMHgyNDBjYTFjYywgMHg3N2FjOWM2NSksIG5ldyBXb3JkNjQoMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSksIG5ldyBXb3JkNjQoMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyksIG5ldyBXb3JkNjQoMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCksIG5ldyBXb3JkNjQoMHg3NmY5ODhkYSwgMHg4MzExNTNiNSksIG5ldyBXb3JkNjQoMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiksIG5ldyBXb3JkNjQoMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCksIG5ldyBXb3JkNjQoMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiksIG5ldyBXb3JkNjQoMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCksIG5ldyBXb3JkNjQoMHhjNmUwMGJmMywgMHgzZGE4OGZjMiksIG5ldyBXb3JkNjQoMHhkNWE3OTE0NywgMHg5MzBhYTcyNSksIG5ldyBXb3JkNjQoMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiksIG5ldyBXb3JkNjQoMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCksIG5ldyBXb3JkNjQoMHgyN2I3MGE4NSwgMHg0NmQyMmZmYyksIG5ldyBXb3JkNjQoMHgyZTFiMjEzOCwgMHg1YzI2YzkyNiksIG5ldyBXb3JkNjQoMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCksIG5ldyBXb3JkNjQoMHg1MzM4MGQxMywgMHg5ZDk1YjNkZiksIG5ldyBXb3JkNjQoMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSksIG5ldyBXb3JkNjQoMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCksIG5ldyBXb3JkNjQoMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiksIG5ldyBXb3JkNjQoMHg5MjcyMmM4NSwgMHgxNDgyMzUzYiksIG5ldyBXb3JkNjQoMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCksIG5ldyBXb3JkNjQoMHhhODFhNjY0YiwgMHhiYzQyMzAwMSksIG5ldyBXb3JkNjQoMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSksIG5ldyBXb3JkNjQoMHhjNzZjNTFhMywgMHgwNjU0YmUzMCksIG5ldyBXb3JkNjQoMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCksIG5ldyBXb3JkNjQoMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCksIG5ldyBXb3JkNjQoMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSksIG5ldyBXb3JkNjQoMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCksIG5ldyBXb3JkNjQoMHgxOWE0YzExNiwgMHhiOGQyZDBjOCksIG5ldyBXb3JkNjQoMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyksIG5ldyBXb3JkNjQoMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSksIG5ldyBXb3JkNjQoMHgzNGIwYmNiNSwgMHhlMTliNDhhOCksIG5ldyBXb3JkNjQoMHgzOTFjMGNiMywgMHhjNWM5NWE2MyksIG5ldyBXb3JkNjQoMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYiksIG5ldyBXb3JkNjQoMHg1YjljY2E0ZiwgMHg3NzYzZTM3MyksIG5ldyBXb3JkNjQoMHg2ODJlNmZmMywgMHhkNmIyYjhhMyksIG5ldyBXb3JkNjQoMHg3NDhmODJlZSwgMHg1ZGVmYjJmYyksIG5ldyBXb3JkNjQoMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCksIG5ldyBXb3JkNjQoMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiksIG5ldyBXb3JkNjQoMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyksIG5ldyBXb3JkNjQoMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCksIG5ldyBXb3JkNjQoMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSksIG5ldyBXb3JkNjQoMHhiZWY5YTNmNywgMHhiMmM2NzkxNSksIG5ldyBXb3JkNjQoMHhjNjcxNzhmMiwgMHhlMzcyNTMyYiksIG5ldyBXb3JkNjQoMHhjYTI3M2VjZSwgMHhlYTI2NjE5YyksIG5ldyBXb3JkNjQoMHhkMTg2YjhjNywgMHgyMWMwYzIwNyksIG5ldyBXb3JkNjQoMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSksIG5ldyBXb3JkNjQoMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCksIG5ldyBXb3JkNjQoMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSksIG5ldyBXb3JkNjQoMHgwYTYzN2RjNSwgMHhhMmM4OThhNiksIG5ldyBXb3JkNjQoMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSksIG5ldyBXb3JkNjQoMHgxYjcxMGIzNSwgMHgxMzFjNDcxYiksIG5ldyBXb3JkNjQoMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCksIG5ldyBXb3JkNjQoMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyksIG5ldyBXb3JkNjQoMHgzYzllYmUwYSwgMHgxNWM5YmViYyksIG5ldyBXb3JkNjQoMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyksIG5ldyBXb3JkNjQoMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiksIG5ldyBXb3JkNjQoMHg1OTdmMjk5YywgMHhmYzY1N2UyYSksIG5ldyBXb3JkNjQoMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYyksIG5ldyBXb3JkNjQoMHg2YzQ0MTk4YywgMHg0YTQ3NTgxNyldKTsKICB9Cn07CmZ1bmN0aW9uIGNoKHJlc3VsdCwgeCwgeSwgeiwgdG1wKSB7CiAgcmVzdWx0LmFzc2lnbih4KTsKICByZXN1bHQuYW5kKHkpOwogIHRtcC5hc3NpZ24oeCk7CiAgdG1wLm5vdCgpOwogIHRtcC5hbmQoeik7CiAgcmVzdWx0Lnhvcih0bXApOwp9CmZ1bmN0aW9uIG1haihyZXN1bHQsIHgsIHksIHosIHRtcCkgewogIHJlc3VsdC5hc3NpZ24oeCk7CiAgcmVzdWx0LmFuZCh5KTsKICB0bXAuYXNzaWduKHgpOwogIHRtcC5hbmQoeik7CiAgcmVzdWx0Lnhvcih0bXApOwogIHRtcC5hc3NpZ24oeSk7CiAgdG1wLmFuZCh6KTsKICByZXN1bHQueG9yKHRtcCk7Cn0KZnVuY3Rpb24gc2lnbWEocmVzdWx0LCB4LCB0bXApIHsKICByZXN1bHQuYXNzaWduKHgpOwogIHJlc3VsdC5yb3RhdGVSaWdodCgyOCk7CiAgdG1wLmFzc2lnbih4KTsKICB0bXAucm90YXRlUmlnaHQoMzQpOwogIHJlc3VsdC54b3IodG1wKTsKICB0bXAuYXNzaWduKHgpOwogIHRtcC5yb3RhdGVSaWdodCgzOSk7CiAgcmVzdWx0Lnhvcih0bXApOwp9CmZ1bmN0aW9uIHNpZ21hUHJpbWUocmVzdWx0LCB4LCB0bXApIHsKICByZXN1bHQuYXNzaWduKHgpOwogIHJlc3VsdC5yb3RhdGVSaWdodCgxNCk7CiAgdG1wLmFzc2lnbih4KTsKICB0bXAucm90YXRlUmlnaHQoMTgpOwogIHJlc3VsdC54b3IodG1wKTsKICB0bXAuYXNzaWduKHgpOwogIHRtcC5yb3RhdGVSaWdodCg0MSk7CiAgcmVzdWx0Lnhvcih0bXApOwp9CmZ1bmN0aW9uIGxpdHRsZVNpZ21hKHJlc3VsdCwgeCwgdG1wKSB7CiAgcmVzdWx0LmFzc2lnbih4KTsKICByZXN1bHQucm90YXRlUmlnaHQoMSk7CiAgdG1wLmFzc2lnbih4KTsKICB0bXAucm90YXRlUmlnaHQoOCk7CiAgcmVzdWx0Lnhvcih0bXApOwogIHRtcC5hc3NpZ24oeCk7CiAgdG1wLnNoaWZ0UmlnaHQoNyk7CiAgcmVzdWx0Lnhvcih0bXApOwp9CmZ1bmN0aW9uIGxpdHRsZVNpZ21hUHJpbWUocmVzdWx0LCB4LCB0bXApIHsKICByZXN1bHQuYXNzaWduKHgpOwogIHJlc3VsdC5yb3RhdGVSaWdodCgxOSk7CiAgdG1wLmFzc2lnbih4KTsKICB0bXAucm90YXRlUmlnaHQoNjEpOwogIHJlc3VsdC54b3IodG1wKTsKICB0bXAuYXNzaWduKHgpOwogIHRtcC5zaGlmdFJpZ2h0KDYpOwogIHJlc3VsdC54b3IodG1wKTsKfQpmdW5jdGlvbiBjYWxjdWxhdGVTSEE1MTIoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIG1vZGUzODQgPSBmYWxzZSkgewogIGxldCBoMCwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgaDc7CiAgaWYgKCFtb2RlMzg0KSB7CiAgICBoMCA9IG5ldyBXb3JkNjQoMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCk7CiAgICBoMSA9IG5ldyBXb3JkNjQoMHhiYjY3YWU4NSwgMHg4NGNhYTczYik7CiAgICBoMiA9IG5ldyBXb3JkNjQoMHgzYzZlZjM3MiwgMHhmZTk0ZjgyYik7CiAgICBoMyA9IG5ldyBXb3JkNjQoMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSk7CiAgICBoNCA9IG5ldyBXb3JkNjQoMHg1MTBlNTI3ZiwgMHhhZGU2ODJkMSk7CiAgICBoNSA9IG5ldyBXb3JkNjQoMHg5YjA1Njg4YywgMHgyYjNlNmMxZik7CiAgICBoNiA9IG5ldyBXb3JkNjQoMHgxZjgzZDlhYiwgMHhmYjQxYmQ2Yik7CiAgICBoNyA9IG5ldyBXb3JkNjQoMHg1YmUwY2QxOSwgMHgxMzdlMjE3OSk7CiAgfSBlbHNlIHsKICAgIGgwID0gbmV3IFdvcmQ2NCgweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4KTsKICAgIGgxID0gbmV3IFdvcmQ2NCgweDYyOWEyOTJhLCAweDM2N2NkNTA3KTsKICAgIGgyID0gbmV3IFdvcmQ2NCgweDkxNTkwMTVhLCAweDMwNzBkZDE3KTsKICAgIGgzID0gbmV3IFdvcmQ2NCgweDE1MmZlY2Q4LCAweGY3MGU1OTM5KTsKICAgIGg0ID0gbmV3IFdvcmQ2NCgweDY3MzMyNjY3LCAweGZmYzAwYjMxKTsKICAgIGg1ID0gbmV3IFdvcmQ2NCgweDhlYjQ0YTg3LCAweDY4NTgxNTExKTsKICAgIGg2ID0gbmV3IFdvcmQ2NCgweGRiMGMyZTBkLCAweDY0Zjk4ZmE3KTsKICAgIGg3ID0gbmV3IFdvcmQ2NCgweDQ3YjU0ODFkLCAweGJlZmE0ZmE0KTsKICB9CiAgY29uc3QgcGFkZGVkTGVuZ3RoID0gTWF0aC5jZWlsKChsZW5ndGggKyAxNykgLyAxMjgpICogMTI4OwogIGNvbnN0IHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7CiAgbGV0IGksIGo7CiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTsKICB9CiAgcGFkZGVkW2krK10gPSAweDgwOwogIGNvbnN0IG4gPSBwYWRkZWRMZW5ndGggLSAxNjsKICBpZiAoaSA8IG4pIHsKICAgIGkgPSBuOwogIH0KICBpICs9IDExOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+PiAyOSAmIDB4ZmY7CiAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMjEgJiAweGZmOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDEzICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiA1ICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA8PCAzICYgMHhmZjsKICBjb25zdCB3ID0gbmV3IEFycmF5KDgwKTsKICBmb3IgKGkgPSAwOyBpIDwgODA7IGkrKykgewogICAgd1tpXSA9IG5ldyBXb3JkNjQoMCwgMCk7CiAgfQogIGNvbnN0IHsKICAgIGsKICB9ID0gY2FsY3VsYXRlX3NoYV9vdGhlcl9QQVJBTVM7CiAgbGV0IGEgPSBuZXcgV29yZDY0KDAsIDApLAogICAgYiA9IG5ldyBXb3JkNjQoMCwgMCksCiAgICBjID0gbmV3IFdvcmQ2NCgwLCAwKTsKICBsZXQgZCA9IG5ldyBXb3JkNjQoMCwgMCksCiAgICBlID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgIGYgPSBuZXcgV29yZDY0KDAsIDApOwogIGxldCBnID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgIGggPSBuZXcgV29yZDY0KDAsIDApOwogIGNvbnN0IHQxID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgIHQyID0gbmV3IFdvcmQ2NCgwLCAwKTsKICBjb25zdCB0bXAxID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgIHRtcDIgPSBuZXcgV29yZDY0KDAsIDApOwogIGxldCB0bXAzOwogIGZvciAoaSA9IDA7IGkgPCBwYWRkZWRMZW5ndGg7KSB7CiAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICB3W2pdLmhpZ2ggPSBwYWRkZWRbaV0gPDwgMjQgfCBwYWRkZWRbaSArIDFdIDw8IDE2IHwgcGFkZGVkW2kgKyAyXSA8PCA4IHwgcGFkZGVkW2kgKyAzXTsKICAgICAgd1tqXS5sb3cgPSBwYWRkZWRbaSArIDRdIDw8IDI0IHwgcGFkZGVkW2kgKyA1XSA8PCAxNiB8IHBhZGRlZFtpICsgNl0gPDwgOCB8IHBhZGRlZFtpICsgN107CiAgICAgIGkgKz0gODsKICAgIH0KICAgIGZvciAoaiA9IDE2OyBqIDwgODA7ICsraikgewogICAgICB0bXAzID0gd1tqXTsKICAgICAgbGl0dGxlU2lnbWFQcmltZSh0bXAzLCB3W2ogLSAyXSwgdG1wMik7CiAgICAgIHRtcDMuYWRkKHdbaiAtIDddKTsKICAgICAgbGl0dGxlU2lnbWEodG1wMSwgd1tqIC0gMTVdLCB0bXAyKTsKICAgICAgdG1wMy5hZGQodG1wMSk7CiAgICAgIHRtcDMuYWRkKHdbaiAtIDE2XSk7CiAgICB9CiAgICBhLmFzc2lnbihoMCk7CiAgICBiLmFzc2lnbihoMSk7CiAgICBjLmFzc2lnbihoMik7CiAgICBkLmFzc2lnbihoMyk7CiAgICBlLmFzc2lnbihoNCk7CiAgICBmLmFzc2lnbihoNSk7CiAgICBnLmFzc2lnbihoNik7CiAgICBoLmFzc2lnbihoNyk7CiAgICBmb3IgKGogPSAwOyBqIDwgODA7ICsraikgewogICAgICB0MS5hc3NpZ24oaCk7CiAgICAgIHNpZ21hUHJpbWUodG1wMSwgZSwgdG1wMik7CiAgICAgIHQxLmFkZCh0bXAxKTsKICAgICAgY2godG1wMSwgZSwgZiwgZywgdG1wMik7CiAgICAgIHQxLmFkZCh0bXAxKTsKICAgICAgdDEuYWRkKGtbal0pOwogICAgICB0MS5hZGQod1tqXSk7CiAgICAgIHNpZ21hKHQyLCBhLCB0bXAyKTsKICAgICAgbWFqKHRtcDEsIGEsIGIsIGMsIHRtcDIpOwogICAgICB0Mi5hZGQodG1wMSk7CiAgICAgIHRtcDMgPSBoOwogICAgICBoID0gZzsKICAgICAgZyA9IGY7CiAgICAgIGYgPSBlOwogICAgICBkLmFkZCh0MSk7CiAgICAgIGUgPSBkOwogICAgICBkID0gYzsKICAgICAgYyA9IGI7CiAgICAgIGIgPSBhOwogICAgICB0bXAzLmFzc2lnbih0MSk7CiAgICAgIHRtcDMuYWRkKHQyKTsKICAgICAgYSA9IHRtcDM7CiAgICB9CiAgICBoMC5hZGQoYSk7CiAgICBoMS5hZGQoYik7CiAgICBoMi5hZGQoYyk7CiAgICBoMy5hZGQoZCk7CiAgICBoNC5hZGQoZSk7CiAgICBoNS5hZGQoZik7CiAgICBoNi5hZGQoZyk7CiAgICBoNy5hZGQoaCk7CiAgfQogIGxldCByZXN1bHQ7CiAgaWYgKCFtb2RlMzg0KSB7CiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheSg2NCk7CiAgICBoMC5jb3B5VG8ocmVzdWx0LCAwKTsKICAgIGgxLmNvcHlUbyhyZXN1bHQsIDgpOwogICAgaDIuY29weVRvKHJlc3VsdCwgMTYpOwogICAgaDMuY29weVRvKHJlc3VsdCwgMjQpOwogICAgaDQuY29weVRvKHJlc3VsdCwgMzIpOwogICAgaDUuY29weVRvKHJlc3VsdCwgNDApOwogICAgaDYuY29weVRvKHJlc3VsdCwgNDgpOwogICAgaDcuY29weVRvKHJlc3VsdCwgNTYpOwogIH0gZWxzZSB7CiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheSg0OCk7CiAgICBoMC5jb3B5VG8ocmVzdWx0LCAwKTsKICAgIGgxLmNvcHlUbyhyZXN1bHQsIDgpOwogICAgaDIuY29weVRvKHJlc3VsdCwgMTYpOwogICAgaDMuY29weVRvKHJlc3VsdCwgMjQpOwogICAgaDQuY29weVRvKHJlc3VsdCwgMzIpOwogICAgaDUuY29weVRvKHJlc3VsdCwgNDApOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTM4NChkYXRhLCBvZmZzZXQsIGxlbmd0aCkgewogIHJldHVybiBjYWxjdWxhdGVTSEE1MTIoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIHRydWUpOwp9Cgo7Ly8gLi9zcmMvY29yZS9jYWxjdWxhdGVfc2hhMjU2LmpzCgpjb25zdCBjYWxjdWxhdGVfc2hhMjU2X1BBUkFNUyA9IHsKICBnZXQgaygpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImsiLCBbMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSwgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSwgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCwgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYywgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSwgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNywgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NywgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMywgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSwgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMywgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCwgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSwgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMywgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCwgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMl0pOwogIH0KfTsKZnVuY3Rpb24gcm90cih4LCBuKSB7CiAgcmV0dXJuIHggPj4+IG4gfCB4IDw8IDMyIC0gbjsKfQpmdW5jdGlvbiBjYWxjdWxhdGVfc2hhMjU2X2NoKHgsIHksIHopIHsKICByZXR1cm4geCAmIHkgXiB+eCAmIHo7Cn0KZnVuY3Rpb24gY2FsY3VsYXRlX3NoYTI1Nl9tYWooeCwgeSwgeikgewogIHJldHVybiB4ICYgeSBeIHggJiB6IF4geSAmIHo7Cn0KZnVuY3Rpb24gY2FsY3VsYXRlX3NoYTI1Nl9zaWdtYSh4KSB7CiAgcmV0dXJuIHJvdHIoeCwgMikgXiByb3RyKHgsIDEzKSBeIHJvdHIoeCwgMjIpOwp9CmZ1bmN0aW9uIGNhbGN1bGF0ZV9zaGEyNTZfc2lnbWFQcmltZSh4KSB7CiAgcmV0dXJuIHJvdHIoeCwgNikgXiByb3RyKHgsIDExKSBeIHJvdHIoeCwgMjUpOwp9CmZ1bmN0aW9uIGNhbGN1bGF0ZV9zaGEyNTZfbGl0dGxlU2lnbWEoeCkgewogIHJldHVybiByb3RyKHgsIDcpIF4gcm90cih4LCAxOCkgXiB4ID4+PiAzOwp9CmZ1bmN0aW9uIGNhbGN1bGF0ZV9zaGEyNTZfbGl0dGxlU2lnbWFQcmltZSh4KSB7CiAgcmV0dXJuIHJvdHIoeCwgMTcpIF4gcm90cih4LCAxOSkgXiB4ID4+PiAxMDsKfQpmdW5jdGlvbiBjYWxjdWxhdGVTSEEyNTYoZGF0YSwgb2Zmc2V0LCBsZW5ndGgpIHsKICBsZXQgaDAgPSAweDZhMDllNjY3LAogICAgaDEgPSAweGJiNjdhZTg1LAogICAgaDIgPSAweDNjNmVmMzcyLAogICAgaDMgPSAweGE1NGZmNTNhLAogICAgaDQgPSAweDUxMGU1MjdmLAogICAgaDUgPSAweDliMDU2ODhjLAogICAgaDYgPSAweDFmODNkOWFiLAogICAgaDcgPSAweDViZTBjZDE5OwogIGNvbnN0IHBhZGRlZExlbmd0aCA9IE1hdGguY2VpbCgobGVuZ3RoICsgOSkgLyA2NCkgKiA2NDsKICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShwYWRkZWRMZW5ndGgpOwogIGxldCBpLCBqOwogIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgcGFkZGVkW2ldID0gZGF0YVtvZmZzZXQrK107CiAgfQogIHBhZGRlZFtpKytdID0gMHg4MDsKICBjb25zdCBuID0gcGFkZGVkTGVuZ3RoIC0gODsKICBpZiAoaSA8IG4pIHsKICAgIGkgPSBuOwogIH0KICBpICs9IDM7CiAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4+IDI5ICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAyMSAmIDB4ZmY7CiAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMTMgJiAweGZmOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDUgJiAweGZmOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoIDw8IDMgJiAweGZmOwogIGNvbnN0IHcgPSBuZXcgVWludDMyQXJyYXkoNjQpOwogIGNvbnN0IHsKICAgIGsKICB9ID0gY2FsY3VsYXRlX3NoYTI1Nl9QQVJBTVM7CiAgZm9yIChpID0gMDsgaSA8IHBhZGRlZExlbmd0aDspIHsKICAgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CiAgICAgIHdbal0gPSBwYWRkZWRbaV0gPDwgMjQgfCBwYWRkZWRbaSArIDFdIDw8IDE2IHwgcGFkZGVkW2kgKyAyXSA8PCA4IHwgcGFkZGVkW2kgKyAzXTsKICAgICAgaSArPSA0OwogICAgfQogICAgZm9yIChqID0gMTY7IGogPCA2NDsgKytqKSB7CiAgICAgIHdbal0gPSBjYWxjdWxhdGVfc2hhMjU2X2xpdHRsZVNpZ21hUHJpbWUod1tqIC0gMl0pICsgd1tqIC0gN10gKyBjYWxjdWxhdGVfc2hhMjU2X2xpdHRsZVNpZ21hKHdbaiAtIDE1XSkgKyB3W2ogLSAxNl0gfCAwOwogICAgfQogICAgbGV0IGEgPSBoMCwKICAgICAgYiA9IGgxLAogICAgICBjID0gaDIsCiAgICAgIGQgPSBoMywKICAgICAgZSA9IGg0LAogICAgICBmID0gaDUsCiAgICAgIGcgPSBoNiwKICAgICAgaCA9IGg3LAogICAgICB0MSwKICAgICAgdDI7CiAgICBmb3IgKGogPSAwOyBqIDwgNjQ7ICsraikgewogICAgICB0MSA9IGggKyBjYWxjdWxhdGVfc2hhMjU2X3NpZ21hUHJpbWUoZSkgKyBjYWxjdWxhdGVfc2hhMjU2X2NoKGUsIGYsIGcpICsga1tqXSArIHdbal07CiAgICAgIHQyID0gY2FsY3VsYXRlX3NoYTI1Nl9zaWdtYShhKSArIGNhbGN1bGF0ZV9zaGEyNTZfbWFqKGEsIGIsIGMpOwogICAgICBoID0gZzsKICAgICAgZyA9IGY7CiAgICAgIGYgPSBlOwogICAgICBlID0gZCArIHQxIHwgMDsKICAgICAgZCA9IGM7CiAgICAgIGMgPSBiOwogICAgICBiID0gYTsKICAgICAgYSA9IHQxICsgdDIgfCAwOwogICAgfQogICAgaDAgPSBoMCArIGEgfCAwOwogICAgaDEgPSBoMSArIGIgfCAwOwogICAgaDIgPSBoMiArIGMgfCAwOwogICAgaDMgPSBoMyArIGQgfCAwOwogICAgaDQgPSBoNCArIGUgfCAwOwogICAgaDUgPSBoNSArIGYgfCAwOwogICAgaDYgPSBoNiArIGcgfCAwOwogICAgaDcgPSBoNyArIGggfCAwOwogIH0KICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoW2gwID4+IDI0ICYgMHhGRiwgaDAgPj4gMTYgJiAweEZGLCBoMCA+PiA4ICYgMHhGRiwgaDAgJiAweEZGLCBoMSA+PiAyNCAmIDB4RkYsIGgxID4+IDE2ICYgMHhGRiwgaDEgPj4gOCAmIDB4RkYsIGgxICYgMHhGRiwgaDIgPj4gMjQgJiAweEZGLCBoMiA+PiAxNiAmIDB4RkYsIGgyID4+IDggJiAweEZGLCBoMiAmIDB4RkYsIGgzID4+IDI0ICYgMHhGRiwgaDMgPj4gMTYgJiAweEZGLCBoMyA+PiA4ICYgMHhGRiwgaDMgJiAweEZGLCBoNCA+PiAyNCAmIDB4RkYsIGg0ID4+IDE2ICYgMHhGRiwgaDQgPj4gOCAmIDB4RkYsIGg0ICYgMHhGRiwgaDUgPj4gMjQgJiAweEZGLCBoNSA+PiAxNiAmIDB4RkYsIGg1ID4+IDggJiAweEZGLCBoNSAmIDB4RkYsIGg2ID4+IDI0ICYgMHhGRiwgaDYgPj4gMTYgJiAweEZGLCBoNiA+PiA4ICYgMHhGRiwgaDYgJiAweEZGLCBoNyA+PiAyNCAmIDB4RkYsIGg3ID4+IDE2ICYgMHhGRiwgaDcgPj4gOCAmIDB4RkYsIGg3ICYgMHhGRl0pOwp9Cgo7Ly8gLi9zcmMvY29yZS9kZWNyeXB0X3N0cmVhbS5qcwoKY29uc3QgY2h1bmtTaXplID0gNTEyOwpjbGFzcyBEZWNyeXB0U3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIsIG1heWJlTGVuZ3RoLCBkZWNyeXB0KSB7CiAgICBzdXBlcihtYXliZUxlbmd0aCk7CiAgICB0aGlzLnN0ciA9IHN0cjsKICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OwogICAgdGhpcy5kZWNyeXB0ID0gZGVjcnlwdDsKICAgIHRoaXMubmV4dENodW5rID0gbnVsbDsKICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgbGV0IGNodW5rOwogICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHsKICAgICAgY2h1bmsgPSB0aGlzLm5leHRDaHVuazsKICAgIH0gZWxzZSB7CiAgICAgIGNodW5rID0gdGhpcy5zdHIuZ2V0Qnl0ZXMoY2h1bmtTaXplKTsKICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7CiAgICB9CiAgICBpZiAoIWNodW5rPy5sZW5ndGgpIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLm5leHRDaHVuayA9IHRoaXMuc3RyLmdldEJ5dGVzKGNodW5rU2l6ZSk7CiAgICBjb25zdCBoYXNNb3JlRGF0YSA9IHRoaXMubmV4dENodW5rPy5sZW5ndGggPiAwOwogICAgY29uc3QgZGVjcnlwdCA9IHRoaXMuZGVjcnlwdDsKICAgIGNodW5rID0gZGVjcnlwdChjaHVuaywgIWhhc01vcmVEYXRhKTsKICAgIGNvbnN0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoLAogICAgICBuZXdMZW5ndGggPSBidWZmZXJMZW5ndGggKyBjaHVuay5sZW5ndGgsCiAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKG5ld0xlbmd0aCk7CiAgICBidWZmZXIuc2V0KGNodW5rLCBidWZmZXJMZW5ndGgpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBuZXdMZW5ndGg7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jcnlwdG8uanMKCgoKCgoKY2xhc3MgQVJDRm91ckNpcGhlciB7CiAgY29uc3RydWN0b3Ioa2V5KSB7CiAgICB0aGlzLmEgPSAwOwogICAgdGhpcy5iID0gMDsKICAgIGNvbnN0IHMgPSBuZXcgVWludDhBcnJheSgyNTYpOwogICAgY29uc3Qga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKICAgICAgc1tpXSA9IGk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCAyNTY7ICsraSkgewogICAgICBjb25zdCB0bXAgPSBzW2ldOwogICAgICBqID0gaiArIHRtcCArIGtleVtpICUga2V5TGVuZ3RoXSAmIDB4ZmY7CiAgICAgIHNbaV0gPSBzW2pdOwogICAgICBzW2pdID0gdG1wOwogICAgfQogICAgdGhpcy5zID0gczsKICB9CiAgZW5jcnlwdEJsb2NrKGRhdGEpIHsKICAgIGxldCBhID0gdGhpcy5hLAogICAgICBiID0gdGhpcy5iOwogICAgY29uc3QgcyA9IHRoaXMuczsKICAgIGNvbnN0IG4gPSBkYXRhLmxlbmd0aDsKICAgIGNvbnN0IG91dHB1dCA9IG5ldyBVaW50OEFycmF5KG4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgYSA9IGEgKyAxICYgMHhmZjsKICAgICAgY29uc3QgdG1wID0gc1thXTsKICAgICAgYiA9IGIgKyB0bXAgJiAweGZmOwogICAgICBjb25zdCB0bXAyID0gc1tiXTsKICAgICAgc1thXSA9IHRtcDI7CiAgICAgIHNbYl0gPSB0bXA7CiAgICAgIG91dHB1dFtpXSA9IGRhdGFbaV0gXiBzW3RtcCArIHRtcDIgJiAweGZmXTsKICAgIH0KICAgIHRoaXMuYSA9IGE7CiAgICB0aGlzLmIgPSBiOwogICAgcmV0dXJuIG91dHB1dDsKICB9CiAgZGVjcnlwdEJsb2NrKGRhdGEpIHsKICAgIHJldHVybiB0aGlzLmVuY3J5cHRCbG9jayhkYXRhKTsKICB9CiAgZW5jcnlwdChkYXRhKSB7CiAgICByZXR1cm4gdGhpcy5lbmNyeXB0QmxvY2soZGF0YSk7CiAgfQp9CmNsYXNzIE51bGxDaXBoZXIgewogIGRlY3J5cHRCbG9jayhkYXRhKSB7CiAgICByZXR1cm4gZGF0YTsKICB9CiAgZW5jcnlwdChkYXRhKSB7CiAgICByZXR1cm4gZGF0YTsKICB9Cn0KY2xhc3MgQUVTQmFzZUNpcGhlciB7CiAgX3MgPSBuZXcgVWludDhBcnJheShbMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwgMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwgMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwgMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwgMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywgMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwgMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwgMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwgMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwgMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCwgMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwgMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwgMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwgMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwgMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwgMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMiwgMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywgMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywgMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwgMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwgMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywgMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSwgMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwgMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwgMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwgMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwgMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwgMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSwgMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwgMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwgMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwgMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNl0pOwogIF9pbnZfcyA9IG5ldyBVaW50OEFycmF5KFsweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4LCAweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiLCAweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3LCAweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiLCAweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkLCAweGVlLCAweDRjLCAweDk1LCAweDBiLCAweDQyLCAweGZhLCAweGMzLCAweDRlLCAweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyLCAweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1LCAweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2LCAweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyLCAweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhLCAweDVlLCAweDE1LCAweDQ2LCAweDU3LCAweGE3LCAweDhkLCAweDlkLCAweDg0LCAweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhLCAweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2LCAweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyLCAweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiLCAweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhLCAweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczLCAweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1LCAweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlLCAweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5LCAweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiLCAweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwLCAweDlhLCAweGRiLCAweGMwLCAweGZlLCAweDc4LCAweGNkLCAweDVhLCAweGY0LCAweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxLCAweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmLCAweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkLCAweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmLCAweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwLCAweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxLCAweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2LCAweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkXSk7CiAgX21peCA9IG5ldyBVaW50MzJBcnJheShbMHgwMDAwMDAwMCwgMHgwZTA5MGQwYiwgMHgxYzEyMWExNiwgMHgxMjFiMTcxZCwgMHgzODI0MzQyYywgMHgzNjJkMzkyNywgMHgyNDM2MmUzYSwgMHgyYTNmMjMzMSwgMHg3MDQ4Njg1OCwgMHg3ZTQxNjU1MywgMHg2YzVhNzI0ZSwgMHg2MjUzN2Y0NSwgMHg0ODZjNWM3NCwgMHg0NjY1NTE3ZiwgMHg1NDdlNDY2MiwgMHg1YTc3NGI2OSwgMHhlMDkwZDBiMCwgMHhlZTk5ZGRiYiwgMHhmYzgyY2FhNiwgMHhmMjhiYzdhZCwgMHhkOGI0ZTQ5YywgMHhkNmJkZTk5NywgMHhjNGE2ZmU4YSwgMHhjYWFmZjM4MSwgMHg5MGQ4YjhlOCwgMHg5ZWQxYjVlMywgMHg4Y2NhYTJmZSwgMHg4MmMzYWZmNSwgMHhhOGZjOGNjNCwgMHhhNmY1ODFjZiwgMHhiNGVlOTZkMiwgMHhiYWU3OWJkOSwgMHhkYjNiYmI3YiwgMHhkNTMyYjY3MCwgMHhjNzI5YTE2ZCwgMHhjOTIwYWM2NiwgMHhlMzFmOGY1NywgMHhlZDE2ODI1YywgMHhmZjBkOTU0MSwgMHhmMTA0OTg0YSwgMHhhYjczZDMyMywgMHhhNTdhZGUyOCwgMHhiNzYxYzkzNSwgMHhiOTY4YzQzZSwgMHg5MzU3ZTcwZiwgMHg5ZDVlZWEwNCwgMHg4ZjQ1ZmQxOSwgMHg4MTRjZjAxMiwgMHgzYmFiNmJjYiwgMHgzNWEyNjZjMCwgMHgyN2I5NzFkZCwgMHgyOWIwN2NkNiwgMHgwMzhmNWZlNywgMHgwZDg2NTJlYywgMHgxZjlkNDVmMSwgMHgxMTk0NDhmYSwgMHg0YmUzMDM5MywgMHg0NWVhMGU5OCwgMHg1N2YxMTk4NSwgMHg1OWY4MTQ4ZSwgMHg3M2M3MzdiZiwgMHg3ZGNlM2FiNCwgMHg2ZmQ1MmRhOSwgMHg2MWRjMjBhMiwgMHhhZDc2NmRmNiwgMHhhMzdmNjBmZCwgMHhiMTY0NzdlMCwgMHhiZjZkN2FlYiwgMHg5NTUyNTlkYSwgMHg5YjViNTRkMSwgMHg4OTQwNDNjYywgMHg4NzQ5NGVjNywgMHhkZDNlMDVhZSwgMHhkMzM3MDhhNSwgMHhjMTJjMWZiOCwgMHhjZjI1MTJiMywgMHhlNTFhMzE4MiwgMHhlYjEzM2M4OSwgMHhmOTA4MmI5NCwgMHhmNzAxMjY5ZiwgMHg0ZGU2YmQ0NiwgMHg0M2VmYjA0ZCwgMHg1MWY0YTc1MCwgMHg1ZmZkYWE1YiwgMHg3NWMyODk2YSwgMHg3YmNiODQ2MSwgMHg2OWQwOTM3YywgMHg2N2Q5OWU3NywgMHgzZGFlZDUxZSwgMHgzM2E3ZDgxNSwgMHgyMWJjY2YwOCwgMHgyZmI1YzIwMywgMHgwNThhZTEzMiwgMHgwYjgzZWMzOSwgMHgxOTk4ZmIyNCwgMHgxNzkxZjYyZiwgMHg3NjRkZDY4ZCwgMHg3ODQ0ZGI4NiwgMHg2YTVmY2M5YiwgMHg2NDU2YzE5MCwgMHg0ZTY5ZTJhMSwgMHg0MDYwZWZhYSwgMHg1MjdiZjhiNywgMHg1YzcyZjViYywgMHgwNjA1YmVkNSwgMHgwODBjYjNkZSwgMHgxYTE3YTRjMywgMHgxNDFlYTljOCwgMHgzZTIxOGFmOSwgMHgzMDI4ODdmMiwgMHgyMjMzOTBlZiwgMHgyYzNhOWRlNCwgMHg5NmRkMDYzZCwgMHg5OGQ0MGIzNiwgMHg4YWNmMWMyYiwgMHg4NGM2MTEyMCwgMHhhZWY5MzIxMSwgMHhhMGYwM2YxYSwgMHhiMmViMjgwNywgMHhiY2UyMjUwYywgMHhlNjk1NmU2NSwgMHhlODljNjM2ZSwgMHhmYTg3NzQ3MywgMHhmNDhlNzk3OCwgMHhkZWIxNWE0OSwgMHhkMGI4NTc0MiwgMHhjMmEzNDA1ZiwgMHhjY2FhNGQ1NCwgMHg0MWVjZGFmNywgMHg0ZmU1ZDdmYywgMHg1ZGZlYzBlMSwgMHg1M2Y3Y2RlYSwgMHg3OWM4ZWVkYiwgMHg3N2MxZTNkMCwgMHg2NWRhZjRjZCwgMHg2YmQzZjljNiwgMHgzMWE0YjJhZiwgMHgzZmFkYmZhNCwgMHgyZGI2YThiOSwgMHgyM2JmYTViMiwgMHgwOTgwODY4MywgMHgwNzg5OGI4OCwgMHgxNTkyOWM5NSwgMHgxYjliOTE5ZSwgMHhhMTdjMGE0NywgMHhhZjc1MDc0YywgMHhiZDZlMTA1MSwgMHhiMzY3MWQ1YSwgMHg5OTU4M2U2YiwgMHg5NzUxMzM2MCwgMHg4NTRhMjQ3ZCwgMHg4YjQzMjk3NiwgMHhkMTM0NjIxZiwgMHhkZjNkNmYxNCwgMHhjZDI2NzgwOSwgMHhjMzJmNzUwMiwgMHhlOTEwNTYzMywgMHhlNzE5NWIzOCwgMHhmNTAyNGMyNSwgMHhmYjBiNDEyZSwgMHg5YWQ3NjE4YywgMHg5NGRlNmM4NywgMHg4NmM1N2I5YSwgMHg4OGNjNzY5MSwgMHhhMmYzNTVhMCwgMHhhY2ZhNThhYiwgMHhiZWUxNGZiNiwgMHhiMGU4NDJiZCwgMHhlYTlmMDlkNCwgMHhlNDk2MDRkZiwgMHhmNjhkMTNjMiwgMHhmODg0MWVjOSwgMHhkMmJiM2RmOCwgMHhkY2IyMzBmMywgMHhjZWE5MjdlZSwgMHhjMGEwMmFlNSwgMHg3YTQ3YjEzYywgMHg3NDRlYmMzNywgMHg2NjU1YWIyYSwgMHg2ODVjYTYyMSwgMHg0MjYzODUxMCwgMHg0YzZhODgxYiwgMHg1ZTcxOWYwNiwgMHg1MDc4OTIwZCwgMHgwYTBmZDk2NCwgMHgwNDA2ZDQ2ZiwgMHgxNjFkYzM3MiwgMHgxODE0Y2U3OSwgMHgzMjJiZWQ0OCwgMHgzYzIyZTA0MywgMHgyZTM5Zjc1ZSwgMHgyMDMwZmE1NSwgMHhlYzlhYjcwMSwgMHhlMjkzYmEwYSwgMHhmMDg4YWQxNywgMHhmZTgxYTAxYywgMHhkNGJlODMyZCwgMHhkYWI3OGUyNiwgMHhjOGFjOTkzYiwgMHhjNmE1OTQzMCwgMHg5Y2QyZGY1OSwgMHg5MmRiZDI1MiwgMHg4MGMwYzU0ZiwgMHg4ZWM5Yzg0NCwgMHhhNGY2ZWI3NSwgMHhhYWZmZTY3ZSwgMHhiOGU0ZjE2MywgMHhiNmVkZmM2OCwgMHgwYzBhNjdiMSwgMHgwMjAzNmFiYSwgMHgxMDE4N2RhNywgMHgxZTExNzBhYywgMHgzNDJlNTM5ZCwgMHgzYTI3NWU5NiwgMHgyODNjNDk4YiwgMHgyNjM1NDQ4MCwgMHg3YzQyMGZlOSwgMHg3MjRiMDJlMiwgMHg2MDUwMTVmZiwgMHg2ZTU5MThmNCwgMHg0NDY2M2JjNSwgMHg0YTZmMzZjZSwgMHg1ODc0MjFkMywgMHg1NjdkMmNkOCwgMHgzN2ExMGM3YSwgMHgzOWE4MDE3MSwgMHgyYmIzMTY2YywgMHgyNWJhMWI2NywgMHgwZjg1Mzg1NiwgMHgwMThjMzU1ZCwgMHgxMzk3MjI0MCwgMHgxZDllMmY0YiwgMHg0N2U5NjQyMiwgMHg0OWUwNjkyOSwgMHg1YmZiN2UzNCwgMHg1NWYyNzMzZiwgMHg3ZmNkNTAwZSwgMHg3MWM0NWQwNSwgMHg2M2RmNGExOCwgMHg2ZGQ2NDcxMywgMHhkNzMxZGNjYSwgMHhkOTM4ZDFjMSwgMHhjYjIzYzZkYywgMHhjNTJhY2JkNywgMHhlZjE1ZThlNiwgMHhlMTFjZTVlZCwgMHhmMzA3ZjJmMCwgMHhmZDBlZmZmYiwgMHhhNzc5YjQ5MiwgMHhhOTcwYjk5OSwgMHhiYjZiYWU4NCwgMHhiNTYyYTM4ZiwgMHg5ZjVkODBiZSwgMHg5MTU0OGRiNSwgMHg4MzRmOWFhOCwgMHg4ZDQ2OTdhM10pOwogIF9taXhDb2wgPSBuZXcgVWludDhBcnJheSgyNTYpLm1hcCgoXywgaSkgPT4gaSA8IDEyOCA/IGkgPDwgMSA6IGkgPDwgMSBeIDB4MWIpOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICB0aGlzLmJ1ZmZlclBvc2l0aW9uID0gMDsKICB9CiAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKICAgIHVucmVhY2hhYmxlKCJDYW5ub3QgY2FsbCBgX2V4cGFuZEtleWAgb24gdGhlIGJhc2UgY2xhc3MiKTsKICB9CiAgX2RlY3J5cHQoaW5wdXQsIGtleSkgewogICAgbGV0IHQsIHUsIHY7CiAgICBjb25zdCBzdGF0ZSA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgIHN0YXRlLnNldChpbnB1dCk7CiAgICBmb3IgKGxldCBqID0gMCwgayA9IHRoaXMuX2tleVNpemU7IGogPCAxNjsgKytqLCArK2spIHsKICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOwogICAgfQogICAgZm9yIChsZXQgaSA9IHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbiAtIDE7IGkgPj0gMTsgLS1pKSB7CiAgICAgIHQgPSBzdGF0ZVsxM107CiAgICAgIHN0YXRlWzEzXSA9IHN0YXRlWzldOwogICAgICBzdGF0ZVs5XSA9IHN0YXRlWzVdOwogICAgICBzdGF0ZVs1XSA9IHN0YXRlWzFdOwogICAgICBzdGF0ZVsxXSA9IHQ7CiAgICAgIHQgPSBzdGF0ZVsxNF07CiAgICAgIHUgPSBzdGF0ZVsxMF07CiAgICAgIHN0YXRlWzE0XSA9IHN0YXRlWzZdOwogICAgICBzdGF0ZVsxMF0gPSBzdGF0ZVsyXTsKICAgICAgc3RhdGVbNl0gPSB0OwogICAgICBzdGF0ZVsyXSA9IHU7CiAgICAgIHQgPSBzdGF0ZVsxNV07CiAgICAgIHUgPSBzdGF0ZVsxMV07CiAgICAgIHYgPSBzdGF0ZVs3XTsKICAgICAgc3RhdGVbMTVdID0gc3RhdGVbM107CiAgICAgIHN0YXRlWzExXSA9IHQ7CiAgICAgIHN0YXRlWzddID0gdTsKICAgICAgc3RhdGVbM10gPSB2OwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICBzdGF0ZVtqXSA9IHRoaXMuX2ludl9zW3N0YXRlW2pdXTsKICAgICAgfQogICAgICBmb3IgKGxldCBqID0gMCwgayA9IGkgKiAxNjsgaiA8IDE2OyArK2osICsraykgewogICAgICAgIHN0YXRlW2pdIF49IGtleVtrXTsKICAgICAgfQogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyBqICs9IDQpIHsKICAgICAgICBjb25zdCBzMCA9IHRoaXMuX21peFtzdGF0ZVtqXV07CiAgICAgICAgY29uc3QgczEgPSB0aGlzLl9taXhbc3RhdGVbaiArIDFdXTsKICAgICAgICBjb25zdCBzMiA9IHRoaXMuX21peFtzdGF0ZVtqICsgMl1dOwogICAgICAgIGNvbnN0IHMzID0gdGhpcy5fbWl4W3N0YXRlW2ogKyAzXV07CiAgICAgICAgdCA9IHMwIF4gczEgPj4+IDggXiBzMSA8PCAyNCBeIHMyID4+PiAxNiBeIHMyIDw8IDE2IF4gczMgPj4+IDI0IF4gczMgPDwgODsKICAgICAgICBzdGF0ZVtqXSA9IHQgPj4+IDI0ICYgMHhmZjsKICAgICAgICBzdGF0ZVtqICsgMV0gPSB0ID4+IDE2ICYgMHhmZjsKICAgICAgICBzdGF0ZVtqICsgMl0gPSB0ID4+IDggJiAweGZmOwogICAgICAgIHN0YXRlW2ogKyAzXSA9IHQgJiAweGZmOwogICAgICB9CiAgICB9CiAgICB0ID0gc3RhdGVbMTNdOwogICAgc3RhdGVbMTNdID0gc3RhdGVbOV07CiAgICBzdGF0ZVs5XSA9IHN0YXRlWzVdOwogICAgc3RhdGVbNV0gPSBzdGF0ZVsxXTsKICAgIHN0YXRlWzFdID0gdDsKICAgIHQgPSBzdGF0ZVsxNF07CiAgICB1ID0gc3RhdGVbMTBdOwogICAgc3RhdGVbMTRdID0gc3RhdGVbNl07CiAgICBzdGF0ZVsxMF0gPSBzdGF0ZVsyXTsKICAgIHN0YXRlWzZdID0gdDsKICAgIHN0YXRlWzJdID0gdTsKICAgIHQgPSBzdGF0ZVsxNV07CiAgICB1ID0gc3RhdGVbMTFdOwogICAgdiA9IHN0YXRlWzddOwogICAgc3RhdGVbMTVdID0gc3RhdGVbM107CiAgICBzdGF0ZVsxMV0gPSB0OwogICAgc3RhdGVbN10gPSB1OwogICAgc3RhdGVbM10gPSB2OwogICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7CiAgICAgIHN0YXRlW2pdID0gdGhpcy5faW52X3Nbc3RhdGVbal1dOwogICAgICBzdGF0ZVtqXSBePSBrZXlbal07CiAgICB9CiAgICByZXR1cm4gc3RhdGU7CiAgfQogIF9lbmNyeXB0KGlucHV0LCBrZXkpIHsKICAgIGNvbnN0IHMgPSB0aGlzLl9zOwogICAgbGV0IHQsIHUsIHY7CiAgICBjb25zdCBzdGF0ZSA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgIHN0YXRlLnNldChpbnB1dCk7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgc3RhdGVbal0gXj0ga2V5W2pdOwogICAgfQogICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb247IGkrKykgewogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICBzdGF0ZVtqXSA9IHNbc3RhdGVbal1dOwogICAgICB9CiAgICAgIHYgPSBzdGF0ZVsxXTsKICAgICAgc3RhdGVbMV0gPSBzdGF0ZVs1XTsKICAgICAgc3RhdGVbNV0gPSBzdGF0ZVs5XTsKICAgICAgc3RhdGVbOV0gPSBzdGF0ZVsxM107CiAgICAgIHN0YXRlWzEzXSA9IHY7CiAgICAgIHYgPSBzdGF0ZVsyXTsKICAgICAgdSA9IHN0YXRlWzZdOwogICAgICBzdGF0ZVsyXSA9IHN0YXRlWzEwXTsKICAgICAgc3RhdGVbNl0gPSBzdGF0ZVsxNF07CiAgICAgIHN0YXRlWzEwXSA9IHY7CiAgICAgIHN0YXRlWzE0XSA9IHU7CiAgICAgIHYgPSBzdGF0ZVszXTsKICAgICAgdSA9IHN0YXRlWzddOwogICAgICB0ID0gc3RhdGVbMTFdOwogICAgICBzdGF0ZVszXSA9IHN0YXRlWzE1XTsKICAgICAgc3RhdGVbN10gPSB2OwogICAgICBzdGF0ZVsxMV0gPSB1OwogICAgICBzdGF0ZVsxNV0gPSB0OwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyBqICs9IDQpIHsKICAgICAgICBjb25zdCBzMCA9IHN0YXRlW2pdOwogICAgICAgIGNvbnN0IHMxID0gc3RhdGVbaiArIDFdOwogICAgICAgIGNvbnN0IHMyID0gc3RhdGVbaiArIDJdOwogICAgICAgIGNvbnN0IHMzID0gc3RhdGVbaiArIDNdOwogICAgICAgIHQgPSBzMCBeIHMxIF4gczIgXiBzMzsKICAgICAgICBzdGF0ZVtqXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MwIF4gczFdOwogICAgICAgIHN0YXRlW2ogKyAxXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MxIF4gczJdOwogICAgICAgIHN0YXRlW2ogKyAyXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MyIF4gczNdOwogICAgICAgIHN0YXRlW2ogKyAzXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MzIF4gczBdOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwLCBrID0gaSAqIDE2OyBqIDwgMTY7ICsraiwgKytrKSB7CiAgICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOwogICAgICB9CiAgICB9CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgc3RhdGVbal0gPSBzW3N0YXRlW2pdXTsKICAgIH0KICAgIHYgPSBzdGF0ZVsxXTsKICAgIHN0YXRlWzFdID0gc3RhdGVbNV07CiAgICBzdGF0ZVs1XSA9IHN0YXRlWzldOwogICAgc3RhdGVbOV0gPSBzdGF0ZVsxM107CiAgICBzdGF0ZVsxM10gPSB2OwogICAgdiA9IHN0YXRlWzJdOwogICAgdSA9IHN0YXRlWzZdOwogICAgc3RhdGVbMl0gPSBzdGF0ZVsxMF07CiAgICBzdGF0ZVs2XSA9IHN0YXRlWzE0XTsKICAgIHN0YXRlWzEwXSA9IHY7CiAgICBzdGF0ZVsxNF0gPSB1OwogICAgdiA9IHN0YXRlWzNdOwogICAgdSA9IHN0YXRlWzddOwogICAgdCA9IHN0YXRlWzExXTsKICAgIHN0YXRlWzNdID0gc3RhdGVbMTVdOwogICAgc3RhdGVbN10gPSB2OwogICAgc3RhdGVbMTFdID0gdTsKICAgIHN0YXRlWzE1XSA9IHQ7CiAgICBmb3IgKGxldCBqID0gMCwgayA9IHRoaXMuX2tleVNpemU7IGogPCAxNjsgKytqLCArK2spIHsKICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOwogICAgfQogICAgcmV0dXJuIHN0YXRlOwogIH0KICBfZGVjcnlwdEJsb2NrMihkYXRhLCBmaW5hbGl6ZSkgewogICAgY29uc3Qgc291cmNlTGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBsZXQgYnVmZmVyID0gdGhpcy5idWZmZXIsCiAgICAgIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247CiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIGxldCBpdiA9IHRoaXMuaXY7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUxlbmd0aDsgKytpKSB7CiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGhdID0gZGF0YVtpXTsKICAgICAgKytidWZmZXJMZW5ndGg7CiAgICAgIGlmIChidWZmZXJMZW5ndGggPCAxNikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHBsYWluID0gdGhpcy5fZGVjcnlwdChidWZmZXIsIHRoaXMuX2tleSk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICAgIHBsYWluW2pdIF49IGl2W2pdOwogICAgICB9CiAgICAgIGl2ID0gYnVmZmVyOwogICAgICByZXN1bHQucHVzaChwbGFpbik7CiAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgYnVmZmVyTGVuZ3RoID0gMDsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgICB0aGlzLml2ID0gaXY7CiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7CiAgICB9CiAgICBsZXQgb3V0cHV0TGVuZ3RoID0gMTYgKiByZXN1bHQubGVuZ3RoOwogICAgaWYgKGZpbmFsaXplKSB7CiAgICAgIGNvbnN0IGxhc3RCbG9jayA9IHJlc3VsdC5hdCgtMSk7CiAgICAgIGxldCBwc0xlbiA9IGxhc3RCbG9ja1sxNV07CiAgICAgIGlmIChwc0xlbiA8PSAxNikgewogICAgICAgIGZvciAobGV0IGkgPSAxNSwgaWkgPSAxNiAtIHBzTGVuOyBpID49IGlpOyAtLWkpIHsKICAgICAgICAgIGlmIChsYXN0QmxvY2tbaV0gIT09IHBzTGVuKSB7CiAgICAgICAgICAgIHBzTGVuID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG91dHB1dExlbmd0aCAtPSBwc0xlbjsKICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID0gbGFzdEJsb2NrLnN1YmFycmF5KDAsIDE2IC0gcHNMZW4pOwogICAgICB9CiAgICB9CiAgICBjb25zdCBvdXRwdXQgPSBuZXcgVWludDhBcnJheShvdXRwdXRMZW5ndGgpOwogICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpaSA9IHJlc3VsdC5sZW5ndGg7IGkgPCBpaTsgKytpLCBqICs9IDE2KSB7CiAgICAgIG91dHB1dC5zZXQocmVzdWx0W2ldLCBqKTsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQogIGRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSwgaXYgPSBudWxsKSB7CiAgICBjb25zdCBzb3VyY2VMZW5ndGggPSBkYXRhLmxlbmd0aDsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgbGV0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247CiAgICBpZiAoaXYpIHsKICAgICAgdGhpcy5pdiA9IGl2OwogICAgfSBlbHNlIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGJ1ZmZlckxlbmd0aCA8IDE2ICYmIGkgPCBzb3VyY2VMZW5ndGg7ICsraSwgKytidWZmZXJMZW5ndGgpIHsKICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoXSA9IGRhdGFbaV07CiAgICAgIH0KICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA8IDE2KSB7CiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogICAgICB9CiAgICAgIHRoaXMuaXYgPSBidWZmZXI7CiAgICAgIGRhdGEgPSBkYXRhLnN1YmFycmF5KDE2KTsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTYpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOwogICAgdGhpcy5kZWNyeXB0QmxvY2sgPSB0aGlzLl9kZWNyeXB0QmxvY2syOwogICAgcmV0dXJuIHRoaXMuZGVjcnlwdEJsb2NrKGRhdGEsIGZpbmFsaXplKTsKICB9CiAgZW5jcnlwdChkYXRhLCBpdikgewogICAgY29uc3Qgc291cmNlTGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBsZXQgYnVmZmVyID0gdGhpcy5idWZmZXIsCiAgICAgIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247CiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIGl2IHx8PSBuZXcgVWludDhBcnJheSgxNik7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUxlbmd0aDsgKytpKSB7CiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGhdID0gZGF0YVtpXTsKICAgICAgKytidWZmZXJMZW5ndGg7CiAgICAgIGlmIChidWZmZXJMZW5ndGggPCAxNikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICAgIGJ1ZmZlcltqXSBePSBpdltqXTsKICAgICAgfQogICAgICBjb25zdCBjaXBoZXIgPSB0aGlzLl9lbmNyeXB0KGJ1ZmZlciwgdGhpcy5fa2V5KTsKICAgICAgaXYgPSBjaXBoZXI7CiAgICAgIHJlc3VsdC5wdXNoKGNpcGhlcik7CiAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgYnVmZmVyTGVuZ3RoID0gMDsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgICB0aGlzLml2ID0gaXY7CiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7CiAgICB9CiAgICBjb25zdCBvdXRwdXRMZW5ndGggPSAxNiAqIHJlc3VsdC5sZW5ndGg7CiAgICBjb25zdCBvdXRwdXQgPSBuZXcgVWludDhBcnJheShvdXRwdXRMZW5ndGgpOwogICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpaSA9IHJlc3VsdC5sZW5ndGg7IGkgPCBpaTsgKytpLCBqICs9IDE2KSB7CiAgICAgIG91dHB1dC5zZXQocmVzdWx0W2ldLCBqKTsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQp9CmNsYXNzIEFFUzEyOENpcGhlciBleHRlbmRzIEFFU0Jhc2VDaXBoZXIgewogIF9yY29uID0gbmV3IFVpbnQ4QXJyYXkoWzB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGRdKTsKICBjb25zdHJ1Y3RvcihrZXkpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24gPSAxMDsKICAgIHRoaXMuX2tleVNpemUgPSAxNjA7CiAgICB0aGlzLl9rZXkgPSB0aGlzLl9leHBhbmRLZXkoa2V5KTsKICB9CiAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKICAgIGNvbnN0IGIgPSAxNzY7CiAgICBjb25zdCBzID0gdGhpcy5fczsKICAgIGNvbnN0IHJjb24gPSB0aGlzLl9yY29uOwogICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoYik7CiAgICByZXN1bHQuc2V0KGNpcGhlcktleSk7CiAgICBmb3IgKGxldCBqID0gMTYsIGkgPSAxOyBqIDwgYjsgKytpKSB7CiAgICAgIGxldCB0MSA9IHJlc3VsdFtqIC0gM107CiAgICAgIGxldCB0MiA9IHJlc3VsdFtqIC0gMl07CiAgICAgIGxldCB0MyA9IHJlc3VsdFtqIC0gMV07CiAgICAgIGxldCB0NCA9IHJlc3VsdFtqIC0gNF07CiAgICAgIHQxID0gc1t0MV07CiAgICAgIHQyID0gc1t0Ml07CiAgICAgIHQzID0gc1t0M107CiAgICAgIHQ0ID0gc1t0NF07CiAgICAgIHQxIF49IHJjb25baV07CiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgNDsgKytuKSB7CiAgICAgICAgcmVzdWx0W2pdID0gdDEgXj0gcmVzdWx0W2ogLSAxNl07CiAgICAgICAgaisrOwogICAgICAgIHJlc3VsdFtqXSA9IHQyIF49IHJlc3VsdFtqIC0gMTZdOwogICAgICAgIGorKzsKICAgICAgICByZXN1bHRbal0gPSB0MyBePSByZXN1bHRbaiAtIDE2XTsKICAgICAgICBqKys7CiAgICAgICAgcmVzdWx0W2pdID0gdDQgXj0gcmVzdWx0W2ogLSAxNl07CiAgICAgICAgaisrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQpjbGFzcyBBRVMyNTZDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVyIHsKICBjb25zdHJ1Y3RvcihrZXkpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24gPSAxNDsKICAgIHRoaXMuX2tleVNpemUgPSAyMjQ7CiAgICB0aGlzLl9rZXkgPSB0aGlzLl9leHBhbmRLZXkoa2V5KTsKICB9CiAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKICAgIGNvbnN0IGIgPSAyNDA7CiAgICBjb25zdCBzID0gdGhpcy5fczsKICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGIpOwogICAgcmVzdWx0LnNldChjaXBoZXJLZXkpOwogICAgbGV0IHIgPSAxOwogICAgbGV0IHQxLCB0MiwgdDMsIHQ0OwogICAgZm9yIChsZXQgaiA9IDMyLCBpID0gMTsgaiA8IGI7ICsraSkgewogICAgICBpZiAoaiAlIDMyID09PSAxNikgewogICAgICAgIHQxID0gc1t0MV07CiAgICAgICAgdDIgPSBzW3QyXTsKICAgICAgICB0MyA9IHNbdDNdOwogICAgICAgIHQ0ID0gc1t0NF07CiAgICAgIH0gZWxzZSBpZiAoaiAlIDMyID09PSAwKSB7CiAgICAgICAgdDEgPSByZXN1bHRbaiAtIDNdOwogICAgICAgIHQyID0gcmVzdWx0W2ogLSAyXTsKICAgICAgICB0MyA9IHJlc3VsdFtqIC0gMV07CiAgICAgICAgdDQgPSByZXN1bHRbaiAtIDRdOwogICAgICAgIHQxID0gc1t0MV07CiAgICAgICAgdDIgPSBzW3QyXTsKICAgICAgICB0MyA9IHNbdDNdOwogICAgICAgIHQ0ID0gc1t0NF07CiAgICAgICAgdDEgXj0gcjsKICAgICAgICBpZiAoKHIgPDw9IDEpID49IDI1NikgewogICAgICAgICAgciA9IChyIF4gMHgxYikgJiAweGZmOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGxldCBuID0gMDsgbiA8IDQ7ICsrbikgewogICAgICAgIHJlc3VsdFtqXSA9IHQxIF49IHJlc3VsdFtqIC0gMzJdOwogICAgICAgIGorKzsKICAgICAgICByZXN1bHRbal0gPSB0MiBePSByZXN1bHRbaiAtIDMyXTsKICAgICAgICBqKys7CiAgICAgICAgcmVzdWx0W2pdID0gdDMgXj0gcmVzdWx0W2ogLSAzMl07CiAgICAgICAgaisrOwogICAgICAgIHJlc3VsdFtqXSA9IHQ0IF49IHJlc3VsdFtqIC0gMzJdOwogICAgICAgIGorKzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KY2xhc3MgUERGQmFzZSB7CiAgX2hhc2gocGFzc3dvcmQsIGlucHV0LCB1c2VyQnl0ZXMpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYF9oYXNoYCBjYWxsZWQiKTsKICB9CiAgY2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCB1c2VyQnl0ZXMsIG93bmVyUGFzc3dvcmQpIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgNTYpOwogICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKICAgIGhhc2hEYXRhLnNldChvd25lclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpOwogICAgaGFzaERhdGEuc2V0KHVzZXJCeXRlcywgcGFzc3dvcmQubGVuZ3RoICsgb3duZXJWYWxpZGF0aW9uU2FsdC5sZW5ndGgpOwogICAgY29uc3QgcmVzdWx0ID0gdGhpcy5faGFzaChwYXNzd29yZCwgaGFzaERhdGEsIHVzZXJCeXRlcyk7CiAgICByZXR1cm4gaXNBcnJheUVxdWFsKHJlc3VsdCwgb3duZXJQYXNzd29yZCk7CiAgfQogIGNoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCB1c2VyVmFsaWRhdGlvblNhbHQsIHVzZXJQYXNzd29yZCkgewogICAgY29uc3QgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA4KTsKICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7CiAgICBoYXNoRGF0YS5zZXQodXNlclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpOwogICAgY29uc3QgcmVzdWx0ID0gdGhpcy5faGFzaChwYXNzd29yZCwgaGFzaERhdGEsIFtdKTsKICAgIHJldHVybiBpc0FycmF5RXF1YWwocmVzdWx0LCB1c2VyUGFzc3dvcmQpOwogIH0KICBnZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1c2VyQnl0ZXMsIG93bmVyRW5jcnlwdGlvbikgewogICAgY29uc3QgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7CiAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOwogICAgaGFzaERhdGEuc2V0KG93bmVyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyS2V5U2FsdC5sZW5ndGgpOwogICAgY29uc3Qga2V5ID0gdGhpcy5faGFzaChwYXNzd29yZCwgaGFzaERhdGEsIHVzZXJCeXRlcyk7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgQUVTMjU2Q2lwaGVyKGtleSk7CiAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayhvd25lckVuY3J5cHRpb24sIGZhbHNlLCBuZXcgVWludDhBcnJheSgxNikpOwogIH0KICBnZXRVc2VyS2V5KHBhc3N3b3JkLCB1c2VyS2V5U2FsdCwgdXNlckVuY3J5cHRpb24pIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgOCk7CiAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOwogICAgaGFzaERhdGEuc2V0KHVzZXJLZXlTYWx0LCBwYXNzd29yZC5sZW5ndGgpOwogICAgY29uc3Qga2V5ID0gdGhpcy5faGFzaChwYXNzd29yZCwgaGFzaERhdGEsIFtdKTsKICAgIGNvbnN0IGNpcGhlciA9IG5ldyBBRVMyNTZDaXBoZXIoa2V5KTsKICAgIHJldHVybiBjaXBoZXIuZGVjcnlwdEJsb2NrKHVzZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTsKICB9Cn0KY2xhc3MgUERGMTcgZXh0ZW5kcyBQREZCYXNlIHsKICBfaGFzaChwYXNzd29yZCwgaW5wdXQsIHVzZXJCeXRlcykgewogICAgcmV0dXJuIGNhbGN1bGF0ZVNIQTI1NihpbnB1dCwgMCwgaW5wdXQubGVuZ3RoKTsKICB9Cn0KY2xhc3MgUERGMjAgZXh0ZW5kcyBQREZCYXNlIHsKICBfaGFzaChwYXNzd29yZCwgaW5wdXQsIHVzZXJCeXRlcykgewogICAgbGV0IGsgPSBjYWxjdWxhdGVTSEEyNTYoaW5wdXQsIDAsIGlucHV0Lmxlbmd0aCkuc3ViYXJyYXkoMCwgMzIpOwogICAgbGV0IGUgPSBbMF07CiAgICBsZXQgaSA9IDA7CiAgICB3aGlsZSAoaSA8IDY0IHx8IGUuYXQoLTEpID4gaSAtIDMyKSB7CiAgICAgIGNvbnN0IGNvbWJpbmVkTGVuZ3RoID0gcGFzc3dvcmQubGVuZ3RoICsgay5sZW5ndGggKyB1c2VyQnl0ZXMubGVuZ3RoLAogICAgICAgIGNvbWJpbmVkQXJyYXkgPSBuZXcgVWludDhBcnJheShjb21iaW5lZExlbmd0aCk7CiAgICAgIGxldCB3cml0ZU9mZnNldCA9IDA7CiAgICAgIGNvbWJpbmVkQXJyYXkuc2V0KHBhc3N3b3JkLCB3cml0ZU9mZnNldCk7CiAgICAgIHdyaXRlT2Zmc2V0ICs9IHBhc3N3b3JkLmxlbmd0aDsKICAgICAgY29tYmluZWRBcnJheS5zZXQoaywgd3JpdGVPZmZzZXQpOwogICAgICB3cml0ZU9mZnNldCArPSBrLmxlbmd0aDsKICAgICAgY29tYmluZWRBcnJheS5zZXQodXNlckJ5dGVzLCB3cml0ZU9mZnNldCk7CiAgICAgIGNvbnN0IGsxID0gbmV3IFVpbnQ4QXJyYXkoY29tYmluZWRMZW5ndGggKiA2NCk7CiAgICAgIGZvciAobGV0IGogPSAwLCBwb3MgPSAwOyBqIDwgNjQ7IGorKywgcG9zICs9IGNvbWJpbmVkTGVuZ3RoKSB7CiAgICAgICAgazEuc2V0KGNvbWJpbmVkQXJyYXksIHBvcyk7CiAgICAgIH0KICAgICAgY29uc3QgY2lwaGVyID0gbmV3IEFFUzEyOENpcGhlcihrLnN1YmFycmF5KDAsIDE2KSk7CiAgICAgIGUgPSBjaXBoZXIuZW5jcnlwdChrMSwgay5zdWJhcnJheSgxNiwgMzIpKTsKICAgICAgY29uc3QgcmVtYWluZGVyID0gTWF0aC5zdW1QcmVjaXNlKGUuc2xpY2UoMCwgMTYpKSAlIDM7CiAgICAgIGlmIChyZW1haW5kZXIgPT09IDApIHsKICAgICAgICBrID0gY2FsY3VsYXRlU0hBMjU2KGUsIDAsIGUubGVuZ3RoKTsKICAgICAgfSBlbHNlIGlmIChyZW1haW5kZXIgPT09IDEpIHsKICAgICAgICBrID0gY2FsY3VsYXRlU0hBMzg0KGUsIDAsIGUubGVuZ3RoKTsKICAgICAgfSBlbHNlIGlmIChyZW1haW5kZXIgPT09IDIpIHsKICAgICAgICBrID0gY2FsY3VsYXRlU0hBNTEyKGUsIDAsIGUubGVuZ3RoKTsKICAgICAgfQogICAgICBpKys7CiAgICB9CiAgICByZXR1cm4gay5zdWJhcnJheSgwLCAzMik7CiAgfQp9CmNsYXNzIENpcGhlclRyYW5zZm9ybSB7CiAgY29uc3RydWN0b3Ioc3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IsIHN0cmVhbUNpcGhlckNvbnN0cnVjdG9yKSB7CiAgICB0aGlzLlN0cmluZ0NpcGhlckNvbnN0cnVjdG9yID0gc3RyaW5nQ2lwaGVyQ29uc3RydWN0b3I7CiAgICB0aGlzLlN0cmVhbUNpcGhlckNvbnN0cnVjdG9yID0gc3RyZWFtQ2lwaGVyQ29uc3RydWN0b3I7CiAgfQogIGNyZWF0ZVN0cmVhbShzdHJlYW0sIGxlbmd0aCkgewogICAgY29uc3QgY2lwaGVyID0gbmV3IHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3IoKTsKICAgIHJldHVybiBuZXcgRGVjcnlwdFN0cmVhbShzdHJlYW0sIGxlbmd0aCwgZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRGVjcnlwdFN0cmVhbShkYXRhLCBmaW5hbGl6ZSkgewogICAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSk7CiAgICB9KTsKICB9CiAgZGVjcnlwdFN0cmluZyhzKSB7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcigpOwogICAgbGV0IGRhdGEgPSBzdHJpbmdUb0J5dGVzKHMpOwogICAgZGF0YSA9IGNpcGhlci5kZWNyeXB0QmxvY2soZGF0YSwgdHJ1ZSk7CiAgICByZXR1cm4gYnl0ZXNUb1N0cmluZyhkYXRhKTsKICB9CiAgZW5jcnlwdFN0cmluZyhzKSB7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcigpOwogICAgaWYgKGNpcGhlciBpbnN0YW5jZW9mIEFFU0Jhc2VDaXBoZXIpIHsKICAgICAgY29uc3Qgc3RyTGVuID0gcy5sZW5ndGg7CiAgICAgIGNvbnN0IHBhZCA9IDE2IC0gc3RyTGVuICUgMTY7CiAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShwYWQpLnJlcGVhdChwYWQpOwogICAgICBjb25zdCBpdiA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhpdik7CiAgICAgIGxldCBkYXRhID0gc3RyaW5nVG9CeXRlcyhzKTsKICAgICAgZGF0YSA9IGNpcGhlci5lbmNyeXB0KGRhdGEsIGl2KTsKICAgICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyBkYXRhLmxlbmd0aCk7CiAgICAgIGJ1Zi5zZXQoaXYpOwogICAgICBidWYuc2V0KGRhdGEsIDE2KTsKICAgICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoYnVmKTsKICAgIH0KICAgIGxldCBkYXRhID0gc3RyaW5nVG9CeXRlcyhzKTsKICAgIGRhdGEgPSBjaXBoZXIuZW5jcnlwdChkYXRhKTsKICAgIHJldHVybiBieXRlc1RvU3RyaW5nKGRhdGEpOwogIH0KfQpjbGFzcyBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5IHsKICBzdGF0aWMgZ2V0IF9kZWZhdWx0UGFzc3dvcmRCeXRlcygpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIl9kZWZhdWx0UGFzc3dvcmRCeXRlcyIsIG5ldyBVaW50OEFycmF5KFsweDI4LCAweGJmLCAweDRlLCAweDVlLCAweDRlLCAweDc1LCAweDhhLCAweDQxLCAweDY0LCAweDAwLCAweDRlLCAweDU2LCAweGZmLCAweGZhLCAweDAxLCAweDA4LCAweDJlLCAweDJlLCAweDAwLCAweGI2LCAweGQwLCAweDY4LCAweDNlLCAweDgwLCAweDJmLCAweDBjLCAweGE5LCAweGZlLCAweDY0LCAweDUzLCAweDY5LCAweDdhXSkpOwogIH0KICAjY3JlYXRlRW5jcnlwdGlvbktleTIwKHJldmlzaW9uLCBwYXNzd29yZCwgb3duZXJQYXNzd29yZCwgb3duZXJWYWxpZGF0aW9uU2FsdCwgb3duZXJLZXlTYWx0LCB1Qnl0ZXMsIHVzZXJQYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyS2V5U2FsdCwgb3duZXJFbmNyeXB0aW9uLCB1c2VyRW5jcnlwdGlvbiwgcGVybXMpIHsKICAgIGlmIChwYXNzd29yZCkgewogICAgICBjb25zdCBwYXNzd29yZExlbmd0aCA9IE1hdGgubWluKDEyNywgcGFzc3dvcmQubGVuZ3RoKTsKICAgICAgcGFzc3dvcmQgPSBwYXNzd29yZC5zdWJhcnJheSgwLCBwYXNzd29yZExlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICBwYXNzd29yZCA9IFtdOwogICAgfQogICAgY29uc3QgcGRmQWxnb3JpdGhtID0gcmV2aXNpb24gPT09IDYgPyBuZXcgUERGMjAoKSA6IG5ldyBQREYxNygpOwogICAgaWYgKHBkZkFsZ29yaXRobS5jaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyUGFzc3dvcmQpKSB7CiAgICAgIHJldHVybiBwZGZBbGdvcml0aG0uZ2V0VXNlcktleShwYXNzd29yZCwgdXNlcktleVNhbHQsIHVzZXJFbmNyeXB0aW9uKTsKICAgIH0gZWxzZSBpZiAocGFzc3dvcmQubGVuZ3RoICYmIHBkZkFsZ29yaXRobS5jaGVja093bmVyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyVmFsaWRhdGlvblNhbHQsIHVCeXRlcywgb3duZXJQYXNzd29yZCkpIHsKICAgICAgcmV0dXJuIHBkZkFsZ29yaXRobS5nZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1Qnl0ZXMsIG93bmVyRW5jcnlwdGlvbik7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgI3ByZXBhcmVLZXlEYXRhKGZpbGVJZCwgcGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHVzZXJQYXNzd29yZCwgZmxhZ3MsIHJldmlzaW9uLCBrZXlMZW5ndGgsIGVuY3J5cHRNZXRhZGF0YSkgewogICAgY29uc3QgaGFzaERhdGFTaXplID0gNDAgKyBvd25lclBhc3N3b3JkLmxlbmd0aCArIGZpbGVJZC5sZW5ndGg7CiAgICBjb25zdCBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KGhhc2hEYXRhU2l6ZSk7CiAgICBsZXQgaSA9IDAsCiAgICAgIGosCiAgICAgIG47CiAgICBpZiAocGFzc3dvcmQpIHsKICAgICAgbiA9IE1hdGgubWluKDMyLCBwYXNzd29yZC5sZW5ndGgpOwogICAgICBmb3IgKDsgaSA8IG47ICsraSkgewogICAgICAgIGhhc2hEYXRhW2ldID0gcGFzc3dvcmRbaV07CiAgICAgIH0KICAgIH0KICAgIGogPSAwOwogICAgd2hpbGUgKGkgPCAzMikgewogICAgICBoYXNoRGF0YVtpKytdID0gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeS5fZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaisrXTsKICAgIH0KICAgIGhhc2hEYXRhLnNldChvd25lclBhc3N3b3JkLCBpKTsKICAgIGkgKz0gb3duZXJQYXNzd29yZC5sZW5ndGg7CiAgICBoYXNoRGF0YVtpKytdID0gZmxhZ3MgJiAweGZmOwogICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzID4+IDggJiAweGZmOwogICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzID4+IDE2ICYgMHhmZjsKICAgIGhhc2hEYXRhW2krK10gPSBmbGFncyA+Pj4gMjQgJiAweGZmOwogICAgaGFzaERhdGEuc2V0KGZpbGVJZCwgaSk7CiAgICBpICs9IGZpbGVJZC5sZW5ndGg7CiAgICBpZiAocmV2aXNpb24gPj0gNCAmJiAhZW5jcnlwdE1ldGFkYXRhKSB7CiAgICAgIGhhc2hEYXRhLmZpbGwoMHhmZiwgaSwgaSArIDQpOwogICAgICBpICs9IDQ7CiAgICB9CiAgICBsZXQgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSk7CiAgICBjb25zdCBrZXlMZW5ndGhJbkJ5dGVzID0ga2V5TGVuZ3RoID4+IDM7CiAgICBpZiAocmV2aXNpb24gPj0gMykgewogICAgICBmb3IgKGogPSAwOyBqIDwgNTA7ICsraikgewogICAgICAgIGhhc2ggPSBjYWxjdWxhdGVNRDUoaGFzaCwgMCwga2V5TGVuZ3RoSW5CeXRlcyk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBoYXNoLnN1YmFycmF5KDAsIGtleUxlbmd0aEluQnl0ZXMpOwogICAgbGV0IGNpcGhlciwgY2hlY2tEYXRhOwogICAgaWYgKHJldmlzaW9uID49IDMpIHsKICAgICAgaSA9IDA7CiAgICAgIGhhc2hEYXRhLnNldChDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5Ll9kZWZhdWx0UGFzc3dvcmRCeXRlcywgaSk7CiAgICAgIGkgKz0gMzI7CiAgICAgIGhhc2hEYXRhLnNldChmaWxlSWQsIGkpOwogICAgICBpICs9IGZpbGVJZC5sZW5ndGg7CiAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGVuY3J5cHRpb25LZXkpOwogICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSkpOwogICAgICBuID0gZW5jcnlwdGlvbktleS5sZW5ndGg7CiAgICAgIGNvbnN0IGRlcml2ZWRLZXkgPSBuZXcgVWludDhBcnJheShuKTsKICAgICAgZm9yIChqID0gMTsgaiA8PSAxOTsgKytqKSB7CiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyArK2spIHsKICAgICAgICAgIGRlcml2ZWRLZXlba10gPSBlbmNyeXB0aW9uS2V5W2tdIF4gajsKICAgICAgICB9CiAgICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZGVyaXZlZEtleSk7CiAgICAgICAgY2hlY2tEYXRhID0gY2lwaGVyLmVuY3J5cHRCbG9jayhjaGVja0RhdGEpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjaXBoZXIgPSBuZXcgQVJDRm91ckNpcGhlcihlbmNyeXB0aW9uS2V5KTsKICAgICAgY2hlY2tEYXRhID0gY2lwaGVyLmVuY3J5cHRCbG9jayhDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5Ll9kZWZhdWx0UGFzc3dvcmRCeXRlcyk7CiAgICB9CiAgICByZXR1cm4gY2hlY2tEYXRhLmV2ZXJ5KChkYXRhLCBrKSA9PiB1c2VyUGFzc3dvcmRba10gPT09IGRhdGEpID8gZW5jcnlwdGlvbktleSA6IG51bGw7CiAgfQogICNkZWNvZGVVc2VyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHJldmlzaW9uLCBrZXlMZW5ndGgpIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMzIpOwogICAgbGV0IGkgPSAwOwogICAgY29uc3QgbiA9IE1hdGgubWluKDMyLCBwYXNzd29yZC5sZW5ndGgpOwogICAgZm9yICg7IGkgPCBuOyArK2kpIHsKICAgICAgaGFzaERhdGFbaV0gPSBwYXNzd29yZFtpXTsKICAgIH0KICAgIGxldCBqID0gMDsKICAgIHdoaWxlIChpIDwgMzIpIHsKICAgICAgaGFzaERhdGFbaSsrXSA9IENpcGhlclRyYW5zZm9ybUZhY3RvcnkuX2RlZmF1bHRQYXNzd29yZEJ5dGVzW2orK107CiAgICB9CiAgICBsZXQgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSk7CiAgICBjb25zdCBrZXlMZW5ndGhJbkJ5dGVzID0ga2V5TGVuZ3RoID4+IDM7CiAgICBpZiAocmV2aXNpb24gPj0gMykgewogICAgICBmb3IgKGogPSAwOyBqIDwgNTA7ICsraikgewogICAgICAgIGhhc2ggPSBjYWxjdWxhdGVNRDUoaGFzaCwgMCwgaGFzaC5sZW5ndGgpOwogICAgICB9CiAgICB9CiAgICBsZXQgY2lwaGVyLCB1c2VyUGFzc3dvcmQ7CiAgICBpZiAocmV2aXNpb24gPj0gMykgewogICAgICB1c2VyUGFzc3dvcmQgPSBvd25lclBhc3N3b3JkOwogICAgICBjb25zdCBkZXJpdmVkS2V5ID0gbmV3IFVpbnQ4QXJyYXkoa2V5TGVuZ3RoSW5CeXRlcyk7CiAgICAgIGZvciAoaiA9IDE5OyBqID49IDA7IGotLSkgewogICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5TGVuZ3RoSW5CeXRlczsgKytrKSB7CiAgICAgICAgICBkZXJpdmVkS2V5W2tdID0gaGFzaFtrXSBeIGo7CiAgICAgICAgfQogICAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGRlcml2ZWRLZXkpOwogICAgICAgIHVzZXJQYXNzd29yZCA9IGNpcGhlci5lbmNyeXB0QmxvY2sodXNlclBhc3N3b3JkKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoaGFzaC5zdWJhcnJheSgwLCBrZXlMZW5ndGhJbkJ5dGVzKSk7CiAgICAgIHVzZXJQYXNzd29yZCA9IGNpcGhlci5lbmNyeXB0QmxvY2sob3duZXJQYXNzd29yZCk7CiAgICB9CiAgICByZXR1cm4gdXNlclBhc3N3b3JkOwogIH0KICAjYnVpbGRPYmplY3RLZXkobnVtLCBnZW4sIGVuY3J5cHRpb25LZXksIGlzQWVzID0gZmFsc2UpIHsKICAgIGNvbnN0IG4gPSBlbmNyeXB0aW9uS2V5Lmxlbmd0aDsKICAgIGNvbnN0IGtleSA9IG5ldyBVaW50OEFycmF5KG4gKyA5KTsKICAgIGtleS5zZXQoZW5jcnlwdGlvbktleSk7CiAgICBsZXQgaSA9IG47CiAgICBrZXlbaSsrXSA9IG51bSAmIDB4ZmY7CiAgICBrZXlbaSsrXSA9IG51bSA+PiA4ICYgMHhmZjsKICAgIGtleVtpKytdID0gbnVtID4+IDE2ICYgMHhmZjsKICAgIGtleVtpKytdID0gZ2VuICYgMHhmZjsKICAgIGtleVtpKytdID0gZ2VuID4+IDggJiAweGZmOwogICAgaWYgKGlzQWVzKSB7CiAgICAgIGtleVtpKytdID0gMHg3MzsKICAgICAga2V5W2krK10gPSAweDQxOwogICAgICBrZXlbaSsrXSA9IDB4NmM7CiAgICAgIGtleVtpKytdID0gMHg1NDsKICAgIH0KICAgIGNvbnN0IGhhc2ggPSBjYWxjdWxhdGVNRDUoa2V5LCAwLCBpKTsKICAgIHJldHVybiBoYXNoLnN1YmFycmF5KDAsIE1hdGgubWluKG4gKyA1LCAxNikpOwogIH0KICAjYnVpbGRDaXBoZXJDb25zdHJ1Y3RvcihjZiwgbmFtZSwgbnVtLCBnZW4sIGtleSkgewogICAgaWYgKCEobmFtZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBjcnlwdCBmaWx0ZXIgbmFtZS4iKTsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSB0aGlzOwogICAgY29uc3QgY3J5cHRGaWx0ZXIgPSBjZi5nZXQobmFtZS5uYW1lKTsKICAgIGNvbnN0IGNmbSA9IGNyeXB0RmlsdGVyPy5nZXQoIkNGTSIpOwogICAgaWYgKCFjZm0gfHwgY2ZtLm5hbWUgPT09ICJOb25lIikgewogICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBuZXcgTnVsbENpcGhlcigpOwogICAgICB9OwogICAgfQogICAgaWYgKGNmbS5uYW1lID09PSAiVjIiKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKHNlbGYuI2J1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCBrZXksIGZhbHNlKSk7CiAgICAgIH07CiAgICB9CiAgICBpZiAoY2ZtLm5hbWUgPT09ICJBRVNWMiIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gbmV3IEFFUzEyOENpcGhlcihzZWxmLiNidWlsZE9iamVjdEtleShudW0sIGdlbiwga2V5LCB0cnVlKSk7CiAgICAgIH07CiAgICB9CiAgICBpZiAoY2ZtLm5hbWUgPT09ICJBRVNWMyIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gbmV3IEFFUzI1NkNpcGhlcihrZXkpOwogICAgICB9OwogICAgfQogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIGNyeXB0byBtZXRob2QiKTsKICB9CiAgY29uc3RydWN0b3IoZGljdCwgZmlsZUlkLCBwYXNzd29yZCkgewogICAgY29uc3QgZmlsdGVyID0gZGljdC5nZXQoIkZpbHRlciIpOwogICAgaWYgKCFpc05hbWUoZmlsdGVyLCAiU3RhbmRhcmQiKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoInVua25vd24gZW5jcnlwdGlvbiBtZXRob2QiKTsKICAgIH0KICAgIHRoaXMuZmlsdGVyTmFtZSA9IGZpbHRlci5uYW1lOwogICAgdGhpcy5kaWN0ID0gZGljdDsKICAgIGNvbnN0IGFsZ29yaXRobSA9IGRpY3QuZ2V0KCJWIik7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYWxnb3JpdGhtKSB8fCBhbGdvcml0aG0gIT09IDEgJiYgYWxnb3JpdGhtICE9PSAyICYmIGFsZ29yaXRobSAhPT0gNCAmJiBhbGdvcml0aG0gIT09IDUpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJ1bnN1cHBvcnRlZCBlbmNyeXB0aW9uIGFsZ29yaXRobSIpOwogICAgfQogICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07CiAgICBsZXQga2V5TGVuZ3RoID0gZGljdC5nZXQoIkxlbmd0aCIpOwogICAgaWYgKCFrZXlMZW5ndGgpIHsKICAgICAgaWYgKGFsZ29yaXRobSA8PSAzKSB7CiAgICAgICAga2V5TGVuZ3RoID0gNDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgY2ZEaWN0ID0gZGljdC5nZXQoIkNGIik7CiAgICAgICAgY29uc3Qgc3RyZWFtQ3J5cHRvTmFtZSA9IGRpY3QuZ2V0KCJTdG1GIik7CiAgICAgICAgaWYgKGNmRGljdCBpbnN0YW5jZW9mIERpY3QgJiYgc3RyZWFtQ3J5cHRvTmFtZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIGNmRGljdC5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOwogICAgICAgICAgY29uc3QgaGFuZGxlckRpY3QgPSBjZkRpY3QuZ2V0KHN0cmVhbUNyeXB0b05hbWUubmFtZSk7CiAgICAgICAgICBrZXlMZW5ndGggPSBoYW5kbGVyRGljdD8uZ2V0KCJMZW5ndGgiKSB8fCAxMjg7CiAgICAgICAgICBpZiAoa2V5TGVuZ3RoIDwgNDApIHsKICAgICAgICAgICAga2V5TGVuZ3RoIDw8PSAzOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGtleUxlbmd0aCkgfHwga2V5TGVuZ3RoIDwgNDAgfHwga2V5TGVuZ3RoICUgOCAhPT0gMCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQga2V5IGxlbmd0aCIpOwogICAgfQogICAgY29uc3Qgb3duZXJCeXRlcyA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIk8iKSksCiAgICAgIHVzZXJCeXRlcyA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIlUiKSk7CiAgICBjb25zdCBvd25lclBhc3N3b3JkID0gb3duZXJCeXRlcy5zdWJhcnJheSgwLCAzMik7CiAgICBjb25zdCB1c2VyUGFzc3dvcmQgPSB1c2VyQnl0ZXMuc3ViYXJyYXkoMCwgMzIpOwogICAgY29uc3QgZmxhZ3MgPSBkaWN0LmdldCgiUCIpOwogICAgY29uc3QgcmV2aXNpb24gPSBkaWN0LmdldCgiUiIpOwogICAgY29uc3QgZW5jcnlwdE1ldGFkYXRhID0gKGFsZ29yaXRobSA9PT0gNCB8fCBhbGdvcml0aG0gPT09IDUpICYmIGRpY3QuZ2V0KCJFbmNyeXB0TWV0YWRhdGEiKSAhPT0gZmFsc2U7CiAgICB0aGlzLmVuY3J5cHRNZXRhZGF0YSA9IGVuY3J5cHRNZXRhZGF0YTsKICAgIGNvbnN0IGZpbGVJZEJ5dGVzID0gc3RyaW5nVG9CeXRlcyhmaWxlSWQpOwogICAgbGV0IHBhc3N3b3JkQnl0ZXM7CiAgICBpZiAocGFzc3dvcmQpIHsKICAgICAgaWYgKHJldmlzaW9uID09PSA2KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHBhc3N3b3JkID0gdXRmOFN0cmluZ1RvU3RyaW5nKHBhc3N3b3JkKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIHdhcm4oIkNpcGhlclRyYW5zZm9ybUZhY3Rvcnk6IFVuYWJsZSB0byBjb252ZXJ0IFVURjggZW5jb2RlZCBwYXNzd29yZC4iKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcGFzc3dvcmRCeXRlcyA9IHN0cmluZ1RvQnl0ZXMocGFzc3dvcmQpOwogICAgfQogICAgbGV0IGVuY3J5cHRpb25LZXk7CiAgICBpZiAoYWxnb3JpdGhtICE9PSA1KSB7CiAgICAgIGVuY3J5cHRpb25LZXkgPSB0aGlzLiNwcmVwYXJlS2V5RGF0YShmaWxlSWRCeXRlcywgcGFzc3dvcmRCeXRlcywgb3duZXJQYXNzd29yZCwgdXNlclBhc3N3b3JkLCBmbGFncywgcmV2aXNpb24sIGtleUxlbmd0aCwgZW5jcnlwdE1ldGFkYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IG93bmVyVmFsaWRhdGlvblNhbHQgPSBvd25lckJ5dGVzLnN1YmFycmF5KDMyLCA0MCk7CiAgICAgIGNvbnN0IG93bmVyS2V5U2FsdCA9IG93bmVyQnl0ZXMuc3ViYXJyYXkoNDAsIDQ4KTsKICAgICAgY29uc3QgdUJ5dGVzID0gdXNlckJ5dGVzLnN1YmFycmF5KDAsIDQ4KTsKICAgICAgY29uc3QgdXNlclZhbGlkYXRpb25TYWx0ID0gdXNlckJ5dGVzLnN1YmFycmF5KDMyLCA0MCk7CiAgICAgIGNvbnN0IHVzZXJLZXlTYWx0ID0gdXNlckJ5dGVzLnN1YmFycmF5KDQwLCA0OCk7CiAgICAgIGNvbnN0IG93bmVyRW5jcnlwdGlvbiA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIk9FIikpOwogICAgICBjb25zdCB1c2VyRW5jcnlwdGlvbiA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIlVFIikpOwogICAgICBjb25zdCBwZXJtcyA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIlBlcm1zIikpOwogICAgICBlbmNyeXB0aW9uS2V5ID0gdGhpcy4jY3JlYXRlRW5jcnlwdGlvbktleTIwKHJldmlzaW9uLCBwYXNzd29yZEJ5dGVzLCBvd25lclBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCBvd25lcktleVNhbHQsIHVCeXRlcywgdXNlclBhc3N3b3JkLCB1c2VyVmFsaWRhdGlvblNhbHQsIHVzZXJLZXlTYWx0LCBvd25lckVuY3J5cHRpb24sIHVzZXJFbmNyeXB0aW9uLCBwZXJtcyk7CiAgICB9CiAgICBpZiAoIWVuY3J5cHRpb25LZXkpIHsKICAgICAgaWYgKCFwYXNzd29yZCkgewogICAgICAgIHRocm93IG5ldyBQYXNzd29yZEV4Y2VwdGlvbigiTm8gcGFzc3dvcmQgZ2l2ZW4iLCBQYXNzd29yZFJlc3BvbnNlcy5ORUVEX1BBU1NXT1JEKTsKICAgICAgfQogICAgICBjb25zdCBkZWNvZGVkUGFzc3dvcmQgPSB0aGlzLiNkZWNvZGVVc2VyUGFzc3dvcmQocGFzc3dvcmRCeXRlcywgb3duZXJQYXNzd29yZCwgcmV2aXNpb24sIGtleUxlbmd0aCk7CiAgICAgIGVuY3J5cHRpb25LZXkgPSB0aGlzLiNwcmVwYXJlS2V5RGF0YShmaWxlSWRCeXRlcywgZGVjb2RlZFBhc3N3b3JkLCBvd25lclBhc3N3b3JkLCB1c2VyUGFzc3dvcmQsIGZsYWdzLCByZXZpc2lvbiwga2V5TGVuZ3RoLCBlbmNyeXB0TWV0YWRhdGEpOwogICAgfQogICAgaWYgKCFlbmNyeXB0aW9uS2V5KSB7CiAgICAgIHRocm93IG5ldyBQYXNzd29yZEV4Y2VwdGlvbigiSW5jb3JyZWN0IFBhc3N3b3JkIiwgUGFzc3dvcmRSZXNwb25zZXMuSU5DT1JSRUNUX1BBU1NXT1JEKTsKICAgIH0KICAgIGlmIChhbGdvcml0aG0gPT09IDQgJiYgZW5jcnlwdGlvbktleS5sZW5ndGggPCAxNikgewogICAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgIHRoaXMuZW5jcnlwdGlvbktleS5zZXQoZW5jcnlwdGlvbktleSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5OwogICAgfQogICAgaWYgKGFsZ29yaXRobSA+PSA0KSB7CiAgICAgIGNvbnN0IGNmID0gZGljdC5nZXQoIkNGIik7CiAgICAgIGlmIChjZiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBjZi5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOwogICAgICB9CiAgICAgIHRoaXMuY2YgPSBjZjsKICAgICAgdGhpcy5zdG1mID0gZGljdC5nZXQoIlN0bUYiKSB8fCBOYW1lLmdldCgiSWRlbnRpdHkiKTsKICAgICAgdGhpcy5zdHJmID0gZGljdC5nZXQoIlN0ckYiKSB8fCBOYW1lLmdldCgiSWRlbnRpdHkiKTsKICAgICAgdGhpcy5lZmYgPSBkaWN0LmdldCgiRUZGIikgfHwgdGhpcy5zdG1mOwogICAgfQogIH0KICBjcmVhdGVDaXBoZXJUcmFuc2Zvcm0obnVtLCBnZW4pIHsKICAgIGlmICh0aGlzLmFsZ29yaXRobSA9PT0gNCB8fCB0aGlzLmFsZ29yaXRobSA9PT0gNSkgewogICAgICByZXR1cm4gbmV3IENpcGhlclRyYW5zZm9ybSh0aGlzLiNidWlsZENpcGhlckNvbnN0cnVjdG9yKHRoaXMuY2YsIHRoaXMuc3RyZiwgbnVtLCBnZW4sIHRoaXMuZW5jcnlwdGlvbktleSksIHRoaXMuI2J1aWxkQ2lwaGVyQ29uc3RydWN0b3IodGhpcy5jZiwgdGhpcy5zdG1mLCBudW0sIGdlbiwgdGhpcy5lbmNyeXB0aW9uS2V5KSk7CiAgICB9CiAgICBjb25zdCBrZXkgPSB0aGlzLiNidWlsZE9iamVjdEtleShudW0sIGdlbiwgdGhpcy5lbmNyeXB0aW9uS2V5LCBmYWxzZSk7CiAgICBjb25zdCBjaXBoZXJDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKGtleSk7CiAgICB9OwogICAgcmV0dXJuIG5ldyBDaXBoZXJUcmFuc2Zvcm0oY2lwaGVyQ29uc3RydWN0b3IsIGNpcGhlckNvbnN0cnVjdG9yKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hyZWYuanMKCgoKCgoKY2xhc3MgWFJlZiB7CiAgI2ZpcnN0WFJlZlN0bVBvcyA9IG51bGw7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCBwZGZNYW5hZ2VyKSB7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7CiAgICB0aGlzLmVudHJpZXMgPSBbXTsKICAgIHRoaXMuX3hyZWZTdG1zID0gbmV3IFNldCgpOwogICAgdGhpcy5fY2FjaGVNYXAgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9wZW5kaW5nUmVmcyA9IG5ldyBSZWZTZXQoKTsKICAgIHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0gPSBudWxsOwogICAgdGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtID0gbnVsbDsKICAgIHRoaXMuX3BlcnNpc3RlbnRSZWZzQ2FjaGUgPSBudWxsOwogIH0KICBnZXROZXdQZXJzaXN0ZW50UmVmKG9iaikgewogICAgaWYgKHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0gPT09IG51bGwpIHsKICAgICAgdGhpcy5fbmV3UGVyc2lzdGVudFJlZk51bSA9IHRoaXMuZW50cmllcy5sZW5ndGggfHwgMTsKICAgIH0KICAgIGNvbnN0IG51bSA9IHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0rKzsKICAgIHRoaXMuX2NhY2hlTWFwLnNldChudW0sIG9iaik7CiAgICByZXR1cm4gUmVmLmdldChudW0sIDApOwogIH0KICBnZXROZXdUZW1wb3JhcnlSZWYoKSB7CiAgICBpZiAodGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtID09PSBudWxsKSB7CiAgICAgIHRoaXMuX25ld1RlbXBvcmFyeVJlZk51bSA9IHRoaXMuZW50cmllcy5sZW5ndGggfHwgMTsKICAgICAgaWYgKHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0pIHsKICAgICAgICB0aGlzLl9wZXJzaXN0ZW50UmVmc0NhY2hlID0gbmV3IE1hcCgpOwogICAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW07IGkgPCB0aGlzLl9uZXdQZXJzaXN0ZW50UmVmTnVtOyBpKyspIHsKICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbnRSZWZzQ2FjaGUuc2V0KGksIHRoaXMuX2NhY2hlTWFwLmdldChpKSk7CiAgICAgICAgICB0aGlzLl9jYWNoZU1hcC5kZWxldGUoaSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gUmVmLmdldCh0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW0rKywgMCk7CiAgfQogIHJlc2V0TmV3VGVtcG9yYXJ5UmVmKCkgewogICAgdGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtID0gbnVsbDsKICAgIGlmICh0aGlzLl9wZXJzaXN0ZW50UmVmc0NhY2hlKSB7CiAgICAgIGZvciAoY29uc3QgW251bSwgb2JqXSBvZiB0aGlzLl9wZXJzaXN0ZW50UmVmc0NhY2hlKSB7CiAgICAgICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgb2JqKTsKICAgICAgfQogICAgfQogICAgdGhpcy5fcGVyc2lzdGVudFJlZnNDYWNoZSA9IG51bGw7CiAgfQogIHNldFN0YXJ0WFJlZihzdGFydFhSZWYpIHsKICAgIHRoaXMuc3RhcnRYUmVmUXVldWUgPSBbc3RhcnRYUmVmXTsKICB9CiAgcGFyc2UocmVjb3ZlcnlNb2RlID0gZmFsc2UpIHsKICAgIGxldCB0cmFpbGVyRGljdDsKICAgIGlmICghcmVjb3ZlcnlNb2RlKSB7CiAgICAgIHRyYWlsZXJEaWN0ID0gdGhpcy5yZWFkWFJlZigpOwogICAgfSBlbHNlIHsKICAgICAgd2FybigiSW5kZXhpbmcgYWxsIFBERiBvYmplY3RzIik7CiAgICAgIHRyYWlsZXJEaWN0ID0gdGhpcy5pbmRleE9iamVjdHMoKTsKICAgIH0KICAgIHRyYWlsZXJEaWN0LmFzc2lnblhyZWYodGhpcyk7CiAgICB0aGlzLnRyYWlsZXIgPSB0cmFpbGVyRGljdDsKICAgIGxldCBlbmNyeXB0OwogICAgdHJ5IHsKICAgICAgZW5jcnlwdCA9IHRyYWlsZXJEaWN0LmdldCgiRW5jcnlwdCIpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKGBYUmVmLnBhcnNlIC0gSW52YWxpZCAiRW5jcnlwdCIgcmVmZXJlbmNlOiAiJHtleH0iLmApOwogICAgfQogICAgaWYgKGVuY3J5cHQgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGNvbnN0IGlkcyA9IHRyYWlsZXJEaWN0LmdldCgiSUQiKTsKICAgICAgY29uc3QgZmlsZUlkID0gaWRzPy5sZW5ndGggPyBpZHNbMF0gOiAiIjsKICAgICAgZW5jcnlwdC5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOwogICAgICB0aGlzLmVuY3J5cHQgPSBuZXcgQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeShlbmNyeXB0LCBmaWxlSWQsIHRoaXMucGRmTWFuYWdlci5wYXNzd29yZCk7CiAgICB9CiAgICBsZXQgcm9vdDsKICAgIHRyeSB7CiAgICAgIHJvb3QgPSB0cmFpbGVyRGljdC5nZXQoIlJvb3QiKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihgWFJlZi5wYXJzZSAtIEludmFsaWQgIlJvb3QiIHJlZmVyZW5jZTogIiR7ZXh9Ii5gKTsKICAgIH0KICAgIGlmIChyb290IGluc3RhbmNlb2YgRGljdCkgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IHBhZ2VzID0gcm9vdC5nZXQoIlBhZ2VzIik7CiAgICAgICAgaWYgKHBhZ2VzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICAgIHRocm93IGV4OwogICAgICAgIH0KICAgICAgICB3YXJuKGBYUmVmLnBhcnNlIC0gSW52YWxpZCAiUGFnZXMiIHJlZmVyZW5jZTogIiR7ZXh9Ii5gKTsKICAgICAgfQogICAgfQogICAgaWYgKCFyZWNvdmVyeU1vZGUpIHsKICAgICAgdGhyb3cgbmV3IFhSZWZQYXJzZUV4Y2VwdGlvbigpOwogICAgfQogICAgdGhyb3cgbmV3IEludmFsaWRQREZFeGNlcHRpb24oIkludmFsaWQgUm9vdCByZWZlcmVuY2UuIik7CiAgfQogIHByb2Nlc3NYUmVmVGFibGUocGFyc2VyKSB7CiAgICBpZiAoISgidGFibGVTdGF0ZSIgaW4gdGhpcykpIHsKICAgICAgdGhpcy50YWJsZVN0YXRlID0gewogICAgICAgIGVudHJ5TnVtOiAwLAogICAgICAgIHN0cmVhbVBvczogcGFyc2VyLmxleGVyLnN0cmVhbS5wb3MsCiAgICAgICAgcGFyc2VyQnVmMTogcGFyc2VyLmJ1ZjEsCiAgICAgICAgcGFyc2VyQnVmMjogcGFyc2VyLmJ1ZjIKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IG9iaiA9IHRoaXMucmVhZFhSZWZUYWJsZShwYXJzZXIpOwogICAgaWYgKCFpc0NtZChvYmosICJ0cmFpbGVyIikpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBmaW5kIHRyYWlsZXIgZGljdGlvbmFyeSIpOwogICAgfQogICAgbGV0IGRpY3QgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkgJiYgZGljdC5kaWN0KSB7CiAgICAgIGRpY3QgPSBkaWN0LmRpY3Q7CiAgICB9CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBwYXJzZSB0cmFpbGVyIGRpY3Rpb25hcnkiKTsKICAgIH0KICAgIGRlbGV0ZSB0aGlzLnRhYmxlU3RhdGU7CiAgICByZXR1cm4gZGljdDsKICB9CiAgcmVhZFhSZWZUYWJsZShwYXJzZXIpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHBhcnNlci5sZXhlci5zdHJlYW07CiAgICBjb25zdCB0YWJsZVN0YXRlID0gdGhpcy50YWJsZVN0YXRlOwogICAgc3RyZWFtLnBvcyA9IHRhYmxlU3RhdGUuc3RyZWFtUG9zOwogICAgcGFyc2VyLmJ1ZjEgPSB0YWJsZVN0YXRlLnBhcnNlckJ1ZjE7CiAgICBwYXJzZXIuYnVmMiA9IHRhYmxlU3RhdGUucGFyc2VyQnVmMjsKICAgIGxldCBvYmo7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoISgiZmlyc3RFbnRyeU51bSIgaW4gdGFibGVTdGF0ZSkgfHwgISgiZW50cnlDb3VudCIgaW4gdGFibGVTdGF0ZSkpIHsKICAgICAgICBpZiAoaXNDbWQob2JqID0gcGFyc2VyLmdldE9iaigpLCAidHJhaWxlciIpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgdGFibGVTdGF0ZS5maXJzdEVudHJ5TnVtID0gb2JqOwogICAgICAgIHRhYmxlU3RhdGUuZW50cnlDb3VudCA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgfQogICAgICBsZXQgZmlyc3QgPSB0YWJsZVN0YXRlLmZpcnN0RW50cnlOdW07CiAgICAgIGNvbnN0IGNvdW50ID0gdGFibGVTdGF0ZS5lbnRyeUNvdW50OwogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZmlyc3QpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGNvdW50KSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiB3cm9uZyB0eXBlcyBpbiBzdWJzZWN0aW9uIGhlYWRlciIpOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSB0YWJsZVN0YXRlLmVudHJ5TnVtOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIHRhYmxlU3RhdGUuc3RyZWFtUG9zID0gc3RyZWFtLnBvczsKICAgICAgICB0YWJsZVN0YXRlLmVudHJ5TnVtID0gaTsKICAgICAgICB0YWJsZVN0YXRlLnBhcnNlckJ1ZjEgPSBwYXJzZXIuYnVmMTsKICAgICAgICB0YWJsZVN0YXRlLnBhcnNlckJ1ZjIgPSBwYXJzZXIuYnVmMjsKICAgICAgICBjb25zdCBlbnRyeSA9IHt9OwogICAgICAgIGVudHJ5Lm9mZnNldCA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgICBlbnRyeS5nZW4gPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICAgICAgY29uc3QgdHlwZSA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIENtZCkgewogICAgICAgICAgc3dpdGNoICh0eXBlLmNtZCkgewogICAgICAgICAgICBjYXNlICJmIjoKICAgICAgICAgICAgICBlbnRyeS5mcmVlID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAibiI6CiAgICAgICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGVudHJ5Lm9mZnNldCkgfHwgIU51bWJlci5pc0ludGVnZXIoZW50cnkuZ2VuKSB8fCAhKGVudHJ5LmZyZWUgfHwgZW50cnkudW5jb21wcmVzc2VkKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGVudHJ5IGluIFhSZWYgc3Vic2VjdGlvbjogJHtmaXJzdH0sICR7Y291bnR9YCk7CiAgICAgICAgfQogICAgICAgIGlmIChpID09PSAwICYmIGVudHJ5LmZyZWUgJiYgZmlyc3QgPT09IDEpIHsKICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXNbaSArIGZpcnN0XSkgewogICAgICAgICAgdGhpcy5lbnRyaWVzW2kgKyBmaXJzdF0gPSBlbnRyeTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGFibGVTdGF0ZS5lbnRyeU51bSA9IDA7CiAgICAgIHRhYmxlU3RhdGUuc3RyZWFtUG9zID0gc3RyZWFtLnBvczsKICAgICAgdGFibGVTdGF0ZS5wYXJzZXJCdWYxID0gcGFyc2VyLmJ1ZjE7CiAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMiA9IHBhcnNlci5idWYyOwogICAgICBkZWxldGUgdGFibGVTdGF0ZS5maXJzdEVudHJ5TnVtOwogICAgICBkZWxldGUgdGFibGVTdGF0ZS5lbnRyeUNvdW50OwogICAgfQogICAgaWYgKHRoaXMuZW50cmllc1swXSAmJiAhdGhpcy5lbnRyaWVzWzBdLmZyZWUpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHVuZXhwZWN0ZWQgZmlyc3Qgb2JqZWN0Iik7CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0KICBwcm9jZXNzWFJlZlN0cmVhbShzdHJlYW0pIHsKICAgIGlmICghKCJzdHJlYW1TdGF0ZSIgaW4gdGhpcykpIHsKICAgICAgY29uc3QgewogICAgICAgIGRpY3QsCiAgICAgICAgcG9zCiAgICAgIH0gPSBzdHJlYW07CiAgICAgIGNvbnN0IGJ5dGVXaWR0aHMgPSBkaWN0LmdldCgiVyIpOwogICAgICBjb25zdCByYW5nZSA9IGRpY3QuZ2V0KCJJbmRleCIpIHx8IFswLCBkaWN0LmdldCgiU2l6ZSIpXTsKICAgICAgdGhpcy5zdHJlYW1TdGF0ZSA9IHsKICAgICAgICBlbnRyeVJhbmdlczogcmFuZ2UsCiAgICAgICAgYnl0ZVdpZHRocywKICAgICAgICBlbnRyeU51bTogMCwKICAgICAgICBzdHJlYW1Qb3M6IHBvcwogICAgICB9OwogICAgfQogICAgdGhpcy5yZWFkWFJlZlN0cmVhbShzdHJlYW0pOwogICAgZGVsZXRlIHRoaXMuc3RyZWFtU3RhdGU7CiAgICByZXR1cm4gc3RyZWFtLmRpY3Q7CiAgfQogIHJlYWRYUmVmU3RyZWFtKHN0cmVhbSkgewogICAgY29uc3Qgc3RyZWFtU3RhdGUgPSB0aGlzLnN0cmVhbVN0YXRlOwogICAgc3RyZWFtLnBvcyA9IHN0cmVhbVN0YXRlLnN0cmVhbVBvczsKICAgIGNvbnN0IFt0eXBlRmllbGRXaWR0aCwgb2Zmc2V0RmllbGRXaWR0aCwgZ2VuZXJhdGlvbkZpZWxkV2lkdGhdID0gc3RyZWFtU3RhdGUuYnl0ZVdpZHRoczsKICAgIGNvbnN0IGVudHJ5UmFuZ2VzID0gc3RyZWFtU3RhdGUuZW50cnlSYW5nZXM7CiAgICB3aGlsZSAoZW50cnlSYW5nZXMubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBbZmlyc3QsIG5dID0gZW50cnlSYW5nZXM7CiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmaXJzdCkgfHwgIU51bWJlci5pc0ludGVnZXIobikpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiByYW5nZSBmaWVsZHM6ICR7Zmlyc3R9LCAke259YCk7CiAgICAgIH0KICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHR5cGVGaWVsZFdpZHRoKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihvZmZzZXRGaWVsZFdpZHRoKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihnZW5lcmF0aW9uRmllbGRXaWR0aCkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiBlbnRyeSBmaWVsZHMgbGVuZ3RoOiAke2ZpcnN0fSwgJHtufWApOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSBzdHJlYW1TdGF0ZS5lbnRyeU51bTsgaSA8IG47ICsraSkgewogICAgICAgIHN0cmVhbVN0YXRlLmVudHJ5TnVtID0gaTsKICAgICAgICBzdHJlYW1TdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOwogICAgICAgIGxldCB0eXBlID0gMCwKICAgICAgICAgIG9mZnNldCA9IDAsCiAgICAgICAgICBnZW5lcmF0aW9uID0gMDsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHR5cGVGaWVsZFdpZHRoOyArK2opIHsKICAgICAgICAgIGNvbnN0IHR5cGVCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICAgIGlmICh0eXBlQnl0ZSA9PT0gLTEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgYnl0ZVdpZHRocyAndHlwZScuIik7CiAgICAgICAgICB9CiAgICAgICAgICB0eXBlID0gdHlwZSA8PCA4IHwgdHlwZUJ5dGU7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlRmllbGRXaWR0aCA9PT0gMCkgewogICAgICAgICAgdHlwZSA9IDE7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb2Zmc2V0RmllbGRXaWR0aDsgKytqKSB7CiAgICAgICAgICBjb25zdCBvZmZzZXRCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICAgIGlmIChvZmZzZXRCeXRlID09PSAtMSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBieXRlV2lkdGhzICdvZmZzZXQnLiIpOwogICAgICAgICAgfQogICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IDw8IDggfCBvZmZzZXRCeXRlOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGdlbmVyYXRpb25GaWVsZFdpZHRoOyArK2opIHsKICAgICAgICAgIGNvbnN0IGdlbmVyYXRpb25CeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICAgIGlmIChnZW5lcmF0aW9uQnl0ZSA9PT0gLTEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgYnl0ZVdpZHRocyAnZ2VuZXJhdGlvbicuIik7CiAgICAgICAgICB9CiAgICAgICAgICBnZW5lcmF0aW9uID0gZ2VuZXJhdGlvbiA8PCA4IHwgZ2VuZXJhdGlvbkJ5dGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVudHJ5ID0ge307CiAgICAgICAgZW50cnkub2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgIGVudHJ5LmdlbiA9IGdlbmVyYXRpb247CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGVudHJ5LmZyZWUgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIFhSZWYgZW50cnkgdHlwZTogJHt0eXBlfWApOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuZW50cmllc1tmaXJzdCArIGldKSB7CiAgICAgICAgICB0aGlzLmVudHJpZXNbZmlyc3QgKyBpXSA9IGVudHJ5OwogICAgICAgIH0KICAgICAgfQogICAgICBzdHJlYW1TdGF0ZS5lbnRyeU51bSA9IDA7CiAgICAgIHN0cmVhbVN0YXRlLnN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7CiAgICAgIGVudHJ5UmFuZ2VzLnNwbGljZSgwLCAyKTsKICAgIH0KICB9CiAgaW5kZXhPYmplY3RzKCkgewogICAgY29uc3QgVEFCID0gMHg5LAogICAgICBMRiA9IDB4YSwKICAgICAgQ1IgPSAweGQsCiAgICAgIFNQQUNFID0gMHgyMDsKICAgIGNvbnN0IFBFUkNFTlQgPSAweDI1LAogICAgICBMVCA9IDB4M2M7CiAgICBmdW5jdGlvbiByZWFkVG9rZW4oZGF0YSwgb2Zmc2V0KSB7CiAgICAgIGxldCB0b2tlbiA9ICIiLAogICAgICAgIGNoID0gZGF0YVtvZmZzZXRdOwogICAgICB3aGlsZSAoY2ggIT09IExGICYmIGNoICE9PSBDUiAmJiBjaCAhPT0gTFQpIHsKICAgICAgICBpZiAoKytvZmZzZXQgPj0gZGF0YS5sZW5ndGgpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0b2tlbiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgICAgICBjaCA9IGRhdGFbb2Zmc2V0XTsKICAgICAgfQogICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgICBmdW5jdGlvbiBza2lwVW50aWwoZGF0YSwgb2Zmc2V0LCB3aGF0KSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IHdoYXQubGVuZ3RoLAogICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsKICAgICAgbGV0IHNraXBwZWQgPSAwOwogICAgICB3aGlsZSAob2Zmc2V0IDwgZGF0YUxlbmd0aCkgewogICAgICAgIGxldCBpID0gMDsKICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aCAmJiBkYXRhW29mZnNldCArIGldID09PSB3aGF0W2ldKSB7CiAgICAgICAgICArK2k7CiAgICAgICAgfQogICAgICAgIGlmIChpID49IGxlbmd0aCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG9mZnNldCsrOwogICAgICAgIHNraXBwZWQrKzsKICAgICAgfQogICAgICByZXR1cm4gc2tpcHBlZDsKICAgIH0KICAgIGNvbnN0IGdFbmRvYmpSZWdFeHAgPSAvXGIoZW5kb2JqfFxkK1xzK1xkK1xzK29ianx4cmVmfHRyYWlsZXJccyo8PClcYi9nOwogICAgY29uc3QgZ1N0YXJ0eHJlZlJlZ0V4cCA9IC9cYihzdGFydHhyZWZ8XGQrXHMrXGQrXHMrb2JqKVxiL2c7CiAgICBjb25zdCBvYmpSZWdFeHAgPSAvXihcZCspXHMrKFxkKylccytvYmpcYi87CiAgICBjb25zdCB0cmFpbGVyQnl0ZXMgPSBuZXcgVWludDhBcnJheShbMTE2LCAxMTQsIDk3LCAxMDUsIDEwOCwgMTAxLCAxMTRdKTsKICAgIGNvbnN0IHN0YXJ0eHJlZkJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzExNSwgMTE2LCA5NywgMTE0LCAxMTYsIDEyMCwgMTE0LCAxMDEsIDEwMl0pOwogICAgY29uc3QgeHJlZkJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzQ3LCA4OCwgODIsIDEwMSwgMTAyXSk7CiAgICB0aGlzLmVudHJpZXMubGVuZ3RoID0gMDsKICAgIHRoaXMuX2NhY2hlTWFwLmNsZWFyKCk7CiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbTsKICAgIHN0cmVhbS5wb3MgPSAwOwogICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLmdldEJ5dGVzKCksCiAgICAgIGJ1ZmZlclN0ciA9IGJ5dGVzVG9TdHJpbmcoYnVmZmVyKSwKICAgICAgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aDsKICAgIGxldCBwb3NpdGlvbiA9IHN0cmVhbS5zdGFydDsKICAgIGNvbnN0IHRyYWlsZXJzID0gW10sCiAgICAgIHhyZWZTdG1zID0gW107CiAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHsKICAgICAgbGV0IGNoID0gYnVmZmVyW3Bvc2l0aW9uXTsKICAgICAgaWYgKGNoID09PSBUQUIgfHwgY2ggPT09IExGIHx8IGNoID09PSBDUiB8fCBjaCA9PT0gU1BBQ0UpIHsKICAgICAgICArK3Bvc2l0aW9uOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChjaCA9PT0gUEVSQ0VOVCkgewogICAgICAgIGRvIHsKICAgICAgICAgICsrcG9zaXRpb247CiAgICAgICAgICBpZiAocG9zaXRpb24gPj0gbGVuZ3RoKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2ggPSBidWZmZXJbcG9zaXRpb25dOwogICAgICAgIH0gd2hpbGUgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHRva2VuID0gcmVhZFRva2VuKGJ1ZmZlciwgcG9zaXRpb24pOwogICAgICBsZXQgbTsKICAgICAgaWYgKHRva2VuLnN0YXJ0c1dpdGgoInhyZWYiKSAmJiAodG9rZW4ubGVuZ3RoID09PSA0IHx8IC9ccy8udGVzdCh0b2tlbls0XSkpKSB7CiAgICAgICAgcG9zaXRpb24gKz0gc2tpcFVudGlsKGJ1ZmZlciwgcG9zaXRpb24sIHRyYWlsZXJCeXRlcyk7CiAgICAgICAgdHJhaWxlcnMucHVzaChwb3NpdGlvbik7CiAgICAgICAgcG9zaXRpb24gKz0gc2tpcFVudGlsKGJ1ZmZlciwgcG9zaXRpb24sIHN0YXJ0eHJlZkJ5dGVzKTsKICAgICAgfSBlbHNlIGlmIChtID0gb2JqUmVnRXhwLmV4ZWModG9rZW4pKSB7CiAgICAgICAgY29uc3QgbnVtID0gbVsxXSB8IDAsCiAgICAgICAgICBnZW4gPSBtWzJdIHwgMDsKICAgICAgICBjb25zdCBzdGFydFBvcyA9IHBvc2l0aW9uICsgdG9rZW4ubGVuZ3RoOwogICAgICAgIGxldCBjb250ZW50TGVuZ3RoLAogICAgICAgICAgdXBkYXRlRW50cmllcyA9IGZhbHNlOwogICAgICAgIGlmICghdGhpcy5lbnRyaWVzW251bV0pIHsKICAgICAgICAgIHVwZGF0ZUVudHJpZXMgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbnRyaWVzW251bV0uZ2VuID09PSBnZW4pIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICAgICAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtLm1ha2VTdWJTdHJlYW0oc3RhcnRQb3MpKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcGFyc2VyLmdldE9iaigpOwogICAgICAgICAgICB1cGRhdGVFbnRyaWVzID0gdHJ1ZTsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFBhcnNlckVPRkV4Y2VwdGlvbikgewogICAgICAgICAgICAgIHdhcm4oYGluZGV4T2JqZWN0cyAtLSBjaGVja2luZyBvYmplY3QgKCR7dG9rZW59KTogIiR7ZXh9Ii5gKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB1cGRhdGVFbnRyaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodXBkYXRlRW50cmllcykgewogICAgICAgICAgdGhpcy5lbnRyaWVzW251bV0gPSB7CiAgICAgICAgICAgIG9mZnNldDogcG9zaXRpb24gLSBzdHJlYW0uc3RhcnQsCiAgICAgICAgICAgIGdlbiwKICAgICAgICAgICAgdW5jb21wcmVzc2VkOiB0cnVlCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBnRW5kb2JqUmVnRXhwLmxhc3RJbmRleCA9IHN0YXJ0UG9zOwogICAgICAgIGNvbnN0IG1hdGNoID0gZ0VuZG9ialJlZ0V4cC5leGVjKGJ1ZmZlclN0cik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICBjb25zdCBlbmRQb3MgPSBnRW5kb2JqUmVnRXhwLmxhc3RJbmRleCArIDE7CiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gZW5kUG9zIC0gcG9zaXRpb247CiAgICAgICAgICBpZiAobWF0Y2hbMV0gIT09ICJlbmRvYmoiKSB7CiAgICAgICAgICAgIHdhcm4oYGluZGV4T2JqZWN0czogRm91bmQgIiR7bWF0Y2hbMV19IiBpbnNpZGUgb2YgYW5vdGhlciAib2JqIiwgYCArICdjYXVzZWQgYnkgbWlzc2luZyAiZW5kb2JqIiAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKICAgICAgICAgICAgY29udGVudExlbmd0aCAtPSBtYXRjaFsxXS5sZW5ndGggKyAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gbGVuZ3RoIC0gcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvbnRlbnQgPSBidWZmZXIuc3ViYXJyYXkocG9zaXRpb24sIHBvc2l0aW9uICsgY29udGVudExlbmd0aCk7CiAgICAgICAgY29uc3QgeHJlZlRhZ09mZnNldCA9IHNraXBVbnRpbChjb250ZW50LCAwLCB4cmVmQnl0ZXMpOwogICAgICAgIGlmICh4cmVmVGFnT2Zmc2V0IDwgY29udGVudExlbmd0aCAmJiBjb250ZW50W3hyZWZUYWdPZmZzZXQgKyA1XSA8IDY0KSB7CiAgICAgICAgICB4cmVmU3Rtcy5wdXNoKHBvc2l0aW9uIC0gc3RyZWFtLnN0YXJ0KTsKICAgICAgICAgIHRoaXMuX3hyZWZTdG1zLmFkZChwb3NpdGlvbiAtIHN0cmVhbS5zdGFydCk7CiAgICAgICAgfQogICAgICAgIHBvc2l0aW9uICs9IGNvbnRlbnRMZW5ndGg7CiAgICAgIH0gZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgidHJhaWxlciIpICYmICh0b2tlbi5sZW5ndGggPT09IDcgfHwgL1xzLy50ZXN0KHRva2VuWzddKSkpIHsKICAgICAgICB0cmFpbGVycy5wdXNoKHBvc2l0aW9uKTsKICAgICAgICBjb25zdCBzdGFydFBvcyA9IHBvc2l0aW9uICsgdG9rZW4ubGVuZ3RoOwogICAgICAgIGxldCBjb250ZW50TGVuZ3RoOwogICAgICAgIGdTdGFydHhyZWZSZWdFeHAubGFzdEluZGV4ID0gc3RhcnRQb3M7CiAgICAgICAgY29uc3QgbWF0Y2ggPSBnU3RhcnR4cmVmUmVnRXhwLmV4ZWMoYnVmZmVyU3RyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgIGNvbnN0IGVuZFBvcyA9IGdTdGFydHhyZWZSZWdFeHAubGFzdEluZGV4ICsgMTsKICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSBlbmRQb3MgLSBwb3NpdGlvbjsKICAgICAgICAgIGlmIChtYXRjaFsxXSAhPT0gInN0YXJ0eHJlZiIpIHsKICAgICAgICAgICAgd2FybihgaW5kZXhPYmplY3RzOiBGb3VuZCAiJHttYXRjaFsxXX0iIGFmdGVyICJ0cmFpbGVyIiwgYCArICdjYXVzZWQgYnkgbWlzc2luZyAic3RhcnR4cmVmIiAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKICAgICAgICAgICAgY29udGVudExlbmd0aCAtPSBtYXRjaFsxXS5sZW5ndGggKyAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gbGVuZ3RoIC0gcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIHBvc2l0aW9uICs9IGNvbnRlbnRMZW5ndGg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9zaXRpb24gKz0gdG9rZW4ubGVuZ3RoICsgMTsKICAgICAgfQogICAgfQogICAgZm9yIChjb25zdCB4cmVmU3RtIG9mIHhyZWZTdG1zKSB7CiAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaCh4cmVmU3RtKTsKICAgICAgdGhpcy5yZWFkWFJlZih0cnVlKTsKICAgIH0KICAgIGNvbnN0IHRyYWlsZXJEaWN0cyA9IFtdOwogICAgbGV0IGlzRW5jcnlwdGVkID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IHRyYWlsZXIgb2YgdHJhaWxlcnMpIHsKICAgICAgc3RyZWFtLnBvcyA9IHRyYWlsZXI7CiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSwKICAgICAgICB4cmVmOiB0aGlzLAogICAgICAgIGFsbG93U3RyZWFtczogdHJ1ZSwKICAgICAgICByZWNvdmVyeU1vZGU6IHRydWUKICAgICAgfSk7CiAgICAgIGNvbnN0IG9iaiA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgaWYgKCFpc0NtZChvYmosICJ0cmFpbGVyIikpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBkaWN0ID0gcGFyc2VyLmdldE9iaigpOwogICAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0cmFpbGVyRGljdHMucHVzaChkaWN0KTsKICAgICAgaWYgKGRpY3QuaGFzKCJFbmNyeXB0IikpIHsKICAgICAgICBpc0VuY3J5cHRlZCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGxldCB0cmFpbGVyRGljdCwgdHJhaWxlckVycm9yOwogICAgZm9yIChjb25zdCBkaWN0IG9mIFsuLi50cmFpbGVyRGljdHMsICJnZW5GYWxsYmFjayIsIC4uLnRyYWlsZXJEaWN0c10pIHsKICAgICAgaWYgKGRpY3QgPT09ICJnZW5GYWxsYmFjayIpIHsKICAgICAgICBpZiAoIXRyYWlsZXJFcnJvcikgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2dlbmVyYXRpb25GYWxsYmFjayA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgbGV0IHZhbGlkUGFnZXNEaWN0ID0gZmFsc2U7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3Qgcm9vdERpY3QgPSBkaWN0LmdldCgiUm9vdCIpOwogICAgICAgIGlmICghKHJvb3REaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYWdlc0RpY3QgPSByb290RGljdC5nZXQoIlBhZ2VzIik7CiAgICAgICAgaWYgKCEocGFnZXNEaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYWdlc0NvdW50ID0gcGFnZXNEaWN0LmdldCgiQ291bnQiKTsKICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihwYWdlc0NvdW50KSkgewogICAgICAgICAgdmFsaWRQYWdlc0RpY3QgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICB0cmFpbGVyRXJyb3IgPSBleDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAodmFsaWRQYWdlc0RpY3QgJiYgKCFpc0VuY3J5cHRlZCB8fCBkaWN0LmhhcygiRW5jcnlwdCIpKSAmJiBkaWN0LmhhcygiSUQiKSkgewogICAgICAgIHJldHVybiBkaWN0OwogICAgICB9CiAgICAgIHRyYWlsZXJEaWN0ID0gZGljdDsKICAgIH0KICAgIGlmICh0cmFpbGVyRGljdCkgewogICAgICByZXR1cm4gdHJhaWxlckRpY3Q7CiAgICB9CiAgICBpZiAodGhpcy50b3BEaWN0KSB7CiAgICAgIHJldHVybiB0aGlzLnRvcERpY3Q7CiAgICB9CiAgICBpZiAoIXRyYWlsZXJEaWN0cy5sZW5ndGgpIHsKICAgICAgZm9yIChjb25zdCBbbnVtLCBlbnRyeV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkgewogICAgICAgIGlmICghZW50cnkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWYgPSBSZWYuZ2V0KG51bSwgZW50cnkuZ2VuKTsKICAgICAgICBsZXQgb2JqOwogICAgICAgIHRyeSB7CiAgICAgICAgICBvYmogPSB0aGlzLmZldGNoKHJlZik7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICAgIG9iaiA9IG9iai5kaWN0OwogICAgICAgIH0KICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCAmJiBvYmouaGFzKCJSb290IikpIHsKICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aHJvdyBuZXcgSW52YWxpZFBERkV4Y2VwdGlvbigiSW52YWxpZCBQREYgc3RydWN0dXJlLiIpOwogIH0KICByZWFkWFJlZihyZWNvdmVyeU1vZGUgPSBmYWxzZSkgewogICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW07CiAgICBjb25zdCBzdGFydFhSZWZQYXJzZWRDYWNoZSA9IG5ldyBTZXQoKTsKICAgIHdoaWxlICh0aGlzLnN0YXJ0WFJlZlF1ZXVlLmxlbmd0aCkgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IHN0YXJ0WFJlZiA9IHRoaXMuc3RhcnRYUmVmUXVldWVbMF07CiAgICAgICAgaWYgKHN0YXJ0WFJlZlBhcnNlZENhY2hlLmhhcyhzdGFydFhSZWYpKSB7CiAgICAgICAgICB3YXJuKCJyZWFkWFJlZiAtIHNraXBwaW5nIFhSZWYgdGFibGUgc2luY2UgaXQgd2FzIGFscmVhZHkgcGFyc2VkLiIpOwogICAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5zaGlmdCgpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHN0YXJ0WFJlZlBhcnNlZENhY2hlLmFkZChzdGFydFhSZWYpOwogICAgICAgIHN0cmVhbS5wb3MgPSBzdGFydFhSZWYgKyBzdHJlYW0uc3RhcnQ7CiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7CiAgICAgICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksCiAgICAgICAgICB4cmVmOiB0aGlzLAogICAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCiAgICAgICAgfSk7CiAgICAgICAgbGV0IG9iaiA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgICBsZXQgZGljdDsKICAgICAgICBpZiAoaXNDbWQob2JqLCAieHJlZiIpKSB7CiAgICAgICAgICBkaWN0ID0gdGhpcy5wcm9jZXNzWFJlZlRhYmxlKHBhcnNlcik7CiAgICAgICAgICBpZiAoIXRoaXMudG9wRGljdCkgewogICAgICAgICAgICB0aGlzLnRvcERpY3QgPSBkaWN0OwogICAgICAgICAgfQogICAgICAgICAgb2JqID0gZGljdC5nZXQoIlhSZWZTdG0iKTsKICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikgJiYgIXRoaXMuX3hyZWZTdG1zLmhhcyhvYmopKSB7CiAgICAgICAgICAgIHRoaXMuX3hyZWZTdG1zLmFkZChvYmopOwogICAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gob2JqKTsKICAgICAgICAgICAgdGhpcy4jZmlyc3RYUmVmU3RtUG9zID8/PSBvYmo7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHsKICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZXIuZ2V0T2JqKCkpIHx8ICFpc0NtZChwYXJzZXIuZ2V0T2JqKCksICJvYmoiKSB8fCAhKChvYmogPSBwYXJzZXIuZ2V0T2JqKCkpIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgc3RyZWFtIik7CiAgICAgICAgICB9CiAgICAgICAgICBkaWN0ID0gdGhpcy5wcm9jZXNzWFJlZlN0cmVhbShvYmopOwogICAgICAgICAgaWYgKCF0aGlzLnRvcERpY3QpIHsKICAgICAgICAgICAgdGhpcy50b3BEaWN0ID0gZGljdDsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghZGljdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkZhaWxlZCB0byByZWFkIFhSZWYgc3RyZWFtIik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHN0cmVhbSBoZWFkZXIiKTsKICAgICAgICB9CiAgICAgICAgb2JqID0gZGljdC5nZXQoIlByZXYiKTsKICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CiAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gob2JqKTsKICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKG9iai5udW0pOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIGluZm8oIih3aGlsZSByZWFkaW5nIFhSZWYpOiAiICsgZSk7CiAgICAgIH0KICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5zaGlmdCgpOwogICAgfQogICAgaWYgKHRoaXMudG9wRGljdCkgewogICAgICByZXR1cm4gdGhpcy50b3BEaWN0OwogICAgfQogICAgaWYgKHJlY292ZXJ5TW9kZSkgewogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogICAgdGhyb3cgbmV3IFhSZWZQYXJzZUV4Y2VwdGlvbigpOwogIH0KICBnZXQgbGFzdFhSZWZTdHJlYW1Qb3MoKSB7CiAgICByZXR1cm4gdGhpcy4jZmlyc3RYUmVmU3RtUG9zID8/ICh0aGlzLl94cmVmU3Rtcy5zaXplID4gMCA/IE1hdGgubWF4KC4uLnRoaXMuX3hyZWZTdG1zKSA6IG51bGwpOwogIH0KICBnZXRFbnRyeShpKSB7CiAgICBjb25zdCB4cmVmRW50cnkgPSB0aGlzLmVudHJpZXNbaV07CiAgICBpZiAoeHJlZkVudHJ5ICYmICF4cmVmRW50cnkuZnJlZSAmJiB4cmVmRW50cnkub2Zmc2V0KSB7CiAgICAgIHJldHVybiB4cmVmRW50cnk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZmV0Y2hJZlJlZihvYmosIHN1cHByZXNzRW5jcnlwdGlvbiA9IGZhbHNlKSB7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHJldHVybiB0aGlzLmZldGNoKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICAgIHJldHVybiBvYmo7CiAgfQogIGZldGNoKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2UpIHsKICAgIGlmICghKHJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJyZWYgb2JqZWN0IGlzIG5vdCBhIHJlZmVyZW5jZSIpOwogICAgfQogICAgY29uc3QgbnVtID0gcmVmLm51bTsKICAgIGNvbnN0IGNhY2hlRW50cnkgPSB0aGlzLl9jYWNoZU1hcC5nZXQobnVtKTsKICAgIGlmIChjYWNoZUVudHJ5ICE9PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKGNhY2hlRW50cnkgaW5zdGFuY2VvZiBEaWN0ICYmICFjYWNoZUVudHJ5Lm9iaklkKSB7CiAgICAgICAgY2FjaGVFbnRyeS5vYmpJZCA9IHJlZi50b1N0cmluZygpOwogICAgICB9CiAgICAgIHJldHVybiBjYWNoZUVudHJ5OwogICAgfQogICAgbGV0IHhyZWZFbnRyeSA9IHRoaXMuZ2V0RW50cnkobnVtKTsKICAgIGlmICh4cmVmRW50cnkgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIHhyZWZFbnRyeTsKICAgIH0KICAgIGlmICh0aGlzLl9wZW5kaW5nUmVmcy5oYXMocmVmKSkgewogICAgICB0aGlzLl9wZW5kaW5nUmVmcy5yZW1vdmUocmVmKTsKICAgICAgd2FybihgSWdub3JpbmcgY2lyY3VsYXIgcmVmZXJlbmNlOiAke3JlZn0uYCk7CiAgICAgIHJldHVybiBDSVJDVUxBUl9SRUY7CiAgICB9CiAgICB0aGlzLl9wZW5kaW5nUmVmcy5wdXQocmVmKTsKICAgIHRyeSB7CiAgICAgIHhyZWZFbnRyeSA9IHhyZWZFbnRyeS51bmNvbXByZXNzZWQgPyB0aGlzLmZldGNoVW5jb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24pIDogdGhpcy5mZXRjaENvbXByZXNzZWQocmVmLCB4cmVmRW50cnksIHN1cHByZXNzRW5jcnlwdGlvbik7CiAgICAgIHRoaXMuX3BlbmRpbmdSZWZzLnJlbW92ZShyZWYpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgdGhpcy5fcGVuZGluZ1JlZnMucmVtb3ZlKHJlZik7CiAgICAgIHRocm93IGV4OwogICAgfQogICAgaWYgKHhyZWZFbnRyeSBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgeHJlZkVudHJ5Lm9iaklkID0gcmVmLnRvU3RyaW5nKCk7CiAgICB9IGVsc2UgaWYgKHhyZWZFbnRyeSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgeHJlZkVudHJ5LmRpY3Qub2JqSWQgPSByZWYudG9TdHJpbmcoKTsKICAgIH0KICAgIHJldHVybiB4cmVmRW50cnk7CiAgfQogIGZldGNoVW5jb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24gPSBmYWxzZSkgewogICAgY29uc3QgZ2VuID0gcmVmLmdlbjsKICAgIGxldCBudW0gPSByZWYubnVtOwogICAgaWYgKHhyZWZFbnRyeS5nZW4gIT09IGdlbikgewogICAgICBjb25zdCBtc2cgPSBgSW5jb25zaXN0ZW50IGdlbmVyYXRpb24gaW4gWFJlZjogJHtyZWZ9YDsKICAgICAgaWYgKHRoaXMuX2dlbmVyYXRpb25GYWxsYmFjayAmJiB4cmVmRW50cnkuZ2VuIDwgZ2VuKSB7CiAgICAgICAgd2Fybihtc2cpOwogICAgICAgIHJldHVybiB0aGlzLmZldGNoVW5jb21wcmVzc2VkKFJlZi5nZXQobnVtLCB4cmVmRW50cnkuZ2VuKSwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgICB9CiAgICAgIHRocm93IG5ldyBYUmVmRW50cnlFeGNlcHRpb24obXNnKTsKICAgIH0KICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtLm1ha2VTdWJTdHJlYW0oeHJlZkVudHJ5Lm9mZnNldCArIHRoaXMuc3RyZWFtLnN0YXJ0KTsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksCiAgICAgIHhyZWY6IHRoaXMsCiAgICAgIGFsbG93U3RyZWFtczogdHJ1ZQogICAgfSk7CiAgICBjb25zdCBvYmoxID0gcGFyc2VyLmdldE9iaigpOwogICAgY29uc3Qgb2JqMiA9IHBhcnNlci5nZXRPYmooKTsKICAgIGNvbnN0IG9iajMgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBpZiAob2JqMSAhPT0gbnVtIHx8IG9iajIgIT09IGdlbiB8fCAhKG9iajMgaW5zdGFuY2VvZiBDbWQpKSB7CiAgICAgIHRocm93IG5ldyBYUmVmRW50cnlFeGNlcHRpb24oYEJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAke3JlZn1gKTsKICAgIH0KICAgIGlmIChvYmozLmNtZCAhPT0gIm9iaiIpIHsKICAgICAgaWYgKG9iajMuY21kLnN0YXJ0c1dpdGgoIm9iaiIpKSB7CiAgICAgICAgbnVtID0gcGFyc2VJbnQob2JqMy5jbWQuc3Vic3RyaW5nKDMpLCAxMCk7CiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtKSkgewogICAgICAgICAgcmV0dXJuIG51bTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IFhSZWZFbnRyeUV4Y2VwdGlvbihgQmFkICh1bmNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICR7cmVmfWApOwogICAgfQogICAgeHJlZkVudHJ5ID0gdGhpcy5lbmNyeXB0ICYmICFzdXBwcmVzc0VuY3J5cHRpb24gPyBwYXJzZXIuZ2V0T2JqKHRoaXMuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0obnVtLCBnZW4pKSA6IHBhcnNlci5nZXRPYmooKTsKICAgIGlmICghKHhyZWZFbnRyeSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgIHRoaXMuX2NhY2hlTWFwLnNldChudW0sIHhyZWZFbnRyeSk7CiAgICB9CiAgICByZXR1cm4geHJlZkVudHJ5OwogIH0KICBmZXRjaENvbXByZXNzZWQocmVmLCB4cmVmRW50cnksIHN1cHByZXNzRW5jcnlwdGlvbiA9IGZhbHNlKSB7CiAgICBjb25zdCB0YWJsZU9mZnNldCA9IHhyZWZFbnRyeS5vZmZzZXQ7CiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLmZldGNoKFJlZi5nZXQodGFibGVPZmZzZXQsIDApKTsKICAgIGlmICghKHN0cmVhbSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiYmFkIE9ialN0bSBzdHJlYW0iKTsKICAgIH0KICAgIGNvbnN0IGZpcnN0ID0gc3RyZWFtLmRpY3QuZ2V0KCJGaXJzdCIpOwogICAgY29uc3QgbiA9IHN0cmVhbS5kaWN0LmdldCgiTiIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQgZmlyc3QgYW5kIG4gcGFyYW1ldGVycyBmb3IgT2JqU3RtIHN0cmVhbSIpOwogICAgfQogICAgbGV0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksCiAgICAgIHhyZWY6IHRoaXMsCiAgICAgIGFsbG93U3RyZWFtczogdHJ1ZQogICAgfSk7CiAgICBjb25zdCBudW1zID0gbmV3IEFycmF5KG4pOwogICAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBBcnJheShuKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGNvbnN0IG51bSA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bSkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYGludmFsaWQgb2JqZWN0IG51bWJlciBpbiB0aGUgT2JqU3RtIHN0cmVhbTogJHtudW19YCk7CiAgICAgIH0KICAgICAgY29uc3Qgb2Zmc2V0ID0gcGFyc2VyLmdldE9iaigpOwogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIob2Zmc2V0KSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgaW52YWxpZCBvYmplY3Qgb2Zmc2V0IGluIHRoZSBPYmpTdG0gc3RyZWFtOiAke29mZnNldH1gKTsKICAgICAgfQogICAgICBudW1zW2ldID0gbnVtOwogICAgICBvZmZzZXRzW2ldID0gb2Zmc2V0OwogICAgfQogICAgY29uc3Qgc3RhcnQgPSAoc3RyZWFtLnN0YXJ0IHx8IDApICsgZmlyc3Q7CiAgICBjb25zdCBlbnRyaWVzID0gbmV3IEFycmF5KG4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gaSA8IG4gLSAxID8gb2Zmc2V0c1tpICsgMV0gLSBvZmZzZXRzW2ldIDogdW5kZWZpbmVkOwogICAgICBpZiAobGVuZ3RoIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBvZmZzZXQgaW4gdGhlIE9ialN0bSBzdHJlYW0uIik7CiAgICAgIH0KICAgICAgcGFyc2VyID0gbmV3IFBhcnNlcih7CiAgICAgICAgbGV4ZXI6IG5ldyBMZXhlcihzdHJlYW0ubWFrZVN1YlN0cmVhbShzdGFydCArIG9mZnNldHNbaV0sIGxlbmd0aCwgc3RyZWFtLmRpY3QpKSwKICAgICAgICB4cmVmOiB0aGlzLAogICAgICAgIGFsbG93U3RyZWFtczogdHJ1ZQogICAgICB9KTsKICAgICAgY29uc3Qgb2JqID0gcGFyc2VyLmdldE9iaigpOwogICAgICBlbnRyaWVzW2ldID0gb2JqOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IG51bSA9IG51bXNbaV0sCiAgICAgICAgZW50cnkgPSB0aGlzLmVudHJpZXNbbnVtXTsKICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5Lm9mZnNldCA9PT0gdGFibGVPZmZzZXQgJiYgZW50cnkuZ2VuID09PSBpKSB7CiAgICAgICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgb2JqKTsKICAgICAgfQogICAgfQogICAgeHJlZkVudHJ5ID0gZW50cmllc1t4cmVmRW50cnkuZ2VuXTsKICAgIGlmICh4cmVmRW50cnkgPT09IHVuZGVmaW5lZCkgewogICAgICB0aHJvdyBuZXcgWFJlZkVudHJ5RXhjZXB0aW9uKGBCYWQgKGNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICR7cmVmfWApOwogICAgfQogICAgcmV0dXJuIHhyZWZFbnRyeTsKICB9CiAgYXN5bmMgZmV0Y2hJZlJlZkFzeW5jKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKSB7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHJldHVybiB0aGlzLmZldGNoQXN5bmMob2JqLCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CiAgYXN5bmMgZmV0Y2hBc3luYyhyZWYsIHN1cHByZXNzRW5jcnlwdGlvbikgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHRoaXMuZmV0Y2gocmVmLCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikpIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICBhd2FpdCB0aGlzLnBkZk1hbmFnZXIucmVxdWVzdFJhbmdlKGV4LmJlZ2luLCBleC5lbmQpOwogICAgICByZXR1cm4gdGhpcy5mZXRjaEFzeW5jKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICB9CiAgZ2V0Q2F0YWxvZ09iaigpIHsKICAgIHJldHVybiB0aGlzLnJvb3Q7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9kb2N1bWVudC5qcwoKCgoKCgoKCgoKCgoKCgoKCgoKY29uc3QgTEVUVEVSX1NJWkVfTUVESUFCT1ggPSBbMCwgMCwgNjEyLCA3OTJdOwpjbGFzcyBQYWdlIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBwZGZNYW5hZ2VyLAogICAgeHJlZiwKICAgIHBhZ2VJbmRleCwKICAgIHBhZ2VEaWN0LAogICAgcmVmLAogICAgZ2xvYmFsSWRGYWN0b3J5LAogICAgZm9udENhY2hlLAogICAgYnVpbHRJbkNNYXBDYWNoZSwKICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgIGdsb2JhbEltYWdlQ2FjaGUsCiAgICBzeXN0ZW1Gb250Q2FjaGUsCiAgICBub25CbGVuZE1vZGVzU2V0LAogICAgeGZhRmFjdG9yeQogIH0pIHsKICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7CiAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDsKICAgIHRoaXMucGFnZURpY3QgPSBwYWdlRGljdDsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLnJlZiA9IHJlZjsKICAgIHRoaXMuZm9udENhY2hlID0gZm9udENhY2hlOwogICAgdGhpcy5idWlsdEluQ01hcENhY2hlID0gYnVpbHRJbkNNYXBDYWNoZTsKICAgIHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlID0gc3RhbmRhcmRGb250RGF0YUNhY2hlOwogICAgdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUgPSBnbG9iYWxDb2xvclNwYWNlQ2FjaGU7CiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUgPSBnbG9iYWxJbWFnZUNhY2hlOwogICAgdGhpcy5zeXN0ZW1Gb250Q2FjaGUgPSBzeXN0ZW1Gb250Q2FjaGU7CiAgICB0aGlzLm5vbkJsZW5kTW9kZXNTZXQgPSBub25CbGVuZE1vZGVzU2V0OwogICAgdGhpcy5ldmFsdWF0b3JPcHRpb25zID0gcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zOwogICAgdGhpcy5yZXNvdXJjZXNQcm9taXNlID0gbnVsbDsKICAgIHRoaXMueGZhRmFjdG9yeSA9IHhmYUZhY3Rvcnk7CiAgICBjb25zdCBpZENvdW50ZXJzID0gewogICAgICBvYmo6IDAKICAgIH07CiAgICB0aGlzLl9sb2NhbElkRmFjdG9yeSA9IGNsYXNzIGV4dGVuZHMgZ2xvYmFsSWRGYWN0b3J5IHsKICAgICAgc3RhdGljIGNyZWF0ZU9iaklkKCkgewogICAgICAgIHJldHVybiBgcCR7cGFnZUluZGV4fV8keysraWRDb3VudGVycy5vYmp9YDsKICAgICAgfQogICAgICBzdGF0aWMgZ2V0UGFnZU9iaklkKCkgewogICAgICAgIHJldHVybiBgcCR7cmVmLnRvU3RyaW5nKCl9YDsKICAgICAgfQogICAgfTsKICB9CiAgX2dldEluaGVyaXRhYmxlUHJvcGVydHkoa2V5LCBnZXRBcnJheSA9IGZhbHNlKSB7CiAgICBjb25zdCB2YWx1ZSA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICBkaWN0OiB0aGlzLnBhZ2VEaWN0LAogICAgICBrZXksCiAgICAgIGdldEFycmF5LAogICAgICBzdG9wV2hlbkZvdW5kOiBmYWxzZQogICAgfSk7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEgfHwgISh2YWx1ZVswXSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiB2YWx1ZVswXTsKICAgIH0KICAgIHJldHVybiBEaWN0Lm1lcmdlKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBkaWN0QXJyYXk6IHZhbHVlCiAgICB9KTsKICB9CiAgZ2V0IGNvbnRlbnQoKSB7CiAgICByZXR1cm4gdGhpcy5wYWdlRGljdC5nZXRBcnJheSgiQ29udGVudHMiKTsKICB9CiAgZ2V0IHJlc291cmNlcygpIHsKICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIlJlc291cmNlcyIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicmVzb3VyY2VzIiwgcmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCA/IHJlc291cmNlcyA6IERpY3QuZW1wdHkpOwogIH0KICBfZ2V0Qm91bmRpbmdCb3gobmFtZSkgewogICAgaWYgKHRoaXMueGZhRGF0YSkgewogICAgICByZXR1cm4gdGhpcy54ZmFEYXRhLmJib3g7CiAgICB9CiAgICBjb25zdCBib3ggPSBsb29rdXBOb3JtYWxSZWN0KHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkobmFtZSwgdHJ1ZSksIG51bGwpOwogICAgaWYgKGJveCkgewogICAgICBpZiAoYm94WzJdIC0gYm94WzBdID4gMCAmJiBib3hbM10gLSBib3hbMV0gPiAwKSB7CiAgICAgICAgcmV0dXJuIGJveDsKICAgICAgfQogICAgICB3YXJuKGBFbXB0eSwgb3IgaW52YWxpZCwgLyR7bmFtZX0gZW50cnkuYCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZ2V0IG1lZGlhQm94KCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibWVkaWFCb3giLCB0aGlzLl9nZXRCb3VuZGluZ0JveCgiTWVkaWFCb3giKSB8fCBMRVRURVJfU0laRV9NRURJQUJPWCk7CiAgfQogIGdldCBjcm9wQm94KCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiY3JvcEJveCIsIHRoaXMuX2dldEJvdW5kaW5nQm94KCJDcm9wQm94IikgfHwgdGhpcy5tZWRpYUJveCk7CiAgfQogIGdldCB1c2VyVW5pdCgpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMucGFnZURpY3QuZ2V0KCJVc2VyVW5pdCIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidXNlclVuaXQiLCB0eXBlb2Ygb2JqID09PSAibnVtYmVyIiAmJiBvYmogPiAwID8gb2JqIDogMS4wKTsKICB9CiAgZ2V0IHZpZXcoKSB7CiAgICBjb25zdCB7CiAgICAgIGNyb3BCb3gsCiAgICAgIG1lZGlhQm94CiAgICB9ID0gdGhpczsKICAgIGlmIChjcm9wQm94ICE9PSBtZWRpYUJveCAmJiAhaXNBcnJheUVxdWFsKGNyb3BCb3gsIG1lZGlhQm94KSkgewogICAgICBjb25zdCBib3ggPSBVdGlsLmludGVyc2VjdChjcm9wQm94LCBtZWRpYUJveCk7CiAgICAgIGlmIChib3ggJiYgYm94WzJdIC0gYm94WzBdID4gMCAmJiBib3hbM10gLSBib3hbMV0gPiAwKSB7CiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmlldyIsIGJveCk7CiAgICAgIH0KICAgICAgd2FybigiRW1wdHkgL0Nyb3BCb3ggYW5kIC9NZWRpYUJveCBpbnRlcnNlY3Rpb24uIik7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2aWV3IiwgbWVkaWFCb3gpOwogIH0KICBnZXQgcm90YXRlKCkgewogICAgbGV0IHJvdGF0ZSA9IHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIlJvdGF0ZSIpIHx8IDA7CiAgICBpZiAocm90YXRlICUgOTAgIT09IDApIHsKICAgICAgcm90YXRlID0gMDsKICAgIH0gZWxzZSBpZiAocm90YXRlID49IDM2MCkgewogICAgICByb3RhdGUgJT0gMzYwOwogICAgfSBlbHNlIGlmIChyb3RhdGUgPCAwKSB7CiAgICAgIHJvdGF0ZSA9IChyb3RhdGUgJSAzNjAgKyAzNjApICUgMzYwOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicm90YXRlIiwgcm90YXRlKTsKICB9CiAgX29uU3ViU3RyZWFtRXJyb3IocmVhc29uLCBvYmpJZCkgewogICAgaWYgKHRoaXMuZXZhbHVhdG9yT3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgd2FybihgZ2V0Q29udGVudFN0cmVhbSAtIGlnbm9yaW5nIHN1Yi1zdHJlYW0gKCR7b2JqSWR9KTogIiR7cmVhc29ufSIuYCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRocm93IHJlYXNvbjsKICB9CiAgYXN5bmMgZ2V0Q29udGVudFN0cmVhbSgpIHsKICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJjb250ZW50Iik7CiAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgcmV0dXJuIGNvbnRlbnQ7CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZW50KSkgewogICAgICByZXR1cm4gbmV3IFN0cmVhbXNTZXF1ZW5jZVN0cmVhbShjb250ZW50LCB0aGlzLl9vblN1YlN0cmVhbUVycm9yLmJpbmQodGhpcykpOwogICAgfQogICAgcmV0dXJuIG5ldyBOdWxsU3RyZWFtKCk7CiAgfQogIGdldCB4ZmFEYXRhKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAieGZhRGF0YSIsIHRoaXMueGZhRmFjdG9yeSA/IHsKICAgICAgYmJveDogdGhpcy54ZmFGYWN0b3J5LmdldEJvdW5kaW5nQm94KHRoaXMucGFnZUluZGV4KQogICAgfSA6IG51bGwpOwogIH0KICBhc3luYyAjcmVwbGFjZUlkQnlSZWYoYW5ub3RhdGlvbnMsIGRlbGV0ZWRBbm5vdGF0aW9ucywgZXhpc3RpbmdBbm5vdGF0aW9ucykgewogICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgewogICAgICBpZiAoYW5ub3RhdGlvbi5pZCkgewogICAgICAgIGNvbnN0IHJlZiA9IFJlZi5mcm9tU3RyaW5nKGFubm90YXRpb24uaWQpOwogICAgICAgIGlmICghcmVmKSB7CiAgICAgICAgICB3YXJuKGBBIG5vbi1saW5rZWQgYW5ub3RhdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQ6ICR7YW5ub3RhdGlvbi5pZH1gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoYW5ub3RhdGlvbi5kZWxldGVkKSB7CiAgICAgICAgICBkZWxldGVkQW5ub3RhdGlvbnMucHV0KHJlZiwgcmVmKTsKICAgICAgICAgIGlmIChhbm5vdGF0aW9uLnBvcHVwUmVmKSB7CiAgICAgICAgICAgIGNvbnN0IHBvcHVwUmVmID0gUmVmLmZyb21TdHJpbmcoYW5ub3RhdGlvbi5wb3B1cFJlZik7CiAgICAgICAgICAgIGlmIChwb3B1cFJlZikgewogICAgICAgICAgICAgIGRlbGV0ZWRBbm5vdGF0aW9ucy5wdXQocG9wdXBSZWYsIHBvcHVwUmVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nQW5ub3RhdGlvbnM/LnB1dChyZWYpOwogICAgICAgIGFubm90YXRpb24ucmVmID0gcmVmOwogICAgICAgIHByb21pc2VzLnB1c2godGhpcy54cmVmLmZldGNoQXN5bmMocmVmKS50aGVuKG9iaiA9PiB7CiAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICBhbm5vdGF0aW9uLm9sZEFubm90YXRpb24gPSBvYmouY2xvbmUoKTsKICAgICAgICAgIH0KICAgICAgICB9LCAoKSA9PiB7CiAgICAgICAgICB3YXJuKGBDYW5ub3QgZmV0Y2ggXGBvbGRBbm5vdGF0aW9uXGAgZm9yOiAke3JlZn0uYCk7CiAgICAgICAgfSkpOwogICAgICAgIGRlbGV0ZSBhbm5vdGF0aW9uLmlkOwogICAgICB9CiAgICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgfQogIGFzeW5jIHNhdmVOZXdBbm5vdGF0aW9ucyhoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9ucywgaW1hZ2VQcm9taXNlcywgY2hhbmdlcykgewogICAgaWYgKHRoaXMueGZhRmFjdG9yeSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlhGQTogQ2Fubm90IHNhdmUgbmV3IGFubm90YXRpb25zLiIpOwogICAgfQogICAgY29uc3QgcGFydGlhbEV2YWx1YXRvciA9IG5ldyBQYXJ0aWFsRXZhbHVhdG9yKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBoYW5kbGVyLAogICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAogICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAogICAgICBmb250Q2FjaGU6IHRoaXMuZm9udENhY2hlLAogICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgc3lzdGVtRm9udENhY2hlOiB0aGlzLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgb3B0aW9uczogdGhpcy5ldmFsdWF0b3JPcHRpb25zCiAgICB9KTsKICAgIGNvbnN0IGRlbGV0ZWRBbm5vdGF0aW9ucyA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgY29uc3QgZXhpc3RpbmdBbm5vdGF0aW9ucyA9IG5ldyBSZWZTZXQoKTsKICAgIGF3YWl0IHRoaXMuI3JlcGxhY2VJZEJ5UmVmKGFubm90YXRpb25zLCBkZWxldGVkQW5ub3RhdGlvbnMsIGV4aXN0aW5nQW5ub3RhdGlvbnMpOwogICAgY29uc3QgcGFnZURpY3QgPSB0aGlzLnBhZ2VEaWN0OwogICAgY29uc3QgYW5ub3RhdGlvbnNBcnJheSA9IHRoaXMuYW5ub3RhdGlvbnMuZmlsdGVyKGEgPT4gIShhIGluc3RhbmNlb2YgUmVmICYmIGRlbGV0ZWRBbm5vdGF0aW9ucy5oYXMoYSkpKTsKICAgIGNvbnN0IG5ld0RhdGEgPSBhd2FpdCBBbm5vdGF0aW9uRmFjdG9yeS5zYXZlTmV3QW5ub3RhdGlvbnMocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvbnMsIGltYWdlUHJvbWlzZXMsIGNoYW5nZXMpOwogICAgZm9yIChjb25zdCB7CiAgICAgIHJlZgogICAgfSBvZiBuZXdEYXRhLmFubm90YXRpb25zKSB7CiAgICAgIGlmIChyZWYgaW5zdGFuY2VvZiBSZWYgJiYgIWV4aXN0aW5nQW5ub3RhdGlvbnMuaGFzKHJlZikpIHsKICAgICAgICBhbm5vdGF0aW9uc0FycmF5LnB1c2gocmVmKTsKICAgICAgfQogICAgfQogICAgY29uc3QgZGljdCA9IHBhZ2VEaWN0LmNsb25lKCk7CiAgICBkaWN0LnNldCgiQW5ub3RzIiwgYW5ub3RhdGlvbnNBcnJheSk7CiAgICBjaGFuZ2VzLnB1dCh0aGlzLnJlZiwgewogICAgICBkYXRhOiBkaWN0CiAgICB9KTsKICAgIGZvciAoY29uc3QgZGVsZXRlZFJlZiBvZiBkZWxldGVkQW5ub3RhdGlvbnMpIHsKICAgICAgY2hhbmdlcy5wdXQoZGVsZXRlZFJlZiwgewogICAgICAgIGRhdGE6IG51bGwKICAgICAgfSk7CiAgICB9CiAgfQogIGFzeW5jIHNhdmUoaGFuZGxlciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgUGFydGlhbEV2YWx1YXRvcih7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaGFuZGxlciwKICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSwKICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSwKICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5idWlsdEluQ01hcENhY2hlLAogICAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGU6IHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLAogICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGU6IHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsCiAgICAgIHN5c3RlbUZvbnRDYWNoZTogdGhpcy5zeXN0ZW1Gb250Q2FjaGUsCiAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucwogICAgfSk7CiAgICBjb25zdCBhbm5vdGF0aW9ucyA9IGF3YWl0IHRoaXMuX3BhcnNlZEFubm90YXRpb25zOwogICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgewogICAgICBwcm9taXNlcy5wdXNoKGFubm90YXRpb24uc2F2ZShwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgIHdhcm4oInNhdmUgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICIgKyBgIiR7dGFzay5uYW1lfSIgdGFzazogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0pKTsKICAgIH0KICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgfQogIGFzeW5jIGxvYWRSZXNvdXJjZXMoa2V5cykgewogICAgYXdhaXQgKHRoaXMucmVzb3VyY2VzUHJvbWlzZSA/Pz0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAicmVzb3VyY2VzIikpOwogICAgY29uc3Qgb2JqZWN0TG9hZGVyID0gbmV3IE9iamVjdExvYWRlcih0aGlzLnJlc291cmNlcywga2V5cywgdGhpcy54cmVmKTsKICAgIGF3YWl0IG9iamVjdExvYWRlci5sb2FkKCk7CiAgfQogIGFzeW5jIGdldE9wZXJhdG9yTGlzdCh7CiAgICBoYW5kbGVyLAogICAgc2luaywKICAgIHRhc2ssCiAgICBpbnRlbnQsCiAgICBjYWNoZUtleSwKICAgIGFubm90YXRpb25TdG9yYWdlID0gbnVsbCwKICAgIG1vZGlmaWVkSWRzID0gbnVsbAogIH0pIHsKICAgIGNvbnN0IGNvbnRlbnRTdHJlYW1Qcm9taXNlID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7CiAgICBjb25zdCByZXNvdXJjZXNQcm9taXNlID0gdGhpcy5sb2FkUmVzb3VyY2VzKFsiQ29sb3JTcGFjZSIsICJFeHRHU3RhdGUiLCAiRm9udCIsICJQYXR0ZXJuIiwgIlByb3BlcnRpZXMiLCAiU2hhZGluZyIsICJYT2JqZWN0Il0pOwogICAgY29uc3QgcGFydGlhbEV2YWx1YXRvciA9IG5ldyBQYXJ0aWFsRXZhbHVhdG9yKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBoYW5kbGVyLAogICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAogICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAogICAgICBmb250Q2FjaGU6IHRoaXMuZm9udENhY2hlLAogICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgc3lzdGVtRm9udENhY2hlOiB0aGlzLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgb3B0aW9uczogdGhpcy5ldmFsdWF0b3JPcHRpb25zCiAgICB9KTsKICAgIGNvbnN0IG5ld0Fubm90c0J5UGFnZSA9ICF0aGlzLnhmYUZhY3RvcnkgPyBnZXROZXdBbm5vdGF0aW9uc01hcChhbm5vdGF0aW9uU3RvcmFnZSkgOiBudWxsOwogICAgY29uc3QgbmV3QW5ub3RzID0gbmV3QW5ub3RzQnlQYWdlPy5nZXQodGhpcy5wYWdlSW5kZXgpOwogICAgbGV0IG5ld0Fubm90YXRpb25zUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgIGxldCBkZWxldGVkQW5ub3RhdGlvbnMgPSBudWxsOwogICAgaWYgKG5ld0Fubm90cykgewogICAgICBjb25zdCBhbm5vdGF0aW9uR2xvYmFsc1Byb21pc2UgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJhbm5vdGF0aW9uR2xvYmFscyIpOwogICAgICBsZXQgaW1hZ2VQcm9taXNlczsKICAgICAgY29uc3QgbWlzc2luZ0JpdG1hcHMgPSBuZXcgU2V0KCk7CiAgICAgIGZvciAoY29uc3QgewogICAgICAgIGJpdG1hcElkLAogICAgICAgIGJpdG1hcAogICAgICB9IG9mIG5ld0Fubm90cykgewogICAgICAgIGlmIChiaXRtYXBJZCAmJiAhYml0bWFwICYmICFtaXNzaW5nQml0bWFwcy5oYXMoYml0bWFwSWQpKSB7CiAgICAgICAgICBtaXNzaW5nQml0bWFwcy5hZGQoYml0bWFwSWQpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCB7CiAgICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQKICAgICAgfSA9IHRoaXMuZXZhbHVhdG9yT3B0aW9uczsKICAgICAgaWYgKG1pc3NpbmdCaXRtYXBzLnNpemUgPiAwKSB7CiAgICAgICAgY29uc3QgYW5ub3RhdGlvbldpdGhCaXRtYXBzID0gbmV3QW5ub3RzLnNsaWNlKCk7CiAgICAgICAgZm9yIChjb25zdCBba2V5LCBhbm5vdGF0aW9uXSBvZiBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChBbm5vdGF0aW9uRWRpdG9yUHJlZml4KSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChhbm5vdGF0aW9uLmJpdG1hcCAmJiBtaXNzaW5nQml0bWFwcy5oYXMoYW5ub3RhdGlvbi5iaXRtYXBJZCkpIHsKICAgICAgICAgICAgYW5ub3RhdGlvbldpdGhCaXRtYXBzLnB1c2goYW5ub3RhdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGltYWdlUHJvbWlzZXMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZW5lcmF0ZUltYWdlcyhhbm5vdGF0aW9uV2l0aEJpdG1hcHMsIHRoaXMueHJlZiwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpOwogICAgICB9IGVsc2UgewogICAgICAgIGltYWdlUHJvbWlzZXMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZW5lcmF0ZUltYWdlcyhuZXdBbm5vdHMsIHRoaXMueHJlZiwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpOwogICAgICB9CiAgICAgIGRlbGV0ZWRBbm5vdGF0aW9ucyA9IG5ldyBSZWZTZXQoKTsKICAgICAgbmV3QW5ub3RhdGlvbnNQcm9taXNlID0gUHJvbWlzZS5hbGwoW2Fubm90YXRpb25HbG9iYWxzUHJvbWlzZSwgdGhpcy4jcmVwbGFjZUlkQnlSZWYobmV3QW5ub3RzLCBkZWxldGVkQW5ub3RhdGlvbnMsIG51bGwpXSkudGhlbigoW2Fubm90YXRpb25HbG9iYWxzXSkgPT4gewogICAgICAgIGlmICghYW5ub3RhdGlvbkdsb2JhbHMpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkucHJpbnROZXdBbm5vdGF0aW9ucyhhbm5vdGF0aW9uR2xvYmFscywgcGFydGlhbEV2YWx1YXRvciwgdGFzaywgbmV3QW5ub3RzLCBpbWFnZVByb21pc2VzKTsKICAgICAgfSk7CiAgICB9CiAgICBjb25zdCBwYWdlTGlzdFByb21pc2UgPSBQcm9taXNlLmFsbChbY29udGVudFN0cmVhbVByb21pc2UsIHJlc291cmNlc1Byb21pc2VdKS50aGVuKGFzeW5jIChbY29udGVudFN0cmVhbV0pID0+IHsKICAgICAgY29uc3Qgb3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdChpbnRlbnQsIHNpbmspOwogICAgICBoYW5kbGVyLnNlbmQoIlN0YXJ0UmVuZGVyUGFnZSIsIHsKICAgICAgICB0cmFuc3BhcmVuY3k6IHBhcnRpYWxFdmFsdWF0b3IuaGFzQmxlbmRNb2Rlcyh0aGlzLnJlc291cmNlcywgdGhpcy5ub25CbGVuZE1vZGVzU2V0KSwKICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAogICAgICAgIGNhY2hlS2V5CiAgICAgIH0pOwogICAgICBhd2FpdCBwYXJ0aWFsRXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgICAgc3RyZWFtOiBjb250ZW50U3RyZWFtLAogICAgICAgIHRhc2ssCiAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcywKICAgICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdAogICAgICB9KTsKICAgICAgcmV0dXJuIG9wTGlzdDsKICAgIH0pOwogICAgbGV0IFtwYWdlT3BMaXN0LCBhbm5vdGF0aW9ucywgbmV3QW5ub3RhdGlvbnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3BhZ2VMaXN0UHJvbWlzZSwgdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnMsIG5ld0Fubm90YXRpb25zUHJvbWlzZV0pOwogICAgaWYgKG5ld0Fubm90YXRpb25zKSB7CiAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuZmlsdGVyKGEgPT4gIShhLnJlZiAmJiBkZWxldGVkQW5ub3RhdGlvbnMuaGFzKGEucmVmKSkpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBuZXdBbm5vdGF0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgbmV3QW5ub3RhdGlvbiA9IG5ld0Fubm90YXRpb25zW2ldOwogICAgICAgIGlmIChuZXdBbm5vdGF0aW9uLnJlZlRvUmVwbGFjZSkgewogICAgICAgICAgY29uc3QgaiA9IGFubm90YXRpb25zLmZpbmRJbmRleChhID0+IGEucmVmICYmIGlzUmVmc0VxdWFsKGEucmVmLCBuZXdBbm5vdGF0aW9uLnJlZlRvUmVwbGFjZSkpOwogICAgICAgICAgaWYgKGogPj0gMCkgewogICAgICAgICAgICBhbm5vdGF0aW9ucy5zcGxpY2UoaiwgMSwgbmV3QW5ub3RhdGlvbik7CiAgICAgICAgICAgIG5ld0Fubm90YXRpb25zLnNwbGljZShpLS0sIDEpOwogICAgICAgICAgICBpaS0tOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBhbm5vdGF0aW9ucyA9IGFubm90YXRpb25zLmNvbmNhdChuZXdBbm5vdGF0aW9ucyk7CiAgICB9CiAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoID09PSAwIHx8IGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRElTQUJMRSkgewogICAgICBwYWdlT3BMaXN0LmZsdXNoKHRydWUpOwogICAgICByZXR1cm4gewogICAgICAgIGxlbmd0aDogcGFnZU9wTGlzdC50b3RhbExlbmd0aAogICAgICB9OwogICAgfQogICAgY29uc3QgcmVuZGVyRm9ybXMgPSAhIShpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0ZPUk1TKSwKICAgICAgaXNFZGl0aW5nID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5JU19FRElUSU5HKSwKICAgICAgaW50ZW50QW55ID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5BTlkpLAogICAgICBpbnRlbnREaXNwbGF5ID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5ESVNQTEFZKSwKICAgICAgaW50ZW50UHJpbnQgPSAhIShpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UKTsKICAgIGNvbnN0IG9wTGlzdFByb21pc2VzID0gW107CiAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgaWYgKGludGVudEFueSB8fCBpbnRlbnREaXNwbGF5ICYmIGFubm90YXRpb24ubXVzdEJlVmlld2VkKGFubm90YXRpb25TdG9yYWdlLCByZW5kZXJGb3JtcykgJiYgYW5ub3RhdGlvbi5tdXN0QmVWaWV3ZWRXaGVuRWRpdGluZyhpc0VkaXRpbmcsIG1vZGlmaWVkSWRzKSB8fCBpbnRlbnRQcmludCAmJiBhbm5vdGF0aW9uLm11c3RCZVByaW50ZWQoYW5ub3RhdGlvblN0b3JhZ2UpKSB7CiAgICAgICAgb3BMaXN0UHJvbWlzZXMucHVzaChhbm5vdGF0aW9uLmdldE9wZXJhdG9yTGlzdChwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICB3YXJuKCJnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICIgKyBgIiR7dGFzay5uYW1lfSIgdGFzazogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBvcExpc3Q6IG51bGwsCiAgICAgICAgICAgIHNlcGFyYXRlRm9ybTogZmFsc2UsCiAgICAgICAgICAgIHNlcGFyYXRlQ2FudmFzOiBmYWxzZQogICAgICAgICAgfTsKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG9wTGlzdHMgPSBhd2FpdCBQcm9taXNlLmFsbChvcExpc3RQcm9taXNlcyk7CiAgICBsZXQgZm9ybSA9IGZhbHNlLAogICAgICBjYW52YXMgPSBmYWxzZTsKICAgIGZvciAoY29uc3QgewogICAgICBvcExpc3QsCiAgICAgIHNlcGFyYXRlRm9ybSwKICAgICAgc2VwYXJhdGVDYW52YXMKICAgIH0gb2Ygb3BMaXN0cykgewogICAgICBwYWdlT3BMaXN0LmFkZE9wTGlzdChvcExpc3QpOwogICAgICBmb3JtIHx8PSBzZXBhcmF0ZUZvcm07CiAgICAgIGNhbnZhcyB8fD0gc2VwYXJhdGVDYW52YXM7CiAgICB9CiAgICBwYWdlT3BMaXN0LmZsdXNoKHRydWUsIHsKICAgICAgZm9ybSwKICAgICAgY2FudmFzCiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgIGxlbmd0aDogcGFnZU9wTGlzdC50b3RhbExlbmd0aAogICAgfTsKICB9CiAgYXN5bmMgZXh0cmFjdFRleHRDb250ZW50KHsKICAgIGhhbmRsZXIsCiAgICB0YXNrLAogICAgaW5jbHVkZU1hcmtlZENvbnRlbnQsCiAgICBkaXNhYmxlTm9ybWFsaXphdGlvbiwKICAgIHNpbmsKICB9KSB7CiAgICBjb25zdCBjb250ZW50U3RyZWFtUHJvbWlzZSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpOwogICAgY29uc3QgcmVzb3VyY2VzUHJvbWlzZSA9IHRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsICJGb250IiwgIlByb3BlcnRpZXMiLCAiWE9iamVjdCJdKTsKICAgIGNvbnN0IGxhbmdQcm9taXNlID0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImxhbmciKTsKICAgIGNvbnN0IFtjb250ZW50U3RyZWFtLCwgbGFuZ10gPSBhd2FpdCBQcm9taXNlLmFsbChbY29udGVudFN0cmVhbVByb21pc2UsIHJlc291cmNlc1Byb21pc2UsIGxhbmdQcm9taXNlXSk7CiAgICBjb25zdCBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IFBhcnRpYWxFdmFsdWF0b3IoewogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIGhhbmRsZXIsCiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsCiAgICAgIGlkRmFjdG9yeTogdGhpcy5fbG9jYWxJZEZhY3RvcnksCiAgICAgIGZvbnRDYWNoZTogdGhpcy5mb250Q2FjaGUsCiAgICAgIGJ1aWx0SW5DTWFwQ2FjaGU6IHRoaXMuYnVpbHRJbkNNYXBDYWNoZSwKICAgICAgc3RhbmRhcmRGb250RGF0YUNhY2hlOiB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlOiB0aGlzLmdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgZ2xvYmFsSW1hZ2VDYWNoZTogdGhpcy5nbG9iYWxJbWFnZUNhY2hlLAogICAgICBzeXN0ZW1Gb250Q2FjaGU6IHRoaXMuc3lzdGVtRm9udENhY2hlLAogICAgICBvcHRpb25zOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMKICAgIH0pOwogICAgcmV0dXJuIHBhcnRpYWxFdmFsdWF0b3IuZ2V0VGV4dENvbnRlbnQoewogICAgICBzdHJlYW06IGNvbnRlbnRTdHJlYW0sCiAgICAgIHRhc2ssCiAgICAgIHJlc291cmNlczogdGhpcy5yZXNvdXJjZXMsCiAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50LAogICAgICBkaXNhYmxlTm9ybWFsaXphdGlvbiwKICAgICAgc2luaywKICAgICAgdmlld0JveDogdGhpcy52aWV3LAogICAgICBsYW5nCiAgICB9KTsKICB9CiAgYXN5bmMgZ2V0U3RydWN0VHJlZSgpIHsKICAgIGNvbnN0IHN0cnVjdFRyZWVSb290ID0gYXdhaXQgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInN0cnVjdFRyZWVSb290Iik7CiAgICBpZiAoIXN0cnVjdFRyZWVSb290KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgYXdhaXQgdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnM7CiAgICBjb25zdCBzdHJ1Y3RUcmVlID0gYXdhaXQgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAiX3BhcnNlU3RydWN0VHJlZSIsIFtzdHJ1Y3RUcmVlUm9vdF0pOwogICAgcmV0dXJuIHRoaXMucGRmTWFuYWdlci5lbnN1cmUoc3RydWN0VHJlZSwgInNlcmlhbGl6YWJsZSIpOwogIH0KICBfcGFyc2VTdHJ1Y3RUcmVlKHN0cnVjdFRyZWVSb290KSB7CiAgICBjb25zdCB0cmVlID0gbmV3IFN0cnVjdFRyZWVQYWdlKHN0cnVjdFRyZWVSb290LCB0aGlzLnBhZ2VEaWN0KTsKICAgIHRyZWUucGFyc2UodGhpcy5yZWYpOwogICAgcmV0dXJuIHRyZWU7CiAgfQogIGFzeW5jIGdldEFubm90YXRpb25zRGF0YShoYW5kbGVyLCB0YXNrLCBpbnRlbnQpIHsKICAgIGNvbnN0IGFubm90YXRpb25zID0gYXdhaXQgdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnM7CiAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKICAgIH0KICAgIGNvbnN0IGFubm90YXRpb25zRGF0YSA9IFtdLAogICAgICB0ZXh0Q29udGVudFByb21pc2VzID0gW107CiAgICBsZXQgcGFydGlhbEV2YWx1YXRvcjsKICAgIGNvbnN0IGludGVudEFueSA9ICEhKGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuQU5ZKSwKICAgICAgaW50ZW50RGlzcGxheSA9ICEhKGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSksCiAgICAgIGludGVudFByaW50ID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCk7CiAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgY29uc3QgaXNWaXNpYmxlID0gaW50ZW50QW55IHx8IGludGVudERpc3BsYXkgJiYgYW5ub3RhdGlvbi52aWV3YWJsZTsKICAgICAgaWYgKGlzVmlzaWJsZSB8fCBpbnRlbnRQcmludCAmJiBhbm5vdGF0aW9uLnByaW50YWJsZSkgewogICAgICAgIGFubm90YXRpb25zRGF0YS5wdXNoKGFubm90YXRpb24uZGF0YSk7CiAgICAgIH0KICAgICAgaWYgKGFubm90YXRpb24uaGFzVGV4dENvbnRlbnQgJiYgaXNWaXNpYmxlKSB7CiAgICAgICAgcGFydGlhbEV2YWx1YXRvciB8fD0gbmV3IFBhcnRpYWxFdmFsdWF0b3IoewogICAgICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICAgICAgaGFuZGxlciwKICAgICAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsCiAgICAgICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAogICAgICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSwKICAgICAgICAgIGJ1aWx0SW5DTWFwQ2FjaGU6IHRoaXMuYnVpbHRJbkNNYXBDYWNoZSwKICAgICAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGU6IHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgZ2xvYmFsSW1hZ2VDYWNoZTogdGhpcy5nbG9iYWxJbWFnZUNhY2hlLAogICAgICAgICAgc3lzdGVtRm9udENhY2hlOiB0aGlzLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucwogICAgICAgIH0pOwogICAgICAgIHRleHRDb250ZW50UHJvbWlzZXMucHVzaChhbm5vdGF0aW9uLmV4dHJhY3RUZXh0Q29udGVudChwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBbLUluZmluaXR5LCAtSW5maW5pdHksIEluZmluaXR5LCBJbmZpbml0eV0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIHdhcm4oYGdldEFubm90YXRpb25zRGF0YSAtIGlnbm9yaW5nIHRleHRDb250ZW50IGR1cmluZyAiJHt0YXNrLm5hbWV9IiB0YXNrOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0KICAgIGF3YWl0IFByb21pc2UuYWxsKHRleHRDb250ZW50UHJvbWlzZXMpOwogICAgcmV0dXJuIGFubm90YXRpb25zRGF0YTsKICB9CiAgZ2V0IGFubm90YXRpb25zKCkgewogICAgY29uc3QgYW5ub3RzID0gdGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSgiQW5ub3RzIik7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJhbm5vdGF0aW9ucyIsIEFycmF5LmlzQXJyYXkoYW5ub3RzKSA/IGFubm90cyA6IFtdKTsKICB9CiAgZ2V0IF9wYXJzZWRBbm5vdGF0aW9ucygpIHsKICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJhbm5vdGF0aW9ucyIpLnRoZW4oYXN5bmMgYW5ub3RzID0+IHsKICAgICAgaWYgKGFubm90cy5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gYW5ub3RzOwogICAgICB9CiAgICAgIGNvbnN0IFthbm5vdGF0aW9uR2xvYmFscywgZmllbGRPYmplY3RzXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJhbm5vdGF0aW9uR2xvYmFscyIpLCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJmaWVsZE9iamVjdHMiKV0pOwogICAgICBpZiAoIWFubm90YXRpb25HbG9iYWxzKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIGNvbnN0IG9ycGhhbkZpZWxkcyA9IGZpZWxkT2JqZWN0cz8ub3JwaGFuRmllbGRzOwogICAgICBjb25zdCBhbm5vdGF0aW9uUHJvbWlzZXMgPSBbXTsKICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uUmVmIG9mIGFubm90cykgewogICAgICAgIGFubm90YXRpb25Qcm9taXNlcy5wdXNoKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh0aGlzLnhyZWYsIGFubm90YXRpb25SZWYsIGFubm90YXRpb25HbG9iYWxzLCB0aGlzLl9sb2NhbElkRmFjdG9yeSwgZmFsc2UsIG9ycGhhbkZpZWxkcywgdGhpcy5yZWYpLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIHdhcm4oYF9wYXJzZWRBbm5vdGF0aW9uczogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgY29uc3Qgc29ydGVkQW5ub3RhdGlvbnMgPSBbXTsKICAgICAgbGV0IHBvcHVwQW5ub3RhdGlvbnMsIHdpZGdldEFubm90YXRpb25zOwogICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYXdhaXQgUHJvbWlzZS5hbGwoYW5ub3RhdGlvblByb21pc2VzKSkgewogICAgICAgIGlmICghYW5ub3RhdGlvbikgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgV2lkZ2V0QW5ub3RhdGlvbikgewogICAgICAgICAgKHdpZGdldEFubm90YXRpb25zIHx8PSBbXSkucHVzaChhbm5vdGF0aW9uKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFBvcHVwQW5ub3RhdGlvbikgewogICAgICAgICAgKHBvcHVwQW5ub3RhdGlvbnMgfHw9IFtdKS5wdXNoKGFubm90YXRpb24pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHNvcnRlZEFubm90YXRpb25zLnB1c2goYW5ub3RhdGlvbik7CiAgICAgIH0KICAgICAgaWYgKHdpZGdldEFubm90YXRpb25zKSB7CiAgICAgICAgc29ydGVkQW5ub3RhdGlvbnMucHVzaCguLi53aWRnZXRBbm5vdGF0aW9ucyk7CiAgICAgIH0KICAgICAgaWYgKHBvcHVwQW5ub3RhdGlvbnMpIHsKICAgICAgICBzb3J0ZWRBbm5vdGF0aW9ucy5wdXNoKC4uLnBvcHVwQW5ub3RhdGlvbnMpOwogICAgICB9CiAgICAgIHJldHVybiBzb3J0ZWRBbm5vdGF0aW9uczsKICAgIH0pOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiX3BhcnNlZEFubm90YXRpb25zIiwgcHJvbWlzZSk7CiAgfQogIGdldCBqc0FjdGlvbnMoKSB7CiAgICBjb25zdCBhY3Rpb25zID0gY29sbGVjdEFjdGlvbnModGhpcy54cmVmLCB0aGlzLnBhZ2VEaWN0LCBQYWdlQWN0aW9uRXZlbnRUeXBlKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImpzQWN0aW9ucyIsIGFjdGlvbnMpOwogIH0KfQpjb25zdCBQREZfSEVBREVSX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFsweDI1LCAweDUwLCAweDQ0LCAweDQ2LCAweDJkXSk7CmNvbnN0IFNUQVJUWFJFRl9TSUdOQVRVUkUgPSBuZXcgVWludDhBcnJheShbMHg3MywgMHg3NCwgMHg2MSwgMHg3MiwgMHg3NCwgMHg3OCwgMHg3MiwgMHg2NSwgMHg2Nl0pOwpjb25zdCBFTkRPQkpfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4NjUsIDB4NmUsIDB4NjQsIDB4NmYsIDB4NjIsIDB4NmFdKTsKZnVuY3Rpb24gZmluZChzdHJlYW0sIHNpZ25hdHVyZSwgbGltaXQgPSAxMDI0LCBiYWNrd2FyZHMgPSBmYWxzZSkgewogIGNvbnN0IHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7CiAgY29uc3Qgc2NhbkJ5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhsaW1pdCk7CiAgY29uc3Qgc2Nhbkxlbmd0aCA9IHNjYW5CeXRlcy5sZW5ndGggLSBzaWduYXR1cmVMZW5ndGg7CiAgaWYgKHNjYW5MZW5ndGggPD0gMCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAoYmFja3dhcmRzKSB7CiAgICBjb25zdCBzaWduYXR1cmVFbmQgPSBzaWduYXR1cmVMZW5ndGggLSAxOwogICAgbGV0IHBvcyA9IHNjYW5CeXRlcy5sZW5ndGggLSAxOwogICAgd2hpbGUgKHBvcyA+PSBzaWduYXR1cmVFbmQpIHsKICAgICAgbGV0IGogPSAwOwogICAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzY2FuQnl0ZXNbcG9zIC0gal0gPT09IHNpZ25hdHVyZVtzaWduYXR1cmVFbmQgLSBqXSkgewogICAgICAgIGorKzsKICAgICAgfQogICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKICAgICAgICBzdHJlYW0ucG9zICs9IHBvcyAtIHNpZ25hdHVyZUVuZDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBwb3MtLTsKICAgIH0KICB9IGVsc2UgewogICAgbGV0IHBvcyA9IDA7CiAgICB3aGlsZSAocG9zIDw9IHNjYW5MZW5ndGgpIHsKICAgICAgbGV0IGogPSAwOwogICAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzY2FuQnl0ZXNbcG9zICsgal0gPT09IHNpZ25hdHVyZVtqXSkgewogICAgICAgIGorKzsKICAgICAgfQogICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKICAgICAgICBzdHJlYW0ucG9zICs9IHBvczsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBwb3MrKzsKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9CmNsYXNzIFBERkRvY3VtZW50IHsKICBjb25zdHJ1Y3RvcihwZGZNYW5hZ2VyLCBzdHJlYW0pIHsKICAgIGlmIChzdHJlYW0ubGVuZ3RoIDw9IDApIHsKICAgICAgdGhyb3cgbmV3IEludmFsaWRQREZFeGNlcHRpb24oIlRoZSBQREYgZmlsZSBpcyBlbXB0eSwgaS5lLiBpdHMgc2l6ZSBpcyB6ZXJvIGJ5dGVzLiIpOwogICAgfQogICAgdGhpcy5wZGZNYW5hZ2VyID0gcGRmTWFuYWdlcjsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy54cmVmID0gbmV3IFhSZWYoc3RyZWFtLCBwZGZNYW5hZ2VyKTsKICAgIHRoaXMuX3BhZ2VQcm9taXNlcyA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX3ZlcnNpb24gPSBudWxsOwogICAgY29uc3QgaWRDb3VudGVycyA9IHsKICAgICAgZm9udDogMAogICAgfTsKICAgIHRoaXMuX2dsb2JhbElkRmFjdG9yeSA9IGNsYXNzIHsKICAgICAgc3RhdGljIGdldERvY0lkKCkgewogICAgICAgIHJldHVybiBgZ18ke3BkZk1hbmFnZXIuZG9jSWR9YDsKICAgICAgfQogICAgICBzdGF0aWMgY3JlYXRlRm9udElkKCkgewogICAgICAgIHJldHVybiBgZiR7KytpZENvdW50ZXJzLmZvbnR9YDsKICAgICAgfQogICAgICBzdGF0aWMgY3JlYXRlT2JqSWQoKSB7CiAgICAgICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgY3JlYXRlT2JqSWRgIGNhbGxlZC4iKTsKICAgICAgfQogICAgICBzdGF0aWMgZ2V0UGFnZU9iaklkKCkgewogICAgICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGdldFBhZ2VPYmpJZGAgY2FsbGVkLiIpOwogICAgICB9CiAgICB9OwogIH0KICBwYXJzZShyZWNvdmVyeU1vZGUpIHsKICAgIHRoaXMueHJlZi5wYXJzZShyZWNvdmVyeU1vZGUpOwogICAgdGhpcy5jYXRhbG9nID0gbmV3IENhdGFsb2codGhpcy5wZGZNYW5hZ2VyLCB0aGlzLnhyZWYpOwogIH0KICBnZXQgbGluZWFyaXphdGlvbigpIHsKICAgIGxldCBsaW5lYXJpemF0aW9uID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIGxpbmVhcml6YXRpb24gPSBMaW5lYXJpemF0aW9uLmNyZWF0ZSh0aGlzLnN0cmVhbSk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXJyOwogICAgICB9CiAgICAgIGluZm8oZXJyKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImxpbmVhcml6YXRpb24iLCBsaW5lYXJpemF0aW9uKTsKICB9CiAgZ2V0IHN0YXJ0WFJlZigpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtOwogICAgbGV0IHN0YXJ0WFJlZiA9IDA7CiAgICBpZiAodGhpcy5saW5lYXJpemF0aW9uKSB7CiAgICAgIHN0cmVhbS5yZXNldCgpOwogICAgICBpZiAoZmluZChzdHJlYW0sIEVORE9CSl9TSUdOQVRVUkUpKSB7CiAgICAgICAgc3RyZWFtLnNraXAoNik7CiAgICAgICAgbGV0IGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CiAgICAgICAgd2hpbGUgKGlzV2hpdGVTcGFjZShjaCkpIHsKICAgICAgICAgIHN0cmVhbS5wb3MrKzsKICAgICAgICAgIGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CiAgICAgICAgfQogICAgICAgIHN0YXJ0WFJlZiA9IHN0cmVhbS5wb3MgLSBzdHJlYW0uc3RhcnQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHN0ZXAgPSAxMDI0OwogICAgICBjb25zdCBzdGFydFhSZWZMZW5ndGggPSBTVEFSVFhSRUZfU0lHTkFUVVJFLmxlbmd0aDsKICAgICAgbGV0IGZvdW5kID0gZmFsc2UsCiAgICAgICAgcG9zID0gc3RyZWFtLmVuZDsKICAgICAgd2hpbGUgKCFmb3VuZCAmJiBwb3MgPiAwKSB7CiAgICAgICAgcG9zIC09IHN0ZXAgLSBzdGFydFhSZWZMZW5ndGg7CiAgICAgICAgaWYgKHBvcyA8IDApIHsKICAgICAgICAgIHBvcyA9IDA7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5wb3MgPSBwb3M7CiAgICAgICAgZm91bmQgPSBmaW5kKHN0cmVhbSwgU1RBUlRYUkVGX1NJR05BVFVSRSwgc3RlcCwgdHJ1ZSk7CiAgICAgIH0KICAgICAgaWYgKGZvdW5kKSB7CiAgICAgICAgc3RyZWFtLnNraXAoOSk7CiAgICAgICAgbGV0IGNoOwogICAgICAgIGRvIHsKICAgICAgICAgIGNoID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICB9IHdoaWxlIChpc1doaXRlU3BhY2UoY2gpKTsKICAgICAgICBsZXQgc3RyID0gIiI7CiAgICAgICAgd2hpbGUgKGNoID49IDB4MjAgJiYgY2ggPD0gMHgzOSkgewogICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgICAgICAgY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICAgIH0KICAgICAgICBzdGFydFhSZWYgPSBwYXJzZUludChzdHIsIDEwKTsKICAgICAgICBpZiAoaXNOYU4oc3RhcnRYUmVmKSkgewogICAgICAgICAgc3RhcnRYUmVmID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInN0YXJ0WFJlZiIsIHN0YXJ0WFJlZik7CiAgfQogIGNoZWNrSGVhZGVyKCkgewogICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW07CiAgICBzdHJlYW0ucmVzZXQoKTsKICAgIGlmICghZmluZChzdHJlYW0sIFBERl9IRUFERVJfU0lHTkFUVVJFKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBzdHJlYW0ubW92ZVN0YXJ0KCk7CiAgICBzdHJlYW0uc2tpcChQREZfSEVBREVSX1NJR05BVFVSRS5sZW5ndGgpOwogICAgbGV0IHZlcnNpb24gPSAiIiwKICAgICAgY2g7CiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLmdldEJ5dGUoKSkgPiAweDIwICYmIHZlcnNpb24ubGVuZ3RoIDwgNykgewogICAgICB2ZXJzaW9uICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgfQogICAgaWYgKFBERl9WRVJTSU9OX1JFR0VYUC50ZXN0KHZlcnNpb24pKSB7CiAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uOwogICAgfSBlbHNlIHsKICAgICAgd2FybihgSW52YWxpZCBQREYgaGVhZGVyIHZlcnNpb246ICR7dmVyc2lvbn1gKTsKICAgIH0KICB9CiAgcGFyc2VTdGFydFhSZWYoKSB7CiAgICB0aGlzLnhyZWYuc2V0U3RhcnRYUmVmKHRoaXMuc3RhcnRYUmVmKTsKICB9CiAgZ2V0IG51bVBhZ2VzKCkgewogICAgbGV0IG51bSA9IDA7CiAgICBpZiAodGhpcy5jYXRhbG9nLmhhc0FjdHVhbE51bVBhZ2VzKSB7CiAgICAgIG51bSA9IHRoaXMuY2F0YWxvZy5udW1QYWdlczsKICAgIH0gZWxzZSBpZiAodGhpcy54ZmFGYWN0b3J5KSB7CiAgICAgIG51bSA9IHRoaXMueGZhRmFjdG9yeS5nZXROdW1QYWdlcygpOwogICAgfSBlbHNlIGlmICh0aGlzLmxpbmVhcml6YXRpb24pIHsKICAgICAgbnVtID0gdGhpcy5saW5lYXJpemF0aW9uLm51bVBhZ2VzOwogICAgfSBlbHNlIHsKICAgICAgbnVtID0gdGhpcy5jYXRhbG9nLm51bVBhZ2VzOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibnVtUGFnZXMiLCBudW0pOwogIH0KICBfaGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhmaWVsZHMsIHJlY3Vyc2lvbkRlcHRoID0gMCkgewogICAgY29uc3QgUkVDVVJTSU9OX0xJTUlUID0gMTA7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmllbGRzKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gZmllbGRzLmV2ZXJ5KGZpZWxkID0+IHsKICAgICAgZmllbGQgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihmaWVsZCk7CiAgICAgIGlmICghKGZpZWxkIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGZpZWxkLmhhcygiS2lkcyIpKSB7CiAgICAgICAgaWYgKCsrcmVjdXJzaW9uRGVwdGggPiBSRUNVUlNJT05fTElNSVQpIHsKICAgICAgICAgIHdhcm4oIl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzOiBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCByZWFjaGVkIik7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKGZpZWxkLmdldCgiS2lkcyIpLCByZWN1cnNpb25EZXB0aCk7CiAgICAgIH0KICAgICAgY29uc3QgaXNTaWduYXR1cmUgPSBpc05hbWUoZmllbGQuZ2V0KCJGVCIpLCAiU2lnIik7CiAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IGZpZWxkLmdldCgiUmVjdCIpOwogICAgICBjb25zdCBpc0ludmlzaWJsZSA9IEFycmF5LmlzQXJyYXkocmVjdGFuZ2xlKSAmJiByZWN0YW5nbGUuZXZlcnkodmFsdWUgPT4gdmFsdWUgPT09IDApOwogICAgICByZXR1cm4gaXNTaWduYXR1cmUgJiYgaXNJbnZpc2libGU7CiAgICB9KTsKICB9CiAgZ2V0IF94ZmFTdHJlYW1zKCkgewogICAgY29uc3QgYWNyb0Zvcm0gPSB0aGlzLmNhdGFsb2cuYWNyb0Zvcm07CiAgICBpZiAoIWFjcm9Gb3JtKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgeGZhID0gYWNyb0Zvcm0uZ2V0KCJYRkEiKTsKICAgIGNvbnN0IGVudHJpZXMgPSB7CiAgICAgICJ4ZHA6eGRwIjogIiIsCiAgICAgIHRlbXBsYXRlOiAiIiwKICAgICAgZGF0YXNldHM6ICIiLAogICAgICBjb25maWc6ICIiLAogICAgICBjb25uZWN0aW9uU2V0OiAiIiwKICAgICAgbG9jYWxlU2V0OiAiIiwKICAgICAgc3R5bGVzaGVldDogIiIsCiAgICAgICIveGRwOnhkcCI6ICIiCiAgICB9OwogICAgaWYgKHhmYSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0gJiYgIXhmYS5pc0VtcHR5KSB7CiAgICAgIGVudHJpZXNbInhkcDp4ZHAiXSA9IHhmYTsKICAgICAgcmV0dXJuIGVudHJpZXM7CiAgICB9CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoeGZhKSB8fCB4ZmEubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0geGZhLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgbGV0IG5hbWU7CiAgICAgIGlmIChpID09PSAwKSB7CiAgICAgICAgbmFtZSA9ICJ4ZHA6eGRwIjsKICAgICAgfSBlbHNlIGlmIChpID09PSBpaSAtIDIpIHsKICAgICAgICBuYW1lID0gIi94ZHA6eGRwIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYW1lID0geGZhW2ldOwogICAgICB9CiAgICAgIGlmICghZW50cmllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZih4ZmFbaSArIDFdKTsKICAgICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHx8IGRhdGEuaXNFbXB0eSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGVudHJpZXNbbmFtZV0gPSBkYXRhOwogICAgfQogICAgcmV0dXJuIGVudHJpZXM7CiAgfQogIGdldCB4ZmFEYXRhc2V0cygpIHsKICAgIGNvbnN0IHN0cmVhbXMgPSB0aGlzLl94ZmFTdHJlYW1zOwogICAgaWYgKCFzdHJlYW1zKSB7CiAgICAgIHJldHVybiBzaGFkb3codGhpcywgInhmYURhdGFzZXRzIiwgbnVsbCk7CiAgICB9CiAgICBmb3IgKGNvbnN0IGtleSBvZiBbImRhdGFzZXRzIiwgInhkcDp4ZHAiXSkgewogICAgICBjb25zdCBzdHJlYW0gPSBzdHJlYW1zW2tleV07CiAgICAgIGlmICghc3RyZWFtKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBzdHIgPSBzdHJpbmdUb1VURjhTdHJpbmcoc3RyZWFtLmdldFN0cmluZygpKTsKICAgICAgICBjb25zdCBkYXRhID0gewogICAgICAgICAgW2tleV06IHN0cgogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAieGZhRGF0YXNldHMiLCBuZXcgRGF0YXNldFJlYWRlcihkYXRhKSk7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHdhcm4oIlhGQSAtIEludmFsaWQgdXRmLTggc3RyaW5nLiIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ4ZmFEYXRhc2V0cyIsIG51bGwpOwogIH0KICBnZXQgeGZhRGF0YSgpIHsKICAgIGNvbnN0IHN0cmVhbXMgPSB0aGlzLl94ZmFTdHJlYW1zOwogICAgaWYgKCFzdHJlYW1zKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgZGF0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmb3IgKGNvbnN0IFtrZXksIHN0cmVhbV0gb2YgT2JqZWN0LmVudHJpZXMoc3RyZWFtcykpIHsKICAgICAgaWYgKCFzdHJlYW0pIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIGRhdGFba2V5XSA9IHN0cmluZ1RvVVRGOFN0cmluZyhzdHJlYW0uZ2V0U3RyaW5nKCkpOwogICAgICB9IGNhdGNoIHsKICAgICAgICB3YXJuKCJYRkEgLSBJbnZhbGlkIHV0Zi04IHN0cmluZy4iKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQogIGdldCB4ZmFGYWN0b3J5KCkgewogICAgbGV0IGRhdGE7CiAgICBpZiAodGhpcy5wZGZNYW5hZ2VyLmVuYWJsZVhmYSAmJiB0aGlzLmNhdGFsb2cubmVlZHNSZW5kZXJpbmcgJiYgdGhpcy5mb3JtSW5mby5oYXNYZmEgJiYgIXRoaXMuZm9ybUluZm8uaGFzQWNyb0Zvcm0pIHsKICAgICAgZGF0YSA9IHRoaXMueGZhRGF0YTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInhmYUZhY3RvcnkiLCBkYXRhID8gbmV3IFhGQUZhY3RvcnkoZGF0YSkgOiBudWxsKTsKICB9CiAgZ2V0IGlzUHVyZVhmYSgpIHsKICAgIHJldHVybiB0aGlzLnhmYUZhY3RvcnkgPyB0aGlzLnhmYUZhY3RvcnkuaXNWYWxpZCgpIDogZmFsc2U7CiAgfQogIGdldCBodG1sRm9yWGZhKCkgewogICAgcmV0dXJuIHRoaXMueGZhRmFjdG9yeSA/IHRoaXMueGZhRmFjdG9yeS5nZXRQYWdlcygpIDogbnVsbDsKICB9CiAgYXN5bmMgbG9hZFhmYUltYWdlcygpIHsKICAgIGNvbnN0IHhmYUltYWdlc0RpY3QgPSBhd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygieGZhSW1hZ2VzIik7CiAgICBpZiAoIXhmYUltYWdlc0RpY3QpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qga2V5cyA9IHhmYUltYWdlc0RpY3QuZ2V0S2V5cygpOwogICAgY29uc3Qgb2JqZWN0TG9hZGVyID0gbmV3IE9iamVjdExvYWRlcih4ZmFJbWFnZXNEaWN0LCBrZXlzLCB0aGlzLnhyZWYpOwogICAgYXdhaXQgb2JqZWN0TG9hZGVyLmxvYWQoKTsKICAgIGNvbnN0IHhmYUltYWdlcyA9IG5ldyBNYXAoKTsKICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHsKICAgICAgY29uc3Qgc3RyZWFtID0geGZhSW1hZ2VzRGljdC5nZXQoa2V5KTsKICAgICAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICB4ZmFJbWFnZXMuc2V0KGtleSwgc3RyZWFtLmdldEJ5dGVzKCkpOwogICAgICB9CiAgICB9CiAgICB0aGlzLnhmYUZhY3Rvcnkuc2V0SW1hZ2VzKHhmYUltYWdlcyk7CiAgfQogIGFzeW5jIGxvYWRYZmFGb250cyhoYW5kbGVyLCB0YXNrKSB7CiAgICBjb25zdCBhY3JvRm9ybSA9IGF3YWl0IHRoaXMucGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJhY3JvRm9ybSIpOwogICAgaWYgKCFhY3JvRm9ybSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCByZXNvdXJjZXMgPSBhd2FpdCBhY3JvRm9ybS5nZXRBc3luYygiRFIiKTsKICAgIGlmICghKHJlc291cmNlcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG9iamVjdExvYWRlciA9IG5ldyBPYmplY3RMb2FkZXIocmVzb3VyY2VzLCBbIkZvbnQiXSwgdGhpcy54cmVmKTsKICAgIGF3YWl0IG9iamVjdExvYWRlci5sb2FkKCk7CiAgICBjb25zdCBmb250UmVzID0gcmVzb3VyY2VzLmdldCgiRm9udCIpOwogICAgaWYgKCEoZm9udFJlcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMucGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zKTsKICAgIG9wdGlvbnMudXNlU3lzdGVtRm9udHMgPSBmYWxzZTsKICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgUGFydGlhbEV2YWx1YXRvcih7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaGFuZGxlciwKICAgICAgcGFnZUluZGV4OiAtMSwKICAgICAgaWRGYWN0b3J5OiB0aGlzLl9nbG9iYWxJZEZhY3RvcnksCiAgICAgIGZvbnRDYWNoZTogdGhpcy5jYXRhbG9nLmZvbnRDYWNoZSwKICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5jYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5jYXRhbG9nLnN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgICAgb3B0aW9ucwogICAgfSk7CiAgICBjb25zdCBvcGVyYXRvckxpc3QgPSBuZXcgT3BlcmF0b3JMaXN0KCk7CiAgICBjb25zdCBwZGZGb250cyA9IFtdOwogICAgY29uc3QgaW5pdGlhbFN0YXRlID0gewogICAgICBnZXQgZm9udCgpIHsKICAgICAgICByZXR1cm4gcGRmRm9udHMuYXQoLTEpOwogICAgICB9LAogICAgICBzZXQgZm9udChmb250KSB7CiAgICAgICAgcGRmRm9udHMucHVzaChmb250KTsKICAgICAgfSwKICAgICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCBwcm9taXNlcyA9IFtdOwogICAgZm9yIChjb25zdCBbZm9udE5hbWUsIGZvbnRdIG9mIGZvbnRSZXMpIHsKICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGZvbnQuZ2V0KCJGb250RGVzY3JpcHRvciIpOwogICAgICBpZiAoIShkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgZm9udEZhbWlseSA9IGRlc2NyaXB0b3IuZ2V0KCJGb250RmFtaWx5Iik7CiAgICAgIGZvbnRGYW1pbHkgPSBmb250RmFtaWx5LnJlcGxhY2VBbGwoL1sgXSsoXGQpL2csICIkMSIpOwogICAgICBjb25zdCBmb250V2VpZ2h0ID0gZGVzY3JpcHRvci5nZXQoIkZvbnRXZWlnaHQiKTsKICAgICAgY29uc3QgaXRhbGljQW5nbGUgPSAtZGVzY3JpcHRvci5nZXQoIkl0YWxpY0FuZ2xlIik7CiAgICAgIGNvbnN0IGNzc0ZvbnRJbmZvID0gewogICAgICAgIGZvbnRGYW1pbHksCiAgICAgICAgZm9udFdlaWdodCwKICAgICAgICBpdGFsaWNBbmdsZQogICAgICB9OwogICAgICBpZiAoIXZhbGlkYXRlQ1NTRm9udChjc3NGb250SW5mbykpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBwcm9taXNlcy5wdXNoKHBhcnRpYWxFdmFsdWF0b3IuaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIFtOYW1lLmdldChmb250TmFtZSksIDFdLCBudWxsLCBvcGVyYXRvckxpc3QsIHRhc2ssIGluaXRpYWxTdGF0ZSwgbnVsbCwgY3NzRm9udEluZm8pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICB3YXJuKGBsb2FkWGZhRm9udHM6ICIke3JlYXNvbn0iLmApOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9KSk7CiAgICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICBjb25zdCBtaXNzaW5nRm9udHMgPSB0aGlzLnhmYUZhY3Rvcnkuc2V0Rm9udHMocGRmRm9udHMpOwogICAgaWYgKCFtaXNzaW5nRm9udHMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgb3B0aW9ucy5pZ25vcmVFcnJvcnMgPSB0cnVlOwogICAgcHJvbWlzZXMubGVuZ3RoID0gMDsKICAgIHBkZkZvbnRzLmxlbmd0aCA9IDA7CiAgICBjb25zdCByZWFsbHlNaXNzaW5nRm9udHMgPSBuZXcgU2V0KCk7CiAgICBmb3IgKGNvbnN0IG1pc3Npbmcgb2YgbWlzc2luZ0ZvbnRzKSB7CiAgICAgIGlmICghZ2V0WGZhRm9udE5hbWUoYCR7bWlzc2luZ30tUmVndWxhcmApKSB7CiAgICAgICAgcmVhbGx5TWlzc2luZ0ZvbnRzLmFkZChtaXNzaW5nKTsKICAgICAgfQogICAgfQogICAgaWYgKHJlYWxseU1pc3NpbmdGb250cy5zaXplKSB7CiAgICAgIG1pc3NpbmdGb250cy5wdXNoKCJQZGZKUy1GYWxsYmFjayIpOwogICAgfQogICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIG1pc3NpbmdGb250cykgewogICAgICBpZiAocmVhbGx5TWlzc2luZ0ZvbnRzLmhhcyhtaXNzaW5nKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgZm9udEluZm8gb2YgW3sKICAgICAgICBuYW1lOiAiUmVndWxhciIsCiAgICAgICAgZm9udFdlaWdodDogNDAwLAogICAgICAgIGl0YWxpY0FuZ2xlOiAwCiAgICAgIH0sIHsKICAgICAgICBuYW1lOiAiQm9sZCIsCiAgICAgICAgZm9udFdlaWdodDogNzAwLAogICAgICAgIGl0YWxpY0FuZ2xlOiAwCiAgICAgIH0sIHsKICAgICAgICBuYW1lOiAiSXRhbGljIiwKICAgICAgICBmb250V2VpZ2h0OiA0MDAsCiAgICAgICAgaXRhbGljQW5nbGU6IDEyCiAgICAgIH0sIHsKICAgICAgICBuYW1lOiAiQm9sZEl0YWxpYyIsCiAgICAgICAgZm9udFdlaWdodDogNzAwLAogICAgICAgIGl0YWxpY0FuZ2xlOiAxMgogICAgICB9XSkgewogICAgICAgIGNvbnN0IG5hbWUgPSBgJHttaXNzaW5nfS0ke2ZvbnRJbmZvLm5hbWV9YDsKICAgICAgICBjb25zdCBkaWN0ID0gZ2V0WGZhRm9udERpY3QobmFtZSk7CiAgICAgICAgcHJvbWlzZXMucHVzaChwYXJ0aWFsRXZhbHVhdG9yLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBbTmFtZS5nZXQobmFtZSksIDFdLCBudWxsLCBvcGVyYXRvckxpc3QsIHRhc2ssIGluaXRpYWxTdGF0ZSwgZGljdCwgewogICAgICAgICAgZm9udEZhbWlseTogbWlzc2luZywKICAgICAgICAgIGZvbnRXZWlnaHQ6IGZvbnRJbmZvLmZvbnRXZWlnaHQsCiAgICAgICAgICBpdGFsaWNBbmdsZTogZm9udEluZm8uaXRhbGljQW5nbGUKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICB3YXJuKGBsb2FkWGZhRm9udHM6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSkpOwogICAgICB9CiAgICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICB0aGlzLnhmYUZhY3RvcnkuYXBwZW5kRm9udHMocGRmRm9udHMsIHJlYWxseU1pc3NpbmdGb250cyk7CiAgfQogIGFzeW5jIHNlcmlhbGl6ZVhmYURhdGEoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIHJldHVybiB0aGlzLnhmYUZhY3RvcnkgPyB0aGlzLnhmYUZhY3Rvcnkuc2VyaWFsaXplRGF0YShhbm5vdGF0aW9uU3RvcmFnZSkgOiBudWxsOwogIH0KICBnZXQgdmVyc2lvbigpIHsKICAgIHJldHVybiB0aGlzLmNhdGFsb2cudmVyc2lvbiB8fCB0aGlzLl92ZXJzaW9uOwogIH0KICBnZXQgZm9ybUluZm8oKSB7CiAgICBjb25zdCBmb3JtSW5mbyA9IHsKICAgICAgaGFzRmllbGRzOiBmYWxzZSwKICAgICAgaGFzQWNyb0Zvcm06IGZhbHNlLAogICAgICBoYXNYZmE6IGZhbHNlLAogICAgICBoYXNTaWduYXR1cmVzOiBmYWxzZQogICAgfTsKICAgIGNvbnN0IGFjcm9Gb3JtID0gdGhpcy5jYXRhbG9nLmFjcm9Gb3JtOwogICAgaWYgKCFhY3JvRm9ybSkgewogICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmb3JtSW5mbyIsIGZvcm1JbmZvKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGNvbnN0IGZpZWxkcyA9IGFjcm9Gb3JtLmdldCgiRmllbGRzIik7CiAgICAgIGNvbnN0IGhhc0ZpZWxkcyA9IEFycmF5LmlzQXJyYXkoZmllbGRzKSAmJiBmaWVsZHMubGVuZ3RoID4gMDsKICAgICAgZm9ybUluZm8uaGFzRmllbGRzID0gaGFzRmllbGRzOwogICAgICBjb25zdCB4ZmEgPSBhY3JvRm9ybS5nZXQoIlhGQSIpOwogICAgICBmb3JtSW5mby5oYXNYZmEgPSBBcnJheS5pc0FycmF5KHhmYSkgJiYgeGZhLmxlbmd0aCA+IDAgfHwgeGZhIGluc3RhbmNlb2YgQmFzZVN0cmVhbSAmJiAheGZhLmlzRW1wdHk7CiAgICAgIGNvbnN0IHNpZ0ZsYWdzID0gYWNyb0Zvcm0uZ2V0KCJTaWdGbGFncyIpOwogICAgICBjb25zdCBoYXNTaWduYXR1cmVzID0gISEoc2lnRmxhZ3MgJiAweDEpOwogICAgICBjb25zdCBoYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzID0gaGFzU2lnbmF0dXJlcyAmJiB0aGlzLl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKGZpZWxkcyk7CiAgICAgIGZvcm1JbmZvLmhhc0Fjcm9Gb3JtID0gaGFzRmllbGRzICYmICFoYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzOwogICAgICBmb3JtSW5mby5oYXNTaWduYXR1cmVzID0gaGFzU2lnbmF0dXJlczsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihgQ2Fubm90IGZldGNoIGZvcm0gaW5mb3JtYXRpb246ICIke2V4fSIuYCk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmb3JtSW5mbyIsIGZvcm1JbmZvKTsKICB9CiAgZ2V0IGRvY3VtZW50SW5mbygpIHsKICAgIGNvbnN0IGRvY0luZm8gPSB7CiAgICAgIFBERkZvcm1hdFZlcnNpb246IHRoaXMudmVyc2lvbiwKICAgICAgTGFuZ3VhZ2U6IHRoaXMuY2F0YWxvZy5sYW5nLAogICAgICBFbmNyeXB0RmlsdGVyTmFtZTogdGhpcy54cmVmLmVuY3J5cHQgPyB0aGlzLnhyZWYuZW5jcnlwdC5maWx0ZXJOYW1lIDogbnVsbCwKICAgICAgSXNMaW5lYXJpemVkOiAhIXRoaXMubGluZWFyaXphdGlvbiwKICAgICAgSXNBY3JvRm9ybVByZXNlbnQ6IHRoaXMuZm9ybUluZm8uaGFzQWNyb0Zvcm0sCiAgICAgIElzWEZBUHJlc2VudDogdGhpcy5mb3JtSW5mby5oYXNYZmEsCiAgICAgIElzQ29sbGVjdGlvblByZXNlbnQ6ICEhdGhpcy5jYXRhbG9nLmNvbGxlY3Rpb24sCiAgICAgIElzU2lnbmF0dXJlc1ByZXNlbnQ6IHRoaXMuZm9ybUluZm8uaGFzU2lnbmF0dXJlcwogICAgfTsKICAgIGxldCBpbmZvRGljdDsKICAgIHRyeSB7CiAgICAgIGluZm9EaWN0ID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJJbmZvIik7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXJyOwogICAgICB9CiAgICAgIGluZm8oIlRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuIik7CiAgICB9CiAgICBpZiAoIShpbmZvRGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBzaGFkb3codGhpcywgImRvY3VtZW50SW5mbyIsIGRvY0luZm8pOwogICAgfQogICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaW5mb0RpY3QpIHsKICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICBjYXNlICJUaXRsZSI6CiAgICAgICAgY2FzZSAiQXV0aG9yIjoKICAgICAgICBjYXNlICJTdWJqZWN0IjoKICAgICAgICBjYXNlICJLZXl3b3JkcyI6CiAgICAgICAgY2FzZSAiQ3JlYXRvciI6CiAgICAgICAgY2FzZSAiUHJvZHVjZXIiOgogICAgICAgIGNhc2UgIkNyZWF0aW9uRGF0ZSI6CiAgICAgICAgY2FzZSAiTW9kRGF0ZSI6CiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgewogICAgICAgICAgICBkb2NJbmZvW2tleV0gPSBzdHJpbmdUb1BERlN0cmluZyh2YWx1ZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiVHJhcHBlZCI6CiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgIGRvY0luZm9ba2V5XSA9IHZhbHVlOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBsZXQgY3VzdG9tVmFsdWU7CiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkgewogICAgICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgICAgIGN1c3RvbVZhbHVlID0gc3RyaW5nVG9QREZTdHJpbmcodmFsdWUpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgICBjYXNlICJib29sZWFuIjoKICAgICAgICAgICAgICBjdXN0b21WYWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICAgIGN1c3RvbVZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGN1c3RvbVZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgd2FybihgQmFkIHZhbHVlLCBmb3IgY3VzdG9tIGtleSAiJHtrZXl9IiwgaW4gSW5mbzogJHt2YWx1ZX0uYCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFkb2NJbmZvLkN1c3RvbSkgewogICAgICAgICAgICBkb2NJbmZvLkN1c3RvbSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgICBkb2NJbmZvLkN1c3RvbVtrZXldID0gY3VzdG9tVmFsdWU7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB3YXJuKGBCYWQgdmFsdWUsIGZvciBrZXkgIiR7a2V5fSIsIGluIEluZm86ICR7dmFsdWV9LmApOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZG9jdW1lbnRJbmZvIiwgZG9jSW5mbyk7CiAgfQogIGdldCBmaW5nZXJwcmludHMoKSB7CiAgICBjb25zdCBGSU5HRVJQUklOVF9GSVJTVF9CWVRFUyA9IDEwMjQ7CiAgICBjb25zdCBFTVBUWV9GSU5HRVJQUklOVCA9ICJceDAwIi5yZXBlYXQoMTYpOwogICAgZnVuY3Rpb24gdmFsaWRhdGUoZGF0YSkgewogICAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICYmIGRhdGEubGVuZ3RoID09PSAxNiAmJiBkYXRhICE9PSBFTVBUWV9GSU5HRVJQUklOVDsKICAgIH0KICAgIGNvbnN0IGlkID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJJRCIpOwogICAgbGV0IGhhc2hPcmlnaW5hbCwgaGFzaE1vZGlmaWVkOwogICAgaWYgKEFycmF5LmlzQXJyYXkoaWQpICYmIHZhbGlkYXRlKGlkWzBdKSkgewogICAgICBoYXNoT3JpZ2luYWwgPSBzdHJpbmdUb0J5dGVzKGlkWzBdKTsKICAgICAgaWYgKGlkWzFdICE9PSBpZFswXSAmJiB2YWxpZGF0ZShpZFsxXSkpIHsKICAgICAgICBoYXNoTW9kaWZpZWQgPSBzdHJpbmdUb0J5dGVzKGlkWzFdKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaGFzaE9yaWdpbmFsID0gY2FsY3VsYXRlTUQ1KHRoaXMuc3RyZWFtLmdldEJ5dGVSYW5nZSgwLCBGSU5HRVJQUklOVF9GSVJTVF9CWVRFUyksIDAsIEZJTkdFUlBSSU5UX0ZJUlNUX0JZVEVTKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImZpbmdlcnByaW50cyIsIFt0b0hleFV0aWwoaGFzaE9yaWdpbmFsKSwgaGFzaE1vZGlmaWVkID8gdG9IZXhVdGlsKGhhc2hNb2RpZmllZCkgOiBudWxsXSk7CiAgfQogIGFzeW5jIF9nZXRMaW5lYXJpemF0aW9uUGFnZShwYWdlSW5kZXgpIHsKICAgIGNvbnN0IHsKICAgICAgY2F0YWxvZywKICAgICAgbGluZWFyaXphdGlvbiwKICAgICAgeHJlZgogICAgfSA9IHRoaXM7CiAgICBjb25zdCByZWYgPSBSZWYuZ2V0KGxpbmVhcml6YXRpb24ub2JqZWN0TnVtYmVyRmlyc3QsIDApOwogICAgdHJ5IHsKICAgICAgY29uc3Qgb2JqID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKHJlZik7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgbGV0IHR5cGUgPSBvYmouZ2V0UmF3KCJUeXBlIik7CiAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmIChpc05hbWUodHlwZSwgIlBhZ2UiKSB8fCAhb2JqLmhhcygiVHlwZSIpICYmICFvYmouaGFzKCJLaWRzIikgJiYgb2JqLmhhcygiQ29udGVudHMiKSkgewogICAgICAgICAgaWYgKCFjYXRhbG9nLnBhZ2VLaWRzQ291bnRDYWNoZS5oYXMocmVmKSkgewogICAgICAgICAgICBjYXRhbG9nLnBhZ2VLaWRzQ291bnRDYWNoZS5wdXQocmVmLCAxKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghY2F0YWxvZy5wYWdlSW5kZXhDYWNoZS5oYXMocmVmKSkgewogICAgICAgICAgICBjYXRhbG9nLnBhZ2VJbmRleENhY2hlLnB1dChyZWYsIDApOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFtvYmosIHJlZl07CiAgICAgICAgfQogICAgICB9CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVGhlIExpbmVhcml6YXRpb24gZGljdGlvbmFyeSBkb2Vzbid0IHBvaW50IHRvIGEgdmFsaWQgUGFnZSBkaWN0aW9uYXJ5LiIpOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHdhcm4oYF9nZXRMaW5lYXJpemF0aW9uUGFnZTogIiR7cmVhc29uLm1lc3NhZ2V9Ii5gKTsKICAgICAgcmV0dXJuIGNhdGFsb2cuZ2V0UGFnZURpY3QocGFnZUluZGV4KTsKICAgIH0KICB9CiAgZ2V0UGFnZShwYWdlSW5kZXgpIHsKICAgIGNvbnN0IGNhY2hlZFByb21pc2UgPSB0aGlzLl9wYWdlUHJvbWlzZXMuZ2V0KHBhZ2VJbmRleCk7CiAgICBpZiAoY2FjaGVkUHJvbWlzZSkgewogICAgICByZXR1cm4gY2FjaGVkUHJvbWlzZTsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgY2F0YWxvZywKICAgICAgbGluZWFyaXphdGlvbiwKICAgICAgeGZhRmFjdG9yeQogICAgfSA9IHRoaXM7CiAgICBsZXQgcHJvbWlzZTsKICAgIGlmICh4ZmFGYWN0b3J5KSB7CiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoW0RpY3QuZW1wdHksIG51bGxdKTsKICAgIH0gZWxzZSBpZiAobGluZWFyaXphdGlvbj8ucGFnZUZpcnN0ID09PSBwYWdlSW5kZXgpIHsKICAgICAgcHJvbWlzZSA9IHRoaXMuX2dldExpbmVhcml6YXRpb25QYWdlKHBhZ2VJbmRleCk7CiAgICB9IGVsc2UgewogICAgICBwcm9taXNlID0gY2F0YWxvZy5nZXRQYWdlRGljdChwYWdlSW5kZXgpOwogICAgfQogICAgcHJvbWlzZSA9IHByb21pc2UudGhlbigoW3BhZ2VEaWN0LCByZWZdKSA9PiBuZXcgUGFnZSh7CiAgICAgIHBkZk1hbmFnZXI6IHRoaXMucGRmTWFuYWdlciwKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBwYWdlSW5kZXgsCiAgICAgIHBhZ2VEaWN0LAogICAgICByZWYsCiAgICAgIGdsb2JhbElkRmFjdG9yeTogdGhpcy5fZ2xvYmFsSWRGYWN0b3J5LAogICAgICBmb250Q2FjaGU6IGNhdGFsb2cuZm9udENhY2hlLAogICAgICBidWlsdEluQ01hcENhY2hlOiBjYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogY2F0YWxvZy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogY2F0YWxvZy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IGNhdGFsb2cuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgc3lzdGVtRm9udENhY2hlOiBjYXRhbG9nLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgbm9uQmxlbmRNb2Rlc1NldDogY2F0YWxvZy5ub25CbGVuZE1vZGVzU2V0LAogICAgICB4ZmFGYWN0b3J5CiAgICB9KSk7CiAgICB0aGlzLl9wYWdlUHJvbWlzZXMuc2V0KHBhZ2VJbmRleCwgcHJvbWlzZSk7CiAgICByZXR1cm4gcHJvbWlzZTsKICB9CiAgYXN5bmMgY2hlY2tGaXJzdFBhZ2UocmVjb3ZlcnlNb2RlID0gZmFsc2UpIHsKICAgIGlmIChyZWNvdmVyeU1vZGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdHJ5IHsKICAgICAgYXdhaXQgdGhpcy5nZXRQYWdlKDApOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBYUmVmRW50cnlFeGNlcHRpb24pIHsKICAgICAgICB0aGlzLl9wYWdlUHJvbWlzZXMuZGVsZXRlKDApOwogICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cCgpOwogICAgICAgIHRocm93IG5ldyBYUmVmUGFyc2VFeGNlcHRpb24oKTsKICAgICAgfQogICAgfQogIH0KICBhc3luYyBjaGVja0xhc3RQYWdlKHJlY292ZXJ5TW9kZSA9IGZhbHNlKSB7CiAgICBjb25zdCB7CiAgICAgIGNhdGFsb2csCiAgICAgIHBkZk1hbmFnZXIKICAgIH0gPSB0aGlzOwogICAgY2F0YWxvZy5zZXRBY3R1YWxOdW1QYWdlcygpOwogICAgbGV0IG51bVBhZ2VzOwogICAgdHJ5IHsKICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3BkZk1hbmFnZXIuZW5zdXJlRG9jKCJ4ZmFGYWN0b3J5IiksIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJsaW5lYXJpemF0aW9uIiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygibnVtUGFnZXMiKV0pOwogICAgICBpZiAodGhpcy54ZmFGYWN0b3J5KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgaWYgKHRoaXMubGluZWFyaXphdGlvbikgewogICAgICAgIG51bVBhZ2VzID0gdGhpcy5saW5lYXJpemF0aW9uLm51bVBhZ2VzOwogICAgICB9IGVsc2UgewogICAgICAgIG51bVBhZ2VzID0gY2F0YWxvZy5udW1QYWdlczsKICAgICAgfQogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtUGFnZXMpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQYWdlIGNvdW50IGlzIG5vdCBhbiBpbnRlZ2VyLiIpOwogICAgICB9IGVsc2UgaWYgKG51bVBhZ2VzIDw9IDEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYXdhaXQgdGhpcy5nZXRQYWdlKG51bVBhZ2VzIC0gMSk7CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgdGhpcy5fcGFnZVByb21pc2VzLmRlbGV0ZShudW1QYWdlcyAtIDEpOwogICAgICBhd2FpdCB0aGlzLmNsZWFudXAoKTsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFhSZWZFbnRyeUV4Y2VwdGlvbiAmJiAhcmVjb3ZlcnlNb2RlKSB7CiAgICAgICAgdGhyb3cgbmV3IFhSZWZQYXJzZUV4Y2VwdGlvbigpOwogICAgICB9CiAgICAgIHdhcm4oYGNoZWNrTGFzdFBhZ2UgLSBpbnZhbGlkIC9QYWdlcyB0cmVlIC9Db3VudDogJHtudW1QYWdlc30uYCk7CiAgICAgIGxldCBwYWdlc1RyZWU7CiAgICAgIHRyeSB7CiAgICAgICAgcGFnZXNUcmVlID0gYXdhaXQgY2F0YWxvZy5nZXRBbGxQYWdlRGljdHMocmVjb3ZlcnlNb2RlKTsKICAgICAgfSBjYXRjaCAocmVhc29uQWxsKSB7CiAgICAgICAgaWYgKHJlYXNvbkFsbCBpbnN0YW5jZW9mIFhSZWZFbnRyeUV4Y2VwdGlvbiAmJiAhcmVjb3ZlcnlNb2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgWFJlZlBhcnNlRXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgICAgIGNhdGFsb2cuc2V0QWN0dWFsTnVtUGFnZXMoMSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgW3BhZ2VJbmRleCwgW3BhZ2VEaWN0LCByZWZdXSBvZiBwYWdlc1RyZWUpIHsKICAgICAgICBsZXQgcHJvbWlzZTsKICAgICAgICBpZiAocGFnZURpY3QgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVqZWN0KHBhZ2VEaWN0KTsKICAgICAgICAgIHByb21pc2UuY2F0Y2goKCkgPT4ge30pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKG5ldyBQYWdlKHsKICAgICAgICAgICAgcGRmTWFuYWdlciwKICAgICAgICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICAgICAgICBwYWdlSW5kZXgsCiAgICAgICAgICAgIHBhZ2VEaWN0LAogICAgICAgICAgICByZWYsCiAgICAgICAgICAgIGdsb2JhbElkRmFjdG9yeTogdGhpcy5fZ2xvYmFsSWRGYWN0b3J5LAogICAgICAgICAgICBmb250Q2FjaGU6IGNhdGFsb2cuZm9udENhY2hlLAogICAgICAgICAgICBidWlsdEluQ01hcENhY2hlOiBjYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgICAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogY2F0YWxvZy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgICAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgICAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IGNhdGFsb2cuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgICAgICAgc3lzdGVtRm9udENhY2hlOiBjYXRhbG9nLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgICAgICAgbm9uQmxlbmRNb2Rlc1NldDogY2F0YWxvZy5ub25CbGVuZE1vZGVzU2V0LAogICAgICAgICAgICB4ZmFGYWN0b3J5OiBudWxsCiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BhZ2VQcm9taXNlcy5zZXQocGFnZUluZGV4LCBwcm9taXNlKTsKICAgICAgfQogICAgICBjYXRhbG9nLnNldEFjdHVhbE51bVBhZ2VzKHBhZ2VzVHJlZS5zaXplKTsKICAgIH0KICB9CiAgYXN5bmMgZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKSB7CiAgICBjb25zdCB7CiAgICAgIGNhdGFsb2csCiAgICAgIHBkZk1hbmFnZXIKICAgIH0gPSB0aGlzOwogICAgZm9yIChjb25zdCB0cmFuc2xhdGVkRm9udCBvZiBhd2FpdCBQcm9taXNlLmFsbChjYXRhbG9nLmZvbnRDYWNoZSkpIHsKICAgICAgaWYgKHRyYW5zbGF0ZWRGb250LmxvYWRlZE5hbWUgPT09IGlkKSB7CiAgICAgICAgdHJhbnNsYXRlZEZvbnQuZmFsbGJhY2soaGFuZGxlciwgcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICB9CiAgYXN5bmMgY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCA9IGZhbHNlKSB7CiAgICByZXR1cm4gdGhpcy5jYXRhbG9nID8gdGhpcy5jYXRhbG9nLmNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQpIDogY2xlYXJHbG9iYWxDYWNoZXMoKTsKICB9CiAgYXN5bmMgI2NvbGxlY3RGaWVsZE9iamVjdHMobmFtZSwgcGFyZW50UmVmLCBmaWVsZFJlZiwgcHJvbWlzZXMsIGFubm90YXRpb25HbG9iYWxzLCB2aXNpdGVkUmVmcywgb3JwaGFuRmllbGRzKSB7CiAgICBjb25zdCB7CiAgICAgIHhyZWYKICAgIH0gPSB0aGlzOwogICAgaWYgKCEoZmllbGRSZWYgaW5zdGFuY2VvZiBSZWYpIHx8IHZpc2l0ZWRSZWZzLmhhcyhmaWVsZFJlZikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmlzaXRlZFJlZnMucHV0KGZpZWxkUmVmKTsKICAgIGNvbnN0IGZpZWxkID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGZpZWxkUmVmKTsKICAgIGlmICghKGZpZWxkIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IHN1YnR5cGUgPSBhd2FpdCBmaWVsZC5nZXRBc3luYygiU3VidHlwZSIpOwogICAgc3VidHlwZSA9IHN1YnR5cGUgaW5zdGFuY2VvZiBOYW1lID8gc3VidHlwZS5uYW1lIDogbnVsbDsKICAgIHN3aXRjaCAoc3VidHlwZSkgewogICAgICBjYXNlICJMaW5rIjoKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZmllbGQuaGFzKCJUIikpIHsKICAgICAgY29uc3QgcGFydE5hbWUgPSBzdHJpbmdUb1BERlN0cmluZyhhd2FpdCBmaWVsZC5nZXRBc3luYygiVCIpKTsKICAgICAgbmFtZSA9IG5hbWUgPT09ICIiID8gcGFydE5hbWUgOiBgJHtuYW1lfS4ke3BhcnROYW1lfWA7CiAgICB9IGVsc2UgewogICAgICBsZXQgb2JqID0gZmllbGQ7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgb2JqID0gb2JqLmdldFJhdygiUGFyZW50IikgfHwgcGFyZW50UmVmOwogICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIGlmICh2aXNpdGVkUmVmcy5oYXMob2JqKSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIG9iaiA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyhvYmopOwogICAgICAgIH0KICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChvYmouaGFzKCJUIikpIHsKICAgICAgICAgIGNvbnN0IHBhcnROYW1lID0gc3RyaW5nVG9QREZTdHJpbmcoYXdhaXQgb2JqLmdldEFzeW5jKCJUIikpOwogICAgICAgICAgbmFtZSA9IG5hbWUgPT09ICIiID8gcGFydE5hbWUgOiBgJHtuYW1lfS4ke3BhcnROYW1lfWA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChwYXJlbnRSZWYgJiYgIWZpZWxkLmhhcygiUGFyZW50IikgJiYgaXNOYW1lKGZpZWxkLmdldCgiU3VidHlwZSIpLCAiV2lkZ2V0IikpIHsKICAgICAgb3JwaGFuRmllbGRzLnB1dChmaWVsZFJlZiwgcGFyZW50UmVmKTsKICAgIH0KICAgIGlmICghcHJvbWlzZXMuaGFzKG5hbWUpKSB7CiAgICAgIHByb21pc2VzLnNldChuYW1lLCBbXSk7CiAgICB9CiAgICBwcm9taXNlcy5nZXQobmFtZSkucHVzaChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgZmllbGRSZWYsIGFubm90YXRpb25HbG9iYWxzLCBudWxsLCB0cnVlLCBvcnBoYW5GaWVsZHMsIG51bGwpLnRoZW4oYW5ub3RhdGlvbiA9PiBhbm5vdGF0aW9uPy5nZXRGaWVsZE9iamVjdCgpKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgIHdhcm4oYCNjb2xsZWN0RmllbGRPYmplY3RzOiAiJHtyZWFzb259Ii5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9KSk7CiAgICBpZiAoIWZpZWxkLmhhcygiS2lkcyIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGtpZHMgPSBhd2FpdCBmaWVsZC5nZXRBc3luYygiS2lkcyIpOwogICAgaWYgKEFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgIGF3YWl0IHRoaXMuI2NvbGxlY3RGaWVsZE9iamVjdHMobmFtZSwgZmllbGRSZWYsIGtpZCwgcHJvbWlzZXMsIGFubm90YXRpb25HbG9iYWxzLCB2aXNpdGVkUmVmcywgb3JwaGFuRmllbGRzKTsKICAgICAgfQogICAgfQogIH0KICBnZXQgZmllbGRPYmplY3RzKCkgewogICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmVEb2MoImZvcm1JbmZvIikudGhlbihhc3luYyBmb3JtSW5mbyA9PiB7CiAgICAgIGlmICghZm9ybUluZm8uaGFzRmllbGRzKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgW2Fubm90YXRpb25HbG9iYWxzLCBhY3JvRm9ybV0gPSBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZURvYygiYW5ub3RhdGlvbkdsb2JhbHMiKSwgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIildKTsKICAgICAgaWYgKCFhbm5vdGF0aW9uR2xvYmFscykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IHZpc2l0ZWRSZWZzID0gbmV3IFJlZlNldCgpOwogICAgICBjb25zdCBhbGxGaWVsZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBjb25zdCBmaWVsZFByb21pc2VzID0gbmV3IE1hcCgpOwogICAgICBjb25zdCBvcnBoYW5GaWVsZHMgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgICAgZm9yIChjb25zdCBmaWVsZFJlZiBvZiBhd2FpdCBhY3JvRm9ybS5nZXRBc3luYygiRmllbGRzIikpIHsKICAgICAgICBhd2FpdCB0aGlzLiNjb2xsZWN0RmllbGRPYmplY3RzKCIiLCBudWxsLCBmaWVsZFJlZiwgZmllbGRQcm9taXNlcywgYW5ub3RhdGlvbkdsb2JhbHMsIHZpc2l0ZWRSZWZzLCBvcnBoYW5GaWVsZHMpOwogICAgICB9CiAgICAgIGNvbnN0IGFsbFByb21pc2VzID0gW107CiAgICAgIGZvciAoY29uc3QgW25hbWUsIHByb21pc2VzXSBvZiBmaWVsZFByb21pc2VzKSB7CiAgICAgICAgYWxsUHJvbWlzZXMucHVzaChQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmaWVsZHMgPT4gewogICAgICAgICAgZmllbGRzID0gZmllbGRzLmZpbHRlcihmaWVsZCA9PiAhIWZpZWxkKTsKICAgICAgICAgIGlmIChmaWVsZHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBhbGxGaWVsZHNbbmFtZV0gPSBmaWVsZHM7CiAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGFsbFByb21pc2VzKTsKICAgICAgcmV0dXJuIHsKICAgICAgICBhbGxGaWVsZHM6IG9iamVjdFNpemUoYWxsRmllbGRzKSA+IDAgPyBhbGxGaWVsZHMgOiBudWxsLAogICAgICAgIG9ycGhhbkZpZWxkcwogICAgICB9OwogICAgfSk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmaWVsZE9iamVjdHMiLCBwcm9taXNlKTsKICB9CiAgZ2V0IGhhc0pTQWN0aW9ucygpIHsKICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJfcGFyc2VIYXNKU0FjdGlvbnMiKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImhhc0pTQWN0aW9ucyIsIHByb21pc2UpOwogIH0KICBhc3luYyBfcGFyc2VIYXNKU0FjdGlvbnMoKSB7CiAgICBjb25zdCBbY2F0YWxvZ0pzQWN0aW9ucywgZmllbGRPYmplY3RzXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygianNBY3Rpb25zIiksIHRoaXMucGRmTWFuYWdlci5lbnN1cmVEb2MoImZpZWxkT2JqZWN0cyIpXSk7CiAgICBpZiAoY2F0YWxvZ0pzQWN0aW9ucykgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChmaWVsZE9iamVjdHM/LmFsbEZpZWxkcykgewogICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhmaWVsZE9iamVjdHMuYWxsRmllbGRzKS5zb21lKGZpZWxkT2JqZWN0ID0+IGZpZWxkT2JqZWN0LnNvbWUob2JqZWN0ID0+IG9iamVjdC5hY3Rpb25zICE9PSBudWxsKSk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGdldCBjYWxjdWxhdGlvbk9yZGVySWRzKCkgewogICAgY29uc3QgY2FsY3VsYXRpb25PcmRlciA9IHRoaXMuY2F0YWxvZy5hY3JvRm9ybT8uZ2V0KCJDTyIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KGNhbGN1bGF0aW9uT3JkZXIpIHx8IGNhbGN1bGF0aW9uT3JkZXIubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBzaGFkb3codGhpcywgImNhbGN1bGF0aW9uT3JkZXJJZHMiLCBudWxsKTsKICAgIH0KICAgIGNvbnN0IGlkcyA9IFtdOwogICAgZm9yIChjb25zdCBpZCBvZiBjYWxjdWxhdGlvbk9yZGVyKSB7CiAgICAgIGlmIChpZCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGlkcy5wdXNoKGlkLnRvU3RyaW5nKCkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjYWxjdWxhdGlvbk9yZGVySWRzIiwgaWRzLmxlbmd0aCA/IGlkcyA6IG51bGwpOwogIH0KICBnZXQgYW5ub3RhdGlvbkdsb2JhbHMoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJhbm5vdGF0aW9uR2xvYmFscyIsIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUdsb2JhbHModGhpcy5wZGZNYW5hZ2VyKSk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9wZGZfbWFuYWdlci5qcwoKCgoKCgoKCgpmdW5jdGlvbiBwYXJzZURvY0Jhc2VVcmwodXJsKSB7CiAgaWYgKHVybCkgewogICAgY29uc3QgYWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCk7CiAgICBpZiAoYWJzb2x1dGVVcmwpIHsKICAgICAgcmV0dXJuIGFic29sdXRlVXJsLmhyZWY7CiAgICB9CiAgICB3YXJuKGBJbnZhbGlkIGFic29sdXRlIGRvY0Jhc2VVcmw6ICIke3VybH0iLmApOwogIH0KICByZXR1cm4gbnVsbDsKfQpjbGFzcyBCYXNlUGRmTWFuYWdlciB7CiAgY29uc3RydWN0b3IoewogICAgZG9jQmFzZVVybCwKICAgIGRvY0lkLAogICAgZW5hYmxlWGZhLAogICAgZXZhbHVhdG9yT3B0aW9ucywKICAgIGhhbmRsZXIsCiAgICBwYXNzd29yZAogIH0pIHsKICAgIHRoaXMuX2RvY0Jhc2VVcmwgPSBwYXJzZURvY0Jhc2VVcmwoZG9jQmFzZVVybCk7CiAgICB0aGlzLl9kb2NJZCA9IGRvY0lkOwogICAgdGhpcy5fcGFzc3dvcmQgPSBwYXNzd29yZDsKICAgIHRoaXMuZW5hYmxlWGZhID0gZW5hYmxlWGZhOwogICAgZXZhbHVhdG9yT3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCAmJj0gRmVhdHVyZVRlc3QuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ7CiAgICBldmFsdWF0b3JPcHRpb25zLmlzSW1hZ2VEZWNvZGVyU3VwcG9ydGVkICYmPSBGZWF0dXJlVGVzdC5pc0ltYWdlRGVjb2RlclN1cHBvcnRlZDsKICAgIHRoaXMuZXZhbHVhdG9yT3B0aW9ucyA9IE9iamVjdC5mcmVlemUoZXZhbHVhdG9yT3B0aW9ucyk7CiAgICBJbWFnZVJlc2l6ZXIuc2V0T3B0aW9ucyhldmFsdWF0b3JPcHRpb25zKTsKICAgIEpwZWdTdHJlYW0uc2V0T3B0aW9ucyhldmFsdWF0b3JPcHRpb25zKTsKICAgIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAgIC4uLmV2YWx1YXRvck9wdGlvbnMsCiAgICAgIGhhbmRsZXIKICAgIH07CiAgICBKcHhJbWFnZS5zZXRPcHRpb25zKG9wdGlvbnMpOwogICAgSWNjQ29sb3JTcGFjZS5zZXRPcHRpb25zKG9wdGlvbnMpOwogICAgQ215a0lDQ0Jhc2VkQ1Muc2V0T3B0aW9ucyhvcHRpb25zKTsKICB9CiAgZ2V0IGRvY0lkKCkgewogICAgcmV0dXJuIHRoaXMuX2RvY0lkOwogIH0KICBnZXQgcGFzc3dvcmQoKSB7CiAgICByZXR1cm4gdGhpcy5fcGFzc3dvcmQ7CiAgfQogIGdldCBkb2NCYXNlVXJsKCkgewogICAgcmV0dXJuIHRoaXMuX2RvY0Jhc2VVcmw7CiAgfQogIGdldCBjYXRhbG9nKCkgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuY2F0YWxvZzsKICB9CiAgZW5zdXJlRG9jKHByb3AsIGFyZ3MpIHsKICAgIHJldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LCBwcm9wLCBhcmdzKTsKICB9CiAgZW5zdXJlWFJlZihwcm9wLCBhcmdzKSB7CiAgICByZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudC54cmVmLCBwcm9wLCBhcmdzKTsKICB9CiAgZW5zdXJlQ2F0YWxvZyhwcm9wLCBhcmdzKSB7CiAgICByZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudC5jYXRhbG9nLCBwcm9wLCBhcmdzKTsKICB9CiAgZ2V0UGFnZShwYWdlSW5kZXgpIHsKICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmdldFBhZ2UocGFnZUluZGV4KTsKICB9CiAgZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKSB7CiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5mb250RmFsbGJhY2soaWQsIGhhbmRsZXIpOwogIH0KICBsb2FkWGZhRm9udHMoaGFuZGxlciwgdGFzaykgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQubG9hZFhmYUZvbnRzKGhhbmRsZXIsIHRhc2spOwogIH0KICBsb2FkWGZhSW1hZ2VzKCkgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQubG9hZFhmYUltYWdlcygpOwogIH0KICBzZXJpYWxpemVYZmFEYXRhKGFubm90YXRpb25TdG9yYWdlKSB7CiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5zZXJpYWxpemVYZmFEYXRhKGFubm90YXRpb25TdG9yYWdlKTsKICB9CiAgY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCA9IGZhbHNlKSB7CiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5jbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkKTsKICB9CiAgYXN5bmMgZW5zdXJlKG9iaiwgcHJvcCwgYXJncykgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZW5zdXJlYCBjYWxsZWQiKTsKICB9CiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYHJlcXVlc3RSYW5nZWAgY2FsbGVkIik7CiAgfQogIHJlcXVlc3RMb2FkZWRTdHJlYW0obm9GZXRjaCA9IGZhbHNlKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGByZXF1ZXN0TG9hZGVkU3RyZWFtYCBjYWxsZWQiKTsKICB9CiAgc2VuZFByb2dyZXNzaXZlRGF0YShjaHVuaykgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgc2VuZFByb2dyZXNzaXZlRGF0YWAgY2FsbGVkIik7CiAgfQogIHVwZGF0ZVBhc3N3b3JkKHBhc3N3b3JkKSB7CiAgICB0aGlzLl9wYXNzd29yZCA9IHBhc3N3b3JkOwogIH0KICB0ZXJtaW5hdGUocmVhc29uKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGB0ZXJtaW5hdGVgIGNhbGxlZCIpOwogIH0KfQpjbGFzcyBMb2NhbFBkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlciB7CiAgY29uc3RydWN0b3IoYXJncykgewogICAgc3VwZXIoYXJncyk7CiAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyZWFtKGFyZ3Muc291cmNlKTsKICAgIHRoaXMucGRmRG9jdW1lbnQgPSBuZXcgUERGRG9jdW1lbnQodGhpcywgc3RyZWFtKTsKICAgIHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoc3RyZWFtKTsKICB9CiAgYXN5bmMgZW5zdXJlKG9iaiwgcHJvcCwgYXJncykgewogICAgY29uc3QgdmFsdWUgPSBvYmpbcHJvcF07CiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHJldHVybiB2YWx1ZS5hcHBseShvYmosIGFyZ3MpOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCkgewogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogIH0KICByZXF1ZXN0TG9hZGVkU3RyZWFtKG5vRmV0Y2ggPSBmYWxzZSkgewogICAgcmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2U7CiAgfQogIHRlcm1pbmF0ZShyZWFzb24pIHt9Cn0KY2xhc3MgTmV0d29ya1BkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlciB7CiAgY29uc3RydWN0b3IoYXJncykgewogICAgc3VwZXIoYXJncyk7CiAgICB0aGlzLnN0cmVhbU1hbmFnZXIgPSBuZXcgQ2h1bmtlZFN0cmVhbU1hbmFnZXIoYXJncy5zb3VyY2UsIHsKICAgICAgbXNnSGFuZGxlcjogYXJncy5oYW5kbGVyLAogICAgICBsZW5ndGg6IGFyZ3MubGVuZ3RoLAogICAgICBkaXNhYmxlQXV0b0ZldGNoOiBhcmdzLmRpc2FibGVBdXRvRmV0Y2gsCiAgICAgIHJhbmdlQ2h1bmtTaXplOiBhcmdzLnJhbmdlQ2h1bmtTaXplCiAgICB9KTsKICAgIHRoaXMucGRmRG9jdW1lbnQgPSBuZXcgUERGRG9jdW1lbnQodGhpcywgdGhpcy5zdHJlYW1NYW5hZ2VyLmdldFN0cmVhbSgpKTsKICB9CiAgYXN5bmMgZW5zdXJlKG9iaiwgcHJvcCwgYXJncykgewogICAgdHJ5IHsKICAgICAgY29uc3QgdmFsdWUgPSBvYmpbcHJvcF07CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXR1cm4gdmFsdWUuYXBwbHkob2JqLCBhcmdzKTsKICAgICAgfQogICAgICByZXR1cm4gdmFsdWU7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoIShleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSkgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIGF3YWl0IHRoaXMucmVxdWVzdFJhbmdlKGV4LmJlZ2luLCBleC5lbmQpOwogICAgICByZXR1cm4gdGhpcy5lbnN1cmUob2JqLCBwcm9wLCBhcmdzKTsKICAgIH0KICB9CiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbU1hbmFnZXIucmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpOwogIH0KICByZXF1ZXN0TG9hZGVkU3RyZWFtKG5vRmV0Y2ggPSBmYWxzZSkgewogICAgcmV0dXJuIHRoaXMuc3RyZWFtTWFuYWdlci5yZXF1ZXN0QWxsQ2h1bmtzKG5vRmV0Y2gpOwogIH0KICBzZW5kUHJvZ3Jlc3NpdmVEYXRhKGNodW5rKSB7CiAgICB0aGlzLnN0cmVhbU1hbmFnZXIub25SZWNlaXZlRGF0YSh7CiAgICAgIGNodW5rCiAgICB9KTsKICB9CiAgdGVybWluYXRlKHJlYXNvbikgewogICAgdGhpcy5zdHJlYW1NYW5hZ2VyLmFib3J0KHJlYXNvbik7CiAgfQp9Cgo7Ly8gLi9zcmMvc2hhcmVkL21lc3NhZ2VfaGFuZGxlci5qcwoKY29uc3QgQ2FsbGJhY2tLaW5kID0gewogIERBVEE6IDEsCiAgRVJST1I6IDIKfTsKY29uc3QgU3RyZWFtS2luZCA9IHsKICBDQU5DRUw6IDEsCiAgQ0FOQ0VMX0NPTVBMRVRFOiAyLAogIENMT1NFOiAzLAogIEVOUVVFVUU6IDQsCiAgRVJST1I6IDUsCiAgUFVMTDogNiwKICBQVUxMX0NPTVBMRVRFOiA3LAogIFNUQVJUX0NPTVBMRVRFOiA4Cn07CmZ1bmN0aW9uIG9uRm4oKSB7fQpmdW5jdGlvbiB3cmFwUmVhc29uKGV4KSB7CiAgaWYgKGV4IGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24gfHwgZXggaW5zdGFuY2VvZiBJbnZhbGlkUERGRXhjZXB0aW9uIHx8IGV4IGluc3RhbmNlb2YgUGFzc3dvcmRFeGNlcHRpb24gfHwgZXggaW5zdGFuY2VvZiBSZXNwb25zZUV4Y2VwdGlvbiB8fCBleCBpbnN0YW5jZW9mIFVua25vd25FcnJvckV4Y2VwdGlvbikgewogICAgcmV0dXJuIGV4OwogIH0KICBpZiAoIShleCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiBleCA9PT0gIm9iamVjdCIgJiYgZXggIT09IG51bGwpKSB7CiAgICB1bnJlYWNoYWJsZSgnd3JhcFJlYXNvbjogRXhwZWN0ZWQgInJlYXNvbiIgdG8gYmUgYSAocG9zc2libHkgY2xvbmVkKSBFcnJvci4nKTsKICB9CiAgc3dpdGNoIChleC5uYW1lKSB7CiAgICBjYXNlICJBYm9ydEV4Y2VwdGlvbiI6CiAgICAgIHJldHVybiBuZXcgQWJvcnRFeGNlcHRpb24oZXgubWVzc2FnZSk7CiAgICBjYXNlICJJbnZhbGlkUERGRXhjZXB0aW9uIjoKICAgICAgcmV0dXJuIG5ldyBJbnZhbGlkUERGRXhjZXB0aW9uKGV4Lm1lc3NhZ2UpOwogICAgY2FzZSAiUGFzc3dvcmRFeGNlcHRpb24iOgogICAgICByZXR1cm4gbmV3IFBhc3N3b3JkRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LmNvZGUpOwogICAgY2FzZSAiUmVzcG9uc2VFeGNlcHRpb24iOgogICAgICByZXR1cm4gbmV3IFJlc3BvbnNlRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LnN0YXR1cywgZXgubWlzc2luZyk7CiAgICBjYXNlICJVbmtub3duRXJyb3JFeGNlcHRpb24iOgogICAgICByZXR1cm4gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC5kZXRhaWxzKTsKICB9CiAgcmV0dXJuIG5ldyBVbmtub3duRXJyb3JFeGNlcHRpb24oZXgubWVzc2FnZSwgZXgudG9TdHJpbmcoKSk7Cn0KY2xhc3MgTWVzc2FnZUhhbmRsZXIgewogICNtZXNzYWdlQUMgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgY29uc3RydWN0b3Ioc291cmNlTmFtZSwgdGFyZ2V0TmFtZSwgY29tT2JqKSB7CiAgICB0aGlzLnNvdXJjZU5hbWUgPSBzb3VyY2VOYW1lOwogICAgdGhpcy50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTsKICAgIHRoaXMuY29tT2JqID0gY29tT2JqOwogICAgdGhpcy5jYWxsYmFja0lkID0gMTsKICAgIHRoaXMuc3RyZWFtSWQgPSAxOwogICAgdGhpcy5zdHJlYW1TaW5rcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5hY3Rpb25IYW5kbGVyID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbU9iai5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgdGhpcy4jb25NZXNzYWdlLmJpbmQodGhpcyksIHsKICAgICAgc2lnbmFsOiB0aGlzLiNtZXNzYWdlQUMuc2lnbmFsCiAgICB9KTsKICB9CiAgI29uTWVzc2FnZSh7CiAgICBkYXRhCiAgfSkgewogICAgaWYgKGRhdGEudGFyZ2V0TmFtZSAhPT0gdGhpcy5zb3VyY2VOYW1lKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChkYXRhLnN0cmVhbSkgewogICAgICB0aGlzLiNwcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgY29uc3QgY2FsbGJhY2tJZCA9IGRhdGEuY2FsbGJhY2tJZDsKICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF07CiAgICAgIGlmICghY2FwYWJpbGl0eSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgY2FsbGJhY2sgJHtjYWxsYmFja0lkfWApOwogICAgICB9CiAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdOwogICAgICBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkRBVEEpIHsKICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoZGF0YS5kYXRhKTsKICAgICAgfSBlbHNlIGlmIChkYXRhLmNhbGxiYWNrID09PSBDYWxsYmFja0tpbmQuRVJST1IpIHsKICAgICAgICBjYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2UiKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dOwogICAgaWYgKCFhY3Rpb24pIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogJHtkYXRhLmFjdGlvbn1gKTsKICAgIH0KICAgIGlmIChkYXRhLmNhbGxiYWNrSWQpIHsKICAgICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSwKICAgICAgICB0YXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lLAogICAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqOwogICAgICBQcm9taXNlLnRyeShhY3Rpb24sIGRhdGEuZGF0YSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5EQVRBLAogICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLAogICAgICAgICAgZGF0YTogcmVzdWx0CiAgICAgICAgfSk7CiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkVSUk9SLAogICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLAogICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbikKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChkYXRhLnN0cmVhbUlkKSB7CiAgICAgIHRoaXMuI2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGFjdGlvbihkYXRhLmRhdGEpOwogIH0KICBvbihhY3Rpb25OYW1lLCBoYW5kbGVyKSB7CiAgICBjb25zdCBhaCA9IHRoaXMuYWN0aW9uSGFuZGxlcjsKICAgIGlmIChhaFthY3Rpb25OYW1lXSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgIiR7YWN0aW9uTmFtZX0iYCk7CiAgICB9CiAgICBhaFthY3Rpb25OYW1lXSA9IGhhbmRsZXI7CiAgfQogIHNlbmQoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7CiAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSwKICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLAogICAgICBhY3Rpb246IGFjdGlvbk5hbWUsCiAgICAgIGRhdGEKICAgIH0sIHRyYW5zZmVycyk7CiAgfQogIHNlbmRXaXRoUHJvbWlzZShhY3Rpb25OYW1lLCBkYXRhLCB0cmFuc2ZlcnMpIHsKICAgIGNvbnN0IGNhbGxiYWNrSWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsKICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTsKICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF0gPSBjYXBhYmlsaXR5OwogICAgdHJ5IHsKICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSwKICAgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsCiAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLAogICAgICAgIGNhbGxiYWNrSWQsCiAgICAgICAgZGF0YQogICAgICB9LCB0cmFuc2ZlcnMpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgY2FwYWJpbGl0eS5yZWplY3QoZXgpOwogICAgfQogICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTsKICB9CiAgc2VuZFdpdGhTdHJlYW0oYWN0aW9uTmFtZSwgZGF0YSwgcXVldWVpbmdTdHJhdGVneSwgdHJhbnNmZXJzKSB7CiAgICBjb25zdCBzdHJlYW1JZCA9IHRoaXMuc3RyZWFtSWQrKywKICAgICAgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSwKICAgICAgdGFyZ2V0TmFtZSA9IHRoaXMudGFyZ2V0TmFtZSwKICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7CiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHsKICAgICAgc3RhcnQ6IGNvbnRyb2xsZXIgPT4gewogICAgICAgIGNvbnN0IHN0YXJ0Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdID0gewogICAgICAgICAgY29udHJvbGxlciwKICAgICAgICAgIHN0YXJ0Q2FsbDogc3RhcnRDYXBhYmlsaXR5LAogICAgICAgICAgcHVsbENhbGw6IG51bGwsCiAgICAgICAgICBjYW5jZWxDYWxsOiBudWxsLAogICAgICAgICAgaXNDbG9zZWQ6IGZhbHNlCiAgICAgICAgfTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsCiAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgIGRhdGEsCiAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZQogICAgICAgIH0sIHRyYW5zZmVycyk7CiAgICAgICAgcmV0dXJuIHN0YXJ0Q2FwYWJpbGl0eS5wcm9taXNlOwogICAgICB9LAogICAgICBwdWxsOiBjb250cm9sbGVyID0+IHsKICAgICAgICBjb25zdCBwdWxsQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsID0gcHVsbENhcGFiaWxpdHk7CiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTEwsCiAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgIGRlc2lyZWRTaXplOiBjb250cm9sbGVyLmRlc2lyZWRTaXplCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHB1bGxDYXBhYmlsaXR5LnByb21pc2U7CiAgICAgIH0sCiAgICAgIGNhbmNlbDogcmVhc29uID0+IHsKICAgICAgICBhc3NlcnQocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsICJjYW5jZWwgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7CiAgICAgICAgY29uc3QgY2FuY2VsQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwgPSBjYW5jZWxDYXBhYmlsaXR5OwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMLAogICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBjYW5jZWxDYXBhYmlsaXR5LnByb21pc2U7CiAgICAgIH0KICAgIH0sIHF1ZXVlaW5nU3RyYXRlZ3kpOwogIH0KICAjY3JlYXRlU3RyZWFtU2luayhkYXRhKSB7CiAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQsCiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsCiAgICAgIHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWUsCiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqOwogICAgY29uc3Qgc2VsZiA9IHRoaXMsCiAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07CiAgICBjb25zdCBzdHJlYW1TaW5rID0gewogICAgICBlbnF1ZXVlKGNodW5rLCBzaXplID0gMSwgdHJhbnNmZXJzKSB7CiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGFzdERlc2lyZWRTaXplID0gdGhpcy5kZXNpcmVkU2l6ZTsKICAgICAgICB0aGlzLmRlc2lyZWRTaXplIC09IHNpemU7CiAgICAgICAgaWYgKGxhc3REZXNpcmVkU2l6ZSA+IDAgJiYgdGhpcy5kZXNpcmVkU2l6ZSA8PSAwKSB7CiAgICAgICAgICB0aGlzLnNpbmtDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgICAgICAgICB0aGlzLnJlYWR5ID0gdGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlOwogICAgICAgIH0KICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRU5RVUVVRSwKICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgY2h1bmsKICAgICAgICB9LCB0cmFuc2ZlcnMpOwogICAgICB9LAogICAgICBjbG9zZSgpIHsKICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0xPU0UsCiAgICAgICAgICBzdHJlYW1JZAogICAgICAgIH0pOwogICAgICAgIGRlbGV0ZSBzZWxmLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTsKICAgICAgfSwKICAgICAgZXJyb3IocmVhc29uKSB7CiAgICAgICAgYXNzZXJ0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yLCAiZXJyb3IgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7CiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7CiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVSUk9SLAogICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQogICAgICAgIH0pOwogICAgICB9LAogICAgICBzaW5rQ2FwYWJpbGl0eTogUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCksCiAgICAgIG9uUHVsbDogbnVsbCwKICAgICAgb25DYW5jZWw6IG51bGwsCiAgICAgIGlzQ2FuY2VsbGVkOiBmYWxzZSwKICAgICAgZGVzaXJlZFNpemU6IGRhdGEuZGVzaXJlZFNpemUsCiAgICAgIHJlYWR5OiBudWxsCiAgICB9OwogICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CiAgICBzdHJlYW1TaW5rLnJlYWR5ID0gc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlOwogICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0gPSBzdHJlYW1TaW5rOwogICAgUHJvbWlzZS50cnkoYWN0aW9uLCBkYXRhLmRhdGEsIHN0cmVhbVNpbmspLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEUsCiAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgc3VjY2VzczogdHJ1ZQogICAgICB9KTsKICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLAogICAgICAgIHN0cmVhbUlkLAogICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCiAgICAgIH0pOwogICAgfSk7CiAgfQogICNwcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKSB7CiAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQsCiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsCiAgICAgIHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWUsCiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqOwogICAgY29uc3Qgc3RyZWFtQ29udHJvbGxlciA9IHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLAogICAgICBzdHJlYW1TaW5rID0gdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF07CiAgICBzd2l0Y2ggKGRhdGEuc3RyZWFtKSB7CiAgICAgIGNhc2UgU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURToKICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7CiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnN0YXJ0Q2FsbC5yZXNvbHZlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURToKICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7CiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsLnJlc29sdmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5wdWxsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTEw6CiAgICAgICAgaWYgKCFzdHJlYW1TaW5rKSB7CiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSwKICAgICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1TaW5rLmRlc2lyZWRTaXplIDw9IDAgJiYgZGF0YS5kZXNpcmVkU2l6ZSA+IDApIHsKICAgICAgICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgICBzdHJlYW1TaW5rLmRlc2lyZWRTaXplID0gZGF0YS5kZXNpcmVkU2l6ZTsKICAgICAgICBQcm9taXNlLnRyeShzdHJlYW1TaW5rLm9uUHVsbCB8fCBvbkZuKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLAogICAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgICAgc3VjY2VzczogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsCiAgICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RyZWFtS2luZC5FTlFVRVVFOgogICAgICAgIGFzc2VydChzdHJlYW1Db250cm9sbGVyLCAiZW5xdWV1ZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpOwogICAgICAgIGlmIChzdHJlYW1Db250cm9sbGVyLmlzQ2xvc2VkKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jb250cm9sbGVyLmVucXVldWUoZGF0YS5jaHVuayk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RyZWFtS2luZC5DTE9TRToKICAgICAgICBhc3NlcnQoc3RyZWFtQ29udHJvbGxlciwgImNsb3NlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7CiAgICAgICAgaWYgKHN0cmVhbUNvbnRyb2xsZXIuaXNDbG9zZWQpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdHJlYW1Db250cm9sbGVyLmlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLkVSUk9SOgogICAgICAgIGFzc2VydChzdHJlYW1Db250cm9sbGVyLCAiZXJyb3Igc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTsKICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOwogICAgICAgIHRoaXMuI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFOgogICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsKICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbC5yZXNvbHZlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOwogICAgICAgIH0KICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLkNBTkNFTDoKICAgICAgICBpZiAoIXN0cmVhbVNpbmspIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjb25zdCBkYXRhUmVhc29uID0gd3JhcFJlYXNvbihkYXRhLnJlYXNvbik7CiAgICAgICAgUHJvbWlzZS50cnkoc3RyZWFtU2luay5vbkNhbmNlbCB8fCBvbkZuLCBkYXRhUmVhc29uKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsCiAgICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgICBzdWNjZXNzOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFLAogICAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbikKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVqZWN0KGRhdGFSZWFzb24pOwogICAgICAgIHN0cmVhbVNpbmsuaXNDYW5jZWxsZWQgPSB0cnVlOwogICAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2UiKTsKICAgIH0KICB9CiAgYXN5bmMgI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpIHsKICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbc3RyZWFtQ29udHJvbGxlci5zdGFydENhbGw/LnByb21pc2UsIHN0cmVhbUNvbnRyb2xsZXIucHVsbENhbGw/LnByb21pc2UsIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbD8ucHJvbWlzZV0pOwogICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdOwogIH0KICBkZXN0cm95KCkgewogICAgdGhpcy4jbWVzc2FnZUFDPy5hYm9ydCgpOwogICAgdGhpcy4jbWVzc2FnZUFDID0gbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3dyaXRlci5qcwoKCgoKCgoKYXN5bmMgZnVuY3Rpb24gd3JpdGVPYmplY3QocmVmLCBvYmosIGJ1ZmZlciwgewogIGVuY3J5cHQgPSBudWxsCn0pIHsKICBjb25zdCB0cmFuc2Zvcm0gPSBlbmNyeXB0Py5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0ocmVmLm51bSwgcmVmLmdlbik7CiAgYnVmZmVyLnB1c2goYCR7cmVmLm51bX0gJHtyZWYuZ2VufSBvYmpcbmApOwogIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBhd2FpdCB3cml0ZURpY3Qob2JqLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICBhd2FpdCB3cml0ZVN0cmVhbShvYmosIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKSkgewogICAgYXdhaXQgd3JpdGVBcnJheShvYmosIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICB9CiAgYnVmZmVyLnB1c2goIlxuZW5kb2JqXG4iKTsKfQphc3luYyBmdW5jdGlvbiB3cml0ZURpY3QoZGljdCwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBidWZmZXIucHVzaCgiPDwiKTsKICBmb3IgKGNvbnN0IGtleSBvZiBkaWN0LmdldEtleXMoKSkgewogICAgYnVmZmVyLnB1c2goYCAvJHtlc2NhcGVQREZOYW1lKGtleSl9IGApOwogICAgYXdhaXQgd3JpdGVWYWx1ZShkaWN0LmdldFJhdyhrZXkpLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfQogIGJ1ZmZlci5wdXNoKCI+PiIpOwp9CmFzeW5jIGZ1bmN0aW9uIHdyaXRlU3RyZWFtKHN0cmVhbSwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBsZXQgYnl0ZXMgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKICBjb25zdCB7CiAgICBkaWN0CiAgfSA9IHN0cmVhbTsKICBjb25zdCBbZmlsdGVyLCBwYXJhbXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2RpY3QuZ2V0QXN5bmMoIkZpbHRlciIpLCBkaWN0LmdldEFzeW5jKCJEZWNvZGVQYXJtcyIpXSk7CiAgY29uc3QgZmlsdGVyWmVybyA9IEFycmF5LmlzQXJyYXkoZmlsdGVyKSA/IGF3YWl0IGRpY3QueHJlZi5mZXRjaElmUmVmQXN5bmMoZmlsdGVyWzBdKSA6IGZpbHRlcjsKICBjb25zdCBpc0ZpbHRlclplcm9GbGF0ZURlY29kZSA9IGlzTmFtZShmaWx0ZXJaZXJvLCAiRmxhdGVEZWNvZGUiKTsKICBjb25zdCBNSU5fTEVOR1RIX0ZPUl9DT01QUkVTU0lORyA9IDI1NjsKICBpZiAoYnl0ZXMubGVuZ3RoID49IE1JTl9MRU5HVEhfRk9SX0NPTVBSRVNTSU5HIHx8IGlzRmlsdGVyWmVyb0ZsYXRlRGVjb2RlKSB7CiAgICB0cnkgewogICAgICBjb25zdCBjcyA9IG5ldyBDb21wcmVzc2lvblN0cmVhbSgiZGVmbGF0ZSIpOwogICAgICBjb25zdCB3cml0ZXIgPSBjcy53cml0YWJsZS5nZXRXcml0ZXIoKTsKICAgICAgYXdhaXQgd3JpdGVyLnJlYWR5OwogICAgICB3cml0ZXIud3JpdGUoYnl0ZXMpLnRoZW4oYXN5bmMgKCkgPT4gewogICAgICAgIGF3YWl0IHdyaXRlci5yZWFkeTsKICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTsKICAgICAgfSkuY2F0Y2goKCkgPT4ge30pOwogICAgICBjb25zdCBidWYgPSBhd2FpdCBuZXcgUmVzcG9uc2UoY3MucmVhZGFibGUpLmFycmF5QnVmZmVyKCk7CiAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKICAgICAgbGV0IG5ld0ZpbHRlciwgbmV3UGFyYW1zOwogICAgICBpZiAoIWZpbHRlcikgewogICAgICAgIG5ld0ZpbHRlciA9IE5hbWUuZ2V0KCJGbGF0ZURlY29kZSIpOwogICAgICB9IGVsc2UgaWYgKCFpc0ZpbHRlclplcm9GbGF0ZURlY29kZSkgewogICAgICAgIG5ld0ZpbHRlciA9IEFycmF5LmlzQXJyYXkoZmlsdGVyKSA/IFtOYW1lLmdldCgiRmxhdGVEZWNvZGUiKSwgLi4uZmlsdGVyXSA6IFtOYW1lLmdldCgiRmxhdGVEZWNvZGUiKSwgZmlsdGVyXTsKICAgICAgICBpZiAocGFyYW1zKSB7CiAgICAgICAgICBuZXdQYXJhbXMgPSBBcnJheS5pc0FycmF5KHBhcmFtcykgPyBbbnVsbCwgLi4ucGFyYW1zXSA6IFtudWxsLCBwYXJhbXNdOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobmV3RmlsdGVyKSB7CiAgICAgICAgZGljdC5zZXQoIkZpbHRlciIsIG5ld0ZpbHRlcik7CiAgICAgIH0KICAgICAgaWYgKG5ld1BhcmFtcykgewogICAgICAgIGRpY3Quc2V0KCJEZWNvZGVQYXJtcyIsIG5ld1BhcmFtcyk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGluZm8oYHdyaXRlU3RyZWFtIC0gY2Fubm90IGNvbXByZXNzIGRhdGE6ICIke2V4fSIuYCk7CiAgICB9CiAgfQogIGxldCBzdHJpbmcgPSBieXRlc1RvU3RyaW5nKGJ5dGVzKTsKICBpZiAodHJhbnNmb3JtKSB7CiAgICBzdHJpbmcgPSB0cmFuc2Zvcm0uZW5jcnlwdFN0cmluZyhzdHJpbmcpOwogIH0KICBkaWN0LnNldCgiTGVuZ3RoIiwgc3RyaW5nLmxlbmd0aCk7CiAgYXdhaXQgd3JpdGVEaWN0KGRpY3QsIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICBidWZmZXIucHVzaCgiIHN0cmVhbVxuIiwgc3RyaW5nLCAiXG5lbmRzdHJlYW0iKTsKfQphc3luYyBmdW5jdGlvbiB3cml0ZUFycmF5KGFycmF5LCBidWZmZXIsIHRyYW5zZm9ybSkgewogIGJ1ZmZlci5wdXNoKCJbIik7CiAgbGV0IGZpcnN0ID0gdHJ1ZTsKICBmb3IgKGNvbnN0IHZhbCBvZiBhcnJheSkgewogICAgaWYgKCFmaXJzdCkgewogICAgICBidWZmZXIucHVzaCgiICIpOwogICAgfSBlbHNlIHsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0KICAgIGF3YWl0IHdyaXRlVmFsdWUodmFsLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfQogIGJ1ZmZlci5wdXNoKCJdIik7Cn0KYXN5bmMgZnVuY3Rpb24gd3JpdGVWYWx1ZSh2YWx1ZSwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICBidWZmZXIucHVzaChgLyR7ZXNjYXBlUERGTmFtZSh2YWx1ZS5uYW1lKX1gKTsKICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmKSB7CiAgICBidWZmZXIucHVzaChgJHt2YWx1ZS5udW19ICR7dmFsdWUuZ2VufSBSYCk7CiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7CiAgICBhd2FpdCB3cml0ZUFycmF5KHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICBpZiAodHJhbnNmb3JtKSB7CiAgICAgIHZhbHVlID0gdHJhbnNmb3JtLmVuY3J5cHRTdHJpbmcodmFsdWUpOwogICAgfQogICAgYnVmZmVyLnB1c2goYCgke2VzY2FwZVN0cmluZyh2YWx1ZSl9KWApOwogIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAibnVtYmVyIikgewogICAgYnVmZmVyLnB1c2gobnVtYmVyVG9TdHJpbmcodmFsdWUpKTsKICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImJvb2xlYW4iKSB7CiAgICBidWZmZXIucHVzaCh2YWx1ZS50b1N0cmluZygpKTsKICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGljdCkgewogICAgYXdhaXQgd3JpdGVEaWN0KHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgIGF3YWl0IHdyaXRlU3RyZWFtKHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCkgewogICAgYnVmZmVyLnB1c2goIm51bGwiKTsKICB9IGVsc2UgewogICAgd2FybihgVW5oYW5kbGVkIHZhbHVlIGluIHdyaXRlcjogJHt0eXBlb2YgdmFsdWV9LCBwbGVhc2UgZmlsZSBhIGJ1Zy5gKTsKICB9Cn0KZnVuY3Rpb24gd3JpdGVJbnQobnVtYmVyLCBzaXplLCBvZmZzZXQsIGJ1ZmZlcikgewogIGZvciAobGV0IGkgPSBzaXplICsgb2Zmc2V0IC0gMTsgaSA+IG9mZnNldCAtIDE7IGktLSkgewogICAgYnVmZmVyW2ldID0gbnVtYmVyICYgMHhmZjsKICAgIG51bWJlciA+Pj0gODsKICB9CiAgcmV0dXJuIG9mZnNldCArIHNpemU7Cn0KZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyaW5nLCBvZmZzZXQsIGJ1ZmZlcikgewogIGNvbnN0IGlpID0gc3RyaW5nLmxlbmd0aDsKICBmb3IgKGxldCBpID0gMDsgaSA8IGlpOyBpKyspIHsKICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IHN0cmluZy5jaGFyQ29kZUF0KGkpICYgMHhmZjsKICB9CiAgcmV0dXJuIG9mZnNldCArIGlpOwp9CmZ1bmN0aW9uIGNvbXB1dGVNRDUoZmlsZXNpemUsIHhyZWZJbmZvKSB7CiAgY29uc3QgdGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApOwogIGNvbnN0IGZpbGVuYW1lID0geHJlZkluZm8uZmlsZW5hbWUgfHwgIiI7CiAgY29uc3QgbWQ1QnVmZmVyID0gW3RpbWUudG9TdHJpbmcoKSwgZmlsZW5hbWUsIGZpbGVzaXplLnRvU3RyaW5nKCksIC4uLk9iamVjdC52YWx1ZXMoeHJlZkluZm8uaW5mbyldOwogIGNvbnN0IG1kNUJ1ZmZlckxlbiA9IE1hdGguc3VtUHJlY2lzZShtZDVCdWZmZXIubWFwKHN0ciA9PiBzdHIubGVuZ3RoKSk7CiAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheShtZDVCdWZmZXJMZW4pOwogIGxldCBvZmZzZXQgPSAwOwogIGZvciAoY29uc3Qgc3RyIG9mIG1kNUJ1ZmZlcikgewogICAgb2Zmc2V0ID0gd3JpdGVTdHJpbmcoc3RyLCBvZmZzZXQsIGFycmF5KTsKICB9CiAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoY2FsY3VsYXRlTUQ1KGFycmF5LCAwLCBhcnJheS5sZW5ndGgpKTsKfQpmdW5jdGlvbiB3cml0ZVhGQURhdGFGb3JBY3JvZm9ybShzdHIsIGNoYW5nZXMpIHsKICBjb25zdCB4bWwgPSBuZXcgU2ltcGxlWE1MUGFyc2VyKHsKICAgIGhhc0F0dHJpYnV0ZXM6IHRydWUKICB9KS5wYXJzZUZyb21TdHJpbmcoc3RyKTsKICBmb3IgKGNvbnN0IHsKICAgIHhmYQogIH0gb2YgY2hhbmdlcykgewogICAgaWYgKCF4ZmEpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25zdCB7CiAgICAgIHBhdGgsCiAgICAgIHZhbHVlCiAgICB9ID0geGZhOwogICAgaWYgKCFwYXRoKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3Qgbm9kZVBhdGggPSBwYXJzZVhGQVBhdGgocGF0aCk7CiAgICBsZXQgbm9kZSA9IHhtbC5kb2N1bWVudEVsZW1lbnQuc2VhcmNoTm9kZShub2RlUGF0aCwgMCk7CiAgICBpZiAoIW5vZGUgJiYgbm9kZVBhdGgubGVuZ3RoID4gMSkgewogICAgICBub2RlID0geG1sLmRvY3VtZW50RWxlbWVudC5zZWFyY2hOb2RlKFtub2RlUGF0aC5hdCgtMSldLCAwKTsKICAgIH0KICAgIGlmIChub2RlKSB7CiAgICAgIG5vZGUuY2hpbGROb2RlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKHZhbCA9PiBuZXcgU2ltcGxlRE9NTm9kZSgidmFsdWUiLCB2YWwpKSA6IFtuZXcgU2ltcGxlRE9NTm9kZSgiI3RleHQiLCB2YWx1ZSldOwogICAgfSBlbHNlIHsKICAgICAgd2FybihgTm9kZSBub3QgZm91bmQgZm9yIHBhdGg6ICR7cGF0aH1gKTsKICAgIH0KICB9CiAgY29uc3QgYnVmZmVyID0gW107CiAgeG1sLmRvY3VtZW50RWxlbWVudC5kdW1wKGJ1ZmZlcik7CiAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKTsKfQphc3luYyBmdW5jdGlvbiB1cGRhdGVBY3JvZm9ybSh7CiAgeHJlZiwKICBhY3JvRm9ybSwKICBhY3JvRm9ybVJlZiwKICBoYXNYZmEsCiAgaGFzWGZhRGF0YXNldHNFbnRyeSwKICB4ZmFEYXRhc2V0c1JlZiwKICBuZWVkQXBwZWFyYW5jZXMsCiAgY2hhbmdlcwp9KSB7CiAgaWYgKGhhc1hmYSAmJiAhaGFzWGZhRGF0YXNldHNFbnRyeSAmJiAheGZhRGF0YXNldHNSZWYpIHsKICAgIHdhcm4oIlhGQSAtIENhbm5vdCBzYXZlIGl0Iik7CiAgfQogIGlmICghbmVlZEFwcGVhcmFuY2VzICYmICghaGFzWGZhIHx8ICF4ZmFEYXRhc2V0c1JlZiB8fCBoYXNYZmFEYXRhc2V0c0VudHJ5KSkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCBkaWN0ID0gYWNyb0Zvcm0uY2xvbmUoKTsKICBpZiAoaGFzWGZhICYmICFoYXNYZmFEYXRhc2V0c0VudHJ5KSB7CiAgICBjb25zdCBuZXdYZmEgPSBhY3JvRm9ybS5nZXQoIlhGQSIpLnNsaWNlKCk7CiAgICBuZXdYZmEuc3BsaWNlKDIsIDAsICJkYXRhc2V0cyIpOwogICAgbmV3WGZhLnNwbGljZSgzLCAwLCB4ZmFEYXRhc2V0c1JlZik7CiAgICBkaWN0LnNldCgiWEZBIiwgbmV3WGZhKTsKICB9CiAgaWYgKG5lZWRBcHBlYXJhbmNlcykgewogICAgZGljdC5zZXQoIk5lZWRBcHBlYXJhbmNlcyIsIHRydWUpOwogIH0KICBjaGFuZ2VzLnB1dChhY3JvRm9ybVJlZiwgewogICAgZGF0YTogZGljdAogIH0pOwp9CmZ1bmN0aW9uIHVwZGF0ZVhGQSh7CiAgeGZhRGF0YSwKICB4ZmFEYXRhc2V0c1JlZiwKICBjaGFuZ2VzLAogIHhyZWYKfSkgewogIGlmICh4ZmFEYXRhID09PSBudWxsKSB7CiAgICBjb25zdCBkYXRhc2V0cyA9IHhyZWYuZmV0Y2hJZlJlZih4ZmFEYXRhc2V0c1JlZik7CiAgICB4ZmFEYXRhID0gd3JpdGVYRkFEYXRhRm9yQWNyb2Zvcm0oZGF0YXNldHMuZ2V0U3RyaW5nKCksIGNoYW5nZXMpOwogIH0KICBjb25zdCB4ZmFEYXRhU3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbSh4ZmFEYXRhKTsKICB4ZmFEYXRhU3RyZWFtLmRpY3QgPSBuZXcgRGljdCh4cmVmKTsKICB4ZmFEYXRhU3RyZWFtLmRpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkVtYmVkZGVkRmlsZSIpKTsKICBjaGFuZ2VzLnB1dCh4ZmFEYXRhc2V0c1JlZiwgewogICAgZGF0YTogeGZhRGF0YVN0cmVhbQogIH0pOwp9CmFzeW5jIGZ1bmN0aW9uIGdldFhSZWZUYWJsZSh4cmVmSW5mbywgYmFzZU9mZnNldCwgbmV3UmVmcywgbmV3WHJlZiwgYnVmZmVyKSB7CiAgYnVmZmVyLnB1c2goInhyZWZcbiIpOwogIGNvbnN0IGluZGV4ZXMgPSBnZXRJbmRleGVzKG5ld1JlZnMpOwogIGxldCBpbmRleGVzUG9zaXRpb24gPSAwOwogIGZvciAoY29uc3QgewogICAgcmVmLAogICAgZGF0YQogIH0gb2YgbmV3UmVmcykgewogICAgaWYgKHJlZi5udW0gPT09IGluZGV4ZXNbaW5kZXhlc1Bvc2l0aW9uXSkgewogICAgICBidWZmZXIucHVzaChgJHtpbmRleGVzW2luZGV4ZXNQb3NpdGlvbl19ICR7aW5kZXhlc1tpbmRleGVzUG9zaXRpb24gKyAxXX1cbmApOwogICAgICBpbmRleGVzUG9zaXRpb24gKz0gMjsKICAgIH0KICAgIGlmIChkYXRhICE9PSBudWxsKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGAke2Jhc2VPZmZzZXQudG9TdHJpbmcoKS5wYWRTdGFydCgxMCwgIjAiKX0gJHtNYXRoLm1pbihyZWYuZ2VuLCAweGZmZmYpLnRvU3RyaW5nKCkucGFkU3RhcnQoNSwgIjAiKX0gblxyXG5gKTsKICAgICAgYmFzZU9mZnNldCArPSBkYXRhLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGJ1ZmZlci5wdXNoKGAwMDAwMDAwMDAwICR7TWF0aC5taW4ocmVmLmdlbiArIDEsIDB4ZmZmZikudG9TdHJpbmcoKS5wYWRTdGFydCg1LCAiMCIpfSBmXHJcbmApOwogICAgfQogIH0KICBjb21wdXRlSURzKGJhc2VPZmZzZXQsIHhyZWZJbmZvLCBuZXdYcmVmKTsKICBidWZmZXIucHVzaCgidHJhaWxlclxuIik7CiAgYXdhaXQgd3JpdGVEaWN0KG5ld1hyZWYsIGJ1ZmZlcik7CiAgYnVmZmVyLnB1c2goIlxuc3RhcnR4cmVmXG4iLCBiYXNlT2Zmc2V0LnRvU3RyaW5nKCksICJcbiUlRU9GXG4iKTsKfQpmdW5jdGlvbiBnZXRJbmRleGVzKG5ld1JlZnMpIHsKICBjb25zdCBpbmRleGVzID0gW107CiAgZm9yIChjb25zdCB7CiAgICByZWYKICB9IG9mIG5ld1JlZnMpIHsKICAgIGlmIChyZWYubnVtID09PSBpbmRleGVzLmF0KC0yKSArIGluZGV4ZXMuYXQoLTEpKSB7CiAgICAgIGluZGV4ZXNbaW5kZXhlcy5sZW5ndGggLSAxXSArPSAxOwogICAgfSBlbHNlIHsKICAgICAgaW5kZXhlcy5wdXNoKHJlZi5udW0sIDEpOwogICAgfQogIH0KICByZXR1cm4gaW5kZXhlczsKfQphc3luYyBmdW5jdGlvbiBnZXRYUmVmU3RyZWFtVGFibGUoeHJlZkluZm8sIGJhc2VPZmZzZXQsIG5ld1JlZnMsIG5ld1hyZWYsIGJ1ZmZlcikgewogIGNvbnN0IHhyZWZUYWJsZURhdGEgPSBbXTsKICBsZXQgbWF4T2Zmc2V0ID0gMDsKICBsZXQgbWF4R2VuID0gMDsKICBmb3IgKGNvbnN0IHsKICAgIHJlZiwKICAgIGRhdGEKICB9IG9mIG5ld1JlZnMpIHsKICAgIGxldCBnZW47CiAgICBtYXhPZmZzZXQgPSBNYXRoLm1heChtYXhPZmZzZXQsIGJhc2VPZmZzZXQpOwogICAgaWYgKGRhdGEgIT09IG51bGwpIHsKICAgICAgZ2VuID0gTWF0aC5taW4ocmVmLmdlbiwgMHhmZmZmKTsKICAgICAgeHJlZlRhYmxlRGF0YS5wdXNoKFsxLCBiYXNlT2Zmc2V0LCBnZW5dKTsKICAgICAgYmFzZU9mZnNldCArPSBkYXRhLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGdlbiA9IE1hdGgubWluKHJlZi5nZW4gKyAxLCAweGZmZmYpOwogICAgICB4cmVmVGFibGVEYXRhLnB1c2goWzAsIDAsIGdlbl0pOwogICAgfQogICAgbWF4R2VuID0gTWF0aC5tYXgobWF4R2VuLCBnZW4pOwogIH0KICBuZXdYcmVmLnNldCgiSW5kZXgiLCBnZXRJbmRleGVzKG5ld1JlZnMpKTsKICBjb25zdCBvZmZzZXRTaXplID0gZ2V0U2l6ZUluQnl0ZXMobWF4T2Zmc2V0KTsKICBjb25zdCBtYXhHZW5TaXplID0gZ2V0U2l6ZUluQnl0ZXMobWF4R2VuKTsKICBjb25zdCBzaXplcyA9IFsxLCBvZmZzZXRTaXplLCBtYXhHZW5TaXplXTsKICBuZXdYcmVmLnNldCgiVyIsIHNpemVzKTsKICBjb21wdXRlSURzKGJhc2VPZmZzZXQsIHhyZWZJbmZvLCBuZXdYcmVmKTsKICBjb25zdCBzdHJ1Y3RTaXplID0gTWF0aC5zdW1QcmVjaXNlKHNpemVzKTsKICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoc3RydWN0U2l6ZSAqIHhyZWZUYWJsZURhdGEubGVuZ3RoKTsKICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyZWFtKGRhdGEpOwogIHN0cmVhbS5kaWN0ID0gbmV3WHJlZjsKICBsZXQgb2Zmc2V0ID0gMDsKICBmb3IgKGNvbnN0IFt0eXBlLCBvYmpPZmZzZXQsIGdlbl0gb2YgeHJlZlRhYmxlRGF0YSkgewogICAgb2Zmc2V0ID0gd3JpdGVJbnQodHlwZSwgc2l6ZXNbMF0sIG9mZnNldCwgZGF0YSk7CiAgICBvZmZzZXQgPSB3cml0ZUludChvYmpPZmZzZXQsIHNpemVzWzFdLCBvZmZzZXQsIGRhdGEpOwogICAgb2Zmc2V0ID0gd3JpdGVJbnQoZ2VuLCBzaXplc1syXSwgb2Zmc2V0LCBkYXRhKTsKICB9CiAgYXdhaXQgd3JpdGVPYmplY3QoeHJlZkluZm8ubmV3UmVmLCBzdHJlYW0sIGJ1ZmZlciwge30pOwogIGJ1ZmZlci5wdXNoKCJzdGFydHhyZWZcbiIsIGJhc2VPZmZzZXQudG9TdHJpbmcoKSwgIlxuJSVFT0ZcbiIpOwp9CmZ1bmN0aW9uIGNvbXB1dGVJRHMoYmFzZU9mZnNldCwgeHJlZkluZm8sIG5ld1hyZWYpIHsKICBpZiAoQXJyYXkuaXNBcnJheSh4cmVmSW5mby5maWxlSWRzKSAmJiB4cmVmSW5mby5maWxlSWRzLmxlbmd0aCA+IDApIHsKICAgIGNvbnN0IG1kNSA9IGNvbXB1dGVNRDUoYmFzZU9mZnNldCwgeHJlZkluZm8pOwogICAgbmV3WHJlZi5zZXQoIklEIiwgW3hyZWZJbmZvLmZpbGVJZHNbMF0sIG1kNV0pOwogIH0KfQpmdW5jdGlvbiBnZXRUcmFpbGVyRGljdCh4cmVmSW5mbywgY2hhbmdlcywgdXNlWHJlZlN0cmVhbSkgewogIGNvbnN0IG5ld1hyZWYgPSBuZXcgRGljdChudWxsKTsKICBuZXdYcmVmLnNldCgiUHJldiIsIHhyZWZJbmZvLnN0YXJ0WFJlZik7CiAgY29uc3QgcmVmRm9yWHJlZlRhYmxlID0geHJlZkluZm8ubmV3UmVmOwogIGlmICh1c2VYcmVmU3RyZWFtKSB7CiAgICBjaGFuZ2VzLnB1dChyZWZGb3JYcmVmVGFibGUsIHsKICAgICAgZGF0YTogIiIKICAgIH0pOwogICAgbmV3WHJlZi5zZXQoIlNpemUiLCByZWZGb3JYcmVmVGFibGUubnVtICsgMSk7CiAgICBuZXdYcmVmLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYUmVmIikpOwogIH0gZWxzZSB7CiAgICBuZXdYcmVmLnNldCgiU2l6ZSIsIHJlZkZvclhyZWZUYWJsZS5udW0pOwogIH0KICBpZiAoeHJlZkluZm8ucm9vdFJlZiAhPT0gbnVsbCkgewogICAgbmV3WHJlZi5zZXQoIlJvb3QiLCB4cmVmSW5mby5yb290UmVmKTsKICB9CiAgaWYgKHhyZWZJbmZvLmluZm9SZWYgIT09IG51bGwpIHsKICAgIG5ld1hyZWYuc2V0KCJJbmZvIiwgeHJlZkluZm8uaW5mb1JlZik7CiAgfQogIGlmICh4cmVmSW5mby5lbmNyeXB0UmVmICE9PSBudWxsKSB7CiAgICBuZXdYcmVmLnNldCgiRW5jcnlwdCIsIHhyZWZJbmZvLmVuY3J5cHRSZWYpOwogIH0KICByZXR1cm4gbmV3WHJlZjsKfQphc3luYyBmdW5jdGlvbiB3cml0ZUNoYW5nZXMoY2hhbmdlcywgeHJlZiwgYnVmZmVyID0gW10pIHsKICBjb25zdCBuZXdSZWZzID0gW107CiAgZm9yIChjb25zdCBbcmVmLCB7CiAgICBkYXRhCiAgfV0gb2YgY2hhbmdlcy5pdGVtcygpKSB7CiAgICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIpIHsKICAgICAgbmV3UmVmcy5wdXNoKHsKICAgICAgICByZWYsCiAgICAgICAgZGF0YQogICAgICB9KTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBhd2FpdCB3cml0ZU9iamVjdChyZWYsIGRhdGEsIGJ1ZmZlciwgeHJlZik7CiAgICBuZXdSZWZzLnB1c2goewogICAgICByZWYsCiAgICAgIGRhdGE6IGJ1ZmZlci5qb2luKCIiKQogICAgfSk7CiAgICBidWZmZXIubGVuZ3RoID0gMDsKICB9CiAgcmV0dXJuIG5ld1JlZnMuc29ydCgoYSwgYikgPT4gYS5yZWYubnVtIC0gYi5yZWYubnVtKTsKfQphc3luYyBmdW5jdGlvbiBpbmNyZW1lbnRhbFVwZGF0ZSh7CiAgb3JpZ2luYWxEYXRhLAogIHhyZWZJbmZvLAogIGNoYW5nZXMsCiAgeHJlZiA9IG51bGwsCiAgaGFzWGZhID0gZmFsc2UsCiAgeGZhRGF0YXNldHNSZWYgPSBudWxsLAogIGhhc1hmYURhdGFzZXRzRW50cnkgPSBmYWxzZSwKICBuZWVkQXBwZWFyYW5jZXMsCiAgYWNyb0Zvcm1SZWYgPSBudWxsLAogIGFjcm9Gb3JtID0gbnVsbCwKICB4ZmFEYXRhID0gbnVsbCwKICB1c2VYcmVmU3RyZWFtID0gZmFsc2UKfSkgewogIGF3YWl0IHVwZGF0ZUFjcm9mb3JtKHsKICAgIHhyZWYsCiAgICBhY3JvRm9ybSwKICAgIGFjcm9Gb3JtUmVmLAogICAgaGFzWGZhLAogICAgaGFzWGZhRGF0YXNldHNFbnRyeSwKICAgIHhmYURhdGFzZXRzUmVmLAogICAgbmVlZEFwcGVhcmFuY2VzLAogICAgY2hhbmdlcwogIH0pOwogIGlmIChoYXNYZmEpIHsKICAgIHVwZGF0ZVhGQSh7CiAgICAgIHhmYURhdGEsCiAgICAgIHhmYURhdGFzZXRzUmVmLAogICAgICBjaGFuZ2VzLAogICAgICB4cmVmCiAgICB9KTsKICB9CiAgY29uc3QgbmV3WHJlZiA9IGdldFRyYWlsZXJEaWN0KHhyZWZJbmZvLCBjaGFuZ2VzLCB1c2VYcmVmU3RyZWFtKTsKICBjb25zdCBidWZmZXIgPSBbXTsKICBjb25zdCBuZXdSZWZzID0gYXdhaXQgd3JpdGVDaGFuZ2VzKGNoYW5nZXMsIHhyZWYsIGJ1ZmZlcik7CiAgbGV0IGJhc2VPZmZzZXQgPSBvcmlnaW5hbERhdGEubGVuZ3RoOwogIGNvbnN0IGxhc3RCeXRlID0gb3JpZ2luYWxEYXRhLmF0KC0xKTsKICBpZiAobGFzdEJ5dGUgIT09IDB4MGEgJiYgbGFzdEJ5dGUgIT09IDB4MGQpIHsKICAgIGJ1ZmZlci5wdXNoKCJcbiIpOwogICAgYmFzZU9mZnNldCArPSAxOwogIH0KICBmb3IgKGNvbnN0IHsKICAgIGRhdGEKICB9IG9mIG5ld1JlZnMpIHsKICAgIGlmIChkYXRhICE9PSBudWxsKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGRhdGEpOwogICAgfQogIH0KICBhd2FpdCAodXNlWHJlZlN0cmVhbSA/IGdldFhSZWZTdHJlYW1UYWJsZSh4cmVmSW5mbywgYmFzZU9mZnNldCwgbmV3UmVmcywgbmV3WHJlZiwgYnVmZmVyKSA6IGdldFhSZWZUYWJsZSh4cmVmSW5mbywgYmFzZU9mZnNldCwgbmV3UmVmcywgbmV3WHJlZiwgYnVmZmVyKSk7CiAgY29uc3QgdG90YWxMZW5ndGggPSBvcmlnaW5hbERhdGEubGVuZ3RoICsgTWF0aC5zdW1QcmVjaXNlKGJ1ZmZlci5tYXAoc3RyID0+IHN0ci5sZW5ndGgpKTsKICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTsKICBhcnJheS5zZXQob3JpZ2luYWxEYXRhKTsKICBsZXQgb2Zmc2V0ID0gb3JpZ2luYWxEYXRhLmxlbmd0aDsKICBmb3IgKGNvbnN0IHN0ciBvZiBidWZmZXIpIHsKICAgIG9mZnNldCA9IHdyaXRlU3RyaW5nKHN0ciwgb2Zmc2V0LCBhcnJheSk7CiAgfQogIHJldHVybiBhcnJheTsKfQoKOy8vIC4vc3JjL2NvcmUvd29ya2VyX3N0cmVhbS5qcwoKY2xhc3MgUERGV29ya2VyU3RyZWFtIHsKICBjb25zdHJ1Y3Rvcihtc2dIYW5kbGVyKSB7CiAgICB0aGlzLl9tc2dIYW5kbGVyID0gbXNnSGFuZGxlcjsKICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsOwogICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsOwogICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdOwogIH0KICBnZXRGdWxsUmVhZGVyKCkgewogICAgYXNzZXJ0KCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgIlBERldvcmtlclN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpOwogICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGV29ya2VyU3RyZWFtUmVhZGVyKHRoaXMuX21zZ0hhbmRsZXIpOwogICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyOwogIH0KICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7CiAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCwgdGhpcy5fbXNnSGFuZGxlcik7CiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmVhZGVyKTsKICAgIHJldHVybiByZWFkZXI7CiAgfQogIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikgewogICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pOwogICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkgewogICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7CiAgICB9CiAgfQp9CmNsYXNzIFBERldvcmtlclN0cmVhbVJlYWRlciB7CiAgY29uc3RydWN0b3IobXNnSGFuZGxlcikgewogICAgdGhpcy5fbXNnSGFuZGxlciA9IG1zZ0hhbmRsZXI7CiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOwogICAgdGhpcy5fY29udGVudExlbmd0aCA9IG51bGw7CiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gZmFsc2U7CiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGZhbHNlOwogICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLl9tc2dIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKCJHZXRSZWFkZXIiKTsKICAgIHRoaXMuX3JlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOwogICAgdGhpcy5faGVhZGVyc1JlYWR5ID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIlJlYWRlckhlYWRlcnNSZWFkeSIpLnRoZW4oZGF0YSA9PiB7CiAgICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gZGF0YS5pc1N0cmVhbWluZ1N1cHBvcnRlZDsKICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGRhdGEuaXNSYW5nZVN1cHBvcnRlZDsKICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGRhdGEuY29udGVudExlbmd0aDsKICAgIH0pOwogIH0KICBnZXQgaGVhZGVyc1JlYWR5KCkgewogICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTsKICB9CiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDsKICB9CiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkgewogICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkOwogIH0KICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHsKICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkOwogIH0KICBhc3luYyByZWFkKCkgewogICAgY29uc3QgewogICAgICB2YWx1ZSwKICAgICAgZG9uZQogICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7CiAgICBpZiAoZG9uZSkgewogICAgICByZXR1cm4gewogICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCiAgICAgICAgZG9uZTogdHJ1ZQogICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgdmFsdWU6IHZhbHVlLmJ1ZmZlciwKICAgICAgZG9uZTogZmFsc2UKICAgIH07CiAgfQogIGNhbmNlbChyZWFzb24pIHsKICAgIHRoaXMuX3JlYWRlci5jYW5jZWwocmVhc29uKTsKICB9Cn0KY2xhc3MgUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXIgewogIGNvbnN0cnVjdG9yKGJlZ2luLCBlbmQsIG1zZ0hhbmRsZXIpIHsKICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyOwogICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0UmFuZ2VSZWFkZXIiLCB7CiAgICAgIGJlZ2luLAogICAgICBlbmQKICAgIH0pOwogICAgdGhpcy5fcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7CiAgfQogIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgcmVhZCgpIHsKICAgIGNvbnN0IHsKICAgICAgdmFsdWUsCiAgICAgIGRvbmUKICAgIH0gPSBhd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpOwogICAgaWYgKGRvbmUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICAgIGRvbmU6IHRydWUKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHZhbHVlOiB2YWx1ZS5idWZmZXIsCiAgICAgIGRvbmU6IGZhbHNlCiAgICB9OwogIH0KICBjYW5jZWwocmVhc29uKSB7CiAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKHJlYXNvbik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS93b3JrZXIuanMKCgoKCgoKCgoKCmNsYXNzIFdvcmtlclRhc2sgewogIGNvbnN0cnVjdG9yKG5hbWUpIHsKICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICB0aGlzLnRlcm1pbmF0ZWQgPSBmYWxzZTsKICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTsKICB9CiAgZ2V0IGZpbmlzaGVkKCkgewogICAgcmV0dXJuIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZTsKICB9CiAgZmluaXNoKCkgewogICAgdGhpcy5fY2FwYWJpbGl0eS5yZXNvbHZlKCk7CiAgfQogIHRlcm1pbmF0ZSgpIHsKICAgIHRoaXMudGVybWluYXRlZCA9IHRydWU7CiAgfQogIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKSB7CiAgICBpZiAodGhpcy50ZXJtaW5hdGVkKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya2VyIHRhc2sgd2FzIHRlcm1pbmF0ZWQiKTsKICAgIH0KICB9Cn0KY2xhc3MgV29ya2VyTWVzc2FnZUhhbmRsZXIgewogIHN0YXRpYyB7CiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gInVuZGVmaW5lZCIgJiYgIWlzTm9kZUpTICYmIHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2Ygc2VsZi5wb3N0TWVzc2FnZSA9PT0gImZ1bmN0aW9uIiAmJiAib25tZXNzYWdlIiBpbiBzZWxmKSB7CiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZyb21Qb3J0KHNlbGYpOwogICAgfQogIH0KICBzdGF0aWMgc2V0dXAoaGFuZGxlciwgcG9ydCkgewogICAgbGV0IHRlc3RNZXNzYWdlUHJvY2Vzc2VkID0gZmFsc2U7CiAgICBoYW5kbGVyLm9uKCJ0ZXN0IiwgZGF0YSA9PiB7CiAgICAgIGlmICh0ZXN0TWVzc2FnZVByb2Nlc3NlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0ZXN0TWVzc2FnZVByb2Nlc3NlZCA9IHRydWU7CiAgICAgIGhhbmRsZXIuc2VuZCgidGVzdCIsIGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiY29uZmlndXJlIiwgZGF0YSA9PiB7CiAgICAgIHNldFZlcmJvc2l0eUxldmVsKGRhdGEudmVyYm9zaXR5KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0RG9jUmVxdWVzdCIsIGRhdGEgPT4gdGhpcy5jcmVhdGVEb2N1bWVudEhhbmRsZXIoZGF0YSwgcG9ydCkpOwogIH0KICBzdGF0aWMgY3JlYXRlRG9jdW1lbnRIYW5kbGVyKGRvY1BhcmFtcywgcG9ydCkgewogICAgbGV0IHBkZk1hbmFnZXI7CiAgICBsZXQgdGVybWluYXRlZCA9IGZhbHNlOwogICAgbGV0IGNhbmNlbFhIUnMgPSBudWxsOwogICAgY29uc3QgV29ya2VyVGFza3MgPSBuZXcgU2V0KCk7CiAgICBjb25zdCB2ZXJib3NpdHkgPSBnZXRWZXJib3NpdHlMZXZlbCgpOwogICAgY29uc3QgewogICAgICBkb2NJZCwKICAgICAgYXBpVmVyc2lvbgogICAgfSA9IGRvY1BhcmFtczsKICAgIGNvbnN0IHdvcmtlclZlcnNpb24gPSAiNS4xLjkxIjsKICAgIGlmIChhcGlWZXJzaW9uICE9PSB3b3JrZXJWZXJzaW9uKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEFQSSB2ZXJzaW9uICIke2FwaVZlcnNpb259IiBkb2VzIG5vdCBtYXRjaCBgICsgYHRoZSBXb3JrZXIgdmVyc2lvbiAiJHt3b3JrZXJWZXJzaW9ufSIuYCk7CiAgICB9CiAgICBjb25zdCBlbnVtZXJhYmxlUHJvcGVydGllcyA9IFtdOwogICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBbXSkgewogICAgICBlbnVtZXJhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTsKICAgIH0KICAgIGlmIChlbnVtZXJhYmxlUHJvcGVydGllcy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgYEFycmF5LnByb3RvdHlwZWAgY29udGFpbnMgdW5leHBlY3RlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXM6ICIgKyBlbnVtZXJhYmxlUHJvcGVydGllcy5qb2luKCIsICIpICsgIjsgdGh1cyBicmVha2luZyBlLmcuIGBmb3IuLi5pbmAgaXRlcmF0aW9uIG9mIGBBcnJheWBzLiIpOwogICAgfQogICAgY29uc3Qgd29ya2VySGFuZGxlck5hbWUgPSBkb2NJZCArICJfd29ya2VyIjsKICAgIGxldCBoYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKHdvcmtlckhhbmRsZXJOYW1lLCBkb2NJZCwgcG9ydCk7CiAgICBmdW5jdGlvbiBlbnN1cmVOb3RUZXJtaW5hdGVkKCkgewogICAgICBpZiAodGVybWluYXRlZCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkIik7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0YXJ0V29ya2VyVGFzayh0YXNrKSB7CiAgICAgIFdvcmtlclRhc2tzLmFkZCh0YXNrKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZpbmlzaFdvcmtlclRhc2sodGFzaykgewogICAgICB0YXNrLmZpbmlzaCgpOwogICAgICBXb3JrZXJUYXNrcy5kZWxldGUodGFzayk7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBsb2FkRG9jdW1lbnQocmVjb3ZlcnlNb2RlKSB7CiAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJjaGVja0hlYWRlciIpOwogICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygicGFyc2VTdGFydFhSZWYiKTsKICAgICAgYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoInBhcnNlIiwgW3JlY292ZXJ5TW9kZV0pOwogICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiY2hlY2tGaXJzdFBhZ2UiLCBbcmVjb3ZlcnlNb2RlXSk7CiAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJjaGVja0xhc3RQYWdlIiwgW3JlY292ZXJ5TW9kZV0pOwogICAgICBjb25zdCBpc1B1cmVYZmEgPSBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiaXNQdXJlWGZhIik7CiAgICAgIGlmIChpc1B1cmVYZmEpIHsKICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soImxvYWRYZmFGb250cyIpOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5sb2FkWGZhRm9udHMoaGFuZGxlciwgdGFzaykuY2F0Y2gocmVhc29uID0+IHt9KS50aGVuKCgpID0+IGZpbmlzaFdvcmtlclRhc2sodGFzaykpLCBwZGZNYW5hZ2VyLmxvYWRYZmFJbWFnZXMoKV0pOwogICAgICB9CiAgICAgIGNvbnN0IFtudW1QYWdlcywgZmluZ2VycHJpbnRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZURvYygibnVtUGFnZXMiKSwgcGRmTWFuYWdlci5lbnN1cmVEb2MoImZpbmdlcnByaW50cyIpXSk7CiAgICAgIGNvbnN0IGh0bWxGb3JYZmEgPSBpc1B1cmVYZmEgPyBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiaHRtbEZvclhmYSIpIDogbnVsbDsKICAgICAgcmV0dXJuIHsKICAgICAgICBudW1QYWdlcywKICAgICAgICBmaW5nZXJwcmludHMsCiAgICAgICAgaHRtbEZvclhmYQogICAgICB9OwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gZ2V0UGRmTWFuYWdlcih7CiAgICAgIGRhdGEsCiAgICAgIHBhc3N3b3JkLAogICAgICBkaXNhYmxlQXV0b0ZldGNoLAogICAgICByYW5nZUNodW5rU2l6ZSwKICAgICAgbGVuZ3RoLAogICAgICBkb2NCYXNlVXJsLAogICAgICBlbmFibGVYZmEsCiAgICAgIGV2YWx1YXRvck9wdGlvbnMKICAgIH0pIHsKICAgICAgY29uc3QgcGRmTWFuYWdlckFyZ3MgPSB7CiAgICAgICAgc291cmNlOiBudWxsLAogICAgICAgIGRpc2FibGVBdXRvRmV0Y2gsCiAgICAgICAgZG9jQmFzZVVybCwKICAgICAgICBkb2NJZCwKICAgICAgICBlbmFibGVYZmEsCiAgICAgICAgZXZhbHVhdG9yT3B0aW9ucywKICAgICAgICBoYW5kbGVyLAogICAgICAgIGxlbmd0aCwKICAgICAgICBwYXNzd29yZCwKICAgICAgICByYW5nZUNodW5rU2l6ZQogICAgICB9OwogICAgICBpZiAoZGF0YSkgewogICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IGRhdGE7CiAgICAgICAgcmV0dXJuIG5ldyBMb2NhbFBkZk1hbmFnZXIocGRmTWFuYWdlckFyZ3MpOwogICAgICB9CiAgICAgIGNvbnN0IHBkZlN0cmVhbSA9IG5ldyBQREZXb3JrZXJTdHJlYW0oaGFuZGxlciksCiAgICAgICAgZnVsbFJlcXVlc3QgPSBwZGZTdHJlYW0uZ2V0RnVsbFJlYWRlcigpOwogICAgICBjb25zdCBwZGZNYW5hZ2VyQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgICBsZXQgbmV3UGRmTWFuYWdlciwKICAgICAgICBjYWNoZWRDaHVua3MgPSBbXSwKICAgICAgICBsb2FkZWQgPSAwOwogICAgICBmdWxsUmVxdWVzdC5oZWFkZXJzUmVhZHkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFmdWxsUmVxdWVzdC5pc1JhbmdlU3VwcG9ydGVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IHBkZlN0cmVhbTsKICAgICAgICBwZGZNYW5hZ2VyQXJncy5sZW5ndGggPSBmdWxsUmVxdWVzdC5jb250ZW50TGVuZ3RoOwogICAgICAgIHBkZk1hbmFnZXJBcmdzLmRpc2FibGVBdXRvRmV0Y2ggfHw9IGZ1bGxSZXF1ZXN0LmlzU3RyZWFtaW5nU3VwcG9ydGVkOwogICAgICAgIG5ld1BkZk1hbmFnZXIgPSBuZXcgTmV0d29ya1BkZk1hbmFnZXIocGRmTWFuYWdlckFyZ3MpOwogICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2FjaGVkQ2h1bmtzKSB7CiAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnNlbmRQcm9ncmVzc2l2ZURhdGEoY2h1bmspOwogICAgICAgIH0KICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpOwogICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7CiAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7CiAgICAgIH0pOwogICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgY29uc3QgcmVhZENodW5rID0gZnVuY3Rpb24gKHsKICAgICAgICAgIHZhbHVlLAogICAgICAgICAgZG9uZQogICAgICAgIH0pIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgICAgICAgaWYgKGRvbmUpIHsKICAgICAgICAgICAgICBpZiAoIW5ld1BkZk1hbmFnZXIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBkZkZpbGUgPSBhcnJheUJ1ZmZlcnNUb0J5dGVzKGNhY2hlZENodW5rcyk7CiAgICAgICAgICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKICAgICAgICAgICAgICAgIGlmIChsZW5ndGggJiYgcGRmRmlsZS5sZW5ndGggIT09IGxlbmd0aCkgewogICAgICAgICAgICAgICAgICB3YXJuKCJyZXBvcnRlZCBIVFRQIGxlbmd0aCBpcyBkaWZmZXJlbnQgZnJvbSBhY3R1YWwiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IHBkZkZpbGU7CiAgICAgICAgICAgICAgICBuZXdQZGZNYW5hZ2VyID0gbmV3IExvY2FsUGRmTWFuYWdlcihwZGZNYW5hZ2VyQXJncyk7CiAgICAgICAgICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjYW5jZWxYSFJzID0gbnVsbDsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7CiAgICAgICAgICAgIGlmICghZnVsbFJlcXVlc3QuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY1Byb2dyZXNzIiwgewogICAgICAgICAgICAgICAgbG9hZGVkLAogICAgICAgICAgICAgICAgdG90YWw6IE1hdGgubWF4KGxvYWRlZCwgZnVsbFJlcXVlc3QuY29udGVudExlbmd0aCB8fCAwKQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXdQZGZNYW5hZ2VyKSB7CiAgICAgICAgICAgICAgbmV3UGRmTWFuYWdlci5zZW5kUHJvZ3Jlc3NpdmVEYXRhKHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjYWNoZWRDaHVua3MucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVsbFJlcXVlc3QucmVhZCgpLnRoZW4ocmVhZENodW5rLCByZWplY3QpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICByZWplY3QoZSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBmdWxsUmVxdWVzdC5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KGUpOwogICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOwogICAgICB9KTsKICAgICAgY2FuY2VsWEhScyA9IHJlYXNvbiA9PiB7CiAgICAgICAgcGRmU3RyZWFtLmNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbik7CiAgICAgIH07CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5wcm9taXNlOwogICAgfQogICAgZnVuY3Rpb24gc2V0dXBEb2MoZGF0YSkgewogICAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoZG9jKSB7CiAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICAgIGhhbmRsZXIuc2VuZCgiR2V0RG9jIiwgewogICAgICAgICAgcGRmSW5mbzogZG9jCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gb25GYWlsdXJlKGV4KSB7CiAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFBhc3N3b3JkRXhjZXB0aW9uKSB7CiAgICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soYFBhc3N3b3JkRXhjZXB0aW9uOiByZXNwb25zZSAke2V4LmNvZGV9YCk7CiAgICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICBoYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiUGFzc3dvcmRSZXF1ZXN0IiwgZXgpLnRoZW4oZnVuY3Rpb24gKHsKICAgICAgICAgICAgcGFzc3dvcmQKICAgICAgICAgIH0pIHsKICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgcGRmTWFuYWdlci51cGRhdGVQYXNzd29yZChwYXNzd29yZCk7CiAgICAgICAgICAgIHBkZk1hbmFnZXJSZWFkeSgpOwogICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY0V4Y2VwdGlvbiIsIGV4KTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY0V4Y2VwdGlvbiIsIHdyYXBSZWFzb24oZXgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcGRmTWFuYWdlclJlYWR5KCkgewogICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgICBsb2FkRG9jdW1lbnQoZmFsc2UpLnRoZW4ob25TdWNjZXNzLCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgICAgICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBYUmVmUGFyc2VFeGNlcHRpb24pKSB7CiAgICAgICAgICAgIG9uRmFpbHVyZShyZWFzb24pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICAgICAgICBsb2FkRG9jdW1lbnQodHJ1ZSkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbHVyZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgIGdldFBkZk1hbmFnZXIoZGF0YSkudGhlbihmdW5jdGlvbiAobmV3UGRmTWFuYWdlcikgewogICAgICAgIGlmICh0ZXJtaW5hdGVkKSB7CiAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnRlcm1pbmF0ZShuZXcgQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldvcmtlciB3YXMgdGVybWluYXRlZCIpOwogICAgICAgIH0KICAgICAgICBwZGZNYW5hZ2VyID0gbmV3UGRmTWFuYWdlcjsKICAgICAgICBwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0odHJ1ZSkudGhlbihzdHJlYW0gPT4gewogICAgICAgICAgaGFuZGxlci5zZW5kKCJEYXRhTG9hZGVkIiwgewogICAgICAgICAgICBsZW5ndGg6IHN0cmVhbS5ieXRlcy5ieXRlTGVuZ3RoCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSkudGhlbihwZGZNYW5hZ2VyUmVhZHksIG9uRmFpbHVyZSk7CiAgICB9CiAgICBoYW5kbGVyLm9uKCJHZXRQYWdlIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZ2V0UGFnZShkYXRhLnBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgInJvdGF0ZSIpLCBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAicmVmIiksIHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJ1c2VyVW5pdCIpLCBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAidmlldyIpXSkudGhlbihmdW5jdGlvbiAoW3JvdGF0ZSwgcmVmLCB1c2VyVW5pdCwgdmlld10pIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJvdGF0ZSwKICAgICAgICAgICAgcmVmLAogICAgICAgICAgICByZWZTdHI6IHJlZj8udG9TdHJpbmcoKSA/PyBudWxsLAogICAgICAgICAgICB1c2VyVW5pdCwKICAgICAgICAgICAgdmlldwogICAgICAgICAgfTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldFBhZ2VJbmRleCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIGNvbnN0IHBhZ2VSZWYgPSBSZWYuZ2V0KGRhdGEubnVtLCBkYXRhLmdlbik7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsIFtwYWdlUmVmXSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldERlc3RpbmF0aW9ucyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImRlc3RpbmF0aW9ucyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXREZXN0aW5hdGlvbiIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldERlc3RpbmF0aW9uIiwgW2RhdGEuaWRdKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZUxhYmVscyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VMYWJlbHMiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZUxheW91dCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VMYXlvdXQiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZU1vZGUiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJwYWdlTW9kZSIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRWaWV3ZXJQcmVmZXJlbmNlcyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInZpZXdlclByZWZlcmVuY2VzIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldE9wZW5BY3Rpb24iLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJvcGVuQWN0aW9uIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldEF0dGFjaG1lbnRzIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYXR0YWNobWVudHMiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0RG9jSlNBY3Rpb25zIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygianNBY3Rpb25zIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldFBhZ2VKU0FjdGlvbnMiLCBmdW5jdGlvbiAoewogICAgICBwYWdlSW5kZXgKICAgIH0pIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4ocGFnZSA9PiBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAianNBY3Rpb25zIikpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRPdXRsaW5lIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZG9jdW1lbnRPdXRsaW5lIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldE9wdGlvbmFsQ29udGVudENvbmZpZyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm9wdGlvbmFsQ29udGVudENvbmZpZyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRQZXJtaXNzaW9ucyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBlcm1pc3Npb25zIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldE1ldGFkYXRhIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZURvYygiZG9jdW1lbnRJbmZvIiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygibWV0YWRhdGEiKV0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRNYXJrSW5mbyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm1hcmtJbmZvIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldERhdGEiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5yZXF1ZXN0TG9hZGVkU3RyZWFtKCkudGhlbihzdHJlYW0gPT4gc3RyZWFtLmJ5dGVzKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0QW5ub3RhdGlvbnMiLCBmdW5jdGlvbiAoewogICAgICBwYWdlSW5kZXgsCiAgICAgIGludGVudAogICAgfSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgIGNvbnN0IHRhc2sgPSBuZXcgV29ya2VyVGFzayhgR2V0QW5ub3RhdGlvbnM6IHBhZ2UgJHtwYWdlSW5kZXh9YCk7CiAgICAgICAgc3RhcnRXb3JrZXJUYXNrKHRhc2spOwogICAgICAgIHJldHVybiBwYWdlLmdldEFubm90YXRpb25zRGF0YShoYW5kbGVyLCB0YXNrLCBpbnRlbnQpLnRoZW4oZGF0YSA9PiB7CiAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfSwgcmVhc29uID0+IHsKICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRGaWVsZE9iamVjdHMiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVEb2MoImZpZWxkT2JqZWN0cyIpLnRoZW4oZmllbGRPYmplY3RzID0+IGZpZWxkT2JqZWN0cz8uYWxsRmllbGRzIHx8IG51bGwpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJIYXNKU0FjdGlvbnMiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVEb2MoImhhc0pTQWN0aW9ucyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRDYWxjdWxhdGlvbk9yZGVySWRzIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJjYWxjdWxhdGlvbk9yZGVySWRzIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIlNhdmVEb2N1bWVudCIsIGFzeW5jIGZ1bmN0aW9uICh7CiAgICAgIGlzUHVyZVhmYSwKICAgICAgbnVtUGFnZXMsCiAgICAgIGFubm90YXRpb25TdG9yYWdlLAogICAgICBmaWxlbmFtZQogICAgfSkgewogICAgICBjb25zdCBnbG9iYWxQcm9taXNlcyA9IFtwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKSwgcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJhY3JvRm9ybSIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtUmVmIiksIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJzdGFydFhSZWYiKSwgcGRmTWFuYWdlci5lbnN1cmVEb2MoInhyZWYiKSwgcGRmTWFuYWdlci5lbnN1cmVEb2MoImxpbmVhcml6YXRpb24iKSwgcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJzdHJ1Y3RUcmVlUm9vdCIpXTsKICAgICAgY29uc3QgY2hhbmdlcyA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgICBjb25zdCBwcm9taXNlcyA9IFtdOwogICAgICBjb25zdCBuZXdBbm5vdGF0aW9uc0J5UGFnZSA9ICFpc1B1cmVYZmEgPyBnZXROZXdBbm5vdGF0aW9uc01hcChhbm5vdGF0aW9uU3RvcmFnZSkgOiBudWxsOwogICAgICBjb25zdCBbc3RyZWFtLCBhY3JvRm9ybSwgYWNyb0Zvcm1SZWYsIHN0YXJ0WFJlZiwgeHJlZiwgbGluZWFyaXphdGlvbiwgX3N0cnVjdFRyZWVSb290XSA9IGF3YWl0IFByb21pc2UuYWxsKGdsb2JhbFByb21pc2VzKTsKICAgICAgY29uc3QgY2F0YWxvZ1JlZiA9IHhyZWYudHJhaWxlci5nZXRSYXcoIlJvb3QiKSB8fCBudWxsOwogICAgICBsZXQgc3RydWN0VHJlZVJvb3Q7CiAgICAgIGlmIChuZXdBbm5vdGF0aW9uc0J5UGFnZSkgewogICAgICAgIGlmICghX3N0cnVjdFRyZWVSb290KSB7CiAgICAgICAgICBpZiAoYXdhaXQgU3RydWN0VHJlZVJvb3QuY2FuQ3JlYXRlU3RydWN0dXJlVHJlZSh7CiAgICAgICAgICAgIGNhdGFsb2dSZWYsCiAgICAgICAgICAgIHBkZk1hbmFnZXIsCiAgICAgICAgICAgIG5ld0Fubm90YXRpb25zQnlQYWdlCiAgICAgICAgICB9KSkgewogICAgICAgICAgICBzdHJ1Y3RUcmVlUm9vdCA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChhd2FpdCBfc3RydWN0VHJlZVJvb3QuY2FuVXBkYXRlU3RydWN0VHJlZSh7CiAgICAgICAgICBwZGZNYW5hZ2VyLAogICAgICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UKICAgICAgICB9KSkgewogICAgICAgICAgc3RydWN0VHJlZVJvb3QgPSBfc3RydWN0VHJlZVJvb3Q7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGltYWdlUHJvbWlzZXMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZW5lcmF0ZUltYWdlcyhhbm5vdGF0aW9uU3RvcmFnZS52YWx1ZXMoKSwgeHJlZiwgcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTsKICAgICAgICBjb25zdCBuZXdBbm5vdGF0aW9uUHJvbWlzZXMgPSBzdHJ1Y3RUcmVlUm9vdCA9PT0gdW5kZWZpbmVkID8gcHJvbWlzZXMgOiBbXTsKICAgICAgICBmb3IgKGNvbnN0IFtwYWdlSW5kZXgsIGFubm90YXRpb25zXSBvZiBuZXdBbm5vdGF0aW9uc0J5UGFnZSkgewogICAgICAgICAgbmV3QW5ub3RhdGlvblByb21pc2VzLnB1c2gocGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihwYWdlID0+IHsKICAgICAgICAgICAgY29uc3QgdGFzayA9IG5ldyBXb3JrZXJUYXNrKGBTYXZlIChlZGl0b3IpOiBwYWdlICR7cGFnZUluZGV4fWApOwogICAgICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICAgIHJldHVybiBwYWdlLnNhdmVOZXdBbm5vdGF0aW9ucyhoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9ucywgaW1hZ2VQcm9taXNlcywgY2hhbmdlcykuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJ1Y3RUcmVlUm9vdCA9PT0gbnVsbCkgewogICAgICAgICAgcHJvbWlzZXMucHVzaChQcm9taXNlLmFsbChuZXdBbm5vdGF0aW9uUHJvbWlzZXMpLnRoZW4oYXN5bmMgKCkgPT4gewogICAgICAgICAgICBhd2FpdCBTdHJ1Y3RUcmVlUm9vdC5jcmVhdGVTdHJ1Y3R1cmVUcmVlKHsKICAgICAgICAgICAgICBuZXdBbm5vdGF0aW9uc0J5UGFnZSwKICAgICAgICAgICAgICB4cmVmLAogICAgICAgICAgICAgIGNhdGFsb2dSZWYsCiAgICAgICAgICAgICAgcGRmTWFuYWdlciwKICAgICAgICAgICAgICBjaGFuZ2VzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSkpOwogICAgICAgIH0gZWxzZSBpZiAoc3RydWN0VHJlZVJvb3QpIHsKICAgICAgICAgIHByb21pc2VzLnB1c2goUHJvbWlzZS5hbGwobmV3QW5ub3RhdGlvblByb21pc2VzKS50aGVuKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgYXdhaXQgc3RydWN0VHJlZVJvb3QudXBkYXRlU3RydWN0dXJlVHJlZSh7CiAgICAgICAgICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UsCiAgICAgICAgICAgICAgcGRmTWFuYWdlciwKICAgICAgICAgICAgICBjaGFuZ2VzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNQdXJlWGZhKSB7CiAgICAgICAgcHJvbWlzZXMucHVzaChwZGZNYW5hZ2VyLnNlcmlhbGl6ZVhmYURhdGEoYW5ub3RhdGlvblN0b3JhZ2UpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGxldCBwYWdlSW5kZXggPSAwOyBwYWdlSW5kZXggPCBudW1QYWdlczsgcGFnZUluZGV4KyspIHsKICAgICAgICAgIHByb21pc2VzLnB1c2gocGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soYFNhdmU6IHBhZ2UgJHtwYWdlSW5kZXh9YCk7CiAgICAgICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgcmV0dXJuIHBhZ2Uuc2F2ZShoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHJlZnMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICAgIGxldCB4ZmFEYXRhID0gbnVsbDsKICAgICAgaWYgKGlzUHVyZVhmYSkgewogICAgICAgIHhmYURhdGEgPSByZWZzWzBdOwogICAgICAgIGlmICgheGZhRGF0YSkgewogICAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlczsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5zaXplID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlczsKICAgICAgfQogICAgICBjb25zdCBuZWVkQXBwZWFyYW5jZXMgPSBhY3JvRm9ybVJlZiAmJiBhY3JvRm9ybSBpbnN0YW5jZW9mIERpY3QgJiYgY2hhbmdlcy52YWx1ZXMoKS5zb21lKHJlZiA9PiByZWYubmVlZEFwcGVhcmFuY2VzKTsKICAgICAgY29uc3QgeGZhID0gYWNyb0Zvcm0gaW5zdGFuY2VvZiBEaWN0ICYmIGFjcm9Gb3JtLmdldCgiWEZBIikgfHwgbnVsbDsKICAgICAgbGV0IHhmYURhdGFzZXRzUmVmID0gbnVsbDsKICAgICAgbGV0IGhhc1hmYURhdGFzZXRzRW50cnkgPSBmYWxzZTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoeGZhKSkgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHhmYS5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgICBpZiAoeGZhW2ldID09PSAiZGF0YXNldHMiKSB7CiAgICAgICAgICAgIHhmYURhdGFzZXRzUmVmID0geGZhW2kgKyAxXTsKICAgICAgICAgICAgaGFzWGZhRGF0YXNldHNFbnRyeSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh4ZmFEYXRhc2V0c1JlZiA9PT0gbnVsbCkgewogICAgICAgICAgeGZhRGF0YXNldHNSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh4ZmEpIHsKICAgICAgICB3YXJuKCJVbnN1cHBvcnRlZCBYRkEgdHlwZS4iKTsKICAgICAgfQogICAgICBsZXQgbmV3WHJlZkluZm8gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBpZiAoeHJlZi50cmFpbGVyKSB7CiAgICAgICAgY29uc3QgaW5mb09iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgY29uc3QgeHJlZkluZm8gPSB4cmVmLnRyYWlsZXIuZ2V0KCJJbmZvIikgfHwgbnVsbDsKICAgICAgICBpZiAoeHJlZkluZm8gaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB4cmVmSW5mbykgewogICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgIGluZm9PYmpba2V5XSA9IHN0cmluZ1RvUERGU3RyaW5nKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuZXdYcmVmSW5mbyA9IHsKICAgICAgICAgIHJvb3RSZWY6IGNhdGFsb2dSZWYsCiAgICAgICAgICBlbmNyeXB0UmVmOiB4cmVmLnRyYWlsZXIuZ2V0UmF3KCJFbmNyeXB0IikgfHwgbnVsbCwKICAgICAgICAgIG5ld1JlZjogeHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKSwKICAgICAgICAgIGluZm9SZWY6IHhyZWYudHJhaWxlci5nZXRSYXcoIkluZm8iKSB8fCBudWxsLAogICAgICAgICAgaW5mbzogaW5mb09iaiwKICAgICAgICAgIGZpbGVJZHM6IHhyZWYudHJhaWxlci5nZXQoIklEIikgfHwgbnVsbCwKICAgICAgICAgIHN0YXJ0WFJlZjogbGluZWFyaXphdGlvbiA/IHN0YXJ0WFJlZiA6IHhyZWYubGFzdFhSZWZTdHJlYW1Qb3MgPz8gc3RhcnRYUmVmLAogICAgICAgICAgZmlsZW5hbWUKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBpbmNyZW1lbnRhbFVwZGF0ZSh7CiAgICAgICAgb3JpZ2luYWxEYXRhOiBzdHJlYW0uYnl0ZXMsCiAgICAgICAgeHJlZkluZm86IG5ld1hyZWZJbmZvLAogICAgICAgIGNoYW5nZXMsCiAgICAgICAgeHJlZiwKICAgICAgICBoYXNYZmE6ICEheGZhLAogICAgICAgIHhmYURhdGFzZXRzUmVmLAogICAgICAgIGhhc1hmYURhdGFzZXRzRW50cnksCiAgICAgICAgbmVlZEFwcGVhcmFuY2VzLAogICAgICAgIGFjcm9Gb3JtUmVmLAogICAgICAgIGFjcm9Gb3JtLAogICAgICAgIHhmYURhdGEsCiAgICAgICAgdXNlWHJlZlN0cmVhbTogaXNEaWN0KHhyZWYudG9wRGljdCwgIlhSZWYiKQogICAgICB9KS5maW5hbGx5KCgpID0+IHsKICAgICAgICB4cmVmLnJlc2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRPcGVyYXRvckxpc3QiLCBmdW5jdGlvbiAoZGF0YSwgc2luaykgewogICAgICBjb25zdCBwYWdlSW5kZXggPSBkYXRhLnBhZ2VJbmRleDsKICAgICAgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgIGNvbnN0IHRhc2sgPSBuZXcgV29ya2VyVGFzayhgR2V0T3BlcmF0b3JMaXN0OiBwYWdlICR7cGFnZUluZGV4fWApOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwOwogICAgICAgIHBhZ2UuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgICAgIGhhbmRsZXIsCiAgICAgICAgICBzaW5rLAogICAgICAgICAgdGFzaywKICAgICAgICAgIGludGVudDogZGF0YS5pbnRlbnQsCiAgICAgICAgICBjYWNoZUtleTogZGF0YS5jYWNoZUtleSwKICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiBkYXRhLmFubm90YXRpb25TdG9yYWdlLAogICAgICAgICAgbW9kaWZpZWRJZHM6IGRhdGEubW9kaWZpZWRJZHMKICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChvcGVyYXRvckxpc3RJbmZvKSB7CiAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgaWYgKHN0YXJ0KSB7CiAgICAgICAgICAgIGluZm8oYHBhZ2U9JHtwYWdlSW5kZXggKyAxfSAtIGdldE9wZXJhdG9yTGlzdDogdGltZT1gICsgYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zLCBsZW49JHtvcGVyYXRvckxpc3RJbmZvLmxlbmd0aH1gKTsKICAgICAgICAgIH0KICAgICAgICAgIHNpbmsuY2xvc2UoKTsKICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgaWYgKHRhc2sudGVybWluYXRlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRUZXh0Q29udGVudCIsIGZ1bmN0aW9uIChkYXRhLCBzaW5rKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBwYWdlSW5kZXgsCiAgICAgICAgaW5jbHVkZU1hcmtlZENvbnRlbnQsCiAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24KICAgICAgfSA9IGRhdGE7CiAgICAgIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHsKICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soIkdldFRleHRDb250ZW50OiBwYWdlICIgKyBwYWdlSW5kZXgpOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwOwogICAgICAgIHBhZ2UuZXh0cmFjdFRleHRDb250ZW50KHsKICAgICAgICAgIGhhbmRsZXIsCiAgICAgICAgICB0YXNrLAogICAgICAgICAgc2luaywKICAgICAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50LAogICAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24KICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICBpZiAoc3RhcnQpIHsKICAgICAgICAgICAgaW5mbyhgcGFnZT0ke3BhZ2VJbmRleCArIDF9IC0gZ2V0VGV4dENvbnRlbnQ6IHRpbWU9YCArIGAke0RhdGUubm93KCkgLSBzdGFydH1tc2ApOwogICAgICAgICAgfQogICAgICAgICAgc2luay5jbG9zZSgpOwogICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICBpZiAodGFzay50ZXJtaW5hdGVkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldFN0cnVjdFRyZWUiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5nZXRQYWdlKGRhdGEucGFnZUluZGV4KS50aGVuKHBhZ2UgPT4gcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgImdldFN0cnVjdFRyZWUiKSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkZvbnRGYWxsYmFjayIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmZvbnRGYWxsYmFjayhkYXRhLmlkLCBoYW5kbGVyKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiQ2xlYW51cCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmNsZWFudXAodHJ1ZSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIlRlcm1pbmF0ZSIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHRlcm1pbmF0ZWQgPSB0cnVlOwogICAgICBjb25zdCB3YWl0T24gPSBbXTsKICAgICAgaWYgKHBkZk1hbmFnZXIpIHsKICAgICAgICBwZGZNYW5hZ2VyLnRlcm1pbmF0ZShuZXcgQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7CiAgICAgICAgY29uc3QgY2xlYW51cFByb21pc2UgPSBwZGZNYW5hZ2VyLmNsZWFudXAoKTsKICAgICAgICB3YWl0T24ucHVzaChjbGVhbnVwUHJvbWlzZSk7CiAgICAgICAgcGRmTWFuYWdlciA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2xlYXJHbG9iYWxDYWNoZXMoKTsKICAgICAgfQogICAgICBjYW5jZWxYSFJzPy4obmV3IEFib3J0RXhjZXB0aW9uKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuIikpOwogICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgV29ya2VyVGFza3MpIHsKICAgICAgICB3YWl0T24ucHVzaCh0YXNrLmZpbmlzaGVkKTsKICAgICAgICB0YXNrLnRlcm1pbmF0ZSgpOwogICAgICB9CiAgICAgIHJldHVybiBQcm9taXNlLmFsbCh3YWl0T24pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIGhhbmRsZXIuZGVzdHJveSgpOwogICAgICAgIGhhbmRsZXIgPSBudWxsOwogICAgICB9KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiUmVhZHkiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICBzZXR1cERvYyhkb2NQYXJhbXMpOwogICAgICBkb2NQYXJhbXMgPSBudWxsOwogICAgfSk7CiAgICByZXR1cm4gd29ya2VySGFuZGxlck5hbWU7CiAgfQogIHN0YXRpYyBpbml0aWFsaXplRnJvbVBvcnQocG9ydCkgewogICAgY29uc3QgaGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcigid29ya2VyIiwgIm1haW4iLCBwb3J0KTsKICAgIHRoaXMuc2V0dXAoaGFuZGxlciwgcG9ydCk7CiAgICBoYW5kbGVyLnNlbmQoInJlYWR5IiwgbnVsbCk7CiAgfQp9Cgo7Ly8gLi9zcmMvcGRmLndvcmtlci5qcwoKY29uc3QgcGRmanNWZXJzaW9uID0gIjUuMS45MSI7CmNvbnN0IHBkZmpzQnVpbGQgPSAiNDVjYmU4YmIwIjsKCnZhciBfX3dlYnBhY2tfZXhwb3J0c19fV29ya2VyTWVzc2FnZUhhbmRsZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLldvcmtlck1lc3NhZ2VIYW5kbGVyOwpleHBvcnQgeyBfX3dlYnBhY2tfZXhwb3J0c19fV29ya2VyTWVzc2FnZUhhbmRsZXIgYXMgV29ya2VyTWVzc2FnZUhhbmRsZXIgfTsKCi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBkZi53b3JrZXIubWpzLm1hcA==", import.meta.url).toString();
  20898. const I = t, g = wi(1), C = wi([]), i = wi(""), e = wi(1);
  20899. let A = null;
  20900. const s = () => {
  20901. let d = 0;
  20902. window.screen.width > 1440 ? d = 1.4 : d = 1.2, !(g.value >= d) && (g.value = g.value + 0.1, n());
  20903. }, l = () => {
  20904. g.value <= 1 || (g.value = g.value - 0.1, n());
  20905. }, n = async () => {
  20906. A = await fdg(I.data).promise, C.value = A.numPages, a();
  20907. }, a = async (d = 1) => {
  20908. e.value = d;
  20909. const o = await A.getPage(d), c = document.getElementById("the_canvas" + d), r = c.getContext("2d"), h = window.devicePixelRatio || 1, b = r.webkitBackingStorePixelRatio || r.mozBackingStorePixelRatio || r.msBackingStorePixelRatio || r.oBackingStorePixelRatio || r.backingStorePixelRatio || 1, u = h / b, m = o.getViewport({ scale: g.value });
  20910. c.width = m.width * u, c.height = m.height * u, c.style.width = m.width + "px", i.value = m.width + "px", c.style.height = m.height + "px", r.setTransform(u, 0, 0, u, 0, 0);
  20911. const Z = {
  20912. canvasContext: r,
  20913. viewport: m
  20914. };
  20915. o.render(Z), C.value > d && setTimeout(() => a(d + 1));
  20916. };
  20917. return tG(() => {
  20918. n();
  20919. }), (d, o) => (Ug(), Pg("div", Hdg, [
  20920. tC("div", { class: "pdf_down" }, [
  20921. tC("div", {
  20922. class: "pdf_set_left",
  20923. onClick: s
  20924. }, "➕"),
  20925. tC("div", {
  20926. class: "pdf_set_middle",
  20927. onClick: l
  20928. }, "➖")
  20929. ]),
  20930. tC("div", {
  20931. style: Ae({ width: i.value, margin: "0 auto" })
  20932. }, [
  20933. (Ug(!0), Pg(ct, null, vi(C.value, (c) => (Ug(), Pg("canvas", {
  20934. id: "the_canvas" + c,
  20935. key: c
  20936. }, null, 8, Xdg))), 128))
  20937. ], 4)
  20938. ]));
  20939. }
  20940. }, Ddg = /* @__PURE__ */ V0(Sdg, [["__scopeId", "data-v-58fcf604"]]);
  20941. async function Kdg(t, I) {
  20942. const g = iG(Ddg, { data: t });
  20943. return g.mount(I), {
  20944. $el: I,
  20945. $destroy() {
  20946. g.unmount();
  20947. }
  20948. };
  20949. }
  20950. const Fdg = ["src"], kdg = ["src"], zdg = {
  20951. __name: "ImageViewer",
  20952. props: {
  20953. image: String,
  20954. srcList: Array
  20955. },
  20956. setup(t) {
  20957. const I = t, g = wi(!1), C = wi(0), i = DA(() => {
  20958. const d = Array.isArray(I.srcList) ? I.srcList : [];
  20959. if (d.length) return d.map((c) => String(c || "")).filter(Boolean);
  20960. const o = String(I.image || "");
  20961. return o ? [o] : [];
  20962. }), e = DA(() => ({
  20963. visible: g.value,
  20964. open: A,
  20965. close: s,
  20966. next: l,
  20967. prev: n
  20968. }));
  20969. function A(d = 0) {
  20970. i.value.length && (C.value = Math.max(0, Math.min(i.value.length - 1, Number(d) || 0)), g.value = !0);
  20971. }
  20972. function s() {
  20973. g.value = !1;
  20974. }
  20975. function l() {
  20976. i.value.length <= 1 || (C.value = (C.value + 1) % i.value.length);
  20977. }
  20978. function n() {
  20979. i.value.length <= 1 || (C.value = (C.value - 1 + i.value.length) % i.value.length);
  20980. }
  20981. function a(d) {
  20982. g.value && (d.key === "Escape" && s(), d.key === "ArrowRight" && l(), d.key === "ArrowLeft" && n());
  20983. }
  20984. return tG(() => {
  20985. window.addEventListener("keydown", a);
  20986. }), s9(() => {
  20987. window.removeEventListener("keydown", a);
  20988. }), (d, o) => (Ug(), Pg("div", null, [
  20989. d$(d.$slots, "image", {
  20990. src: i.value[0],
  20991. srcList: i.value,
  20992. index: C.value,
  20993. preview: e.value
  20994. }, () => [
  20995. i.value[0] ? (Ug(), Pg("img", {
  20996. key: 0,
  20997. class: "image",
  20998. src: i.value[0],
  20999. alt: "",
  21000. onClick: o[0] || (o[0] = (c) => A(0))
  21001. }, null, 8, Fdg)) : Yt("", !0)
  21002. ], !0),
  21003. g.value ? (Ug(), Pg("div", {
  21004. key: 0,
  21005. class: "viewfile-image-preview",
  21006. onClick: ah(s, ["self"])
  21007. }, [
  21008. tC("button", {
  21009. class: "viewfile-image-preview-close",
  21010. type: "button",
  21011. onClick: s
  21012. }, "×"),
  21013. i.value.length > 1 ? (Ug(), Pg("button", {
  21014. key: 0,
  21015. class: "viewfile-image-preview-prev",
  21016. type: "button",
  21017. onClick: ah(n, ["stop"])
  21018. }, "‹")) : Yt("", !0),
  21019. tC("img", {
  21020. class: "viewfile-image-preview-img",
  21021. src: i.value[C.value],
  21022. alt: ""
  21023. }, null, 8, kdg),
  21024. i.value.length > 1 ? (Ug(), Pg("button", {
  21025. key: 1,
  21026. class: "viewfile-image-preview-next",
  21027. type: "button",
  21028. onClick: ah(l, ["stop"])
  21029. }, "›")) : Yt("", !0)
  21030. ])) : Yt("", !0)
  21031. ]));
  21032. }
  21033. }, Jdg = /* @__PURE__ */ V0(zdg, [["__scopeId", "data-v-00723940"]]);
  21034. async function Ldg(t, I) {
  21035. const g = await Nig(t), C = iG(Jdg, { image: g });
  21036. return C.mount(I), {
  21037. $el: I,
  21038. $destroy() {
  21039. C.unmount();
  21040. }
  21041. };
  21042. }
  21043. const vdg = { class: "code-area" }, Tdg = {
  21044. __name: "CodeViewer",
  21045. props: {
  21046. value: {
  21047. type: String,
  21048. description: "值"
  21049. }
  21050. },
  21051. setup(t) {
  21052. return (I, g) => (Ug(), Pg("pre", vdg, " " + um(t.value) + `
  21053. `, 1));
  21054. }
  21055. }, xdg = /* @__PURE__ */ V0(Tdg, [["__scopeId", "data-v-215846b2"]]);
  21056. async function jdg(t, I) {
  21057. const g = await gGg(t), C = iG(xdg, { value: g });
  21058. return C.mount(I), {
  21059. $el: I,
  21060. $destroy() {
  21061. C.unmount();
  21062. }
  21063. };
  21064. }
  21065. function gI(t) {
  21066. const I = Number(t);
  21067. return Number.isFinite(I) ? I : 0;
  21068. }
  21069. function G8(t) {
  21070. const I = Number.parseFloat(String(t ?? ""));
  21071. return Number.isFinite(I) ? I : 0;
  21072. }
  21073. function cG(t, I) {
  21074. return `${t}-${I}`;
  21075. }
  21076. function dh(t) {
  21077. if (!t) return "";
  21078. try {
  21079. const g = new DOMParser().parseFromString(t, "text/html");
  21080. return ["script", "style", "iframe", "object", "embed", "link", "meta"].forEach((i) => {
  21081. g.querySelectorAll(i).forEach((e) => e.remove());
  21082. }), g.querySelectorAll("*").forEach((i) => {
  21083. Array.from(i.attributes).forEach((A) => {
  21084. const s = A.name.toLowerCase(), l = String(A.value || "").trim().toLowerCase();
  21085. s.startsWith("on") && i.removeAttribute(A.name), (s === "href" || s === "src") && l.startsWith("javascript:") && i.removeAttribute(A.name);
  21086. });
  21087. const e = i.getAttribute("style");
  21088. if (e) {
  21089. let A = e.replace(/font-size\s*:\s*([\d.]+)pt/gi, (s, l) => {
  21090. const n = Number(l);
  21091. return Number.isFinite(n) ? `font-size: ${(n * 96 / 72).toFixed(3).replace(/\.0+$/, "").replace(/(\.\d*?)0+$/, "$1")}px` : s;
  21092. });
  21093. /text-align\s*:\s*justify/i.test(A) && (/text-align-last/i.test(A) || (A += ";text-align-last:justify"), /text-justify/i.test(A) || (A += ";text-justify:inter-character")), A !== e && i.setAttribute("style", A);
  21094. }
  21095. }), g.body.innerHTML;
  21096. } catch {
  21097. return t;
  21098. }
  21099. }
  21100. function Qdg(t, I) {
  21101. const g = gI(t.order) || I;
  21102. return `${t.type || "el"}-${g}`;
  21103. }
  21104. function KI(t, I, g) {
  21105. const C = gI(t.order) || I, e = `${String(t.type || "el")}-${C}`;
  21106. return g ? `${g}/${e}` : e;
  21107. }
  21108. function DIg(t) {
  21109. const g = [t.radius, t.cornerRadius, t.rx].map(gI).find((C) => C > 0) || 0;
  21110. return g ? `${g}px` : void 0;
  21111. }
  21112. function CM(t) {
  21113. const I = String(t.borderColor ?? t.stroke ?? t.lineColor ?? ""), g = gI(t.borderWidth ?? t.strokeWidth ?? t.lineWidth), C = String(t.borderStrokeDasharray ?? t.strokeDasharray ?? t.dasharray ?? ""), i = t.border && typeof t.border == "object" ? t.border : null, e = t.line && typeof t.line == "object" ? t.line : null, A = String((i == null ? void 0 : i.color) ?? (e == null ? void 0 : e.color) ?? ""), s = gI((i == null ? void 0 : i.width) ?? (e == null ? void 0 : e.width)), l = String((i == null ? void 0 : i.dasharray) ?? (e == null ? void 0 : e.dasharray) ?? ""), n = I || A, a = g || s, d = (C && C !== "0" ? C : "") || (l && l !== "0" ? l : "");
  21114. return {
  21115. color: n || "transparent",
  21116. width: Math.max(0, a),
  21117. dasharray: d || void 0
  21118. };
  21119. }
  21120. function Odg(t) {
  21121. const I = (t == null ? void 0 : t.ph) ?? (t == null ? void 0 : t.placeholder) ?? (t == null ? void 0 : t.placeHolder) ?? null, g = String((I == null ? void 0 : I.type) ?? (I == null ? void 0 : I.phType) ?? (t == null ? void 0 : t.phType) ?? (t == null ? void 0 : t.placeholderType) ?? "").trim().toLowerCase(), C = gI((I == null ? void 0 : I.idx) ?? (I == null ? void 0 : I.phIdx) ?? (t == null ? void 0 : t.phIdx) ?? (t == null ? void 0 : t.idx) ?? (t == null ? void 0 : t.placeholderIdx) ?? (t == null ? void 0 : t.phIndex)), i = String((I == null ? void 0 : I.id) ?? (t == null ? void 0 : t.phId) ?? (t == null ? void 0 : t.placeholderId) ?? "").trim();
  21122. return !g && !C && !i ? null : { type: g, idx: C, id: i };
  21123. }
  21124. function w8(t) {
  21125. const I = Odg(t);
  21126. if (!I) return "";
  21127. const g = I.id || (I.idx ? String(I.idx) : "");
  21128. return g ? `${I.type || "ph"}:${g}` : `${I.type || "ph"}`;
  21129. }
  21130. function Udg(t) {
  21131. const I = String(t || "").trim();
  21132. return I ? /click to add/i.test(I) || /单击.*添加/.test(I) || /点击.*添加/.test(I) || /添加(标题|文本|内容)/.test(I) : !1;
  21133. }
  21134. function xY(t) {
  21135. const I = gI(t);
  21136. return I ? I > 1 ? Math.max(0, Math.min(1, I / 100)) : Math.max(0, Math.min(1, I)) : 0;
  21137. }
  21138. function KIg(t) {
  21139. const I = t == null ? void 0 : t.rect, g = t == null ? void 0 : t.crop, C = I && typeof I == "object" ? I : g && typeof g == "object" ? g : null;
  21140. if (!C) return null;
  21141. const i = xY(C.t), e = xY(C.b), A = xY(C.l), s = xY(C.r);
  21142. if (!i && !e && !A && !s) return null;
  21143. const l = Math.max(0, Math.min(0.9, A)), n = Math.max(0, Math.min(0.9, s)), a = Math.max(0, Math.min(0.9, i)), d = Math.max(0, Math.min(0.9, e));
  21144. return l + n >= 0.98 || a + d >= 0.98 ? null : { t: a, b: d, l, r: n };
  21145. }
  21146. function Edg(t) {
  21147. return String((t == null ? void 0 : t.geom) || (t == null ? void 0 : t.shapeType) || "").toLowerCase();
  21148. }
  21149. function FIg(t) {
  21150. const I = Edg(t);
  21151. return {
  21152. width: "100%",
  21153. height: "100%",
  21154. position: "relative",
  21155. overflow: "hidden",
  21156. borderRadius: I === "ellipse" || I === "circle" ? "50%" : DIg(t)
  21157. };
  21158. }
  21159. function EH(t, I = 1) {
  21160. if (t == null) return I;
  21161. const g = gI(t);
  21162. if (!g) return I;
  21163. const C = g > 10 ? g / 100 : g;
  21164. return Math.max(0, Math.min(3, C));
  21165. }
  21166. function Pdg(t) {
  21167. const I = t == null ? void 0 : t.filters;
  21168. if (!I || typeof I != "object") return;
  21169. const g = EH(I.brightness, 1), C = EH(I.contrast, 1), i = EH(I.saturation, 1), e = gI(I.colorTemperature), A = [];
  21170. if (g !== 1 && A.push(`brightness(${g})`), C !== 1 && A.push(`contrast(${C})`), i !== 1 && A.push(`saturate(${i})`), e) {
  21171. const s = Math.max(-100, Math.min(100, e)), l = s * 0.6, n = Math.min(1, Math.abs(s) / 200);
  21172. A.push(`hue-rotate(${l}deg)`), s > 0 && n && A.push(`sepia(${n})`);
  21173. }
  21174. return A.length ? A.join(" ") : void 0;
  21175. }
  21176. function kIg(t) {
  21177. const I = KIg(t), g = Pdg(t);
  21178. if (!I)
  21179. return {
  21180. width: "100%",
  21181. height: "100%",
  21182. objectFit: "fill",
  21183. filter: g,
  21184. display: "block"
  21185. };
  21186. const C = 1 / (1 - I.l - I.r), i = 1 / (1 - I.t - I.b), e = -I.l * 100, A = -I.t * 100;
  21187. return {
  21188. width: "100%",
  21189. height: "100%",
  21190. objectFit: "fill",
  21191. display: "block",
  21192. transformOrigin: "top left",
  21193. transform: `translate(${e}%, ${A}%) scale(${C}, ${i})`,
  21194. filter: g
  21195. };
  21196. }
  21197. function tA(t) {
  21198. var i, e, A, s;
  21199. const I = typeof t.fill == "object" && t.fill ? t.fill : null, C = [
  21200. t.src,
  21201. t.url,
  21202. t.picBase64,
  21203. t.mediaBase64,
  21204. t.base64,
  21205. t.blob,
  21206. t.blobUrl,
  21207. (i = t.value) == null ? void 0 : i.picBase64,
  21208. (e = t.value) == null ? void 0 : e.src,
  21209. (A = I == null ? void 0 : I.value) == null ? void 0 : A.picBase64,
  21210. (s = I == null ? void 0 : I.value) == null ? void 0 : s.src
  21211. ].find((l) => typeof l == "string" && l.trim());
  21212. return C ? String(C) : "";
  21213. }
  21214. function tM(t) {
  21215. const I = String(t.type || "").toLowerCase();
  21216. return I === "shape" || I === "rect" || I === "line";
  21217. }
  21218. function y9(t) {
  21219. var g, C;
  21220. if (typeof t.fill == "object" && ((g = t.fill) == null ? void 0 : g.type) === "image") return !0;
  21221. if (typeof t.fill == "object" && t.fill) {
  21222. const i = (C = t.fill) == null ? void 0 : C.value;
  21223. if (i && (typeof i.picBase64 == "string" || typeof i.src == "string") || typeof t.fill.picBase64 == "string" || typeof t.fill.src == "string") return !0;
  21224. }
  21225. const I = String(t.type || "").toLowerCase();
  21226. return I === "pic" || I === "picture";
  21227. }
  21228. function Y9(t) {
  21229. const I = String(t.type || "").toLowerCase();
  21230. if (y9(t)) return !1;
  21231. if (I === "image" || I === "pic" || I === "picture") return !0;
  21232. const g = tA(t);
  21233. return !!g && /^data:image\//i.test(g);
  21234. }
  21235. function N9(t) {
  21236. if (String(t.type || "").toLowerCase() === "video") return !0;
  21237. const g = tA(t);
  21238. return !!g && /^data:video\//i.test(g);
  21239. }
  21240. function V9(t) {
  21241. if (String(t.type || "").toLowerCase() === "audio") return !0;
  21242. const g = tA(t);
  21243. return !!g && /^data:audio\//i.test(g);
  21244. }
  21245. function zIg(t) {
  21246. return String(t.type || "").toLowerCase() === "table";
  21247. }
  21248. function JIg(t) {
  21249. const I = String(t.type || "").toLowerCase();
  21250. return I === "chart" || I === "charts";
  21251. }
  21252. function LIg(t) {
  21253. const I = String(t.type || "").toLowerCase();
  21254. return I === "group" || I === "groupshape" || I === "grpsp" || I === "grp" || [t == null ? void 0 : t.elements, t == null ? void 0 : t.children, t == null ? void 0 : t.childrens, t == null ? void 0 : t.items, t == null ? void 0 : t.spTree].some((i) => Array.isArray(i) && i.length) ? !0 : I.includes("group");
  21255. }
  21256. function vIg(t) {
  21257. const I = String(t.type || "").toLowerCase();
  21258. return I === "math" || I === "equation";
  21259. }
  21260. function TIg(t) {
  21261. const I = String(t.type || "").toLowerCase();
  21262. return I === "diagram" || I === "smartart" || I === "smart_art";
  21263. }
  21264. function _dg(t) {
  21265. var I, g, C, i, e;
  21266. if (!t || !t.type) return "#fff";
  21267. if (t.type === "color") return String(t.value || "#fff");
  21268. if (t.type === "gradient") {
  21269. const A = Array.isArray((I = t.value) == null ? void 0 : I.colors) ? t.value.colors : [], s = gI((g = t.value) == null ? void 0 : g.rot), l = String(((C = t.value) == null ? void 0 : C.path) || "rect"), n = A.map((a) => {
  21270. const d = String((a == null ? void 0 : a.pos) ?? ""), o = String((a == null ? void 0 : a.color) ?? "");
  21271. return o ? d ? `${o} ${d}` : o : "";
  21272. }).filter(Boolean).join(", ");
  21273. return n ? l === "rect" ? `linear-gradient(${(90 - s + 360) % 360}deg, ${n})` : `radial-gradient(circle, ${n})` : "#fff";
  21274. }
  21275. if (t.type === "image") {
  21276. const A = String(((i = t.value) == null ? void 0 : i.picBase64) || ((e = t.value) == null ? void 0 : e.src) || "");
  21277. return A ? `center / cover no-repeat url(${A})` : "#fff";
  21278. }
  21279. return "#fff";
  21280. }
  21281. function qdg(t, I) {
  21282. const g = gI(t.order) || I, i = (t == null ? void 0 : t.__source) === "slide" ? 1e5 : 0;
  21283. return g + i;
  21284. }
  21285. function xIg(t) {
  21286. const I = t == null ? void 0 : t.shadow;
  21287. if (!I || typeof I != "object") return;
  21288. const g = gI(I.h), C = gI(I.v), i = Math.max(0, gI(I.blur)), e = String(I.color || "").trim();
  21289. if (!(!e || !g && !C && !i))
  21290. return `drop-shadow(${g}px ${C}px ${i}px ${e})`;
  21291. }
  21292. function jIg(t) {
  21293. if (tM(t)) return;
  21294. const I = CM(t);
  21295. if (I.width)
  21296. return `${I.width}px solid ${I.color}`;
  21297. }
  21298. function QIg(t) {
  21299. var g, C, i;
  21300. if (tM(t) || y9(t) || Y9(t) || N9(t) || V9(t)) return;
  21301. if (typeof t.fill == "string") {
  21302. const e = t.fill.trim();
  21303. return e || void 0;
  21304. }
  21305. const I = typeof t.fill == "object" && t.fill ? t.fill : null;
  21306. if (!(!I || !I.type)) {
  21307. if (I.type === "color") return String(I.value || "") || void 0;
  21308. if (I.type === "gradient") {
  21309. const e = Array.isArray((g = I.value) == null ? void 0 : g.colors) ? I.value.colors : [], A = gI((C = I.value) == null ? void 0 : C.rot), s = String(((i = I.value) == null ? void 0 : i.path) || "rect"), l = e.map((n) => {
  21310. const a = String((n == null ? void 0 : n.pos) ?? ""), d = String((n == null ? void 0 : n.color) ?? "");
  21311. return d ? a ? `${d} ${a}` : d : "";
  21312. }).filter(Boolean).join(", ");
  21313. return l ? s === "rect" ? `linear-gradient(${(90 - A + 360) % 360}deg, ${l})` : `radial-gradient(circle, ${l})` : void 0;
  21314. }
  21315. }
  21316. }
  21317. function $dg(t, I) {
  21318. const g = gI(t.left), C = gI(t.top), i = Math.max(0, gI(t.width)), e = Math.max(0, gI(t.height)), A = gI(t.rotate), s = !!t.isFlipH, l = !!t.isFlipV, n = qdg(t, I), a = t.opacity == null ? 1 : Math.max(0, Math.min(1, gI(t.opacity))), d = [];
  21319. A && d.push(`rotate(${A}deg)`), s && d.push("scaleX(-1)"), l && d.push("scaleY(-1)");
  21320. const o = QIg(t), c = jIg(t), r = DIg(t), h = xIg(t);
  21321. return {
  21322. position: "absolute",
  21323. left: `${g}px`,
  21324. top: `${C}px`,
  21325. width: `${i}px`,
  21326. height: `${e}px`,
  21327. zIndex: n,
  21328. opacity: a,
  21329. background: o,
  21330. border: c,
  21331. borderRadius: r,
  21332. filter: h,
  21333. transformOrigin: "center center",
  21334. transform: d.length ? d.join(" ") : void 0
  21335. };
  21336. }
  21337. function aV(t) {
  21338. return {
  21339. position: "absolute",
  21340. left: 0,
  21341. top: 0,
  21342. width: "100%",
  21343. height: "100%",
  21344. display: "table"
  21345. };
  21346. }
  21347. function oV(t) {
  21348. const I = t == null ? void 0 : t.autoFit, g = I && typeof I == "object" ? gI(I.fontScale) : 1, C = g && g !== 1 ? Math.max(0.1, Math.min(5, g)) : 1, i = !!(t != null && t.isVertical), e = i ? "vertical-rl" : void 0, A = i ? "mixed" : void 0, s = String(t.vAlign || "up"), l = s === "down" ? "bottom" : s === "mid" ? "middle" : "top";
  21349. return C === 1 ? {
  21350. display: "table-cell",
  21351. width: "100%",
  21352. height: "100%",
  21353. verticalAlign: l,
  21354. writingMode: e,
  21355. textOrientation: A
  21356. } : {
  21357. display: "table-cell",
  21358. // width: `${inv}%`,
  21359. // height: `${inv}%`,
  21360. width: "100%",
  21361. height: "100%",
  21362. position: "absolute",
  21363. left: 0,
  21364. top: 0,
  21365. verticalAlign: l,
  21366. // transformOrigin: "top left",
  21367. // transform: `scale(${fontScale})`,
  21368. writingMode: e,
  21369. textOrientation: A
  21370. };
  21371. }
  21372. const Ku = /* @__PURE__ */ new Map();
  21373. function Ti(t, I, g) {
  21374. var w;
  21375. const C = `c-${cG(I, g)}`, i = Ku.get(C);
  21376. if (i) return i;
  21377. const e = Math.max(1, gI(t.width)), A = Math.max(1, gI(t.height)), s = String((t == null ? void 0 : t.chartType) || "").toLowerCase(), l = Array.isArray(t == null ? void 0 : t.colors) ? t.colors : [], n = l.length ? l.map((W) => String(W || "").trim()).filter(Boolean) : [], a = (W) => n[W % Math.max(1, n.length)] || "#4e79a7", d = t.opacity == null ? 1 : Math.max(0, Math.min(1, gI(t.opacity))), o = Math.max(4, Math.min(24, Math.round(Math.min(e, A) * 0.08))), c = s.includes("pie") || s.includes("doughnut"), r = s.includes("bar") || s.includes("col");
  21378. if (s.includes("scatter") || s.includes("bubble")) {
  21379. const W = t == null ? void 0 : t.data, y = Array.isArray(W == null ? void 0 : W[0]) ? W[0] : [], f = Array.isArray(W == null ? void 0 : W[1]) ? W[1] : [], D = Math.min(y.length, f.length), F = D ? Math.min(...y.slice(0, D)) : 0, T = D ? Math.max(...y.slice(0, D)) : 1, Q = D ? Math.min(...f.slice(0, D)) : 0, P = D ? Math.max(...f.slice(0, D)) : 1, L = T - F || 1, E = P - Q || 1, J = Math.max(1, e - o * 2), k = Math.max(1, A - o * 2), j = [];
  21380. for (let Cg = 0; Cg < D; Cg++) {
  21381. const Ig = o + (y[Cg] - F) / L * J, x = o + (1 - (f[Cg] - Q) / E) * k;
  21382. j.push({ cx: Ig, cy: x, r: 3, fill: a(0), opacity: d });
  21383. }
  21384. const q = { kind: "scatter", bars: [], paths: [], points: j, slices: [], cx: 0, cy: 0, holeR: 0 };
  21385. return Ku.set(C, q), q;
  21386. }
  21387. const b = t == null ? void 0 : t.data;
  21388. if (c) {
  21389. const W = Array.isArray(b) ? b : [], f = (Array.isArray((w = W == null ? void 0 : W[0]) == null ? void 0 : w.values) ? W[0].values : []).map((k) => ({ y: gI(k == null ? void 0 : k.y), x: String((k == null ? void 0 : k.x) ?? "") })).filter((k) => Number.isFinite(k.y) && k.y > 0), D = f.reduce((k, j) => k + j.y, 0) || 1, F = e / 2, T = A / 2, Q = Math.max(2, Math.min(e, A) / 2 - o), P = s.includes("doughnut") ? Q * 0.55 : 0;
  21390. let L = -Math.PI / 2;
  21391. const E = [];
  21392. f.forEach((k, j) => {
  21393. const q = k.y / D * Math.PI * 2, Cg = L + q, Ig = F + Q * Math.cos(L), x = T + Q * Math.sin(L), Ag = F + Q * Math.cos(Cg), eg = T + Q * Math.sin(Cg), O = q > Math.PI ? 1 : 0, _ = `M ${F} ${T} L ${Ig} ${x} A ${Q} ${Q} 0 ${O} 1 ${Ag} ${eg} Z`;
  21394. E.push({ d: _, fill: a(j), opacity: d }), L = Cg;
  21395. });
  21396. const J = { kind: "pie", bars: [], paths: [], points: [], slices: E, cx: F, cy: T, holeR: P };
  21397. return Ku.set(C, J), J;
  21398. }
  21399. const m = (Array.isArray(b) ? b : []).map((W) => {
  21400. const f = (Array.isArray(W == null ? void 0 : W.values) ? W.values : []).map((D) => ({ y: gI(D == null ? void 0 : D.y), x: String((D == null ? void 0 : D.x) ?? "") })).filter((D) => Number.isFinite(D.y));
  21401. return {
  21402. name: String((W == null ? void 0 : W.name) ?? ""),
  21403. values: f
  21404. };
  21405. }).filter((W) => W.values.length), Z = Array.from(new Set(m.flatMap((W) => W.values.map((y) => y.x)).filter((W) => W != null).map((W) => String(W)))), p = Math.max(1, Z.length), Y = Math.max(1, m.length), R = Math.max(1, ...m.flatMap((W) => W.values.map((y) => y.y)).filter((W) => Number.isFinite(W))), X = Math.max(1, e - o * 2), H = Math.max(1, A - o * 2), S = String((t == null ? void 0 : t.barDir) || "col").toLowerCase();
  21406. if (r) {
  21407. const W = [];
  21408. if (S === "bar") {
  21409. const f = H / p, D = f * 0.8, F = (f - D) / 2, T = D / Y;
  21410. for (let Q = 0; Q < p; Q++)
  21411. for (let P = 0; P < m.length; P++) {
  21412. const L = m[P].values.find((q) => q.x === Z[Q]), J = (L ? L.y : 0) / R * X, k = o, j = o + Q * f + F + P * T;
  21413. W.push({ x: k, y: j, w: Math.max(0, J), h: Math.max(0, T * 0.9), fill: a(P), opacity: d });
  21414. }
  21415. } else {
  21416. const f = X / p, D = f * 0.8, F = (f - D) / 2, T = D / Y;
  21417. for (let Q = 0; Q < p; Q++)
  21418. for (let P = 0; P < m.length; P++) {
  21419. const L = m[P].values.find((q) => q.x === Z[Q]), J = (L ? L.y : 0) / R * H, k = o + Q * f + F + P * T, j = o + (H - J);
  21420. W.push({ x: k, y: j, w: Math.max(0, T * 0.9), h: Math.max(0, J), fill: a(P), opacity: d });
  21421. }
  21422. }
  21423. const y = { kind: "bar", bars: W, paths: [], points: [], slices: [], cx: 0, cy: 0, holeR: 0 };
  21424. return Ku.set(C, y), y;
  21425. }
  21426. const z = [], v = [], K = Math.max(1, Math.round(Math.min(e, A) * 0.01)), V = !!(t != null && t.marker), N = (W) => o + (p === 1 ? X / 2 : W / (p - 1) * X), B = (W) => o + (1 - W / R) * H;
  21427. m.forEach((W, y) => {
  21428. let f = "";
  21429. Z.forEach((D, F) => {
  21430. const T = W.values.find((E) => E.x === D), Q = T ? T.y : 0, P = N(F), L = B(Q);
  21431. f += F === 0 ? `M ${P} ${L}` : ` L ${P} ${L}`, V && v.push({ cx: P, cy: L, r: K * 0.9 + 1, fill: a(y), opacity: d });
  21432. }), z.push({ d: f, stroke: a(y), strokeWidth: K });
  21433. });
  21434. const G = { kind: "line", bars: [], paths: z, points: v, slices: [], cx: 0, cy: 0, holeR: 0 };
  21435. return Ku.set(C, G), G;
  21436. }
  21437. const p8 = /* @__PURE__ */ new Map();
  21438. function Zm(t, I, g) {
  21439. const C = `t-${cG(I, g)}`, i = p8.get(C);
  21440. if (i) return i;
  21441. const e = t == null ? void 0 : t.data, A = Array.isArray(e) ? e : [], s = t == null ? void 0 : t.colWidths, l = t == null ? void 0 : t.rowHeights, n = Array.isArray(s) ? s.map(gI) : [], a = Array.isArray(l) ? l.map(gI) : [], d = A.map((c) => (Array.isArray(c) ? c : []).map((h) => Irg(t, h))), o = {
  21442. colWidths: n,
  21443. rowHeights: a,
  21444. rows: d
  21445. };
  21446. return p8.set(C, o), o;
  21447. }
  21448. function OIg(t, I, g, C) {
  21449. const e = Zm(t, I, g).rowHeights[C];
  21450. if (e)
  21451. return {
  21452. height: `${e}px`
  21453. };
  21454. }
  21455. function grg(t) {
  21456. const I = t.match(/text-align\s*:\s*(left|right|center|justify)/i);
  21457. return I ? I[1].toLowerCase() : "left";
  21458. }
  21459. function jY(t) {
  21460. if (!t) return "";
  21461. const I = String(t.borderColor || ""), g = Math.max(0, gI(t.borderWidth)), C = String(t.borderType || "solid");
  21462. return !I || !g ? "" : `${g}px ${C === "dashed" || C === "dash" ? "dashed" : "solid"} ${I}`;
  21463. }
  21464. function Irg(t, I) {
  21465. const g = I && typeof I == "object" ? I : {}, C = String(g.text ?? g.content ?? g.html ?? ""), i = Math.max(1, gI(g.colSpan ?? g.colspan ?? g.gridSpan) || 1), e = Math.max(1, gI(g.rowSpan ?? g.rowspan) || 1), A = gI(g.hMerge) === 1 || gI(g.vMerge) === 1, s = String(g.fillColor || "") || void 0, l = String(g.fontColor || "") || void 0, n = g.fontBold ? 700 : void 0, a = g.fontItalic ? "italic" : void 0, d = C ? grg(C) : void 0, o = g.borders || (t == null ? void 0 : t.borders) || void 0, c = jY(o == null ? void 0 : o.top), r = jY(o == null ? void 0 : o.right), h = jY(o == null ? void 0 : o.bottom), b = jY(o == null ? void 0 : o.left);
  21466. return {
  21467. html: C,
  21468. colspan: i,
  21469. rowspan: e,
  21470. skip: A,
  21471. style: {
  21472. padding: "2px 4px",
  21473. verticalAlign: "middle",
  21474. background: s,
  21475. color: l,
  21476. fontWeight: n,
  21477. fontStyle: a,
  21478. textAlign: d,
  21479. borderTop: c || void 0,
  21480. borderRight: r || void 0,
  21481. borderBottom: h || void 0,
  21482. borderLeft: b || void 0,
  21483. overflow: "hidden"
  21484. }
  21485. };
  21486. }
  21487. function M9(t) {
  21488. return t.replace(/[^a-zA-Z0-9_-]/g, "_");
  21489. }
  21490. function hs(t, I, g) {
  21491. var l, n, a;
  21492. const C = typeof t.fill == "object" ? t.fill : null;
  21493. if (!C || C.type !== "pattern" || !C.value) return null;
  21494. const i = String(((l = C.value) == null ? void 0 : l.type) || ""), e = String(((n = C.value) == null ? void 0 : n.foregroundColor) || "#000"), A = String(((a = C.value) == null ? void 0 : a.backgroundColor) || "#fff"), s = `pptx-pattern-${I}-${M9(g)}`;
  21495. return i === "pct5" ? {
  21496. id: s,
  21497. width: 10,
  21498. height: 10,
  21499. background: A,
  21500. shapes: [{ kind: "circle", cx: 5, cy: 5, r: 1.2, fill: e }]
  21501. } : i === "solidDmnd" ? {
  21502. id: s,
  21503. width: 12,
  21504. height: 12,
  21505. background: A,
  21506. shapes: [{ kind: "polygon", points: "6,0 12,6 6,12 0,6", fill: e }]
  21507. } : {
  21508. id: s,
  21509. width: 10,
  21510. height: 10,
  21511. background: A,
  21512. shapes: [{ kind: "circle", cx: 5, cy: 5, r: 1, fill: e }]
  21513. };
  21514. }
  21515. function Gm(t, I, g) {
  21516. const C = typeof t.fill == "object" ? t.fill : null;
  21517. if (!C) return null;
  21518. const i = C == null ? void 0 : C.value;
  21519. if (!(C.type === "image" || !!i && (typeof i.picBase64 == "string" || typeof i.src == "string") || typeof C.picBase64 == "string" || typeof C.src == "string")) return null;
  21520. const A = tA(t);
  21521. return A ? {
  21522. id: `pptx-shape-img-${I}-${M9(g)}`,
  21523. href: A
  21524. } : null;
  21525. }
  21526. const gA = {
  21527. pattern: /* @__PURE__ */ new Map(),
  21528. image: /* @__PURE__ */ new Map(),
  21529. gradient: /* @__PURE__ */ new Map()
  21530. };
  21531. function UIg(t, I, g) {
  21532. const C = `p-${cG(I, g)}`;
  21533. if (gA.pattern.has(C)) return gA.pattern.get(C);
  21534. const i = hs(t, I, g);
  21535. return gA.pattern.set(C, i), i;
  21536. }
  21537. function LN(t, I, g) {
  21538. const C = `i-${cG(I, g)}`;
  21539. if (gA.image.has(C)) return gA.image.get(C);
  21540. const i = Gm(t, I, g);
  21541. return gA.image.set(C, i), i;
  21542. }
  21543. function Crg(t) {
  21544. const I = String(t ?? "").trim();
  21545. if (!I) return "";
  21546. if (I.endsWith("%")) return I;
  21547. const g = Number(I);
  21548. return Number.isFinite(g) ? `${g}%` : I;
  21549. }
  21550. function ae(t, I, g) {
  21551. var m, Z, p;
  21552. const C = `g-${cG(I, g)}`;
  21553. if (gA.gradient.has(C)) return gA.gradient.get(C);
  21554. const i = typeof t.fill == "object" ? t.fill : null;
  21555. if (!i || i.type !== "gradient" || !i.value)
  21556. return gA.gradient.set(C, null), null;
  21557. const e = Array.isArray((m = i.value) == null ? void 0 : m.colors) ? i.value.colors : [], A = gI((Z = i.value) == null ? void 0 : Z.rot), s = String(((p = i.value) == null ? void 0 : p.path) || "rect"), l = e.map((Y) => {
  21558. const R = Crg(Y == null ? void 0 : Y.pos), X = String((Y == null ? void 0 : Y.color) ?? "").trim(), H = (Y == null ? void 0 : Y.alpha) ?? (Y == null ? void 0 : Y.opacity), S = H == null ? void 0 : Math.max(0, Math.min(1, gI(H)));
  21559. return X ? {
  21560. offset: R || void 0,
  21561. color: X,
  21562. opacity: S
  21563. } : null;
  21564. }).filter(Boolean), n = `pptx-grad-${I}-${M9(g)}`;
  21565. if (!l.length)
  21566. return gA.gradient.set(C, null), null;
  21567. if (s !== "rect") {
  21568. const Y = {
  21569. id: n,
  21570. kind: "radial",
  21571. stops: l.map((R) => ({ ...R, offset: R.offset || "0%" }))
  21572. };
  21573. return gA.gradient.set(C, Y), Y;
  21574. }
  21575. const a = (90 - A + 360) % 360 * (Math.PI / 180), d = Math.cos(a), o = Math.sin(a), c = 0.5 - d / 2, r = 0.5 + o / 2, h = 0.5 + d / 2, b = 0.5 - o / 2, u = {
  21576. id: n,
  21577. kind: "linear",
  21578. x1: `${Math.max(0, Math.min(1, c)) * 100}%`,
  21579. y1: `${Math.max(0, Math.min(1, r)) * 100}%`,
  21580. x2: `${Math.max(0, Math.min(1, h)) * 100}%`,
  21581. y2: `${Math.max(0, Math.min(1, b)) * 100}%`,
  21582. stops: l.map((Y) => ({ ...Y, offset: Y.offset || "0%" }))
  21583. };
  21584. return gA.gradient.set(C, u), u;
  21585. }
  21586. function EIg(t, I, g) {
  21587. return !!(ae(t, I, g) || UIg(t, I, g) || LN(t, I, g));
  21588. }
  21589. function PIg(t, I, g) {
  21590. var e;
  21591. const C = typeof t.fill == "object" ? t.fill : null, i = String(t.type || "").toLowerCase().includes("pic");
  21592. if ((!C || !C.type) && i) {
  21593. const A = LN(t, I, g);
  21594. return A ? `url(#${A.id})` : "transparent";
  21595. }
  21596. if (!C || !C.type) return "transparent";
  21597. if (C.type === "color") return String(C.value || "transparent");
  21598. if (C.type === "gradient") {
  21599. const A = ae(t, I, g);
  21600. return A ? `url(#${A.id})` : "transparent";
  21601. }
  21602. if (C.type === "pattern") {
  21603. const A = UIg(t, I, g);
  21604. return A ? `url(#${A.id})` : String(((e = C.value) == null ? void 0 : e.foregroundColor) || "transparent");
  21605. }
  21606. if (C.type === "image" || i || C.type == null && LN(t, I, g)) {
  21607. const A = LN(t, I, g);
  21608. return A ? `url(#${A.id})` : "transparent";
  21609. }
  21610. return "transparent";
  21611. }
  21612. function _Ig(t) {
  21613. return CM(t).color || "transparent";
  21614. }
  21615. function qIg(t) {
  21616. const I = CM(t);
  21617. return Math.max(0, I.width);
  21618. }
  21619. function $Ig(t) {
  21620. return CM(t).dasharray;
  21621. }
  21622. function gCg(t) {
  21623. const I = typeof t.path == "string" ? String(t.path).trim() : "";
  21624. if (I) return I;
  21625. const g = Math.max(0, gI(t.width)), C = Math.max(0, gI(t.height)), i = String(t.shapType || t.shapeType || t.geom || "").toLowerCase(), e = !!t.isFlipH, A = !!t.isFlipV;
  21626. if (i === "line" || i === "connector" || i === "straightconnector1")
  21627. return A && e ? `M ${g} ${C} L 0 0` : A ? `M 0 ${C} L ${g} 0` : e ? `M ${g} 0 L 0 ${C}` : `M 0 0 L ${g} ${C}`;
  21628. if (g <= 0 || C <= 0)
  21629. return g > 0 ? `M 0 0 L ${g} 0` : C > 0 ? `M 0 0 L 0 ${C}` : "";
  21630. if (i === "ellipse" || i === "circle") {
  21631. const l = g / 2, n = C / 2, a = g / 2, d = C / 2;
  21632. return `M ${l - a} ${n} A ${a} ${d} 0 1 0 ${l + a} ${n} A ${a} ${d} 0 1 0 ${l - a} ${n} Z`;
  21633. }
  21634. if (i === "triangle" || i === "tri")
  21635. return `M ${g / 2} 0 L ${g} ${C} L 0 ${C} Z`;
  21636. if (i === "diamond" || i === "rhombus")
  21637. return `M ${g / 2} 0 L ${g} ${C / 2} L ${g / 2} ${C} L 0 ${C / 2} Z`;
  21638. const s = Math.max(0, Math.min(Math.min(g, C) / 2, gI(t.radius || t.cornerRadius || t.rx)));
  21639. if (s) {
  21640. const l = Math.min(s, g / 2, C / 2);
  21641. return `M ${l} 0 H ${g - l} A ${l} ${l} 0 0 1 ${g} ${l} V ${C - l} A ${l} ${l} 0 0 1 ${g - l} ${C} H ${l} A ${l} ${l} 0 0 1 0 ${C - l} V ${l} A ${l} ${l} 0 0 1 ${l} 0 Z`;
  21642. }
  21643. return `M 0 0 H ${g} V ${C} H 0 Z`;
  21644. }
  21645. function trg(t) {
  21646. var C;
  21647. const I = [
  21648. t == null ? void 0 : t.elements,
  21649. t == null ? void 0 : t.children,
  21650. t == null ? void 0 : t.childrens,
  21651. t == null ? void 0 : t.items,
  21652. t == null ? void 0 : t.spTree,
  21653. (C = t == null ? void 0 : t.spTree) == null ? void 0 : C.elements
  21654. ], g = [];
  21655. return I.forEach((i) => {
  21656. Array.isArray(i) && i.forEach((e) => {
  21657. e && typeof e == "object" && g.push(e);
  21658. });
  21659. }), g;
  21660. }
  21661. function irg(t) {
  21662. const I = String(t || "").match(/-?\d*\.?\d+(?:e[-+]?\d+)?/gi);
  21663. if (!I || I.length < 2) return null;
  21664. let g = 0, C = 0;
  21665. for (let i = 0; i + 1 < I.length; i += 2) {
  21666. const e = Number(I[i]), A = Number(I[i + 1]);
  21667. Number.isFinite(e) && (g = Math.max(g, Math.abs(e))), Number.isFinite(A) && (C = Math.max(C, Math.abs(A)));
  21668. }
  21669. return !g || !C ? null : { vbW: g, vbH: C };
  21670. }
  21671. function ICg(t) {
  21672. const I = (t == null ? void 0 : t.chOff) ?? (t == null ? void 0 : t.childOff) ?? (t == null ? void 0 : t.childOffset) ?? null, g = (t == null ? void 0 : t.chExt) ?? (t == null ? void 0 : t.childExt) ?? (t == null ? void 0 : t.childExtent) ?? null, C = gI((I == null ? void 0 : I.x) ?? (I == null ? void 0 : I.left) ?? (I == null ? void 0 : I.l) ?? (t == null ? void 0 : t.chOffX) ?? (t == null ? void 0 : t.childOffX)), i = gI((I == null ? void 0 : I.y) ?? (I == null ? void 0 : I.top) ?? (I == null ? void 0 : I.t) ?? (t == null ? void 0 : t.chOffY) ?? (t == null ? void 0 : t.childOffY)), e = gI((g == null ? void 0 : g.cx) ?? (g == null ? void 0 : g.w) ?? (g == null ? void 0 : g.width) ?? (t == null ? void 0 : t.chExtW) ?? (t == null ? void 0 : t.childExtW)), A = gI((g == null ? void 0 : g.cy) ?? (g == null ? void 0 : g.h) ?? (g == null ? void 0 : g.height) ?? (t == null ? void 0 : t.chExtH) ?? (t == null ? void 0 : t.childExtH));
  21673. return !e || !A ? null : { offX: C, offY: i, extW: e, extH: A };
  21674. }
  21675. function erg(t, I, g, C, i) {
  21676. const e = Math.max(0, gI(t.width)), A = Math.max(0, gI(t.height)), s = gI(I.left), l = gI(I.top), n = Math.max(0, gI(I.width)), a = Math.max(0, gI(I.height)), d = s >= -0.5 && l >= -0.5 && s + n <= e + 0.5 && l + a <= A + 0.5, o = ICg(t), c = o && e ? e / o.extW : 1, r = o && A ? A / o.extH : 1, h = d ? s : o ? (s - o.offX) * c : s - C, b = d ? l : o ? (l - o.offY) * r : l - i, u = o && !d ? n * c : n, m = o && !d ? a * r : a, Z = gI(I.rotate), p = !!I.isFlipH, Y = !!I.isFlipV, R = gI(I.order) || g, X = I.opacity == null ? 1 : Math.max(0, Math.min(1, gI(I.opacity))), H = [];
  21677. Z && H.push(`rotate(${Z}deg)`), p && H.push("scaleX(-1)"), Y && H.push("scaleY(-1)");
  21678. const S = QIg(I), z = jIg(I), v = xIg(I);
  21679. return {
  21680. position: "absolute",
  21681. left: `${h}px`,
  21682. top: `${b}px`,
  21683. width: `${u}px`,
  21684. height: `${m}px`,
  21685. zIndex: R,
  21686. opacity: X,
  21687. background: S,
  21688. border: z,
  21689. filter: v,
  21690. transformOrigin: "center center",
  21691. transform: H.length ? H.join(" ") : void 0
  21692. };
  21693. }
  21694. const CCg = r$({
  21695. name: "PptxGroup",
  21696. props: {
  21697. el: { type: Object, required: !0 },
  21698. slideIndex: { type: Number, required: !0 },
  21699. cacheId: { type: String, required: !0 },
  21700. absLeft: { type: Number, required: !0 },
  21701. absTop: { type: Number, required: !0 }
  21702. },
  21703. setup(t) {
  21704. const I = (C, i, e, A, s) => {
  21705. if (!EIg(C, i, e)) return null;
  21706. const l = ae(C, i, e), n = hs(C, i, e), a = Gm(C, i, e), d = [];
  21707. if ((l == null ? void 0 : l.kind) === "linear" ? d.push(
  21708. yI(
  21709. "linearGradient",
  21710. { id: l.id, x1: l.x1, y1: l.y1, x2: l.x2, y2: l.y2 },
  21711. l.stops.map((o, c) => yI("stop", { key: c, offset: o.offset, "stop-color": o.color, "stop-opacity": o.opacity }))
  21712. )
  21713. ) : (l == null ? void 0 : l.kind) === "radial" && d.push(
  21714. yI(
  21715. "radialGradient",
  21716. { id: l.id, cx: "50%", cy: "50%", r: "50%" },
  21717. l.stops.map((o, c) => yI("stop", { key: c, offset: o.offset, "stop-color": o.color, "stop-opacity": o.opacity }))
  21718. )
  21719. ), n && d.push(
  21720. yI(
  21721. "pattern",
  21722. { id: n.id, patternUnits: "userSpaceOnUse", width: n.width, height: n.height },
  21723. [
  21724. yI("rect", { x: 0, y: 0, width: n.width, height: n.height, fill: n.background }),
  21725. ...n.shapes.map((o, c) => o.kind === "circle" ? yI("circle", { key: c, cx: o.cx, cy: o.cy, r: o.r, fill: o.fill }) : o.kind === "polygon" ? yI("polygon", { key: c, points: o.points, fill: o.fill }) : yI("rect", {
  21726. key: c,
  21727. x: o.x,
  21728. y: o.y,
  21729. width: o.width,
  21730. height: o.height,
  21731. fill: o.fill,
  21732. transform: o.transform
  21733. }))
  21734. ]
  21735. )
  21736. ), a) {
  21737. const o = KIg(C), c = o ? 1 / (1 - o.l - o.r) : 1, r = o ? 1 / (1 - o.t - o.b) : 1, h = o ? -o.l * c : 0, b = o ? -o.t * r : 0;
  21738. d.push(
  21739. yI(
  21740. "pattern",
  21741. {
  21742. id: a.id,
  21743. patternUnits: "userSpaceOnUse",
  21744. patternContentUnits: "userSpaceOnUse",
  21745. x: 0,
  21746. y: 0,
  21747. width: A,
  21748. height: s
  21749. },
  21750. [
  21751. yI("image", {
  21752. x: h * A,
  21753. y: b * s,
  21754. width: c * A,
  21755. height: r * s,
  21756. href: a.href,
  21757. "xlink:href": a.href,
  21758. preserveAspectRatio: "none"
  21759. })
  21760. ]
  21761. )
  21762. );
  21763. }
  21764. return d.length ? yI("defs", null, d) : null;
  21765. }, g = (C, i, e, A, s, l) => {
  21766. const n = erg(e, C, i, A, s), a = KI(C, i, l), d = G8(n == null ? void 0 : n.left), o = G8(n == null ? void 0 : n.top), c = A + d, r = s + o, h = ICg(e), b = Math.max(0, gI(e.width)), u = Math.max(0, gI(e.height)), m = h && b ? b / h.extW : 1, Z = h && u ? u / h.extH : 1;
  21767. if (Y9(C))
  21768. return yI("div", { key: a, class: "pptx-element", style: n }, [
  21769. yI("div", { class: "pptx-img-wrap", style: FIg(C) }, [
  21770. yI("img", { class: "pptx-img", src: tA(C), style: kIg(C), alt: "", draggable: !1 })
  21771. ])
  21772. ]);
  21773. if (N9(C))
  21774. return yI("div", { key: a, class: "pptx-element", style: n }, [yI("video", { class: "pptx-media", src: tA(C), controls: !0, preload: "metadata" })]);
  21775. if (V9(C))
  21776. return yI("div", { key: a, class: "pptx-element", style: n }, [yI("audio", { class: "pptx-media", src: tA(C), controls: !0, preload: "metadata" })]);
  21777. if (vIg(C))
  21778. return yI("div", { key: a, class: "pptx-element", style: n }, [yI("img", { class: "pptx-img", src: tA(C), alt: "", draggable: !1 })]);
  21779. if (JIg(C)) {
  21780. const Y = Ti(C, t.slideIndex, a), R = [];
  21781. return Y.kind === "bar" ? R.push(...Y.bars.map((X, H) => yI("rect", { key: H, x: X.x, y: X.y, width: X.w, height: X.h, fill: X.fill, "fill-opacity": X.opacity }))) : Y.kind === "line" ? (R.push(
  21782. ...Y.paths.map(
  21783. (X, H) => yI("path", { key: H, d: X.d, fill: "none", stroke: X.stroke, "stroke-width": X.strokeWidth, "stroke-linejoin": "round", "stroke-linecap": "round" })
  21784. )
  21785. ), R.push(...Y.points.map((X, H) => yI("circle", { key: H, cx: X.cx, cy: X.cy, r: X.r, fill: X.fill, "fill-opacity": X.opacity })))) : Y.kind === "pie" ? (R.push(...Y.slices.map((X, H) => yI("path", { key: H, d: X.d, fill: X.fill, "fill-opacity": X.opacity }))), Y.holeR && R.push(yI("circle", { cx: Y.cx, cy: Y.cy, r: Y.holeR, fill: "#fff" }))) : Y.kind === "scatter" && R.push(...Y.points.map((X, H) => yI("circle", { key: H, cx: X.cx, cy: X.cy, r: X.r, fill: X.fill, "fill-opacity": X.opacity }))), yI("div", { key: a, class: "pptx-element", style: n }, [yI("svg", { class: "pptx-chart", viewBox: `0 0 ${gI(C.width)} ${gI(C.height)}`, preserveAspectRatio: "none" }, R)]);
  21786. }
  21787. if (zIg(C)) {
  21788. const Y = Zm(C, t.slideIndex, a);
  21789. return yI("div", { key: a, class: "pptx-element", style: n }, [
  21790. yI("div", { class: "pptx-table-wrap" }, [
  21791. yI("table", { class: "pptx-table" }, [
  21792. Y.colWidths.length ? yI("colgroup", null, Y.colWidths.map((R, X) => yI("col", { key: X, style: { width: R ? `${R}px` : void 0 } }))) : null,
  21793. yI(
  21794. "tbody",
  21795. null,
  21796. Y.rows.map(
  21797. (R, X) => yI(
  21798. "tr",
  21799. { key: X, style: OIg(C, t.slideIndex, a, X) },
  21800. R.map((H, S) => H.skip ? null : yI(
  21801. "td",
  21802. { key: `${X}-${S}`, colspan: H.colspan, rowspan: H.rowspan, style: H.style },
  21803. [yI("div", { class: "pptx-table-html", innerHTML: dh(H.html) })]
  21804. )).filter(Boolean)
  21805. )
  21806. )
  21807. )
  21808. ].filter(Boolean))
  21809. ])
  21810. ]);
  21811. }
  21812. if (tM(C) || y9(C)) {
  21813. const Y = Math.max(0, gI(C.width)), R = Math.max(0, gI(C.height)), X = gCg(C), H = (!Y || !R) && X ? irg(X) : null, S = Y || (H == null ? void 0 : H.vbW) || 1, z = R || (H == null ? void 0 : H.vbH) || 1, v = I(C, t.slideIndex, a, S, z), K = yI(
  21814. "svg",
  21815. {
  21816. class: "pptx-shape-svg",
  21817. viewBox: `0 0 ${S} ${z}`,
  21818. preserveAspectRatio: "none",
  21819. style: {
  21820. overflow: "visible",
  21821. width: "100%",
  21822. height: "100%",
  21823. display: "block"
  21824. }
  21825. },
  21826. [
  21827. v,
  21828. yI("path", {
  21829. d: X,
  21830. fill: PIg(C, t.slideIndex, a),
  21831. stroke: _Ig(C),
  21832. "stroke-width": qIg(C),
  21833. "stroke-dasharray": $Ig(C),
  21834. style: { vectorEffect: "non-scaling-stroke" }
  21835. })
  21836. ].filter(Boolean)
  21837. ), N = typeof C.content == "string" && C.content.trim() ? yI(
  21838. "div",
  21839. {
  21840. class: "pptx-html",
  21841. style: {
  21842. ...aV(),
  21843. overflow: "visible",
  21844. width: `${Y}px`,
  21845. height: `${R}px`,
  21846. transform: m !== 1 || Z !== 1 ? `scale(${m}, ${Z})` : void 0,
  21847. transformOrigin: "top left",
  21848. position: "absolute",
  21849. left: 0,
  21850. top: 0
  21851. }
  21852. },
  21853. [yI("div", { class: "pptx-html-inner", style: oV(C), innerHTML: dh(C.content) })]
  21854. ) : null;
  21855. return yI("div", { key: a, class: "pptx-element", style: { ...n, overflow: "visible" } }, [K, N].filter(Boolean));
  21856. }
  21857. if (LIg(C) || TIg(C))
  21858. return yI("div", { key: a, class: "pptx-element", style: n }, [
  21859. yI(CCg, { el: C, slideIndex: t.slideIndex, cacheId: a, absLeft: c, absTop: r })
  21860. ]);
  21861. const p = typeof C.content == "string" && C.content.trim();
  21862. return yI(
  21863. "div",
  21864. { key: a, class: "pptx-element", style: n },
  21865. p ? [
  21866. yI("div", { class: "pptx-html", style: aV() }, [
  21867. yI("div", { class: "pptx-html-inner", style: oV(C), innerHTML: dh(C.content) })
  21868. ])
  21869. ] : []
  21870. );
  21871. };
  21872. return () => {
  21873. const C = trg(t.el);
  21874. return yI(
  21875. "div",
  21876. { class: "pptx-group-inner" },
  21877. C.map((i, e) => g(i, e, t.el, t.absLeft, t.absTop, t.cacheId))
  21878. );
  21879. };
  21880. }
  21881. }), Arg = {
  21882. key: 0,
  21883. class: "pptx-empty"
  21884. }, srg = {
  21885. key: 1,
  21886. class: "pptx-slides"
  21887. }, lrg = ["src"], nrg = ["src"], arg = ["src"], org = ["src"], crg = ["viewBox"], drg = ["x", "y", "width", "height", "fill", "fill-opacity"], rrg = ["d", "stroke", "stroke-width"], hrg = ["cx", "cy", "r", "fill", "fill-opacity"], brg = ["d", "fill", "fill-opacity"], urg = ["cx", "cy", "r"], mrg = ["cx", "cy", "r", "fill", "fill-opacity"], Zrg = {
  21888. key: 6,
  21889. class: "pptx-table-wrap"
  21890. }, Grg = { class: "pptx-table" }, wrg = { key: 0 }, prg = ["colspan", "rowspan"], Brg = ["innerHTML"], Wrg = ["viewBox"], yrg = { key: 0 }, Yrg = ["id", "x1", "y1", "x2", "y2"], Nrg = ["offset", "stop-color", "stop-opacity"], Vrg = ["id"], Mrg = ["offset", "stop-color", "stop-opacity"], Rrg = ["id", "width", "height"], frg = ["width", "height", "fill"], Hrg = ["cx", "cy", "r", "fill"], Xrg = ["points", "fill"], Srg = ["x", "y", "width", "height", "fill", "transform"], Drg = ["id"], Krg = ["href"], Frg = ["d", "fill", "stroke", "stroke-width", "stroke-dasharray"], krg = ["innerHTML"], zrg = ["innerHTML"], Jrg = /* @__PURE__ */ r$({
  21891. __name: "PPT",
  21892. props: {
  21893. pptxJson: {}
  21894. },
  21895. setup(t) {
  21896. const I = t, g = wi(null), C = wi(0);
  21897. let i = null;
  21898. const e = DA(() => {
  21899. var o, c, r, h;
  21900. const a = ((c = (o = I.pptxJson) == null ? void 0 : o.size) == null ? void 0 : c.width) ?? 960, d = ((h = (r = I.pptxJson) == null ? void 0 : r.size) == null ? void 0 : h.height) ?? 540;
  21901. return {
  21902. width: Number.isFinite(a) ? a : 960,
  21903. height: Number.isFinite(d) ? d : 540
  21904. };
  21905. }), A = DA(() => {
  21906. const a = C.value;
  21907. if (!a) return 1;
  21908. const d = a / e.value.width;
  21909. return Math.min(1, Math.max(0.1, d));
  21910. }), s = DA(() => {
  21911. var d;
  21912. return (Array.isArray((d = I.pptxJson) == null ? void 0 : d.slides) ? I.pptxJson.slides : []).map((o) => {
  21913. const c = (Array.isArray(o.elements) ? o.elements : []).map((m) => ({
  21914. ...m,
  21915. __source: "slide"
  21916. })), r = new Set(c.map(w8).filter(Boolean)), u = [...(Array.isArray(o.layoutElements) ? o.layoutElements : []).map((m) => {
  21917. const Z = { ...m, __source: "layout" }, p = w8(Z);
  21918. return p && r.has(p) ? null : p && typeof Z.content == "string" && Udg(Z.content) ? { ...Z, content: "" } : Z;
  21919. }).filter(Boolean), ...c].filter((m) => m && typeof m == "object").map((m, Z) => ({ el: m, idx: Z })).sort((m, Z) => {
  21920. const p = gI(m.el.order), Y = gI(Z.el.order);
  21921. return p !== Y ? p - Y : m.idx - Z.idx;
  21922. }).map((m) => m.el);
  21923. return {
  21924. ...o,
  21925. elements: u
  21926. };
  21927. });
  21928. });
  21929. tG(() => {
  21930. if (!g.value) return;
  21931. console.log(I.pptxJson);
  21932. const a = () => {
  21933. g.value && (C.value = g.value.clientWidth);
  21934. };
  21935. a(), i = new ResizeObserver(() => a()), i.observe(g.value);
  21936. }), s9(() => {
  21937. i == null || i.disconnect(), i = null;
  21938. });
  21939. function l() {
  21940. return {
  21941. width: `${Math.round(e.value.width * A.value)}px`,
  21942. height: `${Math.round(e.value.height * A.value)}px`
  21943. };
  21944. }
  21945. function n(a) {
  21946. var o;
  21947. const d = _dg(
  21948. (a == null ? void 0 : a.fill) ?? (a == null ? void 0 : a.backgroundFill) ?? (a == null ? void 0 : a.layoutFill) ?? ((o = a == null ? void 0 : a.layout) == null ? void 0 : o.fill) ?? (a == null ? void 0 : a.masterFill)
  21949. );
  21950. return {
  21951. width: `${e.value.width}px`,
  21952. height: `${e.value.height}px`,
  21953. transform: `scale(${A.value})`,
  21954. background: d
  21955. };
  21956. }
  21957. return (a, d) => (Ug(), Pg("div", {
  21958. ref_key: "rootRef",
  21959. ref: g,
  21960. class: "pptx-preview"
  21961. }, [
  21962. s.value.length ? (Ug(), Pg("div", srg, [
  21963. (Ug(!0), Pg(ct, null, vi(s.value, (o, c) => (Ug(), Pg("div", {
  21964. key: c,
  21965. class: "pptx-slide-shell",
  21966. style: Ae(l())
  21967. }, [
  21968. tC("div", {
  21969. class: "pptx-slide",
  21970. style: Ae(n(o))
  21971. }, [
  21972. (Ug(!0), Pg(ct, null, vi(o.elements, (r, h) => {
  21973. var b, u;
  21974. return Ug(), Pg("div", {
  21975. key: Dg(Qdg)(r, h),
  21976. class: "pptx-element",
  21977. style: Ae(Dg($dg)(r, h))
  21978. }, [
  21979. Dg(Y9)(r) ? (Ug(), Pg("div", {
  21980. key: 0,
  21981. class: "pptx-img-wrap",
  21982. style: Ae(Dg(FIg)(r))
  21983. }, [
  21984. tC("img", {
  21985. class: "pptx-img",
  21986. src: Dg(tA)(r),
  21987. style: Ae(Dg(kIg)(r)),
  21988. alt: "",
  21989. draggable: "false"
  21990. }, null, 12, lrg)
  21991. ], 4)) : Dg(N9)(r) ? (Ug(), Pg("video", {
  21992. key: 1,
  21993. class: "pptx-media",
  21994. src: Dg(tA)(r),
  21995. controls: "",
  21996. preload: "metadata"
  21997. }, null, 8, nrg)) : Dg(V9)(r) ? (Ug(), Pg("audio", {
  21998. key: 2,
  21999. class: "pptx-media",
  22000. src: Dg(tA)(r),
  22001. controls: "",
  22002. preload: "metadata"
  22003. }, null, 8, arg)) : Dg(vIg)(r) ? (Ug(), Pg("img", {
  22004. key: 3,
  22005. class: "pptx-img",
  22006. src: Dg(tA)(r),
  22007. alt: "",
  22008. draggable: "false"
  22009. }, null, 8, org)) : Dg(JIg)(r) ? (Ug(), Pg("svg", {
  22010. key: 4,
  22011. class: "pptx-chart",
  22012. viewBox: `0 0 ${Dg(gI)(r.width)} ${Dg(gI)(r.height)}`,
  22013. preserveAspectRatio: "none"
  22014. }, [
  22015. Dg(Ti)(r, c, Dg(KI)(r, h)).kind === "bar" ? (Ug(!0), Pg(ct, { key: 0 }, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).bars, (m, Z) => (Ug(), Pg("rect", {
  22016. key: Z,
  22017. x: m.x,
  22018. y: m.y,
  22019. width: m.w,
  22020. height: m.h,
  22021. fill: m.fill,
  22022. "fill-opacity": m.opacity
  22023. }, null, 8, drg))), 128)) : Dg(Ti)(r, c, Dg(KI)(r, h)).kind === "line" ? (Ug(), Pg(ct, { key: 1 }, [
  22024. (Ug(!0), Pg(ct, null, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).paths, (m, Z) => (Ug(), Pg("path", {
  22025. key: Z,
  22026. d: m.d,
  22027. fill: "none",
  22028. stroke: m.stroke,
  22029. "stroke-width": m.strokeWidth,
  22030. "stroke-linejoin": "round",
  22031. "stroke-linecap": "round"
  22032. }, null, 8, rrg))), 128)),
  22033. (Ug(!0), Pg(ct, null, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).points, (m, Z) => (Ug(), Pg("circle", {
  22034. key: Z,
  22035. cx: m.cx,
  22036. cy: m.cy,
  22037. r: m.r,
  22038. fill: m.fill,
  22039. "fill-opacity": m.opacity
  22040. }, null, 8, hrg))), 128))
  22041. ], 64)) : Dg(Ti)(r, c, Dg(KI)(r, h)).kind === "pie" ? (Ug(), Pg(ct, { key: 2 }, [
  22042. (Ug(!0), Pg(ct, null, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).slices, (m, Z) => (Ug(), Pg("path", {
  22043. key: Z,
  22044. d: m.d,
  22045. fill: m.fill,
  22046. "fill-opacity": m.opacity
  22047. }, null, 8, brg))), 128)),
  22048. Dg(Ti)(r, c, Dg(KI)(r, h)).holeR ? (Ug(), Pg("circle", {
  22049. key: 0,
  22050. cx: Dg(Ti)(r, c, Dg(KI)(r, h)).cx,
  22051. cy: Dg(Ti)(r, c, Dg(KI)(r, h)).cy,
  22052. r: Dg(Ti)(r, c, Dg(KI)(r, h)).holeR,
  22053. fill: "#fff"
  22054. }, null, 8, urg)) : Yt("", !0)
  22055. ], 64)) : Dg(Ti)(r, c, Dg(KI)(r, h)).kind === "scatter" ? (Ug(!0), Pg(ct, { key: 3 }, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).points, (m, Z) => (Ug(), Pg("circle", {
  22056. key: Z,
  22057. cx: m.cx,
  22058. cy: m.cy,
  22059. r: m.r,
  22060. fill: m.fill,
  22061. "fill-opacity": m.opacity
  22062. }, null, 8, mrg))), 128)) : Yt("", !0)
  22063. ], 8, crg)) : Dg(LIg)(r) || Dg(TIg)(r) ? (Ug(), h$(Dg(CCg), {
  22064. key: 5,
  22065. el: r,
  22066. "slide-index": c,
  22067. "cache-id": Dg(KI)(r, h),
  22068. "abs-left": Dg(gI)(r.left),
  22069. "abs-top": Dg(gI)(r.top)
  22070. }, null, 8, ["el", "slide-index", "cache-id", "abs-left", "abs-top"])) : Dg(zIg)(r) ? (Ug(), Pg("div", Zrg, [
  22071. tC("table", Grg, [
  22072. Dg(Zm)(r, c, Dg(KI)(r, h)).colWidths.length ? (Ug(), Pg("colgroup", wrg, [
  22073. (Ug(!0), Pg(ct, null, vi(Dg(Zm)(r, c, Dg(KI)(r, h)).colWidths, (m, Z) => (Ug(), Pg("col", {
  22074. key: Z,
  22075. style: Ae({ width: m ? `${m}px` : void 0 })
  22076. }, null, 4))), 128))
  22077. ])) : Yt("", !0),
  22078. tC("tbody", null, [
  22079. (Ug(!0), Pg(ct, null, vi(Dg(Zm)(r, c, Dg(KI)(r, h)).rows, (m, Z) => (Ug(), Pg("tr", {
  22080. key: Z,
  22081. style: Ae(Dg(OIg)(r, c, Dg(KI)(r, h), Z))
  22082. }, [
  22083. (Ug(!0), Pg(ct, null, vi(m, (p, Y) => (Ug(), Pg(ct, {
  22084. key: `${Z}-${Y}`
  22085. }, [
  22086. p.skip ? Yt("", !0) : (Ug(), Pg("td", {
  22087. key: 0,
  22088. colspan: p.colspan,
  22089. rowspan: p.rowspan,
  22090. style: Ae(p.style)
  22091. }, [
  22092. tC("div", {
  22093. class: "pptx-table-html",
  22094. innerHTML: Dg(dh)(p.html)
  22095. }, null, 8, Brg)
  22096. ], 12, prg))
  22097. ], 64))), 128))
  22098. ], 4))), 128))
  22099. ])
  22100. ])
  22101. ])) : Dg(tM)(r) ? (Ug(), Pg(ct, { key: 7 }, [
  22102. (Ug(), Pg("svg", {
  22103. class: "pptx-shape-svg",
  22104. viewBox: `0 0 ${Dg(gI)(r.width)} ${Dg(gI)(r.height)}`,
  22105. preserveAspectRatio: "none"
  22106. }, [
  22107. Dg(EIg)(r, c, Dg(KI)(r, h)) ? (Ug(), Pg("defs", yrg, [
  22108. ((b = Dg(ae)(r, c, Dg(KI)(r, h))) == null ? void 0 : b.kind) === "linear" ? (Ug(), Pg("linearGradient", {
  22109. key: 0,
  22110. id: Dg(ae)(r, c, Dg(KI)(r, h)).id,
  22111. x1: Dg(ae)(r, c, Dg(KI)(r, h)).x1,
  22112. y1: Dg(ae)(r, c, Dg(KI)(r, h)).y1,
  22113. x2: Dg(ae)(r, c, Dg(KI)(r, h)).x2,
  22114. y2: Dg(ae)(r, c, Dg(KI)(r, h)).y2
  22115. }, [
  22116. (Ug(!0), Pg(ct, null, vi(Dg(ae)(r, c, Dg(KI)(r, h)).stops, (m, Z) => (Ug(), Pg("stop", {
  22117. key: Z,
  22118. offset: m.offset,
  22119. "stop-color": m.color,
  22120. "stop-opacity": m.opacity
  22121. }, null, 8, Nrg))), 128))
  22122. ], 8, Yrg)) : ((u = Dg(ae)(r, c, Dg(KI)(r, h))) == null ? void 0 : u.kind) === "radial" ? (Ug(), Pg("radialGradient", {
  22123. key: 1,
  22124. id: Dg(ae)(r, c, Dg(KI)(r, h)).id,
  22125. cx: "50%",
  22126. cy: "50%",
  22127. r: "50%"
  22128. }, [
  22129. (Ug(!0), Pg(ct, null, vi(Dg(ae)(r, c, Dg(KI)(r, h)).stops, (m, Z) => (Ug(), Pg("stop", {
  22130. key: Z,
  22131. offset: m.offset,
  22132. "stop-color": m.color,
  22133. "stop-opacity": m.opacity
  22134. }, null, 8, Mrg))), 128))
  22135. ], 8, Vrg)) : Yt("", !0),
  22136. Dg(hs)(r, c, Dg(KI)(r, h)) ? (Ug(), Pg("pattern", {
  22137. key: 2,
  22138. id: Dg(hs)(r, c, Dg(KI)(r, h)).id,
  22139. patternUnits: "userSpaceOnUse",
  22140. width: Dg(hs)(r, c, Dg(KI)(r, h)).width,
  22141. height: Dg(hs)(r, c, Dg(KI)(r, h)).height
  22142. }, [
  22143. tC("rect", {
  22144. x: "0",
  22145. y: "0",
  22146. width: Dg(hs)(r, c, Dg(KI)(r, h)).width,
  22147. height: Dg(hs)(r, c, Dg(KI)(r, h)).height,
  22148. fill: Dg(hs)(r, c, Dg(KI)(r, h)).background
  22149. }, null, 8, frg),
  22150. (Ug(!0), Pg(ct, null, vi(Dg(hs)(r, c, Dg(KI)(r, h)).shapes, (m, Z) => (Ug(), Pg(ct, { key: Z }, [
  22151. m.kind === "circle" ? (Ug(), Pg("circle", {
  22152. key: 0,
  22153. cx: m.cx,
  22154. cy: m.cy,
  22155. r: m.r,
  22156. fill: m.fill
  22157. }, null, 8, Hrg)) : m.kind === "polygon" ? (Ug(), Pg("polygon", {
  22158. key: 1,
  22159. points: m.points,
  22160. fill: m.fill
  22161. }, null, 8, Xrg)) : m.kind === "rect" ? (Ug(), Pg("rect", {
  22162. key: 2,
  22163. x: m.x,
  22164. y: m.y,
  22165. width: m.width,
  22166. height: m.height,
  22167. fill: m.fill,
  22168. transform: m.transform
  22169. }, null, 8, Srg)) : Yt("", !0)
  22170. ], 64))), 128))
  22171. ], 8, Rrg)) : Yt("", !0),
  22172. Dg(Gm)(r, c, Dg(KI)(r, h)) ? (Ug(), Pg("pattern", {
  22173. key: 3,
  22174. id: Dg(Gm)(r, c, Dg(KI)(r, h)).id,
  22175. patternUnits: "objectBoundingBox",
  22176. width: "1",
  22177. height: "1"
  22178. }, [
  22179. tC("image", {
  22180. x: "0",
  22181. y: "0",
  22182. width: "100%",
  22183. height: "100%",
  22184. preserveAspectRatio: "none",
  22185. href: Dg(Gm)(r, c, Dg(KI)(r, h)).href
  22186. }, null, 8, Krg)
  22187. ], 8, Drg)) : Yt("", !0)
  22188. ])) : Yt("", !0),
  22189. tC("path", {
  22190. d: Dg(gCg)(r),
  22191. fill: Dg(PIg)(r, c, Dg(KI)(r, h)),
  22192. stroke: Dg(_Ig)(r),
  22193. "stroke-width": Dg(qIg)(r),
  22194. "stroke-dasharray": Dg($Ig)(r)
  22195. }, null, 8, Frg)
  22196. ], 8, Wrg)),
  22197. typeof r.content == "string" && r.content.trim() ? (Ug(), Pg("div", {
  22198. key: 0,
  22199. class: "pptx-html",
  22200. style: Ae(Dg(aV)(r))
  22201. }, [
  22202. tC("div", {
  22203. class: "pptx-html-inner",
  22204. style: Ae(Dg(oV)(r)),
  22205. innerHTML: Dg(dh)(r.content)
  22206. }, null, 12, krg)
  22207. ], 4)) : Yt("", !0)
  22208. ], 64)) : (Ug(), Pg(ct, { key: 8 }, [
  22209. typeof r.content == "string" && r.content.trim() ? (Ug(), Pg("div", {
  22210. key: 0,
  22211. class: "pptx-html",
  22212. style: Ae(Dg(aV)(r))
  22213. }, [
  22214. tC("div", {
  22215. class: "pptx-html-inner",
  22216. style: Ae(Dg(oV)(r)),
  22217. innerHTML: Dg(dh)(r.content)
  22218. }, null, 12, zrg)
  22219. ], 4)) : Yt("", !0)
  22220. ], 64))
  22221. ], 4);
  22222. }), 128))
  22223. ], 4)
  22224. ], 4))), 128))
  22225. ])) : (Ug(), Pg("div", Arg, "暂无可渲染的幻灯片"))
  22226. ], 512));
  22227. }
  22228. }), Lrg = /* @__PURE__ */ V0(Jrg, [["__scopeId", "data-v-5765ec3e"]]);
  22229. function nD(t, I) {
  22230. (I == null || I > t.length) && (I = t.length);
  22231. for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
  22232. return C;
  22233. }
  22234. function tCg(t, I) {
  22235. if (t) {
  22236. if (typeof t == "string") return nD(t, I);
  22237. var g = Object.prototype.toString.call(t).slice(8, -1);
  22238. return g === "Object" && t.constructor && (g = t.constructor.name), g === "Map" || g === "Set" ? Array.from(t) : g === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(g) ? nD(t, I) : void 0;
  22239. }
  22240. }
  22241. function R9(t) {
  22242. return function(I) {
  22243. if (Array.isArray(I)) return nD(I);
  22244. }(t) || function(I) {
  22245. if (typeof Symbol < "u" && I[Symbol.iterator] != null || I["@@iterator"] != null) return Array.from(I);
  22246. }(t) || tCg(t) || function() {
  22247. throw new TypeError(`Invalid attempt to spread non-iterable instance.
  22248. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
  22249. }();
  22250. }
  22251. function B8(t, I, g, C, i, e, A) {
  22252. try {
  22253. var s = t[e](A), l = s.value;
  22254. } catch (n) {
  22255. return void g(n);
  22256. }
  22257. s.done ? I(l) : Promise.resolve(l).then(C, i);
  22258. }
  22259. function SC(t) {
  22260. return function() {
  22261. var I = this, g = arguments;
  22262. return new Promise(function(C, i) {
  22263. var e = t.apply(I, g);
  22264. function A(l) {
  22265. B8(e, C, i, A, s, "next", l);
  22266. }
  22267. function s(l) {
  22268. B8(e, C, i, A, s, "throw", l);
  22269. }
  22270. A(void 0);
  22271. });
  22272. };
  22273. }
  22274. function _a(t) {
  22275. return _a = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(I) {
  22276. return typeof I;
  22277. } : function(I) {
  22278. return I && typeof Symbol == "function" && I.constructor === Symbol && I !== Symbol.prototype ? "symbol" : typeof I;
  22279. }, _a(t);
  22280. }
  22281. function f9(t, I, g) {
  22282. return I in t ? Object.defineProperty(t, I, { value: g, enumerable: !0, configurable: !0, writable: !0 }) : t[I] = g, t;
  22283. }
  22284. var oe = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
  22285. function iM(t) {
  22286. var I = t.default;
  22287. if (typeof I == "function") {
  22288. var g = function() {
  22289. return I.apply(this, arguments);
  22290. };
  22291. g.prototype = I.prototype;
  22292. } else g = {};
  22293. return Object.defineProperty(g, "__esModule", { value: !0 }), Object.keys(t).forEach(function(C) {
  22294. var i = Object.getOwnPropertyDescriptor(t, C);
  22295. Object.defineProperty(g, C, i.get ? i : { enumerable: !0, get: function() {
  22296. return t[C];
  22297. } });
  22298. }), g;
  22299. }
  22300. var iCg = { exports: {} }, W8 = { exports: {} };
  22301. (function(t) {
  22302. function I(g) {
  22303. return t.exports = I = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(C) {
  22304. return typeof C;
  22305. } : function(C) {
  22306. return C && typeof Symbol == "function" && C.constructor === Symbol && C !== Symbol.prototype ? "symbol" : typeof C;
  22307. }, t.exports.__esModule = !0, t.exports.default = t.exports, I(g);
  22308. }
  22309. t.exports = I, t.exports.__esModule = !0, t.exports.default = t.exports;
  22310. })(W8), function(t) {
  22311. var I = W8.exports.default;
  22312. function g() {
  22313. t.exports = g = function() {
  22314. return C;
  22315. }, t.exports.__esModule = !0, t.exports.default = t.exports;
  22316. var C = {}, i = Object.prototype, e = i.hasOwnProperty, A = Object.defineProperty || function(B, G, w) {
  22317. B[G] = w.value;
  22318. }, s = typeof Symbol == "function" ? Symbol : {}, l = s.iterator || "@@iterator", n = s.asyncIterator || "@@asyncIterator", a = s.toStringTag || "@@toStringTag";
  22319. function d(B, G, w) {
  22320. return Object.defineProperty(B, G, { value: w, enumerable: !0, configurable: !0, writable: !0 }), B[G];
  22321. }
  22322. try {
  22323. d({}, "");
  22324. } catch {
  22325. d = function(G, w, W) {
  22326. return G[w] = W;
  22327. };
  22328. }
  22329. function o(B, G, w, W) {
  22330. var y = G && G.prototype instanceof h ? G : h, f = Object.create(y.prototype), D = new K(W || []);
  22331. return A(f, "_invoke", { value: H(B, w, D) }), f;
  22332. }
  22333. function c(B, G, w) {
  22334. try {
  22335. return { type: "normal", arg: B.call(G, w) };
  22336. } catch (W) {
  22337. return { type: "throw", arg: W };
  22338. }
  22339. }
  22340. C.wrap = o;
  22341. var r = {};
  22342. function h() {
  22343. }
  22344. function b() {
  22345. }
  22346. function u() {
  22347. }
  22348. var m = {};
  22349. d(m, l, function() {
  22350. return this;
  22351. });
  22352. var Z = Object.getPrototypeOf, p = Z && Z(Z(V([])));
  22353. p && p !== i && e.call(p, l) && (m = p);
  22354. var Y = u.prototype = h.prototype = Object.create(m);
  22355. function R(B) {
  22356. ["next", "throw", "return"].forEach(function(G) {
  22357. d(B, G, function(w) {
  22358. return this._invoke(G, w);
  22359. });
  22360. });
  22361. }
  22362. function X(B, G) {
  22363. function w(y, f, D, F) {
  22364. var T = c(B[y], B, f);
  22365. if (T.type !== "throw") {
  22366. var Q = T.arg, P = Q.value;
  22367. return P && I(P) == "object" && e.call(P, "__await") ? G.resolve(P.__await).then(function(L) {
  22368. w("next", L, D, F);
  22369. }, function(L) {
  22370. w("throw", L, D, F);
  22371. }) : G.resolve(P).then(function(L) {
  22372. Q.value = L, D(Q);
  22373. }, function(L) {
  22374. return w("throw", L, D, F);
  22375. });
  22376. }
  22377. F(T.arg);
  22378. }
  22379. var W;
  22380. A(this, "_invoke", { value: function(y, f) {
  22381. function D() {
  22382. return new G(function(F, T) {
  22383. w(y, f, F, T);
  22384. });
  22385. }
  22386. return W = W ? W.then(D, D) : D();
  22387. } });
  22388. }
  22389. function H(B, G, w) {
  22390. var W = "suspendedStart";
  22391. return function(y, f) {
  22392. if (W === "executing") throw new Error("Generator is already running");
  22393. if (W === "completed") {
  22394. if (y === "throw") throw f;
  22395. return N();
  22396. }
  22397. for (w.method = y, w.arg = f; ; ) {
  22398. var D = w.delegate;
  22399. if (D) {
  22400. var F = S(D, w);
  22401. if (F) {
  22402. if (F === r) continue;
  22403. return F;
  22404. }
  22405. }
  22406. if (w.method === "next") w.sent = w._sent = w.arg;
  22407. else if (w.method === "throw") {
  22408. if (W === "suspendedStart") throw W = "completed", w.arg;
  22409. w.dispatchException(w.arg);
  22410. } else w.method === "return" && w.abrupt("return", w.arg);
  22411. W = "executing";
  22412. var T = c(B, G, w);
  22413. if (T.type === "normal") {
  22414. if (W = w.done ? "completed" : "suspendedYield", T.arg === r) continue;
  22415. return { value: T.arg, done: w.done };
  22416. }
  22417. T.type === "throw" && (W = "completed", w.method = "throw", w.arg = T.arg);
  22418. }
  22419. };
  22420. }
  22421. function S(B, G) {
  22422. var w = B.iterator[G.method];
  22423. if (w === void 0) {
  22424. if (G.delegate = null, G.method === "throw") {
  22425. if (B.iterator.return && (G.method = "return", G.arg = void 0, S(B, G), G.method === "throw")) return r;
  22426. G.method = "throw", G.arg = new TypeError("The iterator does not provide a 'throw' method");
  22427. }
  22428. return r;
  22429. }
  22430. var W = c(w, B.iterator, G.arg);
  22431. if (W.type === "throw") return G.method = "throw", G.arg = W.arg, G.delegate = null, r;
  22432. var y = W.arg;
  22433. return y ? y.done ? (G[B.resultName] = y.value, G.next = B.nextLoc, G.method !== "return" && (G.method = "next", G.arg = void 0), G.delegate = null, r) : y : (G.method = "throw", G.arg = new TypeError("iterator result is not an object"), G.delegate = null, r);
  22434. }
  22435. function z(B) {
  22436. var G = { tryLoc: B[0] };
  22437. 1 in B && (G.catchLoc = B[1]), 2 in B && (G.finallyLoc = B[2], G.afterLoc = B[3]), this.tryEntries.push(G);
  22438. }
  22439. function v(B) {
  22440. var G = B.completion || {};
  22441. G.type = "normal", delete G.arg, B.completion = G;
  22442. }
  22443. function K(B) {
  22444. this.tryEntries = [{ tryLoc: "root" }], B.forEach(z, this), this.reset(!0);
  22445. }
  22446. function V(B) {
  22447. if (B) {
  22448. var G = B[l];
  22449. if (G) return G.call(B);
  22450. if (typeof B.next == "function") return B;
  22451. if (!isNaN(B.length)) {
  22452. var w = -1, W = function y() {
  22453. for (; ++w < B.length; ) if (e.call(B, w)) return y.value = B[w], y.done = !1, y;
  22454. return y.value = void 0, y.done = !0, y;
  22455. };
  22456. return W.next = W;
  22457. }
  22458. }
  22459. return { next: N };
  22460. }
  22461. function N() {
  22462. return { value: void 0, done: !0 };
  22463. }
  22464. return b.prototype = u, A(Y, "constructor", { value: u, configurable: !0 }), A(u, "constructor", { value: b, configurable: !0 }), b.displayName = d(u, a, "GeneratorFunction"), C.isGeneratorFunction = function(B) {
  22465. var G = typeof B == "function" && B.constructor;
  22466. return !!G && (G === b || (G.displayName || G.name) === "GeneratorFunction");
  22467. }, C.mark = function(B) {
  22468. return Object.setPrototypeOf ? Object.setPrototypeOf(B, u) : (B.__proto__ = u, d(B, a, "GeneratorFunction")), B.prototype = Object.create(Y), B;
  22469. }, C.awrap = function(B) {
  22470. return { __await: B };
  22471. }, R(X.prototype), d(X.prototype, n, function() {
  22472. return this;
  22473. }), C.AsyncIterator = X, C.async = function(B, G, w, W, y) {
  22474. y === void 0 && (y = Promise);
  22475. var f = new X(o(B, G, w, W), y);
  22476. return C.isGeneratorFunction(G) ? f : f.next().then(function(D) {
  22477. return D.done ? D.value : f.next();
  22478. });
  22479. }, R(Y), d(Y, a, "Generator"), d(Y, l, function() {
  22480. return this;
  22481. }), d(Y, "toString", function() {
  22482. return "[object Generator]";
  22483. }), C.keys = function(B) {
  22484. var G = Object(B), w = [];
  22485. for (var W in G) w.push(W);
  22486. return w.reverse(), function y() {
  22487. for (; w.length; ) {
  22488. var f = w.pop();
  22489. if (f in G) return y.value = f, y.done = !1, y;
  22490. }
  22491. return y.done = !0, y;
  22492. };
  22493. }, C.values = V, K.prototype = { constructor: K, reset: function(B) {
  22494. if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = !1, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(v), !B) for (var G in this) G.charAt(0) === "t" && e.call(this, G) && !isNaN(+G.slice(1)) && (this[G] = void 0);
  22495. }, stop: function() {
  22496. this.done = !0;
  22497. var B = this.tryEntries[0].completion;
  22498. if (B.type === "throw") throw B.arg;
  22499. return this.rval;
  22500. }, dispatchException: function(B) {
  22501. if (this.done) throw B;
  22502. var G = this;
  22503. function w(T, Q) {
  22504. return f.type = "throw", f.arg = B, G.next = T, Q && (G.method = "next", G.arg = void 0), !!Q;
  22505. }
  22506. for (var W = this.tryEntries.length - 1; W >= 0; --W) {
  22507. var y = this.tryEntries[W], f = y.completion;
  22508. if (y.tryLoc === "root") return w("end");
  22509. if (y.tryLoc <= this.prev) {
  22510. var D = e.call(y, "catchLoc"), F = e.call(y, "finallyLoc");
  22511. if (D && F) {
  22512. if (this.prev < y.catchLoc) return w(y.catchLoc, !0);
  22513. if (this.prev < y.finallyLoc) return w(y.finallyLoc);
  22514. } else if (D) {
  22515. if (this.prev < y.catchLoc) return w(y.catchLoc, !0);
  22516. } else {
  22517. if (!F) throw new Error("try statement without catch or finally");
  22518. if (this.prev < y.finallyLoc) return w(y.finallyLoc);
  22519. }
  22520. }
  22521. }
  22522. }, abrupt: function(B, G) {
  22523. for (var w = this.tryEntries.length - 1; w >= 0; --w) {
  22524. var W = this.tryEntries[w];
  22525. if (W.tryLoc <= this.prev && e.call(W, "finallyLoc") && this.prev < W.finallyLoc) {
  22526. var y = W;
  22527. break;
  22528. }
  22529. }
  22530. y && (B === "break" || B === "continue") && y.tryLoc <= G && G <= y.finallyLoc && (y = null);
  22531. var f = y ? y.completion : {};
  22532. return f.type = B, f.arg = G, y ? (this.method = "next", this.next = y.finallyLoc, r) : this.complete(f);
  22533. }, complete: function(B, G) {
  22534. if (B.type === "throw") throw B.arg;
  22535. return B.type === "break" || B.type === "continue" ? this.next = B.arg : B.type === "return" ? (this.rval = this.arg = B.arg, this.method = "return", this.next = "end") : B.type === "normal" && G && (this.next = G), r;
  22536. }, finish: function(B) {
  22537. for (var G = this.tryEntries.length - 1; G >= 0; --G) {
  22538. var w = this.tryEntries[G];
  22539. if (w.finallyLoc === B) return this.complete(w.completion, w.afterLoc), v(w), r;
  22540. }
  22541. }, catch: function(B) {
  22542. for (var G = this.tryEntries.length - 1; G >= 0; --G) {
  22543. var w = this.tryEntries[G];
  22544. if (w.tryLoc === B) {
  22545. var W = w.completion;
  22546. if (W.type === "throw") {
  22547. var y = W.arg;
  22548. v(w);
  22549. }
  22550. return y;
  22551. }
  22552. }
  22553. throw new Error("illegal catch attempt");
  22554. }, delegateYield: function(B, G, w) {
  22555. return this.delegate = { iterator: V(B), resultName: G, nextLoc: w }, this.method === "next" && (this.arg = void 0), r;
  22556. } }, C;
  22557. }
  22558. t.exports = g, t.exports.__esModule = !0, t.exports.default = t.exports;
  22559. }(iCg);
  22560. var vN = iCg.exports(), bI = vN;
  22561. try {
  22562. regeneratorRuntime = vN;
  22563. } catch {
  22564. typeof globalThis == "object" ? globalThis.regeneratorRuntime = vN : Function("r", "regeneratorRuntime = r")(vN);
  22565. }
  22566. var M0 = {}, y8 = {}, W0 = typeof global < "u" ? global : typeof self < "u" ? self : typeof window < "u" ? window : {}, Xs = [], xe = [], vrg = typeof Uint8Array < "u" ? Uint8Array : Array, H9 = !1;
  22567. function eCg() {
  22568. H9 = !0;
  22569. for (var t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", I = 0, g = t.length; I < g; ++I) Xs[I] = t[I], xe[t.charCodeAt(I)] = I;
  22570. xe[45] = 62, xe[95] = 63;
  22571. }
  22572. function Trg(t, I, g) {
  22573. for (var C, i, e = [], A = I; A < g; A += 3) C = (t[A] << 16) + (t[A + 1] << 8) + t[A + 2], e.push(Xs[(i = C) >> 18 & 63] + Xs[i >> 12 & 63] + Xs[i >> 6 & 63] + Xs[63 & i]);
  22574. return e.join("");
  22575. }
  22576. function Y8(t) {
  22577. var I;
  22578. H9 || eCg();
  22579. for (var g = t.length, C = g % 3, i = "", e = [], A = 16383, s = 0, l = g - C; s < l; s += A) e.push(Trg(t, s, s + A > l ? l : s + A));
  22580. return C === 1 ? (I = t[g - 1], i += Xs[I >> 2], i += Xs[I << 4 & 63], i += "==") : C === 2 && (I = (t[g - 2] << 8) + t[g - 1], i += Xs[I >> 10], i += Xs[I >> 4 & 63], i += Xs[I << 2 & 63], i += "="), e.push(i), e.join("");
  22581. }
  22582. function QY(t, I, g, C, i) {
  22583. var e, A, s = 8 * i - C - 1, l = (1 << s) - 1, n = l >> 1, a = -7, d = g ? i - 1 : 0, o = g ? -1 : 1, c = t[I + d];
  22584. for (d += o, e = c & (1 << -a) - 1, c >>= -a, a += s; a > 0; e = 256 * e + t[I + d], d += o, a -= 8) ;
  22585. for (A = e & (1 << -a) - 1, e >>= -a, a += C; a > 0; A = 256 * A + t[I + d], d += o, a -= 8) ;
  22586. if (e === 0) e = 1 - n;
  22587. else {
  22588. if (e === l) return A ? NaN : 1 / 0 * (c ? -1 : 1);
  22589. A += Math.pow(2, C), e -= n;
  22590. }
  22591. return (c ? -1 : 1) * A * Math.pow(2, e - C);
  22592. }
  22593. function ACg(t, I, g, C, i, e) {
  22594. var A, s, l, n = 8 * e - i - 1, a = (1 << n) - 1, d = a >> 1, o = i === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0, c = C ? 0 : e - 1, r = C ? 1 : -1, h = I < 0 || I === 0 && 1 / I < 0 ? 1 : 0;
  22595. for (I = Math.abs(I), isNaN(I) || I === 1 / 0 ? (s = isNaN(I) ? 1 : 0, A = a) : (A = Math.floor(Math.log(I) / Math.LN2), I * (l = Math.pow(2, -A)) < 1 && (A--, l *= 2), (I += A + d >= 1 ? o / l : o * Math.pow(2, 1 - d)) * l >= 2 && (A++, l /= 2), A + d >= a ? (s = 0, A = a) : A + d >= 1 ? (s = (I * l - 1) * Math.pow(2, i), A += d) : (s = I * Math.pow(2, d - 1) * Math.pow(2, i), A = 0)); i >= 8; t[g + c] = 255 & s, c += r, s /= 256, i -= 8) ;
  22596. for (A = A << i | s, n += i; n > 0; t[g + c] = 255 & A, c += r, A /= 256, n -= 8) ;
  22597. t[g + c - r] |= 128 * h;
  22598. }
  22599. var xrg = {}.toString, sCg = Array.isArray || function(t) {
  22600. return xrg.call(t) == "[object Array]";
  22601. };
  22602. Hg.TYPED_ARRAY_SUPPORT = W0.TYPED_ARRAY_SUPPORT === void 0 || W0.TYPED_ARRAY_SUPPORT;
  22603. var jrg = cV();
  22604. function cV() {
  22605. return Hg.TYPED_ARRAY_SUPPORT ? 2147483647 : 1073741823;
  22606. }
  22607. function Pl(t, I) {
  22608. if (cV() < I) throw new RangeError("Invalid typed array length");
  22609. return Hg.TYPED_ARRAY_SUPPORT ? (t = new Uint8Array(I)).__proto__ = Hg.prototype : (t === null && (t = new Hg(I)), t.length = I), t;
  22610. }
  22611. function Hg(t, I, g) {
  22612. if (!(Hg.TYPED_ARRAY_SUPPORT || this instanceof Hg)) return new Hg(t, I, g);
  22613. if (typeof t == "number") {
  22614. if (typeof I == "string") throw new Error("If encoding is specified then the first argument must be a string");
  22615. return aD(this, t);
  22616. }
  22617. return lCg(this, t, I, g);
  22618. }
  22619. function lCg(t, I, g, C) {
  22620. if (typeof I == "number") throw new TypeError('"value" argument must not be a number');
  22621. return typeof ArrayBuffer < "u" && I instanceof ArrayBuffer ? function(i, e, A, s) {
  22622. if (e.byteLength, A < 0 || e.byteLength < A) throw new RangeError("'offset' is out of bounds");
  22623. if (e.byteLength < A + (s || 0)) throw new RangeError("'length' is out of bounds");
  22624. return e = A === void 0 && s === void 0 ? new Uint8Array(e) : s === void 0 ? new Uint8Array(e, A) : new Uint8Array(e, A, s), Hg.TYPED_ARRAY_SUPPORT ? (i = e).__proto__ = Hg.prototype : i = PH(i, e), i;
  22625. }(t, I, g, C) : typeof I == "string" ? function(i, e, A) {
  22626. if (typeof A == "string" && A !== "" || (A = "utf8"), !Hg.isEncoding(A)) throw new TypeError('"encoding" must be a valid string encoding');
  22627. var s = 0 | aCg(e, A), l = (i = Pl(i, s)).write(e, A);
  22628. return l !== s && (i = i.slice(0, l)), i;
  22629. }(t, I, g) : function(i, e) {
  22630. if (Ss(e)) {
  22631. var A = 0 | X9(e.length);
  22632. return (i = Pl(i, A)).length === 0 || e.copy(i, 0, 0, A), i;
  22633. }
  22634. if (e) {
  22635. if (typeof ArrayBuffer < "u" && e.buffer instanceof ArrayBuffer || "length" in e) return typeof e.length != "number" || (s = e.length) != s ? Pl(i, 0) : PH(i, e);
  22636. if (e.type === "Buffer" && sCg(e.data)) return PH(i, e.data);
  22637. }
  22638. var s;
  22639. throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.");
  22640. }(t, I);
  22641. }
  22642. function nCg(t) {
  22643. if (typeof t != "number") throw new TypeError('"size" argument must be a number');
  22644. if (t < 0) throw new RangeError('"size" argument must not be negative');
  22645. }
  22646. function aD(t, I) {
  22647. if (nCg(I), t = Pl(t, I < 0 ? 0 : 0 | X9(I)), !Hg.TYPED_ARRAY_SUPPORT) for (var g = 0; g < I; ++g) t[g] = 0;
  22648. return t;
  22649. }
  22650. function PH(t, I) {
  22651. var g = I.length < 0 ? 0 : 0 | X9(I.length);
  22652. t = Pl(t, g);
  22653. for (var C = 0; C < g; C += 1) t[C] = 255 & I[C];
  22654. return t;
  22655. }
  22656. function X9(t) {
  22657. if (t >= cV()) throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x" + cV().toString(16) + " bytes");
  22658. return 0 | t;
  22659. }
  22660. function Ss(t) {
  22661. return !(t == null || !t._isBuffer);
  22662. }
  22663. function aCg(t, I) {
  22664. if (Ss(t)) return t.length;
  22665. if (typeof ArrayBuffer < "u" && typeof ArrayBuffer.isView == "function" && (ArrayBuffer.isView(t) || t instanceof ArrayBuffer)) return t.byteLength;
  22666. typeof t != "string" && (t = "" + t);
  22667. var g = t.length;
  22668. if (g === 0) return 0;
  22669. for (var C = !1; ; ) switch (I) {
  22670. case "ascii":
  22671. case "latin1":
  22672. case "binary":
  22673. return g;
  22674. case "utf8":
  22675. case "utf-8":
  22676. case void 0:
  22677. return dV(t).length;
  22678. case "ucs2":
  22679. case "ucs-2":
  22680. case "utf16le":
  22681. case "utf-16le":
  22682. return 2 * g;
  22683. case "hex":
  22684. return g >>> 1;
  22685. case "base64":
  22686. return rCg(t).length;
  22687. default:
  22688. if (C) return dV(t).length;
  22689. I = ("" + I).toLowerCase(), C = !0;
  22690. }
  22691. }
  22692. function Qrg(t, I, g) {
  22693. var C = !1;
  22694. if ((I === void 0 || I < 0) && (I = 0), I > this.length || ((g === void 0 || g > this.length) && (g = this.length), g <= 0) || (g >>>= 0) <= (I >>>= 0)) return "";
  22695. for (t || (t = "utf8"); ; ) switch (t) {
  22696. case "hex":
  22697. return Ihg(this, I, g);
  22698. case "utf8":
  22699. case "utf-8":
  22700. return cCg(this, I, g);
  22701. case "ascii":
  22702. return $rg(this, I, g);
  22703. case "latin1":
  22704. case "binary":
  22705. return ghg(this, I, g);
  22706. case "base64":
  22707. return qrg(this, I, g);
  22708. case "ucs2":
  22709. case "ucs-2":
  22710. case "utf16le":
  22711. case "utf-16le":
  22712. return Chg(this, I, g);
  22713. default:
  22714. if (C) throw new TypeError("Unknown encoding: " + t);
  22715. t = (t + "").toLowerCase(), C = !0;
  22716. }
  22717. }
  22718. function Lo(t, I, g) {
  22719. var C = t[I];
  22720. t[I] = t[g], t[g] = C;
  22721. }
  22722. function N8(t, I, g, C, i) {
  22723. if (t.length === 0) return -1;
  22724. if (typeof g == "string" ? (C = g, g = 0) : g > 2147483647 ? g = 2147483647 : g < -2147483648 && (g = -2147483648), g = +g, isNaN(g) && (g = i ? 0 : t.length - 1), g < 0 && (g = t.length + g), g >= t.length) {
  22725. if (i) return -1;
  22726. g = t.length - 1;
  22727. } else if (g < 0) {
  22728. if (!i) return -1;
  22729. g = 0;
  22730. }
  22731. if (typeof I == "string" && (I = Hg.from(I, C)), Ss(I)) return I.length === 0 ? -1 : V8(t, I, g, C, i);
  22732. if (typeof I == "number") return I &= 255, Hg.TYPED_ARRAY_SUPPORT && typeof Uint8Array.prototype.indexOf == "function" ? i ? Uint8Array.prototype.indexOf.call(t, I, g) : Uint8Array.prototype.lastIndexOf.call(t, I, g) : V8(t, [I], g, C, i);
  22733. throw new TypeError("val must be string, number or Buffer");
  22734. }
  22735. function V8(t, I, g, C, i) {
  22736. var e, A = 1, s = t.length, l = I.length;
  22737. if (C !== void 0 && ((C = String(C).toLowerCase()) === "ucs2" || C === "ucs-2" || C === "utf16le" || C === "utf-16le")) {
  22738. if (t.length < 2 || I.length < 2) return -1;
  22739. A = 2, s /= 2, l /= 2, g /= 2;
  22740. }
  22741. function n(c, r) {
  22742. return A === 1 ? c[r] : c.readUInt16BE(r * A);
  22743. }
  22744. if (i) {
  22745. var a = -1;
  22746. for (e = g; e < s; e++) if (n(t, e) === n(I, a === -1 ? 0 : e - a)) {
  22747. if (a === -1 && (a = e), e - a + 1 === l) return a * A;
  22748. } else a !== -1 && (e -= e - a), a = -1;
  22749. } else for (g + l > s && (g = s - l), e = g; e >= 0; e--) {
  22750. for (var d = !0, o = 0; o < l; o++) if (n(t, e + o) !== n(I, o)) {
  22751. d = !1;
  22752. break;
  22753. }
  22754. if (d) return e;
  22755. }
  22756. return -1;
  22757. }
  22758. function Org(t, I, g, C) {
  22759. g = Number(g) || 0;
  22760. var i = t.length - g;
  22761. C ? (C = Number(C)) > i && (C = i) : C = i;
  22762. var e = I.length;
  22763. if (e % 2 != 0) throw new TypeError("Invalid hex string");
  22764. C > e / 2 && (C = e / 2);
  22765. for (var A = 0; A < C; ++A) {
  22766. var s = parseInt(I.substr(2 * A, 2), 16);
  22767. if (isNaN(s)) return A;
  22768. t[g + A] = s;
  22769. }
  22770. return A;
  22771. }
  22772. function Urg(t, I, g, C) {
  22773. return eM(dV(I, t.length - g), t, g, C);
  22774. }
  22775. function oCg(t, I, g, C) {
  22776. return eM(function(i) {
  22777. for (var e = [], A = 0; A < i.length; ++A) e.push(255 & i.charCodeAt(A));
  22778. return e;
  22779. }(I), t, g, C);
  22780. }
  22781. function Erg(t, I, g, C) {
  22782. return oCg(t, I, g, C);
  22783. }
  22784. function Prg(t, I, g, C) {
  22785. return eM(rCg(I), t, g, C);
  22786. }
  22787. function _rg(t, I, g, C) {
  22788. return eM(function(i, e) {
  22789. for (var A, s, l, n = [], a = 0; a < i.length && !((e -= 2) < 0); ++a) s = (A = i.charCodeAt(a)) >> 8, l = A % 256, n.push(l), n.push(s);
  22790. return n;
  22791. }(I, t.length - g), t, g, C);
  22792. }
  22793. function qrg(t, I, g) {
  22794. return I === 0 && g === t.length ? Y8(t) : Y8(t.slice(I, g));
  22795. }
  22796. function cCg(t, I, g) {
  22797. g = Math.min(t.length, g);
  22798. for (var C = [], i = I; i < g; ) {
  22799. var e, A, s, l, n = t[i], a = null, d = n > 239 ? 4 : n > 223 ? 3 : n > 191 ? 2 : 1;
  22800. if (i + d <= g) switch (d) {
  22801. case 1:
  22802. n < 128 && (a = n);
  22803. break;
  22804. case 2:
  22805. (192 & (e = t[i + 1])) == 128 && (l = (31 & n) << 6 | 63 & e) > 127 && (a = l);
  22806. break;
  22807. case 3:
  22808. e = t[i + 1], A = t[i + 2], (192 & e) == 128 && (192 & A) == 128 && (l = (15 & n) << 12 | (63 & e) << 6 | 63 & A) > 2047 && (l < 55296 || l > 57343) && (a = l);
  22809. break;
  22810. case 4:
  22811. e = t[i + 1], A = t[i + 2], s = t[i + 3], (192 & e) == 128 && (192 & A) == 128 && (192 & s) == 128 && (l = (15 & n) << 18 | (63 & e) << 12 | (63 & A) << 6 | 63 & s) > 65535 && l < 1114112 && (a = l);
  22812. }
  22813. a === null ? (a = 65533, d = 1) : a > 65535 && (a -= 65536, C.push(a >>> 10 & 1023 | 55296), a = 56320 | 1023 & a), C.push(a), i += d;
  22814. }
  22815. return function(o) {
  22816. var c = o.length;
  22817. if (c <= 4096) return String.fromCharCode.apply(String, o);
  22818. for (var r = "", h = 0; h < c; ) r += String.fromCharCode.apply(String, o.slice(h, h += 4096));
  22819. return r;
  22820. }(C);
  22821. }
  22822. Hg.poolSize = 8192, Hg._augment = function(t) {
  22823. return t.__proto__ = Hg.prototype, t;
  22824. }, Hg.from = function(t, I, g) {
  22825. return lCg(null, t, I, g);
  22826. }, Hg.TYPED_ARRAY_SUPPORT && (Hg.prototype.__proto__ = Uint8Array.prototype, Hg.__proto__ = Uint8Array, typeof Symbol < "u" && Symbol.species && Hg[Symbol.species]), Hg.alloc = function(t, I, g) {
  22827. return function(C, i, e, A) {
  22828. return nCg(i), i <= 0 ? Pl(C, i) : e !== void 0 ? typeof A == "string" ? Pl(C, i).fill(e, A) : Pl(C, i).fill(e) : Pl(C, i);
  22829. }(null, t, I, g);
  22830. }, Hg.allocUnsafe = function(t) {
  22831. return aD(null, t);
  22832. }, Hg.allocUnsafeSlow = function(t) {
  22833. return aD(null, t);
  22834. }, Hg.isBuffer = dG, Hg.compare = function(t, I) {
  22835. if (!Ss(t) || !Ss(I)) throw new TypeError("Arguments must be Buffers");
  22836. if (t === I) return 0;
  22837. for (var g = t.length, C = I.length, i = 0, e = Math.min(g, C); i < e; ++i) if (t[i] !== I[i]) {
  22838. g = t[i], C = I[i];
  22839. break;
  22840. }
  22841. return g < C ? -1 : C < g ? 1 : 0;
  22842. }, Hg.isEncoding = function(t) {
  22843. switch (String(t).toLowerCase()) {
  22844. case "hex":
  22845. case "utf8":
  22846. case "utf-8":
  22847. case "ascii":
  22848. case "latin1":
  22849. case "binary":
  22850. case "base64":
  22851. case "ucs2":
  22852. case "ucs-2":
  22853. case "utf16le":
  22854. case "utf-16le":
  22855. return !0;
  22856. default:
  22857. return !1;
  22858. }
  22859. }, Hg.concat = function(t, I) {
  22860. if (!sCg(t)) throw new TypeError('"list" argument must be an Array of Buffers');
  22861. if (t.length === 0) return Hg.alloc(0);
  22862. var g;
  22863. if (I === void 0) for (I = 0, g = 0; g < t.length; ++g) I += t[g].length;
  22864. var C = Hg.allocUnsafe(I), i = 0;
  22865. for (g = 0; g < t.length; ++g) {
  22866. var e = t[g];
  22867. if (!Ss(e)) throw new TypeError('"list" argument must be an Array of Buffers');
  22868. e.copy(C, i), i += e.length;
  22869. }
  22870. return C;
  22871. }, Hg.byteLength = aCg, Hg.prototype._isBuffer = !0, Hg.prototype.swap16 = function() {
  22872. var t = this.length;
  22873. if (t % 2 != 0) throw new RangeError("Buffer size must be a multiple of 16-bits");
  22874. for (var I = 0; I < t; I += 2) Lo(this, I, I + 1);
  22875. return this;
  22876. }, Hg.prototype.swap32 = function() {
  22877. var t = this.length;
  22878. if (t % 4 != 0) throw new RangeError("Buffer size must be a multiple of 32-bits");
  22879. for (var I = 0; I < t; I += 4) Lo(this, I, I + 3), Lo(this, I + 1, I + 2);
  22880. return this;
  22881. }, Hg.prototype.swap64 = function() {
  22882. var t = this.length;
  22883. if (t % 8 != 0) throw new RangeError("Buffer size must be a multiple of 64-bits");
  22884. for (var I = 0; I < t; I += 8) Lo(this, I, I + 7), Lo(this, I + 1, I + 6), Lo(this, I + 2, I + 5), Lo(this, I + 3, I + 4);
  22885. return this;
  22886. }, Hg.prototype.toString = function() {
  22887. var t = 0 | this.length;
  22888. return t === 0 ? "" : arguments.length === 0 ? cCg(this, 0, t) : Qrg.apply(this, arguments);
  22889. }, Hg.prototype.equals = function(t) {
  22890. if (!Ss(t)) throw new TypeError("Argument must be a Buffer");
  22891. return this === t || Hg.compare(this, t) === 0;
  22892. }, Hg.prototype.inspect = function() {
  22893. var t = "";
  22894. return this.length > 0 && (t = this.toString("hex", 0, 50).match(/.{2}/g).join(" "), this.length > 50 && (t += " ... ")), "<Buffer " + t + ">";
  22895. }, Hg.prototype.compare = function(t, I, g, C, i) {
  22896. if (!Ss(t)) throw new TypeError("Argument must be a Buffer");
  22897. if (I === void 0 && (I = 0), g === void 0 && (g = t ? t.length : 0), C === void 0 && (C = 0), i === void 0 && (i = this.length), I < 0 || g > t.length || C < 0 || i > this.length) throw new RangeError("out of range index");
  22898. if (C >= i && I >= g) return 0;
  22899. if (C >= i) return -1;
  22900. if (I >= g) return 1;
  22901. if (this === t) return 0;
  22902. for (var e = (i >>>= 0) - (C >>>= 0), A = (g >>>= 0) - (I >>>= 0), s = Math.min(e, A), l = this.slice(C, i), n = t.slice(I, g), a = 0; a < s; ++a) if (l[a] !== n[a]) {
  22903. e = l[a], A = n[a];
  22904. break;
  22905. }
  22906. return e < A ? -1 : A < e ? 1 : 0;
  22907. }, Hg.prototype.includes = function(t, I, g) {
  22908. return this.indexOf(t, I, g) !== -1;
  22909. }, Hg.prototype.indexOf = function(t, I, g) {
  22910. return N8(this, t, I, g, !0);
  22911. }, Hg.prototype.lastIndexOf = function(t, I, g) {
  22912. return N8(this, t, I, g, !1);
  22913. }, Hg.prototype.write = function(t, I, g, C) {
  22914. if (I === void 0) C = "utf8", g = this.length, I = 0;
  22915. else if (g === void 0 && typeof I == "string") C = I, g = this.length, I = 0;
  22916. else {
  22917. if (!isFinite(I)) throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");
  22918. I |= 0, isFinite(g) ? (g |= 0, C === void 0 && (C = "utf8")) : (C = g, g = void 0);
  22919. }
  22920. var i = this.length - I;
  22921. if ((g === void 0 || g > i) && (g = i), t.length > 0 && (g < 0 || I < 0) || I > this.length) throw new RangeError("Attempt to write outside buffer bounds");
  22922. C || (C = "utf8");
  22923. for (var e = !1; ; ) switch (C) {
  22924. case "hex":
  22925. return Org(this, t, I, g);
  22926. case "utf8":
  22927. case "utf-8":
  22928. return Urg(this, t, I, g);
  22929. case "ascii":
  22930. return oCg(this, t, I, g);
  22931. case "latin1":
  22932. case "binary":
  22933. return Erg(this, t, I, g);
  22934. case "base64":
  22935. return Prg(this, t, I, g);
  22936. case "ucs2":
  22937. case "ucs-2":
  22938. case "utf16le":
  22939. case "utf-16le":
  22940. return _rg(this, t, I, g);
  22941. default:
  22942. if (e) throw new TypeError("Unknown encoding: " + C);
  22943. C = ("" + C).toLowerCase(), e = !0;
  22944. }
  22945. }, Hg.prototype.toJSON = function() {
  22946. return { type: "Buffer", data: Array.prototype.slice.call(this._arr || this, 0) };
  22947. };
  22948. function $rg(t, I, g) {
  22949. var C = "";
  22950. g = Math.min(t.length, g);
  22951. for (var i = I; i < g; ++i) C += String.fromCharCode(127 & t[i]);
  22952. return C;
  22953. }
  22954. function ghg(t, I, g) {
  22955. var C = "";
  22956. g = Math.min(t.length, g);
  22957. for (var i = I; i < g; ++i) C += String.fromCharCode(t[i]);
  22958. return C;
  22959. }
  22960. function Ihg(t, I, g) {
  22961. var C = t.length;
  22962. (!I || I < 0) && (I = 0), (!g || g < 0 || g > C) && (g = C);
  22963. for (var i = "", e = I; e < g; ++e) i += ihg(t[e]);
  22964. return i;
  22965. }
  22966. function Chg(t, I, g) {
  22967. for (var C = t.slice(I, g), i = "", e = 0; e < C.length; e += 2) i += String.fromCharCode(C[e] + 256 * C[e + 1]);
  22968. return i;
  22969. }
  22970. function Xt(t, I, g) {
  22971. if (t % 1 != 0 || t < 0) throw new RangeError("offset is not uint");
  22972. if (t + I > g) throw new RangeError("Trying to access beyond buffer length");
  22973. }
  22974. function Ji(t, I, g, C, i, e) {
  22975. if (!Ss(t)) throw new TypeError('"buffer" argument must be a Buffer instance');
  22976. if (I > i || I < e) throw new RangeError('"value" argument is out of bounds');
  22977. if (g + C > t.length) throw new RangeError("Index out of range");
  22978. }
  22979. function OY(t, I, g, C) {
  22980. I < 0 && (I = 65535 + I + 1);
  22981. for (var i = 0, e = Math.min(t.length - g, 2); i < e; ++i) t[g + i] = (I & 255 << 8 * (C ? i : 1 - i)) >>> 8 * (C ? i : 1 - i);
  22982. }
  22983. function UY(t, I, g, C) {
  22984. I < 0 && (I = 4294967295 + I + 1);
  22985. for (var i = 0, e = Math.min(t.length - g, 4); i < e; ++i) t[g + i] = I >>> 8 * (C ? i : 3 - i) & 255;
  22986. }
  22987. function dCg(t, I, g, C, i, e) {
  22988. if (g + C > t.length) throw new RangeError("Index out of range");
  22989. if (g < 0) throw new RangeError("Index out of range");
  22990. }
  22991. function M8(t, I, g, C, i) {
  22992. return i || dCg(t, 0, g, 4), ACg(t, I, g, C, 23, 4), g + 4;
  22993. }
  22994. function R8(t, I, g, C, i) {
  22995. return i || dCg(t, 0, g, 8), ACg(t, I, g, C, 52, 8), g + 8;
  22996. }
  22997. Hg.prototype.slice = function(t, I) {
  22998. var g, C = this.length;
  22999. if ((t = ~~t) < 0 ? (t += C) < 0 && (t = 0) : t > C && (t = C), (I = I === void 0 ? C : ~~I) < 0 ? (I += C) < 0 && (I = 0) : I > C && (I = C), I < t && (I = t), Hg.TYPED_ARRAY_SUPPORT) (g = this.subarray(t, I)).__proto__ = Hg.prototype;
  23000. else {
  23001. var i = I - t;
  23002. g = new Hg(i, void 0);
  23003. for (var e = 0; e < i; ++e) g[e] = this[e + t];
  23004. }
  23005. return g;
  23006. }, Hg.prototype.readUIntLE = function(t, I, g) {
  23007. t |= 0, I |= 0, g || Xt(t, I, this.length);
  23008. for (var C = this[t], i = 1, e = 0; ++e < I && (i *= 256); ) C += this[t + e] * i;
  23009. return C;
  23010. }, Hg.prototype.readUIntBE = function(t, I, g) {
  23011. t |= 0, I |= 0, g || Xt(t, I, this.length);
  23012. for (var C = this[t + --I], i = 1; I > 0 && (i *= 256); ) C += this[t + --I] * i;
  23013. return C;
  23014. }, Hg.prototype.readUInt8 = function(t, I) {
  23015. return I || Xt(t, 1, this.length), this[t];
  23016. }, Hg.prototype.readUInt16LE = function(t, I) {
  23017. return I || Xt(t, 2, this.length), this[t] | this[t + 1] << 8;
  23018. }, Hg.prototype.readUInt16BE = function(t, I) {
  23019. return I || Xt(t, 2, this.length), this[t] << 8 | this[t + 1];
  23020. }, Hg.prototype.readUInt32LE = function(t, I) {
  23021. return I || Xt(t, 4, this.length), (this[t] | this[t + 1] << 8 | this[t + 2] << 16) + 16777216 * this[t + 3];
  23022. }, Hg.prototype.readUInt32BE = function(t, I) {
  23023. return I || Xt(t, 4, this.length), 16777216 * this[t] + (this[t + 1] << 16 | this[t + 2] << 8 | this[t + 3]);
  23024. }, Hg.prototype.readIntLE = function(t, I, g) {
  23025. t |= 0, I |= 0, g || Xt(t, I, this.length);
  23026. for (var C = this[t], i = 1, e = 0; ++e < I && (i *= 256); ) C += this[t + e] * i;
  23027. return C >= (i *= 128) && (C -= Math.pow(2, 8 * I)), C;
  23028. }, Hg.prototype.readIntBE = function(t, I, g) {
  23029. t |= 0, I |= 0, g || Xt(t, I, this.length);
  23030. for (var C = I, i = 1, e = this[t + --C]; C > 0 && (i *= 256); ) e += this[t + --C] * i;
  23031. return e >= (i *= 128) && (e -= Math.pow(2, 8 * I)), e;
  23032. }, Hg.prototype.readInt8 = function(t, I) {
  23033. return I || Xt(t, 1, this.length), 128 & this[t] ? -1 * (255 - this[t] + 1) : this[t];
  23034. }, Hg.prototype.readInt16LE = function(t, I) {
  23035. I || Xt(t, 2, this.length);
  23036. var g = this[t] | this[t + 1] << 8;
  23037. return 32768 & g ? 4294901760 | g : g;
  23038. }, Hg.prototype.readInt16BE = function(t, I) {
  23039. I || Xt(t, 2, this.length);
  23040. var g = this[t + 1] | this[t] << 8;
  23041. return 32768 & g ? 4294901760 | g : g;
  23042. }, Hg.prototype.readInt32LE = function(t, I) {
  23043. return I || Xt(t, 4, this.length), this[t] | this[t + 1] << 8 | this[t + 2] << 16 | this[t + 3] << 24;
  23044. }, Hg.prototype.readInt32BE = function(t, I) {
  23045. return I || Xt(t, 4, this.length), this[t] << 24 | this[t + 1] << 16 | this[t + 2] << 8 | this[t + 3];
  23046. }, Hg.prototype.readFloatLE = function(t, I) {
  23047. return I || Xt(t, 4, this.length), QY(this, t, !0, 23, 4);
  23048. }, Hg.prototype.readFloatBE = function(t, I) {
  23049. return I || Xt(t, 4, this.length), QY(this, t, !1, 23, 4);
  23050. }, Hg.prototype.readDoubleLE = function(t, I) {
  23051. return I || Xt(t, 8, this.length), QY(this, t, !0, 52, 8);
  23052. }, Hg.prototype.readDoubleBE = function(t, I) {
  23053. return I || Xt(t, 8, this.length), QY(this, t, !1, 52, 8);
  23054. }, Hg.prototype.writeUIntLE = function(t, I, g, C) {
  23055. t = +t, I |= 0, g |= 0, C || Ji(this, t, I, g, Math.pow(2, 8 * g) - 1, 0);
  23056. var i = 1, e = 0;
  23057. for (this[I] = 255 & t; ++e < g && (i *= 256); ) this[I + e] = t / i & 255;
  23058. return I + g;
  23059. }, Hg.prototype.writeUIntBE = function(t, I, g, C) {
  23060. t = +t, I |= 0, g |= 0, C || Ji(this, t, I, g, Math.pow(2, 8 * g) - 1, 0);
  23061. var i = g - 1, e = 1;
  23062. for (this[I + i] = 255 & t; --i >= 0 && (e *= 256); ) this[I + i] = t / e & 255;
  23063. return I + g;
  23064. }, Hg.prototype.writeUInt8 = function(t, I, g) {
  23065. return t = +t, I |= 0, g || Ji(this, t, I, 1, 255, 0), Hg.TYPED_ARRAY_SUPPORT || (t = Math.floor(t)), this[I] = 255 & t, I + 1;
  23066. }, Hg.prototype.writeUInt16LE = function(t, I, g) {
  23067. return t = +t, I |= 0, g || Ji(this, t, I, 2, 65535, 0), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = 255 & t, this[I + 1] = t >>> 8) : OY(this, t, I, !0), I + 2;
  23068. }, Hg.prototype.writeUInt16BE = function(t, I, g) {
  23069. return t = +t, I |= 0, g || Ji(this, t, I, 2, 65535, 0), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = t >>> 8, this[I + 1] = 255 & t) : OY(this, t, I, !1), I + 2;
  23070. }, Hg.prototype.writeUInt32LE = function(t, I, g) {
  23071. return t = +t, I |= 0, g || Ji(this, t, I, 4, 4294967295, 0), Hg.TYPED_ARRAY_SUPPORT ? (this[I + 3] = t >>> 24, this[I + 2] = t >>> 16, this[I + 1] = t >>> 8, this[I] = 255 & t) : UY(this, t, I, !0), I + 4;
  23072. }, Hg.prototype.writeUInt32BE = function(t, I, g) {
  23073. return t = +t, I |= 0, g || Ji(this, t, I, 4, 4294967295, 0), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = t >>> 24, this[I + 1] = t >>> 16, this[I + 2] = t >>> 8, this[I + 3] = 255 & t) : UY(this, t, I, !1), I + 4;
  23074. }, Hg.prototype.writeIntLE = function(t, I, g, C) {
  23075. if (t = +t, I |= 0, !C) {
  23076. var i = Math.pow(2, 8 * g - 1);
  23077. Ji(this, t, I, g, i - 1, -i);
  23078. }
  23079. var e = 0, A = 1, s = 0;
  23080. for (this[I] = 255 & t; ++e < g && (A *= 256); ) t < 0 && s === 0 && this[I + e - 1] !== 0 && (s = 1), this[I + e] = (t / A >> 0) - s & 255;
  23081. return I + g;
  23082. }, Hg.prototype.writeIntBE = function(t, I, g, C) {
  23083. if (t = +t, I |= 0, !C) {
  23084. var i = Math.pow(2, 8 * g - 1);
  23085. Ji(this, t, I, g, i - 1, -i);
  23086. }
  23087. var e = g - 1, A = 1, s = 0;
  23088. for (this[I + e] = 255 & t; --e >= 0 && (A *= 256); ) t < 0 && s === 0 && this[I + e + 1] !== 0 && (s = 1), this[I + e] = (t / A >> 0) - s & 255;
  23089. return I + g;
  23090. }, Hg.prototype.writeInt8 = function(t, I, g) {
  23091. return t = +t, I |= 0, g || Ji(this, t, I, 1, 127, -128), Hg.TYPED_ARRAY_SUPPORT || (t = Math.floor(t)), t < 0 && (t = 255 + t + 1), this[I] = 255 & t, I + 1;
  23092. }, Hg.prototype.writeInt16LE = function(t, I, g) {
  23093. return t = +t, I |= 0, g || Ji(this, t, I, 2, 32767, -32768), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = 255 & t, this[I + 1] = t >>> 8) : OY(this, t, I, !0), I + 2;
  23094. }, Hg.prototype.writeInt16BE = function(t, I, g) {
  23095. return t = +t, I |= 0, g || Ji(this, t, I, 2, 32767, -32768), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = t >>> 8, this[I + 1] = 255 & t) : OY(this, t, I, !1), I + 2;
  23096. }, Hg.prototype.writeInt32LE = function(t, I, g) {
  23097. return t = +t, I |= 0, g || Ji(this, t, I, 4, 2147483647, -2147483648), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = 255 & t, this[I + 1] = t >>> 8, this[I + 2] = t >>> 16, this[I + 3] = t >>> 24) : UY(this, t, I, !0), I + 4;
  23098. }, Hg.prototype.writeInt32BE = function(t, I, g) {
  23099. return t = +t, I |= 0, g || Ji(this, t, I, 4, 2147483647, -2147483648), t < 0 && (t = 4294967295 + t + 1), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = t >>> 24, this[I + 1] = t >>> 16, this[I + 2] = t >>> 8, this[I + 3] = 255 & t) : UY(this, t, I, !1), I + 4;
  23100. }, Hg.prototype.writeFloatLE = function(t, I, g) {
  23101. return M8(this, t, I, !0, g);
  23102. }, Hg.prototype.writeFloatBE = function(t, I, g) {
  23103. return M8(this, t, I, !1, g);
  23104. }, Hg.prototype.writeDoubleLE = function(t, I, g) {
  23105. return R8(this, t, I, !0, g);
  23106. }, Hg.prototype.writeDoubleBE = function(t, I, g) {
  23107. return R8(this, t, I, !1, g);
  23108. }, Hg.prototype.copy = function(t, I, g, C) {
  23109. if (g || (g = 0), C || C === 0 || (C = this.length), I >= t.length && (I = t.length), I || (I = 0), C > 0 && C < g && (C = g), C === g || t.length === 0 || this.length === 0) return 0;
  23110. if (I < 0) throw new RangeError("targetStart out of bounds");
  23111. if (g < 0 || g >= this.length) throw new RangeError("sourceStart out of bounds");
  23112. if (C < 0) throw new RangeError("sourceEnd out of bounds");
  23113. C > this.length && (C = this.length), t.length - I < C - g && (C = t.length - I + g);
  23114. var i, e = C - g;
  23115. if (this === t && g < I && I < C) for (i = e - 1; i >= 0; --i) t[i + I] = this[i + g];
  23116. else if (e < 1e3 || !Hg.TYPED_ARRAY_SUPPORT) for (i = 0; i < e; ++i) t[i + I] = this[i + g];
  23117. else Uint8Array.prototype.set.call(t, this.subarray(g, g + e), I);
  23118. return e;
  23119. }, Hg.prototype.fill = function(t, I, g, C) {
  23120. if (typeof t == "string") {
  23121. if (typeof I == "string" ? (C = I, I = 0, g = this.length) : typeof g == "string" && (C = g, g = this.length), t.length === 1) {
  23122. var i = t.charCodeAt(0);
  23123. i < 256 && (t = i);
  23124. }
  23125. if (C !== void 0 && typeof C != "string") throw new TypeError("encoding must be a string");
  23126. if (typeof C == "string" && !Hg.isEncoding(C)) throw new TypeError("Unknown encoding: " + C);
  23127. } else typeof t == "number" && (t &= 255);
  23128. if (I < 0 || this.length < I || this.length < g) throw new RangeError("Out of range index");
  23129. if (g <= I) return this;
  23130. var e;
  23131. if (I >>>= 0, g = g === void 0 ? this.length : g >>> 0, t || (t = 0), typeof t == "number") for (e = I; e < g; ++e) this[e] = t;
  23132. else {
  23133. var A = Ss(t) ? t : dV(new Hg(t, C).toString()), s = A.length;
  23134. for (e = 0; e < g - I; ++e) this[e + I] = A[e % s];
  23135. }
  23136. return this;
  23137. };
  23138. var thg = /[^+\/0-9A-Za-z-_]/g;
  23139. function ihg(t) {
  23140. return t < 16 ? "0" + t.toString(16) : t.toString(16);
  23141. }
  23142. function dV(t, I) {
  23143. var g;
  23144. I = I || 1 / 0;
  23145. for (var C = t.length, i = null, e = [], A = 0; A < C; ++A) {
  23146. if ((g = t.charCodeAt(A)) > 55295 && g < 57344) {
  23147. if (!i) {
  23148. if (g > 56319) {
  23149. (I -= 3) > -1 && e.push(239, 191, 189);
  23150. continue;
  23151. }
  23152. if (A + 1 === C) {
  23153. (I -= 3) > -1 && e.push(239, 191, 189);
  23154. continue;
  23155. }
  23156. i = g;
  23157. continue;
  23158. }
  23159. if (g < 56320) {
  23160. (I -= 3) > -1 && e.push(239, 191, 189), i = g;
  23161. continue;
  23162. }
  23163. g = 65536 + (i - 55296 << 10 | g - 56320);
  23164. } else i && (I -= 3) > -1 && e.push(239, 191, 189);
  23165. if (i = null, g < 128) {
  23166. if ((I -= 1) < 0) break;
  23167. e.push(g);
  23168. } else if (g < 2048) {
  23169. if ((I -= 2) < 0) break;
  23170. e.push(g >> 6 | 192, 63 & g | 128);
  23171. } else if (g < 65536) {
  23172. if ((I -= 3) < 0) break;
  23173. e.push(g >> 12 | 224, g >> 6 & 63 | 128, 63 & g | 128);
  23174. } else {
  23175. if (!(g < 1114112)) throw new Error("Invalid code point");
  23176. if ((I -= 4) < 0) break;
  23177. e.push(g >> 18 | 240, g >> 12 & 63 | 128, g >> 6 & 63 | 128, 63 & g | 128);
  23178. }
  23179. }
  23180. return e;
  23181. }
  23182. function rCg(t) {
  23183. return function(I) {
  23184. var g, C, i, e, A, s;
  23185. H9 || eCg();
  23186. var l = I.length;
  23187. if (l % 4 > 0) throw new Error("Invalid string. Length must be a multiple of 4");
  23188. A = I[l - 2] === "=" ? 2 : I[l - 1] === "=" ? 1 : 0, s = new vrg(3 * l / 4 - A), i = A > 0 ? l - 4 : l;
  23189. var n = 0;
  23190. for (g = 0, C = 0; g < i; g += 4, C += 3) e = xe[I.charCodeAt(g)] << 18 | xe[I.charCodeAt(g + 1)] << 12 | xe[I.charCodeAt(g + 2)] << 6 | xe[I.charCodeAt(g + 3)], s[n++] = e >> 16 & 255, s[n++] = e >> 8 & 255, s[n++] = 255 & e;
  23191. return A === 2 ? (e = xe[I.charCodeAt(g)] << 2 | xe[I.charCodeAt(g + 1)] >> 4, s[n++] = 255 & e) : A === 1 && (e = xe[I.charCodeAt(g)] << 10 | xe[I.charCodeAt(g + 1)] << 4 | xe[I.charCodeAt(g + 2)] >> 2, s[n++] = e >> 8 & 255, s[n++] = 255 & e), s;
  23192. }(function(I) {
  23193. if ((I = function(g) {
  23194. return g.trim ? g.trim() : g.replace(/^\s+|\s+$/g, "");
  23195. }(I).replace(thg, "")).length < 2) return "";
  23196. for (; I.length % 4 != 0; ) I += "=";
  23197. return I;
  23198. }(t));
  23199. }
  23200. function eM(t, I, g, C) {
  23201. for (var i = 0; i < C && !(i + g >= I.length || i >= t.length); ++i) I[i + g] = t[i];
  23202. return i;
  23203. }
  23204. function dG(t) {
  23205. return t != null && (!!t._isBuffer || f8(t) || function(I) {
  23206. return typeof I.readFloatLE == "function" && typeof I.slice == "function" && f8(I.slice(0, 0));
  23207. }(t));
  23208. }
  23209. function f8(t) {
  23210. return !!t.constructor && typeof t.constructor.isBuffer == "function" && t.constructor.isBuffer(t);
  23211. }
  23212. var ehg = Object.freeze({ __proto__: null, INSPECT_MAX_BYTES: 50, kMaxLength: jrg, Buffer: Hg, SlowBuffer: function(t) {
  23213. return +t != t && (t = 0), Hg.alloc(+t);
  23214. }, isBuffer: dG }), rt = {};
  23215. function hCg() {
  23216. throw new Error("setTimeout has not been defined");
  23217. }
  23218. function bCg() {
  23219. throw new Error("clearTimeout has not been defined");
  23220. }
  23221. var ga = hCg, Ia = bCg;
  23222. function uCg(t) {
  23223. if (ga === setTimeout) return setTimeout(t, 0);
  23224. if ((ga === hCg || !ga) && setTimeout) return ga = setTimeout, setTimeout(t, 0);
  23225. try {
  23226. return ga(t, 0);
  23227. } catch {
  23228. try {
  23229. return ga.call(null, t, 0);
  23230. } catch {
  23231. return ga.call(this, t, 0);
  23232. }
  23233. }
  23234. }
  23235. typeof W0.setTimeout == "function" && (ga = setTimeout), typeof W0.clearTimeout == "function" && (Ia = clearTimeout);
  23236. var $o, _l = [], rh = !1, TN = -1;
  23237. function Ahg() {
  23238. rh && $o && (rh = !1, $o.length ? _l = $o.concat(_l) : TN = -1, _l.length && mCg());
  23239. }
  23240. function mCg() {
  23241. if (!rh) {
  23242. var t = uCg(Ahg);
  23243. rh = !0;
  23244. for (var I = _l.length; I; ) {
  23245. for ($o = _l, _l = []; ++TN < I; ) $o && $o[TN].run();
  23246. TN = -1, I = _l.length;
  23247. }
  23248. $o = null, rh = !1, function(g) {
  23249. if (Ia === clearTimeout) return clearTimeout(g);
  23250. if ((Ia === bCg || !Ia) && clearTimeout) return Ia = clearTimeout, clearTimeout(g);
  23251. try {
  23252. Ia(g);
  23253. } catch {
  23254. try {
  23255. return Ia.call(null, g);
  23256. } catch {
  23257. return Ia.call(this, g);
  23258. }
  23259. }
  23260. }(t);
  23261. }
  23262. }
  23263. function vt(t) {
  23264. var I = new Array(arguments.length - 1);
  23265. if (arguments.length > 1) for (var g = 1; g < arguments.length; g++) I[g - 1] = arguments[g];
  23266. _l.push(new ZCg(t, I)), _l.length !== 1 || rh || uCg(mCg);
  23267. }
  23268. function ZCg(t, I) {
  23269. this.fun = t, this.array = I;
  23270. }
  23271. ZCg.prototype.run = function() {
  23272. this.fun.apply(null, this.array);
  23273. };
  23274. var Fu = W0.performance || {};
  23275. Fu.now || Fu.mozNow || Fu.msNow || Fu.oNow || Fu.webkitNow;
  23276. var ld = { env: {} }, _H = { exports: {} };
  23277. function Ca() {
  23278. }
  23279. function qI() {
  23280. qI.init.call(this);
  23281. }
  23282. function GCg(t) {
  23283. return t._maxListeners === void 0 ? qI.defaultMaxListeners : t._maxListeners;
  23284. }
  23285. function shg(t, I, g) {
  23286. if (I) t.call(g);
  23287. else for (var C = t.length, i = rG(t, C), e = 0; e < C; ++e) i[e].call(g);
  23288. }
  23289. function lhg(t, I, g, C) {
  23290. if (I) t.call(g, C);
  23291. else for (var i = t.length, e = rG(t, i), A = 0; A < i; ++A) e[A].call(g, C);
  23292. }
  23293. function nhg(t, I, g, C, i) {
  23294. if (I) t.call(g, C, i);
  23295. else for (var e = t.length, A = rG(t, e), s = 0; s < e; ++s) A[s].call(g, C, i);
  23296. }
  23297. function ahg(t, I, g, C, i, e) {
  23298. if (I) t.call(g, C, i, e);
  23299. else for (var A = t.length, s = rG(t, A), l = 0; l < A; ++l) s[l].call(g, C, i, e);
  23300. }
  23301. function ohg(t, I, g, C) {
  23302. if (I) t.apply(g, C);
  23303. else for (var i = t.length, e = rG(t, i), A = 0; A < i; ++A) e[A].apply(g, C);
  23304. }
  23305. function H8(t, I, g, C) {
  23306. var i, e, A, s;
  23307. if (typeof g != "function") throw new TypeError('"listener" argument must be a function');
  23308. if ((e = t._events) ? (e.newListener && (t.emit("newListener", I, g.listener ? g.listener : g), e = t._events), A = e[I]) : (e = t._events = new Ca(), t._eventsCount = 0), A) {
  23309. if (typeof A == "function" ? A = e[I] = C ? [g, A] : [A, g] : C ? A.unshift(g) : A.push(g), !A.warned && (i = GCg(t)) && i > 0 && A.length > i) {
  23310. A.warned = !0;
  23311. var l = new Error("Possible EventEmitter memory leak detected. " + A.length + " " + I + " listeners added. Use emitter.setMaxListeners() to increase limit");
  23312. l.name = "MaxListenersExceededWarning", l.emitter = t, l.type = I, l.count = A.length, s = l, typeof console.warn == "function" ? console.warn(s) : console.log(s);
  23313. }
  23314. } else A = e[I] = g, ++t._eventsCount;
  23315. return t;
  23316. }
  23317. function X8(t, I, g) {
  23318. var C = !1;
  23319. function i() {
  23320. t.removeListener(I, i), C || (C = !0, g.apply(t, arguments));
  23321. }
  23322. return i.listener = g, i;
  23323. }
  23324. function S8(t) {
  23325. var I = this._events;
  23326. if (I) {
  23327. var g = I[t];
  23328. if (typeof g == "function") return 1;
  23329. if (g) return g.length;
  23330. }
  23331. return 0;
  23332. }
  23333. function rG(t, I) {
  23334. for (var g = new Array(I); I--; ) g[I] = t[I];
  23335. return g;
  23336. }
  23337. Ca.prototype = /* @__PURE__ */ Object.create(null), qI.EventEmitter = qI, qI.usingDomains = !1, qI.prototype.domain = void 0, qI.prototype._events = void 0, qI.prototype._maxListeners = void 0, qI.defaultMaxListeners = 10, qI.init = function() {
  23338. this.domain = null, qI.usingDomains && (void 0).active, this._events && this._events !== Object.getPrototypeOf(this)._events || (this._events = new Ca(), this._eventsCount = 0), this._maxListeners = this._maxListeners || void 0;
  23339. }, qI.prototype.setMaxListeners = function(t) {
  23340. if (typeof t != "number" || t < 0 || isNaN(t)) throw new TypeError('"n" argument must be a positive number');
  23341. return this._maxListeners = t, this;
  23342. }, qI.prototype.getMaxListeners = function() {
  23343. return GCg(this);
  23344. }, qI.prototype.emit = function(t) {
  23345. var I, g, C, i, e, A, s, l = t === "error";
  23346. if (A = this._events) l = l && A.error == null;
  23347. else if (!l) return !1;
  23348. if (s = this.domain, l) {
  23349. if (I = arguments[1], !s) {
  23350. if (I instanceof Error) throw I;
  23351. var n = new Error('Uncaught, unspecified "error" event. (' + I + ")");
  23352. throw n.context = I, n;
  23353. }
  23354. return I || (I = new Error('Uncaught, unspecified "error" event')), I.domainEmitter = this, I.domain = s, I.domainThrown = !1, s.emit("error", I), !1;
  23355. }
  23356. if (!(g = A[t])) return !1;
  23357. var a = typeof g == "function";
  23358. switch (C = arguments.length) {
  23359. case 1:
  23360. shg(g, a, this);
  23361. break;
  23362. case 2:
  23363. lhg(g, a, this, arguments[1]);
  23364. break;
  23365. case 3:
  23366. nhg(g, a, this, arguments[1], arguments[2]);
  23367. break;
  23368. case 4:
  23369. ahg(g, a, this, arguments[1], arguments[2], arguments[3]);
  23370. break;
  23371. default:
  23372. for (i = new Array(C - 1), e = 1; e < C; e++) i[e - 1] = arguments[e];
  23373. ohg(g, a, this, i);
  23374. }
  23375. return !0;
  23376. }, qI.prototype.addListener = function(t, I) {
  23377. return H8(this, t, I, !1);
  23378. }, qI.prototype.on = qI.prototype.addListener, qI.prototype.prependListener = function(t, I) {
  23379. return H8(this, t, I, !0);
  23380. }, qI.prototype.once = function(t, I) {
  23381. if (typeof I != "function") throw new TypeError('"listener" argument must be a function');
  23382. return this.on(t, X8(this, t, I)), this;
  23383. }, qI.prototype.prependOnceListener = function(t, I) {
  23384. if (typeof I != "function") throw new TypeError('"listener" argument must be a function');
  23385. return this.prependListener(t, X8(this, t, I)), this;
  23386. }, qI.prototype.removeListener = function(t, I) {
  23387. var g, C, i, e, A;
  23388. if (typeof I != "function") throw new TypeError('"listener" argument must be a function');
  23389. if (!(C = this._events)) return this;
  23390. if (!(g = C[t])) return this;
  23391. if (g === I || g.listener && g.listener === I) --this._eventsCount == 0 ? this._events = new Ca() : (delete C[t], C.removeListener && this.emit("removeListener", t, g.listener || I));
  23392. else if (typeof g != "function") {
  23393. for (i = -1, e = g.length; e-- > 0; ) if (g[e] === I || g[e].listener && g[e].listener === I) {
  23394. A = g[e].listener, i = e;
  23395. break;
  23396. }
  23397. if (i < 0) return this;
  23398. if (g.length === 1) {
  23399. if (g[0] = void 0, --this._eventsCount == 0) return this._events = new Ca(), this;
  23400. delete C[t];
  23401. } else (function(s, l) {
  23402. for (var n = l, a = n + 1, d = s.length; a < d; n += 1, a += 1) s[n] = s[a];
  23403. s.pop();
  23404. })(g, i);
  23405. C.removeListener && this.emit("removeListener", t, A || I);
  23406. }
  23407. return this;
  23408. }, qI.prototype.removeAllListeners = function(t) {
  23409. var I, g;
  23410. if (!(g = this._events)) return this;
  23411. if (!g.removeListener) return arguments.length === 0 ? (this._events = new Ca(), this._eventsCount = 0) : g[t] && (--this._eventsCount == 0 ? this._events = new Ca() : delete g[t]), this;
  23412. if (arguments.length === 0) {
  23413. for (var C, i = Object.keys(g), e = 0; e < i.length; ++e) (C = i[e]) !== "removeListener" && this.removeAllListeners(C);
  23414. return this.removeAllListeners("removeListener"), this._events = new Ca(), this._eventsCount = 0, this;
  23415. }
  23416. if (typeof (I = g[t]) == "function") this.removeListener(t, I);
  23417. else if (I) do
  23418. this.removeListener(t, I[I.length - 1]);
  23419. while (I[0]);
  23420. return this;
  23421. }, qI.prototype.listeners = function(t) {
  23422. var I, g, C = this._events;
  23423. return g = C && (I = C[t]) ? typeof I == "function" ? [I.listener || I] : function(i) {
  23424. for (var e = new Array(i.length), A = 0; A < e.length; ++A) e[A] = i[A].listener || i[A];
  23425. return e;
  23426. }(I) : [], g;
  23427. }, qI.listenerCount = function(t, I) {
  23428. return typeof t.listenerCount == "function" ? t.listenerCount(I) : S8.call(t, I);
  23429. }, qI.prototype.listenerCount = S8, qI.prototype.eventNames = function() {
  23430. return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];
  23431. };
  23432. var chg = Object.freeze({ __proto__: null, default: qI, EventEmitter: qI }), Oa = typeof Object.create == "function" ? function(t, I) {
  23433. t.super_ = I, t.prototype = Object.create(I.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } });
  23434. } : function(t, I) {
  23435. t.super_ = I;
  23436. var g = function() {
  23437. };
  23438. g.prototype = I.prototype, t.prototype = new g(), t.prototype.constructor = t;
  23439. }, dhg = /%[sdj%]/g;
  23440. function AM(t) {
  23441. if (!fm(t)) {
  23442. for (var I = [], g = 0; g < arguments.length; g++) I.push(ks(arguments[g]));
  23443. return I.join(" ");
  23444. }
  23445. g = 1;
  23446. for (var C = arguments, i = C.length, e = String(t).replace(dhg, function(s) {
  23447. if (s === "%%") return "%";
  23448. if (g >= i) return s;
  23449. switch (s) {
  23450. case "%s":
  23451. return String(C[g++]);
  23452. case "%d":
  23453. return Number(C[g++]);
  23454. case "%j":
  23455. try {
  23456. return JSON.stringify(C[g++]);
  23457. } catch {
  23458. return "[Circular]";
  23459. }
  23460. default:
  23461. return s;
  23462. }
  23463. }), A = C[g]; g < i; A = C[++g]) hG(A) || !Zd(A) ? e += " " + A : e += " " + ks(A);
  23464. return e;
  23465. }
  23466. function sM(t, I) {
  23467. if (Ks(W0.process)) return function() {
  23468. return sM(t, I).apply(this, arguments);
  23469. };
  23470. if (ld.noDeprecation === !0) return t;
  23471. var g = !1;
  23472. return function() {
  23473. if (!g) {
  23474. if (ld.throwDeprecation) throw new Error(I);
  23475. ld.traceDeprecation ? console.trace(I) : console.error(I), g = !0;
  23476. }
  23477. return t.apply(this, arguments);
  23478. };
  23479. }
  23480. var qH, EY = {};
  23481. function S9(t) {
  23482. return Ks(qH) && (qH = ld.env.NODE_DEBUG || ""), t = t.toUpperCase(), !EY[t] && (new RegExp("\\b" + t + "\\b", "i").test(qH) ? EY[t] = function() {
  23483. var I = AM.apply(null, arguments);
  23484. console.error("%s %d: %s", t, 0, I);
  23485. } : EY[t] = function() {
  23486. }), EY[t];
  23487. }
  23488. function ks(t, I) {
  23489. var g = { seen: [], stylize: hhg };
  23490. return arguments.length >= 3 && (g.depth = arguments[2]), arguments.length >= 4 && (g.colors = arguments[3]), lM(I) ? g.showHidden = I : I && k9(g, I), Ks(g.showHidden) && (g.showHidden = !1), Ks(g.depth) && (g.depth = 2), Ks(g.colors) && (g.colors = !1), Ks(g.customInspect) && (g.customInspect = !0), g.colors && (g.stylize = rhg), rV(g, t, g.depth);
  23491. }
  23492. function rhg(t, I) {
  23493. var g = ks.styles[I];
  23494. return g ? "\x1B[" + ks.colors[g][0] + "m" + t + "\x1B[" + ks.colors[g][1] + "m" : t;
  23495. }
  23496. function hhg(t, I) {
  23497. return t;
  23498. }
  23499. function rV(t, I, g) {
  23500. if (t.customInspect && I && Bm(I.inspect) && I.inspect !== ks && (!I.constructor || I.constructor.prototype !== I)) {
  23501. var C = I.inspect(g, t);
  23502. return fm(C) || (C = rV(t, C, g)), C;
  23503. }
  23504. var i = function(o, c) {
  23505. if (Ks(c)) return o.stylize("undefined", "undefined");
  23506. if (fm(c)) {
  23507. var r = "'" + JSON.stringify(c).replace(/^"|"$/g, "").replace(/'/g, "\\'").replace(/\\"/g, '"') + "'";
  23508. return o.stylize(r, "string");
  23509. }
  23510. if (K9(c)) return o.stylize("" + c, "number");
  23511. if (lM(c)) return o.stylize("" + c, "boolean");
  23512. if (hG(c)) return o.stylize("null", "null");
  23513. }(t, I);
  23514. if (i) return i;
  23515. var e = Object.keys(I), A = function(o) {
  23516. var c = {};
  23517. return o.forEach(function(r, h) {
  23518. c[r] = !0;
  23519. }), c;
  23520. }(e);
  23521. if (t.showHidden && (e = Object.getOwnPropertyNames(I)), pm(I) && (e.indexOf("message") >= 0 || e.indexOf("description") >= 0)) return $H(I);
  23522. if (e.length === 0) {
  23523. if (Bm(I)) {
  23524. var s = I.name ? ": " + I.name : "";
  23525. return t.stylize("[Function" + s + "]", "special");
  23526. }
  23527. if (wm(I)) return t.stylize(RegExp.prototype.toString.call(I), "regexp");
  23528. if (hV(I)) return t.stylize(Date.prototype.toString.call(I), "date");
  23529. if (pm(I)) return $H(I);
  23530. }
  23531. var l, n = "", a = !1, d = ["{", "}"];
  23532. return D9(I) && (a = !0, d = ["[", "]"]), Bm(I) && (n = " [Function" + (I.name ? ": " + I.name : "") + "]"), wm(I) && (n = " " + RegExp.prototype.toString.call(I)), hV(I) && (n = " " + Date.prototype.toUTCString.call(I)), pm(I) && (n = " " + $H(I)), e.length !== 0 || a && I.length != 0 ? g < 0 ? wm(I) ? t.stylize(RegExp.prototype.toString.call(I), "regexp") : t.stylize("[Object]", "special") : (t.seen.push(I), l = a ? function(o, c, r, h, b) {
  23533. for (var u = [], m = 0, Z = c.length; m < Z; ++m) YCg(c, String(m)) ? u.push(gX(o, c, r, h, String(m), !0)) : u.push("");
  23534. return b.forEach(function(p) {
  23535. p.match(/^\d+$/) || u.push(gX(o, c, r, h, p, !0));
  23536. }), u;
  23537. }(t, I, g, A, e) : e.map(function(o) {
  23538. return gX(t, I, g, A, o, a);
  23539. }), t.seen.pop(), function(o, c, r) {
  23540. return o.reduce(function(h, b) {
  23541. return b.indexOf(`
  23542. `), h + b.replace(/\u001b\[\d\d?m/g, "").length + 1;
  23543. }, 0) > 60 ? r[0] + (c === "" ? "" : c + `
  23544. `) + " " + o.join(`,
  23545. `) + " " + r[1] : r[0] + c + " " + o.join(", ") + " " + r[1];
  23546. }(l, n, d)) : d[0] + n + d[1];
  23547. }
  23548. function $H(t) {
  23549. return "[" + Error.prototype.toString.call(t) + "]";
  23550. }
  23551. function gX(t, I, g, C, i, e) {
  23552. var A, s, l;
  23553. if ((l = Object.getOwnPropertyDescriptor(I, i) || { value: I[i] }).get ? s = l.set ? t.stylize("[Getter/Setter]", "special") : t.stylize("[Getter]", "special") : l.set && (s = t.stylize("[Setter]", "special")), YCg(C, i) || (A = "[" + i + "]"), s || (t.seen.indexOf(l.value) < 0 ? (s = hG(g) ? rV(t, l.value, null) : rV(t, l.value, g - 1)).indexOf(`
  23554. `) > -1 && (s = e ? s.split(`
  23555. `).map(function(n) {
  23556. return " " + n;
  23557. }).join(`
  23558. `).substr(2) : `
  23559. ` + s.split(`
  23560. `).map(function(n) {
  23561. return " " + n;
  23562. }).join(`
  23563. `)) : s = t.stylize("[Circular]", "special")), Ks(A)) {
  23564. if (e && i.match(/^\d+$/)) return s;
  23565. (A = JSON.stringify("" + i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/) ? (A = A.substr(1, A.length - 2), A = t.stylize(A, "name")) : (A = A.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"), A = t.stylize(A, "string"));
  23566. }
  23567. return A + ": " + s;
  23568. }
  23569. function D9(t) {
  23570. return Array.isArray(t);
  23571. }
  23572. function lM(t) {
  23573. return typeof t == "boolean";
  23574. }
  23575. function hG(t) {
  23576. return t === null;
  23577. }
  23578. function wCg(t) {
  23579. return t == null;
  23580. }
  23581. function K9(t) {
  23582. return typeof t == "number";
  23583. }
  23584. function fm(t) {
  23585. return typeof t == "string";
  23586. }
  23587. function pCg(t) {
  23588. return typeof t == "symbol";
  23589. }
  23590. function Ks(t) {
  23591. return t === void 0;
  23592. }
  23593. function wm(t) {
  23594. return Zd(t) && F9(t) === "[object RegExp]";
  23595. }
  23596. function Zd(t) {
  23597. return typeof t == "object" && t !== null;
  23598. }
  23599. function hV(t) {
  23600. return Zd(t) && F9(t) === "[object Date]";
  23601. }
  23602. function pm(t) {
  23603. return Zd(t) && (F9(t) === "[object Error]" || t instanceof Error);
  23604. }
  23605. function Bm(t) {
  23606. return typeof t == "function";
  23607. }
  23608. function BCg(t) {
  23609. return t === null || typeof t == "boolean" || typeof t == "number" || typeof t == "string" || typeof t == "symbol" || t === void 0;
  23610. }
  23611. function WCg(t) {
  23612. return dG(t);
  23613. }
  23614. function F9(t) {
  23615. return Object.prototype.toString.call(t);
  23616. }
  23617. function IX(t) {
  23618. return t < 10 ? "0" + t.toString(10) : t.toString(10);
  23619. }
  23620. ks.colors = { bold: [1, 22], italic: [3, 23], underline: [4, 24], inverse: [7, 27], white: [37, 39], grey: [90, 39], black: [30, 39], blue: [34, 39], cyan: [36, 39], green: [32, 39], magenta: [35, 39], red: [31, 39], yellow: [33, 39] }, ks.styles = { special: "cyan", number: "yellow", boolean: "yellow", undefined: "grey", null: "bold", string: "green", date: "magenta", regexp: "red" };
  23621. var bhg = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
  23622. function uhg() {
  23623. var t = /* @__PURE__ */ new Date(), I = [IX(t.getHours()), IX(t.getMinutes()), IX(t.getSeconds())].join(":");
  23624. return [t.getDate(), bhg[t.getMonth()], I].join(" ");
  23625. }
  23626. function yCg() {
  23627. console.log("%s - %s", uhg(), AM.apply(null, arguments));
  23628. }
  23629. function k9(t, I) {
  23630. if (!I || !Zd(I)) return t;
  23631. for (var g = Object.keys(I), C = g.length; C--; ) t[g[C]] = I[g[C]];
  23632. return t;
  23633. }
  23634. function YCg(t, I) {
  23635. return Object.prototype.hasOwnProperty.call(t, I);
  23636. }
  23637. var mhg = { inherits: Oa, _extend: k9, log: yCg, isBuffer: WCg, isPrimitive: BCg, isFunction: Bm, isError: pm, isDate: hV, isObject: Zd, isRegExp: wm, isUndefined: Ks, isSymbol: pCg, isString: fm, isNumber: K9, isNullOrUndefined: wCg, isNull: hG, isBoolean: lM, isArray: D9, inspect: ks, deprecate: sM, format: AM, debuglog: S9 }, Zhg = Object.freeze({ __proto__: null, format: AM, deprecate: sM, debuglog: S9, inspect: ks, isArray: D9, isBoolean: lM, isNull: hG, isNullOrUndefined: wCg, isNumber: K9, isString: fm, isSymbol: pCg, isUndefined: Ks, isRegExp: wm, isObject: Zd, isDate: hV, isError: pm, isFunction: Bm, isPrimitive: BCg, isBuffer: WCg, log: yCg, inherits: Oa, _extend: k9, default: mhg });
  23638. function Qo() {
  23639. this.head = null, this.tail = null, this.length = 0;
  23640. }
  23641. Qo.prototype.push = function(t) {
  23642. var I = { data: t, next: null };
  23643. this.length > 0 ? this.tail.next = I : this.head = I, this.tail = I, ++this.length;
  23644. }, Qo.prototype.unshift = function(t) {
  23645. var I = { data: t, next: this.head };
  23646. this.length === 0 && (this.tail = I), this.head = I, ++this.length;
  23647. }, Qo.prototype.shift = function() {
  23648. if (this.length !== 0) {
  23649. var t = this.head.data;
  23650. return this.length === 1 ? this.head = this.tail = null : this.head = this.head.next, --this.length, t;
  23651. }
  23652. }, Qo.prototype.clear = function() {
  23653. this.head = this.tail = null, this.length = 0;
  23654. }, Qo.prototype.join = function(t) {
  23655. if (this.length === 0) return "";
  23656. for (var I = this.head, g = "" + I.data; I = I.next; ) g += t + I.data;
  23657. return g;
  23658. }, Qo.prototype.concat = function(t) {
  23659. if (this.length === 0) return Hg.alloc(0);
  23660. if (this.length === 1) return this.head.data;
  23661. for (var I = Hg.allocUnsafe(t >>> 0), g = this.head, C = 0; g; ) g.data.copy(I, C), C += g.data.length, g = g.next;
  23662. return I;
  23663. };
  23664. var Ghg = Hg.isEncoding || function(t) {
  23665. switch (t && t.toLowerCase()) {
  23666. case "hex":
  23667. case "utf8":
  23668. case "utf-8":
  23669. case "ascii":
  23670. case "binary":
  23671. case "base64":
  23672. case "ucs2":
  23673. case "ucs-2":
  23674. case "utf16le":
  23675. case "utf-16le":
  23676. case "raw":
  23677. return !0;
  23678. default:
  23679. return !1;
  23680. }
  23681. };
  23682. function Wm(t) {
  23683. switch (this.encoding = (t || "utf8").toLowerCase().replace(/[-_]/, ""), function(I) {
  23684. if (I && !Ghg(I)) throw new Error("Unknown encoding: " + I);
  23685. }(t), this.encoding) {
  23686. case "utf8":
  23687. this.surrogateSize = 3;
  23688. break;
  23689. case "ucs2":
  23690. case "utf16le":
  23691. this.surrogateSize = 2, this.detectIncompleteChar = phg;
  23692. break;
  23693. case "base64":
  23694. this.surrogateSize = 3, this.detectIncompleteChar = Bhg;
  23695. break;
  23696. default:
  23697. return void (this.write = whg);
  23698. }
  23699. this.charBuffer = new Hg(6), this.charReceived = 0, this.charLength = 0;
  23700. }
  23701. function whg(t) {
  23702. return t.toString(this.encoding);
  23703. }
  23704. function phg(t) {
  23705. this.charReceived = t.length % 2, this.charLength = this.charReceived ? 2 : 0;
  23706. }
  23707. function Bhg(t) {
  23708. this.charReceived = t.length % 3, this.charLength = this.charReceived ? 3 : 0;
  23709. }
  23710. Wm.prototype.write = function(t) {
  23711. for (var I = ""; this.charLength; ) {
  23712. var g = t.length >= this.charLength - this.charReceived ? this.charLength - this.charReceived : t.length;
  23713. if (t.copy(this.charBuffer, this.charReceived, 0, g), this.charReceived += g, this.charReceived < this.charLength) return "";
  23714. if (t = t.slice(g, t.length), !((i = (I = this.charBuffer.slice(0, this.charLength).toString(this.encoding)).charCodeAt(I.length - 1)) >= 55296 && i <= 56319)) {
  23715. if (this.charReceived = this.charLength = 0, t.length === 0) return I;
  23716. break;
  23717. }
  23718. this.charLength += this.surrogateSize, I = "";
  23719. }
  23720. this.detectIncompleteChar(t);
  23721. var C = t.length;
  23722. this.charLength && (t.copy(this.charBuffer, 0, t.length - this.charReceived, C), C -= this.charReceived);
  23723. var i;
  23724. if (C = (I += t.toString(this.encoding, 0, C)).length - 1, (i = I.charCodeAt(C)) >= 55296 && i <= 56319) {
  23725. var e = this.surrogateSize;
  23726. return this.charLength += e, this.charReceived += e, this.charBuffer.copy(this.charBuffer, e, 0, e), t.copy(this.charBuffer, 0, 0, e), I.substring(0, C);
  23727. }
  23728. return I;
  23729. }, Wm.prototype.detectIncompleteChar = function(t) {
  23730. for (var I = t.length >= 3 ? 3 : t.length; I > 0; I--) {
  23731. var g = t[t.length - I];
  23732. if (I == 1 && g >> 5 == 6) {
  23733. this.charLength = 2;
  23734. break;
  23735. }
  23736. if (I <= 2 && g >> 4 == 14) {
  23737. this.charLength = 3;
  23738. break;
  23739. }
  23740. if (I <= 3 && g >> 3 == 30) {
  23741. this.charLength = 4;
  23742. break;
  23743. }
  23744. }
  23745. this.charReceived = I;
  23746. }, Wm.prototype.end = function(t) {
  23747. var I = "";
  23748. if (t && t.length && (I = this.write(t)), this.charReceived) {
  23749. var g = this.charReceived, C = this.charBuffer, i = this.encoding;
  23750. I += C.slice(0, g).toString(i);
  23751. }
  23752. return I;
  23753. }, PC.ReadableState = NCg;
  23754. var uC = S9("stream");
  23755. function NCg(t, I) {
  23756. t = t || {}, this.objectMode = !!t.objectMode, I instanceof Ve && (this.objectMode = this.objectMode || !!t.readableObjectMode);
  23757. var g = t.highWaterMark, C = this.objectMode ? 16 : 16384;
  23758. this.highWaterMark = g || g === 0 ? g : C, this.highWaterMark = ~~this.highWaterMark, this.buffer = new Qo(), this.length = 0, this.pipes = null, this.pipesCount = 0, this.flowing = null, this.ended = !1, this.endEmitted = !1, this.reading = !1, this.sync = !0, this.needReadable = !1, this.emittedReadable = !1, this.readableListening = !1, this.resumeScheduled = !1, this.defaultEncoding = t.defaultEncoding || "utf8", this.ranOut = !1, this.awaitDrain = 0, this.readingMore = !1, this.decoder = null, this.encoding = null, t.encoding && (this.decoder = new Wm(t.encoding), this.encoding = t.encoding);
  23759. }
  23760. function PC(t) {
  23761. if (!(this instanceof PC)) return new PC(t);
  23762. this._readableState = new NCg(t, this), this.readable = !0, t && typeof t.read == "function" && (this._read = t.read), qI.call(this);
  23763. }
  23764. function D8(t, I, g, C, i) {
  23765. var e = function(n, a) {
  23766. var d = null;
  23767. return dG(a) || typeof a == "string" || a == null || n.objectMode || (d = new TypeError("Invalid non-string/buffer chunk")), d;
  23768. }(I, g);
  23769. if (e) t.emit("error", e);
  23770. else if (g === null) I.reading = !1, function(n, a) {
  23771. if (!a.ended) {
  23772. if (a.decoder) {
  23773. var d = a.decoder.end();
  23774. d && d.length && (a.buffer.push(d), a.length += a.objectMode ? 1 : d.length);
  23775. }
  23776. a.ended = !0, bV(n);
  23777. }
  23778. }(t, I);
  23779. else if (I.objectMode || g && g.length > 0) if (I.ended && !i) {
  23780. var A = new Error("stream.push() after EOF");
  23781. t.emit("error", A);
  23782. } else if (I.endEmitted && i) {
  23783. var s = new Error("stream.unshift() after end event");
  23784. t.emit("error", s);
  23785. } else {
  23786. var l;
  23787. !I.decoder || i || C || (g = I.decoder.write(g), l = !I.objectMode && g.length === 0), i || (I.reading = !1), l || (I.flowing && I.length === 0 && !I.sync ? (t.emit("data", g), t.read(0)) : (I.length += I.objectMode ? 1 : g.length, i ? I.buffer.unshift(g) : I.buffer.push(g), I.needReadable && bV(t))), function(n, a) {
  23788. a.readingMore || (a.readingMore = !0, vt(Whg, n, a));
  23789. }(t, I);
  23790. }
  23791. else i || (I.reading = !1);
  23792. return function(n) {
  23793. return !n.ended && (n.needReadable || n.length < n.highWaterMark || n.length === 0);
  23794. }(I);
  23795. }
  23796. Oa(PC, qI), PC.prototype.push = function(t, I) {
  23797. var g = this._readableState;
  23798. return g.objectMode || typeof t != "string" || (I = I || g.defaultEncoding) !== g.encoding && (t = Hg.from(t, I), I = ""), D8(this, g, t, I, !1);
  23799. }, PC.prototype.unshift = function(t) {
  23800. return D8(this, this._readableState, t, "", !0);
  23801. }, PC.prototype.isPaused = function() {
  23802. return this._readableState.flowing === !1;
  23803. }, PC.prototype.setEncoding = function(t) {
  23804. return this._readableState.decoder = new Wm(t), this._readableState.encoding = t, this;
  23805. };
  23806. function K8(t, I) {
  23807. return t <= 0 || I.length === 0 && I.ended ? 0 : I.objectMode ? 1 : t != t ? I.flowing && I.length ? I.buffer.head.data.length : I.length : (t > I.highWaterMark && (I.highWaterMark = function(g) {
  23808. return g >= 8388608 ? g = 8388608 : (g--, g |= g >>> 1, g |= g >>> 2, g |= g >>> 4, g |= g >>> 8, g |= g >>> 16, g++), g;
  23809. }(t)), t <= I.length ? t : I.ended ? I.length : (I.needReadable = !0, 0));
  23810. }
  23811. function bV(t) {
  23812. var I = t._readableState;
  23813. I.needReadable = !1, I.emittedReadable || (uC("emitReadable", I.flowing), I.emittedReadable = !0, I.sync ? vt(F8, t) : F8(t));
  23814. }
  23815. function F8(t) {
  23816. uC("emit readable"), t.emit("readable"), z9(t);
  23817. }
  23818. function Whg(t, I) {
  23819. for (var g = I.length; !I.reading && !I.flowing && !I.ended && I.length < I.highWaterMark && (uC("maybeReadMore read 0"), t.read(0), g !== I.length); ) g = I.length;
  23820. I.readingMore = !1;
  23821. }
  23822. function yhg(t) {
  23823. uC("readable nexttick read 0"), t.read(0);
  23824. }
  23825. function Yhg(t, I) {
  23826. I.reading || (uC("resume read 0"), t.read(0)), I.resumeScheduled = !1, I.awaitDrain = 0, t.emit("resume"), z9(t), I.flowing && !I.reading && t.read(0);
  23827. }
  23828. function z9(t) {
  23829. var I = t._readableState;
  23830. for (uC("flow", I.flowing); I.flowing && t.read() !== null; ) ;
  23831. }
  23832. function k8(t, I) {
  23833. return I.length === 0 ? null : (I.objectMode ? g = I.buffer.shift() : !t || t >= I.length ? (g = I.decoder ? I.buffer.join("") : I.buffer.length === 1 ? I.buffer.head.data : I.buffer.concat(I.length), I.buffer.clear()) : g = function(C, i, e) {
  23834. var A;
  23835. return C < i.head.data.length ? (A = i.head.data.slice(0, C), i.head.data = i.head.data.slice(C)) : A = C === i.head.data.length ? i.shift() : e ? function(s, l) {
  23836. var n = l.head, a = 1, d = n.data;
  23837. for (s -= d.length; n = n.next; ) {
  23838. var o = n.data, c = s > o.length ? o.length : s;
  23839. if (c === o.length ? d += o : d += o.slice(0, s), (s -= c) === 0) {
  23840. c === o.length ? (++a, n.next ? l.head = n.next : l.head = l.tail = null) : (l.head = n, n.data = o.slice(c));
  23841. break;
  23842. }
  23843. ++a;
  23844. }
  23845. return l.length -= a, d;
  23846. }(C, i) : function(s, l) {
  23847. var n = Hg.allocUnsafe(s), a = l.head, d = 1;
  23848. for (a.data.copy(n), s -= a.data.length; a = a.next; ) {
  23849. var o = a.data, c = s > o.length ? o.length : s;
  23850. if (o.copy(n, n.length - s, 0, c), (s -= c) === 0) {
  23851. c === o.length ? (++d, a.next ? l.head = a.next : l.head = l.tail = null) : (l.head = a, a.data = o.slice(c));
  23852. break;
  23853. }
  23854. ++d;
  23855. }
  23856. return l.length -= d, n;
  23857. }(C, i), A;
  23858. }(t, I.buffer, I.decoder), g);
  23859. var g;
  23860. }
  23861. function CX(t) {
  23862. var I = t._readableState;
  23863. if (I.length > 0) throw new Error('"endReadable()" called on non-empty stream');
  23864. I.endEmitted || (I.ended = !0, vt(Nhg, I, t));
  23865. }
  23866. function Nhg(t, I) {
  23867. t.endEmitted || t.length !== 0 || (t.endEmitted = !0, I.readable = !1, I.emit("end"));
  23868. }
  23869. function z8(t, I) {
  23870. for (var g = 0, C = t.length; g < C; g++) if (t[g] === I) return g;
  23871. return -1;
  23872. }
  23873. function Vhg() {
  23874. }
  23875. function Mhg(t, I, g) {
  23876. this.chunk = t, this.encoding = I, this.callback = g, this.next = null;
  23877. }
  23878. function oD(t, I) {
  23879. Object.defineProperty(this, "buffer", { get: sM(function() {
  23880. return this.getBuffer();
  23881. }, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.") }), t = t || {}, this.objectMode = !!t.objectMode, I instanceof Ve && (this.objectMode = this.objectMode || !!t.writableObjectMode);
  23882. var g = t.highWaterMark, C = this.objectMode ? 16 : 16384;
  23883. this.highWaterMark = g || g === 0 ? g : C, this.highWaterMark = ~~this.highWaterMark, this.needDrain = !1, this.ending = !1, this.ended = !1, this.finished = !1;
  23884. var i = t.decodeStrings === !1;
  23885. this.decodeStrings = !i, this.defaultEncoding = t.defaultEncoding || "utf8", this.length = 0, this.writing = !1, this.corked = 0, this.sync = !0, this.bufferProcessing = !1, this.onwrite = function(e) {
  23886. (function(A, s) {
  23887. var l = A._writableState, n = l.sync, a = l.writecb;
  23888. if (function(o) {
  23889. o.writing = !1, o.writecb = null, o.length -= o.writelen, o.writelen = 0;
  23890. }(l), s) (function(o, c, r, h, b) {
  23891. --c.pendingcb, r ? vt(b, h) : b(h), o._writableState.errorEmitted = !0, o.emit("error", h);
  23892. })(A, l, n, s, a);
  23893. else {
  23894. var d = MCg(l);
  23895. d || l.corked || l.bufferProcessing || !l.bufferedRequest || VCg(A, l), n ? vt(J8, A, l, d, a) : J8(A, l, d, a);
  23896. }
  23897. })(I, e);
  23898. }, this.writecb = null, this.writelen = 0, this.bufferedRequest = null, this.lastBufferedRequest = null, this.pendingcb = 0, this.prefinished = !1, this.errorEmitted = !1, this.bufferedRequestCount = 0, this.corkedRequestsFree = new fCg(this);
  23899. }
  23900. function gi(t) {
  23901. if (!(this instanceof gi || this instanceof Ve)) return new gi(t);
  23902. this._writableState = new oD(t, this), this.writable = !0, t && (typeof t.write == "function" && (this._write = t.write), typeof t.writev == "function" && (this._writev = t.writev)), qI.call(this);
  23903. }
  23904. function cD(t, I, g, C, i, e, A) {
  23905. I.writelen = C, I.writecb = A, I.writing = !0, I.sync = !0, g ? t._writev(i, I.onwrite) : t._write(i, e, I.onwrite), I.sync = !1;
  23906. }
  23907. function J8(t, I, g, C) {
  23908. g || function(i, e) {
  23909. e.length === 0 && e.needDrain && (e.needDrain = !1, i.emit("drain"));
  23910. }(t, I), I.pendingcb--, C(), RCg(t, I);
  23911. }
  23912. function VCg(t, I) {
  23913. I.bufferProcessing = !0;
  23914. var g = I.bufferedRequest;
  23915. if (t._writev && g && g.next) {
  23916. var C = I.bufferedRequestCount, i = new Array(C), e = I.corkedRequestsFree;
  23917. e.entry = g;
  23918. for (var A = 0; g; ) i[A] = g, g = g.next, A += 1;
  23919. cD(t, I, !0, I.length, i, "", e.finish), I.pendingcb++, I.lastBufferedRequest = null, e.next ? (I.corkedRequestsFree = e.next, e.next = null) : I.corkedRequestsFree = new fCg(I);
  23920. } else {
  23921. for (; g; ) {
  23922. var s = g.chunk, l = g.encoding, n = g.callback;
  23923. if (cD(t, I, !1, I.objectMode ? 1 : s.length, s, l, n), g = g.next, I.writing) break;
  23924. }
  23925. g === null && (I.lastBufferedRequest = null);
  23926. }
  23927. I.bufferedRequestCount = 0, I.bufferedRequest = g, I.bufferProcessing = !1;
  23928. }
  23929. function MCg(t) {
  23930. return t.ending && t.length === 0 && t.bufferedRequest === null && !t.finished && !t.writing;
  23931. }
  23932. function L8(t, I) {
  23933. I.prefinished || (I.prefinished = !0, t.emit("prefinish"));
  23934. }
  23935. function RCg(t, I) {
  23936. var g = MCg(I);
  23937. return g && (I.pendingcb === 0 ? (L8(t, I), I.finished = !0, t.emit("finish")) : L8(t, I)), g;
  23938. }
  23939. function fCg(t) {
  23940. var I = this;
  23941. this.next = null, this.entry = null, this.finish = function(g) {
  23942. var C = I.entry;
  23943. for (I.entry = null; C; ) {
  23944. var i = C.callback;
  23945. t.pendingcb--, i(g), C = C.next;
  23946. }
  23947. t.corkedRequestsFree ? t.corkedRequestsFree.next = I : t.corkedRequestsFree = I;
  23948. };
  23949. }
  23950. PC.prototype.read = function(t) {
  23951. uC("read", t), t = parseInt(t, 10);
  23952. var I = this._readableState, g = t;
  23953. if (t !== 0 && (I.emittedReadable = !1), t === 0 && I.needReadable && (I.length >= I.highWaterMark || I.ended)) return uC("read: emitReadable", I.length, I.ended), I.length === 0 && I.ended ? CX(this) : bV(this), null;
  23954. if ((t = K8(t, I)) === 0 && I.ended) return I.length === 0 && CX(this), null;
  23955. var C, i = I.needReadable;
  23956. return uC("need readable", i), (I.length === 0 || I.length - t < I.highWaterMark) && uC("length less than watermark", i = !0), I.ended || I.reading ? uC("reading or ended", i = !1) : i && (uC("do read"), I.reading = !0, I.sync = !0, I.length === 0 && (I.needReadable = !0), this._read(I.highWaterMark), I.sync = !1, I.reading || (t = K8(g, I))), (C = t > 0 ? k8(t, I) : null) === null ? (I.needReadable = !0, t = 0) : I.length -= t, I.length === 0 && (I.ended || (I.needReadable = !0), g !== t && I.ended && CX(this)), C !== null && this.emit("data", C), C;
  23957. }, PC.prototype._read = function(t) {
  23958. this.emit("error", new Error("not implemented"));
  23959. }, PC.prototype.pipe = function(t, I) {
  23960. var g = this, C = this._readableState;
  23961. switch (C.pipesCount) {
  23962. case 0:
  23963. C.pipes = t;
  23964. break;
  23965. case 1:
  23966. C.pipes = [C.pipes, t];
  23967. break;
  23968. default:
  23969. C.pipes.push(t);
  23970. }
  23971. C.pipesCount += 1, uC("pipe count=%d opts=%j", C.pipesCount, I);
  23972. var i = !I || I.end !== !1 ? A : n;
  23973. function e(b) {
  23974. uC("onunpipe"), b === g && n();
  23975. }
  23976. function A() {
  23977. uC("onend"), t.end();
  23978. }
  23979. C.endEmitted ? vt(i) : g.once("end", i), t.on("unpipe", e);
  23980. var s = /* @__PURE__ */ function(b) {
  23981. return function() {
  23982. var u = b._readableState;
  23983. uC("pipeOnDrain", u.awaitDrain), u.awaitDrain && u.awaitDrain--, u.awaitDrain === 0 && b.listeners("data").length && (u.flowing = !0, z9(b));
  23984. };
  23985. }(g);
  23986. t.on("drain", s);
  23987. var l = !1;
  23988. function n() {
  23989. uC("cleanup"), t.removeListener("close", c), t.removeListener("finish", r), t.removeListener("drain", s), t.removeListener("error", o), t.removeListener("unpipe", e), g.removeListener("end", A), g.removeListener("end", n), g.removeListener("data", d), l = !0, !C.awaitDrain || t._writableState && !t._writableState.needDrain || s();
  23990. }
  23991. var a = !1;
  23992. function d(b) {
  23993. uC("ondata"), a = !1, t.write(b) !== !1 || a || ((C.pipesCount === 1 && C.pipes === t || C.pipesCount > 1 && z8(C.pipes, t) !== -1) && !l && (uC("false write response, pause", g._readableState.awaitDrain), g._readableState.awaitDrain++, a = !0), g.pause());
  23994. }
  23995. function o(b) {
  23996. var u;
  23997. uC("onerror", b), h(), t.removeListener("error", o), u = "error", t.listeners(u).length === 0 && t.emit("error", b);
  23998. }
  23999. function c() {
  24000. t.removeListener("finish", r), h();
  24001. }
  24002. function r() {
  24003. uC("onfinish"), t.removeListener("close", c), h();
  24004. }
  24005. function h() {
  24006. uC("unpipe"), g.unpipe(t);
  24007. }
  24008. return g.on("data", d), function(b, u, m) {
  24009. if (typeof b.prependListener == "function") return b.prependListener(u, m);
  24010. b._events && b._events[u] ? Array.isArray(b._events[u]) ? b._events[u].unshift(m) : b._events[u] = [m, b._events[u]] : b.on(u, m);
  24011. }(t, "error", o), t.once("close", c), t.once("finish", r), t.emit("pipe", g), C.flowing || (uC("pipe resume"), g.resume()), t;
  24012. }, PC.prototype.unpipe = function(t) {
  24013. var I = this._readableState;
  24014. if (I.pipesCount === 0) return this;
  24015. if (I.pipesCount === 1) return t && t !== I.pipes || (t || (t = I.pipes), I.pipes = null, I.pipesCount = 0, I.flowing = !1, t && t.emit("unpipe", this)), this;
  24016. if (!t) {
  24017. var g = I.pipes, C = I.pipesCount;
  24018. I.pipes = null, I.pipesCount = 0, I.flowing = !1;
  24019. for (var i = 0; i < C; i++) g[i].emit("unpipe", this);
  24020. return this;
  24021. }
  24022. var e = z8(I.pipes, t);
  24023. return e === -1 || (I.pipes.splice(e, 1), I.pipesCount -= 1, I.pipesCount === 1 && (I.pipes = I.pipes[0]), t.emit("unpipe", this)), this;
  24024. }, PC.prototype.on = function(t, I) {
  24025. var g = qI.prototype.on.call(this, t, I);
  24026. if (t === "data") this._readableState.flowing !== !1 && this.resume();
  24027. else if (t === "readable") {
  24028. var C = this._readableState;
  24029. C.endEmitted || C.readableListening || (C.readableListening = C.needReadable = !0, C.emittedReadable = !1, C.reading ? C.length && bV(this) : vt(yhg, this));
  24030. }
  24031. return g;
  24032. }, PC.prototype.addListener = PC.prototype.on, PC.prototype.resume = function() {
  24033. var t = this._readableState;
  24034. return t.flowing || (uC("resume"), t.flowing = !0, function(I, g) {
  24035. g.resumeScheduled || (g.resumeScheduled = !0, vt(Yhg, I, g));
  24036. }(this, t)), this;
  24037. }, PC.prototype.pause = function() {
  24038. return uC("call pause flowing=%j", this._readableState.flowing), this._readableState.flowing !== !1 && (uC("pause"), this._readableState.flowing = !1, this.emit("pause")), this;
  24039. }, PC.prototype.wrap = function(t) {
  24040. var I = this._readableState, g = !1, C = this;
  24041. for (var i in t.on("end", function() {
  24042. if (uC("wrapped end"), I.decoder && !I.ended) {
  24043. var e = I.decoder.end();
  24044. e && e.length && C.push(e);
  24045. }
  24046. C.push(null);
  24047. }), t.on("data", function(e) {
  24048. uC("wrapped data"), I.decoder && (e = I.decoder.write(e)), I.objectMode && e == null || (I.objectMode || e && e.length) && (C.push(e) || (g = !0, t.pause()));
  24049. }), t) this[i] === void 0 && typeof t[i] == "function" && (this[i] = /* @__PURE__ */ function(e) {
  24050. return function() {
  24051. return t[e].apply(t, arguments);
  24052. };
  24053. }(i));
  24054. return function(e, A) {
  24055. for (var s = 0, l = e.length; s < l; s++) A(e[s], s);
  24056. }(["error", "close", "destroy", "pause", "resume"], function(e) {
  24057. t.on(e, C.emit.bind(C, e));
  24058. }), C._read = function(e) {
  24059. uC("wrapped _read", e), g && (g = !1, t.resume());
  24060. }, C;
  24061. }, PC._fromList = k8, gi.WritableState = oD, Oa(gi, qI), oD.prototype.getBuffer = function() {
  24062. for (var t = this.bufferedRequest, I = []; t; ) I.push(t), t = t.next;
  24063. return I;
  24064. }, gi.prototype.pipe = function() {
  24065. this.emit("error", new Error("Cannot pipe, not readable"));
  24066. }, gi.prototype.write = function(t, I, g) {
  24067. var C = this._writableState, i = !1;
  24068. return typeof I == "function" && (g = I, I = null), Hg.isBuffer(t) ? I = "buffer" : I || (I = C.defaultEncoding), typeof g != "function" && (g = Vhg), C.ended ? function(e, A) {
  24069. var s = new Error("write after end");
  24070. e.emit("error", s), vt(A, s);
  24071. }(this, g) : function(e, A, s, l) {
  24072. var n = !0, a = !1;
  24073. return s === null ? a = new TypeError("May not write null values to stream") : Hg.isBuffer(s) || typeof s == "string" || s === void 0 || A.objectMode || (a = new TypeError("Invalid non-string/buffer chunk")), a && (e.emit("error", a), vt(l, a), n = !1), n;
  24074. }(this, C, t, g) && (C.pendingcb++, i = function(e, A, s, l, n) {
  24075. s = function(c, r, h) {
  24076. return c.objectMode || c.decodeStrings === !1 || typeof r != "string" || (r = Hg.from(r, h)), r;
  24077. }(A, s, l), Hg.isBuffer(s) && (l = "buffer");
  24078. var a = A.objectMode ? 1 : s.length;
  24079. A.length += a;
  24080. var d = A.length < A.highWaterMark;
  24081. if (d || (A.needDrain = !0), A.writing || A.corked) {
  24082. var o = A.lastBufferedRequest;
  24083. A.lastBufferedRequest = new Mhg(s, l, n), o ? o.next = A.lastBufferedRequest : A.bufferedRequest = A.lastBufferedRequest, A.bufferedRequestCount += 1;
  24084. } else cD(e, A, !1, a, s, l, n);
  24085. return d;
  24086. }(this, C, t, I, g)), i;
  24087. }, gi.prototype.cork = function() {
  24088. this._writableState.corked++;
  24089. }, gi.prototype.uncork = function() {
  24090. var t = this._writableState;
  24091. t.corked && (t.corked--, t.writing || t.corked || t.finished || t.bufferProcessing || !t.bufferedRequest || VCg(this, t));
  24092. }, gi.prototype.setDefaultEncoding = function(t) {
  24093. if (typeof t == "string" && (t = t.toLowerCase()), !(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((t + "").toLowerCase()) > -1)) throw new TypeError("Unknown encoding: " + t);
  24094. return this._writableState.defaultEncoding = t, this;
  24095. }, gi.prototype._write = function(t, I, g) {
  24096. g(new Error("not implemented"));
  24097. }, gi.prototype._writev = null, gi.prototype.end = function(t, I, g) {
  24098. var C = this._writableState;
  24099. typeof t == "function" ? (g = t, t = null, I = null) : typeof I == "function" && (g = I, I = null), t != null && this.write(t, I), C.corked && (C.corked = 1, this.uncork()), C.ending || C.finished || function(i, e, A) {
  24100. e.ending = !0, RCg(i, e), A && (e.finished ? vt(A) : i.once("finish", A)), e.ended = !0, i.writable = !1;
  24101. }(this, C, g);
  24102. }, Oa(Ve, PC);
  24103. for (var v8 = Object.keys(gi.prototype), tX = 0; tX < v8.length; tX++) {
  24104. var iX = v8[tX];
  24105. Ve.prototype[iX] || (Ve.prototype[iX] = gi.prototype[iX]);
  24106. }
  24107. function Ve(t) {
  24108. if (!(this instanceof Ve)) return new Ve(t);
  24109. PC.call(this, t), gi.call(this, t), t && t.readable === !1 && (this.readable = !1), t && t.writable === !1 && (this.writable = !1), this.allowHalfOpen = !0, t && t.allowHalfOpen === !1 && (this.allowHalfOpen = !1), this.once("end", Rhg);
  24110. }
  24111. function Rhg() {
  24112. this.allowHalfOpen || this._writableState.ended || vt(fhg, this);
  24113. }
  24114. function fhg(t) {
  24115. t.end();
  24116. }
  24117. function Hhg(t) {
  24118. this.afterTransform = function(I, g) {
  24119. return function(C, i, e) {
  24120. var A = C._transformState;
  24121. A.transforming = !1;
  24122. var s = A.writecb;
  24123. if (!s) return C.emit("error", new Error("no writecb in Transform class"));
  24124. A.writechunk = null, A.writecb = null, e != null && C.push(e), s(i);
  24125. var l = C._readableState;
  24126. l.reading = !1, (l.needReadable || l.length < l.highWaterMark) && C._read(l.highWaterMark);
  24127. }(t, I, g);
  24128. }, this.needTransform = !1, this.transforming = !1, this.writecb = null, this.writechunk = null, this.writeencoding = null;
  24129. }
  24130. function SA(t) {
  24131. if (!(this instanceof SA)) return new SA(t);
  24132. Ve.call(this, t), this._transformState = new Hhg(this);
  24133. var I = this;
  24134. this._readableState.needReadable = !0, this._readableState.sync = !1, t && (typeof t.transform == "function" && (this._transform = t.transform), typeof t.flush == "function" && (this._flush = t.flush)), this.once("prefinish", function() {
  24135. typeof this._flush == "function" ? this._flush(function(g) {
  24136. T8(I, g);
  24137. }) : T8(I);
  24138. });
  24139. }
  24140. function T8(t, I) {
  24141. if (I) return t.emit("error", I);
  24142. var g = t._writableState, C = t._transformState;
  24143. if (g.length) throw new Error("Calling transform done when ws.length != 0");
  24144. if (C.transforming) throw new Error("Calling transform done when still transforming");
  24145. return t.push(null);
  24146. }
  24147. function hh(t) {
  24148. if (!(this instanceof hh)) return new hh(t);
  24149. SA.call(this, t);
  24150. }
  24151. function GA() {
  24152. qI.call(this);
  24153. }
  24154. Oa(SA, Ve), SA.prototype.push = function(t, I) {
  24155. return this._transformState.needTransform = !1, Ve.prototype.push.call(this, t, I);
  24156. }, SA.prototype._transform = function(t, I, g) {
  24157. throw new Error("Not implemented");
  24158. }, SA.prototype._write = function(t, I, g) {
  24159. var C = this._transformState;
  24160. if (C.writecb = g, C.writechunk = t, C.writeencoding = I, !C.transforming) {
  24161. var i = this._readableState;
  24162. (C.needTransform || i.needReadable || i.length < i.highWaterMark) && this._read(i.highWaterMark);
  24163. }
  24164. }, SA.prototype._read = function(t) {
  24165. var I = this._transformState;
  24166. I.writechunk !== null && I.writecb && !I.transforming ? (I.transforming = !0, this._transform(I.writechunk, I.writeencoding, I.afterTransform)) : I.needTransform = !0;
  24167. }, Oa(hh, SA), hh.prototype._transform = function(t, I, g) {
  24168. g(null, t);
  24169. }, Oa(GA, qI), GA.Readable = PC, GA.Writable = gi, GA.Duplex = Ve, GA.Transform = SA, GA.PassThrough = hh, GA.Stream = GA, GA.prototype.pipe = function(t, I) {
  24170. var g = this;
  24171. function C(a) {
  24172. t.writable && t.write(a) === !1 && g.pause && g.pause();
  24173. }
  24174. function i() {
  24175. g.readable && g.resume && g.resume();
  24176. }
  24177. g.on("data", C), t.on("drain", i), t._isStdio || I && I.end === !1 || (g.on("end", A), g.on("close", s));
  24178. var e = !1;
  24179. function A() {
  24180. e || (e = !0, t.end());
  24181. }
  24182. function s() {
  24183. e || (e = !0, typeof t.destroy == "function" && t.destroy());
  24184. }
  24185. function l(a) {
  24186. if (n(), qI.listenerCount(this, "error") === 0) throw a;
  24187. }
  24188. function n() {
  24189. g.removeListener("data", C), t.removeListener("drain", i), g.removeListener("end", A), g.removeListener("close", s), g.removeListener("error", l), t.removeListener("error", l), g.removeListener("end", n), g.removeListener("close", n), t.removeListener("close", n);
  24190. }
  24191. return g.on("error", l), t.on("error", l), g.on("end", n), g.on("close", n), t.on("close", n), t.emit("pipe", g), t;
  24192. };
  24193. var x8, j8, Q8, HCg = iM(Object.freeze({ __proto__: null, default: GA, Readable: PC, Writable: gi, Duplex: Ve, Transform: SA, PassThrough: hh, Stream: GA })), eX = { exports: {} };
  24194. function nM() {
  24195. return x8 || (x8 = 1, eX.exports = { nextTick: function(t, I, g, C) {
  24196. if (typeof t != "function") throw new TypeError('"callback" argument must be a function');
  24197. var i, e, A = arguments.length;
  24198. switch (A) {
  24199. case 0:
  24200. case 1:
  24201. return vt(t);
  24202. case 2:
  24203. return vt(function() {
  24204. t.call(null, I);
  24205. });
  24206. case 3:
  24207. return vt(function() {
  24208. t.call(null, I, g);
  24209. });
  24210. case 4:
  24211. return vt(function() {
  24212. t.call(null, I, g, C);
  24213. });
  24214. default:
  24215. for (i = new Array(A - 1), e = 0; e < i.length; ) i[e++] = arguments[e];
  24216. return vt(function() {
  24217. t.apply(null, i);
  24218. });
  24219. }
  24220. } }), eX.exports;
  24221. }
  24222. var O8, Xhg = iM(chg), U8 = { exports: {} };
  24223. function XCg() {
  24224. return O8 ? U8.exports : (O8 = 1, U8.exports = HCg);
  24225. }
  24226. var E8, AX = { exports: {} }, SCg = iM(ehg);
  24227. function aM() {
  24228. return E8 || (E8 = 1, function(t, I) {
  24229. var g = SCg, C = g.Buffer;
  24230. function i(A, s) {
  24231. for (var l in A) s[l] = A[l];
  24232. }
  24233. function e(A, s, l) {
  24234. return C(A, s, l);
  24235. }
  24236. C.from && C.alloc && C.allocUnsafe && C.allocUnsafeSlow ? t.exports = g : (i(g, I), I.Buffer = e), i(C, e), e.from = function(A, s, l) {
  24237. if (typeof A == "number") throw new TypeError("Argument must not be a number");
  24238. return C(A, s, l);
  24239. }, e.alloc = function(A, s, l) {
  24240. if (typeof A != "number") throw new TypeError("Argument must be a number");
  24241. var n = C(A);
  24242. return s !== void 0 ? typeof l == "string" ? n.fill(s, l) : n.fill(s) : n.fill(0), n;
  24243. }, e.allocUnsafe = function(A) {
  24244. if (typeof A != "number") throw new TypeError("Argument must be a number");
  24245. return C(A);
  24246. }, e.allocUnsafeSlow = function(A) {
  24247. if (typeof A != "number") throw new TypeError("Argument must be a number");
  24248. return g.SlowBuffer(A);
  24249. };
  24250. }(AX, AX.exports)), AX.exports;
  24251. }
  24252. var P8, Ut = {};
  24253. function bG() {
  24254. if (P8) return Ut;
  24255. function t(I) {
  24256. return Object.prototype.toString.call(I);
  24257. }
  24258. return P8 = 1, Ut.isArray = function(I) {
  24259. return Array.isArray ? Array.isArray(I) : t(I) === "[object Array]";
  24260. }, Ut.isBoolean = function(I) {
  24261. return typeof I == "boolean";
  24262. }, Ut.isNull = function(I) {
  24263. return I === null;
  24264. }, Ut.isNullOrUndefined = function(I) {
  24265. return I == null;
  24266. }, Ut.isNumber = function(I) {
  24267. return typeof I == "number";
  24268. }, Ut.isString = function(I) {
  24269. return typeof I == "string";
  24270. }, Ut.isSymbol = function(I) {
  24271. return typeof I == "symbol";
  24272. }, Ut.isUndefined = function(I) {
  24273. return I === void 0;
  24274. }, Ut.isRegExp = function(I) {
  24275. return t(I) === "[object RegExp]";
  24276. }, Ut.isObject = function(I) {
  24277. return typeof I == "object" && I !== null;
  24278. }, Ut.isDate = function(I) {
  24279. return t(I) === "[object Date]";
  24280. }, Ut.isError = function(I) {
  24281. return t(I) === "[object Error]" || I instanceof Error;
  24282. }, Ut.isFunction = function(I) {
  24283. return typeof I == "function";
  24284. }, Ut.isPrimitive = function(I) {
  24285. return I === null || typeof I == "boolean" || typeof I == "number" || typeof I == "string" || typeof I == "symbol" || I === void 0;
  24286. }, Ut.isBuffer = SCg.Buffer.isBuffer, Ut;
  24287. }
  24288. var _8, q8, $8 = { exports: {} }, oM = iM(Zhg), sX = { exports: {} };
  24289. function uG() {
  24290. return q8 || (q8 = 1, function(t) {
  24291. try {
  24292. var I = oM;
  24293. if (typeof I.inherits != "function") throw "";
  24294. t.exports = I.inherits;
  24295. } catch {
  24296. t.exports = (_8 || (_8 = 1, typeof Object.create == "function" ? sX.exports = function(C, i) {
  24297. i && (C.super_ = i, C.prototype = Object.create(i.prototype, { constructor: { value: C, enumerable: !1, writable: !0, configurable: !0 } }));
  24298. } : sX.exports = function(C, i) {
  24299. if (i) {
  24300. C.super_ = i;
  24301. var e = function() {
  24302. };
  24303. e.prototype = i.prototype, C.prototype = new e(), C.prototype.constructor = C;
  24304. }
  24305. }), sX.exports);
  24306. }
  24307. }($8)), $8.exports;
  24308. }
  24309. var g_, lX, I_, C_, t_, nX, i_, aX, e_, A_ = { exports: {} };
  24310. function Shg() {
  24311. return g_ || (g_ = 1, function(t) {
  24312. var I = aM().Buffer, g = oM;
  24313. t.exports = function() {
  24314. function C() {
  24315. (function(i, e) {
  24316. if (!(i instanceof e)) throw new TypeError("Cannot call a class as a function");
  24317. })(this, C), this.head = null, this.tail = null, this.length = 0;
  24318. }
  24319. return C.prototype.push = function(i) {
  24320. var e = { data: i, next: null };
  24321. this.length > 0 ? this.tail.next = e : this.head = e, this.tail = e, ++this.length;
  24322. }, C.prototype.unshift = function(i) {
  24323. var e = { data: i, next: this.head };
  24324. this.length === 0 && (this.tail = e), this.head = e, ++this.length;
  24325. }, C.prototype.shift = function() {
  24326. if (this.length !== 0) {
  24327. var i = this.head.data;
  24328. return this.length === 1 ? this.head = this.tail = null : this.head = this.head.next, --this.length, i;
  24329. }
  24330. }, C.prototype.clear = function() {
  24331. this.head = this.tail = null, this.length = 0;
  24332. }, C.prototype.join = function(i) {
  24333. if (this.length === 0) return "";
  24334. for (var e = this.head, A = "" + e.data; e = e.next; ) A += i + e.data;
  24335. return A;
  24336. }, C.prototype.concat = function(i) {
  24337. if (this.length === 0) return I.alloc(0);
  24338. if (this.length === 1) return this.head.data;
  24339. for (var e, A, s, l = I.allocUnsafe(i >>> 0), n = this.head, a = 0; n; ) e = n.data, A = l, s = a, e.copy(A, s), a += n.data.length, n = n.next;
  24340. return l;
  24341. }, C;
  24342. }(), g && g.inspect && g.inspect.custom && (t.exports.prototype[g.inspect.custom] = function() {
  24343. var C = g.inspect({ length: this.length });
  24344. return this.constructor.name + " " + C;
  24345. });
  24346. }(A_)), A_.exports;
  24347. }
  24348. function DCg() {
  24349. if (I_) return lX;
  24350. I_ = 1;
  24351. var t = nM();
  24352. function I(g, C) {
  24353. g.emit("error", C);
  24354. }
  24355. return lX = { destroy: function(g, C) {
  24356. var i = this, e = this._readableState && this._readableState.destroyed, A = this._writableState && this._writableState.destroyed;
  24357. return e || A ? (C ? C(g) : !g || this._writableState && this._writableState.errorEmitted || t.nextTick(I, this, g), this) : (this._readableState && (this._readableState.destroyed = !0), this._writableState && (this._writableState.destroyed = !0), this._destroy(g || null, function(s) {
  24358. !C && s ? (t.nextTick(I, i, s), i._writableState && (i._writableState.errorEmitted = !0)) : C && C(s);
  24359. }), this);
  24360. }, undestroy: function() {
  24361. this._readableState && (this._readableState.destroyed = !1, this._readableState.reading = !1, this._readableState.ended = !1, this._readableState.endEmitted = !1), this._writableState && (this._writableState.destroyed = !1, this._writableState.ended = !1, this._writableState.ending = !1, this._writableState.finished = !1, this._writableState.errorEmitted = !1);
  24362. } }, lX;
  24363. }
  24364. function KCg() {
  24365. if (i_) return nX;
  24366. i_ = 1;
  24367. var t = nM();
  24368. function I(p) {
  24369. var Y = this;
  24370. this.next = null, this.entry = null, this.finish = function() {
  24371. (function(R, X, H) {
  24372. var S = R.entry;
  24373. for (R.entry = null; S; ) {
  24374. var z = S.callback;
  24375. X.pendingcb--, z(H), S = S.next;
  24376. }
  24377. X.corkedRequestsFree ? X.corkedRequestsFree.next = R : X.corkedRequestsFree = R;
  24378. })(Y, p);
  24379. };
  24380. }
  24381. nX = c;
  24382. var g, C = t.nextTick;
  24383. c.WritableState = o;
  24384. var i = Object.create(bG());
  24385. i.inherits = uG();
  24386. var e = { deprecate: t_ ? C_ : (t_ = 1, C_ = oM.deprecate) }, A = XCg(), s = aM().Buffer, l = oe.Uint8Array || function() {
  24387. }, n, a = DCg();
  24388. function d() {
  24389. }
  24390. function o(p, Y) {
  24391. g = g || y0(), p = p || {};
  24392. var R = Y instanceof g;
  24393. this.objectMode = !!p.objectMode, R && (this.objectMode = this.objectMode || !!p.writableObjectMode);
  24394. var X = p.highWaterMark, H = p.writableHighWaterMark, S = this.objectMode ? 16 : 16384;
  24395. this.highWaterMark = X || X === 0 ? X : R && (H || H === 0) ? H : S, this.highWaterMark = Math.floor(this.highWaterMark), this.finalCalled = !1, this.needDrain = !1, this.ending = !1, this.ended = !1, this.finished = !1, this.destroyed = !1;
  24396. var z = p.decodeStrings === !1;
  24397. this.decodeStrings = !z, this.defaultEncoding = p.defaultEncoding || "utf8", this.length = 0, this.writing = !1, this.corked = 0, this.sync = !0, this.bufferProcessing = !1, this.onwrite = function(v) {
  24398. (function(K, V) {
  24399. var N = K._writableState, B = N.sync, G = N.writecb;
  24400. if (function(W) {
  24401. W.writing = !1, W.writecb = null, W.length -= W.writelen, W.writelen = 0;
  24402. }(N), V) (function(W, y, f, D, F) {
  24403. --y.pendingcb, f ? (t.nextTick(F, D), t.nextTick(Z, W, y), W._writableState.errorEmitted = !0, W.emit("error", D)) : (F(D), W._writableState.errorEmitted = !0, W.emit("error", D), Z(W, y));
  24404. })(K, N, B, V, G);
  24405. else {
  24406. var w = u(N);
  24407. w || N.corked || N.bufferProcessing || !N.bufferedRequest || b(K, N), B ? C(h, K, N, w, G) : h(K, N, w, G);
  24408. }
  24409. })(Y, v);
  24410. }, this.writecb = null, this.writelen = 0, this.bufferedRequest = null, this.lastBufferedRequest = null, this.pendingcb = 0, this.prefinished = !1, this.errorEmitted = !1, this.bufferedRequestCount = 0, this.corkedRequestsFree = new I(this);
  24411. }
  24412. function c(p) {
  24413. if (g = g || y0(), !(n.call(c, this) || this instanceof g)) return new c(p);
  24414. this._writableState = new o(p, this), this.writable = !0, p && (typeof p.write == "function" && (this._write = p.write), typeof p.writev == "function" && (this._writev = p.writev), typeof p.destroy == "function" && (this._destroy = p.destroy), typeof p.final == "function" && (this._final = p.final)), A.call(this);
  24415. }
  24416. function r(p, Y, R, X, H, S, z) {
  24417. Y.writelen = X, Y.writecb = z, Y.writing = !0, Y.sync = !0, R ? p._writev(H, Y.onwrite) : p._write(H, S, Y.onwrite), Y.sync = !1;
  24418. }
  24419. function h(p, Y, R, X) {
  24420. R || function(H, S) {
  24421. S.length === 0 && S.needDrain && (S.needDrain = !1, H.emit("drain"));
  24422. }(p, Y), Y.pendingcb--, X(), Z(p, Y);
  24423. }
  24424. function b(p, Y) {
  24425. Y.bufferProcessing = !0;
  24426. var R = Y.bufferedRequest;
  24427. if (p._writev && R && R.next) {
  24428. var X = Y.bufferedRequestCount, H = new Array(X), S = Y.corkedRequestsFree;
  24429. S.entry = R;
  24430. for (var z = 0, v = !0; R; ) H[z] = R, R.isBuf || (v = !1), R = R.next, z += 1;
  24431. H.allBuffers = v, r(p, Y, !0, Y.length, H, "", S.finish), Y.pendingcb++, Y.lastBufferedRequest = null, S.next ? (Y.corkedRequestsFree = S.next, S.next = null) : Y.corkedRequestsFree = new I(Y), Y.bufferedRequestCount = 0;
  24432. } else {
  24433. for (; R; ) {
  24434. var K = R.chunk, V = R.encoding, N = R.callback;
  24435. if (r(p, Y, !1, Y.objectMode ? 1 : K.length, K, V, N), R = R.next, Y.bufferedRequestCount--, Y.writing) break;
  24436. }
  24437. R === null && (Y.lastBufferedRequest = null);
  24438. }
  24439. Y.bufferedRequest = R, Y.bufferProcessing = !1;
  24440. }
  24441. function u(p) {
  24442. return p.ending && p.length === 0 && p.bufferedRequest === null && !p.finished && !p.writing;
  24443. }
  24444. function m(p, Y) {
  24445. p._final(function(R) {
  24446. Y.pendingcb--, R && p.emit("error", R), Y.prefinished = !0, p.emit("prefinish"), Z(p, Y);
  24447. });
  24448. }
  24449. function Z(p, Y) {
  24450. var R = u(Y);
  24451. return R && (function(X, H) {
  24452. H.prefinished || H.finalCalled || (typeof X._final == "function" ? (H.pendingcb++, H.finalCalled = !0, t.nextTick(m, X, H)) : (H.prefinished = !0, X.emit("prefinish")));
  24453. }(p, Y), Y.pendingcb === 0 && (Y.finished = !0, p.emit("finish"))), R;
  24454. }
  24455. return i.inherits(c, A), o.prototype.getBuffer = function() {
  24456. for (var p = this.bufferedRequest, Y = []; p; ) Y.push(p), p = p.next;
  24457. return Y;
  24458. }, function() {
  24459. try {
  24460. Object.defineProperty(o.prototype, "buffer", { get: e.deprecate(function() {
  24461. return this.getBuffer();
  24462. }, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.", "DEP0003") });
  24463. } catch {
  24464. }
  24465. }(), typeof Symbol == "function" && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] == "function" ? (n = Function.prototype[Symbol.hasInstance], Object.defineProperty(c, Symbol.hasInstance, { value: function(p) {
  24466. return !!n.call(this, p) || this === c && p && p._writableState instanceof o;
  24467. } })) : n = function(p) {
  24468. return p instanceof this;
  24469. }, c.prototype.pipe = function() {
  24470. this.emit("error", new Error("Cannot pipe, not readable"));
  24471. }, c.prototype.write = function(p, Y, R) {
  24472. var X, H = this._writableState, S = !1, z = !H.objectMode && (X = p, s.isBuffer(X) || X instanceof l);
  24473. return z && !s.isBuffer(p) && (p = function(v) {
  24474. return s.from(v);
  24475. }(p)), typeof Y == "function" && (R = Y, Y = null), z ? Y = "buffer" : Y || (Y = H.defaultEncoding), typeof R != "function" && (R = d), H.ended ? function(v, K) {
  24476. var V = new Error("write after end");
  24477. v.emit("error", V), t.nextTick(K, V);
  24478. }(this, R) : (z || function(v, K, V, N) {
  24479. var B = !0, G = !1;
  24480. return V === null ? G = new TypeError("May not write null values to stream") : typeof V == "string" || V === void 0 || K.objectMode || (G = new TypeError("Invalid non-string/buffer chunk")), G && (v.emit("error", G), t.nextTick(N, G), B = !1), B;
  24481. }(this, H, p, R)) && (H.pendingcb++, S = function(v, K, V, N, B, G) {
  24482. if (!V) {
  24483. var w = function(D, F, T) {
  24484. return D.objectMode || D.decodeStrings === !1 || typeof F != "string" || (F = s.from(F, T)), F;
  24485. }(K, N, B);
  24486. N !== w && (V = !0, B = "buffer", N = w);
  24487. }
  24488. var W = K.objectMode ? 1 : N.length;
  24489. K.length += W;
  24490. var y = K.length < K.highWaterMark;
  24491. if (y || (K.needDrain = !0), K.writing || K.corked) {
  24492. var f = K.lastBufferedRequest;
  24493. K.lastBufferedRequest = { chunk: N, encoding: B, isBuf: V, callback: G, next: null }, f ? f.next = K.lastBufferedRequest : K.bufferedRequest = K.lastBufferedRequest, K.bufferedRequestCount += 1;
  24494. } else r(v, K, !1, W, N, B, G);
  24495. return y;
  24496. }(this, H, z, p, Y, R)), S;
  24497. }, c.prototype.cork = function() {
  24498. this._writableState.corked++;
  24499. }, c.prototype.uncork = function() {
  24500. var p = this._writableState;
  24501. p.corked && (p.corked--, p.writing || p.corked || p.finished || p.bufferProcessing || !p.bufferedRequest || b(this, p));
  24502. }, c.prototype.setDefaultEncoding = function(p) {
  24503. if (typeof p == "string" && (p = p.toLowerCase()), !(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((p + "").toLowerCase()) > -1)) throw new TypeError("Unknown encoding: " + p);
  24504. return this._writableState.defaultEncoding = p, this;
  24505. }, Object.defineProperty(c.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
  24506. return this._writableState.highWaterMark;
  24507. } }), c.prototype._write = function(p, Y, R) {
  24508. R(new Error("_write() is not implemented"));
  24509. }, c.prototype._writev = null, c.prototype.end = function(p, Y, R) {
  24510. var X = this._writableState;
  24511. typeof p == "function" ? (R = p, p = null, Y = null) : typeof Y == "function" && (R = Y, Y = null), p != null && this.write(p, Y), X.corked && (X.corked = 1, this.uncork()), X.ending || X.finished || function(H, S, z) {
  24512. S.ending = !0, Z(H, S), z && (S.finished ? t.nextTick(z) : H.once("finish", z)), S.ended = !0, H.writable = !1;
  24513. }(this, X, R);
  24514. }, Object.defineProperty(c.prototype, "destroyed", { get: function() {
  24515. return this._writableState !== void 0 && this._writableState.destroyed;
  24516. }, set: function(p) {
  24517. this._writableState && (this._writableState.destroyed = p);
  24518. } }), c.prototype.destroy = a.destroy, c.prototype._undestroy = a.undestroy, c.prototype._destroy = function(p, Y) {
  24519. this.end(), Y(p);
  24520. }, nX;
  24521. }
  24522. function y0() {
  24523. if (e_) return aX;
  24524. e_ = 1;
  24525. var t = nM(), I = Object.keys || function(d) {
  24526. var o = [];
  24527. for (var c in d) o.push(c);
  24528. return o;
  24529. };
  24530. aX = l;
  24531. var g = Object.create(bG());
  24532. g.inherits = uG();
  24533. var C = FCg(), i = KCg();
  24534. g.inherits(l, C);
  24535. for (var e = I(i.prototype), A = 0; A < e.length; A++) {
  24536. var s = e[A];
  24537. l.prototype[s] || (l.prototype[s] = i.prototype[s]);
  24538. }
  24539. function l(d) {
  24540. if (!(this instanceof l)) return new l(d);
  24541. C.call(this, d), i.call(this, d), d && d.readable === !1 && (this.readable = !1), d && d.writable === !1 && (this.writable = !1), this.allowHalfOpen = !0, d && d.allowHalfOpen === !1 && (this.allowHalfOpen = !1), this.once("end", n);
  24542. }
  24543. function n() {
  24544. this.allowHalfOpen || this._writableState.ended || t.nextTick(a, this);
  24545. }
  24546. function a(d) {
  24547. d.end();
  24548. }
  24549. return Object.defineProperty(l.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
  24550. return this._writableState.highWaterMark;
  24551. } }), Object.defineProperty(l.prototype, "destroyed", { get: function() {
  24552. return this._readableState !== void 0 && this._writableState !== void 0 && this._readableState.destroyed && this._writableState.destroyed;
  24553. }, set: function(d) {
  24554. this._readableState !== void 0 && this._writableState !== void 0 && (this._readableState.destroyed = d, this._writableState.destroyed = d);
  24555. } }), l.prototype._destroy = function(d, o) {
  24556. this.push(null), this.end(), t.nextTick(o, d);
  24557. }, aX;
  24558. }
  24559. var s_, oX, l_, cX, n_, dX, a_, o_, rX = {};
  24560. function c_() {
  24561. if (s_) return rX;
  24562. s_ = 1;
  24563. var t = aM().Buffer, I = t.isEncoding || function(d) {
  24564. switch ((d = "" + d) && d.toLowerCase()) {
  24565. case "hex":
  24566. case "utf8":
  24567. case "utf-8":
  24568. case "ascii":
  24569. case "binary":
  24570. case "base64":
  24571. case "ucs2":
  24572. case "ucs-2":
  24573. case "utf16le":
  24574. case "utf-16le":
  24575. case "raw":
  24576. return !0;
  24577. default:
  24578. return !1;
  24579. }
  24580. };
  24581. function g(d) {
  24582. var o;
  24583. switch (this.encoding = function(c) {
  24584. var r = function(h) {
  24585. if (!h) return "utf8";
  24586. for (var b; ; ) switch (h) {
  24587. case "utf8":
  24588. case "utf-8":
  24589. return "utf8";
  24590. case "ucs2":
  24591. case "ucs-2":
  24592. case "utf16le":
  24593. case "utf-16le":
  24594. return "utf16le";
  24595. case "latin1":
  24596. case "binary":
  24597. return "latin1";
  24598. case "base64":
  24599. case "ascii":
  24600. case "hex":
  24601. return h;
  24602. default:
  24603. if (b) return;
  24604. h = ("" + h).toLowerCase(), b = !0;
  24605. }
  24606. }(c);
  24607. if (typeof r != "string" && (t.isEncoding === I || !I(c))) throw new Error("Unknown encoding: " + c);
  24608. return r || c;
  24609. }(d), this.encoding) {
  24610. case "utf16le":
  24611. this.text = e, this.end = A, o = 4;
  24612. break;
  24613. case "utf8":
  24614. this.fillLast = i, o = 4;
  24615. break;
  24616. case "base64":
  24617. this.text = s, this.end = l, o = 3;
  24618. break;
  24619. default:
  24620. return this.write = n, void (this.end = a);
  24621. }
  24622. this.lastNeed = 0, this.lastTotal = 0, this.lastChar = t.allocUnsafe(o);
  24623. }
  24624. function C(d) {
  24625. return d <= 127 ? 0 : d >> 5 == 6 ? 2 : d >> 4 == 14 ? 3 : d >> 3 == 30 ? 4 : d >> 6 == 2 ? -1 : -2;
  24626. }
  24627. function i(d) {
  24628. var o = this.lastTotal - this.lastNeed, c = function(r, h, b) {
  24629. if ((192 & h[0]) != 128) return r.lastNeed = 0, "�";
  24630. if (r.lastNeed > 1 && h.length > 1) {
  24631. if ((192 & h[1]) != 128) return r.lastNeed = 1, "�";
  24632. if (r.lastNeed > 2 && h.length > 2 && (192 & h[2]) != 128) return r.lastNeed = 2, "�";
  24633. }
  24634. }(this, d);
  24635. return c !== void 0 ? c : this.lastNeed <= d.length ? (d.copy(this.lastChar, o, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal)) : (d.copy(this.lastChar, o, 0, d.length), void (this.lastNeed -= d.length));
  24636. }
  24637. function e(d, o) {
  24638. if ((d.length - o) % 2 == 0) {
  24639. var c = d.toString("utf16le", o);
  24640. if (c) {
  24641. var r = c.charCodeAt(c.length - 1);
  24642. if (r >= 55296 && r <= 56319) return this.lastNeed = 2, this.lastTotal = 4, this.lastChar[0] = d[d.length - 2], this.lastChar[1] = d[d.length - 1], c.slice(0, -1);
  24643. }
  24644. return c;
  24645. }
  24646. return this.lastNeed = 1, this.lastTotal = 2, this.lastChar[0] = d[d.length - 1], d.toString("utf16le", o, d.length - 1);
  24647. }
  24648. function A(d) {
  24649. var o = d && d.length ? this.write(d) : "";
  24650. if (this.lastNeed) {
  24651. var c = this.lastTotal - this.lastNeed;
  24652. return o + this.lastChar.toString("utf16le", 0, c);
  24653. }
  24654. return o;
  24655. }
  24656. function s(d, o) {
  24657. var c = (d.length - o) % 3;
  24658. return c === 0 ? d.toString("base64", o) : (this.lastNeed = 3 - c, this.lastTotal = 3, c === 1 ? this.lastChar[0] = d[d.length - 1] : (this.lastChar[0] = d[d.length - 2], this.lastChar[1] = d[d.length - 1]), d.toString("base64", o, d.length - c));
  24659. }
  24660. function l(d) {
  24661. var o = d && d.length ? this.write(d) : "";
  24662. return this.lastNeed ? o + this.lastChar.toString("base64", 0, 3 - this.lastNeed) : o;
  24663. }
  24664. function n(d) {
  24665. return d.toString(this.encoding);
  24666. }
  24667. function a(d) {
  24668. return d && d.length ? this.write(d) : "";
  24669. }
  24670. return rX.StringDecoder = g, g.prototype.write = function(d) {
  24671. if (d.length === 0) return "";
  24672. var o, c;
  24673. if (this.lastNeed) {
  24674. if ((o = this.fillLast(d)) === void 0) return "";
  24675. c = this.lastNeed, this.lastNeed = 0;
  24676. } else c = 0;
  24677. return c < d.length ? o ? o + this.text(d, c) : this.text(d, c) : o || "";
  24678. }, g.prototype.end = function(d) {
  24679. var o = d && d.length ? this.write(d) : "";
  24680. return this.lastNeed ? o + "�" : o;
  24681. }, g.prototype.text = function(d, o) {
  24682. var c = function(h, b, u) {
  24683. var m = b.length - 1;
  24684. if (m < u) return 0;
  24685. var Z = C(b[m]);
  24686. return Z >= 0 ? (Z > 0 && (h.lastNeed = Z - 1), Z) : --m < u || Z === -2 ? 0 : (Z = C(b[m])) >= 0 ? (Z > 0 && (h.lastNeed = Z - 2), Z) : --m < u || Z === -2 ? 0 : (Z = C(b[m])) >= 0 ? (Z > 0 && (Z === 2 ? Z = 0 : h.lastNeed = Z - 3), Z) : 0;
  24687. }(this, d, o);
  24688. if (!this.lastNeed) return d.toString("utf8", o);
  24689. this.lastTotal = c;
  24690. var r = d.length - (c - this.lastNeed);
  24691. return d.copy(this.lastChar, 0, r), d.toString("utf8", o, r);
  24692. }, g.prototype.fillLast = function(d) {
  24693. if (this.lastNeed <= d.length) return d.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal);
  24694. d.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, d.length), this.lastNeed -= d.length;
  24695. }, rX;
  24696. }
  24697. function FCg() {
  24698. if (l_) return oX;
  24699. l_ = 1;
  24700. var t = nM();
  24701. oX = h;
  24702. var I, g = function() {
  24703. if (Q8) return j8;
  24704. Q8 = 1;
  24705. var B = {}.toString;
  24706. return j8 = Array.isArray || function(G) {
  24707. return B.call(G) == "[object Array]";
  24708. };
  24709. }();
  24710. h.ReadableState = r, Xhg.EventEmitter;
  24711. var C = function(B, G) {
  24712. return B.listeners(G).length;
  24713. }, i = XCg(), e = aM().Buffer, A = oe.Uint8Array || function() {
  24714. }, s = Object.create(bG());
  24715. s.inherits = uG();
  24716. var l = oM, n = void 0;
  24717. n = l && l.debuglog ? l.debuglog("stream") : function() {
  24718. };
  24719. var a, d = Shg(), o = DCg();
  24720. s.inherits(h, i);
  24721. var c = ["error", "close", "destroy", "pause", "resume"];
  24722. function r(B, G) {
  24723. B = B || {};
  24724. var w = G instanceof (I = I || y0());
  24725. this.objectMode = !!B.objectMode, w && (this.objectMode = this.objectMode || !!B.readableObjectMode);
  24726. var W = B.highWaterMark, y = B.readableHighWaterMark, f = this.objectMode ? 16 : 16384;
  24727. this.highWaterMark = W || W === 0 ? W : w && (y || y === 0) ? y : f, this.highWaterMark = Math.floor(this.highWaterMark), this.buffer = new d(), this.length = 0, this.pipes = null, this.pipesCount = 0, this.flowing = null, this.ended = !1, this.endEmitted = !1, this.reading = !1, this.sync = !0, this.needReadable = !1, this.emittedReadable = !1, this.readableListening = !1, this.resumeScheduled = !1, this.destroyed = !1, this.defaultEncoding = B.defaultEncoding || "utf8", this.awaitDrain = 0, this.readingMore = !1, this.decoder = null, this.encoding = null, B.encoding && (a || (a = c_().StringDecoder), this.decoder = new a(B.encoding), this.encoding = B.encoding);
  24728. }
  24729. function h(B) {
  24730. if (I = I || y0(), !(this instanceof h)) return new h(B);
  24731. this._readableState = new r(B, this), this.readable = !0, B && (typeof B.read == "function" && (this._read = B.read), typeof B.destroy == "function" && (this._destroy = B.destroy)), i.call(this);
  24732. }
  24733. function b(B, G, w, W, y) {
  24734. var f, D = B._readableState;
  24735. return G === null ? (D.reading = !1, function(F, T) {
  24736. if (!T.ended) {
  24737. if (T.decoder) {
  24738. var Q = T.decoder.end();
  24739. Q && Q.length && (T.buffer.push(Q), T.length += T.objectMode ? 1 : Q.length);
  24740. }
  24741. T.ended = !0, p(F);
  24742. }
  24743. }(B, D)) : (y || (f = function(F, T) {
  24744. var Q;
  24745. P = T, e.isBuffer(P) || P instanceof A || typeof T == "string" || T === void 0 || F.objectMode || (Q = new TypeError("Invalid non-string/buffer chunk"));
  24746. var P;
  24747. return Q;
  24748. }(D, G)), f ? B.emit("error", f) : D.objectMode || G && G.length > 0 ? (typeof G == "string" || D.objectMode || Object.getPrototypeOf(G) === e.prototype || (G = function(F) {
  24749. return e.from(F);
  24750. }(G)), W ? D.endEmitted ? B.emit("error", new Error("stream.unshift() after end event")) : u(B, D, G, !0) : D.ended ? B.emit("error", new Error("stream.push() after EOF")) : (D.reading = !1, D.decoder && !w ? (G = D.decoder.write(G), D.objectMode || G.length !== 0 ? u(B, D, G, !1) : R(B, D)) : u(B, D, G, !1))) : W || (D.reading = !1)), function(F) {
  24751. return !F.ended && (F.needReadable || F.length < F.highWaterMark || F.length === 0);
  24752. }(D);
  24753. }
  24754. function u(B, G, w, W) {
  24755. G.flowing && G.length === 0 && !G.sync ? (B.emit("data", w), B.read(0)) : (G.length += G.objectMode ? 1 : w.length, W ? G.buffer.unshift(w) : G.buffer.push(w), G.needReadable && p(B)), R(B, G);
  24756. }
  24757. Object.defineProperty(h.prototype, "destroyed", { get: function() {
  24758. return this._readableState !== void 0 && this._readableState.destroyed;
  24759. }, set: function(B) {
  24760. this._readableState && (this._readableState.destroyed = B);
  24761. } }), h.prototype.destroy = o.destroy, h.prototype._undestroy = o.undestroy, h.prototype._destroy = function(B, G) {
  24762. this.push(null), G(B);
  24763. }, h.prototype.push = function(B, G) {
  24764. var w, W = this._readableState;
  24765. return W.objectMode ? w = !0 : typeof B == "string" && ((G = G || W.defaultEncoding) !== W.encoding && (B = e.from(B, G), G = ""), w = !0), b(this, B, G, !1, w);
  24766. }, h.prototype.unshift = function(B) {
  24767. return b(this, B, null, !0, !1);
  24768. }, h.prototype.isPaused = function() {
  24769. return this._readableState.flowing === !1;
  24770. }, h.prototype.setEncoding = function(B) {
  24771. return a || (a = c_().StringDecoder), this._readableState.decoder = new a(B), this._readableState.encoding = B, this;
  24772. };
  24773. var m = 8388608;
  24774. function Z(B, G) {
  24775. return B <= 0 || G.length === 0 && G.ended ? 0 : G.objectMode ? 1 : B != B ? G.flowing && G.length ? G.buffer.head.data.length : G.length : (B > G.highWaterMark && (G.highWaterMark = function(w) {
  24776. return w >= m ? w = m : (w--, w |= w >>> 1, w |= w >>> 2, w |= w >>> 4, w |= w >>> 8, w |= w >>> 16, w++), w;
  24777. }(B)), B <= G.length ? B : G.ended ? G.length : (G.needReadable = !0, 0));
  24778. }
  24779. function p(B) {
  24780. var G = B._readableState;
  24781. G.needReadable = !1, G.emittedReadable || (n("emitReadable", G.flowing), G.emittedReadable = !0, G.sync ? t.nextTick(Y, B) : Y(B));
  24782. }
  24783. function Y(B) {
  24784. n("emit readable"), B.emit("readable"), z(B);
  24785. }
  24786. function R(B, G) {
  24787. G.readingMore || (G.readingMore = !0, t.nextTick(X, B, G));
  24788. }
  24789. function X(B, G) {
  24790. for (var w = G.length; !G.reading && !G.flowing && !G.ended && G.length < G.highWaterMark && (n("maybeReadMore read 0"), B.read(0), w !== G.length); ) w = G.length;
  24791. G.readingMore = !1;
  24792. }
  24793. function H(B) {
  24794. n("readable nexttick read 0"), B.read(0);
  24795. }
  24796. function S(B, G) {
  24797. G.reading || (n("resume read 0"), B.read(0)), G.resumeScheduled = !1, G.awaitDrain = 0, B.emit("resume"), z(B), G.flowing && !G.reading && B.read(0);
  24798. }
  24799. function z(B) {
  24800. var G = B._readableState;
  24801. for (n("flow", G.flowing); G.flowing && B.read() !== null; ) ;
  24802. }
  24803. function v(B, G) {
  24804. return G.length === 0 ? null : (G.objectMode ? w = G.buffer.shift() : !B || B >= G.length ? (w = G.decoder ? G.buffer.join("") : G.buffer.length === 1 ? G.buffer.head.data : G.buffer.concat(G.length), G.buffer.clear()) : w = function(W, y, f) {
  24805. var D;
  24806. return W < y.head.data.length ? (D = y.head.data.slice(0, W), y.head.data = y.head.data.slice(W)) : D = W === y.head.data.length ? y.shift() : f ? function(F, T) {
  24807. var Q = T.head, P = 1, L = Q.data;
  24808. for (F -= L.length; Q = Q.next; ) {
  24809. var E = Q.data, J = F > E.length ? E.length : F;
  24810. if (J === E.length ? L += E : L += E.slice(0, F), (F -= J) === 0) {
  24811. J === E.length ? (++P, Q.next ? T.head = Q.next : T.head = T.tail = null) : (T.head = Q, Q.data = E.slice(J));
  24812. break;
  24813. }
  24814. ++P;
  24815. }
  24816. return T.length -= P, L;
  24817. }(W, y) : function(F, T) {
  24818. var Q = e.allocUnsafe(F), P = T.head, L = 1;
  24819. for (P.data.copy(Q), F -= P.data.length; P = P.next; ) {
  24820. var E = P.data, J = F > E.length ? E.length : F;
  24821. if (E.copy(Q, Q.length - F, 0, J), (F -= J) === 0) {
  24822. J === E.length ? (++L, P.next ? T.head = P.next : T.head = T.tail = null) : (T.head = P, P.data = E.slice(J));
  24823. break;
  24824. }
  24825. ++L;
  24826. }
  24827. return T.length -= L, Q;
  24828. }(W, y), D;
  24829. }(B, G.buffer, G.decoder), w);
  24830. var w;
  24831. }
  24832. function K(B) {
  24833. var G = B._readableState;
  24834. if (G.length > 0) throw new Error('"endReadable()" called on non-empty stream');
  24835. G.endEmitted || (G.ended = !0, t.nextTick(V, G, B));
  24836. }
  24837. function V(B, G) {
  24838. B.endEmitted || B.length !== 0 || (B.endEmitted = !0, G.readable = !1, G.emit("end"));
  24839. }
  24840. function N(B, G) {
  24841. for (var w = 0, W = B.length; w < W; w++) if (B[w] === G) return w;
  24842. return -1;
  24843. }
  24844. return h.prototype.read = function(B) {
  24845. n("read", B), B = parseInt(B, 10);
  24846. var G = this._readableState, w = B;
  24847. if (B !== 0 && (G.emittedReadable = !1), B === 0 && G.needReadable && (G.length >= G.highWaterMark || G.ended)) return n("read: emitReadable", G.length, G.ended), G.length === 0 && G.ended ? K(this) : p(this), null;
  24848. if ((B = Z(B, G)) === 0 && G.ended) return G.length === 0 && K(this), null;
  24849. var W, y = G.needReadable;
  24850. return n("need readable", y), (G.length === 0 || G.length - B < G.highWaterMark) && n("length less than watermark", y = !0), G.ended || G.reading ? n("reading or ended", y = !1) : y && (n("do read"), G.reading = !0, G.sync = !0, G.length === 0 && (G.needReadable = !0), this._read(G.highWaterMark), G.sync = !1, G.reading || (B = Z(w, G))), (W = B > 0 ? v(B, G) : null) === null ? (G.needReadable = !0, B = 0) : G.length -= B, G.length === 0 && (G.ended || (G.needReadable = !0), w !== B && G.ended && K(this)), W !== null && this.emit("data", W), W;
  24851. }, h.prototype._read = function(B) {
  24852. this.emit("error", new Error("_read() is not implemented"));
  24853. }, h.prototype.pipe = function(B, G) {
  24854. var w = this, W = this._readableState;
  24855. switch (W.pipesCount) {
  24856. case 0:
  24857. W.pipes = B;
  24858. break;
  24859. case 1:
  24860. W.pipes = [W.pipes, B];
  24861. break;
  24862. default:
  24863. W.pipes.push(B);
  24864. }
  24865. W.pipesCount += 1, n("pipe count=%d opts=%j", W.pipesCount, G);
  24866. var y = (!G || G.end !== !1) && B !== ld.stdout && B !== ld.stderr ? D : k;
  24867. function f(j, q) {
  24868. n("onunpipe"), j === w && q && q.hasUnpiped === !1 && (q.hasUnpiped = !0, n("cleanup"), B.removeListener("close", E), B.removeListener("finish", J), B.removeListener("drain", F), B.removeListener("error", L), B.removeListener("unpipe", f), w.removeListener("end", D), w.removeListener("end", k), w.removeListener("data", P), T = !0, !W.awaitDrain || B._writableState && !B._writableState.needDrain || F());
  24869. }
  24870. function D() {
  24871. n("onend"), B.end();
  24872. }
  24873. W.endEmitted ? t.nextTick(y) : w.once("end", y), B.on("unpipe", f);
  24874. var F = /* @__PURE__ */ function(j) {
  24875. return function() {
  24876. var q = j._readableState;
  24877. n("pipeOnDrain", q.awaitDrain), q.awaitDrain && q.awaitDrain--, q.awaitDrain === 0 && C(j, "data") && (q.flowing = !0, z(j));
  24878. };
  24879. }(w);
  24880. B.on("drain", F);
  24881. var T = !1, Q = !1;
  24882. function P(j) {
  24883. n("ondata"), Q = !1, B.write(j) !== !1 || Q || ((W.pipesCount === 1 && W.pipes === B || W.pipesCount > 1 && N(W.pipes, B) !== -1) && !T && (n("false write response, pause", w._readableState.awaitDrain), w._readableState.awaitDrain++, Q = !0), w.pause());
  24884. }
  24885. function L(j) {
  24886. n("onerror", j), k(), B.removeListener("error", L), C(B, "error") === 0 && B.emit("error", j);
  24887. }
  24888. function E() {
  24889. B.removeListener("finish", J), k();
  24890. }
  24891. function J() {
  24892. n("onfinish"), B.removeListener("close", E), k();
  24893. }
  24894. function k() {
  24895. n("unpipe"), w.unpipe(B);
  24896. }
  24897. return w.on("data", P), function(j, q, Cg) {
  24898. if (typeof j.prependListener == "function") return j.prependListener(q, Cg);
  24899. j._events && j._events[q] ? g(j._events[q]) ? j._events[q].unshift(Cg) : j._events[q] = [Cg, j._events[q]] : j.on(q, Cg);
  24900. }(B, "error", L), B.once("close", E), B.once("finish", J), B.emit("pipe", w), W.flowing || (n("pipe resume"), w.resume()), B;
  24901. }, h.prototype.unpipe = function(B) {
  24902. var G = this._readableState, w = { hasUnpiped: !1 };
  24903. if (G.pipesCount === 0) return this;
  24904. if (G.pipesCount === 1) return B && B !== G.pipes || (B || (B = G.pipes), G.pipes = null, G.pipesCount = 0, G.flowing = !1, B && B.emit("unpipe", this, w)), this;
  24905. if (!B) {
  24906. var W = G.pipes, y = G.pipesCount;
  24907. G.pipes = null, G.pipesCount = 0, G.flowing = !1;
  24908. for (var f = 0; f < y; f++) W[f].emit("unpipe", this, w);
  24909. return this;
  24910. }
  24911. var D = N(G.pipes, B);
  24912. return D === -1 || (G.pipes.splice(D, 1), G.pipesCount -= 1, G.pipesCount === 1 && (G.pipes = G.pipes[0]), B.emit("unpipe", this, w)), this;
  24913. }, h.prototype.on = function(B, G) {
  24914. var w = i.prototype.on.call(this, B, G);
  24915. if (B === "data") this._readableState.flowing !== !1 && this.resume();
  24916. else if (B === "readable") {
  24917. var W = this._readableState;
  24918. W.endEmitted || W.readableListening || (W.readableListening = W.needReadable = !0, W.emittedReadable = !1, W.reading ? W.length && p(this) : t.nextTick(H, this));
  24919. }
  24920. return w;
  24921. }, h.prototype.addListener = h.prototype.on, h.prototype.resume = function() {
  24922. var B = this._readableState;
  24923. return B.flowing || (n("resume"), B.flowing = !0, function(G, w) {
  24924. w.resumeScheduled || (w.resumeScheduled = !0, t.nextTick(S, G, w));
  24925. }(this, B)), this;
  24926. }, h.prototype.pause = function() {
  24927. return n("call pause flowing=%j", this._readableState.flowing), this._readableState.flowing !== !1 && (n("pause"), this._readableState.flowing = !1, this.emit("pause")), this;
  24928. }, h.prototype.wrap = function(B) {
  24929. var G = this, w = this._readableState, W = !1;
  24930. for (var y in B.on("end", function() {
  24931. if (n("wrapped end"), w.decoder && !w.ended) {
  24932. var D = w.decoder.end();
  24933. D && D.length && G.push(D);
  24934. }
  24935. G.push(null);
  24936. }), B.on("data", function(D) {
  24937. n("wrapped data"), w.decoder && (D = w.decoder.write(D)), w.objectMode && D == null || (w.objectMode || D && D.length) && (G.push(D) || (W = !0, B.pause()));
  24938. }), B) this[y] === void 0 && typeof B[y] == "function" && (this[y] = /* @__PURE__ */ function(D) {
  24939. return function() {
  24940. return B[D].apply(B, arguments);
  24941. };
  24942. }(y));
  24943. for (var f = 0; f < c.length; f++) B.on(c[f], this.emit.bind(this, c[f]));
  24944. return this._read = function(D) {
  24945. n("wrapped _read", D), W && (W = !1, B.resume());
  24946. }, this;
  24947. }, Object.defineProperty(h.prototype, "readableHighWaterMark", { enumerable: !1, get: function() {
  24948. return this._readableState.highWaterMark;
  24949. } }), h._fromList = v, oX;
  24950. }
  24951. function d_() {
  24952. if (n_) return cX;
  24953. n_ = 1, cX = C;
  24954. var t = y0(), I = Object.create(bG());
  24955. function g(A, s) {
  24956. var l = this._transformState;
  24957. l.transforming = !1;
  24958. var n = l.writecb;
  24959. if (!n) return this.emit("error", new Error("write callback called multiple times"));
  24960. l.writechunk = null, l.writecb = null, s != null && this.push(s), n(A);
  24961. var a = this._readableState;
  24962. a.reading = !1, (a.needReadable || a.length < a.highWaterMark) && this._read(a.highWaterMark);
  24963. }
  24964. function C(A) {
  24965. if (!(this instanceof C)) return new C(A);
  24966. t.call(this, A), this._transformState = { afterTransform: g.bind(this), needTransform: !1, transforming: !1, writecb: null, writechunk: null, writeencoding: null }, this._readableState.needReadable = !0, this._readableState.sync = !1, A && (typeof A.transform == "function" && (this._transform = A.transform), typeof A.flush == "function" && (this._flush = A.flush)), this.on("prefinish", i);
  24967. }
  24968. function i() {
  24969. var A = this;
  24970. typeof this._flush == "function" ? this._flush(function(s, l) {
  24971. e(A, s, l);
  24972. }) : e(this, null, null);
  24973. }
  24974. function e(A, s, l) {
  24975. if (s) return A.emit("error", s);
  24976. if (l != null && A.push(l), A._writableState.length) throw new Error("Calling transform done when ws.length != 0");
  24977. if (A._transformState.transforming) throw new Error("Calling transform done when still transforming");
  24978. return A.push(null);
  24979. }
  24980. return I.inherits = uG(), I.inherits(C, t), C.prototype.push = function(A, s) {
  24981. return this._transformState.needTransform = !1, t.prototype.push.call(this, A, s);
  24982. }, C.prototype._transform = function(A, s, l) {
  24983. throw new Error("_transform() is not implemented");
  24984. }, C.prototype._write = function(A, s, l) {
  24985. var n = this._transformState;
  24986. if (n.writecb = l, n.writechunk = A, n.writeencoding = s, !n.transforming) {
  24987. var a = this._readableState;
  24988. (n.needTransform || a.needReadable || a.length < a.highWaterMark) && this._read(a.highWaterMark);
  24989. }
  24990. }, C.prototype._read = function(A) {
  24991. var s = this._transformState;
  24992. s.writechunk !== null && s.writecb && !s.transforming ? (s.transforming = !0, this._transform(s.writechunk, s.writeencoding, s.afterTransform)) : s.needTransform = !0;
  24993. }, C.prototype._destroy = function(A, s) {
  24994. var l = this;
  24995. t.prototype._destroy.call(this, A, function(n) {
  24996. s(n), l.emit("close");
  24997. });
  24998. }, cX;
  24999. }
  25000. function kCg() {
  25001. return o_ || (o_ = 1, function(t, I) {
  25002. var g = HCg;
  25003. ld.env.READABLE_STREAM === "disable" && g ? (t.exports = g, (I = t.exports = g.Readable).Readable = g.Readable, I.Writable = g.Writable, I.Duplex = g.Duplex, I.Transform = g.Transform, I.PassThrough = g.PassThrough, I.Stream = g) : ((I = t.exports = FCg()).Stream = g || I, I.Readable = I, I.Writable = KCg(), I.Duplex = y0(), I.Transform = d_(), I.PassThrough = function() {
  25004. if (a_) return dX;
  25005. a_ = 1, dX = e;
  25006. var C = d_(), i = Object.create(bG());
  25007. function e(A) {
  25008. if (!(this instanceof e)) return new e(A);
  25009. C.call(this, A);
  25010. }
  25011. return i.inherits = uG(), i.inherits(e, C), e.prototype._transform = function(A, s, l) {
  25012. l(null, A);
  25013. }, dX;
  25014. }());
  25015. }(_H, _H.exports)), _H.exports;
  25016. }
  25017. if (rt.base64 = !0, rt.array = !0, rt.string = !0, rt.arraybuffer = typeof ArrayBuffer < "u" && typeof Uint8Array < "u", rt.nodebuffer = !0, rt.uint8array = typeof Uint8Array < "u", typeof ArrayBuffer > "u") rt.blob = !1;
  25018. else {
  25019. var r_ = new ArrayBuffer(0);
  25020. try {
  25021. rt.blob = new Blob([r_], { type: "application/zip" }).size === 0;
  25022. } catch {
  25023. try {
  25024. var h_ = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
  25025. h_.append(r_), rt.blob = h_.getBlob("application/zip").size === 0;
  25026. } catch {
  25027. rt.blob = !1;
  25028. }
  25029. }
  25030. }
  25031. try {
  25032. rt.nodestream = !!kCg().Readable;
  25033. } catch {
  25034. rt.nodestream = !1;
  25035. }
  25036. var b_, PY = {};
  25037. function zCg() {
  25038. if (b_) return PY;
  25039. b_ = 1;
  25040. var t = gt(), I = rt, g = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  25041. return PY.encode = function(C) {
  25042. for (var i, e, A, s, l, n, a, d = [], o = 0, c = C.length, r = c, h = t.getTypeOf(C) !== "string"; o < C.length; ) r = c - o, h ? (i = C[o++], e = o < c ? C[o++] : 0, A = o < c ? C[o++] : 0) : (i = C.charCodeAt(o++), e = o < c ? C.charCodeAt(o++) : 0, A = o < c ? C.charCodeAt(o++) : 0), s = i >> 2, l = (3 & i) << 4 | e >> 4, n = r > 1 ? (15 & e) << 2 | A >> 6 : 64, a = r > 2 ? 63 & A : 64, d.push(g.charAt(s) + g.charAt(l) + g.charAt(n) + g.charAt(a));
  25043. return d.join("");
  25044. }, PY.decode = function(C) {
  25045. var i, e, A, s, l, n, a = 0, d = 0, o = "data:";
  25046. if (C.substr(0, o.length) === o) throw new Error("Invalid base64 input, it looks like a data url.");
  25047. var c, r = 3 * (C = C.replace(/[^A-Za-z0-9+/=]/g, "")).length / 4;
  25048. if (C.charAt(C.length - 1) === g.charAt(64) && r--, C.charAt(C.length - 2) === g.charAt(64) && r--, r % 1 != 0) throw new Error("Invalid base64 input, bad content length.");
  25049. for (c = I.uint8array ? new Uint8Array(0 | r) : new Array(0 | r); a < C.length; ) i = g.indexOf(C.charAt(a++)) << 2 | (s = g.indexOf(C.charAt(a++))) >> 4, e = (15 & s) << 4 | (l = g.indexOf(C.charAt(a++))) >> 2, A = (3 & l) << 6 | (n = g.indexOf(C.charAt(a++))), c[d++] = i, l !== 64 && (c[d++] = e), n !== 64 && (c[d++] = A);
  25050. return c;
  25051. }, PY;
  25052. }
  25053. var u_, m_, hX, Z_, cM = { isNode: !0, newBufferFrom: function(t, I) {
  25054. if (Hg.from && Hg.from !== Uint8Array.from) return Hg.from(t, I);
  25055. if (typeof t == "number") throw new Error('The "data" argument must not be a number');
  25056. return new Hg(t, I);
  25057. }, allocBuffer: function(t) {
  25058. if (Hg.alloc) return Hg.alloc(t);
  25059. var I = new Hg(t);
  25060. return I.fill(0), I;
  25061. }, isBuffer: function(t) {
  25062. return dG(t);
  25063. }, isStream: function(t) {
  25064. return t && typeof t.on == "function" && typeof t.pause == "function" && typeof t.resume == "function";
  25065. } }, JCg = null;
  25066. JCg = typeof Promise < "u" ? Promise : function() {
  25067. if (Z_) return hX;
  25068. Z_ = 1;
  25069. var t = function() {
  25070. if (m_) return u_;
  25071. m_ = 1;
  25072. var o, c, r = oe.MutationObserver || oe.WebKitMutationObserver;
  25073. if (r) {
  25074. var h = 0, b = new r(p), u = oe.document.createTextNode("");
  25075. b.observe(u, { characterData: !0 }), o = function() {
  25076. u.data = h = ++h % 2;
  25077. };
  25078. } else if (oe.setImmediate || oe.MessageChannel === void 0) o = "document" in oe && "onreadystatechange" in oe.document.createElement("script") ? function() {
  25079. var Y = oe.document.createElement("script");
  25080. Y.onreadystatechange = function() {
  25081. p(), Y.onreadystatechange = null, Y.parentNode.removeChild(Y), Y = null;
  25082. }, oe.document.documentElement.appendChild(Y);
  25083. } : function() {
  25084. setTimeout(p, 0);
  25085. };
  25086. else {
  25087. var m = new oe.MessageChannel();
  25088. m.port1.onmessage = p, o = function() {
  25089. m.port2.postMessage(0);
  25090. };
  25091. }
  25092. var Z = [];
  25093. function p() {
  25094. var Y, R;
  25095. c = !0;
  25096. for (var X = Z.length; X; ) {
  25097. for (R = Z, Z = [], Y = -1; ++Y < X; ) R[Y]();
  25098. X = Z.length;
  25099. }
  25100. c = !1;
  25101. }
  25102. return u_ = function(Y) {
  25103. Z.push(Y) !== 1 || c || o();
  25104. };
  25105. }();
  25106. function I() {
  25107. }
  25108. var g = {}, C = ["REJECTED"], i = ["FULFILLED"], e = ["PENDING"];
  25109. function A(o) {
  25110. if (typeof o != "function") throw new TypeError("resolver must be a function");
  25111. this.state = e, this.queue = [], this.outcome = void 0, o !== I && a(this, o);
  25112. }
  25113. function s(o, c, r) {
  25114. this.promise = o, typeof c == "function" && (this.onFulfilled = c, this.callFulfilled = this.otherCallFulfilled), typeof r == "function" && (this.onRejected = r, this.callRejected = this.otherCallRejected);
  25115. }
  25116. function l(o, c, r) {
  25117. t(function() {
  25118. var h;
  25119. try {
  25120. h = c(r);
  25121. } catch (b) {
  25122. return g.reject(o, b);
  25123. }
  25124. h === o ? g.reject(o, new TypeError("Cannot resolve promise with itself")) : g.resolve(o, h);
  25125. });
  25126. }
  25127. function n(o) {
  25128. var c = o && o.then;
  25129. if (o && (typeof o == "object" || typeof o == "function") && typeof c == "function") return function() {
  25130. c.apply(o, arguments);
  25131. };
  25132. }
  25133. function a(o, c) {
  25134. var r = !1;
  25135. function h(m) {
  25136. r || (r = !0, g.reject(o, m));
  25137. }
  25138. function b(m) {
  25139. r || (r = !0, g.resolve(o, m));
  25140. }
  25141. var u = d(function() {
  25142. c(b, h);
  25143. });
  25144. u.status === "error" && h(u.value);
  25145. }
  25146. function d(o, c) {
  25147. var r = {};
  25148. try {
  25149. r.value = o(c), r.status = "success";
  25150. } catch (h) {
  25151. r.status = "error", r.value = h;
  25152. }
  25153. return r;
  25154. }
  25155. return hX = A, A.prototype.finally = function(o) {
  25156. if (typeof o != "function") return this;
  25157. var c = this.constructor;
  25158. return this.then(function(r) {
  25159. return c.resolve(o()).then(function() {
  25160. return r;
  25161. });
  25162. }, function(r) {
  25163. return c.resolve(o()).then(function() {
  25164. throw r;
  25165. });
  25166. });
  25167. }, A.prototype.catch = function(o) {
  25168. return this.then(null, o);
  25169. }, A.prototype.then = function(o, c) {
  25170. if (typeof o != "function" && this.state === i || typeof c != "function" && this.state === C) return this;
  25171. var r = new this.constructor(I);
  25172. return this.state !== e ? l(r, this.state === i ? o : c, this.outcome) : this.queue.push(new s(r, o, c)), r;
  25173. }, s.prototype.callFulfilled = function(o) {
  25174. g.resolve(this.promise, o);
  25175. }, s.prototype.otherCallFulfilled = function(o) {
  25176. l(this.promise, this.onFulfilled, o);
  25177. }, s.prototype.callRejected = function(o) {
  25178. g.reject(this.promise, o);
  25179. }, s.prototype.otherCallRejected = function(o) {
  25180. l(this.promise, this.onRejected, o);
  25181. }, g.resolve = function(o, c) {
  25182. var r = d(n, c);
  25183. if (r.status === "error") return g.reject(o, r.value);
  25184. var h = r.value;
  25185. if (h) a(o, h);
  25186. else {
  25187. o.state = i, o.outcome = c;
  25188. for (var b = -1, u = o.queue.length; ++b < u; ) o.queue[b].callFulfilled(c);
  25189. }
  25190. return o;
  25191. }, g.reject = function(o, c) {
  25192. o.state = C, o.outcome = c;
  25193. for (var r = -1, h = o.queue.length; ++r < h; ) o.queue[r].callRejected(c);
  25194. return o;
  25195. }, A.resolve = function(o) {
  25196. return o instanceof this ? o : g.resolve(new this(I), o);
  25197. }, A.reject = function(o) {
  25198. var c = new this(I);
  25199. return g.reject(c, o);
  25200. }, A.all = function(o) {
  25201. var c = this;
  25202. if (Object.prototype.toString.call(o) !== "[object Array]") return this.reject(new TypeError("must be an array"));
  25203. var r = o.length, h = !1;
  25204. if (!r) return this.resolve([]);
  25205. for (var b = new Array(r), u = 0, m = -1, Z = new this(I); ++m < r; ) p(o[m], m);
  25206. return Z;
  25207. function p(Y, R) {
  25208. c.resolve(Y).then(function(X) {
  25209. b[R] = X, ++u !== r || h || (h = !0, g.resolve(Z, b));
  25210. }, function(X) {
  25211. h || (h = !0, g.reject(Z, X));
  25212. });
  25213. }
  25214. }, A.race = function(o) {
  25215. var c = this;
  25216. if (Object.prototype.toString.call(o) !== "[object Array]") return this.reject(new TypeError("must be an array"));
  25217. var r = o.length, h = !1;
  25218. if (!r) return this.resolve([]);
  25219. for (var b, u = -1, m = new this(I); ++u < r; ) b = o[u], c.resolve(b).then(function(Z) {
  25220. h || (h = !0, g.resolve(m, Z));
  25221. }, function(Z) {
  25222. h || (h = !0, g.reject(m, Z));
  25223. });
  25224. return m;
  25225. }, hX;
  25226. }();
  25227. var G_, mG = { Promise: JCg };
  25228. function gt() {
  25229. return G_ || (G_ = 1, function(t) {
  25230. var I = rt, g = zCg(), C = cM, i = mG;
  25231. function e(d) {
  25232. return d;
  25233. }
  25234. function A(d, o) {
  25235. for (var c = 0; c < d.length; ++c) o[c] = 255 & d.charCodeAt(c);
  25236. return o;
  25237. }
  25238. t.newBlob = function(d, o) {
  25239. t.checkSupport("blob");
  25240. try {
  25241. return new Blob([d], { type: o });
  25242. } catch {
  25243. try {
  25244. var c = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
  25245. return c.append(d), c.getBlob(o);
  25246. } catch {
  25247. throw new Error("Bug : can't construct the Blob.");
  25248. }
  25249. }
  25250. };
  25251. var s = { stringifyByChunk: function(d, o, c) {
  25252. var r = [], h = 0, b = d.length;
  25253. if (b <= c) return String.fromCharCode.apply(null, d);
  25254. for (; h < b; ) o === "array" || o === "nodebuffer" ? r.push(String.fromCharCode.apply(null, d.slice(h, Math.min(h + c, b)))) : r.push(String.fromCharCode.apply(null, d.subarray(h, Math.min(h + c, b)))), h += c;
  25255. return r.join("");
  25256. }, stringifyByChar: function(d) {
  25257. for (var o = "", c = 0; c < d.length; c++) o += String.fromCharCode(d[c]);
  25258. return o;
  25259. }, applyCanBeUsed: { uint8array: function() {
  25260. try {
  25261. return I.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;
  25262. } catch {
  25263. return !1;
  25264. }
  25265. }(), nodebuffer: function() {
  25266. try {
  25267. return I.nodebuffer && String.fromCharCode.apply(null, C.allocBuffer(1)).length === 1;
  25268. } catch {
  25269. return !1;
  25270. }
  25271. }() } };
  25272. function l(d) {
  25273. var o = 65536, c = t.getTypeOf(d), r = !0;
  25274. if (c === "uint8array" ? r = s.applyCanBeUsed.uint8array : c === "nodebuffer" && (r = s.applyCanBeUsed.nodebuffer), r) for (; o > 1; ) try {
  25275. return s.stringifyByChunk(d, c, o);
  25276. } catch {
  25277. o = Math.floor(o / 2);
  25278. }
  25279. return s.stringifyByChar(d);
  25280. }
  25281. function n(d, o) {
  25282. for (var c = 0; c < d.length; c++) o[c] = d[c];
  25283. return o;
  25284. }
  25285. t.applyFromCharCode = l;
  25286. var a = {};
  25287. a.string = { string: e, array: function(d) {
  25288. return A(d, new Array(d.length));
  25289. }, arraybuffer: function(d) {
  25290. return a.string.uint8array(d).buffer;
  25291. }, uint8array: function(d) {
  25292. return A(d, new Uint8Array(d.length));
  25293. }, nodebuffer: function(d) {
  25294. return A(d, C.allocBuffer(d.length));
  25295. } }, a.array = { string: l, array: e, arraybuffer: function(d) {
  25296. return new Uint8Array(d).buffer;
  25297. }, uint8array: function(d) {
  25298. return new Uint8Array(d);
  25299. }, nodebuffer: function(d) {
  25300. return C.newBufferFrom(d);
  25301. } }, a.arraybuffer = { string: function(d) {
  25302. return l(new Uint8Array(d));
  25303. }, array: function(d) {
  25304. return n(new Uint8Array(d), new Array(d.byteLength));
  25305. }, arraybuffer: e, uint8array: function(d) {
  25306. return new Uint8Array(d);
  25307. }, nodebuffer: function(d) {
  25308. return C.newBufferFrom(new Uint8Array(d));
  25309. } }, a.uint8array = { string: l, array: function(d) {
  25310. return n(d, new Array(d.length));
  25311. }, arraybuffer: function(d) {
  25312. return d.buffer;
  25313. }, uint8array: e, nodebuffer: function(d) {
  25314. return C.newBufferFrom(d);
  25315. } }, a.nodebuffer = { string: l, array: function(d) {
  25316. return n(d, new Array(d.length));
  25317. }, arraybuffer: function(d) {
  25318. return a.nodebuffer.uint8array(d).buffer;
  25319. }, uint8array: function(d) {
  25320. return n(d, new Uint8Array(d.length));
  25321. }, nodebuffer: e }, t.transformTo = function(d, o) {
  25322. if (o || (o = ""), !d) return o;
  25323. t.checkSupport(d);
  25324. var c = t.getTypeOf(o);
  25325. return a[c][d](o);
  25326. }, t.resolve = function(d) {
  25327. for (var o = d.split("/"), c = [], r = 0; r < o.length; r++) {
  25328. var h = o[r];
  25329. h === "." || h === "" && r !== 0 && r !== o.length - 1 || (h === ".." ? c.pop() : c.push(h));
  25330. }
  25331. return c.join("/");
  25332. }, t.getTypeOf = function(d) {
  25333. return typeof d == "string" ? "string" : Object.prototype.toString.call(d) === "[object Array]" ? "array" : I.nodebuffer && C.isBuffer(d) ? "nodebuffer" : I.uint8array && d instanceof Uint8Array ? "uint8array" : I.arraybuffer && d instanceof ArrayBuffer ? "arraybuffer" : void 0;
  25334. }, t.checkSupport = function(d) {
  25335. if (!I[d.toLowerCase()]) throw new Error(d + " is not supported by this platform");
  25336. }, t.MAX_VALUE_16BITS = 65535, t.MAX_VALUE_32BITS = -1, t.pretty = function(d) {
  25337. var o, c, r = "";
  25338. for (c = 0; c < (d || "").length; c++) r += "\\x" + ((o = d.charCodeAt(c)) < 16 ? "0" : "") + o.toString(16).toUpperCase();
  25339. return r;
  25340. }, t.delay = function(d, o, c) {
  25341. setImmediate(function() {
  25342. d.apply(c || null, o || []);
  25343. });
  25344. }, t.inherits = function(d, o) {
  25345. var c = function() {
  25346. };
  25347. c.prototype = o.prototype, d.prototype = new c();
  25348. }, t.extend = function() {
  25349. var d, o, c = {};
  25350. for (d = 0; d < arguments.length; d++) for (o in arguments[d]) Object.prototype.hasOwnProperty.call(arguments[d], o) && c[o] === void 0 && (c[o] = arguments[d][o]);
  25351. return c;
  25352. }, t.prepareContent = function(d, o, c, r, h) {
  25353. return i.Promise.resolve(o).then(function(b) {
  25354. return I.blob && (b instanceof Blob || ["[object File]", "[object Blob]"].indexOf(Object.prototype.toString.call(b)) !== -1) && typeof FileReader < "u" ? new i.Promise(function(u, m) {
  25355. var Z = new FileReader();
  25356. Z.onload = function(p) {
  25357. u(p.target.result);
  25358. }, Z.onerror = function(p) {
  25359. m(p.target.error);
  25360. }, Z.readAsArrayBuffer(b);
  25361. }) : b;
  25362. }).then(function(b) {
  25363. var u, m = t.getTypeOf(b);
  25364. return m ? (m === "arraybuffer" ? b = t.transformTo("uint8array", b) : m === "string" && (h ? b = g.decode(b) : c && r !== !0 && (b = A(u = b, I.uint8array ? new Uint8Array(u.length) : new Array(u.length)))), b) : i.Promise.reject(new Error("Can't read the data of '" + d + "'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?"));
  25365. });
  25366. };
  25367. }(y8)), y8;
  25368. }
  25369. function LCg(t) {
  25370. this.name = t || "default", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;
  25371. }
  25372. (function(t, I) {
  25373. if (!t.setImmediate) {
  25374. var g, C, i, e, A, s = 1, l = {}, n = !1, a = t.document, d = Object.getPrototypeOf && Object.getPrototypeOf(t);
  25375. d = d && d.setTimeout ? d : t, {}.toString.call(t.process) === "[object process]" ? g = function(r) {
  25376. vt(function() {
  25377. c(r);
  25378. });
  25379. } : function() {
  25380. if (t.postMessage && !t.importScripts) {
  25381. var r = !0, h = t.onmessage;
  25382. return t.onmessage = function() {
  25383. r = !1;
  25384. }, t.postMessage("", "*"), t.onmessage = h, r;
  25385. }
  25386. }() ? (e = "setImmediate$" + Math.random() + "$", A = function(r) {
  25387. r.source === t && typeof r.data == "string" && r.data.indexOf(e) === 0 && c(+r.data.slice(e.length));
  25388. }, t.addEventListener ? t.addEventListener("message", A, !1) : t.attachEvent("onmessage", A), g = function(r) {
  25389. t.postMessage(e + r, "*");
  25390. }) : t.MessageChannel ? ((i = new MessageChannel()).port1.onmessage = function(r) {
  25391. c(r.data);
  25392. }, g = function(r) {
  25393. i.port2.postMessage(r);
  25394. }) : a && "onreadystatechange" in a.createElement("script") ? (C = a.documentElement, g = function(r) {
  25395. var h = a.createElement("script");
  25396. h.onreadystatechange = function() {
  25397. c(r), h.onreadystatechange = null, C.removeChild(h), h = null;
  25398. }, C.appendChild(h);
  25399. }) : g = function(r) {
  25400. setTimeout(c, 0, r);
  25401. }, d.setImmediate = function(r) {
  25402. typeof r != "function" && (r = new Function("" + r));
  25403. for (var h = new Array(arguments.length - 1), b = 0; b < h.length; b++) h[b] = arguments[b + 1];
  25404. var u = { callback: r, args: h };
  25405. return l[s] = u, g(s), s++;
  25406. }, d.clearImmediate = o;
  25407. }
  25408. function o(r) {
  25409. delete l[r];
  25410. }
  25411. function c(r) {
  25412. if (n) setTimeout(c, 0, r);
  25413. else {
  25414. var h = l[r];
  25415. if (h) {
  25416. n = !0;
  25417. try {
  25418. (function(b) {
  25419. var u = b.callback, m = b.args;
  25420. switch (m.length) {
  25421. case 0:
  25422. u();
  25423. break;
  25424. case 1:
  25425. u(m[0]);
  25426. break;
  25427. case 2:
  25428. u(m[0], m[1]);
  25429. break;
  25430. case 3:
  25431. u(m[0], m[1], m[2]);
  25432. break;
  25433. default:
  25434. u.apply(void 0, m);
  25435. }
  25436. })(h);
  25437. } finally {
  25438. o(r), n = !1;
  25439. }
  25440. }
  25441. }
  25442. }
  25443. })(typeof self > "u" ? oe : self), LCg.prototype = { push: function(t) {
  25444. this.emit("data", t);
  25445. }, end: function() {
  25446. if (this.isFinished) return !1;
  25447. this.flush();
  25448. try {
  25449. this.emit("end"), this.cleanUp(), this.isFinished = !0;
  25450. } catch (t) {
  25451. this.emit("error", t);
  25452. }
  25453. return !0;
  25454. }, error: function(t) {
  25455. return !this.isFinished && (this.isPaused ? this.generatedError = t : (this.isFinished = !0, this.emit("error", t), this.previous && this.previous.error(t), this.cleanUp()), !0);
  25456. }, on: function(t, I) {
  25457. return this._listeners[t].push(I), this;
  25458. }, cleanUp: function() {
  25459. this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];
  25460. }, emit: function(t, I) {
  25461. if (this._listeners[t]) for (var g = 0; g < this._listeners[t].length; g++) this._listeners[t][g].call(this, I);
  25462. }, pipe: function(t) {
  25463. return t.registerPrevious(this);
  25464. }, registerPrevious: function(t) {
  25465. if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
  25466. this.streamInfo = t.streamInfo, this.mergeStreamInfo(), this.previous = t;
  25467. var I = this;
  25468. return t.on("data", function(g) {
  25469. I.processChunk(g);
  25470. }), t.on("end", function() {
  25471. I.end();
  25472. }), t.on("error", function(g) {
  25473. I.error(g);
  25474. }), this;
  25475. }, pause: function() {
  25476. return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);
  25477. }, resume: function() {
  25478. if (!this.isPaused || this.isFinished) return !1;
  25479. this.isPaused = !1;
  25480. var t = !1;
  25481. return this.generatedError && (this.error(this.generatedError), t = !0), this.previous && this.previous.resume(), !t;
  25482. }, flush: function() {
  25483. }, processChunk: function(t) {
  25484. this.push(t);
  25485. }, withStreamInfo: function(t, I) {
  25486. return this.extraStreamInfo[t] = I, this.mergeStreamInfo(), this;
  25487. }, mergeStreamInfo: function() {
  25488. for (var t in this.extraStreamInfo) Object.prototype.hasOwnProperty.call(this.extraStreamInfo, t) && (this.streamInfo[t] = this.extraStreamInfo[t]);
  25489. }, lock: function() {
  25490. if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
  25491. this.isLocked = !0, this.previous && this.previous.lock();
  25492. }, toString: function() {
  25493. var t = "Worker " + this.name;
  25494. return this.previous ? this.previous + " -> " + t : t;
  25495. } };
  25496. var eA = LCg;
  25497. (function(t) {
  25498. for (var I = gt(), g = rt, C = cM, i = eA, e = new Array(256), A = 0; A < 256; A++) e[A] = A >= 252 ? 6 : A >= 248 ? 5 : A >= 240 ? 4 : A >= 224 ? 3 : A >= 192 ? 2 : 1;
  25499. e[254] = e[254] = 1;
  25500. function s() {
  25501. i.call(this, "utf-8 decode"), this.leftOver = null;
  25502. }
  25503. function l() {
  25504. i.call(this, "utf-8 encode");
  25505. }
  25506. t.utf8encode = function(n) {
  25507. return g.nodebuffer ? C.newBufferFrom(n, "utf-8") : function(a) {
  25508. var d, o, c, r, h, b = a.length, u = 0;
  25509. for (r = 0; r < b; r++) (64512 & (o = a.charCodeAt(r))) == 55296 && r + 1 < b && (64512 & (c = a.charCodeAt(r + 1))) == 56320 && (o = 65536 + (o - 55296 << 10) + (c - 56320), r++), u += o < 128 ? 1 : o < 2048 ? 2 : o < 65536 ? 3 : 4;
  25510. for (d = g.uint8array ? new Uint8Array(u) : new Array(u), h = 0, r = 0; h < u; r++) (64512 & (o = a.charCodeAt(r))) == 55296 && r + 1 < b && (64512 & (c = a.charCodeAt(r + 1))) == 56320 && (o = 65536 + (o - 55296 << 10) + (c - 56320), r++), o < 128 ? d[h++] = o : o < 2048 ? (d[h++] = 192 | o >>> 6, d[h++] = 128 | 63 & o) : o < 65536 ? (d[h++] = 224 | o >>> 12, d[h++] = 128 | o >>> 6 & 63, d[h++] = 128 | 63 & o) : (d[h++] = 240 | o >>> 18, d[h++] = 128 | o >>> 12 & 63, d[h++] = 128 | o >>> 6 & 63, d[h++] = 128 | 63 & o);
  25511. return d;
  25512. }(n);
  25513. }, t.utf8decode = function(n) {
  25514. return g.nodebuffer ? I.transformTo("nodebuffer", n).toString("utf-8") : function(a) {
  25515. var d, o, c, r, h = a.length, b = new Array(2 * h);
  25516. for (o = 0, d = 0; d < h; ) if ((c = a[d++]) < 128) b[o++] = c;
  25517. else if ((r = e[c]) > 4) b[o++] = 65533, d += r - 1;
  25518. else {
  25519. for (c &= r === 2 ? 31 : r === 3 ? 15 : 7; r > 1 && d < h; ) c = c << 6 | 63 & a[d++], r--;
  25520. r > 1 ? b[o++] = 65533 : c < 65536 ? b[o++] = c : (c -= 65536, b[o++] = 55296 | c >> 10 & 1023, b[o++] = 56320 | 1023 & c);
  25521. }
  25522. return b.length !== o && (b.subarray ? b = b.subarray(0, o) : b.length = o), I.applyFromCharCode(b);
  25523. }(n = I.transformTo(g.uint8array ? "uint8array" : "array", n));
  25524. }, I.inherits(s, i), s.prototype.processChunk = function(n) {
  25525. var a = I.transformTo(g.uint8array ? "uint8array" : "array", n.data);
  25526. if (this.leftOver && this.leftOver.length) {
  25527. if (g.uint8array) {
  25528. var d = a;
  25529. (a = new Uint8Array(d.length + this.leftOver.length)).set(this.leftOver, 0), a.set(d, this.leftOver.length);
  25530. } else a = this.leftOver.concat(a);
  25531. this.leftOver = null;
  25532. }
  25533. var o = function(r, h) {
  25534. var b;
  25535. for ((h = h || r.length) > r.length && (h = r.length), b = h - 1; b >= 0 && (192 & r[b]) == 128; ) b--;
  25536. return b < 0 || b === 0 ? h : b + e[r[b]] > h ? b : h;
  25537. }(a), c = a;
  25538. o !== a.length && (g.uint8array ? (c = a.subarray(0, o), this.leftOver = a.subarray(o, a.length)) : (c = a.slice(0, o), this.leftOver = a.slice(o, a.length))), this.push({ data: t.utf8decode(c), meta: n.meta });
  25539. }, s.prototype.flush = function() {
  25540. this.leftOver && this.leftOver.length && (this.push({ data: t.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);
  25541. }, t.Utf8DecodeWorker = s, I.inherits(l, i), l.prototype.processChunk = function(n) {
  25542. this.push({ data: t.utf8encode(n.data), meta: n.meta });
  25543. }, t.Utf8EncodeWorker = l;
  25544. })(M0);
  25545. var vCg = eA, w_ = gt();
  25546. function dD(t) {
  25547. vCg.call(this, "ConvertWorker to " + t), this.destType = t;
  25548. }
  25549. w_.inherits(dD, vCg), dD.prototype.processChunk = function(t) {
  25550. this.push({ data: w_.transformTo(this.destType, t.data), meta: t.meta });
  25551. };
  25552. var p_, B_, Dhg = dD, nd = gt(), Khg = Dhg, Fhg = eA, khg = zCg(), zhg = mG, TCg = null;
  25553. if (rt.nodestream) try {
  25554. TCg = function() {
  25555. if (B_) return p_;
  25556. B_ = 1;
  25557. var t = kCg().Readable;
  25558. function I(g, C, i) {
  25559. t.call(this, C), this._helper = g;
  25560. var e = this;
  25561. g.on("data", function(A, s) {
  25562. e.push(A) || e._helper.pause(), i && i(s);
  25563. }).on("error", function(A) {
  25564. e.emit("error", A);
  25565. }).on("end", function() {
  25566. e.push(null);
  25567. });
  25568. }
  25569. return gt().inherits(I, t), I.prototype._read = function() {
  25570. this._helper.resume();
  25571. }, p_ = I;
  25572. }();
  25573. } catch {
  25574. }
  25575. function Jhg(t, I) {
  25576. return new zhg.Promise(function(g, C) {
  25577. var i = [], e = t._internalType, A = t._outputType, s = t._mimeType;
  25578. t.on("data", function(l, n) {
  25579. i.push(l), I && I(n);
  25580. }).on("error", function(l) {
  25581. i = [], C(l);
  25582. }).on("end", function() {
  25583. try {
  25584. var l = function(n, a, d) {
  25585. switch (n) {
  25586. case "blob":
  25587. return nd.newBlob(nd.transformTo("arraybuffer", a), d);
  25588. case "base64":
  25589. return khg.encode(a);
  25590. default:
  25591. return nd.transformTo(n, a);
  25592. }
  25593. }(A, function(n, a) {
  25594. var d, o = 0, c = null, r = 0;
  25595. for (d = 0; d < a.length; d++) r += a[d].length;
  25596. switch (n) {
  25597. case "string":
  25598. return a.join("");
  25599. case "array":
  25600. return Array.prototype.concat.apply([], a);
  25601. case "uint8array":
  25602. for (c = new Uint8Array(r), d = 0; d < a.length; d++) c.set(a[d], o), o += a[d].length;
  25603. return c;
  25604. case "nodebuffer":
  25605. return Hg.concat(a);
  25606. default:
  25607. throw new Error("concat : unsupported type '" + n + "'");
  25608. }
  25609. }(e, i), s);
  25610. g(l);
  25611. } catch (n) {
  25612. C(n);
  25613. }
  25614. i = [];
  25615. }).resume();
  25616. });
  25617. }
  25618. function xCg(t, I, g) {
  25619. var C = I;
  25620. switch (I) {
  25621. case "blob":
  25622. case "arraybuffer":
  25623. C = "uint8array";
  25624. break;
  25625. case "base64":
  25626. C = "string";
  25627. }
  25628. try {
  25629. this._internalType = C, this._outputType = I, this._mimeType = g, nd.checkSupport(C), this._worker = t.pipe(new Khg(C)), t.lock();
  25630. } catch (i) {
  25631. this._worker = new Fhg("error"), this._worker.error(i);
  25632. }
  25633. }
  25634. xCg.prototype = { accumulate: function(t) {
  25635. return Jhg(this, t);
  25636. }, on: function(t, I) {
  25637. var g = this;
  25638. return t === "data" ? this._worker.on(t, function(C) {
  25639. I.call(g, C.data, C.meta);
  25640. }) : this._worker.on(t, function() {
  25641. nd.delay(I, arguments, g);
  25642. }), this;
  25643. }, resume: function() {
  25644. return nd.delay(this._worker.resume, [], this._worker), this;
  25645. }, pause: function() {
  25646. return this._worker.pause(), this;
  25647. }, toNodejsStream: function(t) {
  25648. if (nd.checkSupport("nodestream"), this._outputType !== "nodebuffer") throw new Error(this._outputType + " is not supported by this method");
  25649. return new TCg(this, { objectMode: this._outputType !== "nodebuffer" }, t);
  25650. } };
  25651. var jCg = xCg, QCg = { base64: !1, binary: !1, dir: !1, createFolders: !0, date: null, compression: null, compressionOptions: null, comment: null, unixPermissions: null, dosPermissions: null }, xN = gt(), jN = eA;
  25652. function gh(t) {
  25653. jN.call(this, "DataWorker");
  25654. var I = this;
  25655. this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = "", this._tickScheduled = !1, t.then(function(g) {
  25656. I.dataIsReady = !0, I.data = g, I.max = g && g.length || 0, I.type = xN.getTypeOf(g), I.isPaused || I._tickAndRepeat();
  25657. }, function(g) {
  25658. I.error(g);
  25659. });
  25660. }
  25661. xN.inherits(gh, jN), gh.prototype.cleanUp = function() {
  25662. jN.prototype.cleanUp.call(this), this.data = null;
  25663. }, gh.prototype.resume = function() {
  25664. return !!jN.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, xN.delay(this._tickAndRepeat, [], this)), !0);
  25665. }, gh.prototype._tickAndRepeat = function() {
  25666. this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (xN.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));
  25667. }, gh.prototype._tick = function() {
  25668. if (this.isPaused || this.isFinished) return !1;
  25669. var t = null, I = Math.min(this.max, this.index + 16384);
  25670. if (this.index >= this.max) return this.end();
  25671. switch (this.type) {
  25672. case "string":
  25673. t = this.data.substring(this.index, I);
  25674. break;
  25675. case "uint8array":
  25676. t = this.data.subarray(this.index, I);
  25677. break;
  25678. case "array":
  25679. case "nodebuffer":
  25680. t = this.data.slice(this.index, I);
  25681. }
  25682. return this.index = I, this.push({ data: t, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });
  25683. };
  25684. var OCg = gh, Lhg = gt(), W_ = function() {
  25685. for (var t, I = [], g = 0; g < 256; g++) {
  25686. t = g;
  25687. for (var C = 0; C < 8; C++) t = 1 & t ? 3988292384 ^ t >>> 1 : t >>> 1;
  25688. I[g] = t;
  25689. }
  25690. return I;
  25691. }(), J9 = function(t, I) {
  25692. return t !== void 0 && t.length ? Lhg.getTypeOf(t) !== "string" ? function(g, C, i, e) {
  25693. var A = W_, s = e + i;
  25694. g ^= -1;
  25695. for (var l = e; l < s; l++) g = g >>> 8 ^ A[255 & (g ^ C[l])];
  25696. return -1 ^ g;
  25697. }(0 | I, t, t.length, 0) : function(g, C, i, e) {
  25698. var A = W_, s = e + i;
  25699. g ^= -1;
  25700. for (var l = e; l < s; l++) g = g >>> 8 ^ A[255 & (g ^ C.charCodeAt(l))];
  25701. return -1 ^ g;
  25702. }(0 | I, t, t.length, 0) : 0;
  25703. }, UCg = eA, vhg = J9;
  25704. function rD() {
  25705. UCg.call(this, "Crc32Probe"), this.withStreamInfo("crc32", 0);
  25706. }
  25707. gt().inherits(rD, UCg), rD.prototype.processChunk = function(t) {
  25708. this.streamInfo.crc32 = vhg(t.data, this.streamInfo.crc32 || 0), this.push(t);
  25709. };
  25710. var ECg = rD, Thg = gt(), hD = eA;
  25711. function bD(t) {
  25712. hD.call(this, "DataLengthProbe for " + t), this.propName = t, this.withStreamInfo(t, 0);
  25713. }
  25714. Thg.inherits(bD, hD), bD.prototype.processChunk = function(t) {
  25715. if (t) {
  25716. var I = this.streamInfo[this.propName] || 0;
  25717. this.streamInfo[this.propName] = I + t.data.length;
  25718. }
  25719. hD.prototype.processChunk.call(this, t);
  25720. };
  25721. var y_ = mG, Y_ = OCg, xhg = ECg, bX = bD;
  25722. function uD(t, I, g, C, i) {
  25723. this.compressedSize = t, this.uncompressedSize = I, this.crc32 = g, this.compression = C, this.compressedContent = i;
  25724. }
  25725. uD.prototype = { getContentWorker: function() {
  25726. var t = new Y_(y_.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new bX("data_length")), I = this;
  25727. return t.on("end", function() {
  25728. if (this.streamInfo.data_length !== I.uncompressedSize) throw new Error("Bug : uncompressed data size mismatch");
  25729. }), t;
  25730. }, getCompressedWorker: function() {
  25731. return new Y_(y_.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize", this.compressedSize).withStreamInfo("uncompressedSize", this.uncompressedSize).withStreamInfo("crc32", this.crc32).withStreamInfo("compression", this.compression);
  25732. } }, uD.createWorkerFrom = function(t, I, g) {
  25733. return t.pipe(new xhg()).pipe(new bX("uncompressedSize")).pipe(I.compressWorker(g)).pipe(new bX("compressedSize")).withStreamInfo("compression", I);
  25734. };
  25735. var L9 = uD, jhg = jCg, Qhg = OCg, uX = M0, mX = L9, N_ = eA, v9 = function(t, I, g) {
  25736. this.name = t, this.dir = g.dir, this.date = g.date, this.comment = g.comment, this.unixPermissions = g.unixPermissions, this.dosPermissions = g.dosPermissions, this._data = I, this._dataBinary = g.binary, this.options = { compression: g.compression, compressionOptions: g.compressionOptions };
  25737. };
  25738. v9.prototype = { internalStream: function(t) {
  25739. var I = null, g = "string";
  25740. try {
  25741. if (!t) throw new Error("No output type specified.");
  25742. var C = (g = t.toLowerCase()) === "string" || g === "text";
  25743. g !== "binarystring" && g !== "text" || (g = "string"), I = this._decompressWorker();
  25744. var i = !this._dataBinary;
  25745. i && !C && (I = I.pipe(new uX.Utf8EncodeWorker())), !i && C && (I = I.pipe(new uX.Utf8DecodeWorker()));
  25746. } catch (e) {
  25747. (I = new N_("error")).error(e);
  25748. }
  25749. return new jhg(I, g, "");
  25750. }, async: function(t, I) {
  25751. return this.internalStream(t).accumulate(I);
  25752. }, nodeStream: function(t, I) {
  25753. return this.internalStream(t || "nodebuffer").toNodejsStream(I);
  25754. }, _compressWorker: function(t, I) {
  25755. if (this._data instanceof mX && this._data.compression.magic === t.magic) return this._data.getCompressedWorker();
  25756. var g = this._decompressWorker();
  25757. return this._dataBinary || (g = g.pipe(new uX.Utf8EncodeWorker())), mX.createWorkerFrom(g, t, I);
  25758. }, _decompressWorker: function() {
  25759. return this._data instanceof mX ? this._data.getContentWorker() : this._data instanceof N_ ? this._data : new Qhg(this._data);
  25760. } };
  25761. for (var V_ = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"], Ohg = function() {
  25762. throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
  25763. }, ZX = 0; ZX < V_.length; ZX++) v9.prototype[V_[ZX]] = Ohg;
  25764. var Uhg = v9, PCg = {}, uV = {}, QN = {}, tn = {};
  25765. (function(t) {
  25766. var I = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Int32Array < "u";
  25767. function g(e, A) {
  25768. return Object.prototype.hasOwnProperty.call(e, A);
  25769. }
  25770. t.assign = function(e) {
  25771. for (var A = Array.prototype.slice.call(arguments, 1); A.length; ) {
  25772. var s = A.shift();
  25773. if (s) {
  25774. if (typeof s != "object") throw new TypeError(s + "must be non-object");
  25775. for (var l in s) g(s, l) && (e[l] = s[l]);
  25776. }
  25777. }
  25778. return e;
  25779. }, t.shrinkBuf = function(e, A) {
  25780. return e.length === A ? e : e.subarray ? e.subarray(0, A) : (e.length = A, e);
  25781. };
  25782. var C = { arraySet: function(e, A, s, l, n) {
  25783. if (A.subarray && e.subarray) e.set(A.subarray(s, s + l), n);
  25784. else for (var a = 0; a < l; a++) e[n + a] = A[s + a];
  25785. }, flattenChunks: function(e) {
  25786. var A, s, l, n, a, d;
  25787. for (l = 0, A = 0, s = e.length; A < s; A++) l += e[A].length;
  25788. for (d = new Uint8Array(l), n = 0, A = 0, s = e.length; A < s; A++) a = e[A], d.set(a, n), n += a.length;
  25789. return d;
  25790. } }, i = { arraySet: function(e, A, s, l, n) {
  25791. for (var a = 0; a < l; a++) e[n + a] = A[s + a];
  25792. }, flattenChunks: function(e) {
  25793. return [].concat.apply([], e);
  25794. } };
  25795. t.setTyped = function(e) {
  25796. e ? (t.Buf8 = Uint8Array, t.Buf16 = Uint16Array, t.Buf32 = Int32Array, t.assign(t, C)) : (t.Buf8 = Array, t.Buf16 = Array, t.Buf32 = Array, t.assign(t, i));
  25797. }, t.setTyped(I);
  25798. })(tn);
  25799. var em = {}, rs = {}, Ih = {}, Ehg = tn;
  25800. function R0(t) {
  25801. for (var I = t.length; --I >= 0; ) t[I] = 0;
  25802. }
  25803. var mD = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], ON = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], Phg = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], M_ = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], bl = new Array(576);
  25804. R0(bl);
  25805. var Am = new Array(60);
  25806. R0(Am);
  25807. var Hm = new Array(512);
  25808. R0(Hm);
  25809. var ym = new Array(256);
  25810. R0(ym);
  25811. var T9 = new Array(29);
  25812. R0(T9);
  25813. var R_, f_, H_, mV = new Array(30);
  25814. function GX(t, I, g, C, i) {
  25815. this.static_tree = t, this.extra_bits = I, this.extra_base = g, this.elems = C, this.max_length = i, this.has_stree = t && t.length;
  25816. }
  25817. function wX(t, I) {
  25818. this.dyn_tree = t, this.max_code = 0, this.stat_desc = I;
  25819. }
  25820. function _Cg(t) {
  25821. return t < 256 ? Hm[t] : Hm[256 + (t >>> 7)];
  25822. }
  25823. function Xm(t, I) {
  25824. t.pending_buf[t.pending++] = 255 & I, t.pending_buf[t.pending++] = I >>> 8 & 255;
  25825. }
  25826. function Pi(t, I, g) {
  25827. t.bi_valid > 16 - g ? (t.bi_buf |= I << t.bi_valid & 65535, Xm(t, t.bi_buf), t.bi_buf = I >> 16 - t.bi_valid, t.bi_valid += g - 16) : (t.bi_buf |= I << t.bi_valid & 65535, t.bi_valid += g);
  25828. }
  25829. function Ds(t, I, g) {
  25830. Pi(t, g[2 * I], g[2 * I + 1]);
  25831. }
  25832. function qCg(t, I) {
  25833. var g = 0;
  25834. do
  25835. g |= 1 & t, t >>>= 1, g <<= 1;
  25836. while (--I > 0);
  25837. return g >>> 1;
  25838. }
  25839. function $Cg(t, I, g) {
  25840. var C, i, e = new Array(16), A = 0;
  25841. for (C = 1; C <= 15; C++) e[C] = A = A + g[C - 1] << 1;
  25842. for (i = 0; i <= I; i++) {
  25843. var s = t[2 * i + 1];
  25844. s !== 0 && (t[2 * i] = qCg(e[s]++, s));
  25845. }
  25846. }
  25847. function X_(t) {
  25848. var I;
  25849. for (I = 0; I < 286; I++) t.dyn_ltree[2 * I] = 0;
  25850. for (I = 0; I < 30; I++) t.dyn_dtree[2 * I] = 0;
  25851. for (I = 0; I < 19; I++) t.bl_tree[2 * I] = 0;
  25852. t.dyn_ltree[512] = 1, t.opt_len = t.static_len = 0, t.last_lit = t.matches = 0;
  25853. }
  25854. function gtg(t) {
  25855. t.bi_valid > 8 ? Xm(t, t.bi_buf) : t.bi_valid > 0 && (t.pending_buf[t.pending++] = t.bi_buf), t.bi_buf = 0, t.bi_valid = 0;
  25856. }
  25857. function S_(t, I, g, C) {
  25858. var i = 2 * I, e = 2 * g;
  25859. return t[i] < t[e] || t[i] === t[e] && C[I] <= C[g];
  25860. }
  25861. function pX(t, I, g) {
  25862. for (var C = t.heap[g], i = g << 1; i <= t.heap_len && (i < t.heap_len && S_(I, t.heap[i + 1], t.heap[i], t.depth) && i++, !S_(I, C, t.heap[i], t.depth)); ) t.heap[g] = t.heap[i], g = i, i <<= 1;
  25863. t.heap[g] = C;
  25864. }
  25865. function D_(t, I, g) {
  25866. var C, i, e, A, s = 0;
  25867. if (t.last_lit !== 0) do
  25868. C = t.pending_buf[t.d_buf + 2 * s] << 8 | t.pending_buf[t.d_buf + 2 * s + 1], i = t.pending_buf[t.l_buf + s], s++, C === 0 ? Ds(t, i, I) : (Ds(t, (e = ym[i]) + 256 + 1, I), (A = mD[e]) !== 0 && Pi(t, i -= T9[e], A), Ds(t, e = _Cg(--C), g), (A = ON[e]) !== 0 && Pi(t, C -= mV[e], A));
  25869. while (s < t.last_lit);
  25870. Ds(t, 256, I);
  25871. }
  25872. function BX(t, I) {
  25873. var g, C, i, e = I.dyn_tree, A = I.stat_desc.static_tree, s = I.stat_desc.has_stree, l = I.stat_desc.elems, n = -1;
  25874. for (t.heap_len = 0, t.heap_max = 573, g = 0; g < l; g++) e[2 * g] !== 0 ? (t.heap[++t.heap_len] = n = g, t.depth[g] = 0) : e[2 * g + 1] = 0;
  25875. for (; t.heap_len < 2; ) e[2 * (i = t.heap[++t.heap_len] = n < 2 ? ++n : 0)] = 1, t.depth[i] = 0, t.opt_len--, s && (t.static_len -= A[2 * i + 1]);
  25876. for (I.max_code = n, g = t.heap_len >> 1; g >= 1; g--) pX(t, e, g);
  25877. i = l;
  25878. do
  25879. g = t.heap[1], t.heap[1] = t.heap[t.heap_len--], pX(t, e, 1), C = t.heap[1], t.heap[--t.heap_max] = g, t.heap[--t.heap_max] = C, e[2 * i] = e[2 * g] + e[2 * C], t.depth[i] = (t.depth[g] >= t.depth[C] ? t.depth[g] : t.depth[C]) + 1, e[2 * g + 1] = e[2 * C + 1] = i, t.heap[1] = i++, pX(t, e, 1);
  25880. while (t.heap_len >= 2);
  25881. t.heap[--t.heap_max] = t.heap[1], function(a, d) {
  25882. var o, c, r, h, b, u, m = d.dyn_tree, Z = d.max_code, p = d.stat_desc.static_tree, Y = d.stat_desc.has_stree, R = d.stat_desc.extra_bits, X = d.stat_desc.extra_base, H = d.stat_desc.max_length, S = 0;
  25883. for (h = 0; h <= 15; h++) a.bl_count[h] = 0;
  25884. for (m[2 * a.heap[a.heap_max] + 1] = 0, o = a.heap_max + 1; o < 573; o++) (h = m[2 * m[2 * (c = a.heap[o]) + 1] + 1] + 1) > H && (h = H, S++), m[2 * c + 1] = h, c > Z || (a.bl_count[h]++, b = 0, c >= X && (b = R[c - X]), u = m[2 * c], a.opt_len += u * (h + b), Y && (a.static_len += u * (p[2 * c + 1] + b)));
  25885. if (S !== 0) {
  25886. do {
  25887. for (h = H - 1; a.bl_count[h] === 0; ) h--;
  25888. a.bl_count[h]--, a.bl_count[h + 1] += 2, a.bl_count[H]--, S -= 2;
  25889. } while (S > 0);
  25890. for (h = H; h !== 0; h--) for (c = a.bl_count[h]; c !== 0; ) (r = a.heap[--o]) > Z || (m[2 * r + 1] !== h && (a.opt_len += (h - m[2 * r + 1]) * m[2 * r], m[2 * r + 1] = h), c--);
  25891. }
  25892. }(t, I), $Cg(e, n, t.bl_count);
  25893. }
  25894. function K_(t, I, g) {
  25895. var C, i, e = -1, A = I[1], s = 0, l = 7, n = 4;
  25896. for (A === 0 && (l = 138, n = 3), I[2 * (g + 1) + 1] = 65535, C = 0; C <= g; C++) i = A, A = I[2 * (C + 1) + 1], ++s < l && i === A || (s < n ? t.bl_tree[2 * i] += s : i !== 0 ? (i !== e && t.bl_tree[2 * i]++, t.bl_tree[32]++) : s <= 10 ? t.bl_tree[34]++ : t.bl_tree[36]++, s = 0, e = i, A === 0 ? (l = 138, n = 3) : i === A ? (l = 6, n = 3) : (l = 7, n = 4));
  25897. }
  25898. function F_(t, I, g) {
  25899. var C, i, e = -1, A = I[1], s = 0, l = 7, n = 4;
  25900. for (A === 0 && (l = 138, n = 3), C = 0; C <= g; C++) if (i = A, A = I[2 * (C + 1) + 1], !(++s < l && i === A)) {
  25901. if (s < n) do
  25902. Ds(t, i, t.bl_tree);
  25903. while (--s != 0);
  25904. else i !== 0 ? (i !== e && (Ds(t, i, t.bl_tree), s--), Ds(t, 16, t.bl_tree), Pi(t, s - 3, 2)) : s <= 10 ? (Ds(t, 17, t.bl_tree), Pi(t, s - 3, 3)) : (Ds(t, 18, t.bl_tree), Pi(t, s - 11, 7));
  25905. s = 0, e = i, A === 0 ? (l = 138, n = 3) : i === A ? (l = 6, n = 3) : (l = 7, n = 4);
  25906. }
  25907. }
  25908. R0(mV);
  25909. var k_ = !1;
  25910. function z_(t, I, g, C) {
  25911. Pi(t, 0 + (C ? 1 : 0), 3), function(i, e, A, s) {
  25912. gtg(i), Xm(i, A), Xm(i, ~A), Ehg.arraySet(i.pending_buf, i.window, e, A, i.pending), i.pending += A;
  25913. }(t, I, g);
  25914. }
  25915. Ih._tr_init = function(t) {
  25916. k_ || (function() {
  25917. var I, g, C, i, e, A = new Array(16);
  25918. for (C = 0, i = 0; i < 28; i++) for (T9[i] = C, I = 0; I < 1 << mD[i]; I++) ym[C++] = i;
  25919. for (ym[C - 1] = i, e = 0, i = 0; i < 16; i++) for (mV[i] = e, I = 0; I < 1 << ON[i]; I++) Hm[e++] = i;
  25920. for (e >>= 7; i < 30; i++) for (mV[i] = e << 7, I = 0; I < 1 << ON[i] - 7; I++) Hm[256 + e++] = i;
  25921. for (g = 0; g <= 15; g++) A[g] = 0;
  25922. for (I = 0; I <= 143; ) bl[2 * I + 1] = 8, I++, A[8]++;
  25923. for (; I <= 255; ) bl[2 * I + 1] = 9, I++, A[9]++;
  25924. for (; I <= 279; ) bl[2 * I + 1] = 7, I++, A[7]++;
  25925. for (; I <= 287; ) bl[2 * I + 1] = 8, I++, A[8]++;
  25926. for ($Cg(bl, 287, A), I = 0; I < 30; I++) Am[2 * I + 1] = 5, Am[2 * I] = qCg(I, 5);
  25927. R_ = new GX(bl, mD, 257, 286, 15), f_ = new GX(Am, ON, 0, 30, 15), H_ = new GX(new Array(0), Phg, 0, 19, 7);
  25928. }(), k_ = !0), t.l_desc = new wX(t.dyn_ltree, R_), t.d_desc = new wX(t.dyn_dtree, f_), t.bl_desc = new wX(t.bl_tree, H_), t.bi_buf = 0, t.bi_valid = 0, X_(t);
  25929. }, Ih._tr_stored_block = z_, Ih._tr_flush_block = function(t, I, g, C) {
  25930. var i, e, A = 0;
  25931. t.level > 0 ? (t.strm.data_type === 2 && (t.strm.data_type = function(s) {
  25932. var l, n = 4093624447;
  25933. for (l = 0; l <= 31; l++, n >>>= 1) if (1 & n && s.dyn_ltree[2 * l] !== 0) return 0;
  25934. if (s.dyn_ltree[18] !== 0 || s.dyn_ltree[20] !== 0 || s.dyn_ltree[26] !== 0) return 1;
  25935. for (l = 32; l < 256; l++) if (s.dyn_ltree[2 * l] !== 0) return 1;
  25936. return 0;
  25937. }(t)), BX(t, t.l_desc), BX(t, t.d_desc), A = function(s) {
  25938. var l;
  25939. for (K_(s, s.dyn_ltree, s.l_desc.max_code), K_(s, s.dyn_dtree, s.d_desc.max_code), BX(s, s.bl_desc), l = 18; l >= 3 && s.bl_tree[2 * M_[l] + 1] === 0; l--) ;
  25940. return s.opt_len += 3 * (l + 1) + 5 + 5 + 4, l;
  25941. }(t), i = t.opt_len + 3 + 7 >>> 3, (e = t.static_len + 3 + 7 >>> 3) <= i && (i = e)) : i = e = g + 5, g + 4 <= i && I !== -1 ? z_(t, I, g, C) : t.strategy === 4 || e === i ? (Pi(t, 2 + (C ? 1 : 0), 3), D_(t, bl, Am)) : (Pi(t, 4 + (C ? 1 : 0), 3), function(s, l, n, a) {
  25942. var d;
  25943. for (Pi(s, l - 257, 5), Pi(s, n - 1, 5), Pi(s, a - 4, 4), d = 0; d < a; d++) Pi(s, s.bl_tree[2 * M_[d] + 1], 3);
  25944. F_(s, s.dyn_ltree, l - 1), F_(s, s.dyn_dtree, n - 1);
  25945. }(t, t.l_desc.max_code + 1, t.d_desc.max_code + 1, A + 1), D_(t, t.dyn_ltree, t.dyn_dtree)), X_(t), C && gtg(t);
  25946. }, Ih._tr_tally = function(t, I, g) {
  25947. return t.pending_buf[t.d_buf + 2 * t.last_lit] = I >>> 8 & 255, t.pending_buf[t.d_buf + 2 * t.last_lit + 1] = 255 & I, t.pending_buf[t.l_buf + t.last_lit] = 255 & g, t.last_lit++, I === 0 ? t.dyn_ltree[2 * g]++ : (t.matches++, I--, t.dyn_ltree[2 * (ym[g] + 256 + 1)]++, t.dyn_dtree[2 * _Cg(I)]++), t.last_lit === t.lit_bufsize - 1;
  25948. }, Ih._tr_align = function(t) {
  25949. Pi(t, 2, 3), Ds(t, 256, bl), function(I) {
  25950. I.bi_valid === 16 ? (Xm(I, I.bi_buf), I.bi_buf = 0, I.bi_valid = 0) : I.bi_valid >= 8 && (I.pending_buf[I.pending++] = 255 & I.bi_buf, I.bi_buf >>= 8, I.bi_valid -= 8);
  25951. }(t);
  25952. };
  25953. var Itg = function(t, I, g, C) {
  25954. for (var i = 65535 & t | 0, e = t >>> 16 & 65535 | 0, A = 0; g !== 0; ) {
  25955. g -= A = g > 2e3 ? 2e3 : g;
  25956. do
  25957. e = e + (i = i + I[C++] | 0) | 0;
  25958. while (--A);
  25959. i %= 65521, e %= 65521;
  25960. }
  25961. return i | e << 16 | 0;
  25962. }, _hg = function() {
  25963. for (var t, I = [], g = 0; g < 256; g++) {
  25964. t = g;
  25965. for (var C = 0; C < 8; C++) t = 1 & t ? 3988292384 ^ t >>> 1 : t >>> 1;
  25966. I[g] = t;
  25967. }
  25968. return I;
  25969. }(), Ah, Ctg = function(t, I, g, C) {
  25970. var i = _hg, e = C + g;
  25971. t ^= -1;
  25972. for (var A = C; A < e; A++) t = t >>> 8 ^ i[255 & (t ^ I[A])];
  25973. return -1 ^ t;
  25974. }, x9 = { 2: "need dictionary", 1: "stream end", 0: "", "-1": "file error", "-2": "stream error", "-3": "data error", "-4": "insufficient memory", "-5": "buffer error", "-6": "incompatible version" }, Hi = tn, IA = Ih, ttg = Itg, ta = Ctg, qhg = x9;
  25975. function Aa(t, I) {
  25976. return t.msg = qhg[I], I;
  25977. }
  25978. function J_(t) {
  25979. return (t << 1) - (t > 4 ? 9 : 0);
  25980. }
  25981. function na(t) {
  25982. for (var I = t.length; --I >= 0; ) t[I] = 0;
  25983. }
  25984. function ia(t) {
  25985. var I = t.state, g = I.pending;
  25986. g > t.avail_out && (g = t.avail_out), g !== 0 && (Hi.arraySet(t.output, I.pending_buf, I.pending_out, g, t.next_out), t.next_out += g, I.pending_out += g, t.total_out += g, t.avail_out -= g, I.pending -= g, I.pending === 0 && (I.pending_out = 0));
  25987. }
  25988. function Ii(t, I) {
  25989. IA._tr_flush_block(t, t.block_start >= 0 ? t.block_start : -1, t.strstart - t.block_start, I), t.block_start = t.strstart, ia(t.strm);
  25990. }
  25991. function oC(t, I) {
  25992. t.pending_buf[t.pending++] = I;
  25993. }
  25994. function ku(t, I) {
  25995. t.pending_buf[t.pending++] = I >>> 8 & 255, t.pending_buf[t.pending++] = 255 & I;
  25996. }
  25997. function itg(t, I) {
  25998. var g, C, i = t.max_chain_length, e = t.strstart, A = t.prev_length, s = t.nice_match, l = t.strstart > t.w_size - 262 ? t.strstart - (t.w_size - 262) : 0, n = t.window, a = t.w_mask, d = t.prev, o = t.strstart + 258, c = n[e + A - 1], r = n[e + A];
  25999. t.prev_length >= t.good_match && (i >>= 2), s > t.lookahead && (s = t.lookahead);
  26000. do
  26001. if (n[(g = I) + A] === r && n[g + A - 1] === c && n[g] === n[e] && n[++g] === n[e + 1]) {
  26002. e += 2, g++;
  26003. do
  26004. ;
  26005. while (n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && e < o);
  26006. if (C = 258 - (o - e), e = o - 258, C > A) {
  26007. if (t.match_start = I, A = C, C >= s) break;
  26008. c = n[e + A - 1], r = n[e + A];
  26009. }
  26010. }
  26011. while ((I = d[I & a]) > l && --i != 0);
  26012. return A <= t.lookahead ? A : t.lookahead;
  26013. }
  26014. function Oo(t) {
  26015. var I, g, C, i, e, A, s, l, n, a, d = t.w_size;
  26016. do {
  26017. if (i = t.window_size - t.lookahead - t.strstart, t.strstart >= d + (d - 262)) {
  26018. Hi.arraySet(t.window, t.window, d, d, 0), t.match_start -= d, t.strstart -= d, t.block_start -= d, I = g = t.hash_size;
  26019. do
  26020. C = t.head[--I], t.head[I] = C >= d ? C - d : 0;
  26021. while (--g);
  26022. I = g = d;
  26023. do
  26024. C = t.prev[--I], t.prev[I] = C >= d ? C - d : 0;
  26025. while (--g);
  26026. i += d;
  26027. }
  26028. if (t.strm.avail_in === 0) break;
  26029. if (A = t.strm, s = t.window, l = t.strstart + t.lookahead, n = i, a = void 0, (a = A.avail_in) > n && (a = n), g = a === 0 ? 0 : (A.avail_in -= a, Hi.arraySet(s, A.input, A.next_in, a, l), A.state.wrap === 1 ? A.adler = ttg(A.adler, s, a, l) : A.state.wrap === 2 && (A.adler = ta(A.adler, s, a, l)), A.next_in += a, A.total_in += a, a), t.lookahead += g, t.lookahead + t.insert >= 3) for (e = t.strstart - t.insert, t.ins_h = t.window[e], t.ins_h = (t.ins_h << t.hash_shift ^ t.window[e + 1]) & t.hash_mask; t.insert && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[e + 3 - 1]) & t.hash_mask, t.prev[e & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = e, e++, t.insert--, !(t.lookahead + t.insert < 3)); ) ;
  26030. } while (t.lookahead < 262 && t.strm.avail_in !== 0);
  26031. }
  26032. function WX(t, I) {
  26033. for (var g, C; ; ) {
  26034. if (t.lookahead < 262) {
  26035. if (Oo(t), t.lookahead < 262 && I === 0) return 1;
  26036. if (t.lookahead === 0) break;
  26037. }
  26038. if (g = 0, t.lookahead >= 3 && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 3 - 1]) & t.hash_mask, g = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart), g !== 0 && t.strstart - g <= t.w_size - 262 && (t.match_length = itg(t, g)), t.match_length >= 3) if (C = IA._tr_tally(t, t.strstart - t.match_start, t.match_length - 3), t.lookahead -= t.match_length, t.match_length <= t.max_lazy_match && t.lookahead >= 3) {
  26039. t.match_length--;
  26040. do
  26041. t.strstart++, t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 3 - 1]) & t.hash_mask, g = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart;
  26042. while (--t.match_length != 0);
  26043. t.strstart++;
  26044. } else t.strstart += t.match_length, t.match_length = 0, t.ins_h = t.window[t.strstart], t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 1]) & t.hash_mask;
  26045. else C = IA._tr_tally(t, 0, t.window[t.strstart]), t.lookahead--, t.strstart++;
  26046. if (C && (Ii(t, !1), t.strm.avail_out === 0)) return 1;
  26047. }
  26048. return t.insert = t.strstart < 2 ? t.strstart : 2, I === 4 ? (Ii(t, !0), t.strm.avail_out === 0 ? 3 : 4) : t.last_lit && (Ii(t, !1), t.strm.avail_out === 0) ? 1 : 2;
  26049. }
  26050. function kr(t, I) {
  26051. for (var g, C, i; ; ) {
  26052. if (t.lookahead < 262) {
  26053. if (Oo(t), t.lookahead < 262 && I === 0) return 1;
  26054. if (t.lookahead === 0) break;
  26055. }
  26056. if (g = 0, t.lookahead >= 3 && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 3 - 1]) & t.hash_mask, g = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart), t.prev_length = t.match_length, t.prev_match = t.match_start, t.match_length = 2, g !== 0 && t.prev_length < t.max_lazy_match && t.strstart - g <= t.w_size - 262 && (t.match_length = itg(t, g), t.match_length <= 5 && (t.strategy === 1 || t.match_length === 3 && t.strstart - t.match_start > 4096) && (t.match_length = 2)), t.prev_length >= 3 && t.match_length <= t.prev_length) {
  26057. i = t.strstart + t.lookahead - 3, C = IA._tr_tally(t, t.strstart - 1 - t.prev_match, t.prev_length - 3), t.lookahead -= t.prev_length - 1, t.prev_length -= 2;
  26058. do
  26059. ++t.strstart <= i && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 3 - 1]) & t.hash_mask, g = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart);
  26060. while (--t.prev_length != 0);
  26061. if (t.match_available = 0, t.match_length = 2, t.strstart++, C && (Ii(t, !1), t.strm.avail_out === 0)) return 1;
  26062. } else if (t.match_available) {
  26063. if ((C = IA._tr_tally(t, 0, t.window[t.strstart - 1])) && Ii(t, !1), t.strstart++, t.lookahead--, t.strm.avail_out === 0) return 1;
  26064. } else t.match_available = 1, t.strstart++, t.lookahead--;
  26065. }
  26066. return t.match_available && (C = IA._tr_tally(t, 0, t.window[t.strstart - 1]), t.match_available = 0), t.insert = t.strstart < 2 ? t.strstart : 2, I === 4 ? (Ii(t, !0), t.strm.avail_out === 0 ? 3 : 4) : t.last_lit && (Ii(t, !1), t.strm.avail_out === 0) ? 1 : 2;
  26067. }
  26068. function ns(t, I, g, C, i) {
  26069. this.good_length = t, this.max_lazy = I, this.nice_length = g, this.max_chain = C, this.func = i;
  26070. }
  26071. function $hg() {
  26072. this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = 8, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new Hi.Buf16(1146), this.dyn_dtree = new Hi.Buf16(122), this.bl_tree = new Hi.Buf16(78), na(this.dyn_ltree), na(this.dyn_dtree), na(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new Hi.Buf16(16), this.heap = new Hi.Buf16(573), na(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new Hi.Buf16(573), na(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;
  26073. }
  26074. function etg(t) {
  26075. var I;
  26076. return t && t.state ? (t.total_in = t.total_out = 0, t.data_type = 2, (I = t.state).pending = 0, I.pending_out = 0, I.wrap < 0 && (I.wrap = -I.wrap), I.status = I.wrap ? 42 : 113, t.adler = I.wrap === 2 ? 0 : 1, I.last_flush = 0, IA._tr_init(I), 0) : Aa(t, -2);
  26077. }
  26078. function Atg(t) {
  26079. var I, g = etg(t);
  26080. return g === 0 && ((I = t.state).window_size = 2 * I.w_size, na(I.head), I.max_lazy_match = Ah[I.level].max_lazy, I.good_match = Ah[I.level].good_length, I.nice_match = Ah[I.level].nice_length, I.max_chain_length = Ah[I.level].max_chain, I.strstart = 0, I.block_start = 0, I.lookahead = 0, I.insert = 0, I.match_length = I.prev_length = 2, I.match_available = 0, I.ins_h = 0), g;
  26081. }
  26082. function L_(t, I, g, C, i, e) {
  26083. if (!t) return -2;
  26084. var A = 1;
  26085. if (I === -1 && (I = 6), C < 0 ? (A = 0, C = -C) : C > 15 && (A = 2, C -= 16), i < 1 || i > 9 || g !== 8 || C < 8 || C > 15 || I < 0 || I > 9 || e < 0 || e > 4) return Aa(t, -2);
  26086. C === 8 && (C = 9);
  26087. var s = new $hg();
  26088. return t.state = s, s.strm = t, s.wrap = A, s.gzhead = null, s.w_bits = C, s.w_size = 1 << s.w_bits, s.w_mask = s.w_size - 1, s.hash_bits = i + 7, s.hash_size = 1 << s.hash_bits, s.hash_mask = s.hash_size - 1, s.hash_shift = ~~((s.hash_bits + 3 - 1) / 3), s.window = new Hi.Buf8(2 * s.w_size), s.head = new Hi.Buf16(s.hash_size), s.prev = new Hi.Buf16(s.w_size), s.lit_bufsize = 1 << i + 6, s.pending_buf_size = 4 * s.lit_bufsize, s.pending_buf = new Hi.Buf8(s.pending_buf_size), s.d_buf = 1 * s.lit_bufsize, s.l_buf = 3 * s.lit_bufsize, s.level = I, s.strategy = e, s.method = g, Atg(t);
  26089. }
  26090. Ah = [new ns(0, 0, 0, 0, function(t, I) {
  26091. var g = 65535;
  26092. for (g > t.pending_buf_size - 5 && (g = t.pending_buf_size - 5); ; ) {
  26093. if (t.lookahead <= 1) {
  26094. if (Oo(t), t.lookahead === 0 && I === 0) return 1;
  26095. if (t.lookahead === 0) break;
  26096. }
  26097. t.strstart += t.lookahead, t.lookahead = 0;
  26098. var C = t.block_start + g;
  26099. if ((t.strstart === 0 || t.strstart >= C) && (t.lookahead = t.strstart - C, t.strstart = C, Ii(t, !1), t.strm.avail_out === 0) || t.strstart - t.block_start >= t.w_size - 262 && (Ii(t, !1), t.strm.avail_out === 0)) return 1;
  26100. }
  26101. return t.insert = 0, I === 4 ? (Ii(t, !0), t.strm.avail_out === 0 ? 3 : 4) : (t.strstart > t.block_start && (Ii(t, !1), t.strm.avail_out), 1);
  26102. }), new ns(4, 4, 8, 4, WX), new ns(4, 5, 16, 8, WX), new ns(4, 6, 32, 32, WX), new ns(4, 4, 16, 16, kr), new ns(8, 16, 32, 32, kr), new ns(8, 16, 128, 128, kr), new ns(8, 32, 128, 256, kr), new ns(32, 128, 258, 1024, kr), new ns(32, 258, 258, 4096, kr)], rs.deflateInit = function(t, I) {
  26103. return L_(t, I, 8, 15, 8, 0);
  26104. }, rs.deflateInit2 = L_, rs.deflateReset = Atg, rs.deflateResetKeep = etg, rs.deflateSetHeader = function(t, I) {
  26105. return t && t.state ? t.state.wrap !== 2 ? -2 : (t.state.gzhead = I, 0) : -2;
  26106. }, rs.deflate = function(t, I) {
  26107. var g, C, i, e;
  26108. if (!t || !t.state || I > 5 || I < 0) return t ? Aa(t, -2) : -2;
  26109. if (C = t.state, !t.output || !t.input && t.avail_in !== 0 || C.status === 666 && I !== 4) return Aa(t, t.avail_out === 0 ? -5 : -2);
  26110. if (C.strm = t, g = C.last_flush, C.last_flush = I, C.status === 42) if (C.wrap === 2) t.adler = 0, oC(C, 31), oC(C, 139), oC(C, 8), C.gzhead ? (oC(C, (C.gzhead.text ? 1 : 0) + (C.gzhead.hcrc ? 2 : 0) + (C.gzhead.extra ? 4 : 0) + (C.gzhead.name ? 8 : 0) + (C.gzhead.comment ? 16 : 0)), oC(C, 255 & C.gzhead.time), oC(C, C.gzhead.time >> 8 & 255), oC(C, C.gzhead.time >> 16 & 255), oC(C, C.gzhead.time >> 24 & 255), oC(C, C.level === 9 ? 2 : C.strategy >= 2 || C.level < 2 ? 4 : 0), oC(C, 255 & C.gzhead.os), C.gzhead.extra && C.gzhead.extra.length && (oC(C, 255 & C.gzhead.extra.length), oC(C, C.gzhead.extra.length >> 8 & 255)), C.gzhead.hcrc && (t.adler = ta(t.adler, C.pending_buf, C.pending, 0)), C.gzindex = 0, C.status = 69) : (oC(C, 0), oC(C, 0), oC(C, 0), oC(C, 0), oC(C, 0), oC(C, C.level === 9 ? 2 : C.strategy >= 2 || C.level < 2 ? 4 : 0), oC(C, 3), C.status = 113);
  26111. else {
  26112. var A = 8 + (C.w_bits - 8 << 4) << 8;
  26113. A |= (C.strategy >= 2 || C.level < 2 ? 0 : C.level < 6 ? 1 : C.level === 6 ? 2 : 3) << 6, C.strstart !== 0 && (A |= 32), A += 31 - A % 31, C.status = 113, ku(C, A), C.strstart !== 0 && (ku(C, t.adler >>> 16), ku(C, 65535 & t.adler)), t.adler = 1;
  26114. }
  26115. if (C.status === 69) if (C.gzhead.extra) {
  26116. for (i = C.pending; C.gzindex < (65535 & C.gzhead.extra.length) && (C.pending !== C.pending_buf_size || (C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), ia(t), i = C.pending, C.pending !== C.pending_buf_size)); ) oC(C, 255 & C.gzhead.extra[C.gzindex]), C.gzindex++;
  26117. C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), C.gzindex === C.gzhead.extra.length && (C.gzindex = 0, C.status = 73);
  26118. } else C.status = 73;
  26119. if (C.status === 73) if (C.gzhead.name) {
  26120. i = C.pending;
  26121. do {
  26122. if (C.pending === C.pending_buf_size && (C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), ia(t), i = C.pending, C.pending === C.pending_buf_size)) {
  26123. e = 1;
  26124. break;
  26125. }
  26126. e = C.gzindex < C.gzhead.name.length ? 255 & C.gzhead.name.charCodeAt(C.gzindex++) : 0, oC(C, e);
  26127. } while (e !== 0);
  26128. C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), e === 0 && (C.gzindex = 0, C.status = 91);
  26129. } else C.status = 91;
  26130. if (C.status === 91) if (C.gzhead.comment) {
  26131. i = C.pending;
  26132. do {
  26133. if (C.pending === C.pending_buf_size && (C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), ia(t), i = C.pending, C.pending === C.pending_buf_size)) {
  26134. e = 1;
  26135. break;
  26136. }
  26137. e = C.gzindex < C.gzhead.comment.length ? 255 & C.gzhead.comment.charCodeAt(C.gzindex++) : 0, oC(C, e);
  26138. } while (e !== 0);
  26139. C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), e === 0 && (C.status = 103);
  26140. } else C.status = 103;
  26141. if (C.status === 103 && (C.gzhead.hcrc ? (C.pending + 2 > C.pending_buf_size && ia(t), C.pending + 2 <= C.pending_buf_size && (oC(C, 255 & t.adler), oC(C, t.adler >> 8 & 255), t.adler = 0, C.status = 113)) : C.status = 113), C.pending !== 0) {
  26142. if (ia(t), t.avail_out === 0) return C.last_flush = -1, 0;
  26143. } else if (t.avail_in === 0 && J_(I) <= J_(g) && I !== 4) return Aa(t, -5);
  26144. if (C.status === 666 && t.avail_in !== 0) return Aa(t, -5);
  26145. if (t.avail_in !== 0 || C.lookahead !== 0 || I !== 0 && C.status !== 666) {
  26146. var s = C.strategy === 2 ? function(l, n) {
  26147. for (var a; ; ) {
  26148. if (l.lookahead === 0 && (Oo(l), l.lookahead === 0)) {
  26149. if (n === 0) return 1;
  26150. break;
  26151. }
  26152. if (l.match_length = 0, a = IA._tr_tally(l, 0, l.window[l.strstart]), l.lookahead--, l.strstart++, a && (Ii(l, !1), l.strm.avail_out === 0)) return 1;
  26153. }
  26154. return l.insert = 0, n === 4 ? (Ii(l, !0), l.strm.avail_out === 0 ? 3 : 4) : l.last_lit && (Ii(l, !1), l.strm.avail_out === 0) ? 1 : 2;
  26155. }(C, I) : C.strategy === 3 ? function(l, n) {
  26156. for (var a, d, o, c, r = l.window; ; ) {
  26157. if (l.lookahead <= 258) {
  26158. if (Oo(l), l.lookahead <= 258 && n === 0) return 1;
  26159. if (l.lookahead === 0) break;
  26160. }
  26161. if (l.match_length = 0, l.lookahead >= 3 && l.strstart > 0 && (d = r[o = l.strstart - 1]) === r[++o] && d === r[++o] && d === r[++o]) {
  26162. c = l.strstart + 258;
  26163. do
  26164. ;
  26165. while (d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && o < c);
  26166. l.match_length = 258 - (c - o), l.match_length > l.lookahead && (l.match_length = l.lookahead);
  26167. }
  26168. if (l.match_length >= 3 ? (a = IA._tr_tally(l, 1, l.match_length - 3), l.lookahead -= l.match_length, l.strstart += l.match_length, l.match_length = 0) : (a = IA._tr_tally(l, 0, l.window[l.strstart]), l.lookahead--, l.strstart++), a && (Ii(l, !1), l.strm.avail_out === 0)) return 1;
  26169. }
  26170. return l.insert = 0, n === 4 ? (Ii(l, !0), l.strm.avail_out === 0 ? 3 : 4) : l.last_lit && (Ii(l, !1), l.strm.avail_out === 0) ? 1 : 2;
  26171. }(C, I) : Ah[C.level].func(C, I);
  26172. if (s !== 3 && s !== 4 || (C.status = 666), s === 1 || s === 3) return t.avail_out === 0 && (C.last_flush = -1), 0;
  26173. if (s === 2 && (I === 1 ? IA._tr_align(C) : I !== 5 && (IA._tr_stored_block(C, 0, 0, !1), I === 3 && (na(C.head), C.lookahead === 0 && (C.strstart = 0, C.block_start = 0, C.insert = 0))), ia(t), t.avail_out === 0)) return C.last_flush = -1, 0;
  26174. }
  26175. return I !== 4 ? 0 : C.wrap <= 0 ? 1 : (C.wrap === 2 ? (oC(C, 255 & t.adler), oC(C, t.adler >> 8 & 255), oC(C, t.adler >> 16 & 255), oC(C, t.adler >> 24 & 255), oC(C, 255 & t.total_in), oC(C, t.total_in >> 8 & 255), oC(C, t.total_in >> 16 & 255), oC(C, t.total_in >> 24 & 255)) : (ku(C, t.adler >>> 16), ku(C, 65535 & t.adler)), ia(t), C.wrap > 0 && (C.wrap = -C.wrap), C.pending !== 0 ? 0 : 1);
  26176. }, rs.deflateEnd = function(t) {
  26177. var I;
  26178. return t && t.state ? (I = t.state.status) !== 42 && I !== 69 && I !== 73 && I !== 91 && I !== 103 && I !== 113 && I !== 666 ? Aa(t, -2) : (t.state = null, I === 113 ? Aa(t, -3) : 0) : -2;
  26179. }, rs.deflateSetDictionary = function(t, I) {
  26180. var g, C, i, e, A, s, l, n, a = I.length;
  26181. if (!t || !t.state || (e = (g = t.state).wrap) === 2 || e === 1 && g.status !== 42 || g.lookahead) return -2;
  26182. for (e === 1 && (t.adler = ttg(t.adler, I, a, 0)), g.wrap = 0, a >= g.w_size && (e === 0 && (na(g.head), g.strstart = 0, g.block_start = 0, g.insert = 0), n = new Hi.Buf8(g.w_size), Hi.arraySet(n, I, a - g.w_size, g.w_size, 0), I = n, a = g.w_size), A = t.avail_in, s = t.next_in, l = t.input, t.avail_in = a, t.next_in = 0, t.input = I, Oo(g); g.lookahead >= 3; ) {
  26183. C = g.strstart, i = g.lookahead - 2;
  26184. do
  26185. g.ins_h = (g.ins_h << g.hash_shift ^ g.window[C + 3 - 1]) & g.hash_mask, g.prev[C & g.w_mask] = g.head[g.ins_h], g.head[g.ins_h] = C, C++;
  26186. while (--i);
  26187. g.strstart = C, g.lookahead = 2, Oo(g);
  26188. }
  26189. return g.strstart += g.lookahead, g.block_start = g.strstart, g.insert = g.lookahead, g.lookahead = 0, g.match_length = g.prev_length = 2, g.match_available = 0, t.next_in = s, t.input = l, t.avail_in = A, g.wrap = e, 0;
  26190. }, rs.deflateInfo = "pako deflate (from Nodeca project)";
  26191. var Uo = {}, ZV = tn, stg = !0, ltg = !0;
  26192. try {
  26193. String.fromCharCode.apply(null, [0]);
  26194. } catch {
  26195. stg = !1;
  26196. }
  26197. try {
  26198. String.fromCharCode.apply(null, new Uint8Array(1));
  26199. } catch {
  26200. ltg = !1;
  26201. }
  26202. for (var sm = new ZV.Buf8(256), En = 0; En < 256; En++) sm[En] = En >= 252 ? 6 : En >= 248 ? 5 : En >= 240 ? 4 : En >= 224 ? 3 : En >= 192 ? 2 : 1;
  26203. function v_(t, I) {
  26204. if (I < 65534 && (t.subarray && ltg || !t.subarray && stg)) return String.fromCharCode.apply(null, ZV.shrinkBuf(t, I));
  26205. for (var g = "", C = 0; C < I; C++) g += String.fromCharCode(t[C]);
  26206. return g;
  26207. }
  26208. sm[254] = sm[254] = 1, Uo.string2buf = function(t) {
  26209. var I, g, C, i, e, A = t.length, s = 0;
  26210. for (i = 0; i < A; i++) (64512 & (g = t.charCodeAt(i))) == 55296 && i + 1 < A && (64512 & (C = t.charCodeAt(i + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (C - 56320), i++), s += g < 128 ? 1 : g < 2048 ? 2 : g < 65536 ? 3 : 4;
  26211. for (I = new ZV.Buf8(s), e = 0, i = 0; e < s; i++) (64512 & (g = t.charCodeAt(i))) == 55296 && i + 1 < A && (64512 & (C = t.charCodeAt(i + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (C - 56320), i++), g < 128 ? I[e++] = g : g < 2048 ? (I[e++] = 192 | g >>> 6, I[e++] = 128 | 63 & g) : g < 65536 ? (I[e++] = 224 | g >>> 12, I[e++] = 128 | g >>> 6 & 63, I[e++] = 128 | 63 & g) : (I[e++] = 240 | g >>> 18, I[e++] = 128 | g >>> 12 & 63, I[e++] = 128 | g >>> 6 & 63, I[e++] = 128 | 63 & g);
  26212. return I;
  26213. }, Uo.buf2binstring = function(t) {
  26214. return v_(t, t.length);
  26215. }, Uo.binstring2buf = function(t) {
  26216. for (var I = new ZV.Buf8(t.length), g = 0, C = I.length; g < C; g++) I[g] = t.charCodeAt(g);
  26217. return I;
  26218. }, Uo.buf2string = function(t, I) {
  26219. var g, C, i, e, A = I || t.length, s = new Array(2 * A);
  26220. for (C = 0, g = 0; g < A; ) if ((i = t[g++]) < 128) s[C++] = i;
  26221. else if ((e = sm[i]) > 4) s[C++] = 65533, g += e - 1;
  26222. else {
  26223. for (i &= e === 2 ? 31 : e === 3 ? 15 : 7; e > 1 && g < A; ) i = i << 6 | 63 & t[g++], e--;
  26224. e > 1 ? s[C++] = 65533 : i < 65536 ? s[C++] = i : (i -= 65536, s[C++] = 55296 | i >> 10 & 1023, s[C++] = 56320 | 1023 & i);
  26225. }
  26226. return v_(s, C);
  26227. }, Uo.utf8border = function(t, I) {
  26228. var g;
  26229. for ((I = I || t.length) > t.length && (I = t.length), g = I - 1; g >= 0 && (192 & t[g]) == 128; ) g--;
  26230. return g < 0 || g === 0 ? I : g + sm[t[g]] > I ? g : I;
  26231. };
  26232. var ntg = function() {
  26233. this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler = 0;
  26234. }, Ym = rs, lm = tn, ZD = Uo, GD = x9, g0g = ntg, atg = Object.prototype.toString;
  26235. function gc(t) {
  26236. if (!(this instanceof gc)) return new gc(t);
  26237. this.options = lm.assign({ level: -1, method: 8, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: 0, to: "" }, t || {});
  26238. var I = this.options;
  26239. I.raw && I.windowBits > 0 ? I.windowBits = -I.windowBits : I.gzip && I.windowBits > 0 && I.windowBits < 16 && (I.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new g0g(), this.strm.avail_out = 0;
  26240. var g = Ym.deflateInit2(this.strm, I.level, I.method, I.windowBits, I.memLevel, I.strategy);
  26241. if (g !== 0) throw new Error(GD[g]);
  26242. if (I.header && Ym.deflateSetHeader(this.strm, I.header), I.dictionary) {
  26243. var C;
  26244. if (C = typeof I.dictionary == "string" ? ZD.string2buf(I.dictionary) : atg.call(I.dictionary) === "[object ArrayBuffer]" ? new Uint8Array(I.dictionary) : I.dictionary, (g = Ym.deflateSetDictionary(this.strm, C)) !== 0) throw new Error(GD[g]);
  26245. this._dict_set = !0;
  26246. }
  26247. }
  26248. function yX(t, I) {
  26249. var g = new gc(I);
  26250. if (g.push(t, !0), g.err) throw g.msg || GD[g.err];
  26251. return g.result;
  26252. }
  26253. gc.prototype.push = function(t, I) {
  26254. var g, C, i = this.strm, e = this.options.chunkSize;
  26255. if (this.ended) return !1;
  26256. C = I === ~~I ? I : I === !0 ? 4 : 0, typeof t == "string" ? i.input = ZD.string2buf(t) : atg.call(t) === "[object ArrayBuffer]" ? i.input = new Uint8Array(t) : i.input = t, i.next_in = 0, i.avail_in = i.input.length;
  26257. do {
  26258. if (i.avail_out === 0 && (i.output = new lm.Buf8(e), i.next_out = 0, i.avail_out = e), (g = Ym.deflate(i, C)) !== 1 && g !== 0) return this.onEnd(g), this.ended = !0, !1;
  26259. i.avail_out !== 0 && (i.avail_in !== 0 || C !== 4 && C !== 2) || (this.options.to === "string" ? this.onData(ZD.buf2binstring(lm.shrinkBuf(i.output, i.next_out))) : this.onData(lm.shrinkBuf(i.output, i.next_out)));
  26260. } while ((i.avail_in > 0 || i.avail_out === 0) && g !== 1);
  26261. return C === 4 ? (g = Ym.deflateEnd(this.strm), this.onEnd(g), this.ended = !0, g === 0) : C !== 2 || (this.onEnd(0), i.avail_out = 0, !0);
  26262. }, gc.prototype.onData = function(t) {
  26263. this.chunks.push(t);
  26264. }, gc.prototype.onEnd = function(t) {
  26265. t === 0 && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = lm.flattenChunks(this.chunks)), this.chunks = [], this.err = t, this.msg = this.strm.msg;
  26266. }, em.Deflate = gc, em.deflate = yX, em.deflateRaw = function(t, I) {
  26267. return (I = I || {}).raw = !0, yX(t, I);
  26268. }, em.gzip = function(t, I) {
  26269. return (I = I || {}).gzip = !0, yX(t, I);
  26270. };
  26271. var nm = {}, bA = {}, T_ = tn, I0g = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], C0g = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], t0g = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], i0g = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64], Ne = tn, YX = Itg, as = Ctg, e0g = function(t, I) {
  26272. var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z;
  26273. g = t.state, C = t.next_in, S = t.input, i = C + (t.avail_in - 5), e = t.next_out, z = t.output, A = e - (I - t.avail_out), s = e + (t.avail_out - 257), l = g.dmax, n = g.wsize, a = g.whave, d = g.wnext, o = g.window, c = g.hold, r = g.bits, h = g.lencode, b = g.distcode, u = (1 << g.lenbits) - 1, m = (1 << g.distbits) - 1;
  26274. g: do {
  26275. r < 15 && (c += S[C++] << r, r += 8, c += S[C++] << r, r += 8), Z = h[c & u];
  26276. I: for (; ; ) {
  26277. if (c >>>= p = Z >>> 24, r -= p, (p = Z >>> 16 & 255) === 0) z[e++] = 65535 & Z;
  26278. else {
  26279. if (!(16 & p)) {
  26280. if ((64 & p) == 0) {
  26281. Z = h[(65535 & Z) + (c & (1 << p) - 1)];
  26282. continue I;
  26283. }
  26284. if (32 & p) {
  26285. g.mode = 12;
  26286. break g;
  26287. }
  26288. t.msg = "invalid literal/length code", g.mode = 30;
  26289. break g;
  26290. }
  26291. Y = 65535 & Z, (p &= 15) && (r < p && (c += S[C++] << r, r += 8), Y += c & (1 << p) - 1, c >>>= p, r -= p), r < 15 && (c += S[C++] << r, r += 8, c += S[C++] << r, r += 8), Z = b[c & m];
  26292. C: for (; ; ) {
  26293. if (c >>>= p = Z >>> 24, r -= p, !(16 & (p = Z >>> 16 & 255))) {
  26294. if ((64 & p) == 0) {
  26295. Z = b[(65535 & Z) + (c & (1 << p) - 1)];
  26296. continue C;
  26297. }
  26298. t.msg = "invalid distance code", g.mode = 30;
  26299. break g;
  26300. }
  26301. if (R = 65535 & Z, r < (p &= 15) && (c += S[C++] << r, (r += 8) < p && (c += S[C++] << r, r += 8)), (R += c & (1 << p) - 1) > l) {
  26302. t.msg = "invalid distance too far back", g.mode = 30;
  26303. break g;
  26304. }
  26305. if (c >>>= p, r -= p, R > (p = e - A)) {
  26306. if ((p = R - p) > a && g.sane) {
  26307. t.msg = "invalid distance too far back", g.mode = 30;
  26308. break g;
  26309. }
  26310. if (X = 0, H = o, d === 0) {
  26311. if (X += n - p, p < Y) {
  26312. Y -= p;
  26313. do
  26314. z[e++] = o[X++];
  26315. while (--p);
  26316. X = e - R, H = z;
  26317. }
  26318. } else if (d < p) {
  26319. if (X += n + d - p, (p -= d) < Y) {
  26320. Y -= p;
  26321. do
  26322. z[e++] = o[X++];
  26323. while (--p);
  26324. if (X = 0, d < Y) {
  26325. Y -= p = d;
  26326. do
  26327. z[e++] = o[X++];
  26328. while (--p);
  26329. X = e - R, H = z;
  26330. }
  26331. }
  26332. } else if (X += d - p, p < Y) {
  26333. Y -= p;
  26334. do
  26335. z[e++] = o[X++];
  26336. while (--p);
  26337. X = e - R, H = z;
  26338. }
  26339. for (; Y > 2; ) z[e++] = H[X++], z[e++] = H[X++], z[e++] = H[X++], Y -= 3;
  26340. Y && (z[e++] = H[X++], Y > 1 && (z[e++] = H[X++]));
  26341. } else {
  26342. X = e - R;
  26343. do
  26344. z[e++] = z[X++], z[e++] = z[X++], z[e++] = z[X++], Y -= 3;
  26345. while (Y > 2);
  26346. Y && (z[e++] = z[X++], Y > 1 && (z[e++] = z[X++]));
  26347. }
  26348. break;
  26349. }
  26350. }
  26351. break;
  26352. }
  26353. } while (C < i && e < s);
  26354. C -= Y = r >> 3, c &= (1 << (r -= Y << 3)) - 1, t.next_in = C, t.next_out = e, t.avail_in = C < i ? i - C + 5 : 5 - (C - i), t.avail_out = e < s ? s - e + 257 : 257 - (e - s), g.hold = c, g.bits = r;
  26355. }, Nm = function(t, I, g, C, i, e, A, s) {
  26356. var l, n, a, d, o, c, r, h, b, u = s.bits, m = 0, Z = 0, p = 0, Y = 0, R = 0, X = 0, H = 0, S = 0, z = 0, v = 0, K = null, V = 0, N = new T_.Buf16(16), B = new T_.Buf16(16), G = null, w = 0;
  26357. for (m = 0; m <= 15; m++) N[m] = 0;
  26358. for (Z = 0; Z < C; Z++) N[I[g + Z]]++;
  26359. for (R = u, Y = 15; Y >= 1 && N[Y] === 0; Y--) ;
  26360. if (R > Y && (R = Y), Y === 0) return i[e++] = 20971520, i[e++] = 20971520, s.bits = 1, 0;
  26361. for (p = 1; p < Y && N[p] === 0; p++) ;
  26362. for (R < p && (R = p), S = 1, m = 1; m <= 15; m++) if (S <<= 1, (S -= N[m]) < 0) return -1;
  26363. if (S > 0 && (t === 0 || Y !== 1)) return -1;
  26364. for (B[1] = 0, m = 1; m < 15; m++) B[m + 1] = B[m] + N[m];
  26365. for (Z = 0; Z < C; Z++) I[g + Z] !== 0 && (A[B[I[g + Z]]++] = Z);
  26366. if (t === 0 ? (K = G = A, c = 19) : t === 1 ? (K = I0g, V -= 257, G = C0g, w -= 257, c = 256) : (K = t0g, G = i0g, c = -1), v = 0, Z = 0, m = p, o = e, X = R, H = 0, a = -1, d = (z = 1 << R) - 1, t === 1 && z > 852 || t === 2 && z > 592) return 1;
  26367. for (; ; ) {
  26368. r = m - H, A[Z] < c ? (h = 0, b = A[Z]) : A[Z] > c ? (h = G[w + A[Z]], b = K[V + A[Z]]) : (h = 96, b = 0), l = 1 << m - H, p = n = 1 << X;
  26369. do
  26370. i[o + (v >> H) + (n -= l)] = r << 24 | h << 16 | b | 0;
  26371. while (n !== 0);
  26372. for (l = 1 << m - 1; v & l; ) l >>= 1;
  26373. if (l !== 0 ? (v &= l - 1, v += l) : v = 0, Z++, --N[m] == 0) {
  26374. if (m === Y) break;
  26375. m = I[g + A[Z]];
  26376. }
  26377. if (m > R && (v & d) !== a) {
  26378. for (H === 0 && (H = R), o += p, S = 1 << (X = m - H); X + H < Y && !((S -= N[X + H]) <= 0); ) X++, S <<= 1;
  26379. if (z += 1 << X, t === 1 && z > 852 || t === 2 && z > 592) return 1;
  26380. i[a = v & d] = R << 24 | X << 16 | o - e | 0;
  26381. }
  26382. }
  26383. return v !== 0 && (i[o + v] = m - H << 24 | 64 << 16 | 0), s.bits = R, 0;
  26384. };
  26385. function x_(t) {
  26386. return (t >>> 24 & 255) + (t >>> 8 & 65280) + ((65280 & t) << 8) + ((255 & t) << 24);
  26387. }
  26388. function A0g() {
  26389. this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new Ne.Buf16(320), this.work = new Ne.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;
  26390. }
  26391. function otg(t) {
  26392. var I;
  26393. return t && t.state ? (I = t.state, t.total_in = t.total_out = I.total = 0, t.msg = "", I.wrap && (t.adler = 1 & I.wrap), I.mode = 1, I.last = 0, I.havedict = 0, I.dmax = 32768, I.head = null, I.hold = 0, I.bits = 0, I.lencode = I.lendyn = new Ne.Buf32(852), I.distcode = I.distdyn = new Ne.Buf32(592), I.sane = 1, I.back = -1, 0) : -2;
  26394. }
  26395. function ctg(t) {
  26396. var I;
  26397. return t && t.state ? ((I = t.state).wsize = 0, I.whave = 0, I.wnext = 0, otg(t)) : -2;
  26398. }
  26399. function dtg(t, I) {
  26400. var g, C;
  26401. return t && t.state ? (C = t.state, I < 0 ? (g = 0, I = -I) : (g = 1 + (I >> 4), I < 48 && (I &= 15)), I && (I < 8 || I > 15) ? -2 : (C.window !== null && C.wbits !== I && (C.window = null), C.wrap = g, C.wbits = I, ctg(t))) : -2;
  26402. }
  26403. function j_(t, I) {
  26404. var g, C;
  26405. return t ? (C = new A0g(), t.state = C, C.window = null, (g = dtg(t, I)) !== 0 && (t.state = null), g) : -2;
  26406. }
  26407. var NX, VX, Q_ = !0;
  26408. function s0g(t) {
  26409. if (Q_) {
  26410. var I;
  26411. for (NX = new Ne.Buf32(512), VX = new Ne.Buf32(32), I = 0; I < 144; ) t.lens[I++] = 8;
  26412. for (; I < 256; ) t.lens[I++] = 9;
  26413. for (; I < 280; ) t.lens[I++] = 7;
  26414. for (; I < 288; ) t.lens[I++] = 8;
  26415. for (Nm(1, t.lens, 0, 288, NX, 0, t.work, { bits: 9 }), I = 0; I < 32; ) t.lens[I++] = 5;
  26416. Nm(2, t.lens, 0, 32, VX, 0, t.work, { bits: 5 }), Q_ = !1;
  26417. }
  26418. t.lencode = NX, t.lenbits = 9, t.distcode = VX, t.distbits = 5;
  26419. }
  26420. function O_(t, I, g, C) {
  26421. var i, e = t.state;
  26422. return e.window === null && (e.wsize = 1 << e.wbits, e.wnext = 0, e.whave = 0, e.window = new Ne.Buf8(e.wsize)), C >= e.wsize ? (Ne.arraySet(e.window, I, g - e.wsize, e.wsize, 0), e.wnext = 0, e.whave = e.wsize) : ((i = e.wsize - e.wnext) > C && (i = C), Ne.arraySet(e.window, I, g - C, i, e.wnext), (C -= i) ? (Ne.arraySet(e.window, I, g - C, C, 0), e.wnext = C, e.whave = e.wsize) : (e.wnext += i, e.wnext === e.wsize && (e.wnext = 0), e.whave < e.wsize && (e.whave += i))), 0;
  26423. }
  26424. bA.inflateReset = ctg, bA.inflateReset2 = dtg, bA.inflateResetKeep = otg, bA.inflateInit = function(t) {
  26425. return j_(t, 15);
  26426. }, bA.inflateInit2 = j_, bA.inflate = function(t, I) {
  26427. var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z = 0, v = new Ne.Buf8(4), K = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
  26428. if (!t || !t.state || !t.output || !t.input && t.avail_in !== 0) return -2;
  26429. (g = t.state).mode === 12 && (g.mode = 13), A = t.next_out, i = t.output, l = t.avail_out, e = t.next_in, C = t.input, s = t.avail_in, n = g.hold, a = g.bits, d = s, o = l, X = 0;
  26430. g: for (; ; ) switch (g.mode) {
  26431. case 1:
  26432. if (g.wrap === 0) {
  26433. g.mode = 13;
  26434. break;
  26435. }
  26436. for (; a < 16; ) {
  26437. if (s === 0) break g;
  26438. s--, n += C[e++] << a, a += 8;
  26439. }
  26440. if (2 & g.wrap && n === 35615) {
  26441. g.check = 0, v[0] = 255 & n, v[1] = n >>> 8 & 255, g.check = as(g.check, v, 2, 0), n = 0, a = 0, g.mode = 2;
  26442. break;
  26443. }
  26444. if (g.flags = 0, g.head && (g.head.done = !1), !(1 & g.wrap) || (((255 & n) << 8) + (n >> 8)) % 31) {
  26445. t.msg = "incorrect header check", g.mode = 30;
  26446. break;
  26447. }
  26448. if ((15 & n) != 8) {
  26449. t.msg = "unknown compression method", g.mode = 30;
  26450. break;
  26451. }
  26452. if (a -= 4, R = 8 + (15 & (n >>>= 4)), g.wbits === 0) g.wbits = R;
  26453. else if (R > g.wbits) {
  26454. t.msg = "invalid window size", g.mode = 30;
  26455. break;
  26456. }
  26457. g.dmax = 1 << R, t.adler = g.check = 1, g.mode = 512 & n ? 10 : 12, n = 0, a = 0;
  26458. break;
  26459. case 2:
  26460. for (; a < 16; ) {
  26461. if (s === 0) break g;
  26462. s--, n += C[e++] << a, a += 8;
  26463. }
  26464. if (g.flags = n, (255 & g.flags) != 8) {
  26465. t.msg = "unknown compression method", g.mode = 30;
  26466. break;
  26467. }
  26468. if (57344 & g.flags) {
  26469. t.msg = "unknown header flags set", g.mode = 30;
  26470. break;
  26471. }
  26472. g.head && (g.head.text = n >> 8 & 1), 512 & g.flags && (v[0] = 255 & n, v[1] = n >>> 8 & 255, g.check = as(g.check, v, 2, 0)), n = 0, a = 0, g.mode = 3;
  26473. case 3:
  26474. for (; a < 32; ) {
  26475. if (s === 0) break g;
  26476. s--, n += C[e++] << a, a += 8;
  26477. }
  26478. g.head && (g.head.time = n), 512 & g.flags && (v[0] = 255 & n, v[1] = n >>> 8 & 255, v[2] = n >>> 16 & 255, v[3] = n >>> 24 & 255, g.check = as(g.check, v, 4, 0)), n = 0, a = 0, g.mode = 4;
  26479. case 4:
  26480. for (; a < 16; ) {
  26481. if (s === 0) break g;
  26482. s--, n += C[e++] << a, a += 8;
  26483. }
  26484. g.head && (g.head.xflags = 255 & n, g.head.os = n >> 8), 512 & g.flags && (v[0] = 255 & n, v[1] = n >>> 8 & 255, g.check = as(g.check, v, 2, 0)), n = 0, a = 0, g.mode = 5;
  26485. case 5:
  26486. if (1024 & g.flags) {
  26487. for (; a < 16; ) {
  26488. if (s === 0) break g;
  26489. s--, n += C[e++] << a, a += 8;
  26490. }
  26491. g.length = n, g.head && (g.head.extra_len = n), 512 & g.flags && (v[0] = 255 & n, v[1] = n >>> 8 & 255, g.check = as(g.check, v, 2, 0)), n = 0, a = 0;
  26492. } else g.head && (g.head.extra = null);
  26493. g.mode = 6;
  26494. case 6:
  26495. if (1024 & g.flags && ((c = g.length) > s && (c = s), c && (g.head && (R = g.head.extra_len - g.length, g.head.extra || (g.head.extra = new Array(g.head.extra_len)), Ne.arraySet(g.head.extra, C, e, c, R)), 512 & g.flags && (g.check = as(g.check, C, c, e)), s -= c, e += c, g.length -= c), g.length)) break g;
  26496. g.length = 0, g.mode = 7;
  26497. case 7:
  26498. if (2048 & g.flags) {
  26499. if (s === 0) break g;
  26500. c = 0;
  26501. do
  26502. R = C[e + c++], g.head && R && g.length < 65536 && (g.head.name += String.fromCharCode(R));
  26503. while (R && c < s);
  26504. if (512 & g.flags && (g.check = as(g.check, C, c, e)), s -= c, e += c, R) break g;
  26505. } else g.head && (g.head.name = null);
  26506. g.length = 0, g.mode = 8;
  26507. case 8:
  26508. if (4096 & g.flags) {
  26509. if (s === 0) break g;
  26510. c = 0;
  26511. do
  26512. R = C[e + c++], g.head && R && g.length < 65536 && (g.head.comment += String.fromCharCode(R));
  26513. while (R && c < s);
  26514. if (512 & g.flags && (g.check = as(g.check, C, c, e)), s -= c, e += c, R) break g;
  26515. } else g.head && (g.head.comment = null);
  26516. g.mode = 9;
  26517. case 9:
  26518. if (512 & g.flags) {
  26519. for (; a < 16; ) {
  26520. if (s === 0) break g;
  26521. s--, n += C[e++] << a, a += 8;
  26522. }
  26523. if (n !== (65535 & g.check)) {
  26524. t.msg = "header crc mismatch", g.mode = 30;
  26525. break;
  26526. }
  26527. n = 0, a = 0;
  26528. }
  26529. g.head && (g.head.hcrc = g.flags >> 9 & 1, g.head.done = !0), t.adler = g.check = 0, g.mode = 12;
  26530. break;
  26531. case 10:
  26532. for (; a < 32; ) {
  26533. if (s === 0) break g;
  26534. s--, n += C[e++] << a, a += 8;
  26535. }
  26536. t.adler = g.check = x_(n), n = 0, a = 0, g.mode = 11;
  26537. case 11:
  26538. if (g.havedict === 0) return t.next_out = A, t.avail_out = l, t.next_in = e, t.avail_in = s, g.hold = n, g.bits = a, 2;
  26539. t.adler = g.check = 1, g.mode = 12;
  26540. case 12:
  26541. if (I === 5 || I === 6) break g;
  26542. case 13:
  26543. if (g.last) {
  26544. n >>>= 7 & a, a -= 7 & a, g.mode = 27;
  26545. break;
  26546. }
  26547. for (; a < 3; ) {
  26548. if (s === 0) break g;
  26549. s--, n += C[e++] << a, a += 8;
  26550. }
  26551. switch (g.last = 1 & n, a -= 1, 3 & (n >>>= 1)) {
  26552. case 0:
  26553. g.mode = 14;
  26554. break;
  26555. case 1:
  26556. if (s0g(g), g.mode = 20, I === 6) {
  26557. n >>>= 2, a -= 2;
  26558. break g;
  26559. }
  26560. break;
  26561. case 2:
  26562. g.mode = 17;
  26563. break;
  26564. case 3:
  26565. t.msg = "invalid block type", g.mode = 30;
  26566. }
  26567. n >>>= 2, a -= 2;
  26568. break;
  26569. case 14:
  26570. for (n >>>= 7 & a, a -= 7 & a; a < 32; ) {
  26571. if (s === 0) break g;
  26572. s--, n += C[e++] << a, a += 8;
  26573. }
  26574. if ((65535 & n) != (n >>> 16 ^ 65535)) {
  26575. t.msg = "invalid stored block lengths", g.mode = 30;
  26576. break;
  26577. }
  26578. if (g.length = 65535 & n, n = 0, a = 0, g.mode = 15, I === 6) break g;
  26579. case 15:
  26580. g.mode = 16;
  26581. case 16:
  26582. if (c = g.length) {
  26583. if (c > s && (c = s), c > l && (c = l), c === 0) break g;
  26584. Ne.arraySet(i, C, e, c, A), s -= c, e += c, l -= c, A += c, g.length -= c;
  26585. break;
  26586. }
  26587. g.mode = 12;
  26588. break;
  26589. case 17:
  26590. for (; a < 14; ) {
  26591. if (s === 0) break g;
  26592. s--, n += C[e++] << a, a += 8;
  26593. }
  26594. if (g.nlen = 257 + (31 & n), n >>>= 5, a -= 5, g.ndist = 1 + (31 & n), n >>>= 5, a -= 5, g.ncode = 4 + (15 & n), n >>>= 4, a -= 4, g.nlen > 286 || g.ndist > 30) {
  26595. t.msg = "too many length or distance symbols", g.mode = 30;
  26596. break;
  26597. }
  26598. g.have = 0, g.mode = 18;
  26599. case 18:
  26600. for (; g.have < g.ncode; ) {
  26601. for (; a < 3; ) {
  26602. if (s === 0) break g;
  26603. s--, n += C[e++] << a, a += 8;
  26604. }
  26605. g.lens[K[g.have++]] = 7 & n, n >>>= 3, a -= 3;
  26606. }
  26607. for (; g.have < 19; ) g.lens[K[g.have++]] = 0;
  26608. if (g.lencode = g.lendyn, g.lenbits = 7, H = { bits: g.lenbits }, X = Nm(0, g.lens, 0, 19, g.lencode, 0, g.work, H), g.lenbits = H.bits, X) {
  26609. t.msg = "invalid code lengths set", g.mode = 30;
  26610. break;
  26611. }
  26612. g.have = 0, g.mode = 19;
  26613. case 19:
  26614. for (; g.have < g.nlen + g.ndist; ) {
  26615. for (; u = (z = g.lencode[n & (1 << g.lenbits) - 1]) >>> 16 & 255, m = 65535 & z, !((b = z >>> 24) <= a); ) {
  26616. if (s === 0) break g;
  26617. s--, n += C[e++] << a, a += 8;
  26618. }
  26619. if (m < 16) n >>>= b, a -= b, g.lens[g.have++] = m;
  26620. else {
  26621. if (m === 16) {
  26622. for (S = b + 2; a < S; ) {
  26623. if (s === 0) break g;
  26624. s--, n += C[e++] << a, a += 8;
  26625. }
  26626. if (n >>>= b, a -= b, g.have === 0) {
  26627. t.msg = "invalid bit length repeat", g.mode = 30;
  26628. break;
  26629. }
  26630. R = g.lens[g.have - 1], c = 3 + (3 & n), n >>>= 2, a -= 2;
  26631. } else if (m === 17) {
  26632. for (S = b + 3; a < S; ) {
  26633. if (s === 0) break g;
  26634. s--, n += C[e++] << a, a += 8;
  26635. }
  26636. a -= b, R = 0, c = 3 + (7 & (n >>>= b)), n >>>= 3, a -= 3;
  26637. } else {
  26638. for (S = b + 7; a < S; ) {
  26639. if (s === 0) break g;
  26640. s--, n += C[e++] << a, a += 8;
  26641. }
  26642. a -= b, R = 0, c = 11 + (127 & (n >>>= b)), n >>>= 7, a -= 7;
  26643. }
  26644. if (g.have + c > g.nlen + g.ndist) {
  26645. t.msg = "invalid bit length repeat", g.mode = 30;
  26646. break;
  26647. }
  26648. for (; c--; ) g.lens[g.have++] = R;
  26649. }
  26650. }
  26651. if (g.mode === 30) break;
  26652. if (g.lens[256] === 0) {
  26653. t.msg = "invalid code -- missing end-of-block", g.mode = 30;
  26654. break;
  26655. }
  26656. if (g.lenbits = 9, H = { bits: g.lenbits }, X = Nm(1, g.lens, 0, g.nlen, g.lencode, 0, g.work, H), g.lenbits = H.bits, X) {
  26657. t.msg = "invalid literal/lengths set", g.mode = 30;
  26658. break;
  26659. }
  26660. if (g.distbits = 6, g.distcode = g.distdyn, H = { bits: g.distbits }, X = Nm(2, g.lens, g.nlen, g.ndist, g.distcode, 0, g.work, H), g.distbits = H.bits, X) {
  26661. t.msg = "invalid distances set", g.mode = 30;
  26662. break;
  26663. }
  26664. if (g.mode = 20, I === 6) break g;
  26665. case 20:
  26666. g.mode = 21;
  26667. case 21:
  26668. if (s >= 6 && l >= 258) {
  26669. t.next_out = A, t.avail_out = l, t.next_in = e, t.avail_in = s, g.hold = n, g.bits = a, e0g(t, o), A = t.next_out, i = t.output, l = t.avail_out, e = t.next_in, C = t.input, s = t.avail_in, n = g.hold, a = g.bits, g.mode === 12 && (g.back = -1);
  26670. break;
  26671. }
  26672. for (g.back = 0; u = (z = g.lencode[n & (1 << g.lenbits) - 1]) >>> 16 & 255, m = 65535 & z, !((b = z >>> 24) <= a); ) {
  26673. if (s === 0) break g;
  26674. s--, n += C[e++] << a, a += 8;
  26675. }
  26676. if (u && (240 & u) == 0) {
  26677. for (Z = b, p = u, Y = m; u = (z = g.lencode[Y + ((n & (1 << Z + p) - 1) >> Z)]) >>> 16 & 255, m = 65535 & z, !(Z + (b = z >>> 24) <= a); ) {
  26678. if (s === 0) break g;
  26679. s--, n += C[e++] << a, a += 8;
  26680. }
  26681. n >>>= Z, a -= Z, g.back += Z;
  26682. }
  26683. if (n >>>= b, a -= b, g.back += b, g.length = m, u === 0) {
  26684. g.mode = 26;
  26685. break;
  26686. }
  26687. if (32 & u) {
  26688. g.back = -1, g.mode = 12;
  26689. break;
  26690. }
  26691. if (64 & u) {
  26692. t.msg = "invalid literal/length code", g.mode = 30;
  26693. break;
  26694. }
  26695. g.extra = 15 & u, g.mode = 22;
  26696. case 22:
  26697. if (g.extra) {
  26698. for (S = g.extra; a < S; ) {
  26699. if (s === 0) break g;
  26700. s--, n += C[e++] << a, a += 8;
  26701. }
  26702. g.length += n & (1 << g.extra) - 1, n >>>= g.extra, a -= g.extra, g.back += g.extra;
  26703. }
  26704. g.was = g.length, g.mode = 23;
  26705. case 23:
  26706. for (; u = (z = g.distcode[n & (1 << g.distbits) - 1]) >>> 16 & 255, m = 65535 & z, !((b = z >>> 24) <= a); ) {
  26707. if (s === 0) break g;
  26708. s--, n += C[e++] << a, a += 8;
  26709. }
  26710. if ((240 & u) == 0) {
  26711. for (Z = b, p = u, Y = m; u = (z = g.distcode[Y + ((n & (1 << Z + p) - 1) >> Z)]) >>> 16 & 255, m = 65535 & z, !(Z + (b = z >>> 24) <= a); ) {
  26712. if (s === 0) break g;
  26713. s--, n += C[e++] << a, a += 8;
  26714. }
  26715. n >>>= Z, a -= Z, g.back += Z;
  26716. }
  26717. if (n >>>= b, a -= b, g.back += b, 64 & u) {
  26718. t.msg = "invalid distance code", g.mode = 30;
  26719. break;
  26720. }
  26721. g.offset = m, g.extra = 15 & u, g.mode = 24;
  26722. case 24:
  26723. if (g.extra) {
  26724. for (S = g.extra; a < S; ) {
  26725. if (s === 0) break g;
  26726. s--, n += C[e++] << a, a += 8;
  26727. }
  26728. g.offset += n & (1 << g.extra) - 1, n >>>= g.extra, a -= g.extra, g.back += g.extra;
  26729. }
  26730. if (g.offset > g.dmax) {
  26731. t.msg = "invalid distance too far back", g.mode = 30;
  26732. break;
  26733. }
  26734. g.mode = 25;
  26735. case 25:
  26736. if (l === 0) break g;
  26737. if (c = o - l, g.offset > c) {
  26738. if ((c = g.offset - c) > g.whave && g.sane) {
  26739. t.msg = "invalid distance too far back", g.mode = 30;
  26740. break;
  26741. }
  26742. c > g.wnext ? (c -= g.wnext, r = g.wsize - c) : r = g.wnext - c, c > g.length && (c = g.length), h = g.window;
  26743. } else h = i, r = A - g.offset, c = g.length;
  26744. c > l && (c = l), l -= c, g.length -= c;
  26745. do
  26746. i[A++] = h[r++];
  26747. while (--c);
  26748. g.length === 0 && (g.mode = 21);
  26749. break;
  26750. case 26:
  26751. if (l === 0) break g;
  26752. i[A++] = g.length, l--, g.mode = 21;
  26753. break;
  26754. case 27:
  26755. if (g.wrap) {
  26756. for (; a < 32; ) {
  26757. if (s === 0) break g;
  26758. s--, n |= C[e++] << a, a += 8;
  26759. }
  26760. if (o -= l, t.total_out += o, g.total += o, o && (t.adler = g.check = g.flags ? as(g.check, i, o, A - o) : YX(g.check, i, o, A - o)), o = l, (g.flags ? n : x_(n)) !== g.check) {
  26761. t.msg = "incorrect data check", g.mode = 30;
  26762. break;
  26763. }
  26764. n = 0, a = 0;
  26765. }
  26766. g.mode = 28;
  26767. case 28:
  26768. if (g.wrap && g.flags) {
  26769. for (; a < 32; ) {
  26770. if (s === 0) break g;
  26771. s--, n += C[e++] << a, a += 8;
  26772. }
  26773. if (n !== (4294967295 & g.total)) {
  26774. t.msg = "incorrect length check", g.mode = 30;
  26775. break;
  26776. }
  26777. n = 0, a = 0;
  26778. }
  26779. g.mode = 29;
  26780. case 29:
  26781. X = 1;
  26782. break g;
  26783. case 30:
  26784. X = -3;
  26785. break g;
  26786. case 31:
  26787. return -4;
  26788. default:
  26789. return -2;
  26790. }
  26791. return t.next_out = A, t.avail_out = l, t.next_in = e, t.avail_in = s, g.hold = n, g.bits = a, (g.wsize || o !== t.avail_out && g.mode < 30 && (g.mode < 27 || I !== 4)) && O_(t, t.output, t.next_out, o - t.avail_out), d -= t.avail_in, o -= t.avail_out, t.total_in += d, t.total_out += o, g.total += o, g.wrap && o && (t.adler = g.check = g.flags ? as(g.check, i, o, t.next_out - o) : YX(g.check, i, o, t.next_out - o)), t.data_type = g.bits + (g.last ? 64 : 0) + (g.mode === 12 ? 128 : 0) + (g.mode === 20 || g.mode === 15 ? 256 : 0), (d === 0 && o === 0 || I === 4) && X === 0 && (X = -5), X;
  26792. }, bA.inflateEnd = function(t) {
  26793. if (!t || !t.state) return -2;
  26794. var I = t.state;
  26795. return I.window && (I.window = null), t.state = null, 0;
  26796. }, bA.inflateGetHeader = function(t, I) {
  26797. var g;
  26798. return t && t.state ? (2 & (g = t.state).wrap) == 0 ? -2 : (g.head = I, I.done = !1, 0) : -2;
  26799. }, bA.inflateSetDictionary = function(t, I) {
  26800. var g, C = I.length;
  26801. return t && t.state ? (g = t.state).wrap !== 0 && g.mode !== 11 ? -2 : g.mode === 11 && YX(1, I, C, 0) !== g.check ? -3 : O_(t, I, C, C) ? (g.mode = 31, -4) : (g.havedict = 1, 0) : -2;
  26802. }, bA.inflateInfo = "pako inflate (from Nodeca project)";
  26803. var rtg = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 }, bh = bA, am = tn, UN = Uo, tt = rtg, wD = x9, l0g = ntg, n0g = function() {
  26804. this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = "", this.comment = "", this.hcrc = 0, this.done = !1;
  26805. }, htg = Object.prototype.toString;
  26806. function Ic(t) {
  26807. if (!(this instanceof Ic)) return new Ic(t);
  26808. this.options = am.assign({ chunkSize: 16384, windowBits: 0, to: "" }, t || {});
  26809. var I = this.options;
  26810. I.raw && I.windowBits >= 0 && I.windowBits < 16 && (I.windowBits = -I.windowBits, I.windowBits === 0 && (I.windowBits = -15)), !(I.windowBits >= 0 && I.windowBits < 16) || t && t.windowBits || (I.windowBits += 32), I.windowBits > 15 && I.windowBits < 48 && (15 & I.windowBits) == 0 && (I.windowBits |= 15), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new l0g(), this.strm.avail_out = 0;
  26811. var g = bh.inflateInit2(this.strm, I.windowBits);
  26812. if (g !== tt.Z_OK) throw new Error(wD[g]);
  26813. if (this.header = new n0g(), bh.inflateGetHeader(this.strm, this.header), I.dictionary && (typeof I.dictionary == "string" ? I.dictionary = UN.string2buf(I.dictionary) : htg.call(I.dictionary) === "[object ArrayBuffer]" && (I.dictionary = new Uint8Array(I.dictionary)), I.raw && (g = bh.inflateSetDictionary(this.strm, I.dictionary)) !== tt.Z_OK)) throw new Error(wD[g]);
  26814. }
  26815. function MX(t, I) {
  26816. var g = new Ic(I);
  26817. if (g.push(t, !0), g.err) throw g.msg || wD[g.err];
  26818. return g.result;
  26819. }
  26820. Ic.prototype.push = function(t, I) {
  26821. var g, C, i, e, A, s = this.strm, l = this.options.chunkSize, n = this.options.dictionary, a = !1;
  26822. if (this.ended) return !1;
  26823. C = I === ~~I ? I : I === !0 ? tt.Z_FINISH : tt.Z_NO_FLUSH, typeof t == "string" ? s.input = UN.binstring2buf(t) : htg.call(t) === "[object ArrayBuffer]" ? s.input = new Uint8Array(t) : s.input = t, s.next_in = 0, s.avail_in = s.input.length;
  26824. do {
  26825. if (s.avail_out === 0 && (s.output = new am.Buf8(l), s.next_out = 0, s.avail_out = l), (g = bh.inflate(s, tt.Z_NO_FLUSH)) === tt.Z_NEED_DICT && n && (g = bh.inflateSetDictionary(this.strm, n)), g === tt.Z_BUF_ERROR && a === !0 && (g = tt.Z_OK, a = !1), g !== tt.Z_STREAM_END && g !== tt.Z_OK) return this.onEnd(g), this.ended = !0, !1;
  26826. s.next_out && (s.avail_out !== 0 && g !== tt.Z_STREAM_END && (s.avail_in !== 0 || C !== tt.Z_FINISH && C !== tt.Z_SYNC_FLUSH) || (this.options.to === "string" ? (i = UN.utf8border(s.output, s.next_out), e = s.next_out - i, A = UN.buf2string(s.output, i), s.next_out = e, s.avail_out = l - e, e && am.arraySet(s.output, s.output, i, e, 0), this.onData(A)) : this.onData(am.shrinkBuf(s.output, s.next_out)))), s.avail_in === 0 && s.avail_out === 0 && (a = !0);
  26827. } while ((s.avail_in > 0 || s.avail_out === 0) && g !== tt.Z_STREAM_END);
  26828. return g === tt.Z_STREAM_END && (C = tt.Z_FINISH), C === tt.Z_FINISH ? (g = bh.inflateEnd(this.strm), this.onEnd(g), this.ended = !0, g === tt.Z_OK) : C !== tt.Z_SYNC_FLUSH || (this.onEnd(tt.Z_OK), s.avail_out = 0, !0);
  26829. }, Ic.prototype.onData = function(t) {
  26830. this.chunks.push(t);
  26831. }, Ic.prototype.onEnd = function(t) {
  26832. t === tt.Z_OK && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = am.flattenChunks(this.chunks)), this.chunks = [], this.err = t, this.msg = this.strm.msg;
  26833. }, nm.Inflate = Ic, nm.inflate = MX, nm.inflateRaw = function(t, I) {
  26834. return (I = I || {}).raw = !0, MX(t, I);
  26835. }, nm.ungzip = MX;
  26836. var btg = {};
  26837. (0, tn.assign)(btg, em, nm, rtg);
  26838. var a0g = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Uint32Array < "u", o0g = btg, U_ = gt(), EN = eA, c0g = a0g ? "uint8array" : "array";
  26839. function vo(t, I) {
  26840. EN.call(this, "FlateWorker/" + t), this._pako = null, this._pakoAction = t, this._pakoOptions = I, this.meta = {};
  26841. }
  26842. QN.magic = "\b\0", U_.inherits(vo, EN), vo.prototype.processChunk = function(t) {
  26843. this.meta = t.meta, this._pako === null && this._createPako(), this._pako.push(U_.transformTo(c0g, t.data), !1);
  26844. }, vo.prototype.flush = function() {
  26845. EN.prototype.flush.call(this), this._pako === null && this._createPako(), this._pako.push([], !0);
  26846. }, vo.prototype.cleanUp = function() {
  26847. EN.prototype.cleanUp.call(this), this._pako = null;
  26848. }, vo.prototype._createPako = function() {
  26849. this._pako = new o0g[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });
  26850. var t = this;
  26851. this._pako.onData = function(I) {
  26852. t.push({ data: I, meta: t.meta });
  26853. };
  26854. }, QN.compressWorker = function(t) {
  26855. return new vo("Deflate", t);
  26856. }, QN.uncompressWorker = function() {
  26857. return new vo("Inflate", {});
  26858. };
  26859. var E_ = eA;
  26860. uV.STORE = { magic: "\0\0", compressWorker: function() {
  26861. return new E_("STORE compression");
  26862. }, uncompressWorker: function() {
  26863. return new E_("STORE decompression");
  26864. } }, uV.DEFLATE = QN;
  26865. var utg = { LOCAL_FILE_HEADER: "PK", CENTRAL_FILE_HEADER: "PK", CENTRAL_DIRECTORY_END: "PK", ZIP64_CENTRAL_DIRECTORY_LOCATOR: "PK\x07", ZIP64_CENTRAL_DIRECTORY_END: "PK", DATA_DESCRIPTOR: "PK\x07\b" }, sh = gt(), Ch = eA, RX = M0, P_ = J9, GV = utg, VC = function(t, I) {
  26866. var g, C = "";
  26867. for (g = 0; g < I; g++) C += String.fromCharCode(255 & t), t >>>= 8;
  26868. return C;
  26869. }, __ = function(t, I, g, C, i, e) {
  26870. var A, s, l = t.file, n = t.compression, a = e !== RX.utf8encode, d = sh.transformTo("string", e(l.name)), o = sh.transformTo("string", RX.utf8encode(l.name)), c = l.comment, r = sh.transformTo("string", e(c)), h = sh.transformTo("string", RX.utf8encode(c)), b = o.length !== l.name.length, u = h.length !== c.length, m = "", Z = "", p = "", Y = l.dir, R = l.date, X = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };
  26871. I && !g || (X.crc32 = t.crc32, X.compressedSize = t.compressedSize, X.uncompressedSize = t.uncompressedSize);
  26872. var H = 0;
  26873. I && (H |= 8), a || !b && !u || (H |= 2048);
  26874. var S, z, v, K = 0, V = 0;
  26875. Y && (K |= 16), i === "UNIX" ? (V = 798, K |= (S = l.unixPermissions, z = Y, v = S, S || (v = z ? 16893 : 33204), (65535 & v) << 16)) : (V = 20, K |= 63 & (l.dosPermissions || 0)), A = R.getUTCHours(), A <<= 6, A |= R.getUTCMinutes(), A <<= 5, A |= R.getUTCSeconds() / 2, s = R.getUTCFullYear() - 1980, s <<= 4, s |= R.getUTCMonth() + 1, s <<= 5, s |= R.getUTCDate(), b && (Z = VC(1, 1) + VC(P_(d), 4) + o, m += "up" + VC(Z.length, 2) + Z), u && (p = VC(1, 1) + VC(P_(r), 4) + h, m += "uc" + VC(p.length, 2) + p);
  26876. var N = "";
  26877. return N += `
  26878. \0`, N += VC(H, 2), N += n.magic, N += VC(A, 2), N += VC(s, 2), N += VC(X.crc32, 4), N += VC(X.compressedSize, 4), N += VC(X.uncompressedSize, 4), N += VC(d.length, 2), N += VC(m.length, 2), { fileRecord: GV.LOCAL_FILE_HEADER + N + d + m, dirRecord: GV.CENTRAL_FILE_HEADER + VC(V, 2) + N + VC(r.length, 2) + "\0\0\0\0" + VC(K, 4) + VC(C, 4) + d + m + r };
  26879. }, d0g = function(t) {
  26880. return GV.DATA_DESCRIPTOR + VC(t.crc32, 4) + VC(t.compressedSize, 4) + VC(t.uncompressedSize, 4);
  26881. };
  26882. function uA(t, I, g, C) {
  26883. Ch.call(this, "ZipFileWorker"), this.bytesWritten = 0, this.zipComment = I, this.zipPlatform = g, this.encodeFileName = C, this.streamFiles = t, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];
  26884. }
  26885. sh.inherits(uA, Ch), uA.prototype.push = function(t) {
  26886. var I = t.meta.percent || 0, g = this.entriesCount, C = this._sources.length;
  26887. this.accumulate ? this.contentBuffer.push(t) : (this.bytesWritten += t.data.length, Ch.prototype.push.call(this, { data: t.data, meta: { currentFile: this.currentFile, percent: g ? (I + 100 * (g - C - 1)) / g : 100 } }));
  26888. }, uA.prototype.openedSource = function(t) {
  26889. this.currentSourceOffset = this.bytesWritten, this.currentFile = t.file.name;
  26890. var I = this.streamFiles && !t.file.dir;
  26891. if (I) {
  26892. var g = __(t, I, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
  26893. this.push({ data: g.fileRecord, meta: { percent: 0 } });
  26894. } else this.accumulate = !0;
  26895. }, uA.prototype.closedSource = function(t) {
  26896. this.accumulate = !1;
  26897. var I = this.streamFiles && !t.file.dir, g = __(t, I, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
  26898. if (this.dirRecords.push(g.dirRecord), I) this.push({ data: d0g(t), meta: { percent: 100 } });
  26899. else for (this.push({ data: g.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length; ) this.push(this.contentBuffer.shift());
  26900. this.currentFile = null;
  26901. }, uA.prototype.flush = function() {
  26902. for (var t = this.bytesWritten, I = 0; I < this.dirRecords.length; I++) this.push({ data: this.dirRecords[I], meta: { percent: 100 } });
  26903. var g = this.bytesWritten - t, C = function(i, e, A, s, l) {
  26904. var n = sh.transformTo("string", l(s));
  26905. return GV.CENTRAL_DIRECTORY_END + "\0\0\0\0" + VC(i, 2) + VC(i, 2) + VC(e, 4) + VC(A, 4) + VC(n.length, 2) + n;
  26906. }(this.dirRecords.length, g, t, this.zipComment, this.encodeFileName);
  26907. this.push({ data: C, meta: { percent: 100 } });
  26908. }, uA.prototype.prepareNextSource = function() {
  26909. this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();
  26910. }, uA.prototype.registerPrevious = function(t) {
  26911. this._sources.push(t);
  26912. var I = this;
  26913. return t.on("data", function(g) {
  26914. I.processChunk(g);
  26915. }), t.on("end", function() {
  26916. I.closedSource(I.previous.streamInfo), I._sources.length ? I.prepareNextSource() : I.end();
  26917. }), t.on("error", function(g) {
  26918. I.error(g);
  26919. }), this;
  26920. }, uA.prototype.resume = function() {
  26921. return !!Ch.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));
  26922. }, uA.prototype.error = function(t) {
  26923. var I = this._sources;
  26924. if (!Ch.prototype.error.call(this, t)) return !1;
  26925. for (var g = 0; g < I.length; g++) try {
  26926. I[g].error(t);
  26927. } catch {
  26928. }
  26929. return !0;
  26930. }, uA.prototype.lock = function() {
  26931. Ch.prototype.lock.call(this);
  26932. for (var t = this._sources, I = 0; I < t.length; I++) t[I].lock();
  26933. };
  26934. var r0g = uV, h0g = uA;
  26935. PCg.generateWorker = function(t, I, g) {
  26936. var C = new h0g(I.streamFiles, g, I.platform, I.encodeFileName), i = 0;
  26937. try {
  26938. t.forEach(function(e, A) {
  26939. i++;
  26940. var s = function(d, o) {
  26941. var c = d || o, r = r0g[c];
  26942. if (!r) throw new Error(c + " is not a valid compression method !");
  26943. return r;
  26944. }(A.options.compression, I.compression), l = A.options.compressionOptions || I.compressionOptions || {}, n = A.dir, a = A.date;
  26945. A._compressWorker(s, l).withStreamInfo("file", { name: e, dir: n, date: a, comment: A.comment || "", unixPermissions: A.unixPermissions, dosPermissions: A.dosPermissions }).pipe(C);
  26946. }), C.entriesCount = i;
  26947. } catch (e) {
  26948. C.error(e);
  26949. }
  26950. return C;
  26951. };
  26952. var b0g = gt(), PN = eA;
  26953. function om(t, I) {
  26954. PN.call(this, "Nodejs stream input adapter for " + t), this._upstreamEnded = !1, this._bindStream(I);
  26955. }
  26956. b0g.inherits(om, PN), om.prototype._bindStream = function(t) {
  26957. var I = this;
  26958. this._stream = t, t.pause(), t.on("data", function(g) {
  26959. I.push({ data: g, meta: { percent: 0 } });
  26960. }).on("error", function(g) {
  26961. I.isPaused ? this.generatedError = g : I.error(g);
  26962. }).on("end", function() {
  26963. I.isPaused ? I._upstreamEnded = !0 : I.end();
  26964. });
  26965. }, om.prototype.pause = function() {
  26966. return !!PN.prototype.pause.call(this) && (this._stream.pause(), !0);
  26967. }, om.prototype.resume = function() {
  26968. return !!PN.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);
  26969. };
  26970. var u0g = om, m0g = M0, Vm = gt(), mtg = eA, Z0g = jCg, Ztg = QCg, q_ = L9, G0g = Uhg, w0g = PCg, $_ = cM, p0g = u0g, Gtg = function(t, I, g) {
  26971. var C, i = Vm.getTypeOf(I), e = Vm.extend(g || {}, Ztg);
  26972. e.date = e.date || /* @__PURE__ */ new Date(), e.compression !== null && (e.compression = e.compression.toUpperCase()), typeof e.unixPermissions == "string" && (e.unixPermissions = parseInt(e.unixPermissions, 8)), e.unixPermissions && 16384 & e.unixPermissions && (e.dir = !0), e.dosPermissions && 16 & e.dosPermissions && (e.dir = !0), e.dir && (t = wtg(t)), e.createFolders && (C = B0g(t)) && ptg.call(this, C, !0);
  26973. var A = i === "string" && e.binary === !1 && e.base64 === !1;
  26974. g && g.binary !== void 0 || (e.binary = !A), (I instanceof q_ && I.uncompressedSize === 0 || e.dir || !I || I.length === 0) && (e.base64 = !1, e.binary = !0, I = "", e.compression = "STORE", i = "string");
  26975. var s = null;
  26976. s = I instanceof q_ || I instanceof mtg ? I : $_.isNode && $_.isStream(I) ? new p0g(t, I) : Vm.prepareContent(t, I, e.binary, e.optimizedBinaryString, e.base64);
  26977. var l = new G0g(t, s, e);
  26978. this.files[t] = l;
  26979. }, B0g = function(t) {
  26980. t.slice(-1) === "/" && (t = t.substring(0, t.length - 1));
  26981. var I = t.lastIndexOf("/");
  26982. return I > 0 ? t.substring(0, I) : "";
  26983. }, wtg = function(t) {
  26984. return t.slice(-1) !== "/" && (t += "/"), t;
  26985. }, ptg = function(t, I) {
  26986. return I = I !== void 0 ? I : Ztg.createFolders, t = wtg(t), this.files[t] || Gtg.call(this, t, null, { dir: !0, createFolders: I }), this.files[t];
  26987. };
  26988. function gq(t) {
  26989. return Object.prototype.toString.call(t) === "[object RegExp]";
  26990. }
  26991. var W0g = { load: function() {
  26992. throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
  26993. }, forEach: function(t) {
  26994. var I, g, C;
  26995. for (I in this.files) C = this.files[I], (g = I.slice(this.root.length, I.length)) && I.slice(0, this.root.length) === this.root && t(g, C);
  26996. }, filter: function(t) {
  26997. var I = [];
  26998. return this.forEach(function(g, C) {
  26999. t(g, C) && I.push(C);
  27000. }), I;
  27001. }, file: function(t, I, g) {
  27002. if (arguments.length === 1) {
  27003. if (gq(t)) {
  27004. var C = t;
  27005. return this.filter(function(e, A) {
  27006. return !A.dir && C.test(e);
  27007. });
  27008. }
  27009. var i = this.files[this.root + t];
  27010. return i && !i.dir ? i : null;
  27011. }
  27012. return t = this.root + t, Gtg.call(this, t, I, g), this;
  27013. }, folder: function(t) {
  27014. if (!t) return this;
  27015. if (gq(t)) return this.filter(function(i, e) {
  27016. return e.dir && t.test(i);
  27017. });
  27018. var I = this.root + t, g = ptg.call(this, I), C = this.clone();
  27019. return C.root = g.name, C;
  27020. }, remove: function(t) {
  27021. t = this.root + t;
  27022. var I = this.files[t];
  27023. if (I || (t.slice(-1) !== "/" && (t += "/"), I = this.files[t]), I && !I.dir) delete this.files[t];
  27024. else for (var g = this.filter(function(i, e) {
  27025. return e.name.slice(0, t.length) === t;
  27026. }), C = 0; C < g.length; C++) delete this.files[g[C].name];
  27027. return this;
  27028. }, generate: function() {
  27029. throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
  27030. }, generateInternalStream: function(t) {
  27031. var I, g = {};
  27032. try {
  27033. if ((g = Vm.extend(t || {}, { streamFiles: !1, compression: "STORE", compressionOptions: null, type: "", platform: "DOS", comment: null, mimeType: "application/zip", encodeFileName: m0g.utf8encode })).type = g.type.toLowerCase(), g.compression = g.compression.toUpperCase(), g.type === "binarystring" && (g.type = "string"), !g.type) throw new Error("No output type specified.");
  27034. Vm.checkSupport(g.type), g.platform !== "darwin" && g.platform !== "freebsd" && g.platform !== "linux" && g.platform !== "sunos" || (g.platform = "UNIX"), g.platform === "win32" && (g.platform = "DOS");
  27035. var C = g.comment || this.comment || "";
  27036. I = w0g.generateWorker(this, g, C);
  27037. } catch (i) {
  27038. (I = new mtg("error")).error(i);
  27039. }
  27040. return new Z0g(I, g.type || "string", g.mimeType);
  27041. }, generateAsync: function(t, I) {
  27042. return this.generateInternalStream(t).accumulate(I);
  27043. }, generateNodeStream: function(t, I) {
  27044. return (t = t || {}).type || (t.type = "nodebuffer"), this.generateInternalStream(t).toNodejsStream(I);
  27045. } }, y0g = W0g, Y0g = gt();
  27046. function Btg(t) {
  27047. this.data = t, this.length = t.length, this.index = 0, this.zero = 0;
  27048. }
  27049. Btg.prototype = { checkOffset: function(t) {
  27050. this.checkIndex(this.index + t);
  27051. }, checkIndex: function(t) {
  27052. if (this.length < this.zero + t || t < 0) throw new Error("End of data reached (data length = " + this.length + ", asked index = " + t + "). Corrupted zip ?");
  27053. }, setIndex: function(t) {
  27054. this.checkIndex(t), this.index = t;
  27055. }, skip: function(t) {
  27056. this.setIndex(this.index + t);
  27057. }, byteAt: function() {
  27058. }, readInt: function(t) {
  27059. var I, g = 0;
  27060. for (this.checkOffset(t), I = this.index + t - 1; I >= this.index; I--) g = (g << 8) + this.byteAt(I);
  27061. return this.index += t, g;
  27062. }, readString: function(t) {
  27063. return Y0g.transformTo("string", this.readData(t));
  27064. }, readData: function() {
  27065. }, lastIndexOfSignature: function() {
  27066. }, readAndCheckSignature: function() {
  27067. }, readDate: function() {
  27068. var t = this.readInt(4);
  27069. return new Date(Date.UTC(1980 + (t >> 25 & 127), (t >> 21 & 15) - 1, t >> 16 & 31, t >> 11 & 31, t >> 5 & 63, (31 & t) << 1));
  27070. } };
  27071. var Wtg = Btg, ytg = Wtg;
  27072. function th(t) {
  27073. ytg.call(this, t);
  27074. for (var I = 0; I < this.data.length; I++) t[I] = 255 & t[I];
  27075. }
  27076. gt().inherits(th, ytg), th.prototype.byteAt = function(t) {
  27077. return this.data[this.zero + t];
  27078. }, th.prototype.lastIndexOfSignature = function(t) {
  27079. for (var I = t.charCodeAt(0), g = t.charCodeAt(1), C = t.charCodeAt(2), i = t.charCodeAt(3), e = this.length - 4; e >= 0; --e) if (this.data[e] === I && this.data[e + 1] === g && this.data[e + 2] === C && this.data[e + 3] === i) return e - this.zero;
  27080. return -1;
  27081. }, th.prototype.readAndCheckSignature = function(t) {
  27082. var I = t.charCodeAt(0), g = t.charCodeAt(1), C = t.charCodeAt(2), i = t.charCodeAt(3), e = this.readData(4);
  27083. return I === e[0] && g === e[1] && C === e[2] && i === e[3];
  27084. }, th.prototype.readData = function(t) {
  27085. if (this.checkOffset(t), t === 0) return [];
  27086. var I = this.data.slice(this.zero + this.index, this.zero + this.index + t);
  27087. return this.index += t, I;
  27088. };
  27089. var Ytg = th, Ntg = Wtg;
  27090. function ih(t) {
  27091. Ntg.call(this, t);
  27092. }
  27093. gt().inherits(ih, Ntg), ih.prototype.byteAt = function(t) {
  27094. return this.data.charCodeAt(this.zero + t);
  27095. }, ih.prototype.lastIndexOfSignature = function(t) {
  27096. return this.data.lastIndexOf(t) - this.zero;
  27097. }, ih.prototype.readAndCheckSignature = function(t) {
  27098. return t === this.readData(4);
  27099. }, ih.prototype.readData = function(t) {
  27100. this.checkOffset(t);
  27101. var I = this.data.slice(this.zero + this.index, this.zero + this.index + t);
  27102. return this.index += t, I;
  27103. };
  27104. var N0g = ih, Vtg = Ytg;
  27105. function pD(t) {
  27106. Vtg.call(this, t);
  27107. }
  27108. gt().inherits(pD, Vtg), pD.prototype.readData = function(t) {
  27109. if (this.checkOffset(t), t === 0) return new Uint8Array(0);
  27110. var I = this.data.subarray(this.zero + this.index, this.zero + this.index + t);
  27111. return this.index += t, I;
  27112. };
  27113. var Mtg = pD, Rtg = Mtg;
  27114. function BD(t) {
  27115. Rtg.call(this, t);
  27116. }
  27117. gt().inherits(BD, Rtg), BD.prototype.readData = function(t) {
  27118. this.checkOffset(t);
  27119. var I = this.data.slice(this.zero + this.index, this.zero + this.index + t);
  27120. return this.index += t, I;
  27121. };
  27122. var V0g = BD, _Y = gt(), Iq = rt, M0g = Ytg, R0g = N0g, f0g = V0g, H0g = Mtg, ftg = function(t) {
  27123. var I = _Y.getTypeOf(t);
  27124. return _Y.checkSupport(I), I !== "string" || Iq.uint8array ? I === "nodebuffer" ? new f0g(t) : Iq.uint8array ? new H0g(_Y.transformTo("uint8array", t)) : new M0g(_Y.transformTo("array", t)) : new R0g(t);
  27125. }, fX = ftg, Pn = gt(), X0g = L9, Cq = J9, qY = M0, $Y = uV, S0g = rt;
  27126. function Htg(t, I) {
  27127. this.options = t, this.loadOptions = I;
  27128. }
  27129. Htg.prototype = { isEncrypted: function() {
  27130. return (1 & this.bitFlag) == 1;
  27131. }, useUTF8: function() {
  27132. return (2048 & this.bitFlag) == 2048;
  27133. }, readLocalPart: function(t) {
  27134. var I, g;
  27135. if (t.skip(22), this.fileNameLength = t.readInt(2), g = t.readInt(2), this.fileName = t.readData(this.fileNameLength), t.skip(g), this.compressedSize === -1 || this.uncompressedSize === -1) throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");
  27136. if (I = function(C) {
  27137. for (var i in $Y) if (Object.prototype.hasOwnProperty.call($Y, i) && $Y[i].magic === C) return $Y[i];
  27138. return null;
  27139. }(this.compressionMethod), I === null) throw new Error("Corrupted zip : compression " + Pn.pretty(this.compressionMethod) + " unknown (inner file : " + Pn.transformTo("string", this.fileName) + ")");
  27140. this.decompressed = new X0g(this.compressedSize, this.uncompressedSize, this.crc32, I, t.readData(this.compressedSize));
  27141. }, readCentralPart: function(t) {
  27142. this.versionMadeBy = t.readInt(2), t.skip(2), this.bitFlag = t.readInt(2), this.compressionMethod = t.readString(2), this.date = t.readDate(), this.crc32 = t.readInt(4), this.compressedSize = t.readInt(4), this.uncompressedSize = t.readInt(4);
  27143. var I = t.readInt(2);
  27144. if (this.extraFieldsLength = t.readInt(2), this.fileCommentLength = t.readInt(2), this.diskNumberStart = t.readInt(2), this.internalFileAttributes = t.readInt(2), this.externalFileAttributes = t.readInt(4), this.localHeaderOffset = t.readInt(4), this.isEncrypted()) throw new Error("Encrypted zip are not supported");
  27145. t.skip(I), this.readExtraFields(t), this.parseZIP64ExtraField(t), this.fileComment = t.readData(this.fileCommentLength);
  27146. }, processAttributes: function() {
  27147. this.unixPermissions = null, this.dosPermissions = null;
  27148. var t = this.versionMadeBy >> 8;
  27149. this.dir = !!(16 & this.externalFileAttributes), t === 0 && (this.dosPermissions = 63 & this.externalFileAttributes), t === 3 && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || this.fileNameStr.slice(-1) !== "/" || (this.dir = !0);
  27150. }, parseZIP64ExtraField: function() {
  27151. if (this.extraFields[1]) {
  27152. var t = fX(this.extraFields[1].value);
  27153. this.uncompressedSize === Pn.MAX_VALUE_32BITS && (this.uncompressedSize = t.readInt(8)), this.compressedSize === Pn.MAX_VALUE_32BITS && (this.compressedSize = t.readInt(8)), this.localHeaderOffset === Pn.MAX_VALUE_32BITS && (this.localHeaderOffset = t.readInt(8)), this.diskNumberStart === Pn.MAX_VALUE_32BITS && (this.diskNumberStart = t.readInt(4));
  27154. }
  27155. }, readExtraFields: function(t) {
  27156. var I, g, C, i = t.index + this.extraFieldsLength;
  27157. for (this.extraFields || (this.extraFields = {}); t.index + 4 < i; ) I = t.readInt(2), g = t.readInt(2), C = t.readData(g), this.extraFields[I] = { id: I, length: g, value: C };
  27158. t.setIndex(i);
  27159. }, handleUTF8: function() {
  27160. var t = S0g.uint8array ? "uint8array" : "array";
  27161. if (this.useUTF8()) this.fileNameStr = qY.utf8decode(this.fileName), this.fileCommentStr = qY.utf8decode(this.fileComment);
  27162. else {
  27163. var I = this.findExtraFieldUnicodePath();
  27164. if (I !== null) this.fileNameStr = I;
  27165. else {
  27166. var g = Pn.transformTo(t, this.fileName);
  27167. this.fileNameStr = this.loadOptions.decodeFileName(g);
  27168. }
  27169. var C = this.findExtraFieldUnicodeComment();
  27170. if (C !== null) this.fileCommentStr = C;
  27171. else {
  27172. var i = Pn.transformTo(t, this.fileComment);
  27173. this.fileCommentStr = this.loadOptions.decodeFileName(i);
  27174. }
  27175. }
  27176. }, findExtraFieldUnicodePath: function() {
  27177. var t = this.extraFields[28789];
  27178. if (t) {
  27179. var I = fX(t.value);
  27180. return I.readInt(1) !== 1 || Cq(this.fileName) !== I.readInt(4) ? null : qY.utf8decode(I.readData(t.length - 5));
  27181. }
  27182. return null;
  27183. }, findExtraFieldUnicodeComment: function() {
  27184. var t = this.extraFields[25461];
  27185. if (t) {
  27186. var I = fX(t.value);
  27187. return I.readInt(1) !== 1 || Cq(this.fileComment) !== I.readInt(4) ? null : qY.utf8decode(I.readData(t.length - 5));
  27188. }
  27189. return null;
  27190. } };
  27191. var D0g = Htg, K0g = ftg, al = gt(), rA = utg, F0g = D0g, k0g = rt;
  27192. function Xtg(t) {
  27193. this.files = [], this.loadOptions = t;
  27194. }
  27195. Xtg.prototype = { checkSignature: function(t) {
  27196. if (!this.reader.readAndCheckSignature(t)) {
  27197. this.reader.index -= 4;
  27198. var I = this.reader.readString(4);
  27199. throw new Error("Corrupted zip or bug: unexpected signature (" + al.pretty(I) + ", expected " + al.pretty(t) + ")");
  27200. }
  27201. }, isSignature: function(t, I) {
  27202. var g = this.reader.index;
  27203. this.reader.setIndex(t);
  27204. var C = this.reader.readString(4) === I;
  27205. return this.reader.setIndex(g), C;
  27206. }, readBlockEndOfCentral: function() {
  27207. this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);
  27208. var t = this.reader.readData(this.zipCommentLength), I = k0g.uint8array ? "uint8array" : "array", g = al.transformTo(I, t);
  27209. this.zipComment = this.loadOptions.decodeFileName(g);
  27210. }, readBlockZip64EndOfCentral: function() {
  27211. this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};
  27212. for (var t, I, g, C = this.zip64EndOfCentralSize - 44; 0 < C; ) t = this.reader.readInt(2), I = this.reader.readInt(4), g = this.reader.readData(I), this.zip64ExtensibleData[t] = { id: t, length: I, value: g };
  27213. }, readBlockZip64EndOfCentralLocator: function() {
  27214. if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), this.disksCount > 1) throw new Error("Multi-volumes zip are not supported");
  27215. }, readLocalFiles: function() {
  27216. var t, I;
  27217. for (t = 0; t < this.files.length; t++) I = this.files[t], this.reader.setIndex(I.localHeaderOffset), this.checkSignature(rA.LOCAL_FILE_HEADER), I.readLocalPart(this.reader), I.handleUTF8(), I.processAttributes();
  27218. }, readCentralDir: function() {
  27219. var t;
  27220. for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(rA.CENTRAL_FILE_HEADER); ) (t = new F0g({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(t);
  27221. if (this.centralDirRecords !== this.files.length && this.centralDirRecords !== 0 && this.files.length === 0) throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length);
  27222. }, readEndOfCentral: function() {
  27223. var t = this.reader.lastIndexOfSignature(rA.CENTRAL_DIRECTORY_END);
  27224. if (t < 0) throw this.isSignature(0, rA.LOCAL_FILE_HEADER) ? new Error("Corrupted zip: can't find end of central directory") : new Error("Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html");
  27225. this.reader.setIndex(t);
  27226. var I = t;
  27227. if (this.checkSignature(rA.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === al.MAX_VALUE_16BITS || this.diskWithCentralDirStart === al.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === al.MAX_VALUE_16BITS || this.centralDirRecords === al.MAX_VALUE_16BITS || this.centralDirSize === al.MAX_VALUE_32BITS || this.centralDirOffset === al.MAX_VALUE_32BITS) {
  27228. if (this.zip64 = !0, (t = this.reader.lastIndexOfSignature(rA.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");
  27229. if (this.reader.setIndex(t), this.checkSignature(rA.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, rA.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(rA.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");
  27230. this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(rA.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();
  27231. }
  27232. var g = this.centralDirOffset + this.centralDirSize;
  27233. this.zip64 && (g += 20, g += 12 + this.zip64EndOfCentralSize);
  27234. var C = I - g;
  27235. if (C > 0) this.isSignature(I, rA.CENTRAL_FILE_HEADER) || (this.reader.zero = C);
  27236. else if (C < 0) throw new Error("Corrupted zip: missing " + Math.abs(C) + " bytes.");
  27237. }, prepareReader: function(t) {
  27238. this.reader = K0g(t);
  27239. }, load: function(t) {
  27240. this.prepareReader(t), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();
  27241. } };
  27242. var z0g = Xtg, HX = gt(), _N = mG, J0g = M0, L0g = z0g, v0g = ECg, tq = cM;
  27243. function T0g(t) {
  27244. return new _N.Promise(function(I, g) {
  27245. var C = t.decompressed.getContentWorker().pipe(new v0g());
  27246. C.on("error", function(i) {
  27247. g(i);
  27248. }).on("end", function() {
  27249. C.streamInfo.crc32 !== t.decompressed.crc32 ? g(new Error("Corrupted zip : CRC32 mismatch")) : I();
  27250. }).resume();
  27251. });
  27252. }
  27253. function $e() {
  27254. if (!(this instanceof $e)) return new $e();
  27255. if (arguments.length) throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");
  27256. this.files = /* @__PURE__ */ Object.create(null), this.comment = null, this.root = "", this.clone = function() {
  27257. var t = new $e();
  27258. for (var I in this) typeof this[I] != "function" && (t[I] = this[I]);
  27259. return t;
  27260. };
  27261. }
  27262. $e.prototype = y0g, $e.prototype.loadAsync = function(t, I) {
  27263. var g = this;
  27264. return I = HX.extend(I || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: J0g.utf8decode }), tq.isNode && tq.isStream(t) ? _N.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")) : HX.prepareContent("the loaded zip file", t, !0, I.optimizedBinaryString, I.base64).then(function(C) {
  27265. var i = new L0g(I);
  27266. return i.load(C), i;
  27267. }).then(function(C) {
  27268. var i = [_N.Promise.resolve(C)], e = C.files;
  27269. if (I.checkCRC32) for (var A = 0; A < e.length; A++) i.push(T0g(e[A]));
  27270. return _N.Promise.all(i);
  27271. }).then(function(C) {
  27272. for (var i = C.shift(), e = i.files, A = 0; A < e.length; A++) {
  27273. var s = e[A], l = s.fileNameStr, n = HX.resolve(s.fileNameStr);
  27274. g.file(n, s.decompressed, { binary: !0, optimizedBinaryString: !0, date: s.date, dir: s.dir, comment: s.fileCommentStr.length ? s.fileCommentStr : null, unixPermissions: s.unixPermissions, dosPermissions: s.dosPermissions, createFolders: I.createFolders }), s.dir || (g.file(n).unsafeOriginalName = l);
  27275. }
  27276. return i.zipComment.length && (g.comment = i.zipComment), g;
  27277. });
  27278. }, $e.support = rt, $e.defaults = QCg, $e.version = "3.10.1", $e.loadAsync = function(t, I) {
  27279. return new $e().loadAsync(t, I);
  27280. }, $e.external = mG;
  27281. var x0g = $e;
  27282. function j0g(t, I) {
  27283. var g = (I = I || {}).pos || 0, C = !!I.keepComments, i = !!I.keepWhitespace, e = 60, A = 62, s = 45, l = 47, n = 33, a = 39, d = 34, o = 91, c = 93;
  27284. function r(R) {
  27285. for (var X = []; t[g]; ) if (t.charCodeAt(g) == e) {
  27286. if (t.charCodeAt(g + 1) === l) {
  27287. var H = g + 2;
  27288. if (g = t.indexOf(">", g), t.substring(H, g).indexOf(R) == -1) {
  27289. var S = t.substring(0, g).split(`
  27290. `);
  27291. throw new Error(`Unexpected close tag
  27292. Line: ` + (S.length - 1) + `
  27293. Column: ` + (S[S.length - 1].length + 1) + `
  27294. Char: ` + t[g]);
  27295. }
  27296. return g + 1 && (g += 1), X;
  27297. }
  27298. if (t.charCodeAt(g + 1) === n) {
  27299. if (t.charCodeAt(g + 2) == s) {
  27300. const B = g;
  27301. for (; g !== -1 && (t.charCodeAt(g) !== A || t.charCodeAt(g - 1) != s || t.charCodeAt(g - 2) != s || g == -1); ) g = t.indexOf(">", g + 1);
  27302. g === -1 && (g = t.length), C && X.push(t.substring(B, g + 1));
  27303. } else {
  27304. if (t.charCodeAt(g + 2) === o && t.charCodeAt(g + 8) === o && t.substr(g + 3, 5).toLowerCase() === "cdata") {
  27305. var z = t.indexOf("]]>", g);
  27306. z == -1 ? (X.push(t.substr(g + 9)), g = t.length) : (X.push(t.substring(g + 9, z)), g = z + 3);
  27307. continue;
  27308. }
  27309. {
  27310. const B = g + 1;
  27311. g += 2;
  27312. for (var v = !1; (t.charCodeAt(g) !== A || v === !0) && t[g]; ) t.charCodeAt(g) === o ? v = !0 : v === !0 && t.charCodeAt(g) === c && (v = !1), g++;
  27313. X.push(t.substring(B, g));
  27314. }
  27315. }
  27316. g++;
  27317. continue;
  27318. }
  27319. var K = m();
  27320. X.push(K), K.tagName[0] === "?" && (X.push(...K.children), K.children = []);
  27321. } else {
  27322. var V = h();
  27323. if (i) V.length > 0 && X.push(V);
  27324. else {
  27325. var N = V.trim();
  27326. N.length > 0 && X.push(N);
  27327. }
  27328. g++;
  27329. }
  27330. return X;
  27331. }
  27332. function h() {
  27333. var R = g;
  27334. return (g = t.indexOf("<", g) - 1) === -2 && (g = t.length), t.slice(R, g + 1);
  27335. }
  27336. function b() {
  27337. for (var R = g; `\r
  27338. >/= `.indexOf(t[g]) === -1 && t[g]; ) g++;
  27339. return t.slice(R, g);
  27340. }
  27341. var u = I.noChildNodes || ["img", "br", "input", "meta", "link", "hr"];
  27342. function m() {
  27343. g++;
  27344. const R = b(), X = {};
  27345. let H = [];
  27346. for (; t.charCodeAt(g) !== A && t[g]; ) {
  27347. var S = t.charCodeAt(g);
  27348. if (S > 64 && S < 91 || S > 96 && S < 123) {
  27349. for (var z = b(), v = t.charCodeAt(g); v && v !== a && v !== d && !(v > 64 && v < 91 || v > 96 && v < 123) && v !== A; ) g++, v = t.charCodeAt(g);
  27350. if (v === a || v === d) {
  27351. var K = Z();
  27352. if (g === -1) return { tagName: R, attributes: X, children: H };
  27353. } else K = null, g--;
  27354. X[z] = K;
  27355. }
  27356. g++;
  27357. }
  27358. if (t.charCodeAt(g - 1) !== l) if (R == "script") {
  27359. var V = g + 1;
  27360. g = t.indexOf("<\/script>", g), H = [t.slice(V, g)], g += 9;
  27361. } else R == "style" ? (V = g + 1, g = t.indexOf("</style>", g), H = [t.slice(V, g)], g += 8) : u.indexOf(R) === -1 ? (g++, H = r(R)) : g++;
  27362. else g++;
  27363. return { tagName: R, attributes: X, children: H };
  27364. }
  27365. function Z() {
  27366. var R = t[g], X = g + 1;
  27367. return g = t.indexOf(R, X), t.slice(X, g);
  27368. }
  27369. var p, Y = null;
  27370. if (I.attrValue !== void 0)
  27371. for (I.attrName = I.attrName || "id", Y = []; p = void 0, p = new RegExp("\\s" + I.attrName + `\\s*=['"]` + I.attrValue + `['"]`).exec(t), (g = p ? p.index : -1) !== -1; ) (g = t.lastIndexOf("<", g)) !== -1 && Y.push(m()), t = t.substr(g), g = 0;
  27372. else Y = I.parseNode ? m() : r("");
  27373. return I.filter && (Y = Dtg(Y, I.filter)), I.simplify ? Stg(Array.isArray(Y) ? Y : [Y]) : (I.setPos && (Y.pos = g), Y);
  27374. }
  27375. function Stg(t) {
  27376. var I = {};
  27377. if (!t.length) return "";
  27378. if (t.length === 1 && typeof t[0] == "string") return t[0];
  27379. for (var g in t.forEach(function(C) {
  27380. if (typeof C == "object") {
  27381. I[C.tagName] || (I[C.tagName] = []);
  27382. var i = Stg(C.children);
  27383. I[C.tagName].push(i), Object.keys(C.attributes).length && typeof i != "string" && (i._attributes = C.attributes);
  27384. }
  27385. }), I) I[g].length == 1 && (I[g] = I[g][0]);
  27386. return I;
  27387. }
  27388. function Dtg(t, I, g = 0, C = "") {
  27389. var i = [];
  27390. return t.forEach(function(e, A) {
  27391. if (typeof e == "object" && I(e, A, g, C) && i.push(e), e.children) {
  27392. var s = Dtg(e.children, I, g + 1, (C ? C + "." : "") + A + "." + e.tagName);
  27393. i = i.concat(s);
  27394. }
  27395. }), i;
  27396. }
  27397. function Q0g(t, I) {
  27398. var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
  27399. if (!g) {
  27400. if (Array.isArray(t) || (g = function(l, n) {
  27401. if (l) {
  27402. if (typeof l == "string") return iq(l, n);
  27403. var a = Object.prototype.toString.call(l).slice(8, -1);
  27404. if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
  27405. if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return iq(l, n);
  27406. }
  27407. }(t)) || I) {
  27408. g && (t = g);
  27409. var C = 0, i = function() {
  27410. };
  27411. return { s: i, n: function() {
  27412. return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
  27413. }, e: function(l) {
  27414. throw l;
  27415. }, f: i };
  27416. }
  27417. throw new TypeError(`Invalid attempt to iterate non-iterable instance.
  27418. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
  27419. }
  27420. var e, A = !0, s = !1;
  27421. return { s: function() {
  27422. g = g.call(t);
  27423. }, n: function() {
  27424. var l = g.next();
  27425. return A = l.done, l;
  27426. }, e: function(l) {
  27427. s = !0, e = l;
  27428. }, f: function() {
  27429. try {
  27430. A || g.return == null || g.return();
  27431. } finally {
  27432. if (s) throw e;
  27433. }
  27434. } };
  27435. }
  27436. function iq(t, I) {
  27437. (I == null || I > t.length) && (I = t.length);
  27438. for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
  27439. return C;
  27440. }
  27441. function eq(t, I) {
  27442. var g = Object.keys(t);
  27443. if (Object.getOwnPropertySymbols) {
  27444. var C = Object.getOwnPropertySymbols(t);
  27445. I && (C = C.filter(function(i) {
  27446. return Object.getOwnPropertyDescriptor(t, i).enumerable;
  27447. })), g.push.apply(g, C);
  27448. }
  27449. return g;
  27450. }
  27451. function XX(t) {
  27452. for (var I = 1; I < arguments.length; I++) {
  27453. var g = arguments[I] != null ? arguments[I] : {};
  27454. I % 2 ? eq(Object(g), !0).forEach(function(C) {
  27455. f9(t, C, g[C]);
  27456. }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(g)) : eq(Object(g)).forEach(function(C) {
  27457. Object.defineProperty(t, C, Object.getOwnPropertyDescriptor(g, C));
  27458. });
  27459. }
  27460. return t;
  27461. }
  27462. var SX = 0;
  27463. function Ktg(t) {
  27464. var I = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, g = {};
  27465. if (!t.length) return g;
  27466. if (t.length === 1 && typeof t[0] == "string") return Object.keys(I).length ? { attrs: XX({ order: SX++ }, I), value: t[0] } : t[0];
  27467. var C, i = Q0g(t);
  27468. try {
  27469. for (i.s(); !(C = i.n()).done; ) {
  27470. var e = C.value;
  27471. if (_a(e) !== "object") return;
  27472. if (e.tagName !== "?xml") {
  27473. g[e.tagName] || (g[e.tagName] = []);
  27474. var A = Ktg(e.children || [], e.attributes);
  27475. _a(A) === "object" && (A.attrs ? A.attrs.order = SX++ : A.attrs = { order: SX++ }), Object.keys(e.attributes || {}).length && (A.attrs = XX(XX({}, A.attrs), e.attributes)), g[e.tagName].push(A);
  27476. }
  27477. }
  27478. } catch (l) {
  27479. i.e(l);
  27480. } finally {
  27481. i.f();
  27482. }
  27483. for (var s in g) g[s].length === 1 && (g[s] = g[s][0]);
  27484. return g;
  27485. }
  27486. function yt(t, I) {
  27487. return Ftg.apply(this, arguments);
  27488. }
  27489. function Ftg() {
  27490. return (Ftg = SC(bI.mark(function t(I, g) {
  27491. var C;
  27492. return bI.wrap(function(i) {
  27493. for (; ; ) switch (i.prev = i.next) {
  27494. case 0:
  27495. return i.prev = 0, i.next = 3, I.file(g).async("string");
  27496. case 3:
  27497. return C = i.sent, i.abrupt("return", Ktg(j0g(C)));
  27498. case 7:
  27499. return i.prev = 7, i.t0 = i.catch(0), i.abrupt("return", null);
  27500. case 10:
  27501. case "end":
  27502. return i.stop();
  27503. }
  27504. }, t, null, [[0, 7]]);
  27505. }))).apply(this, arguments);
  27506. }
  27507. function wV(t) {
  27508. return wV = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(I) {
  27509. return typeof I;
  27510. } : function(I) {
  27511. return I && typeof Symbol == "function" && I.constructor === Symbol && I !== Symbol.prototype ? "symbol" : typeof I;
  27512. }, wV(t);
  27513. }
  27514. var O0g = /^\s+/, U0g = /\s+$/;
  27515. function Qg(t, I) {
  27516. if (I = I || {}, (t = t || "") instanceof Qg) return t;
  27517. if (!(this instanceof Qg)) return new Qg(t, I);
  27518. var g = function(C) {
  27519. var i = { r: 0, g: 0, b: 0 }, e = 1, A = null, s = null, l = null, n = !1, a = !1;
  27520. typeof C == "string" && (C = function(r) {
  27521. r = r.replace(O0g, "").replace(U0g, "").toLowerCase();
  27522. var h, b = !1;
  27523. if (WD[r]) r = WD[r], b = !0;
  27524. else if (r == "transparent") return { r: 0, g: 0, b: 0, a: 0, format: "name" };
  27525. return (h = mA.rgb.exec(r)) ? { r: h[1], g: h[2], b: h[3] } : (h = mA.rgba.exec(r)) ? { r: h[1], g: h[2], b: h[3], a: h[4] } : (h = mA.hsl.exec(r)) ? { h: h[1], s: h[2], l: h[3] } : (h = mA.hsla.exec(r)) ? { h: h[1], s: h[2], l: h[3], a: h[4] } : (h = mA.hsv.exec(r)) ? { h: h[1], s: h[2], v: h[3] } : (h = mA.hsva.exec(r)) ? { h: h[1], s: h[2], v: h[3], a: h[4] } : (h = mA.hex8.exec(r)) ? { r: se(h[1]), g: se(h[2]), b: se(h[3]), a: oq(h[4]), format: b ? "name" : "hex8" } : (h = mA.hex6.exec(r)) ? { r: se(h[1]), g: se(h[2]), b: se(h[3]), format: b ? "name" : "hex" } : (h = mA.hex4.exec(r)) ? { r: se(h[1] + "" + h[1]), g: se(h[2] + "" + h[2]), b: se(h[3] + "" + h[3]), a: oq(h[4] + "" + h[4]), format: b ? "name" : "hex8" } : (h = mA.hex3.exec(r)) ? { r: se(h[1] + "" + h[1]), g: se(h[2] + "" + h[2]), b: se(h[3] + "" + h[3]), format: b ? "name" : "hex" } : !1;
  27526. }(C)), wV(C) == "object" && (ol(C.r) && ol(C.g) && ol(C.b) ? (d = C.r, o = C.g, c = C.b, i = { r: 255 * JC(d, 255), g: 255 * JC(o, 255), b: 255 * JC(c, 255) }, n = !0, a = String(C.r).substr(-1) === "%" ? "prgb" : "rgb") : ol(C.h) && ol(C.s) && ol(C.v) ? (A = cm(C.s), s = cm(C.v), i = function(r, h, b) {
  27527. r = 6 * JC(r, 360), h = JC(h, 100), b = JC(b, 100);
  27528. var u = Math.floor(r), m = r - u, Z = b * (1 - h), p = b * (1 - m * h), Y = b * (1 - (1 - m) * h), R = u % 6;
  27529. return { r: 255 * [b, p, Z, Z, Y, b][R], g: 255 * [Y, b, b, p, Z, Z][R], b: 255 * [Z, Z, Y, b, b, p][R] };
  27530. }(C.h, A, s), n = !0, a = "hsv") : ol(C.h) && ol(C.s) && ol(C.l) && (A = cm(C.s), l = cm(C.l), i = function(r, h, b) {
  27531. var u, m, Z;
  27532. function p(X, H, S) {
  27533. return S < 0 && (S += 1), S > 1 && (S -= 1), S < 1 / 6 ? X + 6 * (H - X) * S : S < 0.5 ? H : S < 2 / 3 ? X + (H - X) * (2 / 3 - S) * 6 : X;
  27534. }
  27535. if (r = JC(r, 360), h = JC(h, 100), b = JC(b, 100), h === 0) u = m = Z = b;
  27536. else {
  27537. var Y = b < 0.5 ? b * (1 + h) : b + h - b * h, R = 2 * b - Y;
  27538. u = p(R, Y, r + 1 / 3), m = p(R, Y, r), Z = p(R, Y, r - 1 / 3);
  27539. }
  27540. return { r: 255 * u, g: 255 * m, b: 255 * Z };
  27541. }(C.h, A, l), n = !0, a = "hsl"), C.hasOwnProperty("a") && (e = C.a));
  27542. var d, o, c;
  27543. return e = ktg(e), { ok: n, format: C.format || a, r: Math.min(255, Math.max(i.r, 0)), g: Math.min(255, Math.max(i.g, 0)), b: Math.min(255, Math.max(i.b, 0)), a: e };
  27544. }(t);
  27545. this._originalInput = t, this._r = g.r, this._g = g.g, this._b = g.b, this._a = g.a, this._roundA = Math.round(100 * this._a) / 100, this._format = I.format || g.format, this._gradientType = I.gradientType, this._r < 1 && (this._r = Math.round(this._r)), this._g < 1 && (this._g = Math.round(this._g)), this._b < 1 && (this._b = Math.round(this._b)), this._ok = g.ok;
  27546. }
  27547. function Aq(t, I, g) {
  27548. t = JC(t, 255), I = JC(I, 255), g = JC(g, 255);
  27549. var C, i, e = Math.max(t, I, g), A = Math.min(t, I, g), s = (e + A) / 2;
  27550. if (e == A) C = i = 0;
  27551. else {
  27552. var l = e - A;
  27553. switch (i = s > 0.5 ? l / (2 - e - A) : l / (e + A), e) {
  27554. case t:
  27555. C = (I - g) / l + (I < g ? 6 : 0);
  27556. break;
  27557. case I:
  27558. C = (g - t) / l + 2;
  27559. break;
  27560. case g:
  27561. C = (t - I) / l + 4;
  27562. }
  27563. C /= 6;
  27564. }
  27565. return { h: C, s: i, l: s };
  27566. }
  27567. function sq(t, I, g) {
  27568. t = JC(t, 255), I = JC(I, 255), g = JC(g, 255);
  27569. var C, i, e = Math.max(t, I, g), A = Math.min(t, I, g), s = e, l = e - A;
  27570. if (i = e === 0 ? 0 : l / e, e == A) C = 0;
  27571. else {
  27572. switch (e) {
  27573. case t:
  27574. C = (I - g) / l + (I < g ? 6 : 0);
  27575. break;
  27576. case I:
  27577. C = (g - t) / l + 2;
  27578. break;
  27579. case g:
  27580. C = (t - I) / l + 4;
  27581. }
  27582. C /= 6;
  27583. }
  27584. return { h: C, s: i, v: s };
  27585. }
  27586. function lq(t, I, g, C) {
  27587. var i = [KA(Math.round(t).toString(16)), KA(Math.round(I).toString(16)), KA(Math.round(g).toString(16))];
  27588. return C && i[0].charAt(0) == i[0].charAt(1) && i[1].charAt(0) == i[1].charAt(1) && i[2].charAt(0) == i[2].charAt(1) ? i[0].charAt(0) + i[1].charAt(0) + i[2].charAt(0) : i.join("");
  27589. }
  27590. function nq(t, I, g, C) {
  27591. return [KA(ztg(C)), KA(Math.round(t).toString(16)), KA(Math.round(I).toString(16)), KA(Math.round(g).toString(16))].join("");
  27592. }
  27593. function E0g(t, I) {
  27594. I = I === 0 ? 0 : I || 10;
  27595. var g = Qg(t).toHsl();
  27596. return g.s -= I / 100, g.s = dM(g.s), Qg(g);
  27597. }
  27598. function P0g(t, I) {
  27599. I = I === 0 ? 0 : I || 10;
  27600. var g = Qg(t).toHsl();
  27601. return g.s += I / 100, g.s = dM(g.s), Qg(g);
  27602. }
  27603. function _0g(t) {
  27604. return Qg(t).desaturate(100);
  27605. }
  27606. function q0g(t, I) {
  27607. I = I === 0 ? 0 : I || 10;
  27608. var g = Qg(t).toHsl();
  27609. return g.l += I / 100, g.l = dM(g.l), Qg(g);
  27610. }
  27611. function $0g(t, I) {
  27612. I = I === 0 ? 0 : I || 10;
  27613. var g = Qg(t).toRgb();
  27614. return g.r = Math.max(0, Math.min(255, g.r - Math.round(-I / 100 * 255))), g.g = Math.max(0, Math.min(255, g.g - Math.round(-I / 100 * 255))), g.b = Math.max(0, Math.min(255, g.b - Math.round(-I / 100 * 255))), Qg(g);
  27615. }
  27616. function gbg(t, I) {
  27617. I = I === 0 ? 0 : I || 10;
  27618. var g = Qg(t).toHsl();
  27619. return g.l -= I / 100, g.l = dM(g.l), Qg(g);
  27620. }
  27621. function Ibg(t, I) {
  27622. var g = Qg(t).toHsl(), C = (g.h + I) % 360;
  27623. return g.h = C < 0 ? 360 + C : C, Qg(g);
  27624. }
  27625. function Cbg(t) {
  27626. var I = Qg(t).toHsl();
  27627. return I.h = (I.h + 180) % 360, Qg(I);
  27628. }
  27629. function aq(t, I) {
  27630. if (isNaN(I) || I <= 0) throw new Error("Argument to polyad must be a positive number");
  27631. for (var g = Qg(t).toHsl(), C = [Qg(t)], i = 360 / I, e = 1; e < I; e++) C.push(Qg({ h: (g.h + e * i) % 360, s: g.s, l: g.l }));
  27632. return C;
  27633. }
  27634. function tbg(t) {
  27635. var I = Qg(t).toHsl(), g = I.h;
  27636. return [Qg(t), Qg({ h: (g + 72) % 360, s: I.s, l: I.l }), Qg({ h: (g + 216) % 360, s: I.s, l: I.l })];
  27637. }
  27638. function ibg(t, I, g) {
  27639. I = I || 6, g = g || 30;
  27640. var C = Qg(t).toHsl(), i = 360 / g, e = [Qg(t)];
  27641. for (C.h = (C.h - (i * I >> 1) + 720) % 360; --I; ) C.h = (C.h + i) % 360, e.push(Qg(C));
  27642. return e;
  27643. }
  27644. function ebg(t, I) {
  27645. I = I || 6;
  27646. for (var g = Qg(t).toHsv(), C = g.h, i = g.s, e = g.v, A = [], s = 1 / I; I--; ) A.push(Qg({ h: C, s: i, v: e })), e = (e + s) % 1;
  27647. return A;
  27648. }
  27649. Qg.prototype = { isDark: function() {
  27650. return this.getBrightness() < 128;
  27651. }, isLight: function() {
  27652. return !this.isDark();
  27653. }, isValid: function() {
  27654. return this._ok;
  27655. }, getOriginalInput: function() {
  27656. return this._originalInput;
  27657. }, getFormat: function() {
  27658. return this._format;
  27659. }, getAlpha: function() {
  27660. return this._a;
  27661. }, getBrightness: function() {
  27662. var t = this.toRgb();
  27663. return (299 * t.r + 587 * t.g + 114 * t.b) / 1e3;
  27664. }, getLuminance: function() {
  27665. var t, I, g, C = this.toRgb();
  27666. return t = C.r / 255, I = C.g / 255, g = C.b / 255, 0.2126 * (t <= 0.03928 ? t / 12.92 : Math.pow((t + 0.055) / 1.055, 2.4)) + 0.7152 * (I <= 0.03928 ? I / 12.92 : Math.pow((I + 0.055) / 1.055, 2.4)) + 0.0722 * (g <= 0.03928 ? g / 12.92 : Math.pow((g + 0.055) / 1.055, 2.4));
  27667. }, setAlpha: function(t) {
  27668. return this._a = ktg(t), this._roundA = Math.round(100 * this._a) / 100, this;
  27669. }, toHsv: function() {
  27670. var t = sq(this._r, this._g, this._b);
  27671. return { h: 360 * t.h, s: t.s, v: t.v, a: this._a };
  27672. }, toHsvString: function() {
  27673. var t = sq(this._r, this._g, this._b), I = Math.round(360 * t.h), g = Math.round(100 * t.s), C = Math.round(100 * t.v);
  27674. return this._a == 1 ? "hsv(" + I + ", " + g + "%, " + C + "%)" : "hsva(" + I + ", " + g + "%, " + C + "%, " + this._roundA + ")";
  27675. }, toHsl: function() {
  27676. var t = Aq(this._r, this._g, this._b);
  27677. return { h: 360 * t.h, s: t.s, l: t.l, a: this._a };
  27678. }, toHslString: function() {
  27679. var t = Aq(this._r, this._g, this._b), I = Math.round(360 * t.h), g = Math.round(100 * t.s), C = Math.round(100 * t.l);
  27680. return this._a == 1 ? "hsl(" + I + ", " + g + "%, " + C + "%)" : "hsla(" + I + ", " + g + "%, " + C + "%, " + this._roundA + ")";
  27681. }, toHex: function(t) {
  27682. return lq(this._r, this._g, this._b, t);
  27683. }, toHexString: function(t) {
  27684. return "#" + this.toHex(t);
  27685. }, toHex8: function(t) {
  27686. return function(I, g, C, i, e) {
  27687. var A = [KA(Math.round(I).toString(16)), KA(Math.round(g).toString(16)), KA(Math.round(C).toString(16)), KA(ztg(i))];
  27688. return e && A[0].charAt(0) == A[0].charAt(1) && A[1].charAt(0) == A[1].charAt(1) && A[2].charAt(0) == A[2].charAt(1) && A[3].charAt(0) == A[3].charAt(1) ? A[0].charAt(0) + A[1].charAt(0) + A[2].charAt(0) + A[3].charAt(0) : A.join("");
  27689. }(this._r, this._g, this._b, this._a, t);
  27690. }, toHex8String: function(t) {
  27691. return "#" + this.toHex8(t);
  27692. }, toRgb: function() {
  27693. return { r: Math.round(this._r), g: Math.round(this._g), b: Math.round(this._b), a: this._a };
  27694. }, toRgbString: function() {
  27695. return this._a == 1 ? "rgb(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ")" : "rgba(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ", " + this._roundA + ")";
  27696. }, toPercentageRgb: function() {
  27697. return { r: Math.round(100 * JC(this._r, 255)) + "%", g: Math.round(100 * JC(this._g, 255)) + "%", b: Math.round(100 * JC(this._b, 255)) + "%", a: this._a };
  27698. }, toPercentageRgbString: function() {
  27699. return this._a == 1 ? "rgb(" + Math.round(100 * JC(this._r, 255)) + "%, " + Math.round(100 * JC(this._g, 255)) + "%, " + Math.round(100 * JC(this._b, 255)) + "%)" : "rgba(" + Math.round(100 * JC(this._r, 255)) + "%, " + Math.round(100 * JC(this._g, 255)) + "%, " + Math.round(100 * JC(this._b, 255)) + "%, " + this._roundA + ")";
  27700. }, toName: function() {
  27701. return this._a === 0 ? "transparent" : !(this._a < 1) && (Abg[lq(this._r, this._g, this._b, !0)] || !1);
  27702. }, toFilter: function(t) {
  27703. var I = "#" + nq(this._r, this._g, this._b, this._a), g = I, C = this._gradientType ? "GradientType = 1, " : "";
  27704. if (t) {
  27705. var i = Qg(t);
  27706. g = "#" + nq(i._r, i._g, i._b, i._a);
  27707. }
  27708. return "progid:DXImageTransform.Microsoft.gradient(" + C + "startColorstr=" + I + ",endColorstr=" + g + ")";
  27709. }, toString: function(t) {
  27710. var I = !!t;
  27711. t = t || this._format;
  27712. var g = !1, C = this._a < 1 && this._a >= 0;
  27713. return I || !C || t !== "hex" && t !== "hex6" && t !== "hex3" && t !== "hex4" && t !== "hex8" && t !== "name" ? (t === "rgb" && (g = this.toRgbString()), t === "prgb" && (g = this.toPercentageRgbString()), t !== "hex" && t !== "hex6" || (g = this.toHexString()), t === "hex3" && (g = this.toHexString(!0)), t === "hex4" && (g = this.toHex8String(!0)), t === "hex8" && (g = this.toHex8String()), t === "name" && (g = this.toName()), t === "hsl" && (g = this.toHslString()), t === "hsv" && (g = this.toHsvString()), g || this.toHexString()) : t === "name" && this._a === 0 ? this.toName() : this.toRgbString();
  27714. }, clone: function() {
  27715. return Qg(this.toString());
  27716. }, _applyModification: function(t, I) {
  27717. var g = t.apply(null, [this].concat([].slice.call(I)));
  27718. return this._r = g._r, this._g = g._g, this._b = g._b, this.setAlpha(g._a), this;
  27719. }, lighten: function() {
  27720. return this._applyModification(q0g, arguments);
  27721. }, brighten: function() {
  27722. return this._applyModification($0g, arguments);
  27723. }, darken: function() {
  27724. return this._applyModification(gbg, arguments);
  27725. }, desaturate: function() {
  27726. return this._applyModification(E0g, arguments);
  27727. }, saturate: function() {
  27728. return this._applyModification(P0g, arguments);
  27729. }, greyscale: function() {
  27730. return this._applyModification(_0g, arguments);
  27731. }, spin: function() {
  27732. return this._applyModification(Ibg, arguments);
  27733. }, _applyCombination: function(t, I) {
  27734. return t.apply(null, [this].concat([].slice.call(I)));
  27735. }, analogous: function() {
  27736. return this._applyCombination(ibg, arguments);
  27737. }, complement: function() {
  27738. return this._applyCombination(Cbg, arguments);
  27739. }, monochromatic: function() {
  27740. return this._applyCombination(ebg, arguments);
  27741. }, splitcomplement: function() {
  27742. return this._applyCombination(tbg, arguments);
  27743. }, triad: function() {
  27744. return this._applyCombination(aq, [3]);
  27745. }, tetrad: function() {
  27746. return this._applyCombination(aq, [4]);
  27747. } }, Qg.fromRatio = function(t, I) {
  27748. if (wV(t) == "object") {
  27749. var g = {};
  27750. for (var C in t) t.hasOwnProperty(C) && (g[C] = C === "a" ? t[C] : cm(t[C]));
  27751. t = g;
  27752. }
  27753. return Qg(t, I);
  27754. }, Qg.equals = function(t, I) {
  27755. return !(!t || !I) && Qg(t).toRgbString() == Qg(I).toRgbString();
  27756. }, Qg.random = function() {
  27757. return Qg.fromRatio({ r: Math.random(), g: Math.random(), b: Math.random() });
  27758. }, Qg.mix = function(t, I, g) {
  27759. g = g === 0 ? 0 : g || 50;
  27760. var C = Qg(t).toRgb(), i = Qg(I).toRgb(), e = g / 100;
  27761. return Qg({ r: (i.r - C.r) * e + C.r, g: (i.g - C.g) * e + C.g, b: (i.b - C.b) * e + C.b, a: (i.a - C.a) * e + C.a });
  27762. }, Qg.readability = function(t, I) {
  27763. var g = Qg(t), C = Qg(I);
  27764. return (Math.max(g.getLuminance(), C.getLuminance()) + 0.05) / (Math.min(g.getLuminance(), C.getLuminance()) + 0.05);
  27765. }, Qg.isReadable = function(t, I, g) {
  27766. var C, i, e = Qg.readability(t, I);
  27767. switch (i = !1, (C = function(A) {
  27768. var s, l;
  27769. return s = ((A = A || { level: "AA", size: "small" }).level || "AA").toUpperCase(), l = (A.size || "small").toLowerCase(), s !== "AA" && s !== "AAA" && (s = "AA"), l !== "small" && l !== "large" && (l = "small"), { level: s, size: l };
  27770. }(g)).level + C.size) {
  27771. case "AAsmall":
  27772. case "AAAlarge":
  27773. i = e >= 4.5;
  27774. break;
  27775. case "AAlarge":
  27776. i = e >= 3;
  27777. break;
  27778. case "AAAsmall":
  27779. i = e >= 7;
  27780. }
  27781. return i;
  27782. }, Qg.mostReadable = function(t, I, g) {
  27783. var C, i, e, A, s = null, l = 0;
  27784. i = (g = g || {}).includeFallbackColors, e = g.level, A = g.size;
  27785. for (var n = 0; n < I.length; n++) (C = Qg.readability(t, I[n])) > l && (l = C, s = Qg(I[n]));
  27786. return Qg.isReadable(t, s, { level: e, size: A }) || !i ? s : (g.includeFallbackColors = !1, Qg.mostReadable(t, ["#fff", "#000"], g));
  27787. };
  27788. var WD = Qg.names = { aliceblue: "f0f8ff", antiquewhite: "faebd7", aqua: "0ff", aquamarine: "7fffd4", azure: "f0ffff", beige: "f5f5dc", bisque: "ffe4c4", black: "000", blanchedalmond: "ffebcd", blue: "00f", blueviolet: "8a2be2", brown: "a52a2a", burlywood: "deb887", burntsienna: "ea7e5d", cadetblue: "5f9ea0", chartreuse: "7fff00", chocolate: "d2691e", coral: "ff7f50", cornflowerblue: "6495ed", cornsilk: "fff8dc", crimson: "dc143c", cyan: "0ff", darkblue: "00008b", darkcyan: "008b8b", darkgoldenrod: "b8860b", darkgray: "a9a9a9", darkgreen: "006400", darkgrey: "a9a9a9", darkkhaki: "bdb76b", darkmagenta: "8b008b", darkolivegreen: "556b2f", darkorange: "ff8c00", darkorchid: "9932cc", darkred: "8b0000", darksalmon: "e9967a", darkseagreen: "8fbc8f", darkslateblue: "483d8b", darkslategray: "2f4f4f", darkslategrey: "2f4f4f", darkturquoise: "00ced1", darkviolet: "9400d3", deeppink: "ff1493", deepskyblue: "00bfff", dimgray: "696969", dimgrey: "696969", dodgerblue: "1e90ff", firebrick: "b22222", floralwhite: "fffaf0", forestgreen: "228b22", fuchsia: "f0f", gainsboro: "dcdcdc", ghostwhite: "f8f8ff", gold: "ffd700", goldenrod: "daa520", gray: "808080", green: "008000", greenyellow: "adff2f", grey: "808080", honeydew: "f0fff0", hotpink: "ff69b4", indianred: "cd5c5c", indigo: "4b0082", ivory: "fffff0", khaki: "f0e68c", lavender: "e6e6fa", lavenderblush: "fff0f5", lawngreen: "7cfc00", lemonchiffon: "fffacd", lightblue: "add8e6", lightcoral: "f08080", lightcyan: "e0ffff", lightgoldenrodyellow: "fafad2", lightgray: "d3d3d3", lightgreen: "90ee90", lightgrey: "d3d3d3", lightpink: "ffb6c1", lightsalmon: "ffa07a", lightseagreen: "20b2aa", lightskyblue: "87cefa", lightslategray: "789", lightslategrey: "789", lightsteelblue: "b0c4de", lightyellow: "ffffe0", lime: "0f0", limegreen: "32cd32", linen: "faf0e6", magenta: "f0f", maroon: "800000", mediumaquamarine: "66cdaa", mediumblue: "0000cd", mediumorchid: "ba55d3", mediumpurple: "9370db", mediumseagreen: "3cb371", mediumslateblue: "7b68ee", mediumspringgreen: "00fa9a", mediumturquoise: "48d1cc", mediumvioletred: "c71585", midnightblue: "191970", mintcream: "f5fffa", mistyrose: "ffe4e1", moccasin: "ffe4b5", navajowhite: "ffdead", navy: "000080", oldlace: "fdf5e6", olive: "808000", olivedrab: "6b8e23", orange: "ffa500", orangered: "ff4500", orchid: "da70d6", palegoldenrod: "eee8aa", palegreen: "98fb98", paleturquoise: "afeeee", palevioletred: "db7093", papayawhip: "ffefd5", peachpuff: "ffdab9", peru: "cd853f", pink: "ffc0cb", plum: "dda0dd", powderblue: "b0e0e6", purple: "800080", rebeccapurple: "663399", red: "f00", rosybrown: "bc8f8f", royalblue: "4169e1", saddlebrown: "8b4513", salmon: "fa8072", sandybrown: "f4a460", seagreen: "2e8b57", seashell: "fff5ee", sienna: "a0522d", silver: "c0c0c0", skyblue: "87ceeb", slateblue: "6a5acd", slategray: "708090", slategrey: "708090", snow: "fffafa", springgreen: "00ff7f", steelblue: "4682b4", tan: "d2b48c", teal: "008080", thistle: "d8bfd8", tomato: "ff6347", turquoise: "40e0d0", violet: "ee82ee", wheat: "f5deb3", white: "fff", whitesmoke: "f5f5f5", yellow: "ff0", yellowgreen: "9acd32" }, Abg = Qg.hexNames = function(t) {
  27789. var I = {};
  27790. for (var g in t) t.hasOwnProperty(g) && (I[t[g]] = g);
  27791. return I;
  27792. }(WD);
  27793. function ktg(t) {
  27794. return t = parseFloat(t), (isNaN(t) || t < 0 || t > 1) && (t = 1), t;
  27795. }
  27796. function JC(t, I) {
  27797. (function(C) {
  27798. return typeof C == "string" && C.indexOf(".") != -1 && parseFloat(C) === 1;
  27799. })(t) && (t = "100%");
  27800. var g = function(C) {
  27801. return typeof C == "string" && C.indexOf("%") != -1;
  27802. }(t);
  27803. return t = Math.min(I, Math.max(0, parseFloat(t))), g && (t = parseInt(t * I, 10) / 100), Math.abs(t - I) < 1e-6 ? 1 : t % I / parseFloat(I);
  27804. }
  27805. function dM(t) {
  27806. return Math.min(1, Math.max(0, t));
  27807. }
  27808. function se(t) {
  27809. return parseInt(t, 16);
  27810. }
  27811. function KA(t) {
  27812. return t.length == 1 ? "0" + t : "" + t;
  27813. }
  27814. function cm(t) {
  27815. return t <= 1 && (t = 100 * t + "%"), t;
  27816. }
  27817. function ztg(t) {
  27818. return Math.round(255 * parseFloat(t)).toString(16);
  27819. }
  27820. function oq(t) {
  27821. return se(t) / 255;
  27822. }
  27823. var _n, gN, IN, mA = (gN = "[\\s|\\(]+(" + (_n = "(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)") + ")[,|\\s]+(" + _n + ")[,|\\s]+(" + _n + ")\\s*\\)?", IN = "[\\s|\\(]+(" + _n + ")[,|\\s]+(" + _n + ")[,|\\s]+(" + _n + ")[,|\\s]+(" + _n + ")\\s*\\)?", { CSS_UNIT: new RegExp(_n), rgb: new RegExp("rgb" + gN), rgba: new RegExp("rgba" + IN), hsl: new RegExp("hsl" + gN), hsla: new RegExp("hsla" + IN), hsv: new RegExp("hsv" + gN), hsva: new RegExp("hsva" + IN), hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ });
  27824. function ol(t) {
  27825. return !!mA.CSS_UNIT.exec(t);
  27826. }
  27827. function sbg(t, I) {
  27828. var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
  27829. if (!g) {
  27830. if (Array.isArray(t) || (g = function(l, n) {
  27831. if (l) {
  27832. if (typeof l == "string") return cq(l, n);
  27833. var a = Object.prototype.toString.call(l).slice(8, -1);
  27834. if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
  27835. if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return cq(l, n);
  27836. }
  27837. }(t)) || I) {
  27838. g && (t = g);
  27839. var C = 0, i = function() {
  27840. };
  27841. return { s: i, n: function() {
  27842. return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
  27843. }, e: function(l) {
  27844. throw l;
  27845. }, f: i };
  27846. }
  27847. throw new TypeError(`Invalid attempt to iterate non-iterable instance.
  27848. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
  27849. }
  27850. var e, A = !0, s = !1;
  27851. return { s: function() {
  27852. g = g.call(t);
  27853. }, n: function() {
  27854. var l = g.next();
  27855. return A = l.done, l;
  27856. }, e: function(l) {
  27857. s = !0, e = l;
  27858. }, f: function() {
  27859. try {
  27860. A || g.return == null || g.return();
  27861. } finally {
  27862. if (s) throw e;
  27863. }
  27864. } };
  27865. }
  27866. function cq(t, I) {
  27867. (I == null || I > t.length) && (I = t.length);
  27868. for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
  27869. return C;
  27870. }
  27871. function Jtg(t) {
  27872. for (var I, g = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", C = new Uint8Array(t), i = C.byteLength, e = i % 3, A = i - e, s = "", l = 0; l < A; l += 3) s += g[(16515072 & (I = C[l] << 16 | C[l + 1] << 8 | C[l + 2])) >> 18] + g[(258048 & I) >> 12] + g[(4032 & I) >> 6] + g[63 & I];
  27873. return e === 1 ? s += g[(252 & (I = C[A])) >> 2] + g[(3 & I) << 4] + "==" : e === 2 && (s += g[(64512 & (I = C[A] << 8 | C[A + 1])) >> 10] + g[(1008 & I) >> 4] + g[(15 & I) << 2] + "="), s;
  27874. }
  27875. function DX(t) {
  27876. return t.substr(2 + (~-t.lastIndexOf(".") >>> 0));
  27877. }
  27878. function zr(t, I) {
  27879. if (!t) return t;
  27880. var g = "";
  27881. if (t.constructor === Array) for (var C = 0; C < t.length; C++) g += I(t[C], C);
  27882. else g += I(t, 0);
  27883. return g;
  27884. }
  27885. function U(t, I) {
  27886. if (!t) return t;
  27887. var g, C = sbg(I);
  27888. try {
  27889. for (C.s(); !(g = C.n()).done; )
  27890. if (!(t = t[g.value])) return t;
  27891. } catch (i) {
  27892. C.e(i);
  27893. } finally {
  27894. C.f();
  27895. }
  27896. return t;
  27897. }
  27898. function Y0(t) {
  27899. return t ? Math.round(t / 6e4) : 0;
  27900. }
  27901. function pV(t) {
  27902. var I = { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#039;" };
  27903. return t.replace(/[&<>"']/g, function(g) {
  27904. return I[g];
  27905. });
  27906. }
  27907. function yD(t) {
  27908. var I = "";
  27909. switch (t.toLowerCase()) {
  27910. case "jpg":
  27911. case "jpeg":
  27912. I = "image/jpeg";
  27913. break;
  27914. case "png":
  27915. I = "image/png";
  27916. break;
  27917. case "gif":
  27918. I = "image/gif";
  27919. break;
  27920. case "emf":
  27921. I = "image/x-emf";
  27922. break;
  27923. case "wmf":
  27924. I = "image/x-wmf";
  27925. break;
  27926. case "svg":
  27927. I = "image/svg+xml";
  27928. break;
  27929. case "mp4":
  27930. I = "video/mp4";
  27931. break;
  27932. case "webm":
  27933. I = "video/webm";
  27934. break;
  27935. case "ogg":
  27936. I = "video/ogg";
  27937. break;
  27938. case "avi":
  27939. I = "video/avi";
  27940. break;
  27941. case "mpg":
  27942. I = "video/mpg";
  27943. break;
  27944. case "wmv":
  27945. I = "video/wmv";
  27946. break;
  27947. case "mp3":
  27948. I = "audio/mpeg";
  27949. break;
  27950. case "wav":
  27951. I = "audio/wav";
  27952. break;
  27953. case "tif":
  27954. case "tiff":
  27955. I = "image/tiff";
  27956. }
  27957. return I;
  27958. }
  27959. function lbg(t) {
  27960. return /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/.test(t);
  27961. }
  27962. function Jr(t) {
  27963. for (var I = t.toString(16); I.length < 2; ) I = "0" + I;
  27964. return I;
  27965. }
  27966. function Ltg(t) {
  27967. if (typeof DOMParser > "u") return t.replace(/<[^>]+>/g, "").replace(/\s+/g, " ").trim() !== "";
  27968. var I = new DOMParser().parseFromString(t, "text/html");
  27969. return (I.body.textContent || I.body.innerText).trim() !== "";
  27970. }
  27971. function Lt(t) {
  27972. var I = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 4;
  27973. return parseFloat(t.toFixed(I));
  27974. }
  27975. function YD(t, I, g, C) {
  27976. var i, e;
  27977. if (g) e = g;
  27978. else {
  27979. var A = U(I.slideContent, ["p:sld", "p:clrMapOvr", "a:overrideClrMapping", "attrs"]);
  27980. e = A || (A = U(I.slideLayoutContent, ["p:sldLayout", "p:clrMapOvr", "a:overrideClrMapping", "attrs"])) || U(I.slideMasterContent, ["p:sldMaster", "p:clrMap", "attrs"]);
  27981. }
  27982. var s = t.substr(2);
  27983. if (s === "phClr" && C) i = C;
  27984. else {
  27985. if (e) switch (s) {
  27986. case "tx1":
  27987. case "tx2":
  27988. case "bg1":
  27989. case "bg2":
  27990. t = "a:" + e[s];
  27991. }
  27992. else switch (s) {
  27993. case "tx1":
  27994. t = "a:dk1";
  27995. break;
  27996. case "tx2":
  27997. t = "a:dk2";
  27998. break;
  27999. case "bg1":
  28000. t = "a:lt1";
  28001. break;
  28002. case "bg2":
  28003. t = "a:lt2";
  28004. }
  28005. var l = U(I.themeContent, ["a:theme", "a:themeElements", "a:clrScheme", t]);
  28006. !(i = U(l, ["a:srgbClr", "attrs", "val"])) && l && (i = U(l, ["a:sysClr", "attrs", "lastClr"]));
  28007. }
  28008. return i;
  28009. }
  28010. function Fs(t, I, g) {
  28011. var C = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : [], i = U(t, ["p:spPr", "a:ln"]), e = !!U(i, ["a:grpFill"]);
  28012. if ((!i || e) && C && C.length) for (var A = C.length - 1; A >= 0; A--) {
  28013. var s = U(C[A], ["p:grpSpPr", "a:ln"]);
  28014. if (s) {
  28015. i = s;
  28016. break;
  28017. }
  28018. }
  28019. if (!i) {
  28020. var l = U(t, ["p:style", "a:lnRef"]);
  28021. if (l) {
  28022. var n = U(l, ["attrs", "idx"]);
  28023. i = g.themeContent["a:theme"]["a:themeElements"]["a:fmtScheme"]["a:lnStyleLst"]["a:ln"][Number(n) - 1];
  28024. }
  28025. }
  28026. i || (i = t);
  28027. var a = U(i, ["a:noFill"]), d = U(i, ["attrs", "w"]), o = !!(d !== void 0 || U(i, ["a:prstDash"]) || U(i, ["a:solidFill"]) || U(i, ["a:gradFill"]) || U(i, ["a:pattFill"])), c = 0;
  28028. !a && o && (c = parseInt(d) / 12700, (!Number.isFinite(c) || c <= 0) && (c = 1));
  28029. var r = U(i, ["a:solidFill", "a:srgbClr", "attrs", "val"]);
  28030. if (!r) {
  28031. var h = U(i, ["a:solidFill", "a:schemeClr"]), b = "a:" + U(h, ["attrs", "val"]);
  28032. r = YD(b, g);
  28033. }
  28034. if (!r) {
  28035. var u = U(t, ["p:style", "a:lnRef", "a:schemeClr"]), m = "a:" + U(u, ["attrs", "val"]);
  28036. if (r = YD(m, g)) {
  28037. var Z = U(u, ["a:shade", "attrs", "val"]);
  28038. if (Z) {
  28039. Z = parseInt(Z) / 1e5;
  28040. var p = Qg("#" + r).toHsl();
  28041. r = Qg({ h: p.h, s: p.s, l: p.l * Z, a: p.a }).toHex();
  28042. }
  28043. }
  28044. }
  28045. r = r ? "#".concat(r) : "#000000";
  28046. var Y = U(i, ["a:prstDash", "attrs", "val"]), R = "solid", X = "0";
  28047. switch (Y) {
  28048. case "solid":
  28049. R = "solid", X = "0";
  28050. break;
  28051. case "dash":
  28052. R = "dashed", X = "5";
  28053. break;
  28054. case "dashDot":
  28055. R = "dashed", X = "5, 5, 1, 5";
  28056. break;
  28057. case "dot":
  28058. R = "dotted", X = "1, 5";
  28059. break;
  28060. case "lgDash":
  28061. R = "dashed", X = "10, 5";
  28062. break;
  28063. case "lgDashDotDot":
  28064. R = "dotted", X = "10, 5, 1, 5, 1, 5";
  28065. break;
  28066. case "sysDash":
  28067. R = "dashed", X = "5, 2";
  28068. break;
  28069. case "sysDashDot":
  28070. R = "dotted", X = "5, 2, 1, 5";
  28071. break;
  28072. case "sysDashDotDot":
  28073. R = "dotted", X = "5, 2, 1, 5, 1, 5";
  28074. break;
  28075. case "sysDot":
  28076. R = "dotted", X = "2, 5";
  28077. }
  28078. return { borderColor: r, borderWidth: c, borderType: R, strokeDasharray: X };
  28079. }
  28080. function KX(t, I, g) {
  28081. return g < 0 && (g += 6), g >= 6 && (g -= 6), g < 1 ? (I - t) * g + t : g < 3 ? I : g < 4 ? (I - t) * (4 - g) + t : t;
  28082. }
  28083. function vtg(t, I, g) {
  28084. var C = Qg(t).toHsl();
  28085. I >= 1 && (I = 1);
  28086. var i = C.l * I + (1 - I);
  28087. return g ? Qg({ h: C.h, s: C.s, l: i, a: C.a }).toHex8() : Qg({ h: C.h, s: C.s, l: i, a: C.a }).toHex();
  28088. }
  28089. function dq(t, I) {
  28090. var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
  28091. if (!g) {
  28092. if (Array.isArray(t) || (g = function(l, n) {
  28093. if (l) {
  28094. if (typeof l == "string") return rq(l, n);
  28095. var a = Object.prototype.toString.call(l).slice(8, -1);
  28096. if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
  28097. if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return rq(l, n);
  28098. }
  28099. }(t)) || I) {
  28100. g && (t = g);
  28101. var C = 0, i = function() {
  28102. };
  28103. return { s: i, n: function() {
  28104. return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
  28105. }, e: function(l) {
  28106. throw l;
  28107. }, f: i };
  28108. }
  28109. throw new TypeError(`Invalid attempt to iterate non-iterable instance.
  28110. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
  28111. }
  28112. var e, A = !0, s = !1;
  28113. return { s: function() {
  28114. g = g.call(t);
  28115. }, n: function() {
  28116. var l = g.next();
  28117. return A = l.done, l;
  28118. }, e: function(l) {
  28119. s = !0, e = l;
  28120. }, f: function() {
  28121. try {
  28122. A || g.return == null || g.return();
  28123. } finally {
  28124. if (s) throw e;
  28125. }
  28126. } };
  28127. }
  28128. function rq(t, I) {
  28129. (I == null || I > t.length) && (I = t.length);
  28130. for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
  28131. return C;
  28132. }
  28133. function Hs(t) {
  28134. var I = "";
  28135. return t["a:noFill"] && (I = "NO_FILL"), t["a:solidFill"] && (I = "SOLID_FILL"), t["a:gradFill"] && (I = "GRADIENT_FILL"), t["a:pattFill"] && (I = "PATTERN_FILL"), t["a:blipFill"] && (I = "PIC_FILL"), t["a:grpFill"] && (I = "GROUP_FILL"), I;
  28136. }
  28137. function rM(t, I, g) {
  28138. return ND.apply(this, arguments);
  28139. }
  28140. function ND() {
  28141. return ND = SC(bI.mark(function t(I, g, C) {
  28142. var i, e, A, s, l, n, a;
  28143. return bI.wrap(function(d) {
  28144. for (; ; ) switch (d.prev = d.next) {
  28145. case 0:
  28146. if (g) {
  28147. d.next = 2;
  28148. break;
  28149. }
  28150. return d.abrupt("return", "");
  28151. case 2:
  28152. if (e = U(g, ["a:blip", "attrs", "r:embed"]), I === "slideBg" || I === "slide" ? A = U(C, ["slideResObj", e, "target"]) : I === "slideLayoutBg" ? A = U(C, ["layoutResObj", e, "target"]) : I === "slideMasterBg" ? A = U(C, ["masterResObj", e, "target"]) : I === "themeBg" ? A = U(C, ["themeResObj", e, "target"]) : I === "diagramBg" && (A = U(C, ["diagramResObj", e, "target"])), A) {
  28153. d.next = 6;
  28154. break;
  28155. }
  28156. return d.abrupt("return", A);
  28157. case 6:
  28158. if (i = U(C, ["loaded-images", A])) {
  28159. d.next = 20;
  28160. break;
  28161. }
  28162. if (A = pV(A), (s = A.split(".").pop()) !== "xml") {
  28163. d.next = 12;
  28164. break;
  28165. }
  28166. return d.abrupt("return", "");
  28167. case 12:
  28168. return d.next = 14, C.zip.file(A).async("arraybuffer");
  28169. case 14:
  28170. l = d.sent, n = yD(s), i = "data:".concat(n, ";base64,").concat(Jtg(l)), (a = C["loaded-images"] || {})[A] = i, C["loaded-images"] = a;
  28171. case 20:
  28172. return d.abrupt("return", i);
  28173. case 21:
  28174. case "end":
  28175. return d.stop();
  28176. }
  28177. }, t);
  28178. })), ND.apply(this, arguments);
  28179. }
  28180. function Ttg(t) {
  28181. var I = U(t["a:blip"], ["a:alphaModFix", "attrs"]), g = 1;
  28182. return I && I.amt && I.amt !== "" && (g = parseInt(I.amt) / 1e5), g;
  28183. }
  28184. function nbg(t) {
  28185. if (!t) return null;
  28186. var I = t["a:blip"];
  28187. if (!I) return null;
  28188. var g = {}, C = I["a:extLst"];
  28189. if (C && C["a:ext"]) {
  28190. var i, e = dq(Array.isArray(C["a:ext"]) ? C["a:ext"] : [C["a:ext"]]);
  28191. try {
  28192. for (e.s(); !(i = e.n()).done; ) {
  28193. var A = i.value;
  28194. if (A["a14:imgProps"] && A["a14:imgProps"]["a14:imgLayer"]) {
  28195. var s = A["a14:imgProps"]["a14:imgLayer"]["a14:imgEffect"];
  28196. if (s) {
  28197. var l, n = dq(Array.isArray(s) ? s : [s]);
  28198. try {
  28199. for (n.s(); !(l = n.n()).done; ) {
  28200. var a = l.value;
  28201. if (a["a14:saturation"]) {
  28202. var d = U(a, ["a14:saturation", "attrs", "sat"]);
  28203. d && (g.saturation = parseInt(d) / 1e5);
  28204. }
  28205. if (a["a14:brightnessContrast"]) {
  28206. var o = U(a, ["a14:brightnessContrast", "attrs", "bright"]), c = U(a, ["a14:brightnessContrast", "attrs", "contrast"]);
  28207. o && (g.brightness = parseInt(o) / 1e5), c && (g.contrast = parseInt(c) / 1e5);
  28208. }
  28209. if (a["a14:sharpenSoften"]) {
  28210. var r = U(a, ["a14:sharpenSoften", "attrs", "amount"]);
  28211. if (r) {
  28212. var h = parseInt(r) / 1e5;
  28213. h > 0 ? g.sharpen = h : g.soften = Math.abs(h);
  28214. }
  28215. }
  28216. if (a["a14:colorTemperature"]) {
  28217. var b = U(a, ["a14:colorTemperature", "attrs", "colorTemp"]);
  28218. b && (g.colorTemperature = parseInt(b));
  28219. }
  28220. }
  28221. } catch (u) {
  28222. n.e(u);
  28223. } finally {
  28224. n.f();
  28225. }
  28226. }
  28227. }
  28228. }
  28229. } catch (u) {
  28230. e.e(u);
  28231. } finally {
  28232. e.f();
  28233. }
  28234. }
  28235. return Object.keys(g).length > 0 ? g : null;
  28236. }
  28237. function zu(t, I, g) {
  28238. return xtg.apply(this, arguments);
  28239. }
  28240. function xtg() {
  28241. return (xtg = SC(bI.mark(function t(I, g, C) {
  28242. var i, e, A, s;
  28243. return bI.wrap(function(l) {
  28244. for (; ; ) switch (l.prev = l.next) {
  28245. case 0:
  28246. return l.next = 2, rM(g, I["a:blipFill"], C);
  28247. case 2:
  28248. return i = l.sent, e = I["a:blipFill"]["a:blip"], A = U(e, ["a:alphaModFix", "attrs"]), s = 1, A && A.amt && A.amt !== "" && (s = parseInt(A.amt) / 1e5), l.abrupt("return", { picBase64: i, opacity: s });
  28249. case 8:
  28250. case "end":
  28251. return l.stop();
  28252. }
  28253. }, t);
  28254. }))).apply(this, arguments);
  28255. }
  28256. function j9(t, I) {
  28257. for (var g = t["a:gsLst"]["a:gs"], C = [], i = 0; i < g.length; i++) {
  28258. var e = eC(g[i], void 0, void 0, I), A = U(g[i], ["attrs", "pos"]);
  28259. C[i] = { pos: A ? A / 1e3 + "%" : "", color: e };
  28260. }
  28261. var s = t["a:lin"], l = 0, n = "line";
  28262. if (s) l = Y0(s.attrs.ang);
  28263. else {
  28264. var a = t["a:path"];
  28265. a && a.attrs && a.attrs.path && (n = a.attrs.path);
  28266. }
  28267. return { rot: l, path: n, colors: C.sort(function(d, o) {
  28268. return parseInt(d.pos) - parseInt(o.pos);
  28269. }) };
  28270. }
  28271. function Eo(t, I) {
  28272. if (!t) return null;
  28273. var g = t["a:pattFill"];
  28274. if (!g) return null;
  28275. var C = U(g, ["attrs", "prst"]), i = g["a:fgClr"], e = g["a:bgClr"], A = "#000000", s = "#FFFFFF";
  28276. return i && (A = eC(i, void 0, void 0, I)), e && (s = eC(e, void 0, void 0, I)), { type: C, foregroundColor: A, backgroundColor: s };
  28277. }
  28278. function Lr(t, I, g, C) {
  28279. if (t) {
  28280. for (var i = t["a:gradFill"], e = i["a:gsLst"]["a:gs"], A = [], s = 0; s < e.length; s++) {
  28281. var l = eC(e[s], g["p:sldMaster"]["p:clrMap"].attrs, I, C), n = U(e[s], ["attrs", "pos"]);
  28282. A[s] = { pos: n ? n / 1e3 + "%" : "", color: l };
  28283. }
  28284. var a = i["a:lin"], d = 0, o = "line";
  28285. if (a) d = Y0(a.attrs.ang) + 0;
  28286. else {
  28287. var c = i["a:path"];
  28288. c && c.attrs && c.attrs.path && (o = c.attrs.path);
  28289. }
  28290. return { rot: d, path: o, colors: A.sort(function(r, h) {
  28291. return parseInt(r.pos) - parseInt(h.pos);
  28292. }) };
  28293. }
  28294. return I ? I.indexOf("#") === -1 ? "#".concat(I) : I : null;
  28295. }
  28296. function abg(t) {
  28297. return VD.apply(this, arguments);
  28298. }
  28299. function VD() {
  28300. return VD = SC(bI.mark(function t(I) {
  28301. var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og, cg, rg, dg, Bg, Zg, Xg, Kg, kg;
  28302. return bI.wrap(function(Wg) {
  28303. for (; ; ) switch (Wg.prev = Wg.next) {
  28304. case 0:
  28305. if (g = I.slideContent, C = I.slideLayoutContent, i = I.slideMasterContent, e = U(g, ["p:sld", "p:cSld", "p:bg", "p:bgPr"]), A = U(g, ["p:sld", "p:cSld", "p:bg", "p:bgRef"]), s = "#fff", l = "color", !e) {
  28306. Wg.next = 32;
  28307. break;
  28308. }
  28309. if ((n = Hs(e)) !== "SOLID_FILL") {
  28310. Wg.next = 17;
  28311. break;
  28312. }
  28313. a = e["a:solidFill"], (o = U(g, ["p:sld", "p:clrMapOvr", "a:overrideClrMapping", "attrs"])) ? d = o : (c = U(C, ["p:sldLayout", "p:clrMapOvr", "a:overrideClrMapping", "attrs"]), d = c || U(i, ["p:sldMaster", "p:clrMap", "attrs"])), r = eC(a, d, void 0, I), s = r, Wg.next = 30;
  28314. break;
  28315. case 17:
  28316. if (n !== "GRADIENT_FILL") {
  28317. Wg.next = 22;
  28318. break;
  28319. }
  28320. typeof (h = Lr(e, void 0, i, I)) == "string" ? s = h : h && (s = h, l = "gradient"), Wg.next = 30;
  28321. break;
  28322. case 22:
  28323. if (n !== "PIC_FILL") {
  28324. Wg.next = 29;
  28325. break;
  28326. }
  28327. return Wg.next = 25, zu(e, "slideBg", I);
  28328. case 25:
  28329. s = Wg.sent, l = "image", Wg.next = 30;
  28330. break;
  28331. case 29:
  28332. n === "PATTERN_FILL" && (b = Eo(e, I)) && (s = b, l = "pattern");
  28333. case 30:
  28334. Wg.next = 157;
  28335. break;
  28336. case 32:
  28337. if (!A) {
  28338. Wg.next = 40;
  28339. break;
  28340. }
  28341. (m = U(g, ["p:sld", "p:clrMapOvr", "a:overrideClrMapping", "attrs"])) ? u = m : (Z = U(C, ["p:sldLayout", "p:clrMapOvr", "a:overrideClrMapping", "attrs"]), u = Z || U(i, ["p:sldMaster", "p:clrMap", "attrs"])), p = eC(A, u, void 0, I), (Y = Number(A.attrs.idx)) > 1e3 && (R = Y - 1e3, X = I.themeContent["a:theme"]["a:themeElements"]["a:fmtScheme"]["a:bgFillStyleLst"], H = [], Object.keys(X).forEach(function(Ng) {
  28342. var wg = X[Ng];
  28343. if (Ng !== "attrs") if (wg.constructor === Array) for (var fg = 0; fg < wg.length; fg++) {
  28344. var Jg = {};
  28345. Jg[Ng] = wg[fg], wg[fg].attrs && (Jg.idex = wg[fg].attrs.order, Jg.attrs = { order: wg[fg].attrs.order }), H.push(Jg);
  28346. }
  28347. else {
  28348. var zg = {};
  28349. zg[Ng] = wg, wg.attrs && (zg.idex = wg.attrs.order, zg.attrs = { order: wg.attrs.order }), H.push(zg);
  28350. }
  28351. }), (S = H.slice(0)).sort(function(Ng, wg) {
  28352. return Ng.idex - wg.idex;
  28353. }), z = S[R - 1], (v = Hs(z)) === "SOLID_FILL" ? (K = z["a:solidFill"], V = eC(K, u, void 0, I), s = V) : v === "GRADIENT_FILL" && (typeof (N = Lr(z, p, i, I)) == "string" ? s = N : N && (s = N, l = "gradient"))), Wg.next = 157;
  28354. break;
  28355. case 40:
  28356. if (e = U(C, ["p:sldLayout", "p:cSld", "p:bg", "p:bgPr"]), A = U(C, ["p:sldLayout", "p:cSld", "p:bg", "p:bgRef"]), G = U(C, ["p:sldLayout", "p:clrMapOvr", "a:overrideClrMapping", "attrs"]), B = G || U(i, ["p:sldMaster", "p:clrMap", "attrs"]), !e) {
  28357. Wg.next = 67;
  28358. break;
  28359. }
  28360. if ((w = Hs(e)) !== "SOLID_FILL") {
  28361. Wg.next = 52;
  28362. break;
  28363. }
  28364. W = e["a:solidFill"], y = eC(W, B, void 0, I), s = y, Wg.next = 65;
  28365. break;
  28366. case 52:
  28367. if (w !== "GRADIENT_FILL") {
  28368. Wg.next = 57;
  28369. break;
  28370. }
  28371. typeof (f = Lr(e, void 0, i, I)) == "string" ? s = f : f && (s = f, l = "gradient"), Wg.next = 65;
  28372. break;
  28373. case 57:
  28374. if (w !== "PIC_FILL") {
  28375. Wg.next = 64;
  28376. break;
  28377. }
  28378. return Wg.next = 60, zu(e, "slideLayoutBg", I);
  28379. case 60:
  28380. s = Wg.sent, l = "image", Wg.next = 65;
  28381. break;
  28382. case 64:
  28383. w === "PATTERN_FILL" && (D = Eo(e, I)) && (s = D, l = "pattern");
  28384. case 65:
  28385. Wg.next = 157;
  28386. break;
  28387. case 67:
  28388. if (!A) {
  28389. Wg.next = 100;
  28390. break;
  28391. }
  28392. if (F = eC(A, B, void 0, I), !((T = Number(A.attrs.idx)) > 1e3)) {
  28393. Wg.next = 98;
  28394. break;
  28395. }
  28396. if (Q = T - 1e3, P = I.themeContent["a:theme"]["a:themeElements"]["a:fmtScheme"]["a:bgFillStyleLst"], L = [], Object.keys(P).forEach(function(Ng) {
  28397. var wg = P[Ng];
  28398. if (Ng !== "attrs") if (wg.constructor === Array) for (var fg = 0; fg < wg.length; fg++) {
  28399. var Jg = {};
  28400. Jg[Ng] = wg[fg], wg[fg].attrs && (Jg.idex = wg[fg].attrs.order, Jg.attrs = { order: wg[fg].attrs.order }), L.push(Jg);
  28401. }
  28402. else {
  28403. var zg = {};
  28404. zg[Ng] = wg, wg.attrs && (zg.idex = wg.attrs.order, zg.attrs = { order: wg.attrs.order }), L.push(zg);
  28405. }
  28406. }), (E = L.slice(0)).sort(function(Ng, wg) {
  28407. return Ng.idex - wg.idex;
  28408. }), J = E[Q - 1], (k = Hs(J)) !== "SOLID_FILL") {
  28409. Wg.next = 85;
  28410. break;
  28411. }
  28412. j = J["a:solidFill"], q = eC(j, B, void 0, I), s = q, Wg.next = 98;
  28413. break;
  28414. case 85:
  28415. if (k !== "GRADIENT_FILL") {
  28416. Wg.next = 90;
  28417. break;
  28418. }
  28419. typeof (Cg = Lr(J, F, i, I)) == "string" ? s = Cg : Cg && (s = Cg, l = "gradient"), Wg.next = 98;
  28420. break;
  28421. case 90:
  28422. if (k !== "PIC_FILL") {
  28423. Wg.next = 97;
  28424. break;
  28425. }
  28426. return Wg.next = 93, zu(J, "themeBg", I);
  28427. case 93:
  28428. s = Wg.sent, l = "image", Wg.next = 98;
  28429. break;
  28430. case 97:
  28431. k === "PATTERN_FILL" && (Ig = Eo(J, I)) && (s = Ig, l = "pattern");
  28432. case 98:
  28433. Wg.next = 157;
  28434. break;
  28435. case 100:
  28436. if (e = U(i, ["p:sldMaster", "p:cSld", "p:bg", "p:bgPr"]), A = U(i, ["p:sldMaster", "p:cSld", "p:bg", "p:bgRef"]), x = U(i, ["p:sldMaster", "p:clrMap", "attrs"]), !e) {
  28437. Wg.next = 126;
  28438. break;
  28439. }
  28440. if ((Ag = Hs(e)) !== "SOLID_FILL") {
  28441. Wg.next = 111;
  28442. break;
  28443. }
  28444. eg = e["a:solidFill"], O = eC(eg, x, void 0, I), s = O, Wg.next = 124;
  28445. break;
  28446. case 111:
  28447. if (Ag !== "GRADIENT_FILL") {
  28448. Wg.next = 116;
  28449. break;
  28450. }
  28451. typeof (_ = Lr(e, void 0, i, I)) == "string" ? s = _ : _ && (s = _, l = "gradient"), Wg.next = 124;
  28452. break;
  28453. case 116:
  28454. if (Ag !== "PIC_FILL") {
  28455. Wg.next = 123;
  28456. break;
  28457. }
  28458. return Wg.next = 119, zu(e, "slideMasterBg", I);
  28459. case 119:
  28460. s = Wg.sent, l = "image", Wg.next = 124;
  28461. break;
  28462. case 123:
  28463. Ag === "PATTERN_FILL" && (gg = Eo(e, I)) && (s = gg, l = "pattern");
  28464. case 124:
  28465. Wg.next = 157;
  28466. break;
  28467. case 126:
  28468. if (!A) {
  28469. Wg.next = 157;
  28470. break;
  28471. }
  28472. if (lg = eC(A, x, void 0, I), !((ng = Number(A.attrs.idx)) > 1e3)) {
  28473. Wg.next = 157;
  28474. break;
  28475. }
  28476. if (sg = ng - 1e3, og = I.themeContent["a:theme"]["a:themeElements"]["a:fmtScheme"]["a:bgFillStyleLst"], cg = [], Object.keys(og).forEach(function(Ng) {
  28477. var wg = og[Ng];
  28478. if (Ng !== "attrs") if (wg.constructor === Array) for (var fg = 0; fg < wg.length; fg++) {
  28479. var Jg = {};
  28480. Jg[Ng] = wg[fg], wg[fg].attrs && (Jg.idex = wg[fg].attrs.order, Jg.attrs = { order: wg[fg].attrs.order }), cg.push(Jg);
  28481. }
  28482. else {
  28483. var zg = {};
  28484. zg[Ng] = wg, wg.attrs && (zg.idex = wg.attrs.order, zg.attrs = { order: wg.attrs.order }), cg.push(zg);
  28485. }
  28486. }), (rg = cg.slice(0)).sort(function(Ng, wg) {
  28487. return Ng.idex - wg.idex;
  28488. }), dg = rg[sg - 1], (Bg = Hs(dg)) !== "SOLID_FILL") {
  28489. Wg.next = 144;
  28490. break;
  28491. }
  28492. Zg = dg["a:solidFill"], Xg = eC(Zg, B, void 0, I), s = Xg, Wg.next = 157;
  28493. break;
  28494. case 144:
  28495. if (Bg !== "GRADIENT_FILL") {
  28496. Wg.next = 149;
  28497. break;
  28498. }
  28499. typeof (Kg = Lr(dg, lg, i, I)) == "string" ? s = Kg : Kg && (s = Kg, l = "gradient"), Wg.next = 157;
  28500. break;
  28501. case 149:
  28502. if (Bg !== "PIC_FILL") {
  28503. Wg.next = 156;
  28504. break;
  28505. }
  28506. return Wg.next = 152, zu(dg, "themeBg", I);
  28507. case 152:
  28508. s = Wg.sent, l = "image", Wg.next = 157;
  28509. break;
  28510. case 156:
  28511. Bg === "PATTERN_FILL" && (kg = Eo(dg, I)) && (s = kg, l = "pattern");
  28512. case 157:
  28513. return Wg.abrupt("return", { type: l, value: s });
  28514. case 158:
  28515. case "end":
  28516. return Wg.stop();
  28517. }
  28518. }, t);
  28519. })), VD.apply(this, arguments);
  28520. }
  28521. function jtg(t, I, g, C, i) {
  28522. return MD.apply(this, arguments);
  28523. }
  28524. function MD() {
  28525. return MD = SC(bI.mark(function t(I, g, C, i, e) {
  28526. var A, s, l, n, a, d, o, c, r, h, b, u = arguments;
  28527. return bI.wrap(function(m) {
  28528. for (; ; ) switch (m.prev = m.next) {
  28529. case 0:
  28530. if (A = u.length > 5 && u[5] !== void 0 ? u[5] : [], s = Hs(U(I, ["p:spPr"])), l = "color", n = "", s !== "NO_FILL") {
  28531. m.next = 8;
  28532. break;
  28533. }
  28534. return m.abrupt("return", C ? "none" : "");
  28535. case 8:
  28536. if (s !== "SOLID_FILL") {
  28537. m.next = 14;
  28538. break;
  28539. }
  28540. a = I["p:spPr"]["a:solidFill"], n = eC(a, void 0, void 0, i), l = "color", m.next = 38;
  28541. break;
  28542. case 14:
  28543. if (s !== "GRADIENT_FILL") {
  28544. m.next = 20;
  28545. break;
  28546. }
  28547. d = I["p:spPr"]["a:gradFill"], n = j9(d, i), l = "gradient", m.next = 38;
  28548. break;
  28549. case 20:
  28550. if (s !== "PIC_FILL") {
  28551. m.next = 30;
  28552. break;
  28553. }
  28554. return o = I["p:spPr"]["a:blipFill"], m.next = 24, rM(e, o, i);
  28555. case 24:
  28556. c = m.sent, r = Ttg(o), n = { picBase64: c, opacity: r }, l = "image", m.next = 38;
  28557. break;
  28558. case 30:
  28559. if (s !== "PATTERN_FILL") {
  28560. m.next = 36;
  28561. break;
  28562. }
  28563. h = I["p:spPr"]["a:pattFill"], n = Eo({ "a:pattFill": h }, i), l = "pattern", m.next = 38;
  28564. break;
  28565. case 36:
  28566. if (s !== "GROUP_FILL") {
  28567. m.next = 38;
  28568. break;
  28569. }
  28570. return m.abrupt("return", obg(A, i, e));
  28571. case 38:
  28572. if (n || (b = U(I, ["p:style", "a:fillRef"]), n = eC(b, void 0, void 0, i), l = "color"), n || !g || s !== "NO_FILL") {
  28573. m.next = 41;
  28574. break;
  28575. }
  28576. return m.abrupt("return", C ? "none" : "");
  28577. case 41:
  28578. return m.abrupt("return", { type: l, value: n });
  28579. case 42:
  28580. case "end":
  28581. return m.stop();
  28582. }
  28583. }, t);
  28584. })), MD.apply(this, arguments);
  28585. }
  28586. function obg(t, I, g) {
  28587. return RD.apply(this, arguments);
  28588. }
  28589. function RD() {
  28590. return RD = SC(bI.mark(function t(I, g, C) {
  28591. var i, e, A, s, l, n, a, d, o, c, r, h, b;
  28592. return bI.wrap(function(u) {
  28593. for (; ; ) switch (u.prev = u.next) {
  28594. case 0:
  28595. i = I.length - 1;
  28596. case 1:
  28597. if (!(i >= 0)) {
  28598. u.next = 39;
  28599. break;
  28600. }
  28601. if ((e = I[i]) && e["p:grpSpPr"]) {
  28602. u.next = 5;
  28603. break;
  28604. }
  28605. return u.abrupt("continue", 36);
  28606. case 5:
  28607. if (A = e["p:grpSpPr"], (s = Hs(A)) !== "SOLID_FILL") {
  28608. u.next = 14;
  28609. break;
  28610. }
  28611. if (l = A["a:solidFill"], !(n = eC(l, void 0, void 0, g))) {
  28612. u.next = 12;
  28613. break;
  28614. }
  28615. return u.abrupt("return", { type: "color", value: n });
  28616. case 12:
  28617. u.next = 36;
  28618. break;
  28619. case 14:
  28620. if (s !== "GRADIENT_FILL") {
  28621. u.next = 21;
  28622. break;
  28623. }
  28624. if (a = A["a:gradFill"], !(d = j9(a, g))) {
  28625. u.next = 19;
  28626. break;
  28627. }
  28628. return u.abrupt("return", { type: "gradient", value: d });
  28629. case 19:
  28630. u.next = 36;
  28631. break;
  28632. case 21:
  28633. if (s !== "PIC_FILL") {
  28634. u.next = 31;
  28635. break;
  28636. }
  28637. return o = A["a:blipFill"], u.next = 25, rM(C, o, g);
  28638. case 25:
  28639. if (c = u.sent, r = Ttg(o), !c) {
  28640. u.next = 29;
  28641. break;
  28642. }
  28643. return u.abrupt("return", { type: "image", value: { picBase64: c, opacity: r } });
  28644. case 29:
  28645. u.next = 36;
  28646. break;
  28647. case 31:
  28648. if (s !== "PATTERN_FILL") {
  28649. u.next = 36;
  28650. break;
  28651. }
  28652. if (h = A["a:pattFill"], !(b = Eo({ "a:pattFill": h }, g))) {
  28653. u.next = 36;
  28654. break;
  28655. }
  28656. return u.abrupt("return", { type: "pattern", value: b });
  28657. case 36:
  28658. i--, u.next = 1;
  28659. break;
  28660. case 39:
  28661. return u.abrupt("return", null);
  28662. case 40:
  28663. case "end":
  28664. return u.stop();
  28665. }
  28666. }, t);
  28667. })), RD.apply(this, arguments);
  28668. }
  28669. function eC(t, I, g, C) {
  28670. if (!t) return "";
  28671. var i, e, A, s = "";
  28672. if (t["a:srgbClr"]) s = U(i = t["a:srgbClr"], ["attrs", "val"]);
  28673. else if (t["a:schemeClr"])
  28674. s = YD("a:" + U(i = t["a:schemeClr"], ["attrs", "val"]), C, I, g) || "";
  28675. else if (t["a:scrgbClr"]) {
  28676. var l = (i = t["a:scrgbClr"]).attrs, n = l.r.indexOf("%") !== -1 ? l.r.split("%").shift() : l.r, a = l.g.indexOf("%") !== -1 ? l.g.split("%").shift() : l.g, d = l.b.indexOf("%") !== -1 ? l.b.split("%").shift() : l.b;
  28677. s = Jr(Number(n) / 100 * 255) + Jr(Number(a) / 100 * 255) + Jr(Number(d) / 100 * 255);
  28678. } else if (t["a:prstClr"]) {
  28679. var o = U(i = t["a:prstClr"], ["attrs", "val"]);
  28680. (A = ["white", "AliceBlue", "AntiqueWhite", "Aqua", "Aquamarine", "Azure", "Beige", "Bisque", "black", "BlanchedAlmond", "Blue", "BlueViolet", "Brown", "BurlyWood", "CadetBlue", "Chartreuse", "Chocolate", "Coral", "CornflowerBlue", "Cornsilk", "Crimson", "Cyan", "DarkBlue", "DarkCyan", "DarkGoldenRod", "DarkGray", "DarkGrey", "DarkGreen", "DarkKhaki", "DarkMagenta", "DarkOliveGreen", "DarkOrange", "DarkOrchid", "DarkRed", "DarkSalmon", "DarkSeaGreen", "DarkSlateBlue", "DarkSlateGray", "DarkSlateGrey", "DarkTurquoise", "DarkViolet", "DeepPink", "DeepSkyBlue", "DimGray", "DimGrey", "DodgerBlue", "FireBrick", "FloralWhite", "ForestGreen", "Fuchsia", "Gainsboro", "GhostWhite", "Gold", "GoldenRod", "Gray", "Grey", "Green", "GreenYellow", "HoneyDew", "HotPink", "IndianRed", "Indigo", "Ivory", "Khaki", "Lavender", "LavenderBlush", "LawnGreen", "LemonChiffon", "LightBlue", "LightCoral", "LightCyan", "LightGoldenRodYellow", "LightGray", "LightGrey", "LightGreen", "LightPink", "LightSalmon", "LightSeaGreen", "LightSkyBlue", "LightSlateGray", "LightSlateGrey", "LightSteelBlue", "LightYellow", "Lime", "LimeGreen", "Linen", "Magenta", "Maroon", "MediumAquaMarine", "MediumBlue", "MediumOrchid", "MediumPurple", "MediumSeaGreen", "MediumSlateBlue", "MediumSpringGreen", "MediumTurquoise", "MediumVioletRed", "MidnightBlue", "MintCream", "MistyRose", "Moccasin", "NavajoWhite", "Navy", "OldLace", "Olive", "OliveDrab", "Orange", "OrangeRed", "Orchid", "PaleGoldenRod", "PaleGreen", "PaleTurquoise", "PaleVioletRed", "PapayaWhip", "PeachPuff", "Peru", "Pink", "Plum", "PowderBlue", "Purple", "RebeccaPurple", "Red", "RosyBrown", "RoyalBlue", "SaddleBrown", "Salmon", "SandyBrown", "SeaGreen", "SeaShell", "Sienna", "Silver", "SkyBlue", "SlateBlue", "SlateGray", "SlateGrey", "Snow", "SpringGreen", "SteelBlue", "Tan", "Teal", "Thistle", "Tomato", "Turquoise", "Violet", "Wheat", "White", "WhiteSmoke", "Yellow", "YellowGreen"].indexOf(o)) !== -1 && (e = ["ffffff", "f0f8ff", "faebd7", "00ffff", "7fffd4", "f0ffff", "f5f5dc", "ffe4c4", "000000", "ffebcd", "0000ff", "8a2be2", "a52a2a", "deb887", "5f9ea0", "7fff00", "d2691e", "ff7f50", "6495ed", "fff8dc", "dc143c", "00ffff", "00008b", "008b8b", "b8860b", "a9a9a9", "a9a9a9", "006400", "bdb76b", "8b008b", "556b2f", "ff8c00", "9932cc", "8b0000", "e9967a", "8fbc8f", "483d8b", "2f4f4f", "2f4f4f", "00ced1", "9400d3", "ff1493", "00bfff", "696969", "696969", "1e90ff", "b22222", "fffaf0", "228b22", "ff00ff", "dcdcdc", "f8f8ff", "ffd700", "daa520", "808080", "808080", "008000", "adff2f", "f0fff0", "ff69b4", "cd5c5c", "4b0082", "fffff0", "f0e68c", "e6e6fa", "fff0f5", "7cfc00", "fffacd", "add8e6", "f08080", "e0ffff", "fafad2", "d3d3d3", "d3d3d3", "90ee90", "ffb6c1", "ffa07a", "20b2aa", "87cefa", "778899", "778899", "b0c4de", "ffffe0", "00ff00", "32cd32", "faf0e6", "ff00ff", "800000", "66cdaa", "0000cd", "ba55d3", "9370db", "3cb371", "7b68ee", "00fa9a", "48d1cc", "c71585", "191970", "f5fffa", "ffe4e1", "ffe4b5", "ffdead", "000080", "fdf5e6", "808000", "6b8e23", "ffa500", "ff4500", "da70d6", "eee8aa", "98fb98", "afeeee", "db7093", "ffefd5", "ffdab9", "cd853f", "ffc0cb", "dda0dd", "b0e0e6", "800080", "663399", "ff0000", "bc8f8f", "4169e1", "8b4513", "fa8072", "f4a460", "2e8b57", "fff5ee", "a0522d", "c0c0c0", "87ceeb", "6a5acd", "708090", "708090", "fffafa", "00ff7f", "4682b4", "d2b48c", "008080", "d8bfd8", "ff6347", "40e0d0", "ee82ee", "f5deb3", "ffffff", "f5f5f5", "ffff00", "9acd32"][A]), s = e;
  28681. } else if (t["a:hslClr"]) {
  28682. var c = (i = t["a:hslClr"]).attrs, r = function(S, z, v) {
  28683. var K, V = 2 * v - (K = v <= 0.5 ? v * (z + 1) : v + z - v * z);
  28684. return { r: 255 * KX(V, K, 2 + (S /= 60)), g: 255 * KX(V, K, S), b: 255 * KX(V, K, S - 2) };
  28685. }(Number(c.hue) / 1e5, Number(c.sat.indexOf("%") !== -1 ? c.sat.split("%").shift() : c.sat) / 100, Number(c.lum.indexOf("%") !== -1 ? c.lum.split("%").shift() : c.lum) / 100);
  28686. s = Jr(r.r) + Jr(r.g) + Jr(r.b);
  28687. } else if (t["a:sysClr"]) {
  28688. var h = U(i = t["a:sysClr"], ["attrs", "lastClr"]);
  28689. h && (s = h);
  28690. }
  28691. var b = !1, u = parseInt(U(i, ["a:alpha", "attrs", "val"])) / 1e5;
  28692. if (!isNaN(u)) {
  28693. var m = Qg(s);
  28694. m.setAlpha(u), s = m.toHex8(), b = !0;
  28695. }
  28696. var Z = parseInt(U(i, ["a:hueMod", "attrs", "val"])) / 1e5;
  28697. isNaN(Z) || (s = function(S, z, v) {
  28698. var K = Qg(S).toHsl(), V = K.h * z;
  28699. return V >= 360 && (V -= 360), v ? Qg({ h: V, s: K.s, l: K.l, a: K.a }).toHex8() : Qg({ h: V, s: K.s, l: K.l, a: K.a }).toHex();
  28700. }(s, Z, b));
  28701. var p = parseInt(U(i, ["a:lumMod", "attrs", "val"])) / 1e5;
  28702. isNaN(p) || (s = function(S, z, v) {
  28703. var K = Qg(S).toHsl(), V = K.l * z;
  28704. return V >= 1 && (V = 1), v ? Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex8() : Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex();
  28705. }(s, p, b));
  28706. var Y = parseInt(U(i, ["a:lumOff", "attrs", "val"])) / 1e5;
  28707. isNaN(Y) || (s = function(S, z, v) {
  28708. var K = Qg(S).toHsl(), V = z + K.l;
  28709. return V >= 1 ? v ? Qg({ h: K.h, s: K.s, l: 1, a: K.a }).toHex8() : Qg({ h: K.h, s: K.s, l: 1, a: K.a }).toHex() : v ? Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex8() : Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex();
  28710. }(s, Y, b));
  28711. var R = parseInt(U(i, ["a:satMod", "attrs", "val"])) / 1e5;
  28712. isNaN(R) || (s = function(S, z, v) {
  28713. var K = Qg(S).toHsl(), V = K.s * z;
  28714. return V >= 1 && (V = 1), v ? Qg({ h: K.h, s: V, l: K.l, a: K.a }).toHex8() : Qg({ h: K.h, s: V, l: K.l, a: K.a }).toHex();
  28715. }(s, R, b));
  28716. var X = parseInt(U(i, ["a:shade", "attrs", "val"])) / 1e5;
  28717. isNaN(X) || (s = function(S, z, v) {
  28718. var K = Qg(S).toHsl();
  28719. z >= 1 && (z = 1);
  28720. var V = Math.min(K.l * z, 1);
  28721. return v ? Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex8() : Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex();
  28722. }(s, X, b));
  28723. var H = parseInt(U(i, ["a:tint", "attrs", "val"])) / 1e5;
  28724. return isNaN(H) || (s = vtg(s, H, b)), s && s.indexOf("#") === -1 && (s = "#" + s), s;
  28725. }
  28726. function cbg(t, I) {
  28727. var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
  28728. if (!g) {
  28729. if (Array.isArray(t) || (g = function(l, n) {
  28730. if (l) {
  28731. if (typeof l == "string") return hq(l, n);
  28732. var a = Object.prototype.toString.call(l).slice(8, -1);
  28733. if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
  28734. if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return hq(l, n);
  28735. }
  28736. }(t)) || I) {
  28737. g && (t = g);
  28738. var C = 0, i = function() {
  28739. };
  28740. return { s: i, n: function() {
  28741. return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
  28742. }, e: function(l) {
  28743. throw l;
  28744. }, f: i };
  28745. }
  28746. throw new TypeError(`Invalid attempt to iterate non-iterable instance.
  28747. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
  28748. }
  28749. var e, A = !0, s = !1;
  28750. return { s: function() {
  28751. g = g.call(t);
  28752. }, n: function() {
  28753. var l = g.next();
  28754. return A = l.done, l;
  28755. }, e: function(l) {
  28756. s = !0, e = l;
  28757. }, f: function() {
  28758. try {
  28759. A || g.return == null || g.return();
  28760. } finally {
  28761. if (s) throw e;
  28762. }
  28763. } };
  28764. }
  28765. function hq(t, I) {
  28766. (I == null || I > t.length) && (I = t.length);
  28767. for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
  28768. return C;
  28769. }
  28770. function Li(t, I) {
  28771. t.constructor !== Array && (t = [t]);
  28772. var g, C = [], i = cbg(t);
  28773. try {
  28774. for (i.s(); !(g = i.n()).done; ) {
  28775. var e = g.value, A = U(e, ["c:spPr", "a:solidFill", "a:schemeClr"]);
  28776. A || (A = U(e, ["c:spPr", "a:ln", "a:solidFill", "a:schemeClr"])), A || (A = U(e, ["c:marker", "c:spPr", "a:ln", "a:solidFill", "a:schemeClr"]));
  28777. var s = U(A, ["attrs", "val"]);
  28778. if (s) {
  28779. s = U(I.themeContent, ["a:theme", "a:themeElements", "a:clrScheme", "a:".concat(s), "a:srgbClr", "attrs", "val"]);
  28780. var l = U(A, ["a:tint", "attrs", "val"]) / 1e5;
  28781. s && !isNaN(l) && (s = vtg(s, l));
  28782. } else s = U(e, ["c:spPr", "a:solidFill", "a:srgbClr", "attrs", "val"]);
  28783. s && (s = "#" + s), C.push(s);
  28784. }
  28785. } catch (n) {
  28786. i.e(n);
  28787. } finally {
  28788. i.f();
  28789. }
  28790. return C;
  28791. }
  28792. function yi(t) {
  28793. var I = [];
  28794. if (!t) return I;
  28795. if (t["c:xVal"]) {
  28796. var g = [];
  28797. zr(t["c:xVal"]["c:numRef"]["c:numCache"]["c:pt"], function(C) {
  28798. return g.push(parseFloat(C["c:v"])), "";
  28799. }), I.push(g), g = [], zr(t["c:yVal"]["c:numRef"]["c:numCache"]["c:pt"], function(C) {
  28800. return g.push(parseFloat(C["c:v"])), "";
  28801. }), I.push(g);
  28802. } else zr(t, function(C, i) {
  28803. var e = [], A = U(C, ["c:tx", "c:strRef", "c:strCache", "c:pt", "c:v"]) || i, s = {};
  28804. return U(C, ["c:cat", "c:strRef", "c:strCache", "c:pt"]) ? zr(C["c:cat"]["c:strRef"]["c:strCache"]["c:pt"], function(l) {
  28805. return s[l.attrs.idx] = l["c:v"], "";
  28806. }) : U(C, ["c:cat", "c:numRef", "c:numCache", "c:pt"]) && zr(C["c:cat"]["c:numRef"]["c:numCache"]["c:pt"], function(l) {
  28807. return s[l.attrs.idx] = l["c:v"], "";
  28808. }), U(C, ["c:val", "c:numRef", "c:numCache", "c:pt"]) && zr(C["c:val"]["c:numRef"]["c:numCache"]["c:pt"], function(l) {
  28809. return e.push({ x: l.attrs.idx, y: parseFloat(l["c:v"]) }), "";
  28810. }), I.push({ key: A, values: e, xlabels: s }), "";
  28811. });
  28812. return I;
  28813. }
  28814. function dbg(t, I) {
  28815. var g = null;
  28816. for (var C in t) switch (C) {
  28817. case "c:lineChart":
  28818. g = { type: "lineChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]), marker: !!t[C]["c:marker"] };
  28819. break;
  28820. case "c:line3DChart":
  28821. g = { type: "line3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]) };
  28822. break;
  28823. case "c:barChart":
  28824. g = { type: "barChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]), barDir: U(t[C], ["c:barDir", "attrs", "val"]) };
  28825. break;
  28826. case "c:bar3DChart":
  28827. g = { type: "bar3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]), barDir: U(t[C], ["c:barDir", "attrs", "val"]) };
  28828. break;
  28829. case "c:pieChart":
  28830. g = { type: "pieChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"]["c:dPt"], I) };
  28831. break;
  28832. case "c:pie3DChart":
  28833. g = { type: "pie3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"]["c:dPt"], I) };
  28834. break;
  28835. case "c:doughnutChart":
  28836. g = { type: "doughnutChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"]["c:dPt"], I), holeSize: U(t[C], ["c:holeSize", "attrs", "val"]) };
  28837. break;
  28838. case "c:areaChart":
  28839. g = { type: "areaChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]) };
  28840. break;
  28841. case "c:area3DChart":
  28842. g = { type: "area3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]) };
  28843. break;
  28844. case "c:scatterChart":
  28845. g = { type: "scatterChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), style: U(t[C], ["c:scatterStyle", "attrs", "val"]) };
  28846. break;
  28847. case "c:bubbleChart":
  28848. g = { type: "bubbleChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I) };
  28849. break;
  28850. case "c:radarChart":
  28851. g = { type: "radarChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), style: U(t[C], ["c:radarStyle", "attrs", "val"]) };
  28852. break;
  28853. case "c:surfaceChart":
  28854. g = { type: "surfaceChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I) };
  28855. break;
  28856. case "c:surface3DChart":
  28857. g = { type: "surface3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I) };
  28858. break;
  28859. case "c:stockChart":
  28860. g = { type: "stockChart", data: yi(t[C]["c:ser"]), colors: [] };
  28861. }
  28862. return g;
  28863. }
  28864. function rbg(t, I, g, C) {
  28865. var i = U(t, ["a:pPr", "attrs", "algn"]);
  28866. if (i || (i = U(I, ["a:pPr", "attrs", "algn"])), !i) if (g === "title" || g === "ctrTitle" || g === "subTitle") {
  28867. var e = 1, A = U(I, ["a:pPr", "attrs", "lvl"]);
  28868. A && (e = parseInt(A) + 1);
  28869. var s = "a:lvl" + e + "pPr";
  28870. (i = U(C, ["slideLayoutTables", "typeTable", g, "p:txBody", "a:lstStyle", s, "attrs", "algn"])) || (i = U(C, ["slideMasterTables", "typeTable", g, "p:txBody", "a:lstStyle", s, "attrs", "algn"])), i || (i = U(C, ["slideMasterTextStyles", "p:titleStyle", s, "attrs", "algn"])), i || g !== "subTitle" || (i = U(C, ["slideMasterTextStyles", "p:bodyStyle", s, "attrs", "algn"]));
  28871. } else i = U(C, g === "body" ? ["slideMasterTextStyles", "p:bodyStyle", "a:lvl1pPr", "attrs", "algn"] : ["slideMasterTables", "typeTable", g, "p:txBody", "a:lstStyle", "a:lvl1pPr", "attrs", "algn"]);
  28872. var l = "left";
  28873. if (i) switch (i) {
  28874. case "l":
  28875. l = "left";
  28876. break;
  28877. case "r":
  28878. l = "right";
  28879. break;
  28880. case "ctr":
  28881. l = "center";
  28882. break;
  28883. case "just":
  28884. case "dist":
  28885. l = "justify";
  28886. break;
  28887. default:
  28888. l = "inherit";
  28889. }
  28890. return l;
  28891. }
  28892. function hbg(t, I, g) {
  28893. var C = U(t, ["p:txBody", "a:bodyPr", "attrs", "anchor"]);
  28894. return C || (C = U(I, ["p:txBody", "a:bodyPr", "attrs", "anchor"])) || (C = U(g, ["p:txBody", "a:bodyPr", "attrs", "anchor"])) || (C = "t"), C === "ctr" ? "mid" : C === "b" ? "down" : "up";
  28895. }
  28896. function bbg(t, I, g) {
  28897. function C(s) {
  28898. if (!s) return null;
  28899. if (s["a:noAutofit"]) return { result: null };
  28900. if (s["a:spAutoFit"]) return { result: { type: "shape" } };
  28901. if (s["a:normAutofit"]) {
  28902. var l = U(s["a:normAutofit"], ["attrs", "fontScale"]);
  28903. return l ? { result: { type: "text", fontScale: parseInt(l) / 1e3 } } : { result: { type: "text" } };
  28904. }
  28905. return null;
  28906. }
  28907. var i = C(U(t, ["p:txBody", "a:bodyPr"]));
  28908. if (i) return i.result;
  28909. var e = C(U(I, ["p:txBody", "a:bodyPr"]));
  28910. if (e) return e.result;
  28911. var A = C(U(g, ["p:txBody", "a:bodyPr"]));
  28912. return A ? A.result : null;
  28913. }
  28914. var Gg = 72 / 914400;
  28915. function f0(t, I, g) {
  28916. var C;
  28917. return t ? C = t["a:off"].attrs : I ? C = I["a:off"].attrs : g && (C = g["a:off"].attrs), C ? { top: Lt(parseInt(C.y) * Gg), left: Lt(parseInt(C.x) * Gg) } : { top: 0, left: 0 };
  28918. }
  28919. function H0(t, I, g) {
  28920. var C;
  28921. return t ? C = t["a:ext"].attrs : I ? C = I["a:ext"].attrs : g && (C = g["a:ext"].attrs), C ? { width: Lt(parseInt(C.cx) * Gg), height: Lt(parseInt(C.cy) * Gg) } : { width: 0, height: 0 };
  28922. }
  28923. function ubg(t, I) {
  28924. return function(g) {
  28925. if (Array.isArray(g)) return g;
  28926. }(t) || function(g, C) {
  28927. var i = g == null ? null : typeof Symbol < "u" && g[Symbol.iterator] || g["@@iterator"];
  28928. if (i != null) {
  28929. var e, A, s = [], l = !0, n = !1;
  28930. try {
  28931. for (i = i.call(g); !(l = (e = i.next()).done) && (s.push(e.value), !C || s.length !== C); l = !0) ;
  28932. } catch (a) {
  28933. n = !0, A = a;
  28934. } finally {
  28935. try {
  28936. l || i.return == null || i.return();
  28937. } finally {
  28938. if (n) throw A;
  28939. }
  28940. }
  28941. return s;
  28942. }
  28943. }(t, I) || tCg(t, I) || function() {
  28944. throw new TypeError(`Invalid attempt to destructure non-iterable instance.
  28945. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
  28946. }();
  28947. }
  28948. function Qtg(t, I) {
  28949. var g = eC(t, void 0, void 0, I), C = t.attrs, i = C.dir ? parseInt(C.dir) / 6e4 : 0, e = C.dist ? parseInt(C.dist) * Gg : 0, A = C.blurRad ? parseInt(C.blurRad) * Gg : "", s = e * Math.sin(i * Math.PI / 180);
  28950. return { h: e * Math.cos(i * Math.PI / 180), v: s, blur: A, color: g };
  28951. }
  28952. function bq(t, I) {
  28953. var g = Object.keys(t);
  28954. if (Object.getOwnPropertySymbols) {
  28955. var C = Object.getOwnPropertySymbols(t);
  28956. I && (C = C.filter(function(i) {
  28957. return Object.getOwnPropertyDescriptor(t, i).enumerable;
  28958. })), g.push.apply(g, C);
  28959. }
  28960. return g;
  28961. }
  28962. function os(t) {
  28963. for (var I = 1; I < arguments.length; I++) {
  28964. var g = arguments[I] != null ? arguments[I] : {};
  28965. I % 2 ? bq(Object(g), !0).forEach(function(C) {
  28966. f9(t, C, g[C]);
  28967. }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(g)) : bq(Object(g)).forEach(function(C) {
  28968. Object.defineProperty(t, C, Object.getOwnPropertyDescriptor(g, C));
  28969. });
  28970. }
  28971. return t;
  28972. }
  28973. function uq(t, I) {
  28974. var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
  28975. if (!g) {
  28976. if (Array.isArray(t) || (g = function(l, n) {
  28977. if (l) {
  28978. if (typeof l == "string") return mq(l, n);
  28979. var a = Object.prototype.toString.call(l).slice(8, -1);
  28980. if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
  28981. if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return mq(l, n);
  28982. }
  28983. }(t)) || I) {
  28984. g && (t = g);
  28985. var C = 0, i = function() {
  28986. };
  28987. return { s: i, n: function() {
  28988. return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
  28989. }, e: function(l) {
  28990. throw l;
  28991. }, f: i };
  28992. }
  28993. throw new TypeError(`Invalid attempt to iterate non-iterable instance.
  28994. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
  28995. }
  28996. var e, A = !0, s = !1;
  28997. return { s: function() {
  28998. g = g.call(t);
  28999. }, n: function() {
  29000. var l = g.next();
  29001. return A = l.done, l;
  29002. }, e: function(l) {
  29003. s = !0, e = l;
  29004. }, f: function() {
  29005. try {
  29006. A || g.return == null || g.return();
  29007. } finally {
  29008. if (s) throw e;
  29009. }
  29010. } };
  29011. }
  29012. function mq(t, I) {
  29013. (I == null || I > t.length) && (I = t.length);
  29014. for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
  29015. return C;
  29016. }
  29017. function BV(t, I, g, C, i) {
  29018. if (!t) return "";
  29019. var e, A = "", s = U(I, ["p:style", "a:fontRef"]), l = t["a:p"], n = l.constructor === Array ? l : [l], a = null, d = /* @__PURE__ */ new Map(), o = uq(n);
  29020. try {
  29021. for (o.s(); !(e = o.n()).done; ) {
  29022. var c = e.value, r = c["a:r"], h = c["a:fld"], b = c["a:br"];
  29023. r && (r = r.constructor === Array ? r : [r], h && (h = h.constructor === Array ? h : [h], r = r.concat(h)), b && ((b = b.constructor === Array ? b : [b]).forEach(function(G) {
  29024. return G.type = "br";
  29025. }), b.length > 1 && b.shift(), (r = r.concat(b)).sort(function(G, w) {
  29026. return !G.attrs || !w.attrs || G.attrs.order - w.attrs.order;
  29027. })));
  29028. var u = rbg(c, I, C, i), m = mbg(c, t, g, C, i);
  29029. if (m) {
  29030. var Z = Zbg(m);
  29031. if (!a || a.key !== Z) {
  29032. a && (A += "</".concat(a.tag, ">")), A += "<".concat(m.tag, ' style="list-style: none; padding-left: 0; margin: 0;">');
  29033. var p = m.kind === "autoNum" ? d.has(Z) ? d.get(Z) : m.startAt : null;
  29034. a = { key: Z, tag: m.tag, listInfo: m, counter: p };
  29035. }
  29036. var Y = wbg(a);
  29037. a.listInfo.kind === "autoNum" && d.set(a.key, a.counter);
  29038. var R = Gbg(a.listInfo), X = 1.5 * (m.lvl - 1);
  29039. A += '<li style="text-align: '.concat(u, "; margin-left: ").concat(X, 'em;"><span style="').concat(R, '">').concat(Y, "</span>");
  29040. } else a && (A += "</".concat(a.tag, ">"), a = null, d.clear()), A += '<p style="text-align: '.concat(u, ';">');
  29041. if (r) {
  29042. var H, S = null, z = "", v = uq(r);
  29043. try {
  29044. for (v.s(); !(H = v.n()).done; ) {
  29045. var K = Otg(H.value, c, t, s, g, C, i);
  29046. if (!S || S.styleText !== K.styleText || S.hasLink !== K.hasLink || K.hasLink) {
  29047. if (z) {
  29048. var V = z.replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;").replace(/\s/g, "&nbsp;");
  29049. A += '<span style="'.concat(S.styleText, '">').concat(V, "</span>"), z = "";
  29050. }
  29051. if (K.hasLink) {
  29052. var N = K.text.replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;").replace(/\s/g, "&nbsp;");
  29053. A += '<span style="'.concat(K.styleText, '"><a href="').concat(K.linkURL, '" target="_blank">').concat(N, "</a></span>"), S = null;
  29054. } else S = K, z = K.text;
  29055. } else z += K.text;
  29056. }
  29057. } catch (G) {
  29058. v.e(G);
  29059. } finally {
  29060. v.f();
  29061. }
  29062. if (z && S) {
  29063. var B = z.replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;").replace(/\s/g, "&nbsp;");
  29064. A += '<span style="'.concat(S.styleText, '">').concat(B, "</span>");
  29065. }
  29066. } else A += pbg(c, I, t, s, g, C, i);
  29067. A += m ? "</li>" : "</p>";
  29068. }
  29069. } catch (G) {
  29070. o.e(G);
  29071. } finally {
  29072. o.f();
  29073. }
  29074. return a && (A += "</".concat(a.tag, ">")), A;
  29075. }
  29076. function mbg(t, I, g, C, i) {
  29077. var e = t["a:pPr"];
  29078. if (!e || e["a:buNone"]) return null;
  29079. var A = 1, s = U(e, ["attrs", "lvl"]);
  29080. s !== void 0 && (A = parseInt(s) + 1);
  29081. var l = Ju(e);
  29082. if (l) return os(os({}, l), {}, { lvl: A });
  29083. var n = Ju(U(I, ["a:lstStyle", "a:lvl".concat(A, "pPr")]));
  29084. if (n) return os(os({}, n), {}, { lvl: A });
  29085. var a = Ju(U(g, ["p:txBody", "a:lstStyle", "a:lvl".concat(A, "pPr")]));
  29086. if (a) return os(os({}, a), {}, { lvl: A });
  29087. var d = i && i.slideMasterTextStyles;
  29088. if (d) {
  29089. var o = function(h, b) {
  29090. return b ? h === "title" || h === "ctrTitle" ? "p:titleStyle" : h === "subTitle" ? b["p:titleStyle"] ? "p:titleStyle" : "p:bodyStyle" : h === "body" ? "p:bodyStyle" : "p:otherStyle" : null;
  29091. }(C, d);
  29092. if (o) {
  29093. var c = Ju(U(d, [o, "a:lvl".concat(A, "pPr")]));
  29094. if (c) return os(os({}, c), {}, { lvl: A });
  29095. var r = Ju(U(d, [o, "a:lvl1pPr"]));
  29096. if (r) return os(os({}, r), {}, { lvl: A });
  29097. }
  29098. }
  29099. return null;
  29100. }
  29101. function Ju(t) {
  29102. if (!t || t["a:buNone"]) return null;
  29103. if (t["a:buChar"]) return { kind: "char", tag: "ul", char: U(t, ["a:buChar", "attrs", "char"]) || "•", font: U(t, ["a:buFont", "attrs", "typeface"]) || "" };
  29104. if (t["a:buAutoNum"]) {
  29105. var I = t["a:buAutoNum"], g = U(I, ["attrs", "type"]) || "arabicPeriod", C = U(I, ["attrs", "startAt"]), i = C ? parseInt(C) : 1, e = U(t, ["a:buFont", "attrs", "typeface"]) || "";
  29106. return { kind: "autoNum", tag: "ol", numType: g, startAt: isNaN(i) ? 1 : i, font: e };
  29107. }
  29108. return null;
  29109. }
  29110. function Zbg(t) {
  29111. return t ? t.kind === "autoNum" ? "".concat(t.tag, ":").concat(t.kind, ":").concat(t.numType, ":").concat(t.startAt, ":").concat(t.lvl, ":").concat(t.font) : "".concat(t.tag, ":").concat(t.kind, ":").concat(t.char, ":").concat(t.lvl, ":").concat(t.font) : "";
  29112. }
  29113. function Gbg(t) {
  29114. var I = "display: inline-block; min-width: 1.4em; margin-right: 0.4em;";
  29115. return t.font && (I += "font-family: ".concat(t.font, ";")), I;
  29116. }
  29117. function wbg(t) {
  29118. var I = t.listInfo;
  29119. if (I.kind === "char") return pV(I.char);
  29120. var g = t.counter;
  29121. return t.counter += 1, pV(function(C, i) {
  29122. if (/circle/i.test(i)) return function(d) {
  29123. var o = parseInt(d);
  29124. return isNaN(o) || o <= 0 ? String(d) : o >= 1 && o <= 20 ? String.fromCharCode(o - 1 + 9312) : o >= 21 && o <= 35 ? String.fromCharCode(o - 21 + 12881) : o >= 36 && o <= 50 ? String.fromCharCode(o - 36 + 12977) : String(o);
  29125. }(C);
  29126. var e, A = String(i || "").toLowerCase(), s = A.includes("chs") || A.includes("cht"), l = i.includes("ParenBoth"), n = "";
  29127. if (l || (i.includes("ParenR") ? n = ")" : i.includes("Period") ? n = "." : i.includes("Comma") && (n = ",")), e = i.includes("alphaLc") ? Zq(C, !1) : i.includes("alphaUc") ? Zq(C, !0) : i.includes("romanLc") ? Gq(C, !1) : i.includes("romanUc") ? Gq(C, !0) : s ? function(d, o, c) {
  29128. var r = parseInt(d);
  29129. if (isNaN(r) || r <= 0) return String(d);
  29130. var h = c ? ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"] : ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"], b = c ? ["", "拾", "佰", "仟"] : ["", "十", "百", "千"], u = o ? ["", "萬", "億", "兆"] : ["", "万", "亿", "兆"], m = function(S) {
  29131. var z = S % 1e4;
  29132. if (z === 0) return "";
  29133. for (var v = [], K = [Math.floor(z / 1e3), Math.floor(z % 1e3 / 100), Math.floor(z % 100 / 10), z % 10], V = [b[3], b[2], b[1], b[0]], N = !1, B = 0; B < K.length; B++) {
  29134. var G = K[B], w = V[B], W = B === K.length - 1;
  29135. G !== 0 ? (N && (v.push(h[0]), N = !1), w === b[1] && G === 1 && v.length === 0 ? v.push(w) : v.push(h[G] + w)) : !W && v.length && K.slice(B + 1).some(function(y) {
  29136. return y !== 0;
  29137. }) && (N = !0);
  29138. }
  29139. return v.join("");
  29140. };
  29141. if (r < 1e4) return m(r);
  29142. for (var Z = [], p = r; p > 0; ) Z.push(p % 1e4), p = Math.floor(p / 1e4);
  29143. for (var Y = "", R = Z.length - 1; R >= 0; R--) {
  29144. var X = Z[R];
  29145. if (X !== 0) {
  29146. if (Y) {
  29147. var H = Y.endsWith(h[0]);
  29148. !H && X < 1e3 && (Y += h[0]), H && X >= 1e3 && (Y = Y.slice(0, -h[0].length));
  29149. }
  29150. Y += m(X) + (u[R] || "");
  29151. } else Y && !Y.endsWith(h[0]) && (Y += h[0]);
  29152. }
  29153. return (Y = Y.replace(/零+$/g, "")) || h[0];
  29154. }(C, A.includes("cht"), A.includes("db")) : String(C), l) return "(".concat(e, ")");
  29155. var a = s && n === "." ? "、" : n;
  29156. return "".concat(e).concat(a);
  29157. }(g, I.numType));
  29158. }
  29159. function Zq(t, I) {
  29160. for (var g = t, C = ""; g > 0; ) g -= 1, C = String.fromCharCode(g % 26 + 65) + C, g = Math.floor(g / 26);
  29161. return I ? C : C.toLowerCase();
  29162. }
  29163. function Gq(t, I) {
  29164. for (var g = "", C = Math.max(1, Math.min(3999, t)), i = 0, e = [[1e3, "M"], [900, "CM"], [500, "D"], [400, "CD"], [100, "C"], [90, "XC"], [50, "L"], [40, "XL"], [10, "X"], [9, "IX"], [5, "V"], [4, "IV"], [1, "I"]]; i < e.length; i++) for (var A = ubg(e[i], 2), s = A[0], l = A[1]; C >= s; ) g += l, C -= s;
  29165. return I ? g : g.toLowerCase();
  29166. }
  29167. function pbg(t, I, g, C, i, e, A) {
  29168. var s = Otg(t, I, g, C, i, e, A), l = s.styleText, n = s.text, a = s.hasLink, d = s.linkURL, o = n.replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;").replace(/\s/g, "&nbsp;");
  29169. return a ? '<span style="'.concat(l, '"><a href="').concat(d, '" target="_blank">').concat(o, "</a></span>") : '<span style="'.concat(l, '">').concat(o, "</span>");
  29170. }
  29171. function Otg(t, I, g, C, i, e, A) {
  29172. var s = g["a:lstStyle"], l = A.slideMasterTextStyles, n = 1, a = U(I["a:pPr"], ["attrs", "lvl"]);
  29173. a !== void 0 && (n = parseInt(a) + 1);
  29174. var d = t["a:t"];
  29175. typeof d != "string" && (d = U(t, ["a:fld", "a:t"])), typeof d != "string" && (d = "&nbsp;");
  29176. var o = U(t, ["attrs", "type"]) || U(t, ["a:fld", "attrs", "type"]), c = typeof o == "string" ? o.toLowerCase() : "";
  29177. if (c === "slidenum" && A && A.slideNo !== void 0 && A.slideNo !== null) d = String(A.slideNo);
  29178. else if (c.startsWith("datetime")) {
  29179. var r = typeof d == "string" ? d.replace(/\s+/g, " ").trim() : "";
  29180. if (!r || r === "日期" || r.toLowerCase() === "date") {
  29181. var h = /* @__PURE__ */ new Date(), b = String(h.getFullYear()), u = String(h.getMonth() + 1).padStart(2, "0"), m = String(h.getDate()).padStart(2, "0");
  29182. d = "".concat(b, "-").concat(u, "-").concat(m);
  29183. }
  29184. }
  29185. var Z = typeof d == "string" ? d.replace(/\s+/g, " ").trim() : "";
  29186. if (e !== "sldNum" || Z !== "<#>" && Z !== "#" || !A || A.slideNo === void 0 || A.slideNo === null) {
  29187. if (e === "dt" && (Z === "日期" || Z.toLowerCase() === "date")) {
  29188. var p = /* @__PURE__ */ new Date(), Y = String(p.getFullYear()), R = String(p.getMonth() + 1).padStart(2, "0"), X = String(p.getDate()).padStart(2, "0");
  29189. d = "".concat(Y, "-").concat(R, "-").concat(X);
  29190. }
  29191. } else d = String(A.slideNo);
  29192. var H = "", S = function(P, L, E, J, k, j) {
  29193. var q, Cg, Ig = U(P, ["a:rPr"]);
  29194. if (Ig && ((q = Hs(Ig)) === "SOLID_FILL" && (Cg = eC(Ig["a:solidFill"], void 0, void 0, j)), q === "GRADIENT_FILL")) return j9(Ig["a:gradFill"], j);
  29195. if (!Cg && U(E, ["a:lvl" + k + "pPr", "a:defRPr"])) {
  29196. var x = U(E, ["a:lvl" + k + "pPr", "a:defRPr"]);
  29197. (q = Hs(x)) === "SOLID_FILL" && (Cg = eC(x["a:solidFill"], void 0, void 0, j));
  29198. }
  29199. if (!Cg) {
  29200. var Ag = U(L, ["p:style", "a:fontRef"]);
  29201. Ag && (Cg = eC(Ag, void 0, void 0, j)), !Cg && J && (Cg = eC(J, void 0, void 0, j));
  29202. }
  29203. return Cg || "";
  29204. }(t, I, s, C, n, A), z = function(P, L, E, J, k, j, q) {
  29205. var Cg, Ig = 1;
  29206. if (q) {
  29207. var x = U(q, ["a:pPr", "attrs", "lvl"]);
  29208. x !== void 0 && (Ig = parseInt(x) + 1);
  29209. }
  29210. if (U(P, ["a:rPr", "attrs", "sz"]) && (Cg = U(P, ["a:rPr", "attrs", "sz"]) / 100), !isNaN(Cg) && Cg || !q || U(q, ["a:endParaRPr", "attrs", "sz"]) && (Cg = U(q, ["a:endParaRPr", "attrs", "sz"]) / 100), (isNaN(Cg) || !Cg) && j) {
  29211. var Ag = U(j, ["a:lstStyle"]);
  29212. if (Ag) {
  29213. var eg = U(Ag, ["a:lvl".concat(Ig, "pPr"), "a:defRPr", "attrs", "sz"]);
  29214. eg && (Cg = parseInt(eg) / 100);
  29215. }
  29216. }
  29217. if ((isNaN(Cg) || !Cg) && L) {
  29218. var O = U(L, ["p:txBody", "a:lstStyle", "a:lvl".concat(Ig, "pPr"), "a:defRPr", "attrs", "sz"]);
  29219. O && (Cg = parseInt(O) / 100);
  29220. }
  29221. if ((isNaN(Cg) || !Cg) && L) {
  29222. var _ = U(L, ["p:txBody", "a:lstStyle", "a:lvl1pPr", "a:defRPr", "attrs", "sz"]);
  29223. _ && (Cg = parseInt(_) / 100);
  29224. }
  29225. if ((isNaN(Cg) || !Cg) && q) {
  29226. var gg = U(q, ["a:pPr", "a:defRPr", "attrs", "sz"]);
  29227. gg && (Cg = parseInt(gg) / 100);
  29228. }
  29229. if (isNaN(Cg) || !Cg) if (E === "dt" || E === "sldNum") Cg = 12;
  29230. else {
  29231. var lg, ng = "a:lvl".concat(Ig, "pPr"), sg = function(cg) {
  29232. var rg = U(J, [cg, ng, "a:defRPr", "attrs", "sz"]);
  29233. if (rg) return parseInt(rg) / 100;
  29234. var dg = U(J, [cg, "a:lvl1pPr", "a:defRPr", "attrs", "sz"]);
  29235. return dg ? parseInt(dg) / 100 : null;
  29236. };
  29237. E === "title" || E === "ctrTitle" ? lg = sg("p:titleStyle") : E === "subTitle" ? (lg = sg("p:titleStyle")) === null && (lg = sg("p:bodyStyle")) : lg = sg(E === "body" ? "p:bodyStyle" : "p:otherStyle"), lg !== null && (Cg = lg);
  29238. }
  29239. if (isNaN(Cg) || !Cg) {
  29240. var og = U(k, ["a:lvl".concat(Ig, "pPr"), "a:defRPr", "attrs", "sz"]) || U(k, ["a:defPPr", "a:defRPr", "attrs", "sz"]);
  29241. og && (Cg = parseInt(og) / 100);
  29242. }
  29243. return (Cg = isNaN(Cg) || !Cg ? 18 : Cg) + "px";
  29244. }(t, i, e, l, A.defaultTextStyle, g, I), v = function(P, L, E) {
  29245. var J = U(P, ["a:t"]), k = typeof J == "string" && /[\u3040-\u30ff\u3400-\u9fff\uf900-\ufaff]/.test(J), j = (k ? U(P, ["a:rPr", "a:ea", "attrs", "typeface"]) : null) || U(P, ["a:rPr", "a:latin", "attrs", "typeface"]) || U(P, ["a:rPr", "a:ea", "attrs", "typeface"]) || U(P, ["a:rPr", "a:cs", "attrs", "typeface"]);
  29246. if (!j) {
  29247. var q, Cg = U(E.themeContent, ["a:theme", "a:themeElements", "a:fontScheme"]);
  29248. q = U(Cg, L === "title" || L === "subTitle" || L === "ctrTitle" ? ["a:majorFont"] : ["a:minorFont"]), j = (k ? U(q, ["a:ea", "attrs", "typeface"]) : null) || U(q, ["a:latin", "attrs", "typeface"]) || U(q, ["a:ea", "attrs", "typeface"]) || U(q, ["a:cs", "attrs", "typeface"]);
  29249. }
  29250. return j || "";
  29251. }(t, e, A), K = function(P) {
  29252. return U(P, ["a:rPr", "attrs", "b"]) === "1" ? "bold" : "";
  29253. }(t), V = function(P) {
  29254. return U(P, ["a:rPr", "attrs", "i"]) === "1" ? "italic" : "";
  29255. }(t), N = function(P) {
  29256. return U(P, ["a:rPr", "attrs", "u"]) === "sng" ? "underline" : "";
  29257. }(t), B = function(P) {
  29258. return U(P, ["a:rPr", "attrs", "strike"]) === "sngStrike" ? "line-through" : "";
  29259. }(t), G = function(P) {
  29260. var L = U(P, ["a:rPr", "attrs", "spc"]);
  29261. return L ? parseInt(L) / 100 + "pt" : "";
  29262. }(t), w = function(P, L) {
  29263. var E = U(P, ["a:rPr", "a:effectLst", "a:outerShdw"]);
  29264. if (E) {
  29265. var J = Qtg(E, L);
  29266. if (J) {
  29267. var k = J.h, j = J.v, q = J.blur, Cg = J.color;
  29268. if (!isNaN(j) && !isNaN(k)) return k + "pt " + j + "pt " + (q ? q + "pt" : "") + " " + Cg;
  29269. }
  29270. }
  29271. return "";
  29272. }(t, A), W = function(P) {
  29273. var L = U(P, ["a:rPr", "attrs", "baseline"]);
  29274. return L ? parseInt(L) > 0 ? "super" : "sub" : "";
  29275. }(t);
  29276. if (S) {
  29277. if (typeof S == "string") H += "color: ".concat(S, ";");
  29278. else if (S.colors) {
  29279. var y = S.colors, f = S.rot, D = y.map(function(P) {
  29280. return "".concat(P.color, " ").concat(P.pos);
  29281. }).join(", "), F = "linear-gradient(".concat(f + 90, "deg, ").concat(D, ")");
  29282. H += "background: ".concat(F, "; background-clip: text; color: transparent;");
  29283. }
  29284. }
  29285. z && (H += "font-size: ".concat(z, ";")), v && (H += "font-family: ".concat(v, ";")), K && (H += "font-weight: ".concat(K, ";")), V && (H += "font-style: ".concat(V, ";")), N && (H += "text-decoration: ".concat(N, ";")), B && (H += "text-decoration-line: ".concat(B, ";")), G && (H += "letter-spacing: ".concat(G, ";")), W && (H += "vertical-align: ".concat(W, ";")), w && (H += "text-shadow: ".concat(w, ";"));
  29286. var T = U(t, ["a:rPr", "a:hlinkClick", "attrs", "r:id"]), Q = T && A.slideResObj[T];
  29287. return { styleText: H, text: d, hasLink: Q, linkURL: Q ? A.slideResObj[T].target : null };
  29288. }
  29289. function Bbg(t, I, g, C, i, e, A) {
  29290. var s, l = i;
  29291. if (e >= i) for (; l <= e; ) {
  29292. var n = l * (Math.PI / 180), a = t + Math.cos(n) * g, d = I + Math.sin(n) * C;
  29293. l === i && (s = " M" + a + " " + d), s += " L" + a + " " + d, l++;
  29294. }
  29295. else for (; l > e; ) {
  29296. var o = l * (Math.PI / 180), c = t + Math.cos(o) * g, r = I + Math.sin(o) * C;
  29297. l === i && (s = " M " + c + " " + r), s += " L " + c + " " + r, l--;
  29298. }
  29299. return s += "";
  29300. }
  29301. function Wbg(t, I, g) {
  29302. var C = U(t, ["a:pathLst"]), i = U(C, ["a:path"]);
  29303. Array.isArray(i) && (i = i.shift());
  29304. var e = parseInt(i.attrs.w), A = parseInt(i.attrs.h), s = e === 0 ? 0 : 1 / e * I, l = A === 0 ? 0 : 1 / A * g, n = "", a = U(i, ["a:moveTo"]), d = i["a:lnTo"], o = i["a:cubicBezTo"], c = i["a:arcTo"], r = U(i, ["a:close"]);
  29305. Array.isArray(a) || (a = [a]);
  29306. var h = [];
  29307. if (a.length > 0) {
  29308. if (Object.keys(a).forEach(function(N) {
  29309. var B = a[N]["a:pt"];
  29310. B && Object.keys(B).forEach(function(G) {
  29311. var w = B[G], W = w.x, y = w.y, f = w.order;
  29312. h.push({ type: "movto", x: W, y, order: f });
  29313. });
  29314. }), d && (Array.isArray(d) || (d = [d]), Object.keys(d).forEach(function(N) {
  29315. var B = d[N]["a:pt"];
  29316. B && Object.keys(B).forEach(function(G) {
  29317. var w = B[G], W = w.x, y = w.y, f = w.order;
  29318. h.push({ type: "lnto", x: W, y, order: f });
  29319. });
  29320. })), o) {
  29321. var b = [];
  29322. Array.isArray(o) || (o = [o]), Object.keys(o).forEach(function(N) {
  29323. b.push(o[N]["a:pt"]);
  29324. }), b.forEach(function(N) {
  29325. var B = [];
  29326. N.forEach(function(w) {
  29327. var W = { x: w.attrs.x, y: w.attrs.y };
  29328. B.push(W);
  29329. });
  29330. var G = N[0].attrs.order;
  29331. h.push({ type: "cubicBezTo", cubBzPt: B, order: G });
  29332. });
  29333. }
  29334. if (c) {
  29335. var u = c.attrs, m = u.order, Z = u.hR, p = u.wR, Y = u.stAng, R = u.swAng, X = 0, H = 0, S = U(c, ["a:pt", "attrs"]);
  29336. S && (X = S.x, H = S.y), h.push({ type: "arcTo", hR: Z, wR: p, stAng: Y, swAng: R, shftX: X, shftY: H, order: m });
  29337. }
  29338. r && (Array.isArray(r) || (r = [r]), Object.keys(r).forEach(function() {
  29339. h.push({ type: "close", order: 1 / 0 });
  29340. })), h.sort(function(N, B) {
  29341. return N.order - B.order;
  29342. });
  29343. for (var z = 0; z < h.length; ) {
  29344. if (h[z].type === "movto") n += " M" + parseInt(h[z].x) * s + "," + parseInt(h[z].y) * l;
  29345. else if (h[z].type === "lnto")
  29346. n += " L" + parseInt(h[z].x) * s + "," + parseInt(h[z].y) * l;
  29347. else if (h[z].type === "cubicBezTo")
  29348. n += " C" + parseInt(h[z].cubBzPt[0].x) * s + "," + parseInt(h[z].cubBzPt[0].y) * l + " " + parseInt(h[z].cubBzPt[1].x) * s + "," + parseInt(h[z].cubBzPt[1].y) * l + " " + parseInt(h[z].cubBzPt[2].x) * s + "," + parseInt(h[z].cubBzPt[2].y) * l;
  29349. else if (h[z].type === "arcTo") {
  29350. var v = parseInt(h[z].hR) * s, K = parseInt(h[z].wR) * l, V = parseInt(h[z].stAng) / 6e4;
  29351. n += Bbg(K, v, K, v, V, V + parseInt(h[z].swAng) / 6e4);
  29352. } else h[z].type === "close" && (n += "z");
  29353. z++;
  29354. }
  29355. }
  29356. return n;
  29357. }
  29358. function ybg(t, I) {
  29359. var g = {};
  29360. if (t["a:bottom"]) {
  29361. var C = Fs({ "p:spPr": { "a:ln": t["a:bottom"]["a:ln"] } }, void 0, I);
  29362. g.bottom = C;
  29363. }
  29364. if (t["a:top"]) {
  29365. var i = Fs({ "p:spPr": { "a:ln": t["a:top"]["a:ln"] } }, void 0, I);
  29366. g.top = i;
  29367. }
  29368. if (t["a:right"]) {
  29369. var e = Fs({ "p:spPr": { "a:ln": t["a:right"]["a:ln"] } }, void 0, I);
  29370. g.right = e;
  29371. }
  29372. if (t["a:left"]) {
  29373. var A = Fs({ "p:spPr": { "a:ln": t["a:left"]["a:ln"] } }, void 0, I);
  29374. g.left = A;
  29375. }
  29376. return g;
  29377. }
  29378. function wq(t, I, g, C) {
  29379. return Utg.apply(this, arguments);
  29380. }
  29381. function Utg() {
  29382. return (Utg = SC(bI.mark(function t(I, g, C, i) {
  29383. var e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y;
  29384. return bI.wrap(function(R) {
  29385. for (; ; ) switch (R.prev = R.next) {
  29386. case 0:
  29387. if (e = U(I, ["attrs", "rowSpan"]), A = U(I, ["attrs", "gridSpan"]), s = U(I, ["attrs", "vMerge"]), l = U(I, ["attrs", "hMerge"]), !(o = U(I, ["a:tcPr"]))) {
  29388. R.next = 11;
  29389. break;
  29390. }
  29391. return c = { "p:spPr": o }, R.next = 9, jtg(c, void 0, !1, i, "slide");
  29392. case 9:
  29393. (r = R.sent) && r.type === "color" && r.value && (n = r.value);
  29394. case 11:
  29395. return n || (C && (h = U(g, [C, "a:tcStyle", "a:fill", "a:solidFill"])), h && (n = eC(h, void 0, void 0, i))), C && (b = U(g, [C, "a:tcTxStyle"])), b && (a = eC(b, void 0, void 0, i), U(b, ["attrs", "b"]) === "on" && (d = !0)), (u = U(I, ["a:tcPr", "a:lnB"])) || (C && (u = U(g[C], ["a:tcStyle", "a:tcBdr", "a:bottom", "a:ln"])), u || (u = U(g, ["a:wholeTbl", "a:tcStyle", "a:tcBdr", "a:bottom", "a:ln"]))), (m = U(I, ["a:tcPr", "a:lnT"])) || (C && (m = U(g[C], ["a:tcStyle", "a:tcBdr", "a:top", "a:ln"])), m || (m = U(g, ["a:wholeTbl", "a:tcStyle", "a:tcBdr", "a:top", "a:ln"]))), (Z = U(I, ["a:tcPr", "a:lnL"])) || (C && (Z = U(g[C], ["a:tcStyle", "a:tcBdr", "a:left", "a:ln"])), Z || (Z = U(g, ["a:wholeTbl", "a:tcStyle", "a:tcBdr", "a:left", "a:ln"]))), (p = U(I, ["a:tcPr", "a:lnR"])) || (C && (p = U(g[C], ["a:tcStyle", "a:tcBdr", "a:right", "a:ln"])), p || (p = U(g, ["a:wholeTbl", "a:tcStyle", "a:tcBdr", "a:right", "a:ln"]))), Y = {}, u && (Y.bottom = Fs(u, void 0, i)), m && (Y.top = Fs(m, void 0, i)), Z && (Y.left = Fs(Z, void 0, i)), p && (Y.right = Fs(p, void 0, i)), R.abrupt("return", { fillColor: n, fontColor: a, fontBold: d, borders: Y, rowSpan: e ? +e : void 0, colSpan: A ? +A : void 0, vMerge: s ? +s : void 0, hMerge: l ? +l : void 0 });
  29396. case 28:
  29397. case "end":
  29398. return R.stop();
  29399. }
  29400. }, t);
  29401. }))).apply(this, arguments);
  29402. }
  29403. function Ybg(t, I, g, C, i) {
  29404. var e, A, s;
  29405. if (C && C["a:wholeTbl"]) {
  29406. var l = U(C, ["a:wholeTbl", "a:tcStyle", "a:fill", "a:solidFill"]);
  29407. if (l) {
  29408. var n = eC(l, void 0, void 0, i);
  29409. n && (e = n);
  29410. }
  29411. var a = U(C, ["a:wholeTbl", "a:tcTxStyle"]);
  29412. if (a) {
  29413. var d = eC(a, void 0, void 0, i);
  29414. d && (A = d), U(a, ["attrs", "b"]) === "on" && (s = !0);
  29415. }
  29416. }
  29417. if (I === 0 && g.isFrstRowAttr === 1 && C) {
  29418. var o = U(C, ["a:firstRow", "a:tcStyle", "a:fill", "a:solidFill"]);
  29419. if (o) {
  29420. var c = eC(o, void 0, void 0, i);
  29421. c && (e = c);
  29422. }
  29423. var r = U(C, ["a:firstRow", "a:tcTxStyle"]);
  29424. if (r) {
  29425. var h = eC(r, void 0, void 0, i);
  29426. h && (A = h), U(r, ["attrs", "b"]) === "on" && (s = !0);
  29427. }
  29428. } else if (I > 0 && g.isBandRowAttr === 1 && C) {
  29429. if (e = "", I % 2 == 0 && C["a:band2H"]) {
  29430. var b = U(C, ["a:band2H", "a:tcStyle", "a:fill", "a:solidFill"]);
  29431. if (b) {
  29432. var u = eC(b, void 0, void 0, i);
  29433. u && (e = u);
  29434. }
  29435. var m = U(C, ["a:band2H", "a:tcTxStyle"]);
  29436. if (m) {
  29437. var Z = eC(m, void 0, void 0, i);
  29438. Z && (A = Z);
  29439. }
  29440. U(m, ["attrs", "b"]) === "on" && (s = !0);
  29441. }
  29442. if (I % 2 != 0 && C["a:band1H"]) {
  29443. var p = U(C, ["a:band1H", "a:tcStyle", "a:fill", "a:solidFill"]);
  29444. if (p) {
  29445. var Y = eC(p, void 0, void 0, i);
  29446. Y && (e = Y);
  29447. }
  29448. var R = U(C, ["a:band1H", "a:tcTxStyle"]);
  29449. if (R) {
  29450. var X = eC(R, void 0, void 0, i);
  29451. X && (A = X), U(R, ["attrs", "b"]) === "on" && (s = !0);
  29452. }
  29453. }
  29454. }
  29455. if (I === t.length - 1 && g.isLstRowAttr === 1 && C) {
  29456. var H = U(C, ["a:lastRow", "a:tcStyle", "a:fill", "a:solidFill"]);
  29457. if (H) {
  29458. var S = eC(H, void 0, void 0, i);
  29459. S && (e = S);
  29460. }
  29461. var z = U(C, ["a:lastRow", "a:tcTxStyle"]);
  29462. if (z) {
  29463. var v = eC(z, void 0, void 0, i);
  29464. v && (A = v), U(z, ["attrs", "b"]) === "on" && (s = !0);
  29465. }
  29466. }
  29467. return { fillColor: e, fontColor: A, fontBold: s };
  29468. }
  29469. function Etg(t) {
  29470. var I = [];
  29471. return _a(t) !== "object" || (t["m:oMath"] && (I = I.concat(t["m:oMath"])), Object.values(t).forEach(function(g) {
  29472. (Array.isArray(g) || _a(g) === "object") && (I = I.concat(Etg(g)));
  29473. })), I;
  29474. }
  29475. function pq(t, I) {
  29476. var g = HC(t["m:e"]), C = HC(t["m:lim"]);
  29477. return I === "low" ? "".concat(g, "_{").concat(C, "}") : "".concat(g, "^{").concat(C, "}");
  29478. }
  29479. function HC(t) {
  29480. if (!t) return "";
  29481. if (Array.isArray(t)) return t.map(function(A) {
  29482. return HC(A);
  29483. }).join("");
  29484. for (var I = [], g = Object.keys(t), C = function() {
  29485. var A = e[i];
  29486. Array.isArray(t[A]) ? I.push.apply(I, R9(t[A].map(function(s) {
  29487. return { key: A, value: s };
  29488. }))) : I.push({ key: A, value: t[A] });
  29489. }, i = 0, e = g; i < e.length; i++) C();
  29490. return I.sort(function(A, s) {
  29491. var l = 0;
  29492. A.key === "m:r" && A.value && A.value["a:rPr"] ? l = A.value["a:rPr"].attrs.order : A.value["".concat(A.key, "Pr")] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"]["a:rPr"] && (l = A.value["".concat(A.key, "Pr")] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"]["a:rPr"] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"]["a:rPr"].attrs.order);
  29493. var n = 0;
  29494. return s.key === "m:r" && s.value && s.value["a:rPr"] ? n = s.value["a:rPr"].attrs.order : s.value["".concat(s.key, "Pr")] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"]["a:rPr"] && (n = s.value["".concat(s.key, "Pr")] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"]["a:rPr"] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"]["a:rPr"].attrs.order), l - n;
  29495. }), I.map(function(A) {
  29496. var s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H = A.key, S = A.value;
  29497. return H === "m:f" ? (l = HC((s = S)["m:num"]), n = HC(s["m:den"]), "\\frac{".concat(l, "}{").concat(n, "}")) : H === "m:sSup" ? (d = HC((a = S)["m:e"]), o = HC(a["m:sup"]), "".concat(d, "^{").concat(o, "}")) : H === "m:sSub" ? function(z) {
  29498. var v = HC(z["m:e"]), K = HC(z["m:sub"]);
  29499. return "".concat(v, "_{").concat(K, "}");
  29500. }(S) : H === "m:rad" ? (r = HC((c = S)["m:deg"]), h = HC(c["m:e"]), r ? "\\sqrt[".concat(r, "]{").concat(h, "}") : "\\sqrt{".concat(h, "}")) : H === "m:nary" ? function(z) {
  29501. var v = U(z, ["m:naryPr", "m:chr", "attrs", "m:val"]) || "∫", K = HC(z["m:sub"]), V = HC(z["m:sup"]), N = HC(z["m:e"]);
  29502. return "".concat(v, "_{").concat(K, "}^{").concat(V, "}{").concat(N, "}");
  29503. }(S) : H === "m:limLow" ? pq(S, "low") : H === "m:limUpp" ? pq(S, "upp") : H === "m:d" ? function(z) {
  29504. var v = U(z, ["m:dPr", "m:begChr", "attrs", "m:val"]), K = U(z, ["m:dPr", "m:endChr", "attrs", "m:val"]);
  29505. v || K || (v = "(", K = ")"), v && K && (v = "\\left".concat(v), K = "\\right".concat(K));
  29506. var V = HC(z["m:e"]);
  29507. return "".concat(v).concat(V).concat(K);
  29508. }(S) : H === "m:func" ? (u = HC((b = S)["m:fName"]), m = HC(b["m:e"]), "\\".concat(u, "{").concat(m, "}")) : H === "m:groupChr" ? (p = U(Z = S, ["m:groupChrPr", "m:chr", "attrs", "m:val"]), Y = HC(Z["m:e"]), "".concat(p).concat(Y).concat(p)) : H === "m:eqArr" ? (R = S["m:e"].map(function(z) {
  29509. return HC(z);
  29510. }).join(" \\\\ "), "\\begin{cases} ".concat(R, " \\end{cases}")) : H === "m:bar" ? function(z) {
  29511. var v = HC(z["m:e"]);
  29512. return U(z, ["m:barPr", "m:pos", "attrs", "m:val"]) === "top" ? "\\overline{".concat(v, "}") : "\\underline{".concat(v, "}");
  29513. }(S) : H === "m:acc" ? function(z) {
  29514. var v = U(z, ["m:accPr", "m:chr", "attrs", "m:val"]) || "^", K = HC(z["m:e"]);
  29515. switch (v) {
  29516. case "́":
  29517. return "\\acute{".concat(K, "}");
  29518. case "̀":
  29519. return "\\grave{".concat(K, "}");
  29520. case "̂":
  29521. return "\\hat{".concat(K, "}");
  29522. case "̃":
  29523. return "\\tilde{".concat(K, "}");
  29524. case "̄":
  29525. return "\\bar{".concat(K, "}");
  29526. case "̆":
  29527. return "\\breve{".concat(K, "}");
  29528. case "̇":
  29529. return "\\dot{".concat(K, "}");
  29530. case "̈":
  29531. return "\\ddot{".concat(K, "}");
  29532. case "̊":
  29533. return "\\mathring{".concat(K, "}");
  29534. case "̋":
  29535. return "\\H{".concat(K, "}");
  29536. case "̌":
  29537. return "\\check{".concat(K, "}");
  29538. case "̧":
  29539. return "\\c{".concat(K, "}");
  29540. default:
  29541. return "\\".concat(v, "{").concat(K, "}");
  29542. }
  29543. }(S) : H === "m:borderBox" ? function(z) {
  29544. var v = HC(z["m:e"]);
  29545. return "\\boxed{".concat(v, "}");
  29546. }(S) : H === "m:m" ? (X = S["m:mr"].map(function(z) {
  29547. return z["m:e"].map(function(v) {
  29548. return HC(v);
  29549. }).join(" & ");
  29550. }), "\\begin{matrix} ".concat(X.join(" \\\\ "), " \\end{matrix}")) : H === "m:r" ? HC(S) : H === "m:t" ? S : "";
  29551. }).join("");
  29552. }
  29553. function Nbg(t) {
  29554. return t.replaceAll(/&lt;/g, "<").replaceAll(/&gt;/g, ">").replaceAll(/&amp;/g, "&").replaceAll(/&apos;/g, "'").replaceAll(/&quot;/g, '"');
  29555. }
  29556. function HI(t, I) {
  29557. var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
  29558. if (!g) {
  29559. if (Array.isArray(t) || (g = function(l, n) {
  29560. if (l) {
  29561. if (typeof l == "string") return Bq(l, n);
  29562. var a = Object.prototype.toString.call(l).slice(8, -1);
  29563. if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
  29564. if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return Bq(l, n);
  29565. }
  29566. }(t)) || I) {
  29567. g && (t = g);
  29568. var C = 0, i = function() {
  29569. };
  29570. return { s: i, n: function() {
  29571. return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
  29572. }, e: function(l) {
  29573. throw l;
  29574. }, f: i };
  29575. }
  29576. throw new TypeError(`Invalid attempt to iterate non-iterable instance.
  29577. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
  29578. }
  29579. var e, A = !0, s = !1;
  29580. return { s: function() {
  29581. g = g.call(t);
  29582. }, n: function() {
  29583. var l = g.next();
  29584. return A = l.done, l;
  29585. }, e: function(l) {
  29586. s = !0, e = l;
  29587. }, f: function() {
  29588. try {
  29589. A || g.return == null || g.return();
  29590. } finally {
  29591. if (s) throw e;
  29592. }
  29593. } };
  29594. }
  29595. function Bq(t, I) {
  29596. (I == null || I > t.length) && (I = t.length);
  29597. for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
  29598. return C;
  29599. }
  29600. function Wq(t, I, g, C, i) {
  29601. return { x: t + Math.cos(i) * g, y: I + Math.sin(i) * C };
  29602. }
  29603. function yq(t, I, g, C, i, e, A) {
  29604. var s = Wq(t, I, g, C, i), l = Wq(t, I, g, C, e), n = l, a = s, d = i - e, o = Math.abs(d) > Math.PI ? 1 : 0, c = d >= 0 ? 1 : 0;
  29605. return "M ".concat(n.x, ",").concat(n.y, " A ").concat(g, ",").concat(C, " 0 ").concat(o, ",").concat(c, " ").concat(a.x, ",").concat(a.y, " Z");
  29606. }
  29607. function Vg(t, I, g, C, i, e, A) {
  29608. for (var s, l = "", n = e >= i ? 1 : -1, a = i; s = a, n > 0 ? s <= e : s >= e; ) {
  29609. var d = a * (Math.PI / 180), o = t + Math.cos(d) * g, c = I + Math.sin(d) * C;
  29610. a === i && (l = " M".concat(o, " ").concat(c)), l += " L".concat(o, " ").concat(c), a += n;
  29611. }
  29612. return A && (l += " z"), l;
  29613. }
  29614. function Vbg(t, I, g, C) {
  29615. var i = "";
  29616. switch (t) {
  29617. case "rect":
  29618. case "actionButtonBlank":
  29619. case "leftRightCircularArrow":
  29620. case "chartPlus":
  29621. case "chartStar":
  29622. case "chartX":
  29623. case "cornerTabs":
  29624. case "flowChartOfflineStorage":
  29625. case "folderCorner":
  29626. case "funnel":
  29627. case "lineInv":
  29628. case "nonIsoscelesTrapezoid":
  29629. case "plaqueTabs":
  29630. case "squareTabs":
  29631. case "upDownArrowCallout":
  29632. default:
  29633. i = "M 0 0 L ".concat(I, " 0 L ").concat(I, " ").concat(g, " L 0 ").concat(g, " Z");
  29634. break;
  29635. case "flowChartPredefinedProcess":
  29636. i = "M 0 0 L ".concat(I, " 0 L ").concat(I, " ").concat(g, " L 0 ").concat(g, " Z M ").concat(I * (1 / 8), " 0 L ").concat(I * (1 / 8), " ").concat(g, " M ").concat(I * (7 / 8), " 0 L ").concat(I * (7 / 8), " ").concat(g);
  29637. break;
  29638. case "flowChartInternalStorage":
  29639. i = "M 0 0 L ".concat(I, " 0 L ").concat(I, " ").concat(g, " L 0 ").concat(g, " Z M ").concat(I * (1 / 8), " 0 L ").concat(I * (1 / 8), " ").concat(g, " M 0 ").concat(g * (1 / 8), " L ").concat(I, " ").concat(g * (1 / 8));
  29640. break;
  29641. case "flowChartCollate":
  29642. i = "M 0,0 L ".concat(I, ",0 L 0,").concat(g, " L ").concat(I, ",").concat(g, " z");
  29643. break;
  29644. case "flowChartDocument":
  29645. var e = 10800 * I / 21600, A = 17322 * g / 21600, s = 20172 * g / 21600, l = 23922 * g / 21600;
  29646. i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(A, " C ").concat(e, ",").concat(A, " ").concat(e, ",").concat(l, " 0,").concat(s, " z");
  29647. break;
  29648. case "flowChartMultidocument":
  29649. var n = 18022 * g / 21600, a = 3675 * g / 21600, d = 23542 * g / 21600, o = 1815 * g / 21600, c = 16252 * g / 21600, r = 16352 * g / 21600, h = 14392 * g / 21600, b = 20782 * g / 21600, u = 14467 * g / 21600, m = 1532 * I / 21600, Z = 2e4 * I / 21600, p = 9298 * I / 21600, Y = 19298 * I / 21600, R = 18595 * I / 21600, X = 2972 * I / 21600, H = 20800 * I / 21600;
  29650. i = "M 0,".concat(a, " L ").concat(R, ",").concat(a, " L ").concat(R, ",").concat(n, " C ").concat(p, ",").concat(n, " ").concat(p, ",").concat(d, " 0,").concat(b, " z M ").concat(m, ",").concat(a, " L ").concat(m, ",").concat(o, " L ").concat(Z, ",").concat(o, " L ").concat(Z, ",").concat(c, " C ").concat(Y, ",").concat(c, " ").concat(R, ",").concat(r, " ").concat(R, ",").concat(r, " M ").concat(X, ",").concat(o, " L ").concat(X, ",0 L ").concat(I, ",0 L ").concat(I, ",").concat(h, " C ").concat(H, ",").concat(h, " ").concat(Z, ",").concat(u, " ").concat(Z, ",").concat(u);
  29651. break;
  29652. case "actionButtonBackPrevious":
  29653. var S = I / 2, z = g / 2, v = 3 * Math.min(I, g) / 8, K = z - v, V = z + v, N = S - v, B = S + v;
  29654. i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(N, ",").concat(z, " L ").concat(B, ",").concat(K, " L ").concat(B, ",").concat(V, " z");
  29655. break;
  29656. case "actionButtonBeginning":
  29657. var G = I / 2, w = g / 2, W = Math.min(I, g), y = 3 * W / 8, f = w - y, D = w + y, F = G - y, T = G + y, Q = 3 * W / 4, P = F + Q / 8, L = F + Q / 4;
  29658. i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(L, ",").concat(w, " L ").concat(T, ",").concat(f, " L ").concat(T, ",").concat(D, " z M ").concat(P, ",").concat(f, " L ").concat(F, ",").concat(f, " L ").concat(F, ",").concat(D, " L ").concat(P, ",").concat(D, " z");
  29659. break;
  29660. case "actionButtonDocument":
  29661. var E = I / 2, J = g / 2, k = Math.min(I, g), j = 3 * k / 8, q = J - j, Cg = J + j, Ig = 9 * k / 32, x = E - Ig, Ag = E + Ig, eg = 3 * k / 16, O = Ag - eg, _ = q + eg;
  29662. i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(x, ",").concat(q, " L ").concat(O, ",").concat(q, " L ").concat(Ag, ",").concat(_, " L ").concat(Ag, ",").concat(Cg, " L ").concat(x, ",").concat(Cg, " z M ").concat(O, ",").concat(q, " L ").concat(O, ",").concat(_, " L ").concat(Ag, ",").concat(_, " z");
  29663. break;
  29664. case "actionButtonEnd":
  29665. var gg = I / 2, lg = g / 2, ng = Math.min(I, g), sg = 3 * ng / 8, og = lg - sg, cg = lg + sg, rg = gg - sg, dg = gg + sg, Bg = 3 * ng / 4, Zg = rg + 3 * Bg / 4, Xg = rg + 7 * Bg / 8;
  29666. i = "M 0,".concat(g, " L ").concat(I, ",").concat(g, " L ").concat(I, ",0 L 0,0 z M ").concat(Xg, ",").concat(og, " L ").concat(dg, ",").concat(og, " L ").concat(dg, ",").concat(cg, " L ").concat(Xg, ",").concat(cg, " z M ").concat(Zg, ",").concat(lg, " L ").concat(rg, ",").concat(og, " L ").concat(rg, ",").concat(cg, " z");
  29667. break;
  29668. case "actionButtonForwardNext":
  29669. var Kg = I / 2, kg = g / 2, Wg = 3 * Math.min(I, g) / 8, Ng = kg - Wg, wg = kg + Wg, fg = Kg - Wg, Jg = Kg + Wg;
  29670. i = "M 0,".concat(g, " L ").concat(I, ",").concat(g, " L ").concat(I, ",0 L 0,0 z M ").concat(Jg, ",").concat(kg, " L ").concat(fg, ",").concat(Ng, " L ").concat(fg, ",").concat(wg, " z");
  29671. break;
  29672. case "actionButtonHelp":
  29673. var zg = I / 2, cI = g / 2, YI = Math.min(I, g), Eg = 3 * YI / 8, aI = cI - Eg, dI = zg - Eg, _g = 3 * YI / 4, xI = _g / 7, SI = 3 * _g / 14, eI = 2 * _g / 7, NI = aI + eI, EI = aI + 17 * _g / 28, oI = aI + 21 * _g / 28, LI = aI + 11 * _g / 14, pg = dI + SI, uI = dI + 3 * _g / 7, hg = dI + 4 * _g / 7, bg = _g / 14, Rg = 3 * _g / 28, Tg = pg + eI, rI = uI + xI, jg = LI + Rg, GI = (hg + uI + eI) / 2;
  29674. i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(pg, ",").concat(NI, " ").concat(Vg(Tg, NI, eI, eI, 180, 360, !1).replace("M", "L"), " ").concat(Vg(GI, NI, xI, SI, 0, 90, !1).replace("M", "L"), " ").concat(Vg(GI, EI, bg, Rg, 270, 180, !1).replace("M", "L"), " L ").concat(hg, ",").concat(oI, " L ").concat(uI, ",").concat(oI, " L ").concat(uI, ",").concat(EI, " ").concat(Vg(rI, EI, xI, SI, 180, 270, !1).replace("M", "L"), " ").concat(Vg(hg, NI, bg, Rg, 90, 0, !1).replace("M", "L"), " ").concat(Vg(Tg, NI, xI, xI, 0, -180, !1).replace("M", "L"), " z M ").concat(zg, ",").concat(LI, " ").concat(Vg(zg, jg, Rg, Rg, 270, 630, !1).replace("M", "L"), " z");
  29675. break;
  29676. case "actionButtonHome":
  29677. var nI = I / 2, CI = g / 2, WI = Math.min(I, g), mI = 3 * WI / 8, VI = CI - mI, yC = CI + mI, gC = nI - mI, It = nI + mI, dC = 3 * WI / 4, Tt = VI + dC / 16, ag = VI + 3 * dC / 16, mg = VI + 5 * dC / 16, Sg = VI + 3 * dC / 4, Fg = gC + dC / 8, tI = gC + 7 * dC / 16, vg = gC + 9 * dC / 16, xg = gC + 11 * dC / 16, vI = gC + 13 * dC / 16, fI = gC + 7 * dC / 8;
  29678. i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(nI, ",").concat(VI, " L ").concat(gC, ",").concat(CI, " L ").concat(Fg, ",").concat(CI, " L ").concat(Fg, ",").concat(yC, " L ").concat(fI, ",").concat(yC, " L ").concat(fI, ",").concat(CI, " L ").concat(It, ",").concat(CI, " L ").concat(vI, ",").concat(mg, " L ").concat(vI, ",").concat(Tt, " L ").concat(xg, ",").concat(Tt, " L ").concat(xg, ",").concat(ag, " z M ").concat(tI, ",").concat(Sg, " L ").concat(vg, ",").concat(Sg, " L ").concat(vg, ",").concat(yC, " L ").concat(tI, ",").concat(yC, " z");
  29679. break;
  29680. case "actionButtonInformation":
  29681. var MI = I / 2, hI = g / 2, AC = Math.min(I, g), PI = 3 * AC / 8, jI = hI - PI, mC = MI - PI, ZC = 3 * AC / 4, Vt = 5 * ZC / 16, Si = jI + ZC / 32, LA = jI + Vt, vs = jI + 3 * ZC / 8, AA = jI + 13 * ZC / 16, Ts = jI + 7 * ZC / 8, IC = mC + Vt, QI = mC + 13 * ZC / 32, sA = mC + 19 * ZC / 32, vA = mC + 11 * ZC / 16, An = 3 * ZC / 32, Bi = jI + PI, lA = Si + An;
  29682. i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(MI, ",").concat(jI, " ").concat(Vg(MI, Bi, PI, PI, 270, 630, !1).replace("M", "L"), " z M ").concat(MI, ",").concat(Si, " ").concat(Vg(MI, lA, An, An, 270, 630, !1).replace("M", "L"), " M ").concat(IC, ",").concat(LA, " L ").concat(sA, ",").concat(LA, " L ").concat(sA, ",").concat(AA, " L ").concat(vA, ",").concat(AA, " L ").concat(vA, ",").concat(Ts, " L ").concat(IC, ",").concat(Ts, " L ").concat(IC, ",").concat(AA, " L ").concat(QI, ",").concat(AA, " L ").concat(QI, ",").concat(vs, " L ").concat(IC, ",").concat(vs, " z");
  29683. break;
  29684. case "actionButtonMovie":
  29685. var nA = I / 2, Io = g / 2, xs = Math.min(I, g), xt = nA - 3 * xs / 8, Mt = Io - 3 * xs / 8, S0 = nA + 3 * xs / 8, _C = 3 * xs / 4, Gd = xt + 1455 * _C / 21600, Co = xt + 1905 * _C / 21600, to = xt + 2325 * _C / 21600, pG = xt + 16155 * _C / 21600, js = xt + 17010 * _C / 21600, wd = xt + 19335 * _C / 21600, Vig = xt + 19725 * _C / 21600, s1 = xt + 20595 * _C / 21600, l1 = Mt + 5280 * _C / 21600, n1 = Mt + 5730 * _C / 21600, uM = Mt + 6630 * _C / 21600, a1 = Mt + 7492 * _C / 21600, o1 = Mt + 9067 * _C / 21600, c1 = Mt + 9555 * _C / 21600, d1 = Mt + 13342 * _C / 21600, r1 = Mt + 14580 * _C / 21600, h1 = Mt + 15592 * _C / 21600;
  29686. i = "M 0,".concat(g, " L ").concat(I, ",").concat(g, " L ").concat(I, ",0 L 0,0 z M ").concat(xt, ",").concat(l1, " L ").concat(xt, ",").concat(c1, " L ").concat(Gd, ",").concat(c1, " L ").concat(Co, ",").concat(o1, " L ").concat(to, ",").concat(o1, " L ").concat(to, ",").concat(h1, " L ").concat(js, ",").concat(h1, " L ").concat(js, ",").concat(d1, " L ").concat(wd, ",").concat(d1, " L ").concat(s1, ",").concat(r1, " L ").concat(S0, ",").concat(r1, " L ").concat(S0, ",").concat(uM, " L ").concat(s1, ",").concat(uM, " L ").concat(Vig, ",").concat(a1, " L ").concat(js, ",").concat(a1, " L ").concat(js, ",").concat(uM, " L ").concat(pG, ",").concat(n1, " L ").concat(Co, ",").concat(n1, " L ").concat(Gd, ",").concat(l1, " z");
  29687. break;
  29688. case "actionButtonReturn":
  29689. var D0 = I / 2, b1 = g / 2, u1 = Math.min(I, g), BG = 3 * u1 / 8, WG = b1 - BG, m1 = b1 + BG, sn = D0 - BG, Mig = D0 + BG, pd = 3 * u1 / 4, Z1 = 3 * pd / 4, G1 = 5 * pd / 8, io = 3 * pd / 8, w1 = pd / 4, p1 = WG + Z1, yG = WG + G1, Bd = WG + w1, Rig = sn + 7 * pd / 8, fig = sn + Z1, mM = sn + G1, B1 = sn + io, Hig = sn + w1, Wd = pd / 8, Xig = mM - Wd, Sig = p1 - Wd, Dig = sn + io, Kig = m1 - io;
  29690. i = "M 0,".concat(g, " L ").concat(I, ",").concat(g, " L ").concat(I, ",0 L 0,0 z M ").concat(Mig, ",").concat(Bd, " L ").concat(fig, ",").concat(WG, " L ").concat(D0, ",").concat(Bd, " L ").concat(mM, ",").concat(Bd, " L ").concat(mM, ",").concat(yG, " ").concat(Vg(Xig, yG, Wd, Wd, 0, 90, !1).replace("M", "L"), " L ").concat(B1, ",").concat(p1, " ").concat(Vg(B1, Sig, Wd, Wd, 90, 180, !1).replace("M", "L"), " L ").concat(Hig, ",").concat(Bd, " L ").concat(sn, ",").concat(Bd, " L ").concat(sn, ",").concat(yG, " ").concat(Vg(Dig, yG, io, io, 180, 90, !1).replace("M", "L"), " L ").concat(D0, ",").concat(m1, " ").concat(Vg(D0, Kig, io, io, 90, 0, !1).replace("M", "L"), " L ").concat(Rig, ",").concat(Bd, " z");
  29691. break;
  29692. case "actionButtonSound":
  29693. var W1 = I / 2, YG = g / 2, y1 = Math.min(I, g), NG = 3 * y1 / 8, K0 = YG - NG, Fig = YG + NG, F0 = W1 - NG, ZM = W1 + NG, yd = 3 * y1 / 4, Y1 = 5 * yd / 16, kig = K0 + yd / 8, GM = K0 + Y1, wM = K0 + 11 * yd / 16, zig = K0 + 7 * yd / 8, N1 = F0 + Y1, V1 = F0 + 5 * yd / 8, pM = F0 + 3 * yd / 4;
  29694. i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(F0, ",").concat(GM, " L ").concat(N1, ",").concat(GM, " L ").concat(V1, ",").concat(K0, " L ").concat(V1, ",").concat(Fig, " L ").concat(N1, ",").concat(wM, " L ").concat(F0, ",").concat(wM, " z M ").concat(pM, ",").concat(GM, " L ").concat(ZM, ",").concat(kig, " M ").concat(pM, ",").concat(YG, " L ").concat(ZM, ",").concat(YG, " M ").concat(pM, ",").concat(wM, " L ").concat(ZM, ",").concat(zig);
  29695. break;
  29696. case "irregularSeal1":
  29697. i = "M ".concat(10800 * I / 21600, ",").concat(5800 * g / 21600, " L ").concat(14522 * I / 21600, ",0 L ").concat(14155 * I / 21600, ",").concat(5325 * g / 21600, " L ").concat(18380 * I / 21600, ",").concat(4457 * g / 21600, " L ").concat(16702 * I / 21600, ",").concat(7315 * g / 21600, " L ").concat(21097 * I / 21600, ",").concat(8137 * g / 21600, " L ").concat(17607 * I / 21600, ",").concat(10475 * g / 21600, " L ").concat(I, ",").concat(13290 * g / 21600, " L ").concat(16837 * I / 21600, ",").concat(12942 * g / 21600, " L ").concat(18145 * I / 21600, ",").concat(18095 * g / 21600, " L ").concat(14020 * I / 21600, ",").concat(14457 * g / 21600, " L ").concat(13247 * I / 21600, ",").concat(19737 * g / 21600, " L ").concat(10532 * I / 21600, ",").concat(14935 * g / 21600, " L ").concat(8485 * I / 21600, ",").concat(g, " L ").concat(7715 * I / 21600, ",").concat(15627 * g / 21600, " L ").concat(4762 * I / 21600, ",").concat(17617 * g / 21600, " L ").concat(5667 * I / 21600, ",").concat(13937 * g / 21600, " L ").concat(135 * I / 21600, ",").concat(14587 * g / 21600, " L ").concat(3722 * I / 21600, ",").concat(11775 * g / 21600, " L 0,").concat(8615 * g / 21600, " L ").concat(4627 * I / 21600, ",").concat(7617 * g / 21600, " L ").concat(370 * I / 21600, ",").concat(2295 * g / 21600, " L ").concat(7312 * I / 21600, ",").concat(6320 * g / 21600, " L ").concat(8352 * I / 21600, ",").concat(2295 * g / 21600, " z");
  29698. break;
  29699. case "irregularSeal2":
  29700. i = "M ".concat(11462 * I / 21600, ",").concat(4342 * g / 21600, " L ").concat(14790 * I / 21600, ",0 L ").concat(14525 * I / 21600, ",").concat(5777 * g / 21600, " L ").concat(18007 * I / 21600, ",").concat(3172 * g / 21600, " L ").concat(16380 * I / 21600, ",").concat(6532 * g / 21600, " L ").concat(I, ",").concat(6645 * g / 21600, " L ").concat(16985 * I / 21600, ",").concat(9402 * g / 21600, " L ").concat(18270 * I / 21600, ",").concat(11290 * g / 21600, " L ").concat(16380 * I / 21600, ",").concat(12310 * g / 21600, " L ").concat(18877 * I / 21600, ",").concat(15632 * g / 21600, " L ").concat(14640 * I / 21600, ",").concat(14350 * g / 21600, " L ").concat(14942 * I / 21600, ",").concat(17370 * g / 21600, " L ").concat(12180 * I / 21600, ",").concat(15935 * g / 21600, " L ").concat(11612 * I / 21600, ",").concat(18842 * g / 21600, " L ").concat(9872 * I / 21600, ",").concat(17370 * g / 21600, " L ").concat(8700 * I / 21600, ",").concat(19712 * g / 21600, " L ").concat(7527 * I / 21600, ",").concat(18125 * g / 21600, " L ").concat(4917 * I / 21600, ",").concat(g, " L ").concat(4805 * I / 21600, ",").concat(18240 * g / 21600, " L ").concat(1285 * I / 21600, ",").concat(17825 * g / 21600, " L ").concat(3330 * I / 21600, ",").concat(15370 * g / 21600, " L 0,").concat(12877 * g / 21600, " L ").concat(3935 * I / 21600, ",").concat(11592 * g / 21600, " L ").concat(1172 * I / 21600, ",").concat(8270 * g / 21600, " L ").concat(5372 * I / 21600, ",").concat(7817 * g / 21600, " L ").concat(4502 * I / 21600, ",").concat(3625 * g / 21600, " L ").concat(8550 * I / 21600, ",").concat(6382 * g / 21600, " L ").concat(9722 * I / 21600, ",").concat(1887 * g / 21600, " z");
  29701. break;
  29702. case "flowChartTerminator":
  29703. var k0 = 3475 * I / 21600, M1 = 18125 * I / 21600, R1 = 10800 * g / 21600;
  29704. i = "M ".concat(k0, ",0 L ").concat(M1, ",0 ").concat(Vg(M1, g / 2, k0, R1, 270, 450, !1).replace("M", "L"), " L ").concat(k0, ",").concat(g, " ").concat(Vg(k0, g / 2, k0, R1, 90, 270, !1).replace("M", "L"), " z");
  29705. break;
  29706. case "flowChartPunchedTape":
  29707. var BM = 180, Yd = 5 * I / 20, eo = 2 * g / 20, WM = 18 * g / 20;
  29708. i = "M 0,".concat(eo, " ").concat(Vg(Yd, eo, Yd, eo, BM, 0, !1).replace("M", "L"), " ").concat(Vg(I * (3 / 4), eo, Yd, eo, BM, 360, !1).replace("M", "L"), " L ").concat(I, ",").concat(WM, " ").concat(Vg(I * (3 / 4), WM, Yd, eo, 0, -180, !1).replace("M", "L"), " ").concat(Vg(Yd, WM, Yd, eo, 0, BM, !1).replace("M", "L"), " z");
  29709. break;
  29710. case "flowChartOnlineStorage":
  29711. var z0 = 1 * I / 6, f1 = 3 * g / 6;
  29712. i = "M ".concat(z0, ",0 L ").concat(I, ",0 ").concat(Vg(I, g / 2, z0, f1, 270, 90, !1).replace("M", "L"), " L ").concat(z0, ",").concat(g, " ").concat(Vg(z0, g / 2, z0, f1, 90, 270, !1).replace("M", "L"), " z");
  29713. break;
  29714. case "flowChartDisplay":
  29715. var yM = 1 * I / 6, Jig = 5 * I / 6, H1 = 3 * g / 6;
  29716. i = "M 0,".concat(H1, " L ").concat(yM, ",0 L ").concat(Jig, ",0 ").concat(Vg(I, g / 2, yM, H1, 270, 450, !1).replace("M", "L"), " L ").concat(yM, ",").concat(g, " z");
  29717. break;
  29718. case "flowChartDelay":
  29719. var YM = I / 2, X1 = g / 2;
  29720. i = "M 0,0 L ".concat(YM, ",0 ").concat(Vg(YM, X1, YM, X1, 270, 450, !1).replace("M", "L"), " L 0,").concat(g, " z");
  29721. break;
  29722. case "flowChartMagneticTape":
  29723. var Qs = I / 2, TA = g / 2, Lig = TA + TA * Math.sin(Math.PI / 4), vig = 180 * Math.atan(g / I) / Math.PI;
  29724. i = "M ".concat(Qs, ",").concat(g, " ").concat(Vg(Qs, TA, Qs, TA, 90, 180, !1).replace("M", "L"), " ").concat(Vg(Qs, TA, Qs, TA, 180, 270, !1).replace("M", "L"), " ").concat(Vg(Qs, TA, Qs, TA, 270, 360, !1).replace("M", "L"), " ").concat(Vg(Qs, TA, Qs, TA, 0, vig, !1).replace("M", "L"), " L ").concat(I, ",").concat(Lig, " L ").concat(I, ",").concat(g, " z");
  29725. break;
  29726. case "ellipse":
  29727. case "flowChartConnector":
  29728. case "flowChartSummingJunction":
  29729. case "flowChartOr":
  29730. var J0 = I / 2, L0 = g / 2, v0 = I / 2, S1 = g / 2;
  29731. if (i = "M ".concat(J0 - v0, ",").concat(L0, " A ").concat(v0, ",").concat(S1, " 0 1,0 ").concat(J0 + v0, ",").concat(L0, " A ").concat(v0, ",").concat(S1, " 0 1,0 ").concat(J0 - v0, ",").concat(L0, " Z"), t === "flowChartOr") i += " M ".concat(I / 2, " 0 L ").concat(I / 2, " ").concat(g, " M 0 ").concat(g / 2, " L ").concat(I, " ").concat(g / 2);
  29732. else if (t === "flowChartSummingJunction") {
  29733. var D1 = Math.PI / 4, K1 = I / 2 * Math.cos(D1), F1 = g / 2 * Math.sin(D1), k1 = J0 - K1, z1 = J0 + K1, J1 = L0 - F1, L1 = L0 + F1;
  29734. i += " M ".concat(k1, " ").concat(J1, " L ").concat(z1, " ").concat(L1, " M ").concat(z1, " ").concat(J1, " L ").concat(k1, " ").concat(L1);
  29735. }
  29736. break;
  29737. case "roundRect":
  29738. case "round1Rect":
  29739. case "round2DiagRect":
  29740. case "round2SameRect":
  29741. case "snip1Rect":
  29742. case "snip2DiagRect":
  29743. case "snip2SameRect":
  29744. case "flowChartAlternateProcess":
  29745. case "flowChartPunchedCard":
  29746. var jt, Di, ln, nn, T0 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
  29747. if (T0 && Array.isArray(T0)) {
  29748. var v1, VG = HI(T0);
  29749. try {
  29750. for (VG.s(); !(v1 = VG.n()).done; ) {
  29751. var NM = v1.value, T1 = U(NM, ["attrs", "name"]);
  29752. if (T1 === "adj1") {
  29753. var Tig = U(NM, ["attrs", "fmla"]);
  29754. jt = parseInt(Tig.substring(4)) / 5e4;
  29755. } else if (T1 === "adj2") {
  29756. var xig = U(NM, ["attrs", "fmla"]);
  29757. Di = parseInt(xig.substring(4)) / 5e4;
  29758. }
  29759. }
  29760. } catch (Mg) {
  29761. VG.e(Mg);
  29762. } finally {
  29763. VG.f();
  29764. }
  29765. } else if (T0) {
  29766. var jig = U(T0, ["attrs", "fmla"]);
  29767. jt = parseInt(jig.substring(4)) / 5e4, Di = 0;
  29768. }
  29769. var x1 = !1;
  29770. switch (t) {
  29771. case "roundRect":
  29772. case "flowChartAlternateProcess":
  29773. ln = "round", nn = "cornrAll", jt === void 0 && (jt = 0.33334), Di = 0;
  29774. break;
  29775. case "round1Rect":
  29776. ln = "round", nn = "cornr1", jt === void 0 && (jt = 0.33334), Di = 0;
  29777. break;
  29778. case "round2DiagRect":
  29779. ln = "round", nn = "diag", jt === void 0 && (jt = 0.33334), Di === void 0 && (Di = 0);
  29780. break;
  29781. case "round2SameRect":
  29782. ln = "round", nn = "cornr2", jt === void 0 && (jt = 0.33334), Di === void 0 && (Di = 0);
  29783. break;
  29784. case "snip1Rect":
  29785. case "flowChartPunchedCard":
  29786. ln = "snip", nn = "cornr1", jt === void 0 && (jt = 0.33334), Di = 0, t === "flowChartPunchedCard" && (x1 = !0);
  29787. break;
  29788. case "snip2DiagRect":
  29789. ln = "snip", nn = "diag", jt === void 0 && (jt = 0), Di === void 0 && (Di = 0.33334);
  29790. break;
  29791. case "snip2SameRect":
  29792. ln = "snip", nn = "cornr2", jt === void 0 && (jt = 0.33334), Di === void 0 && (Di = 0);
  29793. }
  29794. i = function(Mg, RI, YC, QC, OC, zi) {
  29795. var UC, Ct, Zt, Ht, ee;
  29796. switch (zi) {
  29797. case "cornr1":
  29798. UC = 0, Ct = 0, Zt = 0, Ht = YC;
  29799. break;
  29800. case "cornr2":
  29801. UC = YC, Ct = QC, Zt = QC, Ht = YC;
  29802. break;
  29803. case "cornrAll":
  29804. UC = YC, Ct = YC, Zt = YC, Ht = YC;
  29805. break;
  29806. case "diag":
  29807. UC = YC, Ct = QC, Zt = YC, Ht = QC;
  29808. break;
  29809. default:
  29810. UC = Ct = Zt = Ht = 0;
  29811. }
  29812. if (OC === "round") {
  29813. if (!Mg || !RI) return "";
  29814. var Qt = function(Kr) {
  29815. var Fr = Number(Kr);
  29816. return Number.isFinite(Fr) ? Math.max(0, Math.min(1, Fr)) : 0;
  29817. }, Gt = Math.min(Mg, RI), Ot = Qt(UC) * (Gt / 2), at = Qt(Ht) * (Gt / 2), Je = Qt(Zt) * (Gt / 2), Le = Qt(Ct) * (Gt / 2), RY = Ot + at > 0 ? Mg / (Ot + at) : 1, fY = Le + Je > 0 ? Mg / (Le + Je) : 1, HY = Ot + Le > 0 ? RI / (Ot + Le) : 1, Mu = at + Je > 0 ? RI / (at + Je) : 1, Jo = Math.min(1, RY, fY, HY, Mu);
  29818. at *= Jo, Je *= Jo, Le *= Jo;
  29819. var ve = function(Kr, Fr) {
  29820. return "L".concat(Kr, ",").concat(Fr);
  29821. }, XY = function(Kr, Fr, eag) {
  29822. return "A".concat(Kr, ",").concat(Kr, " 0 0,1 ").concat(Fr, ",").concat(eag);
  29823. }, nl = "";
  29824. return nl += (ee = 0, "M".concat(Ot *= Jo, ",").concat(ee)), nl += ve(Mg - at, 0), nl += at > 0 ? XY(at, Mg, at) : ve(Mg, 0), nl += ve(Mg, RI - Je), nl += Je > 0 ? XY(Je, Mg - Je, RI) : ve(Mg, RI), nl += ve(Le, RI), nl += Le > 0 ? XY(Le, 0, RI - Le) : ve(0, RI), nl += ve(0, Ot), (nl += Ot > 0 ? XY(Ot, Ot, 0) : ve(0, 0)) + "Z";
  29825. }
  29826. return OC === "snip" ? "M0,".concat(UC * (RI / 2), " L0,").concat(RI / 2 + RI / 2 * (1 - Ct), " L").concat(Ct * (Mg / 2), ",").concat(RI, " L").concat(Mg / 2 + Mg / 2 * (1 - Zt), ",").concat(RI, " L").concat(Mg, ",").concat(RI / 2 + RI / 2 * (1 - Zt), " L").concat(Mg, ",").concat(Ht * (RI / 2), " L").concat(Mg / 2 + Mg / 2 * (1 - Ht), ",0 L").concat(Mg / 2 * UC, ",0 z") : "";
  29827. }(I, g, jt, Di, ln, nn), x1 && (i = i.replace(/([MLQC])\s*([-\d.e]+)\s*([-\d.e]+)/gi, function(Mg, RI, YC, QC) {
  29828. var OC = I - parseFloat(YC);
  29829. return "".concat(RI).concat(OC, " ").concat(QC);
  29830. }).replace(/([MLQC])\s*([-\d.e]+)\s*([-\d.e]+)\s*([-\d.e]+)\s*([-\d.e]+)/gi, function(Mg, RI, YC, QC, OC, zi) {
  29831. var UC = I - parseFloat(YC), Ct = I - parseFloat(OC);
  29832. return "".concat(RI).concat(UC, " ").concat(QC, " ").concat(Ct, " ").concat(zi);
  29833. }));
  29834. break;
  29835. case "snipRoundRect":
  29836. var j1 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), VM = 0.33334, MM = 0.33334;
  29837. if (j1) {
  29838. var Q1, MG = HI(j1);
  29839. try {
  29840. for (MG.s(); !(Q1 = MG.n()).done; ) {
  29841. var RM = Q1.value, O1 = U(RM, ["attrs", "name"]);
  29842. if (O1 === "adj1") {
  29843. var Qig = U(RM, ["attrs", "fmla"]);
  29844. VM = parseInt(Qig.substring(4)) / 5e4;
  29845. } else if (O1 === "adj2") {
  29846. var Oig = U(RM, ["attrs", "fmla"]);
  29847. MM = parseInt(Oig.substring(4)) / 5e4;
  29848. }
  29849. }
  29850. } catch (Mg) {
  29851. MG.e(Mg);
  29852. } finally {
  29853. MG.f();
  29854. }
  29855. }
  29856. i = "M0,".concat(g, " L").concat(I, ",").concat(g, " L").concat(I, ",").concat(g / 2 * MM, " L").concat(I / 2 + I / 2 * (1 - MM), ",0 L").concat(I / 2 * VM, ",0 Q0,0 0,").concat(g / 2 * VM, " z");
  29857. break;
  29858. case "bentConnector2":
  29859. i = "M ".concat(I, " 0 L ").concat(I, " ").concat(g, " L 0 ").concat(g);
  29860. break;
  29861. case "rtTriangle":
  29862. i = "M 0 0 L 0 ".concat(g, " L ").concat(I, " ").concat(g, " Z");
  29863. break;
  29864. case "triangle":
  29865. case "flowChartExtract":
  29866. case "flowChartMerge":
  29867. var U1 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), E1 = 0.5;
  29868. U1 && (E1 = parseInt(U1.substring(4)) * Gg);
  29869. var fM = I * E1, HM = 0, XM = 0, SM = g, DM = I, KM = g;
  29870. if (t === "flowChartMerge") {
  29871. var P1 = [I - fM, g - HM];
  29872. fM = P1[0], HM = P1[1];
  29873. var _1 = [I - XM, g - SM];
  29874. XM = _1[0], SM = _1[1];
  29875. var q1 = [I - DM, g - KM];
  29876. DM = q1[0], KM = q1[1];
  29877. }
  29878. i = "M ".concat(fM, " ").concat(HM, " L ").concat(XM, " ").concat(SM, " L ").concat(DM, " ").concat(KM, " Z");
  29879. break;
  29880. case "diamond":
  29881. case "flowChartDecision":
  29882. case "flowChartSort":
  29883. var $1 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), gK = 5e4;
  29884. if ($1) {
  29885. var FM = U($1, ["attrs", "fmla"]);
  29886. FM && FM.startsWith("val ") && (gK = parseInt(FM.substring(4)));
  29887. }
  29888. var Nd = gK / 1e5;
  29889. i = "M ".concat(I * Nd, " 0 L 0 ").concat(g * Nd, " L ").concat(I * Nd, " ").concat(g, " L ").concat(I, " ").concat(g * Nd, " Z"), t === "flowChartSort" && (i += " M 0 ".concat(g * Nd, " L ").concat(I, " ").concat(g * Nd));
  29890. break;
  29891. case "trapezoid":
  29892. case "flowChartManualOperation":
  29893. case "flowChartManualInput":
  29894. var IK = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), x0 = 0.2;
  29895. IK && (x0 = 0.5 * (parseInt(IK.substring(4)) * Gg) / 0.7407);
  29896. var RG = I * x0, fG = 0, kM = 0, zM = g, JM = I, LM = g, HG = (1 - x0) * I, vM = 0;
  29897. if (t === "flowChartManualInput" && (fG = g / 5, RG = I * (x0 = 0), HG = (1 - x0) * I), t === "flowChartManualOperation") {
  29898. var CK = [I - RG, g - fG];
  29899. RG = CK[0], fG = CK[1];
  29900. var tK = [I - kM, g - zM];
  29901. kM = tK[0], zM = tK[1];
  29902. var iK = [I - JM, g - LM];
  29903. JM = iK[0], LM = iK[1];
  29904. var eK = [I - HG, g - vM];
  29905. HG = eK[0], vM = eK[1];
  29906. }
  29907. i = "M ".concat(RG, " ").concat(fG, " L ").concat(kM, " ").concat(zM, " L ").concat(JM, " ").concat(LM, " L ").concat(HG, " ").concat(vM, " Z");
  29908. break;
  29909. case "parallelogram":
  29910. case "flowChartInputOutput":
  29911. var AK = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), TM = 0.25;
  29912. if (AK) {
  29913. var Uig = I > g ? I / g : g / I;
  29914. TM = parseInt(AK.substring(4)) / 1e5 / Uig;
  29915. }
  29916. i = "M ".concat(TM * I, " 0 L 0 ").concat(g, " L ").concat((1 - TM) * I, " ").concat(g, " L ").concat(I, " 0 Z");
  29917. break;
  29918. case "pentagon":
  29919. i = "M ".concat(0.5 * I, " 0 L 0 ").concat(0.375 * g, " L ").concat(0.15 * I, " ").concat(g, " L ").concat(0.85 * I, " ").concat(g, " L ").concat(I, " ").concat(0.375 * g, " Z");
  29920. break;
  29921. case "hexagon":
  29922. case "flowChartPreparation":
  29923. var sK = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), XG = 1.9685039370078738;
  29924. sK && (XG = parseInt(sK.substring(4)) * Gg);
  29925. var lK = 7.874015748031495, Eig = 60 * Math.PI / 180, nK = Math.min(I, g), aK = 3.9370078740157477 * I / nK, xM = nK * (XG < 0 ? 0 : XG > aK ? aK : XG) / lK, oK = I - xM, cK = 9.092125984251968 * (g / 2) / lK * Math.sin(Eig), SG = g / 2, dK = SG - cK, rK = SG + cK;
  29926. i = "M 0,".concat(SG, " L ").concat(xM, ",").concat(dK, " L ").concat(oK, ",").concat(dK, " L ").concat(I, ",").concat(SG, " L ").concat(oK, ",").concat(rK, " L ").concat(xM, ",").concat(rK, " z");
  29927. break;
  29928. case "heptagon":
  29929. i = "M ".concat(0.5 * I, " 0 L ").concat(I / 8, " ").concat(g / 4, " L 0 ").concat(5 / 8 * g, " L ").concat(I / 4, " ").concat(g, " L ").concat(3 / 4 * I, " ").concat(g, " L ").concat(I, " ").concat(5 / 8 * g, " L ").concat(7 / 8 * I, " ").concat(g / 4, " Z");
  29930. break;
  29931. case "octagon":
  29932. var hK = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Vd = 0.25;
  29933. hK && (Vd = parseInt(hK.substring(4)) / 1e5);
  29934. var DG = 1 - Vd;
  29935. i = "M ".concat(Vd * I, " 0 L 0 ").concat(Vd * g, " L 0 ").concat(DG * g, " L ").concat(Vd * I, " ").concat(g, " L ").concat(DG * I, " ").concat(g, " L ").concat(I, " ").concat(DG * g, " L ").concat(I, " ").concat(Vd * g, " L ").concat(DG * I, " 0 Z");
  29936. break;
  29937. case "decagon":
  29938. i = "M ".concat(3 / 8 * I, " 0 L ").concat(I / 8, " ").concat(g / 8, " L 0 ").concat(g / 2, " L ").concat(I / 8, " ").concat(7 / 8 * g, " L ").concat(3 / 8 * I, " ").concat(g, " L ").concat(5 / 8 * I, " ").concat(g, " L ").concat(7 / 8 * I, " ").concat(7 / 8 * g, " L ").concat(I, " ").concat(g / 2, " L ").concat(7 / 8 * I, " ").concat(g / 8, " L ").concat(5 / 8 * I, " 0 Z");
  29939. break;
  29940. case "dodecagon":
  29941. i = "M ".concat(3 / 8 * I, " 0 L ").concat(I / 8, " ").concat(g / 8, " L 0 ").concat(3 / 8 * g, " L 0 ").concat(5 / 8 * g, " L ").concat(I / 8, " ").concat(7 / 8 * g, " L ").concat(3 / 8 * I, " ").concat(g, " L ").concat(5 / 8 * I, " ").concat(g, " L ").concat(7 / 8 * I, " ").concat(7 / 8 * g, " L ").concat(I, " ").concat(5 / 8 * g, " L ").concat(I, " ").concat(3 / 8 * g, " L ").concat(7 / 8 * I, " ").concat(g / 8, " L ").concat(5 / 8 * I, " 0 Z");
  29942. break;
  29943. case "star4":
  29944. var KG = I / 2, FG = g / 2, Pig = I / 2, _ig = g / 2, kG = 1.503779527559055, zG = 3.9370078740157477, jM = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
  29945. jM && jM.attrs.name === "adj" && (kG = parseInt(jM.attrs.fmla.substring(4)) * Gg);
  29946. var bK = kG < 0 ? 0 : kG > zG ? zG : kG, qig = _ig * bK / zG, uK = Pig * bK / zG * Math.cos(0.7853981634), mK = qig * Math.sin(0.7853981634), ZK = KG - uK, GK = KG + uK, wK = FG - mK, pK = FG + mK;
  29947. i = "M 0,".concat(FG, " L ").concat(ZK, ",").concat(wK, " L ").concat(KG, ",0 L ").concat(GK, ",").concat(wK, " L ").concat(I, ",").concat(FG, " L ").concat(GK, ",").concat(pK, " L ").concat(KG, ",").concat(g, " L ").concat(ZK, ",").concat(pK, " z");
  29948. break;
  29949. case "star5":
  29950. var xA = I / 2, $ig = g / 2, geg = I / 2, Ieg = g / 2, JG = 1.503779527559055, BK = 8.279212598425197, QM = 8.70527559055118, LG = 3.9370078740157477, OM = 7.874015748031495, Md = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
  29951. Md && Object.keys(Md).forEach(function(Mg) {
  29952. var RI = Md[Mg].attrs.name;
  29953. RI === "adj" ? JG = parseInt(Md[Mg].attrs.fmla.substring(4)) * Gg : RI === "hf" ? BK = parseInt(Md[Mg].attrs.fmla.substring(4)) * Gg : RI === "vf" && (QM = parseInt(Md[Mg].attrs.fmla.substring(4)) * Gg);
  29954. });
  29955. var WK = JG < 0 ? 0 : JG > LG ? LG : JG, UM = geg * BK / OM, EM = Ieg * QM / OM, j0 = $ig * QM / OM, yK = UM * Math.cos(0.31415926536), YK = UM * Math.cos(5.3407075111), Ceg = xA - yK, teg = xA - YK, ieg = xA + YK, eeg = xA + yK, NK = j0 - EM * Math.sin(0.31415926536), VK = j0 - EM * Math.sin(5.3407075111), MK = UM * WK / LG, PM = EM * WK / LG, RK = MK * Math.cos(5.9690260418), fK = MK * Math.cos(0.94247779608), Aeg = xA - RK, seg = xA - fK, leg = xA + fK, neg = xA + RK, HK = j0 - PM * Math.sin(0.94247779608), XK = j0 - PM * Math.sin(5.9690260418), aeg = j0 + PM;
  29956. i = "M ".concat(Ceg, ",").concat(NK, " L ").concat(seg, ",").concat(HK, " L ").concat(xA, ",0 L ").concat(leg, ",").concat(HK, " L ").concat(eeg, ",").concat(NK, " L ").concat(neg, ",").concat(XK, " L ").concat(ieg, ",").concat(VK, " L ").concat(xA, ",").concat(aeg, " L ").concat(teg, ",").concat(VK, " L ").concat(Aeg, ",").concat(XK, " z");
  29957. break;
  29958. case "star6":
  29959. var an = I / 2, Q0 = g / 2, oeg = I / 2, ceg = g / 2, _M = g / 4, vG = 2.2730708661417323, SK = 9.092125984251968, TG = 3.9370078740157477, O0 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
  29960. O0 && Object.keys(O0).forEach(function(Mg) {
  29961. var RI = O0[Mg].attrs.name;
  29962. RI === "adj" ? vG = parseInt(O0[Mg].attrs.fmla.substring(4)) * Gg : RI === "hf" && (SK = parseInt(O0[Mg].attrs.fmla.substring(4)) * Gg);
  29963. });
  29964. var DK = vG < 0 ? 0 : vG > TG ? TG : vG, KK = oeg * SK / 7.874015748031495, FK = KK * Math.cos(0.5235987756), kK = an - FK, zK = an + FK, JK = Q0 + _M, qM = KK * DK / TG, LK = qM / 2, deg = an - qM, vK = an - LK, TK = an + LK, reg = an + qM, xK = ceg * DK / TG * Math.sin(1.0471975512), jK = Q0 - xK, QK = Q0 + xK;
  29965. i = "M ".concat(kK, ",").concat(_M, " L ").concat(vK, ",").concat(jK, " L ").concat(an, ",0 L ").concat(TK, ",").concat(jK, " L ").concat(zK, ",").concat(_M, " L ").concat(reg, ",").concat(Q0, " L ").concat(zK, ",").concat(JK, " L ").concat(TK, ",").concat(QK, " L ").concat(an, ",").concat(g, " L ").concat(vK, ",").concat(QK, " L ").concat(kK, ",").concat(JK, " L ").concat(deg, ",").concat(Q0, " z");
  29966. break;
  29967. case "star7":
  29968. var Ki = I / 2, heg = g / 2, beg = I / 2, ueg = g / 2, xG = 2.7244881889763777, OK = 8.076535433070866, $M = 8.284251968503936, jG = 3.9370078740157477, gR = 7.874015748031495, Rd = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
  29969. Rd && Object.keys(Rd).forEach(function(Mg) {
  29970. var RI = Rd[Mg].attrs.name;
  29971. RI === "adj" ? xG = parseInt(Rd[Mg].attrs.fmla.substring(4)) * Gg : RI === "hf" ? OK = parseInt(Rd[Mg].attrs.fmla.substring(4)) * Gg : RI === "vf" && ($M = parseInt(Rd[Mg].attrs.fmla.substring(4)) * Gg);
  29972. });
  29973. var UK = xG < 0 ? 0 : xG > jG ? jG : xG, QG = beg * OK / gR, OG = ueg * $M / gR, Ao = heg * $M / gR, EK = 97493 * QG / 1e5, PK = 78183 * QG / 1e5, _K = 43388 * QG / 1e5, meg = Ki - PK, Zeg = Ki - _K, Geg = Ki + _K, weg = Ki + PK, peg = Ki + EK, qK = Ao - 62349 * OG / 1e5, $K = Ao + 22252 * OG / 1e5, gF = Ao + 90097 * OG / 1e5, IR = QG * UK / jG, UG = OG * UK / jG, IF = 97493 * IR / 1e5, CF = 78183 * IR / 1e5, tF = 43388 * IR / 1e5, Beg = Ki - IF, Weg = Ki - CF, yeg = Ki - tF, Yeg = Ki + tF, Neg = Ki + CF, Veg = Ki + IF, iF = Ao - 90097 * UG / 1e5, eF = Ao - 22252 * UG / 1e5, AF = Ao + 62349 * UG / 1e5, Meg = Ao + UG;
  29974. i = "M ".concat(Ki - EK, ",").concat($K, " L ").concat(Beg, ",").concat(eF, " L ").concat(meg, ",").concat(qK, " L ").concat(yeg, ",").concat(iF, " L ").concat(Ki, ",0 L ").concat(Yeg, ",").concat(iF, " L ").concat(weg, ",").concat(qK, " L ").concat(Veg, ",").concat(eF, " L ").concat(peg, ",").concat($K, " L ").concat(Neg, ",").concat(AF, " L ").concat(Geg, ",").concat(gF, " L ").concat(Ki, ",").concat(Meg, " L ").concat(Zeg, ",").concat(gF, " L ").concat(Weg, ",").concat(AF, " z");
  29975. break;
  29976. case "star8":
  29977. var on = I / 2, cn = g / 2, sF = I / 2, lF = g / 2, EG = 2.9527559055118107, PG = 3.9370078740157477, CR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
  29978. CR && CR.attrs.name === "adj" && (EG = parseInt(CR.attrs.fmla.substring(4)) * Gg);
  29979. var nF = EG < 0 ? 0 : EG > PG ? PG : EG, aF = sF * Math.cos(0.7853981634), oF = on - aF, cF = on + aF, dF = lF * Math.sin(0.7853981634), rF = cn - dF, hF = cn + dF, bF = sF * nF / PG, uF = lF * nF / PG, mF = 92388 * bF / 1e5, ZF = 38268 * bF / 1e5, GF = 92388 * uF / 1e5, wF = 38268 * uF / 1e5, pF = on - mF, BF = on - ZF, WF = on + ZF, yF = on + mF, YF = cn - GF, NF = cn - wF, VF = cn + wF, MF = cn + GF;
  29980. i = "M 0,".concat(cn, " L ").concat(pF, ",").concat(NF, " L ").concat(oF, ",").concat(rF, " L ").concat(BF, ",").concat(YF, " L ").concat(on, ",0 L ").concat(WF, ",").concat(YF, " L ").concat(cF, ",").concat(rF, " L ").concat(yF, ",").concat(NF, " L ").concat(I, ",").concat(cn, " L ").concat(yF, ",").concat(VF, " L ").concat(cF, ",").concat(hF, " L ").concat(WF, ",").concat(MF, " L ").concat(on, ",").concat(g, " L ").concat(BF, ",").concat(MF, " L ").concat(oF, ",").concat(hF, " L ").concat(pF, ",").concat(VF, " z");
  29981. break;
  29982. case "star10":
  29983. var fe = I / 2, jA = g / 2, Reg = I / 2, tR = g / 2, _G = 3.349055118110236, RF = 8.279212598425197, qG = 3.9370078740157477, U0 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
  29984. U0 && Object.keys(U0).forEach(function(Mg) {
  29985. var RI = U0[Mg].attrs.name;
  29986. RI === "adj" ? _G = parseInt(U0[Mg].attrs.fmla.substring(4)) * Gg : RI === "hf" && (RF = parseInt(U0[Mg].attrs.fmla.substring(4)) * Gg);
  29987. });
  29988. var fF = _G < 0 ? 0 : _G > qG ? qG : _G, iR = Reg * RF / 7.874015748031495, HF = 95106 * iR / 1e5, XF = 58779 * iR / 1e5, SF = fe - HF, DF = fe - XF, KF = fe + XF, FF = fe + HF, kF = 80902 * tR / 1e5, zF = 30902 * tR / 1e5, JF = jA - kF, LF = jA - zF, vF = jA + zF, TF = jA + kF, $G = iR * fF / qG, xF = tR * fF / qG, jF = 80902 * $G / 1e5, QF = 30902 * $G / 1e5, OF = 95106 * xF / 1e5, UF = 58779 * xF / 1e5, feg = fe - $G, EF = fe - jF, PF = fe - QF, _F = fe + QF, qF = fe + jF, Heg = fe + $G, $F = jA - OF, gk = jA - UF, Ik = jA + UF, Ck = jA + OF;
  29989. i = "M ".concat(SF, ",").concat(LF, " L ").concat(EF, ",").concat(gk, " L ").concat(DF, ",").concat(JF, " L ").concat(PF, ",").concat($F, " L ").concat(fe, ",0 L ").concat(_F, ",").concat($F, " L ").concat(KF, ",").concat(JF, " L ").concat(qF, ",").concat(gk, " L ").concat(FF, ",").concat(LF, " L ").concat(Heg, ",").concat(jA, " L ").concat(FF, ",").concat(vF, " L ").concat(qF, ",").concat(Ik, " L ").concat(KF, ",").concat(TF, " L ").concat(_F, ",").concat(Ck, " L ").concat(fe, ",").concat(g, " L ").concat(PF, ",").concat(Ck, " L ").concat(DF, ",").concat(TF, " L ").concat(EF, ",").concat(Ik, " L ").concat(SF, ",").concat(vF, " L ").concat(feg, ",").concat(jA, " z");
  29990. break;
  29991. case "star12":
  29992. var QA = I / 2, OA = g / 2, tk = I / 2, ik = g / 2, ek = g / 4, Ak = I / 4, gw = 2.9527559055118107, Iw = 3.9370078740157477, eR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
  29993. eR && eR.attrs.name === "adj" && (gw = parseInt(eR.attrs.fmla.substring(4)) * Gg);
  29994. var sk = gw < 0 ? 0 : gw > Iw ? Iw : gw, lk = tk * Math.cos(0.5235987756), nk = ik * Math.sin(1.0471975512), ak = QA - lk, ok = 3 * I / 4, ck = QA + lk, dk = OA - nk, rk = 3 * g / 4, hk = OA + nk, AR = tk * sk / Iw, sR = ik * sk / Iw, bk = AR * Math.cos(0.2617993878), uk = AR * Math.cos(0.7853981634), mk = AR * Math.cos(1.308996939), Zk = sR * Math.sin(1.308996939), Gk = sR * Math.sin(0.7853981634), wk = sR * Math.sin(0.2617993878), pk = QA - bk, Bk = QA - uk, Wk = QA - mk, yk = QA + mk, Yk = QA + uk, Nk = QA + bk, Vk = OA - Zk, Mk = OA - Gk, Rk = OA - wk, fk = OA + wk, Hk = OA + Gk, Xk = OA + Zk;
  29995. i = "M 0,".concat(OA, " L ").concat(pk, ",").concat(Rk, " L ").concat(ak, ",").concat(ek, " L ").concat(Bk, ",").concat(Mk, " L ").concat(Ak, ",").concat(dk, " L ").concat(Wk, ",").concat(Vk, " L ").concat(QA, ",0 L ").concat(yk, ",").concat(Vk, " L ").concat(ok, ",").concat(dk, " L ").concat(Yk, ",").concat(Mk, " L ").concat(ck, ",").concat(ek, " L ").concat(Nk, ",").concat(Rk, " L ").concat(I, ",").concat(OA, " L ").concat(Nk, ",").concat(fk, " L ").concat(ck, ",").concat(rk, " L ").concat(Yk, ",").concat(Hk, " L ").concat(ok, ",").concat(hk, " L ").concat(yk, ",").concat(Xk, " L ").concat(QA, ",").concat(g, " L ").concat(Wk, ",").concat(Xk, " L ").concat(Ak, ",").concat(hk, " L ").concat(Bk, ",").concat(Hk, " L ").concat(ak, ",").concat(rk, " L ").concat(pk, ",").concat(fk, " z");
  29996. break;
  29997. case "star16":
  29998. var si = I / 2, li = g / 2, Cw = I / 2, tw = g / 2, iw = 2.9527559055118107, ew = 3.9370078740157477, lR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
  29999. lR && lR.attrs.name === "adj" && (iw = parseInt(lR.attrs.fmla.substring(4)) * Gg);
  30000. var Sk = iw < 0 ? 0 : iw > ew ? ew : iw, Dk = 92388 * Cw / 1e5, Kk = 70711 * Cw / 1e5, Fk = 38268 * Cw / 1e5, kk = 92388 * tw / 1e5, zk = 70711 * tw / 1e5, Jk = 38268 * tw / 1e5, Lk = si - Dk, vk = si - Kk, Tk = si - Fk, xk = si + Fk, jk = si + Kk, Qk = si + Dk, Ok = li - kk, Uk = li - zk, Ek = li - Jk, Pk = li + Jk, _k = li + zk, qk = li + kk, Aw = Cw * Sk / ew, sw = tw * Sk / ew, $k = 98079 * Aw / 1e5, g3 = 83147 * Aw / 1e5, I3 = 55557 * Aw / 1e5, C3 = 19509 * Aw / 1e5, t3 = 98079 * sw / 1e5, i3 = 83147 * sw / 1e5, e3 = 55557 * sw / 1e5, A3 = 19509 * sw / 1e5, s3 = si - $k, l3 = si - g3, n3 = si - I3, a3 = si - C3, o3 = si + C3, c3 = si + I3, d3 = si + g3, r3 = si + $k, h3 = li - t3, b3 = li - i3, u3 = li - e3, m3 = li - A3, Z3 = li + A3, G3 = li + e3, w3 = li + i3, p3 = li + t3;
  30001. i = "M 0,".concat(li, " L ").concat(s3, ",").concat(m3, " L ").concat(Lk, ",").concat(Ek, " L ").concat(l3, ",").concat(u3, " L ").concat(vk, ",").concat(Uk, " L ").concat(n3, ",").concat(b3, " L ").concat(Tk, ",").concat(Ok, " L ").concat(a3, ",").concat(h3, " L ").concat(si, ",0 L ").concat(o3, ",").concat(h3, " L ").concat(xk, ",").concat(Ok, " L ").concat(c3, ",").concat(b3, " L ").concat(jk, ",").concat(Uk, " L ").concat(d3, ",").concat(u3, " L ").concat(Qk, ",").concat(Ek, " L ").concat(r3, ",").concat(m3, " L ").concat(I, ",").concat(li, " L ").concat(r3, ",").concat(Z3, " L ").concat(Qk, ",").concat(Pk, " L ").concat(d3, ",").concat(G3, " L ").concat(jk, ",").concat(_k, " L ").concat(c3, ",").concat(w3, " L ").concat(xk, ",").concat(qk, " L ").concat(o3, ",").concat(p3, " L ").concat(si, ",").concat(g, " L ").concat(a3, ",").concat(p3, " L ").concat(Tk, ",").concat(qk, " L ").concat(n3, ",").concat(w3, " L ").concat(vk, ",").concat(_k, " L ").concat(l3, ",").concat(G3, " L ").concat(Lk, ",").concat(Pk, " L ").concat(s3, ",").concat(Z3, " z");
  30002. break;
  30003. case "star24":
  30004. var DC = I / 2, KC = g / 2, E0 = I / 2, P0 = g / 2, Xeg = g / 4, Seg = I / 4, lw = 2.9527559055118107, nw = 3.9370078740157477, nR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
  30005. nR && nR.attrs.name === "adj" && (lw = parseInt(nR.attrs.fmla.substring(4)) * Gg);
  30006. var B3 = lw < 0 ? 0 : lw > nw ? nw : lw, W3 = E0 * Math.cos(0.2617993878), y3 = E0 * Math.cos(0.5235987756), Y3 = E0 * Math.cos(0.7853981634), N3 = Seg, V3 = E0 * Math.cos(1.308996939), M3 = P0 * Math.sin(1.308996939), R3 = P0 * Math.sin(1.0471975512), f3 = P0 * Math.sin(0.7853981634), H3 = Xeg, X3 = P0 * Math.sin(0.2617993878), S3 = DC - W3, D3 = DC - y3, K3 = DC - Y3, F3 = DC - N3, k3 = DC - V3, z3 = DC + V3, J3 = DC + N3, L3 = DC + Y3, v3 = DC + y3, T3 = DC + W3, x3 = KC - M3, j3 = KC - R3, Q3 = KC - f3, O3 = KC - H3, U3 = KC - X3, E3 = KC + X3, P3 = KC + H3, _3 = KC + f3, q3 = KC + R3, $3 = KC + M3, fd = E0 * B3 / nw, Hd = P0 * B3 / nw, gz = 99144 * fd / 1e5, Iz = 92388 * fd / 1e5, Cz = 79335 * fd / 1e5, tz = 60876 * fd / 1e5, iz = 38268 * fd / 1e5, ez = 13053 * fd / 1e5, Az = 99144 * Hd / 1e5, sz = 92388 * Hd / 1e5, lz = 79335 * Hd / 1e5, nz = 60876 * Hd / 1e5, az = 38268 * Hd / 1e5, oz = 13053 * Hd / 1e5, cz = DC - gz, dz = DC - Iz, rz = DC - Cz, hz = DC - tz, bz = DC - iz, uz = DC - ez, mz = DC + ez, Zz = DC + iz, Gz = DC + tz, wz = DC + Cz, pz = DC + Iz, Bz = DC + gz, Wz = KC - Az, yz = KC - sz, Yz = KC - lz, Nz = KC - nz, Vz = KC - az, Mz = KC - oz, Rz = KC + oz, fz = KC + az, Hz = KC + nz, Xz = KC + lz, Sz = KC + sz, Dz = KC + Az;
  30007. i = "M 0,".concat(KC, " L ").concat(cz, ",").concat(Mz, " L ").concat(S3, ",").concat(U3, " L ").concat(dz, ",").concat(Vz, " L ").concat(D3, ",").concat(O3, " L ").concat(rz, ",").concat(Nz, " L ").concat(K3, ",").concat(Q3, " L ").concat(hz, ",").concat(Yz, " L ").concat(F3, ",").concat(j3, " L ").concat(bz, ",").concat(yz, " L ").concat(k3, ",").concat(x3, " L ").concat(uz, ",").concat(Wz, " L ").concat(DC, ",0 L ").concat(mz, ",").concat(Wz, " L ").concat(z3, ",").concat(x3, " L ").concat(Zz, ",").concat(yz, " L ").concat(J3, ",").concat(j3, " L ").concat(Gz, ",").concat(Yz, " L ").concat(L3, ",").concat(Q3, " L ").concat(wz, ",").concat(Nz, " L ").concat(v3, ",").concat(O3, " L ").concat(pz, ",").concat(Vz, " L ").concat(T3, ",").concat(U3, " L ").concat(Bz, ",").concat(Mz, " L ").concat(I, ",").concat(KC, " L ").concat(Bz, ",").concat(Rz, " L ").concat(T3, ",").concat(E3, " L ").concat(pz, ",").concat(fz, " L ").concat(v3, ",").concat(P3, " L ").concat(wz, ",").concat(Hz, " L ").concat(L3, ",").concat(_3, " L ").concat(Gz, ",").concat(Xz, " L ").concat(J3, ",").concat(q3, " L ").concat(Zz, ",").concat(Sz, " L ").concat(z3, ",").concat($3, " L ").concat(mz, ",").concat(Dz, " L ").concat(DC, ",").concat(g, " L ").concat(uz, ",").concat(Dz, " L ").concat(k3, ",").concat($3, " L ").concat(bz, ",").concat(Sz, " L ").concat(F3, ",").concat(q3, " L ").concat(hz, ",").concat(Xz, " L ").concat(K3, ",").concat(_3, " L ").concat(rz, ",").concat(Hz, " L ").concat(D3, ",").concat(P3, " L ").concat(dz, ",").concat(fz, " L ").concat(S3, ",").concat(E3, " L ").concat(cz, ",").concat(Rz, " z");
  30008. break;
  30009. case "star32":
  30010. var nC = I / 2, aC = g / 2, dn = I / 2, rn = g / 2, aw = 2.9527559055118107, ow = 3.9370078740157477, aR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
  30011. aR && aR.attrs.name === "adj" && (aw = parseInt(aR.attrs.fmla.substring(4)) * Gg);
  30012. var Kz = aw < 0 ? 0 : aw > ow ? ow : aw, Fz = 98079 * dn / 1e5, kz = 92388 * dn / 1e5, zz = 83147 * dn / 1e5, Jz = dn * Math.cos(0.7853981634), Lz = 55557 * dn / 1e5, vz = 38268 * dn / 1e5, Tz = 19509 * dn / 1e5, xz = 98079 * rn / 1e5, jz = 92388 * rn / 1e5, Qz = 83147 * rn / 1e5, Oz = rn * Math.sin(0.7853981634), Uz = 55557 * rn / 1e5, Ez = 38268 * rn / 1e5, Pz = 19509 * rn / 1e5, _z = nC - Fz, qz = nC - kz, $z = nC - zz, gJ = nC - Jz, IJ = nC - Lz, CJ = nC - vz, tJ = nC - Tz, iJ = nC + Tz, eJ = nC + vz, AJ = nC + Lz, sJ = nC + Jz, lJ = nC + zz, nJ = nC + kz, aJ = nC + Fz, oJ = aC - xz, cJ = aC - jz, dJ = aC - Qz, rJ = aC - Oz, hJ = aC - Uz, bJ = aC - Ez, uJ = aC - Pz, mJ = aC + Pz, ZJ = aC + Ez, GJ = aC + Uz, wJ = aC + Oz, pJ = aC + Qz, BJ = aC + jz, WJ = aC + xz, hn = dn * Kz / ow, bn = rn * Kz / ow, yJ = 99518 * hn / 1e5, YJ = 95694 * hn / 1e5, NJ = 88192 * hn / 1e5, VJ = 77301 * hn / 1e5, MJ = 63439 * hn / 1e5, RJ = 47140 * hn / 1e5, fJ = 29028 * hn / 1e5, HJ = 9802 * hn / 1e5, XJ = 99518 * bn / 1e5, SJ = 95694 * bn / 1e5, DJ = 88192 * bn / 1e5, KJ = 77301 * bn / 1e5, FJ = 63439 * bn / 1e5, kJ = 47140 * bn / 1e5, zJ = 29028 * bn / 1e5, JJ = 9802 * bn / 1e5, LJ = nC - yJ, vJ = nC - YJ, TJ = nC - NJ, xJ = nC - VJ, jJ = nC - MJ, QJ = nC - RJ, OJ = nC - fJ, UJ = nC - HJ, EJ = nC + HJ, PJ = nC + fJ, _J = nC + RJ, qJ = nC + MJ, $J = nC + VJ, gL = nC + NJ, IL = nC + YJ, CL = nC + yJ, tL = aC - XJ, iL = aC - SJ, eL = aC - DJ, AL = aC - KJ, sL = aC - FJ, lL = aC - kJ, nL = aC - zJ, aL = aC - JJ, oL = aC + JJ, cL = aC + zJ, dL = aC + kJ, rL = aC + FJ, hL = aC + KJ, bL = aC + DJ, uL = aC + SJ, mL = aC + XJ;
  30013. i = "M 0,".concat(aC, " L ").concat(LJ, ",").concat(aL, " L ").concat(_z, ",").concat(uJ, " L ").concat(vJ, ",").concat(nL, " L ").concat(qz, ",").concat(bJ, " L ").concat(TJ, ",").concat(lL, " L ").concat($z, ",").concat(hJ, " L ").concat(xJ, ",").concat(sL, " L ").concat(gJ, ",").concat(rJ, " L ").concat(jJ, ",").concat(AL, " L ").concat(IJ, ",").concat(dJ, " L ").concat(QJ, ",").concat(eL, " L ").concat(CJ, ",").concat(cJ, " L ").concat(OJ, ",").concat(iL, " L ").concat(tJ, ",").concat(oJ, " L ").concat(UJ, ",").concat(tL, " L ").concat(nC, ",0 L ").concat(EJ, ",").concat(tL, " L ").concat(iJ, ",").concat(oJ, " L ").concat(PJ, ",").concat(iL, " L ").concat(eJ, ",").concat(cJ, " L ").concat(_J, ",").concat(eL, " L ").concat(AJ, ",").concat(dJ, " L ").concat(qJ, ",").concat(AL, " L ").concat(sJ, ",").concat(rJ, " L ").concat($J, ",").concat(sL, " L ").concat(lJ, ",").concat(hJ, " L ").concat(gL, ",").concat(lL, " L ").concat(nJ, ",").concat(bJ, " L ").concat(IL, ",").concat(nL, " L ").concat(aJ, ",").concat(uJ, " L ").concat(CL, ",").concat(aL, " L ").concat(I, ",").concat(aC, " L ").concat(CL, ",").concat(oL, " L ").concat(aJ, ",").concat(mJ, " L ").concat(IL, ",").concat(cL, " L ").concat(nJ, ",").concat(ZJ, " L ").concat(gL, ",").concat(dL, " L ").concat(lJ, ",").concat(GJ, " L ").concat($J, ",").concat(rL, " L ").concat(sJ, ",").concat(wJ, " L ").concat(qJ, ",").concat(hL, " L ").concat(AJ, ",").concat(pJ, " L ").concat(_J, ",").concat(bL, " L ").concat(eJ, ",").concat(BJ, " L ").concat(PJ, ",").concat(uL, " L ").concat(iJ, ",").concat(WJ, " L ").concat(EJ, ",").concat(mL, " L ").concat(nC, ",").concat(g, " L ").concat(UJ, ",").concat(mL, " L ").concat(tJ, ",").concat(WJ, " L ").concat(OJ, ",").concat(uL, " L ").concat(CJ, ",").concat(BJ, " L ").concat(QJ, ",").concat(bL, " L ").concat(IJ, ",").concat(pJ, " L ").concat(jJ, ",").concat(hL, " L ").concat(gJ, ",").concat(wJ, " L ").concat(xJ, ",").concat(rL, " L ").concat($z, ",").concat(GJ, " L ").concat(TJ, ",").concat(dL, " L ").concat(qz, ",").concat(ZJ, " L ").concat(vJ, ",").concat(cL, " L ").concat(_z, ",").concat(mJ, " L ").concat(LJ, ",").concat(oL, " z");
  30014. break;
  30015. case "pie":
  30016. case "pieWedge":
  30017. case "arc":
  30018. var _0, q0, cw, dw, rw = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
  30019. if (t === "pie" ? (_0 = 0, q0 = 270, cw = g, dw = !0) : t === "pieWedge" ? (_0 = 180, q0 = 270, cw = 2 * g, dw = !0) : t === "arc" && (_0 = 270, q0 = 0, cw = g, dw = !1), rw) {
  30020. var $0 = U(rw, ["attrs", "fmla"]), oR = $0;
  30021. $0 === void 0 && ($0 = rw[0].attrs.fmla, oR = rw[1].attrs.fmla), $0 && (_0 = parseInt($0.substring(4)) / 6e4), oR && (q0 = parseInt(oR.substring(4)) / 6e4);
  30022. }
  30023. i = function(Mg, RI, YC, QC, OC) {
  30024. var zi = function(Mu) {
  30025. var Jo = Number(Mu);
  30026. if (!Number.isFinite(Jo)) return 0;
  30027. var ve = Jo % 360;
  30028. return ve < 0 && (ve += 360), ve;
  30029. }, UC = zi(YC), Ct = zi(QC), Zt = Ct - UC;
  30030. Zt < 0 && (Zt += 360), Zt = Math.min(Math.max(Zt, 0), 360);
  30031. var Ht = Number(Mg), ee = Number(RI) / 2, Qt = Ht / 2, Gt = ee, Ot = Qt, at = function(Mu) {
  30032. return Mu * (Math.PI / 180);
  30033. }, Je = Gt + Math.cos(at(UC)) * ee, Le = Ot + Math.sin(at(UC)) * Qt, RY = Gt + Math.cos(at(Ct)) * ee, fY = Ot + Math.sin(at(Ct)) * Qt, HY = Zt > 180 ? 1 : 0;
  30034. return OC ? "M".concat(Gt, ",").concat(Ot, " L").concat(Je, ",").concat(Le, " A").concat(ee, ",").concat(Qt, " 0 ").concat(HY, ",").concat(1, " ").concat(RY, ",").concat(fY, " Z") : "M".concat(Je, ",").concat(Le, " A").concat(ee, ",").concat(Qt, " 0 ").concat(HY, ",").concat(1, " ").concat(RY, ",").concat(fY);
  30035. }(cw, I, _0, q0, dw);
  30036. break;
  30037. case "chord":
  30038. var ZL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), GL = 45, wL = 270;
  30039. if (ZL) {
  30040. var pL, hw = HI(ZL);
  30041. try {
  30042. for (hw.s(); !(pL = hw.n()).done; ) {
  30043. var cR = pL.value, BL = U(cR, ["attrs", "name"]);
  30044. if (BL === "adj1") {
  30045. var Deg = U(cR, ["attrs", "fmla"]);
  30046. GL = parseInt(Deg.substring(4)) / 6e4;
  30047. } else if (BL === "adj2") {
  30048. var Keg = U(cR, ["attrs", "fmla"]);
  30049. wL = parseInt(Keg.substring(4)) / 6e4;
  30050. }
  30051. }
  30052. } catch (Mg) {
  30053. hw.e(Mg);
  30054. } finally {
  30055. hw.f();
  30056. }
  30057. }
  30058. var WL = g / 2, yL = I / 2;
  30059. i = Vg(yL, WL, yL, WL, GL, wL, !0);
  30060. break;
  30061. case "frame":
  30062. var YL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), bw = 0.9842519685039369, NL = 3.9370078740157477;
  30063. YL && (bw = parseInt(YL.substring(4)) * Gg);
  30064. var Feg = bw < 0 ? 0 : bw > NL ? NL : bw, Xd = Math.min(I, g) * Feg / 7.874015748031495, VL = I - Xd, ML = g - Xd;
  30065. i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(Xd, ",").concat(Xd, " L ").concat(Xd, ",").concat(ML, " L ").concat(VL, ",").concat(ML, " L ").concat(VL, ",").concat(Xd, " z");
  30066. break;
  30067. case "donut":
  30068. var RL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), uw = 1.9685039370078738, fL = 3.9370078740157477;
  30069. RL && (uw = parseInt(RL.substring(4)) * Gg);
  30070. var keg = uw < 0 ? 0 : uw > fL ? fL : uw, HL = Math.min(I, g) * keg / 7.874015748031495, gb = I / 2 - HL, XL = g / 2 - HL, zeg = "M ".concat(I / 2 - I / 2, ",").concat(g / 2, " A ").concat(I / 2, ",").concat(g / 2, " 0 1,0 ").concat(I / 2 + I / 2, ",").concat(g / 2, " A ").concat(I / 2, ",").concat(g / 2, " 0 1,0 ").concat(I / 2 - I / 2, ",").concat(g / 2, " Z"), Jeg = "M ".concat(I / 2 + gb, ",").concat(g / 2, " A ").concat(gb, ",").concat(XL, " 0 1,1 ").concat(I / 2 - gb, ",").concat(g / 2, " A ").concat(gb, ",").concat(XL, " 0 1,1 ").concat(I / 2 + gb, ",").concat(g / 2, " Z");
  30071. i = "".concat(zeg, " ").concat(Jeg);
  30072. break;
  30073. case "noSmoking":
  30074. var SL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), mw = 1.4763779527559053, DL = 3.9370078740157477;
  30075. SL && (mw = parseInt(SL.substring(4)) * Gg);
  30076. var Leg = mw < 0 ? 0 : mw > DL ? DL : mw, dR = Math.min(I, g) * Leg / 7.874015748031495, Zw = I / 2 - dR, Gw = g / 2 - dR, rR = Math.atan(g / I), KL = Gw * Math.cos(rR), FL = Zw * Math.sin(rR), veg = Zw * Gw / Math.sqrt(KL * KL + FL * FL), Teg = dR / 2, kL = Math.atan(Teg / veg), zL = -Math.PI + 2 * kL, hR = rR - kL, JL = hR - Math.PI, xeg = "M ".concat(I / 2 - I / 2, ",").concat(g / 2, " A ").concat(I / 2, ",").concat(g / 2, " 0 1,0 ").concat(I / 2 + I / 2, ",").concat(g / 2, " A ").concat(I / 2, ",").concat(g / 2, " 0 1,0 ").concat(I / 2 - I / 2, ",").concat(g / 2, " Z"), LL = I / 2, vL = g / 2, jeg = yq(LL, vL, Zw, Gw, hR, hR + zL), Qeg = yq(LL, vL, Zw, Gw, JL, JL + zL);
  30077. i = "".concat(xeg, " ").concat(jeg, " ").concat(Qeg);
  30078. break;
  30079. case "halfFrame":
  30080. var TL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), ww = 3.5, pw = 3.5, Bw = 7.874015748031495;
  30081. if (TL) {
  30082. var xL, Ww = HI(TL);
  30083. try {
  30084. for (Ww.s(); !(xL = Ww.n()).done; ) {
  30085. var bR = xL.value, jL = U(bR, ["attrs", "name"]);
  30086. jL === "adj1" ? ww = parseInt(U(bR, ["attrs", "fmla"]).substring(4)) * Gg : jL === "adj2" && (pw = parseInt(U(bR, ["attrs", "fmla"]).substring(4)) * Gg);
  30087. }
  30088. } catch (Mg) {
  30089. Ww.e(Mg);
  30090. } finally {
  30091. Ww.f();
  30092. }
  30093. }
  30094. var yw = Math.min(I, g), QL = Bw * I / yw, Yw = yw * (pw < 0 ? 0 : pw > QL ? QL : pw) / Bw, OL = Bw * (g - g * Yw / I) / yw, uR = yw * (ww < 0 ? 0 : ww > OL ? OL : ww) / Bw, Oeg = I - uR * I / g, Ueg = g - Yw * g / I;
  30095. i = "M 0,0 L ".concat(I, ",0 L ").concat(Oeg, ",").concat(uR, " L ").concat(Yw, ",").concat(uR, " L ").concat(Yw, ",").concat(Ueg, " L 0,").concat(g, " z");
  30096. break;
  30097. case "blockArc":
  30098. var UL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Nw = 180, Vw = 0, Mw = 1.9685039370078738, EL = 3.9370078740157477;
  30099. if (UL) {
  30100. var PL, Rw = HI(UL);
  30101. try {
  30102. for (Rw.s(); !(PL = Rw.n()).done; ) {
  30103. var fw = PL.value, mR = U(fw, ["attrs", "name"]);
  30104. mR === "adj1" ? Nw = parseInt(U(fw, ["attrs", "fmla"]).substring(4)) / 6e4 : mR === "adj2" ? Vw = parseInt(U(fw, ["attrs", "fmla"]).substring(4)) / 6e4 : mR === "adj3" && (Mw = parseInt(U(fw, ["attrs", "fmla"]).substring(4)) * Gg);
  30105. }
  30106. } catch (Mg) {
  30107. Rw.e(Mg);
  30108. } finally {
  30109. Rw.f();
  30110. }
  30111. }
  30112. var ZR, GR, Ib = 360, Sd = Nw < 0 ? 0 : Nw > Ib ? Ib : Nw, Hw = Vw < 0 ? 0 : Vw > Ib ? Ib : Vw, Eeg = Mw < 0 ? 0 : Mw > EL ? EL : Mw, wR = Hw - Sd, _L = wR > 0 ? wR : wR + Ib, Cb = Sd + _L, Peg = Hw + -_L, Xw = Sd * Math.PI / 180, Sw = Hw * Math.PI / 180, un = I / 2, mn = g / 2, Dw = I / 2, Kw = g / 2;
  30113. if (Sd > 90 && Sd < 270) {
  30114. var qL = un * Math.sin(Math.PI / 2 - Xw), $L = mn * Math.cos(Math.PI / 2 - Xw);
  30115. ZR = Dw - un * Math.cos(Math.atan($L / qL)), GR = Kw - mn * Math.sin(Math.atan($L / qL));
  30116. } else {
  30117. var gv = un * Math.sin(Xw), Iv = mn * Math.cos(Xw);
  30118. ZR = Dw + un * Math.cos(Math.atan(gv / Iv)), GR = Kw + mn * Math.sin(Math.atan(gv / Iv));
  30119. }
  30120. var pR, BR, Cv = Math.min(I, g) * Eeg / 7.874015748031495, tb = un - Cv, ib = mn - Cv;
  30121. if (Cb <= 450 && Cb > 270 || Cb >= 630 && Cb < 720) {
  30122. var tv = tb * Math.sin(Sw), iv = ib * Math.cos(Sw);
  30123. pR = Dw + tb * Math.cos(Math.atan(tv / iv)), BR = Kw + ib * Math.sin(Math.atan(tv / iv));
  30124. } else {
  30125. var ev = tb * Math.sin(Math.PI / 2 - Sw), Av = ib * Math.cos(Math.PI / 2 - Sw);
  30126. pR = Dw - tb * Math.cos(Math.atan(Av / ev)), BR = Kw - ib * Math.sin(Math.atan(Av / ev));
  30127. }
  30128. i = "M ".concat(ZR, ",").concat(GR, " ").concat(Vg(un, mn, un, mn, Sd, Cb, !1).replace("M", "L"), " L ").concat(pR, ",").concat(BR, " ").concat(Vg(un, mn, tb, ib, Hw, Peg, !1).replace("M", "L"), " z");
  30129. break;
  30130. case "bracePair":
  30131. var sv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Fw = 0.6561417322834645, lv = 1.9685039370078738;
  30132. sv && (Fw = parseInt(sv.substring(4)) * Gg);
  30133. var nv = g / 2, kw = 180, av = Fw < 0 ? 0 : Fw > lv ? lv : Fw, ov = Math.min(I, g), MC = ov * av / 7.874015748031495, zw = ov * av / 3.9370078740157477, WR = I - zw, cv = I - MC, yR = nv - MC, YR = nv + MC, NR = g - MC;
  30134. i = "M ".concat(zw, ",").concat(g, " ").concat(Vg(zw, NR, MC, MC, 90, kw, !1).replace("M", "L"), " L ").concat(MC, ",").concat(YR, " ").concat(Vg(0, YR, MC, MC, 0, -90, !1).replace("M", "L"), " ").concat(Vg(0, yR, MC, MC, 90, 0, !1).replace("M", "L"), " L ").concat(MC, ",").concat(MC, " ").concat(Vg(zw, MC, MC, MC, kw, 270, !1).replace("M", "L"), " M ").concat(WR, ",0 ").concat(Vg(WR, MC, MC, MC, 270, 360, !1).replace("M", "L"), " L ").concat(cv, ",").concat(yR, " ").concat(Vg(I, yR, MC, MC, kw, 90, !1).replace("M", "L"), " ").concat(Vg(I, YR, MC, MC, 270, kw, !1).replace("M", "L"), " L ").concat(cv, ",").concat(NR, " ").concat(Vg(WR, NR, MC, MC, 0, 90, !1).replace("M", "L"));
  30135. break;
  30136. case "leftBrace":
  30137. var dv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Jw = 0.6561417322834645, Lw = 3.9370078740157477, eb = 7.874015748031495;
  30138. if (dv) {
  30139. var rv, vw = HI(dv);
  30140. try {
  30141. for (vw.s(); !(rv = vw.n()).done; ) {
  30142. var VR = rv.value, hv = U(VR, ["attrs", "name"]);
  30143. hv === "adj1" ? Jw = parseInt(U(VR, ["attrs", "fmla"]).substring(4)) * Gg : hv === "adj2" && (Lw = parseInt(U(VR, ["attrs", "fmla"]).substring(4)) * Gg);
  30144. }
  30145. } catch (Mg) {
  30146. vw.e(Mg);
  30147. } finally {
  30148. vw.f();
  30149. }
  30150. }
  30151. var Tw = Lw < 0 ? 0 : Lw > eb ? eb : Lw, bv = Math.min(I, g), uv = eb - Tw, mv = (uv < Tw ? uv : Tw) / 2 * g / bv, Os = bv * (Jw < 0 ? 0 : Jw > mv ? mv : Jw) / eb, Zv = g * Tw / eb, _eg = Zv - Os, Gv = Zv + Os;
  30152. i = "M ".concat(I, ",").concat(g, " ").concat(Vg(I, g - Os, I / 2, Os, 90, 180, !1).replace("M", "L"), " L ").concat(I / 2, ",").concat(Gv, " ").concat(Vg(0, Gv, I / 2, Os, 0, -90, !1).replace("M", "L"), " ").concat(Vg(0, _eg, I / 2, Os, 90, 0, !1).replace("M", "L"), " L ").concat(I / 2, ",").concat(Os, " ").concat(Vg(I, Os, I / 2, Os, 180, 270, !1).replace("M", "L"));
  30153. break;
  30154. case "rightBrace":
  30155. var wv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), xw = 0.6561417322834645, jw = 3.9370078740157477, Ab = 7.874015748031495;
  30156. if (wv) {
  30157. var pv, Qw = HI(wv);
  30158. try {
  30159. for (Qw.s(); !(pv = Qw.n()).done; ) {
  30160. var MR = pv.value, Bv = U(MR, ["attrs", "name"]);
  30161. Bv === "adj1" ? xw = parseInt(U(MR, ["attrs", "fmla"]).substring(4)) * Gg : Bv === "adj2" && (jw = parseInt(U(MR, ["attrs", "fmla"]).substring(4)) * Gg);
  30162. }
  30163. } catch (Mg) {
  30164. Qw.e(Mg);
  30165. } finally {
  30166. Qw.f();
  30167. }
  30168. }
  30169. var Ow = jw < 0 ? 0 : jw > Ab ? Ab : jw, Wv = Math.min(I, g), yv = Ab - Ow, Yv = (yv < Ow ? yv : Ow) / 2 * g / Wv, Zn = Wv * (xw < 0 ? 0 : xw > Yv ? Yv : xw) / Ab, Nv = g * Ow / Ab, Vv = Nv - Zn, Mv = g - Zn;
  30170. i = "M 0,0 ".concat(Vg(0, Zn, I / 2, Zn, 270, 360, !1).replace("M", "L"), " L ").concat(I / 2, ",").concat(Vv, " ").concat(Vg(I, Vv, I / 2, Zn, 180, 90, !1).replace("M", "L"), " ").concat(Vg(I, Nv + Zn, I / 2, Zn, 270, 180, !1).replace("M", "L"), " L ").concat(I / 2, ",").concat(Mv, " ").concat(Vg(0, Mv, I / 2, Zn, 0, 90, !1).replace("M", "L"));
  30171. break;
  30172. case "bracketPair":
  30173. var Rv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Uw = 1.3123622047244095, fv = 3.9370078740157477;
  30174. Rv && (Uw = parseInt(Rv.substring(4)) * Gg);
  30175. var qeg = Uw < 0 ? 0 : Uw > fv ? fv : Uw, Fi = Math.min(I, g) * qeg / 7.874015748031495, Hv = I - Fi, Xv = g - Fi;
  30176. i = "".concat(Vg(Fi, Fi, Fi, Fi, 270, 180, !1), " ").concat(Vg(Fi, Xv, Fi, Fi, 180, 90, !1).replace("M", "L"), " ").concat(Vg(Hv, Fi, Fi, Fi, 270, 360, !1), " ").concat(Vg(Hv, Xv, Fi, Fi, 0, 90, !1).replace("M", "L"));
  30177. break;
  30178. case "leftBracket":
  30179. var Sv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Ew = 0.6561417322834645, Dv = 3.9370078740157477 * g / Math.min(I, g);
  30180. Sv && (Ew = parseInt(Sv.substring(4)) * Gg);
  30181. var $eg = Ew < 0 ? 0 : Ew > Dv ? Dv : Ew, aA = Math.min(I, g) * $eg / 7.874015748031495;
  30182. aA > I && (aA = I);
  30183. var gAg = g - aA;
  30184. i = "M ".concat(I, ",").concat(g, " ").concat(Vg(aA, gAg, aA, aA, 90, 180, !1).replace("M", "L"), " L 0,").concat(aA, " ").concat(Vg(aA, aA, aA, aA, 180, 270, !1).replace("M", "L"), " L ").concat(I, ",0");
  30185. break;
  30186. case "rightBracket":
  30187. var Kv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Pw = 0.6561417322834645, Fv = 3.9370078740157477 * g / Math.min(I, g);
  30188. Kv && (Pw = parseInt(Kv.substring(4)) * Gg);
  30189. var IAg = Pw < 0 ? 0 : Pw > Fv ? Fv : Pw, so = Math.min(I, g) * IAg / 7.874015748031495, CAg = g - so, kv = I - so;
  30190. i = "M 0,".concat(g, " ").concat(Vg(kv, CAg, so, so, 90, 0, !1).replace("M", "L"), " L ").concat(I, ",").concat(g / 2, " ").concat(Vg(kv, so, so, so, 360, 270, !1).replace("M", "L"), " L 0,0");
  30191. break;
  30192. case "moon":
  30193. var zv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Jv = 0.5;
  30194. zv && (Jv = parseInt(zv.substring(4)) / 1e5);
  30195. var _w = g / 2, tAg = (1 - Jv) * I;
  30196. i = "M ".concat(I, ",").concat(g, " ").concat(Vg(I, _w, I, _w, 90, 270, !1).replace("M", "L"), " ").concat(Vg(I, _w, tAg, _w, 270, 90, !1).replace("M", "L"), " z");
  30197. break;
  30198. case "corner":
  30199. var Lv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), qw = 3.9370078740157477, $w = 3.9370078740157477, gp = 7.874015748031495;
  30200. if (Lv) {
  30201. var vv, Ip = HI(Lv);
  30202. try {
  30203. for (Ip.s(); !(vv = Ip.n()).done; ) {
  30204. var RR = vv.value, Tv = U(RR, ["attrs", "name"]);
  30205. Tv === "adj1" ? qw = parseInt(U(RR, ["attrs", "fmla"]).substring(4)) * Gg : Tv === "adj2" && ($w = parseInt(U(RR, ["attrs", "fmla"]).substring(4)) * Gg);
  30206. }
  30207. } catch (Mg) {
  30208. Ip.e(Mg);
  30209. } finally {
  30210. Ip.f();
  30211. }
  30212. }
  30213. var Cp = Math.min(I, g), xv = gp * g / Cp, jv = gp * I / Cp, Qv = Cp * ($w < 0 ? 0 : $w > jv ? jv : $w) / gp, Ov = g - Cp * (qw < 0 ? 0 : qw > xv ? xv : qw) / gp;
  30214. i = "M 0,0 L ".concat(Qv, ",0 L ").concat(Qv, ",").concat(Ov, " L ").concat(I, ",").concat(Ov, " L ").concat(I, ",").concat(g, " L 0,").concat(g, " z");
  30215. break;
  30216. case "diagStripe":
  30217. var Uv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), tp = 3.9370078740157477, ip = 7.874015748031495;
  30218. Uv && (tp = parseInt(Uv.substring(4)) * Gg);
  30219. var Ev = tp < 0 ? 0 : tp > ip ? ip : tp, iAg = I * Ev / ip;
  30220. i = "M 0,".concat(g * Ev / ip, " L ").concat(iAg, ",0 L ").concat(I, ",0 L 0,").concat(g, " z");
  30221. break;
  30222. case "gear6":
  30223. case "gear9":
  30224. i = function(Mg, RI) {
  30225. for (var YC = 1.5 * Mg, QC = YC, OC = YC, zi = RI, UC = YC, Ct = Mg, Zt = 2 * Math.PI, Ht = Zt / (2 * zi), ee = 35 * Ht * 5e-3, Qt = 50 * Ht * 5e-3, Gt = Ht, Ot = !1, at = " M" + (QC + UC * Math.cos(Qt)) + " " + (OC + UC * Math.sin(Qt)); Gt <= Zt + Ht; Gt += Ht) Ot ? (at += " L" + (QC + Ct * Math.cos(Gt - ee)) + "," + (OC + Ct * Math.sin(Gt - ee)), at += " L" + (QC + UC * Math.cos(Gt + Qt)) + "," + (OC + UC * Math.sin(Gt + Qt))) : (at += " L" + (QC + UC * Math.cos(Gt - Qt)) + "," + (OC + UC * Math.sin(Gt - Qt)), at += " L" + (QC + Ct * Math.cos(Gt + ee)) + "," + (OC + Ct * Math.sin(Gt + ee))), Ot = !Ot;
  30226. return at + " ";
  30227. }(I, g / 3.5, parseInt(t.substring(4)));
  30228. break;
  30229. case "bentConnector3":
  30230. var Pv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), fR = 0.5;
  30231. Pv && (fR = parseInt(Pv.substring(4)) / 1e5), i = "M 0 0 L ".concat(fR * I, " 0 L ").concat(fR * I, " ").concat(g, " L ").concat(I, " ").concat(g);
  30232. break;
  30233. case "plus":
  30234. var _v = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), UA = 0.25;
  30235. _v && (UA = parseInt(_v.substring(4)) / 1e5);
  30236. var Gn = 1 - UA;
  30237. i = "M ".concat(UA * I, " 0 L ").concat(UA * I, " ").concat(UA * g, " L 0 ").concat(UA * g, " L 0 ").concat(Gn * g, " L ").concat(UA * I, " ").concat(Gn * g, " L ").concat(UA * I, " ").concat(g, " L ").concat(Gn * I, " ").concat(g, " L ").concat(Gn * I, " ").concat(Gn * g, " L ").concat(I, " ").concat(Gn * g, " L ").concat(I, " ").concat(UA * g, " L ").concat(Gn * I, " ").concat(UA * g, " L ").concat(Gn * I, " 0 Z");
  30238. break;
  30239. case "teardrop":
  30240. var qv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), sb = 7.874015748031495, $v = sb, gT = 15.74803149606299;
  30241. qv && (sb = parseInt(qv.substring(4)) * Gg);
  30242. var IT = sb < 0 ? 0 : sb > gT ? gT : sb, CT = Math.sqrt(2), eAg = CT * (I / 2) * IT / $v, AAg = CT * (g / 2) * IT / $v, tT = 45 * Math.PI / 180, sAg = eAg * Math.cos(tT), lAg = AAg * Math.cos(tT), iT = I / 2 + sAg, eT = g / 2 - lAg, nAg = (I / 2 + iT) / 2, aAg = (g / 2 + eT) / 2;
  30243. i = "".concat(Vg(I / 2, g / 2, I / 2, g / 2, 180, 270, !1), " Q ").concat(nAg, ",0 ").concat(iT, ",").concat(eT, " Q ").concat(I, ",").concat(aAg, " ").concat(I, ",").concat(g / 2, " ").concat(Vg(I / 2, g / 2, I / 2, g / 2, 0, 90, !1).replace("M", "L"), " ").concat(Vg(I / 2, g / 2, I / 2, g / 2, 90, 180, !1).replace("M", "L"), " z");
  30244. break;
  30245. case "plaque":
  30246. var AT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), ep = 1.3123622047244095, sT = 3.9370078740157477;
  30247. AT && (ep = parseInt(AT.substring(4)) * Gg);
  30248. var He = (ep < 0 ? 0 : ep > sT ? sT : ep) * Math.min(I, g) / 7.874015748031495, oAg = I - He, cAg = g - He;
  30249. i = "M 0,".concat(He, " ").concat(Vg(0, 0, He, He, 90, 0, !1).replace("M", "L"), " L ").concat(oAg, ",0 ").concat(Vg(I, 0, He, He, 180, 90, !1).replace("M", "L"), " L ").concat(I, ",").concat(cAg, " ").concat(Vg(I, g, He, He, 270, 180, !1).replace("M", "L"), " L ").concat(He, ",").concat(g, " ").concat(Vg(0, g, He, He, 0, -90, !1).replace("M", "L"), " z");
  30250. break;
  30251. case "sun":
  30252. var lT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Us = Gg, Ap = 25e3 * Us, nT = 12500 * Us, aT = 46875 * Us;
  30253. lT && (Ap = parseInt(lT.substring(4)) * Us);
  30254. var oT = Ap < nT ? nT : Ap > aT ? aT : Ap, HR = 5e4 * Us, xC = 1e5 * Us, sp = HR - oT, lp = 3 * (HR - 30274 * sp / 32768) / 4, cT = 3 * (HR - 12540 * sp / 32768) / 4, XR = lp + 3662 * Us, SR = cT + 36620 * Us, DR = cT + 12500 * Us, dT = xC - lp, rT = xC - XR, hT = xC - SR, bT = xC - DR, uT = 18436 * I / 21600, mT = 3163 * g / 21600, ZT = 3163 * I / 21600, GT = 18436 * g / 21600, wT = I * lp / xC, pT = I * XR / xC, BT = I * SR / xC, WT = I * DR / xC, yT = I * dT / xC, YT = I * rT / xC, NT = I * hT / xC, VT = I * bT / xC, dAg = I * oT / xC, rAg = I * sp / xC, hAg = g * sp / xC, MT = g * lp / xC, RT = g * XR / xC, fT = g * SR / xC, HT = g * DR / xC, XT = g * dT / xC, ST = g * rT / xC, DT = g * hT / xC, KT = g * bT / xC;
  30255. i = "M ".concat(I, ",").concat(g / 2, " L ").concat(yT, ",").concat(KT, " L ").concat(yT, ",").concat(HT, " z M ").concat(uT, ",").concat(mT, " L ").concat(YT, ",").concat(DT, " L ").concat(BT, ",").concat(RT, " z M ").concat(I / 2, ",0 L ").concat(VT, ",").concat(MT, " L ").concat(WT, ",").concat(MT, " z M ").concat(ZT, ",").concat(mT, " L ").concat(NT, ",").concat(RT, " L ").concat(pT, ",").concat(DT, " z M 0,").concat(g / 2, " L ").concat(wT, ",").concat(HT, " L ").concat(wT, ",").concat(KT, " z M ").concat(ZT, ",").concat(GT, " L ").concat(pT, ",").concat(fT, " L ").concat(NT, ",").concat(ST, " z M ").concat(I / 2, ",").concat(g, " L ").concat(WT, ",").concat(XT, " L ").concat(VT, ",").concat(XT, " z M ").concat(uT, ",").concat(GT, " L ").concat(BT, ",").concat(ST, " L ").concat(YT, ",").concat(fT, " z M ").concat(dAg, ",").concat(g / 2, " ").concat(Vg(I / 2, g / 2, rAg, hAg, 180, 540, !1).replace("M", "L"), " z");
  30256. break;
  30257. case "heart":
  30258. var FT = 49 * I / 48, kT = 10 * I / 48, bAg = I / 2 - FT, uAg = I / 2 - kT, mAg = I / 2 + kT, ZAg = I / 2 + FT, zT = -g / 3;
  30259. i = "M ".concat(I / 2, ",").concat(g / 4, " C ").concat(mAg, ",").concat(zT, " ").concat(ZAg, ",").concat(g / 4, " ").concat(I / 2, ",").concat(g, " C ").concat(bAg, ",").concat(g / 4, " ").concat(uAg, ",").concat(zT, " ").concat(I / 2, ",").concat(g / 4, " z");
  30260. break;
  30261. case "lightningBolt":
  30262. var GAg = 5022 * I / 21600, wAg = 11050 * I / 21600, pAg = 10012 * I / 21600, BAg = 14767 * I / 21600, WAg = 12222 * I / 21600, yAg = 12860 * I / 21600, YAg = 7602 * I / 21600, NAg = 16577 * I / 21600, VAg = 3890 * g / 21600, MAg = 6080 * g / 21600, RAg = 6797 * g / 21600, fAg = 12877 * g / 21600, HAg = 9705 * g / 21600, XAg = 12007 * g / 21600, SAg = 13987 * g / 21600, DAg = 8382 * g / 21600, KAg = 14915 * g / 21600;
  30263. i = "M ".concat(8472 * I / 21600, ",0 L ").concat(yAg, ",").concat(MAg, " L ").concat(wAg, ",").concat(RAg, " L ").concat(NAg, ",").concat(XAg, " L ").concat(BAg, ",").concat(fAg, " L ").concat(I, ",").concat(g, " L ").concat(pAg, ",").concat(KAg, " L ").concat(WAg, ",").concat(SAg, " L ").concat(GAg, ",").concat(HAg, " L ").concat(YAg, ",").concat(DAg, " L 0,").concat(VAg, " z");
  30264. break;
  30265. case "cube":
  30266. var JT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), KR = Gg, np = 25e3 * KR;
  30267. JT && (np = parseInt(JT.substring(4)) * KR);
  30268. var FR = 1e5 * KR, wn = Math.min(I, g) * (np < 0 ? 0 : np > FR ? FR : np) / FR, FAg = g - wn, lb = I - wn;
  30269. i = "M 0,".concat(wn, " L ").concat(wn, ",0 L ").concat(I, ",0 L ").concat(I, ",").concat(FAg, " L ").concat(lb, ",").concat(g, " L 0,").concat(g, " z M 0,").concat(wn, " L ").concat(lb, ",").concat(wn, " M ").concat(lb, ",").concat(wn, " L ").concat(I, ",0 M ").concat(lb, ",").concat(wn, " L ").concat(lb, ",").concat(g);
  30270. break;
  30271. case "bevel":
  30272. var LT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), kR = Gg, ap = 12500 * kR;
  30273. LT && (ap = parseInt(LT.substring(4)) * kR);
  30274. var vT = 5e4 * kR, EA = Math.min(I, g) * (ap < 0 ? 0 : ap > vT ? vT : ap) / 7.874015748031495, op = I - EA, cp = g - EA;
  30275. i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(EA, ",").concat(EA, " L ").concat(op, ",").concat(EA, " L ").concat(op, ",").concat(cp, " L ").concat(EA, ",").concat(cp, " z M 0,0 L ").concat(EA, ",").concat(EA, " M 0,").concat(g, " L ").concat(EA, ",").concat(cp, " M ").concat(I, ",0 L ").concat(op, ",").concat(EA, " M ").concat(I, ",").concat(g, " L ").concat(op, ",").concat(cp);
  30276. break;
  30277. case "foldedCorner":
  30278. var TT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), zR = Gg, dp = 16667 * zR;
  30279. TT && (dp = parseInt(TT.substring(4)) * zR);
  30280. var xT = 5e4 * zR, JR = Math.min(I, g) * (dp < 0 ? 0 : dp > xT ? xT : dp) / 7.874015748031495, jT = JR / 5, LR = I - JR, kAg = LR + jT, vR = g - JR, zAg = vR + jT;
  30281. i = "M ".concat(LR, ",").concat(g, " L ").concat(kAg, ",").concat(zAg, " L ").concat(I, ",").concat(vR, " L ").concat(LR, ",").concat(g, " L 0,").concat(g, " L 0,0 L ").concat(I, ",0 L ").concat(I, ",").concat(vR);
  30282. break;
  30283. case "cloud":
  30284. case "cloudCallout":
  30285. for (var QT = 3900 * I / 43200, OT = 14370 * g / 43200, JAg = 6753 * I / 43200, LAg = 9190 * g / 43200, UT = 5333 * I / 43200, vAg = 7267 * g / 43200, TAg = 4365 * I / 43200, ET = 5945 * g / 43200, xAg = 4857 * I / 43200, jAg = 6595 * g / 43200, QAg = 7273 * g / 43200, OAg = 6775 * I / 43200, UAg = 9220 * g / 43200, EAg = 5785 * I / 43200, PAg = 7867 * g / 43200, _Ag = 6752 * I / 43200, qAg = 9215 * g / 43200, $Ag = 7720 * I / 43200, gsg = 10543 * g / 43200, Isg = 4360 * I / 43200, Csg = 5918 * g / 43200, tsg = 4345 * I / 43200, isg = function(Mg, RI, YC, QC, OC, zi) {
  30286. return Vg(Mg - YC * Math.cos(OC * Math.PI / 180), RI - QC * Math.sin(OC * Math.PI / 180), YC, QC, OC, OC + zi, !1).replace("M", "L");
  30287. }, rp = "M ".concat(QT, ",").concat(OT), TR = [QT, OT], xR = 0, PT = [[JAg, LAg, -11429249 / 6e4, 7426832 / 6e4], [UT, vAg, -8646143 / 6e4, 5396714 / 6e4], [TAg, ET, -8748475 / 6e4, 5983381 / 6e4], [xAg, jAg, -7859164 / 6e4, 7034504 / 6e4], [UT, QAg, -4722533 / 6e4, 6541615 / 6e4], [OAg, UAg, -46.26725, 130.269], [EAg, PAg, 37501 / 6e4, 6842e3 / 6e4], [_Ag, qAg, 22.4516, 115.17255], [$Ag, gsg, 3974558 / 6e4, 4542661 / 6e4], [Isg, Csg, -16496525 / 6e4, 8804134 / 6e4], [tsg, ET, -246.8285, 152.51885]]; xR < PT.length; xR++) {
  30288. var esg = PT[xR], jR = isg.apply(void 0, [TR[0], TR[1]].concat(R9(esg)));
  30289. rp += jR;
  30290. var Asg = jR.lastIndexOf("L"), _T = jR.substring(Asg + 1).split(" ");
  30291. TR = [parseFloat(_T[0]), parseFloat(_T[1])];
  30292. }
  30293. if (rp += " z", t === "cloudCallout") {
  30294. var qT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), nb = Gg, hp = -20833 * nb, $T = 62500 * nb;
  30295. if (qT) {
  30296. var gx, bp = HI(qT);
  30297. try {
  30298. for (bp.s(); !(gx = bp.n()).done; ) {
  30299. var QR = gx.value, Ix = U(QR, ["attrs", "name"]);
  30300. Ix === "adj1" ? hp = parseInt(U(QR, ["attrs", "fmla"]).substring(4)) * nb : Ix === "adj2" && ($T = parseInt(U(QR, ["attrs", "fmla"]).substring(4)) * nb);
  30301. }
  30302. } catch (Mg) {
  30303. bp.e(Mg);
  30304. } finally {
  30305. bp.f();
  30306. }
  30307. }
  30308. var Cx = 1e5 * nb, ab = Math.min(I, g), ob = I / 2, cb = g / 2, OR = I * hp / Cx, UR = g * $T / Cx, up = ob + OR, mp = cb + UR, tx = cb * Math.cos(Math.atan(UR / OR)), ix = ob * Math.sin(Math.atan(UR / OR)), ex = ob * Math.cos(Math.atan(ix / tx)), Ax = cb * Math.sin(Math.atan(ix / tx)), Zp = (hp >= 0 ? ob + ex : ob - ex) - up, Gp = (hp >= 0 ? cb + Ax : cb - Ax) - mp, db = Math.sqrt(Zp * Zp + Gp * Gp), sx = (db - 6600 * ab / 21600) / 3, rb = 1800 * ab / 21600, lx = sx + rb, nx = lx * Gp / db + mp, ax = 4800 * ab / 21600 + 2 * sx, ox = ax * Gp / db + mp, wp = 1200 * ab / 21600, pp = 600 * ab / 21600, cx = lx * Zp / db + up + wp, dx = ax * Zp / db + up + rb;
  30309. rp += "".concat(Vg(up + pp - pp, mp, pp, pp, 0, 360, !0), " M ").concat(cx, ",").concat(nx, " ").concat(Vg(cx - wp, nx, wp, wp, 0, 360, !0).replace("M", "L"), " M ").concat(dx, ",").concat(ox, " ").concat(Vg(dx - rb, ox, rb, rb, 0, 360, !0).replace("M", "L"));
  30310. }
  30311. i = rp;
  30312. break;
  30313. case "smileyFace":
  30314. var rx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), ER = Gg, Bp = 4653 * ER;
  30315. rx && (Bp = parseInt(rx.substring(4)) * ER);
  30316. var Wp = 4653 * ER, yp = I / 2, PR = g / 2, hx = Bp < -Wp ? -Wp : Bp > Wp ? Wp : Bp, ssg = 16640 * I / 21600, bx = 16515 * g / 21600, ux = g * hx / 7.874015748031495, _R = bx - ux, mx = bx + ux + g * hx / 3.9370078740157477, Zx = 1125 * I / 21600, Gx = 1125 * g / 21600, wx = 7570 * g / 21600, lsg = 13135 * I / 21600, px = 4969 * I / 21699;
  30317. i = "".concat(Vg(6215 * I / 21600, wx, Zx, Gx, 0, 360, !0), " ").concat(Vg(lsg, wx, Zx, Gx, 0, 360, !0), " M ").concat(px, ",").concat(_R, " Q ").concat(yp, ",").concat(mx, " ").concat(ssg, ",").concat(_R, " Q ").concat(yp, ",").concat(mx, " ").concat(px, ",").concat(_R, " M 0,").concat(PR, " ").concat(Vg(yp, PR, yp, PR, 180, 540, !1).replace("M", "L"), " z");
  30318. break;
  30319. case "verticalScroll":
  30320. case "horizontalScroll":
  30321. var Bx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), qR = Gg, Yp = 12500 * qR;
  30322. Bx && (Yp = parseInt(Bx.substring(4)) * qR);
  30323. var Wx = 25e3 * qR, nsg = Math.min(I, g), hb = g, bb = I, GC = nsg * (Yp < 0 ? 0 : Yp > Wx ? Wx : Yp) / 7.874015748031495, BI = GC / 2, pn = GC / 4;
  30324. if (t === "verticalScroll") {
  30325. var Dd = GC + BI, asg = GC + GC, Np = bb - GC, yx = bb - BI, osg = Np - BI, $R = hb - GC, lo = hb - BI;
  30326. i = "M ".concat(GC, ",").concat($R, " L ").concat(GC, ",").concat(BI, " ").concat(Vg(Dd, BI, BI, BI, 180, 270, !1).replace("M", "L"), " L ").concat(yx, ",").concat(0, " ").concat(Vg(yx, BI, BI, BI, 270, 450, !1).replace("M", "L"), " L ").concat(Np, ",").concat(GC, " L ").concat(Np, ",").concat(lo, " ").concat(Vg(osg, lo, BI, BI, 0, 90, !1).replace("M", "L"), " L ").concat(BI, ",").concat(hb, " ").concat(Vg(BI, lo, BI, BI, 90, 270, !1).replace("M", "L"), " z M ").concat(Dd, ",").concat(0, " ").concat(Vg(Dd, BI, BI, BI, 270, 450, !1).replace("M", "L"), " ").concat(Vg(Dd, Dd / 2, pn, pn, 90, 270, !1).replace("M", "L"), " L ").concat(asg, ",").concat(BI, " M ").concat(Np, ",").concat(GC, " L ").concat(Dd, ",").concat(GC, " M ").concat(GC, ",").concat(lo, " ").concat(Vg(BI, lo, BI, BI, 0, 270, !1).replace("M", "L"), " ").concat(Vg(BI, (lo + $R) / 2, pn, pn, 270, 450, !1).replace("M", "L"), " z M ").concat(GC, ",").concat(lo, " L ").concat(GC, ",").concat($R);
  30327. } else if (t === "horizontalScroll") {
  30328. var no = GC + BI, csg = GC + GC, gf = hb - GC, Yx = hb - BI, Nx = gf - BI, Vp = bb - GC, Kd = bb - BI;
  30329. i = "M ".concat(0, ",").concat(no, " ").concat(Vg(BI, no, BI, BI, 180, 270, !1).replace("M", "L"), " L ").concat(Vp, ",").concat(GC, " L ").concat(Vp, ",").concat(BI, " ").concat(Vg(Kd, BI, BI, BI, 180, 360, !1).replace("M", "L"), " L ").concat(bb, ",").concat(Nx, " ").concat(Vg(Kd, Nx, BI, BI, 0, 90, !1).replace("M", "L"), " L ").concat(GC, ",").concat(gf, " L ").concat(GC, ",").concat(Yx, " ").concat(Vg(BI, Yx, BI, BI, 0, 180, !1).replace("M", "L"), " z M ").concat(Kd, ",").concat(GC, " ").concat(Vg(Kd, BI, BI, BI, 90, -180, !1).replace("M", "L"), " ").concat(Vg((Vp + Kd) / 2, BI, pn, pn, 180, 0, !1).replace("M", "L"), " z M ").concat(Kd, ",").concat(GC, " L ").concat(Vp, ",").concat(GC, " M ").concat(BI, ",").concat(csg, " L ").concat(BI, ",").concat(no, " ").concat(Vg(no / 2, no, pn, pn, 180, 360, !1).replace("M", "L"), " ").concat(Vg(BI, no, BI, BI, 0, 180, !1).replace("M", "L"), " M ").concat(GC, ",").concat(no, " L ").concat(GC, ",").concat(gf);
  30330. }
  30331. break;
  30332. case "wedgeEllipseCallout":
  30333. var Vx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Mp = Gg, Mx = -20833 * Mp, Rx = 62500 * Mp;
  30334. if (Vx) {
  30335. var fx, Rp = HI(Vx);
  30336. try {
  30337. for (Rp.s(); !(fx = Rp.n()).done; ) {
  30338. var If = fx.value, Hx = U(If, ["attrs", "name"]);
  30339. Hx === "adj1" ? Mx = parseInt(U(If, ["attrs", "fmla"]).substring(4)) * Mp : Hx === "adj2" && (Rx = parseInt(U(If, ["attrs", "fmla"]).substring(4)) * Mp);
  30340. }
  30341. } catch (Mg) {
  30342. Rp.e(Mg);
  30343. } finally {
  30344. Rp.f();
  30345. }
  30346. }
  30347. var Xx = 7.874015748031495, Sx = 11 * Math.PI / 180, ao = g / 2, oo = I / 2, Dx = I * Mx / Xx, Kx = g * Rx / Xx, dsg = oo + Dx, rsg = ao + Kx, Fx = Math.atan2(Kx * I, Dx * g), Cf = Fx + Sx, tf = Fx - Sx, hsg = oo * Math.cos(Cf), bsg = ao + ao * Math.sin(Cf), usg = oo + oo * Math.cos(tf), msg = ao + ao * Math.sin(tf);
  30348. i = "M ".concat(oo + hsg, ",").concat(bsg, " L ").concat(dsg, ",").concat(rsg, " L ").concat(usg, ",").concat(msg, " ").concat(Vg(oo, ao, oo, ao, 180 * tf / Math.PI, 180 * Cf / Math.PI, !0).replace("M", "L"));
  30349. break;
  30350. case "wedgeRectCallout":
  30351. var kx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), fp = Gg, zx = -20833 * fp, Jx = 62500 * fp;
  30352. if (kx) {
  30353. var Lx, Hp = HI(kx);
  30354. try {
  30355. for (Hp.s(); !(Lx = Hp.n()).done; ) {
  30356. var ef = Lx.value, vx = U(ef, ["attrs", "name"]);
  30357. vx === "adj1" ? zx = parseInt(U(ef, ["attrs", "fmla"]).substring(4)) * fp : vx === "adj2" && (Jx = parseInt(U(ef, ["attrs", "fmla"]).substring(4)) * fp);
  30358. }
  30359. } catch (Mg) {
  30360. Hp.e(Mg);
  30361. } finally {
  30362. Hp.f();
  30363. }
  30364. }
  30365. var Tx = 7.874015748031495, Bn = I * zx / Tx, Wn = g * Jx / Tx, Xp = I / 2 + Bn, Sp = g / 2 + Wn, Zsg = Bn * g / I, yn = Math.abs(Wn) - Math.abs(Zsg), ub = I * (Bn > 0 ? 7 : 2) / 12, xx = I * (Bn > 0 ? 10 : 5) / 12, mb = g * (Wn > 0 ? 7 : 2) / 12, jx = g * (Wn > 0 ? 10 : 5) / 12, Gsg = yn > 0 || Bn > 0 ? 0 : Xp, wsg = yn > 0 ? Wn > 0 ? ub : Xp : ub, psg = yn > 0 ? I : Bn > 0 ? Xp : I, Bsg = yn > 0 && Wn > 0 ? Xp : ub, Wsg = yn > 0 || Bn > 0 ? mb : Sp, ysg = yn > 0 ? Wn > 0 ? 0 : Sp : 0, Ysg = yn > 0 ? mb : Bn > 0 ? Sp : mb, Nsg = yn > 0 && Wn > 0 ? Sp : g;
  30366. i = "M 0,0 L ".concat(ub, ",0 L ").concat(wsg, ",").concat(ysg, " L ").concat(xx, ",0 L ").concat(I, ",0 L ").concat(I, ",").concat(mb, " L ").concat(psg, ",").concat(Ysg, " L ").concat(I, ",").concat(jx, " L ").concat(I, ",").concat(g, " L ").concat(xx, ",").concat(g, " L ").concat(Bsg, ",").concat(Nsg, " L ").concat(ub, ",").concat(g, " L 0,").concat(g, " L 0,").concat(jx, " L ").concat(Gsg, ",").concat(Wsg, " L 0,").concat(mb, " z");
  30367. break;
  30368. case "wedgeRoundRectCallout":
  30369. var Qx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Fd = Gg, Ox = -20833 * Fd, Ux = 62500 * Fd, Ex = 16667 * Fd;
  30370. if (Qx) {
  30371. var Px, Dp = HI(Qx);
  30372. try {
  30373. for (Dp.s(); !(Px = Dp.n()).done; ) {
  30374. var Kp = Px.value, Af = U(Kp, ["attrs", "name"]);
  30375. Af === "adj1" ? Ox = parseInt(U(Kp, ["attrs", "fmla"]).substring(4)) * Fd : Af === "adj2" ? Ux = parseInt(U(Kp, ["attrs", "fmla"]).substring(4)) * Fd : Af === "adj3" && (Ex = parseInt(U(Kp, ["attrs", "fmla"]).substring(4)) * Fd);
  30376. }
  30377. } catch (Mg) {
  30378. Dp.e(Mg);
  30379. } finally {
  30380. Dp.f();
  30381. }
  30382. }
  30383. var sf = 7.874015748031495, Vsg = Math.min(I, g), Yn = I * Ox / sf, Nn = g * Ux / sf, Fp = I / 2 + Yn, kp = g / 2 + Nn, Msg = Yn * g / I, Vn = Math.abs(Nn) - Math.abs(Msg), Zb = I * (Yn > 0 ? 7 : 2) / 12, _x = I * (Yn > 0 ? 10 : 5) / 12, Gb = g * (Nn > 0 ? 7 : 2) / 12, qx = g * (Nn > 0 ? 10 : 5) / 12, Rsg = Vn > 0 || Yn > 0 ? 0 : Fp, fsg = Vn > 0 ? Nn > 0 ? Zb : Fp : Zb, Hsg = Vn > 0 ? I : Yn > 0 ? Fp : I, Xsg = Vn > 0 && Nn > 0 ? Fp : Zb, Ssg = Vn > 0 || Yn > 0 ? Gb : kp, Dsg = Vn > 0 ? Nn > 0 ? 0 : kp : 0, Ksg = Vn > 0 ? Gb : Yn > 0 ? kp : Gb, Fsg = Vn > 0 && Nn > 0 ? kp : g, ni = Vsg * Ex / sf, lf = I - ni, nf = g - ni;
  30384. i = "M 0,".concat(ni, " ").concat(Vg(ni, ni, ni, ni, 180, 270, !1).replace("M", "L"), " L ").concat(Zb, ",0 L ").concat(fsg, ",").concat(Dsg, " L ").concat(_x, ",0 L ").concat(lf, ",0 ").concat(Vg(lf, ni, ni, ni, 270, 360, !1).replace("M", "L"), " L ").concat(I, ",").concat(Gb, " L ").concat(Hsg, ",").concat(Ksg, " L ").concat(I, ",").concat(qx, " L ").concat(I, ",").concat(nf, " ").concat(Vg(lf, nf, ni, ni, 0, 90, !1).replace("M", "L"), " L ").concat(_x, ",").concat(g, " L ").concat(Xsg, ",").concat(Fsg, " L ").concat(Zb, ",").concat(g, " L ").concat(ni, ",").concat(g, " ").concat(Vg(ni, nf, ni, ni, 90, 180, !1).replace("M", "L"), " L 0,").concat(qx, " L ").concat(Rsg, ",").concat(Ssg, " L 0,").concat(Gb, " z");
  30385. break;
  30386. case "accentBorderCallout1":
  30387. case "accentBorderCallout2":
  30388. case "accentBorderCallout3":
  30389. case "borderCallout1":
  30390. case "borderCallout2":
  30391. case "borderCallout3":
  30392. case "accentCallout1":
  30393. case "accentCallout2":
  30394. case "accentCallout3":
  30395. case "callout1":
  30396. case "callout2":
  30397. case "callout3":
  30398. var Mn = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), ZI = Gg, ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 1e5 * ZI, Ps = -16667 * ZI, wb = 112963 * ZI, pb = -8333 * ZI;
  30399. if (Mn) {
  30400. var $x, zp = HI(Mn);
  30401. try {
  30402. for (zp.s(); !($x = zp.n()).done; ) {
  30403. var _s = $x.value, Rn = U(_s, ["attrs", "name"]);
  30404. Rn === "adj1" ? ge = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj2" ? Ie = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj3" ? Ce = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj4" ? te = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj5" ? Es = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj6" ? Ps = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj7" ? wb = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj8" && (pb = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI);
  30405. }
  30406. } catch (Mg) {
  30407. zp.e(Mg);
  30408. } finally {
  30409. zp.f();
  30410. }
  30411. }
  30412. var Rt, Xe, Se, De, fn, Hn, Jp, Lp, _I = 1e5 * ZI, kd = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z");
  30413. switch (t) {
  30414. case "borderCallout1":
  30415. case "callout1":
  30416. Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 112500 * ZI, te = -38333 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De);
  30417. break;
  30418. case "borderCallout2":
  30419. case "callout2":
  30420. Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 112500 * ZI, Ps = -46667 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, Hn = g * Es / _I, fn = I * Ps / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " L ").concat(fn, ",").concat(Hn);
  30421. break;
  30422. case "borderCallout3":
  30423. case "callout3":
  30424. Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 1e5 * ZI, Ps = -16667 * ZI, wb = 112963 * ZI, pb = -8333 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, Hn = g * Es / _I, fn = I * Ps / _I, Lp = g * wb / _I, Jp = I * pb / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " L ").concat(fn, ",").concat(Hn, " L ").concat(Jp, ",").concat(Lp);
  30425. break;
  30426. case "accentBorderCallout1":
  30427. case "accentCallout1":
  30428. Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 112500 * ZI, te = -38333 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " M ").concat(Rt, ",0 L ").concat(Rt, ",").concat(g);
  30429. break;
  30430. case "accentBorderCallout2":
  30431. case "accentCallout2":
  30432. Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 112500 * ZI, Ps = -46667 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, Hn = g * Es / _I, fn = I * Ps / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " L ").concat(fn, ",").concat(Hn, " M ").concat(Rt, ",0 L ").concat(Rt, ",").concat(g);
  30433. break;
  30434. case "accentBorderCallout3":
  30435. case "accentCallout3":
  30436. Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 1e5 * ZI, Ps = -16667 * ZI, wb = 112963 * ZI, pb = -8333 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, Hn = g * Es / _I, fn = I * Ps / _I, Lp = g * wb / _I, Jp = I * pb / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " L ").concat(fn, ",").concat(Hn, " L ").concat(Jp, ",").concat(Lp, " M ").concat(Rt, ",0 L ").concat(Rt, ",").concat(g);
  30437. }
  30438. break;
  30439. case "leftRightRibbon":
  30440. var gj = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), qs = Gg, vp = 5e4 * qs, Tp = 5e4 * qs, xp = 16667 * qs;
  30441. if (gj) {
  30442. var Ij, jp = HI(gj);
  30443. try {
  30444. for (jp.s(); !(Ij = jp.n()).done; ) {
  30445. var Qp = Ij.value, af = U(Qp, ["attrs", "name"]);
  30446. af === "adj1" ? vp = parseInt(U(Qp, ["attrs", "fmla"]).substring(4)) * qs : af === "adj2" ? Tp = parseInt(U(Qp, ["attrs", "fmla"]).substring(4)) * qs : af === "adj3" && (xp = parseInt(U(Qp, ["attrs", "fmla"]).substring(4)) * qs);
  30447. }
  30448. } catch (Mg) {
  30449. jp.e(Mg);
  30450. } finally {
  30451. jp.f();
  30452. }
  30453. }
  30454. var Cj = 33333 * qs, of = 1e5 * qs, tj = 2e5 * qs, cf = Math.min(I, g), Xn = I / 2, ij = g / 2, df = xp < 0 ? 0 : xp > Cj ? Cj : xp, ej = of - df, Aj = of * (Xn - I / 32) / cf, Bb = cf * (Tp < 0 ? 0 : Tp > Aj ? Aj : Tp) / of, Op = I - Bb, rf = g * (vp < 0 ? 0 : vp > ej ? ej : vp) / tj, sj = g * df / -tj, Sn = ij + sj - rf, hf = ij + rf - sj, bf = Sn + rf, ksg = g - bf, zd = 2 * bf, uf = g - (zd - Sn), Jd = df * cf / 31.49606299212598, mf = Xn - I / 32, lj = Xn + I / 32, nj = Sn + Jd, aj = uf - Jd;
  30455. i = "M 0,".concat(bf, " L ").concat(Bb, ",0 L ").concat(Bb, ",").concat(Sn, " L ").concat(Xn, ",").concat(Sn, " ").concat(Vg(Xn, nj, I / 32, Jd, 270, 450, !1).replace("M", "L"), " ").concat(Vg(Xn, aj, I / 32, Jd, 270, 90, !1).replace("M", "L"), " L ").concat(Op, ",").concat(uf, " L ").concat(Op, ",").concat(g - zd, " L ").concat(I, ",").concat(ksg, " L ").concat(Op, ",").concat(g, " L ").concat(Op, ",").concat(hf, " L ").concat(Xn, ",").concat(hf, " ").concat(Vg(Xn, hf - Jd, I / 32, Jd, 90, 180, !1).replace("M", "L"), " L ").concat(mf, ",").concat(zd - Sn, " L ").concat(Bb, ",").concat(zd - Sn, " L ").concat(Bb, ",").concat(zd, " z M ").concat(lj, ",").concat(nj, " L ").concat(lj, ",").concat(uf, " M ").concat(mf, ",").concat(aj, " L ").concat(mf, ",").concat(zd - Sn);
  30456. break;
  30457. case "ribbon":
  30458. case "ribbon2":
  30459. var oj = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Up = 1.3123622047244095, Ep = 3.9370078740157477;
  30460. if (oj) {
  30461. var cj, Pp = HI(oj);
  30462. try {
  30463. for (Pp.s(); !(cj = Pp.n()).done; ) {
  30464. var Zf = cj.value, dj = U(Zf, ["attrs", "name"]);
  30465. dj === "adj1" ? Up = parseInt(U(Zf, ["attrs", "fmla"]).substring(4)) * Gg : dj === "adj2" && (Ep = parseInt(U(Zf, ["attrs", "fmla"]).substring(4)) * Gg);
  30466. }
  30467. } catch (Mg) {
  30468. Pp.e(Mg);
  30469. } finally {
  30470. Pp.f();
  30471. }
  30472. }
  30473. var rj = 1.9685039370078738, hj = 2.6246456692913385, bj = 5.905511811023621, uj = 7.874015748031495, Gf = 15.74803149606299, mj = I / 2, PA = g, Wb = I, yb = I / 8, ai = I / 32, Yb = Up < 0 ? 0 : Up > hj ? hj : Up, Zj = Wb - yb, Gj = I * (Ep < rj ? rj : Ep > bj ? bj : Ep) / Gf, $s = mj - Gj, gl = mj + Gj, co = $s + ai, ro = gl - ai, Nb = $s + yb, Vb = gl - yb, _p = Nb - ai, qp = Vb + ai, jC = g * Yb / 31.49606299212598;
  30474. if (t === "ribbon2") {
  30475. var wf = PA - g * Yb / Gf, wj = g * Yb / uj, pf = PA - wj, ho = 0 + wj, pj = (ho + PA) / 2, $p = PA - jC, gB = wf - jC;
  30476. i = "M ".concat(0, ",").concat(PA, " L ").concat(yb, ",").concat(pj, " L ").concat(0, ",").concat(ho, " L ").concat($s, ",").concat(ho, " L ").concat($s, ",").concat(jC, " ").concat(Vg(co, jC, ai, jC, 180, 270, !1).replace("M", "L"), " L ").concat(ro, ",").concat(0, " ").concat(Vg(ro, jC, ai, jC, 270, 360, !1).replace("M", "L"), " L ").concat(gl, ",").concat(ho, " L ").concat(Wb, ",").concat(ho, " L ").concat(Zj, ",").concat(pj, " L ").concat(Wb, ",").concat(PA, " L ").concat(qp, ",").concat(PA, " ").concat(Vg(qp, $p, ai, jC, 90, 270, !1).replace("M", "L"), " L ").concat(ro, ",").concat(wf, " ").concat(Vg(ro, gB, ai, jC, 90, -90, !1).replace("M", "L"), " L ").concat(co, ",").concat(pf, " ").concat(Vg(co, gB, ai, jC, 270, 90, !1).replace("M", "L"), " L ").concat(_p, ",").concat(wf, " ").concat(Vg(_p, $p, ai, jC, 270, 450, !1).replace("M", "L"), " z M ").concat(Nb, ",").concat(pf, " L ").concat(Nb, ",").concat($p, " M ").concat(Vb, ",").concat($p, " L ").concat(Vb, ",").concat(pf, " M ").concat($s, ",").concat(gB, " L ").concat($s, ",").concat(ho, " M ").concat(gl, ",").concat(ho, " L ").concat(gl, ",").concat(gB);
  30477. } else if (t === "ribbon") {
  30478. var Bj = g * Yb / Gf, Mb = g * Yb / uj, bo = PA - Mb, Wj = bo / 2, Bf = PA - jC, IB = Mb - jC;
  30479. i = "M ".concat(0, ",").concat(0, " L ").concat(_p, ",").concat(0, " ").concat(Vg(_p, jC, ai, jC, 270, 450, !1).replace("M", "L"), " L ").concat(co, ",").concat(Bj, " ").concat(Vg(co, IB, ai, jC, 270, 90, !1).replace("M", "L"), " L ").concat(ro, ",").concat(Mb, " ").concat(Vg(ro, IB, ai, jC, 90, -90, !1).replace("M", "L"), " L ").concat(qp, ",").concat(Bj, " ").concat(Vg(qp, jC, ai, jC, 90, 270, !1).replace("M", "L"), " L ").concat(Wb, ",").concat(0, " L ").concat(Zj, ",").concat(Wj, " L ").concat(Wb, ",").concat(bo, " L ").concat(gl, ",").concat(bo, " L ").concat(gl, ",").concat(Bf, " ").concat(Vg(ro, Bf, ai, jC, 0, 90, !1).replace("M", "L"), " L ").concat(co, ",").concat(PA, " ").concat(Vg(co, Bf, ai, jC, 90, 180, !1).replace("M", "L"), " L ").concat($s, ",").concat(bo, " L ").concat(0, ",").concat(bo, " L ").concat(yb, ",").concat(Wj, " z M ").concat(Nb, ",").concat(jC, " L ").concat(Nb, ",").concat(Mb, " M ").concat(Vb, ",").concat(Mb, " L ").concat(Vb, ",").concat(jC, " M ").concat($s, ",").concat(bo, " L ").concat($s, ",").concat(IB, " M ").concat(gl, ",").concat(IB, " L ").concat(gl, ",").concat(bo);
  30480. }
  30481. break;
  30482. case "doubleWave":
  30483. case "wave":
  30484. var yj = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), uo = t === "doubleWave" ? 0.49212598425196846 : 0.9842519685039369, mo = 0;
  30485. if (yj) {
  30486. var Yj, CB = HI(yj);
  30487. try {
  30488. for (CB.s(); !(Yj = CB.n()).done; ) {
  30489. var Wf = Yj.value, Nj = U(Wf, ["attrs", "name"]);
  30490. Nj === "adj1" ? uo = parseInt(U(Wf, ["attrs", "fmla"]).substring(4)) * Gg : Nj === "adj2" && (mo = parseInt(U(Wf, ["attrs", "fmla"]).substring(4)) * Gg);
  30491. }
  30492. } catch (Mg) {
  30493. CB.e(Mg);
  30494. } finally {
  30495. CB.f();
  30496. }
  30497. }
  30498. var tB = -0.7874015748031495, Vj = 3.9370078740157477, Ld = 7.874015748031495, Mj = g, iB = I;
  30499. if (t === "doubleWave") {
  30500. var Rj = 0.9842519685039369, Zo = g * (uo < 0 ? 0 : uo > Rj ? Rj : uo) / Ld, eB = 10 * Zo / 3, fj = Zo - eB, Hj = Zo + eB, Rb = Mj - Zo, Xj = Rb - eB, Sj = Rb + eB, AB = I * (mo < tB ? tB : mo > Ld ? Ld : mo) / Vj, sB = AB > 0 ? 0 : AB, lB = 0 - sB, Dj = AB > 0 ? AB : 0, fb = iB - Dj, nB = (sB + fb) / 6, zsg = lB + nB, Kj = (sB + fb) / 3, Jsg = lB + Kj, Fj = (lB + fb) / 2, kj = Fj + nB, Lsg = (kj + fb) / 2, aB = 0 + Dj, yf = iB + sB, vsg = aB + nB, Tsg = aB + Kj, zj = (aB + yf) / 2, Jj = zj + nB, xsg = (Jj + yf) / 2;
  30501. i = "M ".concat(lB, ",").concat(Zo, " C ").concat(zsg, ",").concat(fj, " ").concat(Jsg, ",").concat(Hj, " ").concat(Fj, ",").concat(Zo, " C ").concat(kj, ",").concat(fj, " ").concat(Lsg, ",").concat(Hj, " ").concat(fb, ",").concat(Zo, " L ").concat(yf, ",").concat(Rb, " C ").concat(xsg, ",").concat(Sj, " ").concat(Jj, ",").concat(Xj, " ").concat(zj, ",").concat(Rb, " C ").concat(Tsg, ",").concat(Sj, " ").concat(vsg, ",").concat(Xj, " ").concat(aB, ",").concat(Rb, " z");
  30502. } else if (t === "wave") {
  30503. var Lj = 1.574803149606299, vd = g * (uo < 0 ? 0 : uo > Lj ? Lj : uo) / Ld, oB = 10 * vd / 3, jsg = vd - oB, Qsg = vd + oB, cB = Mj - vd, Osg = cB - oB, Usg = cB + oB, dB = I * (mo < tB ? tB : mo > Ld ? Ld : mo) / Vj, Yf = dB > 0 ? 0 : dB, vj = 0 - Yf, Tj = dB > 0 ? dB : 0, Nf = iB - Tj, xj = (Yf + Nf) / 3, jj = vj + xj, Esg = (jj + Nf) / 2, Qj = 0 + Tj, Oj = iB + Yf, Uj = Qj + xj, Psg = (Uj + Oj) / 2;
  30504. i = "M ".concat(vj, ",").concat(vd, " C ").concat(jj, ",").concat(jsg, " ").concat(Esg, ",").concat(Qsg, " ").concat(Nf, ",").concat(vd, " L ").concat(Oj, ",").concat(cB, " C ").concat(Psg, ",").concat(Usg, " ").concat(Uj, ",").concat(Osg, " ").concat(Qj, ",").concat(cB, " z");
  30505. }
  30506. break;
  30507. case "ellipseRibbon":
  30508. case "ellipseRibbon2":
  30509. var Ej = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), rB = 1.9685039370078738, hB = 3.9370078740157477, bB = 0.9842519685039369;
  30510. if (Ej) {
  30511. var Pj, uB = HI(Ej);
  30512. try {
  30513. for (uB.s(); !(Pj = uB.n()).done; ) {
  30514. var mB = Pj.value, Vf = U(mB, ["attrs", "name"]);
  30515. Vf === "adj1" ? rB = parseInt(U(mB, ["attrs", "fmla"]).substring(4)) * Gg : Vf === "adj2" ? hB = parseInt(U(mB, ["attrs", "fmla"]).substring(4)) * Gg : Vf === "adj3" && (bB = parseInt(U(mB, ["attrs", "fmla"]).substring(4)) * Gg);
  30516. }
  30517. } catch (Mg) {
  30518. uB.e(Mg);
  30519. } finally {
  30520. uB.f();
  30521. }
  30522. }
  30523. var _j = 1.9685039370078738, qj = 5.905511811023621, Hb = 7.874015748031495, Xb = I / 2, ki = g, Il = I, ZB = I / 8, Td = rB < 0 ? 0 : rB > Hb ? Hb : rB, $j = Hb - Td, gQ = Td - $j / 2 > 0 ? Td - $j / 2 : 0, oi = Xb - I * (hB < _j ? _j : hB > qj ? qj : hB) / 15.74803149606299, oA = oi + ZB, xd = Il - oA, _A = Il - oi, IQ = Il - ZB, Go = g * (bB < gQ ? gQ : bB > Td ? Td : bB) / Hb, jd = 4 * Go / I, CQ = oA - oA * oA / I, Sb = oA / 2, tQ = Il - Sb, GB = g * Td / Hb, Dn = GB - Go, wB = jd * (oi - oi * oi / I), Ke = ki - GB, iQ = 14 * Go / 16, pB = oi / 2, eQ = jd * pB, AQ = Il - pB;
  30524. if (t === "ellipseRibbon") {
  30525. var Db = jd * CQ, sQ = jd * Sb, Qd = wB + Dn, lQ = Go + Dn - Qd + Go + Dn, nQ = (iQ + Ke) / 2, BB = wB + Ke, aQ = Qd + Ke, oQ = eQ + Ke, _sg = lQ + Ke, cQ = Db + Dn;
  30526. i = "M ".concat(0, ",").concat(0, " Q ").concat(Sb, ",").concat(sQ, " ").concat(oA, ",").concat(Db, " L ").concat(oi, ",").concat(Qd, " Q ").concat(Xb, ",").concat(lQ, " ").concat(_A, ",").concat(Qd, " L ").concat(xd, ",").concat(Db, " Q ").concat(tQ, ",").concat(sQ, " ").concat(Il, ",").concat(0, " L ").concat(IQ, ",").concat(nQ, " L ").concat(Il, ",").concat(Ke, " Q ").concat(AQ, ",").concat(oQ, " ").concat(_A, ",").concat(BB, " L ").concat(_A, ",").concat(aQ, " Q ").concat(Xb, ",").concat(_sg, " ").concat(oi, ",").concat(aQ, " L ").concat(oi, ",").concat(BB, " Q ").concat(pB, ",").concat(oQ, " ").concat(0, ",").concat(Ke, " L ").concat(ZB, ",").concat(nQ, " z M ").concat(oi, ",").concat(BB, " L ").concat(oi, ",").concat(Qd, " M ").concat(_A, ",").concat(Qd, " L ").concat(_A, ",").concat(BB, " M ").concat(oA, ",").concat(Db, " L ").concat(oA, ",").concat(cQ, " M ").concat(xd, ",").concat(cQ, " L ").concat(xd, ",").concat(Db);
  30527. } else if (t === "ellipseRibbon2") {
  30528. var dQ = jd * CQ, WB = ki - dQ, rQ = ki - jd * Sb, Mf = wB + Dn, yB = ki - Mf, hQ = Go + Dn - Mf + Go + Dn, qsg = ki - hQ, bQ = ki - (iQ + Ke) / 2, YB = ki - (wB + Ke), uQ = ki - (Mf + Ke), mQ = ki - (eQ + Ke), $sg = ki - (hQ + Ke), ZQ = ki - (dQ + Dn);
  30529. i = "M ".concat(0, ",").concat(ki, " L ").concat(ZB, ",").concat(bQ, " L ").concat(0, ",").concat(GB, " Q ").concat(pB, ",").concat(mQ, " ").concat(oi, ",").concat(YB, " L ").concat(oi, ",").concat(uQ, " Q ").concat(Xb, ",").concat($sg, " ").concat(_A, ",").concat(uQ, " L ").concat(_A, ",").concat(YB, " Q ").concat(AQ, ",").concat(mQ, " ").concat(Il, ",").concat(GB, " L ").concat(IQ, ",").concat(bQ, " L ").concat(Il, ",").concat(ki, " Q ").concat(tQ, ",").concat(rQ, " ").concat(xd, ",").concat(WB, " L ").concat(_A, ",").concat(yB, " Q ").concat(Xb, ",").concat(qsg, " ").concat(oi, ",").concat(yB, " L ").concat(oA, ",").concat(WB, " Q ").concat(Sb, ",").concat(rQ, " ").concat(0, ",").concat(ki, " z M ").concat(oi, ",").concat(yB, " L ").concat(oi, ",").concat(YB, " M ").concat(_A, ",").concat(YB, " L ").concat(_A, ",").concat(yB, " M ").concat(oA, ",").concat(ZQ, " L ").concat(oA, ",").concat(WB, " M ").concat(xd, ",").concat(WB, " L ").concat(xd, ",").concat(ZQ);
  30530. }
  30531. break;
  30532. case "line":
  30533. case "straightConnector1":
  30534. case "bentConnector4":
  30535. case "bentConnector5":
  30536. case "curvedConnector2":
  30537. case "curvedConnector3":
  30538. case "curvedConnector4":
  30539. case "curvedConnector5":
  30540. i = "M 0 0 L ".concat(I, " ").concat(g);
  30541. break;
  30542. case "rightArrow":
  30543. var GQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Kb = 0.25, Fb = 0.5;
  30544. if (GQ) {
  30545. var wQ, glg = I / g, NB = HI(GQ);
  30546. try {
  30547. for (NB.s(); !(wQ = NB.n()).done; ) {
  30548. var Rf = wQ.value, pQ = U(Rf, ["attrs", "name"]);
  30549. pQ === "adj1" ? Kb = 0.5 - parseInt(U(Rf, ["attrs", "fmla"]).substring(4)) / 2e5 : pQ === "adj2" && (Fb = 1 - parseInt(U(Rf, ["attrs", "fmla"]).substring(4)) / 1e5 / glg);
  30550. }
  30551. } catch (Mg) {
  30552. NB.e(Mg);
  30553. } finally {
  30554. NB.f();
  30555. }
  30556. }
  30557. i = "M ".concat(I, " ").concat(g / 2, " L ").concat(Fb * I, " 0 L ").concat(Fb * I, " ").concat(Kb * g, " L 0 ").concat(Kb * g, " L 0 ").concat((1 - Kb) * g, " L ").concat(Fb * I, " ").concat((1 - Kb) * g, " L ").concat(Fb * I, " ").concat(g, " Z");
  30558. break;
  30559. case "leftArrow":
  30560. var BQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), kb = 0.25, zb = 0.5;
  30561. if (BQ) {
  30562. var WQ, Ilg = I / g, VB = HI(BQ);
  30563. try {
  30564. for (VB.s(); !(WQ = VB.n()).done; ) {
  30565. var ff = WQ.value, yQ = U(ff, ["attrs", "name"]);
  30566. yQ === "adj1" ? kb = 0.5 - parseInt(U(ff, ["attrs", "fmla"]).substring(4)) / 2e5 : yQ === "adj2" && (zb = parseInt(U(ff, ["attrs", "fmla"]).substring(4)) / 1e5 / Ilg);
  30567. }
  30568. } catch (Mg) {
  30569. VB.e(Mg);
  30570. } finally {
  30571. VB.f();
  30572. }
  30573. }
  30574. i = "M 0 ".concat(g / 2, " L ").concat(zb * I, " ").concat(g, " L ").concat(zb * I, " ").concat((1 - kb) * g, " L ").concat(I, " ").concat((1 - kb) * g, " L ").concat(I, " ").concat(kb * g, " L ").concat(zb * I, " ").concat(kb * g, " L ").concat(zb * I, " 0 Z");
  30575. break;
  30576. case "downArrow":
  30577. case "flowChartOffpageConnector":
  30578. var YQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Od = 0.25, Ud = 0.5;
  30579. if (YQ) {
  30580. var NQ, Clg = g / I, MB = HI(YQ);
  30581. try {
  30582. for (MB.s(); !(NQ = MB.n()).done; ) {
  30583. var Hf = NQ.value, VQ = U(Hf, ["attrs", "name"]);
  30584. VQ === "adj1" ? Od = parseInt(U(Hf, ["attrs", "fmla"]).substring(4)) / 2e5 : VQ === "adj2" && (Ud = parseInt(U(Hf, ["attrs", "fmla"]).substring(4)) / 1e5 / Clg);
  30585. }
  30586. } catch (Mg) {
  30587. MB.e(Mg);
  30588. } finally {
  30589. MB.f();
  30590. }
  30591. }
  30592. t === "flowChartOffpageConnector" && (Od = 0.5, Ud = 0.212), i = "M ".concat((0.5 - Od) * I, " 0 L ").concat((0.5 - Od) * I, " ").concat((1 - Ud) * g, " L 0 ").concat((1 - Ud) * g, " L ").concat(I / 2, " ").concat(g, " L ").concat(I, " ").concat((1 - Ud) * g, " L ").concat((0.5 + Od) * I, " ").concat((1 - Ud) * g, " L ").concat((0.5 + Od) * I, " 0 Z");
  30593. break;
  30594. case "upArrow":
  30595. var MQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Jb = 0.25, Lb = 0.5;
  30596. if (MQ) {
  30597. var RQ, tlg = g / I, RB = HI(MQ);
  30598. try {
  30599. for (RB.s(); !(RQ = RB.n()).done; ) {
  30600. var Xf = RQ.value, fQ = U(Xf, ["attrs", "name"]);
  30601. fQ === "adj1" ? Jb = parseInt(U(Xf, ["attrs", "fmla"]).substring(4)) / 2e5 : fQ === "adj2" && (Lb = parseInt(U(Xf, ["attrs", "fmla"]).substring(4)) / 1e5 / tlg);
  30602. }
  30603. } catch (Mg) {
  30604. RB.e(Mg);
  30605. } finally {
  30606. RB.f();
  30607. }
  30608. }
  30609. i = "M ".concat(I / 2, " 0 L 0 ").concat(Lb * g, " L ").concat((0.5 - Jb) * I, " ").concat(Lb * g, " L ").concat((0.5 - Jb) * I, " ").concat(g, " L ").concat((0.5 + Jb) * I, " ").concat(g, " L ").concat((0.5 + Jb) * I, " ").concat(Lb * g, " L ").concat(I, " ").concat(Lb * g, " Z");
  30610. break;
  30611. case "leftRightArrow":
  30612. var HQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), vb = 0.25, Cl = 0.25;
  30613. if (HQ) {
  30614. var XQ, ilg = I / g, fB = HI(HQ);
  30615. try {
  30616. for (fB.s(); !(XQ = fB.n()).done; ) {
  30617. var Sf = XQ.value, SQ = U(Sf, ["attrs", "name"]);
  30618. SQ === "adj1" ? vb = 0.5 - parseInt(U(Sf, ["attrs", "fmla"]).substring(4)) / 2e5 : SQ === "adj2" && (Cl = parseInt(U(Sf, ["attrs", "fmla"]).substring(4)) / 1e5 / ilg);
  30619. }
  30620. } catch (Mg) {
  30621. fB.e(Mg);
  30622. } finally {
  30623. fB.f();
  30624. }
  30625. }
  30626. i = "M 0 ".concat(g / 2, " L ").concat(Cl * I, " ").concat(g, " L ").concat(Cl * I, " ").concat((1 - vb) * g, " L ").concat((1 - Cl) * I, " ").concat((1 - vb) * g, " L ").concat((1 - Cl) * I, " ").concat(g, " L ").concat(I, " ").concat(g / 2, " L ").concat((1 - Cl) * I, " 0 L ").concat((1 - Cl) * I, " ").concat(vb * g, " L ").concat(Cl * I, " ").concat(vb * g, " L ").concat(Cl * I, " 0 Z");
  30627. break;
  30628. case "upDownArrow":
  30629. var DQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Tb = 0.25, tl = 0.25;
  30630. if (DQ) {
  30631. var KQ, elg = g / I, HB = HI(DQ);
  30632. try {
  30633. for (HB.s(); !(KQ = HB.n()).done; ) {
  30634. var Df = KQ.value, FQ = U(Df, ["attrs", "name"]);
  30635. FQ === "adj1" ? Tb = 0.5 - parseInt(U(Df, ["attrs", "fmla"]).substring(4)) / 2e5 : FQ === "adj2" && (tl = parseInt(U(Df, ["attrs", "fmla"]).substring(4)) / 1e5 / elg);
  30636. }
  30637. } catch (Mg) {
  30638. HB.e(Mg);
  30639. } finally {
  30640. HB.f();
  30641. }
  30642. }
  30643. i = "M ".concat(I / 2, " 0 L 0 ").concat(tl * g, " L ").concat(Tb * I, " ").concat(tl * g, " L ").concat(Tb * I, " ").concat((1 - tl) * g, " L 0 ").concat((1 - tl) * g, " L ").concat(I / 2, " ").concat(g, " L ").concat(I, " ").concat((1 - tl) * g, " L ").concat((1 - Tb) * I, " ").concat((1 - tl) * g, " L ").concat((1 - Tb) * I, " ").concat(tl * g, " L ").concat(I, " ").concat(tl * g, " Z");
  30644. break;
  30645. case "quadArrow":
  30646. var kQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), XB = 1.7716535433070866, SB = 1.7716535433070866, DB = 1.7716535433070866, zQ = 3.9370078740157477, Kf = 7.874015748031495;
  30647. if (kQ) {
  30648. var JQ, KB = HI(kQ);
  30649. try {
  30650. for (KB.s(); !(JQ = KB.n()).done; ) {
  30651. var FB = JQ.value, Ff = U(FB, ["attrs", "name"]);
  30652. Ff === "adj1" ? XB = parseInt(U(FB, ["attrs", "fmla"]).substring(4)) * Gg : Ff === "adj2" ? SB = parseInt(U(FB, ["attrs", "fmla"]).substring(4)) * Gg : Ff === "adj3" && (DB = parseInt(U(FB, ["attrs", "fmla"]).substring(4)) * Gg);
  30653. }
  30654. } catch (Mg) {
  30655. KB.e(Mg);
  30656. } finally {
  30657. KB.f();
  30658. }
  30659. }
  30660. var Ed = g / 2, Pd = I / 2, kf = Math.min(I, g), LQ = SB < 0 ? 0 : SB > zQ ? zQ : SB, zf = 2 * LQ, vQ = (Kf - zf) / 2, qA = kf * (DB < 0 ? 0 : DB > vQ ? vQ : DB) / Kf, kB = kf * LQ / Kf, TQ = Pd - kB, xQ = Pd + kB, zB = kf * (XB < 0 ? 0 : XB > zf ? zf : XB) / 15.74803149606299, JB = Pd - zB, LB = Pd + zB, vB = I - qA, jQ = Ed - kB, QQ = Ed + kB, TB = Ed - zB, xB = Ed + zB, jB = g - qA;
  30661. i = "M 0,".concat(Ed, " L ").concat(qA, ",").concat(jQ, " L ").concat(qA, ",").concat(TB, " L ").concat(JB, ",").concat(TB, " L ").concat(JB, ",").concat(qA, " L ").concat(TQ, ",").concat(qA, " L ").concat(Pd, ",0 L ").concat(xQ, ",").concat(qA, " L ").concat(LB, ",").concat(qA, " L ").concat(LB, ",").concat(TB, " L ").concat(vB, ",").concat(TB, " L ").concat(vB, ",").concat(jQ, " L ").concat(I, ",").concat(Ed, " L ").concat(vB, ",").concat(QQ, " L ").concat(vB, ",").concat(xB, " L ").concat(LB, ",").concat(xB, " L ").concat(LB, ",").concat(jB, " L ").concat(xQ, ",").concat(jB, " L ").concat(Pd, ",").concat(g, " L ").concat(TQ, ",").concat(jB, " L ").concat(JB, ",").concat(jB, " L ").concat(JB, ",").concat(xB, " L ").concat(qA, ",").concat(xB, " L ").concat(qA, ",").concat(QQ, " z");
  30662. break;
  30663. case "leftRightUpArrow":
  30664. var OQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), QB = 1.9685039370078738, OB = 1.9685039370078738, UB = 1.9685039370078738, Jf = 3.9370078740157477, Lf = 7.874015748031495;
  30665. if (OQ) {
  30666. var UQ, EB = HI(OQ);
  30667. try {
  30668. for (EB.s(); !(UQ = EB.n()).done; ) {
  30669. var PB = UQ.value, vf = U(PB, ["attrs", "name"]);
  30670. vf === "adj1" ? QB = parseInt(U(PB, ["attrs", "fmla"]).substring(4)) * Gg : vf === "adj2" ? OB = parseInt(U(PB, ["attrs", "fmla"]).substring(4)) * Gg : vf === "adj3" && (UB = parseInt(U(PB, ["attrs", "fmla"]).substring(4)) * Gg);
  30671. }
  30672. } catch (Mg) {
  30673. EB.e(Mg);
  30674. } finally {
  30675. EB.f();
  30676. }
  30677. }
  30678. var xb = I / 2, _B = Math.min(I, g), Tf = OB < 0 ? 0 : OB > Jf ? Jf : OB, xf = 2 * Tf, EQ = (Lf - xf) / 2, il = _B * (UB < 0 ? 0 : UB > EQ ? EQ : UB) / Lf, jf = _B * Tf / Lf, Alg = xb - jf, slg = xb + jf, qB = _B * (QB < 0 ? 0 : QB > xf ? xf : QB) / 15.74803149606299, PQ = xb - qB, _Q = xb + qB, $B = I - il, qQ = g - _B * Tf / Jf, gW = g - jf, IW = gW - qB, $Q = gW + qB;
  30679. i = "M 0,".concat(gW, " L ").concat(il, ",").concat(qQ, " L ").concat(il, ",").concat(IW, " L ").concat(PQ, ",").concat(IW, " L ").concat(PQ, ",").concat(il, " L ").concat(Alg, ",").concat(il, " L ").concat(xb, ",0 L ").concat(slg, ",").concat(il, " L ").concat(_Q, ",").concat(il, " L ").concat(_Q, ",").concat(IW, " L ").concat($B, ",").concat(IW, " L ").concat($B, ",").concat(qQ, " L ").concat(I, ",").concat(gW, " L ").concat($B, ",").concat(g, " L ").concat($B, ",").concat($Q, " L ").concat(il, ",").concat($Q, " L ").concat(il, ",").concat(g, " z");
  30680. break;
  30681. case "leftUpArrow":
  30682. var gO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), CW = 1.9685039370078738, tW = 1.9685039370078738, iW = 1.9685039370078738, Qf = 3.9370078740157477, Of = 7.874015748031495;
  30683. if (gO) {
  30684. var IO, eW = HI(gO);
  30685. try {
  30686. for (eW.s(); !(IO = eW.n()).done; ) {
  30687. var AW = IO.value, Uf = U(AW, ["attrs", "name"]);
  30688. Uf === "adj1" ? CW = parseInt(U(AW, ["attrs", "fmla"]).substring(4)) * Gg : Uf === "adj2" ? tW = parseInt(U(AW, ["attrs", "fmla"]).substring(4)) * Gg : Uf === "adj3" && (iW = parseInt(U(AW, ["attrs", "fmla"]).substring(4)) * Gg);
  30689. }
  30690. } catch (Mg) {
  30691. eW.e(Mg);
  30692. } finally {
  30693. eW.f();
  30694. }
  30695. }
  30696. var sW = Math.min(I, g), Ef = tW < 0 ? 0 : tW > Qf ? Qf : tW, Pf = 2 * Ef, CO = Of - Pf, Kn = sW * (iW < 0 ? 0 : iW > CO ? CO : iW) / Of, tO = sW * Ef / Qf, llg = I - tO, nlg = g - tO, iO = sW * Ef / Of, _f = I - iO, qf = g - iO, lW = sW * (CW < 0 ? 0 : CW > Pf ? Pf : CW) / 15.74803149606299, eO = _f - lW, AO = _f + lW, sO = qf - lW, lO = qf + lW;
  30697. i = "M 0,".concat(qf, " L ").concat(Kn, ",").concat(nlg, " L ").concat(Kn, ",").concat(sO, " L ").concat(eO, ",").concat(sO, " L ").concat(eO, ",").concat(Kn, " L ").concat(llg, ",").concat(Kn, " L ").concat(_f, ",0 L ").concat(I, ",").concat(Kn, " L ").concat(AO, ",").concat(Kn, " L ").concat(AO, ",").concat(lO, " L ").concat(Kn, ",").concat(lO, " L ").concat(Kn, ",").concat(g, " z");
  30698. break;
  30699. case "bentUpArrow":
  30700. var nO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), nW = 1.9685039370078738, aW = 1.9685039370078738, oW = 1.9685039370078738, wo = 3.9370078740157477, $f = 7.874015748031495;
  30701. if (nO) {
  30702. var aO, cW = HI(nO);
  30703. try {
  30704. for (cW.s(); !(aO = cW.n()).done; ) {
  30705. var dW = aO.value, g5 = U(dW, ["attrs", "name"]);
  30706. g5 === "adj1" ? nW = parseInt(U(dW, ["attrs", "fmla"]).substring(4)) * Gg : g5 === "adj2" ? aW = parseInt(U(dW, ["attrs", "fmla"]).substring(4)) * Gg : g5 === "adj3" && (oW = parseInt(U(dW, ["attrs", "fmla"]).substring(4)) * Gg);
  30707. }
  30708. } catch (Mg) {
  30709. cW.e(Mg);
  30710. } finally {
  30711. cW.f();
  30712. }
  30713. }
  30714. var jb = Math.min(I, g), oO = nW < 0 ? 0 : nW > wo ? wo : nW, cO = aW < 0 ? 0 : aW > wo ? wo : aW, rW = jb * (oW < 0 ? 0 : oW > wo ? wo : oW) / $f, alg = I - jb * cO / wo, I5 = I - jb * cO / $f, dO = jb * oO / 15.74803149606299, rO = I5 - dO, hO = I5 + dO, bO = g - jb * oO / $f;
  30715. i = "M 0,".concat(bO, " L ").concat(rO, ",").concat(bO, " L ").concat(rO, ",").concat(rW, " L ").concat(alg, ",").concat(rW, " L ").concat(I5, ",0 L ").concat(I, ",").concat(rW, " L ").concat(hO, ",").concat(rW, " L ").concat(hO, ",").concat(g, " L 0,").concat(g, " z");
  30716. break;
  30717. case "bentArrow":
  30718. var uO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), hW = 1.9685039370078738, bW = 1.9685039370078738, uW = 1.9685039370078738, mW = 3.444881889763779, ZW = 3.9370078740157477, Qb = 7.874015748031495;
  30719. if (uO) {
  30720. var mO, GW = HI(uO);
  30721. try {
  30722. for (GW.s(); !(mO = GW.n()).done; ) {
  30723. var Ob = mO.value, wW = U(Ob, ["attrs", "name"]);
  30724. wW === "adj1" ? hW = parseInt(U(Ob, ["attrs", "fmla"]).substring(4)) * Gg : wW === "adj2" ? bW = parseInt(U(Ob, ["attrs", "fmla"]).substring(4)) * Gg : wW === "adj3" ? uW = parseInt(U(Ob, ["attrs", "fmla"]).substring(4)) * Gg : wW === "adj4" && (mW = parseInt(U(Ob, ["attrs", "fmla"]).substring(4)) * Gg);
  30725. }
  30726. } catch (Mg) {
  30727. GW.e(Mg);
  30728. } finally {
  30729. GW.f();
  30730. }
  30731. }
  30732. var Ub = Math.min(I, g), ZO = bW < 0 ? 0 : bW > ZW ? ZW : bW, GO = 2 * ZO, Eb = Ub * (hW < 0 ? 0 : hW > GO ? GO : hW) / Qb, wO = Ub * ZO / Qb, Pb = wO - Eb / 2, pO = Ub * (uW < 0 ? 0 : uW > ZW ? ZW : uW) / Qb, BO = I - pO, WO = g - Pb, yO = Qb * (BO < WO ? BO : WO) / Ub, _b = Ub * (mW < 0 ? 0 : mW > yO ? yO : mW) / Qb, YO = _b - Eb, pW = YO > 0 ? YO : 0, NO = Eb + pW, BW = I - pO, WW = Pb + Eb, olg = WW + Pb, VO = Pb + _b, clg = WW + pW;
  30733. i = "M 0,".concat(g, " L 0,").concat(VO, " ").concat(Vg(_b, VO, _b, _b, 180, 270, !1).replace("M", "L"), " L ").concat(BW, ",").concat(Pb, " L ").concat(BW, ",0 L ").concat(I, ",").concat(wO, " L ").concat(BW, ",").concat(olg, " L ").concat(BW, ",").concat(WW, " L ").concat(NO, ",").concat(WW, " ").concat(Vg(NO, clg, pW, pW, 270, 180, !1).replace("M", "L"), " L ").concat(Eb, ",").concat(g, " z");
  30734. break;
  30735. case "uturnArrow":
  30736. var MO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), yW = 1.9685039370078738, YW = 1.9685039370078738, NW = 1.9685039370078738, VW = 3.444881889763779, MW = 5.905511811023621, RO = 1.9685039370078738, el = 7.874015748031495;
  30737. if (MO) {
  30738. var fO, RW = HI(MO);
  30739. try {
  30740. for (RW.s(); !(fO = RW.n()).done; ) {
  30741. var _d = fO.value, qb = U(_d, ["attrs", "name"]);
  30742. qb === "adj1" ? yW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg : qb === "adj2" ? YW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg : qb === "adj3" ? NW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg : qb === "adj4" ? VW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg : qb === "adj5" && (MW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg);
  30743. }
  30744. } catch (Mg) {
  30745. RW.e(Mg);
  30746. } finally {
  30747. RW.f();
  30748. }
  30749. }
  30750. var Fn = Math.min(I, g), HO = YW < 0 ? 0 : YW > RO ? RO : YW, XO = 2 * HO, C5 = yW < 0 ? 0 : yW > XO ? XO : yW, SO = (el - C5 * Fn / g) * g / Fn, DO = NW < 0 ? 0 : NW > SO ? SO : NW, KO = (DO + C5) * Fn / g, $b = Fn * C5 / el, t5 = Fn * HO / el, FO = t5 - $b / 2, kO = g * (MW < KO ? KO : MW > el ? el : MW) / el, qd = kO - Fn * DO / el, i5 = I - FO, zO = i5 / 2, JO = el * (zO < qd ? zO : qd) / Fn, $A = Fn * (VW < 0 ? 0 : VW > JO ? JO : VW) / el, LO = $A - $b, $d = LO > 0 ? LO : 0, gu = $b + $d, vO = I - t5, TO = vO - t5, e5 = TO + FO, xO = i5 - $A, dlg = e5 - $d;
  30751. i = "M 0,".concat(g, " L 0,").concat($A, " ").concat(Vg($A, $A, $A, $A, 180, 270, !1).replace("M", "L"), " L ").concat(xO, ",0 ").concat(Vg(xO, $A, $A, $A, 270, 360, !1).replace("M", "L"), " L ").concat(i5, ",").concat(qd, " L ").concat(I, ",").concat(qd, " L ").concat(vO, ",").concat(kO, " L ").concat(TO, ",").concat(qd, " L ").concat(e5, ",").concat(qd, " L ").concat(e5, ",").concat(gu, " ").concat(Vg(dlg, gu, $d, $d, 0, -90, !1).replace("M", "L"), " L ").concat(gu, ",").concat($b, " ").concat(Vg(gu, gu, $d, $d, 270, 180, !1).replace("M", "L"), " L ").concat($b, ",").concat(g, " z");
  30752. break;
  30753. case "stripedRightArrow":
  30754. var jO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), fW = 3.9370078740157477, HW = 3.9370078740157477, A5 = 7.874015748031495;
  30755. if (jO) {
  30756. var QO, XW = HI(jO);
  30757. try {
  30758. for (XW.s(); !(QO = XW.n()).done; ) {
  30759. var s5 = QO.value, OO = U(s5, ["attrs", "name"]);
  30760. OO === "adj1" ? fW = parseInt(U(s5, ["attrs", "fmla"]).substring(4)) * Gg : OO === "adj2" && (HW = parseInt(U(s5, ["attrs", "fmla"]).substring(4)) * Gg);
  30761. }
  30762. } catch (Mg) {
  30763. XW.e(Mg);
  30764. } finally {
  30765. XW.f();
  30766. }
  30767. }
  30768. var l5 = g / 2, gr = Math.min(I, g), UO = 6.643700787401574 * I / gr, EO = 5 * gr / 32, SW = I - gr * (HW < 0 ? 0 : HW > UO ? UO : HW) / A5, PO = g * (fW < 0 ? 0 : fW > A5 ? A5 : fW) / 15.74803149606299, Ir = l5 - PO, Cr = l5 + PO, _O = gr / 8, qO = gr / 16, $O = gr / 32;
  30769. i = "M 0,".concat(Ir, " L ").concat($O, ",").concat(Ir, " L ").concat($O, ",").concat(Cr, " L 0,").concat(Cr, " z M ").concat(qO, ",").concat(Ir, " L ").concat(_O, ",").concat(Ir, " L ").concat(_O, ",").concat(Cr, " L ").concat(qO, ",").concat(Cr, " z M ").concat(EO, ",").concat(Ir, " L ").concat(SW, ",").concat(Ir, " L ").concat(SW, ",0 L ").concat(I, ",").concat(l5, " L ").concat(SW, ",").concat(g, " L ").concat(SW, ",").concat(Cr, " L ").concat(EO, ",").concat(Cr, " z");
  30770. break;
  30771. case "notchedRightArrow":
  30772. var g4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), DW = 3.9370078740157477, KW = 3.9370078740157477, FW = 7.874015748031495;
  30773. if (g4) {
  30774. var I4, kW = HI(g4);
  30775. try {
  30776. for (kW.s(); !(I4 = kW.n()).done; ) {
  30777. var n5 = I4.value, C4 = U(n5, ["attrs", "name"]);
  30778. C4 === "adj1" ? DW = parseInt(U(n5, ["attrs", "fmla"]).substring(4)) * Gg : C4 === "adj2" && (KW = parseInt(U(n5, ["attrs", "fmla"]).substring(4)) * Gg);
  30779. }
  30780. } catch (Mg) {
  30781. kW.e(Mg);
  30782. } finally {
  30783. kW.f();
  30784. }
  30785. }
  30786. var Iu = g / 2, rlg = Iu, t4 = Math.min(I, g), i4 = FW * I / t4, e4 = t4 * (KW < 0 ? 0 : KW > i4 ? i4 : KW) / FW, zW = I - e4, a5 = g * (DW < 0 ? 0 : DW > FW ? FW : DW) / 15.74803149606299, A4 = Iu - a5, s4 = Iu + a5, hlg = a5 * e4 / rlg;
  30787. i = "M 0,".concat(A4, " L ").concat(zW, ",").concat(A4, " L ").concat(zW, ",0 L ").concat(I, ",").concat(Iu, " L ").concat(zW, ",").concat(g, " L ").concat(zW, ",").concat(s4, " L 0,").concat(s4, " L ").concat(hlg, ",").concat(Iu, " z");
  30788. break;
  30789. case "homePlate":
  30790. var l4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), JW = 3.9370078740157477, n4 = 7.874015748031495;
  30791. l4 && (JW = parseInt(l4.substring(4)) * Gg);
  30792. var blg = g / 2, a4 = Math.min(I, g), o4 = n4 * I / a4, c4 = I - a4 * (JW < 0 ? 0 : JW > o4 ? o4 : JW) / n4;
  30793. i = "M 0,0 L ".concat(c4, ",0 L ").concat(I, ",").concat(blg, " L ").concat(c4, ",").concat(g, " L 0,").concat(g, " z");
  30794. break;
  30795. case "chevron":
  30796. var d4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), LW = 3.9370078740157477, r4 = 7.874015748031495;
  30797. d4 && (LW = parseInt(d4.substring(4)) * Gg);
  30798. var h4 = g / 2, b4 = Math.min(I, g), u4 = r4 * I / b4, m4 = b4 * (LW < 0 ? 0 : LW > u4 ? u4 : LW) / r4, Z4 = I - m4;
  30799. i = "M 0,0 L ".concat(Z4, ",0 L ").concat(I, ",").concat(h4, " L ").concat(Z4, ",").concat(g, " L 0,").concat(g, " L ").concat(m4, ",").concat(h4, " z");
  30800. break;
  30801. case "rightArrowCallout":
  30802. var G4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), vW = 1.9685039370078738, TW = 1.9685039370078738, xW = 1.9685039370078738, jW = 5.116299212598425, w4 = 3.9370078740157477, QW = 7.874015748031495;
  30803. if (G4) {
  30804. var p4, OW = HI(G4);
  30805. try {
  30806. for (OW.s(); !(p4 = OW.n()).done; ) {
  30807. var Cu = p4.value, UW = U(Cu, ["attrs", "name"]);
  30808. UW === "adj1" ? vW = parseInt(U(Cu, ["attrs", "fmla"]).substring(4)) * Gg : UW === "adj2" ? TW = parseInt(U(Cu, ["attrs", "fmla"]).substring(4)) * Gg : UW === "adj3" ? xW = parseInt(U(Cu, ["attrs", "fmla"]).substring(4)) * Gg : UW === "adj4" && (jW = parseInt(U(Cu, ["attrs", "fmla"]).substring(4)) * Gg);
  30809. }
  30810. } catch (Mg) {
  30811. OW.e(Mg);
  30812. } finally {
  30813. OW.f();
  30814. }
  30815. }
  30816. var tu = g / 2, B4 = I, W4 = g, tr = Math.min(I, g), y4 = w4 * g / tr, Y4 = TW < 0 ? 0 : TW > y4 ? y4 : TW, N4 = 2 * Y4, V4 = QW * I / tr, M4 = xW < 0 ? 0 : xW > V4 ? V4 : xW, R4 = w4 - M4 * tr / I, f4 = tr * Y4 / QW, H4 = tr * (vW < 0 ? 0 : vW > N4 ? N4 : vW) / 15.74803149606299, ulg = tu - f4, X4 = tu - H4, S4 = tu + H4, mlg = tu + f4, EW = B4 - tr * M4 / QW, PW = I * (jW < 0 ? 0 : jW > R4 ? R4 : jW) / QW;
  30817. i = "M ".concat(0, ",").concat(0, " L ").concat(PW, ",").concat(0, " L ").concat(PW, ",").concat(X4, " L ").concat(EW, ",").concat(X4, " L ").concat(EW, ",").concat(ulg, " L ").concat(B4, ",").concat(tu, " L ").concat(EW, ",").concat(mlg, " L ").concat(EW, ",").concat(S4, " L ").concat(PW, ",").concat(S4, " L ").concat(PW, ",").concat(W4, " L ").concat(0, ",").concat(W4, " z");
  30818. break;
  30819. case "downArrowCallout":
  30820. var D4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), _W = 1.9685039370078738, qW = 1.9685039370078738, $W = 1.9685039370078738, g2 = 5.116299212598425, iu = 7.874015748031495;
  30821. if (D4) {
  30822. var K4, I2 = HI(D4);
  30823. try {
  30824. for (I2.s(); !(K4 = I2.n()).done; ) {
  30825. var eu = K4.value, C2 = U(eu, ["attrs", "name"]);
  30826. C2 === "adj1" ? _W = parseInt(U(eu, ["attrs", "fmla"]).substring(4)) * Gg : C2 === "adj2" ? qW = parseInt(U(eu, ["attrs", "fmla"]).substring(4)) * Gg : C2 === "adj3" ? $W = parseInt(U(eu, ["attrs", "fmla"]).substring(4)) * Gg : C2 === "adj4" && (g2 = parseInt(U(eu, ["attrs", "fmla"]).substring(4)) * Gg);
  30827. }
  30828. } catch (Mg) {
  30829. I2.e(Mg);
  30830. } finally {
  30831. I2.f();
  30832. }
  30833. }
  30834. var Au = I / 2, F4 = I, k4 = g, ir = Math.min(I, g), z4 = 3.9370078740157477 * I / ir, J4 = qW < 0 ? 0 : qW > z4 ? z4 : qW, L4 = 2 * J4, v4 = iu * g / ir, T4 = $W < 0 ? 0 : $W > v4 ? v4 : $W, x4 = iu - T4 * ir / g, j4 = ir * J4 / iu, Q4 = ir * (_W < 0 ? 0 : _W > L4 ? L4 : _W) / 15.74803149606299, Zlg = Au - j4, O4 = Au - Q4, U4 = Au + Q4, Glg = Au + j4, t2 = k4 - ir * T4 / iu, i2 = g * (g2 < 0 ? 0 : g2 > x4 ? x4 : g2) / iu;
  30835. i = "M ".concat(0, ",").concat(0, " L ").concat(F4, ",").concat(0, " L ").concat(F4, ",").concat(i2, " L ").concat(U4, ",").concat(i2, " L ").concat(U4, ",").concat(t2, " L ").concat(Glg, ",").concat(t2, " L ").concat(Au, ",").concat(k4, " L ").concat(Zlg, ",").concat(t2, " L ").concat(O4, ",").concat(t2, " L ").concat(O4, ",").concat(i2, " L ").concat(0, ",").concat(i2, " z");
  30836. break;
  30837. case "leftArrowCallout":
  30838. var E4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), e2 = 1.9685039370078738, A2 = 1.9685039370078738, s2 = 1.9685039370078738, l2 = 5.116299212598425, su = 7.874015748031495;
  30839. if (E4) {
  30840. var P4, n2 = HI(E4);
  30841. try {
  30842. for (n2.s(); !(P4 = n2.n()).done; ) {
  30843. var lu = P4.value, a2 = U(lu, ["attrs", "name"]);
  30844. a2 === "adj1" ? e2 = parseInt(U(lu, ["attrs", "fmla"]).substring(4)) * Gg : a2 === "adj2" ? A2 = parseInt(U(lu, ["attrs", "fmla"]).substring(4)) * Gg : a2 === "adj3" ? s2 = parseInt(U(lu, ["attrs", "fmla"]).substring(4)) * Gg : a2 === "adj4" && (l2 = parseInt(U(lu, ["attrs", "fmla"]).substring(4)) * Gg);
  30845. }
  30846. } catch (Mg) {
  30847. n2.e(Mg);
  30848. } finally {
  30849. n2.f();
  30850. }
  30851. }
  30852. var nu = g / 2, o5 = I, _4 = g, er = Math.min(I, g), q4 = 3.9370078740157477 * g / er, $4 = A2 < 0 ? 0 : A2 > q4 ? q4 : A2, gU = 2 * $4, IU = su * I / er, CU = s2 < 0 ? 0 : s2 > IU ? IU : s2, tU = su - CU * er / I, iU = er * $4 / su, eU = er * (e2 < 0 ? 0 : e2 > gU ? gU : e2) / 15.74803149606299, wlg = nu - iU, AU = nu - eU, sU = nu + eU, plg = nu + iU, o2 = er * CU / su, c2 = o5 - I * (l2 < 0 ? 0 : l2 > tU ? tU : l2) / su;
  30853. i = "M ".concat(0, ",").concat(nu, " L ").concat(o2, ",").concat(wlg, " L ").concat(o2, ",").concat(AU, " L ").concat(c2, ",").concat(AU, " L ").concat(c2, ",").concat(0, " L ").concat(o5, ",").concat(0, " L ").concat(o5, ",").concat(_4, " L ").concat(c2, ",").concat(_4, " L ").concat(c2, ",").concat(sU, " L ").concat(o2, ",").concat(sU, " L ").concat(o2, ",").concat(plg, " z");
  30854. break;
  30855. case "upArrowCallout":
  30856. var lU = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), d2 = 1.9685039370078738, r2 = 1.9685039370078738, h2 = 1.9685039370078738, b2 = 5.116299212598425, au = 7.874015748031495;
  30857. if (lU) {
  30858. var nU, u2 = HI(lU);
  30859. try {
  30860. for (u2.s(); !(nU = u2.n()).done; ) {
  30861. var ou = nU.value, m2 = U(ou, ["attrs", "name"]);
  30862. m2 === "adj1" ? d2 = parseInt(U(ou, ["attrs", "fmla"]).substring(4)) * Gg : m2 === "adj2" ? r2 = parseInt(U(ou, ["attrs", "fmla"]).substring(4)) * Gg : m2 === "adj3" ? h2 = parseInt(U(ou, ["attrs", "fmla"]).substring(4)) * Gg : m2 === "adj4" && (b2 = parseInt(U(ou, ["attrs", "fmla"]).substring(4)) * Gg);
  30863. }
  30864. } catch (Mg) {
  30865. u2.e(Mg);
  30866. } finally {
  30867. u2.f();
  30868. }
  30869. }
  30870. var cu = I / 2, aU = I, c5 = g, Ar = Math.min(I, g), oU = 3.9370078740157477 * I / Ar, cU = r2 < 0 ? 0 : r2 > oU ? oU : r2, dU = 2 * cU, rU = au * g / Ar, hU = h2 < 0 ? 0 : h2 > rU ? rU : h2, bU = au - hU * Ar / g, uU = Ar * cU / au, mU = Ar * (d2 < 0 ? 0 : d2 > dU ? dU : d2) / 15.74803149606299, Blg = cu - uU, ZU = cu - mU, GU = cu + mU, Wlg = cu + uU, Z2 = Ar * hU / au, G2 = c5 - g * (b2 < 0 ? 0 : b2 > bU ? bU : b2) / au;
  30871. i = "M ".concat(0, ",").concat(G2, " L ").concat(ZU, ",").concat(G2, " L ").concat(ZU, ",").concat(Z2, " L ").concat(Blg, ",").concat(Z2, " L ").concat(cu, ",").concat(0, " L ").concat(Wlg, ",").concat(Z2, " L ").concat(GU, ",").concat(Z2, " L ").concat(GU, ",").concat(G2, " L ").concat(aU, ",").concat(G2, " L ").concat(aU, ",").concat(c5, " L ").concat(0, ",").concat(c5, " z");
  30872. break;
  30873. case "leftRightArrowCallout":
  30874. var wU = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), w2 = 1.9685039370078738, p2 = 1.9685039370078738, B2 = 1.9685039370078738, W2 = 3.7892125984251965, pU = 3.9370078740157477, d5 = 7.874015748031495, BU = 15.74803149606299;
  30875. if (wU) {
  30876. var WU, y2 = HI(wU);
  30877. try {
  30878. for (y2.s(); !(WU = y2.n()).done; ) {
  30879. var du = WU.value, Y2 = U(du, ["attrs", "name"]);
  30880. Y2 === "adj1" ? w2 = parseInt(U(du, ["attrs", "fmla"]).substring(4)) * Gg : Y2 === "adj2" ? p2 = parseInt(U(du, ["attrs", "fmla"]).substring(4)) * Gg : Y2 === "adj3" ? B2 = parseInt(U(du, ["attrs", "fmla"]).substring(4)) * Gg : Y2 === "adj4" && (W2 = parseInt(U(du, ["attrs", "fmla"]).substring(4)) * Gg);
  30881. }
  30882. } catch (Mg) {
  30883. y2.e(Mg);
  30884. } finally {
  30885. y2.f();
  30886. }
  30887. }
  30888. var sr = g / 2, yU = I / 2, YU = I, NU = g, lr = Math.min(I, g), VU = pU * g / lr, MU = p2 < 0 ? 0 : p2 > VU ? VU : p2, RU = 2 * MU, fU = pU * I / lr, HU = B2 < 0 ? 0 : B2 > fU ? fU : B2, XU = d5 - HU * lr / (I / 2), SU = lr * MU / d5, DU = lr * (w2 < 0 ? 0 : w2 > RU ? RU : w2) / BU, KU = sr - SU, N2 = sr - DU, V2 = sr + DU, FU = sr + SU, ru = lr * HU / d5, M2 = YU - ru, kU = I * (W2 < 0 ? 0 : W2 > XU ? XU : W2) / BU, R2 = yU - kU, f2 = yU + kU;
  30889. i = "M ".concat(0, ",").concat(sr, " L ").concat(ru, ",").concat(KU, " L ").concat(ru, ",").concat(N2, " L ").concat(R2, ",").concat(N2, " L ").concat(R2, ",").concat(0, " L ").concat(f2, ",").concat(0, " L ").concat(f2, ",").concat(N2, " L ").concat(M2, ",").concat(N2, " L ").concat(M2, ",").concat(KU, " L ").concat(YU, ",").concat(sr, " L ").concat(M2, ",").concat(FU, " L ").concat(M2, ",").concat(V2, " L ").concat(f2, ",").concat(V2, " L ").concat(f2, ",").concat(NU, " L ").concat(R2, ",").concat(NU, " L ").concat(R2, ",").concat(V2, " L ").concat(ru, ",").concat(V2, " L ").concat(ru, ",").concat(FU, " z");
  30890. break;
  30891. case "quadArrowCallout":
  30892. var zU = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), H2 = 1.4578740157480314, X2 = 1.4578740157480314, S2 = 1.4578740157480314, D2 = 3.7892125984251965, r5 = 3.9370078740157477, h5 = 7.874015748031495, b5 = 15.74803149606299;
  30893. if (zU) {
  30894. var JU, K2 = HI(zU);
  30895. try {
  30896. for (K2.s(); !(JU = K2.n()).done; ) {
  30897. var hu = JU.value, F2 = U(hu, ["attrs", "name"]);
  30898. F2 === "adj1" ? H2 = parseInt(U(hu, ["attrs", "fmla"]).substring(4)) * Gg : F2 === "adj2" ? X2 = parseInt(U(hu, ["attrs", "fmla"]).substring(4)) * Gg : F2 === "adj3" ? S2 = parseInt(U(hu, ["attrs", "fmla"]).substring(4)) * Gg : F2 === "adj4" && (D2 = parseInt(U(hu, ["attrs", "fmla"]).substring(4)) * Gg);
  30899. }
  30900. } catch (Mg) {
  30901. K2.e(Mg);
  30902. } finally {
  30903. K2.f();
  30904. }
  30905. }
  30906. var kn = g / 2, zn = I / 2, LU = I, vU = g, u5 = Math.min(I, g), m5 = X2 < 0 ? 0 : X2 > r5 ? r5 : X2, TU = 2 * m5, Z5 = H2 < 0 ? 0 : H2 > TU ? TU : H2, xU = r5 - m5, jU = S2 < 0 ? 0 : S2 > xU ? xU : S2, QU = h5 - 2 * jU, OU = D2 < Z5 ? Z5 : D2 > QU ? QU : D2, k2 = u5 * m5 / h5, z2 = u5 * Z5 / b5, gs = u5 * jU / h5, UU = I * OU / b5, EU = g * OU / b5, J2 = LU - gs, L2 = zn - UU, v2 = zn + UU, PU = zn - k2, _U = zn + k2, T2 = zn - z2, x2 = zn + z2, j2 = vU - gs, Q2 = kn - EU, O2 = kn + EU, qU = kn - k2, $U = kn + k2, U2 = kn - z2, E2 = kn + z2;
  30907. i = "M ".concat(0, ",").concat(kn, " L ").concat(gs, ",").concat(qU, " L ").concat(gs, ",").concat(U2, " L ").concat(L2, ",").concat(U2, " L ").concat(L2, ",").concat(Q2, " L ").concat(T2, ",").concat(Q2, " L ").concat(T2, ",").concat(gs, " L ").concat(PU, ",").concat(gs, " L ").concat(zn, ",").concat(0, " L ").concat(_U, ",").concat(gs, " L ").concat(x2, ",").concat(gs, " L ").concat(x2, ",").concat(Q2, " L ").concat(v2, ",").concat(Q2, " L ").concat(v2, ",").concat(U2, " L ").concat(J2, ",").concat(U2, " L ").concat(J2, ",").concat(qU, " L ").concat(LU, ",").concat(kn, " L ").concat(J2, ",").concat($U, " L ").concat(J2, ",").concat(E2, " L ").concat(v2, ",").concat(E2, " L ").concat(v2, ",").concat(O2, " L ").concat(x2, ",").concat(O2, " L ").concat(x2, ",").concat(j2, " L ").concat(_U, ",").concat(j2, " L ").concat(zn, ",").concat(vU, " L ").concat(PU, ",").concat(j2, " L ").concat(T2, ",").concat(j2, " L ").concat(T2, ",").concat(O2, " L ").concat(L2, ",").concat(O2, " L ").concat(L2, ",").concat(E2, " L ").concat(gs, ",").concat(E2, " L ").concat(gs, ",").concat($U, " z");
  30908. break;
  30909. case "curvedDownArrow":
  30910. var gE = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), P2 = 1.9685039370078738, _2 = 3.9370078740157477, q2 = 1.9685039370078738, nr = 7.874015748031495;
  30911. if (gE) {
  30912. var IE, $2 = HI(gE);
  30913. try {
  30914. for ($2.s(); !(IE = $2.n()).done; ) {
  30915. var gy = IE.value, G5 = U(gy, ["attrs", "name"]);
  30916. G5 === "adj1" ? P2 = parseInt(U(gy, ["attrs", "fmla"]).substring(4)) * Gg : G5 === "adj2" ? _2 = parseInt(U(gy, ["attrs", "fmla"]).substring(4)) * Gg : G5 === "adj3" && (q2 = parseInt(U(gy, ["attrs", "fmla"]).substring(4)) * Gg);
  30917. }
  30918. } catch (Mg) {
  30919. $2.e(Mg);
  30920. } finally {
  30921. $2.f();
  30922. }
  30923. }
  30924. var ylg = I / 2, Ylg = I, CE = g, Iy = 270, bu = Math.min(I, g), tE = 3.9370078740157477 * I / bu, po = bu * (P2 < 0 ? 0 : P2 > nr ? nr : P2) / nr, w5 = bu * (_2 < 0 ? 0 : _2 > tE ? tE : _2) / nr, Is = ylg - (po + w5) / 4, p5 = 2 * Is, iE = Math.sqrt(p5 * p5 - po * po) * g / p5, eE = nr * iE / bu, Cy = bu * (q2 < 0 ? 0 : q2 > eE ? eE : q2) / nr, uu = Is + po, B5 = Math.sqrt(g * g - Cy * Cy) * Is / g, W5 = Is + B5, AE = (w5 - po) / 2, Nlg = W5 - AE, Vlg = uu + B5 + AE, Mlg = Ylg - w5 / 2, ty = CE - Cy, y5 = 180 * Math.atan(B5 / Cy) / Math.PI, Rlg = -y5, Y5 = 180 * Math.atan(po / 2 / iE) / Math.PI, sE = Iy + y5, lE = Iy - Y5, flg = Y5 - 90, Hlg = 90 + Y5;
  30925. i = "M ".concat(Mlg, ",").concat(CE, " L ").concat(Nlg, ",").concat(ty, " L ").concat(W5, ",").concat(ty, " ").concat(Vg(Is, g, Is, g, sE, sE + Rlg, !1).replace("M", "L"), " L ").concat(uu, ",").concat(0, " ").concat(Vg(uu, g, Is, g, Iy, Iy + y5, !1).replace("M", "L"), " L ").concat(W5 + po, ",").concat(ty, " L ").concat(Vlg, ",").concat(ty, " z M ").concat(uu, ",").concat(0, " ").concat(Vg(uu, g, Is, g, lE, lE + flg, !1).replace("M", "L"), " ").concat(Vg(Is, g, Is, g, 180, 180 + Hlg, !1).replace("M", "L"));
  30926. break;
  30927. case "curvedLeftArrow":
  30928. var nE = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), iy = 1.9685039370078738, ey = 3.9370078740157477, Ay = 1.9685039370078738, sy = 7.874015748031495;
  30929. if (nE) {
  30930. var aE, ly = HI(nE);
  30931. try {
  30932. for (ly.s(); !(aE = ly.n()).done; ) {
  30933. var ny = aE.value, N5 = U(ny, ["attrs", "name"]);
  30934. N5 === "adj1" ? iy = parseInt(U(ny, ["attrs", "fmla"]).substring(4)) * Gg : N5 === "adj2" ? ey = parseInt(U(ny, ["attrs", "fmla"]).substring(4)) * Gg : N5 === "adj3" && (Ay = parseInt(U(ny, ["attrs", "fmla"]).substring(4)) * Gg);
  30935. }
  30936. } catch (Mg) {
  30937. ly.e(Mg);
  30938. } finally {
  30939. ly.f();
  30940. }
  30941. }
  30942. var Xlg = g / 2, oE = I, Slg = g, cE = 270, mu = Math.min(I, g), dE = 3.9370078740157477 * g / mu, V5 = ey < 0 ? 0 : ey > dE ? dE : ey, ar = mu * (iy < 0 ? 0 : iy > V5 ? V5 : iy) / sy, M5 = mu * V5 / sy, ie = Xlg - (ar + M5) / 4, R5 = 2 * ie, rE = Math.sqrt(R5 * R5 - ar * ar) * I / R5, hE = sy * rE / mu, ay = mu * (Ay < 0 ? 0 : Ay > hE ? hE : Ay) / sy, or = ie + ar, f5 = Math.sqrt(I * I - ay * ay) * ie / I, bE = ie + f5, uE = or + f5, mE = (M5 - ar) / 2, Dlg = bE - mE, Klg = uE + mE, Flg = Slg - M5 / 2, oy = 0 + ay, ZE = Math.atan(f5 / ay), klg = Math.atan(ar / 2 / rE) - ZE, H5 = 180 * ZE / Math.PI, zlg = 180 * klg / Math.PI;
  30943. i = "M ".concat(oE, ",").concat(or, " ").concat(Vg(0, ie, I, ie, 0, -90, !1).replace("M", "L"), " L ").concat(0, ",").concat(0, " ").concat(Vg(0, or, I, ie, cE, 360, !1).replace("M", "L"), " L ").concat(oE, ",").concat(or, " ").concat(Vg(0, or, I, ie, 0, H5, !1).replace("M", "L"), " L ").concat(oy, ",").concat(uE, " L ").concat(oy, ",").concat(Klg, " L ").concat(0, ",").concat(Flg, " L ").concat(oy, ",").concat(Dlg, " L ").concat(oy, ",").concat(bE, " ").concat(Vg(0, ie, I, ie, H5, H5 + zlg, !1).replace("M", "L"), " ").concat(Vg(0, ie, I, ie, 0, -90, !1).replace("M", "L"), " ").concat(Vg(0, or, I, ie, cE, 360, !1).replace("M", "L"));
  30944. break;
  30945. case "curvedRightArrow":
  30946. var GE = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), cy = 1.9685039370078738, dy = 3.9370078740157477, ry = 1.9685039370078738, hy = 7.874015748031495;
  30947. if (GE) {
  30948. var wE, by = HI(GE);
  30949. try {
  30950. for (by.s(); !(wE = by.n()).done; ) {
  30951. var uy = wE.value, X5 = U(uy, ["attrs", "name"]);
  30952. X5 === "adj1" ? cy = parseInt(U(uy, ["attrs", "fmla"]).substring(4)) * Gg : X5 === "adj2" ? dy = parseInt(U(uy, ["attrs", "fmla"]).substring(4)) * Gg : X5 === "adj3" && (ry = parseInt(U(uy, ["attrs", "fmla"]).substring(4)) * Gg);
  30953. }
  30954. } catch (Mg) {
  30955. by.e(Mg);
  30956. } finally {
  30957. by.f();
  30958. }
  30959. }
  30960. var Jlg = g / 2, S5 = I, Llg = g, D5 = 180, Zu = Math.min(I, g), pE = 3.9370078740157477 * g / Zu, K5 = dy < 0 ? 0 : dy > pE ? pE : dy, Bo = Zu * (cy < 0 ? 0 : cy > K5 ? K5 : cy) / hy, F5 = Zu * K5 / hy, Fe = Jlg - (Bo + F5) / 4, k5 = 2 * Fe, BE = Math.sqrt(k5 * k5 - Bo * Bo) * I / k5, WE = hy * BE / Zu, my = Zu * (ry < 0 ? 0 : ry > WE ? WE : ry) / hy, z5 = Fe + Bo, J5 = Math.sqrt(I * I - my * my) * Fe / I, yE = Fe + J5, YE = z5 + J5, NE = (F5 - Bo) / 2, vlg = yE - NE, Tlg = YE + NE, xlg = Llg - F5 / 2, Zy = S5 - my, L5 = Math.atan(J5 / my), jlg = Math.PI - L5, Qlg = -L5, Olg = Math.atan(Bo / 2 / BE) - Math.PI / 2, VE = 180 * jlg / Math.PI, Ulg = 180 * Qlg / Math.PI, Elg = 180 * L5 / Math.PI, Plg = 180 * Olg / Math.PI;
  30961. i = "M ".concat(0, ",").concat(Fe, " ").concat(Vg(I, Fe, I, Fe, D5, D5 + Ulg, !1).replace("M", "L"), " L ").concat(Zy, ",").concat(yE, " L ").concat(Zy, ",").concat(vlg, " L ").concat(S5, ",").concat(xlg, " L ").concat(Zy, ",").concat(Tlg, " L ").concat(Zy, ",").concat(YE, " ").concat(Vg(I, z5, I, Fe, VE, VE + Elg, !1).replace("M", "L"), " L ").concat(0, ",").concat(Fe, " ").concat(Vg(I, Fe, I, Fe, D5, 270, !1).replace("M", "L"), " L ").concat(S5, ",").concat(Bo, " ").concat(Vg(I, z5, I, Fe, 270, 270 + Plg, !1).replace("M", "L"));
  30962. break;
  30963. case "curvedUpArrow":
  30964. var ME = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Gy = 1.9685039370078738, wy = 3.9370078740157477, py = 1.9685039370078738, cr = 7.874015748031495;
  30965. if (ME) {
  30966. var RE, By = HI(ME);
  30967. try {
  30968. for (By.s(); !(RE = By.n()).done; ) {
  30969. var Wy = RE.value, v5 = U(Wy, ["attrs", "name"]);
  30970. v5 === "adj1" ? Gy = parseInt(U(Wy, ["attrs", "fmla"]).substring(4)) * Gg : v5 === "adj2" ? wy = parseInt(U(Wy, ["attrs", "fmla"]).substring(4)) * Gg : v5 === "adj3" && (py = parseInt(U(Wy, ["attrs", "fmla"]).substring(4)) * Gg);
  30971. }
  30972. } catch (Mg) {
  30973. By.e(Mg);
  30974. } finally {
  30975. By.f();
  30976. }
  30977. }
  30978. var _lg = I / 2, qlg = I, $lg = g, Gu = Math.min(I, g), fE = 3.9370078740157477 * I / Gu, Wo = Gu * (Gy < 0 ? 0 : Gy > cr ? cr : Gy) / cr, T5 = Gu * (wy < 0 ? 0 : wy > fE ? fE : wy) / cr, cA = _lg - (Wo + T5) / 4, x5 = 2 * cA, HE = Math.sqrt(x5 * x5 - Wo * Wo) * g / x5, XE = cr * HE / Gu, yy = Gu * (py < 0 ? 0 : py > XE ? XE : py) / cr, j5 = cA + Wo, Q5 = Math.sqrt(g * g - yy * yy) * cA / g, SE = cA + Q5, DE = j5 + Q5, KE = (T5 - Wo) / 2, gng = SE - KE, Ing = DE + KE, Cng = qlg - T5 / 2, Yy = 0 + yy, O5 = Math.atan(Q5 / yy), FE = Math.atan(Wo / 2 / HE), tng = FE - O5, ing = Math.PI / 2 - O5, kE = 180 * (Math.PI / 2 - FE) / Math.PI, eng = 180 * tng / Math.PI, zE = 180 * ing / Math.PI, Ang = 180 * O5 / Math.PI;
  30979. i = "".concat(Vg(cA, 0, cA, g, kE, kE + eng, !1), " L ").concat(SE, ",").concat(Yy, " L ").concat(gng, ",").concat(Yy, " L ").concat(Cng, ",").concat(0, " L ").concat(Ing, ",").concat(Yy, " L ").concat(DE, ",").concat(Yy, " ").concat(Vg(j5, 0, cA, g, zE, zE + Ang, !1).replace("M", "L"), " L ").concat(cA, ",").concat($lg, " ").concat(Vg(cA, 0, cA, g, 90, 180, !1).replace("M", "L"), " L ").concat(Wo, ",").concat(0, " ").concat(Vg(j5, 0, cA, g, 180, 90, !1).replace("M", "L"));
  30980. break;
  30981. case "mathDivide":
  30982. case "mathEqual":
  30983. case "mathMinus":
  30984. case "mathMultiply":
  30985. case "mathNotEqual":
  30986. case "mathPlus":
  30987. var CC, ft, ke, Ny = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
  30988. if (Ny) if (Array.isArray(Ny)) {
  30989. var JE, Vy = HI(Ny);
  30990. try {
  30991. for (Vy.s(); !(JE = Vy.n()).done; ) {
  30992. var My = JE.value, U5 = U(My, ["attrs", "name"]);
  30993. U5 === "adj1" ? CC = parseInt(U(My, ["attrs", "fmla"]).substring(4)) : U5 === "adj2" ? ft = parseInt(U(My, ["attrs", "fmla"]).substring(4)) : U5 === "adj3" && (ke = parseInt(U(My, ["attrs", "fmla"]).substring(4)));
  30994. }
  30995. } catch (Mg) {
  30996. Vy.e(Mg);
  30997. } finally {
  30998. Vy.f();
  30999. }
  31000. } else CC = parseInt(U(Ny, ["attrs", "fmla"]).substring(4));
  31001. var LE = 3.9370078740157477, Cs = 7.874015748031495, dA = 15.74803149606299, qC = I / 2, ci = g / 2, Al = g / 2;
  31002. if (t === "mathNotEqual") {
  31003. CC === void 0 && (CC = 23520), ft === void 0 && (ft = 66e5), ke === void 0 && (ke = 11760), CC *= Gg, ft = ft / 6e4 * Math.PI / 180, ke *= Gg;
  31004. var vE = 70 * Math.PI / 180, TE = 110 * Math.PI / 180, xE = CC < 0 ? 0 : CC > LE ? LE : CC, jE = Cs - 2 * xE, wu = g * xE / Cs, QE = g * (ke < 0 ? 0 : ke > jE ? jE : ke) / dA, OE = 5.7866141732283465 * I / dA, Ry = qC - OE, fy = qC + OE, dr = ci - QE, rr = ci + QE, pu = dr - wu, Bu = rr + wu, Wu = (ft < vE ? vE : ft > TE ? TE : ft) - Math.PI / 2, Jn = Al * Math.tan(Wu), E5 = Math.sqrt(Jn * Jn + Al * Al), yo = E5 * wu / Al, Ln = qC + Jn - yo / 2, UE = Ln - Jn * pu / Al, EE = Ln - Jn * dr / Al, PE = Ln - Jn * rr / Al, _E = Ln - Jn * Bu / Al, sng = UE + yo, lng = EE + yo, nng = PE + yo, ang = _E + yo, qE = wu * Al / E5, $E = Wu > 0 ? Ln + qE : Ln + yo, g7 = Wu > 0 ? Ln : Ln + yo - qE, I7 = wu * Jn / E5, C7 = Wu > 0 ? I7 : 0, t7 = Wu > 0 ? 0 : -I7, ong = I - $E, cng = I - g7, dng = g - C7, rng = g - t7;
  31005. i = "M ".concat(Ry, ",").concat(pu, " L ").concat(UE, ",").concat(pu, " L ").concat(g7, ",").concat(t7, " L ").concat($E, ",").concat(C7, " L ").concat(sng, ",").concat(pu, " L ").concat(fy, ",").concat(pu, " L ").concat(fy, ",").concat(dr, " L ").concat(lng, ",").concat(dr, " L ").concat(nng, ",").concat(rr, " L ").concat(fy, ",").concat(rr, " L ").concat(fy, ",").concat(Bu, " L ").concat(ang, ",").concat(Bu, " L ").concat(cng, ",").concat(rng, " L ").concat(ong, ",").concat(dng, " L ").concat(_E, ",").concat(Bu, " L ").concat(Ry, ",").concat(Bu, " L ").concat(Ry, ",").concat(rr, " L ").concat(PE, ",").concat(rr, " L ").concat(EE, ",").concat(dr, " L ").concat(Ry, ",").concat(dr, " z");
  31006. } else if (t === "mathDivide") {
  31007. CC === void 0 && (CC = 23520), ft === void 0 && (ft = 5880), ke === void 0 && (ke = 11760);
  31008. var Hy = 0.07874015748031496, P5 = 2.8933070866141732, _5 = 5.7866141732283465, q5 = (CC *= Gg) < Hy ? Hy : CC > P5 ? P5 : CC, i7 = (_5 - q5) / 4, e7 = P5 * I / g, A7 = i7 < e7 ? i7 : e7, s7 = (ke *= Gg) < Hy ? Hy : ke > A7 ? A7 : ke, l7 = _5 - 4 * s7 - q5, n7 = g * q5 / dA, ze = g * s7 / Cs, a7 = I * _5 / dA, $5 = ci - n7, o7 = ci + n7, Xy = $5 - (g * ((ft *= Gg) < 0 ? 0 : ft > l7 ? l7 : ft) / Cs + ze) - ze, gH = g - Xy, c7 = qC - a7, d7 = qC + a7;
  31009. i = "M ".concat(qC, ",").concat(Xy, " A ").concat(ze, ",").concat(ze, " 0 1,0 ").concat(qC, ",").concat(Xy + 2 * ze, " A ").concat(ze, ",").concat(ze, " 0 1,0 ").concat(qC, ",").concat(Xy, " z M ").concat(qC, ",").concat(gH, " A ").concat(ze, ",").concat(ze, " 0 1,1 ").concat(qC, ",").concat(gH - 2 * ze, " A ").concat(ze, ",").concat(ze, " 0 1,1 ").concat(qC, ",").concat(gH, " z M ").concat(c7, ",").concat($5, " L ").concat(d7, ",").concat($5, " L ").concat(d7, ",").concat(o7, " L ").concat(c7, ",").concat(o7, " z");
  31010. } else if (t === "mathEqual") {
  31011. CC === void 0 && (CC = 23520), ft === void 0 && (ft = 11760);
  31012. var r7 = 2.8933070866141732, h7 = (CC *= Gg) < 0 ? 0 : CC > r7 ? r7 : CC, b7 = Cs - 2 * h7, u7 = g * h7 / Cs, m7 = g * ((ft *= Gg) < 0 ? 0 : ft > b7 ? b7 : ft) / dA, Z7 = 5.7866141732283465 * I / dA, IH = ci - m7, CH = ci + m7, G7 = IH - u7, w7 = CH + u7, Sy = qC - Z7, Dy = qC + Z7;
  31013. i = "M ".concat(Sy, ",").concat(G7, " L ").concat(Dy, ",").concat(G7, " L ").concat(Dy, ",").concat(IH, " L ").concat(Sy, ",").concat(IH, " z M ").concat(Sy, ",").concat(CH, " L ").concat(Dy, ",").concat(CH, " L ").concat(Dy, ",").concat(w7, " L ").concat(Sy, ",").concat(w7, " z");
  31014. } else if (t === "mathMinus") {
  31015. CC === void 0 && (CC = 23520);
  31016. var p7 = g * ((CC *= Gg) < 0 ? 0 : CC > Cs ? Cs : CC) / dA, B7 = 5.7866141732283465 * I / dA, W7 = ci - p7, y7 = ci + p7, Y7 = qC - B7, N7 = qC + B7;
  31017. i = "M ".concat(Y7, ",").concat(W7, " L ").concat(N7, ",").concat(W7, " L ").concat(N7, ",").concat(y7, " L ").concat(Y7, ",").concat(y7, " z");
  31018. } else if (t === "mathMultiply") {
  31019. CC === void 0 && (CC = 23520), CC *= Gg;
  31020. var tH = 4.091732283464567, V7 = Math.min(I, g) * (CC < 0 ? 0 : CC > tH ? tH : CC) / Cs, iH = Math.atan(g / I), M7 = Math.sin(iH), R7 = Math.cos(iH), eH = Math.tan(iH), f7 = Math.sqrt(I * I + g * g), H7 = f7 - f7 * tH / Cs, X7 = R7 * H7 / 2, S7 = M7 * H7 / 2, D7 = M7 * V7 / 2, K7 = R7 * V7 / 2, Ky = X7 - D7, yu = S7 + K7, Fy = X7 + D7, ky = S7 - K7, F7 = (qC - Fy) * eH + ky, k7 = I - Fy, AH = I - Ky, hng = AH - (ci - yu) / eH, bng = Ky + (ci - yu) / eH, z7 = g - yu, J7 = g - ky, ung = g - F7;
  31021. i = "M ".concat(Ky, ",").concat(yu, " L ").concat(Fy, ",").concat(ky, " L ").concat(qC, ",").concat(F7, " L ").concat(k7, ",").concat(ky, " L ").concat(AH, ",").concat(yu, " L ").concat(hng, ",").concat(ci, " L ").concat(AH, ",").concat(z7, " L ").concat(k7, ",").concat(J7, " L ").concat(qC, ",").concat(ung, " L ").concat(Fy, ",").concat(J7, " L ").concat(Ky, ",").concat(z7, " L ").concat(bng, ",").concat(ci, " z");
  31022. } else if (t === "mathPlus") {
  31023. CC === void 0 && (CC = 23520), CC *= Gg;
  31024. var zy = 5.7866141732283465, mng = Math.min(I, g), L7 = I * zy / dA, v7 = g * zy / dA, Jy = mng * (CC < 0 ? 0 : CC > zy ? zy : CC) / dA, T7 = qC - L7, Ly = qC - Jy, vy = qC + Jy, x7 = qC + L7, j7 = ci - v7, Ty = ci - Jy, xy = ci + Jy, Q7 = ci + v7;
  31025. i = "M ".concat(T7, ",").concat(Ty, " L ").concat(Ly, ",").concat(Ty, " L ").concat(Ly, ",").concat(j7, " L ").concat(vy, ",").concat(j7, " L ").concat(vy, ",").concat(Ty, " L ").concat(x7, ",").concat(Ty, " L ").concat(x7, ",").concat(xy, " L ").concat(vy, ",").concat(xy, " L ").concat(vy, ",").concat(Q7, " L ").concat(Ly, ",").concat(Q7, " L ").concat(Ly, ",").concat(xy, " L ").concat(T7, ",").concat(xy, " z");
  31026. }
  31027. break;
  31028. case "can":
  31029. case "flowChartMagneticDisk":
  31030. case "flowChartMagneticDrum":
  31031. var O7 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Yu = 1.9685039370078738;
  31032. O7 && (Yu = parseInt(O7.substring(4)) * Gg), t !== "flowChartMagneticDisk" && t !== "flowChartMagneticDrum" || (Yu = 3.9370078740157477);
  31033. var U7 = Math.min(I, g), E7 = 3.9370078740157477 * g / U7, Yo = U7 * (Yu < 0 ? 0 : Yu > E7 ? E7 : Yu) / 15.74803149606299, P7 = g - Yo, sH = 180, hr = I / 2, lH = "".concat(Vg(hr, Yo, hr, Yo, 0, sH, !1), " ").concat(Vg(hr, Yo, hr, Yo, sH, 360, !1).replace("M", "L"), " L ").concat(I, ",").concat(P7, " ").concat(Vg(hr, P7, hr, Yo, 0, sH, !1).replace("M", "L"), " L 0,").concat(Yo);
  31034. t === "flowChartMagneticDrum" && (lH = lH.replace(/([MLQC])\s*([-\d.e]+)\s*([-\d.e]+)/gi, function(Mg, RI, YC, QC) {
  31035. var OC = I / 2 - (parseFloat(QC) - g / 2), zi = g / 2 + (parseFloat(YC) - I / 2);
  31036. return "".concat(RI).concat(OC, " ").concat(zi);
  31037. }).replace(/([MLQC])\s*([-\d.e]+)\s*([-\d.e]+)\s*([-\d.e]+)\s*([-\d.e]+)/gi, function(Mg, RI, YC, QC, OC, zi) {
  31038. var UC = I / 2 - (parseFloat(QC) - g / 2), Ct = g / 2 + (parseFloat(YC) - I / 2), Zt = I / 2 - (parseFloat(zi) - g / 2), Ht = g / 2 + (parseFloat(OC) - I / 2);
  31039. return "".concat(RI).concat(UC, " ").concat(Ct, " ").concat(Zt, " ").concat(Ht);
  31040. })), i = lH;
  31041. break;
  31042. case "swooshArrow":
  31043. var _7 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), No = Gg, jy = 25e3 * No, Qy = 16667 * No;
  31044. if (_7) {
  31045. var q7, Oy = HI(_7);
  31046. try {
  31047. for (Oy.s(); !(q7 = Oy.n()).done; ) {
  31048. var nH = q7.value, $7 = U(nH, ["attrs", "name"]);
  31049. $7 === "adj1" ? jy = parseInt(U(nH, ["attrs", "fmla"]).substring(4)) * No : $7 === "adj2" && (Qy = parseInt(U(nH, ["attrs", "fmla"]).substring(4)) * No);
  31050. }
  31051. } catch (Mg) {
  31052. Oy.e(Mg);
  31053. } finally {
  31054. Oy.f();
  31055. }
  31056. }
  31057. var gP = 1 * No, IP = 75e3 * No, CP = 1e5 * No, aH = Math.min(I, g), oH = aH / 8, cH = g / 6, tP = 5.511811023622047 * I / aH, iP = g * (jy < gP ? gP : jy > IP ? IP : jy) / CP, dH = I - aH * (Qy < 0 ? 0 : Qy > tP ? tP : Qy) / CP, eP = oH, AP = Math.PI / 2 / 14, sP = oH * Math.tan(AP), Zng = dH - sP, rH = eP + iP, lP = dH + iP * Math.tan(AP), Gng = lP + sP, nP = rH + oH, wng = nP / 2 - g / 20, png = cH + cH, Bng = I / 6, Wng = rH + cH / 2, yng = I / 4;
  31058. i = "M 0,".concat(g, " Q ").concat(Bng, ",").concat(png, " ").concat(dH, ",").concat(eP, " L ").concat(Zng, ",0 L ").concat(I, ",").concat(wng, " L ").concat(Gng, ",").concat(nP, " L ").concat(lP, ",").concat(rH, " Q ").concat(yng, ",").concat(Wng, " 0,").concat(g, " z");
  31059. break;
  31060. case "circularArrow":
  31061. var aP = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Uy = 0.9842519685039369, Ey = 19.03865 * Math.PI / 180, Py = 340.96135 * Math.PI / 180, _y = 180 * Math.PI / 180, qy = 0.9842519685039369;
  31062. if (aP) {
  31063. var oP, $y = HI(aP);
  31064. try {
  31065. for ($y.s(); !(oP = $y.n()).done; ) {
  31066. var br = oP.value, Nu = U(br, ["attrs", "name"]);
  31067. Nu === "adj1" ? Uy = parseInt(U(br, ["attrs", "fmla"]).substring(4)) * Gg : Nu === "adj2" ? Ey = parseInt(U(br, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Nu === "adj3" ? Py = parseInt(U(br, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Nu === "adj4" ? _y = parseInt(U(br, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Nu === "adj5" && (qy = parseInt(U(br, ["attrs", "fmla"]).substring(4)) * Gg);
  31068. }
  31069. } catch (Mg) {
  31070. $y.e(Mg);
  31071. } finally {
  31072. $y.f();
  31073. }
  31074. }
  31075. var Vo = I / 2, Mo = g / 2, Yng = I / 2, Nng = g / 2, cP = Math.min(I, g), dP = 1.9685039370078738, rP = 7.874015748031495, hP = 1 / 6e4 * Math.PI / 180, gY = 21599999 / 6e4 * Math.PI / 180, Ro = 2 * Math.PI, bP = qy < 0 ? 0 : qy > dP ? dP : qy, uP = 2 * bP, ur = Py < hP ? hP : Py > gY ? gY : Py, hH = _y < 0 ? 0 : _y > gY ? gY : _y, bH = cP * (Uy < 0 ? 0 : Uy > uP ? uP : Uy) / rP, fo = cP * bP / rP, IY = bH / 2, mr = Yng + IY - fo, Zr = Nng + IY - fo, Ho = mr - bH, Xo = Zr - bH, CY = Ho + IY, tY = Xo + IY, mP = CY * Math.sin(ur), ZP = tY * Math.cos(ur), vn = CY * Math.cos(Math.atan2(mP, ZP)), Gr = tY * Math.sin(Math.atan2(mP, ZP)), GP = Vo + vn, wP = Mo + Gr, di = Math.min(Ho, Xo), Vng = 1 - (vn * vn - di * di) * (Gr * Gr - di * di) / (vn * vn * Gr * Gr), uH = (1 + Math.sqrt(Vng)) / ((vn * vn - di * di) / vn / Gr), mH = Math.atan2(uH, 1) > 0 ? Math.atan2(uH, 1) : Math.atan2(uH, 1) + Ro, ZH = mH - ur > 0 ? mH - ur : mH - ur + Ro, Mng = ZH - Math.PI > 0 ? ZH - Ro : ZH, pP = Math.abs(Mng), wr = ur + (Ey < 0 ? 0 : Ey > pP ? pP : Ey), BP = CY * Math.sin(wr), WP = tY * Math.cos(wr), Rng = Vo + CY * Math.cos(Math.atan2(BP, WP)), fng = Mo + tY * Math.sin(Math.atan2(BP, WP)), yP = GP + fo * Math.cos(wr), YP = wP + fo * Math.sin(wr), NP = GP - fo * Math.cos(wr), VP = wP - fo * Math.sin(wr), MP = NP - Vo, RP = VP - Mo, fP = yP - Vo, HP = YP - Mo, Tn = Math.min(mr, Zr), XP = MP * Tn / mr, SP = RP * Tn / Zr, iY = fP * Tn / mr, eY = HP * Tn / Zr, pr = iY - XP, So = eY - SP, ts = Math.sqrt(pr * pr + So * So), Br = XP * eY - iY * SP, AY = Math.sqrt(Math.max(0, Tn * Tn * ts * ts - Br * Br)), sY = -1 * So > 0 ? -1 : 1, DP = (Br * So + sY * pr * AY) / (ts * ts), KP = (Br * So - sY * pr * AY) / (ts * ts), FP = (-Br * pr + Math.abs(So) * AY) / (ts * ts), kP = (-Br * pr - Math.abs(So) * AY) / (ts * ts), zP = Math.sqrt(Math.pow(iY - KP, 2) + Math.pow(eY - kP, 2)) - Math.sqrt(Math.pow(iY - DP, 2) + Math.pow(eY - FP, 2)), GH = Vo + (zP > 0 ? DP : KP) * mr / Tn, wH = Mo + (zP > 0 ? FP : kP) * Zr / Tn, lY = MP * di / Ho, nY = RP * di / Xo, JP = fP * di / Ho, LP = HP * di / Xo, Wr = JP - lY, yr = LP - nY, is = Math.sqrt(Wr * Wr + yr * yr), Yr = lY * LP - JP * nY, aY = Math.sqrt(Math.max(0, di * di * is * is - Yr * Yr)), vP = (Yr * yr + sY * Wr * aY) / (is * is), TP = (Yr * yr - sY * Wr * aY) / (is * is), xP = (-Yr * Wr + Math.abs(yr) * aY) / (is * is), jP = (-Yr * Wr - Math.abs(yr) * aY) / (is * is), QP = Math.sqrt(Math.pow(lY - TP, 2) + Math.pow(nY - jP, 2)) - Math.sqrt(Math.pow(lY - vP, 2) + Math.pow(nY - xP, 2)), OP = QP > 0 ? vP : TP, UP = QP > 0 ? xP : jP, pH = Vo + OP * Ho / di, BH = Mo + UP * Xo / di, WH = Math.atan2(UP * Xo / di, OP * Ho / di), EP = WH > 0 ? WH : WH + Ro, yH = hH - EP, Hng = yH > 0 ? yH - Ro : yH, oY = Math.sqrt(Math.pow(GH - pH, 2) + Math.pow(wH - BH, 2)) / 2 - fo, Xng = oY > 0 ? GH : yP, Sng = oY > 0 ? wH : YP, Dng = oY > 0 ? pH : NP, Kng = oY > 0 ? BH : VP, YH = Math.atan2(wH - Mo, GH - Vo), NH = (YH > 0 ? YH : YH + Ro) - hH, Fng = NH > 0 ? NH : NH + Ro, PP = 180 * hH / Math.PI, kng = PP + 180 * Fng / Math.PI, _P = 180 * EP / Math.PI, zng = _P + 180 * Hng / Math.PI;
  31076. i = "".concat(Vg(I / 2, g / 2, mr, Zr, PP, kng, !1), " L ").concat(Xng, ",").concat(Sng, " L ").concat(Rng, ",").concat(fng, " L ").concat(Dng, ",").concat(Kng, " L ").concat(pH, ",").concat(BH, " ").concat(Vg(I / 2, g / 2, Ho, Xo, _P, zng, !1).replace("M", "L"), " z");
  31077. break;
  31078. case "leftCircularArrow":
  31079. var qP = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), cY = 0.9842519685039369, dY = -19.03865 * Math.PI / 180, rY = 19.03865 * Math.PI / 180, hY = 180 * Math.PI / 180, bY = 0.9842519685039369;
  31080. if (qP) {
  31081. var $P, uY = HI(qP);
  31082. try {
  31083. for (uY.s(); !($P = uY.n()).done; ) {
  31084. var Nr = $P.value, Vu = U(Nr, ["attrs", "name"]);
  31085. Vu === "adj1" ? cY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) * Gg : Vu === "adj2" ? dY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Vu === "adj3" ? rY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Vu === "adj4" ? hY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Vu === "adj5" && (bY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) * Gg);
  31086. }
  31087. } catch (Mg) {
  31088. uY.e(Mg);
  31089. } finally {
  31090. uY.f();
  31091. }
  31092. }
  31093. var sl = I / 2, ll = g / 2, Jng = I / 2, Lng = g / 2, g6 = Math.min(I, g), I6 = 1.9685039370078738, C6 = 7.874015748031495, t6 = 1 / 6e4 * Math.PI / 180, mY = 21599999 / 6e4 * Math.PI / 180, Do = 2 * Math.PI, i6 = bY < 0 ? 0 : bY > I6 ? I6 : bY, e6 = 2 * i6, Vr = rY < t6 ? t6 : rY > mY ? mY : rY, xn = hY < 0 ? 0 : hY > mY ? mY : hY, VH = g6 * (cY < 0 ? 0 : cY > e6 ? e6 : cY) / C6, Ko = g6 * i6 / C6, ZY = VH / 2, Fo = Jng + ZY - Ko, ko = Lng + ZY - Ko, jn = Fo - VH, Qn = ko - VH, A6 = jn + ZY, s6 = Qn + ZY, On = A6 * Math.cos(Vr), Mr = s6 * Math.sin(Vr), l6 = sl + On, n6 = ll + Mr, ri = Math.min(jn, Qn), vng = 1 - (On * On - ri * ri) * (Mr * Mr - ri * ri) / (On * On * Mr * Mr), MH = (1 + Math.sqrt(vng)) / ((On * On - ri * ri) / On / Mr), RH = Math.atan2(MH, 1) > 0 ? Math.atan2(MH, 1) : Math.atan2(MH, 1) + Do, fH = RH - Vr > 0 ? RH - Vr : RH - Vr + Do, Tng = fH - Math.PI > 0 ? fH - Do : fH, a6 = -Math.abs(Tng), Rr = Vr + (dY < a6 ? a6 : dY > 0 ? 0 : dY), xng = sl + A6 * Math.cos(Rr), jng = ll + s6 * Math.sin(Rr), Qng = sl + Fo * Math.cos(xn), Ong = ll + ko * Math.sin(xn), Ung = sl + jn * Math.cos(xn), Eng = ll + Qn * Math.sin(xn), o6 = l6 + Ko * Math.cos(Rr), c6 = n6 + Ko * Math.sin(Rr), d6 = l6 - Ko * Math.cos(Rr), r6 = n6 - Ko * Math.sin(Rr), h6 = d6 - sl, b6 = r6 - ll, u6 = o6 - sl, m6 = c6 - ll, Un = Math.min(Fo, ko), Z6 = h6 * Un / Fo, G6 = b6 * Un / ko, GY = u6 * Un / Fo, wY = m6 * Un / ko, fr = GY - Z6, zo = wY - G6, es = Math.sqrt(fr * fr + zo * zo), Hr = Z6 * wY - GY * G6, pY = Math.sqrt(Math.max(0, Un * Un * es * es - Hr * Hr)), BY = -1 * zo > 0 ? -1 : 1, w6 = (Hr * zo + BY * fr * pY) / (es * es), p6 = (Hr * zo - BY * fr * pY) / (es * es), B6 = (-Hr * fr + Math.abs(zo) * pY) / (es * es), W6 = (-Hr * fr - Math.abs(zo) * pY) / (es * es), y6 = Math.sqrt(Math.pow(GY - p6, 2) + Math.pow(wY - W6, 2)) - Math.sqrt(Math.pow(GY - w6, 2) + Math.pow(wY - B6, 2)), WY = sl + (y6 > 0 ? w6 : p6) * Fo / Un, yY = ll + (y6 > 0 ? B6 : W6) * ko / Un, YY = h6 * ri / jn, NY = b6 * ri / Qn, Y6 = u6 * ri / jn, N6 = m6 * ri / Qn, Xr = Y6 - YY, Sr = N6 - NY, As = Math.sqrt(Xr * Xr + Sr * Sr), Dr = YY * N6 - Y6 * NY, VY = Math.sqrt(Math.max(0, ri * ri * As * As - Dr * Dr)), V6 = (Dr * Sr + BY * Xr * VY) / (As * As), M6 = (Dr * Sr - BY * Xr * VY) / (As * As), R6 = (-Dr * Xr + Math.abs(Sr) * VY) / (As * As), f6 = (-Dr * Xr - Math.abs(Sr) * VY) / (As * As), H6 = Math.sqrt(Math.pow(YY - M6, 2) + Math.pow(NY - f6, 2)) - Math.sqrt(Math.pow(YY - V6, 2) + Math.pow(NY - R6, 2)), X6 = H6 > 0 ? V6 : M6, S6 = H6 > 0 ? R6 : f6, D6 = sl + X6 * jn / ri, K6 = ll + S6 * Qn / ri, HH = Math.atan2(S6 * Qn / ri, X6 * jn / ri), F6 = HH > 0 ? HH : HH + Do, XH = xn - F6, k6 = XH > 0 ? XH : XH + Do, Png = F6 + k6, _ng = -k6, MY = Math.sqrt(Math.pow(WY - D6, 2) + Math.pow(yY - K6, 2)) / 2 - Ko, qng = MY > 0 ? WY : o6, $ng = MY > 0 ? yY : c6, gag = MY > 0 ? D6 : d6, Iag = MY > 0 ? K6 : r6, SH = Math.atan2(yY - ll, WY - sl), DH = (SH > 0 ? SH : SH + Do) - xn, Cag = 180 * (xn + (DH > 0 ? DH - Do : DH)) / Math.PI, tag = 180 * xn / Math.PI, z6 = 180 * Png / Math.PI, iag = z6 + 180 * _ng / Math.PI;
  31094. i = "M ".concat(Qng, ",").concat(Ong, " L ").concat(Ung, ",").concat(Eng, " ").concat(Vg(I / 2, g / 2, jn, Qn, z6, iag, !1).replace("M", "L"), " L ").concat(gag, ",").concat(Iag, " L ").concat(xng, ",").concat(jng, " L ").concat(qng, ",").concat($ng, " L ").concat(WY, ",").concat(yY, " ").concat(Vg(I / 2, g / 2, Fo, ko, Cag, tag, !1).replace("M", "L"), " z");
  31095. }
  31096. return i;
  31097. }
  31098. function FX(t, I) {
  31099. if (!t || !I) return null;
  31100. var g = U(t, [I, "p:transition"]);
  31101. return g || ((g = U(t, [I, "mc:AlternateContent", "mc:Choice", "p:transition"])) ? g : g = U(t, [I, "mc:AlternateContent", "mc:Fallback", "p:transition"]));
  31102. }
  31103. function Mbg(t) {
  31104. if (!t) return null;
  31105. var I = { type: "none", duration: 1e3, direction: null }, g = t.attrs || {}, C = !1, i = /^p\d{2}:dur$/;
  31106. for (var e in g) if (i.test(e) && !isNaN(parseInt(g[e], 10))) {
  31107. I.duration = parseInt(g[e], 10), C = !0;
  31108. break;
  31109. }
  31110. if (!C && g.spd) switch (g.spd) {
  31111. case "slow":
  31112. default:
  31113. I.duration = 1e3;
  31114. break;
  31115. case "med":
  31116. I.duration = 800;
  31117. break;
  31118. case "fast":
  31119. I.duration = 500;
  31120. }
  31121. g.advClick === "0" && g.advTm && (I.autoNextAfter = parseInt(g.advTm, 10));
  31122. var A = /^(p|p\d{2}):/;
  31123. for (var s in t) if (s !== "attrs" && A.test(s)) {
  31124. var l = t[s];
  31125. if (I.type = s.substring(s.indexOf(":") + 1), l && l.attrs) {
  31126. var n = l.attrs;
  31127. n.dur && !isNaN(parseInt(n.dur, 10)) && (C || (I.duration = parseInt(n.dur, 10))), n.dir && (I.direction = n.dir);
  31128. }
  31129. break;
  31130. }
  31131. return I;
  31132. }
  31133. function Yq(t, I) {
  31134. var g = Object.keys(t);
  31135. if (Object.getOwnPropertySymbols) {
  31136. var C = Object.getOwnPropertySymbols(t);
  31137. I && (C = C.filter(function(i) {
  31138. return Object.getOwnPropertyDescriptor(t, i).enumerable;
  31139. })), g.push.apply(g, C);
  31140. }
  31141. return g;
  31142. }
  31143. function ti(t) {
  31144. for (var I = 1; I < arguments.length; I++) {
  31145. var g = arguments[I] != null ? arguments[I] : {};
  31146. I % 2 ? Yq(Object(g), !0).forEach(function(C) {
  31147. f9(t, C, g[C]);
  31148. }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(g)) : Yq(Object(g)).forEach(function(C) {
  31149. Object.defineProperty(t, C, Object.getOwnPropertyDescriptor(g, C));
  31150. });
  31151. }
  31152. return t;
  31153. }
  31154. function wC(t, I) {
  31155. var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
  31156. if (!g) {
  31157. if (Array.isArray(t) || (g = function(l, n) {
  31158. if (l) {
  31159. if (typeof l == "string") return Nq(l, n);
  31160. var a = Object.prototype.toString.call(l).slice(8, -1);
  31161. if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
  31162. if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return Nq(l, n);
  31163. }
  31164. }(t)) || I) {
  31165. g && (t = g);
  31166. var C = 0, i = function() {
  31167. };
  31168. return { s: i, n: function() {
  31169. return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
  31170. }, e: function(l) {
  31171. throw l;
  31172. }, f: i };
  31173. }
  31174. throw new TypeError(`Invalid attempt to iterate non-iterable instance.
  31175. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
  31176. }
  31177. var e, A = !0, s = !1;
  31178. return { s: function() {
  31179. g = g.call(t);
  31180. }, n: function() {
  31181. var l = g.next();
  31182. return A = l.done, l;
  31183. }, e: function(l) {
  31184. s = !0, e = l;
  31185. }, f: function() {
  31186. try {
  31187. A || g.return == null || g.return();
  31188. } finally {
  31189. if (s) throw e;
  31190. }
  31191. } };
  31192. }
  31193. function Nq(t, I) {
  31194. (I == null || I > t.length) && (I = t.length);
  31195. for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
  31196. return C;
  31197. }
  31198. function Ptg(t) {
  31199. var I = U(t, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(t, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(t, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]);
  31200. if (!I) return null;
  31201. var g = U(I, ["attrs", "type"]);
  31202. return g ? String(g) : null;
  31203. }
  31204. function _tg(t) {
  31205. return t === "dt" || t === "sldNum" || t === "ftr" || t === "hdr";
  31206. }
  31207. function Rbg(t) {
  31208. return U(t, ["p:nvSpPr", "p:cNvPr", "attrs", "name"]) || U(t, ["p:nvPicPr", "p:cNvPr", "attrs", "name"]) || U(t, ["p:nvGraphicFramePr", "p:cNvPr", "attrs", "name"]) || "";
  31209. }
  31210. function qtg(t) {
  31211. if (!t) return !1;
  31212. var I = String(t);
  31213. return /(^|\b)(Footer Text|Header Text|Slide Number|Date)(\b|$)/i.test(I) || /页脚|页眉|页码|日期/.test(I);
  31214. }
  31215. function $tg(t) {
  31216. return String(t || "").replace(/<[^>]+>/g, "").replace(/&nbsp;/g, " ").trim();
  31217. }
  31218. function fbg(t) {
  31219. var I = String(t || "").replace(/\s+/g, " ").trim();
  31220. if (!I) return !1;
  31221. var g = I.toLowerCase();
  31222. return g === "click to add title" || g === "click to add text" || g === "click to add subtitle" || g === "click to add notes" || /edit\s+master/.test(g) || /edit\s+the\s+master/.test(g) || /edit\s+master\s+(title|text)/.test(g) || I === "此处添加标题" || I === "单击以添加标题" || I === "单击此处添加标题" || I === "此处添加文本" || I === "单击以添加文本" || I === "单击此处添加文本" || I === "单击以添加副标题" || I === "单击此处添加副标题" || I.includes("编辑母版");
  31223. }
  31224. function Hbg(t, I) {
  31225. if (!t || t.type !== "text" || !Number.isFinite(I) || I <= 0 || !Number.isFinite(t.top) || !Number.isFinite(t.height)) return !1;
  31226. var g = $tg(t.content);
  31227. if (!g) return !1;
  31228. var C = t.top > 0.78 * I, i = t.height < 0.2 * I;
  31229. if (!C || !i) return !1;
  31230. var e = /^[0-9]{1,3}$/.test(g), A = /^(\d{4}[\-/]\d{1,2}[\-/]\d{1,2})$/.test(g) || /(年\d{1,2}月\d{1,2}日)$/.test(g), s = /页码|日期/.test(g);
  31231. return e || A || s;
  31232. }
  31233. function fD(t, I) {
  31234. var g, C = [], i = wC(t || []);
  31235. try {
  31236. for (i.s(); !(g = i.n()).done; ) {
  31237. var e = g.value;
  31238. if (e && !qtg(e.name) && !(Hbg(e, I) || e.type === "text" && fbg($tg(e.content)))) if (Array.isArray(e.elements)) {
  31239. var A = fD(e.elements, I);
  31240. if (!A.length) continue;
  31241. C.push(ti(ti({}, e), {}, { elements: A }));
  31242. } else C.push(e);
  31243. }
  31244. } catch (s) {
  31245. i.e(s);
  31246. } finally {
  31247. i.f();
  31248. }
  31249. return C;
  31250. }
  31251. function HD(t) {
  31252. if (!Array.isArray(t)) return t;
  31253. for (var I = 0; I < t.length; I++) {
  31254. var g = t[I];
  31255. g && _a(g) === "object" && (g.order = I, Array.isArray(g.elements) && HD(g.elements));
  31256. }
  31257. return t;
  31258. }
  31259. function Xbg(t, I) {
  31260. var g = fD(t.elements, I), C = fD(t.layoutElements, I);
  31261. return HD(g), HD(C), ti(ti({}, t), {}, { elements: g, layoutElements: C });
  31262. }
  31263. function Ul(t, I, g) {
  31264. t && Array.isArray(t.trace) && (g === void 0 ? t.trace.push({ step: I }) : t.trace.push({ step: I, data: g }));
  31265. }
  31266. function Sbg(t) {
  31267. return XD.apply(this, arguments);
  31268. }
  31269. function XD() {
  31270. return XD = SC(bI.mark(function t(I) {
  31271. var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p = arguments;
  31272. return bI.wrap(function(Y) {
  31273. for (; ; ) switch (Y.prev = Y.next) {
  31274. case 0:
  31275. return g = p.length > 1 && p[1] !== void 0 ? p[1] : {}, C = [], Y.next = 4, x0g.loadAsync(I);
  31276. case 4:
  31277. return i = Y.sent, Y.next = 7, Dbg(i);
  31278. case 7:
  31279. return e = Y.sent, Y.next = 10, Kbg(i);
  31280. case 10:
  31281. return A = Y.sent, s = A.width, l = A.height, n = A.defaultTextStyle, a = A.headerFooter, Y.next = 17, Fbg(i);
  31282. case 17:
  31283. return d = Y.sent, o = d.themeContent, c = d.themeColors, Y.next = 22, kbg(i);
  31284. case 22:
  31285. r = Y.sent, h = r.length ? r : e.slides, b = 0;
  31286. case 25:
  31287. if (!(b < h.length)) {
  31288. Y.next = 35;
  31289. break;
  31290. }
  31291. return u = h[b], m = b + 1, Y.next = 30, zbg(i, u, o, n, a, m, g);
  31292. case 30:
  31293. Z = Y.sent, C.push(Xbg(Z, l));
  31294. case 32:
  31295. b++, Y.next = 25;
  31296. break;
  31297. case 35:
  31298. return Y.abrupt("return", { slides: C, themeColors: c, size: { width: s, height: l } });
  31299. case 36:
  31300. case "end":
  31301. return Y.stop();
  31302. }
  31303. }, t);
  31304. })), XD.apply(this, arguments);
  31305. }
  31306. function Dbg(t) {
  31307. return gig.apply(this, arguments);
  31308. }
  31309. function gig() {
  31310. return (gig = SC(bI.mark(function t(I) {
  31311. var g, C, i, e, A, s, l, n;
  31312. return bI.wrap(function(a) {
  31313. for (; ; ) switch (a.prev = a.next) {
  31314. case 0:
  31315. return a.next = 2, yt(I, "[Content_Types].xml");
  31316. case 2:
  31317. g = a.sent, C = g.Types.Override, i = [], e = [], A = wC(C), a.prev = 7, A.s();
  31318. case 9:
  31319. if ((s = A.n()).done) {
  31320. a.next = 20;
  31321. break;
  31322. }
  31323. l = s.value, a.t0 = l.attrs.ContentType, a.next = a.t0 === "application/vnd.openxmlformats-officedocument.presentationml.slide+xml" ? 14 : a.t0 === "application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml" ? 16 : 18;
  31324. break;
  31325. case 14:
  31326. return i.push(l.attrs.PartName.substr(1)), a.abrupt("break", 18);
  31327. case 16:
  31328. return e.push(l.attrs.PartName.substr(1)), a.abrupt("break", 18);
  31329. case 18:
  31330. a.next = 9;
  31331. break;
  31332. case 20:
  31333. a.next = 25;
  31334. break;
  31335. case 22:
  31336. a.prev = 22, a.t1 = a.catch(7), A.e(a.t1);
  31337. case 25:
  31338. return a.prev = 25, A.f(), a.finish(25);
  31339. case 28:
  31340. return n = function(d, o) {
  31341. return +/(\d+)\.xml/.exec(d)[1] - +/(\d+)\.xml/.exec(o)[1];
  31342. }, i = i.sort(n), e = e.sort(n), a.abrupt("return", { slides: i, slideLayouts: e });
  31343. case 32:
  31344. case "end":
  31345. return a.stop();
  31346. }
  31347. }, t, null, [[7, 22, 25, 28]]);
  31348. }))).apply(this, arguments);
  31349. }
  31350. function Kbg(t) {
  31351. return SD.apply(this, arguments);
  31352. }
  31353. function SD() {
  31354. return SD = SC(bI.mark(function t(I) {
  31355. var g, C, i, e, A, s, l;
  31356. return bI.wrap(function(n) {
  31357. for (; ; ) switch (n.prev = n.next) {
  31358. case 0:
  31359. return n.next = 2, yt(I, "ppt/presentation.xml");
  31360. case 2:
  31361. return g = n.sent, C = g["p:presentation"]["p:sldSz"].attrs, i = g["p:presentation"]["p:defaultTextStyle"], e = function(a) {
  31362. if (a != null) {
  31363. var d = String(a).toLowerCase();
  31364. return d === "1" || d === "true" || d === "on";
  31365. }
  31366. }, A = function(a) {
  31367. return a === void 0 || a;
  31368. }, s = U(g, ["p:presentation", "p:hf", "attrs"]), l = { dt: A(e(U(s, ["dt"]))), ftr: A(e(U(s, ["ftr"]))), hdr: A(e(U(s, ["hdr"]))), sldNum: A(e(U(s, ["sldNum"]))) }, n.abrupt("return", { width: parseInt(C.cx) * Gg, height: parseInt(C.cy) * Gg, defaultTextStyle: i, headerFooter: l });
  31369. case 10:
  31370. case "end":
  31371. return n.stop();
  31372. }
  31373. }, t);
  31374. })), SD.apply(this, arguments);
  31375. }
  31376. function Fbg(t) {
  31377. return DD.apply(this, arguments);
  31378. }
  31379. function DD() {
  31380. return DD = SC(bI.mark(function t(I) {
  31381. var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m;
  31382. return bI.wrap(function(Z) {
  31383. for (; ; ) switch (Z.prev = Z.next) {
  31384. case 0:
  31385. return Z.next = 2, yt(I, "ppt/_rels/presentation.xml.rels");
  31386. case 2:
  31387. if (g = Z.sent, (C = g.Relationships.Relationship).constructor !== Array) {
  31388. Z.next = 25;
  31389. break;
  31390. }
  31391. e = wC(C), Z.prev = 6, e.s();
  31392. case 8:
  31393. if ((A = e.n()).done) {
  31394. Z.next = 15;
  31395. break;
  31396. }
  31397. if ((s = A.value).attrs.Type !== "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme") {
  31398. Z.next = 13;
  31399. break;
  31400. }
  31401. return i = s.attrs.Target, Z.abrupt("break", 15);
  31402. case 13:
  31403. Z.next = 8;
  31404. break;
  31405. case 15:
  31406. Z.next = 20;
  31407. break;
  31408. case 17:
  31409. Z.prev = 17, Z.t0 = Z.catch(6), e.e(Z.t0);
  31410. case 20:
  31411. return Z.prev = 20, e.f(), Z.finish(20);
  31412. case 23:
  31413. Z.next = 26;
  31414. break;
  31415. case 25:
  31416. C.attrs.Type === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" && (i = C.attrs.Target);
  31417. case 26:
  31418. return Z.next = 28, yt(I, "ppt/" + i);
  31419. case 28:
  31420. if (l = Z.sent, n = [], !(a = U(l, ["a:theme", "a:themeElements", "a:clrScheme"]))) {
  31421. Z.next = 46;
  31422. break;
  31423. }
  31424. d = Object.keys(a), o = 0, c = d;
  31425. case 34:
  31426. if (!(o < c.length)) {
  31427. Z.next = 46;
  31428. break;
  31429. }
  31430. if ((r = c[o]).startsWith("a:")) {
  31431. Z.next = 38;
  31432. break;
  31433. }
  31434. return Z.abrupt("continue", 43);
  31435. case 38:
  31436. h = a[r], b = U(h, ["a:srgbClr", "attrs", "val"]), u = U(h, ["a:sysClr", "attrs", "lastClr"]), (m = b || u) && n.push("#" + m);
  31437. case 43:
  31438. o++, Z.next = 34;
  31439. break;
  31440. case 46:
  31441. return Z.abrupt("return", { themeContent: l, themeColors: n });
  31442. case 47:
  31443. case "end":
  31444. return Z.stop();
  31445. }
  31446. }, t, null, [[6, 17, 20, 23]]);
  31447. })), DD.apply(this, arguments);
  31448. }
  31449. function kbg(t) {
  31450. return KD.apply(this, arguments);
  31451. }
  31452. function KD() {
  31453. return KD = SC(bI.mark(function t(I) {
  31454. var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z;
  31455. return bI.wrap(function(p) {
  31456. for (; ; ) switch (p.prev = p.next) {
  31457. case 0:
  31458. return p.next = 2, yt(I, "ppt/presentation.xml");
  31459. case 2:
  31460. return g = p.sent, p.next = 5, yt(I, "ppt/_rels/presentation.xml.rels");
  31461. case 5:
  31462. if (C = p.sent, g && C) {
  31463. p.next = 8;
  31464. break;
  31465. }
  31466. return p.abrupt("return", []);
  31467. case 8:
  31468. i = U(g, ["p:presentation", "p:sldIdLst", "p:sldId"]), e = Array.isArray(i) ? i : i ? [i] : [], A = U(C, ["Relationships", "Relationship"]), s = Array.isArray(A) ? A : A ? [A] : [], l = /* @__PURE__ */ new Map(), n = wC(s), p.prev = 14, n.s();
  31469. case 16:
  31470. if ((a = n.n()).done) {
  31471. p.next = 28;
  31472. break;
  31473. }
  31474. if (d = a.value, U(d, ["attrs", "Type"]) === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide") {
  31475. p.next = 21;
  31476. break;
  31477. }
  31478. return p.abrupt("continue", 26);
  31479. case 21:
  31480. if (o = U(d, ["attrs", "Id"]), c = U(d, ["attrs", "Target"]), o && c) {
  31481. p.next = 25;
  31482. break;
  31483. }
  31484. return p.abrupt("continue", 26);
  31485. case 25:
  31486. l.set(String(o), String(c));
  31487. case 26:
  31488. p.next = 16;
  31489. break;
  31490. case 28:
  31491. p.next = 33;
  31492. break;
  31493. case 30:
  31494. p.prev = 30, p.t0 = p.catch(14), n.e(p.t0);
  31495. case 33:
  31496. return p.prev = 33, n.f(), p.finish(33);
  31497. case 36:
  31498. r = [], h = wC(e), p.prev = 38, h.s();
  31499. case 40:
  31500. if ((b = h.n()).done) {
  31501. p.next = 51;
  31502. break;
  31503. }
  31504. if (u = b.value, m = U(u, ["attrs", "r:id"])) {
  31505. p.next = 45;
  31506. break;
  31507. }
  31508. return p.abrupt("continue", 49);
  31509. case 45:
  31510. if (Z = l.get(String(m))) {
  31511. p.next = 48;
  31512. break;
  31513. }
  31514. return p.abrupt("continue", 49);
  31515. case 48:
  31516. Z.startsWith("ppt/") ? r.push(Z) : Z.startsWith("../") ? r.push(Z.replace("../", "ppt/")) : r.push("ppt/" + Z.replace(/^\//, ""));
  31517. case 49:
  31518. p.next = 40;
  31519. break;
  31520. case 51:
  31521. p.next = 56;
  31522. break;
  31523. case 53:
  31524. p.prev = 53, p.t1 = p.catch(38), h.e(p.t1);
  31525. case 56:
  31526. return p.prev = 56, h.f(), p.finish(56);
  31527. case 59:
  31528. return p.abrupt("return", r);
  31529. case 60:
  31530. case "end":
  31531. return p.stop();
  31532. }
  31533. }, t, null, [[14, 30, 33, 36], [38, 53, 56, 59]]);
  31534. })), KD.apply(this, arguments);
  31535. }
  31536. function zbg(t, I, g, C, i, e) {
  31537. return FD.apply(this, arguments);
  31538. }
  31539. function FD() {
  31540. return FD = SC(bI.mark(function t(I, g, C, i, e, A) {
  31541. var s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og, cg, rg, dg, Bg, Zg, Xg, Kg, kg, Wg, Ng, wg, fg, Jg, zg, cI, YI, Eg, aI, dI, _g, xI, SI, eI, NI, EI, oI, LI = arguments;
  31542. return bI.wrap(function(pg) {
  31543. for (; ; ) switch (pg.prev = pg.next) {
  31544. case 0:
  31545. return s = LI.length > 6 && LI[6] !== void 0 ? LI[6] : {}, l = g.replace("slides/slide", "slides/_rels/slide") + ".rels", pg.next = 4, yt(I, l);
  31546. case 4:
  31547. n = pg.sent, (a = n.Relationships.Relationship).constructor !== Array && (a = [a]), d = "", o = "", c = "", r = "", h = [], b = {}, u = {}, m = {}, Z = {}, p = {}, Y = wC(a), pg.prev = 18, Y.s();
  31548. case 20:
  31549. if ((R = Y.n()).done) {
  31550. pg.next = 37;
  31551. break;
  31552. }
  31553. X = R.value, pg.t0 = X.attrs.Type, pg.next = pg.t0 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" ? 25 : pg.t0 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide" ? 28 : pg.t0 === "http://schemas.microsoft.com/office/2007/relationships/diagramDrawing" ? 31 : (pg.t0 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" || pg.t0 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart" || pg.t0, 34);
  31554. break;
  31555. case 25:
  31556. return o = X.attrs.Target.replace("../", "ppt/"), b[X.attrs.Id] = { type: X.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: X.attrs.Target.replace("../", "ppt/") }, pg.abrupt("break", 35);
  31557. case 28:
  31558. return d = X.attrs.Target.replace("../", "ppt/"), b[X.attrs.Id] = { type: X.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: X.attrs.Target.replace("../", "ppt/") }, pg.abrupt("break", 35);
  31559. case 31:
  31560. return h.push(X.attrs.Target.replace("../", "ppt/")), b[X.attrs.Id] = { type: "diagramDrawing", target: X.attrs.Target.replace("../", "ppt/") }, pg.abrupt("break", 35);
  31561. case 34:
  31562. b[X.attrs.Id] = { type: X.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: X.attrs.Target.replace("../", "ppt/") };
  31563. case 35:
  31564. pg.next = 20;
  31565. break;
  31566. case 37:
  31567. pg.next = 42;
  31568. break;
  31569. case 39:
  31570. pg.prev = 39, pg.t1 = pg.catch(18), Y.e(pg.t1);
  31571. case 42:
  31572. return pg.prev = 42, Y.f(), pg.finish(42);
  31573. case 45:
  31574. return H = s && s.trace ? [] : null, (S = !!H) && H.push({ step: "slide/rels", data: { slideNo: A, sldFileName: g, slideRels: l, noteFilename: d, layoutFilename: o } }), pg.next = 50, yt(I, d);
  31575. case 50:
  31576. return z = pg.sent, v = Jbg(z), pg.next = 54, yt(I, o);
  31577. case 54:
  31578. return K = pg.sent, pg.next = 57, Vq(K);
  31579. case 57:
  31580. return V = pg.sent, N = o.replace("slideLayouts/slideLayout", "slideLayouts/_rels/slideLayout") + ".rels", pg.next = 61, yt(I, N);
  31581. case 61:
  31582. B = pg.sent, (a = B.Relationships.Relationship).constructor !== Array && (a = [a]), G = wC(a), pg.prev = 65, G.s();
  31583. case 67:
  31584. if ((w = G.n()).done) {
  31585. pg.next = 77;
  31586. break;
  31587. }
  31588. W = w.value, pg.t2 = W.attrs.Type, pg.next = pg.t2 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster" ? 72 : 74;
  31589. break;
  31590. case 72:
  31591. return c = W.attrs.Target.replace("../", "ppt/"), pg.abrupt("break", 75);
  31592. case 74:
  31593. u[W.attrs.Id] = { type: W.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: W.attrs.Target.replace("../", "ppt/") };
  31594. case 75:
  31595. pg.next = 67;
  31596. break;
  31597. case 77:
  31598. pg.next = 82;
  31599. break;
  31600. case 79:
  31601. pg.prev = 79, pg.t3 = pg.catch(65), G.e(pg.t3);
  31602. case 82:
  31603. return pg.prev = 82, G.f(), pg.finish(82);
  31604. case 85:
  31605. return S && H.push({ step: "slideLayout/rels", data: { slideLayout: o, slideLayoutRels: N, slideMaster: c } }), pg.next = 88, yt(I, c);
  31606. case 88:
  31607. return y = pg.sent, f = U(y, ["p:sldMaster", "p:txStyles"]), D = Vq(y), F = c.replace("slideMasters/slideMaster", "slideMasters/_rels/slideMaster") + ".rels", pg.next = 94, yt(I, F);
  31608. case 94:
  31609. T = pg.sent, (a = T.Relationships.Relationship).constructor !== Array && (a = [a]), Q = wC(a), pg.prev = 98, Q.s();
  31610. case 100:
  31611. if ((P = Q.n()).done) {
  31612. pg.next = 110;
  31613. break;
  31614. }
  31615. L = P.value, pg.t4 = L.attrs.Type, pg.next = pg.t4 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" ? 105 : 107;
  31616. break;
  31617. case 105:
  31618. return r = L.attrs.Target.replace("../", "ppt/"), pg.abrupt("break", 108);
  31619. case 107:
  31620. m[L.attrs.Id] = { type: L.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: L.attrs.Target.replace("../", "ppt/") };
  31621. case 108:
  31622. pg.next = 100;
  31623. break;
  31624. case 110:
  31625. pg.next = 115;
  31626. break;
  31627. case 112:
  31628. pg.prev = 112, pg.t5 = pg.catch(98), Q.e(pg.t5);
  31629. case 115:
  31630. return pg.prev = 115, Q.f(), pg.finish(115);
  31631. case 118:
  31632. if (S && H.push({ step: "slideMaster/rels", data: { slideMaster: c, slideMasterRels: F, themeFilename: r } }), E = C, !r) {
  31633. pg.next = 131;
  31634. break;
  31635. }
  31636. return pg.next = 123, yt(I, r);
  31637. case 123:
  31638. return (J = pg.sent) && (E = J), k = r.split("/").pop(), j = r.replace(k, "_rels/" + k) + ".rels", pg.next = 129, yt(I, j);
  31639. case 129:
  31640. if ((q = pg.sent) && (a = q.Relationships.Relationship)) {
  31641. a.constructor !== Array && (a = [a]), Cg = wC(a);
  31642. try {
  31643. for (Cg.s(); !(Ig = Cg.n()).done; ) x = Ig.value, Z[x.attrs.Id] = { type: x.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: x.attrs.Target.replace("../", "ppt/") };
  31644. } catch (uI) {
  31645. Cg.e(uI);
  31646. } finally {
  31647. Cg.f();
  31648. }
  31649. }
  31650. case 131:
  31651. if (Ag = {}, eg = {}, !h.length) {
  31652. pg.next = 162;
  31653. break;
  31654. }
  31655. O = wC(h), pg.prev = 135, O.s();
  31656. case 137:
  31657. if ((_ = O.n()).done) {
  31658. pg.next = 154;
  31659. break;
  31660. }
  31661. return gg = _.value, lg = gg.split("/").pop(), ng = gg.replace(lg, "_rels/" + lg) + ".rels", pg.next = 143, yt(I, gg);
  31662. case 143:
  31663. return (sg = pg.sent) && (og = JSON.stringify(sg).replace(/dsp:/g, "p:"), sg = JSON.parse(og)), Ag[gg] = sg, cg = {}, pg.next = 149, yt(I, ng);
  31664. case 149:
  31665. if (rg = pg.sent) {
  31666. (a = rg.Relationships.Relationship).constructor !== Array && (a = [a]), dg = wC(a);
  31667. try {
  31668. for (dg.s(); !(Bg = dg.n()).done; ) Zg = Bg.value, cg[Zg.attrs.Id] = { type: Zg.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: Zg.attrs.Target.replace("../", "ppt/") };
  31669. } catch (uI) {
  31670. dg.e(uI);
  31671. } finally {
  31672. dg.f();
  31673. }
  31674. }
  31675. eg[gg] = cg;
  31676. case 152:
  31677. pg.next = 137;
  31678. break;
  31679. case 154:
  31680. pg.next = 159;
  31681. break;
  31682. case 156:
  31683. pg.prev = 156, pg.t6 = pg.catch(135), O.e(pg.t6);
  31684. case 159:
  31685. return pg.prev = 159, O.f(), pg.finish(159);
  31686. case 162:
  31687. if (Xg = h.length ? Ag[h[0]] : null, h.length && (Kg = h[0], kg = eg[Kg])) for (Wg in kg) p[Wg] = kg[Wg];
  31688. return pg.next = 166, yt(I, "ppt/tableStyles.xml");
  31689. case 166:
  31690. return Ng = pg.sent, pg.next = 169, yt(I, g);
  31691. case 169:
  31692. return wg = pg.sent, fg = wg["p:sld"]["p:cSld"]["p:spTree"], Jg = U(wg, ["p:sld", "attrs"]), zg = U(Jg, ["showPh"]), cI = { zip: I, slideLayoutContent: K, slideLayoutTables: V, slideMasterContent: y, slideMasterTables: D, slideContent: wg, tableStyles: Ng, slideResObj: b, slideMasterTextStyles: f, layoutResObj: u, masterResObj: m, themeContent: E, themeResObj: Z, digramFileContent: Xg, diagramResObj: p, diagramDrawingTargets: h, diagramDrawingContents: Ag, diagramResObjByTarget: eg, diagramDrawingCursor: 0, defaultTextStyle: i, headerFooter: e, slideNo: A, trace: H }, pg.next = 176, Lbg(cI);
  31693. case 176:
  31694. return YI = pg.sent, pg.next = 179, abg(cI);
  31695. case 179:
  31696. Eg = pg.sent, aI = [], pg.t7 = bI.keys(fg);
  31697. case 182:
  31698. if ((pg.t8 = pg.t7()).done) {
  31699. pg.next = 213;
  31700. break;
  31701. }
  31702. dI = pg.t8.value, fg[dI].constructor !== Array && (fg[dI] = [fg[dI]]), _g = wC(fg[dI]), pg.prev = 186, _g.s();
  31703. case 188:
  31704. if ((xI = _g.n()).done) {
  31705. pg.next = 203;
  31706. break;
  31707. }
  31708. if (SI = xI.value, zg !== "0") {
  31709. pg.next = 194;
  31710. break;
  31711. }
  31712. if (!(U(SI, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(SI, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(SI, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]))) {
  31713. pg.next = 194;
  31714. break;
  31715. }
  31716. return pg.abrupt("continue", 201);
  31717. case 194:
  31718. if (!_tg(Ptg(SI))) {
  31719. pg.next = 197;
  31720. break;
  31721. }
  31722. return pg.abrupt("continue", 201);
  31723. case 197:
  31724. return pg.next = 199, ql(dI, SI, fg, cI, "slide");
  31725. case 199:
  31726. (eI = pg.sent) && aI.push(eI);
  31727. case 201:
  31728. pg.next = 188;
  31729. break;
  31730. case 203:
  31731. pg.next = 208;
  31732. break;
  31733. case 205:
  31734. pg.prev = 205, pg.t9 = pg.catch(186), _g.e(pg.t9);
  31735. case 208:
  31736. return pg.prev = 208, _g.f(), pg.finish(208);
  31737. case 211:
  31738. pg.next = 182;
  31739. break;
  31740. case 213:
  31741. return N0(aI), N0(YI), (NI = FX(wg, "p:sld")) || (NI = FX(K, "p:sldLayout")), NI || (NI = FX(y, "p:sldMaster")), EI = Mbg(NI), oI = { fill: Eg, elements: aI, layoutElements: YI, note: v, transition: EI }, S && H.length && (oI.trace = H), pg.abrupt("return", oI);
  31742. case 222:
  31743. case "end":
  31744. return pg.stop();
  31745. }
  31746. }, t, null, [[18, 39, 42, 45], [65, 79, 82, 85], [98, 112, 115, 118], [135, 156, 159, 162], [186, 205, 208, 211]]);
  31747. })), FD.apply(this, arguments);
  31748. }
  31749. function Jbg(t) {
  31750. var I = "", g = U(t, ["p:notes", "p:cSld", "p:spTree", "p:sp"]);
  31751. if (!g) return "";
  31752. g.constructor !== Array && (g = [g]);
  31753. var C, i = wC(g);
  31754. try {
  31755. for (i.s(); !(C = i.n()).done; ) {
  31756. var e = U(C.value, ["p:txBody", "a:p", "a:r"]);
  31757. if (e) {
  31758. e.constructor !== Array && (e = [e]);
  31759. var A, s = wC(e);
  31760. try {
  31761. for (s.s(); !(A = s.n()).done; ) {
  31762. var l = U(A.value, ["a:t"]);
  31763. l && typeof l == "string" && (I += l);
  31764. }
  31765. } catch (n) {
  31766. s.e(n);
  31767. } finally {
  31768. s.f();
  31769. }
  31770. }
  31771. }
  31772. } catch (n) {
  31773. i.e(n);
  31774. } finally {
  31775. i.f();
  31776. }
  31777. return I;
  31778. }
  31779. function Lbg(t) {
  31780. return kD.apply(this, arguments);
  31781. }
  31782. function kD() {
  31783. return kD = SC(bI.mark(function t(I) {
  31784. var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og, cg, rg;
  31785. return bI.wrap(function(dg) {
  31786. for (; ; ) switch (dg.prev = dg.next) {
  31787. case 0:
  31788. if (g = [], C = I.slideLayoutContent, i = I.slideMasterContent, e = I.slideContent, A = U(C, ["p:sldLayout", "p:cSld", "p:spTree"]), s = U(i, ["p:sldMaster", "p:cSld", "p:spTree"]), l = /* @__PURE__ */ new Set(), n = U(e, ["p:sld", "p:cSld", "p:spTree"]), a = U(e, ["p:sld", "attrs"]), d = U(a, ["showMasterSp"]), o = U(a, ["showMasterPh"]), c = U(a, ["showPh"]), Ul(I, "layout/start", { slideNo: I && I.slideNo, slideShowPh: c, slideShowMasterSp: d, slideShowMasterPh: o }), r = function(Bg, Zg) {
  31789. var Xg = Bg || "", Kg = Zg || "";
  31790. (Xg || Kg) && (l.add("".concat(Xg, "|").concat(Kg)), Xg && l.add("".concat(Xg, "|")), Kg && l.add("|".concat(Kg)));
  31791. }, h = function(Bg) {
  31792. var Zg = U(Bg, ["p:txBody"]);
  31793. if (!Zg) return !1;
  31794. var Xg, Kg = U(Zg, ["a:p"]), kg = wC(Array.isArray(Kg) ? Kg : Kg ? [Kg] : []);
  31795. try {
  31796. for (kg.s(); !(Xg = kg.n()).done; ) {
  31797. var Wg, Ng = Xg.value, wg = U(Ng, ["a:r"]), fg = wC(Array.isArray(wg) ? wg : wg ? [wg] : []);
  31798. try {
  31799. for (fg.s(); !(Wg = fg.n()).done; ) {
  31800. var Jg = U(Wg.value, ["a:t"]);
  31801. if (typeof Jg == "string" && Jg.trim() !== "") return !0;
  31802. }
  31803. } catch (aI) {
  31804. fg.e(aI);
  31805. } finally {
  31806. fg.f();
  31807. }
  31808. var zg, cI = U(Ng, ["a:fld"]), YI = wC(Array.isArray(cI) ? cI : cI ? [cI] : []);
  31809. try {
  31810. for (YI.s(); !(zg = YI.n()).done; ) {
  31811. var Eg = U(zg.value, ["a:t"]);
  31812. if (typeof Eg == "string" && Eg.trim() !== "") return !0;
  31813. }
  31814. } catch (aI) {
  31815. YI.e(aI);
  31816. } finally {
  31817. YI.f();
  31818. }
  31819. }
  31820. } catch (aI) {
  31821. kg.e(aI);
  31822. } finally {
  31823. kg.f();
  31824. }
  31825. return !1;
  31826. }, b = function(Bg, Zg) {
  31827. if (!Zg || !Zg.type) return !1;
  31828. var Xg = String(Zg.type);
  31829. if (!(/* @__PURE__ */ new Set(["ftr"])).has(Xg)) return !1;
  31830. var Kg = U(I, ["slideContent", "p:sld", "p:hdrFtr", "attrs"]), kg = U(Kg, [Xg]), Wg = kg !== void 0 ? function(wg) {
  31831. if (wg == null) return !1;
  31832. var fg = String(wg).toLowerCase();
  31833. return fg === "1" || fg === "true" || fg === "on";
  31834. }(kg) : void 0, Ng = I && I.headerFooter && I.headerFooter[Xg] !== void 0 ? !!I.headerFooter[Xg] : void 0;
  31835. return !!(Wg !== void 0 ? Wg : Ng === void 0 || Ng) && Xg === "ftr" && h(Bg);
  31836. }, u = function(Bg) {
  31837. return !!(U(Bg, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(Bg, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(Bg, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]));
  31838. }, m = function(Bg) {
  31839. var Zg = U(Bg, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(Bg, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(Bg, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]);
  31840. if (!Zg) return null;
  31841. var Xg = U(Zg, ["attrs", "type"]), Kg = U(Zg, ["attrs", "idx"]);
  31842. return Xg || Kg ? { type: Xg, idx: Kg } : null;
  31843. }, Z = function Bg(Zg, Xg) {
  31844. if (Xg) {
  31845. var Kg = m(Xg);
  31846. if (Kg && r(Kg.type, Kg.idx), Zg !== "p:grpSp") {
  31847. if (Zg === "mc:AlternateContent") {
  31848. var kg = U(Xg, ["mc:Fallback"]), Wg = kg && (kg["p:grpSp"] || kg);
  31849. if (Wg) if (Wg["p:grpSpPr"]) Bg("p:grpSp", Wg);
  31850. else for (var Ng in Wg) {
  31851. var wg = Wg[Ng];
  31852. if (Array.isArray(wg)) {
  31853. var fg, Jg = wC(wg);
  31854. try {
  31855. for (Jg.s(); !(fg = Jg.n()).done; )
  31856. Bg(Ng, fg.value);
  31857. } catch (aI) {
  31858. Jg.e(aI);
  31859. } finally {
  31860. Jg.f();
  31861. }
  31862. } else Bg(Ng, wg);
  31863. }
  31864. }
  31865. } else for (var zg in Xg) if (zg !== "p:nvGrpSpPr" && zg !== "p:grpSpPr") {
  31866. var cI = Xg[zg];
  31867. if (Array.isArray(cI)) {
  31868. var YI, Eg = wC(cI);
  31869. try {
  31870. for (Eg.s(); !(YI = Eg.n()).done; )
  31871. Bg(zg, YI.value);
  31872. } catch (aI) {
  31873. Eg.e(aI);
  31874. } finally {
  31875. Eg.f();
  31876. }
  31877. } else Bg(zg, cI);
  31878. }
  31879. }
  31880. }, p = function(Bg) {
  31881. if (Bg) for (var Zg in Bg) {
  31882. var Xg = Bg[Zg];
  31883. if (Array.isArray(Xg)) {
  31884. var Kg, kg = wC(Xg);
  31885. try {
  31886. for (kg.s(); !(Kg = kg.n()).done; ) {
  31887. var Wg = Kg.value;
  31888. Z(Zg, Wg);
  31889. }
  31890. } catch (Ng) {
  31891. kg.e(Ng);
  31892. } finally {
  31893. kg.f();
  31894. }
  31895. } else Z(Zg, Xg);
  31896. }
  31897. }, Y = function(Bg, Zg) {
  31898. var Xg = Bg || "", Kg = Zg || "";
  31899. return !!l.has("".concat(Xg, "|").concat(Kg)) || !(!Xg || !l.has("".concat(Xg, "|"))) || !(!Kg || !l.has("|".concat(Kg)));
  31900. }, R = function Bg(Zg) {
  31901. if (!Zg || Y(Zg.placeholderType, Zg.placeholderIdx)) return null;
  31902. if (Array.isArray(Zg.elements)) {
  31903. var Xg, Kg = [], kg = wC(Zg.elements);
  31904. try {
  31905. for (kg.s(); !(Xg = kg.n()).done; ) {
  31906. var Wg = Bg(Xg.value);
  31907. Wg && Kg.push(Wg);
  31908. }
  31909. } catch (Ng) {
  31910. kg.e(Ng);
  31911. } finally {
  31912. kg.f();
  31913. }
  31914. return Kg.length ? ti(ti({}, Zg), {}, { elements: Kg }) : null;
  31915. }
  31916. return Zg;
  31917. }, p(n), Ul(I, "layout/overrides/fromSlide", { size: l.size }), X = U(C, ["p:sldLayout", "attrs", "showMasterSp"]), H = U(C, ["p:sldLayout", "attrs", "showMasterPh"]), S = 0, z = 0, v = 0, K = 0, !A) {
  31918. dg.next = 82;
  31919. break;
  31920. }
  31921. dg.t0 = bI.keys(A);
  31922. case 32:
  31923. if ((dg.t1 = dg.t0()).done) {
  31924. dg.next = 82;
  31925. break;
  31926. }
  31927. if (V = dg.t1.value, A[V].constructor !== Array) {
  31928. dg.next = 61;
  31929. break;
  31930. }
  31931. N = 0;
  31932. case 36:
  31933. if (!(N < A[V].length)) {
  31934. dg.next = 59;
  31935. break;
  31936. }
  31937. if (B = A[V][N], c !== "0" || !u(B)) {
  31938. dg.next = 41;
  31939. break;
  31940. }
  31941. return z += 1, dg.abrupt("continue", 56);
  31942. case 41:
  31943. if (!(G = m(B))) {
  31944. dg.next = 51;
  31945. break;
  31946. }
  31947. if (w = G.type || "", W = G.idx || "", !(l.has("".concat(w, "|").concat(W)) || w && l.has("".concat(w, "|")) || W && l.has("|".concat(W)))) {
  31948. dg.next = 48;
  31949. break;
  31950. }
  31951. return v += 1, dg.abrupt("continue", 56);
  31952. case 48:
  31953. if (b(B, G)) {
  31954. dg.next = 51;
  31955. break;
  31956. }
  31957. return K += 1, dg.abrupt("continue", 56);
  31958. case 51:
  31959. return dg.next = 53, ql(V, B, A, I, "slideLayoutBg");
  31960. case 53:
  31961. y = dg.sent, (f = R(y)) && (g.push(f), S += 1);
  31962. case 56:
  31963. N++, dg.next = 36;
  31964. break;
  31965. case 59:
  31966. dg.next = 80;
  31967. break;
  31968. case 61:
  31969. if (D = A[V], c !== "0" || !u(D)) {
  31970. dg.next = 65;
  31971. break;
  31972. }
  31973. return z += 1, dg.abrupt("continue", 32);
  31974. case 65:
  31975. if (!(F = m(D))) {
  31976. dg.next = 75;
  31977. break;
  31978. }
  31979. if (T = F.type || "", Q = F.idx || "", !(l.has("".concat(T, "|").concat(Q)) || T && l.has("".concat(T, "|")) || Q && l.has("|".concat(Q)))) {
  31980. dg.next = 72;
  31981. break;
  31982. }
  31983. return v += 1, dg.abrupt("continue", 32);
  31984. case 72:
  31985. if (b(D, F)) {
  31986. dg.next = 75;
  31987. break;
  31988. }
  31989. return K += 1, dg.abrupt("continue", 32);
  31990. case 75:
  31991. return dg.next = 77, ql(V, D, A, I, "slideLayoutBg");
  31992. case 77:
  31993. P = dg.sent, (L = R(P)) && (g.push(L), S += 1);
  31994. case 80:
  31995. dg.next = 32;
  31996. break;
  31997. case 82:
  31998. if (Ul(I, "layout/layoutElements", { showMasterSp: X, showMasterPh: H, kept: S, skipShowPh: z, skipOverridden: v, skipNotRenderable: K }), p(A), Ul(I, "layout/overrides/fromLayout", { size: l.size }), E = 0, J = 0, k = 0, j = 0, q = 0, !s || X === "0" || d === "0") {
  31999. dg.next = 148;
  32000. break;
  32001. }
  32002. dg.t2 = bI.keys(s);
  32003. case 92:
  32004. if ((dg.t3 = dg.t2()).done) {
  32005. dg.next = 148;
  32006. break;
  32007. }
  32008. if (Cg = dg.t3.value, s[Cg].constructor !== Array) {
  32009. dg.next = 124;
  32010. break;
  32011. }
  32012. Ig = 0;
  32013. case 96:
  32014. if (!(Ig < s[Cg].length)) {
  32015. dg.next = 122;
  32016. break;
  32017. }
  32018. if (x = s[Cg][Ig], c !== "0" || !u(x)) {
  32019. dg.next = 101;
  32020. break;
  32021. }
  32022. return J += 1, dg.abrupt("continue", 119);
  32023. case 101:
  32024. if (!(Ag = m(x))) {
  32025. dg.next = 114;
  32026. break;
  32027. }
  32028. if (H !== "0" && o !== "0") {
  32029. dg.next = 106;
  32030. break;
  32031. }
  32032. return k += 1, dg.abrupt("continue", 119);
  32033. case 106:
  32034. if (eg = Ag.type || "", O = Ag.idx || "", !(l.has("".concat(eg, "|").concat(O)) || eg && l.has("".concat(eg, "|")) || O && l.has("|".concat(O)))) {
  32035. dg.next = 111;
  32036. break;
  32037. }
  32038. return j += 1, dg.abrupt("continue", 119);
  32039. case 111:
  32040. if (b(x, Ag)) {
  32041. dg.next = 114;
  32042. break;
  32043. }
  32044. return q += 1, dg.abrupt("continue", 119);
  32045. case 114:
  32046. return dg.next = 116, ql(Cg, x, s, I, "slideMasterBg");
  32047. case 116:
  32048. _ = dg.sent, (gg = R(_)) && (g.push(gg), E += 1);
  32049. case 119:
  32050. Ig++, dg.next = 96;
  32051. break;
  32052. case 122:
  32053. dg.next = 146;
  32054. break;
  32055. case 124:
  32056. if (lg = s[Cg], c !== "0" || !u(lg)) {
  32057. dg.next = 128;
  32058. break;
  32059. }
  32060. return J += 1, dg.abrupt("continue", 92);
  32061. case 128:
  32062. if (!(ng = m(lg))) {
  32063. dg.next = 141;
  32064. break;
  32065. }
  32066. if (H !== "0" && o !== "0") {
  32067. dg.next = 133;
  32068. break;
  32069. }
  32070. return k += 1, dg.abrupt("continue", 92);
  32071. case 133:
  32072. if (sg = ng.type || "", og = ng.idx || "", !(l.has("".concat(sg, "|").concat(og)) || sg && l.has("".concat(sg, "|")) || og && l.has("|".concat(og)))) {
  32073. dg.next = 138;
  32074. break;
  32075. }
  32076. return j += 1, dg.abrupt("continue", 92);
  32077. case 138:
  32078. if (b(lg, ng)) {
  32079. dg.next = 141;
  32080. break;
  32081. }
  32082. return q += 1, dg.abrupt("continue", 92);
  32083. case 141:
  32084. return dg.next = 143, ql(Cg, lg, s, I, "slideMasterBg");
  32085. case 143:
  32086. cg = dg.sent, (rg = R(cg)) && (g.push(rg), E += 1);
  32087. case 146:
  32088. dg.next = 92;
  32089. break;
  32090. case 148:
  32091. return Ul(I, "layout/masterElements", { kept: E, skipShowPh: J, skipShowMasterPh: k, skipOverridden: j, skipNotRenderable: q }), dg.abrupt("return", g);
  32092. case 150:
  32093. case "end":
  32094. return dg.stop();
  32095. }
  32096. }, t);
  32097. })), kD.apply(this, arguments);
  32098. }
  32099. function N0(t) {
  32100. return t.sort(function(I, g) {
  32101. var C = parseInt(I && I.order), i = parseInt(g && g.order);
  32102. return (isNaN(C) ? 0 : C) - (isNaN(i) ? 0 : i);
  32103. });
  32104. }
  32105. function Iig(t) {
  32106. return U(t, ["p:grpSpPr", "a:xfrm"]) || U(t, ["p:grpSp", "p:grpSpPr", "a:xfrm"]);
  32107. }
  32108. function Cig(t, I, g) {
  32109. if (!t) return t;
  32110. var C, i, e = ti({}, t);
  32111. return typeof e.left == "number" && (e.left = Lt(e.left * I)), typeof e.top == "number" && (e.top = Lt(e.top * g)), typeof e.width == "number" && (e.width = Lt(e.width * I)), typeof e.height == "number" && (e.height = Lt(e.height * g)), typeof e.borderWidth == "number" && (e.borderWidth = Lt(e.borderWidth * Math.max(I, g))), typeof e.path == "string" && (e.path = function(A, s, l) {
  32112. if (!A || s === 1 && l === 1) return A;
  32113. var n = String(A).match(/[a-zA-Z]|[-+]?(?:\d*\.\d+|\d+)(?:e[-+]?\d+)?/g);
  32114. if (!n) return A;
  32115. var a, d = { M: 2, L: 2, T: 2, H: 1, V: 1, C: 6, S: 4, Q: 4, A: 7, Z: 0 }, o = [], c = null, r = 0, h = wC(n);
  32116. try {
  32117. for (h.s(); !(a = h.n()).done; ) {
  32118. var b = a.value;
  32119. if (/^[a-zA-Z]$/.test(b)) c = b, r = 0, o.push(b);
  32120. else {
  32121. var u = c ? c.toUpperCase() : "", m = d[u];
  32122. if (m) {
  32123. var Z = r % m, p = b;
  32124. if (u !== "A" || Z !== 2 && Z !== 3 && Z !== 4) {
  32125. var Y = parseFloat(b);
  32126. if (!isNaN(Y)) {
  32127. var R = Y;
  32128. u === "H" ? R = Y * s : u === "V" ? R = Y * l : u === "A" ? Z === 0 ? R = Y * s : Z === 1 ? R = Y * l : Z === 5 ? R = Y * s : Z === 6 && (R = Y * l) : R = Z % 2 == 0 ? Y * s : Y * l, p = String(Lt(R));
  32129. }
  32130. } else p = b;
  32131. o.push(p), r += 1;
  32132. } else o.push(b);
  32133. }
  32134. }
  32135. } catch (X) {
  32136. h.e(X);
  32137. } finally {
  32138. h.f();
  32139. }
  32140. return o.join(" ");
  32141. }(e.path, I, g)), e.content && (e.content = (C = e.content, (i = g) !== 1 && C ? C.replace(/(font-size:\s*)([\d.]+)pt/g, function(A, s, l) {
  32142. var n = parseFloat(l) * i;
  32143. return "".concat(s).concat(Lt(n), "pt");
  32144. }) : C)), Array.isArray(e.elements) && (e.elements = e.elements.map(function(A) {
  32145. return Cig(A, I, g);
  32146. })), e;
  32147. }
  32148. function tig(t, I, g, C, i) {
  32149. if (!Array.isArray(t) || !C && !i) return t;
  32150. var e = Number(I), A = Number(g);
  32151. if (!Number.isFinite(e) || !Number.isFinite(A)) return t;
  32152. var s, l = wC(t);
  32153. try {
  32154. for (l.s(); !(s = l.n()).done; ) {
  32155. var n = s.value;
  32156. if (n && _a(n) === "object") {
  32157. var a = typeof n.width == "number" ? n.width : 0, d = typeof n.height == "number" ? n.height : 0;
  32158. C && typeof n.left == "number" && (n.left = Lt(e - n.left - a)), i && typeof n.top == "number" && (n.top = Lt(A - n.top - d));
  32159. var o = typeof n.content == "string" && Ltg(n.content);
  32160. n.type === "text" || o ? (n.isFlipH = !1, n.isFlipV = !1) : n.type === "group" && Array.isArray(n.elements) ? (tig(n.elements, n.width, n.height, C, i), n.isFlipH = !1, n.isFlipV = !1) : (C && (n.isFlipH = !n.isFlipH), i && (n.isFlipV = !n.isFlipV), (C ? 1 : 0) ^ (i ? 1 : 0) && typeof n.rotate == "number" && (n.rotate = Lt(-n.rotate)));
  32161. }
  32162. }
  32163. } catch (c) {
  32164. l.e(c);
  32165. } finally {
  32166. l.f();
  32167. }
  32168. return N0(t), t;
  32169. }
  32170. function uh(t, I) {
  32171. var g, C = wC(t || []);
  32172. try {
  32173. for (C.s(); !(g = C.n()).done; ) {
  32174. var i = g.value;
  32175. if (i) {
  32176. var e = U(i, ["attrs", I]);
  32177. if (e != null) return e;
  32178. }
  32179. }
  32180. } catch (A) {
  32181. C.e(A);
  32182. } finally {
  32183. C.f();
  32184. }
  32185. }
  32186. function Vq(t) {
  32187. var I = t[Object.keys(t)[0]]["p:cSld"]["p:spTree"], g = {}, C = {}, i = {}, e = {}, A = function(l) {
  32188. if (l) {
  32189. for (var n in l) if (n !== "p:nvGrpSpPr" && n !== "p:grpSpPr") {
  32190. var a = l[n];
  32191. if (Array.isArray(a)) {
  32192. var d, o = wC(a);
  32193. try {
  32194. for (o.s(); !(d = o.n()).done; ) {
  32195. var c = d.value;
  32196. s(n, c);
  32197. }
  32198. } catch (r) {
  32199. o.e(r);
  32200. } finally {
  32201. o.f();
  32202. }
  32203. } else s(n, a);
  32204. }
  32205. }
  32206. }, s = function l(n, a) {
  32207. if (a) if (n !== "p:sp" && n !== "p:pic" && n !== "p:graphicFrame") if (n !== "p:grpSp") {
  32208. if (n === "mc:AlternateContent") {
  32209. var d = U(a, ["mc:Fallback"]), o = d && (d["p:grpSp"] || d);
  32210. o && (o["p:grpSpPr"] ? l("p:grpSp", o) : A(o));
  32211. }
  32212. } else A(a);
  32213. else (function(c) {
  32214. var r = function(m) {
  32215. return m && (m["p:nvSpPr"] || m["p:nvPicPr"] || m["p:nvGraphicFramePr"]) || null;
  32216. }(c);
  32217. if (r) {
  32218. var h = U(r, ["p:cNvPr", "attrs", "id"]), b = U(r, ["p:nvPr", "p:ph", "attrs", "idx"]), u = U(r, ["p:nvPr", "p:ph", "attrs", "type"]);
  32219. h && (g[h] = c), b && (C[b] = c), u && (i[u] = c), u && b && (e["".concat(u, "|").concat(b)] = c);
  32220. }
  32221. })(a);
  32222. };
  32223. return A(I), { idTable: g, idxTable: C, typeTable: i, typeIdxTable: e };
  32224. }
  32225. function ql(t, I, g, C, i) {
  32226. return zD.apply(this, arguments);
  32227. }
  32228. function zD() {
  32229. return zD = SC(bI.mark(function t(I, g, C, i, e) {
  32230. var A, s, l, n, a = arguments;
  32231. return bI.wrap(function(d) {
  32232. for (; ; ) switch (d.prev = d.next) {
  32233. case 0:
  32234. if (A = a.length > 5 && a[5] !== void 0 ? a[5] : [], !_tg(Ptg(g))) {
  32235. d.next = 4;
  32236. break;
  32237. }
  32238. return d.abrupt("return", null);
  32239. case 4:
  32240. if (!qtg(Rbg(g))) {
  32241. d.next = 7;
  32242. break;
  32243. }
  32244. return d.abrupt("return", null);
  32245. case 7:
  32246. d.t0 = I, d.next = d.t0 === "p:sp" ? 10 : d.t0 === "p:cxnSp" ? 14 : d.t0 === "p:pic" ? 18 : d.t0 === "p:graphicFrame" ? 22 : d.t0 === "p:grpSp" ? 26 : d.t0 === "mc:AlternateContent" ? 30 : 42;
  32247. break;
  32248. case 10:
  32249. return d.next = 12, Tbg(g, C, i, e, A);
  32250. case 12:
  32251. return s = d.sent, d.abrupt("break", 42);
  32252. case 14:
  32253. return d.next = 16, xbg(g, C, i, e, A);
  32254. case 16:
  32255. return s = d.sent, d.abrupt("break", 42);
  32256. case 18:
  32257. return d.next = 20, jbg(g, i, e, A);
  32258. case 20:
  32259. return s = d.sent, d.abrupt("break", 42);
  32260. case 22:
  32261. return d.next = 24, Qbg(g, i, e);
  32262. case 24:
  32263. return s = d.sent, d.abrupt("break", 42);
  32264. case 26:
  32265. return d.next = 28, LD(g, i, e, A);
  32266. case 28:
  32267. return s = d.sent, d.abrupt("break", 42);
  32268. case 30:
  32269. if (l = U(g, ["mc:Fallback"]), !(n = l && (l["p:grpSp"] || l)) || !Iig(n)) {
  32270. d.next = 37;
  32271. break;
  32272. }
  32273. return d.next = 35, LD(n, i, e, A);
  32274. case 35:
  32275. return s = d.sent, d.abrupt("break", 42);
  32276. case 37:
  32277. if (!U(g, ["mc:Choice"])) {
  32278. d.next = 41;
  32279. break;
  32280. }
  32281. return d.next = 40, vbg(g, i, e);
  32282. case 40:
  32283. s = d.sent;
  32284. case 41:
  32285. return d.abrupt("break", 42);
  32286. case 42:
  32287. return d.abrupt("return", s);
  32288. case 43:
  32289. case "end":
  32290. return d.stop();
  32291. }
  32292. }, t);
  32293. })), zD.apply(this, arguments);
  32294. }
  32295. function vbg(t, I, g) {
  32296. return JD.apply(this, arguments);
  32297. }
  32298. function JD() {
  32299. return JD = SC(bI.mark(function t(I, g, C) {
  32300. var i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z;
  32301. return bI.wrap(function(p) {
  32302. for (; ; ) switch (p.prev = p.next) {
  32303. case 0:
  32304. return i = U(I, ["mc:Choice"]), e = U(I, ["mc:Fallback"]), A = I.attrs.order, s = U(i, ["p:sp", "p:spPr", "a:xfrm"]), l = f0(s, void 0, void 0), n = l.top, a = l.left, d = H0(s, void 0, void 0), o = d.width, c = d.height, r = Etg(i)[0], h = Nbg(HC(r)), b = U(e, ["p:sp", "p:spPr", "a:blipFill"]), p.next = 11, rM(C, b, g);
  32305. case 11:
  32306. return u = p.sent, m = "", U(i, ["p:sp", "p:txBody", "a:p", "a:r"]) && (Z = U(i, ["p:sp"]), m = BV(Z["p:txBody"], Z, void 0, void 0, g)), p.abrupt("return", { type: "math", top: n, left: a, width: o, height: c, latex: h, picBase64: u, text: m, order: A });
  32307. case 15:
  32308. case "end":
  32309. return p.stop();
  32310. }
  32311. }, t);
  32312. })), JD.apply(this, arguments);
  32313. }
  32314. function LD(t, I, g) {
  32315. return vD.apply(this, arguments);
  32316. }
  32317. function vD() {
  32318. return vD = SC(bI.mark(function t(I, g, C) {
  32319. var i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og = arguments;
  32320. return bI.wrap(function(cg) {
  32321. for (; ; ) switch (cg.prev = cg.next) {
  32322. case 0:
  32323. if (i = og.length > 3 && og[3] !== void 0 ? og[3] : [], e = I.attrs.order, A = Iig(I)) {
  32324. cg.next = 5;
  32325. break;
  32326. }
  32327. return cg.abrupt("return", null);
  32328. case 5:
  32329. s = U(I, ["p:nvGrpSpPr", "p:cNvPr", "attrs", "name"]) || "", l = U(I, ["p:nvGrpSpPr", "p:cNvPr", "attrs", "id"]) || "", n = parseInt(A["a:off"].attrs.x) * Gg, a = parseInt(A["a:off"].attrs.y) * Gg, d = parseInt(A["a:ext"].attrs.cx) * Gg, o = parseInt(A["a:ext"].attrs.cy) * Gg, c = U(A, ["a:chOff", "attrs"]), r = U(A, ["a:chExt", "attrs"]), h = c && c.x !== void 0 ? parseInt(c.x) * Gg : 0, b = c && c.y !== void 0 ? parseInt(c.y) * Gg : 0, u = r && r.cx !== void 0 ? parseInt(r.cx) * Gg : d, m = r && r.cy !== void 0 ? parseInt(r.cy) * Gg : o, Z = U(A, ["attrs", "flipV"]) === "1", p = U(A, ["attrs", "flipH"]) === "1", (Y = U(A, ["attrs", "rot"]) || 0) && (Y = Y0(Y)), R = u && !isNaN(u) && d ? d / u : 1, X = m && !isNaN(m) && o ? o / m : 1, H = [].concat(R9(i), [I]), S = function(rg) {
  32330. if (!rg) return "";
  32331. var dg = U(rg, ["p:nvGrpSpPr", "p:cNvPr", "attrs", "name"]), Bg = U(rg, ["p:nvGrpSpPr", "p:cNvPr", "attrs", "id"]), Zg = U(rg, ["attrs", "order"]), Xg = [];
  32332. return dg && Xg.push(String(dg)), Bg && Xg.push("#".concat(Bg)), Zg !== void 0 && Xg.push("@".concat(Zg)), Xg.join("");
  32333. }, Ul(g, "group/start", { slideNo: g && g.slideNo, source: C, name: s, id: l, order: e, hierarchy: H.map(S).filter(Boolean), x: n, y: a, cx: d, cy: o, chx: h, chy: b, chcx: u, chcy: m, ws: R, hs: X, isFlipV: Z, isFlipH: p, rotate: Y }), z = [], cg.t0 = bI.keys(I);
  32334. case 28:
  32335. if ((cg.t1 = cg.t0()).done) {
  32336. cg.next = 58;
  32337. break;
  32338. }
  32339. if (v = cg.t1.value, I[v].constructor !== Array) {
  32340. cg.next = 52;
  32341. break;
  32342. }
  32343. K = wC(I[v]), cg.prev = 32, K.s();
  32344. case 34:
  32345. if ((V = K.n()).done) {
  32346. cg.next = 42;
  32347. break;
  32348. }
  32349. return N = V.value, cg.next = 38, ql(v, N, I, g, C, H);
  32350. case 38:
  32351. (B = cg.sent) && z.push(B);
  32352. case 40:
  32353. cg.next = 34;
  32354. break;
  32355. case 42:
  32356. cg.next = 47;
  32357. break;
  32358. case 44:
  32359. cg.prev = 44, cg.t2 = cg.catch(32), K.e(cg.t2);
  32360. case 47:
  32361. return cg.prev = 47, K.f(), cg.finish(47);
  32362. case 50:
  32363. cg.next = 56;
  32364. break;
  32365. case 52:
  32366. return cg.next = 54, ql(v, I[v], I, g, C, H);
  32367. case 54:
  32368. (G = cg.sent) && z.push(G);
  32369. case 56:
  32370. cg.next = 28;
  32371. break;
  32372. case 58:
  32373. N0(z), w = 1 / 0, W = 1 / 0, y = -1 / 0, f = -1 / 0, D = 0, F = z;
  32374. case 64:
  32375. if (!(D < F.length)) {
  32376. cg.next = 77;
  32377. break;
  32378. }
  32379. if ((T = F[D]) && typeof T.left == "number" && typeof T.top == "number") {
  32380. cg.next = 68;
  32381. break;
  32382. }
  32383. return cg.abrupt("continue", 74);
  32384. case 68:
  32385. Q = T.left + (typeof T.width == "number" ? T.width : 0), P = T.top + (typeof T.height == "number" ? T.height : 0), w = Math.min(w, T.left), W = Math.min(W, T.top), y = Math.max(y, Q), f = Math.max(f, P);
  32386. case 74:
  32387. D++, cg.next = 64;
  32388. break;
  32389. case 77:
  32390. return L = Number.isFinite(w) && Number.isFinite(W) && Number.isFinite(y) && Number.isFinite(f), E = !(Number.isFinite(d) && Number.isFinite(o) && d && o && Number.isFinite(u) && Number.isFinite(m) && u && m), J = L ? y - w : 0, k = L ? f - W : 0, j = Math.max(1, 2e-3 * Math.min(Number.isFinite(d) ? d : 0, Number.isFinite(o) ? o : 0)), q = L ? Math.abs(J - d) + Math.abs(k - o) + Math.abs(w - n) + Math.abs(W - a) : 1 / 0, Cg = L ? Math.abs(J - u) + Math.abs(k - m) + Math.abs(w - h) + Math.abs(W - b) : 1 / 0, Ig = !E && L && q + 2 * j < Cg, Ul(g, "group/bbox", { slideNo: g && g.slideNo, source: C, name: s, id: l, order: e, children: z.length, hasBBox: L, bboxMinX: w, bboxMinY: W, bboxMaxX: y, bboxMaxY: f, bboxW: J, bboxH: k, eps: j, isLooseGroup: E, errToSlide: q, errToChild: Cg, isChildCoordAbsToSlide: Ig }), x = E ? L ? w : 0 : Ig ? n : h, Ag = E ? L ? W : 0 : Ig ? a : b, eg = E || Ig ? 1 : R, O = E || Ig ? 1 : X, _ = Lt(E && L ? w : n), gg = Lt(E && L ? W : a), lg = Lt(E && L ? y - w : d), ng = Lt(E && L ? f - W : o), Ul(g, "group/normalize", { slideNo: g && g.slideNo, source: C, name: s, id: l, order: e, baseX: x, baseY: Ag, effWs: eg, effHs: O, outLeft: _, outTop: gg, outWidth: lg, outHeight: ng }), N0(sg = z.map(function(rg) {
  32391. return rg && typeof rg.left == "number" && typeof rg.top == "number" ? Cig(ti(ti({}, rg), {}, { left: rg.left - x, top: rg.top - Ag }), eg, O) : rg;
  32392. })), tig(sg, lg, ng, p, Z), Ul(g, "group/end", { slideNo: g && g.slideNo, source: C, name: s, id: l, order: e, normalizedChildren: sg.length }), cg.abrupt("return", { type: "group", top: gg, left: _, width: lg, height: ng, rotate: Y, order: e, isFlipV: !1, isFlipH: !1, elements: sg });
  32393. case 100:
  32394. case "end":
  32395. return cg.stop();
  32396. }
  32397. }, t, null, [[32, 44, 47, 50]]);
  32398. })), vD.apply(this, arguments);
  32399. }
  32400. function Tbg(t, I, g, C) {
  32401. return TD.apply(this, arguments);
  32402. }
  32403. function TD() {
  32404. return TD = SC(bI.mark(function t(I, g, C, i) {
  32405. var e, A, s, l, n, a, d, o, c, r, h = arguments;
  32406. return bI.wrap(function(b) {
  32407. for (; ; ) switch (b.prev = b.next) {
  32408. case 0:
  32409. return e = h.length > 4 && h[4] !== void 0 ? h[4] : [], A = U(I, ["p:nvSpPr", "p:cNvPr", "attrs", "name"]), s = U(I, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "idx"]), l = U(I, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]), n = U(I, ["attrs", "order"]), o = C.slideLayoutTables, c = C.slideMasterTables, l && s ? (r = "".concat(l, "|").concat(s), a = o && o.typeIdxTable && o.typeIdxTable[r] || o && o.idxTable && o.idxTable[s] || o && o.typeTable && o.typeTable[l], d = c && c.typeIdxTable && c.typeIdxTable[r] || c && c.idxTable && c.idxTable[s] || c && c.typeTable && c.typeTable[l]) : s ? (a = o && o.idxTable ? o.idxTable[s] : void 0, d = c && c.idxTable ? c.idxTable[s] : void 0) : l && (a = o && o.typeTable ? o.typeTable[l] : void 0, d = c && c.typeTable ? c.typeTable[l] : void 0), l || U(I, ["p:nvSpPr", "p:cNvSpPr", "attrs", "txBox"]) === "1" && (l = "text"), l || (l = U(a, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"])), l || (l = U(d, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"])), l || (l = i === "diagramBg" ? "diagram" : "obj"), b.next = 14, iig(I, g, a, d, A, l, n, C, i, e);
  32410. case 14:
  32411. return b.abrupt("return", b.sent);
  32412. case 15:
  32413. case "end":
  32414. return b.stop();
  32415. }
  32416. }, t);
  32417. })), TD.apply(this, arguments);
  32418. }
  32419. function xbg(t, I, g, C) {
  32420. return xD.apply(this, arguments);
  32421. }
  32422. function xD() {
  32423. return xD = SC(bI.mark(function t(I, g, C, i) {
  32424. var e, A, s, l, n = arguments;
  32425. return bI.wrap(function(a) {
  32426. for (; ; ) switch (a.prev = a.next) {
  32427. case 0:
  32428. return e = n.length > 4 && n[4] !== void 0 ? n[4] : [], A = I["p:nvCxnSpPr"]["p:cNvPr"].attrs.name, s = I["p:nvCxnSpPr"]["p:nvPr"]["p:ph"] === void 0 ? void 0 : I["p:nvSpPr"]["p:nvPr"]["p:ph"].attrs.type, l = I.attrs.order, a.next = 6, iig(I, g, void 0, void 0, A, s, l, C, i, e);
  32429. case 6:
  32430. return a.abrupt("return", a.sent);
  32431. case 7:
  32432. case "end":
  32433. return a.stop();
  32434. }
  32435. }, t);
  32436. })), xD.apply(this, arguments);
  32437. }
  32438. function iig(t, I, g, C, i, e, A, s, l) {
  32439. return jD.apply(this, arguments);
  32440. }
  32441. function jD() {
  32442. return jD = SC(bI.mark(function t(I, g, C, i, e, A, s, l, n) {
  32443. var a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg = arguments;
  32444. return bI.wrap(function(O) {
  32445. for (; ; ) switch (O.prev = O.next) {
  32446. case 0:
  32447. return a = eg.length > 9 && eg[9] !== void 0 ? eg[9] : [], d = U(I, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(I, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(I, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]), o = d && U(d, ["attrs", "type"]) || "", c = d && U(d, ["attrs", "idx"]) || "", h = U(I, r = ["p:spPr", "a:xfrm"]), b = U(C, r), u = U(i, r), m = U(I, ["p:spPr", "a:prstGeom", "attrs", "prst"]), Z = U(I, ["p:spPr", "a:custGeom"]), p = f0(h, b, u), Y = p.top, R = p.left, X = H0(h, b, u), H = X.width, S = X.height, v = uh(z = [h, b, u], "flipV") === "1", K = uh(z, "flipH") === "1", V = Y0(uh(z, "rot")), N = U(I, ["p:txXfrm"]), B = V, N && (G = U(N, ["attrs", "rot"])) && (B = V + Y0(G)), w = "", I["p:txBody"] && (w = BV(I["p:txBody"], I, C, A, l)), W = Fs(I, A, l, a), y = W.borderColor, f = W.borderWidth, D = W.borderType, F = W.strokeDasharray, O.next = 24, jtg(I, g, void 0, l, n, a);
  32448. case 24:
  32449. if (O.t0 = O.sent, O.t0) {
  32450. O.next = 27;
  32451. break;
  32452. }
  32453. O.t0 = "";
  32454. case 27:
  32455. if (T = O.t0, m === "arc" && (T = ""), Q = H, P = S, m === "line" && (L = Math.max(1, f || 0), Q || (Q = L), P || (P = L)), (J = U(I, ["p:spPr", "a:effectLst", "a:outerShdw"])) && (E = Qtg(J, l)), k = hbg(I, C, i), j = U(I, ["p:txBody", "a:bodyPr", "attrs", "vert"]) === "eaVert", q = bbg(I, C, i), Cg = { left: R, top: Y, width: Q, height: P, borderColor: y, borderWidth: f, borderType: D, borderStrokeDasharray: F, fill: T, content: w, isFlipV: v, isFlipH: K, rotate: V, vAlign: k, name: e, order: s, placeholderType: o, placeholderIdx: c }, E && (Cg.shadow = E), q && (Cg.autoFit = q), Ig = Cg.content && Ltg(Cg.content), !Z || A === "diagram") {
  32456. O.next = 47;
  32457. break;
  32458. }
  32459. return x = Wbg(Z, Q, P), Ig || (Cg.content = ""), O.abrupt("return", ti(ti({}, Cg), {}, { type: "shape", shapType: "custom", path: x }));
  32460. case 47:
  32461. if (Ag = "", m && (Ag = Vbg(m, Q, P, I)), !m || A !== "obj" && A && m === "rect") {
  32462. O.next = 52;
  32463. break;
  32464. }
  32465. return Ig || (Cg.content = ""), O.abrupt("return", ti(ti({}, Cg), {}, { type: "shape", shapType: m, path: Ag }));
  32466. case 52:
  32467. if (!m || Ig || !T && !f) {
  32468. O.next = 54;
  32469. break;
  32470. }
  32471. return O.abrupt("return", ti(ti({}, Cg), {}, { type: "shape", content: "", shapType: m, path: Ag }));
  32472. case 54:
  32473. return O.abrupt("return", ti(ti({}, Cg), {}, { type: "text", isVertical: j, isFlipV: !1, isFlipH: !1, rotate: B }));
  32474. case 55:
  32475. case "end":
  32476. return O.stop();
  32477. }
  32478. }, t);
  32479. })), jD.apply(this, arguments);
  32480. }
  32481. function jbg(t, I, g) {
  32482. return QD.apply(this, arguments);
  32483. }
  32484. function QD() {
  32485. return QD = SC(bI.mark(function t(I, g, C) {
  32486. var i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg = arguments;
  32487. return bI.wrap(function(lg) {
  32488. for (; ; ) switch (lg.prev = lg.next) {
  32489. case 0:
  32490. return i = gg.length > 3 && gg[3] !== void 0 ? gg[3] : [], e = C === "slideMasterBg" ? g.masterResObj : C === "slideLayoutBg" ? g.layoutResObj : g.slideResObj, A = I.attrs.order, s = U(I, ["p:nvPicPr", "p:nvPr", "p:ph"]), l = s && U(s, ["attrs", "type"]) || "", n = s && U(s, ["attrs", "idx"]) || "", a = I["p:blipFill"]["a:blip"].attrs["r:embed"], d = e[a].target, o = DX(d).toLowerCase(), c = g.zip, lg.next = 12, c.file(d).async("arraybuffer");
  32491. case 12:
  32492. if (r = lg.sent, h = I["p:spPr"]["a:xfrm"], b = U(I, ["p:nvPicPr", "p:nvPr", "p:ph", "attrs", "idx"]), u = b ? U(g.slideLayoutTables, ["idxTable", b, "p:spPr", "a:xfrm"]) : void 0, m = b ? U(g.slideMasterTables, ["idxTable", b, "p:spPr", "a:xfrm"]) : void 0, h || (h = u || m), Z = yD(o), p = f0(h, u, m), Y = p.top, R = p.left, X = H0(h, u, m), H = X.width, S = X.height, z = "data:".concat(Z, ";base64,").concat(Jtg(r)), K = uh(v = [h, u, m], "flipV") === "1", V = uh(v, "flipH") === "1", N = Y0(uh(v, "rot")), B = U(I, ["p:nvPicPr", "p:nvPr", "a:videoFile"]), F = !1, !B) {
  32493. lg.next = 43;
  32494. break;
  32495. }
  32496. if (G = B.attrs["r:link"], !lbg(w = e[G].target)) {
  32497. lg.next = 36;
  32498. break;
  32499. }
  32500. w = pV(w), F = !0, lg.next = 43;
  32501. break;
  32502. case 36:
  32503. if ((W = DX(w).toLowerCase()) !== "mp4" && W !== "webm" && W !== "ogg") {
  32504. lg.next = 43;
  32505. break;
  32506. }
  32507. return lg.next = 40, c.file(w).async("arraybuffer");
  32508. case 40:
  32509. f = lg.sent, y = yD(W), D = URL.createObjectURL(new Blob([f], { type: y }));
  32510. case 43:
  32511. if (!(T = U(I, ["p:nvPicPr", "p:nvPr", "a:audioFile"]))) {
  32512. lg.next = 53;
  32513. break;
  32514. }
  32515. if (Q = T.attrs["r:link"], P = e[Q].target, (L = DX(P).toLowerCase()) !== "mp3" && L !== "wav" && L !== "ogg") {
  32516. lg.next = 53;
  32517. break;
  32518. }
  32519. return lg.next = 51, c.file(P).async("arraybuffer");
  32520. case 51:
  32521. E = lg.sent, J = URL.createObjectURL(new Blob([E]));
  32522. case 53:
  32523. if (!B || F) {
  32524. lg.next = 55;
  32525. break;
  32526. }
  32527. return lg.abrupt("return", { type: "video", top: Y, left: R, width: H, height: S, rotate: N, blob: D, order: A, placeholderType: l, placeholderIdx: n });
  32528. case 55:
  32529. if (!B || !F) {
  32530. lg.next = 57;
  32531. break;
  32532. }
  32533. return lg.abrupt("return", { type: "video", top: Y, left: R, width: H, height: S, rotate: N, src: w, order: A, placeholderType: l, placeholderIdx: n });
  32534. case 57:
  32535. if (!T) {
  32536. lg.next = 59;
  32537. break;
  32538. }
  32539. return lg.abrupt("return", { type: "audio", top: Y, left: R, width: H, height: S, rotate: N, blob: J, order: A, placeholderType: l, placeholderIdx: n });
  32540. case 59:
  32541. return (j = U(I, ["p:blipFill", "a:srcRect", "attrs"])) && (j.t || j.b || j.l || j.r) && (k = {}, j.t && (k.t = j.t / 1e3), j.b && (k.b = j.b / 1e3), j.l && (k.l = j.l / 1e3), j.r && (k.r = j.r / 1e3)), q = U(I, ["p:spPr", "a:prstGeom", "attrs", "prst"]) || "rect", Cg = Fs(I, void 0, g, i), Ig = Cg.borderColor, x = Cg.borderWidth, Ag = Cg.borderType, eg = Cg.strokeDasharray, O = nbg(I["p:blipFill"]), _ = { type: "image", top: Y, left: R, width: H, height: S, rotate: N, src: z, isFlipV: K, isFlipH: V, order: A, rect: k, geom: q, borderColor: Ig, borderWidth: x, borderType: Ag, borderStrokeDasharray: eg, placeholderType: l, placeholderIdx: n }, O && (_.filters = O), lg.abrupt("return", _);
  32542. case 67:
  32543. case "end":
  32544. return lg.stop();
  32545. }
  32546. }, t);
  32547. })), QD.apply(this, arguments);
  32548. }
  32549. function Qbg(t, I, g) {
  32550. return OD.apply(this, arguments);
  32551. }
  32552. function OD() {
  32553. return OD = SC(bI.mark(function t(I, g, C) {
  32554. var i, e, A, s, l, n;
  32555. return bI.wrap(function(a) {
  32556. for (; ; ) switch (a.prev = a.next) {
  32557. case 0:
  32558. i = U(I, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]), e = i && U(i, ["attrs", "type"]) || "", A = i && U(i, ["attrs", "idx"]) || "", s = U(I, ["a:graphic", "a:graphicData", "attrs", "uri"]), a.t0 = s, a.next = a.t0 === "http://schemas.openxmlformats.org/drawingml/2006/table" ? 7 : a.t0 === "http://schemas.openxmlformats.org/drawingml/2006/chart" ? 11 : a.t0 === "http://schemas.openxmlformats.org/drawingml/2006/diagram" ? 15 : a.t0 === "http://schemas.openxmlformats.org/presentationml/2006/ole" ? 19 : 26;
  32559. break;
  32560. case 7:
  32561. return a.next = 9, Obg(I, g);
  32562. case 9:
  32563. return l = a.sent, a.abrupt("break", 26);
  32564. case 11:
  32565. return a.next = 13, Ubg(I, g);
  32566. case 13:
  32567. return l = a.sent, a.abrupt("break", 26);
  32568. case 15:
  32569. return a.next = 17, Ebg(I, g);
  32570. case 17:
  32571. return l = a.sent, a.abrupt("break", 26);
  32572. case 19:
  32573. if ((n = U(I, ["a:graphic", "a:graphicData", "mc:AlternateContent", "mc:Fallback", "p:oleObj"])) || (n = U(I, ["a:graphic", "a:graphicData", "p:oleObj"])), !n) {
  32574. a.next = 25;
  32575. break;
  32576. }
  32577. return a.next = 24, LD(n, g, C);
  32578. case 24:
  32579. l = a.sent;
  32580. case 25:
  32581. return a.abrupt("break", 26);
  32582. case 26:
  32583. return l && (e || A) && (l.placeholderType = e, l.placeholderIdx = A), a.abrupt("return", l);
  32584. case 28:
  32585. case "end":
  32586. return a.stop();
  32587. }
  32588. }, t);
  32589. })), OD.apply(this, arguments);
  32590. }
  32591. function Obg(t, I) {
  32592. return UD.apply(this, arguments);
  32593. }
  32594. function UD() {
  32595. return UD = SC(bI.mark(function t(I, g) {
  32596. var C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg;
  32597. return bI.wrap(function(og) {
  32598. for (; ; ) switch (og.prev = og.next) {
  32599. case 0:
  32600. if (C = I.attrs.order, i = U(I, ["a:graphic", "a:graphicData", "a:tbl"]), e = U(I, ["p:xfrm"]), A = f0(e, void 0, void 0), s = A.top, l = A.left, n = H0(e, void 0, void 0), a = n.width, d = n.height, o = U(I, ["a:graphic", "a:graphicData", "a:tbl", "a:tblPr"]), (c = U(I, ["a:graphic", "a:graphicData", "a:tbl", "a:tblGrid", "a:gridCol"])).constructor !== Array && (c = [c]), r = [], c) {
  32601. h = wC(c);
  32602. try {
  32603. for (h.s(); !(b = h.n()).done; ) u = b.value, m = U(u, ["attrs", "w"]) || 0, Z = parseInt(m) * Gg, r.push(Z);
  32604. } catch (cg) {
  32605. h.e(cg);
  32606. } finally {
  32607. h.f();
  32608. }
  32609. }
  32610. if (p = o.attrs ? o.attrs.firstRow : void 0, Y = o.attrs ? o.attrs.firstCol : void 0, R = o.attrs ? o.attrs.lastRow : void 0, X = o.attrs ? o.attrs.lastCol : void 0, H = o.attrs ? o.attrs.bandRow : void 0, S = o.attrs ? o.attrs.bandCol : void 0, z = { isFrstRowAttr: p && p === "1" ? 1 : 0, isFrstColAttr: Y && Y === "1" ? 1 : 0, isLstRowAttr: R && R === "1" ? 1 : 0, isLstColAttr: X && X === "1" ? 1 : 0, isBandRowAttr: H && H === "1" ? 1 : 0, isBandColAttr: S && S === "1" ? 1 : 0 }, (K = o["a:tableStyleId"]) && (V = g.tableStyles["a:tblStyleLst"]["a:tblStyle"])) if (V.constructor === Array) for (N = 0; N < V.length; N++) V[N].attrs.styleId === K && (v = V[N]);
  32611. else V.attrs.styleId === K && (v = V);
  32612. v && (v.tblStylAttrObj = z), B = {}, G = U(v, ["a:wholeTbl", "a:tcStyle"]), (w = U(G, ["a:tcBdr"])) && (B = ybg(w, g)), W = "", (y = U(v, ["a:tblBg", "a:fillRef"])) && (W = eC(y, void 0, void 0, g)), y === void 0 && (y = U(v, ["a:wholeTbl", "a:tcStyle", "a:fill", "a:solidFill"]), W = eC(y, void 0, void 0, g)), (f = i["a:tr"]).constructor !== Array && (f = [f]), D = [], F = [], T = 0;
  32613. case 33:
  32614. if (!(T < f.length)) {
  32615. og.next = 88;
  32616. break;
  32617. }
  32618. if (Q = f[T], P = U(f[T], ["attrs", "h"]) || 0, L = parseInt(P) * Gg, F.push(L), E = Ybg(f, T, z, v, g), J = E.fillColor, k = E.fontColor, j = E.fontBold, q = Q["a:tc"], Cg = [], q.constructor !== Array) {
  32619. og.next = 67;
  32620. break;
  32621. }
  32622. Ig = 0;
  32623. case 43:
  32624. if (!(Ig < q.length)) {
  32625. og.next = 65;
  32626. break;
  32627. }
  32628. return x = q[Ig], Ag = void 0, Ig === 0 && z.isFrstColAttr === 1 ? (Ag = "a:firstCol", z.isLstRowAttr === 1 && T === f.length - 1 && U(v, ["a:seCell"]) ? Ag = "a:seCell" : z.isFrstRowAttr === 1 && T === 0 && U(v, ["a:neCell"]) && (Ag = "a:neCell")) : !(Ig > 0 && z.isBandColAttr === 1) || z.isFrstColAttr === 1 && T === 0 || z.isLstRowAttr === 1 && T === f.length - 1 || Ig === q.length - 1 || Ig % 2 != 0 && (U(v, ["a:band2V"]) === void 0 ? U(v, ["a:band1V"]) && (Ag = "a:band2V") : Ag = "a:band2V"), Ig === q.length - 1 && z.isLstColAttr === 1 && (Ag = "a:lastCol", z.isLstRowAttr === 1 && T === f.length - 1 && U(v, ["a:swCell"]) ? Ag = "a:swCell" : z.isFrstRowAttr === 1 && T === 0 && U(v, ["a:nwCell"]) && (Ag = "a:nwCell")), eg = BV(x["a:txBody"], x, void 0, void 0, g), og.next = 51, wq(x, v, Ag, g);
  32629. case 51:
  32630. O = og.sent, _ = { text: eg }, O.rowSpan && (_.rowSpan = O.rowSpan), O.colSpan && (_.colSpan = O.colSpan), O.vMerge && (_.vMerge = O.vMerge), O.hMerge && (_.hMerge = O.hMerge), (O.fontBold || j) && (_.fontBold = O.fontBold || j), (O.fontColor || k) && (_.fontColor = O.fontColor || k), (O.fillColor || J || W) && (_.fillColor = O.fillColor || J || W), O.borders && (_.borders = O.borders), Cg.push(_);
  32631. case 62:
  32632. Ig++, og.next = 43;
  32633. break;
  32634. case 65:
  32635. og.next = 84;
  32636. break;
  32637. case 67:
  32638. return gg = void 0, z.isFrstColAttr === 1 && z.isLstRowAttr !== 1 ? gg = "a:firstCol" : z.isBandColAttr === 1 && z.isLstRowAttr !== 1 && (U(v, ["a:band2V"]) || U(v, ["a:band1V"])) && (gg = "a:band2V"), z.isLstColAttr === 1 && z.isLstRowAttr !== 1 && (gg = "a:lastCol"), lg = BV(q["a:txBody"], q, void 0, void 0, g), og.next = 73, wq(q, v, gg, g);
  32639. case 73:
  32640. ng = og.sent, sg = { text: lg }, ng.rowSpan && (sg.rowSpan = ng.rowSpan), ng.colSpan && (sg.colSpan = ng.colSpan), ng.vMerge && (sg.vMerge = ng.vMerge), ng.hMerge && (sg.hMerge = ng.hMerge), (ng.fontBold || j) && (sg.fontBold = ng.fontBold || j), (ng.fontColor || k) && (sg.fontColor = ng.fontColor || k), (ng.fillColor || J || W) && (sg.fillColor = ng.fillColor || J || W), ng.borders && (sg.borders = ng.borders), Cg.push(sg);
  32641. case 84:
  32642. D.push(Cg);
  32643. case 85:
  32644. T++, og.next = 33;
  32645. break;
  32646. case 88:
  32647. return og.abrupt("return", { type: "table", top: s, left: l, width: a, height: d, data: D, order: C, borders: B, rowHeights: F, colWidths: r });
  32648. case 89:
  32649. case "end":
  32650. return og.stop();
  32651. }
  32652. }, t);
  32653. })), UD.apply(this, arguments);
  32654. }
  32655. function Ubg(t, I) {
  32656. return ED.apply(this, arguments);
  32657. }
  32658. function ED() {
  32659. return ED = SC(bI.mark(function t(I, g) {
  32660. var C, i, e, A, s, l, n, a, d, o, c, r, h, b;
  32661. return bI.wrap(function(u) {
  32662. for (; ; ) switch (u.prev = u.next) {
  32663. case 0:
  32664. if (C = I.attrs.order, i = U(I, ["p:xfrm"]), e = f0(i, void 0, void 0), A = e.top, s = e.left, l = H0(i, void 0, void 0), n = l.width, a = l.height, d = I["a:graphic"]["a:graphicData"]["c:chart"].attrs["r:id"], (o = U(g.slideResObj, [d, "target"])) || (o = U(g.layoutResObj, [d, "target"])), o || (o = U(g.masterResObj, [d, "target"])), o) {
  32665. u.next = 10;
  32666. break;
  32667. }
  32668. return u.abrupt("return", {});
  32669. case 10:
  32670. return u.next = 12, yt(g.zip, o);
  32671. case 12:
  32672. if (c = u.sent, r = U(c, ["c:chartSpace", "c:chart", "c:plotArea"]), h = dbg(r, g)) {
  32673. u.next = 17;
  32674. break;
  32675. }
  32676. return u.abrupt("return", {});
  32677. case 17:
  32678. return b = { type: "chart", top: A, left: s, width: n, height: a, data: h.data, colors: h.colors, chartType: h.type, order: C }, h.marker !== void 0 && (b.marker = h.marker), h.barDir !== void 0 && (b.barDir = h.barDir), h.holeSize !== void 0 && (b.holeSize = h.holeSize), h.grouping !== void 0 && (b.grouping = h.grouping), h.style !== void 0 && (b.style = h.style), u.abrupt("return", b);
  32679. case 24:
  32680. case "end":
  32681. return u.stop();
  32682. }
  32683. }, t);
  32684. })), ED.apply(this, arguments);
  32685. }
  32686. function Ebg(t, I) {
  32687. return PD.apply(this, arguments);
  32688. }
  32689. function PD() {
  32690. return PD = SC(bI.mark(function t(I, g) {
  32691. var C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V;
  32692. return bI.wrap(function(N) {
  32693. for (; ; ) switch (N.prev = N.next) {
  32694. case 0:
  32695. if (C = I.attrs.order, i = U(I, ["p:xfrm"]), e = f0(i, void 0, void 0), A = e.left, s = e.top, l = H0(i, void 0, void 0), n = l.width, a = l.height, !(d = U(I, ["a:graphic", "a:graphicData", "dgm:relIds", "attrs"]) || U(I, ["a:graphic", "a:graphicData", "p:relIds", "attrs"]))) {
  32696. N.next = 19;
  32697. break;
  32698. }
  32699. c = 0, r = Object.keys(d);
  32700. case 7:
  32701. if (!(c < r.length)) {
  32702. N.next = 19;
  32703. break;
  32704. }
  32705. if ((h = r[c]).startsWith("r:")) {
  32706. N.next = 11;
  32707. break;
  32708. }
  32709. return N.abrupt("continue", 16);
  32710. case 11:
  32711. if (b = d[h], !(u = U(g, ["slideResObj", b, "target"])) || typeof u != "string" || !/\/diagrams\/drawing/i.test(u)) {
  32712. N.next = 16;
  32713. break;
  32714. }
  32715. return o = u, N.abrupt("break", 19);
  32716. case 16:
  32717. c++, N.next = 7;
  32718. break;
  32719. case 19:
  32720. if (o || (m = g.diagramDrawingCursor || 0, o = g.diagramDrawingTargets && g.diagramDrawingTargets[m], g.diagramDrawingCursor = m + 1), Z = g.diagramResObj, p = g.digramFileContent, o && (g.diagramResObj = U(g, ["diagramResObjByTarget", o]) || Z, g.digramFileContent = U(g, ["diagramDrawingContents", o]) || p), Y = [], !(R = U(g.digramFileContent, ["p:drawing", "p:spTree"]))) {
  32721. N.next = 60;
  32722. break;
  32723. }
  32724. N.t0 = bI.keys(R);
  32725. case 27:
  32726. if ((N.t1 = N.t0()).done) {
  32727. N.next = 60;
  32728. break;
  32729. }
  32730. if ((X = N.t1.value) !== "p:nvGrpSpPr" && X !== "p:grpSpPr") {
  32731. N.next = 31;
  32732. break;
  32733. }
  32734. return N.abrupt("continue", 27);
  32735. case 31:
  32736. if (H = R[X], !Array.isArray(H)) {
  32737. N.next = 54;
  32738. break;
  32739. }
  32740. S = wC(H), N.prev = 34, S.s();
  32741. case 36:
  32742. if ((z = S.n()).done) {
  32743. N.next = 44;
  32744. break;
  32745. }
  32746. return v = z.value, N.next = 40, ql(X, v, R, g, "diagramBg");
  32747. case 40:
  32748. (K = N.sent) && Y.push(K);
  32749. case 42:
  32750. N.next = 36;
  32751. break;
  32752. case 44:
  32753. N.next = 49;
  32754. break;
  32755. case 46:
  32756. N.prev = 46, N.t2 = N.catch(34), S.e(N.t2);
  32757. case 49:
  32758. return N.prev = 49, S.f(), N.finish(49);
  32759. case 52:
  32760. N.next = 58;
  32761. break;
  32762. case 54:
  32763. return N.next = 56, ql(X, H, R, g, "diagramBg");
  32764. case 56:
  32765. (V = N.sent) && Y.push(V);
  32766. case 58:
  32767. N.next = 27;
  32768. break;
  32769. case 60:
  32770. return N0(Y), g.diagramResObj = Z, g.digramFileContent = p, N.abrupt("return", { type: "diagram", left: A, top: s, width: n, height: a, elements: Y, order: C });
  32771. case 64:
  32772. case "end":
  32773. return N.stop();
  32774. }
  32775. }, t, null, [[34, 46, 49, 52]]);
  32776. })), PD.apply(this, arguments);
  32777. }
  32778. async function Pbg(t, I) {
  32779. const g = await Sbg(t), C = iG(Lrg, { pptxJson: g });
  32780. return C.mount(I), {
  32781. $el: I,
  32782. $destroy() {
  32783. C.unmount();
  32784. }
  32785. };
  32786. }
  32787. var kX = { exports: {} };
  32788. /*! ExcelJS 19-10-2023 */
  32789. var Mq;
  32790. function _bg() {
  32791. return Mq || (Mq = 1, function(t, I) {
  32792. (function(g) {
  32793. t.exports = g();
  32794. })(function() {
  32795. return function g(C, i, e) {
  32796. function A(n, a) {
  32797. if (!i[n]) {
  32798. if (!C[n]) {
  32799. var d = typeof Qa == "function" && Qa;
  32800. if (!a && d) return d(n, !0);
  32801. if (s) return s(n, !0);
  32802. var o = new Error("Cannot find module '" + n + "'");
  32803. throw o.code = "MODULE_NOT_FOUND", o;
  32804. }
  32805. var c = i[n] = { exports: {} };
  32806. C[n][0].call(c.exports, function(r) {
  32807. return A(C[n][1][r] || r);
  32808. }, c, c.exports, g, C, i, e);
  32809. }
  32810. return i[n].exports;
  32811. }
  32812. for (var s = typeof Qa == "function" && Qa, l = 0; l < e.length; l++) A(e[l]);
  32813. return A;
  32814. }({ 1: [function(g, C, i) {
  32815. const e = g("fs"), A = g("fast-csv"), s = g("dayjs/plugin/customParseFormat"), l = g("dayjs/plugin/utc"), n = g("dayjs").extend(s).extend(l), a = g("../utils/stream-buf"), { fs: { exists: d } } = g("../utils/utils"), o = { true: !0, false: !1, "#N/A": { error: "#N/A" }, "#REF!": { error: "#REF!" }, "#NAME?": { error: "#NAME?" }, "#DIV/0!": { error: "#DIV/0!" }, "#NULL!": { error: "#NULL!" }, "#VALUE!": { error: "#VALUE!" }, "#NUM!": { error: "#NUM!" } };
  32816. C.exports = class {
  32817. constructor(c) {
  32818. this.workbook = c, this.worksheet = null;
  32819. }
  32820. async readFile(c, r) {
  32821. if (r = r || {}, !await d(c)) throw new Error("File not found: " + c);
  32822. const h = e.createReadStream(c), b = await this.read(h, r);
  32823. return h.close(), b;
  32824. }
  32825. read(c, r) {
  32826. return r = r || {}, new Promise((h, b) => {
  32827. const u = this.workbook.addWorksheet(r.sheetName), m = r.dateFormats || ["YYYY-MM-DD[T]HH:mm:ssZ", "YYYY-MM-DD[T]HH:mm:ss", "MM-DD-YYYY", "YYYY-MM-DD"], Z = r.map || function(Y) {
  32828. if (Y === "") return null;
  32829. const R = Number(Y);
  32830. if (!Number.isNaN(R) && R !== 1 / 0) return R;
  32831. const X = m.reduce((S, z) => {
  32832. if (S) return S;
  32833. const v = n(Y, z, !0);
  32834. return v.isValid() ? v : null;
  32835. }, null);
  32836. if (X) return new Date(X.valueOf());
  32837. const H = o[Y];
  32838. return H !== void 0 ? H : Y;
  32839. }, p = A.parse(r.parserOptions).on("data", (Y) => {
  32840. u.addRow(Y.map(Z));
  32841. }).on("end", () => {
  32842. p.emit("worksheet", u);
  32843. });
  32844. p.on("worksheet", h).on("error", b), c.pipe(p);
  32845. });
  32846. }
  32847. createInputStream() {
  32848. throw new Error("`CSV#createInputStream` is deprecated. You should use `CSV#read` instead. This method will be removed in version 5.0. Please follow upgrade instruction: https://github.com/exceljs/exceljs/blob/master/UPGRADE-4.0.md");
  32849. }
  32850. write(c, r) {
  32851. return new Promise((h, b) => {
  32852. r = r || {};
  32853. const u = this.workbook.getWorksheet(r.sheetName || r.sheetId), m = A.format(r.formatterOptions);
  32854. c.on("finish", () => {
  32855. h();
  32856. }), m.on("error", b), m.pipe(c);
  32857. const { dateFormat: Z, dateUTC: p } = r, Y = r.map || ((H) => {
  32858. if (H) {
  32859. if (H.text || H.hyperlink) return H.hyperlink || H.text || "";
  32860. if (H.formula || H.result) return H.result || "";
  32861. if (H instanceof Date) return Z ? p ? n.utc(H).format(Z) : n(H).format(Z) : p ? n.utc(H).format() : n(H).format();
  32862. if (H.error) return H.error;
  32863. if (typeof H == "object") return JSON.stringify(H);
  32864. }
  32865. return H;
  32866. }), R = r.includeEmptyRows === void 0 || r.includeEmptyRows;
  32867. let X = 1;
  32868. u && u.eachRow((H, S) => {
  32869. if (R) for (; X++ < S - 1; ) m.write([]);
  32870. const { values: z } = H;
  32871. z.shift(), m.write(z.map(Y)), X = S;
  32872. }), m.end();
  32873. });
  32874. }
  32875. writeFile(c, r) {
  32876. const h = { encoding: (r = r || {}).encoding || "utf8" }, b = e.createWriteStream(c, h);
  32877. return this.write(b, r);
  32878. }
  32879. async writeBuffer(c) {
  32880. const r = new a();
  32881. return await this.write(r, c), r.read();
  32882. }
  32883. };
  32884. }, { "../utils/stream-buf": 24, "../utils/utils": 27, dayjs: 391, "dayjs/plugin/customParseFormat": 392, "dayjs/plugin/utc": 393, "fast-csv": 424, fs: 216 }], 2: [function(g, C, i) {
  32885. const e = g("../utils/col-cache");
  32886. class A {
  32887. constructor(l, n) {
  32888. let a = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 0;
  32889. if (this.worksheet = l, n) if (typeof n == "string") {
  32890. const d = e.decodeAddress(n);
  32891. this.nativeCol = d.col + a, this.nativeColOff = 0, this.nativeRow = d.row + a, this.nativeRowOff = 0;
  32892. } else n.nativeCol !== void 0 ? (this.nativeCol = n.nativeCol || 0, this.nativeColOff = n.nativeColOff || 0, this.nativeRow = n.nativeRow || 0, this.nativeRowOff = n.nativeRowOff || 0) : n.col !== void 0 ? (this.col = n.col + a, this.row = n.row + a) : (this.nativeCol = 0, this.nativeColOff = 0, this.nativeRow = 0, this.nativeRowOff = 0);
  32893. else this.nativeCol = 0, this.nativeColOff = 0, this.nativeRow = 0, this.nativeRowOff = 0;
  32894. }
  32895. static asInstance(l) {
  32896. return l instanceof A || l == null ? l : new A(l);
  32897. }
  32898. get col() {
  32899. return this.nativeCol + Math.min(this.colWidth - 1, this.nativeColOff) / this.colWidth;
  32900. }
  32901. set col(l) {
  32902. this.nativeCol = Math.floor(l), this.nativeColOff = Math.floor((l - this.nativeCol) * this.colWidth);
  32903. }
  32904. get row() {
  32905. return this.nativeRow + Math.min(this.rowHeight - 1, this.nativeRowOff) / this.rowHeight;
  32906. }
  32907. set row(l) {
  32908. this.nativeRow = Math.floor(l), this.nativeRowOff = Math.floor((l - this.nativeRow) * this.rowHeight);
  32909. }
  32910. get colWidth() {
  32911. return this.worksheet && this.worksheet.getColumn(this.nativeCol + 1) && this.worksheet.getColumn(this.nativeCol + 1).isCustomWidth ? Math.floor(1e4 * this.worksheet.getColumn(this.nativeCol + 1).width) : 64e4;
  32912. }
  32913. get rowHeight() {
  32914. return this.worksheet && this.worksheet.getRow(this.nativeRow + 1) && this.worksheet.getRow(this.nativeRow + 1).height ? Math.floor(1e4 * this.worksheet.getRow(this.nativeRow + 1).height) : 18e4;
  32915. }
  32916. get model() {
  32917. return { nativeCol: this.nativeCol, nativeColOff: this.nativeColOff, nativeRow: this.nativeRow, nativeRowOff: this.nativeRowOff };
  32918. }
  32919. set model(l) {
  32920. this.nativeCol = l.nativeCol, this.nativeColOff = l.nativeColOff, this.nativeRow = l.nativeRow, this.nativeRowOff = l.nativeRowOff;
  32921. }
  32922. }
  32923. C.exports = A;
  32924. }, { "../utils/col-cache": 19 }], 3: [function(g, C, i) {
  32925. const e = g("../utils/col-cache"), A = g("../utils/under-dash"), s = g("./enums"), { slideFormula: l } = g("../utils/shared-formula"), n = g("./note");
  32926. class a {
  32927. constructor(c, r, h) {
  32928. if (!c || !r) throw new Error("A Cell needs a Row");
  32929. this._row = c, this._column = r, e.validateAddress(h), this._address = h, this._value = d.create(a.Types.Null, this), this.style = this._mergeStyle(c.style, r.style, {}), this._mergeCount = 0;
  32930. }
  32931. get worksheet() {
  32932. return this._row.worksheet;
  32933. }
  32934. get workbook() {
  32935. return this._row.worksheet.workbook;
  32936. }
  32937. destroy() {
  32938. delete this.style, delete this._value, delete this._row, delete this._column, delete this._address;
  32939. }
  32940. get numFmt() {
  32941. return this.style.numFmt;
  32942. }
  32943. set numFmt(c) {
  32944. this.style.numFmt = c;
  32945. }
  32946. get font() {
  32947. return this.style.font;
  32948. }
  32949. set font(c) {
  32950. this.style.font = c;
  32951. }
  32952. get alignment() {
  32953. return this.style.alignment;
  32954. }
  32955. set alignment(c) {
  32956. this.style.alignment = c;
  32957. }
  32958. get border() {
  32959. return this.style.border;
  32960. }
  32961. set border(c) {
  32962. this.style.border = c;
  32963. }
  32964. get fill() {
  32965. return this.style.fill;
  32966. }
  32967. set fill(c) {
  32968. this.style.fill = c;
  32969. }
  32970. get protection() {
  32971. return this.style.protection;
  32972. }
  32973. set protection(c) {
  32974. this.style.protection = c;
  32975. }
  32976. _mergeStyle(c, r, h) {
  32977. const b = c && c.numFmt || r && r.numFmt;
  32978. b && (h.numFmt = b);
  32979. const u = c && c.font || r && r.font;
  32980. u && (h.font = u);
  32981. const m = c && c.alignment || r && r.alignment;
  32982. m && (h.alignment = m);
  32983. const Z = c && c.border || r && r.border;
  32984. Z && (h.border = Z);
  32985. const p = c && c.fill || r && r.fill;
  32986. p && (h.fill = p);
  32987. const Y = c && c.protection || r && r.protection;
  32988. return Y && (h.protection = Y), h;
  32989. }
  32990. get address() {
  32991. return this._address;
  32992. }
  32993. get row() {
  32994. return this._row.number;
  32995. }
  32996. get col() {
  32997. return this._column.number;
  32998. }
  32999. get $col$row() {
  33000. return `$${this._column.letter}$${this.row}`;
  33001. }
  33002. get type() {
  33003. return this._value.type;
  33004. }
  33005. get effectiveType() {
  33006. return this._value.effectiveType;
  33007. }
  33008. toCsvString() {
  33009. return this._value.toCsvString();
  33010. }
  33011. addMergeRef() {
  33012. this._mergeCount++;
  33013. }
  33014. releaseMergeRef() {
  33015. this._mergeCount--;
  33016. }
  33017. get isMerged() {
  33018. return this._mergeCount > 0 || this.type === a.Types.Merge;
  33019. }
  33020. merge(c, r) {
  33021. this._value.release(), this._value = d.create(a.Types.Merge, this, c), r || (this.style = c.style);
  33022. }
  33023. unmerge() {
  33024. this.type === a.Types.Merge && (this._value.release(), this._value = d.create(a.Types.Null, this), this.style = this._mergeStyle(this._row.style, this._column.style, {}));
  33025. }
  33026. isMergedTo(c) {
  33027. return this._value.type === a.Types.Merge && this._value.isMergedTo(c);
  33028. }
  33029. get master() {
  33030. return this.type === a.Types.Merge ? this._value.master : this;
  33031. }
  33032. get isHyperlink() {
  33033. return this._value.type === a.Types.Hyperlink;
  33034. }
  33035. get hyperlink() {
  33036. return this._value.hyperlink;
  33037. }
  33038. get value() {
  33039. return this._value.value;
  33040. }
  33041. set value(c) {
  33042. this.type !== a.Types.Merge ? (this._value.release(), this._value = d.create(d.getType(c), this, c)) : this._value.master.value = c;
  33043. }
  33044. get note() {
  33045. return this._comment && this._comment.note;
  33046. }
  33047. set note(c) {
  33048. this._comment = new n(c);
  33049. }
  33050. get text() {
  33051. return this._value.toString();
  33052. }
  33053. get html() {
  33054. return A.escapeHtml(this.text);
  33055. }
  33056. toString() {
  33057. return this.text;
  33058. }
  33059. _upgradeToHyperlink(c) {
  33060. this.type === a.Types.String && (this._value = d.create(a.Types.Hyperlink, this, { text: this._value.value, hyperlink: c }));
  33061. }
  33062. get formula() {
  33063. return this._value.formula;
  33064. }
  33065. get result() {
  33066. return this._value.result;
  33067. }
  33068. get formulaType() {
  33069. return this._value.formulaType;
  33070. }
  33071. get fullAddress() {
  33072. const { worksheet: c } = this._row;
  33073. return { sheetName: c.name, address: this.address, row: this.row, col: this.col };
  33074. }
  33075. get name() {
  33076. return this.names[0];
  33077. }
  33078. set name(c) {
  33079. this.names = [c];
  33080. }
  33081. get names() {
  33082. return this.workbook.definedNames.getNamesEx(this.fullAddress);
  33083. }
  33084. set names(c) {
  33085. const { definedNames: r } = this.workbook;
  33086. r.removeAllNames(this.fullAddress), c.forEach((h) => {
  33087. r.addEx(this.fullAddress, h);
  33088. });
  33089. }
  33090. addName(c) {
  33091. this.workbook.definedNames.addEx(this.fullAddress, c);
  33092. }
  33093. removeName(c) {
  33094. this.workbook.definedNames.removeEx(this.fullAddress, c);
  33095. }
  33096. removeAllNames() {
  33097. this.workbook.definedNames.removeAllNames(this.fullAddress);
  33098. }
  33099. get _dataValidations() {
  33100. return this.worksheet.dataValidations;
  33101. }
  33102. get dataValidation() {
  33103. return this._dataValidations.find(this.address);
  33104. }
  33105. set dataValidation(c) {
  33106. this._dataValidations.add(this.address, c);
  33107. }
  33108. get model() {
  33109. const { model: c } = this._value;
  33110. return c.style = this.style, this._comment && (c.comment = this._comment.model), c;
  33111. }
  33112. set model(c) {
  33113. if (this._value.release(), this._value = d.create(c.type, this), this._value.model = c, c.comment) switch (c.comment.type) {
  33114. case "note":
  33115. this._comment = n.fromModel(c.comment);
  33116. }
  33117. c.style ? this.style = c.style : this.style = {};
  33118. }
  33119. }
  33120. a.Types = s.ValueType;
  33121. const d = { getType: (o) => o == null ? a.Types.Null : o instanceof String || typeof o == "string" ? a.Types.String : typeof o == "number" ? a.Types.Number : typeof o == "boolean" ? a.Types.Boolean : o instanceof Date ? a.Types.Date : o.text && o.hyperlink ? a.Types.Hyperlink : o.formula || o.sharedFormula ? a.Types.Formula : o.richText ? a.Types.RichText : o.sharedString ? a.Types.SharedString : o.error ? a.Types.Error : a.Types.JSON, types: [{ t: a.Types.Null, f: class {
  33122. constructor(o) {
  33123. this.model = { address: o.address, type: a.Types.Null };
  33124. }
  33125. get value() {
  33126. return null;
  33127. }
  33128. set value(o) {
  33129. }
  33130. get type() {
  33131. return a.Types.Null;
  33132. }
  33133. get effectiveType() {
  33134. return a.Types.Null;
  33135. }
  33136. get address() {
  33137. return this.model.address;
  33138. }
  33139. set address(o) {
  33140. this.model.address = o;
  33141. }
  33142. toCsvString() {
  33143. return "";
  33144. }
  33145. release() {
  33146. }
  33147. toString() {
  33148. return "";
  33149. }
  33150. } }, { t: a.Types.Number, f: class {
  33151. constructor(o, c) {
  33152. this.model = { address: o.address, type: a.Types.Number, value: c };
  33153. }
  33154. get value() {
  33155. return this.model.value;
  33156. }
  33157. set value(o) {
  33158. this.model.value = o;
  33159. }
  33160. get type() {
  33161. return a.Types.Number;
  33162. }
  33163. get effectiveType() {
  33164. return a.Types.Number;
  33165. }
  33166. get address() {
  33167. return this.model.address;
  33168. }
  33169. set address(o) {
  33170. this.model.address = o;
  33171. }
  33172. toCsvString() {
  33173. return this.model.value.toString();
  33174. }
  33175. release() {
  33176. }
  33177. toString() {
  33178. return this.model.value.toString();
  33179. }
  33180. } }, { t: a.Types.String, f: class {
  33181. constructor(o, c) {
  33182. this.model = { address: o.address, type: a.Types.String, value: c };
  33183. }
  33184. get value() {
  33185. return this.model.value;
  33186. }
  33187. set value(o) {
  33188. this.model.value = o;
  33189. }
  33190. get type() {
  33191. return a.Types.String;
  33192. }
  33193. get effectiveType() {
  33194. return a.Types.String;
  33195. }
  33196. get address() {
  33197. return this.model.address;
  33198. }
  33199. set address(o) {
  33200. this.model.address = o;
  33201. }
  33202. toCsvString() {
  33203. return `"${this.model.value.replace(/"/g, '""')}"`;
  33204. }
  33205. release() {
  33206. }
  33207. toString() {
  33208. return this.model.value;
  33209. }
  33210. } }, { t: a.Types.Date, f: class {
  33211. constructor(o, c) {
  33212. this.model = { address: o.address, type: a.Types.Date, value: c };
  33213. }
  33214. get value() {
  33215. return this.model.value;
  33216. }
  33217. set value(o) {
  33218. this.model.value = o;
  33219. }
  33220. get type() {
  33221. return a.Types.Date;
  33222. }
  33223. get effectiveType() {
  33224. return a.Types.Date;
  33225. }
  33226. get address() {
  33227. return this.model.address;
  33228. }
  33229. set address(o) {
  33230. this.model.address = o;
  33231. }
  33232. toCsvString() {
  33233. return this.model.value.toISOString();
  33234. }
  33235. release() {
  33236. }
  33237. toString() {
  33238. return this.model.value.toString();
  33239. }
  33240. } }, { t: a.Types.Hyperlink, f: class {
  33241. constructor(o, c) {
  33242. this.model = { address: o.address, type: a.Types.Hyperlink, text: c ? c.text : void 0, hyperlink: c ? c.hyperlink : void 0 }, c && c.tooltip && (this.model.tooltip = c.tooltip);
  33243. }
  33244. get value() {
  33245. const o = { text: this.model.text, hyperlink: this.model.hyperlink };
  33246. return this.model.tooltip && (o.tooltip = this.model.tooltip), o;
  33247. }
  33248. set value(o) {
  33249. this.model = { text: o.text, hyperlink: o.hyperlink }, o.tooltip && (this.model.tooltip = o.tooltip);
  33250. }
  33251. get text() {
  33252. return this.model.text;
  33253. }
  33254. set text(o) {
  33255. this.model.text = o;
  33256. }
  33257. get hyperlink() {
  33258. return this.model.hyperlink;
  33259. }
  33260. set hyperlink(o) {
  33261. this.model.hyperlink = o;
  33262. }
  33263. get type() {
  33264. return a.Types.Hyperlink;
  33265. }
  33266. get effectiveType() {
  33267. return a.Types.Hyperlink;
  33268. }
  33269. get address() {
  33270. return this.model.address;
  33271. }
  33272. set address(o) {
  33273. this.model.address = o;
  33274. }
  33275. toCsvString() {
  33276. return this.model.hyperlink;
  33277. }
  33278. release() {
  33279. }
  33280. toString() {
  33281. return this.model.text;
  33282. }
  33283. } }, { t: a.Types.Formula, f: class {
  33284. constructor(o, c) {
  33285. this.cell = o, this.model = { address: o.address, type: a.Types.Formula, shareType: c ? c.shareType : void 0, ref: c ? c.ref : void 0, formula: c ? c.formula : void 0, sharedFormula: c ? c.sharedFormula : void 0, result: c ? c.result : void 0 };
  33286. }
  33287. _copyModel(o) {
  33288. const c = {}, r = (h) => {
  33289. const b = o[h];
  33290. b && (c[h] = b);
  33291. };
  33292. return r("formula"), r("result"), r("ref"), r("shareType"), r("sharedFormula"), c;
  33293. }
  33294. get value() {
  33295. return this._copyModel(this.model);
  33296. }
  33297. set value(o) {
  33298. this.model = this._copyModel(o);
  33299. }
  33300. validate(o) {
  33301. switch (d.getType(o)) {
  33302. case a.Types.Null:
  33303. case a.Types.String:
  33304. case a.Types.Number:
  33305. case a.Types.Date:
  33306. break;
  33307. case a.Types.Hyperlink:
  33308. case a.Types.Formula:
  33309. default:
  33310. throw new Error("Cannot process that type of result value");
  33311. }
  33312. }
  33313. get dependencies() {
  33314. return { ranges: this.formula.match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\d{1,4}:[A-Z]{1,3}\d{1,4}/g), cells: this.formula.replace(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\d{1,4}:[A-Z]{1,3}\d{1,4}/g, "").match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\d{1,4}/g) };
  33315. }
  33316. get formula() {
  33317. return this.model.formula || this._getTranslatedFormula();
  33318. }
  33319. set formula(o) {
  33320. this.model.formula = o;
  33321. }
  33322. get formulaType() {
  33323. return this.model.formula ? s.FormulaType.Master : this.model.sharedFormula ? s.FormulaType.Shared : s.FormulaType.None;
  33324. }
  33325. get result() {
  33326. return this.model.result;
  33327. }
  33328. set result(o) {
  33329. this.model.result = o;
  33330. }
  33331. get type() {
  33332. return a.Types.Formula;
  33333. }
  33334. get effectiveType() {
  33335. const o = this.model.result;
  33336. return o == null ? s.ValueType.Null : o instanceof String || typeof o == "string" ? s.ValueType.String : typeof o == "number" ? s.ValueType.Number : o instanceof Date ? s.ValueType.Date : o.text && o.hyperlink ? s.ValueType.Hyperlink : o.formula ? s.ValueType.Formula : s.ValueType.Null;
  33337. }
  33338. get address() {
  33339. return this.model.address;
  33340. }
  33341. set address(o) {
  33342. this.model.address = o;
  33343. }
  33344. _getTranslatedFormula() {
  33345. if (!this._translatedFormula && this.model.sharedFormula) {
  33346. const { worksheet: o } = this.cell, c = o.findCell(this.model.sharedFormula);
  33347. this._translatedFormula = c && l(c.formula, c.address, this.model.address);
  33348. }
  33349. return this._translatedFormula;
  33350. }
  33351. toCsvString() {
  33352. return "" + (this.model.result || "");
  33353. }
  33354. release() {
  33355. }
  33356. toString() {
  33357. return this.model.result ? this.model.result.toString() : "";
  33358. }
  33359. } }, { t: a.Types.Merge, f: class {
  33360. constructor(o, c) {
  33361. this.model = { address: o.address, type: a.Types.Merge, master: c ? c.address : void 0 }, this._master = c, c && c.addMergeRef();
  33362. }
  33363. get value() {
  33364. return this._master.value;
  33365. }
  33366. set value(o) {
  33367. o instanceof a ? (this._master && this._master.releaseMergeRef(), o.addMergeRef(), this._master = o) : this._master.value = o;
  33368. }
  33369. isMergedTo(o) {
  33370. return o === this._master;
  33371. }
  33372. get master() {
  33373. return this._master;
  33374. }
  33375. get type() {
  33376. return a.Types.Merge;
  33377. }
  33378. get effectiveType() {
  33379. return this._master.effectiveType;
  33380. }
  33381. get address() {
  33382. return this.model.address;
  33383. }
  33384. set address(o) {
  33385. this.model.address = o;
  33386. }
  33387. toCsvString() {
  33388. return "";
  33389. }
  33390. release() {
  33391. this._master.releaseMergeRef();
  33392. }
  33393. toString() {
  33394. return this.value.toString();
  33395. }
  33396. } }, { t: a.Types.JSON, f: class {
  33397. constructor(o, c) {
  33398. this.model = { address: o.address, type: a.Types.String, value: JSON.stringify(c), rawValue: c };
  33399. }
  33400. get value() {
  33401. return this.model.rawValue;
  33402. }
  33403. set value(o) {
  33404. this.model.rawValue = o, this.model.value = JSON.stringify(o);
  33405. }
  33406. get type() {
  33407. return a.Types.String;
  33408. }
  33409. get effectiveType() {
  33410. return a.Types.String;
  33411. }
  33412. get address() {
  33413. return this.model.address;
  33414. }
  33415. set address(o) {
  33416. this.model.address = o;
  33417. }
  33418. toCsvString() {
  33419. return this.model.value;
  33420. }
  33421. release() {
  33422. }
  33423. toString() {
  33424. return this.model.value;
  33425. }
  33426. } }, { t: a.Types.SharedString, f: class {
  33427. constructor(o, c) {
  33428. this.model = { address: o.address, type: a.Types.SharedString, value: c };
  33429. }
  33430. get value() {
  33431. return this.model.value;
  33432. }
  33433. set value(o) {
  33434. this.model.value = o;
  33435. }
  33436. get type() {
  33437. return a.Types.SharedString;
  33438. }
  33439. get effectiveType() {
  33440. return a.Types.SharedString;
  33441. }
  33442. get address() {
  33443. return this.model.address;
  33444. }
  33445. set address(o) {
  33446. this.model.address = o;
  33447. }
  33448. toCsvString() {
  33449. return this.model.value.toString();
  33450. }
  33451. release() {
  33452. }
  33453. toString() {
  33454. return this.model.value.toString();
  33455. }
  33456. } }, { t: a.Types.RichText, f: class {
  33457. constructor(o, c) {
  33458. this.model = { address: o.address, type: a.Types.String, value: c };
  33459. }
  33460. get value() {
  33461. return this.model.value;
  33462. }
  33463. set value(o) {
  33464. this.model.value = o;
  33465. }
  33466. toString() {
  33467. return this.model.value.richText.map((o) => o.text).join("");
  33468. }
  33469. get type() {
  33470. return a.Types.RichText;
  33471. }
  33472. get effectiveType() {
  33473. return a.Types.RichText;
  33474. }
  33475. get address() {
  33476. return this.model.address;
  33477. }
  33478. set address(o) {
  33479. this.model.address = o;
  33480. }
  33481. toCsvString() {
  33482. return `"${this.text.replace(/"/g, '""')}"`;
  33483. }
  33484. release() {
  33485. }
  33486. } }, { t: a.Types.Boolean, f: class {
  33487. constructor(o, c) {
  33488. this.model = { address: o.address, type: a.Types.Boolean, value: c };
  33489. }
  33490. get value() {
  33491. return this.model.value;
  33492. }
  33493. set value(o) {
  33494. this.model.value = o;
  33495. }
  33496. get type() {
  33497. return a.Types.Boolean;
  33498. }
  33499. get effectiveType() {
  33500. return a.Types.Boolean;
  33501. }
  33502. get address() {
  33503. return this.model.address;
  33504. }
  33505. set address(o) {
  33506. this.model.address = o;
  33507. }
  33508. toCsvString() {
  33509. return this.model.value ? 1 : 0;
  33510. }
  33511. release() {
  33512. }
  33513. toString() {
  33514. return this.model.value.toString();
  33515. }
  33516. } }, { t: a.Types.Error, f: class {
  33517. constructor(o, c) {
  33518. this.model = { address: o.address, type: a.Types.Error, value: c };
  33519. }
  33520. get value() {
  33521. return this.model.value;
  33522. }
  33523. set value(o) {
  33524. this.model.value = o;
  33525. }
  33526. get type() {
  33527. return a.Types.Error;
  33528. }
  33529. get effectiveType() {
  33530. return a.Types.Error;
  33531. }
  33532. get address() {
  33533. return this.model.address;
  33534. }
  33535. set address(o) {
  33536. this.model.address = o;
  33537. }
  33538. toCsvString() {
  33539. return this.toString();
  33540. }
  33541. release() {
  33542. }
  33543. toString() {
  33544. return this.model.value.error.toString();
  33545. }
  33546. } }].reduce((o, c) => (o[c.t] = c.f, o), []), create(o, c, r) {
  33547. const h = this.types[o];
  33548. if (!h) throw new Error("Could not create Value of type " + o);
  33549. return new h(c, r);
  33550. } };
  33551. C.exports = a;
  33552. }, { "../utils/col-cache": 19, "../utils/shared-formula": 23, "../utils/under-dash": 26, "./enums": 7, "./note": 9 }], 4: [function(g, C, i) {
  33553. const e = g("../utils/under-dash"), A = g("./enums"), s = g("../utils/col-cache");
  33554. class l {
  33555. constructor(a, d, o) {
  33556. this._worksheet = a, this._number = d, o !== !1 && (this.defn = o);
  33557. }
  33558. get number() {
  33559. return this._number;
  33560. }
  33561. get worksheet() {
  33562. return this._worksheet;
  33563. }
  33564. get letter() {
  33565. return s.n2l(this._number);
  33566. }
  33567. get isCustomWidth() {
  33568. return this.width !== void 0 && this.width !== 9;
  33569. }
  33570. get defn() {
  33571. return { header: this._header, key: this.key, width: this.width, style: this.style, hidden: this.hidden, outlineLevel: this.outlineLevel };
  33572. }
  33573. set defn(a) {
  33574. a ? (this.key = a.key, this.width = a.width !== void 0 ? a.width : 9, this.outlineLevel = a.outlineLevel, a.style ? this.style = a.style : this.style = {}, this.header = a.header, this._hidden = !!a.hidden) : (delete this._header, delete this._key, delete this.width, this.style = {}, this.outlineLevel = 0);
  33575. }
  33576. get headers() {
  33577. return this._header && this._header instanceof Array ? this._header : [this._header];
  33578. }
  33579. get header() {
  33580. return this._header;
  33581. }
  33582. set header(a) {
  33583. a !== void 0 ? (this._header = a, this.headers.forEach((d, o) => {
  33584. this._worksheet.getCell(o + 1, this.number).value = d;
  33585. })) : this._header = void 0;
  33586. }
  33587. get key() {
  33588. return this._key;
  33589. }
  33590. set key(a) {
  33591. (this._key && this._worksheet.getColumnKey(this._key)) === this && this._worksheet.deleteColumnKey(this._key), this._key = a, a && this._worksheet.setColumnKey(this._key, this);
  33592. }
  33593. get hidden() {
  33594. return !!this._hidden;
  33595. }
  33596. set hidden(a) {
  33597. this._hidden = a;
  33598. }
  33599. get outlineLevel() {
  33600. return this._outlineLevel || 0;
  33601. }
  33602. set outlineLevel(a) {
  33603. this._outlineLevel = a;
  33604. }
  33605. get collapsed() {
  33606. return !!(this._outlineLevel && this._outlineLevel >= this._worksheet.properties.outlineLevelCol);
  33607. }
  33608. toString() {
  33609. return JSON.stringify({ key: this.key, width: this.width, headers: this.headers.length ? this.headers : void 0 });
  33610. }
  33611. equivalentTo(a) {
  33612. return this.width === a.width && this.hidden === a.hidden && this.outlineLevel === a.outlineLevel && e.isEqual(this.style, a.style);
  33613. }
  33614. get isDefault() {
  33615. if (this.isCustomWidth || this.hidden || this.outlineLevel) return !1;
  33616. const a = this.style;
  33617. return !a || !(a.font || a.numFmt || a.alignment || a.border || a.fill || a.protection);
  33618. }
  33619. get headerCount() {
  33620. return this.headers.length;
  33621. }
  33622. eachCell(a, d) {
  33623. const o = this.number;
  33624. d || (d = a, a = null), this._worksheet.eachRow(a, (c, r) => {
  33625. d(c.getCell(o), r);
  33626. });
  33627. }
  33628. get values() {
  33629. const a = [];
  33630. return this.eachCell((d, o) => {
  33631. d && d.type !== A.ValueType.Null && (a[o] = d.value);
  33632. }), a;
  33633. }
  33634. set values(a) {
  33635. if (!a) return;
  33636. const d = this.number;
  33637. let o = 0;
  33638. a.hasOwnProperty("0") && (o = 1), a.forEach((c, r) => {
  33639. this._worksheet.getCell(r + o, d).value = c;
  33640. });
  33641. }
  33642. _applyStyle(a, d) {
  33643. return this.style[a] = d, this.eachCell((o) => {
  33644. o[a] = d;
  33645. }), d;
  33646. }
  33647. get numFmt() {
  33648. return this.style.numFmt;
  33649. }
  33650. set numFmt(a) {
  33651. this._applyStyle("numFmt", a);
  33652. }
  33653. get font() {
  33654. return this.style.font;
  33655. }
  33656. set font(a) {
  33657. this._applyStyle("font", a);
  33658. }
  33659. get alignment() {
  33660. return this.style.alignment;
  33661. }
  33662. set alignment(a) {
  33663. this._applyStyle("alignment", a);
  33664. }
  33665. get protection() {
  33666. return this.style.protection;
  33667. }
  33668. set protection(a) {
  33669. this._applyStyle("protection", a);
  33670. }
  33671. get border() {
  33672. return this.style.border;
  33673. }
  33674. set border(a) {
  33675. this._applyStyle("border", a);
  33676. }
  33677. get fill() {
  33678. return this.style.fill;
  33679. }
  33680. set fill(a) {
  33681. this._applyStyle("fill", a);
  33682. }
  33683. static toModel(a) {
  33684. const d = [];
  33685. let o = null;
  33686. return a && a.forEach((c, r) => {
  33687. c.isDefault ? o && (o = null) : o && c.equivalentTo(o) ? o.max = r + 1 : (o = { min: r + 1, max: r + 1, width: c.width !== void 0 ? c.width : 9, style: c.style, isCustomWidth: c.isCustomWidth, hidden: c.hidden, outlineLevel: c.outlineLevel, collapsed: c.collapsed }, d.push(o));
  33688. }), d.length ? d : void 0;
  33689. }
  33690. static fromModel(a, d) {
  33691. const o = [];
  33692. let c = 1, r = 0;
  33693. for (d = (d = d || []).sort(function(h, b) {
  33694. return h.min - b.min;
  33695. }); r < d.length; ) {
  33696. const h = d[r++];
  33697. for (; c < h.min; ) o.push(new l(a, c++));
  33698. for (; c <= h.max; ) o.push(new l(a, c++, h));
  33699. }
  33700. return o.length ? o : null;
  33701. }
  33702. }
  33703. C.exports = l;
  33704. }, { "../utils/col-cache": 19, "../utils/under-dash": 26, "./enums": 7 }], 5: [function(g, C, i) {
  33705. C.exports = class {
  33706. constructor(e) {
  33707. this.model = e || {};
  33708. }
  33709. add(e, A) {
  33710. return this.model[e] = A;
  33711. }
  33712. find(e) {
  33713. return this.model[e];
  33714. }
  33715. remove(e) {
  33716. this.model[e] = void 0;
  33717. }
  33718. };
  33719. }, {}], 6: [function(g, C, i) {
  33720. const e = g("../utils/under-dash"), A = g("../utils/col-cache"), s = g("../utils/cell-matrix"), l = g("./range"), n = /[$](\w+)[$](\d+)(:[$](\w+)[$](\d+))?/;
  33721. C.exports = class {
  33722. constructor() {
  33723. this.matrixMap = {};
  33724. }
  33725. getMatrix(a) {
  33726. return this.matrixMap[a] || (this.matrixMap[a] = new s());
  33727. }
  33728. add(a, d) {
  33729. const o = A.decodeEx(a);
  33730. this.addEx(o, d);
  33731. }
  33732. addEx(a, d) {
  33733. const o = this.getMatrix(d);
  33734. if (a.top) for (let c = a.left; c <= a.right; c++) for (let r = a.top; r <= a.bottom; r++) {
  33735. const h = { sheetName: a.sheetName, address: A.n2l(c) + r, row: r, col: c };
  33736. o.addCellEx(h);
  33737. }
  33738. else o.addCellEx(a);
  33739. }
  33740. remove(a, d) {
  33741. const o = A.decodeEx(a);
  33742. this.removeEx(o, d);
  33743. }
  33744. removeEx(a, d) {
  33745. this.getMatrix(d).removeCellEx(a);
  33746. }
  33747. removeAllNames(a) {
  33748. e.each(this.matrixMap, (d) => {
  33749. d.removeCellEx(a);
  33750. });
  33751. }
  33752. forEach(a) {
  33753. e.each(this.matrixMap, (d, o) => {
  33754. d.forEach((c) => {
  33755. a(o, c);
  33756. });
  33757. });
  33758. }
  33759. getNames(a) {
  33760. return this.getNamesEx(A.decodeEx(a));
  33761. }
  33762. getNamesEx(a) {
  33763. return e.map(this.matrixMap, (d, o) => d.findCellEx(a) && o).filter(Boolean);
  33764. }
  33765. _explore(a, d) {
  33766. d.mark = !1;
  33767. const { sheetName: o } = d, c = new l(d.row, d.col, d.row, d.col, o);
  33768. let r, h;
  33769. function b(m, Z) {
  33770. const p = a.findCellAt(o, m, d.col);
  33771. return !(!p || !p.mark) && (c[Z] = m, p.mark = !1, !0);
  33772. }
  33773. for (h = d.row - 1; b(h, "top"); h--) ;
  33774. for (h = d.row + 1; b(h, "bottom"); h++) ;
  33775. function u(m, Z) {
  33776. const p = [];
  33777. for (h = c.top; h <= c.bottom; h++) {
  33778. const Y = a.findCellAt(o, h, m);
  33779. if (!Y || !Y.mark) return !1;
  33780. p.push(Y);
  33781. }
  33782. c[Z] = m;
  33783. for (let Y = 0; Y < p.length; Y++) p[Y].mark = !1;
  33784. return !0;
  33785. }
  33786. for (r = d.col - 1; u(r, "left"); r--) ;
  33787. for (r = d.col + 1; u(r, "right"); r++) ;
  33788. return c;
  33789. }
  33790. getRanges(a, d) {
  33791. return (d = d || this.matrixMap[a]) ? (d.forEach((o) => {
  33792. o.mark = !0;
  33793. }), { name: a, ranges: d.map((o) => o.mark && this._explore(d, o)).filter(Boolean).map((o) => o.$shortRange) }) : { name: a, ranges: [] };
  33794. }
  33795. normaliseMatrix(a, d) {
  33796. a.forEachInSheet(d, (o, c, r) => {
  33797. o && (o.row === c && o.col === r || (o.row = c, o.col = r, o.address = A.n2l(r) + c));
  33798. });
  33799. }
  33800. spliceRows(a, d, o, c) {
  33801. e.each(this.matrixMap, (r) => {
  33802. r.spliceRows(a, d, o, c), this.normaliseMatrix(r, a);
  33803. });
  33804. }
  33805. spliceColumns(a, d, o, c) {
  33806. e.each(this.matrixMap, (r) => {
  33807. r.spliceColumns(a, d, o, c), this.normaliseMatrix(r, a);
  33808. });
  33809. }
  33810. get model() {
  33811. return e.map(this.matrixMap, (a, d) => this.getRanges(d, a)).filter((a) => a.ranges.length);
  33812. }
  33813. set model(a) {
  33814. const d = this.matrixMap = {};
  33815. a.forEach((o) => {
  33816. const c = d[o.name] = new s();
  33817. o.ranges.forEach((r) => {
  33818. n.test(r.split("!").pop() || "") && c.addCell(r);
  33819. });
  33820. });
  33821. }
  33822. };
  33823. }, { "../utils/cell-matrix": 18, "../utils/col-cache": 19, "../utils/under-dash": 26, "./range": 10 }], 7: [function(g, C, i) {
  33824. C.exports = { ValueType: { Null: 0, Merge: 1, Number: 2, String: 3, Date: 4, Hyperlink: 5, Formula: 6, SharedString: 7, RichText: 8, Boolean: 9, Error: 10 }, FormulaType: { None: 0, Master: 1, Shared: 2 }, RelationshipType: { None: 0, OfficeDocument: 1, Worksheet: 2, CalcChain: 3, SharedStrings: 4, Styles: 5, Theme: 6, Hyperlink: 7 }, DocumentType: { Xlsx: 1 }, ReadingOrder: { LeftToRight: 1, RightToLeft: 2 }, ErrorValue: { NotApplicable: "#N/A", Ref: "#REF!", Name: "#NAME?", DivZero: "#DIV/0!", Null: "#NULL!", Value: "#VALUE!", Num: "#NUM!" } };
  33825. }, {}], 8: [function(g, C, i) {
  33826. const e = g("../utils/col-cache"), A = g("./anchor");
  33827. C.exports = class {
  33828. constructor(s, l) {
  33829. this.worksheet = s, this.model = l;
  33830. }
  33831. get model() {
  33832. switch (this.type) {
  33833. case "background":
  33834. return { type: this.type, imageId: this.imageId };
  33835. case "image":
  33836. return { type: this.type, imageId: this.imageId, hyperlinks: this.range.hyperlinks, range: { tl: this.range.tl.model, br: this.range.br && this.range.br.model, ext: this.range.ext, editAs: this.range.editAs } };
  33837. default:
  33838. throw new Error("Invalid Image Type");
  33839. }
  33840. }
  33841. set model(s) {
  33842. let { type: l, imageId: n, range: a, hyperlinks: d } = s;
  33843. if (this.type = l, this.imageId = n, l === "image") if (typeof a == "string") {
  33844. const o = e.decode(a);
  33845. this.range = { tl: new A(this.worksheet, { col: o.left, row: o.top }, -1), br: new A(this.worksheet, { col: o.right, row: o.bottom }, 0), editAs: "oneCell" };
  33846. } else this.range = { tl: new A(this.worksheet, a.tl, 0), br: a.br && new A(this.worksheet, a.br, 0), ext: a.ext, editAs: a.editAs, hyperlinks: d || a.hyperlinks };
  33847. }
  33848. };
  33849. }, { "../utils/col-cache": 19, "./anchor": 2 }], 9: [function(g, C, i) {
  33850. const e = g("../utils/under-dash");
  33851. class A {
  33852. constructor(l) {
  33853. this.note = l;
  33854. }
  33855. get model() {
  33856. let l = null;
  33857. switch (typeof this.note) {
  33858. case "string":
  33859. l = { type: "note", note: { texts: [{ text: this.note }] } };
  33860. break;
  33861. default:
  33862. l = { type: "note", note: this.note };
  33863. }
  33864. return e.deepMerge({}, A.DEFAULT_CONFIGS, l);
  33865. }
  33866. set model(l) {
  33867. const { note: n } = l, { texts: a } = n;
  33868. a.length === 1 && Object.keys(a[0]).length === 1 ? this.note = a[0].text : this.note = n;
  33869. }
  33870. static fromModel(l) {
  33871. const n = new A();
  33872. return n.model = l, n;
  33873. }
  33874. }
  33875. A.DEFAULT_CONFIGS = { note: { margins: { insetmode: "auto", inset: [0.13, 0.13, 0.25, 0.25] }, protection: { locked: "True", lockText: "True" }, editAs: "absolute" } }, C.exports = A;
  33876. }, { "../utils/under-dash": 26 }], 10: [function(g, C, i) {
  33877. const e = g("../utils/col-cache");
  33878. class A {
  33879. constructor() {
  33880. this.decode(arguments);
  33881. }
  33882. setTLBR(l, n, a, d, o) {
  33883. if (arguments.length < 4) {
  33884. const c = e.decodeAddress(l), r = e.decodeAddress(n);
  33885. this.model = { top: Math.min(c.row, r.row), left: Math.min(c.col, r.col), bottom: Math.max(c.row, r.row), right: Math.max(c.col, r.col), sheetName: a }, this.setTLBR(c.row, c.col, r.row, r.col, o);
  33886. } else this.model = { top: Math.min(l, a), left: Math.min(n, d), bottom: Math.max(l, a), right: Math.max(n, d), sheetName: o };
  33887. }
  33888. decode(l) {
  33889. switch (l.length) {
  33890. case 5:
  33891. this.setTLBR(l[0], l[1], l[2], l[3], l[4]);
  33892. break;
  33893. case 4:
  33894. this.setTLBR(l[0], l[1], l[2], l[3]);
  33895. break;
  33896. case 3:
  33897. this.setTLBR(l[0], l[1], l[2]);
  33898. break;
  33899. case 2:
  33900. this.setTLBR(l[0], l[1]);
  33901. break;
  33902. case 1: {
  33903. const n = l[0];
  33904. if (n instanceof A) this.model = { top: n.model.top, left: n.model.left, bottom: n.model.bottom, right: n.model.right, sheetName: n.sheetName };
  33905. else if (n instanceof Array) this.decode(n);
  33906. else if (n.top && n.left && n.bottom && n.right) this.model = { top: n.top, left: n.left, bottom: n.bottom, right: n.right, sheetName: n.sheetName };
  33907. else {
  33908. const a = e.decodeEx(n);
  33909. a.top ? this.model = { top: a.top, left: a.left, bottom: a.bottom, right: a.right, sheetName: a.sheetName } : this.model = { top: a.row, left: a.col, bottom: a.row, right: a.col, sheetName: a.sheetName };
  33910. }
  33911. break;
  33912. }
  33913. case 0:
  33914. this.model = { top: 0, left: 0, bottom: 0, right: 0 };
  33915. break;
  33916. default:
  33917. throw new Error("Invalid number of arguments to _getDimensions() - " + l.length);
  33918. }
  33919. }
  33920. get top() {
  33921. return this.model.top || 1;
  33922. }
  33923. set top(l) {
  33924. this.model.top = l;
  33925. }
  33926. get left() {
  33927. return this.model.left || 1;
  33928. }
  33929. set left(l) {
  33930. this.model.left = l;
  33931. }
  33932. get bottom() {
  33933. return this.model.bottom || 1;
  33934. }
  33935. set bottom(l) {
  33936. this.model.bottom = l;
  33937. }
  33938. get right() {
  33939. return this.model.right || 1;
  33940. }
  33941. set right(l) {
  33942. this.model.right = l;
  33943. }
  33944. get sheetName() {
  33945. return this.model.sheetName;
  33946. }
  33947. set sheetName(l) {
  33948. this.model.sheetName = l;
  33949. }
  33950. get _serialisedSheetName() {
  33951. const { sheetName: l } = this.model;
  33952. return l ? /^[a-zA-Z0-9]*$/.test(l) ? l + "!" : `'${l}'!` : "";
  33953. }
  33954. expand(l, n, a, d) {
  33955. (!this.model.top || l < this.top) && (this.top = l), (!this.model.left || n < this.left) && (this.left = n), (!this.model.bottom || a > this.bottom) && (this.bottom = a), (!this.model.right || d > this.right) && (this.right = d);
  33956. }
  33957. expandRow(l) {
  33958. if (l) {
  33959. const { dimensions: n, number: a } = l;
  33960. n && this.expand(a, n.min, a, n.max);
  33961. }
  33962. }
  33963. expandToAddress(l) {
  33964. const n = e.decodeEx(l);
  33965. this.expand(n.row, n.col, n.row, n.col);
  33966. }
  33967. get tl() {
  33968. return e.n2l(this.left) + this.top;
  33969. }
  33970. get $t$l() {
  33971. return `$${e.n2l(this.left)}$${this.top}`;
  33972. }
  33973. get br() {
  33974. return e.n2l(this.right) + this.bottom;
  33975. }
  33976. get $b$r() {
  33977. return `$${e.n2l(this.right)}$${this.bottom}`;
  33978. }
  33979. get range() {
  33980. return `${this._serialisedSheetName + this.tl}:${this.br}`;
  33981. }
  33982. get $range() {
  33983. return `${this._serialisedSheetName + this.$t$l}:${this.$b$r}`;
  33984. }
  33985. get shortRange() {
  33986. return this.count > 1 ? this.range : this._serialisedSheetName + this.tl;
  33987. }
  33988. get $shortRange() {
  33989. return this.count > 1 ? this.$range : this._serialisedSheetName + this.$t$l;
  33990. }
  33991. get count() {
  33992. return (1 + this.bottom - this.top) * (1 + this.right - this.left);
  33993. }
  33994. toString() {
  33995. return this.range;
  33996. }
  33997. intersects(l) {
  33998. return (!l.sheetName || !this.sheetName || l.sheetName === this.sheetName) && !(l.bottom < this.top) && !(l.top > this.bottom) && !(l.right < this.left) && !(l.left > this.right);
  33999. }
  34000. contains(l) {
  34001. const n = e.decodeEx(l);
  34002. return this.containsEx(n);
  34003. }
  34004. containsEx(l) {
  34005. return (!l.sheetName || !this.sheetName || l.sheetName === this.sheetName) && l.row >= this.top && l.row <= this.bottom && l.col >= this.left && l.col <= this.right;
  34006. }
  34007. forEachAddress(l) {
  34008. for (let n = this.left; n <= this.right; n++) for (let a = this.top; a <= this.bottom; a++) l(e.encodeAddress(a, n), a, n);
  34009. }
  34010. }
  34011. C.exports = A;
  34012. }, { "../utils/col-cache": 19 }], 11: [function(g, C, i) {
  34013. const e = g("../utils/under-dash"), A = g("./enums"), s = g("../utils/col-cache"), l = g("./cell");
  34014. C.exports = class {
  34015. constructor(n, a) {
  34016. this._worksheet = n, this._number = a, this._cells = [], this.style = {}, this.outlineLevel = 0;
  34017. }
  34018. get number() {
  34019. return this._number;
  34020. }
  34021. get worksheet() {
  34022. return this._worksheet;
  34023. }
  34024. commit() {
  34025. this._worksheet._commitRow(this);
  34026. }
  34027. destroy() {
  34028. delete this._worksheet, delete this._cells, delete this.style;
  34029. }
  34030. findCell(n) {
  34031. return this._cells[n - 1];
  34032. }
  34033. getCellEx(n) {
  34034. let a = this._cells[n.col - 1];
  34035. if (!a) {
  34036. const d = this._worksheet.getColumn(n.col);
  34037. a = new l(this, d, n.address), this._cells[n.col - 1] = a;
  34038. }
  34039. return a;
  34040. }
  34041. getCell(n) {
  34042. if (typeof n == "string") {
  34043. const a = this._worksheet.getColumnKey(n);
  34044. n = a ? a.number : s.l2n(n);
  34045. }
  34046. return this._cells[n - 1] || this.getCellEx({ address: s.encodeAddress(this._number, n), row: this._number, col: n });
  34047. }
  34048. splice(n, a) {
  34049. const d = n + a;
  34050. for (var o = arguments.length, c = new Array(o > 2 ? o - 2 : 0), r = 2; r < o; r++) c[r - 2] = arguments[r];
  34051. const h = c.length - a, b = this._cells.length;
  34052. let u, m, Z;
  34053. if (h < 0) for (u = n + c.length; u <= b; u++) Z = this._cells[u - 1], m = this._cells[u - h - 1], m ? (Z = this.getCell(u), Z.value = m.value, Z.style = m.style, Z._comment = m._comment) : Z && (Z.value = null, Z.style = {}, Z._comment = void 0);
  34054. else if (h > 0) for (u = b; u >= d; u--) m = this._cells[u - 1], m ? (Z = this.getCell(u + h), Z.value = m.value, Z.style = m.style, Z._comment = m._comment) : this._cells[u + h - 1] = void 0;
  34055. for (u = 0; u < c.length; u++) Z = this.getCell(n + u), Z.value = c[u], Z.style = {}, Z._comment = void 0;
  34056. }
  34057. eachCell(n, a) {
  34058. if (a || (a = n, n = null), n && n.includeEmpty) {
  34059. const d = this._cells.length;
  34060. for (let o = 1; o <= d; o++) a(this.getCell(o), o);
  34061. } else this._cells.forEach((d, o) => {
  34062. d && d.type !== A.ValueType.Null && a(d, o + 1);
  34063. });
  34064. }
  34065. addPageBreak(n, a) {
  34066. const d = this._worksheet, o = Math.max(0, n - 1) || 0, c = Math.max(0, a - 1) || 16838, r = { id: this._number, max: c, man: 1 };
  34067. o && (r.min = o), d.rowBreaks.push(r);
  34068. }
  34069. get values() {
  34070. const n = [];
  34071. return this._cells.forEach((a) => {
  34072. a && a.type !== A.ValueType.Null && (n[a.col] = a.value);
  34073. }), n;
  34074. }
  34075. set values(n) {
  34076. if (this._cells = [], n) if (n instanceof Array) {
  34077. let a = 0;
  34078. n.hasOwnProperty("0") && (a = 1), n.forEach((d, o) => {
  34079. d !== void 0 && (this.getCellEx({ address: s.encodeAddress(this._number, o + a), row: this._number, col: o + a }).value = d);
  34080. });
  34081. } else this._worksheet.eachColumnKey((a, d) => {
  34082. n[d] !== void 0 && (this.getCellEx({ address: s.encodeAddress(this._number, a.number), row: this._number, col: a.number }).value = n[d]);
  34083. });
  34084. }
  34085. get hasValues() {
  34086. return e.some(this._cells, (n) => n && n.type !== A.ValueType.Null);
  34087. }
  34088. get cellCount() {
  34089. return this._cells.length;
  34090. }
  34091. get actualCellCount() {
  34092. let n = 0;
  34093. return this.eachCell(() => {
  34094. n++;
  34095. }), n;
  34096. }
  34097. get dimensions() {
  34098. let n = 0, a = 0;
  34099. return this._cells.forEach((d) => {
  34100. d && d.type !== A.ValueType.Null && ((!n || n > d.col) && (n = d.col), a < d.col && (a = d.col));
  34101. }), n > 0 ? { min: n, max: a } : null;
  34102. }
  34103. _applyStyle(n, a) {
  34104. return this.style[n] = a, this._cells.forEach((d) => {
  34105. d && (d[n] = a);
  34106. }), a;
  34107. }
  34108. get numFmt() {
  34109. return this.style.numFmt;
  34110. }
  34111. set numFmt(n) {
  34112. this._applyStyle("numFmt", n);
  34113. }
  34114. get font() {
  34115. return this.style.font;
  34116. }
  34117. set font(n) {
  34118. this._applyStyle("font", n);
  34119. }
  34120. get alignment() {
  34121. return this.style.alignment;
  34122. }
  34123. set alignment(n) {
  34124. this._applyStyle("alignment", n);
  34125. }
  34126. get protection() {
  34127. return this.style.protection;
  34128. }
  34129. set protection(n) {
  34130. this._applyStyle("protection", n);
  34131. }
  34132. get border() {
  34133. return this.style.border;
  34134. }
  34135. set border(n) {
  34136. this._applyStyle("border", n);
  34137. }
  34138. get fill() {
  34139. return this.style.fill;
  34140. }
  34141. set fill(n) {
  34142. this._applyStyle("fill", n);
  34143. }
  34144. get hidden() {
  34145. return !!this._hidden;
  34146. }
  34147. set hidden(n) {
  34148. this._hidden = n;
  34149. }
  34150. get outlineLevel() {
  34151. return this._outlineLevel || 0;
  34152. }
  34153. set outlineLevel(n) {
  34154. this._outlineLevel = n;
  34155. }
  34156. get collapsed() {
  34157. return !!(this._outlineLevel && this._outlineLevel >= this._worksheet.properties.outlineLevelRow);
  34158. }
  34159. get model() {
  34160. const n = [];
  34161. let a = 0, d = 0;
  34162. return this._cells.forEach((o) => {
  34163. if (o) {
  34164. const c = o.model;
  34165. c && ((!a || a > o.col) && (a = o.col), d < o.col && (d = o.col), n.push(c));
  34166. }
  34167. }), this.height || n.length ? { cells: n, number: this.number, min: a, max: d, height: this.height, style: this.style, hidden: this.hidden, outlineLevel: this.outlineLevel, collapsed: this.collapsed } : null;
  34168. }
  34169. set model(n) {
  34170. if (n.number !== this._number) throw new Error("Invalid row number in model");
  34171. let a;
  34172. this._cells = [], n.cells.forEach((d) => {
  34173. switch (d.type) {
  34174. case l.Types.Merge:
  34175. break;
  34176. default: {
  34177. let o;
  34178. if (d.address) o = s.decodeAddress(d.address);
  34179. else if (a) {
  34180. const { row: c } = a, r = a.col + 1;
  34181. o = { row: c, col: r, address: s.encodeAddress(c, r), $col$row: `$${s.n2l(r)}$${c}` };
  34182. }
  34183. a = o, this.getCellEx(o).model = d;
  34184. break;
  34185. }
  34186. }
  34187. }), n.height ? this.height = n.height : delete this.height, this.hidden = n.hidden, this.outlineLevel = n.outlineLevel || 0, this.style = n.style && JSON.parse(JSON.stringify(n.style)) || {};
  34188. }
  34189. };
  34190. }, { "../utils/col-cache": 19, "../utils/under-dash": 26, "./cell": 3, "./enums": 7 }], 12: [function(g, C, i) {
  34191. const e = g("../utils/col-cache");
  34192. class A {
  34193. constructor(l, n, a) {
  34194. this.table = l, this.column = n, this.index = a;
  34195. }
  34196. _set(l, n) {
  34197. this.table.cacheState(), this.column[l] = n;
  34198. }
  34199. get name() {
  34200. return this.column.name;
  34201. }
  34202. set name(l) {
  34203. this._set("name", l);
  34204. }
  34205. get filterButton() {
  34206. return this.column.filterButton;
  34207. }
  34208. set filterButton(l) {
  34209. this.column.filterButton = l;
  34210. }
  34211. get style() {
  34212. return this.column.style;
  34213. }
  34214. set style(l) {
  34215. this.column.style = l;
  34216. }
  34217. get totalsRowLabel() {
  34218. return this.column.totalsRowLabel;
  34219. }
  34220. set totalsRowLabel(l) {
  34221. this._set("totalsRowLabel", l);
  34222. }
  34223. get totalsRowFunction() {
  34224. return this.column.totalsRowFunction;
  34225. }
  34226. set totalsRowFunction(l) {
  34227. this._set("totalsRowFunction", l);
  34228. }
  34229. get totalsRowResult() {
  34230. return this.column.totalsRowResult;
  34231. }
  34232. set totalsRowResult(l) {
  34233. this._set("totalsRowResult", l);
  34234. }
  34235. get totalsRowFormula() {
  34236. return this.column.totalsRowFormula;
  34237. }
  34238. set totalsRowFormula(l) {
  34239. this._set("totalsRowFormula", l);
  34240. }
  34241. }
  34242. C.exports = class {
  34243. constructor(s, l) {
  34244. this.worksheet = s, l && (this.table = l, this.validate(), this.store());
  34245. }
  34246. getFormula(s) {
  34247. switch (s.totalsRowFunction) {
  34248. case "none":
  34249. return null;
  34250. case "average":
  34251. return `SUBTOTAL(101,${this.table.name}[${s.name}])`;
  34252. case "countNums":
  34253. return `SUBTOTAL(102,${this.table.name}[${s.name}])`;
  34254. case "count":
  34255. return `SUBTOTAL(103,${this.table.name}[${s.name}])`;
  34256. case "max":
  34257. return `SUBTOTAL(104,${this.table.name}[${s.name}])`;
  34258. case "min":
  34259. return `SUBTOTAL(105,${this.table.name}[${s.name}])`;
  34260. case "stdDev":
  34261. return `SUBTOTAL(106,${this.table.name}[${s.name}])`;
  34262. case "var":
  34263. return `SUBTOTAL(107,${this.table.name}[${s.name}])`;
  34264. case "sum":
  34265. return `SUBTOTAL(109,${this.table.name}[${s.name}])`;
  34266. case "custom":
  34267. return s.totalsRowFormula;
  34268. default:
  34269. throw new Error("Invalid Totals Row Function: " + s.totalsRowFunction);
  34270. }
  34271. }
  34272. get width() {
  34273. return this.table.columns.length;
  34274. }
  34275. get height() {
  34276. return this.table.rows.length;
  34277. }
  34278. get filterHeight() {
  34279. return this.height + (this.table.headerRow ? 1 : 0);
  34280. }
  34281. get tableHeight() {
  34282. return this.filterHeight + (this.table.totalsRow ? 1 : 0);
  34283. }
  34284. validate() {
  34285. const { table: s } = this, l = (h, b, u) => {
  34286. h[b] === void 0 && (h[b] = u);
  34287. };
  34288. l(s, "headerRow", !0), l(s, "totalsRow", !1), l(s, "style", {}), l(s.style, "theme", "TableStyleMedium2"), l(s.style, "showFirstColumn", !1), l(s.style, "showLastColumn", !1), l(s.style, "showRowStripes", !1), l(s.style, "showColumnStripes", !1);
  34289. const n = (h, b) => {
  34290. if (!h) throw new Error(b);
  34291. };
  34292. n(s.ref, "Table must have ref"), n(s.columns, "Table must have column definitions"), n(s.rows, "Table must have row definitions"), s.tl = e.decodeAddress(s.ref);
  34293. const { row: a, col: d } = s.tl;
  34294. n(a > 0, "Table must be on valid row"), n(d > 0, "Table must be on valid col");
  34295. const { width: o, filterHeight: c, tableHeight: r } = this;
  34296. s.autoFilterRef = e.encode(a, d, a + c - 1, d + o - 1), s.tableRef = e.encode(a, d, a + r - 1, d + o - 1), s.columns.forEach((h, b) => {
  34297. n(h.name, `Column ${b} must have a name`), b === 0 ? l(h, "totalsRowLabel", "Total") : (l(h, "totalsRowFunction", "none"), h.totalsRowFormula = this.getFormula(h));
  34298. });
  34299. }
  34300. store() {
  34301. const s = (c, r) => {
  34302. r && Object.keys(r).forEach((h) => {
  34303. c[h] = r[h];
  34304. });
  34305. }, { worksheet: l, table: n } = this, { row: a, col: d } = n.tl;
  34306. let o = 0;
  34307. if (n.headerRow) {
  34308. const c = l.getRow(a + o++);
  34309. n.columns.forEach((r, h) => {
  34310. const { style: b, name: u } = r, m = c.getCell(d + h);
  34311. m.value = u, s(m, b);
  34312. });
  34313. }
  34314. if (n.rows.forEach((c) => {
  34315. const r = l.getRow(a + o++);
  34316. c.forEach((h, b) => {
  34317. const u = r.getCell(d + b);
  34318. u.value = h, s(u, n.columns[b].style);
  34319. });
  34320. }), n.totalsRow) {
  34321. const c = l.getRow(a + o++);
  34322. n.columns.forEach((r, h) => {
  34323. const b = c.getCell(d + h);
  34324. if (h === 0) b.value = r.totalsRowLabel;
  34325. else {
  34326. const u = this.getFormula(r);
  34327. b.value = u ? { formula: r.totalsRowFormula, result: r.totalsRowResult } : null;
  34328. }
  34329. s(b, r.style);
  34330. });
  34331. }
  34332. }
  34333. load(s) {
  34334. const { table: l } = this, { row: n, col: a } = l.tl;
  34335. let d = 0;
  34336. if (l.headerRow) {
  34337. const o = s.getRow(n + d++);
  34338. l.columns.forEach((c, r) => {
  34339. o.getCell(a + r).value = c.name;
  34340. });
  34341. }
  34342. if (l.rows.forEach((o) => {
  34343. const c = s.getRow(n + d++);
  34344. o.forEach((r, h) => {
  34345. c.getCell(a + h).value = r;
  34346. });
  34347. }), l.totalsRow) {
  34348. const o = s.getRow(n + d++);
  34349. l.columns.forEach((c, r) => {
  34350. const h = o.getCell(a + r);
  34351. r === 0 ? h.value = c.totalsRowLabel : this.getFormula(c) && (h.value = { formula: c.totalsRowFormula, result: c.totalsRowResult });
  34352. });
  34353. }
  34354. }
  34355. get model() {
  34356. return this.table;
  34357. }
  34358. set model(s) {
  34359. this.table = s;
  34360. }
  34361. cacheState() {
  34362. this._cache || (this._cache = { ref: this.ref, width: this.width, tableHeight: this.tableHeight });
  34363. }
  34364. commit() {
  34365. if (!this._cache) return;
  34366. this.validate();
  34367. const s = e.decodeAddress(this._cache.ref);
  34368. if (this.ref !== this._cache.ref) for (let l = 0; l < this._cache.tableHeight; l++) {
  34369. const n = this.worksheet.getRow(s.row + l);
  34370. for (let a = 0; a < this._cache.width; a++)
  34371. n.getCell(s.col + a).value = null;
  34372. }
  34373. else {
  34374. for (let l = this.tableHeight; l < this._cache.tableHeight; l++) {
  34375. const n = this.worksheet.getRow(s.row + l);
  34376. for (let a = 0; a < this._cache.width; a++)
  34377. n.getCell(s.col + a).value = null;
  34378. }
  34379. for (let l = 0; l < this.tableHeight; l++) {
  34380. const n = this.worksheet.getRow(s.row + l);
  34381. for (let a = this.width; a < this._cache.width; a++)
  34382. n.getCell(s.col + a).value = null;
  34383. }
  34384. }
  34385. this.store();
  34386. }
  34387. addRow(s, l) {
  34388. this.cacheState(), l === void 0 ? this.table.rows.push(s) : this.table.rows.splice(l, 0, s);
  34389. }
  34390. removeRows(s) {
  34391. let l = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1;
  34392. this.cacheState(), this.table.rows.splice(s, l);
  34393. }
  34394. getColumn(s) {
  34395. const l = this.table.columns[s];
  34396. return new A(this, l, s);
  34397. }
  34398. addColumn(s, l, n) {
  34399. this.cacheState(), n === void 0 ? (this.table.columns.push(s), this.table.rows.forEach((a, d) => {
  34400. a.push(l[d]);
  34401. })) : (this.table.columns.splice(n, 0, s), this.table.rows.forEach((a, d) => {
  34402. a.splice(n, 0, l[d]);
  34403. }));
  34404. }
  34405. removeColumns(s) {
  34406. let l = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1;
  34407. this.cacheState(), this.table.columns.splice(s, l), this.table.rows.forEach((n) => {
  34408. n.splice(s, l);
  34409. });
  34410. }
  34411. _assign(s, l, n) {
  34412. this.cacheState(), s[l] = n;
  34413. }
  34414. get ref() {
  34415. return this.table.ref;
  34416. }
  34417. set ref(s) {
  34418. this._assign(this.table, "ref", s);
  34419. }
  34420. get name() {
  34421. return this.table.name;
  34422. }
  34423. set name(s) {
  34424. this.table.name = s;
  34425. }
  34426. get displayName() {
  34427. return this.table.displyName || this.table.name;
  34428. }
  34429. set displayNamename(s) {
  34430. this.table.displayName = s;
  34431. }
  34432. get headerRow() {
  34433. return this.table.headerRow;
  34434. }
  34435. set headerRow(s) {
  34436. this._assign(this.table, "headerRow", s);
  34437. }
  34438. get totalsRow() {
  34439. return this.table.totalsRow;
  34440. }
  34441. set totalsRow(s) {
  34442. this._assign(this.table, "totalsRow", s);
  34443. }
  34444. get theme() {
  34445. return this.table.style.name;
  34446. }
  34447. set theme(s) {
  34448. this.table.style.name = s;
  34449. }
  34450. get showFirstColumn() {
  34451. return this.table.style.showFirstColumn;
  34452. }
  34453. set showFirstColumn(s) {
  34454. this.table.style.showFirstColumn = s;
  34455. }
  34456. get showLastColumn() {
  34457. return this.table.style.showLastColumn;
  34458. }
  34459. set showLastColumn(s) {
  34460. this.table.style.showLastColumn = s;
  34461. }
  34462. get showRowStripes() {
  34463. return this.table.style.showRowStripes;
  34464. }
  34465. set showRowStripes(s) {
  34466. this.table.style.showRowStripes = s;
  34467. }
  34468. get showColumnStripes() {
  34469. return this.table.style.showColumnStripes;
  34470. }
  34471. set showColumnStripes(s) {
  34472. this.table.style.showColumnStripes = s;
  34473. }
  34474. };
  34475. }, { "../utils/col-cache": 19 }], 13: [function(g, C, i) {
  34476. const e = g("./worksheet"), A = g("./defined-names"), s = g("../xlsx/xlsx"), l = g("../csv/csv");
  34477. C.exports = class {
  34478. constructor() {
  34479. this.category = "", this.company = "", this.created = /* @__PURE__ */ new Date(), this.description = "", this.keywords = "", this.manager = "", this.modified = this.created, this.properties = {}, this.calcProperties = {}, this._worksheets = [], this.subject = "", this.title = "", this.views = [], this.media = [], this._definedNames = new A();
  34480. }
  34481. get xlsx() {
  34482. return this._xlsx || (this._xlsx = new s(this)), this._xlsx;
  34483. }
  34484. get csv() {
  34485. return this._csv || (this._csv = new l(this)), this._csv;
  34486. }
  34487. get nextId() {
  34488. for (let n = 1; n < this._worksheets.length; n++) if (!this._worksheets[n]) return n;
  34489. return this._worksheets.length || 1;
  34490. }
  34491. addWorksheet(n, a) {
  34492. const d = this.nextId;
  34493. a && (typeof a == "string" ? (console.trace('tabColor argument is now deprecated. Please use workbook.addWorksheet(name, {properties: { tabColor: { argb: "rbg value" } }'), a = { properties: { tabColor: { argb: a } } }) : (a.argb || a.theme || a.indexed) && (console.trace("tabColor argument is now deprecated. Please use workbook.addWorksheet(name, {properties: { tabColor: { ... } }"), a = { properties: { tabColor: a } }));
  34494. const o = this._worksheets.reduce((h, b) => (b && b.orderNo) > h ? b.orderNo : h, 0), c = Object.assign({}, a, { id: d, name: n, orderNo: o + 1, workbook: this }), r = new e(c);
  34495. return this._worksheets[d] = r, r;
  34496. }
  34497. removeWorksheetEx(n) {
  34498. delete this._worksheets[n.id];
  34499. }
  34500. removeWorksheet(n) {
  34501. const a = this.getWorksheet(n);
  34502. a && a.destroy();
  34503. }
  34504. getWorksheet(n) {
  34505. return n === void 0 ? this._worksheets.find(Boolean) : typeof n == "number" ? this._worksheets[n] : typeof n == "string" ? this._worksheets.find((a) => a && a.name === n) : void 0;
  34506. }
  34507. get worksheets() {
  34508. return this._worksheets.slice(1).sort((n, a) => n.orderNo - a.orderNo).filter(Boolean);
  34509. }
  34510. eachSheet(n) {
  34511. this.worksheets.forEach((a) => {
  34512. n(a, a.id);
  34513. });
  34514. }
  34515. get definedNames() {
  34516. return this._definedNames;
  34517. }
  34518. clearThemes() {
  34519. this._themes = void 0;
  34520. }
  34521. addImage(n) {
  34522. const a = this.media.length;
  34523. return this.media.push(Object.assign({}, n, { type: "image" })), a;
  34524. }
  34525. getImage(n) {
  34526. return this.media[n];
  34527. }
  34528. get model() {
  34529. return { creator: this.creator || "Unknown", lastModifiedBy: this.lastModifiedBy || "Unknown", lastPrinted: this.lastPrinted, created: this.created, modified: this.modified, properties: this.properties, worksheets: this.worksheets.map((n) => n.model), sheets: this.worksheets.map((n) => n.model).filter(Boolean), definedNames: this._definedNames.model, views: this.views, company: this.company, manager: this.manager, title: this.title, subject: this.subject, keywords: this.keywords, category: this.category, description: this.description, language: this.language, revision: this.revision, contentStatus: this.contentStatus, themes: this._themes, media: this.media, calcProperties: this.calcProperties };
  34530. }
  34531. set model(n) {
  34532. this.creator = n.creator, this.lastModifiedBy = n.lastModifiedBy, this.lastPrinted = n.lastPrinted, this.created = n.created, this.modified = n.modified, this.company = n.company, this.manager = n.manager, this.title = n.title, this.subject = n.subject, this.keywords = n.keywords, this.category = n.category, this.description = n.description, this.language = n.language, this.revision = n.revision, this.contentStatus = n.contentStatus, this.properties = n.properties, this.calcProperties = n.calcProperties, this._worksheets = [], n.worksheets.forEach((a) => {
  34533. const { id: d, name: o, state: c } = a, r = n.sheets && n.sheets.findIndex((h) => h.id === d);
  34534. (this._worksheets[d] = new e({ id: d, name: o, orderNo: r, state: c, workbook: this })).model = a;
  34535. }), this._definedNames.model = n.definedNames, this.views = n.views, this._themes = n.themes, this.media = n.media || [];
  34536. }
  34537. };
  34538. }, { "../csv/csv": 1, "../xlsx/xlsx": 144, "./defined-names": 6, "./worksheet": 14 }], 14: [function(g, C, i) {
  34539. const e = g("../utils/under-dash"), A = g("../utils/col-cache"), s = g("./range"), l = g("./row"), n = g("./column"), a = g("./enums"), d = g("./image"), o = g("./table"), c = g("./data-validations"), r = g("../utils/encryptor"), { copyStyle: h } = g("../utils/copy-style");
  34540. C.exports = class {
  34541. constructor(b) {
  34542. b = b || {}, this._workbook = b.workbook, this.id = b.id, this.orderNo = b.orderNo, this.name = b.name, this.state = b.state || "visible", this._rows = [], this._columns = null, this._keys = {}, this._merges = {}, this.rowBreaks = [], this.properties = Object.assign({}, { defaultRowHeight: 15, dyDescent: 55, outlineLevelCol: 0, outlineLevelRow: 0 }, b.properties), this.pageSetup = Object.assign({}, { margins: { left: 0.7, right: 0.7, top: 0.75, bottom: 0.75, header: 0.3, footer: 0.3 }, orientation: "portrait", horizontalDpi: 4294967295, verticalDpi: 4294967295, fitToPage: !(!b.pageSetup || !b.pageSetup.fitToWidth && !b.pageSetup.fitToHeight || b.pageSetup.scale), pageOrder: "downThenOver", blackAndWhite: !1, draft: !1, cellComments: "None", errors: "displayed", scale: 100, fitToWidth: 1, fitToHeight: 1, paperSize: void 0, showRowColHeaders: !1, showGridLines: !1, firstPageNumber: void 0, horizontalCentered: !1, verticalCentered: !1, rowBreaks: null, colBreaks: null }, b.pageSetup), this.headerFooter = Object.assign({}, { differentFirst: !1, differentOddEven: !1, oddHeader: null, oddFooter: null, evenHeader: null, evenFooter: null, firstHeader: null, firstFooter: null }, b.headerFooter), this.dataValidations = new c(), this.views = b.views || [], this.autoFilter = b.autoFilter || null, this._media = [], this.sheetProtection = null, this.tables = {}, this.conditionalFormattings = [];
  34543. }
  34544. get name() {
  34545. return this._name;
  34546. }
  34547. set name(b) {
  34548. if (b === void 0 && (b = "sheet" + this.id), this._name !== b) {
  34549. if (typeof b != "string") throw new Error("The name has to be a string.");
  34550. if (b === "") throw new Error("The name can't be empty.");
  34551. if (b === "History") throw new Error('The name "History" is protected. Please use a different name.');
  34552. if (/[*?:/\\[\]]/.test(b)) throw new Error(`Worksheet name ${b} cannot include any of the following characters: * ? : \\ / [ ]`);
  34553. if (/(^')|('$)/.test(b)) throw new Error("The first or last character of worksheet name cannot be a single quotation mark: " + b);
  34554. if (b && b.length > 31 && (console.warn(`Worksheet name ${b} exceeds 31 chars. This will be truncated`), b = b.substring(0, 31)), this._workbook._worksheets.find((u) => u && u.name.toLowerCase() === b.toLowerCase())) throw new Error("Worksheet name already exists: " + b);
  34555. this._name = b;
  34556. }
  34557. }
  34558. get workbook() {
  34559. return this._workbook;
  34560. }
  34561. destroy() {
  34562. this._workbook.removeWorksheetEx(this);
  34563. }
  34564. get dimensions() {
  34565. const b = new s();
  34566. return this._rows.forEach((u) => {
  34567. if (u) {
  34568. const m = u.dimensions;
  34569. m && b.expand(u.number, m.min, u.number, m.max);
  34570. }
  34571. }), b;
  34572. }
  34573. get columns() {
  34574. return this._columns;
  34575. }
  34576. set columns(b) {
  34577. this._headerRowCount = b.reduce((Z, p) => {
  34578. const Y = (p.header ? 1 : p.headers && p.headers.length) || 0;
  34579. return Math.max(Z, Y);
  34580. }, 0);
  34581. let u = 1;
  34582. const m = this._columns = [];
  34583. b.forEach((Z) => {
  34584. const p = new n(this, u++, !1);
  34585. m.push(p), p.defn = Z;
  34586. });
  34587. }
  34588. getColumnKey(b) {
  34589. return this._keys[b];
  34590. }
  34591. setColumnKey(b, u) {
  34592. this._keys[b] = u;
  34593. }
  34594. deleteColumnKey(b) {
  34595. delete this._keys[b];
  34596. }
  34597. eachColumnKey(b) {
  34598. e.each(this._keys, b);
  34599. }
  34600. getColumn(b) {
  34601. if (typeof b == "string") {
  34602. const u = this._keys[b];
  34603. if (u) return u;
  34604. b = A.l2n(b);
  34605. }
  34606. if (this._columns || (this._columns = []), b > this._columns.length) {
  34607. let u = this._columns.length + 1;
  34608. for (; u <= b; ) this._columns.push(new n(this, u++));
  34609. }
  34610. return this._columns[b - 1];
  34611. }
  34612. spliceColumns(b, u) {
  34613. const m = this._rows.length;
  34614. for (var Z = arguments.length, p = new Array(Z > 2 ? Z - 2 : 0), Y = 2; Y < Z; Y++) p[Y - 2] = arguments[Y];
  34615. if (p.length > 0) for (let S = 0; S < m; S++) {
  34616. const z = [b, u];
  34617. p.forEach((K) => {
  34618. z.push(K[S] || null);
  34619. });
  34620. const v = this.getRow(S + 1);
  34621. v.splice.apply(v, z);
  34622. }
  34623. else this._rows.forEach((S) => {
  34624. S && S.splice(b, u);
  34625. });
  34626. const R = p.length - u, X = b + u, H = this._columns.length;
  34627. if (R < 0) for (let S = b + p.length; S <= H; S++) this.getColumn(S).defn = this.getColumn(S - R).defn;
  34628. else if (R > 0) for (let S = H; S >= X; S--) this.getColumn(S + R).defn = this.getColumn(S).defn;
  34629. for (let S = b; S < b + p.length; S++) this.getColumn(S).defn = null;
  34630. this.workbook.definedNames.spliceColumns(this.name, b, u, p.length);
  34631. }
  34632. get lastColumn() {
  34633. return this.getColumn(this.columnCount);
  34634. }
  34635. get columnCount() {
  34636. let b = 0;
  34637. return this.eachRow((u) => {
  34638. b = Math.max(b, u.cellCount);
  34639. }), b;
  34640. }
  34641. get actualColumnCount() {
  34642. const b = [];
  34643. let u = 0;
  34644. return this.eachRow((m) => {
  34645. m.eachCell((Z) => {
  34646. let { col: p } = Z;
  34647. b[p] || (b[p] = !0, u++);
  34648. });
  34649. }), u;
  34650. }
  34651. _commitRow() {
  34652. }
  34653. get _lastRowNumber() {
  34654. const b = this._rows;
  34655. let u = b.length;
  34656. for (; u > 0 && b[u - 1] === void 0; ) u--;
  34657. return u;
  34658. }
  34659. get _nextRow() {
  34660. return this._lastRowNumber + 1;
  34661. }
  34662. get lastRow() {
  34663. if (this._rows.length) return this._rows[this._rows.length - 1];
  34664. }
  34665. findRow(b) {
  34666. return this._rows[b - 1];
  34667. }
  34668. findRows(b, u) {
  34669. return this._rows.slice(b - 1, b - 1 + u);
  34670. }
  34671. get rowCount() {
  34672. return this._lastRowNumber;
  34673. }
  34674. get actualRowCount() {
  34675. let b = 0;
  34676. return this.eachRow(() => {
  34677. b++;
  34678. }), b;
  34679. }
  34680. getRow(b) {
  34681. let u = this._rows[b - 1];
  34682. return u || (u = this._rows[b - 1] = new l(this, b)), u;
  34683. }
  34684. getRows(b, u) {
  34685. if (u < 1) return;
  34686. const m = [];
  34687. for (let Z = b; Z < b + u; Z++) m.push(this.getRow(Z));
  34688. return m;
  34689. }
  34690. addRow(b) {
  34691. let u = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "n";
  34692. const m = this._nextRow, Z = this.getRow(m);
  34693. return Z.values = b, this._setStyleOption(m, u[0] === "i" ? u : "n"), Z;
  34694. }
  34695. addRows(b) {
  34696. let u = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "n";
  34697. const m = [];
  34698. return b.forEach((Z) => {
  34699. m.push(this.addRow(Z, u));
  34700. }), m;
  34701. }
  34702. insertRow(b, u) {
  34703. let m = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "n";
  34704. return this.spliceRows(b, 0, u), this._setStyleOption(b, m), this.getRow(b);
  34705. }
  34706. insertRows(b, u) {
  34707. let m = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "n";
  34708. if (this.spliceRows(b, 0, ...u), m !== "n") for (let Z = 0; Z < u.length; Z++) m[0] === "o" && this.findRow(u.length + b + Z) !== void 0 ? this._copyStyle(u.length + b + Z, b + Z, m[1] === "+") : m[0] === "i" && this.findRow(b - 1) !== void 0 && this._copyStyle(b - 1, b + Z, m[1] === "+");
  34709. return this.getRows(b, u.length);
  34710. }
  34711. _setStyleOption(b) {
  34712. let u = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "n";
  34713. u[0] === "o" && this.findRow(b + 1) !== void 0 ? this._copyStyle(b + 1, b, u[1] === "+") : u[0] === "i" && this.findRow(b - 1) !== void 0 && this._copyStyle(b - 1, b, u[1] === "+");
  34714. }
  34715. _copyStyle(b, u) {
  34716. let m = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
  34717. const Z = this.getRow(b), p = this.getRow(u);
  34718. p.style = h(Z.style), Z.eachCell({ includeEmpty: m }, (Y, R) => {
  34719. p.getCell(R).style = h(Y.style);
  34720. }), p.height = Z.height;
  34721. }
  34722. duplicateRow(b, u) {
  34723. let m = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
  34724. const Z = this._rows[b - 1], p = new Array(u).fill(Z.values);
  34725. this.spliceRows(b + 1, m ? 0 : u, ...p);
  34726. for (let Y = 0; Y < u; Y++) {
  34727. const R = this._rows[b + Y];
  34728. R.style = Z.style, R.height = Z.height, Z.eachCell({ includeEmpty: !0 }, (X, H) => {
  34729. R.getCell(H).style = X.style;
  34730. });
  34731. }
  34732. }
  34733. spliceRows(b, u) {
  34734. const m = b + u;
  34735. for (var Z = arguments.length, p = new Array(Z > 2 ? Z - 2 : 0), Y = 2; Y < Z; Y++) p[Y - 2] = arguments[Y];
  34736. const R = p.length, X = R - u, H = this._rows.length;
  34737. let S, z;
  34738. if (X < 0) for (b === H && (this._rows[H - 1] = void 0), S = m; S <= H; S++) if (z = this._rows[S - 1], z) {
  34739. const v = this.getRow(S + X);
  34740. v.values = z.values, v.style = z.style, v.height = z.height, z.eachCell({ includeEmpty: !0 }, (K, V) => {
  34741. v.getCell(V).style = K.style;
  34742. }), this._rows[S - 1] = void 0;
  34743. } else this._rows[S + X - 1] = void 0;
  34744. else if (X > 0) for (S = H; S >= m; S--) if (z = this._rows[S - 1], z) {
  34745. const v = this.getRow(S + X);
  34746. v.values = z.values, v.style = z.style, v.height = z.height, z.eachCell({ includeEmpty: !0 }, (K, V) => {
  34747. if (v.getCell(V).style = K.style, K._value.constructor.name === "MergeValue") {
  34748. const N = this.getRow(K._row._number + R).getCell(V), B = K._value._master, G = this.getRow(B._row._number + R).getCell(B._column._number);
  34749. N.merge(G);
  34750. }
  34751. });
  34752. } else this._rows[S + X - 1] = void 0;
  34753. for (S = 0; S < R; S++) {
  34754. const v = this.getRow(b + S);
  34755. v.style = {}, v.values = p[S];
  34756. }
  34757. this.workbook.definedNames.spliceRows(this.name, b, u, R);
  34758. }
  34759. eachRow(b, u) {
  34760. if (u || (u = b, b = void 0), b && b.includeEmpty) {
  34761. const m = this._rows.length;
  34762. for (let Z = 1; Z <= m; Z++) u(this.getRow(Z), Z);
  34763. } else this._rows.forEach((m) => {
  34764. m && m.hasValues && u(m, m.number);
  34765. });
  34766. }
  34767. getSheetValues() {
  34768. const b = [];
  34769. return this._rows.forEach((u) => {
  34770. u && (b[u.number] = u.values);
  34771. }), b;
  34772. }
  34773. findCell(b, u) {
  34774. const m = A.getAddress(b, u), Z = this._rows[m.row - 1];
  34775. return Z ? Z.findCell(m.col) : void 0;
  34776. }
  34777. getCell(b, u) {
  34778. const m = A.getAddress(b, u);
  34779. return this.getRow(m.row).getCellEx(m);
  34780. }
  34781. mergeCells() {
  34782. for (var b = arguments.length, u = new Array(b), m = 0; m < b; m++) u[m] = arguments[m];
  34783. const Z = new s(u);
  34784. this._mergeCellsInternal(Z);
  34785. }
  34786. mergeCellsWithoutStyle() {
  34787. for (var b = arguments.length, u = new Array(b), m = 0; m < b; m++) u[m] = arguments[m];
  34788. const Z = new s(u);
  34789. this._mergeCellsInternal(Z, !0);
  34790. }
  34791. _mergeCellsInternal(b, u) {
  34792. e.each(this._merges, (Z) => {
  34793. if (Z.intersects(b)) throw new Error("Cannot merge already merged cells");
  34794. });
  34795. const m = this.getCell(b.top, b.left);
  34796. for (let Z = b.top; Z <= b.bottom; Z++) for (let p = b.left; p <= b.right; p++) (Z > b.top || p > b.left) && this.getCell(Z, p).merge(m, u);
  34797. this._merges[m.address] = b;
  34798. }
  34799. _unMergeMaster(b) {
  34800. const u = this._merges[b.address];
  34801. if (u) {
  34802. for (let m = u.top; m <= u.bottom; m++) for (let Z = u.left; Z <= u.right; Z++) this.getCell(m, Z).unmerge();
  34803. delete this._merges[b.address];
  34804. }
  34805. }
  34806. get hasMerges() {
  34807. return e.some(this._merges, Boolean);
  34808. }
  34809. unMergeCells() {
  34810. for (var b = arguments.length, u = new Array(b), m = 0; m < b; m++) u[m] = arguments[m];
  34811. const Z = new s(u);
  34812. for (let p = Z.top; p <= Z.bottom; p++) for (let Y = Z.left; Y <= Z.right; Y++) {
  34813. const R = this.findCell(p, Y);
  34814. R && (R.type === a.ValueType.Merge ? this._unMergeMaster(R.master) : this._merges[R.address] && this._unMergeMaster(R));
  34815. }
  34816. }
  34817. fillFormula(b, u, m) {
  34818. let Z = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : "shared";
  34819. const p = A.decode(b), { top: Y, left: R, bottom: X, right: H } = p, S = H - R + 1, z = A.encodeAddress(Y, R), v = Z === "shared";
  34820. let K;
  34821. K = typeof m == "function" ? m : Array.isArray(m) ? Array.isArray(m[0]) ? (N, B) => m[N - Y][B - R] : (N, B) => m[(N - Y) * S + (B - R)] : () => {
  34822. };
  34823. let V = !0;
  34824. for (let N = Y; N <= X; N++) for (let B = R; B <= H; B++) V ? (this.getCell(N, B).value = { shareType: Z, formula: u, ref: b, result: K(N, B) }, V = !1) : this.getCell(N, B).value = v ? { sharedFormula: z, result: K(N, B) } : K(N, B);
  34825. }
  34826. addImage(b, u) {
  34827. const m = { type: "image", imageId: b, range: u };
  34828. this._media.push(new d(this, m));
  34829. }
  34830. getImages() {
  34831. return this._media.filter((b) => b.type === "image");
  34832. }
  34833. addBackgroundImage(b) {
  34834. const u = { type: "background", imageId: b };
  34835. this._media.push(new d(this, u));
  34836. }
  34837. getBackgroundImageId() {
  34838. const b = this._media.find((u) => u.type === "background");
  34839. return b && b.imageId;
  34840. }
  34841. protect(b, u) {
  34842. return new Promise((m) => {
  34843. this.sheetProtection = { sheet: !0 }, u && "spinCount" in u && (u.spinCount = Number.isFinite(u.spinCount) ? Math.round(Math.max(0, u.spinCount)) : 1e5), b && (this.sheetProtection.algorithmName = "SHA-512", this.sheetProtection.saltValue = r.randomBytes(16).toString("base64"), this.sheetProtection.spinCount = u && "spinCount" in u ? u.spinCount : 1e5, this.sheetProtection.hashValue = r.convertPasswordToHash(b, "SHA512", this.sheetProtection.saltValue, this.sheetProtection.spinCount)), u && (this.sheetProtection = Object.assign(this.sheetProtection, u), !b && "spinCount" in u && delete this.sheetProtection.spinCount), m();
  34844. });
  34845. }
  34846. unprotect() {
  34847. this.sheetProtection = null;
  34848. }
  34849. addTable(b) {
  34850. const u = new o(this, b);
  34851. return this.tables[b.name] = u, u;
  34852. }
  34853. getTable(b) {
  34854. return this.tables[b];
  34855. }
  34856. removeTable(b) {
  34857. delete this.tables[b];
  34858. }
  34859. getTables() {
  34860. return Object.values(this.tables);
  34861. }
  34862. addConditionalFormatting(b) {
  34863. this.conditionalFormattings.push(b);
  34864. }
  34865. removeConditionalFormatting(b) {
  34866. typeof b == "number" ? this.conditionalFormattings.splice(b, 1) : this.conditionalFormattings = b instanceof Function ? this.conditionalFormattings.filter(b) : [];
  34867. }
  34868. get tabColor() {
  34869. return console.trace("worksheet.tabColor property is now deprecated. Please use worksheet.properties.tabColor"), this.properties.tabColor;
  34870. }
  34871. set tabColor(b) {
  34872. console.trace("worksheet.tabColor property is now deprecated. Please use worksheet.properties.tabColor"), this.properties.tabColor = b;
  34873. }
  34874. get model() {
  34875. const b = { id: this.id, name: this.name, dataValidations: this.dataValidations.model, properties: this.properties, state: this.state, pageSetup: this.pageSetup, headerFooter: this.headerFooter, rowBreaks: this.rowBreaks, views: this.views, autoFilter: this.autoFilter, media: this._media.map((Z) => Z.model), sheetProtection: this.sheetProtection, tables: Object.values(this.tables).map((Z) => Z.model), conditionalFormattings: this.conditionalFormattings };
  34876. b.cols = n.toModel(this.columns);
  34877. const u = b.rows = [], m = b.dimensions = new s();
  34878. return this._rows.forEach((Z) => {
  34879. const p = Z && Z.model;
  34880. p && (m.expand(p.number, p.min, p.number, p.max), u.push(p));
  34881. }), b.merges = [], e.each(this._merges, (Z) => {
  34882. b.merges.push(Z.range);
  34883. }), b;
  34884. }
  34885. _parseRows(b) {
  34886. this._rows = [], b.rows.forEach((u) => {
  34887. const m = new l(this, u.number);
  34888. this._rows[m.number - 1] = m, m.model = u;
  34889. });
  34890. }
  34891. _parseMergeCells(b) {
  34892. e.each(b.mergeCells, (u) => {
  34893. this.mergeCellsWithoutStyle(u);
  34894. });
  34895. }
  34896. set model(b) {
  34897. this.name = b.name, this._columns = n.fromModel(this, b.cols), this._parseRows(b), this._parseMergeCells(b), this.dataValidations = new c(b.dataValidations), this.properties = b.properties, this.pageSetup = b.pageSetup, this.headerFooter = b.headerFooter, this.views = b.views, this.autoFilter = b.autoFilter, this._media = b.media.map((u) => new d(this, u)), this.sheetProtection = b.sheetProtection, this.tables = b.tables.reduce((u, m) => {
  34898. const Z = new o();
  34899. return Z.model = m, u[m.name] = Z, u;
  34900. }, {}), this.conditionalFormattings = b.conditionalFormattings;
  34901. }
  34902. };
  34903. }, { "../utils/col-cache": 19, "../utils/copy-style": 20, "../utils/encryptor": 21, "../utils/under-dash": 26, "./column": 4, "./data-validations": 5, "./enums": 7, "./image": 8, "./range": 10, "./row": 11, "./table": 12 }], 15: [function(g, C, i) {
  34904. g("core-js/modules/es.promise"), g("core-js/modules/es.promise.finally"), g("core-js/modules/es.object.assign"), g("core-js/modules/es.object.keys"), g("core-js/modules/es.object.values"), g("core-js/modules/es.symbol"), g("core-js/modules/es.symbol.async-iterator"), g("core-js/modules/es.array.iterator"), g("core-js/modules/es.array.includes"), g("core-js/modules/es.array.find-index"), g("core-js/modules/es.array.find"), g("core-js/modules/es.string.from-code-point"), g("core-js/modules/es.string.includes"), g("core-js/modules/es.number.is-nan"), g("regenerator-runtime/runtime");
  34905. const e = { Workbook: g("./doc/workbook") }, A = g("./doc/enums");
  34906. Object.keys(A).forEach((s) => {
  34907. e[s] = A[s];
  34908. }), C.exports = e;
  34909. }, { "./doc/enums": 7, "./doc/workbook": 13, "core-js/modules/es.array.find": 359, "core-js/modules/es.array.find-index": 358, "core-js/modules/es.array.includes": 360, "core-js/modules/es.array.iterator": 361, "core-js/modules/es.number.is-nan": 363, "core-js/modules/es.object.assign": 364, "core-js/modules/es.object.keys": 366, "core-js/modules/es.object.values": 367, "core-js/modules/es.promise": 372, "core-js/modules/es.promise.finally": 371, "core-js/modules/es.string.from-code-point": 376, "core-js/modules/es.string.includes": 377, "core-js/modules/es.symbol": 381, "core-js/modules/es.symbol.async-iterator": 378, "regenerator-runtime/runtime": 492 }], 16: [function(g, C, i) {
  34910. const e = typeof TextDecoder > "u" ? null : new TextDecoder("utf-8");
  34911. i.bufferToString = function(A) {
  34912. return typeof A == "string" ? A : e ? e.decode(A) : A.toString();
  34913. };
  34914. }, {}], 17: [function(g, C, i) {
  34915. const e = typeof TextEncoder > "u" ? null : new TextEncoder("utf-8"), { Buffer: A } = g("buffer");
  34916. i.stringToBuffer = function(s) {
  34917. return typeof s != "string" ? s : e ? A.from(e.encode(s).buffer) : A.from(s);
  34918. };
  34919. }, { buffer: 220 }], 18: [function(g, C, i) {
  34920. const e = g("./under-dash"), A = g("./col-cache");
  34921. C.exports = class {
  34922. constructor(s) {
  34923. this.template = s, this.sheets = {};
  34924. }
  34925. addCell(s) {
  34926. this.addCellEx(A.decodeEx(s));
  34927. }
  34928. getCell(s) {
  34929. return this.findCellEx(A.decodeEx(s), !0);
  34930. }
  34931. findCell(s) {
  34932. return this.findCellEx(A.decodeEx(s), !1);
  34933. }
  34934. findCellAt(s, l, n) {
  34935. const a = this.sheets[s], d = a && a[l];
  34936. return d && d[n];
  34937. }
  34938. addCellEx(s) {
  34939. if (s.top) for (let l = s.top; l <= s.bottom; l++) for (let n = s.left; n <= s.right; n++) this.getCellAt(s.sheetName, l, n);
  34940. else this.findCellEx(s, !0);
  34941. }
  34942. getCellEx(s) {
  34943. return this.findCellEx(s, !0);
  34944. }
  34945. findCellEx(s, l) {
  34946. const n = this.findSheet(s, l), a = this.findSheetRow(n, s, l);
  34947. return this.findRowCell(a, s, l);
  34948. }
  34949. getCellAt(s, l, n) {
  34950. const a = this.sheets[s] || (this.sheets[s] = []), d = a[l] || (a[l] = []);
  34951. return d[n] || (d[n] = { sheetName: s, address: A.n2l(n) + l, row: l, col: n });
  34952. }
  34953. removeCellEx(s) {
  34954. const l = this.findSheet(s);
  34955. if (!l) return;
  34956. const n = this.findSheetRow(l, s);
  34957. n && delete n[s.col];
  34958. }
  34959. forEachInSheet(s, l) {
  34960. const n = this.sheets[s];
  34961. n && n.forEach((a, d) => {
  34962. a && a.forEach((o, c) => {
  34963. o && l(o, d, c);
  34964. });
  34965. });
  34966. }
  34967. forEach(s) {
  34968. e.each(this.sheets, (l, n) => {
  34969. this.forEachInSheet(n, s);
  34970. });
  34971. }
  34972. map(s) {
  34973. const l = [];
  34974. return this.forEach((n) => {
  34975. l.push(s(n));
  34976. }), l;
  34977. }
  34978. findSheet(s, l) {
  34979. const n = s.sheetName;
  34980. return this.sheets[n] ? this.sheets[n] : l ? this.sheets[n] = [] : void 0;
  34981. }
  34982. findSheetRow(s, l, n) {
  34983. const { row: a } = l;
  34984. return s && s[a] ? s[a] : n ? s[a] = [] : void 0;
  34985. }
  34986. findRowCell(s, l, n) {
  34987. const { col: a } = l;
  34988. return s && s[a] ? s[a] : n ? s[a] = this.template ? Object.assign(l, JSON.parse(JSON.stringify(this.template))) : l : void 0;
  34989. }
  34990. spliceRows(s, l, n, a) {
  34991. const d = this.sheets[s];
  34992. if (d) {
  34993. const o = [];
  34994. for (let c = 0; c < a; c++) o.push([]);
  34995. d.splice(l, n, ...o);
  34996. }
  34997. }
  34998. spliceColumns(s, l, n, a) {
  34999. const d = this.sheets[s];
  35000. if (d) {
  35001. const o = [];
  35002. for (let c = 0; c < a; c++) o.push(null);
  35003. e.each(d, (c) => {
  35004. c.splice(l, n, ...o);
  35005. });
  35006. }
  35007. }
  35008. };
  35009. }, { "./col-cache": 19, "./under-dash": 26 }], 19: [function(g, C, i) {
  35010. const e = /^[A-Z]+\d+$/, A = { _dictionary: ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"], _l2nFill: 0, _l2n: {}, _n2l: [], _level: (s) => s <= 26 ? 1 : s <= 676 ? 2 : 3, _fill(s) {
  35011. let l, n, a, d, o, c = 1;
  35012. if (s >= 4) throw new Error("Out of bounds. Excel supports columns from 1 to 16384");
  35013. if (this._l2nFill < 1 && s >= 1) {
  35014. for (; c <= 26; ) l = this._dictionary[c - 1], this._n2l[c] = l, this._l2n[l] = c, c++;
  35015. this._l2nFill = 1;
  35016. }
  35017. if (this._l2nFill < 2 && s >= 2) {
  35018. for (c = 27; c <= 702; ) n = c - 27, a = n % 26, d = Math.floor(n / 26), l = this._dictionary[d] + this._dictionary[a], this._n2l[c] = l, this._l2n[l] = c, c++;
  35019. this._l2nFill = 2;
  35020. }
  35021. if (this._l2nFill < 3 && s >= 3) {
  35022. for (c = 703; c <= 16384; ) n = c - 703, a = n % 26, d = Math.floor(n / 26) % 26, o = Math.floor(n / 676), l = this._dictionary[o] + this._dictionary[d] + this._dictionary[a], this._n2l[c] = l, this._l2n[l] = c, c++;
  35023. this._l2nFill = 3;
  35024. }
  35025. }, l2n(s) {
  35026. if (this._l2n[s] || this._fill(s.length), !this._l2n[s]) throw new Error("Out of bounds. Invalid column letter: " + s);
  35027. return this._l2n[s];
  35028. }, n2l(s) {
  35029. if (s < 1 || s > 16384) throw new Error(s + " is out of bounds. Excel supports columns from 1 to 16384");
  35030. return this._n2l[s] || this._fill(this._level(s)), this._n2l[s];
  35031. }, _hash: {}, validateAddress(s) {
  35032. if (!e.test(s)) throw new Error("Invalid Address: " + s);
  35033. return !0;
  35034. }, decodeAddress(s) {
  35035. const l = s.length < 5 && this._hash[s];
  35036. if (l) return l;
  35037. let n = !1, a = "", d = 0, o = !1, c = "", r = 0;
  35038. for (let b, u = 0; u < s.length; u++) if (b = s.charCodeAt(u), !o && b >= 65 && b <= 90) n = !0, a += s[u], d = 26 * d + b - 64;
  35039. else if (b >= 48 && b <= 57) o = !0, c += s[u], r = 10 * r + b - 48;
  35040. else if (o && n && b !== 36) break;
  35041. if (n) {
  35042. if (d > 16384) throw new Error("Out of bounds. Invalid column letter: " + a);
  35043. } else d = void 0;
  35044. o || (r = void 0);
  35045. const h = { address: s = a + c, col: d, row: r, $col$row: `$${a}$${c}` };
  35046. return d <= 100 && r <= 100 && (this._hash[s] = h, this._hash[h.$col$row] = h), h;
  35047. }, getAddress(s, l) {
  35048. if (l) {
  35049. const n = this.n2l(l) + s;
  35050. return this.decodeAddress(n);
  35051. }
  35052. return this.decodeAddress(s);
  35053. }, decode(s) {
  35054. const l = s.split(":");
  35055. if (l.length === 2) {
  35056. const n = this.decodeAddress(l[0]), a = this.decodeAddress(l[1]), d = { top: Math.min(n.row, a.row), left: Math.min(n.col, a.col), bottom: Math.max(n.row, a.row), right: Math.max(n.col, a.col) };
  35057. return d.tl = this.n2l(d.left) + d.top, d.br = this.n2l(d.right) + d.bottom, d.dimensions = `${d.tl}:${d.br}`, d;
  35058. }
  35059. return this.decodeAddress(s);
  35060. }, decodeEx(s) {
  35061. const l = s.match(/(?:(?:(?:'((?:[^']|'')*)')|([^'^ !]*))!)?(.*)/), n = l[1] || l[2], a = l[3], d = a.split(":");
  35062. if (d.length > 1) {
  35063. let c = this.decodeAddress(d[0]), r = this.decodeAddress(d[1]);
  35064. const h = Math.min(c.row, r.row), b = Math.min(c.col, r.col), u = Math.max(c.row, r.row), m = Math.max(c.col, r.col);
  35065. return c = this.n2l(b) + h, r = this.n2l(m) + u, { top: h, left: b, bottom: u, right: m, sheetName: n, tl: { address: c, col: b, row: h, $col$row: `$${this.n2l(b)}$${h}`, sheetName: n }, br: { address: r, col: m, row: u, $col$row: `$${this.n2l(m)}$${u}`, sheetName: n }, dimensions: `${c}:${r}` };
  35066. }
  35067. if (a.startsWith("#")) return n ? { sheetName: n, error: a } : { error: a };
  35068. const o = this.decodeAddress(a);
  35069. return n ? { sheetName: n, ...o } : o;
  35070. }, encodeAddress: (s, l) => A.n2l(l) + s, encode() {
  35071. switch (arguments.length) {
  35072. case 2:
  35073. return A.encodeAddress(arguments[0], arguments[1]);
  35074. case 4:
  35075. return `${A.encodeAddress(arguments[0], arguments[1])}:${A.encodeAddress(arguments[2], arguments[3])}`;
  35076. default:
  35077. throw new Error("Can only encode with 2 or 4 arguments");
  35078. }
  35079. }, inRange(s, l) {
  35080. const [n, a, , d, o] = s, [c, r] = l;
  35081. return c >= n && c <= d && r >= a && r <= o;
  35082. } };
  35083. C.exports = A;
  35084. }, {}], 20: [function(g, C, i) {
  35085. const e = (s, l) => ({ ...s, ...l.reduce((n, a) => (s[a] && (n[a] = { ...s[a] }), n), {}) }), A = function(s, l, n) {
  35086. let a = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : [];
  35087. s[n] && (l[n] = e(s[n], a));
  35088. };
  35089. i.copyStyle = (s) => {
  35090. if (!s) return s;
  35091. if (l = s, Object.keys(l).length === 0) return {};
  35092. var l;
  35093. const n = { ...s };
  35094. return A(s, n, "font", ["color"]), A(s, n, "alignment"), A(s, n, "protection"), s.border && (A(s, n, "border"), A(s.border, n.border, "top", ["color"]), A(s.border, n.border, "left", ["color"]), A(s.border, n.border, "bottom", ["color"]), A(s.border, n.border, "right", ["color"]), A(s.border, n.border, "diagonal", ["color"])), s.fill && (A(s, n, "fill", ["fgColor", "bgColor", "center"]), s.fill.stops && (n.fill.stops = s.fill.stops.map((a) => e(a, ["color"])))), n;
  35095. };
  35096. }, {}], 21: [function(g, C, i) {
  35097. (function(e) {
  35098. (function() {
  35099. const A = g("crypto"), s = { hash(l) {
  35100. const n = A.createHash(l);
  35101. for (var a = arguments.length, d = new Array(a > 1 ? a - 1 : 0), o = 1; o < a; o++) d[o - 1] = arguments[o];
  35102. return n.update(e.concat(d)), n.digest();
  35103. }, convertPasswordToHash(l, n, a, d) {
  35104. if (n = n.toLowerCase(), A.getHashes().indexOf(n) < 0) throw new Error(`Hash algorithm '${n}' not supported!`);
  35105. const o = e.from(l, "utf16le");
  35106. let c = this.hash(n, e.from(a, "base64"), o);
  35107. for (let r = 0; r < d; r++) {
  35108. const h = e.alloc(4);
  35109. h.writeUInt32LE(r, 0), c = this.hash(n, c, h);
  35110. }
  35111. return c.toString("base64");
  35112. }, randomBytes: (l) => A.randomBytes(l) };
  35113. C.exports = s;
  35114. }).call(this);
  35115. }).call(this, g("buffer").Buffer);
  35116. }, { buffer: 220, crypto: 390 }], 22: [function(g, C, i) {
  35117. const { SaxesParser: e } = g("saxes"), { PassThrough: A } = g("readable-stream"), { bufferToString: s } = g("./browser-buffer-decode");
  35118. C.exports = async function* (l) {
  35119. l.pipe && !l[Symbol.asyncIterator] && (l = l.pipe(new A()));
  35120. const n = new e();
  35121. let a;
  35122. n.on("error", (o) => {
  35123. a = o;
  35124. });
  35125. let d = [];
  35126. n.on("opentag", (o) => d.push({ eventType: "opentag", value: o })), n.on("text", (o) => d.push({ eventType: "text", value: o })), n.on("closetag", (o) => d.push({ eventType: "closetag", value: o }));
  35127. for await (const o of l) {
  35128. if (n.write(s(o)), a) throw a;
  35129. yield d, d = [];
  35130. }
  35131. };
  35132. }, { "./browser-buffer-decode": 16, "readable-stream": 491, saxes: 496 }], 23: [function(g, C, i) {
  35133. const e = g("./col-cache"), A = /(([a-z_\-0-9]*)!)?([a-z0-9_$]{2,})([(])?/gi, s = /^([$])?([a-z]+)([$])?([1-9][0-9]*)$/i;
  35134. C.exports = { slideFormula: function(l, n, a) {
  35135. const d = e.decode(n), o = e.decode(a);
  35136. return l.replace(A, (c, r, h, b, u) => {
  35137. if (u) return c;
  35138. const m = s.exec(b);
  35139. if (m) {
  35140. const Z = m[1], p = m[2].toUpperCase(), Y = m[3], R = m[4];
  35141. if (p.length > 3 || p.length === 3 && p > "XFD") return c;
  35142. let X = e.l2n(p), H = parseInt(R, 10);
  35143. return Z || (X += o.col - d.col), Y || (H += o.row - d.row), (r || "") + (Z || "") + e.n2l(X) + (Y || "") + H;
  35144. }
  35145. return c;
  35146. });
  35147. } };
  35148. }, { "./col-cache": 19 }], 24: [function(g, C, i) {
  35149. (function(e, A) {
  35150. (function() {
  35151. const s = g("readable-stream"), l = g("./utils"), n = g("./string-buf");
  35152. class a {
  35153. constructor(b, u) {
  35154. this._data = b, this._encoding = u;
  35155. }
  35156. get length() {
  35157. return this.toBuffer().length;
  35158. }
  35159. copy(b, u, m, Z) {
  35160. return this.toBuffer().copy(b, u, m, Z);
  35161. }
  35162. toBuffer() {
  35163. return this._buffer || (this._buffer = A.from(this._data, this._encoding)), this._buffer;
  35164. }
  35165. }
  35166. class d {
  35167. constructor(b) {
  35168. this._data = b;
  35169. }
  35170. get length() {
  35171. return this._data.length;
  35172. }
  35173. copy(b, u, m, Z) {
  35174. return this._data._buf.copy(b, u, m, Z);
  35175. }
  35176. toBuffer() {
  35177. return this._data.toBuffer();
  35178. }
  35179. }
  35180. class o {
  35181. constructor(b) {
  35182. this._data = b;
  35183. }
  35184. get length() {
  35185. return this._data.length;
  35186. }
  35187. copy(b, u, m, Z) {
  35188. this._data.copy(b, u, m, Z);
  35189. }
  35190. toBuffer() {
  35191. return this._data;
  35192. }
  35193. }
  35194. class c {
  35195. constructor(b) {
  35196. this.size = b, this.buffer = A.alloc(b), this.iRead = 0, this.iWrite = 0;
  35197. }
  35198. toBuffer() {
  35199. if (this.iRead === 0 && this.iWrite === this.size) return this.buffer;
  35200. const b = A.alloc(this.iWrite - this.iRead);
  35201. return this.buffer.copy(b, 0, this.iRead, this.iWrite), b;
  35202. }
  35203. get length() {
  35204. return this.iWrite - this.iRead;
  35205. }
  35206. get eod() {
  35207. return this.iRead === this.iWrite;
  35208. }
  35209. get full() {
  35210. return this.iWrite === this.size;
  35211. }
  35212. read(b) {
  35213. let u;
  35214. return b === 0 ? null : b === void 0 || b >= this.length ? (u = this.toBuffer(), this.iRead = this.iWrite, u) : (u = A.alloc(b), this.buffer.copy(u, 0, this.iRead, b), this.iRead += b, u);
  35215. }
  35216. write(b, u, m) {
  35217. const Z = Math.min(m, this.size - this.iWrite);
  35218. return b.copy(this.buffer, this.iWrite, u, u + Z), this.iWrite += Z, Z;
  35219. }
  35220. }
  35221. const r = function(h) {
  35222. h = h || {}, this.bufSize = h.bufSize || 1048576, this.buffers = [], this.batch = h.batch || !1, this.corked = !1, this.inPos = 0, this.outPos = 0, this.pipes = [], this.paused = !1, this.encoding = null;
  35223. };
  35224. l.inherits(r, s.Duplex, { toBuffer() {
  35225. switch (this.buffers.length) {
  35226. case 0:
  35227. return null;
  35228. case 1:
  35229. return this.buffers[0].toBuffer();
  35230. default:
  35231. return A.concat(this.buffers.map((h) => h.toBuffer()));
  35232. }
  35233. }, _getWritableBuffer() {
  35234. if (this.buffers.length) {
  35235. const b = this.buffers[this.buffers.length - 1];
  35236. if (!b.full) return b;
  35237. }
  35238. const h = new c(this.bufSize);
  35239. return this.buffers.push(h), h;
  35240. }, async _pipe(h) {
  35241. await Promise.all(this.pipes.map(function(b) {
  35242. return new Promise((u) => {
  35243. b.write(h.toBuffer(), () => {
  35244. u();
  35245. });
  35246. });
  35247. }));
  35248. }, _writeToBuffers(h) {
  35249. let b = 0;
  35250. const u = h.length;
  35251. for (; b < u; )
  35252. b += this._getWritableBuffer().write(h, b, u - b);
  35253. }, async write(h, b, u) {
  35254. let m;
  35255. if (b instanceof Function && (u = b, b = "utf8"), u = u || l.nop, h instanceof n) m = new d(h);
  35256. else if (h instanceof A) m = new o(h);
  35257. else {
  35258. if (!(typeof h == "string" || h instanceof String || h instanceof ArrayBuffer)) throw new Error("Chunk must be one of type String, Buffer or StringBuf.");
  35259. m = new a(h, b);
  35260. }
  35261. if (this.pipes.length) if (this.batch) for (this._writeToBuffers(m); !this.corked && this.buffers.length > 1; ) this._pipe(this.buffers.shift());
  35262. else this.corked ? (this._writeToBuffers(m), e.nextTick(u)) : (await this._pipe(m), u());
  35263. else this.paused || this.emit("data", m.toBuffer()), this._writeToBuffers(m), this.emit("readable");
  35264. return !0;
  35265. }, cork() {
  35266. this.corked = !0;
  35267. }, _flush() {
  35268. if (this.pipes.length) for (; this.buffers.length; ) this._pipe(this.buffers.shift());
  35269. }, uncork() {
  35270. this.corked = !1, this._flush();
  35271. }, end(h, b, u) {
  35272. const m = (Z) => {
  35273. Z ? u(Z) : (this._flush(), this.pipes.forEach((p) => {
  35274. p.end();
  35275. }), this.emit("finish"));
  35276. };
  35277. h ? this.write(h, b, m) : m();
  35278. }, read(h) {
  35279. let b;
  35280. if (h) {
  35281. for (b = []; h && this.buffers.length && !this.buffers[0].eod; ) {
  35282. const u = this.buffers[0], m = u.read(h);
  35283. h -= m.length, b.push(m), u.eod && u.full && this.buffers.shift();
  35284. }
  35285. return A.concat(b);
  35286. }
  35287. return b = this.buffers.map((u) => u.toBuffer()).filter(Boolean), this.buffers = [], A.concat(b);
  35288. }, setEncoding(h) {
  35289. this.encoding = h;
  35290. }, pause() {
  35291. this.paused = !0;
  35292. }, resume() {
  35293. this.paused = !1;
  35294. }, isPaused() {
  35295. return !!this.paused;
  35296. }, pipe(h) {
  35297. this.pipes.push(h), !this.paused && this.buffers.length && this.end();
  35298. }, unpipe(h) {
  35299. this.pipes = this.pipes.filter((b) => b !== h);
  35300. }, unshift() {
  35301. throw new Error("Not Implemented");
  35302. }, wrap() {
  35303. throw new Error("Not Implemented");
  35304. } }), C.exports = r;
  35305. }).call(this);
  35306. }).call(this, g("_process"), g("buffer").Buffer);
  35307. }, { "./string-buf": 25, "./utils": 27, _process: 467, buffer: 220, "readable-stream": 491 }], 25: [function(g, C, i) {
  35308. (function(e) {
  35309. (function() {
  35310. C.exports = class {
  35311. constructor(A) {
  35312. this._buf = e.alloc(A && A.size || 16384), this._encoding = A && A.encoding || "utf8", this._inPos = 0, this._buffer = void 0;
  35313. }
  35314. get length() {
  35315. return this._inPos;
  35316. }
  35317. get capacity() {
  35318. return this._buf.length;
  35319. }
  35320. get buffer() {
  35321. return this._buf;
  35322. }
  35323. toBuffer() {
  35324. return this._buffer || (this._buffer = e.alloc(this.length), this._buf.copy(this._buffer, 0, 0, this.length)), this._buffer;
  35325. }
  35326. reset(A) {
  35327. A = A || 0, this._buffer = void 0, this._inPos = A;
  35328. }
  35329. _grow(A) {
  35330. let s = 2 * this._buf.length;
  35331. for (; s < A; ) s *= 2;
  35332. const l = e.alloc(s);
  35333. this._buf.copy(l, 0), this._buf = l;
  35334. }
  35335. addText(A) {
  35336. this._buffer = void 0;
  35337. let s = this._inPos + this._buf.write(A, this._inPos, this._encoding);
  35338. for (; s >= this._buf.length - 4; ) this._grow(this._inPos + A.length), s = this._inPos + this._buf.write(A, this._inPos, this._encoding);
  35339. this._inPos = s;
  35340. }
  35341. addStringBuf(A) {
  35342. A.length && (this._buffer = void 0, this.length + A.length > this.capacity && this._grow(this.length + A.length), A._buf.copy(this._buf, this._inPos, 0, A.length), this._inPos += A.length);
  35343. }
  35344. };
  35345. }).call(this);
  35346. }).call(this, g("buffer").Buffer);
  35347. }, { buffer: 220 }], 26: [function(g, C, i) {
  35348. const { toString: e } = Object.prototype, A = /["&<>]/, s = { each: function(l, n) {
  35349. l && (Array.isArray(l) ? l.forEach(n) : Object.keys(l).forEach((a) => {
  35350. n(l[a], a);
  35351. }));
  35352. }, some: function(l, n) {
  35353. return !!l && (Array.isArray(l) ? l.some(n) : Object.keys(l).some((a) => n(l[a], a)));
  35354. }, every: function(l, n) {
  35355. return !l || (Array.isArray(l) ? l.every(n) : Object.keys(l).every((a) => n(l[a], a)));
  35356. }, map: function(l, n) {
  35357. return l ? Array.isArray(l) ? l.map(n) : Object.keys(l).map((a) => n(l[a], a)) : [];
  35358. }, keyBy: (l, n) => l.reduce((a, d) => (a[d[n]] = d, a), {}), isEqual: function(l, n) {
  35359. const a = typeof l, d = typeof n, o = Array.isArray(l), c = Array.isArray(n);
  35360. let r;
  35361. if (a !== d) return !1;
  35362. switch (typeof l) {
  35363. case "object":
  35364. if (o || c) return !(!o || !c) && l.length === n.length && l.every((h, b) => {
  35365. const u = n[b];
  35366. return s.isEqual(h, u);
  35367. });
  35368. if (l === null || n === null) return l === n;
  35369. if (r = Object.keys(l), Object.keys(n).length !== r.length) return !1;
  35370. for (const h of r) if (!n.hasOwnProperty(h)) return !1;
  35371. return s.every(l, (h, b) => {
  35372. const u = n[b];
  35373. return s.isEqual(h, u);
  35374. });
  35375. default:
  35376. return l === n;
  35377. }
  35378. }, escapeHtml(l) {
  35379. const n = A.exec(l);
  35380. if (!n) return l;
  35381. let a = "", d = "", o = 0, c = n.index;
  35382. for (; c < l.length; c++) {
  35383. switch (l.charAt(c)) {
  35384. case '"':
  35385. d = "&quot;";
  35386. break;
  35387. case "&":
  35388. d = "&amp;";
  35389. break;
  35390. case "'":
  35391. d = "&apos;";
  35392. break;
  35393. case "<":
  35394. d = "&lt;";
  35395. break;
  35396. case ">":
  35397. d = "&gt;";
  35398. break;
  35399. default:
  35400. continue;
  35401. }
  35402. o !== c && (a += l.substring(o, c)), o = c + 1, a += d;
  35403. }
  35404. return o !== c ? a + l.substring(o, c) : a;
  35405. }, strcmp: (l, n) => l < n ? -1 : l > n ? 1 : 0, isUndefined: (l) => e.call(l) === "[object Undefined]", isObject: (l) => e.call(l) === "[object Object]", deepMerge() {
  35406. const l = arguments[0] || {}, { length: n } = arguments;
  35407. let a, d, o;
  35408. function c(r, h) {
  35409. a = l[h], o = Array.isArray(r), s.isObject(r) || o ? (o ? (o = !1, d = a && Array.isArray(a) ? a : []) : d = a && s.isObject(a) ? a : {}, l[h] = s.deepMerge(d, r)) : s.isUndefined(r) || (l[h] = r);
  35410. }
  35411. for (let r = 0; r < n; r++) s.each(arguments[r], c);
  35412. return l;
  35413. } };
  35414. C.exports = s;
  35415. }, {}], 27: [function(g, C, i) {
  35416. (function(e, A) {
  35417. (function() {
  35418. const s = g("fs"), l = /[<>&'"\x7F\x00-\x08\x0B-\x0C\x0E-\x1F]/, n = { nop() {
  35419. }, promiseImmediate: (a) => new Promise((d) => {
  35420. e.setImmediate ? A(() => {
  35421. d(a);
  35422. }) : setTimeout(() => {
  35423. d(a);
  35424. }, 1);
  35425. }), inherits: function(a, d, o, c) {
  35426. a.super_ = d, c || (c = o, o = null), o && Object.keys(o).forEach((h) => {
  35427. Object.defineProperty(a, h, Object.getOwnPropertyDescriptor(o, h));
  35428. });
  35429. const r = { constructor: { value: a, enumerable: !1, writable: !1, configurable: !0 } };
  35430. c && Object.keys(c).forEach((h) => {
  35431. r[h] = Object.getOwnPropertyDescriptor(c, h);
  35432. }), a.prototype = Object.create(d.prototype, r);
  35433. }, dateToExcel: (a, d) => 25569 + a.getTime() / 864e5 - (d ? 1462 : 0), excelToDate(a, d) {
  35434. const o = Math.round(24 * (a - 25569 + (d ? 1462 : 0)) * 3600 * 1e3);
  35435. return new Date(o);
  35436. }, parsePath(a) {
  35437. const d = a.lastIndexOf("/");
  35438. return { path: a.substring(0, d), name: a.substring(d + 1) };
  35439. }, getRelsPath(a) {
  35440. const d = n.parsePath(a);
  35441. return `${d.path}/_rels/${d.name}.rels`;
  35442. }, xmlEncode(a) {
  35443. const d = l.exec(a);
  35444. if (!d) return a;
  35445. let o = "", c = "", r = 0, h = d.index;
  35446. for (; h < a.length; h++) {
  35447. const b = a.charCodeAt(h);
  35448. switch (b) {
  35449. case 34:
  35450. c = "&quot;";
  35451. break;
  35452. case 38:
  35453. c = "&amp;";
  35454. break;
  35455. case 39:
  35456. c = "&apos;";
  35457. break;
  35458. case 60:
  35459. c = "&lt;";
  35460. break;
  35461. case 62:
  35462. c = "&gt;";
  35463. break;
  35464. case 127:
  35465. c = "";
  35466. break;
  35467. default:
  35468. if (b <= 31 && (b <= 8 || b >= 11 && b !== 13)) {
  35469. c = "";
  35470. break;
  35471. }
  35472. continue;
  35473. }
  35474. r !== h && (o += a.substring(r, h)), r = h + 1, c && (o += c);
  35475. }
  35476. return r !== h ? o + a.substring(r, h) : o;
  35477. }, xmlDecode: (a) => a.replace(/&([a-z]*);/g, (d) => {
  35478. switch (d) {
  35479. case "&lt;":
  35480. return "<";
  35481. case "&gt;":
  35482. return ">";
  35483. case "&amp;":
  35484. return "&";
  35485. case "&apos;":
  35486. return "'";
  35487. case "&quot;":
  35488. return '"';
  35489. default:
  35490. return d;
  35491. }
  35492. }), validInt(a) {
  35493. const d = parseInt(a, 10);
  35494. return Number.isNaN(d) ? 0 : d;
  35495. }, isDateFmt(a) {
  35496. return a ? (a = (a = a.replace(/\[[^\]]*]/g, "")).replace(/"[^"]*"/g, "")).match(/[ymdhMsb]+/) !== null : !1;
  35497. }, fs: { exists: (a) => new Promise((d) => {
  35498. s.access(a, s.constants.F_OK, (o) => {
  35499. d(!o);
  35500. });
  35501. }) }, toIsoDateString: (a) => a.toIsoString().subsstr(0, 10), parseBoolean: (a) => a === !0 || a === "true" || a === 1 || a === "1" };
  35502. C.exports = n;
  35503. }).call(this);
  35504. }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {}, g("timers").setImmediate);
  35505. }, { fs: 216, timers: 523 }], 28: [function(g, C, i) {
  35506. const e = g("./under-dash"), A = g("./utils");
  35507. function s(a, d, o) {
  35508. a.push(` ${d}="${A.xmlEncode(o.toString())}"`);
  35509. }
  35510. function l(a, d) {
  35511. if (d) {
  35512. const o = [];
  35513. e.each(d, (c, r) => {
  35514. c !== void 0 && s(o, r, c);
  35515. }), a.push(o.join(""));
  35516. }
  35517. }
  35518. class n {
  35519. constructor() {
  35520. this._xml = [], this._stack = [], this._rollbacks = [];
  35521. }
  35522. get tos() {
  35523. return this._stack.length ? this._stack[this._stack.length - 1] : void 0;
  35524. }
  35525. get cursor() {
  35526. return this._xml.length;
  35527. }
  35528. openXml(d) {
  35529. const o = this._xml;
  35530. o.push("<?xml"), l(o, d), o.push(`?>
  35531. `);
  35532. }
  35533. openNode(d, o) {
  35534. const c = this.tos, r = this._xml;
  35535. c && this.open && r.push(">"), this._stack.push(d), r.push("<"), r.push(d), l(r, o), this.leaf = !0, this.open = !0;
  35536. }
  35537. addAttribute(d, o) {
  35538. if (!this.open) throw new Error("Cannot write attributes to node if it is not open");
  35539. o !== void 0 && s(this._xml, d, o);
  35540. }
  35541. addAttributes(d) {
  35542. if (!this.open) throw new Error("Cannot write attributes to node if it is not open");
  35543. l(this._xml, d);
  35544. }
  35545. writeText(d) {
  35546. const o = this._xml;
  35547. this.open && (o.push(">"), this.open = !1), this.leaf = !1, o.push(A.xmlEncode(d.toString()));
  35548. }
  35549. writeXml(d) {
  35550. this.open && (this._xml.push(">"), this.open = !1), this.leaf = !1, this._xml.push(d);
  35551. }
  35552. closeNode() {
  35553. const d = this._stack.pop(), o = this._xml;
  35554. this.leaf ? o.push("/>") : (o.push("</"), o.push(d), o.push(">")), this.open = !1, this.leaf = !1;
  35555. }
  35556. leafNode(d, o, c) {
  35557. this.openNode(d, o), c !== void 0 && this.writeText(c), this.closeNode();
  35558. }
  35559. closeAll() {
  35560. for (; this._stack.length; ) this.closeNode();
  35561. }
  35562. addRollback() {
  35563. return this._rollbacks.push({ xml: this._xml.length, stack: this._stack.length, leaf: this.leaf, open: this.open }), this.cursor;
  35564. }
  35565. commit() {
  35566. this._rollbacks.pop();
  35567. }
  35568. rollback() {
  35569. const d = this._rollbacks.pop();
  35570. this._xml.length > d.xml && this._xml.splice(d.xml, this._xml.length - d.xml), this._stack.length > d.stack && this._stack.splice(d.stack, this._stack.length - d.stack), this.leaf = d.leaf, this.open = d.open;
  35571. }
  35572. get xml() {
  35573. return this.closeAll(), this._xml.join("");
  35574. }
  35575. }
  35576. n.StdDocAttributes = { version: "1.0", encoding: "UTF-8", standalone: "yes" }, C.exports = n;
  35577. }, { "./under-dash": 26, "./utils": 27 }], 29: [function(g, C, i) {
  35578. (function(e) {
  35579. (function() {
  35580. const A = g("events"), s = g("jszip"), l = g("./stream-buf"), { stringToBuffer: n } = g("./browser-buffer-encode");
  35581. class a extends A.EventEmitter {
  35582. constructor(o) {
  35583. super(), this.options = Object.assign({ type: "nodebuffer", compression: "DEFLATE" }, o), this.zip = new s(), this.stream = new l();
  35584. }
  35585. append(o, c) {
  35586. c.hasOwnProperty("base64") && c.base64 ? this.zip.file(c.name, o, { base64: !0 }) : (e.browser && typeof o == "string" && (o = n(o)), this.zip.file(c.name, o));
  35587. }
  35588. async finalize() {
  35589. const o = await this.zip.generateAsync(this.options);
  35590. this.stream.end(o), this.emit("finish");
  35591. }
  35592. read(o) {
  35593. return this.stream.read(o);
  35594. }
  35595. setEncoding(o) {
  35596. return this.stream.setEncoding(o);
  35597. }
  35598. pause() {
  35599. return this.stream.pause();
  35600. }
  35601. resume() {
  35602. return this.stream.resume();
  35603. }
  35604. isPaused() {
  35605. return this.stream.isPaused();
  35606. }
  35607. pipe(o, c) {
  35608. return this.stream.pipe(o, c);
  35609. }
  35610. unpipe(o) {
  35611. return this.stream.unpipe(o);
  35612. }
  35613. unshift(o) {
  35614. return this.stream.unshift(o);
  35615. }
  35616. wrap(o) {
  35617. return this.stream.wrap(o);
  35618. }
  35619. }
  35620. C.exports = { ZipWriter: a };
  35621. }).call(this);
  35622. }).call(this, g("_process"));
  35623. }, { "./browser-buffer-encode": 17, "./stream-buf": 24, _process: 467, events: 422, jszip: 441 }], 30: [function(g, C, i) {
  35624. C.exports = { 0: { f: "General" }, 1: { f: "0" }, 2: { f: "0.00" }, 3: { f: "#,##0" }, 4: { f: "#,##0.00" }, 9: { f: "0%" }, 10: { f: "0.00%" }, 11: { f: "0.00E+00" }, 12: { f: "# ?/?" }, 13: { f: "# ??/??" }, 14: { f: "mm-dd-yy" }, 15: { f: "d-mmm-yy" }, 16: { f: "d-mmm" }, 17: { f: "mmm-yy" }, 18: { f: "h:mm AM/PM" }, 19: { f: "h:mm:ss AM/PM" }, 20: { f: "h:mm" }, 21: { f: "h:mm:ss" }, 22: { f: 'm/d/yy "h":mm' }, 27: { "zh-tw": "[$-404]e/m/d", "zh-cn": 'yyyy"年"m"月"', "ja-jp": "[$-411]ge.m.d", "ko-kr": 'yyyy"年" mm"月" dd"日"' }, 28: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 29: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 30: { "zh-tw": "m/d/yy ", "zh-cn": "m-d-yy", "ja-jp": "m/d/yy", "ko-kr": "mm-dd-yy" }, 31: { "zh-tw": 'yyyy"年"m"月"d"日"', "zh-cn": 'yyyy"年"m"月"d"日"', "ja-jp": 'yyyy"年"m"月"d"日"', "ko-kr": 'yyyy"년" mm"월" dd"일"' }, 32: { "zh-tw": 'hh"時"mm"分"', "zh-cn": 'h"时"mm"分"', "ja-jp": 'h"時"mm"分"', "ko-kr": 'h"시" mm"분"' }, 33: { "zh-tw": 'hh"時"mm"分"ss"秒"', "zh-cn": 'h"时"mm"分"ss"秒"', "ja-jp": 'h"時"mm"分"ss"秒"', "ko-kr": 'h"시" mm"분" ss"초"' }, 34: { "zh-tw": '上午/下午 hh"時"mm"分"', "zh-cn": '上午/下午 h"时"mm"分"', "ja-jp": 'yyyy"年"m"月"', "ko-kr": "yyyy-mm-dd" }, 35: { "zh-tw": '上午/下午 hh"時"mm"分"ss"秒"', "zh-cn": '上午/下午 h"时"mm"分"ss"秒"', "ja-jp": 'm"月"d"日"', "ko-kr": "yyyy-mm-dd" }, 36: { "zh-tw": "[$-404]e/m/d", "zh-cn": 'yyyy"年"m"月"', "ja-jp": "[$-411]ge.m.d", "ko-kr": 'yyyy"年" mm"月" dd"日"' }, 37: { f: "#,##0 ;(#,##0)" }, 38: { f: "#,##0 ;[Red](#,##0)" }, 39: { f: "#,##0.00 ;(#,##0.00)" }, 40: { f: "#,##0.00 ;[Red](#,##0.00)" }, 45: { f: "mm:ss" }, 46: { f: "[h]:mm:ss" }, 47: { f: "mmss.0" }, 48: { f: "##0.0E+0" }, 49: { f: "@" }, 50: { "zh-tw": "[$-404]e/m/d", "zh-cn": 'yyyy"年"m"月"', "ja-jp": "[$-411]ge.m.d", "ko-kr": 'yyyy"年" mm"月" dd"日"' }, 51: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 52: { "zh-tw": '上午/下午 hh"時"mm"分"', "zh-cn": 'yyyy"年"m"月"', "ja-jp": 'yyyy"年"m"月"', "ko-kr": "yyyy-mm-dd" }, 53: { "zh-tw": '上午/下午 hh"時"mm"分"ss"秒"', "zh-cn": 'm"月"d"日"', "ja-jp": 'm"月"d"日"', "ko-kr": "yyyy-mm-dd" }, 54: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 55: { "zh-tw": '上午/下午 hh"時"mm"分"', "zh-cn": '上午/下午 h"时"mm"分"', "ja-jp": 'yyyy"年"m"月"', "ko-kr": "yyyy-mm-dd" }, 56: { "zh-tw": '上午/下午 hh"時"mm"分"ss"秒"', "zh-cn": '上午/下午 h"时"mm"分"ss"秒"', "ja-jp": 'm"月"d"日"', "ko-kr": "yyyy-mm-dd" }, 57: { "zh-tw": "[$-404]e/m/d", "zh-cn": 'yyyy"年"m"月"', "ja-jp": "[$-411]ge.m.d", "ko-kr": 'yyyy"年" mm"月" dd"日"' }, 58: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 59: { "th-th": "t0" }, 60: { "th-th": "t0.00" }, 61: { "th-th": "t#,##0" }, 62: { "th-th": "t#,##0.00" }, 67: { "th-th": "t0%" }, 68: { "th-th": "t0.00%" }, 69: { "th-th": "t# ?/?" }, 70: { "th-th": "t# ??/??" }, 81: { "th-th": "d/m/bb" } };
  35625. }, {}], 31: [function(g, C, i) {
  35626. C.exports = { OfficeDocument: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", Worksheet: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet", CalcChain: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain", SharedStrings: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings", Styles: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles", Theme: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme", Hyperlink: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", Image: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", CoreProperties: "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties", ExtenderProperties: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties", Comments: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments", VmlDrawing: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing", Table: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/table" };
  35627. }, {}], 32: [function(g, C, i) {
  35628. const e = g("../../utils/parse-sax"), A = g("../../utils/xml-stream");
  35629. class s {
  35630. prepare() {
  35631. }
  35632. render() {
  35633. }
  35634. parseOpen(n) {
  35635. }
  35636. parseText(n) {
  35637. }
  35638. parseClose(n) {
  35639. }
  35640. reconcile(n, a) {
  35641. }
  35642. reset() {
  35643. this.model = null, this.map && Object.values(this.map).forEach((n) => {
  35644. n instanceof s ? n.reset() : n.xform && n.xform.reset();
  35645. });
  35646. }
  35647. mergeModel(n) {
  35648. this.model = Object.assign(this.model || {}, n);
  35649. }
  35650. async parse(n) {
  35651. for await (const a of n) for (const { eventType: d, value: o } of a) if (d === "opentag") this.parseOpen(o);
  35652. else if (d === "text") this.parseText(o);
  35653. else if (d === "closetag" && !this.parseClose(o.name)) return this.model;
  35654. return this.model;
  35655. }
  35656. async parseStream(n) {
  35657. return this.parse(e(n));
  35658. }
  35659. get xml() {
  35660. return this.toXml(this.model);
  35661. }
  35662. toXml(n) {
  35663. const a = new A();
  35664. return this.render(a, n), a.xml;
  35665. }
  35666. static toAttribute(n, a) {
  35667. let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
  35668. if (n === void 0) {
  35669. if (d) return a;
  35670. } else if (d || n !== a) return n.toString();
  35671. }
  35672. static toStringAttribute(n, a) {
  35673. let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
  35674. return s.toAttribute(n, a, d);
  35675. }
  35676. static toStringValue(n, a) {
  35677. return n === void 0 ? a : n;
  35678. }
  35679. static toBoolAttribute(n, a) {
  35680. let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
  35681. if (n === void 0) {
  35682. if (d) return a;
  35683. } else if (d || n !== a) return n ? "1" : "0";
  35684. }
  35685. static toBoolValue(n, a) {
  35686. return n === void 0 ? a : n === "1";
  35687. }
  35688. static toIntAttribute(n, a) {
  35689. let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
  35690. return s.toAttribute(n, a, d);
  35691. }
  35692. static toIntValue(n, a) {
  35693. return n === void 0 ? a : parseInt(n, 10);
  35694. }
  35695. static toFloatAttribute(n, a) {
  35696. let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
  35697. return s.toAttribute(n, a, d);
  35698. }
  35699. static toFloatValue(n, a) {
  35700. return n === void 0 ? a : parseFloat(n);
  35701. }
  35702. }
  35703. C.exports = s;
  35704. }, { "../../utils/parse-sax": 22, "../../utils/xml-stream": 28 }], 33: [function(g, C, i) {
  35705. const e = g("../base-xform"), A = g("../../../utils/col-cache");
  35706. function s(n) {
  35707. try {
  35708. return A.decodeEx(n), !0;
  35709. } catch {
  35710. return !1;
  35711. }
  35712. }
  35713. function l(n) {
  35714. const a = [];
  35715. let d = !1, o = "";
  35716. return n.split(",").forEach((c) => {
  35717. if (!c) return;
  35718. const r = (c.match(/'/g) || []).length;
  35719. if (!r) return void (d ? o += c + "," : s(c) && a.push(c));
  35720. const h = r % 2 == 0;
  35721. !d && h && s(c) ? a.push(c) : d && !h ? (d = !1, s(o + c) && a.push(o + c), o = "") : (d = !0, o += c + ",");
  35722. }), a;
  35723. }
  35724. C.exports = class extends e {
  35725. render(n, a) {
  35726. n.openNode("definedName", { name: a.name, localSheetId: a.localSheetId }), n.writeText(a.ranges.join(",")), n.closeNode();
  35727. }
  35728. parseOpen(n) {
  35729. switch (n.name) {
  35730. case "definedName":
  35731. return this._parsedName = n.attributes.name, this._parsedLocalSheetId = n.attributes.localSheetId, this._parsedText = [], !0;
  35732. default:
  35733. return !1;
  35734. }
  35735. }
  35736. parseText(n) {
  35737. this._parsedText.push(n);
  35738. }
  35739. parseClose() {
  35740. return this.model = { name: this._parsedName, ranges: l(this._parsedText.join("")) }, this._parsedLocalSheetId !== void 0 && (this.model.localSheetId = parseInt(this._parsedLocalSheetId, 10)), !1;
  35741. }
  35742. };
  35743. }, { "../../../utils/col-cache": 19, "../base-xform": 32 }], 34: [function(g, C, i) {
  35744. const e = g("../../../utils/utils"), A = g("../base-xform");
  35745. C.exports = class extends A {
  35746. render(s, l) {
  35747. s.leafNode("sheet", { sheetId: l.id, name: l.name, state: l.state, "r:id": l.rId });
  35748. }
  35749. parseOpen(s) {
  35750. return s.name === "sheet" && (this.model = { name: e.xmlDecode(s.attributes.name), id: parseInt(s.attributes.sheetId, 10), state: s.attributes.state, rId: s.attributes["r:id"] }, !0);
  35751. }
  35752. parseText() {
  35753. }
  35754. parseClose() {
  35755. return !1;
  35756. }
  35757. };
  35758. }, { "../../../utils/utils": 27, "../base-xform": 32 }], 35: [function(g, C, i) {
  35759. const e = g("../base-xform");
  35760. C.exports = class extends e {
  35761. render(A, s) {
  35762. A.leafNode("calcPr", { calcId: 171027, fullCalcOnLoad: s.fullCalcOnLoad ? 1 : void 0 });
  35763. }
  35764. parseOpen(A) {
  35765. return A.name === "calcPr" && (this.model = {}, !0);
  35766. }
  35767. parseText() {
  35768. }
  35769. parseClose() {
  35770. return !1;
  35771. }
  35772. };
  35773. }, { "../base-xform": 32 }], 36: [function(g, C, i) {
  35774. const e = g("../base-xform");
  35775. C.exports = class extends e {
  35776. render(A, s) {
  35777. A.leafNode("workbookPr", { date1904: s.date1904 ? 1 : void 0, defaultThemeVersion: 164011, filterPrivacy: 1 });
  35778. }
  35779. parseOpen(A) {
  35780. return A.name === "workbookPr" && (this.model = { date1904: A.attributes.date1904 === "1" }, !0);
  35781. }
  35782. parseText() {
  35783. }
  35784. parseClose() {
  35785. return !1;
  35786. }
  35787. };
  35788. }, { "../base-xform": 32 }], 37: [function(g, C, i) {
  35789. const e = g("../base-xform");
  35790. C.exports = class extends e {
  35791. render(A, s) {
  35792. const l = { xWindow: s.x || 0, yWindow: s.y || 0, windowWidth: s.width || 12e3, windowHeight: s.height || 24e3, firstSheet: s.firstSheet, activeTab: s.activeTab };
  35793. s.visibility && s.visibility !== "visible" && (l.visibility = s.visibility), A.leafNode("workbookView", l);
  35794. }
  35795. parseOpen(A) {
  35796. if (A.name === "workbookView") {
  35797. const s = this.model = {}, l = function(a, d, o) {
  35798. const c = d !== void 0 ? s[a] = d : o;
  35799. c !== void 0 && (s[a] = c);
  35800. }, n = function(a, d, o) {
  35801. const c = d !== void 0 ? s[a] = parseInt(d, 10) : o;
  35802. c !== void 0 && (s[a] = c);
  35803. };
  35804. return n("x", A.attributes.xWindow, 0), n("y", A.attributes.yWindow, 0), n("width", A.attributes.windowWidth, 25e3), n("height", A.attributes.windowHeight, 1e4), l("visibility", A.attributes.visibility, "visible"), n("activeTab", A.attributes.activeTab, void 0), n("firstSheet", A.attributes.firstSheet, void 0), !0;
  35805. }
  35806. return !1;
  35807. }
  35808. parseText() {
  35809. }
  35810. parseClose() {
  35811. return !1;
  35812. }
  35813. };
  35814. }, { "../base-xform": 32 }], 38: [function(g, C, i) {
  35815. const e = g("../../../utils/under-dash"), A = g("../../../utils/col-cache"), s = g("../../../utils/xml-stream"), l = g("../base-xform"), n = g("../static-xform"), a = g("../list-xform"), d = g("./defined-name-xform"), o = g("./sheet-xform"), c = g("./workbook-view-xform"), r = g("./workbook-properties-xform"), h = g("./workbook-calc-properties-xform");
  35816. class b extends l {
  35817. constructor() {
  35818. super(), this.map = { fileVersion: b.STATIC_XFORMS.fileVersion, workbookPr: new r(), bookViews: new a({ tag: "bookViews", count: !1, childXform: new c() }), sheets: new a({ tag: "sheets", count: !1, childXform: new o() }), definedNames: new a({ tag: "definedNames", count: !1, childXform: new d() }), calcPr: new h() };
  35819. }
  35820. prepare(m) {
  35821. m.sheets = m.worksheets;
  35822. const Z = [];
  35823. let p = 0;
  35824. m.sheets.forEach((Y) => {
  35825. if (Y.pageSetup && Y.pageSetup.printArea && Y.pageSetup.printArea.split("&&").forEach((R) => {
  35826. const X = R.split(":"), H = { name: "_xlnm.Print_Area", ranges: [`'${Y.name}'!$${X[0]}:$${X[1]}`], localSheetId: p };
  35827. Z.push(H);
  35828. }), Y.pageSetup && (Y.pageSetup.printTitlesRow || Y.pageSetup.printTitlesColumn)) {
  35829. const R = [];
  35830. if (Y.pageSetup.printTitlesColumn) {
  35831. const H = Y.pageSetup.printTitlesColumn.split(":");
  35832. R.push(`'${Y.name}'!$${H[0]}:$${H[1]}`);
  35833. }
  35834. if (Y.pageSetup.printTitlesRow) {
  35835. const H = Y.pageSetup.printTitlesRow.split(":");
  35836. R.push(`'${Y.name}'!$${H[0]}:$${H[1]}`);
  35837. }
  35838. const X = { name: "_xlnm.Print_Titles", ranges: R, localSheetId: p };
  35839. Z.push(X);
  35840. }
  35841. p++;
  35842. }), Z.length && (m.definedNames = m.definedNames.concat(Z)), (m.media || []).forEach((Y, R) => {
  35843. Y.name = Y.type + (R + 1);
  35844. });
  35845. }
  35846. render(m, Z) {
  35847. m.openXml(s.StdDocAttributes), m.openNode("workbook", b.WORKBOOK_ATTRIBUTES), this.map.fileVersion.render(m), this.map.workbookPr.render(m, Z.properties), this.map.bookViews.render(m, Z.views), this.map.sheets.render(m, Z.sheets), this.map.definedNames.render(m, Z.definedNames), this.map.calcPr.render(m, Z.calcProperties), m.closeNode();
  35848. }
  35849. parseOpen(m) {
  35850. if (this.parser) return this.parser.parseOpen(m), !0;
  35851. switch (m.name) {
  35852. case "workbook":
  35853. return !0;
  35854. default:
  35855. return this.parser = this.map[m.name], this.parser && this.parser.parseOpen(m), !0;
  35856. }
  35857. }
  35858. parseText(m) {
  35859. this.parser && this.parser.parseText(m);
  35860. }
  35861. parseClose(m) {
  35862. if (this.parser) return this.parser.parseClose(m) || (this.parser = void 0), !0;
  35863. switch (m) {
  35864. case "workbook":
  35865. return this.model = { sheets: this.map.sheets.model, properties: this.map.workbookPr.model || {}, views: this.map.bookViews.model, calcProperties: {} }, this.map.definedNames.model && (this.model.definedNames = this.map.definedNames.model), !1;
  35866. default:
  35867. return !0;
  35868. }
  35869. }
  35870. reconcile(m) {
  35871. const Z = (m.workbookRels || []).reduce((H, S) => (H[S.Id] = S, H), {}), p = [];
  35872. let Y, R = 0;
  35873. (m.sheets || []).forEach((H) => {
  35874. const S = Z[H.rId];
  35875. S && (Y = m.worksheetHash["xl/" + S.Target.replace(/^(\s|\/xl\/)+/, "")], Y && (Y.name = H.name, Y.id = H.id, Y.state = H.state, p[R++] = Y));
  35876. });
  35877. const X = [];
  35878. e.each(m.definedNames, (H) => {
  35879. if (H.name === "_xlnm.Print_Area") {
  35880. if (Y = p[H.localSheetId], Y) {
  35881. Y.pageSetup || (Y.pageSetup = {});
  35882. const S = A.decodeEx(H.ranges[0]);
  35883. Y.pageSetup.printArea = Y.pageSetup.printArea ? `${Y.pageSetup.printArea}&&${S.dimensions}` : S.dimensions;
  35884. }
  35885. } else if (H.name === "_xlnm.Print_Titles") {
  35886. if (Y = p[H.localSheetId], Y) {
  35887. Y.pageSetup || (Y.pageSetup = {});
  35888. const S = H.ranges.join(","), z = /\$/g, v = /\$\d+:\$\d+/, K = S.match(v);
  35889. if (K && K.length) {
  35890. const B = K[0];
  35891. Y.pageSetup.printTitlesRow = B.replace(z, "");
  35892. }
  35893. const V = /\$[A-Z]+:\$[A-Z]+/, N = S.match(V);
  35894. if (N && N.length) {
  35895. const B = N[0];
  35896. Y.pageSetup.printTitlesColumn = B.replace(z, "");
  35897. }
  35898. }
  35899. } else X.push(H);
  35900. }), m.definedNames = X, m.media.forEach((H, S) => {
  35901. H.index = S;
  35902. });
  35903. }
  35904. }
  35905. b.WORKBOOK_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", "xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006", "mc:Ignorable": "x15", "xmlns:x15": "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main" }, b.STATIC_XFORMS = { fileVersion: new n({ tag: "fileVersion", $: { appName: "xl", lastEdited: 5, lowestEdited: 5, rupBuild: 9303 } }) }, C.exports = b;
  35906. }, { "../../../utils/col-cache": 19, "../../../utils/under-dash": 26, "../../../utils/xml-stream": 28, "../base-xform": 32, "../list-xform": 71, "../static-xform": 120, "./defined-name-xform": 33, "./sheet-xform": 34, "./workbook-calc-properties-xform": 35, "./workbook-properties-xform": 36, "./workbook-view-xform": 37 }], 39: [function(g, C, i) {
  35907. const e = g("../strings/rich-text-xform"), A = g("../../../utils/utils"), s = g("../base-xform"), l = C.exports = function(n) {
  35908. this.model = n;
  35909. };
  35910. A.inherits(l, s, { get tag() {
  35911. return "r";
  35912. }, get richTextXform() {
  35913. return this._richTextXform || (this._richTextXform = new e()), this._richTextXform;
  35914. }, render(n, a) {
  35915. a = a || this.model, n.openNode("comment", { ref: a.ref, authorId: 0 }), n.openNode("text"), a && a.note && a.note.texts && a.note.texts.forEach((d) => {
  35916. this.richTextXform.render(n, d);
  35917. }), n.closeNode(), n.closeNode();
  35918. }, parseOpen(n) {
  35919. if (this.parser) return this.parser.parseOpen(n), !0;
  35920. switch (n.name) {
  35921. case "comment":
  35922. return this.model = { type: "note", note: { texts: [] }, ...n.attributes }, !0;
  35923. case "r":
  35924. return this.parser = this.richTextXform, this.parser.parseOpen(n), !0;
  35925. default:
  35926. return !1;
  35927. }
  35928. }, parseText(n) {
  35929. this.parser && this.parser.parseText(n);
  35930. }, parseClose(n) {
  35931. switch (n) {
  35932. case "comment":
  35933. return !1;
  35934. case "r":
  35935. return this.model.note.texts.push(this.parser.model), this.parser = void 0, !0;
  35936. default:
  35937. return this.parser && this.parser.parseClose(n), !0;
  35938. }
  35939. } });
  35940. }, { "../../../utils/utils": 27, "../base-xform": 32, "../strings/rich-text-xform": 122 }], 40: [function(g, C, i) {
  35941. const e = g("../../../utils/xml-stream"), A = g("../../../utils/utils"), s = g("../base-xform"), l = g("./comment-xform"), n = C.exports = function() {
  35942. this.map = { comment: new l() };
  35943. };
  35944. A.inherits(n, s, { COMMENTS_ATTRIBUTES: { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main" } }, { render(a, d) {
  35945. d = d || this.model, a.openXml(e.StdDocAttributes), a.openNode("comments", n.COMMENTS_ATTRIBUTES), a.openNode("authors"), a.leafNode("author", null, "Author"), a.closeNode(), a.openNode("commentList"), d.comments.forEach((o) => {
  35946. this.map.comment.render(a, o);
  35947. }), a.closeNode(), a.closeNode();
  35948. }, parseOpen(a) {
  35949. if (this.parser) return this.parser.parseOpen(a), !0;
  35950. switch (a.name) {
  35951. case "commentList":
  35952. return this.model = { comments: [] }, !0;
  35953. case "comment":
  35954. return this.parser = this.map.comment, this.parser.parseOpen(a), !0;
  35955. default:
  35956. return !1;
  35957. }
  35958. }, parseText(a) {
  35959. this.parser && this.parser.parseText(a);
  35960. }, parseClose(a) {
  35961. switch (a) {
  35962. case "commentList":
  35963. return !1;
  35964. case "comment":
  35965. return this.model.comments.push(this.parser.model), this.parser = void 0, !0;
  35966. default:
  35967. return this.parser && this.parser.parseClose(a), !0;
  35968. }
  35969. } });
  35970. }, { "../../../utils/utils": 27, "../../../utils/xml-stream": 28, "../base-xform": 32, "./comment-xform": 39 }], 41: [function(g, C, i) {
  35971. const e = g("../../base-xform");
  35972. C.exports = class extends e {
  35973. constructor(A) {
  35974. super(), this._model = A;
  35975. }
  35976. get tag() {
  35977. return this._model && this._model.tag;
  35978. }
  35979. render(A, s, l) {
  35980. (s === l[2] || this.tag === "x:SizeWithCells" && s === l[1]) && A.leafNode(this.tag);
  35981. }
  35982. parseOpen(A) {
  35983. switch (A.name) {
  35984. case this.tag:
  35985. return this.model = {}, this.model[this.tag] = !0, !0;
  35986. default:
  35987. return !1;
  35988. }
  35989. }
  35990. parseText() {
  35991. }
  35992. parseClose() {
  35993. return !1;
  35994. }
  35995. };
  35996. }, { "../../base-xform": 32 }], 42: [function(g, C, i) {
  35997. const e = g("../../base-xform");
  35998. C.exports = class extends e {
  35999. constructor(A) {
  36000. super(), this._model = A;
  36001. }
  36002. get tag() {
  36003. return this._model && this._model.tag;
  36004. }
  36005. render(A, s) {
  36006. A.leafNode(this.tag, null, s);
  36007. }
  36008. parseOpen(A) {
  36009. switch (A.name) {
  36010. case this.tag:
  36011. return this.text = "", !0;
  36012. default:
  36013. return !1;
  36014. }
  36015. }
  36016. parseText(A) {
  36017. this.text = A;
  36018. }
  36019. parseClose() {
  36020. return !1;
  36021. }
  36022. };
  36023. }, { "../../base-xform": 32 }], 43: [function(g, C, i) {
  36024. const e = g("../base-xform");
  36025. C.exports = class extends e {
  36026. get tag() {
  36027. return "x:Anchor";
  36028. }
  36029. getAnchorRect(A) {
  36030. const s = Math.floor(A.left), l = Math.floor(68 * (A.left - s)), n = Math.floor(A.top), a = Math.floor(18 * (A.top - n)), d = Math.floor(A.right), o = Math.floor(68 * (A.right - d)), c = Math.floor(A.bottom);
  36031. return [s, l, n, a, d, o, c, Math.floor(18 * (A.bottom - c))];
  36032. }
  36033. getDefaultRect(A) {
  36034. const s = A.col, l = Math.max(A.row - 2, 0);
  36035. return [s, 6, l, 14, s + 2, 2, l + 4, 16];
  36036. }
  36037. render(A, s) {
  36038. const l = s.anchor ? this.getAnchorRect(s.anchor) : this.getDefaultRect(s.refAddress);
  36039. A.leafNode("x:Anchor", null, l.join(", "));
  36040. }
  36041. parseOpen(A) {
  36042. switch (A.name) {
  36043. case this.tag:
  36044. return this.text = "", !0;
  36045. default:
  36046. return !1;
  36047. }
  36048. }
  36049. parseText(A) {
  36050. this.text = A;
  36051. }
  36052. parseClose() {
  36053. return !1;
  36054. }
  36055. };
  36056. }, { "../base-xform": 32 }], 44: [function(g, C, i) {
  36057. const e = g("../base-xform"), A = g("./vml-anchor-xform"), s = g("./style/vml-protection-xform"), l = g("./style/vml-position-xform"), n = ["twoCells", "oneCells", "absolute"];
  36058. C.exports = class extends e {
  36059. constructor() {
  36060. super(), this.map = { "x:Anchor": new A(), "x:Locked": new s({ tag: "x:Locked" }), "x:LockText": new s({ tag: "x:LockText" }), "x:SizeWithCells": new l({ tag: "x:SizeWithCells" }), "x:MoveWithCells": new l({ tag: "x:MoveWithCells" }) };
  36061. }
  36062. get tag() {
  36063. return "x:ClientData";
  36064. }
  36065. render(a, d) {
  36066. const { protection: o, editAs: c } = d.note;
  36067. a.openNode(this.tag, { ObjectType: "Note" }), this.map["x:MoveWithCells"].render(a, c, n), this.map["x:SizeWithCells"].render(a, c, n), this.map["x:Anchor"].render(a, d), this.map["x:Locked"].render(a, o.locked), a.leafNode("x:AutoFill", null, "False"), this.map["x:LockText"].render(a, o.lockText), a.leafNode("x:Row", null, d.refAddress.row - 1), a.leafNode("x:Column", null, d.refAddress.col - 1), a.closeNode();
  36068. }
  36069. parseOpen(a) {
  36070. switch (a.name) {
  36071. case this.tag:
  36072. this.reset(), this.model = { anchor: [], protection: {}, editAs: "" };
  36073. break;
  36074. default:
  36075. this.parser = this.map[a.name], this.parser && this.parser.parseOpen(a);
  36076. }
  36077. return !0;
  36078. }
  36079. parseText(a) {
  36080. this.parser && this.parser.parseText(a);
  36081. }
  36082. parseClose(a) {
  36083. if (this.parser) return this.parser.parseClose(a) || (this.parser = void 0), !0;
  36084. switch (a) {
  36085. case this.tag:
  36086. return this.normalizeModel(), !1;
  36087. default:
  36088. return !0;
  36089. }
  36090. }
  36091. normalizeModel() {
  36092. const a = Object.assign({}, this.map["x:MoveWithCells"].model, this.map["x:SizeWithCells"].model), d = Object.keys(a).length;
  36093. this.model.editAs = n[d], this.model.anchor = this.map["x:Anchor"].text, this.model.protection.locked = this.map["x:Locked"].text, this.model.protection.lockText = this.map["x:LockText"].text;
  36094. }
  36095. };
  36096. }, { "../base-xform": 32, "./style/vml-position-xform": 41, "./style/vml-protection-xform": 42, "./vml-anchor-xform": 43 }], 45: [function(g, C, i) {
  36097. const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("./vml-shape-xform");
  36098. class l extends A {
  36099. constructor() {
  36100. super(), this.map = { "v:shape": new s() };
  36101. }
  36102. get tag() {
  36103. return "xml";
  36104. }
  36105. render(a, d) {
  36106. a.openXml(e.StdDocAttributes), a.openNode(this.tag, l.DRAWING_ATTRIBUTES), a.openNode("o:shapelayout", { "v:ext": "edit" }), a.leafNode("o:idmap", { "v:ext": "edit", data: 1 }), a.closeNode(), a.openNode("v:shapetype", { id: "_x0000_t202", coordsize: "21600,21600", "o:spt": 202, path: "m,l,21600r21600,l21600,xe" }), a.leafNode("v:stroke", { joinstyle: "miter" }), a.leafNode("v:path", { gradientshapeok: "t", "o:connecttype": "rect" }), a.closeNode(), d.comments.forEach((o, c) => {
  36107. this.map["v:shape"].render(a, o, c);
  36108. }), a.closeNode();
  36109. }
  36110. parseOpen(a) {
  36111. if (this.parser) return this.parser.parseOpen(a), !0;
  36112. switch (a.name) {
  36113. case this.tag:
  36114. this.reset(), this.model = { comments: [] };
  36115. break;
  36116. default:
  36117. this.parser = this.map[a.name], this.parser && this.parser.parseOpen(a);
  36118. }
  36119. return !0;
  36120. }
  36121. parseText(a) {
  36122. this.parser && this.parser.parseText(a);
  36123. }
  36124. parseClose(a) {
  36125. if (this.parser) return this.parser.parseClose(a) || (this.model.comments.push(this.parser.model), this.parser = void 0), !0;
  36126. switch (a) {
  36127. case this.tag:
  36128. return !1;
  36129. default:
  36130. return !0;
  36131. }
  36132. }
  36133. reconcile(a, d) {
  36134. a.anchors.forEach((o) => {
  36135. o.br ? this.map["xdr:twoCellAnchor"].reconcile(o, d) : this.map["xdr:oneCellAnchor"].reconcile(o, d);
  36136. });
  36137. }
  36138. }
  36139. l.DRAWING_ATTRIBUTES = { "xmlns:v": "urn:schemas-microsoft-com:vml", "xmlns:o": "urn:schemas-microsoft-com:office:office", "xmlns:x": "urn:schemas-microsoft-com:office:excel" }, C.exports = l;
  36140. }, { "../../../utils/xml-stream": 28, "../base-xform": 32, "./vml-shape-xform": 46 }], 46: [function(g, C, i) {
  36141. const e = g("../base-xform"), A = g("./vml-textbox-xform"), s = g("./vml-client-data-xform");
  36142. class l extends e {
  36143. constructor() {
  36144. super(), this.map = { "v:textbox": new A(), "x:ClientData": new s() };
  36145. }
  36146. get tag() {
  36147. return "v:shape";
  36148. }
  36149. render(a, d, o) {
  36150. a.openNode("v:shape", l.V_SHAPE_ATTRIBUTES(d, o)), a.leafNode("v:fill", { color2: "infoBackground [80]" }), a.leafNode("v:shadow", { color: "none [81]", obscured: "t" }), a.leafNode("v:path", { "o:connecttype": "none" }), this.map["v:textbox"].render(a, d), this.map["x:ClientData"].render(a, d), a.closeNode();
  36151. }
  36152. parseOpen(a) {
  36153. if (this.parser) return this.parser.parseOpen(a), !0;
  36154. switch (a.name) {
  36155. case this.tag:
  36156. this.reset(), this.model = { margins: { insetmode: a.attributes["o:insetmode"] }, anchor: "", editAs: "", protection: {} };
  36157. break;
  36158. default:
  36159. this.parser = this.map[a.name], this.parser && this.parser.parseOpen(a);
  36160. }
  36161. return !0;
  36162. }
  36163. parseText(a) {
  36164. this.parser && this.parser.parseText(a);
  36165. }
  36166. parseClose(a) {
  36167. if (this.parser) return this.parser.parseClose(a) || (this.parser = void 0), !0;
  36168. switch (a) {
  36169. case this.tag:
  36170. return this.model.margins.inset = this.map["v:textbox"].model && this.map["v:textbox"].model.inset, this.model.protection = this.map["x:ClientData"].model && this.map["x:ClientData"].model.protection, this.model.anchor = this.map["x:ClientData"].model && this.map["x:ClientData"].model.anchor, this.model.editAs = this.map["x:ClientData"].model && this.map["x:ClientData"].model.editAs, !1;
  36171. default:
  36172. return !0;
  36173. }
  36174. }
  36175. }
  36176. l.V_SHAPE_ATTRIBUTES = (n, a) => ({ id: "_x0000_s" + (1025 + a), type: "#_x0000_t202", style: "position:absolute; margin-left:105.3pt;margin-top:10.5pt;width:97.8pt;height:59.1pt;z-index:1;visibility:hidden", fillcolor: "infoBackground [80]", strokecolor: "none [81]", "o:insetmode": n.note.margins && n.note.margins.insetmode }), C.exports = l;
  36177. }, { "../base-xform": 32, "./vml-client-data-xform": 44, "./vml-textbox-xform": 47 }], 47: [function(g, C, i) {
  36178. const e = g("../base-xform");
  36179. C.exports = class extends e {
  36180. get tag() {
  36181. return "v:textbox";
  36182. }
  36183. conversionUnit(A, s, l) {
  36184. return `${parseFloat(A) * s.toFixed(2)}${l}`;
  36185. }
  36186. reverseConversionUnit(A) {
  36187. return (A || "").split(",").map((s) => Number(parseFloat(this.conversionUnit(parseFloat(s), 0.1, "")).toFixed(2)));
  36188. }
  36189. render(A, s) {
  36190. const l = { style: "mso-direction-alt:auto" };
  36191. if (s && s.note) {
  36192. let { inset: n } = s.note && s.note.margins;
  36193. Array.isArray(n) && (n = n.map((a) => this.conversionUnit(a, 10, "mm")).join(",")), n && (l.inset = n);
  36194. }
  36195. A.openNode("v:textbox", l), A.leafNode("div", { style: "text-align:left" }), A.closeNode();
  36196. }
  36197. parseOpen(A) {
  36198. switch (A.name) {
  36199. case this.tag:
  36200. return this.model = { inset: this.reverseConversionUnit(A.attributes.inset) }, !0;
  36201. default:
  36202. return !0;
  36203. }
  36204. }
  36205. parseText() {
  36206. }
  36207. parseClose(A) {
  36208. switch (A) {
  36209. case this.tag:
  36210. return !1;
  36211. default:
  36212. return !0;
  36213. }
  36214. }
  36215. };
  36216. }, { "../base-xform": 32 }], 48: [function(g, C, i) {
  36217. const e = g("./base-xform");
  36218. C.exports = class extends e {
  36219. createNewModel(A) {
  36220. return {};
  36221. }
  36222. parseOpen(A) {
  36223. return this.parser = this.parser || this.map[A.name], this.parser ? (this.parser.parseOpen(A), !0) : A.name === this.tag && (this.model = this.createNewModel(A), !0);
  36224. }
  36225. parseText(A) {
  36226. this.parser && this.parser.parseText(A);
  36227. }
  36228. onParserClose(A, s) {
  36229. this.model[A] = s.model;
  36230. }
  36231. parseClose(A) {
  36232. return this.parser ? (this.parser.parseClose(A) || (this.onParserClose(A, this.parser), this.parser = void 0), !0) : A !== this.tag;
  36233. }
  36234. };
  36235. }, { "./base-xform": 32 }], 49: [function(g, C, i) {
  36236. const e = g("../base-xform");
  36237. C.exports = class extends e {
  36238. render(A, s) {
  36239. A.openNode("HeadingPairs"), A.openNode("vt:vector", { size: 2, baseType: "variant" }), A.openNode("vt:variant"), A.leafNode("vt:lpstr", void 0, "Worksheets"), A.closeNode(), A.openNode("vt:variant"), A.leafNode("vt:i4", void 0, s.length), A.closeNode(), A.closeNode(), A.closeNode();
  36240. }
  36241. parseOpen(A) {
  36242. return A.name === "HeadingPairs";
  36243. }
  36244. parseText() {
  36245. }
  36246. parseClose(A) {
  36247. return A !== "HeadingPairs";
  36248. }
  36249. };
  36250. }, { "../base-xform": 32 }], 50: [function(g, C, i) {
  36251. const e = g("../base-xform");
  36252. C.exports = class extends e {
  36253. render(A, s) {
  36254. A.openNode("TitlesOfParts"), A.openNode("vt:vector", { size: s.length, baseType: "lpstr" }), s.forEach((l) => {
  36255. A.leafNode("vt:lpstr", void 0, l.name);
  36256. }), A.closeNode(), A.closeNode();
  36257. }
  36258. parseOpen(A) {
  36259. return A.name === "TitlesOfParts";
  36260. }
  36261. parseText() {
  36262. }
  36263. parseClose(A) {
  36264. return A !== "TitlesOfParts";
  36265. }
  36266. };
  36267. }, { "../base-xform": 32 }], 51: [function(g, C, i) {
  36268. const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("../simple/string-xform"), l = g("./app-heading-pairs-xform"), n = g("./app-titles-of-parts-xform");
  36269. class a extends A {
  36270. constructor() {
  36271. super(), this.map = { Company: new s({ tag: "Company" }), Manager: new s({ tag: "Manager" }), HeadingPairs: new l(), TitleOfParts: new n() };
  36272. }
  36273. render(o, c) {
  36274. o.openXml(e.StdDocAttributes), o.openNode("Properties", a.PROPERTY_ATTRIBUTES), o.leafNode("Application", void 0, "Microsoft Excel"), o.leafNode("DocSecurity", void 0, "0"), o.leafNode("ScaleCrop", void 0, "false"), this.map.HeadingPairs.render(o, c.worksheets), this.map.TitleOfParts.render(o, c.worksheets), this.map.Company.render(o, c.company || ""), this.map.Manager.render(o, c.manager), o.leafNode("LinksUpToDate", void 0, "false"), o.leafNode("SharedDoc", void 0, "false"), o.leafNode("HyperlinksChanged", void 0, "false"), o.leafNode("AppVersion", void 0, "16.0300"), o.closeNode();
  36275. }
  36276. parseOpen(o) {
  36277. if (this.parser) return this.parser.parseOpen(o), !0;
  36278. switch (o.name) {
  36279. case "Properties":
  36280. return !0;
  36281. default:
  36282. return this.parser = this.map[o.name], !!this.parser && (this.parser.parseOpen(o), !0);
  36283. }
  36284. }
  36285. parseText(o) {
  36286. this.parser && this.parser.parseText(o);
  36287. }
  36288. parseClose(o) {
  36289. if (this.parser) return this.parser.parseClose(o) || (this.parser = void 0), !0;
  36290. switch (o) {
  36291. case "Properties":
  36292. return this.model = { worksheets: this.map.TitleOfParts.model, company: this.map.Company.model, manager: this.map.Manager.model }, !1;
  36293. default:
  36294. return !0;
  36295. }
  36296. }
  36297. }
  36298. a.DateFormat = function(d) {
  36299. return d.toISOString().replace(/[.]\d{3,6}/, "");
  36300. }, a.DateAttrs = { "xsi:type": "dcterms:W3CDTF" }, a.PROPERTY_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties", "xmlns:vt": "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" }, C.exports = a;
  36301. }, { "../../../utils/xml-stream": 28, "../base-xform": 32, "../simple/string-xform": 119, "./app-heading-pairs-xform": 49, "./app-titles-of-parts-xform": 50 }], 52: [function(g, C, i) {
  36302. const e = g("../../../utils/xml-stream"), A = g("../base-xform");
  36303. class s extends A {
  36304. render(n, a) {
  36305. n.openXml(e.StdDocAttributes), n.openNode("Types", s.PROPERTY_ATTRIBUTES);
  36306. const d = {};
  36307. (a.media || []).forEach((o) => {
  36308. if (o.type === "image") {
  36309. const c = o.extension;
  36310. d[c] || (d[c] = !0, n.leafNode("Default", { Extension: c, ContentType: "image/" + c }));
  36311. }
  36312. }), n.leafNode("Default", { Extension: "rels", ContentType: "application/vnd.openxmlformats-package.relationships+xml" }), n.leafNode("Default", { Extension: "xml", ContentType: "application/xml" }), n.leafNode("Override", { PartName: "/xl/workbook.xml", ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" }), a.worksheets.forEach((o) => {
  36313. const c = `/xl/worksheets/sheet${o.id}.xml`;
  36314. n.leafNode("Override", { PartName: c, ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" });
  36315. }), n.leafNode("Override", { PartName: "/xl/theme/theme1.xml", ContentType: "application/vnd.openxmlformats-officedocument.theme+xml" }), n.leafNode("Override", { PartName: "/xl/styles.xml", ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" }), a.sharedStrings && a.sharedStrings.count && n.leafNode("Override", { PartName: "/xl/sharedStrings.xml", ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" }), a.tables && a.tables.forEach((o) => {
  36316. n.leafNode("Override", { PartName: "/xl/tables/" + o.target, ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml" });
  36317. }), a.drawings && a.drawings.forEach((o) => {
  36318. n.leafNode("Override", { PartName: `/xl/drawings/${o.name}.xml`, ContentType: "application/vnd.openxmlformats-officedocument.drawing+xml" });
  36319. }), a.commentRefs && (n.leafNode("Default", { Extension: "vml", ContentType: "application/vnd.openxmlformats-officedocument.vmlDrawing" }), a.commentRefs.forEach((o) => {
  36320. let { commentName: c } = o;
  36321. n.leafNode("Override", { PartName: `/xl/${c}.xml`, ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml" });
  36322. })), n.leafNode("Override", { PartName: "/docProps/core.xml", ContentType: "application/vnd.openxmlformats-package.core-properties+xml" }), n.leafNode("Override", { PartName: "/docProps/app.xml", ContentType: "application/vnd.openxmlformats-officedocument.extended-properties+xml" }), n.closeNode();
  36323. }
  36324. parseOpen() {
  36325. return !1;
  36326. }
  36327. parseText() {
  36328. }
  36329. parseClose() {
  36330. return !1;
  36331. }
  36332. }
  36333. s.PROPERTY_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/package/2006/content-types" }, C.exports = s;
  36334. }, { "../../../utils/xml-stream": 28, "../base-xform": 32 }], 53: [function(g, C, i) {
  36335. const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("../simple/date-xform"), l = g("../simple/string-xform"), n = g("../simple/integer-xform");
  36336. class a extends A {
  36337. constructor() {
  36338. super(), this.map = { "dc:creator": new l({ tag: "dc:creator" }), "dc:title": new l({ tag: "dc:title" }), "dc:subject": new l({ tag: "dc:subject" }), "dc:description": new l({ tag: "dc:description" }), "dc:identifier": new l({ tag: "dc:identifier" }), "dc:language": new l({ tag: "dc:language" }), "cp:keywords": new l({ tag: "cp:keywords" }), "cp:category": new l({ tag: "cp:category" }), "cp:lastModifiedBy": new l({ tag: "cp:lastModifiedBy" }), "cp:lastPrinted": new s({ tag: "cp:lastPrinted", format: a.DateFormat }), "cp:revision": new n({ tag: "cp:revision" }), "cp:version": new l({ tag: "cp:version" }), "cp:contentStatus": new l({ tag: "cp:contentStatus" }), "cp:contentType": new l({ tag: "cp:contentType" }), "dcterms:created": new s({ tag: "dcterms:created", attrs: a.DateAttrs, format: a.DateFormat }), "dcterms:modified": new s({ tag: "dcterms:modified", attrs: a.DateAttrs, format: a.DateFormat }) };
  36339. }
  36340. render(o, c) {
  36341. o.openXml(e.StdDocAttributes), o.openNode("cp:coreProperties", a.CORE_PROPERTY_ATTRIBUTES), this.map["dc:creator"].render(o, c.creator), this.map["dc:title"].render(o, c.title), this.map["dc:subject"].render(o, c.subject), this.map["dc:description"].render(o, c.description), this.map["dc:identifier"].render(o, c.identifier), this.map["dc:language"].render(o, c.language), this.map["cp:keywords"].render(o, c.keywords), this.map["cp:category"].render(o, c.category), this.map["cp:lastModifiedBy"].render(o, c.lastModifiedBy), this.map["cp:lastPrinted"].render(o, c.lastPrinted), this.map["cp:revision"].render(o, c.revision), this.map["cp:version"].render(o, c.version), this.map["cp:contentStatus"].render(o, c.contentStatus), this.map["cp:contentType"].render(o, c.contentType), this.map["dcterms:created"].render(o, c.created), this.map["dcterms:modified"].render(o, c.modified), o.closeNode();
  36342. }
  36343. parseOpen(o) {
  36344. if (this.parser) return this.parser.parseOpen(o), !0;
  36345. switch (o.name) {
  36346. case "cp:coreProperties":
  36347. case "coreProperties":
  36348. return !0;
  36349. default:
  36350. if (this.parser = this.map[o.name], this.parser) return this.parser.parseOpen(o), !0;
  36351. throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(o));
  36352. }
  36353. }
  36354. parseText(o) {
  36355. this.parser && this.parser.parseText(o);
  36356. }
  36357. parseClose(o) {
  36358. if (this.parser) return this.parser.parseClose(o) || (this.parser = void 0), !0;
  36359. switch (o) {
  36360. case "cp:coreProperties":
  36361. case "coreProperties":
  36362. return this.model = { creator: this.map["dc:creator"].model, title: this.map["dc:title"].model, subject: this.map["dc:subject"].model, description: this.map["dc:description"].model, identifier: this.map["dc:identifier"].model, language: this.map["dc:language"].model, keywords: this.map["cp:keywords"].model, category: this.map["cp:category"].model, lastModifiedBy: this.map["cp:lastModifiedBy"].model, lastPrinted: this.map["cp:lastPrinted"].model, revision: this.map["cp:revision"].model, contentStatus: this.map["cp:contentStatus"].model, contentType: this.map["cp:contentType"].model, created: this.map["dcterms:created"].model, modified: this.map["dcterms:modified"].model }, !1;
  36363. default:
  36364. throw new Error("Unexpected xml node in parseClose: " + o);
  36365. }
  36366. }
  36367. }
  36368. a.DateFormat = function(d) {
  36369. return d.toISOString().replace(/[.]\d{3}/, "");
  36370. }, a.DateAttrs = { "xsi:type": "dcterms:W3CDTF" }, a.CORE_PROPERTY_ATTRIBUTES = { "xmlns:cp": "http://schemas.openxmlformats.org/package/2006/metadata/core-properties", "xmlns:dc": "http://purl.org/dc/elements/1.1/", "xmlns:dcterms": "http://purl.org/dc/terms/", "xmlns:dcmitype": "http://purl.org/dc/dcmitype/", "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance" }, C.exports = a;
  36371. }, { "../../../utils/xml-stream": 28, "../base-xform": 32, "../simple/date-xform": 117, "../simple/integer-xform": 118, "../simple/string-xform": 119 }], 54: [function(g, C, i) {
  36372. const e = g("../base-xform");
  36373. C.exports = class extends e {
  36374. render(A, s) {
  36375. A.leafNode("Relationship", s);
  36376. }
  36377. parseOpen(A) {
  36378. switch (A.name) {
  36379. case "Relationship":
  36380. return this.model = A.attributes, !0;
  36381. default:
  36382. return !1;
  36383. }
  36384. }
  36385. parseText() {
  36386. }
  36387. parseClose() {
  36388. return !1;
  36389. }
  36390. };
  36391. }, { "../base-xform": 32 }], 55: [function(g, C, i) {
  36392. const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("./relationship-xform");
  36393. class l extends A {
  36394. constructor() {
  36395. super(), this.map = { Relationship: new s() };
  36396. }
  36397. render(a, d) {
  36398. d = d || this._values, a.openXml(e.StdDocAttributes), a.openNode("Relationships", l.RELATIONSHIPS_ATTRIBUTES), d.forEach((o) => {
  36399. this.map.Relationship.render(a, o);
  36400. }), a.closeNode();
  36401. }
  36402. parseOpen(a) {
  36403. if (this.parser) return this.parser.parseOpen(a), !0;
  36404. switch (a.name) {
  36405. case "Relationships":
  36406. return this.model = [], !0;
  36407. default:
  36408. if (this.parser = this.map[a.name], this.parser) return this.parser.parseOpen(a), !0;
  36409. throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(a));
  36410. }
  36411. }
  36412. parseText(a) {
  36413. this.parser && this.parser.parseText(a);
  36414. }
  36415. parseClose(a) {
  36416. if (this.parser) return this.parser.parseClose(a) || (this.model.push(this.parser.model), this.parser = void 0), !0;
  36417. switch (a) {
  36418. case "Relationships":
  36419. return !1;
  36420. default:
  36421. throw new Error("Unexpected xml node in parseClose: " + a);
  36422. }
  36423. }
  36424. }
  36425. l.RELATIONSHIPS_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/package/2006/relationships" }, C.exports = l;
  36426. }, { "../../../utils/xml-stream": 28, "../base-xform": 32, "./relationship-xform": 54 }], 56: [function(g, C, i) {
  36427. const e = g("../base-xform");
  36428. C.exports = class extends e {
  36429. parseOpen(A) {
  36430. if (this.parser) return this.parser.parseOpen(A), !0;
  36431. switch (A.name) {
  36432. case this.tag:
  36433. this.reset(), this.model = { range: { editAs: A.attributes.editAs || "oneCell" } };
  36434. break;
  36435. default:
  36436. this.parser = this.map[A.name], this.parser && this.parser.parseOpen(A);
  36437. }
  36438. return !0;
  36439. }
  36440. parseText(A) {
  36441. this.parser && this.parser.parseText(A);
  36442. }
  36443. reconcilePicture(A, s) {
  36444. if (A && A.rId) {
  36445. const l = s.rels[A.rId].Target.match(/.*\/media\/(.+[.][a-zA-Z]{3,4})/);
  36446. if (l) {
  36447. const n = l[1], a = s.mediaIndex[n];
  36448. return s.media[a];
  36449. }
  36450. }
  36451. }
  36452. };
  36453. }, { "../base-xform": 32 }], 57: [function(g, C, i) {
  36454. const e = g("../base-xform"), A = g("./blip-xform");
  36455. C.exports = class extends e {
  36456. constructor() {
  36457. super(), this.map = { "a:blip": new A() };
  36458. }
  36459. get tag() {
  36460. return "xdr:blipFill";
  36461. }
  36462. render(s, l) {
  36463. s.openNode(this.tag), this.map["a:blip"].render(s, l), s.openNode("a:stretch"), s.leafNode("a:fillRect"), s.closeNode(), s.closeNode();
  36464. }
  36465. parseOpen(s) {
  36466. if (this.parser) return this.parser.parseOpen(s), !0;
  36467. switch (s.name) {
  36468. case this.tag:
  36469. this.reset();
  36470. break;
  36471. default:
  36472. this.parser = this.map[s.name], this.parser && this.parser.parseOpen(s);
  36473. }
  36474. return !0;
  36475. }
  36476. parseText() {
  36477. }
  36478. parseClose(s) {
  36479. if (this.parser) return this.parser.parseClose(s) || (this.parser = void 0), !0;
  36480. switch (s) {
  36481. case this.tag:
  36482. return this.model = this.map["a:blip"].model, !1;
  36483. default:
  36484. return !0;
  36485. }
  36486. }
  36487. };
  36488. }, { "../base-xform": 32, "./blip-xform": 58 }], 58: [function(g, C, i) {
  36489. const e = g("../base-xform");
  36490. C.exports = class extends e {
  36491. get tag() {
  36492. return "a:blip";
  36493. }
  36494. render(A, s) {
  36495. A.leafNode(this.tag, { "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", "r:embed": s.rId, cstate: "print" });
  36496. }
  36497. parseOpen(A) {
  36498. switch (A.name) {
  36499. case this.tag:
  36500. return this.model = { rId: A.attributes["r:embed"] }, !0;
  36501. default:
  36502. return !0;
  36503. }
  36504. }
  36505. parseText() {
  36506. }
  36507. parseClose(A) {
  36508. switch (A) {
  36509. case this.tag:
  36510. return !1;
  36511. default:
  36512. return !0;
  36513. }
  36514. }
  36515. };
  36516. }, { "../base-xform": 32 }], 59: [function(g, C, i) {
  36517. const e = g("../base-xform");
  36518. C.exports = class extends e {
  36519. get tag() {
  36520. return "xdr:cNvPicPr";
  36521. }
  36522. render(A) {
  36523. A.openNode(this.tag), A.leafNode("a:picLocks", { noChangeAspect: "1" }), A.closeNode();
  36524. }
  36525. parseOpen(A) {
  36526. switch (A.name) {
  36527. case this.tag:
  36528. default:
  36529. return !0;
  36530. }
  36531. }
  36532. parseText() {
  36533. }
  36534. parseClose(A) {
  36535. switch (A) {
  36536. case this.tag:
  36537. return !1;
  36538. default:
  36539. return !0;
  36540. }
  36541. }
  36542. };
  36543. }, { "../base-xform": 32 }], 60: [function(g, C, i) {
  36544. const e = g("../base-xform"), A = g("./hlink-click-xform"), s = g("./ext-lst-xform");
  36545. C.exports = class extends e {
  36546. constructor() {
  36547. super(), this.map = { "a:hlinkClick": new A(), "a:extLst": new s() };
  36548. }
  36549. get tag() {
  36550. return "xdr:cNvPr";
  36551. }
  36552. render(l, n) {
  36553. l.openNode(this.tag, { id: n.index, name: "Picture " + n.index }), this.map["a:hlinkClick"].render(l, n), this.map["a:extLst"].render(l, n), l.closeNode();
  36554. }
  36555. parseOpen(l) {
  36556. if (this.parser) return this.parser.parseOpen(l), !0;
  36557. switch (l.name) {
  36558. case this.tag:
  36559. this.reset();
  36560. break;
  36561. default:
  36562. this.parser = this.map[l.name], this.parser && this.parser.parseOpen(l);
  36563. }
  36564. return !0;
  36565. }
  36566. parseText() {
  36567. }
  36568. parseClose(l) {
  36569. if (this.parser) return this.parser.parseClose(l) || (this.parser = void 0), !0;
  36570. switch (l) {
  36571. case this.tag:
  36572. return this.model = this.map["a:hlinkClick"].model, !1;
  36573. default:
  36574. return !0;
  36575. }
  36576. }
  36577. };
  36578. }, { "../base-xform": 32, "./ext-lst-xform": 63, "./hlink-click-xform": 65 }], 61: [function(g, C, i) {
  36579. const e = g("../base-xform"), A = g("../simple/integer-xform");
  36580. C.exports = class extends e {
  36581. constructor(s) {
  36582. super(), this.tag = s.tag, this.map = { "xdr:col": new A({ tag: "xdr:col", zero: !0 }), "xdr:colOff": new A({ tag: "xdr:colOff", zero: !0 }), "xdr:row": new A({ tag: "xdr:row", zero: !0 }), "xdr:rowOff": new A({ tag: "xdr:rowOff", zero: !0 }) };
  36583. }
  36584. render(s, l) {
  36585. s.openNode(this.tag), this.map["xdr:col"].render(s, l.nativeCol), this.map["xdr:colOff"].render(s, l.nativeColOff), this.map["xdr:row"].render(s, l.nativeRow), this.map["xdr:rowOff"].render(s, l.nativeRowOff), s.closeNode();
  36586. }
  36587. parseOpen(s) {
  36588. if (this.parser) return this.parser.parseOpen(s), !0;
  36589. switch (s.name) {
  36590. case this.tag:
  36591. this.reset();
  36592. break;
  36593. default:
  36594. this.parser = this.map[s.name], this.parser && this.parser.parseOpen(s);
  36595. }
  36596. return !0;
  36597. }
  36598. parseText(s) {
  36599. this.parser && this.parser.parseText(s);
  36600. }
  36601. parseClose(s) {
  36602. if (this.parser) return this.parser.parseClose(s) || (this.parser = void 0), !0;
  36603. switch (s) {
  36604. case this.tag:
  36605. return this.model = { nativeCol: this.map["xdr:col"].model, nativeColOff: this.map["xdr:colOff"].model, nativeRow: this.map["xdr:row"].model, nativeRowOff: this.map["xdr:rowOff"].model }, !1;
  36606. default:
  36607. return !0;
  36608. }
  36609. }
  36610. };
  36611. }, { "../base-xform": 32, "../simple/integer-xform": 118 }], 62: [function(g, C, i) {
  36612. const e = g("../../../utils/col-cache"), A = g("../../../utils/xml-stream"), s = g("../base-xform"), l = g("./two-cell-anchor-xform"), n = g("./one-cell-anchor-xform");
  36613. class a extends s {
  36614. constructor() {
  36615. super(), this.map = { "xdr:twoCellAnchor": new l(), "xdr:oneCellAnchor": new n() };
  36616. }
  36617. prepare(o) {
  36618. o.anchors.forEach((c, r) => {
  36619. c.anchorType = function(h) {
  36620. return (typeof h.range == "string" ? e.decode(h.range) : h.range).br ? "xdr:twoCellAnchor" : "xdr:oneCellAnchor";
  36621. }(c), this.map[c.anchorType].prepare(c, { index: r });
  36622. });
  36623. }
  36624. get tag() {
  36625. return "xdr:wsDr";
  36626. }
  36627. render(o, c) {
  36628. o.openXml(A.StdDocAttributes), o.openNode(this.tag, a.DRAWING_ATTRIBUTES), c.anchors.forEach((r) => {
  36629. this.map[r.anchorType].render(o, r);
  36630. }), o.closeNode();
  36631. }
  36632. parseOpen(o) {
  36633. if (this.parser) return this.parser.parseOpen(o), !0;
  36634. switch (o.name) {
  36635. case this.tag:
  36636. this.reset(), this.model = { anchors: [] };
  36637. break;
  36638. default:
  36639. this.parser = this.map[o.name], this.parser && this.parser.parseOpen(o);
  36640. }
  36641. return !0;
  36642. }
  36643. parseText(o) {
  36644. this.parser && this.parser.parseText(o);
  36645. }
  36646. parseClose(o) {
  36647. if (this.parser) return this.parser.parseClose(o) || (this.model.anchors.push(this.parser.model), this.parser = void 0), !0;
  36648. switch (o) {
  36649. case this.tag:
  36650. return !1;
  36651. default:
  36652. return !0;
  36653. }
  36654. }
  36655. reconcile(o, c) {
  36656. o.anchors.forEach((r) => {
  36657. r.br ? this.map["xdr:twoCellAnchor"].reconcile(r, c) : this.map["xdr:oneCellAnchor"].reconcile(r, c);
  36658. });
  36659. }
  36660. }
  36661. a.DRAWING_ATTRIBUTES = { "xmlns:xdr": "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing", "xmlns:a": "http://schemas.openxmlformats.org/drawingml/2006/main" }, C.exports = a;
  36662. }, { "../../../utils/col-cache": 19, "../../../utils/xml-stream": 28, "../base-xform": 32, "./one-cell-anchor-xform": 67, "./two-cell-anchor-xform": 70 }], 63: [function(g, C, i) {
  36663. const e = g("../base-xform");
  36664. C.exports = class extends e {
  36665. get tag() {
  36666. return "a:extLst";
  36667. }
  36668. render(A) {
  36669. A.openNode(this.tag), A.openNode("a:ext", { uri: "{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}" }), A.leafNode("a16:creationId", { "xmlns:a16": "http://schemas.microsoft.com/office/drawing/2014/main", id: "{00000000-0008-0000-0000-000002000000}" }), A.closeNode(), A.closeNode();
  36670. }
  36671. parseOpen(A) {
  36672. switch (A.name) {
  36673. case this.tag:
  36674. default:
  36675. return !0;
  36676. }
  36677. }
  36678. parseText() {
  36679. }
  36680. parseClose(A) {
  36681. switch (A) {
  36682. case this.tag:
  36683. return !1;
  36684. default:
  36685. return !0;
  36686. }
  36687. }
  36688. };
  36689. }, { "../base-xform": 32 }], 64: [function(g, C, i) {
  36690. const e = g("../base-xform");
  36691. C.exports = class extends e {
  36692. constructor(A) {
  36693. super(), this.tag = A.tag, this.map = {};
  36694. }
  36695. render(A, s) {
  36696. A.openNode(this.tag);
  36697. const l = Math.floor(9525 * s.width), n = Math.floor(9525 * s.height);
  36698. A.addAttribute("cx", l), A.addAttribute("cy", n), A.closeNode();
  36699. }
  36700. parseOpen(A) {
  36701. return A.name === this.tag && (this.model = { width: parseInt(A.attributes.cx || "0", 10) / 9525, height: parseInt(A.attributes.cy || "0", 10) / 9525 }, !0);
  36702. }
  36703. parseText() {
  36704. }
  36705. parseClose() {
  36706. return !1;
  36707. }
  36708. };
  36709. }, { "../base-xform": 32 }], 65: [function(g, C, i) {
  36710. const e = g("../base-xform");
  36711. C.exports = class extends e {
  36712. get tag() {
  36713. return "a:hlinkClick";
  36714. }
  36715. render(A, s) {
  36716. s.hyperlinks && s.hyperlinks.rId && A.leafNode(this.tag, { "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", "r:id": s.hyperlinks.rId, tooltip: s.hyperlinks.tooltip });
  36717. }
  36718. parseOpen(A) {
  36719. switch (A.name) {
  36720. case this.tag:
  36721. return this.model = { hyperlinks: { rId: A.attributes["r:id"], tooltip: A.attributes.tooltip } }, !0;
  36722. default:
  36723. return !0;
  36724. }
  36725. }
  36726. parseText() {
  36727. }
  36728. parseClose() {
  36729. return !1;
  36730. }
  36731. };
  36732. }, { "../base-xform": 32 }], 66: [function(g, C, i) {
  36733. const e = g("../base-xform"), A = g("./c-nv-pr-xform"), s = g("./c-nv-pic-pr-xform");
  36734. C.exports = class extends e {
  36735. constructor() {
  36736. super(), this.map = { "xdr:cNvPr": new A(), "xdr:cNvPicPr": new s() };
  36737. }
  36738. get tag() {
  36739. return "xdr:nvPicPr";
  36740. }
  36741. render(l, n) {
  36742. l.openNode(this.tag), this.map["xdr:cNvPr"].render(l, n), this.map["xdr:cNvPicPr"].render(l, n), l.closeNode();
  36743. }
  36744. parseOpen(l) {
  36745. if (this.parser) return this.parser.parseOpen(l), !0;
  36746. switch (l.name) {
  36747. case this.tag:
  36748. this.reset();
  36749. break;
  36750. default:
  36751. this.parser = this.map[l.name], this.parser && this.parser.parseOpen(l);
  36752. }
  36753. return !0;
  36754. }
  36755. parseText() {
  36756. }
  36757. parseClose(l) {
  36758. if (this.parser) return this.parser.parseClose(l) || (this.parser = void 0), !0;
  36759. switch (l) {
  36760. case this.tag:
  36761. return this.model = this.map["xdr:cNvPr"].model, !1;
  36762. default:
  36763. return !0;
  36764. }
  36765. }
  36766. };
  36767. }, { "../base-xform": 32, "./c-nv-pic-pr-xform": 59, "./c-nv-pr-xform": 60 }], 67: [function(g, C, i) {
  36768. const e = g("./base-cell-anchor-xform"), A = g("../static-xform"), s = g("./cell-position-xform"), l = g("./ext-xform"), n = g("./pic-xform");
  36769. C.exports = class extends e {
  36770. constructor() {
  36771. super(), this.map = { "xdr:from": new s({ tag: "xdr:from" }), "xdr:ext": new l({ tag: "xdr:ext" }), "xdr:pic": new n(), "xdr:clientData": new A({ tag: "xdr:clientData" }) };
  36772. }
  36773. get tag() {
  36774. return "xdr:oneCellAnchor";
  36775. }
  36776. prepare(a, d) {
  36777. this.map["xdr:pic"].prepare(a.picture, d);
  36778. }
  36779. render(a, d) {
  36780. a.openNode(this.tag, { editAs: d.range.editAs || "oneCell" }), this.map["xdr:from"].render(a, d.range.tl), this.map["xdr:ext"].render(a, d.range.ext), this.map["xdr:pic"].render(a, d.picture), this.map["xdr:clientData"].render(a, {}), a.closeNode();
  36781. }
  36782. parseClose(a) {
  36783. if (this.parser) return this.parser.parseClose(a) || (this.parser = void 0), !0;
  36784. switch (a) {
  36785. case this.tag:
  36786. return this.model.range.tl = this.map["xdr:from"].model, this.model.range.ext = this.map["xdr:ext"].model, this.model.picture = this.map["xdr:pic"].model, !1;
  36787. default:
  36788. return !0;
  36789. }
  36790. }
  36791. reconcile(a, d) {
  36792. a.medium = this.reconcilePicture(a.picture, d);
  36793. }
  36794. };
  36795. }, { "../static-xform": 120, "./base-cell-anchor-xform": 56, "./cell-position-xform": 61, "./ext-xform": 64, "./pic-xform": 68 }], 68: [function(g, C, i) {
  36796. const e = g("../base-xform"), A = g("../static-xform"), s = g("./blip-fill-xform"), l = g("./nv-pic-pr-xform"), n = g("./sp-pr");
  36797. C.exports = class extends e {
  36798. constructor() {
  36799. super(), this.map = { "xdr:nvPicPr": new l(), "xdr:blipFill": new s(), "xdr:spPr": new A(n) };
  36800. }
  36801. get tag() {
  36802. return "xdr:pic";
  36803. }
  36804. prepare(a, d) {
  36805. a.index = d.index + 1;
  36806. }
  36807. render(a, d) {
  36808. a.openNode(this.tag), this.map["xdr:nvPicPr"].render(a, d), this.map["xdr:blipFill"].render(a, d), this.map["xdr:spPr"].render(a, d), a.closeNode();
  36809. }
  36810. parseOpen(a) {
  36811. if (this.parser) return this.parser.parseOpen(a), !0;
  36812. switch (a.name) {
  36813. case this.tag:
  36814. this.reset();
  36815. break;
  36816. default:
  36817. this.parser = this.map[a.name], this.parser && this.parser.parseOpen(a);
  36818. }
  36819. return !0;
  36820. }
  36821. parseText() {
  36822. }
  36823. parseClose(a) {
  36824. if (this.parser) return this.parser.parseClose(a) || (this.mergeModel(this.parser.model), this.parser = void 0), !0;
  36825. switch (a) {
  36826. case this.tag:
  36827. return !1;
  36828. default:
  36829. return !0;
  36830. }
  36831. }
  36832. };
  36833. }, { "../base-xform": 32, "../static-xform": 120, "./blip-fill-xform": 57, "./nv-pic-pr-xform": 66, "./sp-pr": 69 }], 69: [function(g, C, i) {
  36834. C.exports = { tag: "xdr:spPr", c: [{ tag: "a:xfrm", c: [{ tag: "a:off", $: { x: "0", y: "0" } }, { tag: "a:ext", $: { cx: "0", cy: "0" } }] }, { tag: "a:prstGeom", $: { prst: "rect" }, c: [{ tag: "a:avLst" }] }] };
  36835. }, {}], 70: [function(g, C, i) {
  36836. const e = g("./base-cell-anchor-xform"), A = g("../static-xform"), s = g("./cell-position-xform"), l = g("./pic-xform");
  36837. C.exports = class extends e {
  36838. constructor() {
  36839. super(), this.map = { "xdr:from": new s({ tag: "xdr:from" }), "xdr:to": new s({ tag: "xdr:to" }), "xdr:pic": new l(), "xdr:clientData": new A({ tag: "xdr:clientData" }) };
  36840. }
  36841. get tag() {
  36842. return "xdr:twoCellAnchor";
  36843. }
  36844. prepare(n, a) {
  36845. this.map["xdr:pic"].prepare(n.picture, a);
  36846. }
  36847. render(n, a) {
  36848. n.openNode(this.tag, { editAs: a.range.editAs || "oneCell" }), this.map["xdr:from"].render(n, a.range.tl), this.map["xdr:to"].render(n, a.range.br), this.map["xdr:pic"].render(n, a.picture), this.map["xdr:clientData"].render(n, {}), n.closeNode();
  36849. }
  36850. parseClose(n) {
  36851. if (this.parser) return this.parser.parseClose(n) || (this.parser = void 0), !0;
  36852. switch (n) {
  36853. case this.tag:
  36854. return this.model.range.tl = this.map["xdr:from"].model, this.model.range.br = this.map["xdr:to"].model, this.model.picture = this.map["xdr:pic"].model, !1;
  36855. default:
  36856. return !0;
  36857. }
  36858. }
  36859. reconcile(n, a) {
  36860. n.medium = this.reconcilePicture(n.picture, a);
  36861. }
  36862. };
  36863. }, { "../static-xform": 120, "./base-cell-anchor-xform": 56, "./cell-position-xform": 61, "./pic-xform": 68 }], 71: [function(g, C, i) {
  36864. const e = g("./base-xform");
  36865. C.exports = class extends e {
  36866. constructor(A) {
  36867. super(), this.tag = A.tag, this.always = !!A.always, this.count = A.count, this.empty = A.empty, this.$count = A.$count || "count", this.$ = A.$, this.childXform = A.childXform, this.maxItems = A.maxItems;
  36868. }
  36869. prepare(A, s) {
  36870. const { childXform: l } = this;
  36871. A && A.forEach((n, a) => {
  36872. s.index = a, l.prepare(n, s);
  36873. });
  36874. }
  36875. render(A, s) {
  36876. if (this.always || s && s.length) {
  36877. A.openNode(this.tag, this.$), this.count && A.addAttribute(this.$count, s && s.length || 0);
  36878. const { childXform: l } = this;
  36879. (s || []).forEach((n, a) => {
  36880. l.render(A, n, a);
  36881. }), A.closeNode();
  36882. } else this.empty && A.leafNode(this.tag);
  36883. }
  36884. parseOpen(A) {
  36885. if (this.parser) return this.parser.parseOpen(A), !0;
  36886. switch (A.name) {
  36887. case this.tag:
  36888. return this.model = [], !0;
  36889. default:
  36890. return !!this.childXform.parseOpen(A) && (this.parser = this.childXform, !0);
  36891. }
  36892. }
  36893. parseText(A) {
  36894. this.parser && this.parser.parseText(A);
  36895. }
  36896. parseClose(A) {
  36897. if (this.parser) {
  36898. if (!this.parser.parseClose(A) && (this.model.push(this.parser.model), this.parser = void 0, this.maxItems && this.model.length > this.maxItems)) throw new Error(`Max ${this.childXform.tag} count (${this.maxItems}) exceeded`);
  36899. return !0;
  36900. }
  36901. return !1;
  36902. }
  36903. reconcile(A, s) {
  36904. if (A) {
  36905. const { childXform: l } = this;
  36906. A.forEach((n) => {
  36907. l.reconcile(n, s);
  36908. });
  36909. }
  36910. }
  36911. };
  36912. }, { "./base-xform": 32 }], 72: [function(g, C, i) {
  36913. const e = g("../../../utils/col-cache"), A = g("../base-xform");
  36914. C.exports = class extends A {
  36915. get tag() {
  36916. return "autoFilter";
  36917. }
  36918. render(s, l) {
  36919. if (l) if (typeof l == "string") s.leafNode("autoFilter", { ref: l });
  36920. else {
  36921. const n = function(o) {
  36922. return typeof o == "string" ? o : e.getAddress(o.row, o.column).address;
  36923. }, a = n(l.from), d = n(l.to);
  36924. a && d && s.leafNode("autoFilter", { ref: `${a}:${d}` });
  36925. }
  36926. }
  36927. parseOpen(s) {
  36928. s.name === "autoFilter" && (this.model = s.attributes.ref);
  36929. }
  36930. };
  36931. }, { "../../../utils/col-cache": 19, "../base-xform": 32 }], 73: [function(g, C, i) {
  36932. const e = g("../../../utils/utils"), A = g("../base-xform"), s = g("../../../doc/range"), l = g("../../../doc/enums"), n = g("../strings/rich-text-xform");
  36933. function a(d) {
  36934. if (d == null) return l.ValueType.Null;
  36935. if (d instanceof String || typeof d == "string") return l.ValueType.String;
  36936. if (typeof d == "number") return l.ValueType.Number;
  36937. if (typeof d == "boolean") return l.ValueType.Boolean;
  36938. if (d instanceof Date) return l.ValueType.Date;
  36939. if (d.text && d.hyperlink) return l.ValueType.Hyperlink;
  36940. if (d.formula) return l.ValueType.Formula;
  36941. if (d.error) return l.ValueType.Error;
  36942. throw new Error("I could not understand type of value");
  36943. }
  36944. C.exports = class extends A {
  36945. constructor() {
  36946. super(), this.richTextXForm = new n();
  36947. }
  36948. get tag() {
  36949. return "c";
  36950. }
  36951. prepare(d, o) {
  36952. const c = o.styles.addStyleModel(d.style || {}, function(r) {
  36953. switch (r.type) {
  36954. case l.ValueType.Formula:
  36955. return a(r.result);
  36956. default:
  36957. return r.type;
  36958. }
  36959. }(d));
  36960. switch (c && (d.styleId = c), d.comment && o.comments.push({ ...d.comment, ref: d.address }), d.type) {
  36961. case l.ValueType.String:
  36962. case l.ValueType.RichText:
  36963. o.sharedStrings && (d.ssId = o.sharedStrings.add(d.value));
  36964. break;
  36965. case l.ValueType.Date:
  36966. o.date1904 && (d.date1904 = !0);
  36967. break;
  36968. case l.ValueType.Hyperlink:
  36969. o.sharedStrings && d.text !== void 0 && d.text !== null && (d.ssId = o.sharedStrings.add(d.text)), o.hyperlinks.push({ address: d.address, target: d.hyperlink, tooltip: d.tooltip });
  36970. break;
  36971. case l.ValueType.Merge:
  36972. o.merges.add(d);
  36973. break;
  36974. case l.ValueType.Formula:
  36975. if (o.date1904 && (d.date1904 = !0), d.shareType === "shared" && (d.si = o.siFormulae++), d.formula) o.formulae[d.address] = d;
  36976. else if (d.sharedFormula) {
  36977. const r = o.formulae[d.sharedFormula];
  36978. if (!r) throw new Error("Shared Formula master must exist above and or left of clone for cell " + d.address);
  36979. r.si === void 0 ? (r.shareType = "shared", r.si = o.siFormulae++, r.range = new s(r.address, d.address)) : r.range && r.range.expandToAddress(d.address), d.si = r.si;
  36980. }
  36981. }
  36982. }
  36983. renderFormula(d, o) {
  36984. let c = null;
  36985. switch (o.shareType) {
  36986. case "shared":
  36987. c = { t: "shared", ref: o.ref || o.range.range, si: o.si };
  36988. break;
  36989. case "array":
  36990. c = { t: "array", ref: o.ref };
  36991. break;
  36992. default:
  36993. o.si !== void 0 && (c = { t: "shared", si: o.si });
  36994. }
  36995. switch (a(o.result)) {
  36996. case l.ValueType.Null:
  36997. d.leafNode("f", c, o.formula);
  36998. break;
  36999. case l.ValueType.String:
  37000. d.addAttribute("t", "str"), d.leafNode("f", c, o.formula), d.leafNode("v", null, o.result);
  37001. break;
  37002. case l.ValueType.Number:
  37003. d.leafNode("f", c, o.formula), d.leafNode("v", null, o.result);
  37004. break;
  37005. case l.ValueType.Boolean:
  37006. d.addAttribute("t", "b"), d.leafNode("f", c, o.formula), d.leafNode("v", null, o.result ? 1 : 0);
  37007. break;
  37008. case l.ValueType.Error:
  37009. d.addAttribute("t", "e"), d.leafNode("f", c, o.formula), d.leafNode("v", null, o.result.error);
  37010. break;
  37011. case l.ValueType.Date:
  37012. d.leafNode("f", c, o.formula), d.leafNode("v", null, e.dateToExcel(o.result, o.date1904));
  37013. break;
  37014. default:
  37015. throw new Error("I could not understand type of value");
  37016. }
  37017. }
  37018. render(d, o) {
  37019. if (o.type !== l.ValueType.Null || o.styleId) {
  37020. switch (d.openNode("c"), d.addAttribute("r", o.address), o.styleId && d.addAttribute("s", o.styleId), o.type) {
  37021. case l.ValueType.Null:
  37022. break;
  37023. case l.ValueType.Number:
  37024. d.leafNode("v", null, o.value);
  37025. break;
  37026. case l.ValueType.Boolean:
  37027. d.addAttribute("t", "b"), d.leafNode("v", null, o.value ? "1" : "0");
  37028. break;
  37029. case l.ValueType.Error:
  37030. d.addAttribute("t", "e"), d.leafNode("v", null, o.value.error);
  37031. break;
  37032. case l.ValueType.String:
  37033. case l.ValueType.RichText:
  37034. o.ssId !== void 0 ? (d.addAttribute("t", "s"), d.leafNode("v", null, o.ssId)) : o.value && o.value.richText ? (d.addAttribute("t", "inlineStr"), d.openNode("is"), o.value.richText.forEach((c) => {
  37035. this.richTextXForm.render(d, c);
  37036. }), d.closeNode("is")) : (d.addAttribute("t", "str"), d.leafNode("v", null, o.value));
  37037. break;
  37038. case l.ValueType.Date:
  37039. d.leafNode("v", null, e.dateToExcel(o.value, o.date1904));
  37040. break;
  37041. case l.ValueType.Hyperlink:
  37042. o.ssId !== void 0 ? (d.addAttribute("t", "s"), d.leafNode("v", null, o.ssId)) : (d.addAttribute("t", "str"), d.leafNode("v", null, o.text));
  37043. break;
  37044. case l.ValueType.Formula:
  37045. this.renderFormula(d, o);
  37046. break;
  37047. case l.ValueType.Merge:
  37048. }
  37049. d.closeNode();
  37050. }
  37051. }
  37052. parseOpen(d) {
  37053. if (this.parser) return this.parser.parseOpen(d), !0;
  37054. switch (d.name) {
  37055. case "c":
  37056. return this.model = { address: d.attributes.r }, this.t = d.attributes.t, d.attributes.s && (this.model.styleId = parseInt(d.attributes.s, 10)), !0;
  37057. case "f":
  37058. return this.currentNode = "f", this.model.si = d.attributes.si, this.model.shareType = d.attributes.t, this.model.ref = d.attributes.ref, !0;
  37059. case "v":
  37060. return this.currentNode = "v", !0;
  37061. case "t":
  37062. return this.currentNode = "t", !0;
  37063. case "r":
  37064. return this.parser = this.richTextXForm, this.parser.parseOpen(d), !0;
  37065. default:
  37066. return !1;
  37067. }
  37068. }
  37069. parseText(d) {
  37070. if (this.parser) this.parser.parseText(d);
  37071. else switch (this.currentNode) {
  37072. case "f":
  37073. this.model.formula = this.model.formula ? this.model.formula + d : d;
  37074. break;
  37075. case "v":
  37076. case "t":
  37077. this.model.value && this.model.value.richText ? this.model.value.richText.text = this.model.value.richText.text ? this.model.value.richText.text + d : d : this.model.value = this.model.value ? this.model.value + d : d;
  37078. }
  37079. }
  37080. parseClose(d) {
  37081. switch (d) {
  37082. case "c": {
  37083. const { model: o } = this;
  37084. if (o.formula || o.shareType) o.type = l.ValueType.Formula, o.value && (this.t === "str" ? o.result = e.xmlDecode(o.value) : this.t === "b" ? o.result = parseInt(o.value, 10) !== 0 : this.t === "e" ? o.result = { error: o.value } : o.result = parseFloat(o.value), o.value = void 0);
  37085. else if (o.value !== void 0) switch (this.t) {
  37086. case "s":
  37087. o.type = l.ValueType.String, o.value = parseInt(o.value, 10);
  37088. break;
  37089. case "str":
  37090. o.type = l.ValueType.String, o.value = e.xmlDecode(o.value);
  37091. break;
  37092. case "inlineStr":
  37093. o.type = l.ValueType.String;
  37094. break;
  37095. case "b":
  37096. o.type = l.ValueType.Boolean, o.value = parseInt(o.value, 10) !== 0;
  37097. break;
  37098. case "e":
  37099. o.type = l.ValueType.Error, o.value = { error: o.value };
  37100. break;
  37101. default:
  37102. o.type = l.ValueType.Number, o.value = parseFloat(o.value);
  37103. }
  37104. else o.styleId ? o.type = l.ValueType.Null : o.type = l.ValueType.Merge;
  37105. return !1;
  37106. }
  37107. case "f":
  37108. case "v":
  37109. case "is":
  37110. return this.currentNode = void 0, !0;
  37111. case "t":
  37112. return this.parser ? (this.parser.parseClose(d), !0) : (this.currentNode = void 0, !0);
  37113. case "r":
  37114. return this.model.value = this.model.value || {}, this.model.value.richText = this.model.value.richText || [], this.model.value.richText.push(this.parser.model), this.parser = void 0, this.currentNode = void 0, !0;
  37115. default:
  37116. return !!this.parser && (this.parser.parseClose(d), !0);
  37117. }
  37118. }
  37119. reconcile(d, o) {
  37120. const c = d.styleId && o.styles && o.styles.getStyleModel(d.styleId);
  37121. switch (c && (d.style = c), d.styleId !== void 0 && (d.styleId = void 0), d.type) {
  37122. case l.ValueType.String:
  37123. typeof d.value == "number" && o.sharedStrings && (d.value = o.sharedStrings.getString(d.value)), d.value.richText && (d.type = l.ValueType.RichText);
  37124. break;
  37125. case l.ValueType.Number:
  37126. c && e.isDateFmt(c.numFmt) && (d.type = l.ValueType.Date, d.value = e.excelToDate(d.value, o.date1904));
  37127. break;
  37128. case l.ValueType.Formula:
  37129. d.result !== void 0 && c && e.isDateFmt(c.numFmt) && (d.result = e.excelToDate(d.result, o.date1904)), d.shareType === "shared" && (d.ref ? o.formulae[d.si] = d.address : (d.sharedFormula = o.formulae[d.si], delete d.shareType), delete d.si);
  37130. }
  37131. const r = o.hyperlinkMap[d.address];
  37132. r && (d.type === l.ValueType.Formula ? (d.text = d.result, d.result = void 0) : (d.text = d.value, d.value = void 0), d.type = l.ValueType.Hyperlink, d.hyperlink = r);
  37133. const h = o.commentsMap && o.commentsMap[d.address];
  37134. h && (d.comment = h);
  37135. }
  37136. };
  37137. }, { "../../../doc/enums": 7, "../../../doc/range": 10, "../../../utils/utils": 27, "../base-xform": 32, "../strings/rich-text-xform": 122 }], 74: [function(g, C, i) {
  37138. const e = g("../../base-xform");
  37139. C.exports = class extends e {
  37140. get tag() {
  37141. return "x14:cfIcon";
  37142. }
  37143. render(A, s) {
  37144. A.leafNode(this.tag, { iconSet: s.iconSet, iconId: s.iconId });
  37145. }
  37146. parseOpen(A) {
  37147. let { attributes: s } = A;
  37148. this.model = { iconSet: s.iconSet, iconId: e.toIntValue(s.iconId) };
  37149. }
  37150. parseClose(A) {
  37151. return A !== this.tag;
  37152. }
  37153. };
  37154. }, { "../../base-xform": 32 }], 75: [function(g, C, i) {
  37155. const { v4: e } = g("uuid"), A = g("../../base-xform"), s = g("../../composite-xform"), l = g("./databar-ext-xform"), n = g("./icon-set-ext-xform"), a = { "3Triangles": !0, "3Stars": !0, "5Boxes": !0 };
  37156. class d extends s {
  37157. constructor() {
  37158. super(), this.map = { "x14:dataBar": this.databarXform = new l(), "x14:iconSet": this.iconSetXform = new n() };
  37159. }
  37160. get tag() {
  37161. return "x14:cfRule";
  37162. }
  37163. static isExt(c) {
  37164. return c.type === "dataBar" ? l.isExt(c) : !(c.type !== "iconSet" || !c.custom && !a[c.iconSet]);
  37165. }
  37166. prepare(c) {
  37167. d.isExt(c) && (c.x14Id = `{${e()}}`.toUpperCase());
  37168. }
  37169. render(c, r) {
  37170. if (d.isExt(r)) switch (r.type) {
  37171. case "dataBar":
  37172. this.renderDataBar(c, r);
  37173. break;
  37174. case "iconSet":
  37175. this.renderIconSet(c, r);
  37176. }
  37177. }
  37178. renderDataBar(c, r) {
  37179. c.openNode(this.tag, { type: "dataBar", id: r.x14Id }), this.databarXform.render(c, r), c.closeNode();
  37180. }
  37181. renderIconSet(c, r) {
  37182. c.openNode(this.tag, { type: "iconSet", priority: r.priority, id: r.x14Id || `{${e()}}` }), this.iconSetXform.render(c, r), c.closeNode();
  37183. }
  37184. createNewModel(c) {
  37185. let { attributes: r } = c;
  37186. return { type: r.type, x14Id: r.id, priority: A.toIntValue(r.priority) };
  37187. }
  37188. onParserClose(c, r) {
  37189. Object.assign(this.model, r.model);
  37190. }
  37191. }
  37192. C.exports = d;
  37193. }, { "../../base-xform": 32, "../../composite-xform": 48, "./databar-ext-xform": 79, "./icon-set-ext-xform": 81, uuid: 528 }], 76: [function(g, C, i) {
  37194. const e = g("../../composite-xform"), A = g("./f-ext-xform");
  37195. C.exports = class extends e {
  37196. constructor() {
  37197. super(), this.map = { "xm:f": this.fExtXform = new A() };
  37198. }
  37199. get tag() {
  37200. return "x14:cfvo";
  37201. }
  37202. render(s, l) {
  37203. s.openNode(this.tag, { type: l.type }), l.value !== void 0 && this.fExtXform.render(s, l.value), s.closeNode();
  37204. }
  37205. createNewModel(s) {
  37206. return { type: s.attributes.type };
  37207. }
  37208. onParserClose(s, l) {
  37209. switch (s) {
  37210. case "xm:f":
  37211. this.model.value = l.model ? parseFloat(l.model) : 0;
  37212. }
  37213. }
  37214. };
  37215. }, { "../../composite-xform": 48, "./f-ext-xform": 80 }], 77: [function(g, C, i) {
  37216. const e = g("../../composite-xform"), A = g("./sqref-ext-xform"), s = g("./cf-rule-ext-xform");
  37217. C.exports = class extends e {
  37218. constructor() {
  37219. super(), this.map = { "xm:sqref": this.sqRef = new A(), "x14:cfRule": this.cfRule = new s() };
  37220. }
  37221. get tag() {
  37222. return "x14:conditionalFormatting";
  37223. }
  37224. prepare(l, n) {
  37225. l.rules.forEach((a) => {
  37226. this.cfRule.prepare(a, n);
  37227. });
  37228. }
  37229. render(l, n) {
  37230. n.rules.some(s.isExt) && (l.openNode(this.tag, { "xmlns:xm": "http://schemas.microsoft.com/office/excel/2006/main" }), n.rules.filter(s.isExt).forEach((a) => this.cfRule.render(l, a)), this.sqRef.render(l, n.ref), l.closeNode());
  37231. }
  37232. createNewModel() {
  37233. return { rules: [] };
  37234. }
  37235. onParserClose(l, n) {
  37236. switch (l) {
  37237. case "xm:sqref":
  37238. this.model.ref = n.model;
  37239. break;
  37240. case "x14:cfRule":
  37241. this.model.rules.push(n.model);
  37242. }
  37243. }
  37244. };
  37245. }, { "../../composite-xform": 48, "./cf-rule-ext-xform": 75, "./sqref-ext-xform": 82 }], 78: [function(g, C, i) {
  37246. const e = g("../../composite-xform"), A = g("./cf-rule-ext-xform"), s = g("./conditional-formatting-ext-xform");
  37247. C.exports = class extends e {
  37248. constructor() {
  37249. super(), this.map = { "x14:conditionalFormatting": this.cfXform = new s() };
  37250. }
  37251. get tag() {
  37252. return "x14:conditionalFormattings";
  37253. }
  37254. hasContent(l) {
  37255. return l.hasExtContent === void 0 && (l.hasExtContent = l.some((n) => n.rules.some(A.isExt))), l.hasExtContent;
  37256. }
  37257. prepare(l, n) {
  37258. l.forEach((a) => {
  37259. this.cfXform.prepare(a, n);
  37260. });
  37261. }
  37262. render(l, n) {
  37263. this.hasContent(n) && (l.openNode(this.tag), n.forEach((a) => this.cfXform.render(l, a)), l.closeNode());
  37264. }
  37265. createNewModel() {
  37266. return [];
  37267. }
  37268. onParserClose(l, n) {
  37269. this.model.push(n.model);
  37270. }
  37271. };
  37272. }, { "../../composite-xform": 48, "./cf-rule-ext-xform": 75, "./conditional-formatting-ext-xform": 77 }], 79: [function(g, C, i) {
  37273. const e = g("../../base-xform"), A = g("../../composite-xform"), s = g("../../style/color-xform"), l = g("./cfvo-ext-xform");
  37274. C.exports = class extends A {
  37275. constructor() {
  37276. super(), this.map = { "x14:cfvo": this.cfvoXform = new l(), "x14:borderColor": this.borderColorXform = new s("x14:borderColor"), "x14:negativeBorderColor": this.negativeBorderColorXform = new s("x14:negativeBorderColor"), "x14:negativeFillColor": this.negativeFillColorXform = new s("x14:negativeFillColor"), "x14:axisColor": this.axisColorXform = new s("x14:axisColor") };
  37277. }
  37278. static isExt(n) {
  37279. return !n.gradient;
  37280. }
  37281. get tag() {
  37282. return "x14:dataBar";
  37283. }
  37284. render(n, a) {
  37285. n.openNode(this.tag, { minLength: e.toIntAttribute(a.minLength, 0, !0), maxLength: e.toIntAttribute(a.maxLength, 100, !0), border: e.toBoolAttribute(a.border, !1), gradient: e.toBoolAttribute(a.gradient, !0), negativeBarColorSameAsPositive: e.toBoolAttribute(a.negativeBarColorSameAsPositive, !0), negativeBarBorderColorSameAsPositive: e.toBoolAttribute(a.negativeBarBorderColorSameAsPositive, !0), axisPosition: e.toAttribute(a.axisPosition, "auto"), direction: e.toAttribute(a.direction, "leftToRight") }), a.cfvo.forEach((d) => {
  37286. this.cfvoXform.render(n, d);
  37287. }), this.borderColorXform.render(n, a.borderColor), this.negativeBorderColorXform.render(n, a.negativeBorderColor), this.negativeFillColorXform.render(n, a.negativeFillColor), this.axisColorXform.render(n, a.axisColor), n.closeNode();
  37288. }
  37289. createNewModel(n) {
  37290. let { attributes: a } = n;
  37291. return { cfvo: [], minLength: e.toIntValue(a.minLength, 0), maxLength: e.toIntValue(a.maxLength, 100), border: e.toBoolValue(a.border, !1), gradient: e.toBoolValue(a.gradient, !0), negativeBarColorSameAsPositive: e.toBoolValue(a.negativeBarColorSameAsPositive, !0), negativeBarBorderColorSameAsPositive: e.toBoolValue(a.negativeBarBorderColorSameAsPositive, !0), axisPosition: e.toStringValue(a.axisPosition, "auto"), direction: e.toStringValue(a.direction, "leftToRight") };
  37292. }
  37293. onParserClose(n, a) {
  37294. const [, d] = n.split(":");
  37295. switch (d) {
  37296. case "cfvo":
  37297. this.model.cfvo.push(a.model);
  37298. break;
  37299. default:
  37300. this.model[d] = a.model;
  37301. }
  37302. }
  37303. };
  37304. }, { "../../base-xform": 32, "../../composite-xform": 48, "../../style/color-xform": 128, "./cfvo-ext-xform": 76 }], 80: [function(g, C, i) {
  37305. const e = g("../../base-xform");
  37306. C.exports = class extends e {
  37307. get tag() {
  37308. return "xm:f";
  37309. }
  37310. render(A, s) {
  37311. A.leafNode(this.tag, null, s);
  37312. }
  37313. parseOpen() {
  37314. this.model = "";
  37315. }
  37316. parseText(A) {
  37317. this.model += A;
  37318. }
  37319. parseClose(A) {
  37320. return A !== this.tag;
  37321. }
  37322. };
  37323. }, { "../../base-xform": 32 }], 81: [function(g, C, i) {
  37324. const e = g("../../base-xform"), A = g("../../composite-xform"), s = g("./cfvo-ext-xform"), l = g("./cf-icon-ext-xform");
  37325. C.exports = class extends A {
  37326. constructor() {
  37327. super(), this.map = { "x14:cfvo": this.cfvoXform = new s(), "x14:cfIcon": this.cfIconXform = new l() };
  37328. }
  37329. get tag() {
  37330. return "x14:iconSet";
  37331. }
  37332. render(n, a) {
  37333. n.openNode(this.tag, { iconSet: e.toStringAttribute(a.iconSet), reverse: e.toBoolAttribute(a.reverse, !1), showValue: e.toBoolAttribute(a.showValue, !0), custom: e.toBoolAttribute(a.icons, !1) }), a.cfvo.forEach((d) => {
  37334. this.cfvoXform.render(n, d);
  37335. }), a.icons && a.icons.forEach((d, o) => {
  37336. d.iconId = o, this.cfIconXform.render(n, d);
  37337. }), n.closeNode();
  37338. }
  37339. createNewModel(n) {
  37340. let { attributes: a } = n;
  37341. return { cfvo: [], iconSet: e.toStringValue(a.iconSet, "3TrafficLights"), reverse: e.toBoolValue(a.reverse, !1), showValue: e.toBoolValue(a.showValue, !0) };
  37342. }
  37343. onParserClose(n, a) {
  37344. const [, d] = n.split(":");
  37345. switch (d) {
  37346. case "cfvo":
  37347. this.model.cfvo.push(a.model);
  37348. break;
  37349. case "cfIcon":
  37350. this.model.icons || (this.model.icons = []), this.model.icons.push(a.model);
  37351. break;
  37352. default:
  37353. this.model[d] = a.model;
  37354. }
  37355. }
  37356. };
  37357. }, { "../../base-xform": 32, "../../composite-xform": 48, "./cf-icon-ext-xform": 74, "./cfvo-ext-xform": 76 }], 82: [function(g, C, i) {
  37358. const e = g("../../base-xform");
  37359. C.exports = class extends e {
  37360. get tag() {
  37361. return "xm:sqref";
  37362. }
  37363. render(A, s) {
  37364. A.leafNode(this.tag, null, s);
  37365. }
  37366. parseOpen() {
  37367. this.model = "";
  37368. }
  37369. parseText(A) {
  37370. this.model += A;
  37371. }
  37372. parseClose(A) {
  37373. return A !== this.tag;
  37374. }
  37375. };
  37376. }, { "../../base-xform": 32 }], 83: [function(g, C, i) {
  37377. const e = g("../../base-xform"), A = g("../../composite-xform"), s = g("../../../../doc/range"), l = g("./databar-xform"), n = g("./ext-lst-ref-xform"), a = g("./formula-xform"), d = g("./color-scale-xform"), o = g("./icon-set-xform"), c = { "3Triangles": !0, "3Stars": !0, "5Boxes": !0 }, r = (b) => {
  37378. const { type: u, operator: m } = b;
  37379. switch (u) {
  37380. case "containsText":
  37381. case "containsBlanks":
  37382. case "notContainsBlanks":
  37383. case "containsErrors":
  37384. case "notContainsErrors":
  37385. return { type: "containsText", operator: u };
  37386. default:
  37387. return { type: u, operator: m };
  37388. }
  37389. };
  37390. class h extends A {
  37391. constructor() {
  37392. super(), this.map = { dataBar: this.databarXform = new l(), extLst: this.extLstRefXform = new n(), formula: this.formulaXform = new a(), colorScale: this.colorScaleXform = new d(), iconSet: this.iconSetXform = new o() };
  37393. }
  37394. get tag() {
  37395. return "cfRule";
  37396. }
  37397. static isPrimitive(u) {
  37398. return u.type !== "iconSet" || !u.custom && !c[u.iconSet];
  37399. }
  37400. render(u, m) {
  37401. switch (m.type) {
  37402. case "expression":
  37403. this.renderExpression(u, m);
  37404. break;
  37405. case "cellIs":
  37406. this.renderCellIs(u, m);
  37407. break;
  37408. case "top10":
  37409. this.renderTop10(u, m);
  37410. break;
  37411. case "aboveAverage":
  37412. this.renderAboveAverage(u, m);
  37413. break;
  37414. case "dataBar":
  37415. this.renderDataBar(u, m);
  37416. break;
  37417. case "colorScale":
  37418. this.renderColorScale(u, m);
  37419. break;
  37420. case "iconSet":
  37421. this.renderIconSet(u, m);
  37422. break;
  37423. case "containsText":
  37424. this.renderText(u, m);
  37425. break;
  37426. case "timePeriod":
  37427. this.renderTimePeriod(u, m);
  37428. }
  37429. }
  37430. renderExpression(u, m) {
  37431. u.openNode(this.tag, { type: "expression", dxfId: m.dxfId, priority: m.priority }), this.formulaXform.render(u, m.formulae[0]), u.closeNode();
  37432. }
  37433. renderCellIs(u, m) {
  37434. u.openNode(this.tag, { type: "cellIs", dxfId: m.dxfId, priority: m.priority, operator: m.operator }), m.formulae.forEach((Z) => {
  37435. this.formulaXform.render(u, Z);
  37436. }), u.closeNode();
  37437. }
  37438. renderTop10(u, m) {
  37439. u.leafNode(this.tag, { type: "top10", dxfId: m.dxfId, priority: m.priority, percent: e.toBoolAttribute(m.percent, !1), bottom: e.toBoolAttribute(m.bottom, !1), rank: e.toIntValue(m.rank, 10, !0) });
  37440. }
  37441. renderAboveAverage(u, m) {
  37442. u.leafNode(this.tag, { type: "aboveAverage", dxfId: m.dxfId, priority: m.priority, aboveAverage: e.toBoolAttribute(m.aboveAverage, !0) });
  37443. }
  37444. renderDataBar(u, m) {
  37445. u.openNode(this.tag, { type: "dataBar", priority: m.priority }), this.databarXform.render(u, m), this.extLstRefXform.render(u, m), u.closeNode();
  37446. }
  37447. renderColorScale(u, m) {
  37448. u.openNode(this.tag, { type: "colorScale", priority: m.priority }), this.colorScaleXform.render(u, m), u.closeNode();
  37449. }
  37450. renderIconSet(u, m) {
  37451. h.isPrimitive(m) && (u.openNode(this.tag, { type: "iconSet", priority: m.priority }), this.iconSetXform.render(u, m), u.closeNode());
  37452. }
  37453. renderText(u, m) {
  37454. u.openNode(this.tag, { type: m.operator, dxfId: m.dxfId, priority: m.priority, operator: e.toStringAttribute(m.operator, "containsText") });
  37455. const Z = ((p) => {
  37456. if (p.formulae && p.formulae[0]) return p.formulae[0];
  37457. const Y = new s(p.ref), { tl: R } = Y;
  37458. switch (p.operator) {
  37459. case "containsText":
  37460. return `NOT(ISERROR(SEARCH("${p.text}",${R})))`;
  37461. case "containsBlanks":
  37462. return `LEN(TRIM(${R}))=0`;
  37463. case "notContainsBlanks":
  37464. return `LEN(TRIM(${R}))>0`;
  37465. case "containsErrors":
  37466. return `ISERROR(${R})`;
  37467. case "notContainsErrors":
  37468. return `NOT(ISERROR(${R}))`;
  37469. default:
  37470. return;
  37471. }
  37472. })(m);
  37473. Z && this.formulaXform.render(u, Z), u.closeNode();
  37474. }
  37475. renderTimePeriod(u, m) {
  37476. u.openNode(this.tag, { type: "timePeriod", dxfId: m.dxfId, priority: m.priority, timePeriod: m.timePeriod });
  37477. const Z = ((p) => {
  37478. if (p.formulae && p.formulae[0]) return p.formulae[0];
  37479. const Y = new s(p.ref), { tl: R } = Y;
  37480. switch (p.timePeriod) {
  37481. case "thisWeek":
  37482. return `AND(TODAY()-ROUNDDOWN(${R},0)<=WEEKDAY(TODAY())-1,ROUNDDOWN(${R},0)-TODAY()<=7-WEEKDAY(TODAY()))`;
  37483. case "lastWeek":
  37484. return `AND(TODAY()-ROUNDDOWN(${R},0)>=(WEEKDAY(TODAY())),TODAY()-ROUNDDOWN(${R},0)<(WEEKDAY(TODAY())+7))`;
  37485. case "nextWeek":
  37486. return `AND(ROUNDDOWN(${R},0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN(${R},0)-TODAY()<(15-WEEKDAY(TODAY())))`;
  37487. case "yesterday":
  37488. return `FLOOR(${R},1)=TODAY()-1`;
  37489. case "today":
  37490. return `FLOOR(${R},1)=TODAY()`;
  37491. case "tomorrow":
  37492. return `FLOOR(${R},1)=TODAY()+1`;
  37493. case "last7Days":
  37494. return `AND(TODAY()-FLOOR(${R},1)<=6,FLOOR(${R},1)<=TODAY())`;
  37495. case "lastMonth":
  37496. return `AND(MONTH(${R})=MONTH(EDATE(TODAY(),0-1)),YEAR(${R})=YEAR(EDATE(TODAY(),0-1)))`;
  37497. case "thisMonth":
  37498. return `AND(MONTH(${R})=MONTH(TODAY()),YEAR(${R})=YEAR(TODAY()))`;
  37499. case "nextMonth":
  37500. return `AND(MONTH(${R})=MONTH(EDATE(TODAY(),0+1)),YEAR(${R})=YEAR(EDATE(TODAY(),0+1)))`;
  37501. default:
  37502. return;
  37503. }
  37504. })(m);
  37505. Z && this.formulaXform.render(u, Z), u.closeNode();
  37506. }
  37507. createNewModel(u) {
  37508. let { attributes: m } = u;
  37509. return { ...r(m), dxfId: e.toIntValue(m.dxfId), priority: e.toIntValue(m.priority), timePeriod: m.timePeriod, percent: e.toBoolValue(m.percent), bottom: e.toBoolValue(m.bottom), rank: e.toIntValue(m.rank), aboveAverage: e.toBoolValue(m.aboveAverage) };
  37510. }
  37511. onParserClose(u, m) {
  37512. switch (u) {
  37513. case "dataBar":
  37514. case "extLst":
  37515. case "colorScale":
  37516. case "iconSet":
  37517. Object.assign(this.model, m.model);
  37518. break;
  37519. case "formula":
  37520. this.model.formulae = this.model.formulae || [], this.model.formulae.push(m.model);
  37521. }
  37522. }
  37523. }
  37524. C.exports = h;
  37525. }, { "../../../../doc/range": 10, "../../base-xform": 32, "../../composite-xform": 48, "./color-scale-xform": 85, "./databar-xform": 88, "./ext-lst-ref-xform": 89, "./formula-xform": 90, "./icon-set-xform": 91 }], 84: [function(g, C, i) {
  37526. const e = g("../../base-xform");
  37527. C.exports = class extends e {
  37528. get tag() {
  37529. return "cfvo";
  37530. }
  37531. render(A, s) {
  37532. A.leafNode(this.tag, { type: s.type, val: s.value });
  37533. }
  37534. parseOpen(A) {
  37535. this.model = { type: A.attributes.type, value: e.toFloatValue(A.attributes.val) };
  37536. }
  37537. parseClose(A) {
  37538. return A !== this.tag;
  37539. }
  37540. };
  37541. }, { "../../base-xform": 32 }], 85: [function(g, C, i) {
  37542. const e = g("../../composite-xform"), A = g("../../style/color-xform"), s = g("./cfvo-xform");
  37543. C.exports = class extends e {
  37544. constructor() {
  37545. super(), this.map = { cfvo: this.cfvoXform = new s(), color: this.colorXform = new A() };
  37546. }
  37547. get tag() {
  37548. return "colorScale";
  37549. }
  37550. render(l, n) {
  37551. l.openNode(this.tag), n.cfvo.forEach((a) => {
  37552. this.cfvoXform.render(l, a);
  37553. }), n.color.forEach((a) => {
  37554. this.colorXform.render(l, a);
  37555. }), l.closeNode();
  37556. }
  37557. createNewModel(l) {
  37558. return { cfvo: [], color: [] };
  37559. }
  37560. onParserClose(l, n) {
  37561. this.model[l].push(n.model);
  37562. }
  37563. };
  37564. }, { "../../composite-xform": 48, "../../style/color-xform": 128, "./cfvo-xform": 84 }], 86: [function(g, C, i) {
  37565. const e = g("../../composite-xform"), A = g("./cf-rule-xform");
  37566. C.exports = class extends e {
  37567. constructor() {
  37568. super(), this.map = { cfRule: new A() };
  37569. }
  37570. get tag() {
  37571. return "conditionalFormatting";
  37572. }
  37573. render(s, l) {
  37574. l.rules.some(A.isPrimitive) && (s.openNode(this.tag, { sqref: l.ref }), l.rules.forEach((n) => {
  37575. A.isPrimitive(n) && (n.ref = l.ref, this.map.cfRule.render(s, n));
  37576. }), s.closeNode());
  37577. }
  37578. createNewModel(s) {
  37579. let { attributes: l } = s;
  37580. return { ref: l.sqref, rules: [] };
  37581. }
  37582. onParserClose(s, l) {
  37583. this.model.rules.push(l.model);
  37584. }
  37585. };
  37586. }, { "../../composite-xform": 48, "./cf-rule-xform": 83 }], 87: [function(g, C, i) {
  37587. const e = g("../../base-xform"), A = g("./conditional-formatting-xform");
  37588. C.exports = class extends e {
  37589. constructor() {
  37590. super(), this.cfXform = new A();
  37591. }
  37592. get tag() {
  37593. return "conditionalFormatting";
  37594. }
  37595. reset() {
  37596. this.model = [];
  37597. }
  37598. prepare(s, l) {
  37599. let n = s.reduce((a, d) => Math.max(a, ...d.rules.map((o) => o.priority || 0)), 1);
  37600. s.forEach((a) => {
  37601. a.rules.forEach((d) => {
  37602. d.priority || (d.priority = n++), d.style && (d.dxfId = l.styles.addDxfStyle(d.style));
  37603. });
  37604. });
  37605. }
  37606. render(s, l) {
  37607. l.forEach((n) => {
  37608. this.cfXform.render(s, n);
  37609. });
  37610. }
  37611. parseOpen(s) {
  37612. if (this.parser) return this.parser.parseOpen(s), !0;
  37613. switch (s.name) {
  37614. case "conditionalFormatting":
  37615. return this.parser = this.cfXform, this.parser.parseOpen(s), !0;
  37616. default:
  37617. return !1;
  37618. }
  37619. }
  37620. parseText(s) {
  37621. this.parser && this.parser.parseText(s);
  37622. }
  37623. parseClose(s) {
  37624. return !!this.parser && (!!this.parser.parseClose(s) || (this.model.push(this.parser.model), this.parser = void 0, !1));
  37625. }
  37626. reconcile(s, l) {
  37627. s.forEach((n) => {
  37628. n.rules.forEach((a) => {
  37629. a.dxfId !== void 0 && (a.style = l.styles.getDxfStyle(a.dxfId), delete a.dxfId);
  37630. });
  37631. });
  37632. }
  37633. };
  37634. }, { "../../base-xform": 32, "./conditional-formatting-xform": 86 }], 88: [function(g, C, i) {
  37635. const e = g("../../composite-xform"), A = g("../../style/color-xform"), s = g("./cfvo-xform");
  37636. C.exports = class extends e {
  37637. constructor() {
  37638. super(), this.map = { cfvo: this.cfvoXform = new s(), color: this.colorXform = new A() };
  37639. }
  37640. get tag() {
  37641. return "dataBar";
  37642. }
  37643. render(l, n) {
  37644. l.openNode(this.tag), n.cfvo.forEach((a) => {
  37645. this.cfvoXform.render(l, a);
  37646. }), this.colorXform.render(l, n.color), l.closeNode();
  37647. }
  37648. createNewModel() {
  37649. return { cfvo: [] };
  37650. }
  37651. onParserClose(l, n) {
  37652. switch (l) {
  37653. case "cfvo":
  37654. this.model.cfvo.push(n.model);
  37655. break;
  37656. case "color":
  37657. this.model.color = n.model;
  37658. }
  37659. }
  37660. };
  37661. }, { "../../composite-xform": 48, "../../style/color-xform": 128, "./cfvo-xform": 84 }], 89: [function(g, C, i) {
  37662. const e = g("../../base-xform"), A = g("../../composite-xform");
  37663. class s extends e {
  37664. get tag() {
  37665. return "x14:id";
  37666. }
  37667. render(a, d) {
  37668. a.leafNode(this.tag, null, d);
  37669. }
  37670. parseOpen() {
  37671. this.model = "";
  37672. }
  37673. parseText(a) {
  37674. this.model += a;
  37675. }
  37676. parseClose(a) {
  37677. return a !== this.tag;
  37678. }
  37679. }
  37680. class l extends A {
  37681. constructor() {
  37682. super(), this.map = { "x14:id": this.idXform = new s() };
  37683. }
  37684. get tag() {
  37685. return "ext";
  37686. }
  37687. render(a, d) {
  37688. a.openNode(this.tag, { uri: "{B025F937-C7B1-47D3-B67F-A62EFF666E3E}", "xmlns:x14": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" }), this.idXform.render(a, d.x14Id), a.closeNode();
  37689. }
  37690. createNewModel() {
  37691. return {};
  37692. }
  37693. onParserClose(a, d) {
  37694. this.model.x14Id = d.model;
  37695. }
  37696. }
  37697. C.exports = class extends A {
  37698. constructor() {
  37699. super(), this.map = { ext: new l() };
  37700. }
  37701. get tag() {
  37702. return "extLst";
  37703. }
  37704. render(n, a) {
  37705. n.openNode(this.tag), this.map.ext.render(n, a), n.closeNode();
  37706. }
  37707. createNewModel() {
  37708. return {};
  37709. }
  37710. onParserClose(n, a) {
  37711. Object.assign(this.model, a.model);
  37712. }
  37713. };
  37714. }, { "../../base-xform": 32, "../../composite-xform": 48 }], 90: [function(g, C, i) {
  37715. const e = g("../../base-xform");
  37716. C.exports = class extends e {
  37717. get tag() {
  37718. return "formula";
  37719. }
  37720. render(A, s) {
  37721. A.leafNode(this.tag, null, s);
  37722. }
  37723. parseOpen() {
  37724. this.model = "";
  37725. }
  37726. parseText(A) {
  37727. this.model += A;
  37728. }
  37729. parseClose(A) {
  37730. return A !== this.tag;
  37731. }
  37732. };
  37733. }, { "../../base-xform": 32 }], 91: [function(g, C, i) {
  37734. const e = g("../../base-xform"), A = g("../../composite-xform"), s = g("./cfvo-xform");
  37735. C.exports = class extends A {
  37736. constructor() {
  37737. super(), this.map = { cfvo: this.cfvoXform = new s() };
  37738. }
  37739. get tag() {
  37740. return "iconSet";
  37741. }
  37742. render(l, n) {
  37743. l.openNode(this.tag, { iconSet: e.toStringAttribute(n.iconSet, "3TrafficLights"), reverse: e.toBoolAttribute(n.reverse, !1), showValue: e.toBoolAttribute(n.showValue, !0) }), n.cfvo.forEach((a) => {
  37744. this.cfvoXform.render(l, a);
  37745. }), l.closeNode();
  37746. }
  37747. createNewModel(l) {
  37748. let { attributes: n } = l;
  37749. return { iconSet: e.toStringValue(n.iconSet, "3TrafficLights"), reverse: e.toBoolValue(n.reverse), showValue: e.toBoolValue(n.showValue), cfvo: [] };
  37750. }
  37751. onParserClose(l, n) {
  37752. this.model[l].push(n.model);
  37753. }
  37754. };
  37755. }, { "../../base-xform": 32, "../../composite-xform": 48, "./cfvo-xform": 84 }], 92: [function(g, C, i) {
  37756. const e = g("../../../utils/utils"), A = g("../base-xform");
  37757. C.exports = class extends A {
  37758. get tag() {
  37759. return "col";
  37760. }
  37761. prepare(s, l) {
  37762. const n = l.styles.addStyleModel(s.style || {});
  37763. n && (s.styleId = n);
  37764. }
  37765. render(s, l) {
  37766. s.openNode("col"), s.addAttribute("min", l.min), s.addAttribute("max", l.max), l.width && s.addAttribute("width", l.width), l.styleId && s.addAttribute("style", l.styleId), l.hidden && s.addAttribute("hidden", "1"), l.bestFit && s.addAttribute("bestFit", "1"), l.outlineLevel && s.addAttribute("outlineLevel", l.outlineLevel), l.collapsed && s.addAttribute("collapsed", "1"), s.addAttribute("customWidth", "1"), s.closeNode();
  37767. }
  37768. parseOpen(s) {
  37769. if (s.name === "col") {
  37770. const l = this.model = { min: parseInt(s.attributes.min || "0", 10), max: parseInt(s.attributes.max || "0", 10), width: s.attributes.width === void 0 ? void 0 : parseFloat(s.attributes.width || "0") };
  37771. return s.attributes.style && (l.styleId = parseInt(s.attributes.style, 10)), e.parseBoolean(s.attributes.hidden) && (l.hidden = !0), e.parseBoolean(s.attributes.bestFit) && (l.bestFit = !0), s.attributes.outlineLevel && (l.outlineLevel = parseInt(s.attributes.outlineLevel, 10)), e.parseBoolean(s.attributes.collapsed) && (l.collapsed = !0), !0;
  37772. }
  37773. return !1;
  37774. }
  37775. parseText() {
  37776. }
  37777. parseClose() {
  37778. return !1;
  37779. }
  37780. reconcile(s, l) {
  37781. s.styleId && (s.style = l.styles.getStyleModel(s.styleId));
  37782. }
  37783. };
  37784. }, { "../../../utils/utils": 27, "../base-xform": 32 }], 93: [function(g, C, i) {
  37785. const e = g("../../../utils/under-dash"), A = g("../../../utils/utils"), s = g("../../../utils/col-cache"), l = g("../base-xform"), n = g("../../../doc/range");
  37786. function a(o, c, r, h) {
  37787. const b = c[r];
  37788. b !== void 0 ? o[r] = b : h !== void 0 && (o[r] = h);
  37789. }
  37790. function d(o, c, r, h) {
  37791. const b = c[r];
  37792. b !== void 0 && (o[r] = A.parseBoolean(b));
  37793. }
  37794. C.exports = class extends l {
  37795. get tag() {
  37796. return "dataValidations";
  37797. }
  37798. render(o, c) {
  37799. const r = function(h) {
  37800. const b = e.map(h, (Z, p) => ({ address: p, dataValidation: Z, marked: !1 })).sort((Z, p) => e.strcmp(Z.address, p.address)), u = e.keyBy(b, "address"), m = (Z, p, Y) => {
  37801. for (let R = 0; R < p; R++) {
  37802. const X = s.encodeAddress(Z.row + R, Y);
  37803. if (!h[X] || !e.isEqual(h[Z.address], h[X])) return !1;
  37804. }
  37805. return !0;
  37806. };
  37807. return b.map((Z) => {
  37808. if (!Z.marked) {
  37809. const p = s.decodeEx(Z.address);
  37810. if (p.dimensions) return u[p.dimensions].marked = !0, { ...Z.dataValidation, sqref: Z.address };
  37811. let Y = 1, R = s.encodeAddress(p.row + Y, p.col);
  37812. for (; h[R] && e.isEqual(Z.dataValidation, h[R]); ) Y++, R = s.encodeAddress(p.row + Y, p.col);
  37813. let X = 1;
  37814. for (; m(p, Y, p.col + X); ) X++;
  37815. for (let H = 0; H < Y; H++) for (let S = 0; S < X; S++) R = s.encodeAddress(p.row + H, p.col + S), u[R].marked = !0;
  37816. if (Y > 1 || X > 1) {
  37817. const H = p.row + (Y - 1), S = p.col + (X - 1);
  37818. return { ...Z.dataValidation, sqref: `${Z.address}:${s.encodeAddress(H, S)}` };
  37819. }
  37820. return { ...Z.dataValidation, sqref: Z.address };
  37821. }
  37822. return null;
  37823. }).filter(Boolean);
  37824. }(c);
  37825. r.length && (o.openNode("dataValidations", { count: r.length }), r.forEach((h) => {
  37826. o.openNode("dataValidation"), h.type !== "any" && (o.addAttribute("type", h.type), h.operator && h.type !== "list" && h.operator !== "between" && o.addAttribute("operator", h.operator), h.allowBlank && o.addAttribute("allowBlank", "1")), h.showInputMessage && o.addAttribute("showInputMessage", "1"), h.promptTitle && o.addAttribute("promptTitle", h.promptTitle), h.prompt && o.addAttribute("prompt", h.prompt), h.showErrorMessage && o.addAttribute("showErrorMessage", "1"), h.errorStyle && o.addAttribute("errorStyle", h.errorStyle), h.errorTitle && o.addAttribute("errorTitle", h.errorTitle), h.error && o.addAttribute("error", h.error), o.addAttribute("sqref", h.sqref), (h.formulae || []).forEach((b, u) => {
  37827. o.openNode("formula" + (u + 1)), h.type === "date" ? o.writeText(A.dateToExcel(new Date(b))) : o.writeText(b), o.closeNode();
  37828. }), o.closeNode();
  37829. }), o.closeNode());
  37830. }
  37831. parseOpen(o) {
  37832. switch (o.name) {
  37833. case "dataValidations":
  37834. return this.model = {}, !0;
  37835. case "dataValidation": {
  37836. this._address = o.attributes.sqref;
  37837. const c = { type: o.attributes.type || "any", formulae: [] };
  37838. switch (o.attributes.type && d(c, o.attributes, "allowBlank"), d(c, o.attributes, "showInputMessage"), d(c, o.attributes, "showErrorMessage"), c.type) {
  37839. case "any":
  37840. case "list":
  37841. case "custom":
  37842. break;
  37843. default:
  37844. a(c, o.attributes, "operator", "between");
  37845. }
  37846. return a(c, o.attributes, "promptTitle"), a(c, o.attributes, "prompt"), a(c, o.attributes, "errorStyle"), a(c, o.attributes, "errorTitle"), a(c, o.attributes, "error"), this._dataValidation = c, !0;
  37847. }
  37848. case "formula1":
  37849. case "formula2":
  37850. return this._formula = [], !0;
  37851. default:
  37852. return !1;
  37853. }
  37854. }
  37855. parseText(o) {
  37856. this._formula && this._formula.push(o);
  37857. }
  37858. parseClose(o) {
  37859. switch (o) {
  37860. case "dataValidations":
  37861. return !1;
  37862. case "dataValidation":
  37863. return this._dataValidation.formulae && this._dataValidation.formulae.length || (delete this._dataValidation.formulae, delete this._dataValidation.operator), (this._address.split(/\s+/g) || []).forEach((c) => {
  37864. c.includes(":") ? new n(c).forEachAddress((r) => {
  37865. this.model[r] = this._dataValidation;
  37866. }) : this.model[c] = this._dataValidation;
  37867. }), !0;
  37868. case "formula1":
  37869. case "formula2": {
  37870. let c = this._formula.join("");
  37871. switch (this._dataValidation.type) {
  37872. case "whole":
  37873. case "textLength":
  37874. c = parseInt(c, 10);
  37875. break;
  37876. case "decimal":
  37877. c = parseFloat(c);
  37878. break;
  37879. case "date":
  37880. c = A.excelToDate(parseFloat(c));
  37881. }
  37882. return this._dataValidation.formulae.push(c), this._formula = void 0, !0;
  37883. }
  37884. default:
  37885. return !0;
  37886. }
  37887. }
  37888. };
  37889. }, { "../../../doc/range": 10, "../../../utils/col-cache": 19, "../../../utils/under-dash": 26, "../../../utils/utils": 27, "../base-xform": 32 }], 94: [function(g, C, i) {
  37890. const e = g("../base-xform");
  37891. C.exports = class extends e {
  37892. get tag() {
  37893. return "dimension";
  37894. }
  37895. render(A, s) {
  37896. s && A.leafNode("dimension", { ref: s });
  37897. }
  37898. parseOpen(A) {
  37899. return A.name === "dimension" && (this.model = A.attributes.ref, !0);
  37900. }
  37901. parseText() {
  37902. }
  37903. parseClose() {
  37904. return !1;
  37905. }
  37906. };
  37907. }, { "../base-xform": 32 }], 95: [function(g, C, i) {
  37908. const e = g("../base-xform");
  37909. C.exports = class extends e {
  37910. get tag() {
  37911. return "drawing";
  37912. }
  37913. render(A, s) {
  37914. s && A.leafNode(this.tag, { "r:id": s.rId });
  37915. }
  37916. parseOpen(A) {
  37917. switch (A.name) {
  37918. case this.tag:
  37919. return this.model = { rId: A.attributes["r:id"] }, !0;
  37920. default:
  37921. return !1;
  37922. }
  37923. }
  37924. parseText() {
  37925. }
  37926. parseClose() {
  37927. return !1;
  37928. }
  37929. };
  37930. }, { "../base-xform": 32 }], 96: [function(g, C, i) {
  37931. const e = g("../composite-xform"), A = g("./cf-ext/conditional-formattings-ext-xform");
  37932. class s extends e {
  37933. constructor() {
  37934. super(), this.map = { "x14:conditionalFormattings": this.conditionalFormattings = new A() };
  37935. }
  37936. get tag() {
  37937. return "ext";
  37938. }
  37939. hasContent(n) {
  37940. return this.conditionalFormattings.hasContent(n.conditionalFormattings);
  37941. }
  37942. prepare(n, a) {
  37943. this.conditionalFormattings.prepare(n.conditionalFormattings, a);
  37944. }
  37945. render(n, a) {
  37946. n.openNode("ext", { uri: "{78C0D931-6437-407d-A8EE-F0AAD7539E65}", "xmlns:x14": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" }), this.conditionalFormattings.render(n, a.conditionalFormattings), n.closeNode();
  37947. }
  37948. createNewModel() {
  37949. return {};
  37950. }
  37951. onParserClose(n, a) {
  37952. this.model[n] = a.model;
  37953. }
  37954. }
  37955. C.exports = class extends e {
  37956. constructor() {
  37957. super(), this.map = { ext: this.ext = new s() };
  37958. }
  37959. get tag() {
  37960. return "extLst";
  37961. }
  37962. prepare(l, n) {
  37963. this.ext.prepare(l, n);
  37964. }
  37965. hasContent(l) {
  37966. return this.ext.hasContent(l);
  37967. }
  37968. render(l, n) {
  37969. this.hasContent(n) && (l.openNode("extLst"), this.ext.render(l, n), l.closeNode());
  37970. }
  37971. createNewModel() {
  37972. return {};
  37973. }
  37974. onParserClose(l, n) {
  37975. Object.assign(this.model, n.model);
  37976. }
  37977. };
  37978. }, { "../composite-xform": 48, "./cf-ext/conditional-formattings-ext-xform": 78 }], 97: [function(g, C, i) {
  37979. const e = g("../base-xform");
  37980. C.exports = class extends e {
  37981. get tag() {
  37982. return "headerFooter";
  37983. }
  37984. render(A, s) {
  37985. if (s) {
  37986. A.addRollback();
  37987. let l = !1;
  37988. A.openNode("headerFooter"), s.differentFirst && (A.addAttribute("differentFirst", "1"), l = !0), s.differentOddEven && (A.addAttribute("differentOddEven", "1"), l = !0), s.oddHeader && typeof s.oddHeader == "string" && (A.leafNode("oddHeader", null, s.oddHeader), l = !0), s.oddFooter && typeof s.oddFooter == "string" && (A.leafNode("oddFooter", null, s.oddFooter), l = !0), s.evenHeader && typeof s.evenHeader == "string" && (A.leafNode("evenHeader", null, s.evenHeader), l = !0), s.evenFooter && typeof s.evenFooter == "string" && (A.leafNode("evenFooter", null, s.evenFooter), l = !0), s.firstHeader && typeof s.firstHeader == "string" && (A.leafNode("firstHeader", null, s.firstHeader), l = !0), s.firstFooter && typeof s.firstFooter == "string" && (A.leafNode("firstFooter", null, s.firstFooter), l = !0), l ? (A.closeNode(), A.commit()) : A.rollback();
  37989. }
  37990. }
  37991. parseOpen(A) {
  37992. switch (A.name) {
  37993. case "headerFooter":
  37994. return this.model = {}, A.attributes.differentFirst && (this.model.differentFirst = parseInt(A.attributes.differentFirst, 0) === 1), A.attributes.differentOddEven && (this.model.differentOddEven = parseInt(A.attributes.differentOddEven, 0) === 1), !0;
  37995. case "oddHeader":
  37996. return this.currentNode = "oddHeader", !0;
  37997. case "oddFooter":
  37998. return this.currentNode = "oddFooter", !0;
  37999. case "evenHeader":
  38000. return this.currentNode = "evenHeader", !0;
  38001. case "evenFooter":
  38002. return this.currentNode = "evenFooter", !0;
  38003. case "firstHeader":
  38004. return this.currentNode = "firstHeader", !0;
  38005. case "firstFooter":
  38006. return this.currentNode = "firstFooter", !0;
  38007. default:
  38008. return !1;
  38009. }
  38010. }
  38011. parseText(A) {
  38012. switch (this.currentNode) {
  38013. case "oddHeader":
  38014. this.model.oddHeader = A;
  38015. break;
  38016. case "oddFooter":
  38017. this.model.oddFooter = A;
  38018. break;
  38019. case "evenHeader":
  38020. this.model.evenHeader = A;
  38021. break;
  38022. case "evenFooter":
  38023. this.model.evenFooter = A;
  38024. break;
  38025. case "firstHeader":
  38026. this.model.firstHeader = A;
  38027. break;
  38028. case "firstFooter":
  38029. this.model.firstFooter = A;
  38030. }
  38031. }
  38032. parseClose() {
  38033. switch (this.currentNode) {
  38034. case "oddHeader":
  38035. case "oddFooter":
  38036. case "evenHeader":
  38037. case "evenFooter":
  38038. case "firstHeader":
  38039. case "firstFooter":
  38040. return this.currentNode = void 0, !0;
  38041. default:
  38042. return !1;
  38043. }
  38044. }
  38045. };
  38046. }, { "../base-xform": 32 }], 98: [function(g, C, i) {
  38047. const e = g("../base-xform");
  38048. C.exports = class extends e {
  38049. get tag() {
  38050. return "hyperlink";
  38051. }
  38052. render(A, s) {
  38053. this.isInternalLink(s) ? A.leafNode("hyperlink", { ref: s.address, "r:id": s.rId, tooltip: s.tooltip, location: s.target }) : A.leafNode("hyperlink", { ref: s.address, "r:id": s.rId, tooltip: s.tooltip });
  38054. }
  38055. parseOpen(A) {
  38056. return A.name === "hyperlink" && (this.model = { address: A.attributes.ref, rId: A.attributes["r:id"], tooltip: A.attributes.tooltip }, A.attributes.location && (this.model.target = A.attributes.location), !0);
  38057. }
  38058. parseText() {
  38059. }
  38060. parseClose() {
  38061. return !1;
  38062. }
  38063. isInternalLink(A) {
  38064. return A.target && /^[^!]+![a-zA-Z]+[\d]+$/.test(A.target);
  38065. }
  38066. };
  38067. }, { "../base-xform": 32 }], 99: [function(g, C, i) {
  38068. const e = g("../base-xform");
  38069. C.exports = class extends e {
  38070. get tag() {
  38071. return "mergeCell";
  38072. }
  38073. render(A, s) {
  38074. A.leafNode("mergeCell", { ref: s });
  38075. }
  38076. parseOpen(A) {
  38077. return A.name === "mergeCell" && (this.model = A.attributes.ref, !0);
  38078. }
  38079. parseText() {
  38080. }
  38081. parseClose() {
  38082. return !1;
  38083. }
  38084. };
  38085. }, { "../base-xform": 32 }], 100: [function(g, C, i) {
  38086. const e = g("../../../utils/under-dash"), A = g("../../../doc/range"), s = g("../../../utils/col-cache"), l = g("../../../doc/enums");
  38087. C.exports = class {
  38088. constructor() {
  38089. this.merges = {};
  38090. }
  38091. add(n) {
  38092. if (this.merges[n.master]) this.merges[n.master].expandToAddress(n.address);
  38093. else {
  38094. const a = `${n.master}:${n.address}`;
  38095. this.merges[n.master] = new A(a);
  38096. }
  38097. }
  38098. get mergeCells() {
  38099. return e.map(this.merges, (n) => n.range);
  38100. }
  38101. reconcile(n, a) {
  38102. e.each(n, (d) => {
  38103. const o = s.decode(d);
  38104. for (let c = o.top; c <= o.bottom; c++) {
  38105. const r = a[c - 1];
  38106. for (let h = o.left; h <= o.right; h++) {
  38107. const b = r.cells[h - 1];
  38108. b ? b.type === l.ValueType.Merge && (b.master = o.tl) : r.cells[h] = { type: l.ValueType.Null, address: s.encodeAddress(c, h) };
  38109. }
  38110. }
  38111. });
  38112. }
  38113. getMasterAddress(n) {
  38114. const a = this.hash[n];
  38115. return a && a.tl;
  38116. }
  38117. };
  38118. }, { "../../../doc/enums": 7, "../../../doc/range": 10, "../../../utils/col-cache": 19, "../../../utils/under-dash": 26 }], 101: [function(g, C, i) {
  38119. const e = g("../base-xform"), A = (s) => s !== void 0;
  38120. C.exports = class extends e {
  38121. get tag() {
  38122. return "outlinePr";
  38123. }
  38124. render(s, l) {
  38125. return !(!l || !A(l.summaryBelow) && !A(l.summaryRight)) && (s.leafNode(this.tag, { summaryBelow: A(l.summaryBelow) ? Number(l.summaryBelow) : void 0, summaryRight: A(l.summaryRight) ? Number(l.summaryRight) : void 0 }), !0);
  38126. }
  38127. parseOpen(s) {
  38128. return s.name === this.tag && (this.model = { summaryBelow: A(s.attributes.summaryBelow) ? !!Number(s.attributes.summaryBelow) : void 0, summaryRight: A(s.attributes.summaryRight) ? !!Number(s.attributes.summaryRight) : void 0 }, !0);
  38129. }
  38130. parseText() {
  38131. }
  38132. parseClose() {
  38133. return !1;
  38134. }
  38135. };
  38136. }, { "../base-xform": 32 }], 102: [function(g, C, i) {
  38137. const e = g("../base-xform");
  38138. C.exports = class extends e {
  38139. get tag() {
  38140. return "brk";
  38141. }
  38142. render(A, s) {
  38143. A.leafNode("brk", s);
  38144. }
  38145. parseOpen(A) {
  38146. return A.name === "brk" && (this.model = A.attributes.ref, !0);
  38147. }
  38148. parseText() {
  38149. }
  38150. parseClose() {
  38151. return !1;
  38152. }
  38153. };
  38154. }, { "../base-xform": 32 }], 103: [function(g, C, i) {
  38155. const e = g("../../../utils/under-dash"), A = g("../base-xform");
  38156. C.exports = class extends A {
  38157. get tag() {
  38158. return "pageMargins";
  38159. }
  38160. render(s, l) {
  38161. if (l) {
  38162. const n = { left: l.left, right: l.right, top: l.top, bottom: l.bottom, header: l.header, footer: l.footer };
  38163. e.some(n, (a) => a !== void 0) && s.leafNode(this.tag, n);
  38164. }
  38165. }
  38166. parseOpen(s) {
  38167. switch (s.name) {
  38168. case this.tag:
  38169. return this.model = { left: parseFloat(s.attributes.left || 0.7), right: parseFloat(s.attributes.right || 0.7), top: parseFloat(s.attributes.top || 0.75), bottom: parseFloat(s.attributes.bottom || 0.75), header: parseFloat(s.attributes.header || 0.3), footer: parseFloat(s.attributes.footer || 0.3) }, !0;
  38170. default:
  38171. return !1;
  38172. }
  38173. }
  38174. parseText() {
  38175. }
  38176. parseClose() {
  38177. return !1;
  38178. }
  38179. };
  38180. }, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 104: [function(g, C, i) {
  38181. const e = g("../base-xform");
  38182. C.exports = class extends e {
  38183. get tag() {
  38184. return "pageSetUpPr";
  38185. }
  38186. render(A, s) {
  38187. return !(!s || !s.fitToPage) && (A.leafNode(this.tag, { fitToPage: s.fitToPage ? "1" : void 0 }), !0);
  38188. }
  38189. parseOpen(A) {
  38190. return A.name === this.tag && (this.model = { fitToPage: A.attributes.fitToPage === "1" }, !0);
  38191. }
  38192. parseText() {
  38193. }
  38194. parseClose() {
  38195. return !1;
  38196. }
  38197. };
  38198. }, { "../base-xform": 32 }], 105: [function(g, C, i) {
  38199. const e = g("../../../utils/under-dash"), A = g("../base-xform");
  38200. function s(d) {
  38201. return d ? "1" : void 0;
  38202. }
  38203. function l(d) {
  38204. switch (d) {
  38205. case "overThenDown":
  38206. return d;
  38207. default:
  38208. return;
  38209. }
  38210. }
  38211. function n(d) {
  38212. switch (d) {
  38213. case "atEnd":
  38214. case "asDisplyed":
  38215. return d;
  38216. default:
  38217. return;
  38218. }
  38219. }
  38220. function a(d) {
  38221. switch (d) {
  38222. case "dash":
  38223. case "blank":
  38224. case "NA":
  38225. return d;
  38226. default:
  38227. return;
  38228. }
  38229. }
  38230. C.exports = class extends A {
  38231. get tag() {
  38232. return "pageSetup";
  38233. }
  38234. render(d, o) {
  38235. if (o) {
  38236. const c = { paperSize: o.paperSize, orientation: o.orientation, horizontalDpi: o.horizontalDpi, verticalDpi: o.verticalDpi, pageOrder: l(o.pageOrder), blackAndWhite: s(o.blackAndWhite), draft: s(o.draft), cellComments: n(o.cellComments), errors: a(o.errors), scale: o.scale, fitToWidth: o.fitToWidth, fitToHeight: o.fitToHeight, firstPageNumber: o.firstPageNumber, useFirstPageNumber: s(o.firstPageNumber), usePrinterDefaults: s(o.usePrinterDefaults), copies: o.copies };
  38237. e.some(c, (r) => r !== void 0) && d.leafNode(this.tag, c);
  38238. }
  38239. }
  38240. parseOpen(d) {
  38241. switch (d.name) {
  38242. case this.tag:
  38243. return this.model = { paperSize: (o = d.attributes.paperSize, o !== void 0 ? parseInt(o, 10) : void 0), orientation: d.attributes.orientation || "portrait", horizontalDpi: parseInt(d.attributes.horizontalDpi || "4294967295", 10), verticalDpi: parseInt(d.attributes.verticalDpi || "4294967295", 10), pageOrder: d.attributes.pageOrder || "downThenOver", blackAndWhite: d.attributes.blackAndWhite === "1", draft: d.attributes.draft === "1", cellComments: d.attributes.cellComments || "None", errors: d.attributes.errors || "displayed", scale: parseInt(d.attributes.scale || "100", 10), fitToWidth: parseInt(d.attributes.fitToWidth || "1", 10), fitToHeight: parseInt(d.attributes.fitToHeight || "1", 10), firstPageNumber: parseInt(d.attributes.firstPageNumber || "1", 10), useFirstPageNumber: d.attributes.useFirstPageNumber === "1", usePrinterDefaults: d.attributes.usePrinterDefaults === "1", copies: parseInt(d.attributes.copies || "1", 10) }, !0;
  38244. default:
  38245. return !1;
  38246. }
  38247. var o;
  38248. }
  38249. parseText() {
  38250. }
  38251. parseClose() {
  38252. return !1;
  38253. }
  38254. };
  38255. }, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 106: [function(g, C, i) {
  38256. const e = g("../base-xform");
  38257. C.exports = class extends e {
  38258. get tag() {
  38259. return "picture";
  38260. }
  38261. render(A, s) {
  38262. s && A.leafNode(this.tag, { "r:id": s.rId });
  38263. }
  38264. parseOpen(A) {
  38265. switch (A.name) {
  38266. case this.tag:
  38267. return this.model = { rId: A.attributes["r:id"] }, !0;
  38268. default:
  38269. return !1;
  38270. }
  38271. }
  38272. parseText() {
  38273. }
  38274. parseClose() {
  38275. return !1;
  38276. }
  38277. };
  38278. }, { "../base-xform": 32 }], 107: [function(g, C, i) {
  38279. const e = g("../../../utils/under-dash"), A = g("../base-xform");
  38280. function s(l) {
  38281. return l ? "1" : void 0;
  38282. }
  38283. C.exports = class extends A {
  38284. get tag() {
  38285. return "printOptions";
  38286. }
  38287. render(l, n) {
  38288. if (n) {
  38289. const a = { headings: s(n.showRowColHeaders), gridLines: s(n.showGridLines), horizontalCentered: s(n.horizontalCentered), verticalCentered: s(n.verticalCentered) };
  38290. e.some(a, (d) => d !== void 0) && l.leafNode(this.tag, a);
  38291. }
  38292. }
  38293. parseOpen(l) {
  38294. switch (l.name) {
  38295. case this.tag:
  38296. return this.model = { showRowColHeaders: l.attributes.headings === "1", showGridLines: l.attributes.gridLines === "1", horizontalCentered: l.attributes.horizontalCentered === "1", verticalCentered: l.attributes.verticalCentered === "1" }, !0;
  38297. default:
  38298. return !1;
  38299. }
  38300. }
  38301. parseText() {
  38302. }
  38303. parseClose() {
  38304. return !1;
  38305. }
  38306. };
  38307. }, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 108: [function(g, C, i) {
  38308. const e = g("./page-breaks-xform"), A = g("../list-xform");
  38309. C.exports = class extends A {
  38310. constructor() {
  38311. super({ tag: "rowBreaks", count: !0, childXform: new e() });
  38312. }
  38313. render(s, l) {
  38314. if (l && l.length) {
  38315. s.openNode(this.tag, this.$), this.count && (s.addAttribute(this.$count, l.length), s.addAttribute("manualBreakCount", l.length));
  38316. const { childXform: n } = this;
  38317. l.forEach((a) => {
  38318. n.render(s, a);
  38319. }), s.closeNode();
  38320. } else this.empty && s.leafNode(this.tag);
  38321. }
  38322. };
  38323. }, { "../list-xform": 71, "./page-breaks-xform": 102 }], 109: [function(g, C, i) {
  38324. const e = g("../base-xform"), A = g("../../../utils/utils"), s = g("./cell-xform");
  38325. C.exports = class extends e {
  38326. constructor(l) {
  38327. super(), this.maxItems = l && l.maxItems, this.map = { c: new s() };
  38328. }
  38329. get tag() {
  38330. return "row";
  38331. }
  38332. prepare(l, n) {
  38333. const a = n.styles.addStyleModel(l.style);
  38334. a && (l.styleId = a);
  38335. const d = this.map.c;
  38336. l.cells.forEach((o) => {
  38337. d.prepare(o, n);
  38338. });
  38339. }
  38340. render(l, n, a) {
  38341. l.openNode("row"), l.addAttribute("r", n.number), n.height && (l.addAttribute("ht", n.height), l.addAttribute("customHeight", "1")), n.hidden && l.addAttribute("hidden", "1"), n.min > 0 && n.max > 0 && n.min <= n.max && l.addAttribute("spans", `${n.min}:${n.max}`), n.styleId && (l.addAttribute("s", n.styleId), l.addAttribute("customFormat", "1")), l.addAttribute("x14ac:dyDescent", "0.25"), n.outlineLevel && l.addAttribute("outlineLevel", n.outlineLevel), n.collapsed && l.addAttribute("collapsed", "1");
  38342. const d = this.map.c;
  38343. n.cells.forEach((o) => {
  38344. d.render(l, o, a);
  38345. }), l.closeNode();
  38346. }
  38347. parseOpen(l) {
  38348. if (this.parser) return this.parser.parseOpen(l), !0;
  38349. if (l.name === "row") {
  38350. this.numRowsSeen += 1;
  38351. const n = l.attributes.spans ? l.attributes.spans.split(":").map((d) => parseInt(d, 10)) : [void 0, void 0], a = this.model = { number: parseInt(l.attributes.r, 10), min: n[0], max: n[1], cells: [] };
  38352. return l.attributes.s && (a.styleId = parseInt(l.attributes.s, 10)), A.parseBoolean(l.attributes.hidden) && (a.hidden = !0), A.parseBoolean(l.attributes.bestFit) && (a.bestFit = !0), l.attributes.ht && (a.height = parseFloat(l.attributes.ht)), l.attributes.outlineLevel && (a.outlineLevel = parseInt(l.attributes.outlineLevel, 10)), A.parseBoolean(l.attributes.collapsed) && (a.collapsed = !0), !0;
  38353. }
  38354. return this.parser = this.map[l.name], !!this.parser && (this.parser.parseOpen(l), !0);
  38355. }
  38356. parseText(l) {
  38357. this.parser && this.parser.parseText(l);
  38358. }
  38359. parseClose(l) {
  38360. if (this.parser) {
  38361. if (!this.parser.parseClose(l)) {
  38362. if (this.model.cells.push(this.parser.model), this.maxItems && this.model.cells.length > this.maxItems) throw new Error(`Max column count (${this.maxItems}) exceeded`);
  38363. this.parser = void 0;
  38364. }
  38365. return !0;
  38366. }
  38367. return !1;
  38368. }
  38369. reconcile(l, n) {
  38370. l.style = l.styleId ? n.styles.getStyleModel(l.styleId) : {}, l.styleId !== void 0 && (l.styleId = void 0);
  38371. const a = this.map.c;
  38372. l.cells.forEach((d) => {
  38373. a.reconcile(d, n);
  38374. });
  38375. }
  38376. };
  38377. }, { "../../../utils/utils": 27, "../base-xform": 32, "./cell-xform": 73 }], 110: [function(g, C, i) {
  38378. const e = g("../../../utils/under-dash"), A = g("../base-xform");
  38379. C.exports = class extends A {
  38380. get tag() {
  38381. return "sheetFormatPr";
  38382. }
  38383. render(s, l) {
  38384. if (l) {
  38385. const n = { defaultRowHeight: l.defaultRowHeight, outlineLevelRow: l.outlineLevelRow, outlineLevelCol: l.outlineLevelCol, "x14ac:dyDescent": l.dyDescent };
  38386. l.defaultColWidth && (n.defaultColWidth = l.defaultColWidth), l.defaultRowHeight && l.defaultRowHeight === 15 || (n.customHeight = "1"), e.some(n, (a) => a !== void 0) && s.leafNode("sheetFormatPr", n);
  38387. }
  38388. }
  38389. parseOpen(s) {
  38390. return s.name === "sheetFormatPr" && (this.model = { defaultRowHeight: parseFloat(s.attributes.defaultRowHeight || "0"), dyDescent: parseFloat(s.attributes["x14ac:dyDescent"] || "0"), outlineLevelRow: parseInt(s.attributes.outlineLevelRow || "0", 10), outlineLevelCol: parseInt(s.attributes.outlineLevelCol || "0", 10) }, s.attributes.defaultColWidth && (this.model.defaultColWidth = parseFloat(s.attributes.defaultColWidth)), !0);
  38391. }
  38392. parseText() {
  38393. }
  38394. parseClose() {
  38395. return !1;
  38396. }
  38397. };
  38398. }, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 111: [function(g, C, i) {
  38399. const e = g("../base-xform"), A = g("../style/color-xform"), s = g("./page-setup-properties-xform"), l = g("./outline-properties-xform");
  38400. C.exports = class extends e {
  38401. constructor() {
  38402. super(), this.map = { tabColor: new A("tabColor"), pageSetUpPr: new s(), outlinePr: new l() };
  38403. }
  38404. get tag() {
  38405. return "sheetPr";
  38406. }
  38407. render(n, a) {
  38408. if (a) {
  38409. n.addRollback(), n.openNode("sheetPr");
  38410. let d = !1;
  38411. d = this.map.tabColor.render(n, a.tabColor) || d, d = this.map.pageSetUpPr.render(n, a.pageSetup) || d, d = this.map.outlinePr.render(n, a.outlineProperties) || d, d ? (n.closeNode(), n.commit()) : n.rollback();
  38412. }
  38413. }
  38414. parseOpen(n) {
  38415. return this.parser ? (this.parser.parseOpen(n), !0) : n.name === this.tag ? (this.reset(), !0) : !!this.map[n.name] && (this.parser = this.map[n.name], this.parser.parseOpen(n), !0);
  38416. }
  38417. parseText(n) {
  38418. return !!this.parser && (this.parser.parseText(n), !0);
  38419. }
  38420. parseClose(n) {
  38421. return this.parser ? (this.parser.parseClose(n) || (this.parser = void 0), !0) : (this.map.tabColor.model || this.map.pageSetUpPr.model || this.map.outlinePr.model ? (this.model = {}, this.map.tabColor.model && (this.model.tabColor = this.map.tabColor.model), this.map.pageSetUpPr.model && (this.model.pageSetup = this.map.pageSetUpPr.model), this.map.outlinePr.model && (this.model.outlineProperties = this.map.outlinePr.model)) : this.model = null, !1);
  38422. }
  38423. };
  38424. }, { "../base-xform": 32, "../style/color-xform": 128, "./outline-properties-xform": 101, "./page-setup-properties-xform": 104 }], 112: [function(g, C, i) {
  38425. const e = g("../../../utils/under-dash"), A = g("../base-xform");
  38426. function s(n, a) {
  38427. return n ? a : void 0;
  38428. }
  38429. function l(n, a) {
  38430. return n === a || void 0;
  38431. }
  38432. C.exports = class extends A {
  38433. get tag() {
  38434. return "sheetProtection";
  38435. }
  38436. render(n, a) {
  38437. if (a) {
  38438. const d = { sheet: s(a.sheet, "1"), selectLockedCells: a.selectLockedCells === !1 ? "1" : void 0, selectUnlockedCells: a.selectUnlockedCells === !1 ? "1" : void 0, formatCells: s(a.formatCells, "0"), formatColumns: s(a.formatColumns, "0"), formatRows: s(a.formatRows, "0"), insertColumns: s(a.insertColumns, "0"), insertRows: s(a.insertRows, "0"), insertHyperlinks: s(a.insertHyperlinks, "0"), deleteColumns: s(a.deleteColumns, "0"), deleteRows: s(a.deleteRows, "0"), sort: s(a.sort, "0"), autoFilter: s(a.autoFilter, "0"), pivotTables: s(a.pivotTables, "0") };
  38439. a.sheet && (d.algorithmName = a.algorithmName, d.hashValue = a.hashValue, d.saltValue = a.saltValue, d.spinCount = a.spinCount, d.objects = s(a.objects === !1, "1"), d.scenarios = s(a.scenarios === !1, "1")), e.some(d, (o) => o !== void 0) && n.leafNode(this.tag, d);
  38440. }
  38441. }
  38442. parseOpen(n) {
  38443. switch (n.name) {
  38444. case this.tag:
  38445. return this.model = { sheet: l(n.attributes.sheet, "1"), objects: n.attributes.objects !== "1" && void 0, scenarios: n.attributes.scenarios !== "1" && void 0, selectLockedCells: n.attributes.selectLockedCells !== "1" && void 0, selectUnlockedCells: n.attributes.selectUnlockedCells !== "1" && void 0, formatCells: l(n.attributes.formatCells, "0"), formatColumns: l(n.attributes.formatColumns, "0"), formatRows: l(n.attributes.formatRows, "0"), insertColumns: l(n.attributes.insertColumns, "0"), insertRows: l(n.attributes.insertRows, "0"), insertHyperlinks: l(n.attributes.insertHyperlinks, "0"), deleteColumns: l(n.attributes.deleteColumns, "0"), deleteRows: l(n.attributes.deleteRows, "0"), sort: l(n.attributes.sort, "0"), autoFilter: l(n.attributes.autoFilter, "0"), pivotTables: l(n.attributes.pivotTables, "0") }, n.attributes.algorithmName && (this.model.algorithmName = n.attributes.algorithmName, this.model.hashValue = n.attributes.hashValue, this.model.saltValue = n.attributes.saltValue, this.model.spinCount = parseInt(n.attributes.spinCount, 10)), !0;
  38446. default:
  38447. return !1;
  38448. }
  38449. }
  38450. parseText() {
  38451. }
  38452. parseClose() {
  38453. return !1;
  38454. }
  38455. };
  38456. }, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 113: [function(g, C, i) {
  38457. const e = g("../../../utils/col-cache"), A = g("../base-xform"), s = { frozen: "frozen", frozenSplit: "frozen", split: "split" };
  38458. C.exports = class extends A {
  38459. get tag() {
  38460. return "sheetView";
  38461. }
  38462. prepare(l) {
  38463. switch (l.state) {
  38464. case "frozen":
  38465. case "split":
  38466. break;
  38467. default:
  38468. l.state = "normal";
  38469. }
  38470. }
  38471. render(l, n) {
  38472. l.openNode("sheetView", { workbookViewId: n.workbookViewId || 0 });
  38473. const a = function(h, b, u) {
  38474. u && l.addAttribute(h, b);
  38475. };
  38476. let d, o, c, r;
  38477. switch (a("rightToLeft", "1", n.rightToLeft === !0), a("tabSelected", "1", n.tabSelected), a("showRuler", "0", n.showRuler === !1), a("showRowColHeaders", "0", n.showRowColHeaders === !1), a("showGridLines", "0", n.showGridLines === !1), a("zoomScale", n.zoomScale, n.zoomScale), a("zoomScaleNormal", n.zoomScaleNormal, n.zoomScaleNormal), a("view", n.style, n.style), n.state) {
  38478. case "frozen":
  38479. o = n.xSplit || 0, c = n.ySplit || 0, d = n.topLeftCell || e.getAddress(c + 1, o + 1).address, r = (n.xSplit && n.ySplit ? "bottomRight" : n.xSplit && "topRight") || "bottomLeft", l.leafNode("pane", { xSplit: n.xSplit || void 0, ySplit: n.ySplit || void 0, topLeftCell: d, activePane: r, state: "frozen" }), l.leafNode("selection", { pane: r, activeCell: n.activeCell, sqref: n.activeCell });
  38480. break;
  38481. case "split":
  38482. n.activePane === "topLeft" && (n.activePane = void 0), l.leafNode("pane", { xSplit: n.xSplit || void 0, ySplit: n.ySplit || void 0, topLeftCell: n.topLeftCell, activePane: n.activePane }), l.leafNode("selection", { pane: n.activePane, activeCell: n.activeCell, sqref: n.activeCell });
  38483. break;
  38484. case "normal":
  38485. n.activeCell && l.leafNode("selection", { activeCell: n.activeCell, sqref: n.activeCell });
  38486. }
  38487. l.closeNode();
  38488. }
  38489. parseOpen(l) {
  38490. switch (l.name) {
  38491. case "sheetView":
  38492. return this.sheetView = { workbookViewId: parseInt(l.attributes.workbookViewId, 10), rightToLeft: l.attributes.rightToLeft === "1", tabSelected: l.attributes.tabSelected === "1", showRuler: l.attributes.showRuler !== "0", showRowColHeaders: l.attributes.showRowColHeaders !== "0", showGridLines: l.attributes.showGridLines !== "0", zoomScale: parseInt(l.attributes.zoomScale || "100", 10), zoomScaleNormal: parseInt(l.attributes.zoomScaleNormal || "100", 10), style: l.attributes.view }, this.pane = void 0, this.selections = {}, !0;
  38493. case "pane":
  38494. return this.pane = { xSplit: parseInt(l.attributes.xSplit || "0", 10), ySplit: parseInt(l.attributes.ySplit || "0", 10), topLeftCell: l.attributes.topLeftCell, activePane: l.attributes.activePane || "topLeft", state: l.attributes.state }, !0;
  38495. case "selection": {
  38496. const n = l.attributes.pane || "topLeft";
  38497. return this.selections[n] = { pane: n, activeCell: l.attributes.activeCell }, !0;
  38498. }
  38499. default:
  38500. return !1;
  38501. }
  38502. }
  38503. parseText() {
  38504. }
  38505. parseClose(l) {
  38506. let n, a;
  38507. switch (l) {
  38508. case "sheetView":
  38509. return this.sheetView && this.pane ? (n = this.model = { workbookViewId: this.sheetView.workbookViewId, rightToLeft: this.sheetView.rightToLeft, state: s[this.pane.state] || "split", xSplit: this.pane.xSplit, ySplit: this.pane.ySplit, topLeftCell: this.pane.topLeftCell, showRuler: this.sheetView.showRuler, showRowColHeaders: this.sheetView.showRowColHeaders, showGridLines: this.sheetView.showGridLines, zoomScale: this.sheetView.zoomScale, zoomScaleNormal: this.sheetView.zoomScaleNormal }, this.model.state === "split" && (n.activePane = this.pane.activePane), a = this.selections[this.pane.activePane], a && a.activeCell && (n.activeCell = a.activeCell), this.sheetView.style && (n.style = this.sheetView.style)) : (n = this.model = { workbookViewId: this.sheetView.workbookViewId, rightToLeft: this.sheetView.rightToLeft, state: "normal", showRuler: this.sheetView.showRuler, showRowColHeaders: this.sheetView.showRowColHeaders, showGridLines: this.sheetView.showGridLines, zoomScale: this.sheetView.zoomScale, zoomScaleNormal: this.sheetView.zoomScaleNormal }, a = this.selections.topLeft, a && a.activeCell && (n.activeCell = a.activeCell), this.sheetView.style && (n.style = this.sheetView.style)), !1;
  38510. default:
  38511. return !0;
  38512. }
  38513. }
  38514. reconcile() {
  38515. }
  38516. };
  38517. }, { "../../../utils/col-cache": 19, "../base-xform": 32 }], 114: [function(g, C, i) {
  38518. const e = g("../base-xform");
  38519. C.exports = class extends e {
  38520. get tag() {
  38521. return "tablePart";
  38522. }
  38523. render(A, s) {
  38524. s && A.leafNode(this.tag, { "r:id": s.rId });
  38525. }
  38526. parseOpen(A) {
  38527. switch (A.name) {
  38528. case this.tag:
  38529. return this.model = { rId: A.attributes["r:id"] }, !0;
  38530. default:
  38531. return !1;
  38532. }
  38533. }
  38534. parseText() {
  38535. }
  38536. parseClose() {
  38537. return !1;
  38538. }
  38539. };
  38540. }, { "../base-xform": 32 }], 115: [function(g, C, i) {
  38541. const e = g("../../../utils/under-dash"), A = g("../../../utils/col-cache"), s = g("../../../utils/xml-stream"), l = g("../../rel-type"), n = g("./merges"), a = g("../base-xform"), d = g("../list-xform"), o = g("./row-xform"), c = g("./col-xform"), r = g("./dimension-xform"), h = g("./hyperlink-xform"), b = g("./merge-cell-xform"), u = g("./data-validations-xform"), m = g("./sheet-properties-xform"), Z = g("./sheet-format-properties-xform"), p = g("./sheet-view-xform"), Y = g("./sheet-protection-xform"), R = g("./page-margins-xform"), X = g("./page-setup-xform"), H = g("./print-options-xform"), S = g("./auto-filter-xform"), z = g("./picture-xform"), v = g("./drawing-xform"), K = g("./table-part-xform"), V = g("./row-breaks-xform"), N = g("./header-footer-xform"), B = g("./cf/conditional-formattings-xform"), G = g("./ext-lst-xform"), w = (y, f) => {
  38542. if (!f || !f.length) return y;
  38543. if (!y || !y.length) return f;
  38544. const D = {}, F = {};
  38545. return y.forEach((T) => {
  38546. D[T.ref] = T, T.rules.forEach((Q) => {
  38547. const { x14Id: P } = Q;
  38548. P && (F[P] = Q);
  38549. });
  38550. }), f.forEach((T) => {
  38551. T.rules.forEach((Q) => {
  38552. const P = F[Q.x14Id];
  38553. P ? ((L, E) => {
  38554. Object.keys(E).forEach((J) => {
  38555. const k = L[J], j = E[J];
  38556. k === void 0 && j !== void 0 && (L[J] = j);
  38557. });
  38558. })(P, Q) : D[T.ref] ? D[T.ref].rules.push(Q) : y.push({ ref: T.ref, rules: [Q] });
  38559. });
  38560. }), y;
  38561. };
  38562. class W extends a {
  38563. constructor(f) {
  38564. super();
  38565. const { maxRows: D, maxCols: F, ignoreNodes: T } = f || {};
  38566. this.ignoreNodes = T || [], this.map = { sheetPr: new m(), dimension: new r(), sheetViews: new d({ tag: "sheetViews", count: !1, childXform: new p() }), sheetFormatPr: new Z(), cols: new d({ tag: "cols", count: !1, childXform: new c() }), sheetData: new d({ tag: "sheetData", count: !1, empty: !0, childXform: new o({ maxItems: F }), maxItems: D }), autoFilter: new S(), mergeCells: new d({ tag: "mergeCells", count: !0, childXform: new b() }), rowBreaks: new V(), hyperlinks: new d({ tag: "hyperlinks", count: !1, childXform: new h() }), pageMargins: new R(), dataValidations: new u(), pageSetup: new X(), headerFooter: new N(), printOptions: new H(), picture: new z(), drawing: new v(), sheetProtection: new Y(), tableParts: new d({ tag: "tableParts", count: !0, childXform: new K() }), conditionalFormatting: new B(), extLst: new G() };
  38567. }
  38568. prepare(f, D) {
  38569. D.merges = new n(), f.hyperlinks = D.hyperlinks = [], f.comments = D.comments = [], D.formulae = {}, D.siFormulae = 0, this.map.cols.prepare(f.cols, D), this.map.sheetData.prepare(f.rows, D), this.map.conditionalFormatting.prepare(f.conditionalFormattings, D), f.mergeCells = D.merges.mergeCells;
  38570. const F = f.rels = [];
  38571. function T(L) {
  38572. return "rId" + (L.length + 1);
  38573. }
  38574. if (f.hyperlinks.forEach((L) => {
  38575. const E = T(F);
  38576. L.rId = E, F.push({ Id: E, Type: l.Hyperlink, Target: L.target, TargetMode: "External" });
  38577. }), f.comments.length > 0) {
  38578. const L = { Id: T(F), Type: l.Comments, Target: `../comments${f.id}.xml` };
  38579. F.push(L);
  38580. const E = { Id: T(F), Type: l.VmlDrawing, Target: `../drawings/vmlDrawing${f.id}.vml` };
  38581. F.push(E), f.comments.forEach((J) => {
  38582. J.refAddress = A.decodeAddress(J.ref);
  38583. }), D.commentRefs.push({ commentName: "comments" + f.id, vmlDrawing: "vmlDrawing" + f.id });
  38584. }
  38585. const Q = [];
  38586. let P;
  38587. f.media.forEach((L) => {
  38588. if (L.type === "background") {
  38589. const E = T(F);
  38590. P = D.media[L.imageId], F.push({ Id: E, Type: l.Image, Target: `../media/${P.name}.${P.extension}` }), f.background = { rId: E }, f.image = D.media[L.imageId];
  38591. } else if (L.type === "image") {
  38592. let { drawing: E } = f;
  38593. P = D.media[L.imageId], E || (E = f.drawing = { rId: T(F), name: "drawing" + ++D.drawingsCount, anchors: [], rels: [] }, D.drawings.push(E), F.push({ Id: E.rId, Type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing", Target: `../drawings/${E.name}.xml` }));
  38594. let J = this.preImageId === L.imageId ? Q[L.imageId] : Q[E.rels.length];
  38595. J || (J = T(E.rels), Q[E.rels.length] = J, E.rels.push({ Id: J, Type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", Target: `../media/${P.name}.${P.extension}` }));
  38596. const k = { picture: { rId: J }, range: L.range };
  38597. if (L.hyperlinks && L.hyperlinks.hyperlink) {
  38598. const j = T(E.rels);
  38599. Q[E.rels.length] = j, k.picture.hyperlinks = { tooltip: L.hyperlinks.tooltip, rId: j }, E.rels.push({ Id: j, Type: l.Hyperlink, Target: L.hyperlinks.hyperlink, TargetMode: "External" });
  38600. }
  38601. this.preImageId = L.imageId, E.anchors.push(k);
  38602. }
  38603. }), f.tables.forEach((L) => {
  38604. const E = T(F);
  38605. L.rId = E, F.push({ Id: E, Type: l.Table, Target: "../tables/" + L.target }), L.columns.forEach((J) => {
  38606. const { style: k } = J;
  38607. k && (J.dxfId = D.styles.addDxfStyle(k));
  38608. });
  38609. }), this.map.extLst.prepare(f, D);
  38610. }
  38611. render(f, D) {
  38612. f.openXml(s.StdDocAttributes), f.openNode("worksheet", W.WORKSHEET_ATTRIBUTES);
  38613. const F = D.properties ? { defaultRowHeight: D.properties.defaultRowHeight, dyDescent: D.properties.dyDescent, outlineLevelCol: D.properties.outlineLevelCol, outlineLevelRow: D.properties.outlineLevelRow } : void 0;
  38614. D.properties && D.properties.defaultColWidth && (F.defaultColWidth = D.properties.defaultColWidth);
  38615. const T = { outlineProperties: D.properties && D.properties.outlineProperties, tabColor: D.properties && D.properties.tabColor, pageSetup: D.pageSetup && D.pageSetup.fitToPage ? { fitToPage: D.pageSetup.fitToPage } : void 0 }, Q = D.pageSetup && D.pageSetup.margins, P = { showRowColHeaders: D.pageSetup && D.pageSetup.showRowColHeaders, showGridLines: D.pageSetup && D.pageSetup.showGridLines, horizontalCentered: D.pageSetup && D.pageSetup.horizontalCentered, verticalCentered: D.pageSetup && D.pageSetup.verticalCentered }, L = D.sheetProtection;
  38616. this.map.sheetPr.render(f, T), this.map.dimension.render(f, D.dimensions), this.map.sheetViews.render(f, D.views), this.map.sheetFormatPr.render(f, F), this.map.cols.render(f, D.cols), this.map.sheetData.render(f, D.rows), this.map.sheetProtection.render(f, L), this.map.autoFilter.render(f, D.autoFilter), this.map.mergeCells.render(f, D.mergeCells), this.map.conditionalFormatting.render(f, D.conditionalFormattings), this.map.dataValidations.render(f, D.dataValidations), this.map.hyperlinks.render(f, D.hyperlinks), this.map.printOptions.render(f, P), this.map.pageMargins.render(f, Q), this.map.pageSetup.render(f, D.pageSetup), this.map.headerFooter.render(f, D.headerFooter), this.map.rowBreaks.render(f, D.rowBreaks), this.map.drawing.render(f, D.drawing), this.map.picture.render(f, D.background), this.map.tableParts.render(f, D.tables), this.map.extLst.render(f, D), D.rels && D.rels.forEach((E) => {
  38617. E.Type === l.VmlDrawing && f.leafNode("legacyDrawing", { "r:id": E.Id });
  38618. }), f.closeNode();
  38619. }
  38620. parseOpen(f) {
  38621. return this.parser ? (this.parser.parseOpen(f), !0) : f.name === "worksheet" ? (e.each(this.map, (D) => {
  38622. D.reset();
  38623. }), !0) : (this.map[f.name] && !this.ignoreNodes.includes(f.name) && (this.parser = this.map[f.name], this.parser.parseOpen(f)), !0);
  38624. }
  38625. parseText(f) {
  38626. this.parser && this.parser.parseText(f);
  38627. }
  38628. parseClose(f) {
  38629. if (this.parser) return this.parser.parseClose(f) || (this.parser = void 0), !0;
  38630. switch (f) {
  38631. case "worksheet": {
  38632. const D = this.map.sheetFormatPr.model || {};
  38633. this.map.sheetPr.model && this.map.sheetPr.model.tabColor && (D.tabColor = this.map.sheetPr.model.tabColor), this.map.sheetPr.model && this.map.sheetPr.model.outlineProperties && (D.outlineProperties = this.map.sheetPr.model.outlineProperties);
  38634. const F = { fitToPage: this.map.sheetPr.model && this.map.sheetPr.model.pageSetup && this.map.sheetPr.model.pageSetup.fitToPage || !1, margins: this.map.pageMargins.model }, T = Object.assign(F, this.map.pageSetup.model, this.map.printOptions.model), Q = w(this.map.conditionalFormatting.model, this.map.extLst.model && this.map.extLst.model["x14:conditionalFormattings"]);
  38635. return this.model = { dimensions: this.map.dimension.model, cols: this.map.cols.model, rows: this.map.sheetData.model, mergeCells: this.map.mergeCells.model, hyperlinks: this.map.hyperlinks.model, dataValidations: this.map.dataValidations.model, properties: D, views: this.map.sheetViews.model, pageSetup: T, headerFooter: this.map.headerFooter.model, background: this.map.picture.model, drawing: this.map.drawing.model, tables: this.map.tableParts.model, conditionalFormattings: Q }, this.map.autoFilter.model && (this.model.autoFilter = this.map.autoFilter.model), this.map.sheetProtection.model && (this.model.sheetProtection = this.map.sheetProtection.model), !1;
  38636. }
  38637. default:
  38638. return !0;
  38639. }
  38640. }
  38641. reconcile(f, D) {
  38642. const F = (f.relationships || []).reduce((Q, P) => {
  38643. if (Q[P.Id] = P, P.Type === l.Comments && (f.comments = D.comments[P.Target].comments), P.Type === l.VmlDrawing && f.comments && f.comments.length) {
  38644. const L = D.vmlDrawings[P.Target].comments;
  38645. f.comments.forEach((E, J) => {
  38646. E.note = Object.assign({}, E.note, L[J]);
  38647. });
  38648. }
  38649. return Q;
  38650. }, {});
  38651. if (D.commentsMap = (f.comments || []).reduce((Q, P) => (P.ref && (Q[P.ref] = P), Q), {}), D.hyperlinkMap = (f.hyperlinks || []).reduce((Q, P) => (P.rId && (Q[P.address] = F[P.rId].Target), Q), {}), D.formulae = {}, f.rows = f.rows && f.rows.filter(Boolean) || [], f.rows.forEach((Q) => {
  38652. Q.cells = Q.cells && Q.cells.filter(Boolean) || [];
  38653. }), this.map.cols.reconcile(f.cols, D), this.map.sheetData.reconcile(f.rows, D), this.map.conditionalFormatting.reconcile(f.conditionalFormattings, D), f.media = [], f.drawing) {
  38654. const Q = F[f.drawing.rId].Target.match(/\/drawings\/([a-zA-Z0-9]+)[.][a-zA-Z]{3,4}$/);
  38655. if (Q) {
  38656. const P = Q[1];
  38657. D.drawings[P].anchors.forEach((L) => {
  38658. if (L.medium) {
  38659. const E = { type: "image", imageId: L.medium.index, range: L.range, hyperlinks: L.picture.hyperlinks };
  38660. f.media.push(E);
  38661. }
  38662. });
  38663. }
  38664. }
  38665. const T = f.background && F[f.background.rId];
  38666. if (T) {
  38667. const Q = T.Target.split("/media/")[1], P = D.mediaIndex && D.mediaIndex[Q];
  38668. P !== void 0 && f.media.push({ type: "background", imageId: P });
  38669. }
  38670. f.tables = (f.tables || []).map((Q) => {
  38671. const P = F[Q.rId];
  38672. return D.tables[P.Target];
  38673. }), delete f.relationships, delete f.hyperlinks, delete f.comments;
  38674. }
  38675. }
  38676. W.WORKSHEET_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", "xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006", "mc:Ignorable": "x14ac", "xmlns:x14ac": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" }, C.exports = W;
  38677. }, { "../../../utils/col-cache": 19, "../../../utils/under-dash": 26, "../../../utils/xml-stream": 28, "../../rel-type": 31, "../base-xform": 32, "../list-xform": 71, "./auto-filter-xform": 72, "./cf/conditional-formattings-xform": 87, "./col-xform": 92, "./data-validations-xform": 93, "./dimension-xform": 94, "./drawing-xform": 95, "./ext-lst-xform": 96, "./header-footer-xform": 97, "./hyperlink-xform": 98, "./merge-cell-xform": 99, "./merges": 100, "./page-margins-xform": 103, "./page-setup-xform": 105, "./picture-xform": 106, "./print-options-xform": 107, "./row-breaks-xform": 108, "./row-xform": 109, "./sheet-format-properties-xform": 110, "./sheet-properties-xform": 111, "./sheet-protection-xform": 112, "./sheet-view-xform": 113, "./table-part-xform": 114 }], 116: [function(g, C, i) {
  38678. const e = g("../base-xform");
  38679. C.exports = class extends e {
  38680. constructor(A) {
  38681. super(), this.tag = A.tag, this.attr = A.attr;
  38682. }
  38683. render(A, s) {
  38684. s && (A.openNode(this.tag), A.closeNode());
  38685. }
  38686. parseOpen(A) {
  38687. A.name === this.tag && (this.model = !0);
  38688. }
  38689. parseText() {
  38690. }
  38691. parseClose() {
  38692. return !1;
  38693. }
  38694. };
  38695. }, { "../base-xform": 32 }], 117: [function(g, C, i) {
  38696. const e = g("../base-xform");
  38697. C.exports = class extends e {
  38698. constructor(A) {
  38699. super(), this.tag = A.tag, this.attr = A.attr, this.attrs = A.attrs, this._format = A.format || function(s) {
  38700. try {
  38701. return Number.isNaN(s.getTime()) ? "" : s.toISOString();
  38702. } catch {
  38703. return "";
  38704. }
  38705. }, this._parse = A.parse || function(s) {
  38706. return new Date(s);
  38707. };
  38708. }
  38709. render(A, s) {
  38710. s && (A.openNode(this.tag), this.attrs && A.addAttributes(this.attrs), this.attr ? A.addAttribute(this.attr, this._format(s)) : A.writeText(this._format(s)), A.closeNode());
  38711. }
  38712. parseOpen(A) {
  38713. A.name === this.tag && (this.attr ? this.model = this._parse(A.attributes[this.attr]) : this.text = []);
  38714. }
  38715. parseText(A) {
  38716. this.attr || this.text.push(A);
  38717. }
  38718. parseClose() {
  38719. return this.attr || (this.model = this._parse(this.text.join(""))), !1;
  38720. }
  38721. };
  38722. }, { "../base-xform": 32 }], 118: [function(g, C, i) {
  38723. const e = g("../base-xform");
  38724. C.exports = class extends e {
  38725. constructor(A) {
  38726. super(), this.tag = A.tag, this.attr = A.attr, this.attrs = A.attrs, this.zero = A.zero;
  38727. }
  38728. render(A, s) {
  38729. (s || this.zero) && (A.openNode(this.tag), this.attrs && A.addAttributes(this.attrs), this.attr ? A.addAttribute(this.attr, s) : A.writeText(s), A.closeNode());
  38730. }
  38731. parseOpen(A) {
  38732. return A.name === this.tag && (this.attr ? this.model = parseInt(A.attributes[this.attr], 10) : this.text = [], !0);
  38733. }
  38734. parseText(A) {
  38735. this.attr || this.text.push(A);
  38736. }
  38737. parseClose() {
  38738. return this.attr || (this.model = parseInt(this.text.join("") || 0, 10)), !1;
  38739. }
  38740. };
  38741. }, { "../base-xform": 32 }], 119: [function(g, C, i) {
  38742. const e = g("../base-xform");
  38743. C.exports = class extends e {
  38744. constructor(A) {
  38745. super(), this.tag = A.tag, this.attr = A.attr, this.attrs = A.attrs;
  38746. }
  38747. render(A, s) {
  38748. s !== void 0 && (A.openNode(this.tag), this.attrs && A.addAttributes(this.attrs), this.attr ? A.addAttribute(this.attr, s) : A.writeText(s), A.closeNode());
  38749. }
  38750. parseOpen(A) {
  38751. A.name === this.tag && (this.attr ? this.model = A.attributes[this.attr] : this.text = []);
  38752. }
  38753. parseText(A) {
  38754. this.attr || this.text.push(A);
  38755. }
  38756. parseClose() {
  38757. return this.attr || (this.model = this.text.join("")), !1;
  38758. }
  38759. };
  38760. }, { "../base-xform": 32 }], 120: [function(g, C, i) {
  38761. const e = g("./base-xform"), A = g("../../utils/xml-stream");
  38762. C.exports = class extends e {
  38763. constructor(s) {
  38764. super(), this._model = s;
  38765. }
  38766. render(s) {
  38767. if (!this._xml) {
  38768. const l = new A();
  38769. (function n(a, d) {
  38770. a.openNode(d.tag, d.$), d.c && d.c.forEach((o) => {
  38771. n(a, o);
  38772. }), d.t && a.writeText(d.t), a.closeNode();
  38773. })(l, this._model), this._xml = l.xml;
  38774. }
  38775. s.writeXml(this._xml);
  38776. }
  38777. parseOpen() {
  38778. return !0;
  38779. }
  38780. parseText() {
  38781. }
  38782. parseClose(s) {
  38783. switch (s) {
  38784. case this._model.tag:
  38785. return !1;
  38786. default:
  38787. return !0;
  38788. }
  38789. }
  38790. };
  38791. }, { "../../utils/xml-stream": 28, "./base-xform": 32 }], 121: [function(g, C, i) {
  38792. const e = g("./text-xform"), A = g("./rich-text-xform"), s = g("../base-xform");
  38793. C.exports = class extends s {
  38794. constructor() {
  38795. super(), this.map = { r: new A(), t: new e() };
  38796. }
  38797. get tag() {
  38798. return "rPh";
  38799. }
  38800. render(l, n) {
  38801. if (l.openNode(this.tag, { sb: n.sb || 0, eb: n.eb || 0 }), n && n.hasOwnProperty("richText") && n.richText) {
  38802. const { r: a } = this.map;
  38803. n.richText.forEach((d) => {
  38804. a.render(l, d);
  38805. });
  38806. } else n && this.map.t.render(l, n.text);
  38807. l.closeNode();
  38808. }
  38809. parseOpen(l) {
  38810. const { name: n } = l;
  38811. return this.parser ? (this.parser.parseOpen(l), !0) : n === this.tag ? (this.model = { sb: parseInt(l.attributes.sb, 10), eb: parseInt(l.attributes.eb, 10) }, !0) : (this.parser = this.map[n], !!this.parser && (this.parser.parseOpen(l), !0));
  38812. }
  38813. parseText(l) {
  38814. this.parser && this.parser.parseText(l);
  38815. }
  38816. parseClose(l) {
  38817. if (this.parser) {
  38818. if (!this.parser.parseClose(l)) {
  38819. switch (l) {
  38820. case "r": {
  38821. let n = this.model.richText;
  38822. n || (n = this.model.richText = []), n.push(this.parser.model);
  38823. break;
  38824. }
  38825. case "t":
  38826. this.model.text = this.parser.model;
  38827. }
  38828. this.parser = void 0;
  38829. }
  38830. return !0;
  38831. }
  38832. switch (l) {
  38833. case this.tag:
  38834. return !1;
  38835. default:
  38836. return !0;
  38837. }
  38838. }
  38839. };
  38840. }, { "../base-xform": 32, "./rich-text-xform": 122, "./text-xform": 125 }], 122: [function(g, C, i) {
  38841. const e = g("./text-xform"), A = g("../style/font-xform"), s = g("../base-xform");
  38842. class l extends s {
  38843. constructor(a) {
  38844. super(), this.model = a;
  38845. }
  38846. get tag() {
  38847. return "r";
  38848. }
  38849. get textXform() {
  38850. return this._textXform || (this._textXform = new e());
  38851. }
  38852. get fontXform() {
  38853. return this._fontXform || (this._fontXform = new A(l.FONT_OPTIONS));
  38854. }
  38855. render(a, d) {
  38856. d = d || this.model, a.openNode("r"), d.font && this.fontXform.render(a, d.font), this.textXform.render(a, d.text), a.closeNode();
  38857. }
  38858. parseOpen(a) {
  38859. if (this.parser) return this.parser.parseOpen(a), !0;
  38860. switch (a.name) {
  38861. case "r":
  38862. return this.model = {}, !0;
  38863. case "t":
  38864. return this.parser = this.textXform, this.parser.parseOpen(a), !0;
  38865. case "rPr":
  38866. return this.parser = this.fontXform, this.parser.parseOpen(a), !0;
  38867. default:
  38868. return !1;
  38869. }
  38870. }
  38871. parseText(a) {
  38872. this.parser && this.parser.parseText(a);
  38873. }
  38874. parseClose(a) {
  38875. switch (a) {
  38876. case "r":
  38877. return !1;
  38878. case "t":
  38879. return this.model.text = this.parser.model, this.parser = void 0, !0;
  38880. case "rPr":
  38881. return this.model.font = this.parser.model, this.parser = void 0, !0;
  38882. default:
  38883. return this.parser && this.parser.parseClose(a), !0;
  38884. }
  38885. }
  38886. }
  38887. l.FONT_OPTIONS = { tagName: "rPr", fontNameTag: "rFont" }, C.exports = l;
  38888. }, { "../base-xform": 32, "../style/font-xform": 131, "./text-xform": 125 }], 123: [function(g, C, i) {
  38889. const e = g("./text-xform"), A = g("./rich-text-xform"), s = g("./phonetic-text-xform"), l = g("../base-xform");
  38890. C.exports = class extends l {
  38891. constructor(n) {
  38892. super(), this.model = n, this.map = { r: new A(), t: new e(), rPh: new s() };
  38893. }
  38894. get tag() {
  38895. return "si";
  38896. }
  38897. render(n, a) {
  38898. n.openNode(this.tag), a && a.hasOwnProperty("richText") && a.richText ? a.richText.length ? a.richText.forEach((d) => {
  38899. this.map.r.render(n, d);
  38900. }) : this.map.t.render(n, "") : a != null && this.map.t.render(n, a), n.closeNode();
  38901. }
  38902. parseOpen(n) {
  38903. const { name: a } = n;
  38904. return this.parser ? (this.parser.parseOpen(n), !0) : a === this.tag ? (this.model = {}, !0) : (this.parser = this.map[a], !!this.parser && (this.parser.parseOpen(n), !0));
  38905. }
  38906. parseText(n) {
  38907. this.parser && this.parser.parseText(n);
  38908. }
  38909. parseClose(n) {
  38910. if (this.parser) {
  38911. if (!this.parser.parseClose(n)) {
  38912. switch (n) {
  38913. case "r": {
  38914. let a = this.model.richText;
  38915. a || (a = this.model.richText = []), a.push(this.parser.model);
  38916. break;
  38917. }
  38918. case "t":
  38919. this.model = this.parser.model;
  38920. }
  38921. this.parser = void 0;
  38922. }
  38923. return !0;
  38924. }
  38925. switch (n) {
  38926. case this.tag:
  38927. return !1;
  38928. default:
  38929. return !0;
  38930. }
  38931. }
  38932. };
  38933. }, { "../base-xform": 32, "./phonetic-text-xform": 121, "./rich-text-xform": 122, "./text-xform": 125 }], 124: [function(g, C, i) {
  38934. const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("./shared-string-xform");
  38935. C.exports = class extends A {
  38936. constructor(l) {
  38937. super(), this.model = l || { values: [], count: 0 }, this.hash = /* @__PURE__ */ Object.create(null), this.rich = /* @__PURE__ */ Object.create(null);
  38938. }
  38939. get sharedStringXform() {
  38940. return this._sharedStringXform || (this._sharedStringXform = new s());
  38941. }
  38942. get values() {
  38943. return this.model.values;
  38944. }
  38945. get uniqueCount() {
  38946. return this.model.values.length;
  38947. }
  38948. get count() {
  38949. return this.model.count;
  38950. }
  38951. getString(l) {
  38952. return this.model.values[l];
  38953. }
  38954. add(l) {
  38955. return l.richText ? this.addRichText(l) : this.addText(l);
  38956. }
  38957. addText(l) {
  38958. let n = this.hash[l];
  38959. return n === void 0 && (n = this.hash[l] = this.model.values.length, this.model.values.push(l)), this.model.count++, n;
  38960. }
  38961. addRichText(l) {
  38962. const n = this.sharedStringXform.toXml(l);
  38963. let a = this.rich[n];
  38964. return a === void 0 && (a = this.rich[n] = this.model.values.length, this.model.values.push(l)), this.model.count++, a;
  38965. }
  38966. render(l, n) {
  38967. n = n || this._values, l.openXml(e.StdDocAttributes), l.openNode("sst", { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", count: n.count, uniqueCount: n.values.length });
  38968. const a = this.sharedStringXform;
  38969. n.values.forEach((d) => {
  38970. a.render(l, d);
  38971. }), l.closeNode();
  38972. }
  38973. parseOpen(l) {
  38974. if (this.parser) return this.parser.parseOpen(l), !0;
  38975. switch (l.name) {
  38976. case "sst":
  38977. return !0;
  38978. case "si":
  38979. return this.parser = this.sharedStringXform, this.parser.parseOpen(l), !0;
  38980. default:
  38981. throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(l));
  38982. }
  38983. }
  38984. parseText(l) {
  38985. this.parser && this.parser.parseText(l);
  38986. }
  38987. parseClose(l) {
  38988. if (this.parser) return this.parser.parseClose(l) || (this.model.values.push(this.parser.model), this.model.count++, this.parser = void 0), !0;
  38989. switch (l) {
  38990. case "sst":
  38991. return !1;
  38992. default:
  38993. throw new Error("Unexpected xml node in parseClose: " + l);
  38994. }
  38995. }
  38996. };
  38997. }, { "../../../utils/xml-stream": 28, "../base-xform": 32, "./shared-string-xform": 123 }], 125: [function(g, C, i) {
  38998. const e = g("../base-xform");
  38999. C.exports = class extends e {
  39000. get tag() {
  39001. return "t";
  39002. }
  39003. render(A, s) {
  39004. A.openNode("t"), /^\s|\n|\s$/.test(s) && A.addAttribute("xml:space", "preserve"), A.writeText(s), A.closeNode();
  39005. }
  39006. get model() {
  39007. return this._text.join("").replace(/_x([0-9A-F]{4})_/g, (A, s) => String.fromCharCode(parseInt(s, 16)));
  39008. }
  39009. parseOpen(A) {
  39010. switch (A.name) {
  39011. case "t":
  39012. return this._text = [], !0;
  39013. default:
  39014. return !1;
  39015. }
  39016. }
  39017. parseText(A) {
  39018. this._text.push(A);
  39019. }
  39020. parseClose() {
  39021. return !1;
  39022. }
  39023. };
  39024. }, { "../base-xform": 32 }], 126: [function(g, C, i) {
  39025. const e = g("../../../doc/enums"), A = g("../../../utils/utils"), s = g("../base-xform"), l = { horizontalValues: ["left", "center", "right", "fill", "centerContinuous", "distributed", "justify"].reduce((a, d) => (a[d] = !0, a), {}), horizontal(a) {
  39026. return this.horizontalValues[a] ? a : void 0;
  39027. }, verticalValues: ["top", "middle", "bottom", "distributed", "justify"].reduce((a, d) => (a[d] = !0, a), {}), vertical(a) {
  39028. return a === "middle" ? "center" : this.verticalValues[a] ? a : void 0;
  39029. }, wrapText: (a) => !!a || void 0, shrinkToFit: (a) => !!a || void 0, textRotation(a) {
  39030. switch (a) {
  39031. case "vertical":
  39032. return a;
  39033. default:
  39034. return (a = A.validInt(a)) >= -90 && a <= 90 ? a : void 0;
  39035. }
  39036. }, indent: (a) => (a = A.validInt(a), Math.max(0, a)), readingOrder(a) {
  39037. switch (a) {
  39038. case "ltr":
  39039. return e.ReadingOrder.LeftToRight;
  39040. case "rtl":
  39041. return e.ReadingOrder.RightToLeft;
  39042. default:
  39043. return;
  39044. }
  39045. } }, n = { toXml(a) {
  39046. if (a = l.textRotation(a)) {
  39047. if (a === "vertical") return 255;
  39048. const d = Math.round(a);
  39049. if (d >= 0 && d <= 90) return d;
  39050. if (d < 0 && d >= -90) return 90 - d;
  39051. }
  39052. }, toModel(a) {
  39053. const d = A.validInt(a);
  39054. if (d !== void 0) {
  39055. if (d === 255) return "vertical";
  39056. if (d >= 0 && d <= 90) return d;
  39057. if (d > 90 && d <= 180) return 90 - d;
  39058. }
  39059. } };
  39060. C.exports = class extends s {
  39061. get tag() {
  39062. return "alignment";
  39063. }
  39064. render(a, d) {
  39065. a.addRollback(), a.openNode("alignment");
  39066. let o = !1;
  39067. function c(r, h) {
  39068. h && (a.addAttribute(r, h), o = !0);
  39069. }
  39070. c("horizontal", l.horizontal(d.horizontal)), c("vertical", l.vertical(d.vertical)), c("wrapText", !!l.wrapText(d.wrapText) && "1"), c("shrinkToFit", !!l.shrinkToFit(d.shrinkToFit) && "1"), c("indent", l.indent(d.indent)), c("textRotation", n.toXml(d.textRotation)), c("readingOrder", l.readingOrder(d.readingOrder)), a.closeNode(), o ? a.commit() : a.rollback();
  39071. }
  39072. parseOpen(a) {
  39073. const d = {};
  39074. let o = !1;
  39075. function c(r, h, b) {
  39076. r && (d[h] = b, o = !0);
  39077. }
  39078. c(a.attributes.horizontal, "horizontal", a.attributes.horizontal), c(a.attributes.vertical, "vertical", a.attributes.vertical === "center" ? "middle" : a.attributes.vertical), c(a.attributes.wrapText, "wrapText", A.parseBoolean(a.attributes.wrapText)), c(a.attributes.shrinkToFit, "shrinkToFit", A.parseBoolean(a.attributes.shrinkToFit)), c(a.attributes.indent, "indent", parseInt(a.attributes.indent, 10)), c(a.attributes.textRotation, "textRotation", n.toModel(a.attributes.textRotation)), c(a.attributes.readingOrder, "readingOrder", a.attributes.readingOrder === "2" ? "rtl" : "ltr"), this.model = o ? d : null;
  39079. }
  39080. parseText() {
  39081. }
  39082. parseClose() {
  39083. return !1;
  39084. }
  39085. };
  39086. }, { "../../../doc/enums": 7, "../../../utils/utils": 27, "../base-xform": 32 }], 127: [function(g, C, i) {
  39087. const e = g("../base-xform"), A = g("../../../utils/utils"), s = g("./color-xform");
  39088. class l extends e {
  39089. constructor(a) {
  39090. super(), this.name = a, this.map = { color: new s() };
  39091. }
  39092. get tag() {
  39093. return this.name;
  39094. }
  39095. render(a, d, o) {
  39096. const c = d && d.color || o || this.defaultColor;
  39097. a.openNode(this.name), d && d.style && (a.addAttribute("style", d.style), c && this.map.color.render(a, c)), a.closeNode();
  39098. }
  39099. parseOpen(a) {
  39100. if (this.parser) return this.parser.parseOpen(a), !0;
  39101. switch (a.name) {
  39102. case this.name: {
  39103. const { style: d } = a.attributes;
  39104. return this.model = d ? { style: d } : void 0, !0;
  39105. }
  39106. case "color":
  39107. return this.parser = this.map.color, this.parser.parseOpen(a), !0;
  39108. default:
  39109. return !1;
  39110. }
  39111. }
  39112. parseText(a) {
  39113. this.parser && this.parser.parseText(a);
  39114. }
  39115. parseClose(a) {
  39116. return this.parser ? (this.parser.parseClose(a) || (this.parser = void 0), !0) : (a === this.name && this.map.color.model && (this.model || (this.model = {}), this.model.color = this.map.color.model), !1);
  39117. }
  39118. validStyle(a) {
  39119. return l.validStyleValues[a];
  39120. }
  39121. }
  39122. l.validStyleValues = ["thin", "dashed", "dotted", "dashDot", "hair", "dashDotDot", "slantDashDot", "mediumDashed", "mediumDashDotDot", "mediumDashDot", "medium", "double", "thick"].reduce((n, a) => (n[a] = !0, n), {}), C.exports = class extends e {
  39123. constructor() {
  39124. super(), this.map = { top: new l("top"), left: new l("left"), bottom: new l("bottom"), right: new l("right"), diagonal: new l("diagonal") };
  39125. }
  39126. render(n, a) {
  39127. const { color: d } = a;
  39128. function o(c, r) {
  39129. c && !c.color && a.color && (c = { ...c, color: a.color }), r.render(n, c, d);
  39130. }
  39131. n.openNode("border"), a.diagonal && a.diagonal.style && (a.diagonal.up && n.addAttribute("diagonalUp", "1"), a.diagonal.down && n.addAttribute("diagonalDown", "1")), o(a.left, this.map.left), o(a.right, this.map.right), o(a.top, this.map.top), o(a.bottom, this.map.bottom), o(a.diagonal, this.map.diagonal), n.closeNode();
  39132. }
  39133. parseOpen(n) {
  39134. if (this.parser) return this.parser.parseOpen(n), !0;
  39135. switch (n.name) {
  39136. case "border":
  39137. return this.reset(), this.diagonalUp = A.parseBoolean(n.attributes.diagonalUp), this.diagonalDown = A.parseBoolean(n.attributes.diagonalDown), !0;
  39138. default:
  39139. return this.parser = this.map[n.name], !!this.parser && (this.parser.parseOpen(n), !0);
  39140. }
  39141. }
  39142. parseText(n) {
  39143. this.parser && this.parser.parseText(n);
  39144. }
  39145. parseClose(n) {
  39146. if (this.parser) return this.parser.parseClose(n) || (this.parser = void 0), !0;
  39147. if (n === "border") {
  39148. const a = this.model = {}, d = function(o, c, r) {
  39149. c && (r && Object.assign(c, r), a[o] = c);
  39150. };
  39151. d("left", this.map.left.model), d("right", this.map.right.model), d("top", this.map.top.model), d("bottom", this.map.bottom.model), d("diagonal", this.map.diagonal.model, { up: this.diagonalUp, down: this.diagonalDown });
  39152. }
  39153. return !1;
  39154. }
  39155. };
  39156. }, { "../../../utils/utils": 27, "../base-xform": 32, "./color-xform": 128 }], 128: [function(g, C, i) {
  39157. const e = g("../base-xform");
  39158. C.exports = class extends e {
  39159. constructor(A) {
  39160. super(), this.name = A || "color";
  39161. }
  39162. get tag() {
  39163. return this.name;
  39164. }
  39165. render(A, s) {
  39166. return !!s && (A.openNode(this.name), s.argb ? A.addAttribute("rgb", s.argb) : s.theme !== void 0 ? (A.addAttribute("theme", s.theme), s.tint !== void 0 && A.addAttribute("tint", s.tint)) : s.indexed !== void 0 ? A.addAttribute("indexed", s.indexed) : A.addAttribute("auto", "1"), A.closeNode(), !0);
  39167. }
  39168. parseOpen(A) {
  39169. return A.name === this.name && (A.attributes.rgb ? this.model = { argb: A.attributes.rgb } : A.attributes.theme ? (this.model = { theme: parseInt(A.attributes.theme, 10) }, A.attributes.tint && (this.model.tint = parseFloat(A.attributes.tint))) : A.attributes.indexed ? this.model = { indexed: parseInt(A.attributes.indexed, 10) } : this.model = void 0, !0);
  39170. }
  39171. parseText() {
  39172. }
  39173. parseClose() {
  39174. return !1;
  39175. }
  39176. };
  39177. }, { "../base-xform": 32 }], 129: [function(g, C, i) {
  39178. const e = g("../base-xform"), A = g("./alignment-xform"), s = g("./border-xform"), l = g("./fill-xform"), n = g("./font-xform"), a = g("./numfmt-xform"), d = g("./protection-xform");
  39179. C.exports = class extends e {
  39180. constructor() {
  39181. super(), this.map = { alignment: new A(), border: new s(), fill: new l(), font: new n(), numFmt: new a(), protection: new d() };
  39182. }
  39183. get tag() {
  39184. return "dxf";
  39185. }
  39186. render(o, c) {
  39187. if (o.openNode(this.tag), c.font && this.map.font.render(o, c.font), c.numFmt && c.numFmtId) {
  39188. const r = { id: c.numFmtId, formatCode: c.numFmt };
  39189. this.map.numFmt.render(o, r);
  39190. }
  39191. c.fill && this.map.fill.render(o, c.fill), c.alignment && this.map.alignment.render(o, c.alignment), c.border && this.map.border.render(o, c.border), c.protection && this.map.protection.render(o, c.protection), o.closeNode();
  39192. }
  39193. parseOpen(o) {
  39194. if (this.parser) return this.parser.parseOpen(o), !0;
  39195. switch (o.name) {
  39196. case this.tag:
  39197. return this.reset(), !0;
  39198. default:
  39199. return this.parser = this.map[o.name], this.parser && this.parser.parseOpen(o), !0;
  39200. }
  39201. }
  39202. parseText(o) {
  39203. this.parser && this.parser.parseText(o);
  39204. }
  39205. parseClose(o) {
  39206. return this.parser ? (this.parser.parseClose(o) || (this.parser = void 0), !0) : o !== this.tag || (this.model = { alignment: this.map.alignment.model, border: this.map.border.model, fill: this.map.fill.model, font: this.map.font.model, numFmt: this.map.numFmt.model, protection: this.map.protection.model }, !1);
  39207. }
  39208. };
  39209. }, { "../base-xform": 32, "./alignment-xform": 126, "./border-xform": 127, "./fill-xform": 130, "./font-xform": 131, "./numfmt-xform": 132, "./protection-xform": 133 }], 130: [function(g, C, i) {
  39210. const e = g("../base-xform"), A = g("./color-xform");
  39211. class s extends e {
  39212. constructor() {
  39213. super(), this.map = { color: new A() };
  39214. }
  39215. get tag() {
  39216. return "stop";
  39217. }
  39218. render(o, c) {
  39219. o.openNode("stop"), o.addAttribute("position", c.position), this.map.color.render(o, c.color), o.closeNode();
  39220. }
  39221. parseOpen(o) {
  39222. if (this.parser) return this.parser.parseOpen(o), !0;
  39223. switch (o.name) {
  39224. case "stop":
  39225. return this.model = { position: parseFloat(o.attributes.position) }, !0;
  39226. case "color":
  39227. return this.parser = this.map.color, this.parser.parseOpen(o), !0;
  39228. default:
  39229. return !1;
  39230. }
  39231. }
  39232. parseText() {
  39233. }
  39234. parseClose(o) {
  39235. return !!this.parser && (this.parser.parseClose(o) || (this.model.color = this.parser.model, this.parser = void 0), !0);
  39236. }
  39237. }
  39238. class l extends e {
  39239. constructor() {
  39240. super(), this.map = { fgColor: new A("fgColor"), bgColor: new A("bgColor") };
  39241. }
  39242. get name() {
  39243. return "pattern";
  39244. }
  39245. get tag() {
  39246. return "patternFill";
  39247. }
  39248. render(o, c) {
  39249. o.openNode("patternFill"), o.addAttribute("patternType", c.pattern), c.fgColor && this.map.fgColor.render(o, c.fgColor), c.bgColor && this.map.bgColor.render(o, c.bgColor), o.closeNode();
  39250. }
  39251. parseOpen(o) {
  39252. if (this.parser) return this.parser.parseOpen(o), !0;
  39253. switch (o.name) {
  39254. case "patternFill":
  39255. return this.model = { type: "pattern", pattern: o.attributes.patternType }, !0;
  39256. default:
  39257. return this.parser = this.map[o.name], !!this.parser && (this.parser.parseOpen(o), !0);
  39258. }
  39259. }
  39260. parseText(o) {
  39261. this.parser && this.parser.parseText(o);
  39262. }
  39263. parseClose(o) {
  39264. return !!this.parser && (this.parser.parseClose(o) || (this.parser.model && (this.model[o] = this.parser.model), this.parser = void 0), !0);
  39265. }
  39266. }
  39267. class n extends e {
  39268. constructor() {
  39269. super(), this.map = { stop: new s() };
  39270. }
  39271. get name() {
  39272. return "gradient";
  39273. }
  39274. get tag() {
  39275. return "gradientFill";
  39276. }
  39277. render(o, c) {
  39278. switch (o.openNode("gradientFill"), c.gradient) {
  39279. case "angle":
  39280. o.addAttribute("degree", c.degree);
  39281. break;
  39282. case "path":
  39283. o.addAttribute("type", "path"), c.center.left && (o.addAttribute("left", c.center.left), c.center.right === void 0 && o.addAttribute("right", c.center.left)), c.center.right && o.addAttribute("right", c.center.right), c.center.top && (o.addAttribute("top", c.center.top), c.center.bottom === void 0 && o.addAttribute("bottom", c.center.top)), c.center.bottom && o.addAttribute("bottom", c.center.bottom);
  39284. }
  39285. const r = this.map.stop;
  39286. c.stops.forEach((h) => {
  39287. r.render(o, h);
  39288. }), o.closeNode();
  39289. }
  39290. parseOpen(o) {
  39291. if (this.parser) return this.parser.parseOpen(o), !0;
  39292. switch (o.name) {
  39293. case "gradientFill": {
  39294. const c = this.model = { stops: [] };
  39295. return o.attributes.degree ? (c.gradient = "angle", c.degree = parseInt(o.attributes.degree, 10)) : o.attributes.type === "path" && (c.gradient = "path", c.center = { left: o.attributes.left ? parseFloat(o.attributes.left) : 0, top: o.attributes.top ? parseFloat(o.attributes.top) : 0 }, o.attributes.right !== o.attributes.left && (c.center.right = o.attributes.right ? parseFloat(o.attributes.right) : 0), o.attributes.bottom !== o.attributes.top && (c.center.bottom = o.attributes.bottom ? parseFloat(o.attributes.bottom) : 0)), !0;
  39296. }
  39297. case "stop":
  39298. return this.parser = this.map.stop, this.parser.parseOpen(o), !0;
  39299. default:
  39300. return !1;
  39301. }
  39302. }
  39303. parseText(o) {
  39304. this.parser && this.parser.parseText(o);
  39305. }
  39306. parseClose(o) {
  39307. return !!this.parser && (this.parser.parseClose(o) || (this.model.stops.push(this.parser.model), this.parser = void 0), !0);
  39308. }
  39309. }
  39310. class a extends e {
  39311. constructor() {
  39312. super(), this.map = { patternFill: new l(), gradientFill: new n() };
  39313. }
  39314. get tag() {
  39315. return "fill";
  39316. }
  39317. render(o, c) {
  39318. switch (o.addRollback(), o.openNode("fill"), c.type) {
  39319. case "pattern":
  39320. this.map.patternFill.render(o, c);
  39321. break;
  39322. case "gradient":
  39323. this.map.gradientFill.render(o, c);
  39324. break;
  39325. default:
  39326. return void o.rollback();
  39327. }
  39328. o.closeNode(), o.commit();
  39329. }
  39330. parseOpen(o) {
  39331. if (this.parser) return this.parser.parseOpen(o), !0;
  39332. switch (o.name) {
  39333. case "fill":
  39334. return this.model = {}, !0;
  39335. default:
  39336. return this.parser = this.map[o.name], !!this.parser && (this.parser.parseOpen(o), !0);
  39337. }
  39338. }
  39339. parseText(o) {
  39340. this.parser && this.parser.parseText(o);
  39341. }
  39342. parseClose(o) {
  39343. return !!this.parser && (this.parser.parseClose(o) || (this.model = this.parser.model, this.model.type = this.parser.name, this.parser = void 0), !0);
  39344. }
  39345. validStyle(o) {
  39346. return a.validPatternValues[o];
  39347. }
  39348. }
  39349. a.validPatternValues = ["none", "solid", "darkVertical", "darkGray", "mediumGray", "lightGray", "gray125", "gray0625", "darkHorizontal", "darkVertical", "darkDown", "darkUp", "darkGrid", "darkTrellis", "lightHorizontal", "lightVertical", "lightDown", "lightUp", "lightGrid", "lightTrellis", "lightGrid"].reduce((d, o) => (d[o] = !0, d), {}), a.StopXform = s, a.PatternFillXform = l, a.GradientFillXform = n, C.exports = a;
  39350. }, { "../base-xform": 32, "./color-xform": 128 }], 131: [function(g, C, i) {
  39351. const e = g("./color-xform"), A = g("../simple/boolean-xform"), s = g("../simple/integer-xform"), l = g("../simple/string-xform"), n = g("./underline-xform"), a = g("../../../utils/under-dash"), d = g("../base-xform");
  39352. class o extends d {
  39353. constructor(r) {
  39354. super(), this.options = r || o.OPTIONS, this.map = { b: { prop: "bold", xform: new A({ tag: "b", attr: "val" }) }, i: { prop: "italic", xform: new A({ tag: "i", attr: "val" }) }, u: { prop: "underline", xform: new n() }, charset: { prop: "charset", xform: new s({ tag: "charset", attr: "val" }) }, color: { prop: "color", xform: new e() }, condense: { prop: "condense", xform: new A({ tag: "condense", attr: "val" }) }, extend: { prop: "extend", xform: new A({ tag: "extend", attr: "val" }) }, family: { prop: "family", xform: new s({ tag: "family", attr: "val" }) }, outline: { prop: "outline", xform: new A({ tag: "outline", attr: "val" }) }, vertAlign: { prop: "vertAlign", xform: new l({ tag: "vertAlign", attr: "val" }) }, scheme: { prop: "scheme", xform: new l({ tag: "scheme", attr: "val" }) }, shadow: { prop: "shadow", xform: new A({ tag: "shadow", attr: "val" }) }, strike: { prop: "strike", xform: new A({ tag: "strike", attr: "val" }) }, sz: { prop: "size", xform: new s({ tag: "sz", attr: "val" }) } }, this.map[this.options.fontNameTag] = { prop: "name", xform: new l({ tag: this.options.fontNameTag, attr: "val" }) };
  39355. }
  39356. get tag() {
  39357. return this.options.tagName;
  39358. }
  39359. render(r, h) {
  39360. const { map: b } = this;
  39361. r.openNode(this.options.tagName), a.each(this.map, (u, m) => {
  39362. b[m].xform.render(r, h[u.prop]);
  39363. }), r.closeNode();
  39364. }
  39365. parseOpen(r) {
  39366. if (this.parser) return this.parser.parseOpen(r), !0;
  39367. if (this.map[r.name]) return this.parser = this.map[r.name].xform, this.parser.parseOpen(r);
  39368. switch (r.name) {
  39369. case this.options.tagName:
  39370. return this.model = {}, !0;
  39371. default:
  39372. return !1;
  39373. }
  39374. }
  39375. parseText(r) {
  39376. this.parser && this.parser.parseText(r);
  39377. }
  39378. parseClose(r) {
  39379. if (this.parser && !this.parser.parseClose(r)) {
  39380. const h = this.map[r];
  39381. return this.parser.model && (this.model[h.prop] = this.parser.model), this.parser = void 0, !0;
  39382. }
  39383. switch (r) {
  39384. case this.options.tagName:
  39385. return !1;
  39386. default:
  39387. return !0;
  39388. }
  39389. }
  39390. }
  39391. o.OPTIONS = { tagName: "font", fontNameTag: "name" }, C.exports = o;
  39392. }, { "../../../utils/under-dash": 26, "../base-xform": 32, "../simple/boolean-xform": 116, "../simple/integer-xform": 118, "../simple/string-xform": 119, "./color-xform": 128, "./underline-xform": 136 }], 132: [function(g, C, i) {
  39393. const e = g("../../../utils/under-dash"), A = g("../../defaultnumformats"), s = g("../base-xform"), l = function() {
  39394. const a = {};
  39395. return e.each(A, (d, o) => {
  39396. d.f && (a[d.f] = parseInt(o, 10));
  39397. }), a;
  39398. }();
  39399. class n extends s {
  39400. constructor(d, o) {
  39401. super(), this.id = d, this.formatCode = o;
  39402. }
  39403. get tag() {
  39404. return "numFmt";
  39405. }
  39406. render(d, o) {
  39407. d.leafNode("numFmt", { numFmtId: o.id, formatCode: o.formatCode });
  39408. }
  39409. parseOpen(d) {
  39410. switch (d.name) {
  39411. case "numFmt":
  39412. return this.model = { id: parseInt(d.attributes.numFmtId, 10), formatCode: d.attributes.formatCode.replace(/[\\](.)/g, "$1") }, !0;
  39413. default:
  39414. return !1;
  39415. }
  39416. }
  39417. parseText() {
  39418. }
  39419. parseClose() {
  39420. return !1;
  39421. }
  39422. }
  39423. n.getDefaultFmtId = function(a) {
  39424. return l[a];
  39425. }, n.getDefaultFmtCode = function(a) {
  39426. return A[a] && A[a].f;
  39427. }, C.exports = n;
  39428. }, { "../../../utils/under-dash": 26, "../../defaultnumformats": 30, "../base-xform": 32 }], 133: [function(g, C, i) {
  39429. const e = g("../base-xform"), A = { boolean: (s, l) => s === void 0 ? l : s };
  39430. C.exports = class extends e {
  39431. get tag() {
  39432. return "protection";
  39433. }
  39434. render(s, l) {
  39435. s.addRollback(), s.openNode("protection");
  39436. let n = !1;
  39437. function a(d, o) {
  39438. o !== void 0 && (s.addAttribute(d, o), n = !0);
  39439. }
  39440. a("locked", A.boolean(l.locked, !0) ? void 0 : "0"), a("hidden", A.boolean(l.hidden, !1) ? "1" : void 0), s.closeNode(), n ? s.commit() : s.rollback();
  39441. }
  39442. parseOpen(s) {
  39443. const l = { locked: s.attributes.locked !== "0", hidden: s.attributes.hidden === "1" }, n = !l.locked || l.hidden;
  39444. this.model = n ? l : null;
  39445. }
  39446. parseText() {
  39447. }
  39448. parseClose() {
  39449. return !1;
  39450. }
  39451. };
  39452. }, { "../base-xform": 32 }], 134: [function(g, C, i) {
  39453. const e = g("../base-xform"), A = g("./alignment-xform"), s = g("./protection-xform");
  39454. C.exports = class extends e {
  39455. constructor(l) {
  39456. super(), this.xfId = !(!l || !l.xfId), this.map = { alignment: new A(), protection: new s() };
  39457. }
  39458. get tag() {
  39459. return "xf";
  39460. }
  39461. render(l, n) {
  39462. l.openNode("xf", { numFmtId: n.numFmtId || 0, fontId: n.fontId || 0, fillId: n.fillId || 0, borderId: n.borderId || 0 }), this.xfId && l.addAttribute("xfId", n.xfId || 0), n.numFmtId && l.addAttribute("applyNumberFormat", "1"), n.fontId && l.addAttribute("applyFont", "1"), n.fillId && l.addAttribute("applyFill", "1"), n.borderId && l.addAttribute("applyBorder", "1"), n.alignment && l.addAttribute("applyAlignment", "1"), n.protection && l.addAttribute("applyProtection", "1"), n.alignment && this.map.alignment.render(l, n.alignment), n.protection && this.map.protection.render(l, n.protection), l.closeNode();
  39463. }
  39464. parseOpen(l) {
  39465. if (this.parser) return this.parser.parseOpen(l), !0;
  39466. switch (l.name) {
  39467. case "xf":
  39468. return this.model = { numFmtId: parseInt(l.attributes.numFmtId, 10), fontId: parseInt(l.attributes.fontId, 10), fillId: parseInt(l.attributes.fillId, 10), borderId: parseInt(l.attributes.borderId, 10) }, this.xfId && (this.model.xfId = parseInt(l.attributes.xfId, 10)), !0;
  39469. case "alignment":
  39470. return this.parser = this.map.alignment, this.parser.parseOpen(l), !0;
  39471. case "protection":
  39472. return this.parser = this.map.protection, this.parser.parseOpen(l), !0;
  39473. default:
  39474. return !1;
  39475. }
  39476. }
  39477. parseText(l) {
  39478. this.parser && this.parser.parseText(l);
  39479. }
  39480. parseClose(l) {
  39481. return this.parser ? (this.parser.parseClose(l) || (this.map.protection === this.parser ? this.model.protection = this.parser.model : this.model.alignment = this.parser.model, this.parser = void 0), !0) : l !== "xf";
  39482. }
  39483. };
  39484. }, { "../base-xform": 32, "./alignment-xform": 126, "./protection-xform": 133 }], 135: [function(g, C, i) {
  39485. const e = g("../../../doc/enums"), A = g("../../../utils/xml-stream"), s = g("../base-xform"), l = g("../static-xform"), n = g("../list-xform"), a = g("./font-xform"), d = g("./fill-xform"), o = g("./border-xform"), c = g("./numfmt-xform"), r = g("./style-xform"), h = g("./dxf-xform");
  39486. class b extends s {
  39487. constructor(m) {
  39488. super(), this.map = { numFmts: new n({ tag: "numFmts", count: !0, childXform: new c() }), fonts: new n({ tag: "fonts", count: !0, childXform: new a(), $: { "x14ac:knownFonts": 1 } }), fills: new n({ tag: "fills", count: !0, childXform: new d() }), borders: new n({ tag: "borders", count: !0, childXform: new o() }), cellStyleXfs: new n({ tag: "cellStyleXfs", count: !0, childXform: new r() }), cellXfs: new n({ tag: "cellXfs", count: !0, childXform: new r({ xfId: !0 }) }), dxfs: new n({ tag: "dxfs", always: !0, count: !0, childXform: new h() }), numFmt: new c(), font: new a(), fill: new d(), border: new o(), style: new r({ xfId: !0 }), cellStyles: b.STATIC_XFORMS.cellStyles, tableStyles: b.STATIC_XFORMS.tableStyles, extLst: b.STATIC_XFORMS.extLst }, m && this.init();
  39489. }
  39490. initIndex() {
  39491. this.index = { style: {}, numFmt: {}, numFmtNextId: 164, font: {}, border: {}, fill: {} };
  39492. }
  39493. init() {
  39494. this.model = { styles: [], numFmts: [], fonts: [], borders: [], fills: [], dxfs: [] }, this.initIndex(), this._addBorder({}), this._addStyle({ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }), this._addFill({ type: "pattern", pattern: "none" }), this._addFill({ type: "pattern", pattern: "gray125" }), this.weakMap = /* @__PURE__ */ new WeakMap();
  39495. }
  39496. render(m, Z) {
  39497. Z = Z || this.model, m.openXml(A.StdDocAttributes), m.openNode("styleSheet", b.STYLESHEET_ATTRIBUTES), this.index ? (Z.numFmts && Z.numFmts.length && (m.openNode("numFmts", { count: Z.numFmts.length }), Z.numFmts.forEach((p) => {
  39498. m.writeXml(p);
  39499. }), m.closeNode()), Z.fonts.length || this._addFont({ size: 11, color: { theme: 1 }, name: "Calibri", family: 2, scheme: "minor" }), m.openNode("fonts", { count: Z.fonts.length, "x14ac:knownFonts": 1 }), Z.fonts.forEach((p) => {
  39500. m.writeXml(p);
  39501. }), m.closeNode(), m.openNode("fills", { count: Z.fills.length }), Z.fills.forEach((p) => {
  39502. m.writeXml(p);
  39503. }), m.closeNode(), m.openNode("borders", { count: Z.borders.length }), Z.borders.forEach((p) => {
  39504. m.writeXml(p);
  39505. }), m.closeNode(), this.map.cellStyleXfs.render(m, [{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }]), m.openNode("cellXfs", { count: Z.styles.length }), Z.styles.forEach((p) => {
  39506. m.writeXml(p);
  39507. }), m.closeNode()) : (this.map.numFmts.render(m, Z.numFmts), this.map.fonts.render(m, Z.fonts), this.map.fills.render(m, Z.fills), this.map.borders.render(m, Z.borders), this.map.cellStyleXfs.render(m, [{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }]), this.map.cellXfs.render(m, Z.styles)), b.STATIC_XFORMS.cellStyles.render(m), this.map.dxfs.render(m, Z.dxfs), b.STATIC_XFORMS.tableStyles.render(m), b.STATIC_XFORMS.extLst.render(m), m.closeNode();
  39508. }
  39509. parseOpen(m) {
  39510. if (this.parser) return this.parser.parseOpen(m), !0;
  39511. switch (m.name) {
  39512. case "styleSheet":
  39513. return this.initIndex(), !0;
  39514. default:
  39515. return this.parser = this.map[m.name], this.parser && this.parser.parseOpen(m), !0;
  39516. }
  39517. }
  39518. parseText(m) {
  39519. this.parser && this.parser.parseText(m);
  39520. }
  39521. parseClose(m) {
  39522. if (this.parser) return this.parser.parseClose(m) || (this.parser = void 0), !0;
  39523. switch (m) {
  39524. case "styleSheet": {
  39525. this.model = {};
  39526. const Z = (p, Y) => {
  39527. Y.model && Y.model.length && (this.model[p] = Y.model);
  39528. };
  39529. if (Z("numFmts", this.map.numFmts), Z("fonts", this.map.fonts), Z("fills", this.map.fills), Z("borders", this.map.borders), Z("styles", this.map.cellXfs), Z("dxfs", this.map.dxfs), this.index = { model: [], numFmt: [] }, this.model.numFmts) {
  39530. const p = this.index.numFmt;
  39531. this.model.numFmts.forEach((Y) => {
  39532. p[Y.id] = Y.formatCode;
  39533. });
  39534. }
  39535. return !1;
  39536. }
  39537. default:
  39538. return !0;
  39539. }
  39540. }
  39541. addStyleModel(m, Z) {
  39542. if (!m) return 0;
  39543. if (this.model.fonts.length || this._addFont({ size: 11, color: { theme: 1 }, name: "Calibri", family: 2, scheme: "minor" }), this.weakMap && this.weakMap.has(m)) return this.weakMap.get(m);
  39544. const p = {};
  39545. if (Z = Z || e.ValueType.Number, m.numFmt) p.numFmtId = this._addNumFmtStr(m.numFmt);
  39546. else switch (Z) {
  39547. case e.ValueType.Number:
  39548. p.numFmtId = this._addNumFmtStr("General");
  39549. break;
  39550. case e.ValueType.Date:
  39551. p.numFmtId = this._addNumFmtStr("mm-dd-yy");
  39552. }
  39553. m.font && (p.fontId = this._addFont(m.font)), m.border && (p.borderId = this._addBorder(m.border)), m.fill && (p.fillId = this._addFill(m.fill)), m.alignment && (p.alignment = m.alignment), m.protection && (p.protection = m.protection);
  39554. const Y = this._addStyle(p);
  39555. return this.weakMap && this.weakMap.set(m, Y), Y;
  39556. }
  39557. getStyleModel(m) {
  39558. const Z = this.model.styles[m];
  39559. if (!Z) return null;
  39560. let p = this.index.model[m];
  39561. if (p) return p;
  39562. if (p = this.index.model[m] = {}, Z.numFmtId) {
  39563. const R = this.index.numFmt[Z.numFmtId] || c.getDefaultFmtCode(Z.numFmtId);
  39564. R && (p.numFmt = R);
  39565. }
  39566. function Y(R, X, H) {
  39567. if (H || H === 0) {
  39568. const S = X[H];
  39569. S && (p[R] = S);
  39570. }
  39571. }
  39572. return Y("font", this.model.fonts, Z.fontId), Y("border", this.model.borders, Z.borderId), Y("fill", this.model.fills, Z.fillId), Z.alignment && (p.alignment = Z.alignment), Z.protection && (p.protection = Z.protection), p;
  39573. }
  39574. addDxfStyle(m) {
  39575. return m.numFmt && (m.numFmtId = this._addNumFmtStr(m.numFmt)), this.model.dxfs.push(m), this.model.dxfs.length - 1;
  39576. }
  39577. getDxfStyle(m) {
  39578. return this.model.dxfs[m];
  39579. }
  39580. _addStyle(m) {
  39581. const Z = this.map.style.toXml(m);
  39582. let p = this.index.style[Z];
  39583. return p === void 0 && (p = this.index.style[Z] = this.model.styles.length, this.model.styles.push(Z)), p;
  39584. }
  39585. _addNumFmtStr(m) {
  39586. let Z = c.getDefaultFmtId(m);
  39587. if (Z !== void 0 || (Z = this.index.numFmt[m], Z !== void 0)) return Z;
  39588. Z = this.index.numFmt[m] = 164 + this.model.numFmts.length;
  39589. const p = this.map.numFmt.toXml({ id: Z, formatCode: m });
  39590. return this.model.numFmts.push(p), Z;
  39591. }
  39592. _addFont(m) {
  39593. const Z = this.map.font.toXml(m);
  39594. let p = this.index.font[Z];
  39595. return p === void 0 && (p = this.index.font[Z] = this.model.fonts.length, this.model.fonts.push(Z)), p;
  39596. }
  39597. _addBorder(m) {
  39598. const Z = this.map.border.toXml(m);
  39599. let p = this.index.border[Z];
  39600. return p === void 0 && (p = this.index.border[Z] = this.model.borders.length, this.model.borders.push(Z)), p;
  39601. }
  39602. _addFill(m) {
  39603. const Z = this.map.fill.toXml(m);
  39604. let p = this.index.fill[Z];
  39605. return p === void 0 && (p = this.index.fill[Z] = this.model.fills.length, this.model.fills.push(Z)), p;
  39606. }
  39607. }
  39608. b.STYLESHEET_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", "xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006", "mc:Ignorable": "x14ac x16r2", "xmlns:x14ac": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac", "xmlns:x16r2": "http://schemas.microsoft.com/office/spreadsheetml/2015/02/main" }, b.STATIC_XFORMS = { cellStyles: new l({ tag: "cellStyles", $: { count: 1 }, c: [{ tag: "cellStyle", $: { name: "Normal", xfId: 0, builtinId: 0 } }] }), dxfs: new l({ tag: "dxfs", $: { count: 0 } }), tableStyles: new l({ tag: "tableStyles", $: { count: 0, defaultTableStyle: "TableStyleMedium2", defaultPivotStyle: "PivotStyleLight16" } }), extLst: new l({ tag: "extLst", c: [{ tag: "ext", $: { uri: "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}", "xmlns:x14": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" }, c: [{ tag: "x14:slicerStyles", $: { defaultSlicerStyle: "SlicerStyleLight1" } }] }, { tag: "ext", $: { uri: "{9260A510-F301-46a8-8635-F512D64BE5F5}", "xmlns:x15": "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main" }, c: [{ tag: "x15:timelineStyles", $: { defaultTimelineStyle: "TimeSlicerStyleLight1" } }] }] }) }, b.Mock = class extends b {
  39609. constructor() {
  39610. super(), this.model = { styles: [{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }], numFmts: [], fonts: [{ size: 11, color: { theme: 1 }, name: "Calibri", family: 2, scheme: "minor" }], borders: [{}], fills: [{ type: "pattern", pattern: "none" }, { type: "pattern", pattern: "gray125" }] };
  39611. }
  39612. parseStream(u) {
  39613. return u.autodrain(), Promise.resolve();
  39614. }
  39615. addStyleModel(u, m) {
  39616. switch (m) {
  39617. case e.ValueType.Date:
  39618. return this.dateStyleId;
  39619. default:
  39620. return 0;
  39621. }
  39622. }
  39623. get dateStyleId() {
  39624. if (!this._dateStyleId) {
  39625. const u = { numFmtId: c.getDefaultFmtId("mm-dd-yy") };
  39626. this._dateStyleId = this.model.styles.length, this.model.styles.push(u);
  39627. }
  39628. return this._dateStyleId;
  39629. }
  39630. getStyleModel() {
  39631. return {};
  39632. }
  39633. }, C.exports = b;
  39634. }, { "../../../doc/enums": 7, "../../../utils/xml-stream": 28, "../base-xform": 32, "../list-xform": 71, "../static-xform": 120, "./border-xform": 127, "./dxf-xform": 129, "./fill-xform": 130, "./font-xform": 131, "./numfmt-xform": 132, "./style-xform": 134 }], 136: [function(g, C, i) {
  39635. const e = g("../base-xform");
  39636. class A extends e {
  39637. constructor(l) {
  39638. super(), this.model = l;
  39639. }
  39640. get tag() {
  39641. return "u";
  39642. }
  39643. render(l, n) {
  39644. if ((n = n || this.model) === !0) l.leafNode("u");
  39645. else {
  39646. const a = A.Attributes[n];
  39647. a && l.leafNode("u", a);
  39648. }
  39649. }
  39650. parseOpen(l) {
  39651. l.name === "u" && (this.model = l.attributes.val || !0);
  39652. }
  39653. parseText() {
  39654. }
  39655. parseClose() {
  39656. return !1;
  39657. }
  39658. }
  39659. A.Attributes = { single: {}, double: { val: "double" }, singleAccounting: { val: "singleAccounting" }, doubleAccounting: { val: "doubleAccounting" } }, C.exports = A;
  39660. }, { "../base-xform": 32 }], 137: [function(g, C, i) {
  39661. const e = g("../base-xform"), A = g("./filter-column-xform");
  39662. C.exports = class extends e {
  39663. constructor() {
  39664. super(), this.map = { filterColumn: new A() };
  39665. }
  39666. get tag() {
  39667. return "autoFilter";
  39668. }
  39669. prepare(s) {
  39670. s.columns.forEach((l, n) => {
  39671. this.map.filterColumn.prepare(l, { index: n });
  39672. });
  39673. }
  39674. render(s, l) {
  39675. return s.openNode(this.tag, { ref: l.autoFilterRef }), l.columns.forEach((n) => {
  39676. this.map.filterColumn.render(s, n);
  39677. }), s.closeNode(), !0;
  39678. }
  39679. parseOpen(s) {
  39680. if (this.parser) return this.parser.parseOpen(s), !0;
  39681. switch (s.name) {
  39682. case this.tag:
  39683. return this.model = { autoFilterRef: s.attributes.ref, columns: [] }, !0;
  39684. default:
  39685. if (this.parser = this.map[s.name], this.parser) return this.parseOpen(s), !0;
  39686. throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(s));
  39687. }
  39688. }
  39689. parseText(s) {
  39690. this.parser && this.parser.parseText(s);
  39691. }
  39692. parseClose(s) {
  39693. if (this.parser) return this.parser.parseClose(s) || (this.model.columns.push(this.parser.model), this.parser = void 0), !0;
  39694. switch (s) {
  39695. case this.tag:
  39696. return !1;
  39697. default:
  39698. throw new Error("Unexpected xml node in parseClose: " + s);
  39699. }
  39700. }
  39701. };
  39702. }, { "../base-xform": 32, "./filter-column-xform": 139 }], 138: [function(g, C, i) {
  39703. const e = g("../base-xform");
  39704. C.exports = class extends e {
  39705. get tag() {
  39706. return "customFilter";
  39707. }
  39708. render(A, s) {
  39709. A.leafNode(this.tag, { val: s.val, operator: s.operator });
  39710. }
  39711. parseOpen(A) {
  39712. return A.name === this.tag && (this.model = { val: A.attributes.val, operator: A.attributes.operator }, !0);
  39713. }
  39714. parseText() {
  39715. }
  39716. parseClose() {
  39717. return !1;
  39718. }
  39719. };
  39720. }, { "../base-xform": 32 }], 139: [function(g, C, i) {
  39721. const e = g("../base-xform"), A = g("../list-xform"), s = g("./custom-filter-xform"), l = g("./filter-xform");
  39722. C.exports = class extends e {
  39723. constructor() {
  39724. super(), this.map = { customFilters: new A({ tag: "customFilters", count: !1, empty: !0, childXform: new s() }), filters: new A({ tag: "filters", count: !1, empty: !0, childXform: new l() }) };
  39725. }
  39726. get tag() {
  39727. return "filterColumn";
  39728. }
  39729. prepare(n, a) {
  39730. n.colId = a.index.toString();
  39731. }
  39732. render(n, a) {
  39733. return a.customFilters ? (n.openNode(this.tag, { colId: a.colId, hiddenButton: a.filterButton ? "0" : "1" }), this.map.customFilters.render(n, a.customFilters), n.closeNode(), !0) : (n.leafNode(this.tag, { colId: a.colId, hiddenButton: a.filterButton ? "0" : "1" }), !0);
  39734. }
  39735. parseOpen(n) {
  39736. if (this.parser) return this.parser.parseOpen(n), !0;
  39737. const { attributes: a } = n;
  39738. switch (n.name) {
  39739. case this.tag:
  39740. return this.model = { filterButton: a.hiddenButton === "0" }, !0;
  39741. default:
  39742. if (this.parser = this.map[n.name], this.parser) return this.parseOpen(n), !0;
  39743. throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(n));
  39744. }
  39745. }
  39746. parseText() {
  39747. }
  39748. parseClose(n) {
  39749. if (this.parser) return this.parser.parseClose(n) || (this.parser = void 0), !0;
  39750. switch (n) {
  39751. case this.tag:
  39752. return this.model.customFilters = this.map.customFilters.model, !1;
  39753. default:
  39754. return !0;
  39755. }
  39756. }
  39757. };
  39758. }, { "../base-xform": 32, "../list-xform": 71, "./custom-filter-xform": 138, "./filter-xform": 140 }], 140: [function(g, C, i) {
  39759. const e = g("../base-xform");
  39760. C.exports = class extends e {
  39761. get tag() {
  39762. return "filter";
  39763. }
  39764. render(A, s) {
  39765. A.leafNode(this.tag, { val: s.val });
  39766. }
  39767. parseOpen(A) {
  39768. return A.name === this.tag && (this.model = { val: A.attributes.val }, !0);
  39769. }
  39770. parseText() {
  39771. }
  39772. parseClose() {
  39773. return !1;
  39774. }
  39775. };
  39776. }, { "../base-xform": 32 }], 141: [function(g, C, i) {
  39777. const e = g("../base-xform");
  39778. C.exports = class extends e {
  39779. get tag() {
  39780. return "tableColumn";
  39781. }
  39782. prepare(A, s) {
  39783. A.id = s.index + 1;
  39784. }
  39785. render(A, s) {
  39786. return A.leafNode(this.tag, { id: s.id.toString(), name: s.name, totalsRowLabel: s.totalsRowLabel, totalsRowFunction: s.totalsRowFunction, dxfId: s.dxfId }), !0;
  39787. }
  39788. parseOpen(A) {
  39789. if (A.name === this.tag) {
  39790. const { attributes: s } = A;
  39791. return this.model = { name: s.name, totalsRowLabel: s.totalsRowLabel, totalsRowFunction: s.totalsRowFunction, dxfId: s.dxfId }, !0;
  39792. }
  39793. return !1;
  39794. }
  39795. parseText() {
  39796. }
  39797. parseClose() {
  39798. return !1;
  39799. }
  39800. };
  39801. }, { "../base-xform": 32 }], 142: [function(g, C, i) {
  39802. const e = g("../base-xform");
  39803. C.exports = class extends e {
  39804. get tag() {
  39805. return "tableStyleInfo";
  39806. }
  39807. render(A, s) {
  39808. return A.leafNode(this.tag, { name: s.theme ? s.theme : void 0, showFirstColumn: s.showFirstColumn ? "1" : "0", showLastColumn: s.showLastColumn ? "1" : "0", showRowStripes: s.showRowStripes ? "1" : "0", showColumnStripes: s.showColumnStripes ? "1" : "0" }), !0;
  39809. }
  39810. parseOpen(A) {
  39811. if (A.name === this.tag) {
  39812. const { attributes: s } = A;
  39813. return this.model = { theme: s.name ? s.name : null, showFirstColumn: s.showFirstColumn === "1", showLastColumn: s.showLastColumn === "1", showRowStripes: s.showRowStripes === "1", showColumnStripes: s.showColumnStripes === "1" }, !0;
  39814. }
  39815. return !1;
  39816. }
  39817. parseText() {
  39818. }
  39819. parseClose() {
  39820. return !1;
  39821. }
  39822. };
  39823. }, { "../base-xform": 32 }], 143: [function(g, C, i) {
  39824. const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("../list-xform"), l = g("./auto-filter-xform"), n = g("./table-column-xform"), a = g("./table-style-info-xform");
  39825. class d extends A {
  39826. constructor() {
  39827. super(), this.map = { autoFilter: new l(), tableColumns: new s({ tag: "tableColumns", count: !0, empty: !0, childXform: new n() }), tableStyleInfo: new a() };
  39828. }
  39829. prepare(c, r) {
  39830. this.map.autoFilter.prepare(c), this.map.tableColumns.prepare(c.columns, r);
  39831. }
  39832. get tag() {
  39833. return "table";
  39834. }
  39835. render(c, r) {
  39836. c.openXml(e.StdDocAttributes), c.openNode(this.tag, { ...d.TABLE_ATTRIBUTES, id: r.id, name: r.name, displayName: r.displayName || r.name, ref: r.tableRef, totalsRowCount: r.totalsRow ? "1" : void 0, totalsRowShown: r.totalsRow ? void 0 : "1", headerRowCount: r.headerRow ? "1" : "0" }), this.map.autoFilter.render(c, r), this.map.tableColumns.render(c, r.columns), this.map.tableStyleInfo.render(c, r.style), c.closeNode();
  39837. }
  39838. parseOpen(c) {
  39839. if (this.parser) return this.parser.parseOpen(c), !0;
  39840. const { name: r, attributes: h } = c;
  39841. switch (r) {
  39842. case this.tag:
  39843. this.reset(), this.model = { name: h.name, displayName: h.displayName || h.name, tableRef: h.ref, totalsRow: h.totalsRowCount === "1", headerRow: h.headerRowCount === "1" };
  39844. break;
  39845. default:
  39846. this.parser = this.map[c.name], this.parser && this.parser.parseOpen(c);
  39847. }
  39848. return !0;
  39849. }
  39850. parseText(c) {
  39851. this.parser && this.parser.parseText(c);
  39852. }
  39853. parseClose(c) {
  39854. if (this.parser) return this.parser.parseClose(c) || (this.parser = void 0), !0;
  39855. switch (c) {
  39856. case this.tag:
  39857. return this.model.columns = this.map.tableColumns.model, this.map.autoFilter.model && (this.model.autoFilterRef = this.map.autoFilter.model.autoFilterRef, this.map.autoFilter.model.columns.forEach((r, h) => {
  39858. this.model.columns[h].filterButton = r.filterButton;
  39859. })), this.model.style = this.map.tableStyleInfo.model, !1;
  39860. default:
  39861. return !0;
  39862. }
  39863. }
  39864. reconcile(c, r) {
  39865. c.columns.forEach((h) => {
  39866. h.dxfId !== void 0 && (h.style = r.styles.getDxfStyle(h.dxfId));
  39867. });
  39868. }
  39869. }
  39870. d.TABLE_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", "xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006", "mc:Ignorable": "xr xr3", "xmlns:xr": "http://schemas.microsoft.com/office/spreadsheetml/2014/revision", "xmlns:xr3": "http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" }, C.exports = d;
  39871. }, { "../../../utils/xml-stream": 28, "../base-xform": 32, "../list-xform": 71, "./auto-filter-xform": 137, "./table-column-xform": 141, "./table-style-info-xform": 142 }], 144: [function(g, C, i) {
  39872. (function(e, A) {
  39873. (function() {
  39874. const s = g("fs"), l = g("jszip"), { PassThrough: n } = g("readable-stream"), a = g("../utils/zip-stream"), d = g("../utils/stream-buf"), o = g("../utils/utils"), c = g("../utils/xml-stream"), { bufferToString: r } = g("../utils/browser-buffer-decode"), h = g("./xform/style/styles-xform"), b = g("./xform/core/core-xform"), u = g("./xform/strings/shared-strings-xform"), m = g("./xform/core/relationships-xform"), Z = g("./xform/core/content-types-xform"), p = g("./xform/core/app-xform"), Y = g("./xform/book/workbook-xform"), R = g("./xform/sheet/worksheet-xform"), X = g("./xform/drawing/drawing-xform"), H = g("./xform/table/table-xform"), S = g("./xform/comment/comments-xform"), z = g("./xform/comment/vml-notes-xform"), v = g("./xml/theme1");
  39875. class K {
  39876. constructor(N) {
  39877. this.workbook = N;
  39878. }
  39879. async readFile(N, B) {
  39880. if (!await o.fs.exists(N)) throw new Error("File not found: " + N);
  39881. const G = s.createReadStream(N);
  39882. try {
  39883. const w = await this.read(G, B);
  39884. return G.close(), w;
  39885. } catch (w) {
  39886. throw G.close(), w;
  39887. }
  39888. }
  39889. parseRels(N) {
  39890. return new m().parseStream(N);
  39891. }
  39892. parseWorkbook(N) {
  39893. return new Y().parseStream(N);
  39894. }
  39895. parseSharedStrings(N) {
  39896. return new u().parseStream(N);
  39897. }
  39898. reconcile(N, B) {
  39899. const G = new Y(), w = new R(B), W = new X(), y = new H();
  39900. G.reconcile(N);
  39901. const f = { media: N.media, mediaIndex: N.mediaIndex };
  39902. Object.keys(N.drawings).forEach((T) => {
  39903. const Q = N.drawings[T], P = N.drawingRels[T];
  39904. P && (f.rels = P.reduce((L, E) => (L[E.Id] = E, L), {}), (Q.anchors || []).forEach((L) => {
  39905. const E = L.picture && L.picture.hyperlinks;
  39906. E && f.rels[E.rId] && (E.hyperlink = f.rels[E.rId].Target, delete E.rId);
  39907. }), W.reconcile(Q, f));
  39908. });
  39909. const D = { styles: N.styles };
  39910. Object.values(N.tables).forEach((T) => {
  39911. y.reconcile(T, D);
  39912. });
  39913. const F = { styles: N.styles, sharedStrings: N.sharedStrings, media: N.media, mediaIndex: N.mediaIndex, date1904: N.properties && N.properties.date1904, drawings: N.drawings, comments: N.comments, tables: N.tables, vmlDrawings: N.vmlDrawings };
  39914. N.worksheets.forEach((T) => {
  39915. T.relationships = N.worksheetRels[T.sheetNo], w.reconcile(T, F);
  39916. }), delete N.worksheetHash, delete N.worksheetRels, delete N.globalRels, delete N.sharedStrings, delete N.workbookRels, delete N.sheetDefs, delete N.styles, delete N.mediaIndex, delete N.drawings, delete N.drawingRels, delete N.vmlDrawings;
  39917. }
  39918. async _processWorksheetEntry(N, B, G, w, W) {
  39919. const y = new R(w), f = await y.parseStream(N);
  39920. f.sheetNo = G, B.worksheetHash[W] = f, B.worksheets.push(f);
  39921. }
  39922. async _processCommentEntry(N, B, G) {
  39923. const w = new S(), W = await w.parseStream(N);
  39924. B.comments[`../${G}.xml`] = W;
  39925. }
  39926. async _processTableEntry(N, B, G) {
  39927. const w = new H(), W = await w.parseStream(N);
  39928. B.tables[`../tables/${G}.xml`] = W;
  39929. }
  39930. async _processWorksheetRelsEntry(N, B, G) {
  39931. const w = new m(), W = await w.parseStream(N);
  39932. B.worksheetRels[G] = W;
  39933. }
  39934. async _processMediaEntry(N, B, G) {
  39935. const w = G.lastIndexOf(".");
  39936. if (w >= 1) {
  39937. const W = G.substr(w + 1), y = G.substr(0, w);
  39938. await new Promise((f, D) => {
  39939. const F = new d();
  39940. F.on("finish", () => {
  39941. B.mediaIndex[G] = B.media.length, B.mediaIndex[y] = B.media.length;
  39942. const T = { type: "image", name: y, extension: W, buffer: F.toBuffer() };
  39943. B.media.push(T), f();
  39944. }), N.on("error", (T) => {
  39945. D(T);
  39946. }), N.pipe(F);
  39947. });
  39948. }
  39949. }
  39950. async _processDrawingEntry(N, B, G) {
  39951. const w = new X(), W = await w.parseStream(N);
  39952. B.drawings[G] = W;
  39953. }
  39954. async _processDrawingRelsEntry(N, B, G) {
  39955. const w = new m(), W = await w.parseStream(N);
  39956. B.drawingRels[G] = W;
  39957. }
  39958. async _processVmlDrawingEntry(N, B, G) {
  39959. const w = new z(), W = await w.parseStream(N);
  39960. B.vmlDrawings[`../drawings/${G}.vml`] = W;
  39961. }
  39962. async _processThemeEntry(N, B, G) {
  39963. await new Promise((w, W) => {
  39964. const y = new d();
  39965. N.on("error", W), y.on("error", W), y.on("finish", () => {
  39966. B.themes[G] = y.read().toString(), w();
  39967. }), N.pipe(y);
  39968. });
  39969. }
  39970. createInputStream() {
  39971. throw new Error("`XLSX#createInputStream` is deprecated. You should use `XLSX#read` instead. This method will be removed in version 5.0. Please follow upgrade instruction: https://github.com/exceljs/exceljs/blob/master/UPGRADE-4.0.md");
  39972. }
  39973. async read(N, B) {
  39974. !N[Symbol.asyncIterator] && N.pipe && (N = N.pipe(new n()));
  39975. const G = [];
  39976. for await (const w of N) G.push(w);
  39977. return this.load(A.concat(G), B);
  39978. }
  39979. async load(N, B) {
  39980. let G;
  39981. G = B && B.base64 ? A.from(N.toString(), "base64") : N;
  39982. const w = { worksheets: [], worksheetHash: {}, worksheetRels: [], themes: {}, media: [], mediaIndex: {}, drawings: {}, drawingRels: {}, comments: {}, tables: {}, vmlDrawings: {} }, W = await l.loadAsync(G);
  39983. for (const y of Object.values(W.files)) if (!y.dir) {
  39984. let f, D = y.name;
  39985. if (D[0] === "/" && (D = D.substr(1)), D.match(/xl\/media\//) || D.match(/xl\/theme\/([a-zA-Z0-9]+)[.]xml/)) f = new n(), f.write(await y.async("nodebuffer"));
  39986. else {
  39987. let F;
  39988. f = new n({ writableObjectMode: !0, readableObjectMode: !0 }), F = e.browser ? r(await y.async("nodebuffer")) : await y.async("string");
  39989. const T = 16384;
  39990. for (let Q = 0; Q < F.length; Q += T) f.write(F.substring(Q, Q + T));
  39991. }
  39992. switch (f.end(), D) {
  39993. case "_rels/.rels":
  39994. w.globalRels = await this.parseRels(f);
  39995. break;
  39996. case "xl/workbook.xml": {
  39997. const F = await this.parseWorkbook(f);
  39998. w.sheets = F.sheets, w.definedNames = F.definedNames, w.views = F.views, w.properties = F.properties, w.calcProperties = F.calcProperties;
  39999. break;
  40000. }
  40001. case "xl/_rels/workbook.xml.rels":
  40002. w.workbookRels = await this.parseRels(f);
  40003. break;
  40004. case "xl/sharedStrings.xml":
  40005. w.sharedStrings = new u(), await w.sharedStrings.parseStream(f);
  40006. break;
  40007. case "xl/styles.xml":
  40008. w.styles = new h(), await w.styles.parseStream(f);
  40009. break;
  40010. case "docProps/app.xml": {
  40011. const F = new p(), T = await F.parseStream(f);
  40012. w.company = T.company, w.manager = T.manager;
  40013. break;
  40014. }
  40015. case "docProps/core.xml": {
  40016. const F = new b(), T = await F.parseStream(f);
  40017. Object.assign(w, T);
  40018. break;
  40019. }
  40020. default: {
  40021. let F = D.match(/xl\/worksheets\/sheet(\d+)[.]xml/);
  40022. if (F) {
  40023. await this._processWorksheetEntry(f, w, F[1], B, D);
  40024. break;
  40025. }
  40026. if (F = D.match(/xl\/worksheets\/_rels\/sheet(\d+)[.]xml.rels/), F) {
  40027. await this._processWorksheetRelsEntry(f, w, F[1]);
  40028. break;
  40029. }
  40030. if (F = D.match(/xl\/theme\/([a-zA-Z0-9]+)[.]xml/), F) {
  40031. await this._processThemeEntry(f, w, F[1]);
  40032. break;
  40033. }
  40034. if (F = D.match(/xl\/media\/([a-zA-Z0-9]+[.][a-zA-Z0-9]{3,4})$/), F) {
  40035. await this._processMediaEntry(f, w, F[1]);
  40036. break;
  40037. }
  40038. if (F = D.match(/xl\/drawings\/([a-zA-Z0-9]+)[.]xml/), F) {
  40039. await this._processDrawingEntry(f, w, F[1]);
  40040. break;
  40041. }
  40042. if (F = D.match(/xl\/(comments\d+)[.]xml/), F) {
  40043. await this._processCommentEntry(f, w, F[1]);
  40044. break;
  40045. }
  40046. if (F = D.match(/xl\/tables\/(table\d+)[.]xml/), F) {
  40047. await this._processTableEntry(f, w, F[1]);
  40048. break;
  40049. }
  40050. if (F = D.match(/xl\/drawings\/_rels\/([a-zA-Z0-9]+)[.]xml[.]rels/), F) {
  40051. await this._processDrawingRelsEntry(f, w, F[1]);
  40052. break;
  40053. }
  40054. if (F = D.match(/xl\/drawings\/(vmlDrawing\d+)[.]vml/), F) {
  40055. await this._processVmlDrawingEntry(f, w, F[1]);
  40056. break;
  40057. }
  40058. }
  40059. }
  40060. }
  40061. return this.reconcile(w, B), this.workbook.model = w, this.workbook;
  40062. }
  40063. async addMedia(N, B) {
  40064. await Promise.all(B.media.map(async (G) => {
  40065. if (G.type === "image") {
  40066. const w = `xl/media/${G.name}.${G.extension}`;
  40067. if (G.filename) {
  40068. const W = await function(y, f) {
  40069. return new Promise((D, F) => {
  40070. s.readFile(y, f, (T, Q) => {
  40071. T ? F(T) : D(Q);
  40072. });
  40073. });
  40074. }(G.filename);
  40075. return N.append(W, { name: w });
  40076. }
  40077. if (G.buffer) return N.append(G.buffer, { name: w });
  40078. if (G.base64) {
  40079. const W = G.base64, y = W.substring(W.indexOf(",") + 1);
  40080. return N.append(y, { name: w, base64: !0 });
  40081. }
  40082. }
  40083. throw new Error("Unsupported media");
  40084. }));
  40085. }
  40086. addDrawings(N, B) {
  40087. const G = new X(), w = new m();
  40088. B.worksheets.forEach((W) => {
  40089. const { drawing: y } = W;
  40090. if (y) {
  40091. G.prepare(y, {});
  40092. let f = G.toXml(y);
  40093. N.append(f, { name: `xl/drawings/${y.name}.xml` }), f = w.toXml(y.rels), N.append(f, { name: `xl/drawings/_rels/${y.name}.xml.rels` });
  40094. }
  40095. });
  40096. }
  40097. addTables(N, B) {
  40098. const G = new H();
  40099. B.worksheets.forEach((w) => {
  40100. const { tables: W } = w;
  40101. W.forEach((y) => {
  40102. G.prepare(y, {});
  40103. const f = G.toXml(y);
  40104. N.append(f, { name: "xl/tables/" + y.target });
  40105. });
  40106. });
  40107. }
  40108. async addContentTypes(N, B) {
  40109. const G = new Z().toXml(B);
  40110. N.append(G, { name: "[Content_Types].xml" });
  40111. }
  40112. async addApp(N, B) {
  40113. const G = new p().toXml(B);
  40114. N.append(G, { name: "docProps/app.xml" });
  40115. }
  40116. async addCore(N, B) {
  40117. const G = new b();
  40118. N.append(G.toXml(B), { name: "docProps/core.xml" });
  40119. }
  40120. async addThemes(N, B) {
  40121. const G = B.themes || { theme1: v };
  40122. Object.keys(G).forEach((w) => {
  40123. const W = G[w], y = `xl/theme/${w}.xml`;
  40124. N.append(W, { name: y });
  40125. });
  40126. }
  40127. async addOfficeRels(N) {
  40128. const B = new m().toXml([{ Id: "rId1", Type: K.RelType.OfficeDocument, Target: "xl/workbook.xml" }, { Id: "rId2", Type: K.RelType.CoreProperties, Target: "docProps/core.xml" }, { Id: "rId3", Type: K.RelType.ExtenderProperties, Target: "docProps/app.xml" }]);
  40129. N.append(B, { name: "_rels/.rels" });
  40130. }
  40131. async addWorkbookRels(N, B) {
  40132. let G = 1;
  40133. const w = [{ Id: "rId" + G++, Type: K.RelType.Styles, Target: "styles.xml" }, { Id: "rId" + G++, Type: K.RelType.Theme, Target: "theme/theme1.xml" }];
  40134. B.sharedStrings.count && w.push({ Id: "rId" + G++, Type: K.RelType.SharedStrings, Target: "sharedStrings.xml" }), B.worksheets.forEach((y) => {
  40135. y.rId = "rId" + G++, w.push({ Id: y.rId, Type: K.RelType.Worksheet, Target: `worksheets/sheet${y.id}.xml` });
  40136. });
  40137. const W = new m().toXml(w);
  40138. N.append(W, { name: "xl/_rels/workbook.xml.rels" });
  40139. }
  40140. async addSharedStrings(N, B) {
  40141. B.sharedStrings && B.sharedStrings.count && N.append(B.sharedStrings.xml, { name: "xl/sharedStrings.xml" });
  40142. }
  40143. async addStyles(N, B) {
  40144. const { xml: G } = B.styles;
  40145. G && N.append(G, { name: "xl/styles.xml" });
  40146. }
  40147. async addWorkbook(N, B) {
  40148. const G = new Y();
  40149. N.append(G.toXml(B), { name: "xl/workbook.xml" });
  40150. }
  40151. async addWorksheets(N, B) {
  40152. const G = new R(), w = new m(), W = new S(), y = new z();
  40153. B.worksheets.forEach((f) => {
  40154. let D = new c();
  40155. G.render(D, f), N.append(D.xml, { name: `xl/worksheets/sheet${f.id}.xml` }), f.rels && f.rels.length && (D = new c(), w.render(D, f.rels), N.append(D.xml, { name: `xl/worksheets/_rels/sheet${f.id}.xml.rels` })), f.comments.length > 0 && (D = new c(), W.render(D, f), N.append(D.xml, { name: `xl/comments${f.id}.xml` }), D = new c(), y.render(D, f), N.append(D.xml, { name: `xl/drawings/vmlDrawing${f.id}.vml` }));
  40156. });
  40157. }
  40158. _finalize(N) {
  40159. return new Promise((B, G) => {
  40160. N.on("finish", () => {
  40161. B(this);
  40162. }), N.on("error", G), N.finalize();
  40163. });
  40164. }
  40165. prepareModel(N, B) {
  40166. N.creator = N.creator || "ExcelJS", N.lastModifiedBy = N.lastModifiedBy || "ExcelJS", N.created = N.created || /* @__PURE__ */ new Date(), N.modified = N.modified || /* @__PURE__ */ new Date(), N.useSharedStrings = B.useSharedStrings === void 0 || B.useSharedStrings, N.useStyles = B.useStyles === void 0 || B.useStyles, N.sharedStrings = new u(), N.styles = N.useStyles ? new h(!0) : new h.Mock();
  40167. const G = new Y(), w = new R();
  40168. G.prepare(N);
  40169. const W = { sharedStrings: N.sharedStrings, styles: N.styles, date1904: N.properties.date1904, drawingsCount: 0, media: N.media };
  40170. W.drawings = N.drawings = [], W.commentRefs = N.commentRefs = [];
  40171. let y = 0;
  40172. N.tables = [], N.worksheets.forEach((f) => {
  40173. f.tables.forEach((D) => {
  40174. y++, D.target = `table${y}.xml`, D.id = y, N.tables.push(D);
  40175. }), w.prepare(f, W);
  40176. });
  40177. }
  40178. async write(N, B) {
  40179. B = B || {};
  40180. const { model: G } = this.workbook, w = new a.ZipWriter(B.zip);
  40181. return w.pipe(N), this.prepareModel(G, B), await this.addContentTypes(w, G), await this.addOfficeRels(w, G), await this.addWorkbookRels(w, G), await this.addWorksheets(w, G), await this.addSharedStrings(w, G), await this.addDrawings(w, G), await this.addTables(w, G), await Promise.all([this.addThemes(w, G), this.addStyles(w, G)]), await this.addMedia(w, G), await Promise.all([this.addApp(w, G), this.addCore(w, G)]), await this.addWorkbook(w, G), this._finalize(w);
  40182. }
  40183. writeFile(N, B) {
  40184. const G = s.createWriteStream(N);
  40185. return new Promise((w, W) => {
  40186. G.on("finish", () => {
  40187. w();
  40188. }), G.on("error", (y) => {
  40189. W(y);
  40190. }), this.write(G, B).then(() => {
  40191. G.end();
  40192. }).catch((y) => {
  40193. W(y);
  40194. });
  40195. });
  40196. }
  40197. async writeBuffer(N) {
  40198. const B = new d();
  40199. return await this.write(B, N), B.read();
  40200. }
  40201. }
  40202. K.RelType = g("./rel-type"), C.exports = K;
  40203. }).call(this);
  40204. }).call(this, g("_process"), g("buffer").Buffer);
  40205. }, { "../utils/browser-buffer-decode": 16, "../utils/stream-buf": 24, "../utils/utils": 27, "../utils/xml-stream": 28, "../utils/zip-stream": 29, "./rel-type": 31, "./xform/book/workbook-xform": 38, "./xform/comment/comments-xform": 40, "./xform/comment/vml-notes-xform": 45, "./xform/core/app-xform": 51, "./xform/core/content-types-xform": 52, "./xform/core/core-xform": 53, "./xform/core/relationships-xform": 55, "./xform/drawing/drawing-xform": 62, "./xform/sheet/worksheet-xform": 115, "./xform/strings/shared-strings-xform": 124, "./xform/style/styles-xform": 135, "./xform/table/table-xform": 143, "./xml/theme1": 145, _process: 467, buffer: 220, fs: 216, jszip: 441, "readable-stream": 491 }], 145: [function(g, C, i) {
  40206. C.exports = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  40207. <a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"> <a:themeElements> <a:clrScheme name="Office"> <a:dk1> <a:sysClr val="windowText" lastClr="000000"/> </a:dk1> <a:lt1> <a:sysClr val="window" lastClr="FFFFFF"/> </a:lt1> <a:dk2> <a:srgbClr val="1F497D"/> </a:dk2> <a:lt2> <a:srgbClr val="EEECE1"/> </a:lt2> <a:accent1> <a:srgbClr val="4F81BD"/> </a:accent1> <a:accent2> <a:srgbClr val="C0504D"/> </a:accent2> <a:accent3> <a:srgbClr val="9BBB59"/> </a:accent3> <a:accent4> <a:srgbClr val="8064A2"/> </a:accent4> <a:accent5> <a:srgbClr val="4BACC6"/> </a:accent5> <a:accent6> <a:srgbClr val="F79646"/> </a:accent6> <a:hlink> <a:srgbClr val="0000FF"/> </a:hlink> <a:folHlink> <a:srgbClr val="800080"/> </a:folHlink> </a:clrScheme> <a:fontScheme name="Office"> <a:majorFont> <a:latin typeface="Cambria"/> <a:ea typeface=""/> <a:cs typeface=""/> <a:font script="Jpan" typeface="MS Pゴシック"/> <a:font script="Hang" typeface="맑은 고딕"/> <a:font script="Hans" typeface="宋体"/> <a:font script="Hant" typeface="新細明體"/> <a:font script="Arab" typeface="Times New Roman"/> <a:font script="Hebr" typeface="Times New Roman"/> <a:font script="Thai" typeface="Tahoma"/> <a:font script="Ethi" typeface="Nyala"/> <a:font script="Beng" typeface="Vrinda"/> <a:font script="Gujr" typeface="Shruti"/> <a:font script="Khmr" typeface="MoolBoran"/> <a:font script="Knda" typeface="Tunga"/> <a:font script="Guru" typeface="Raavi"/> <a:font script="Cans" typeface="Euphemia"/> <a:font script="Cher" typeface="Plantagenet Cherokee"/> <a:font script="Yiii" typeface="Microsoft Yi Baiti"/> <a:font script="Tibt" typeface="Microsoft Himalaya"/> <a:font script="Thaa" typeface="MV Boli"/> <a:font script="Deva" typeface="Mangal"/> <a:font script="Telu" typeface="Gautami"/> <a:font script="Taml" typeface="Latha"/> <a:font script="Syrc" typeface="Estrangelo Edessa"/> <a:font script="Orya" typeface="Kalinga"/> <a:font script="Mlym" typeface="Kartika"/> <a:font script="Laoo" typeface="DokChampa"/> <a:font script="Sinh" typeface="Iskoola Pota"/> <a:font script="Mong" typeface="Mongolian Baiti"/> <a:font script="Viet" typeface="Times New Roman"/> <a:font script="Uigh" typeface="Microsoft Uighur"/> <a:font script="Geor" typeface="Sylfaen"/> </a:majorFont> <a:minorFont> <a:latin typeface="Calibri"/> <a:ea typeface=""/> <a:cs typeface=""/> <a:font script="Jpan" typeface="MS Pゴシック"/> <a:font script="Hang" typeface="맑은 고딕"/> <a:font script="Hans" typeface="宋体"/> <a:font script="Hant" typeface="新細明體"/> <a:font script="Arab" typeface="Arial"/> <a:font script="Hebr" typeface="Arial"/> <a:font script="Thai" typeface="Tahoma"/> <a:font script="Ethi" typeface="Nyala"/> <a:font script="Beng" typeface="Vrinda"/> <a:font script="Gujr" typeface="Shruti"/> <a:font script="Khmr" typeface="DaunPenh"/> <a:font script="Knda" typeface="Tunga"/> <a:font script="Guru" typeface="Raavi"/> <a:font script="Cans" typeface="Euphemia"/> <a:font script="Cher" typeface="Plantagenet Cherokee"/> <a:font script="Yiii" typeface="Microsoft Yi Baiti"/> <a:font script="Tibt" typeface="Microsoft Himalaya"/> <a:font script="Thaa" typeface="MV Boli"/> <a:font script="Deva" typeface="Mangal"/> <a:font script="Telu" typeface="Gautami"/> <a:font script="Taml" typeface="Latha"/> <a:font script="Syrc" typeface="Estrangelo Edessa"/> <a:font script="Orya" typeface="Kalinga"/> <a:font script="Mlym" typeface="Kartika"/> <a:font script="Laoo" typeface="DokChampa"/> <a:font script="Sinh" typeface="Iskoola Pota"/> <a:font script="Mong" typeface="Mongolian Baiti"/> <a:font script="Viet" typeface="Arial"/> <a:font script="Uigh" typeface="Microsoft Uighur"/> <a:font script="Geor" typeface="Sylfaen"/> </a:minorFont> </a:fontScheme> <a:fmtScheme name="Office"> <a:fillStyleLst> <a:solidFill> <a:schemeClr val="phClr"/> </a:solidFill> <a:gradFill rotWithShape="1"> <a:gsLst> <a:gs pos="0"> <a:schemeClr val="phClr"> <a:tint val="50000"/> <a:satMod val="300000"/> </a:schemeClr> </a:gs> <a:gs pos="35000"> <a:schemeClr val="phClr"> <a:tint val="37000"/> <a:satMod val="300000"/> </a:schemeClr> </a:gs> <a:gs pos="100000"> <a:schemeClr val="phClr"> <a:tint val="15000"/> <a:satMod val="350000"/> </a:schemeClr> </a:gs> </a:gsLst> <a:lin ang="16200000" scaled="1"/> </a:gradFill> <a:gradFill rotWithShape="1"> <a:gsLst> <a:gs pos="0"> <a:schemeClr val="phClr"> <a:tint val="100000"/> <a:shade val="100000"/> <a:satMod val="130000"/> </a:schemeClr> </a:gs> <a:gs pos="100000"> <a:schemeClr val="phClr"> <a:tint val="50000"/> <a:shade val="100000"/> <a:satMod val="350000"/> </a:schemeClr> </a:gs> </a:gsLst> <a:lin ang="16200000" scaled="0"/> </a:gradFill> </a:fillStyleLst> <a:lnStyleLst> <a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"> <a:solidFill> <a:schemeClr val="phClr"> <a:shade val="95000"/> <a:satMod val="105000"/> </a:schemeClr> </a:solidFill> <a:prstDash val="solid"/> </a:ln> <a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"> <a:solidFill> <a:schemeClr val="phClr"/> </a:solidFill> <a:prstDash val="solid"/> </a:ln> <a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"> <a:solidFill> <a:schemeClr val="phClr"/> </a:solidFill> <a:prstDash val="solid"/> </a:ln> </a:lnStyleLst> <a:effectStyleLst> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"> <a:srgbClr val="000000"> <a:alpha val="38000"/> </a:srgbClr> </a:outerShdw> </a:effectLst> </a:effectStyle> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"> <a:srgbClr val="000000"> <a:alpha val="35000"/> </a:srgbClr> </a:outerShdw> </a:effectLst> </a:effectStyle> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"> <a:srgbClr val="000000"> <a:alpha val="35000"/> </a:srgbClr> </a:outerShdw> </a:effectLst> <a:scene3d> <a:camera prst="orthographicFront"> <a:rot lat="0" lon="0" rev="0"/> </a:camera> <a:lightRig rig="threePt" dir="t"> <a:rot lat="0" lon="0" rev="1200000"/> </a:lightRig> </a:scene3d> <a:sp3d> <a:bevelT w="63500" h="25400"/> </a:sp3d> </a:effectStyle> </a:effectStyleLst> <a:bgFillStyleLst> <a:solidFill> <a:schemeClr val="phClr"/> </a:solidFill> <a:gradFill rotWithShape="1"> <a:gsLst> <a:gs pos="0"> <a:schemeClr val="phClr"> <a:tint val="40000"/> <a:satMod val="350000"/> </a:schemeClr> </a:gs> <a:gs pos="40000"> <a:schemeClr val="phClr"> <a:tint val="45000"/> <a:shade val="99000"/> <a:satMod val="350000"/> </a:schemeClr> </a:gs> <a:gs pos="100000"> <a:schemeClr val="phClr"> <a:shade val="20000"/> <a:satMod val="255000"/> </a:schemeClr> </a:gs> </a:gsLst> <a:path path="circle"> <a:fillToRect l="50000" t="-80000" r="50000" b="180000"/> </a:path> </a:gradFill> <a:gradFill rotWithShape="1"> <a:gsLst> <a:gs pos="0"> <a:schemeClr val="phClr"> <a:tint val="80000"/> <a:satMod val="300000"/> </a:schemeClr> </a:gs> <a:gs pos="100000"> <a:schemeClr val="phClr"> <a:shade val="30000"/> <a:satMod val="200000"/> </a:schemeClr> </a:gs> </a:gsLst> <a:path path="circle"> <a:fillToRect l="50000" t="50000" r="50000" b="50000"/> </a:path> </a:gradFill> </a:bgFillStyleLst> </a:fmtScheme> </a:themeElements> <a:objectDefaults> <a:spDef> <a:spPr/> <a:bodyPr/> <a:lstStyle/> <a:style> <a:lnRef idx="1"> <a:schemeClr val="accent1"/> </a:lnRef> <a:fillRef idx="3"> <a:schemeClr val="accent1"/> </a:fillRef> <a:effectRef idx="2"> <a:schemeClr val="accent1"/> </a:effectRef> <a:fontRef idx="minor"> <a:schemeClr val="lt1"/> </a:fontRef> </a:style> </a:spDef> <a:lnDef> <a:spPr/> <a:bodyPr/> <a:lstStyle/> <a:style> <a:lnRef idx="2"> <a:schemeClr val="accent1"/> </a:lnRef> <a:fillRef idx="0"> <a:schemeClr val="accent1"/> </a:fillRef> <a:effectRef idx="1"> <a:schemeClr val="accent1"/> </a:effectRef> <a:fontRef idx="minor"> <a:schemeClr val="tx1"/> </a:fontRef> </a:style> </a:lnDef> </a:objectDefaults> <a:extraClrSchemeLst/> </a:theme>`;
  40208. }, {}], 146: [function(g, C, i) {
  40209. (function(e) {
  40210. (function() {
  40211. Object.defineProperty(i, "__esModule", { value: !0 }), i.CsvFormatterStream = void 0;
  40212. const A = g("stream"), s = g("./formatter");
  40213. class l extends A.Transform {
  40214. constructor(a) {
  40215. super({ writableObjectMode: a.objectMode }), this.hasWrittenBOM = !1, this.formatterOptions = a, this.rowFormatter = new s.RowFormatter(a), this.hasWrittenBOM = !a.writeBOM;
  40216. }
  40217. transform(a) {
  40218. return this.rowFormatter.rowTransform = a, this;
  40219. }
  40220. _transform(a, d, o) {
  40221. let c = !1;
  40222. try {
  40223. this.hasWrittenBOM || (this.push(this.formatterOptions.BOM), this.hasWrittenBOM = !0), this.rowFormatter.format(a, (r, h) => r ? (c = !0, o(r)) : (h && h.forEach((b) => {
  40224. this.push(e.from(b, "utf8"));
  40225. }), c = !0, o()));
  40226. } catch (r) {
  40227. if (c) throw r;
  40228. o(r);
  40229. }
  40230. }
  40231. _flush(a) {
  40232. this.rowFormatter.finish((d, o) => d ? a(d) : (o && o.forEach((c) => {
  40233. this.push(e.from(c, "utf8"));
  40234. }), a()));
  40235. }
  40236. }
  40237. i.CsvFormatterStream = l;
  40238. }).call(this);
  40239. }).call(this, g("buffer").Buffer);
  40240. }, { "./formatter": 150, buffer: 220, stream: 505 }], 147: [function(g, C, i) {
  40241. Object.defineProperty(i, "__esModule", { value: !0 }), i.FormatterOptions = void 0, i.FormatterOptions = class {
  40242. constructor() {
  40243. let e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
  40244. var A;
  40245. this.objectMode = !0, this.delimiter = ",", this.rowDelimiter = `
  40246. `, this.quote = '"', this.escape = this.quote, this.quoteColumns = !1, this.quoteHeaders = this.quoteColumns, this.headers = null, this.includeEndRowDelimiter = !1, this.writeBOM = !1, this.BOM = "\uFEFF", this.alwaysWriteHeaders = !1, Object.assign(this, e || {}), (e == null ? void 0 : e.quoteHeaders) === void 0 && (this.quoteHeaders = this.quoteColumns), (e == null ? void 0 : e.quote) === !0 ? this.quote = '"' : (e == null ? void 0 : e.quote) === !1 && (this.quote = ""), typeof (e == null ? void 0 : e.escape) != "string" && (this.escape = this.quote), this.shouldWriteHeaders = !!this.headers && ((A = e.writeHeaders) === null || A === void 0 || A), this.headers = Array.isArray(this.headers) ? this.headers : null, this.escapedQuote = `${this.escape}${this.quote}`;
  40247. }
  40248. };
  40249. }, {}], 148: [function(g, C, i) {
  40250. var e = function(n) {
  40251. return n && n.__esModule ? n : { default: n };
  40252. };
  40253. Object.defineProperty(i, "__esModule", { value: !0 }), i.FieldFormatter = void 0;
  40254. const A = e(g("lodash.isboolean")), s = e(g("lodash.isnil")), l = e(g("lodash.escaperegexp"));
  40255. i.FieldFormatter = class {
  40256. constructor(n) {
  40257. this._headers = null, this.formatterOptions = n, n.headers !== null && (this.headers = n.headers), this.REPLACE_REGEXP = new RegExp(n.quote, "g");
  40258. const a = `[${n.delimiter}${l.default(n.rowDelimiter)}|\r|
  40259. ]`;
  40260. this.ESCAPE_REGEXP = new RegExp(a);
  40261. }
  40262. set headers(n) {
  40263. this._headers = n;
  40264. }
  40265. shouldQuote(n, a) {
  40266. const d = a ? this.formatterOptions.quoteHeaders : this.formatterOptions.quoteColumns;
  40267. return A.default(d) ? d : Array.isArray(d) ? d[n] : this._headers !== null && d[this._headers[n]];
  40268. }
  40269. format(n, a, d) {
  40270. const o = ("" + (s.default(n) ? "" : n)).replace(/\0/g, ""), { formatterOptions: c } = this;
  40271. return c.quote !== "" && o.indexOf(c.quote) !== -1 ? this.quoteField(o.replace(this.REPLACE_REGEXP, c.escapedQuote)) : o.search(this.ESCAPE_REGEXP) !== -1 || this.shouldQuote(a, d) ? this.quoteField(o) : o;
  40272. }
  40273. quoteField(n) {
  40274. const { quote: a } = this.formatterOptions;
  40275. return `${a}${n}${a}`;
  40276. }
  40277. };
  40278. }, { "lodash.escaperegexp": 442, "lodash.isboolean": 444, "lodash.isnil": 447 }], 149: [function(g, C, i) {
  40279. var e = function(d) {
  40280. return d && d.__esModule ? d : { default: d };
  40281. };
  40282. Object.defineProperty(i, "__esModule", { value: !0 }), i.RowFormatter = void 0;
  40283. const A = e(g("lodash.isfunction")), s = e(g("lodash.isequal")), l = g("./FieldFormatter"), n = g("../types");
  40284. class a {
  40285. constructor(o) {
  40286. this.rowCount = 0, this.formatterOptions = o, this.fieldFormatter = new l.FieldFormatter(o), this.headers = o.headers, this.shouldWriteHeaders = o.shouldWriteHeaders, this.hasWrittenHeaders = !1, this.headers !== null && (this.fieldFormatter.headers = this.headers), o.transform && (this.rowTransform = o.transform);
  40287. }
  40288. static isRowHashArray(o) {
  40289. return !!Array.isArray(o) && Array.isArray(o[0]) && o[0].length === 2;
  40290. }
  40291. static isRowArray(o) {
  40292. return Array.isArray(o) && !this.isRowHashArray(o);
  40293. }
  40294. static gatherHeaders(o) {
  40295. return a.isRowHashArray(o) ? o.map((c) => c[0]) : Array.isArray(o) ? o : Object.keys(o);
  40296. }
  40297. static createTransform(o) {
  40298. return n.isSyncTransform(o) ? (c, r) => {
  40299. let h = null;
  40300. try {
  40301. h = o(c);
  40302. } catch (b) {
  40303. return r(b);
  40304. }
  40305. return r(null, h);
  40306. } : (c, r) => {
  40307. o(c, r);
  40308. };
  40309. }
  40310. set rowTransform(o) {
  40311. if (!A.default(o)) throw new TypeError("The transform should be a function");
  40312. this._rowTransform = a.createTransform(o);
  40313. }
  40314. format(o, c) {
  40315. this.callTransformer(o, (r, h) => {
  40316. if (r) return c(r);
  40317. if (!o) return c(null);
  40318. const b = [];
  40319. if (h) {
  40320. const { shouldFormatColumns: u, headers: m } = this.checkHeaders(h);
  40321. if (this.shouldWriteHeaders && m && !this.hasWrittenHeaders && (b.push(this.formatColumns(m, !0)), this.hasWrittenHeaders = !0), u) {
  40322. const Z = this.gatherColumns(h);
  40323. b.push(this.formatColumns(Z, !1));
  40324. }
  40325. }
  40326. return c(null, b);
  40327. });
  40328. }
  40329. finish(o) {
  40330. const c = [];
  40331. if (this.formatterOptions.alwaysWriteHeaders && this.rowCount === 0) {
  40332. if (!this.headers) return o(new Error("`alwaysWriteHeaders` option is set to true but `headers` option not provided."));
  40333. c.push(this.formatColumns(this.headers, !0));
  40334. }
  40335. return this.formatterOptions.includeEndRowDelimiter && c.push(this.formatterOptions.rowDelimiter), o(null, c);
  40336. }
  40337. checkHeaders(o) {
  40338. if (this.headers) return { shouldFormatColumns: !0, headers: this.headers };
  40339. const c = a.gatherHeaders(o);
  40340. return this.headers = c, this.fieldFormatter.headers = c, this.shouldWriteHeaders ? { shouldFormatColumns: !s.default(c, o), headers: c } : { shouldFormatColumns: !0, headers: null };
  40341. }
  40342. gatherColumns(o) {
  40343. if (this.headers === null) throw new Error("Headers is currently null");
  40344. return Array.isArray(o) ? a.isRowHashArray(o) ? this.headers.map((c, r) => {
  40345. const h = o[r];
  40346. return h ? h[1] : "";
  40347. }) : a.isRowArray(o) && !this.shouldWriteHeaders ? o : this.headers.map((c, r) => o[r]) : this.headers.map((c) => o[c]);
  40348. }
  40349. callTransformer(o, c) {
  40350. return this._rowTransform ? this._rowTransform(o, c) : c(null, o);
  40351. }
  40352. formatColumns(o, c) {
  40353. const r = o.map((b, u) => this.fieldFormatter.format(b, u, c)).join(this.formatterOptions.delimiter), { rowCount: h } = this;
  40354. return this.rowCount += 1, h ? [this.formatterOptions.rowDelimiter, r].join("") : r;
  40355. }
  40356. }
  40357. i.RowFormatter = a;
  40358. }, { "../types": 152, "./FieldFormatter": 148, "lodash.isequal": 445, "lodash.isfunction": 446 }], 150: [function(g, C, i) {
  40359. Object.defineProperty(i, "__esModule", { value: !0 }), i.FieldFormatter = i.RowFormatter = void 0;
  40360. var e = g("./RowFormatter");
  40361. Object.defineProperty(i, "RowFormatter", { enumerable: !0, get: function() {
  40362. return e.RowFormatter;
  40363. } });
  40364. var A = g("./FieldFormatter");
  40365. Object.defineProperty(i, "FieldFormatter", { enumerable: !0, get: function() {
  40366. return A.FieldFormatter;
  40367. } });
  40368. }, { "./FieldFormatter": 148, "./RowFormatter": 149 }], 151: [function(g, C, i) {
  40369. (function(e) {
  40370. (function() {
  40371. var A = Object.create ? function(u, m, Z, p) {
  40372. p === void 0 && (p = Z), Object.defineProperty(u, p, { enumerable: !0, get: function() {
  40373. return m[Z];
  40374. } });
  40375. } : function(u, m, Z, p) {
  40376. p === void 0 && (p = Z), u[p] = m[Z];
  40377. }, s = Object.create ? function(u, m) {
  40378. Object.defineProperty(u, "default", { enumerable: !0, value: m });
  40379. } : function(u, m) {
  40380. u.default = m;
  40381. }, l = function(u) {
  40382. if (u && u.__esModule) return u;
  40383. var m = {};
  40384. if (u != null) for (var Z in u) Z !== "default" && Object.prototype.hasOwnProperty.call(u, Z) && A(m, u, Z);
  40385. return s(m, u), m;
  40386. }, n = function(u, m) {
  40387. for (var Z in u) Z === "default" || Object.prototype.hasOwnProperty.call(m, Z) || A(m, u, Z);
  40388. };
  40389. Object.defineProperty(i, "__esModule", { value: !0 }), i.writeToPath = i.writeToString = i.writeToBuffer = i.writeToStream = i.write = i.format = i.FormatterOptions = i.CsvFormatterStream = void 0;
  40390. const a = g("util"), d = g("stream"), o = l(g("fs")), c = g("./FormatterOptions"), r = g("./CsvFormatterStream");
  40391. n(g("./types"), i);
  40392. var h = g("./CsvFormatterStream");
  40393. Object.defineProperty(i, "CsvFormatterStream", { enumerable: !0, get: function() {
  40394. return h.CsvFormatterStream;
  40395. } });
  40396. var b = g("./FormatterOptions");
  40397. Object.defineProperty(i, "FormatterOptions", { enumerable: !0, get: function() {
  40398. return b.FormatterOptions;
  40399. } }), i.format = (u) => new r.CsvFormatterStream(new c.FormatterOptions(u)), i.write = (u, m) => {
  40400. const Z = i.format(m), p = a.promisify((Y, R) => {
  40401. Z.write(Y, void 0, R);
  40402. });
  40403. return u.reduce((Y, R) => Y.then(() => p(R)), Promise.resolve()).then(() => Z.end()).catch((Y) => {
  40404. Z.emit("error", Y);
  40405. }), Z;
  40406. }, i.writeToStream = (u, m, Z) => i.write(m, Z).pipe(u), i.writeToBuffer = function(u) {
  40407. let m = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
  40408. const Z = [], p = new d.Writable({ write(Y, R, X) {
  40409. Z.push(Y), X();
  40410. } });
  40411. return new Promise((Y, R) => {
  40412. p.on("error", R).on("finish", () => Y(e.concat(Z))), i.write(u, m).pipe(p);
  40413. });
  40414. }, i.writeToString = (u, m) => i.writeToBuffer(u, m).then((Z) => Z.toString()), i.writeToPath = (u, m, Z) => {
  40415. const p = o.createWriteStream(u, { encoding: "utf8" });
  40416. return i.write(m, Z).pipe(p);
  40417. };
  40418. }).call(this);
  40419. }).call(this, g("buffer").Buffer);
  40420. }, { "./CsvFormatterStream": 146, "./FormatterOptions": 147, "./types": 152, buffer: 220, fs: 216, stream: 505, util: 527 }], 152: [function(g, C, i) {
  40421. Object.defineProperty(i, "__esModule", { value: !0 }), i.isSyncTransform = void 0, i.isSyncTransform = (e) => e.length === 1;
  40422. }, {}], 153: [function(g, C, i) {
  40423. (function(e) {
  40424. (function() {
  40425. Object.defineProperty(i, "__esModule", { value: !0 }), i.CsvParserStream = void 0;
  40426. const A = g("string_decoder"), s = g("stream"), l = g("./transforms"), n = g("./parser");
  40427. class a extends s.Transform {
  40428. constructor(o) {
  40429. super({ objectMode: o.objectMode }), this.lines = "", this.rowCount = 0, this.parsedRowCount = 0, this.parsedLineCount = 0, this.endEmitted = !1, this.headersEmitted = !1, this.parserOptions = o, this.parser = new n.Parser(o), this.headerTransformer = new l.HeaderTransformer(o), this.decoder = new A.StringDecoder(o.encoding), this.rowTransformerValidator = new l.RowTransformerValidator();
  40430. }
  40431. get hasHitRowLimit() {
  40432. return this.parserOptions.limitRows && this.rowCount >= this.parserOptions.maxRows;
  40433. }
  40434. get shouldEmitRows() {
  40435. return this.parsedRowCount > this.parserOptions.skipRows;
  40436. }
  40437. get shouldSkipLine() {
  40438. return this.parsedLineCount <= this.parserOptions.skipLines;
  40439. }
  40440. transform(o) {
  40441. return this.rowTransformerValidator.rowTransform = o, this;
  40442. }
  40443. validate(o) {
  40444. return this.rowTransformerValidator.rowValidator = o, this;
  40445. }
  40446. emit(o) {
  40447. if (o === "end") return this.endEmitted || (this.endEmitted = !0, super.emit("end", this.rowCount)), !1;
  40448. for (var c = arguments.length, r = new Array(c > 1 ? c - 1 : 0), h = 1; h < c; h++) r[h - 1] = arguments[h];
  40449. return super.emit(o, ...r);
  40450. }
  40451. _transform(o, c, r) {
  40452. if (this.hasHitRowLimit) return r();
  40453. const h = a.wrapDoneCallback(r);
  40454. try {
  40455. const { lines: b } = this, u = b + this.decoder.write(o), m = this.parse(u, !0);
  40456. return this.processRows(m, h);
  40457. } catch (b) {
  40458. return h(b);
  40459. }
  40460. }
  40461. _flush(o) {
  40462. const c = a.wrapDoneCallback(o);
  40463. if (this.hasHitRowLimit) return c();
  40464. try {
  40465. const r = this.lines + this.decoder.end(), h = this.parse(r, !1);
  40466. return this.processRows(h, c);
  40467. } catch (r) {
  40468. return c(r);
  40469. }
  40470. }
  40471. parse(o, c) {
  40472. if (!o) return [];
  40473. const { line: r, rows: h } = this.parser.parse(o, c);
  40474. return this.lines = r, h;
  40475. }
  40476. processRows(o, c) {
  40477. const r = o.length, h = (b) => {
  40478. const u = (p) => p ? c(p) : b % 100 != 0 ? h(b + 1) : void e(() => h(b + 1));
  40479. if (this.checkAndEmitHeaders(), b >= r || this.hasHitRowLimit) return c();
  40480. if (this.parsedLineCount += 1, this.shouldSkipLine) return u();
  40481. const m = o[b];
  40482. this.rowCount += 1, this.parsedRowCount += 1;
  40483. const Z = this.rowCount;
  40484. return this.transformRow(m, (p, Y) => {
  40485. if (p) return this.rowCount -= 1, u(p);
  40486. if (!Y) return u(new Error("expected transform result"));
  40487. if (Y.isValid) {
  40488. if (Y.row) return this.pushRow(Y.row, u);
  40489. } else this.emit("data-invalid", Y.row, Z, Y.reason);
  40490. return u();
  40491. });
  40492. };
  40493. h(0);
  40494. }
  40495. transformRow(o, c) {
  40496. try {
  40497. this.headerTransformer.transform(o, (r, h) => r ? c(r) : h ? h.isValid ? h.row ? this.shouldEmitRows ? this.rowTransformerValidator.transformAndValidate(h.row, c) : this.skipRow(c) : (this.rowCount -= 1, this.parsedRowCount -= 1, c(null, { row: null, isValid: !0 })) : this.shouldEmitRows ? c(null, { isValid: !1, row: o }) : this.skipRow(c) : c(new Error("Expected result from header transform")));
  40498. } catch (r) {
  40499. c(r);
  40500. }
  40501. }
  40502. checkAndEmitHeaders() {
  40503. !this.headersEmitted && this.headerTransformer.headers && (this.headersEmitted = !0, this.emit("headers", this.headerTransformer.headers));
  40504. }
  40505. skipRow(o) {
  40506. return this.rowCount -= 1, o(null, { row: null, isValid: !0 });
  40507. }
  40508. pushRow(o, c) {
  40509. try {
  40510. this.parserOptions.objectMode ? this.push(o) : this.push(JSON.stringify(o)), c();
  40511. } catch (r) {
  40512. c(r);
  40513. }
  40514. }
  40515. static wrapDoneCallback(o) {
  40516. let c = !1;
  40517. return function(r) {
  40518. if (r) {
  40519. if (c) throw r;
  40520. return c = !0, void o(r);
  40521. }
  40522. for (var h = arguments.length, b = new Array(h > 1 ? h - 1 : 0), u = 1; u < h; u++) b[u - 1] = arguments[u];
  40523. o(...b);
  40524. };
  40525. }
  40526. }
  40527. i.CsvParserStream = a;
  40528. }).call(this);
  40529. }).call(this, g("timers").setImmediate);
  40530. }, { "./parser": 165, "./transforms": 168, stream: 505, string_decoder: 218, timers: 523 }], 154: [function(g, C, i) {
  40531. var e = function(l) {
  40532. return l && l.__esModule ? l : { default: l };
  40533. };
  40534. Object.defineProperty(i, "__esModule", { value: !0 }), i.ParserOptions = void 0;
  40535. const A = e(g("lodash.escaperegexp")), s = e(g("lodash.isnil"));
  40536. i.ParserOptions = class {
  40537. constructor(l) {
  40538. var n;
  40539. if (this.objectMode = !0, this.delimiter = ",", this.ignoreEmpty = !1, this.quote = '"', this.escape = null, this.escapeChar = this.quote, this.comment = null, this.supportsComments = !1, this.ltrim = !1, this.rtrim = !1, this.trim = !1, this.headers = null, this.renameHeaders = !1, this.strictColumnHandling = !1, this.discardUnmappedColumns = !1, this.carriageReturn = "\r", this.encoding = "utf8", this.limitRows = !1, this.maxRows = 0, this.skipLines = 0, this.skipRows = 0, Object.assign(this, l || {}), this.delimiter.length > 1) throw new Error("delimiter option must be one character long");
  40540. this.escapedDelimiter = A.default(this.delimiter), this.escapeChar = (n = this.escape) !== null && n !== void 0 ? n : this.quote, this.supportsComments = !s.default(this.comment), this.NEXT_TOKEN_REGEXP = new RegExp(`([^\\s]|\\r\\n|\\n|\\r|${this.escapedDelimiter})`), this.maxRows > 0 && (this.limitRows = !0);
  40541. }
  40542. };
  40543. }, { "lodash.escaperegexp": 442, "lodash.isnil": 447 }], 155: [function(g, C, i) {
  40544. var e = Object.create ? function(h, b, u, m) {
  40545. m === void 0 && (m = u), Object.defineProperty(h, m, { enumerable: !0, get: function() {
  40546. return b[u];
  40547. } });
  40548. } : function(h, b, u, m) {
  40549. m === void 0 && (m = u), h[m] = b[u];
  40550. }, A = Object.create ? function(h, b) {
  40551. Object.defineProperty(h, "default", { enumerable: !0, value: b });
  40552. } : function(h, b) {
  40553. h.default = b;
  40554. }, s = function(h) {
  40555. if (h && h.__esModule) return h;
  40556. var b = {};
  40557. if (h != null) for (var u in h) u !== "default" && Object.prototype.hasOwnProperty.call(h, u) && e(b, h, u);
  40558. return A(b, h), b;
  40559. }, l = function(h, b) {
  40560. for (var u in h) u === "default" || Object.prototype.hasOwnProperty.call(b, u) || e(b, h, u);
  40561. };
  40562. Object.defineProperty(i, "__esModule", { value: !0 }), i.parseString = i.parseFile = i.parseStream = i.parse = i.ParserOptions = i.CsvParserStream = void 0;
  40563. const n = s(g("fs")), a = g("stream"), d = g("./ParserOptions"), o = g("./CsvParserStream");
  40564. l(g("./types"), i);
  40565. var c = g("./CsvParserStream");
  40566. Object.defineProperty(i, "CsvParserStream", { enumerable: !0, get: function() {
  40567. return c.CsvParserStream;
  40568. } });
  40569. var r = g("./ParserOptions");
  40570. Object.defineProperty(i, "ParserOptions", { enumerable: !0, get: function() {
  40571. return r.ParserOptions;
  40572. } }), i.parse = (h) => new o.CsvParserStream(new d.ParserOptions(h)), i.parseStream = (h, b) => h.pipe(new o.CsvParserStream(new d.ParserOptions(b))), i.parseFile = function(h) {
  40573. let b = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
  40574. return n.createReadStream(h).pipe(new o.CsvParserStream(new d.ParserOptions(b)));
  40575. }, i.parseString = (h, b) => {
  40576. const u = new a.Readable();
  40577. return u.push(h), u.push(null), u.pipe(new o.CsvParserStream(new d.ParserOptions(b)));
  40578. };
  40579. }, { "./CsvParserStream": 153, "./ParserOptions": 154, "./types": 169, fs: 216, stream: 505 }], 156: [function(g, C, i) {
  40580. Object.defineProperty(i, "__esModule", { value: !0 }), i.Parser = void 0;
  40581. const e = g("./Scanner"), A = g("./RowParser"), s = g("./Token");
  40582. class l {
  40583. constructor(a) {
  40584. this.parserOptions = a, this.rowParser = new A.RowParser(this.parserOptions);
  40585. }
  40586. static removeBOM(a) {
  40587. return a && a.charCodeAt(0) === 65279 ? a.slice(1) : a;
  40588. }
  40589. parse(a, d) {
  40590. const o = new e.Scanner({ line: l.removeBOM(a), parserOptions: this.parserOptions, hasMoreData: d });
  40591. return this.parserOptions.supportsComments ? this.parseWithComments(o) : this.parseWithoutComments(o);
  40592. }
  40593. parseWithoutComments(a) {
  40594. const d = [];
  40595. let o = !0;
  40596. for (; o; ) o = this.parseRow(a, d);
  40597. return { line: a.line, rows: d };
  40598. }
  40599. parseWithComments(a) {
  40600. const { parserOptions: d } = this, o = [];
  40601. for (let c = a.nextCharacterToken; c !== null; c = a.nextCharacterToken) if (s.Token.isTokenComment(c, d)) {
  40602. if (a.advancePastLine() === null) return { line: a.lineFromCursor, rows: o };
  40603. if (!a.hasMoreCharacters) return { line: a.lineFromCursor, rows: o };
  40604. a.truncateToCursor();
  40605. } else if (!this.parseRow(a, o)) break;
  40606. return { line: a.line, rows: o };
  40607. }
  40608. parseRow(a, d) {
  40609. if (!a.nextNonSpaceToken) return !1;
  40610. const o = this.rowParser.parse(a);
  40611. return o !== null && (this.parserOptions.ignoreEmpty && A.RowParser.isEmptyRow(o) || d.push(o), !0);
  40612. }
  40613. }
  40614. i.Parser = l;
  40615. }, { "./RowParser": 157, "./Scanner": 158, "./Token": 159 }], 157: [function(g, C, i) {
  40616. Object.defineProperty(i, "__esModule", { value: !0 }), i.RowParser = void 0;
  40617. const e = g("./column"), A = g("./Token");
  40618. i.RowParser = class {
  40619. constructor(s) {
  40620. this.parserOptions = s, this.columnParser = new e.ColumnParser(s);
  40621. }
  40622. static isEmptyRow(s) {
  40623. return s.join("").replace(/\s+/g, "") === "";
  40624. }
  40625. parse(s) {
  40626. const { parserOptions: l } = this, { hasMoreData: n } = s, a = s, d = [];
  40627. let o = this.getStartToken(a, d);
  40628. for (; o; ) {
  40629. if (A.Token.isTokenRowDelimiter(o)) return a.advancePastToken(o), !a.hasMoreCharacters && A.Token.isTokenCarriageReturn(o, l) && n ? null : (a.truncateToCursor(), d);
  40630. if (!this.shouldSkipColumnParse(a, o, d)) {
  40631. const c = this.columnParser.parse(a);
  40632. if (c === null) return null;
  40633. d.push(c);
  40634. }
  40635. o = a.nextNonSpaceToken;
  40636. }
  40637. return n ? null : (a.truncateToCursor(), d);
  40638. }
  40639. getStartToken(s, l) {
  40640. const n = s.nextNonSpaceToken;
  40641. return n !== null && A.Token.isTokenDelimiter(n, this.parserOptions) ? (l.push(""), s.nextNonSpaceToken) : n;
  40642. }
  40643. shouldSkipColumnParse(s, l, n) {
  40644. const { parserOptions: a } = this;
  40645. if (A.Token.isTokenDelimiter(l, a)) {
  40646. s.advancePastToken(l);
  40647. const d = s.nextCharacterToken;
  40648. if (!s.hasMoreCharacters || d !== null && A.Token.isTokenRowDelimiter(d) || d !== null && A.Token.isTokenDelimiter(d, a)) return n.push(""), !0;
  40649. }
  40650. return !1;
  40651. }
  40652. };
  40653. }, { "./Token": 159, "./column": 164 }], 158: [function(g, C, i) {
  40654. Object.defineProperty(i, "__esModule", { value: !0 }), i.Scanner = void 0;
  40655. const e = g("./Token"), A = /((?:\r\n)|\n|\r)/;
  40656. i.Scanner = class {
  40657. constructor(s) {
  40658. this.cursor = 0, this.line = s.line, this.lineLength = this.line.length, this.parserOptions = s.parserOptions, this.hasMoreData = s.hasMoreData, this.cursor = s.cursor || 0;
  40659. }
  40660. get hasMoreCharacters() {
  40661. return this.lineLength > this.cursor;
  40662. }
  40663. get nextNonSpaceToken() {
  40664. const { lineFromCursor: s } = this, l = this.parserOptions.NEXT_TOKEN_REGEXP;
  40665. if (s.search(l) === -1) return null;
  40666. const n = l.exec(s);
  40667. if (n == null) return null;
  40668. const a = n[1], d = this.cursor + (n.index || 0);
  40669. return new e.Token({ token: a, startCursor: d, endCursor: d + a.length - 1 });
  40670. }
  40671. get nextCharacterToken() {
  40672. const { cursor: s, lineLength: l } = this;
  40673. return l <= s ? null : new e.Token({ token: this.line[s], startCursor: s, endCursor: s });
  40674. }
  40675. get lineFromCursor() {
  40676. return this.line.substr(this.cursor);
  40677. }
  40678. advancePastLine() {
  40679. const s = A.exec(this.lineFromCursor);
  40680. return s ? (this.cursor += (s.index || 0) + s[0].length, this) : this.hasMoreData ? null : (this.cursor = this.lineLength, this);
  40681. }
  40682. advanceTo(s) {
  40683. return this.cursor = s, this;
  40684. }
  40685. advanceToToken(s) {
  40686. return this.cursor = s.startCursor, this;
  40687. }
  40688. advancePastToken(s) {
  40689. return this.cursor = s.endCursor + 1, this;
  40690. }
  40691. truncateToCursor() {
  40692. return this.line = this.lineFromCursor, this.lineLength = this.line.length, this.cursor = 0, this;
  40693. }
  40694. };
  40695. }, { "./Token": 159 }], 159: [function(g, C, i) {
  40696. Object.defineProperty(i, "__esModule", { value: !0 }), i.Token = void 0, i.Token = class {
  40697. constructor(e) {
  40698. this.token = e.token, this.startCursor = e.startCursor, this.endCursor = e.endCursor;
  40699. }
  40700. static isTokenRowDelimiter(e) {
  40701. const A = e.token;
  40702. return A === "\r" || A === `
  40703. ` || A === `\r
  40704. `;
  40705. }
  40706. static isTokenCarriageReturn(e, A) {
  40707. return e.token === A.carriageReturn;
  40708. }
  40709. static isTokenComment(e, A) {
  40710. return A.supportsComments && !!e && e.token === A.comment;
  40711. }
  40712. static isTokenEscapeCharacter(e, A) {
  40713. return e.token === A.escapeChar;
  40714. }
  40715. static isTokenQuote(e, A) {
  40716. return e.token === A.quote;
  40717. }
  40718. static isTokenDelimiter(e, A) {
  40719. return e.token === A.delimiter;
  40720. }
  40721. };
  40722. }, {}], 160: [function(g, C, i) {
  40723. Object.defineProperty(i, "__esModule", { value: !0 }), i.ColumnFormatter = void 0, i.ColumnFormatter = class {
  40724. constructor(e) {
  40725. e.trim ? this.format = (A) => A.trim() : e.ltrim ? this.format = (A) => A.trimLeft() : e.rtrim ? this.format = (A) => A.trimRight() : this.format = (A) => A;
  40726. }
  40727. };
  40728. }, {}], 161: [function(g, C, i) {
  40729. Object.defineProperty(i, "__esModule", { value: !0 }), i.ColumnParser = void 0;
  40730. const e = g("./NonQuotedColumnParser"), A = g("./QuotedColumnParser"), s = g("../Token");
  40731. i.ColumnParser = class {
  40732. constructor(l) {
  40733. this.parserOptions = l, this.quotedColumnParser = new A.QuotedColumnParser(l), this.nonQuotedColumnParser = new e.NonQuotedColumnParser(l);
  40734. }
  40735. parse(l) {
  40736. const { nextNonSpaceToken: n } = l;
  40737. return n !== null && s.Token.isTokenQuote(n, this.parserOptions) ? (l.advanceToToken(n), this.quotedColumnParser.parse(l)) : this.nonQuotedColumnParser.parse(l);
  40738. }
  40739. };
  40740. }, { "../Token": 159, "./NonQuotedColumnParser": 162, "./QuotedColumnParser": 163 }], 162: [function(g, C, i) {
  40741. Object.defineProperty(i, "__esModule", { value: !0 }), i.NonQuotedColumnParser = void 0;
  40742. const e = g("./ColumnFormatter"), A = g("../Token");
  40743. i.NonQuotedColumnParser = class {
  40744. constructor(s) {
  40745. this.parserOptions = s, this.columnFormatter = new e.ColumnFormatter(s);
  40746. }
  40747. parse(s) {
  40748. if (!s.hasMoreCharacters) return null;
  40749. const { parserOptions: l } = this, n = [];
  40750. let a = s.nextCharacterToken;
  40751. for (; a && !A.Token.isTokenDelimiter(a, l) && !A.Token.isTokenRowDelimiter(a); a = s.nextCharacterToken) n.push(a.token), s.advancePastToken(a);
  40752. return this.columnFormatter.format(n.join(""));
  40753. }
  40754. };
  40755. }, { "../Token": 159, "./ColumnFormatter": 160 }], 163: [function(g, C, i) {
  40756. Object.defineProperty(i, "__esModule", { value: !0 }), i.QuotedColumnParser = void 0;
  40757. const e = g("./ColumnFormatter"), A = g("../Token");
  40758. i.QuotedColumnParser = class {
  40759. constructor(s) {
  40760. this.parserOptions = s, this.columnFormatter = new e.ColumnFormatter(s);
  40761. }
  40762. parse(s) {
  40763. if (!s.hasMoreCharacters) return null;
  40764. const l = s.cursor, { foundClosingQuote: n, col: a } = this.gatherDataBetweenQuotes(s);
  40765. if (!n) {
  40766. if (s.advanceTo(l), !s.hasMoreData) throw new Error(`Parse Error: missing closing: '${this.parserOptions.quote || ""}' in line: at '${s.lineFromCursor.replace(/[\r\n]/g, "\\n'")}'`);
  40767. return null;
  40768. }
  40769. return this.checkForMalformedColumn(s), a;
  40770. }
  40771. gatherDataBetweenQuotes(s) {
  40772. const { parserOptions: l } = this;
  40773. let n = !1, a = !1;
  40774. const d = [];
  40775. let o = s.nextCharacterToken;
  40776. for (; !a && o !== null; o = s.nextCharacterToken) {
  40777. const c = A.Token.isTokenQuote(o, l);
  40778. if (!n && c) n = !0;
  40779. else if (n) if (A.Token.isTokenEscapeCharacter(o, l)) {
  40780. s.advancePastToken(o);
  40781. const r = s.nextCharacterToken;
  40782. r !== null && (A.Token.isTokenQuote(r, l) || A.Token.isTokenEscapeCharacter(r, l)) ? (d.push(r.token), o = r) : c ? a = !0 : d.push(o.token);
  40783. } else c ? a = !0 : d.push(o.token);
  40784. s.advancePastToken(o);
  40785. }
  40786. return { col: this.columnFormatter.format(d.join("")), foundClosingQuote: a };
  40787. }
  40788. checkForMalformedColumn(s) {
  40789. const { parserOptions: l } = this, { nextNonSpaceToken: n } = s;
  40790. if (n) {
  40791. const a = A.Token.isTokenDelimiter(n, l), d = A.Token.isTokenRowDelimiter(n);
  40792. if (!a && !d) {
  40793. const o = s.lineFromCursor.substr(0, 10).replace(/[\r\n]/g, "\\n'");
  40794. throw new Error(`Parse Error: expected: '${l.escapedDelimiter}' OR new line got: '${n.token}'. at '${o}`);
  40795. }
  40796. s.advanceToToken(n);
  40797. } else s.hasMoreData || s.advancePastLine();
  40798. }
  40799. };
  40800. }, { "../Token": 159, "./ColumnFormatter": 160 }], 164: [function(g, C, i) {
  40801. Object.defineProperty(i, "__esModule", { value: !0 }), i.ColumnFormatter = i.QuotedColumnParser = i.NonQuotedColumnParser = i.ColumnParser = void 0;
  40802. var e = g("./ColumnParser");
  40803. Object.defineProperty(i, "ColumnParser", { enumerable: !0, get: function() {
  40804. return e.ColumnParser;
  40805. } });
  40806. var A = g("./NonQuotedColumnParser");
  40807. Object.defineProperty(i, "NonQuotedColumnParser", { enumerable: !0, get: function() {
  40808. return A.NonQuotedColumnParser;
  40809. } });
  40810. var s = g("./QuotedColumnParser");
  40811. Object.defineProperty(i, "QuotedColumnParser", { enumerable: !0, get: function() {
  40812. return s.QuotedColumnParser;
  40813. } });
  40814. var l = g("./ColumnFormatter");
  40815. Object.defineProperty(i, "ColumnFormatter", { enumerable: !0, get: function() {
  40816. return l.ColumnFormatter;
  40817. } });
  40818. }, { "./ColumnFormatter": 160, "./ColumnParser": 161, "./NonQuotedColumnParser": 162, "./QuotedColumnParser": 163 }], 165: [function(g, C, i) {
  40819. Object.defineProperty(i, "__esModule", { value: !0 }), i.QuotedColumnParser = i.NonQuotedColumnParser = i.ColumnParser = i.Token = i.Scanner = i.RowParser = i.Parser = void 0;
  40820. var e = g("./Parser");
  40821. Object.defineProperty(i, "Parser", { enumerable: !0, get: function() {
  40822. return e.Parser;
  40823. } });
  40824. var A = g("./RowParser");
  40825. Object.defineProperty(i, "RowParser", { enumerable: !0, get: function() {
  40826. return A.RowParser;
  40827. } });
  40828. var s = g("./Scanner");
  40829. Object.defineProperty(i, "Scanner", { enumerable: !0, get: function() {
  40830. return s.Scanner;
  40831. } });
  40832. var l = g("./Token");
  40833. Object.defineProperty(i, "Token", { enumerable: !0, get: function() {
  40834. return l.Token;
  40835. } });
  40836. var n = g("./column");
  40837. Object.defineProperty(i, "ColumnParser", { enumerable: !0, get: function() {
  40838. return n.ColumnParser;
  40839. } }), Object.defineProperty(i, "NonQuotedColumnParser", { enumerable: !0, get: function() {
  40840. return n.NonQuotedColumnParser;
  40841. } }), Object.defineProperty(i, "QuotedColumnParser", { enumerable: !0, get: function() {
  40842. return n.QuotedColumnParser;
  40843. } });
  40844. }, { "./Parser": 156, "./RowParser": 157, "./Scanner": 158, "./Token": 159, "./column": 164 }], 166: [function(g, C, i) {
  40845. var e = function(a) {
  40846. return a && a.__esModule ? a : { default: a };
  40847. };
  40848. Object.defineProperty(i, "__esModule", { value: !0 }), i.HeaderTransformer = void 0;
  40849. const A = e(g("lodash.isundefined")), s = e(g("lodash.isfunction")), l = e(g("lodash.uniq")), n = e(g("lodash.groupby"));
  40850. i.HeaderTransformer = class {
  40851. constructor(a) {
  40852. this.headers = null, this.receivedHeaders = !1, this.shouldUseFirstRow = !1, this.processedFirstRow = !1, this.headersLength = 0, this.parserOptions = a, a.headers === !0 ? this.shouldUseFirstRow = !0 : Array.isArray(a.headers) ? this.setHeaders(a.headers) : s.default(a.headers) && (this.headersTransform = a.headers);
  40853. }
  40854. transform(a, d) {
  40855. return this.shouldMapRow(a) ? d(null, this.processRow(a)) : d(null, { row: null, isValid: !0 });
  40856. }
  40857. shouldMapRow(a) {
  40858. const { parserOptions: d } = this;
  40859. if (!this.headersTransform && d.renameHeaders && !this.processedFirstRow) {
  40860. if (!this.receivedHeaders) throw new Error("Error renaming headers: new headers must be provided in an array");
  40861. return this.processedFirstRow = !0, !1;
  40862. }
  40863. if (!this.receivedHeaders && Array.isArray(a)) {
  40864. if (this.headersTransform) this.setHeaders(this.headersTransform(a));
  40865. else {
  40866. if (!this.shouldUseFirstRow) return !0;
  40867. this.setHeaders(a);
  40868. }
  40869. return !1;
  40870. }
  40871. return !0;
  40872. }
  40873. processRow(a) {
  40874. if (!this.headers) return { row: a, isValid: !0 };
  40875. const { parserOptions: d } = this;
  40876. if (!d.discardUnmappedColumns && a.length > this.headersLength) {
  40877. if (!d.strictColumnHandling) throw new Error(`Unexpected Error: column header mismatch expected: ${this.headersLength} columns got: ${a.length}`);
  40878. return { row: a, isValid: !1, reason: `Column header mismatch expected: ${this.headersLength} columns got: ${a.length}` };
  40879. }
  40880. return d.strictColumnHandling && a.length < this.headersLength ? { row: a, isValid: !1, reason: `Column header mismatch expected: ${this.headersLength} columns got: ${a.length}` } : { row: this.mapHeaders(a), isValid: !0 };
  40881. }
  40882. mapHeaders(a) {
  40883. const d = {}, { headers: o, headersLength: c } = this;
  40884. for (let r = 0; r < c; r += 1) {
  40885. const h = o[r];
  40886. if (!A.default(h)) {
  40887. const b = a[r];
  40888. A.default(b) ? d[h] = "" : d[h] = b;
  40889. }
  40890. }
  40891. return d;
  40892. }
  40893. setHeaders(a) {
  40894. var d;
  40895. const o = a.filter((c) => !!c);
  40896. if (l.default(o).length !== o.length) {
  40897. const c = n.default(o), r = Object.keys(c).filter((h) => c[h].length > 1);
  40898. throw new Error("Duplicate headers found " + JSON.stringify(r));
  40899. }
  40900. this.headers = a, this.receivedHeaders = !0, this.headersLength = ((d = this.headers) === null || d === void 0 ? void 0 : d.length) || 0;
  40901. }
  40902. };
  40903. }, { "lodash.groupby": 443, "lodash.isfunction": 446, "lodash.isundefined": 448, "lodash.uniq": 449 }], 167: [function(g, C, i) {
  40904. var e = function(n) {
  40905. return n && n.__esModule ? n : { default: n };
  40906. };
  40907. Object.defineProperty(i, "__esModule", { value: !0 }), i.RowTransformerValidator = void 0;
  40908. const A = e(g("lodash.isfunction")), s = g("../types");
  40909. class l {
  40910. constructor() {
  40911. this._rowTransform = null, this._rowValidator = null;
  40912. }
  40913. static createTransform(a) {
  40914. return s.isSyncTransform(a) ? (d, o) => {
  40915. let c = null;
  40916. try {
  40917. c = a(d);
  40918. } catch (r) {
  40919. return o(r);
  40920. }
  40921. return o(null, c);
  40922. } : a;
  40923. }
  40924. static createValidator(a) {
  40925. return s.isSyncValidate(a) ? (d, o) => {
  40926. o(null, { row: d, isValid: a(d) });
  40927. } : (d, o) => {
  40928. a(d, (c, r, h) => c ? o(c) : o(null, r ? { row: d, isValid: r, reason: h } : { row: d, isValid: !1, reason: h }));
  40929. };
  40930. }
  40931. set rowTransform(a) {
  40932. if (!A.default(a)) throw new TypeError("The transform should be a function");
  40933. this._rowTransform = l.createTransform(a);
  40934. }
  40935. set rowValidator(a) {
  40936. if (!A.default(a)) throw new TypeError("The validate should be a function");
  40937. this._rowValidator = l.createValidator(a);
  40938. }
  40939. transformAndValidate(a, d) {
  40940. return this.callTransformer(a, (o, c) => o ? d(o) : c ? this.callValidator(c, (r, h) => r ? d(r) : h && !h.isValid ? d(null, { row: c, isValid: !1, reason: h.reason }) : d(null, { row: c, isValid: !0 })) : d(null, { row: null, isValid: !0 }));
  40941. }
  40942. callTransformer(a, d) {
  40943. return this._rowTransform ? this._rowTransform(a, d) : d(null, a);
  40944. }
  40945. callValidator(a, d) {
  40946. return this._rowValidator ? this._rowValidator(a, d) : d(null, { row: a, isValid: !0 });
  40947. }
  40948. }
  40949. i.RowTransformerValidator = l;
  40950. }, { "../types": 169, "lodash.isfunction": 446 }], 168: [function(g, C, i) {
  40951. Object.defineProperty(i, "__esModule", { value: !0 }), i.HeaderTransformer = i.RowTransformerValidator = void 0;
  40952. var e = g("./RowTransformerValidator");
  40953. Object.defineProperty(i, "RowTransformerValidator", { enumerable: !0, get: function() {
  40954. return e.RowTransformerValidator;
  40955. } });
  40956. var A = g("./HeaderTransformer");
  40957. Object.defineProperty(i, "HeaderTransformer", { enumerable: !0, get: function() {
  40958. return A.HeaderTransformer;
  40959. } });
  40960. }, { "./HeaderTransformer": 166, "./RowTransformerValidator": 167 }], 169: [function(g, C, i) {
  40961. Object.defineProperty(i, "__esModule", { value: !0 }), i.isSyncValidate = i.isSyncTransform = void 0, i.isSyncTransform = (e) => e.length === 1, i.isSyncValidate = (e) => e.length === 1;
  40962. }, {}], 170: [function(g, C, i) {
  40963. const e = i;
  40964. e.bignum = g("bn.js"), e.define = g("./asn1/api").define, e.base = g("./asn1/base"), e.constants = g("./asn1/constants"), e.decoders = g("./asn1/decoders"), e.encoders = g("./asn1/encoders");
  40965. }, { "./asn1/api": 171, "./asn1/base": 173, "./asn1/constants": 177, "./asn1/decoders": 179, "./asn1/encoders": 182, "bn.js": 184 }], 171: [function(g, C, i) {
  40966. const e = g("./encoders"), A = g("./decoders"), s = g("inherits");
  40967. function l(n, a) {
  40968. this.name = n, this.body = a, this.decoders = {}, this.encoders = {};
  40969. }
  40970. i.define = function(n, a) {
  40971. return new l(n, a);
  40972. }, l.prototype._createNamed = function(n) {
  40973. const a = this.name;
  40974. function d(o) {
  40975. this._initNamed(o, a);
  40976. }
  40977. return s(d, n), d.prototype._initNamed = function(o, c) {
  40978. n.call(this, o, c);
  40979. }, new d(this);
  40980. }, l.prototype._getDecoder = function(n) {
  40981. return n = n || "der", this.decoders.hasOwnProperty(n) || (this.decoders[n] = this._createNamed(A[n])), this.decoders[n];
  40982. }, l.prototype.decode = function(n, a, d) {
  40983. return this._getDecoder(a).decode(n, d);
  40984. }, l.prototype._getEncoder = function(n) {
  40985. return n = n || "der", this.encoders.hasOwnProperty(n) || (this.encoders[n] = this._createNamed(e[n])), this.encoders[n];
  40986. }, l.prototype.encode = function(n, a, d) {
  40987. return this._getEncoder(a).encode(n, d);
  40988. };
  40989. }, { "./decoders": 179, "./encoders": 182, inherits: 440 }], 172: [function(g, C, i) {
  40990. const e = g("inherits"), A = g("../base/reporter").Reporter, s = g("safer-buffer").Buffer;
  40991. function l(a, d) {
  40992. A.call(this, d), s.isBuffer(a) ? (this.base = a, this.offset = 0, this.length = a.length) : this.error("Input not Buffer");
  40993. }
  40994. function n(a, d) {
  40995. if (Array.isArray(a)) this.length = 0, this.value = a.map(function(o) {
  40996. return n.isEncoderBuffer(o) || (o = new n(o, d)), this.length += o.length, o;
  40997. }, this);
  40998. else if (typeof a == "number") {
  40999. if (!(0 <= a && a <= 255)) return d.error("non-byte EncoderBuffer value");
  41000. this.value = a, this.length = 1;
  41001. } else if (typeof a == "string") this.value = a, this.length = s.byteLength(a);
  41002. else {
  41003. if (!s.isBuffer(a)) return d.error("Unsupported type: " + typeof a);
  41004. this.value = a, this.length = a.length;
  41005. }
  41006. }
  41007. e(l, A), i.DecoderBuffer = l, l.isDecoderBuffer = function(a) {
  41008. return a instanceof l ? !0 : typeof a == "object" && s.isBuffer(a.base) && a.constructor.name === "DecoderBuffer" && typeof a.offset == "number" && typeof a.length == "number" && typeof a.save == "function" && typeof a.restore == "function" && typeof a.isEmpty == "function" && typeof a.readUInt8 == "function" && typeof a.skip == "function" && typeof a.raw == "function";
  41009. }, l.prototype.save = function() {
  41010. return { offset: this.offset, reporter: A.prototype.save.call(this) };
  41011. }, l.prototype.restore = function(a) {
  41012. const d = new l(this.base);
  41013. return d.offset = a.offset, d.length = this.offset, this.offset = a.offset, A.prototype.restore.call(this, a.reporter), d;
  41014. }, l.prototype.isEmpty = function() {
  41015. return this.offset === this.length;
  41016. }, l.prototype.readUInt8 = function(a) {
  41017. return this.offset + 1 <= this.length ? this.base.readUInt8(this.offset++, !0) : this.error(a || "DecoderBuffer overrun");
  41018. }, l.prototype.skip = function(a, d) {
  41019. if (!(this.offset + a <= this.length)) return this.error(d || "DecoderBuffer overrun");
  41020. const o = new l(this.base);
  41021. return o._reporterState = this._reporterState, o.offset = this.offset, o.length = this.offset + a, this.offset += a, o;
  41022. }, l.prototype.raw = function(a) {
  41023. return this.base.slice(a ? a.offset : this.offset, this.length);
  41024. }, i.EncoderBuffer = n, n.isEncoderBuffer = function(a) {
  41025. return a instanceof n ? !0 : typeof a == "object" && a.constructor.name === "EncoderBuffer" && typeof a.length == "number" && typeof a.join == "function";
  41026. }, n.prototype.join = function(a, d) {
  41027. return a || (a = s.alloc(this.length)), d || (d = 0), this.length === 0 || (Array.isArray(this.value) ? this.value.forEach(function(o) {
  41028. o.join(a, d), d += o.length;
  41029. }) : (typeof this.value == "number" ? a[d] = this.value : typeof this.value == "string" ? a.write(this.value, d) : s.isBuffer(this.value) && this.value.copy(a, d), d += this.length)), a;
  41030. };
  41031. }, { "../base/reporter": 175, inherits: 440, "safer-buffer": 495 }], 173: [function(g, C, i) {
  41032. const e = i;
  41033. e.Reporter = g("./reporter").Reporter, e.DecoderBuffer = g("./buffer").DecoderBuffer, e.EncoderBuffer = g("./buffer").EncoderBuffer, e.Node = g("./node");
  41034. }, { "./buffer": 172, "./node": 174, "./reporter": 175 }], 174: [function(g, C, i) {
  41035. const e = g("../base/reporter").Reporter, A = g("../base/buffer").EncoderBuffer, s = g("../base/buffer").DecoderBuffer, l = g("minimalistic-assert"), n = ["seq", "seqof", "set", "setof", "objid", "bool", "gentime", "utctime", "null_", "enum", "int", "objDesc", "bitstr", "bmpstr", "charstr", "genstr", "graphstr", "ia5str", "iso646str", "numstr", "octstr", "printstr", "t61str", "unistr", "utf8str", "videostr"], a = ["key", "obj", "use", "optional", "explicit", "implicit", "def", "choice", "any", "contains"].concat(n);
  41036. function d(c, r, h) {
  41037. const b = {};
  41038. this._baseState = b, b.name = h, b.enc = c, b.parent = r || null, b.children = null, b.tag = null, b.args = null, b.reverseArgs = null, b.choice = null, b.optional = !1, b.any = !1, b.obj = !1, b.use = null, b.useDecoder = null, b.key = null, b.default = null, b.explicit = null, b.implicit = null, b.contains = null, b.parent || (b.children = [], this._wrap());
  41039. }
  41040. C.exports = d;
  41041. const o = ["enc", "parent", "children", "tag", "args", "reverseArgs", "choice", "optional", "any", "obj", "use", "alteredUse", "key", "default", "explicit", "implicit", "contains"];
  41042. d.prototype.clone = function() {
  41043. const c = this._baseState, r = {};
  41044. o.forEach(function(b) {
  41045. r[b] = c[b];
  41046. });
  41047. const h = new this.constructor(r.parent);
  41048. return h._baseState = r, h;
  41049. }, d.prototype._wrap = function() {
  41050. const c = this._baseState;
  41051. a.forEach(function(r) {
  41052. this[r] = function() {
  41053. const h = new this.constructor(this);
  41054. return c.children.push(h), h[r].apply(h, arguments);
  41055. };
  41056. }, this);
  41057. }, d.prototype._init = function(c) {
  41058. const r = this._baseState;
  41059. l(r.parent === null), c.call(this), r.children = r.children.filter(function(h) {
  41060. return h._baseState.parent === this;
  41061. }, this), l.equal(r.children.length, 1, "Root node can have only one child");
  41062. }, d.prototype._useArgs = function(c) {
  41063. const r = this._baseState, h = c.filter(function(b) {
  41064. return b instanceof this.constructor;
  41065. }, this);
  41066. c = c.filter(function(b) {
  41067. return !(b instanceof this.constructor);
  41068. }, this), h.length !== 0 && (l(r.children === null), r.children = h, h.forEach(function(b) {
  41069. b._baseState.parent = this;
  41070. }, this)), c.length !== 0 && (l(r.args === null), r.args = c, r.reverseArgs = c.map(function(b) {
  41071. if (typeof b != "object" || b.constructor !== Object) return b;
  41072. const u = {};
  41073. return Object.keys(b).forEach(function(m) {
  41074. m == (0 | m) && (m |= 0);
  41075. const Z = b[m];
  41076. u[Z] = m;
  41077. }), u;
  41078. }));
  41079. }, ["_peekTag", "_decodeTag", "_use", "_decodeStr", "_decodeObjid", "_decodeTime", "_decodeNull", "_decodeInt", "_decodeBool", "_decodeList", "_encodeComposite", "_encodeStr", "_encodeObjid", "_encodeTime", "_encodeNull", "_encodeInt", "_encodeBool"].forEach(function(c) {
  41080. d.prototype[c] = function() {
  41081. const r = this._baseState;
  41082. throw new Error(c + " not implemented for encoding: " + r.enc);
  41083. };
  41084. }), n.forEach(function(c) {
  41085. d.prototype[c] = function() {
  41086. const r = this._baseState, h = Array.prototype.slice.call(arguments);
  41087. return l(r.tag === null), r.tag = c, this._useArgs(h), this;
  41088. };
  41089. }), d.prototype.use = function(c) {
  41090. l(c);
  41091. const r = this._baseState;
  41092. return l(r.use === null), r.use = c, this;
  41093. }, d.prototype.optional = function() {
  41094. return this._baseState.optional = !0, this;
  41095. }, d.prototype.def = function(c) {
  41096. const r = this._baseState;
  41097. return l(r.default === null), r.default = c, r.optional = !0, this;
  41098. }, d.prototype.explicit = function(c) {
  41099. const r = this._baseState;
  41100. return l(r.explicit === null && r.implicit === null), r.explicit = c, this;
  41101. }, d.prototype.implicit = function(c) {
  41102. const r = this._baseState;
  41103. return l(r.explicit === null && r.implicit === null), r.implicit = c, this;
  41104. }, d.prototype.obj = function() {
  41105. const c = this._baseState, r = Array.prototype.slice.call(arguments);
  41106. return c.obj = !0, r.length !== 0 && this._useArgs(r), this;
  41107. }, d.prototype.key = function(c) {
  41108. const r = this._baseState;
  41109. return l(r.key === null), r.key = c, this;
  41110. }, d.prototype.any = function() {
  41111. return this._baseState.any = !0, this;
  41112. }, d.prototype.choice = function(c) {
  41113. const r = this._baseState;
  41114. return l(r.choice === null), r.choice = c, this._useArgs(Object.keys(c).map(function(h) {
  41115. return c[h];
  41116. })), this;
  41117. }, d.prototype.contains = function(c) {
  41118. const r = this._baseState;
  41119. return l(r.use === null), r.contains = c, this;
  41120. }, d.prototype._decode = function(c, r) {
  41121. const h = this._baseState;
  41122. if (h.parent === null) return c.wrapResult(h.children[0]._decode(c, r));
  41123. let b, u = h.default, m = !0, Z = null;
  41124. if (h.key !== null && (Z = c.enterKey(h.key)), h.optional) {
  41125. let p = null;
  41126. if (h.explicit !== null ? p = h.explicit : h.implicit !== null ? p = h.implicit : h.tag !== null && (p = h.tag), p !== null || h.any) {
  41127. if (m = this._peekTag(c, p, h.any), c.isError(m)) return m;
  41128. } else {
  41129. const Y = c.save();
  41130. try {
  41131. h.choice === null ? this._decodeGeneric(h.tag, c, r) : this._decodeChoice(c, r), m = !0;
  41132. } catch {
  41133. m = !1;
  41134. }
  41135. c.restore(Y);
  41136. }
  41137. }
  41138. if (h.obj && m && (b = c.enterObject()), m) {
  41139. if (h.explicit !== null) {
  41140. const Y = this._decodeTag(c, h.explicit);
  41141. if (c.isError(Y)) return Y;
  41142. c = Y;
  41143. }
  41144. const p = c.offset;
  41145. if (h.use === null && h.choice === null) {
  41146. let Y;
  41147. h.any && (Y = c.save());
  41148. const R = this._decodeTag(c, h.implicit !== null ? h.implicit : h.tag, h.any);
  41149. if (c.isError(R)) return R;
  41150. h.any ? u = c.raw(Y) : c = R;
  41151. }
  41152. if (r && r.track && h.tag !== null && r.track(c.path(), p, c.length, "tagged"), r && r.track && h.tag !== null && r.track(c.path(), c.offset, c.length, "content"), h.any || (u = h.choice === null ? this._decodeGeneric(h.tag, c, r) : this._decodeChoice(c, r)), c.isError(u)) return u;
  41153. if (h.any || h.choice !== null || h.children === null || h.children.forEach(function(Y) {
  41154. Y._decode(c, r);
  41155. }), h.contains && (h.tag === "octstr" || h.tag === "bitstr")) {
  41156. const Y = new s(u);
  41157. u = this._getUse(h.contains, c._reporterState.obj)._decode(Y, r);
  41158. }
  41159. }
  41160. return h.obj && m && (u = c.leaveObject(b)), h.key === null || u === null && m !== !0 ? Z !== null && c.exitKey(Z) : c.leaveKey(Z, h.key, u), u;
  41161. }, d.prototype._decodeGeneric = function(c, r, h) {
  41162. const b = this._baseState;
  41163. return c === "seq" || c === "set" ? null : c === "seqof" || c === "setof" ? this._decodeList(r, c, b.args[0], h) : /str$/.test(c) ? this._decodeStr(r, c, h) : c === "objid" && b.args ? this._decodeObjid(r, b.args[0], b.args[1], h) : c === "objid" ? this._decodeObjid(r, null, null, h) : c === "gentime" || c === "utctime" ? this._decodeTime(r, c, h) : c === "null_" ? this._decodeNull(r, h) : c === "bool" ? this._decodeBool(r, h) : c === "objDesc" ? this._decodeStr(r, c, h) : c === "int" || c === "enum" ? this._decodeInt(r, b.args && b.args[0], h) : b.use !== null ? this._getUse(b.use, r._reporterState.obj)._decode(r, h) : r.error("unknown tag: " + c);
  41164. }, d.prototype._getUse = function(c, r) {
  41165. const h = this._baseState;
  41166. return h.useDecoder = this._use(c, r), l(h.useDecoder._baseState.parent === null), h.useDecoder = h.useDecoder._baseState.children[0], h.implicit !== h.useDecoder._baseState.implicit && (h.useDecoder = h.useDecoder.clone(), h.useDecoder._baseState.implicit = h.implicit), h.useDecoder;
  41167. }, d.prototype._decodeChoice = function(c, r) {
  41168. const h = this._baseState;
  41169. let b = null, u = !1;
  41170. return Object.keys(h.choice).some(function(m) {
  41171. const Z = c.save(), p = h.choice[m];
  41172. try {
  41173. const Y = p._decode(c, r);
  41174. if (c.isError(Y)) return !1;
  41175. b = { type: m, value: Y }, u = !0;
  41176. } catch {
  41177. return c.restore(Z), !1;
  41178. }
  41179. return !0;
  41180. }, this), u ? b : c.error("Choice not matched");
  41181. }, d.prototype._createEncoderBuffer = function(c) {
  41182. return new A(c, this.reporter);
  41183. }, d.prototype._encode = function(c, r, h) {
  41184. const b = this._baseState;
  41185. if (b.default !== null && b.default === c) return;
  41186. const u = this._encodeValue(c, r, h);
  41187. return u === void 0 || this._skipDefault(u, r, h) ? void 0 : u;
  41188. }, d.prototype._encodeValue = function(c, r, h) {
  41189. const b = this._baseState;
  41190. if (b.parent === null) return b.children[0]._encode(c, r || new e());
  41191. let u = null;
  41192. if (this.reporter = r, b.optional && c === void 0) {
  41193. if (b.default === null) return;
  41194. c = b.default;
  41195. }
  41196. let m = null, Z = !1;
  41197. if (b.any) u = this._createEncoderBuffer(c);
  41198. else if (b.choice) u = this._encodeChoice(c, r);
  41199. else if (b.contains) m = this._getUse(b.contains, h)._encode(c, r), Z = !0;
  41200. else if (b.children) m = b.children.map(function(p) {
  41201. if (p._baseState.tag === "null_") return p._encode(null, r, c);
  41202. if (p._baseState.key === null) return r.error("Child should have a key");
  41203. const Y = r.enterKey(p._baseState.key);
  41204. if (typeof c != "object") return r.error("Child expected, but input is not object");
  41205. const R = p._encode(c[p._baseState.key], r, c);
  41206. return r.leaveKey(Y), R;
  41207. }, this).filter(function(p) {
  41208. return p;
  41209. }), m = this._createEncoderBuffer(m);
  41210. else if (b.tag === "seqof" || b.tag === "setof") {
  41211. if (!b.args || b.args.length !== 1) return r.error("Too many args for : " + b.tag);
  41212. if (!Array.isArray(c)) return r.error("seqof/setof, but data is not Array");
  41213. const p = this.clone();
  41214. p._baseState.implicit = null, m = this._createEncoderBuffer(c.map(function(Y) {
  41215. const R = this._baseState;
  41216. return this._getUse(R.args[0], c)._encode(Y, r);
  41217. }, p));
  41218. } else b.use !== null ? u = this._getUse(b.use, h)._encode(c, r) : (m = this._encodePrimitive(b.tag, c), Z = !0);
  41219. if (!b.any && b.choice === null) {
  41220. const p = b.implicit !== null ? b.implicit : b.tag, Y = b.implicit === null ? "universal" : "context";
  41221. p === null ? b.use === null && r.error("Tag could be omitted only for .use()") : b.use === null && (u = this._encodeComposite(p, Z, Y, m));
  41222. }
  41223. return b.explicit !== null && (u = this._encodeComposite(b.explicit, !1, "context", u)), u;
  41224. }, d.prototype._encodeChoice = function(c, r) {
  41225. const h = this._baseState, b = h.choice[c.type];
  41226. return b || l(!1, c.type + " not found in " + JSON.stringify(Object.keys(h.choice))), b._encode(c.value, r);
  41227. }, d.prototype._encodePrimitive = function(c, r) {
  41228. const h = this._baseState;
  41229. if (/str$/.test(c)) return this._encodeStr(r, c);
  41230. if (c === "objid" && h.args) return this._encodeObjid(r, h.reverseArgs[0], h.args[1]);
  41231. if (c === "objid") return this._encodeObjid(r, null, null);
  41232. if (c === "gentime" || c === "utctime") return this._encodeTime(r, c);
  41233. if (c === "null_") return this._encodeNull();
  41234. if (c === "int" || c === "enum") return this._encodeInt(r, h.args && h.reverseArgs[0]);
  41235. if (c === "bool") return this._encodeBool(r);
  41236. if (c === "objDesc") return this._encodeStr(r, c);
  41237. throw new Error("Unsupported tag: " + c);
  41238. }, d.prototype._isNumstr = function(c) {
  41239. return /^[0-9 ]*$/.test(c);
  41240. }, d.prototype._isPrintstr = function(c) {
  41241. return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(c);
  41242. };
  41243. }, { "../base/buffer": 172, "../base/reporter": 175, "minimalistic-assert": 453 }], 175: [function(g, C, i) {
  41244. const e = g("inherits");
  41245. function A(l) {
  41246. this._reporterState = { obj: null, path: [], options: l || {}, errors: [] };
  41247. }
  41248. function s(l, n) {
  41249. this.path = l, this.rethrow(n);
  41250. }
  41251. i.Reporter = A, A.prototype.isError = function(l) {
  41252. return l instanceof s;
  41253. }, A.prototype.save = function() {
  41254. const l = this._reporterState;
  41255. return { obj: l.obj, pathLen: l.path.length };
  41256. }, A.prototype.restore = function(l) {
  41257. const n = this._reporterState;
  41258. n.obj = l.obj, n.path = n.path.slice(0, l.pathLen);
  41259. }, A.prototype.enterKey = function(l) {
  41260. return this._reporterState.path.push(l);
  41261. }, A.prototype.exitKey = function(l) {
  41262. const n = this._reporterState;
  41263. n.path = n.path.slice(0, l - 1);
  41264. }, A.prototype.leaveKey = function(l, n, a) {
  41265. const d = this._reporterState;
  41266. this.exitKey(l), d.obj !== null && (d.obj[n] = a);
  41267. }, A.prototype.path = function() {
  41268. return this._reporterState.path.join("/");
  41269. }, A.prototype.enterObject = function() {
  41270. const l = this._reporterState, n = l.obj;
  41271. return l.obj = {}, n;
  41272. }, A.prototype.leaveObject = function(l) {
  41273. const n = this._reporterState, a = n.obj;
  41274. return n.obj = l, a;
  41275. }, A.prototype.error = function(l) {
  41276. let n;
  41277. const a = this._reporterState, d = l instanceof s;
  41278. if (n = d ? l : new s(a.path.map(function(o) {
  41279. return "[" + JSON.stringify(o) + "]";
  41280. }).join(""), l.message || l, l.stack), !a.options.partial) throw n;
  41281. return d || a.errors.push(n), n;
  41282. }, A.prototype.wrapResult = function(l) {
  41283. const n = this._reporterState;
  41284. return n.options.partial ? { result: this.isError(l) ? null : l, errors: n.errors } : l;
  41285. }, e(s, Error), s.prototype.rethrow = function(l) {
  41286. if (this.message = l + " at: " + (this.path || "(shallow)"), Error.captureStackTrace && Error.captureStackTrace(this, s), !this.stack) try {
  41287. throw new Error(this.message);
  41288. } catch (n) {
  41289. this.stack = n.stack;
  41290. }
  41291. return this;
  41292. };
  41293. }, { inherits: 440 }], 176: [function(g, C, i) {
  41294. function e(A) {
  41295. const s = {};
  41296. return Object.keys(A).forEach(function(l) {
  41297. (0 | l) == l && (l |= 0);
  41298. const n = A[l];
  41299. s[n] = l;
  41300. }), s;
  41301. }
  41302. i.tagClass = { 0: "universal", 1: "application", 2: "context", 3: "private" }, i.tagClassByName = e(i.tagClass), i.tag = { 0: "end", 1: "bool", 2: "int", 3: "bitstr", 4: "octstr", 5: "null_", 6: "objid", 7: "objDesc", 8: "external", 9: "real", 10: "enum", 11: "embed", 12: "utf8str", 13: "relativeOid", 16: "seq", 17: "set", 18: "numstr", 19: "printstr", 20: "t61str", 21: "videostr", 22: "ia5str", 23: "utctime", 24: "gentime", 25: "graphstr", 26: "iso646str", 27: "genstr", 28: "unistr", 29: "charstr", 30: "bmpstr" }, i.tagByName = e(i.tag);
  41303. }, {}], 177: [function(g, C, i) {
  41304. const e = i;
  41305. e._reverse = function(A) {
  41306. const s = {};
  41307. return Object.keys(A).forEach(function(l) {
  41308. (0 | l) == l && (l |= 0);
  41309. const n = A[l];
  41310. s[n] = l;
  41311. }), s;
  41312. }, e.der = g("./der");
  41313. }, { "./der": 176 }], 178: [function(g, C, i) {
  41314. const e = g("inherits"), A = g("bn.js"), s = g("../base/buffer").DecoderBuffer, l = g("../base/node"), n = g("../constants/der");
  41315. function a(r) {
  41316. this.enc = "der", this.name = r.name, this.entity = r, this.tree = new d(), this.tree._init(r.body);
  41317. }
  41318. function d(r) {
  41319. l.call(this, "der", r);
  41320. }
  41321. function o(r, h) {
  41322. let b = r.readUInt8(h);
  41323. if (r.isError(b)) return b;
  41324. const u = n.tagClass[b >> 6], m = (32 & b) == 0;
  41325. if ((31 & b) == 31) {
  41326. let Z = b;
  41327. for (b = 0; (128 & Z) == 128; ) {
  41328. if (Z = r.readUInt8(h), r.isError(Z)) return Z;
  41329. b <<= 7, b |= 127 & Z;
  41330. }
  41331. } else b &= 31;
  41332. return { cls: u, primitive: m, tag: b, tagStr: n.tag[b] };
  41333. }
  41334. function c(r, h, b) {
  41335. let u = r.readUInt8(b);
  41336. if (r.isError(u)) return u;
  41337. if (!h && u === 128) return null;
  41338. if ((128 & u) == 0) return u;
  41339. const m = 127 & u;
  41340. if (m > 4) return r.error("length octect is too long");
  41341. u = 0;
  41342. for (let Z = 0; Z < m; Z++) {
  41343. u <<= 8;
  41344. const p = r.readUInt8(b);
  41345. if (r.isError(p)) return p;
  41346. u |= p;
  41347. }
  41348. return u;
  41349. }
  41350. C.exports = a, a.prototype.decode = function(r, h) {
  41351. return s.isDecoderBuffer(r) || (r = new s(r, h)), this.tree._decode(r, h);
  41352. }, e(d, l), d.prototype._peekTag = function(r, h, b) {
  41353. if (r.isEmpty()) return !1;
  41354. const u = r.save(), m = o(r, 'Failed to peek tag: "' + h + '"');
  41355. return r.isError(m) ? m : (r.restore(u), m.tag === h || m.tagStr === h || m.tagStr + "of" === h || b);
  41356. }, d.prototype._decodeTag = function(r, h, b) {
  41357. const u = o(r, 'Failed to decode tag of "' + h + '"');
  41358. if (r.isError(u)) return u;
  41359. let m = c(r, u.primitive, 'Failed to get length of "' + h + '"');
  41360. if (r.isError(m)) return m;
  41361. if (!b && u.tag !== h && u.tagStr !== h && u.tagStr + "of" !== h) return r.error('Failed to match tag: "' + h + '"');
  41362. if (u.primitive || m !== null) return r.skip(m, 'Failed to match body of: "' + h + '"');
  41363. const Z = r.save(), p = this._skipUntilEnd(r, 'Failed to skip indefinite length body: "' + this.tag + '"');
  41364. return r.isError(p) ? p : (m = r.offset - Z.offset, r.restore(Z), r.skip(m, 'Failed to match body of: "' + h + '"'));
  41365. }, d.prototype._skipUntilEnd = function(r, h) {
  41366. for (; ; ) {
  41367. const b = o(r, h);
  41368. if (r.isError(b)) return b;
  41369. const u = c(r, b.primitive, h);
  41370. if (r.isError(u)) return u;
  41371. let m;
  41372. if (m = b.primitive || u !== null ? r.skip(u) : this._skipUntilEnd(r, h), r.isError(m)) return m;
  41373. if (b.tagStr === "end") break;
  41374. }
  41375. }, d.prototype._decodeList = function(r, h, b, u) {
  41376. const m = [];
  41377. for (; !r.isEmpty(); ) {
  41378. const Z = this._peekTag(r, "end");
  41379. if (r.isError(Z)) return Z;
  41380. const p = b.decode(r, "der", u);
  41381. if (r.isError(p) && Z) break;
  41382. m.push(p);
  41383. }
  41384. return m;
  41385. }, d.prototype._decodeStr = function(r, h) {
  41386. if (h === "bitstr") {
  41387. const b = r.readUInt8();
  41388. return r.isError(b) ? b : { unused: b, data: r.raw() };
  41389. }
  41390. if (h === "bmpstr") {
  41391. const b = r.raw();
  41392. if (b.length % 2 == 1) return r.error("Decoding of string type: bmpstr length mismatch");
  41393. let u = "";
  41394. for (let m = 0; m < b.length / 2; m++) u += String.fromCharCode(b.readUInt16BE(2 * m));
  41395. return u;
  41396. }
  41397. if (h === "numstr") {
  41398. const b = r.raw().toString("ascii");
  41399. return this._isNumstr(b) ? b : r.error("Decoding of string type: numstr unsupported characters");
  41400. }
  41401. if (h === "octstr" || h === "objDesc") return r.raw();
  41402. if (h === "printstr") {
  41403. const b = r.raw().toString("ascii");
  41404. return this._isPrintstr(b) ? b : r.error("Decoding of string type: printstr unsupported characters");
  41405. }
  41406. return /str$/.test(h) ? r.raw().toString() : r.error("Decoding of string type: " + h + " unsupported");
  41407. }, d.prototype._decodeObjid = function(r, h, b) {
  41408. let u;
  41409. const m = [];
  41410. let Z = 0, p = 0;
  41411. for (; !r.isEmpty(); ) p = r.readUInt8(), Z <<= 7, Z |= 127 & p, (128 & p) == 0 && (m.push(Z), Z = 0);
  41412. 128 & p && m.push(Z);
  41413. const Y = m[0] / 40 | 0, R = m[0] % 40;
  41414. if (u = b ? m : [Y, R].concat(m.slice(1)), h) {
  41415. let X = h[u.join(" ")];
  41416. X === void 0 && (X = h[u.join(".")]), X !== void 0 && (u = X);
  41417. }
  41418. return u;
  41419. }, d.prototype._decodeTime = function(r, h) {
  41420. const b = r.raw().toString();
  41421. let u, m, Z, p, Y, R;
  41422. if (h === "gentime") u = 0 | b.slice(0, 4), m = 0 | b.slice(4, 6), Z = 0 | b.slice(6, 8), p = 0 | b.slice(8, 10), Y = 0 | b.slice(10, 12), R = 0 | b.slice(12, 14);
  41423. else {
  41424. if (h !== "utctime") return r.error("Decoding " + h + " time is not supported yet");
  41425. u = 0 | b.slice(0, 2), m = 0 | b.slice(2, 4), Z = 0 | b.slice(4, 6), p = 0 | b.slice(6, 8), Y = 0 | b.slice(8, 10), R = 0 | b.slice(10, 12), u = u < 70 ? 2e3 + u : 1900 + u;
  41426. }
  41427. return Date.UTC(u, m - 1, Z, p, Y, R, 0);
  41428. }, d.prototype._decodeNull = function() {
  41429. return null;
  41430. }, d.prototype._decodeBool = function(r) {
  41431. const h = r.readUInt8();
  41432. return r.isError(h) ? h : h !== 0;
  41433. }, d.prototype._decodeInt = function(r, h) {
  41434. const b = r.raw();
  41435. let u = new A(b);
  41436. return h && (u = h[u.toString(10)] || u), u;
  41437. }, d.prototype._use = function(r, h) {
  41438. return typeof r == "function" && (r = r(h)), r._getDecoder("der").tree;
  41439. };
  41440. }, { "../base/buffer": 172, "../base/node": 174, "../constants/der": 176, "bn.js": 184, inherits: 440 }], 179: [function(g, C, i) {
  41441. const e = i;
  41442. e.der = g("./der"), e.pem = g("./pem");
  41443. }, { "./der": 178, "./pem": 180 }], 180: [function(g, C, i) {
  41444. const e = g("inherits"), A = g("safer-buffer").Buffer, s = g("./der");
  41445. function l(n) {
  41446. s.call(this, n), this.enc = "pem";
  41447. }
  41448. e(l, s), C.exports = l, l.prototype.decode = function(n, a) {
  41449. const d = n.toString().split(/[\r\n]+/g), o = a.label.toUpperCase(), c = /^-----(BEGIN|END) ([^-]+)-----$/;
  41450. let r = -1, h = -1;
  41451. for (let m = 0; m < d.length; m++) {
  41452. const Z = d[m].match(c);
  41453. if (Z !== null && Z[2] === o) {
  41454. if (r !== -1) {
  41455. if (Z[1] !== "END") break;
  41456. h = m;
  41457. break;
  41458. }
  41459. if (Z[1] !== "BEGIN") break;
  41460. r = m;
  41461. }
  41462. }
  41463. if (r === -1 || h === -1) throw new Error("PEM section not found for: " + o);
  41464. const b = d.slice(r + 1, h).join("");
  41465. b.replace(/[^a-z0-9+/=]+/gi, "");
  41466. const u = A.from(b, "base64");
  41467. return s.prototype.decode.call(this, u, a);
  41468. };
  41469. }, { "./der": 178, inherits: 440, "safer-buffer": 495 }], 181: [function(g, C, i) {
  41470. const e = g("inherits"), A = g("safer-buffer").Buffer, s = g("../base/node"), l = g("../constants/der");
  41471. function n(o) {
  41472. this.enc = "der", this.name = o.name, this.entity = o, this.tree = new a(), this.tree._init(o.body);
  41473. }
  41474. function a(o) {
  41475. s.call(this, "der", o);
  41476. }
  41477. function d(o) {
  41478. return o < 10 ? "0" + o : o;
  41479. }
  41480. C.exports = n, n.prototype.encode = function(o, c) {
  41481. return this.tree._encode(o, c).join();
  41482. }, e(a, s), a.prototype._encodeComposite = function(o, c, r, h) {
  41483. const b = function(Z, p, Y, R) {
  41484. let X;
  41485. if (Z === "seqof" ? Z = "seq" : Z === "setof" && (Z = "set"), l.tagByName.hasOwnProperty(Z)) X = l.tagByName[Z];
  41486. else {
  41487. if (typeof Z != "number" || (0 | Z) !== Z) return R.error("Unknown tag: " + Z);
  41488. X = Z;
  41489. }
  41490. return X >= 31 ? R.error("Multi-octet tag encoding unsupported") : (p || (X |= 32), X |= l.tagClassByName[Y || "universal"] << 6, X);
  41491. }(o, c, r, this.reporter);
  41492. if (h.length < 128) {
  41493. const Z = A.alloc(2);
  41494. return Z[0] = b, Z[1] = h.length, this._createEncoderBuffer([Z, h]);
  41495. }
  41496. let u = 1;
  41497. for (let Z = h.length; Z >= 256; Z >>= 8) u++;
  41498. const m = A.alloc(2 + u);
  41499. m[0] = b, m[1] = 128 | u;
  41500. for (let Z = 1 + u, p = h.length; p > 0; Z--, p >>= 8) m[Z] = 255 & p;
  41501. return this._createEncoderBuffer([m, h]);
  41502. }, a.prototype._encodeStr = function(o, c) {
  41503. if (c === "bitstr") return this._createEncoderBuffer([0 | o.unused, o.data]);
  41504. if (c === "bmpstr") {
  41505. const r = A.alloc(2 * o.length);
  41506. for (let h = 0; h < o.length; h++) r.writeUInt16BE(o.charCodeAt(h), 2 * h);
  41507. return this._createEncoderBuffer(r);
  41508. }
  41509. return c === "numstr" ? this._isNumstr(o) ? this._createEncoderBuffer(o) : this.reporter.error("Encoding of string type: numstr supports only digits and space") : c === "printstr" ? this._isPrintstr(o) ? this._createEncoderBuffer(o) : this.reporter.error("Encoding of string type: printstr supports only latin upper and lower case letters, digits, space, apostrophe, left and rigth parenthesis, plus sign, comma, hyphen, dot, slash, colon, equal sign, question mark") : /str$/.test(c) || c === "objDesc" ? this._createEncoderBuffer(o) : this.reporter.error("Encoding of string type: " + c + " unsupported");
  41510. }, a.prototype._encodeObjid = function(o, c, r) {
  41511. if (typeof o == "string") {
  41512. if (!c) return this.reporter.error("string objid given, but no values map found");
  41513. if (!c.hasOwnProperty(o)) return this.reporter.error("objid not found in values map");
  41514. o = c[o].split(/[\s.]+/g);
  41515. for (let m = 0; m < o.length; m++) o[m] |= 0;
  41516. } else if (Array.isArray(o)) {
  41517. o = o.slice();
  41518. for (let m = 0; m < o.length; m++) o[m] |= 0;
  41519. }
  41520. if (!Array.isArray(o)) return this.reporter.error("objid() should be either array or string, got: " + JSON.stringify(o));
  41521. if (!r) {
  41522. if (o[1] >= 40) return this.reporter.error("Second objid identifier OOB");
  41523. o.splice(0, 2, 40 * o[0] + o[1]);
  41524. }
  41525. let h = 0;
  41526. for (let m = 0; m < o.length; m++) {
  41527. let Z = o[m];
  41528. for (h++; Z >= 128; Z >>= 7) h++;
  41529. }
  41530. const b = A.alloc(h);
  41531. let u = b.length - 1;
  41532. for (let m = o.length - 1; m >= 0; m--) {
  41533. let Z = o[m];
  41534. for (b[u--] = 127 & Z; (Z >>= 7) > 0; ) b[u--] = 128 | 127 & Z;
  41535. }
  41536. return this._createEncoderBuffer(b);
  41537. }, a.prototype._encodeTime = function(o, c) {
  41538. let r;
  41539. const h = new Date(o);
  41540. return c === "gentime" ? r = [d(h.getUTCFullYear()), d(h.getUTCMonth() + 1), d(h.getUTCDate()), d(h.getUTCHours()), d(h.getUTCMinutes()), d(h.getUTCSeconds()), "Z"].join("") : c === "utctime" ? r = [d(h.getUTCFullYear() % 100), d(h.getUTCMonth() + 1), d(h.getUTCDate()), d(h.getUTCHours()), d(h.getUTCMinutes()), d(h.getUTCSeconds()), "Z"].join("") : this.reporter.error("Encoding " + c + " time is not supported yet"), this._encodeStr(r, "octstr");
  41541. }, a.prototype._encodeNull = function() {
  41542. return this._createEncoderBuffer("");
  41543. }, a.prototype._encodeInt = function(o, c) {
  41544. if (typeof o == "string") {
  41545. if (!c) return this.reporter.error("String int or enum given, but no values map");
  41546. if (!c.hasOwnProperty(o)) return this.reporter.error("Values map doesn't contain: " + JSON.stringify(o));
  41547. o = c[o];
  41548. }
  41549. if (typeof o != "number" && !A.isBuffer(o)) {
  41550. const b = o.toArray();
  41551. !o.sign && 128 & b[0] && b.unshift(0), o = A.from(b);
  41552. }
  41553. if (A.isBuffer(o)) {
  41554. let b = o.length;
  41555. o.length === 0 && b++;
  41556. const u = A.alloc(b);
  41557. return o.copy(u), o.length === 0 && (u[0] = 0), this._createEncoderBuffer(u);
  41558. }
  41559. if (o < 128) return this._createEncoderBuffer(o);
  41560. if (o < 256) return this._createEncoderBuffer([0, o]);
  41561. let r = 1;
  41562. for (let b = o; b >= 256; b >>= 8) r++;
  41563. const h = new Array(r);
  41564. for (let b = h.length - 1; b >= 0; b--) h[b] = 255 & o, o >>= 8;
  41565. return 128 & h[0] && h.unshift(0), this._createEncoderBuffer(A.from(h));
  41566. }, a.prototype._encodeBool = function(o) {
  41567. return this._createEncoderBuffer(o ? 255 : 0);
  41568. }, a.prototype._use = function(o, c) {
  41569. return typeof o == "function" && (o = o(c)), o._getEncoder("der").tree;
  41570. }, a.prototype._skipDefault = function(o, c, r) {
  41571. const h = this._baseState;
  41572. let b;
  41573. if (h.default === null) return !1;
  41574. const u = o.join();
  41575. if (h.defaultBuffer === void 0 && (h.defaultBuffer = this._encodeValue(h.default, c, r).join()), u.length !== h.defaultBuffer.length) return !1;
  41576. for (b = 0; b < u.length; b++) if (u[b] !== h.defaultBuffer[b]) return !1;
  41577. return !0;
  41578. };
  41579. }, { "../base/node": 174, "../constants/der": 176, inherits: 440, "safer-buffer": 495 }], 182: [function(g, C, i) {
  41580. const e = i;
  41581. e.der = g("./der"), e.pem = g("./pem");
  41582. }, { "./der": 181, "./pem": 183 }], 183: [function(g, C, i) {
  41583. const e = g("inherits"), A = g("./der");
  41584. function s(l) {
  41585. A.call(this, l), this.enc = "pem";
  41586. }
  41587. e(s, A), C.exports = s, s.prototype.encode = function(l, n) {
  41588. const a = A.prototype.encode.call(this, l).toString("base64"), d = ["-----BEGIN " + n.label + "-----"];
  41589. for (let o = 0; o < a.length; o += 64) d.push(a.slice(o, o + 64));
  41590. return d.push("-----END " + n.label + "-----"), d.join(`
  41591. `);
  41592. };
  41593. }, { "./der": 181, inherits: 440 }], 184: [function(g, C, i) {
  41594. (function(e, A) {
  41595. function s(V, N) {
  41596. if (!V) throw new Error(N || "Assertion failed");
  41597. }
  41598. function l(V, N) {
  41599. V.super_ = N;
  41600. var B = function() {
  41601. };
  41602. B.prototype = N.prototype, V.prototype = new B(), V.prototype.constructor = V;
  41603. }
  41604. function n(V, N, B) {
  41605. if (n.isBN(V)) return V;
  41606. this.negative = 0, this.words = null, this.length = 0, this.red = null, V !== null && (N !== "le" && N !== "be" || (B = N, N = 10), this._init(V || 0, N || 10, B || "be"));
  41607. }
  41608. var a;
  41609. typeof e == "object" ? e.exports = n : (void 0).BN = n, n.BN = n, n.wordSize = 26;
  41610. try {
  41611. a = typeof window < "u" && window.Buffer !== void 0 ? window.Buffer : g("buffer").Buffer;
  41612. } catch {
  41613. }
  41614. function d(V, N) {
  41615. var B = V.charCodeAt(N);
  41616. return B >= 65 && B <= 70 ? B - 55 : B >= 97 && B <= 102 ? B - 87 : B - 48 & 15;
  41617. }
  41618. function o(V, N, B) {
  41619. var G = d(V, B);
  41620. return B - 1 >= N && (G |= d(V, B - 1) << 4), G;
  41621. }
  41622. function c(V, N, B, G) {
  41623. for (var w = 0, W = Math.min(V.length, B), y = N; y < W; y++) {
  41624. var f = V.charCodeAt(y) - 48;
  41625. w *= G, w += f >= 49 ? f - 49 + 10 : f >= 17 ? f - 17 + 10 : f;
  41626. }
  41627. return w;
  41628. }
  41629. n.isBN = function(V) {
  41630. return V instanceof n || V !== null && typeof V == "object" && V.constructor.wordSize === n.wordSize && Array.isArray(V.words);
  41631. }, n.max = function(V, N) {
  41632. return V.cmp(N) > 0 ? V : N;
  41633. }, n.min = function(V, N) {
  41634. return V.cmp(N) < 0 ? V : N;
  41635. }, n.prototype._init = function(V, N, B) {
  41636. if (typeof V == "number") return this._initNumber(V, N, B);
  41637. if (typeof V == "object") return this._initArray(V, N, B);
  41638. N === "hex" && (N = 16), s(N === (0 | N) && N >= 2 && N <= 36);
  41639. var G = 0;
  41640. (V = V.toString().replace(/\s+/g, ""))[0] === "-" && (G++, this.negative = 1), G < V.length && (N === 16 ? this._parseHex(V, G, B) : (this._parseBase(V, N, G), B === "le" && this._initArray(this.toArray(), N, B)));
  41641. }, n.prototype._initNumber = function(V, N, B) {
  41642. V < 0 && (this.negative = 1, V = -V), V < 67108864 ? (this.words = [67108863 & V], this.length = 1) : V < 4503599627370496 ? (this.words = [67108863 & V, V / 67108864 & 67108863], this.length = 2) : (s(V < 9007199254740992), this.words = [67108863 & V, V / 67108864 & 67108863, 1], this.length = 3), B === "le" && this._initArray(this.toArray(), N, B);
  41643. }, n.prototype._initArray = function(V, N, B) {
  41644. if (s(typeof V.length == "number"), V.length <= 0) return this.words = [0], this.length = 1, this;
  41645. this.length = Math.ceil(V.length / 3), this.words = new Array(this.length);
  41646. for (var G = 0; G < this.length; G++) this.words[G] = 0;
  41647. var w, W, y = 0;
  41648. if (B === "be") for (G = V.length - 1, w = 0; G >= 0; G -= 3) W = V[G] | V[G - 1] << 8 | V[G - 2] << 16, this.words[w] |= W << y & 67108863, this.words[w + 1] = W >>> 26 - y & 67108863, (y += 24) >= 26 && (y -= 26, w++);
  41649. else if (B === "le") for (G = 0, w = 0; G < V.length; G += 3) W = V[G] | V[G + 1] << 8 | V[G + 2] << 16, this.words[w] |= W << y & 67108863, this.words[w + 1] = W >>> 26 - y & 67108863, (y += 24) >= 26 && (y -= 26, w++);
  41650. return this.strip();
  41651. }, n.prototype._parseHex = function(V, N, B) {
  41652. this.length = Math.ceil((V.length - N) / 6), this.words = new Array(this.length);
  41653. for (var G = 0; G < this.length; G++) this.words[G] = 0;
  41654. var w, W = 0, y = 0;
  41655. if (B === "be") for (G = V.length - 1; G >= N; G -= 2) w = o(V, N, G) << W, this.words[y] |= 67108863 & w, W >= 18 ? (W -= 18, y += 1, this.words[y] |= w >>> 26) : W += 8;
  41656. else for (G = (V.length - N) % 2 == 0 ? N + 1 : N; G < V.length; G += 2) w = o(V, N, G) << W, this.words[y] |= 67108863 & w, W >= 18 ? (W -= 18, y += 1, this.words[y] |= w >>> 26) : W += 8;
  41657. this.strip();
  41658. }, n.prototype._parseBase = function(V, N, B) {
  41659. this.words = [0], this.length = 1;
  41660. for (var G = 0, w = 1; w <= 67108863; w *= N) G++;
  41661. G--, w = w / N | 0;
  41662. for (var W = V.length - B, y = W % G, f = Math.min(W, W - y) + B, D = 0, F = B; F < f; F += G) D = c(V, F, F + G, N), this.imuln(w), this.words[0] + D < 67108864 ? this.words[0] += D : this._iaddn(D);
  41663. if (y !== 0) {
  41664. var T = 1;
  41665. for (D = c(V, F, V.length, N), F = 0; F < y; F++) T *= N;
  41666. this.imuln(T), this.words[0] + D < 67108864 ? this.words[0] += D : this._iaddn(D);
  41667. }
  41668. this.strip();
  41669. }, n.prototype.copy = function(V) {
  41670. V.words = new Array(this.length);
  41671. for (var N = 0; N < this.length; N++) V.words[N] = this.words[N];
  41672. V.length = this.length, V.negative = this.negative, V.red = this.red;
  41673. }, n.prototype.clone = function() {
  41674. var V = new n(null);
  41675. return this.copy(V), V;
  41676. }, n.prototype._expand = function(V) {
  41677. for (; this.length < V; ) this.words[this.length++] = 0;
  41678. return this;
  41679. }, n.prototype.strip = function() {
  41680. for (; this.length > 1 && this.words[this.length - 1] === 0; ) this.length--;
  41681. return this._normSign();
  41682. }, n.prototype._normSign = function() {
  41683. return this.length === 1 && this.words[0] === 0 && (this.negative = 0), this;
  41684. }, n.prototype.inspect = function() {
  41685. return (this.red ? "<BN-R: " : "<BN: ") + this.toString(16) + ">";
  41686. };
  41687. var r = ["", "0", "00", "000", "0000", "00000", "000000", "0000000", "00000000", "000000000", "0000000000", "00000000000", "000000000000", "0000000000000", "00000000000000", "000000000000000", "0000000000000000", "00000000000000000", "000000000000000000", "0000000000000000000", "00000000000000000000", "000000000000000000000", "0000000000000000000000", "00000000000000000000000", "000000000000000000000000", "0000000000000000000000000"], h = [0, 0, 25, 16, 12, 11, 10, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], b = [0, 0, 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, 43046721, 1e7, 19487171, 35831808, 62748517, 7529536, 11390625, 16777216, 24137569, 34012224, 47045881, 64e6, 4084101, 5153632, 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, 243e5, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176];
  41688. function u(V, N, B) {
  41689. B.negative = N.negative ^ V.negative;
  41690. var G = V.length + N.length | 0;
  41691. B.length = G, G = G - 1 | 0;
  41692. var w = 0 | V.words[0], W = 0 | N.words[0], y = w * W, f = 67108863 & y, D = y / 67108864 | 0;
  41693. B.words[0] = f;
  41694. for (var F = 1; F < G; F++) {
  41695. for (var T = D >>> 26, Q = 67108863 & D, P = Math.min(F, N.length - 1), L = Math.max(0, F - V.length + 1); L <= P; L++) {
  41696. var E = F - L | 0;
  41697. T += (y = (w = 0 | V.words[E]) * (W = 0 | N.words[L]) + Q) / 67108864 | 0, Q = 67108863 & y;
  41698. }
  41699. B.words[F] = 0 | Q, D = 0 | T;
  41700. }
  41701. return D !== 0 ? B.words[F] = 0 | D : B.length--, B.strip();
  41702. }
  41703. n.prototype.toString = function(V, N) {
  41704. var B;
  41705. if (N = 0 | N || 1, (V = V || 10) === 16 || V === "hex") {
  41706. B = "";
  41707. for (var G = 0, w = 0, W = 0; W < this.length; W++) {
  41708. var y = this.words[W], f = (16777215 & (y << G | w)).toString(16);
  41709. B = (w = y >>> 24 - G & 16777215) !== 0 || W !== this.length - 1 ? r[6 - f.length] + f + B : f + B, (G += 2) >= 26 && (G -= 26, W--);
  41710. }
  41711. for (w !== 0 && (B = w.toString(16) + B); B.length % N != 0; ) B = "0" + B;
  41712. return this.negative !== 0 && (B = "-" + B), B;
  41713. }
  41714. if (V === (0 | V) && V >= 2 && V <= 36) {
  41715. var D = h[V], F = b[V];
  41716. B = "";
  41717. var T = this.clone();
  41718. for (T.negative = 0; !T.isZero(); ) {
  41719. var Q = T.modn(F).toString(V);
  41720. B = (T = T.idivn(F)).isZero() ? Q + B : r[D - Q.length] + Q + B;
  41721. }
  41722. for (this.isZero() && (B = "0" + B); B.length % N != 0; ) B = "0" + B;
  41723. return this.negative !== 0 && (B = "-" + B), B;
  41724. }
  41725. s(!1, "Base should be between 2 and 36");
  41726. }, n.prototype.toNumber = function() {
  41727. var V = this.words[0];
  41728. return this.length === 2 ? V += 67108864 * this.words[1] : this.length === 3 && this.words[2] === 1 ? V += 4503599627370496 + 67108864 * this.words[1] : this.length > 2 && s(!1, "Number can only safely store up to 53 bits"), this.negative !== 0 ? -V : V;
  41729. }, n.prototype.toJSON = function() {
  41730. return this.toString(16);
  41731. }, n.prototype.toBuffer = function(V, N) {
  41732. return s(a !== void 0), this.toArrayLike(a, V, N);
  41733. }, n.prototype.toArray = function(V, N) {
  41734. return this.toArrayLike(Array, V, N);
  41735. }, n.prototype.toArrayLike = function(V, N, B) {
  41736. var G = this.byteLength(), w = B || Math.max(1, G);
  41737. s(G <= w, "byte array longer than desired length"), s(w > 0, "Requested array length <= 0"), this.strip();
  41738. var W, y, f = N === "le", D = new V(w), F = this.clone();
  41739. if (f) {
  41740. for (y = 0; !F.isZero(); y++) W = F.andln(255), F.iushrn(8), D[y] = W;
  41741. for (; y < w; y++) D[y] = 0;
  41742. } else {
  41743. for (y = 0; y < w - G; y++) D[y] = 0;
  41744. for (y = 0; !F.isZero(); y++) W = F.andln(255), F.iushrn(8), D[w - y - 1] = W;
  41745. }
  41746. return D;
  41747. }, Math.clz32 ? n.prototype._countBits = function(V) {
  41748. return 32 - Math.clz32(V);
  41749. } : n.prototype._countBits = function(V) {
  41750. var N = V, B = 0;
  41751. return N >= 4096 && (B += 13, N >>>= 13), N >= 64 && (B += 7, N >>>= 7), N >= 8 && (B += 4, N >>>= 4), N >= 2 && (B += 2, N >>>= 2), B + N;
  41752. }, n.prototype._zeroBits = function(V) {
  41753. if (V === 0) return 26;
  41754. var N = V, B = 0;
  41755. return (8191 & N) == 0 && (B += 13, N >>>= 13), (127 & N) == 0 && (B += 7, N >>>= 7), (15 & N) == 0 && (B += 4, N >>>= 4), (3 & N) == 0 && (B += 2, N >>>= 2), (1 & N) == 0 && B++, B;
  41756. }, n.prototype.bitLength = function() {
  41757. var V = this.words[this.length - 1], N = this._countBits(V);
  41758. return 26 * (this.length - 1) + N;
  41759. }, n.prototype.zeroBits = function() {
  41760. if (this.isZero()) return 0;
  41761. for (var V = 0, N = 0; N < this.length; N++) {
  41762. var B = this._zeroBits(this.words[N]);
  41763. if (V += B, B !== 26) break;
  41764. }
  41765. return V;
  41766. }, n.prototype.byteLength = function() {
  41767. return Math.ceil(this.bitLength() / 8);
  41768. }, n.prototype.toTwos = function(V) {
  41769. return this.negative !== 0 ? this.abs().inotn(V).iaddn(1) : this.clone();
  41770. }, n.prototype.fromTwos = function(V) {
  41771. return this.testn(V - 1) ? this.notn(V).iaddn(1).ineg() : this.clone();
  41772. }, n.prototype.isNeg = function() {
  41773. return this.negative !== 0;
  41774. }, n.prototype.neg = function() {
  41775. return this.clone().ineg();
  41776. }, n.prototype.ineg = function() {
  41777. return this.isZero() || (this.negative ^= 1), this;
  41778. }, n.prototype.iuor = function(V) {
  41779. for (; this.length < V.length; ) this.words[this.length++] = 0;
  41780. for (var N = 0; N < V.length; N++) this.words[N] = this.words[N] | V.words[N];
  41781. return this.strip();
  41782. }, n.prototype.ior = function(V) {
  41783. return s((this.negative | V.negative) == 0), this.iuor(V);
  41784. }, n.prototype.or = function(V) {
  41785. return this.length > V.length ? this.clone().ior(V) : V.clone().ior(this);
  41786. }, n.prototype.uor = function(V) {
  41787. return this.length > V.length ? this.clone().iuor(V) : V.clone().iuor(this);
  41788. }, n.prototype.iuand = function(V) {
  41789. var N;
  41790. N = this.length > V.length ? V : this;
  41791. for (var B = 0; B < N.length; B++) this.words[B] = this.words[B] & V.words[B];
  41792. return this.length = N.length, this.strip();
  41793. }, n.prototype.iand = function(V) {
  41794. return s((this.negative | V.negative) == 0), this.iuand(V);
  41795. }, n.prototype.and = function(V) {
  41796. return this.length > V.length ? this.clone().iand(V) : V.clone().iand(this);
  41797. }, n.prototype.uand = function(V) {
  41798. return this.length > V.length ? this.clone().iuand(V) : V.clone().iuand(this);
  41799. }, n.prototype.iuxor = function(V) {
  41800. var N, B;
  41801. this.length > V.length ? (N = this, B = V) : (N = V, B = this);
  41802. for (var G = 0; G < B.length; G++) this.words[G] = N.words[G] ^ B.words[G];
  41803. if (this !== N) for (; G < N.length; G++) this.words[G] = N.words[G];
  41804. return this.length = N.length, this.strip();
  41805. }, n.prototype.ixor = function(V) {
  41806. return s((this.negative | V.negative) == 0), this.iuxor(V);
  41807. }, n.prototype.xor = function(V) {
  41808. return this.length > V.length ? this.clone().ixor(V) : V.clone().ixor(this);
  41809. }, n.prototype.uxor = function(V) {
  41810. return this.length > V.length ? this.clone().iuxor(V) : V.clone().iuxor(this);
  41811. }, n.prototype.inotn = function(V) {
  41812. s(typeof V == "number" && V >= 0);
  41813. var N = 0 | Math.ceil(V / 26), B = V % 26;
  41814. this._expand(N), B > 0 && N--;
  41815. for (var G = 0; G < N; G++) this.words[G] = 67108863 & ~this.words[G];
  41816. return B > 0 && (this.words[G] = ~this.words[G] & 67108863 >> 26 - B), this.strip();
  41817. }, n.prototype.notn = function(V) {
  41818. return this.clone().inotn(V);
  41819. }, n.prototype.setn = function(V, N) {
  41820. s(typeof V == "number" && V >= 0);
  41821. var B = V / 26 | 0, G = V % 26;
  41822. return this._expand(B + 1), this.words[B] = N ? this.words[B] | 1 << G : this.words[B] & ~(1 << G), this.strip();
  41823. }, n.prototype.iadd = function(V) {
  41824. var N, B, G;
  41825. if (this.negative !== 0 && V.negative === 0) return this.negative = 0, N = this.isub(V), this.negative ^= 1, this._normSign();
  41826. if (this.negative === 0 && V.negative !== 0) return V.negative = 0, N = this.isub(V), V.negative = 1, N._normSign();
  41827. this.length > V.length ? (B = this, G = V) : (B = V, G = this);
  41828. for (var w = 0, W = 0; W < G.length; W++) N = (0 | B.words[W]) + (0 | G.words[W]) + w, this.words[W] = 67108863 & N, w = N >>> 26;
  41829. for (; w !== 0 && W < B.length; W++) N = (0 | B.words[W]) + w, this.words[W] = 67108863 & N, w = N >>> 26;
  41830. if (this.length = B.length, w !== 0) this.words[this.length] = w, this.length++;
  41831. else if (B !== this) for (; W < B.length; W++) this.words[W] = B.words[W];
  41832. return this;
  41833. }, n.prototype.add = function(V) {
  41834. var N;
  41835. return V.negative !== 0 && this.negative === 0 ? (V.negative = 0, N = this.sub(V), V.negative ^= 1, N) : V.negative === 0 && this.negative !== 0 ? (this.negative = 0, N = V.sub(this), this.negative = 1, N) : this.length > V.length ? this.clone().iadd(V) : V.clone().iadd(this);
  41836. }, n.prototype.isub = function(V) {
  41837. if (V.negative !== 0) {
  41838. V.negative = 0;
  41839. var N = this.iadd(V);
  41840. return V.negative = 1, N._normSign();
  41841. }
  41842. if (this.negative !== 0) return this.negative = 0, this.iadd(V), this.negative = 1, this._normSign();
  41843. var B, G, w = this.cmp(V);
  41844. if (w === 0) return this.negative = 0, this.length = 1, this.words[0] = 0, this;
  41845. w > 0 ? (B = this, G = V) : (B = V, G = this);
  41846. for (var W = 0, y = 0; y < G.length; y++) W = (N = (0 | B.words[y]) - (0 | G.words[y]) + W) >> 26, this.words[y] = 67108863 & N;
  41847. for (; W !== 0 && y < B.length; y++) W = (N = (0 | B.words[y]) + W) >> 26, this.words[y] = 67108863 & N;
  41848. if (W === 0 && y < B.length && B !== this) for (; y < B.length; y++) this.words[y] = B.words[y];
  41849. return this.length = Math.max(this.length, y), B !== this && (this.negative = 1), this.strip();
  41850. }, n.prototype.sub = function(V) {
  41851. return this.clone().isub(V);
  41852. };
  41853. var m = function(V, N, B) {
  41854. var G, w, W, y = V.words, f = N.words, D = B.words, F = 0, T = 0 | y[0], Q = 8191 & T, P = T >>> 13, L = 0 | y[1], E = 8191 & L, J = L >>> 13, k = 0 | y[2], j = 8191 & k, q = k >>> 13, Cg = 0 | y[3], Ig = 8191 & Cg, x = Cg >>> 13, Ag = 0 | y[4], eg = 8191 & Ag, O = Ag >>> 13, _ = 0 | y[5], gg = 8191 & _, lg = _ >>> 13, ng = 0 | y[6], sg = 8191 & ng, og = ng >>> 13, cg = 0 | y[7], rg = 8191 & cg, dg = cg >>> 13, Bg = 0 | y[8], Zg = 8191 & Bg, Xg = Bg >>> 13, Kg = 0 | y[9], kg = 8191 & Kg, Wg = Kg >>> 13, Ng = 0 | f[0], wg = 8191 & Ng, fg = Ng >>> 13, Jg = 0 | f[1], zg = 8191 & Jg, cI = Jg >>> 13, YI = 0 | f[2], Eg = 8191 & YI, aI = YI >>> 13, dI = 0 | f[3], _g = 8191 & dI, xI = dI >>> 13, SI = 0 | f[4], eI = 8191 & SI, NI = SI >>> 13, EI = 0 | f[5], oI = 8191 & EI, LI = EI >>> 13, pg = 0 | f[6], uI = 8191 & pg, hg = pg >>> 13, bg = 0 | f[7], Rg = 8191 & bg, Tg = bg >>> 13, rI = 0 | f[8], jg = 8191 & rI, GI = rI >>> 13, nI = 0 | f[9], CI = 8191 & nI, WI = nI >>> 13;
  41855. B.negative = V.negative ^ N.negative, B.length = 19;
  41856. var mI = (F + (G = Math.imul(Q, wg)) | 0) + ((8191 & (w = (w = Math.imul(Q, fg)) + Math.imul(P, wg) | 0)) << 13) | 0;
  41857. F = ((W = Math.imul(P, fg)) + (w >>> 13) | 0) + (mI >>> 26) | 0, mI &= 67108863, G = Math.imul(E, wg), w = (w = Math.imul(E, fg)) + Math.imul(J, wg) | 0, W = Math.imul(J, fg);
  41858. var VI = (F + (G = G + Math.imul(Q, zg) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, cI) | 0) + Math.imul(P, zg) | 0)) << 13) | 0;
  41859. F = ((W = W + Math.imul(P, cI) | 0) + (w >>> 13) | 0) + (VI >>> 26) | 0, VI &= 67108863, G = Math.imul(j, wg), w = (w = Math.imul(j, fg)) + Math.imul(q, wg) | 0, W = Math.imul(q, fg), G = G + Math.imul(E, zg) | 0, w = (w = w + Math.imul(E, cI) | 0) + Math.imul(J, zg) | 0, W = W + Math.imul(J, cI) | 0;
  41860. var yC = (F + (G = G + Math.imul(Q, Eg) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, aI) | 0) + Math.imul(P, Eg) | 0)) << 13) | 0;
  41861. F = ((W = W + Math.imul(P, aI) | 0) + (w >>> 13) | 0) + (yC >>> 26) | 0, yC &= 67108863, G = Math.imul(Ig, wg), w = (w = Math.imul(Ig, fg)) + Math.imul(x, wg) | 0, W = Math.imul(x, fg), G = G + Math.imul(j, zg) | 0, w = (w = w + Math.imul(j, cI) | 0) + Math.imul(q, zg) | 0, W = W + Math.imul(q, cI) | 0, G = G + Math.imul(E, Eg) | 0, w = (w = w + Math.imul(E, aI) | 0) + Math.imul(J, Eg) | 0, W = W + Math.imul(J, aI) | 0;
  41862. var gC = (F + (G = G + Math.imul(Q, _g) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, xI) | 0) + Math.imul(P, _g) | 0)) << 13) | 0;
  41863. F = ((W = W + Math.imul(P, xI) | 0) + (w >>> 13) | 0) + (gC >>> 26) | 0, gC &= 67108863, G = Math.imul(eg, wg), w = (w = Math.imul(eg, fg)) + Math.imul(O, wg) | 0, W = Math.imul(O, fg), G = G + Math.imul(Ig, zg) | 0, w = (w = w + Math.imul(Ig, cI) | 0) + Math.imul(x, zg) | 0, W = W + Math.imul(x, cI) | 0, G = G + Math.imul(j, Eg) | 0, w = (w = w + Math.imul(j, aI) | 0) + Math.imul(q, Eg) | 0, W = W + Math.imul(q, aI) | 0, G = G + Math.imul(E, _g) | 0, w = (w = w + Math.imul(E, xI) | 0) + Math.imul(J, _g) | 0, W = W + Math.imul(J, xI) | 0;
  41864. var It = (F + (G = G + Math.imul(Q, eI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, NI) | 0) + Math.imul(P, eI) | 0)) << 13) | 0;
  41865. F = ((W = W + Math.imul(P, NI) | 0) + (w >>> 13) | 0) + (It >>> 26) | 0, It &= 67108863, G = Math.imul(gg, wg), w = (w = Math.imul(gg, fg)) + Math.imul(lg, wg) | 0, W = Math.imul(lg, fg), G = G + Math.imul(eg, zg) | 0, w = (w = w + Math.imul(eg, cI) | 0) + Math.imul(O, zg) | 0, W = W + Math.imul(O, cI) | 0, G = G + Math.imul(Ig, Eg) | 0, w = (w = w + Math.imul(Ig, aI) | 0) + Math.imul(x, Eg) | 0, W = W + Math.imul(x, aI) | 0, G = G + Math.imul(j, _g) | 0, w = (w = w + Math.imul(j, xI) | 0) + Math.imul(q, _g) | 0, W = W + Math.imul(q, xI) | 0, G = G + Math.imul(E, eI) | 0, w = (w = w + Math.imul(E, NI) | 0) + Math.imul(J, eI) | 0, W = W + Math.imul(J, NI) | 0;
  41866. var dC = (F + (G = G + Math.imul(Q, oI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, LI) | 0) + Math.imul(P, oI) | 0)) << 13) | 0;
  41867. F = ((W = W + Math.imul(P, LI) | 0) + (w >>> 13) | 0) + (dC >>> 26) | 0, dC &= 67108863, G = Math.imul(sg, wg), w = (w = Math.imul(sg, fg)) + Math.imul(og, wg) | 0, W = Math.imul(og, fg), G = G + Math.imul(gg, zg) | 0, w = (w = w + Math.imul(gg, cI) | 0) + Math.imul(lg, zg) | 0, W = W + Math.imul(lg, cI) | 0, G = G + Math.imul(eg, Eg) | 0, w = (w = w + Math.imul(eg, aI) | 0) + Math.imul(O, Eg) | 0, W = W + Math.imul(O, aI) | 0, G = G + Math.imul(Ig, _g) | 0, w = (w = w + Math.imul(Ig, xI) | 0) + Math.imul(x, _g) | 0, W = W + Math.imul(x, xI) | 0, G = G + Math.imul(j, eI) | 0, w = (w = w + Math.imul(j, NI) | 0) + Math.imul(q, eI) | 0, W = W + Math.imul(q, NI) | 0, G = G + Math.imul(E, oI) | 0, w = (w = w + Math.imul(E, LI) | 0) + Math.imul(J, oI) | 0, W = W + Math.imul(J, LI) | 0;
  41868. var Tt = (F + (G = G + Math.imul(Q, uI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, hg) | 0) + Math.imul(P, uI) | 0)) << 13) | 0;
  41869. F = ((W = W + Math.imul(P, hg) | 0) + (w >>> 13) | 0) + (Tt >>> 26) | 0, Tt &= 67108863, G = Math.imul(rg, wg), w = (w = Math.imul(rg, fg)) + Math.imul(dg, wg) | 0, W = Math.imul(dg, fg), G = G + Math.imul(sg, zg) | 0, w = (w = w + Math.imul(sg, cI) | 0) + Math.imul(og, zg) | 0, W = W + Math.imul(og, cI) | 0, G = G + Math.imul(gg, Eg) | 0, w = (w = w + Math.imul(gg, aI) | 0) + Math.imul(lg, Eg) | 0, W = W + Math.imul(lg, aI) | 0, G = G + Math.imul(eg, _g) | 0, w = (w = w + Math.imul(eg, xI) | 0) + Math.imul(O, _g) | 0, W = W + Math.imul(O, xI) | 0, G = G + Math.imul(Ig, eI) | 0, w = (w = w + Math.imul(Ig, NI) | 0) + Math.imul(x, eI) | 0, W = W + Math.imul(x, NI) | 0, G = G + Math.imul(j, oI) | 0, w = (w = w + Math.imul(j, LI) | 0) + Math.imul(q, oI) | 0, W = W + Math.imul(q, LI) | 0, G = G + Math.imul(E, uI) | 0, w = (w = w + Math.imul(E, hg) | 0) + Math.imul(J, uI) | 0, W = W + Math.imul(J, hg) | 0;
  41870. var ag = (F + (G = G + Math.imul(Q, Rg) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, Tg) | 0) + Math.imul(P, Rg) | 0)) << 13) | 0;
  41871. F = ((W = W + Math.imul(P, Tg) | 0) + (w >>> 13) | 0) + (ag >>> 26) | 0, ag &= 67108863, G = Math.imul(Zg, wg), w = (w = Math.imul(Zg, fg)) + Math.imul(Xg, wg) | 0, W = Math.imul(Xg, fg), G = G + Math.imul(rg, zg) | 0, w = (w = w + Math.imul(rg, cI) | 0) + Math.imul(dg, zg) | 0, W = W + Math.imul(dg, cI) | 0, G = G + Math.imul(sg, Eg) | 0, w = (w = w + Math.imul(sg, aI) | 0) + Math.imul(og, Eg) | 0, W = W + Math.imul(og, aI) | 0, G = G + Math.imul(gg, _g) | 0, w = (w = w + Math.imul(gg, xI) | 0) + Math.imul(lg, _g) | 0, W = W + Math.imul(lg, xI) | 0, G = G + Math.imul(eg, eI) | 0, w = (w = w + Math.imul(eg, NI) | 0) + Math.imul(O, eI) | 0, W = W + Math.imul(O, NI) | 0, G = G + Math.imul(Ig, oI) | 0, w = (w = w + Math.imul(Ig, LI) | 0) + Math.imul(x, oI) | 0, W = W + Math.imul(x, LI) | 0, G = G + Math.imul(j, uI) | 0, w = (w = w + Math.imul(j, hg) | 0) + Math.imul(q, uI) | 0, W = W + Math.imul(q, hg) | 0, G = G + Math.imul(E, Rg) | 0, w = (w = w + Math.imul(E, Tg) | 0) + Math.imul(J, Rg) | 0, W = W + Math.imul(J, Tg) | 0;
  41872. var mg = (F + (G = G + Math.imul(Q, jg) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, GI) | 0) + Math.imul(P, jg) | 0)) << 13) | 0;
  41873. F = ((W = W + Math.imul(P, GI) | 0) + (w >>> 13) | 0) + (mg >>> 26) | 0, mg &= 67108863, G = Math.imul(kg, wg), w = (w = Math.imul(kg, fg)) + Math.imul(Wg, wg) | 0, W = Math.imul(Wg, fg), G = G + Math.imul(Zg, zg) | 0, w = (w = w + Math.imul(Zg, cI) | 0) + Math.imul(Xg, zg) | 0, W = W + Math.imul(Xg, cI) | 0, G = G + Math.imul(rg, Eg) | 0, w = (w = w + Math.imul(rg, aI) | 0) + Math.imul(dg, Eg) | 0, W = W + Math.imul(dg, aI) | 0, G = G + Math.imul(sg, _g) | 0, w = (w = w + Math.imul(sg, xI) | 0) + Math.imul(og, _g) | 0, W = W + Math.imul(og, xI) | 0, G = G + Math.imul(gg, eI) | 0, w = (w = w + Math.imul(gg, NI) | 0) + Math.imul(lg, eI) | 0, W = W + Math.imul(lg, NI) | 0, G = G + Math.imul(eg, oI) | 0, w = (w = w + Math.imul(eg, LI) | 0) + Math.imul(O, oI) | 0, W = W + Math.imul(O, LI) | 0, G = G + Math.imul(Ig, uI) | 0, w = (w = w + Math.imul(Ig, hg) | 0) + Math.imul(x, uI) | 0, W = W + Math.imul(x, hg) | 0, G = G + Math.imul(j, Rg) | 0, w = (w = w + Math.imul(j, Tg) | 0) + Math.imul(q, Rg) | 0, W = W + Math.imul(q, Tg) | 0, G = G + Math.imul(E, jg) | 0, w = (w = w + Math.imul(E, GI) | 0) + Math.imul(J, jg) | 0, W = W + Math.imul(J, GI) | 0;
  41874. var Sg = (F + (G = G + Math.imul(Q, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, WI) | 0) + Math.imul(P, CI) | 0)) << 13) | 0;
  41875. F = ((W = W + Math.imul(P, WI) | 0) + (w >>> 13) | 0) + (Sg >>> 26) | 0, Sg &= 67108863, G = Math.imul(kg, zg), w = (w = Math.imul(kg, cI)) + Math.imul(Wg, zg) | 0, W = Math.imul(Wg, cI), G = G + Math.imul(Zg, Eg) | 0, w = (w = w + Math.imul(Zg, aI) | 0) + Math.imul(Xg, Eg) | 0, W = W + Math.imul(Xg, aI) | 0, G = G + Math.imul(rg, _g) | 0, w = (w = w + Math.imul(rg, xI) | 0) + Math.imul(dg, _g) | 0, W = W + Math.imul(dg, xI) | 0, G = G + Math.imul(sg, eI) | 0, w = (w = w + Math.imul(sg, NI) | 0) + Math.imul(og, eI) | 0, W = W + Math.imul(og, NI) | 0, G = G + Math.imul(gg, oI) | 0, w = (w = w + Math.imul(gg, LI) | 0) + Math.imul(lg, oI) | 0, W = W + Math.imul(lg, LI) | 0, G = G + Math.imul(eg, uI) | 0, w = (w = w + Math.imul(eg, hg) | 0) + Math.imul(O, uI) | 0, W = W + Math.imul(O, hg) | 0, G = G + Math.imul(Ig, Rg) | 0, w = (w = w + Math.imul(Ig, Tg) | 0) + Math.imul(x, Rg) | 0, W = W + Math.imul(x, Tg) | 0, G = G + Math.imul(j, jg) | 0, w = (w = w + Math.imul(j, GI) | 0) + Math.imul(q, jg) | 0, W = W + Math.imul(q, GI) | 0;
  41876. var Fg = (F + (G = G + Math.imul(E, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(E, WI) | 0) + Math.imul(J, CI) | 0)) << 13) | 0;
  41877. F = ((W = W + Math.imul(J, WI) | 0) + (w >>> 13) | 0) + (Fg >>> 26) | 0, Fg &= 67108863, G = Math.imul(kg, Eg), w = (w = Math.imul(kg, aI)) + Math.imul(Wg, Eg) | 0, W = Math.imul(Wg, aI), G = G + Math.imul(Zg, _g) | 0, w = (w = w + Math.imul(Zg, xI) | 0) + Math.imul(Xg, _g) | 0, W = W + Math.imul(Xg, xI) | 0, G = G + Math.imul(rg, eI) | 0, w = (w = w + Math.imul(rg, NI) | 0) + Math.imul(dg, eI) | 0, W = W + Math.imul(dg, NI) | 0, G = G + Math.imul(sg, oI) | 0, w = (w = w + Math.imul(sg, LI) | 0) + Math.imul(og, oI) | 0, W = W + Math.imul(og, LI) | 0, G = G + Math.imul(gg, uI) | 0, w = (w = w + Math.imul(gg, hg) | 0) + Math.imul(lg, uI) | 0, W = W + Math.imul(lg, hg) | 0, G = G + Math.imul(eg, Rg) | 0, w = (w = w + Math.imul(eg, Tg) | 0) + Math.imul(O, Rg) | 0, W = W + Math.imul(O, Tg) | 0, G = G + Math.imul(Ig, jg) | 0, w = (w = w + Math.imul(Ig, GI) | 0) + Math.imul(x, jg) | 0, W = W + Math.imul(x, GI) | 0;
  41878. var tI = (F + (G = G + Math.imul(j, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(j, WI) | 0) + Math.imul(q, CI) | 0)) << 13) | 0;
  41879. F = ((W = W + Math.imul(q, WI) | 0) + (w >>> 13) | 0) + (tI >>> 26) | 0, tI &= 67108863, G = Math.imul(kg, _g), w = (w = Math.imul(kg, xI)) + Math.imul(Wg, _g) | 0, W = Math.imul(Wg, xI), G = G + Math.imul(Zg, eI) | 0, w = (w = w + Math.imul(Zg, NI) | 0) + Math.imul(Xg, eI) | 0, W = W + Math.imul(Xg, NI) | 0, G = G + Math.imul(rg, oI) | 0, w = (w = w + Math.imul(rg, LI) | 0) + Math.imul(dg, oI) | 0, W = W + Math.imul(dg, LI) | 0, G = G + Math.imul(sg, uI) | 0, w = (w = w + Math.imul(sg, hg) | 0) + Math.imul(og, uI) | 0, W = W + Math.imul(og, hg) | 0, G = G + Math.imul(gg, Rg) | 0, w = (w = w + Math.imul(gg, Tg) | 0) + Math.imul(lg, Rg) | 0, W = W + Math.imul(lg, Tg) | 0, G = G + Math.imul(eg, jg) | 0, w = (w = w + Math.imul(eg, GI) | 0) + Math.imul(O, jg) | 0, W = W + Math.imul(O, GI) | 0;
  41880. var vg = (F + (G = G + Math.imul(Ig, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Ig, WI) | 0) + Math.imul(x, CI) | 0)) << 13) | 0;
  41881. F = ((W = W + Math.imul(x, WI) | 0) + (w >>> 13) | 0) + (vg >>> 26) | 0, vg &= 67108863, G = Math.imul(kg, eI), w = (w = Math.imul(kg, NI)) + Math.imul(Wg, eI) | 0, W = Math.imul(Wg, NI), G = G + Math.imul(Zg, oI) | 0, w = (w = w + Math.imul(Zg, LI) | 0) + Math.imul(Xg, oI) | 0, W = W + Math.imul(Xg, LI) | 0, G = G + Math.imul(rg, uI) | 0, w = (w = w + Math.imul(rg, hg) | 0) + Math.imul(dg, uI) | 0, W = W + Math.imul(dg, hg) | 0, G = G + Math.imul(sg, Rg) | 0, w = (w = w + Math.imul(sg, Tg) | 0) + Math.imul(og, Rg) | 0, W = W + Math.imul(og, Tg) | 0, G = G + Math.imul(gg, jg) | 0, w = (w = w + Math.imul(gg, GI) | 0) + Math.imul(lg, jg) | 0, W = W + Math.imul(lg, GI) | 0;
  41882. var xg = (F + (G = G + Math.imul(eg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(eg, WI) | 0) + Math.imul(O, CI) | 0)) << 13) | 0;
  41883. F = ((W = W + Math.imul(O, WI) | 0) + (w >>> 13) | 0) + (xg >>> 26) | 0, xg &= 67108863, G = Math.imul(kg, oI), w = (w = Math.imul(kg, LI)) + Math.imul(Wg, oI) | 0, W = Math.imul(Wg, LI), G = G + Math.imul(Zg, uI) | 0, w = (w = w + Math.imul(Zg, hg) | 0) + Math.imul(Xg, uI) | 0, W = W + Math.imul(Xg, hg) | 0, G = G + Math.imul(rg, Rg) | 0, w = (w = w + Math.imul(rg, Tg) | 0) + Math.imul(dg, Rg) | 0, W = W + Math.imul(dg, Tg) | 0, G = G + Math.imul(sg, jg) | 0, w = (w = w + Math.imul(sg, GI) | 0) + Math.imul(og, jg) | 0, W = W + Math.imul(og, GI) | 0;
  41884. var vI = (F + (G = G + Math.imul(gg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(gg, WI) | 0) + Math.imul(lg, CI) | 0)) << 13) | 0;
  41885. F = ((W = W + Math.imul(lg, WI) | 0) + (w >>> 13) | 0) + (vI >>> 26) | 0, vI &= 67108863, G = Math.imul(kg, uI), w = (w = Math.imul(kg, hg)) + Math.imul(Wg, uI) | 0, W = Math.imul(Wg, hg), G = G + Math.imul(Zg, Rg) | 0, w = (w = w + Math.imul(Zg, Tg) | 0) + Math.imul(Xg, Rg) | 0, W = W + Math.imul(Xg, Tg) | 0, G = G + Math.imul(rg, jg) | 0, w = (w = w + Math.imul(rg, GI) | 0) + Math.imul(dg, jg) | 0, W = W + Math.imul(dg, GI) | 0;
  41886. var fI = (F + (G = G + Math.imul(sg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(sg, WI) | 0) + Math.imul(og, CI) | 0)) << 13) | 0;
  41887. F = ((W = W + Math.imul(og, WI) | 0) + (w >>> 13) | 0) + (fI >>> 26) | 0, fI &= 67108863, G = Math.imul(kg, Rg), w = (w = Math.imul(kg, Tg)) + Math.imul(Wg, Rg) | 0, W = Math.imul(Wg, Tg), G = G + Math.imul(Zg, jg) | 0, w = (w = w + Math.imul(Zg, GI) | 0) + Math.imul(Xg, jg) | 0, W = W + Math.imul(Xg, GI) | 0;
  41888. var MI = (F + (G = G + Math.imul(rg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(rg, WI) | 0) + Math.imul(dg, CI) | 0)) << 13) | 0;
  41889. F = ((W = W + Math.imul(dg, WI) | 0) + (w >>> 13) | 0) + (MI >>> 26) | 0, MI &= 67108863, G = Math.imul(kg, jg), w = (w = Math.imul(kg, GI)) + Math.imul(Wg, jg) | 0, W = Math.imul(Wg, GI);
  41890. var hI = (F + (G = G + Math.imul(Zg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Zg, WI) | 0) + Math.imul(Xg, CI) | 0)) << 13) | 0;
  41891. F = ((W = W + Math.imul(Xg, WI) | 0) + (w >>> 13) | 0) + (hI >>> 26) | 0, hI &= 67108863;
  41892. var AC = (F + (G = Math.imul(kg, CI)) | 0) + ((8191 & (w = (w = Math.imul(kg, WI)) + Math.imul(Wg, CI) | 0)) << 13) | 0;
  41893. return F = ((W = Math.imul(Wg, WI)) + (w >>> 13) | 0) + (AC >>> 26) | 0, AC &= 67108863, D[0] = mI, D[1] = VI, D[2] = yC, D[3] = gC, D[4] = It, D[5] = dC, D[6] = Tt, D[7] = ag, D[8] = mg, D[9] = Sg, D[10] = Fg, D[11] = tI, D[12] = vg, D[13] = xg, D[14] = vI, D[15] = fI, D[16] = MI, D[17] = hI, D[18] = AC, F !== 0 && (D[19] = F, B.length++), B;
  41894. };
  41895. function Z(V, N, B) {
  41896. return new p().mulp(V, N, B);
  41897. }
  41898. function p(V, N) {
  41899. this.x = V, this.y = N;
  41900. }
  41901. Math.imul || (m = u), n.prototype.mulTo = function(V, N) {
  41902. var B = this.length + V.length;
  41903. return this.length === 10 && V.length === 10 ? m(this, V, N) : B < 63 ? u(this, V, N) : B < 1024 ? function(G, w, W) {
  41904. W.negative = w.negative ^ G.negative, W.length = G.length + w.length;
  41905. for (var y = 0, f = 0, D = 0; D < W.length - 1; D++) {
  41906. var F = f;
  41907. f = 0;
  41908. for (var T = 67108863 & y, Q = Math.min(D, w.length - 1), P = Math.max(0, D - G.length + 1); P <= Q; P++) {
  41909. var L = D - P, E = (0 | G.words[L]) * (0 | w.words[P]), J = 67108863 & E;
  41910. T = 67108863 & (J = J + T | 0), f += (F = (F = F + (E / 67108864 | 0) | 0) + (J >>> 26) | 0) >>> 26, F &= 67108863;
  41911. }
  41912. W.words[D] = T, y = F, F = f;
  41913. }
  41914. return y !== 0 ? W.words[D] = y : W.length--, W.strip();
  41915. }(this, V, N) : Z(this, V, N);
  41916. }, p.prototype.makeRBT = function(V) {
  41917. for (var N = new Array(V), B = n.prototype._countBits(V) - 1, G = 0; G < V; G++) N[G] = this.revBin(G, B, V);
  41918. return N;
  41919. }, p.prototype.revBin = function(V, N, B) {
  41920. if (V === 0 || V === B - 1) return V;
  41921. for (var G = 0, w = 0; w < N; w++) G |= (1 & V) << N - w - 1, V >>= 1;
  41922. return G;
  41923. }, p.prototype.permute = function(V, N, B, G, w, W) {
  41924. for (var y = 0; y < W; y++) G[y] = N[V[y]], w[y] = B[V[y]];
  41925. }, p.prototype.transform = function(V, N, B, G, w, W) {
  41926. this.permute(W, V, N, B, G, w);
  41927. for (var y = 1; y < w; y <<= 1) for (var f = y << 1, D = Math.cos(2 * Math.PI / f), F = Math.sin(2 * Math.PI / f), T = 0; T < w; T += f) for (var Q = D, P = F, L = 0; L < y; L++) {
  41928. var E = B[T + L], J = G[T + L], k = B[T + L + y], j = G[T + L + y], q = Q * k - P * j;
  41929. j = Q * j + P * k, k = q, B[T + L] = E + k, G[T + L] = J + j, B[T + L + y] = E - k, G[T + L + y] = J - j, L !== f && (q = D * Q - F * P, P = D * P + F * Q, Q = q);
  41930. }
  41931. }, p.prototype.guessLen13b = function(V, N) {
  41932. var B = 1 | Math.max(N, V), G = 1 & B, w = 0;
  41933. for (B = B / 2 | 0; B; B >>>= 1) w++;
  41934. return 1 << w + 1 + G;
  41935. }, p.prototype.conjugate = function(V, N, B) {
  41936. if (!(B <= 1)) for (var G = 0; G < B / 2; G++) {
  41937. var w = V[G];
  41938. V[G] = V[B - G - 1], V[B - G - 1] = w, w = N[G], N[G] = -N[B - G - 1], N[B - G - 1] = -w;
  41939. }
  41940. }, p.prototype.normalize13b = function(V, N) {
  41941. for (var B = 0, G = 0; G < N / 2; G++) {
  41942. var w = 8192 * Math.round(V[2 * G + 1] / N) + Math.round(V[2 * G] / N) + B;
  41943. V[G] = 67108863 & w, B = w < 67108864 ? 0 : w / 67108864 | 0;
  41944. }
  41945. return V;
  41946. }, p.prototype.convert13b = function(V, N, B, G) {
  41947. for (var w = 0, W = 0; W < N; W++) w += 0 | V[W], B[2 * W] = 8191 & w, w >>>= 13, B[2 * W + 1] = 8191 & w, w >>>= 13;
  41948. for (W = 2 * N; W < G; ++W) B[W] = 0;
  41949. s(w === 0), s((-8192 & w) == 0);
  41950. }, p.prototype.stub = function(V) {
  41951. for (var N = new Array(V), B = 0; B < V; B++) N[B] = 0;
  41952. return N;
  41953. }, p.prototype.mulp = function(V, N, B) {
  41954. var G = 2 * this.guessLen13b(V.length, N.length), w = this.makeRBT(G), W = this.stub(G), y = new Array(G), f = new Array(G), D = new Array(G), F = new Array(G), T = new Array(G), Q = new Array(G), P = B.words;
  41955. P.length = G, this.convert13b(V.words, V.length, y, G), this.convert13b(N.words, N.length, F, G), this.transform(y, W, f, D, G, w), this.transform(F, W, T, Q, G, w);
  41956. for (var L = 0; L < G; L++) {
  41957. var E = f[L] * T[L] - D[L] * Q[L];
  41958. D[L] = f[L] * Q[L] + D[L] * T[L], f[L] = E;
  41959. }
  41960. return this.conjugate(f, D, G), this.transform(f, D, P, W, G, w), this.conjugate(P, W, G), this.normalize13b(P, G), B.negative = V.negative ^ N.negative, B.length = V.length + N.length, B.strip();
  41961. }, n.prototype.mul = function(V) {
  41962. var N = new n(null);
  41963. return N.words = new Array(this.length + V.length), this.mulTo(V, N);
  41964. }, n.prototype.mulf = function(V) {
  41965. var N = new n(null);
  41966. return N.words = new Array(this.length + V.length), Z(this, V, N);
  41967. }, n.prototype.imul = function(V) {
  41968. return this.clone().mulTo(V, this);
  41969. }, n.prototype.imuln = function(V) {
  41970. s(typeof V == "number"), s(V < 67108864);
  41971. for (var N = 0, B = 0; B < this.length; B++) {
  41972. var G = (0 | this.words[B]) * V, w = (67108863 & G) + (67108863 & N);
  41973. N >>= 26, N += G / 67108864 | 0, N += w >>> 26, this.words[B] = 67108863 & w;
  41974. }
  41975. return N !== 0 && (this.words[B] = N, this.length++), this;
  41976. }, n.prototype.muln = function(V) {
  41977. return this.clone().imuln(V);
  41978. }, n.prototype.sqr = function() {
  41979. return this.mul(this);
  41980. }, n.prototype.isqr = function() {
  41981. return this.imul(this.clone());
  41982. }, n.prototype.pow = function(V) {
  41983. var N = function(W) {
  41984. for (var y = new Array(W.bitLength()), f = 0; f < y.length; f++) {
  41985. var D = f / 26 | 0, F = f % 26;
  41986. y[f] = (W.words[D] & 1 << F) >>> F;
  41987. }
  41988. return y;
  41989. }(V);
  41990. if (N.length === 0) return new n(1);
  41991. for (var B = this, G = 0; G < N.length && N[G] === 0; G++, B = B.sqr()) ;
  41992. if (++G < N.length) for (var w = B.sqr(); G < N.length; G++, w = w.sqr()) N[G] !== 0 && (B = B.mul(w));
  41993. return B;
  41994. }, n.prototype.iushln = function(V) {
  41995. s(typeof V == "number" && V >= 0);
  41996. var N, B = V % 26, G = (V - B) / 26, w = 67108863 >>> 26 - B << 26 - B;
  41997. if (B !== 0) {
  41998. var W = 0;
  41999. for (N = 0; N < this.length; N++) {
  42000. var y = this.words[N] & w, f = (0 | this.words[N]) - y << B;
  42001. this.words[N] = f | W, W = y >>> 26 - B;
  42002. }
  42003. W && (this.words[N] = W, this.length++);
  42004. }
  42005. if (G !== 0) {
  42006. for (N = this.length - 1; N >= 0; N--) this.words[N + G] = this.words[N];
  42007. for (N = 0; N < G; N++) this.words[N] = 0;
  42008. this.length += G;
  42009. }
  42010. return this.strip();
  42011. }, n.prototype.ishln = function(V) {
  42012. return s(this.negative === 0), this.iushln(V);
  42013. }, n.prototype.iushrn = function(V, N, B) {
  42014. var G;
  42015. s(typeof V == "number" && V >= 0), G = N ? (N - N % 26) / 26 : 0;
  42016. var w = V % 26, W = Math.min((V - w) / 26, this.length), y = 67108863 ^ 67108863 >>> w << w, f = B;
  42017. if (G -= W, G = Math.max(0, G), f) {
  42018. for (var D = 0; D < W; D++) f.words[D] = this.words[D];
  42019. f.length = W;
  42020. }
  42021. if (W !== 0) if (this.length > W) for (this.length -= W, D = 0; D < this.length; D++) this.words[D] = this.words[D + W];
  42022. else this.words[0] = 0, this.length = 1;
  42023. var F = 0;
  42024. for (D = this.length - 1; D >= 0 && (F !== 0 || D >= G); D--) {
  42025. var T = 0 | this.words[D];
  42026. this.words[D] = F << 26 - w | T >>> w, F = T & y;
  42027. }
  42028. return f && F !== 0 && (f.words[f.length++] = F), this.length === 0 && (this.words[0] = 0, this.length = 1), this.strip();
  42029. }, n.prototype.ishrn = function(V, N, B) {
  42030. return s(this.negative === 0), this.iushrn(V, N, B);
  42031. }, n.prototype.shln = function(V) {
  42032. return this.clone().ishln(V);
  42033. }, n.prototype.ushln = function(V) {
  42034. return this.clone().iushln(V);
  42035. }, n.prototype.shrn = function(V) {
  42036. return this.clone().ishrn(V);
  42037. }, n.prototype.ushrn = function(V) {
  42038. return this.clone().iushrn(V);
  42039. }, n.prototype.testn = function(V) {
  42040. s(typeof V == "number" && V >= 0);
  42041. var N = V % 26, B = (V - N) / 26, G = 1 << N;
  42042. return !(this.length <= B) && !!(this.words[B] & G);
  42043. }, n.prototype.imaskn = function(V) {
  42044. s(typeof V == "number" && V >= 0);
  42045. var N = V % 26, B = (V - N) / 26;
  42046. if (s(this.negative === 0, "imaskn works only with positive numbers"), this.length <= B) return this;
  42047. if (N !== 0 && B++, this.length = Math.min(B, this.length), N !== 0) {
  42048. var G = 67108863 ^ 67108863 >>> N << N;
  42049. this.words[this.length - 1] &= G;
  42050. }
  42051. return this.strip();
  42052. }, n.prototype.maskn = function(V) {
  42053. return this.clone().imaskn(V);
  42054. }, n.prototype.iaddn = function(V) {
  42055. return s(typeof V == "number"), s(V < 67108864), V < 0 ? this.isubn(-V) : this.negative !== 0 ? this.length === 1 && (0 | this.words[0]) < V ? (this.words[0] = V - (0 | this.words[0]), this.negative = 0, this) : (this.negative = 0, this.isubn(V), this.negative = 1, this) : this._iaddn(V);
  42056. }, n.prototype._iaddn = function(V) {
  42057. this.words[0] += V;
  42058. for (var N = 0; N < this.length && this.words[N] >= 67108864; N++) this.words[N] -= 67108864, N === this.length - 1 ? this.words[N + 1] = 1 : this.words[N + 1]++;
  42059. return this.length = Math.max(this.length, N + 1), this;
  42060. }, n.prototype.isubn = function(V) {
  42061. if (s(typeof V == "number"), s(V < 67108864), V < 0) return this.iaddn(-V);
  42062. if (this.negative !== 0) return this.negative = 0, this.iaddn(V), this.negative = 1, this;
  42063. if (this.words[0] -= V, this.length === 1 && this.words[0] < 0) this.words[0] = -this.words[0], this.negative = 1;
  42064. else for (var N = 0; N < this.length && this.words[N] < 0; N++) this.words[N] += 67108864, this.words[N + 1] -= 1;
  42065. return this.strip();
  42066. }, n.prototype.addn = function(V) {
  42067. return this.clone().iaddn(V);
  42068. }, n.prototype.subn = function(V) {
  42069. return this.clone().isubn(V);
  42070. }, n.prototype.iabs = function() {
  42071. return this.negative = 0, this;
  42072. }, n.prototype.abs = function() {
  42073. return this.clone().iabs();
  42074. }, n.prototype._ishlnsubmul = function(V, N, B) {
  42075. var G, w, W = V.length + B;
  42076. this._expand(W);
  42077. var y = 0;
  42078. for (G = 0; G < V.length; G++) {
  42079. w = (0 | this.words[G + B]) + y;
  42080. var f = (0 | V.words[G]) * N;
  42081. y = ((w -= 67108863 & f) >> 26) - (f / 67108864 | 0), this.words[G + B] = 67108863 & w;
  42082. }
  42083. for (; G < this.length - B; G++) y = (w = (0 | this.words[G + B]) + y) >> 26, this.words[G + B] = 67108863 & w;
  42084. if (y === 0) return this.strip();
  42085. for (s(y === -1), y = 0, G = 0; G < this.length; G++) y = (w = -(0 | this.words[G]) + y) >> 26, this.words[G] = 67108863 & w;
  42086. return this.negative = 1, this.strip();
  42087. }, n.prototype._wordDiv = function(V, N) {
  42088. var B = (this.length, V.length), G = this.clone(), w = V, W = 0 | w.words[w.length - 1];
  42089. (B = 26 - this._countBits(W)) !== 0 && (w = w.ushln(B), G.iushln(B), W = 0 | w.words[w.length - 1]);
  42090. var y, f = G.length - w.length;
  42091. if (N !== "mod") {
  42092. (y = new n(null)).length = f + 1, y.words = new Array(y.length);
  42093. for (var D = 0; D < y.length; D++) y.words[D] = 0;
  42094. }
  42095. var F = G.clone()._ishlnsubmul(w, 1, f);
  42096. F.negative === 0 && (G = F, y && (y.words[f] = 1));
  42097. for (var T = f - 1; T >= 0; T--) {
  42098. var Q = 67108864 * (0 | G.words[w.length + T]) + (0 | G.words[w.length + T - 1]);
  42099. for (Q = Math.min(Q / W | 0, 67108863), G._ishlnsubmul(w, Q, T); G.negative !== 0; ) Q--, G.negative = 0, G._ishlnsubmul(w, 1, T), G.isZero() || (G.negative ^= 1);
  42100. y && (y.words[T] = Q);
  42101. }
  42102. return y && y.strip(), G.strip(), N !== "div" && B !== 0 && G.iushrn(B), { div: y || null, mod: G };
  42103. }, n.prototype.divmod = function(V, N, B) {
  42104. return s(!V.isZero()), this.isZero() ? { div: new n(0), mod: new n(0) } : this.negative !== 0 && V.negative === 0 ? (W = this.neg().divmod(V, N), N !== "mod" && (G = W.div.neg()), N !== "div" && (w = W.mod.neg(), B && w.negative !== 0 && w.iadd(V)), { div: G, mod: w }) : this.negative === 0 && V.negative !== 0 ? (W = this.divmod(V.neg(), N), N !== "mod" && (G = W.div.neg()), { div: G, mod: W.mod }) : (this.negative & V.negative) != 0 ? (W = this.neg().divmod(V.neg(), N), N !== "div" && (w = W.mod.neg(), B && w.negative !== 0 && w.isub(V)), { div: W.div, mod: w }) : V.length > this.length || this.cmp(V) < 0 ? { div: new n(0), mod: this } : V.length === 1 ? N === "div" ? { div: this.divn(V.words[0]), mod: null } : N === "mod" ? { div: null, mod: new n(this.modn(V.words[0])) } : { div: this.divn(V.words[0]), mod: new n(this.modn(V.words[0])) } : this._wordDiv(V, N);
  42105. var G, w, W;
  42106. }, n.prototype.div = function(V) {
  42107. return this.divmod(V, "div", !1).div;
  42108. }, n.prototype.mod = function(V) {
  42109. return this.divmod(V, "mod", !1).mod;
  42110. }, n.prototype.umod = function(V) {
  42111. return this.divmod(V, "mod", !0).mod;
  42112. }, n.prototype.divRound = function(V) {
  42113. var N = this.divmod(V);
  42114. if (N.mod.isZero()) return N.div;
  42115. var B = N.div.negative !== 0 ? N.mod.isub(V) : N.mod, G = V.ushrn(1), w = V.andln(1), W = B.cmp(G);
  42116. return W < 0 || w === 1 && W === 0 ? N.div : N.div.negative !== 0 ? N.div.isubn(1) : N.div.iaddn(1);
  42117. }, n.prototype.modn = function(V) {
  42118. s(V <= 67108863);
  42119. for (var N = (1 << 26) % V, B = 0, G = this.length - 1; G >= 0; G--) B = (N * B + (0 | this.words[G])) % V;
  42120. return B;
  42121. }, n.prototype.idivn = function(V) {
  42122. s(V <= 67108863);
  42123. for (var N = 0, B = this.length - 1; B >= 0; B--) {
  42124. var G = (0 | this.words[B]) + 67108864 * N;
  42125. this.words[B] = G / V | 0, N = G % V;
  42126. }
  42127. return this.strip();
  42128. }, n.prototype.divn = function(V) {
  42129. return this.clone().idivn(V);
  42130. }, n.prototype.egcd = function(V) {
  42131. s(V.negative === 0), s(!V.isZero());
  42132. var N = this, B = V.clone();
  42133. N = N.negative !== 0 ? N.umod(V) : N.clone();
  42134. for (var G = new n(1), w = new n(0), W = new n(0), y = new n(1), f = 0; N.isEven() && B.isEven(); ) N.iushrn(1), B.iushrn(1), ++f;
  42135. for (var D = B.clone(), F = N.clone(); !N.isZero(); ) {
  42136. for (var T = 0, Q = 1; (N.words[0] & Q) == 0 && T < 26; ++T, Q <<= 1) ;
  42137. if (T > 0) for (N.iushrn(T); T-- > 0; ) (G.isOdd() || w.isOdd()) && (G.iadd(D), w.isub(F)), G.iushrn(1), w.iushrn(1);
  42138. for (var P = 0, L = 1; (B.words[0] & L) == 0 && P < 26; ++P, L <<= 1) ;
  42139. if (P > 0) for (B.iushrn(P); P-- > 0; ) (W.isOdd() || y.isOdd()) && (W.iadd(D), y.isub(F)), W.iushrn(1), y.iushrn(1);
  42140. N.cmp(B) >= 0 ? (N.isub(B), G.isub(W), w.isub(y)) : (B.isub(N), W.isub(G), y.isub(w));
  42141. }
  42142. return { a: W, b: y, gcd: B.iushln(f) };
  42143. }, n.prototype._invmp = function(V) {
  42144. s(V.negative === 0), s(!V.isZero());
  42145. var N = this, B = V.clone();
  42146. N = N.negative !== 0 ? N.umod(V) : N.clone();
  42147. for (var G, w = new n(1), W = new n(0), y = B.clone(); N.cmpn(1) > 0 && B.cmpn(1) > 0; ) {
  42148. for (var f = 0, D = 1; (N.words[0] & D) == 0 && f < 26; ++f, D <<= 1) ;
  42149. if (f > 0) for (N.iushrn(f); f-- > 0; ) w.isOdd() && w.iadd(y), w.iushrn(1);
  42150. for (var F = 0, T = 1; (B.words[0] & T) == 0 && F < 26; ++F, T <<= 1) ;
  42151. if (F > 0) for (B.iushrn(F); F-- > 0; ) W.isOdd() && W.iadd(y), W.iushrn(1);
  42152. N.cmp(B) >= 0 ? (N.isub(B), w.isub(W)) : (B.isub(N), W.isub(w));
  42153. }
  42154. return (G = N.cmpn(1) === 0 ? w : W).cmpn(0) < 0 && G.iadd(V), G;
  42155. }, n.prototype.gcd = function(V) {
  42156. if (this.isZero()) return V.abs();
  42157. if (V.isZero()) return this.abs();
  42158. var N = this.clone(), B = V.clone();
  42159. N.negative = 0, B.negative = 0;
  42160. for (var G = 0; N.isEven() && B.isEven(); G++) N.iushrn(1), B.iushrn(1);
  42161. for (; ; ) {
  42162. for (; N.isEven(); ) N.iushrn(1);
  42163. for (; B.isEven(); ) B.iushrn(1);
  42164. var w = N.cmp(B);
  42165. if (w < 0) {
  42166. var W = N;
  42167. N = B, B = W;
  42168. } else if (w === 0 || B.cmpn(1) === 0) break;
  42169. N.isub(B);
  42170. }
  42171. return B.iushln(G);
  42172. }, n.prototype.invm = function(V) {
  42173. return this.egcd(V).a.umod(V);
  42174. }, n.prototype.isEven = function() {
  42175. return (1 & this.words[0]) == 0;
  42176. }, n.prototype.isOdd = function() {
  42177. return (1 & this.words[0]) == 1;
  42178. }, n.prototype.andln = function(V) {
  42179. return this.words[0] & V;
  42180. }, n.prototype.bincn = function(V) {
  42181. s(typeof V == "number");
  42182. var N = V % 26, B = (V - N) / 26, G = 1 << N;
  42183. if (this.length <= B) return this._expand(B + 1), this.words[B] |= G, this;
  42184. for (var w = G, W = B; w !== 0 && W < this.length; W++) {
  42185. var y = 0 | this.words[W];
  42186. w = (y += w) >>> 26, y &= 67108863, this.words[W] = y;
  42187. }
  42188. return w !== 0 && (this.words[W] = w, this.length++), this;
  42189. }, n.prototype.isZero = function() {
  42190. return this.length === 1 && this.words[0] === 0;
  42191. }, n.prototype.cmpn = function(V) {
  42192. var N, B = V < 0;
  42193. if (this.negative !== 0 && !B) return -1;
  42194. if (this.negative === 0 && B) return 1;
  42195. if (this.strip(), this.length > 1) N = 1;
  42196. else {
  42197. B && (V = -V), s(V <= 67108863, "Number is too big");
  42198. var G = 0 | this.words[0];
  42199. N = G === V ? 0 : G < V ? -1 : 1;
  42200. }
  42201. return this.negative !== 0 ? 0 | -N : N;
  42202. }, n.prototype.cmp = function(V) {
  42203. if (this.negative !== 0 && V.negative === 0) return -1;
  42204. if (this.negative === 0 && V.negative !== 0) return 1;
  42205. var N = this.ucmp(V);
  42206. return this.negative !== 0 ? 0 | -N : N;
  42207. }, n.prototype.ucmp = function(V) {
  42208. if (this.length > V.length) return 1;
  42209. if (this.length < V.length) return -1;
  42210. for (var N = 0, B = this.length - 1; B >= 0; B--) {
  42211. var G = 0 | this.words[B], w = 0 | V.words[B];
  42212. if (G !== w) {
  42213. G < w ? N = -1 : G > w && (N = 1);
  42214. break;
  42215. }
  42216. }
  42217. return N;
  42218. }, n.prototype.gtn = function(V) {
  42219. return this.cmpn(V) === 1;
  42220. }, n.prototype.gt = function(V) {
  42221. return this.cmp(V) === 1;
  42222. }, n.prototype.gten = function(V) {
  42223. return this.cmpn(V) >= 0;
  42224. }, n.prototype.gte = function(V) {
  42225. return this.cmp(V) >= 0;
  42226. }, n.prototype.ltn = function(V) {
  42227. return this.cmpn(V) === -1;
  42228. }, n.prototype.lt = function(V) {
  42229. return this.cmp(V) === -1;
  42230. }, n.prototype.lten = function(V) {
  42231. return this.cmpn(V) <= 0;
  42232. }, n.prototype.lte = function(V) {
  42233. return this.cmp(V) <= 0;
  42234. }, n.prototype.eqn = function(V) {
  42235. return this.cmpn(V) === 0;
  42236. }, n.prototype.eq = function(V) {
  42237. return this.cmp(V) === 0;
  42238. }, n.red = function(V) {
  42239. return new v(V);
  42240. }, n.prototype.toRed = function(V) {
  42241. return s(!this.red, "Already a number in reduction context"), s(this.negative === 0, "red works only with positives"), V.convertTo(this)._forceRed(V);
  42242. }, n.prototype.fromRed = function() {
  42243. return s(this.red, "fromRed works only with numbers in reduction context"), this.red.convertFrom(this);
  42244. }, n.prototype._forceRed = function(V) {
  42245. return this.red = V, this;
  42246. }, n.prototype.forceRed = function(V) {
  42247. return s(!this.red, "Already a number in reduction context"), this._forceRed(V);
  42248. }, n.prototype.redAdd = function(V) {
  42249. return s(this.red, "redAdd works only with red numbers"), this.red.add(this, V);
  42250. }, n.prototype.redIAdd = function(V) {
  42251. return s(this.red, "redIAdd works only with red numbers"), this.red.iadd(this, V);
  42252. }, n.prototype.redSub = function(V) {
  42253. return s(this.red, "redSub works only with red numbers"), this.red.sub(this, V);
  42254. }, n.prototype.redISub = function(V) {
  42255. return s(this.red, "redISub works only with red numbers"), this.red.isub(this, V);
  42256. }, n.prototype.redShl = function(V) {
  42257. return s(this.red, "redShl works only with red numbers"), this.red.shl(this, V);
  42258. }, n.prototype.redMul = function(V) {
  42259. return s(this.red, "redMul works only with red numbers"), this.red._verify2(this, V), this.red.mul(this, V);
  42260. }, n.prototype.redIMul = function(V) {
  42261. return s(this.red, "redMul works only with red numbers"), this.red._verify2(this, V), this.red.imul(this, V);
  42262. }, n.prototype.redSqr = function() {
  42263. return s(this.red, "redSqr works only with red numbers"), this.red._verify1(this), this.red.sqr(this);
  42264. }, n.prototype.redISqr = function() {
  42265. return s(this.red, "redISqr works only with red numbers"), this.red._verify1(this), this.red.isqr(this);
  42266. }, n.prototype.redSqrt = function() {
  42267. return s(this.red, "redSqrt works only with red numbers"), this.red._verify1(this), this.red.sqrt(this);
  42268. }, n.prototype.redInvm = function() {
  42269. return s(this.red, "redInvm works only with red numbers"), this.red._verify1(this), this.red.invm(this);
  42270. }, n.prototype.redNeg = function() {
  42271. return s(this.red, "redNeg works only with red numbers"), this.red._verify1(this), this.red.neg(this);
  42272. }, n.prototype.redPow = function(V) {
  42273. return s(this.red && !V.red, "redPow(normalNum)"), this.red._verify1(this), this.red.pow(this, V);
  42274. };
  42275. var Y = { k256: null, p224: null, p192: null, p25519: null };
  42276. function R(V, N) {
  42277. this.name = V, this.p = new n(N, 16), this.n = this.p.bitLength(), this.k = new n(1).iushln(this.n).isub(this.p), this.tmp = this._tmp();
  42278. }
  42279. function X() {
  42280. R.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f");
  42281. }
  42282. function H() {
  42283. R.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001");
  42284. }
  42285. function S() {
  42286. R.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff");
  42287. }
  42288. function z() {
  42289. R.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed");
  42290. }
  42291. function v(V) {
  42292. if (typeof V == "string") {
  42293. var N = n._prime(V);
  42294. this.m = N.p, this.prime = N;
  42295. } else s(V.gtn(1), "modulus must be greater than 1"), this.m = V, this.prime = null;
  42296. }
  42297. function K(V) {
  42298. v.call(this, V), this.shift = this.m.bitLength(), this.shift % 26 != 0 && (this.shift += 26 - this.shift % 26), this.r = new n(1).iushln(this.shift), this.r2 = this.imod(this.r.sqr()), this.rinv = this.r._invmp(this.m), this.minv = this.rinv.mul(this.r).isubn(1).div(this.m), this.minv = this.minv.umod(this.r), this.minv = this.r.sub(this.minv);
  42299. }
  42300. R.prototype._tmp = function() {
  42301. var V = new n(null);
  42302. return V.words = new Array(Math.ceil(this.n / 13)), V;
  42303. }, R.prototype.ireduce = function(V) {
  42304. var N, B = V;
  42305. do
  42306. this.split(B, this.tmp), N = (B = (B = this.imulK(B)).iadd(this.tmp)).bitLength();
  42307. while (N > this.n);
  42308. var G = N < this.n ? -1 : B.ucmp(this.p);
  42309. return G === 0 ? (B.words[0] = 0, B.length = 1) : G > 0 ? B.isub(this.p) : B.strip !== void 0 ? B.strip() : B._strip(), B;
  42310. }, R.prototype.split = function(V, N) {
  42311. V.iushrn(this.n, 0, N);
  42312. }, R.prototype.imulK = function(V) {
  42313. return V.imul(this.k);
  42314. }, l(X, R), X.prototype.split = function(V, N) {
  42315. for (var B = Math.min(V.length, 9), G = 0; G < B; G++) N.words[G] = V.words[G];
  42316. if (N.length = B, V.length <= 9) return V.words[0] = 0, void (V.length = 1);
  42317. var w = V.words[9];
  42318. for (N.words[N.length++] = 4194303 & w, G = 10; G < V.length; G++) {
  42319. var W = 0 | V.words[G];
  42320. V.words[G - 10] = (4194303 & W) << 4 | w >>> 22, w = W;
  42321. }
  42322. w >>>= 22, V.words[G - 10] = w, w === 0 && V.length > 10 ? V.length -= 10 : V.length -= 9;
  42323. }, X.prototype.imulK = function(V) {
  42324. V.words[V.length] = 0, V.words[V.length + 1] = 0, V.length += 2;
  42325. for (var N = 0, B = 0; B < V.length; B++) {
  42326. var G = 0 | V.words[B];
  42327. N += 977 * G, V.words[B] = 67108863 & N, N = 64 * G + (N / 67108864 | 0);
  42328. }
  42329. return V.words[V.length - 1] === 0 && (V.length--, V.words[V.length - 1] === 0 && V.length--), V;
  42330. }, l(H, R), l(S, R), l(z, R), z.prototype.imulK = function(V) {
  42331. for (var N = 0, B = 0; B < V.length; B++) {
  42332. var G = 19 * (0 | V.words[B]) + N, w = 67108863 & G;
  42333. G >>>= 26, V.words[B] = w, N = G;
  42334. }
  42335. return N !== 0 && (V.words[V.length++] = N), V;
  42336. }, n._prime = function(V) {
  42337. if (Y[V]) return Y[V];
  42338. var N;
  42339. if (V === "k256") N = new X();
  42340. else if (V === "p224") N = new H();
  42341. else if (V === "p192") N = new S();
  42342. else {
  42343. if (V !== "p25519") throw new Error("Unknown prime " + V);
  42344. N = new z();
  42345. }
  42346. return Y[V] = N, N;
  42347. }, v.prototype._verify1 = function(V) {
  42348. s(V.negative === 0, "red works only with positives"), s(V.red, "red works only with red numbers");
  42349. }, v.prototype._verify2 = function(V, N) {
  42350. s((V.negative | N.negative) == 0, "red works only with positives"), s(V.red && V.red === N.red, "red works only with red numbers");
  42351. }, v.prototype.imod = function(V) {
  42352. return this.prime ? this.prime.ireduce(V)._forceRed(this) : V.umod(this.m)._forceRed(this);
  42353. }, v.prototype.neg = function(V) {
  42354. return V.isZero() ? V.clone() : this.m.sub(V)._forceRed(this);
  42355. }, v.prototype.add = function(V, N) {
  42356. this._verify2(V, N);
  42357. var B = V.add(N);
  42358. return B.cmp(this.m) >= 0 && B.isub(this.m), B._forceRed(this);
  42359. }, v.prototype.iadd = function(V, N) {
  42360. this._verify2(V, N);
  42361. var B = V.iadd(N);
  42362. return B.cmp(this.m) >= 0 && B.isub(this.m), B;
  42363. }, v.prototype.sub = function(V, N) {
  42364. this._verify2(V, N);
  42365. var B = V.sub(N);
  42366. return B.cmpn(0) < 0 && B.iadd(this.m), B._forceRed(this);
  42367. }, v.prototype.isub = function(V, N) {
  42368. this._verify2(V, N);
  42369. var B = V.isub(N);
  42370. return B.cmpn(0) < 0 && B.iadd(this.m), B;
  42371. }, v.prototype.shl = function(V, N) {
  42372. return this._verify1(V), this.imod(V.ushln(N));
  42373. }, v.prototype.imul = function(V, N) {
  42374. return this._verify2(V, N), this.imod(V.imul(N));
  42375. }, v.prototype.mul = function(V, N) {
  42376. return this._verify2(V, N), this.imod(V.mul(N));
  42377. }, v.prototype.isqr = function(V) {
  42378. return this.imul(V, V.clone());
  42379. }, v.prototype.sqr = function(V) {
  42380. return this.mul(V, V);
  42381. }, v.prototype.sqrt = function(V) {
  42382. if (V.isZero()) return V.clone();
  42383. var N = this.m.andln(3);
  42384. if (s(N % 2 == 1), N === 3) {
  42385. var B = this.m.add(new n(1)).iushrn(2);
  42386. return this.pow(V, B);
  42387. }
  42388. for (var G = this.m.subn(1), w = 0; !G.isZero() && G.andln(1) === 0; ) w++, G.iushrn(1);
  42389. s(!G.isZero());
  42390. var W = new n(1).toRed(this), y = W.redNeg(), f = this.m.subn(1).iushrn(1), D = this.m.bitLength();
  42391. for (D = new n(2 * D * D).toRed(this); this.pow(D, f).cmp(y) !== 0; ) D.redIAdd(y);
  42392. for (var F = this.pow(D, G), T = this.pow(V, G.addn(1).iushrn(1)), Q = this.pow(V, G), P = w; Q.cmp(W) !== 0; ) {
  42393. for (var L = Q, E = 0; L.cmp(W) !== 0; E++) L = L.redSqr();
  42394. s(E < P);
  42395. var J = this.pow(F, new n(1).iushln(P - E - 1));
  42396. T = T.redMul(J), F = J.redSqr(), Q = Q.redMul(F), P = E;
  42397. }
  42398. return T;
  42399. }, v.prototype.invm = function(V) {
  42400. var N = V._invmp(this.m);
  42401. return N.negative !== 0 ? (N.negative = 0, this.imod(N).redNeg()) : this.imod(N);
  42402. }, v.prototype.pow = function(V, N) {
  42403. if (N.isZero()) return new n(1).toRed(this);
  42404. if (N.cmpn(1) === 0) return V.clone();
  42405. var B = new Array(16);
  42406. B[0] = new n(1).toRed(this), B[1] = V;
  42407. for (var G = 2; G < B.length; G++) B[G] = this.mul(B[G - 1], V);
  42408. var w = B[0], W = 0, y = 0, f = N.bitLength() % 26;
  42409. for (f === 0 && (f = 26), G = N.length - 1; G >= 0; G--) {
  42410. for (var D = N.words[G], F = f - 1; F >= 0; F--) {
  42411. var T = D >> F & 1;
  42412. w !== B[0] && (w = this.sqr(w)), T !== 0 || W !== 0 ? (W <<= 1, W |= T, (++y === 4 || G === 0 && F === 0) && (w = this.mul(w, B[W]), y = 0, W = 0)) : y = 0;
  42413. }
  42414. f = 26;
  42415. }
  42416. return w;
  42417. }, v.prototype.convertTo = function(V) {
  42418. var N = V.umod(this.m);
  42419. return N === V ? N.clone() : N;
  42420. }, v.prototype.convertFrom = function(V) {
  42421. var N = V.clone();
  42422. return N.red = null, N;
  42423. }, n.mont = function(V) {
  42424. return new K(V);
  42425. }, l(K, v), K.prototype.convertTo = function(V) {
  42426. return this.imod(V.ushln(this.shift));
  42427. }, K.prototype.convertFrom = function(V) {
  42428. var N = this.imod(V.mul(this.rinv));
  42429. return N.red = null, N;
  42430. }, K.prototype.imul = function(V, N) {
  42431. if (V.isZero() || N.isZero()) return V.words[0] = 0, V.length = 1, V;
  42432. var B = V.imul(N), G = B.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), w = B.isub(G).iushrn(this.shift), W = w;
  42433. return w.cmp(this.m) >= 0 ? W = w.isub(this.m) : w.cmpn(0) < 0 && (W = w.iadd(this.m)), W._forceRed(this);
  42434. }, K.prototype.mul = function(V, N) {
  42435. if (V.isZero() || N.isZero()) return new n(0)._forceRed(this);
  42436. var B = V.mul(N), G = B.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), w = B.isub(G).iushrn(this.shift), W = w;
  42437. return w.cmp(this.m) >= 0 ? W = w.isub(this.m) : w.cmpn(0) < 0 && (W = w.iadd(this.m)), W._forceRed(this);
  42438. }, K.prototype.invm = function(V) {
  42439. return this.imod(V._invmp(this.m).mul(this.r2))._forceRed(this);
  42440. };
  42441. })(C === void 0 || C);
  42442. }, { buffer: 188 }], 185: [function(g, C, i) {
  42443. i.byteLength = function(c) {
  42444. var r = d(c), h = r[0], b = r[1];
  42445. return 3 * (h + b) / 4 - b;
  42446. }, i.toByteArray = function(c) {
  42447. var r, h, b = d(c), u = b[0], m = b[1], Z = new s(function(R, X, H) {
  42448. return 3 * (X + H) / 4 - H;
  42449. }(0, u, m)), p = 0, Y = m > 0 ? u - 4 : u;
  42450. for (h = 0; h < Y; h += 4) r = A[c.charCodeAt(h)] << 18 | A[c.charCodeAt(h + 1)] << 12 | A[c.charCodeAt(h + 2)] << 6 | A[c.charCodeAt(h + 3)], Z[p++] = r >> 16 & 255, Z[p++] = r >> 8 & 255, Z[p++] = 255 & r;
  42451. return m === 2 && (r = A[c.charCodeAt(h)] << 2 | A[c.charCodeAt(h + 1)] >> 4, Z[p++] = 255 & r), m === 1 && (r = A[c.charCodeAt(h)] << 10 | A[c.charCodeAt(h + 1)] << 4 | A[c.charCodeAt(h + 2)] >> 2, Z[p++] = r >> 8 & 255, Z[p++] = 255 & r), Z;
  42452. }, i.fromByteArray = function(c) {
  42453. for (var r, h = c.length, b = h % 3, u = [], m = 0, Z = h - b; m < Z; m += 16383) u.push(o(c, m, m + 16383 > Z ? Z : m + 16383));
  42454. return b === 1 ? (r = c[h - 1], u.push(e[r >> 2] + e[r << 4 & 63] + "==")) : b === 2 && (r = (c[h - 2] << 8) + c[h - 1], u.push(e[r >> 10] + e[r >> 4 & 63] + e[r << 2 & 63] + "=")), u.join("");
  42455. };
  42456. for (var e = [], A = [], s = typeof Uint8Array < "u" ? Uint8Array : Array, l = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", n = 0, a = l.length; n < a; ++n) e[n] = l[n], A[l.charCodeAt(n)] = n;
  42457. function d(c) {
  42458. var r = c.length;
  42459. if (r % 4 > 0) throw new Error("Invalid string. Length must be a multiple of 4");
  42460. var h = c.indexOf("=");
  42461. return h === -1 && (h = r), [h, h === r ? 0 : 4 - h % 4];
  42462. }
  42463. function o(c, r, h) {
  42464. for (var b, u, m = [], Z = r; Z < h; Z += 3) b = (c[Z] << 16 & 16711680) + (c[Z + 1] << 8 & 65280) + (255 & c[Z + 2]), m.push(e[(u = b) >> 18 & 63] + e[u >> 12 & 63] + e[u >> 6 & 63] + e[63 & u]);
  42465. return m.join("");
  42466. }
  42467. A[45] = 62, A[95] = 63;
  42468. }, {}], 186: [function(g, C, i) {
  42469. (function(e, A) {
  42470. function s(B, G) {
  42471. if (!B) throw new Error(G || "Assertion failed");
  42472. }
  42473. function l(B, G) {
  42474. B.super_ = G;
  42475. var w = function() {
  42476. };
  42477. w.prototype = G.prototype, B.prototype = new w(), B.prototype.constructor = B;
  42478. }
  42479. function n(B, G, w) {
  42480. if (n.isBN(B)) return B;
  42481. this.negative = 0, this.words = null, this.length = 0, this.red = null, B !== null && (G !== "le" && G !== "be" || (w = G, G = 10), this._init(B || 0, G || 10, w || "be"));
  42482. }
  42483. var a;
  42484. typeof e == "object" ? e.exports = n : (void 0).BN = n, n.BN = n, n.wordSize = 26;
  42485. try {
  42486. a = typeof window < "u" && window.Buffer !== void 0 ? window.Buffer : g("buffer").Buffer;
  42487. } catch {
  42488. }
  42489. function d(B, G) {
  42490. var w = B.charCodeAt(G);
  42491. return w >= 48 && w <= 57 ? w - 48 : w >= 65 && w <= 70 ? w - 55 : w >= 97 && w <= 102 ? w - 87 : void s(!1, "Invalid character in " + B);
  42492. }
  42493. function o(B, G, w) {
  42494. var W = d(B, w);
  42495. return w - 1 >= G && (W |= d(B, w - 1) << 4), W;
  42496. }
  42497. function c(B, G, w, W) {
  42498. for (var y = 0, f = 0, D = Math.min(B.length, w), F = G; F < D; F++) {
  42499. var T = B.charCodeAt(F) - 48;
  42500. y *= W, f = T >= 49 ? T - 49 + 10 : T >= 17 ? T - 17 + 10 : T, s(T >= 0 && f < W, "Invalid character"), y += f;
  42501. }
  42502. return y;
  42503. }
  42504. function r(B, G) {
  42505. B.words = G.words, B.length = G.length, B.negative = G.negative, B.red = G.red;
  42506. }
  42507. if (n.isBN = function(B) {
  42508. return B instanceof n || B !== null && typeof B == "object" && B.constructor.wordSize === n.wordSize && Array.isArray(B.words);
  42509. }, n.max = function(B, G) {
  42510. return B.cmp(G) > 0 ? B : G;
  42511. }, n.min = function(B, G) {
  42512. return B.cmp(G) < 0 ? B : G;
  42513. }, n.prototype._init = function(B, G, w) {
  42514. if (typeof B == "number") return this._initNumber(B, G, w);
  42515. if (typeof B == "object") return this._initArray(B, G, w);
  42516. G === "hex" && (G = 16), s(G === (0 | G) && G >= 2 && G <= 36);
  42517. var W = 0;
  42518. (B = B.toString().replace(/\s+/g, ""))[0] === "-" && (W++, this.negative = 1), W < B.length && (G === 16 ? this._parseHex(B, W, w) : (this._parseBase(B, G, W), w === "le" && this._initArray(this.toArray(), G, w)));
  42519. }, n.prototype._initNumber = function(B, G, w) {
  42520. B < 0 && (this.negative = 1, B = -B), B < 67108864 ? (this.words = [67108863 & B], this.length = 1) : B < 4503599627370496 ? (this.words = [67108863 & B, B / 67108864 & 67108863], this.length = 2) : (s(B < 9007199254740992), this.words = [67108863 & B, B / 67108864 & 67108863, 1], this.length = 3), w === "le" && this._initArray(this.toArray(), G, w);
  42521. }, n.prototype._initArray = function(B, G, w) {
  42522. if (s(typeof B.length == "number"), B.length <= 0) return this.words = [0], this.length = 1, this;
  42523. this.length = Math.ceil(B.length / 3), this.words = new Array(this.length);
  42524. for (var W = 0; W < this.length; W++) this.words[W] = 0;
  42525. var y, f, D = 0;
  42526. if (w === "be") for (W = B.length - 1, y = 0; W >= 0; W -= 3) f = B[W] | B[W - 1] << 8 | B[W - 2] << 16, this.words[y] |= f << D & 67108863, this.words[y + 1] = f >>> 26 - D & 67108863, (D += 24) >= 26 && (D -= 26, y++);
  42527. else if (w === "le") for (W = 0, y = 0; W < B.length; W += 3) f = B[W] | B[W + 1] << 8 | B[W + 2] << 16, this.words[y] |= f << D & 67108863, this.words[y + 1] = f >>> 26 - D & 67108863, (D += 24) >= 26 && (D -= 26, y++);
  42528. return this._strip();
  42529. }, n.prototype._parseHex = function(B, G, w) {
  42530. this.length = Math.ceil((B.length - G) / 6), this.words = new Array(this.length);
  42531. for (var W = 0; W < this.length; W++) this.words[W] = 0;
  42532. var y, f = 0, D = 0;
  42533. if (w === "be") for (W = B.length - 1; W >= G; W -= 2) y = o(B, G, W) << f, this.words[D] |= 67108863 & y, f >= 18 ? (f -= 18, D += 1, this.words[D] |= y >>> 26) : f += 8;
  42534. else for (W = (B.length - G) % 2 == 0 ? G + 1 : G; W < B.length; W += 2) y = o(B, G, W) << f, this.words[D] |= 67108863 & y, f >= 18 ? (f -= 18, D += 1, this.words[D] |= y >>> 26) : f += 8;
  42535. this._strip();
  42536. }, n.prototype._parseBase = function(B, G, w) {
  42537. this.words = [0], this.length = 1;
  42538. for (var W = 0, y = 1; y <= 67108863; y *= G) W++;
  42539. W--, y = y / G | 0;
  42540. for (var f = B.length - w, D = f % W, F = Math.min(f, f - D) + w, T = 0, Q = w; Q < F; Q += W) T = c(B, Q, Q + W, G), this.imuln(y), this.words[0] + T < 67108864 ? this.words[0] += T : this._iaddn(T);
  42541. if (D !== 0) {
  42542. var P = 1;
  42543. for (T = c(B, Q, B.length, G), Q = 0; Q < D; Q++) P *= G;
  42544. this.imuln(P), this.words[0] + T < 67108864 ? this.words[0] += T : this._iaddn(T);
  42545. }
  42546. this._strip();
  42547. }, n.prototype.copy = function(B) {
  42548. B.words = new Array(this.length);
  42549. for (var G = 0; G < this.length; G++) B.words[G] = this.words[G];
  42550. B.length = this.length, B.negative = this.negative, B.red = this.red;
  42551. }, n.prototype._move = function(B) {
  42552. r(B, this);
  42553. }, n.prototype.clone = function() {
  42554. var B = new n(null);
  42555. return this.copy(B), B;
  42556. }, n.prototype._expand = function(B) {
  42557. for (; this.length < B; ) this.words[this.length++] = 0;
  42558. return this;
  42559. }, n.prototype._strip = function() {
  42560. for (; this.length > 1 && this.words[this.length - 1] === 0; ) this.length--;
  42561. return this._normSign();
  42562. }, n.prototype._normSign = function() {
  42563. return this.length === 1 && this.words[0] === 0 && (this.negative = 0), this;
  42564. }, typeof Symbol < "u" && typeof Symbol.for == "function") try {
  42565. n.prototype[Symbol.for("nodejs.util.inspect.custom")] = h;
  42566. } catch {
  42567. n.prototype.inspect = h;
  42568. }
  42569. else n.prototype.inspect = h;
  42570. function h() {
  42571. return (this.red ? "<BN-R: " : "<BN: ") + this.toString(16) + ">";
  42572. }
  42573. var b = ["", "0", "00", "000", "0000", "00000", "000000", "0000000", "00000000", "000000000", "0000000000", "00000000000", "000000000000", "0000000000000", "00000000000000", "000000000000000", "0000000000000000", "00000000000000000", "000000000000000000", "0000000000000000000", "00000000000000000000", "000000000000000000000", "0000000000000000000000", "00000000000000000000000", "000000000000000000000000", "0000000000000000000000000"], u = [0, 0, 25, 16, 12, 11, 10, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], m = [0, 0, 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, 43046721, 1e7, 19487171, 35831808, 62748517, 7529536, 11390625, 16777216, 24137569, 34012224, 47045881, 64e6, 4084101, 5153632, 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, 243e5, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176];
  42574. n.prototype.toString = function(B, G) {
  42575. var w;
  42576. if (G = 0 | G || 1, (B = B || 10) === 16 || B === "hex") {
  42577. w = "";
  42578. for (var W = 0, y = 0, f = 0; f < this.length; f++) {
  42579. var D = this.words[f], F = (16777215 & (D << W | y)).toString(16);
  42580. y = D >>> 24 - W & 16777215, (W += 2) >= 26 && (W -= 26, f--), w = y !== 0 || f !== this.length - 1 ? b[6 - F.length] + F + w : F + w;
  42581. }
  42582. for (y !== 0 && (w = y.toString(16) + w); w.length % G != 0; ) w = "0" + w;
  42583. return this.negative !== 0 && (w = "-" + w), w;
  42584. }
  42585. if (B === (0 | B) && B >= 2 && B <= 36) {
  42586. var T = u[B], Q = m[B];
  42587. w = "";
  42588. var P = this.clone();
  42589. for (P.negative = 0; !P.isZero(); ) {
  42590. var L = P.modrn(Q).toString(B);
  42591. w = (P = P.idivn(Q)).isZero() ? L + w : b[T - L.length] + L + w;
  42592. }
  42593. for (this.isZero() && (w = "0" + w); w.length % G != 0; ) w = "0" + w;
  42594. return this.negative !== 0 && (w = "-" + w), w;
  42595. }
  42596. s(!1, "Base should be between 2 and 36");
  42597. }, n.prototype.toNumber = function() {
  42598. var B = this.words[0];
  42599. return this.length === 2 ? B += 67108864 * this.words[1] : this.length === 3 && this.words[2] === 1 ? B += 4503599627370496 + 67108864 * this.words[1] : this.length > 2 && s(!1, "Number can only safely store up to 53 bits"), this.negative !== 0 ? -B : B;
  42600. }, n.prototype.toJSON = function() {
  42601. return this.toString(16, 2);
  42602. }, a && (n.prototype.toBuffer = function(B, G) {
  42603. return this.toArrayLike(a, B, G);
  42604. }), n.prototype.toArray = function(B, G) {
  42605. return this.toArrayLike(Array, B, G);
  42606. };
  42607. function Z(B, G, w) {
  42608. w.negative = G.negative ^ B.negative;
  42609. var W = B.length + G.length | 0;
  42610. w.length = W, W = W - 1 | 0;
  42611. var y = 0 | B.words[0], f = 0 | G.words[0], D = y * f, F = 67108863 & D, T = D / 67108864 | 0;
  42612. w.words[0] = F;
  42613. for (var Q = 1; Q < W; Q++) {
  42614. for (var P = T >>> 26, L = 67108863 & T, E = Math.min(Q, G.length - 1), J = Math.max(0, Q - B.length + 1); J <= E; J++) {
  42615. var k = Q - J | 0;
  42616. P += (D = (y = 0 | B.words[k]) * (f = 0 | G.words[J]) + L) / 67108864 | 0, L = 67108863 & D;
  42617. }
  42618. w.words[Q] = 0 | L, T = 0 | P;
  42619. }
  42620. return T !== 0 ? w.words[Q] = 0 | T : w.length--, w._strip();
  42621. }
  42622. n.prototype.toArrayLike = function(B, G, w) {
  42623. this._strip();
  42624. var W = this.byteLength(), y = w || Math.max(1, W);
  42625. s(W <= y, "byte array longer than desired length"), s(y > 0, "Requested array length <= 0");
  42626. var f = function(D, F) {
  42627. return D.allocUnsafe ? D.allocUnsafe(F) : new D(F);
  42628. }(B, y);
  42629. return this["_toArrayLike" + (G === "le" ? "LE" : "BE")](f, W), f;
  42630. }, n.prototype._toArrayLikeLE = function(B, G) {
  42631. for (var w = 0, W = 0, y = 0, f = 0; y < this.length; y++) {
  42632. var D = this.words[y] << f | W;
  42633. B[w++] = 255 & D, w < B.length && (B[w++] = D >> 8 & 255), w < B.length && (B[w++] = D >> 16 & 255), f === 6 ? (w < B.length && (B[w++] = D >> 24 & 255), W = 0, f = 0) : (W = D >>> 24, f += 2);
  42634. }
  42635. if (w < B.length) for (B[w++] = W; w < B.length; ) B[w++] = 0;
  42636. }, n.prototype._toArrayLikeBE = function(B, G) {
  42637. for (var w = B.length - 1, W = 0, y = 0, f = 0; y < this.length; y++) {
  42638. var D = this.words[y] << f | W;
  42639. B[w--] = 255 & D, w >= 0 && (B[w--] = D >> 8 & 255), w >= 0 && (B[w--] = D >> 16 & 255), f === 6 ? (w >= 0 && (B[w--] = D >> 24 & 255), W = 0, f = 0) : (W = D >>> 24, f += 2);
  42640. }
  42641. if (w >= 0) for (B[w--] = W; w >= 0; ) B[w--] = 0;
  42642. }, Math.clz32 ? n.prototype._countBits = function(B) {
  42643. return 32 - Math.clz32(B);
  42644. } : n.prototype._countBits = function(B) {
  42645. var G = B, w = 0;
  42646. return G >= 4096 && (w += 13, G >>>= 13), G >= 64 && (w += 7, G >>>= 7), G >= 8 && (w += 4, G >>>= 4), G >= 2 && (w += 2, G >>>= 2), w + G;
  42647. }, n.prototype._zeroBits = function(B) {
  42648. if (B === 0) return 26;
  42649. var G = B, w = 0;
  42650. return (8191 & G) == 0 && (w += 13, G >>>= 13), (127 & G) == 0 && (w += 7, G >>>= 7), (15 & G) == 0 && (w += 4, G >>>= 4), (3 & G) == 0 && (w += 2, G >>>= 2), (1 & G) == 0 && w++, w;
  42651. }, n.prototype.bitLength = function() {
  42652. var B = this.words[this.length - 1], G = this._countBits(B);
  42653. return 26 * (this.length - 1) + G;
  42654. }, n.prototype.zeroBits = function() {
  42655. if (this.isZero()) return 0;
  42656. for (var B = 0, G = 0; G < this.length; G++) {
  42657. var w = this._zeroBits(this.words[G]);
  42658. if (B += w, w !== 26) break;
  42659. }
  42660. return B;
  42661. }, n.prototype.byteLength = function() {
  42662. return Math.ceil(this.bitLength() / 8);
  42663. }, n.prototype.toTwos = function(B) {
  42664. return this.negative !== 0 ? this.abs().inotn(B).iaddn(1) : this.clone();
  42665. }, n.prototype.fromTwos = function(B) {
  42666. return this.testn(B - 1) ? this.notn(B).iaddn(1).ineg() : this.clone();
  42667. }, n.prototype.isNeg = function() {
  42668. return this.negative !== 0;
  42669. }, n.prototype.neg = function() {
  42670. return this.clone().ineg();
  42671. }, n.prototype.ineg = function() {
  42672. return this.isZero() || (this.negative ^= 1), this;
  42673. }, n.prototype.iuor = function(B) {
  42674. for (; this.length < B.length; ) this.words[this.length++] = 0;
  42675. for (var G = 0; G < B.length; G++) this.words[G] = this.words[G] | B.words[G];
  42676. return this._strip();
  42677. }, n.prototype.ior = function(B) {
  42678. return s((this.negative | B.negative) == 0), this.iuor(B);
  42679. }, n.prototype.or = function(B) {
  42680. return this.length > B.length ? this.clone().ior(B) : B.clone().ior(this);
  42681. }, n.prototype.uor = function(B) {
  42682. return this.length > B.length ? this.clone().iuor(B) : B.clone().iuor(this);
  42683. }, n.prototype.iuand = function(B) {
  42684. var G;
  42685. G = this.length > B.length ? B : this;
  42686. for (var w = 0; w < G.length; w++) this.words[w] = this.words[w] & B.words[w];
  42687. return this.length = G.length, this._strip();
  42688. }, n.prototype.iand = function(B) {
  42689. return s((this.negative | B.negative) == 0), this.iuand(B);
  42690. }, n.prototype.and = function(B) {
  42691. return this.length > B.length ? this.clone().iand(B) : B.clone().iand(this);
  42692. }, n.prototype.uand = function(B) {
  42693. return this.length > B.length ? this.clone().iuand(B) : B.clone().iuand(this);
  42694. }, n.prototype.iuxor = function(B) {
  42695. var G, w;
  42696. this.length > B.length ? (G = this, w = B) : (G = B, w = this);
  42697. for (var W = 0; W < w.length; W++) this.words[W] = G.words[W] ^ w.words[W];
  42698. if (this !== G) for (; W < G.length; W++) this.words[W] = G.words[W];
  42699. return this.length = G.length, this._strip();
  42700. }, n.prototype.ixor = function(B) {
  42701. return s((this.negative | B.negative) == 0), this.iuxor(B);
  42702. }, n.prototype.xor = function(B) {
  42703. return this.length > B.length ? this.clone().ixor(B) : B.clone().ixor(this);
  42704. }, n.prototype.uxor = function(B) {
  42705. return this.length > B.length ? this.clone().iuxor(B) : B.clone().iuxor(this);
  42706. }, n.prototype.inotn = function(B) {
  42707. s(typeof B == "number" && B >= 0);
  42708. var G = 0 | Math.ceil(B / 26), w = B % 26;
  42709. this._expand(G), w > 0 && G--;
  42710. for (var W = 0; W < G; W++) this.words[W] = 67108863 & ~this.words[W];
  42711. return w > 0 && (this.words[W] = ~this.words[W] & 67108863 >> 26 - w), this._strip();
  42712. }, n.prototype.notn = function(B) {
  42713. return this.clone().inotn(B);
  42714. }, n.prototype.setn = function(B, G) {
  42715. s(typeof B == "number" && B >= 0);
  42716. var w = B / 26 | 0, W = B % 26;
  42717. return this._expand(w + 1), this.words[w] = G ? this.words[w] | 1 << W : this.words[w] & ~(1 << W), this._strip();
  42718. }, n.prototype.iadd = function(B) {
  42719. var G, w, W;
  42720. if (this.negative !== 0 && B.negative === 0) return this.negative = 0, G = this.isub(B), this.negative ^= 1, this._normSign();
  42721. if (this.negative === 0 && B.negative !== 0) return B.negative = 0, G = this.isub(B), B.negative = 1, G._normSign();
  42722. this.length > B.length ? (w = this, W = B) : (w = B, W = this);
  42723. for (var y = 0, f = 0; f < W.length; f++) G = (0 | w.words[f]) + (0 | W.words[f]) + y, this.words[f] = 67108863 & G, y = G >>> 26;
  42724. for (; y !== 0 && f < w.length; f++) G = (0 | w.words[f]) + y, this.words[f] = 67108863 & G, y = G >>> 26;
  42725. if (this.length = w.length, y !== 0) this.words[this.length] = y, this.length++;
  42726. else if (w !== this) for (; f < w.length; f++) this.words[f] = w.words[f];
  42727. return this;
  42728. }, n.prototype.add = function(B) {
  42729. var G;
  42730. return B.negative !== 0 && this.negative === 0 ? (B.negative = 0, G = this.sub(B), B.negative ^= 1, G) : B.negative === 0 && this.negative !== 0 ? (this.negative = 0, G = B.sub(this), this.negative = 1, G) : this.length > B.length ? this.clone().iadd(B) : B.clone().iadd(this);
  42731. }, n.prototype.isub = function(B) {
  42732. if (B.negative !== 0) {
  42733. B.negative = 0;
  42734. var G = this.iadd(B);
  42735. return B.negative = 1, G._normSign();
  42736. }
  42737. if (this.negative !== 0) return this.negative = 0, this.iadd(B), this.negative = 1, this._normSign();
  42738. var w, W, y = this.cmp(B);
  42739. if (y === 0) return this.negative = 0, this.length = 1, this.words[0] = 0, this;
  42740. y > 0 ? (w = this, W = B) : (w = B, W = this);
  42741. for (var f = 0, D = 0; D < W.length; D++) f = (G = (0 | w.words[D]) - (0 | W.words[D]) + f) >> 26, this.words[D] = 67108863 & G;
  42742. for (; f !== 0 && D < w.length; D++) f = (G = (0 | w.words[D]) + f) >> 26, this.words[D] = 67108863 & G;
  42743. if (f === 0 && D < w.length && w !== this) for (; D < w.length; D++) this.words[D] = w.words[D];
  42744. return this.length = Math.max(this.length, D), w !== this && (this.negative = 1), this._strip();
  42745. }, n.prototype.sub = function(B) {
  42746. return this.clone().isub(B);
  42747. };
  42748. var p = function(B, G, w) {
  42749. var W, y, f, D = B.words, F = G.words, T = w.words, Q = 0, P = 0 | D[0], L = 8191 & P, E = P >>> 13, J = 0 | D[1], k = 8191 & J, j = J >>> 13, q = 0 | D[2], Cg = 8191 & q, Ig = q >>> 13, x = 0 | D[3], Ag = 8191 & x, eg = x >>> 13, O = 0 | D[4], _ = 8191 & O, gg = O >>> 13, lg = 0 | D[5], ng = 8191 & lg, sg = lg >>> 13, og = 0 | D[6], cg = 8191 & og, rg = og >>> 13, dg = 0 | D[7], Bg = 8191 & dg, Zg = dg >>> 13, Xg = 0 | D[8], Kg = 8191 & Xg, kg = Xg >>> 13, Wg = 0 | D[9], Ng = 8191 & Wg, wg = Wg >>> 13, fg = 0 | F[0], Jg = 8191 & fg, zg = fg >>> 13, cI = 0 | F[1], YI = 8191 & cI, Eg = cI >>> 13, aI = 0 | F[2], dI = 8191 & aI, _g = aI >>> 13, xI = 0 | F[3], SI = 8191 & xI, eI = xI >>> 13, NI = 0 | F[4], EI = 8191 & NI, oI = NI >>> 13, LI = 0 | F[5], pg = 8191 & LI, uI = LI >>> 13, hg = 0 | F[6], bg = 8191 & hg, Rg = hg >>> 13, Tg = 0 | F[7], rI = 8191 & Tg, jg = Tg >>> 13, GI = 0 | F[8], nI = 8191 & GI, CI = GI >>> 13, WI = 0 | F[9], mI = 8191 & WI, VI = WI >>> 13;
  42750. w.negative = B.negative ^ G.negative, w.length = 19;
  42751. var yC = (Q + (W = Math.imul(L, Jg)) | 0) + ((8191 & (y = (y = Math.imul(L, zg)) + Math.imul(E, Jg) | 0)) << 13) | 0;
  42752. Q = ((f = Math.imul(E, zg)) + (y >>> 13) | 0) + (yC >>> 26) | 0, yC &= 67108863, W = Math.imul(k, Jg), y = (y = Math.imul(k, zg)) + Math.imul(j, Jg) | 0, f = Math.imul(j, zg);
  42753. var gC = (Q + (W = W + Math.imul(L, YI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, Eg) | 0) + Math.imul(E, YI) | 0)) << 13) | 0;
  42754. Q = ((f = f + Math.imul(E, Eg) | 0) + (y >>> 13) | 0) + (gC >>> 26) | 0, gC &= 67108863, W = Math.imul(Cg, Jg), y = (y = Math.imul(Cg, zg)) + Math.imul(Ig, Jg) | 0, f = Math.imul(Ig, zg), W = W + Math.imul(k, YI) | 0, y = (y = y + Math.imul(k, Eg) | 0) + Math.imul(j, YI) | 0, f = f + Math.imul(j, Eg) | 0;
  42755. var It = (Q + (W = W + Math.imul(L, dI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, _g) | 0) + Math.imul(E, dI) | 0)) << 13) | 0;
  42756. Q = ((f = f + Math.imul(E, _g) | 0) + (y >>> 13) | 0) + (It >>> 26) | 0, It &= 67108863, W = Math.imul(Ag, Jg), y = (y = Math.imul(Ag, zg)) + Math.imul(eg, Jg) | 0, f = Math.imul(eg, zg), W = W + Math.imul(Cg, YI) | 0, y = (y = y + Math.imul(Cg, Eg) | 0) + Math.imul(Ig, YI) | 0, f = f + Math.imul(Ig, Eg) | 0, W = W + Math.imul(k, dI) | 0, y = (y = y + Math.imul(k, _g) | 0) + Math.imul(j, dI) | 0, f = f + Math.imul(j, _g) | 0;
  42757. var dC = (Q + (W = W + Math.imul(L, SI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, eI) | 0) + Math.imul(E, SI) | 0)) << 13) | 0;
  42758. Q = ((f = f + Math.imul(E, eI) | 0) + (y >>> 13) | 0) + (dC >>> 26) | 0, dC &= 67108863, W = Math.imul(_, Jg), y = (y = Math.imul(_, zg)) + Math.imul(gg, Jg) | 0, f = Math.imul(gg, zg), W = W + Math.imul(Ag, YI) | 0, y = (y = y + Math.imul(Ag, Eg) | 0) + Math.imul(eg, YI) | 0, f = f + Math.imul(eg, Eg) | 0, W = W + Math.imul(Cg, dI) | 0, y = (y = y + Math.imul(Cg, _g) | 0) + Math.imul(Ig, dI) | 0, f = f + Math.imul(Ig, _g) | 0, W = W + Math.imul(k, SI) | 0, y = (y = y + Math.imul(k, eI) | 0) + Math.imul(j, SI) | 0, f = f + Math.imul(j, eI) | 0;
  42759. var Tt = (Q + (W = W + Math.imul(L, EI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, oI) | 0) + Math.imul(E, EI) | 0)) << 13) | 0;
  42760. Q = ((f = f + Math.imul(E, oI) | 0) + (y >>> 13) | 0) + (Tt >>> 26) | 0, Tt &= 67108863, W = Math.imul(ng, Jg), y = (y = Math.imul(ng, zg)) + Math.imul(sg, Jg) | 0, f = Math.imul(sg, zg), W = W + Math.imul(_, YI) | 0, y = (y = y + Math.imul(_, Eg) | 0) + Math.imul(gg, YI) | 0, f = f + Math.imul(gg, Eg) | 0, W = W + Math.imul(Ag, dI) | 0, y = (y = y + Math.imul(Ag, _g) | 0) + Math.imul(eg, dI) | 0, f = f + Math.imul(eg, _g) | 0, W = W + Math.imul(Cg, SI) | 0, y = (y = y + Math.imul(Cg, eI) | 0) + Math.imul(Ig, SI) | 0, f = f + Math.imul(Ig, eI) | 0, W = W + Math.imul(k, EI) | 0, y = (y = y + Math.imul(k, oI) | 0) + Math.imul(j, EI) | 0, f = f + Math.imul(j, oI) | 0;
  42761. var ag = (Q + (W = W + Math.imul(L, pg) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, uI) | 0) + Math.imul(E, pg) | 0)) << 13) | 0;
  42762. Q = ((f = f + Math.imul(E, uI) | 0) + (y >>> 13) | 0) + (ag >>> 26) | 0, ag &= 67108863, W = Math.imul(cg, Jg), y = (y = Math.imul(cg, zg)) + Math.imul(rg, Jg) | 0, f = Math.imul(rg, zg), W = W + Math.imul(ng, YI) | 0, y = (y = y + Math.imul(ng, Eg) | 0) + Math.imul(sg, YI) | 0, f = f + Math.imul(sg, Eg) | 0, W = W + Math.imul(_, dI) | 0, y = (y = y + Math.imul(_, _g) | 0) + Math.imul(gg, dI) | 0, f = f + Math.imul(gg, _g) | 0, W = W + Math.imul(Ag, SI) | 0, y = (y = y + Math.imul(Ag, eI) | 0) + Math.imul(eg, SI) | 0, f = f + Math.imul(eg, eI) | 0, W = W + Math.imul(Cg, EI) | 0, y = (y = y + Math.imul(Cg, oI) | 0) + Math.imul(Ig, EI) | 0, f = f + Math.imul(Ig, oI) | 0, W = W + Math.imul(k, pg) | 0, y = (y = y + Math.imul(k, uI) | 0) + Math.imul(j, pg) | 0, f = f + Math.imul(j, uI) | 0;
  42763. var mg = (Q + (W = W + Math.imul(L, bg) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, Rg) | 0) + Math.imul(E, bg) | 0)) << 13) | 0;
  42764. Q = ((f = f + Math.imul(E, Rg) | 0) + (y >>> 13) | 0) + (mg >>> 26) | 0, mg &= 67108863, W = Math.imul(Bg, Jg), y = (y = Math.imul(Bg, zg)) + Math.imul(Zg, Jg) | 0, f = Math.imul(Zg, zg), W = W + Math.imul(cg, YI) | 0, y = (y = y + Math.imul(cg, Eg) | 0) + Math.imul(rg, YI) | 0, f = f + Math.imul(rg, Eg) | 0, W = W + Math.imul(ng, dI) | 0, y = (y = y + Math.imul(ng, _g) | 0) + Math.imul(sg, dI) | 0, f = f + Math.imul(sg, _g) | 0, W = W + Math.imul(_, SI) | 0, y = (y = y + Math.imul(_, eI) | 0) + Math.imul(gg, SI) | 0, f = f + Math.imul(gg, eI) | 0, W = W + Math.imul(Ag, EI) | 0, y = (y = y + Math.imul(Ag, oI) | 0) + Math.imul(eg, EI) | 0, f = f + Math.imul(eg, oI) | 0, W = W + Math.imul(Cg, pg) | 0, y = (y = y + Math.imul(Cg, uI) | 0) + Math.imul(Ig, pg) | 0, f = f + Math.imul(Ig, uI) | 0, W = W + Math.imul(k, bg) | 0, y = (y = y + Math.imul(k, Rg) | 0) + Math.imul(j, bg) | 0, f = f + Math.imul(j, Rg) | 0;
  42765. var Sg = (Q + (W = W + Math.imul(L, rI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, jg) | 0) + Math.imul(E, rI) | 0)) << 13) | 0;
  42766. Q = ((f = f + Math.imul(E, jg) | 0) + (y >>> 13) | 0) + (Sg >>> 26) | 0, Sg &= 67108863, W = Math.imul(Kg, Jg), y = (y = Math.imul(Kg, zg)) + Math.imul(kg, Jg) | 0, f = Math.imul(kg, zg), W = W + Math.imul(Bg, YI) | 0, y = (y = y + Math.imul(Bg, Eg) | 0) + Math.imul(Zg, YI) | 0, f = f + Math.imul(Zg, Eg) | 0, W = W + Math.imul(cg, dI) | 0, y = (y = y + Math.imul(cg, _g) | 0) + Math.imul(rg, dI) | 0, f = f + Math.imul(rg, _g) | 0, W = W + Math.imul(ng, SI) | 0, y = (y = y + Math.imul(ng, eI) | 0) + Math.imul(sg, SI) | 0, f = f + Math.imul(sg, eI) | 0, W = W + Math.imul(_, EI) | 0, y = (y = y + Math.imul(_, oI) | 0) + Math.imul(gg, EI) | 0, f = f + Math.imul(gg, oI) | 0, W = W + Math.imul(Ag, pg) | 0, y = (y = y + Math.imul(Ag, uI) | 0) + Math.imul(eg, pg) | 0, f = f + Math.imul(eg, uI) | 0, W = W + Math.imul(Cg, bg) | 0, y = (y = y + Math.imul(Cg, Rg) | 0) + Math.imul(Ig, bg) | 0, f = f + Math.imul(Ig, Rg) | 0, W = W + Math.imul(k, rI) | 0, y = (y = y + Math.imul(k, jg) | 0) + Math.imul(j, rI) | 0, f = f + Math.imul(j, jg) | 0;
  42767. var Fg = (Q + (W = W + Math.imul(L, nI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, CI) | 0) + Math.imul(E, nI) | 0)) << 13) | 0;
  42768. Q = ((f = f + Math.imul(E, CI) | 0) + (y >>> 13) | 0) + (Fg >>> 26) | 0, Fg &= 67108863, W = Math.imul(Ng, Jg), y = (y = Math.imul(Ng, zg)) + Math.imul(wg, Jg) | 0, f = Math.imul(wg, zg), W = W + Math.imul(Kg, YI) | 0, y = (y = y + Math.imul(Kg, Eg) | 0) + Math.imul(kg, YI) | 0, f = f + Math.imul(kg, Eg) | 0, W = W + Math.imul(Bg, dI) | 0, y = (y = y + Math.imul(Bg, _g) | 0) + Math.imul(Zg, dI) | 0, f = f + Math.imul(Zg, _g) | 0, W = W + Math.imul(cg, SI) | 0, y = (y = y + Math.imul(cg, eI) | 0) + Math.imul(rg, SI) | 0, f = f + Math.imul(rg, eI) | 0, W = W + Math.imul(ng, EI) | 0, y = (y = y + Math.imul(ng, oI) | 0) + Math.imul(sg, EI) | 0, f = f + Math.imul(sg, oI) | 0, W = W + Math.imul(_, pg) | 0, y = (y = y + Math.imul(_, uI) | 0) + Math.imul(gg, pg) | 0, f = f + Math.imul(gg, uI) | 0, W = W + Math.imul(Ag, bg) | 0, y = (y = y + Math.imul(Ag, Rg) | 0) + Math.imul(eg, bg) | 0, f = f + Math.imul(eg, Rg) | 0, W = W + Math.imul(Cg, rI) | 0, y = (y = y + Math.imul(Cg, jg) | 0) + Math.imul(Ig, rI) | 0, f = f + Math.imul(Ig, jg) | 0, W = W + Math.imul(k, nI) | 0, y = (y = y + Math.imul(k, CI) | 0) + Math.imul(j, nI) | 0, f = f + Math.imul(j, CI) | 0;
  42769. var tI = (Q + (W = W + Math.imul(L, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, VI) | 0) + Math.imul(E, mI) | 0)) << 13) | 0;
  42770. Q = ((f = f + Math.imul(E, VI) | 0) + (y >>> 13) | 0) + (tI >>> 26) | 0, tI &= 67108863, W = Math.imul(Ng, YI), y = (y = Math.imul(Ng, Eg)) + Math.imul(wg, YI) | 0, f = Math.imul(wg, Eg), W = W + Math.imul(Kg, dI) | 0, y = (y = y + Math.imul(Kg, _g) | 0) + Math.imul(kg, dI) | 0, f = f + Math.imul(kg, _g) | 0, W = W + Math.imul(Bg, SI) | 0, y = (y = y + Math.imul(Bg, eI) | 0) + Math.imul(Zg, SI) | 0, f = f + Math.imul(Zg, eI) | 0, W = W + Math.imul(cg, EI) | 0, y = (y = y + Math.imul(cg, oI) | 0) + Math.imul(rg, EI) | 0, f = f + Math.imul(rg, oI) | 0, W = W + Math.imul(ng, pg) | 0, y = (y = y + Math.imul(ng, uI) | 0) + Math.imul(sg, pg) | 0, f = f + Math.imul(sg, uI) | 0, W = W + Math.imul(_, bg) | 0, y = (y = y + Math.imul(_, Rg) | 0) + Math.imul(gg, bg) | 0, f = f + Math.imul(gg, Rg) | 0, W = W + Math.imul(Ag, rI) | 0, y = (y = y + Math.imul(Ag, jg) | 0) + Math.imul(eg, rI) | 0, f = f + Math.imul(eg, jg) | 0, W = W + Math.imul(Cg, nI) | 0, y = (y = y + Math.imul(Cg, CI) | 0) + Math.imul(Ig, nI) | 0, f = f + Math.imul(Ig, CI) | 0;
  42771. var vg = (Q + (W = W + Math.imul(k, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(k, VI) | 0) + Math.imul(j, mI) | 0)) << 13) | 0;
  42772. Q = ((f = f + Math.imul(j, VI) | 0) + (y >>> 13) | 0) + (vg >>> 26) | 0, vg &= 67108863, W = Math.imul(Ng, dI), y = (y = Math.imul(Ng, _g)) + Math.imul(wg, dI) | 0, f = Math.imul(wg, _g), W = W + Math.imul(Kg, SI) | 0, y = (y = y + Math.imul(Kg, eI) | 0) + Math.imul(kg, SI) | 0, f = f + Math.imul(kg, eI) | 0, W = W + Math.imul(Bg, EI) | 0, y = (y = y + Math.imul(Bg, oI) | 0) + Math.imul(Zg, EI) | 0, f = f + Math.imul(Zg, oI) | 0, W = W + Math.imul(cg, pg) | 0, y = (y = y + Math.imul(cg, uI) | 0) + Math.imul(rg, pg) | 0, f = f + Math.imul(rg, uI) | 0, W = W + Math.imul(ng, bg) | 0, y = (y = y + Math.imul(ng, Rg) | 0) + Math.imul(sg, bg) | 0, f = f + Math.imul(sg, Rg) | 0, W = W + Math.imul(_, rI) | 0, y = (y = y + Math.imul(_, jg) | 0) + Math.imul(gg, rI) | 0, f = f + Math.imul(gg, jg) | 0, W = W + Math.imul(Ag, nI) | 0, y = (y = y + Math.imul(Ag, CI) | 0) + Math.imul(eg, nI) | 0, f = f + Math.imul(eg, CI) | 0;
  42773. var xg = (Q + (W = W + Math.imul(Cg, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(Cg, VI) | 0) + Math.imul(Ig, mI) | 0)) << 13) | 0;
  42774. Q = ((f = f + Math.imul(Ig, VI) | 0) + (y >>> 13) | 0) + (xg >>> 26) | 0, xg &= 67108863, W = Math.imul(Ng, SI), y = (y = Math.imul(Ng, eI)) + Math.imul(wg, SI) | 0, f = Math.imul(wg, eI), W = W + Math.imul(Kg, EI) | 0, y = (y = y + Math.imul(Kg, oI) | 0) + Math.imul(kg, EI) | 0, f = f + Math.imul(kg, oI) | 0, W = W + Math.imul(Bg, pg) | 0, y = (y = y + Math.imul(Bg, uI) | 0) + Math.imul(Zg, pg) | 0, f = f + Math.imul(Zg, uI) | 0, W = W + Math.imul(cg, bg) | 0, y = (y = y + Math.imul(cg, Rg) | 0) + Math.imul(rg, bg) | 0, f = f + Math.imul(rg, Rg) | 0, W = W + Math.imul(ng, rI) | 0, y = (y = y + Math.imul(ng, jg) | 0) + Math.imul(sg, rI) | 0, f = f + Math.imul(sg, jg) | 0, W = W + Math.imul(_, nI) | 0, y = (y = y + Math.imul(_, CI) | 0) + Math.imul(gg, nI) | 0, f = f + Math.imul(gg, CI) | 0;
  42775. var vI = (Q + (W = W + Math.imul(Ag, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(Ag, VI) | 0) + Math.imul(eg, mI) | 0)) << 13) | 0;
  42776. Q = ((f = f + Math.imul(eg, VI) | 0) + (y >>> 13) | 0) + (vI >>> 26) | 0, vI &= 67108863, W = Math.imul(Ng, EI), y = (y = Math.imul(Ng, oI)) + Math.imul(wg, EI) | 0, f = Math.imul(wg, oI), W = W + Math.imul(Kg, pg) | 0, y = (y = y + Math.imul(Kg, uI) | 0) + Math.imul(kg, pg) | 0, f = f + Math.imul(kg, uI) | 0, W = W + Math.imul(Bg, bg) | 0, y = (y = y + Math.imul(Bg, Rg) | 0) + Math.imul(Zg, bg) | 0, f = f + Math.imul(Zg, Rg) | 0, W = W + Math.imul(cg, rI) | 0, y = (y = y + Math.imul(cg, jg) | 0) + Math.imul(rg, rI) | 0, f = f + Math.imul(rg, jg) | 0, W = W + Math.imul(ng, nI) | 0, y = (y = y + Math.imul(ng, CI) | 0) + Math.imul(sg, nI) | 0, f = f + Math.imul(sg, CI) | 0;
  42777. var fI = (Q + (W = W + Math.imul(_, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(_, VI) | 0) + Math.imul(gg, mI) | 0)) << 13) | 0;
  42778. Q = ((f = f + Math.imul(gg, VI) | 0) + (y >>> 13) | 0) + (fI >>> 26) | 0, fI &= 67108863, W = Math.imul(Ng, pg), y = (y = Math.imul(Ng, uI)) + Math.imul(wg, pg) | 0, f = Math.imul(wg, uI), W = W + Math.imul(Kg, bg) | 0, y = (y = y + Math.imul(Kg, Rg) | 0) + Math.imul(kg, bg) | 0, f = f + Math.imul(kg, Rg) | 0, W = W + Math.imul(Bg, rI) | 0, y = (y = y + Math.imul(Bg, jg) | 0) + Math.imul(Zg, rI) | 0, f = f + Math.imul(Zg, jg) | 0, W = W + Math.imul(cg, nI) | 0, y = (y = y + Math.imul(cg, CI) | 0) + Math.imul(rg, nI) | 0, f = f + Math.imul(rg, CI) | 0;
  42779. var MI = (Q + (W = W + Math.imul(ng, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(ng, VI) | 0) + Math.imul(sg, mI) | 0)) << 13) | 0;
  42780. Q = ((f = f + Math.imul(sg, VI) | 0) + (y >>> 13) | 0) + (MI >>> 26) | 0, MI &= 67108863, W = Math.imul(Ng, bg), y = (y = Math.imul(Ng, Rg)) + Math.imul(wg, bg) | 0, f = Math.imul(wg, Rg), W = W + Math.imul(Kg, rI) | 0, y = (y = y + Math.imul(Kg, jg) | 0) + Math.imul(kg, rI) | 0, f = f + Math.imul(kg, jg) | 0, W = W + Math.imul(Bg, nI) | 0, y = (y = y + Math.imul(Bg, CI) | 0) + Math.imul(Zg, nI) | 0, f = f + Math.imul(Zg, CI) | 0;
  42781. var hI = (Q + (W = W + Math.imul(cg, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(cg, VI) | 0) + Math.imul(rg, mI) | 0)) << 13) | 0;
  42782. Q = ((f = f + Math.imul(rg, VI) | 0) + (y >>> 13) | 0) + (hI >>> 26) | 0, hI &= 67108863, W = Math.imul(Ng, rI), y = (y = Math.imul(Ng, jg)) + Math.imul(wg, rI) | 0, f = Math.imul(wg, jg), W = W + Math.imul(Kg, nI) | 0, y = (y = y + Math.imul(Kg, CI) | 0) + Math.imul(kg, nI) | 0, f = f + Math.imul(kg, CI) | 0;
  42783. var AC = (Q + (W = W + Math.imul(Bg, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(Bg, VI) | 0) + Math.imul(Zg, mI) | 0)) << 13) | 0;
  42784. Q = ((f = f + Math.imul(Zg, VI) | 0) + (y >>> 13) | 0) + (AC >>> 26) | 0, AC &= 67108863, W = Math.imul(Ng, nI), y = (y = Math.imul(Ng, CI)) + Math.imul(wg, nI) | 0, f = Math.imul(wg, CI);
  42785. var PI = (Q + (W = W + Math.imul(Kg, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(Kg, VI) | 0) + Math.imul(kg, mI) | 0)) << 13) | 0;
  42786. Q = ((f = f + Math.imul(kg, VI) | 0) + (y >>> 13) | 0) + (PI >>> 26) | 0, PI &= 67108863;
  42787. var jI = (Q + (W = Math.imul(Ng, mI)) | 0) + ((8191 & (y = (y = Math.imul(Ng, VI)) + Math.imul(wg, mI) | 0)) << 13) | 0;
  42788. return Q = ((f = Math.imul(wg, VI)) + (y >>> 13) | 0) + (jI >>> 26) | 0, jI &= 67108863, T[0] = yC, T[1] = gC, T[2] = It, T[3] = dC, T[4] = Tt, T[5] = ag, T[6] = mg, T[7] = Sg, T[8] = Fg, T[9] = tI, T[10] = vg, T[11] = xg, T[12] = vI, T[13] = fI, T[14] = MI, T[15] = hI, T[16] = AC, T[17] = PI, T[18] = jI, Q !== 0 && (T[19] = Q, w.length++), w;
  42789. };
  42790. function Y(B, G, w) {
  42791. w.negative = G.negative ^ B.negative, w.length = B.length + G.length;
  42792. for (var W = 0, y = 0, f = 0; f < w.length - 1; f++) {
  42793. var D = y;
  42794. y = 0;
  42795. for (var F = 67108863 & W, T = Math.min(f, G.length - 1), Q = Math.max(0, f - B.length + 1); Q <= T; Q++) {
  42796. var P = f - Q, L = (0 | B.words[P]) * (0 | G.words[Q]), E = 67108863 & L;
  42797. F = 67108863 & (E = E + F | 0), y += (D = (D = D + (L / 67108864 | 0) | 0) + (E >>> 26) | 0) >>> 26, D &= 67108863;
  42798. }
  42799. w.words[f] = F, W = D, D = y;
  42800. }
  42801. return W !== 0 ? w.words[f] = W : w.length--, w._strip();
  42802. }
  42803. function R(B, G, w) {
  42804. return Y(B, G, w);
  42805. }
  42806. Math.imul || (p = Z), n.prototype.mulTo = function(B, G) {
  42807. var w = this.length + B.length;
  42808. return this.length === 10 && B.length === 10 ? p(this, B, G) : w < 63 ? Z(this, B, G) : w < 1024 ? Y(this, B, G) : R(this, B, G);
  42809. }, n.prototype.mul = function(B) {
  42810. var G = new n(null);
  42811. return G.words = new Array(this.length + B.length), this.mulTo(B, G);
  42812. }, n.prototype.mulf = function(B) {
  42813. var G = new n(null);
  42814. return G.words = new Array(this.length + B.length), R(this, B, G);
  42815. }, n.prototype.imul = function(B) {
  42816. return this.clone().mulTo(B, this);
  42817. }, n.prototype.imuln = function(B) {
  42818. var G = B < 0;
  42819. G && (B = -B), s(typeof B == "number"), s(B < 67108864);
  42820. for (var w = 0, W = 0; W < this.length; W++) {
  42821. var y = (0 | this.words[W]) * B, f = (67108863 & y) + (67108863 & w);
  42822. w >>= 26, w += y / 67108864 | 0, w += f >>> 26, this.words[W] = 67108863 & f;
  42823. }
  42824. return w !== 0 && (this.words[W] = w, this.length++), G ? this.ineg() : this;
  42825. }, n.prototype.muln = function(B) {
  42826. return this.clone().imuln(B);
  42827. }, n.prototype.sqr = function() {
  42828. return this.mul(this);
  42829. }, n.prototype.isqr = function() {
  42830. return this.imul(this.clone());
  42831. }, n.prototype.pow = function(B) {
  42832. var G = function(f) {
  42833. for (var D = new Array(f.bitLength()), F = 0; F < D.length; F++) {
  42834. var T = F / 26 | 0, Q = F % 26;
  42835. D[F] = f.words[T] >>> Q & 1;
  42836. }
  42837. return D;
  42838. }(B);
  42839. if (G.length === 0) return new n(1);
  42840. for (var w = this, W = 0; W < G.length && G[W] === 0; W++, w = w.sqr()) ;
  42841. if (++W < G.length) for (var y = w.sqr(); W < G.length; W++, y = y.sqr()) G[W] !== 0 && (w = w.mul(y));
  42842. return w;
  42843. }, n.prototype.iushln = function(B) {
  42844. s(typeof B == "number" && B >= 0);
  42845. var G, w = B % 26, W = (B - w) / 26, y = 67108863 >>> 26 - w << 26 - w;
  42846. if (w !== 0) {
  42847. var f = 0;
  42848. for (G = 0; G < this.length; G++) {
  42849. var D = this.words[G] & y, F = (0 | this.words[G]) - D << w;
  42850. this.words[G] = F | f, f = D >>> 26 - w;
  42851. }
  42852. f && (this.words[G] = f, this.length++);
  42853. }
  42854. if (W !== 0) {
  42855. for (G = this.length - 1; G >= 0; G--) this.words[G + W] = this.words[G];
  42856. for (G = 0; G < W; G++) this.words[G] = 0;
  42857. this.length += W;
  42858. }
  42859. return this._strip();
  42860. }, n.prototype.ishln = function(B) {
  42861. return s(this.negative === 0), this.iushln(B);
  42862. }, n.prototype.iushrn = function(B, G, w) {
  42863. var W;
  42864. s(typeof B == "number" && B >= 0), W = G ? (G - G % 26) / 26 : 0;
  42865. var y = B % 26, f = Math.min((B - y) / 26, this.length), D = 67108863 ^ 67108863 >>> y << y, F = w;
  42866. if (W -= f, W = Math.max(0, W), F) {
  42867. for (var T = 0; T < f; T++) F.words[T] = this.words[T];
  42868. F.length = f;
  42869. }
  42870. if (f !== 0) if (this.length > f) for (this.length -= f, T = 0; T < this.length; T++) this.words[T] = this.words[T + f];
  42871. else this.words[0] = 0, this.length = 1;
  42872. var Q = 0;
  42873. for (T = this.length - 1; T >= 0 && (Q !== 0 || T >= W); T--) {
  42874. var P = 0 | this.words[T];
  42875. this.words[T] = Q << 26 - y | P >>> y, Q = P & D;
  42876. }
  42877. return F && Q !== 0 && (F.words[F.length++] = Q), this.length === 0 && (this.words[0] = 0, this.length = 1), this._strip();
  42878. }, n.prototype.ishrn = function(B, G, w) {
  42879. return s(this.negative === 0), this.iushrn(B, G, w);
  42880. }, n.prototype.shln = function(B) {
  42881. return this.clone().ishln(B);
  42882. }, n.prototype.ushln = function(B) {
  42883. return this.clone().iushln(B);
  42884. }, n.prototype.shrn = function(B) {
  42885. return this.clone().ishrn(B);
  42886. }, n.prototype.ushrn = function(B) {
  42887. return this.clone().iushrn(B);
  42888. }, n.prototype.testn = function(B) {
  42889. s(typeof B == "number" && B >= 0);
  42890. var G = B % 26, w = (B - G) / 26, W = 1 << G;
  42891. return !(this.length <= w) && !!(this.words[w] & W);
  42892. }, n.prototype.imaskn = function(B) {
  42893. s(typeof B == "number" && B >= 0);
  42894. var G = B % 26, w = (B - G) / 26;
  42895. if (s(this.negative === 0, "imaskn works only with positive numbers"), this.length <= w) return this;
  42896. if (G !== 0 && w++, this.length = Math.min(w, this.length), G !== 0) {
  42897. var W = 67108863 ^ 67108863 >>> G << G;
  42898. this.words[this.length - 1] &= W;
  42899. }
  42900. return this._strip();
  42901. }, n.prototype.maskn = function(B) {
  42902. return this.clone().imaskn(B);
  42903. }, n.prototype.iaddn = function(B) {
  42904. return s(typeof B == "number"), s(B < 67108864), B < 0 ? this.isubn(-B) : this.negative !== 0 ? this.length === 1 && (0 | this.words[0]) <= B ? (this.words[0] = B - (0 | this.words[0]), this.negative = 0, this) : (this.negative = 0, this.isubn(B), this.negative = 1, this) : this._iaddn(B);
  42905. }, n.prototype._iaddn = function(B) {
  42906. this.words[0] += B;
  42907. for (var G = 0; G < this.length && this.words[G] >= 67108864; G++) this.words[G] -= 67108864, G === this.length - 1 ? this.words[G + 1] = 1 : this.words[G + 1]++;
  42908. return this.length = Math.max(this.length, G + 1), this;
  42909. }, n.prototype.isubn = function(B) {
  42910. if (s(typeof B == "number"), s(B < 67108864), B < 0) return this.iaddn(-B);
  42911. if (this.negative !== 0) return this.negative = 0, this.iaddn(B), this.negative = 1, this;
  42912. if (this.words[0] -= B, this.length === 1 && this.words[0] < 0) this.words[0] = -this.words[0], this.negative = 1;
  42913. else for (var G = 0; G < this.length && this.words[G] < 0; G++) this.words[G] += 67108864, this.words[G + 1] -= 1;
  42914. return this._strip();
  42915. }, n.prototype.addn = function(B) {
  42916. return this.clone().iaddn(B);
  42917. }, n.prototype.subn = function(B) {
  42918. return this.clone().isubn(B);
  42919. }, n.prototype.iabs = function() {
  42920. return this.negative = 0, this;
  42921. }, n.prototype.abs = function() {
  42922. return this.clone().iabs();
  42923. }, n.prototype._ishlnsubmul = function(B, G, w) {
  42924. var W, y, f = B.length + w;
  42925. this._expand(f);
  42926. var D = 0;
  42927. for (W = 0; W < B.length; W++) {
  42928. y = (0 | this.words[W + w]) + D;
  42929. var F = (0 | B.words[W]) * G;
  42930. D = ((y -= 67108863 & F) >> 26) - (F / 67108864 | 0), this.words[W + w] = 67108863 & y;
  42931. }
  42932. for (; W < this.length - w; W++) D = (y = (0 | this.words[W + w]) + D) >> 26, this.words[W + w] = 67108863 & y;
  42933. if (D === 0) return this._strip();
  42934. for (s(D === -1), D = 0, W = 0; W < this.length; W++) D = (y = -(0 | this.words[W]) + D) >> 26, this.words[W] = 67108863 & y;
  42935. return this.negative = 1, this._strip();
  42936. }, n.prototype._wordDiv = function(B, G) {
  42937. var w = (this.length, B.length), W = this.clone(), y = B, f = 0 | y.words[y.length - 1];
  42938. (w = 26 - this._countBits(f)) !== 0 && (y = y.ushln(w), W.iushln(w), f = 0 | y.words[y.length - 1]);
  42939. var D, F = W.length - y.length;
  42940. if (G !== "mod") {
  42941. (D = new n(null)).length = F + 1, D.words = new Array(D.length);
  42942. for (var T = 0; T < D.length; T++) D.words[T] = 0;
  42943. }
  42944. var Q = W.clone()._ishlnsubmul(y, 1, F);
  42945. Q.negative === 0 && (W = Q, D && (D.words[F] = 1));
  42946. for (var P = F - 1; P >= 0; P--) {
  42947. var L = 67108864 * (0 | W.words[y.length + P]) + (0 | W.words[y.length + P - 1]);
  42948. for (L = Math.min(L / f | 0, 67108863), W._ishlnsubmul(y, L, P); W.negative !== 0; ) L--, W.negative = 0, W._ishlnsubmul(y, 1, P), W.isZero() || (W.negative ^= 1);
  42949. D && (D.words[P] = L);
  42950. }
  42951. return D && D._strip(), W._strip(), G !== "div" && w !== 0 && W.iushrn(w), { div: D || null, mod: W };
  42952. }, n.prototype.divmod = function(B, G, w) {
  42953. return s(!B.isZero()), this.isZero() ? { div: new n(0), mod: new n(0) } : this.negative !== 0 && B.negative === 0 ? (f = this.neg().divmod(B, G), G !== "mod" && (W = f.div.neg()), G !== "div" && (y = f.mod.neg(), w && y.negative !== 0 && y.iadd(B)), { div: W, mod: y }) : this.negative === 0 && B.negative !== 0 ? (f = this.divmod(B.neg(), G), G !== "mod" && (W = f.div.neg()), { div: W, mod: f.mod }) : (this.negative & B.negative) != 0 ? (f = this.neg().divmod(B.neg(), G), G !== "div" && (y = f.mod.neg(), w && y.negative !== 0 && y.isub(B)), { div: f.div, mod: y }) : B.length > this.length || this.cmp(B) < 0 ? { div: new n(0), mod: this } : B.length === 1 ? G === "div" ? { div: this.divn(B.words[0]), mod: null } : G === "mod" ? { div: null, mod: new n(this.modrn(B.words[0])) } : { div: this.divn(B.words[0]), mod: new n(this.modrn(B.words[0])) } : this._wordDiv(B, G);
  42954. var W, y, f;
  42955. }, n.prototype.div = function(B) {
  42956. return this.divmod(B, "div", !1).div;
  42957. }, n.prototype.mod = function(B) {
  42958. return this.divmod(B, "mod", !1).mod;
  42959. }, n.prototype.umod = function(B) {
  42960. return this.divmod(B, "mod", !0).mod;
  42961. }, n.prototype.divRound = function(B) {
  42962. var G = this.divmod(B);
  42963. if (G.mod.isZero()) return G.div;
  42964. var w = G.div.negative !== 0 ? G.mod.isub(B) : G.mod, W = B.ushrn(1), y = B.andln(1), f = w.cmp(W);
  42965. return f < 0 || y === 1 && f === 0 ? G.div : G.div.negative !== 0 ? G.div.isubn(1) : G.div.iaddn(1);
  42966. }, n.prototype.modrn = function(B) {
  42967. var G = B < 0;
  42968. G && (B = -B), s(B <= 67108863);
  42969. for (var w = (1 << 26) % B, W = 0, y = this.length - 1; y >= 0; y--) W = (w * W + (0 | this.words[y])) % B;
  42970. return G ? -W : W;
  42971. }, n.prototype.modn = function(B) {
  42972. return this.modrn(B);
  42973. }, n.prototype.idivn = function(B) {
  42974. var G = B < 0;
  42975. G && (B = -B), s(B <= 67108863);
  42976. for (var w = 0, W = this.length - 1; W >= 0; W--) {
  42977. var y = (0 | this.words[W]) + 67108864 * w;
  42978. this.words[W] = y / B | 0, w = y % B;
  42979. }
  42980. return this._strip(), G ? this.ineg() : this;
  42981. }, n.prototype.divn = function(B) {
  42982. return this.clone().idivn(B);
  42983. }, n.prototype.egcd = function(B) {
  42984. s(B.negative === 0), s(!B.isZero());
  42985. var G = this, w = B.clone();
  42986. G = G.negative !== 0 ? G.umod(B) : G.clone();
  42987. for (var W = new n(1), y = new n(0), f = new n(0), D = new n(1), F = 0; G.isEven() && w.isEven(); ) G.iushrn(1), w.iushrn(1), ++F;
  42988. for (var T = w.clone(), Q = G.clone(); !G.isZero(); ) {
  42989. for (var P = 0, L = 1; (G.words[0] & L) == 0 && P < 26; ++P, L <<= 1) ;
  42990. if (P > 0) for (G.iushrn(P); P-- > 0; ) (W.isOdd() || y.isOdd()) && (W.iadd(T), y.isub(Q)), W.iushrn(1), y.iushrn(1);
  42991. for (var E = 0, J = 1; (w.words[0] & J) == 0 && E < 26; ++E, J <<= 1) ;
  42992. if (E > 0) for (w.iushrn(E); E-- > 0; ) (f.isOdd() || D.isOdd()) && (f.iadd(T), D.isub(Q)), f.iushrn(1), D.iushrn(1);
  42993. G.cmp(w) >= 0 ? (G.isub(w), W.isub(f), y.isub(D)) : (w.isub(G), f.isub(W), D.isub(y));
  42994. }
  42995. return { a: f, b: D, gcd: w.iushln(F) };
  42996. }, n.prototype._invmp = function(B) {
  42997. s(B.negative === 0), s(!B.isZero());
  42998. var G = this, w = B.clone();
  42999. G = G.negative !== 0 ? G.umod(B) : G.clone();
  43000. for (var W, y = new n(1), f = new n(0), D = w.clone(); G.cmpn(1) > 0 && w.cmpn(1) > 0; ) {
  43001. for (var F = 0, T = 1; (G.words[0] & T) == 0 && F < 26; ++F, T <<= 1) ;
  43002. if (F > 0) for (G.iushrn(F); F-- > 0; ) y.isOdd() && y.iadd(D), y.iushrn(1);
  43003. for (var Q = 0, P = 1; (w.words[0] & P) == 0 && Q < 26; ++Q, P <<= 1) ;
  43004. if (Q > 0) for (w.iushrn(Q); Q-- > 0; ) f.isOdd() && f.iadd(D), f.iushrn(1);
  43005. G.cmp(w) >= 0 ? (G.isub(w), y.isub(f)) : (w.isub(G), f.isub(y));
  43006. }
  43007. return (W = G.cmpn(1) === 0 ? y : f).cmpn(0) < 0 && W.iadd(B), W;
  43008. }, n.prototype.gcd = function(B) {
  43009. if (this.isZero()) return B.abs();
  43010. if (B.isZero()) return this.abs();
  43011. var G = this.clone(), w = B.clone();
  43012. G.negative = 0, w.negative = 0;
  43013. for (var W = 0; G.isEven() && w.isEven(); W++) G.iushrn(1), w.iushrn(1);
  43014. for (; ; ) {
  43015. for (; G.isEven(); ) G.iushrn(1);
  43016. for (; w.isEven(); ) w.iushrn(1);
  43017. var y = G.cmp(w);
  43018. if (y < 0) {
  43019. var f = G;
  43020. G = w, w = f;
  43021. } else if (y === 0 || w.cmpn(1) === 0) break;
  43022. G.isub(w);
  43023. }
  43024. return w.iushln(W);
  43025. }, n.prototype.invm = function(B) {
  43026. return this.egcd(B).a.umod(B);
  43027. }, n.prototype.isEven = function() {
  43028. return (1 & this.words[0]) == 0;
  43029. }, n.prototype.isOdd = function() {
  43030. return (1 & this.words[0]) == 1;
  43031. }, n.prototype.andln = function(B) {
  43032. return this.words[0] & B;
  43033. }, n.prototype.bincn = function(B) {
  43034. s(typeof B == "number");
  43035. var G = B % 26, w = (B - G) / 26, W = 1 << G;
  43036. if (this.length <= w) return this._expand(w + 1), this.words[w] |= W, this;
  43037. for (var y = W, f = w; y !== 0 && f < this.length; f++) {
  43038. var D = 0 | this.words[f];
  43039. y = (D += y) >>> 26, D &= 67108863, this.words[f] = D;
  43040. }
  43041. return y !== 0 && (this.words[f] = y, this.length++), this;
  43042. }, n.prototype.isZero = function() {
  43043. return this.length === 1 && this.words[0] === 0;
  43044. }, n.prototype.cmpn = function(B) {
  43045. var G, w = B < 0;
  43046. if (this.negative !== 0 && !w) return -1;
  43047. if (this.negative === 0 && w) return 1;
  43048. if (this._strip(), this.length > 1) G = 1;
  43049. else {
  43050. w && (B = -B), s(B <= 67108863, "Number is too big");
  43051. var W = 0 | this.words[0];
  43052. G = W === B ? 0 : W < B ? -1 : 1;
  43053. }
  43054. return this.negative !== 0 ? 0 | -G : G;
  43055. }, n.prototype.cmp = function(B) {
  43056. if (this.negative !== 0 && B.negative === 0) return -1;
  43057. if (this.negative === 0 && B.negative !== 0) return 1;
  43058. var G = this.ucmp(B);
  43059. return this.negative !== 0 ? 0 | -G : G;
  43060. }, n.prototype.ucmp = function(B) {
  43061. if (this.length > B.length) return 1;
  43062. if (this.length < B.length) return -1;
  43063. for (var G = 0, w = this.length - 1; w >= 0; w--) {
  43064. var W = 0 | this.words[w], y = 0 | B.words[w];
  43065. if (W !== y) {
  43066. W < y ? G = -1 : W > y && (G = 1);
  43067. break;
  43068. }
  43069. }
  43070. return G;
  43071. }, n.prototype.gtn = function(B) {
  43072. return this.cmpn(B) === 1;
  43073. }, n.prototype.gt = function(B) {
  43074. return this.cmp(B) === 1;
  43075. }, n.prototype.gten = function(B) {
  43076. return this.cmpn(B) >= 0;
  43077. }, n.prototype.gte = function(B) {
  43078. return this.cmp(B) >= 0;
  43079. }, n.prototype.ltn = function(B) {
  43080. return this.cmpn(B) === -1;
  43081. }, n.prototype.lt = function(B) {
  43082. return this.cmp(B) === -1;
  43083. }, n.prototype.lten = function(B) {
  43084. return this.cmpn(B) <= 0;
  43085. }, n.prototype.lte = function(B) {
  43086. return this.cmp(B) <= 0;
  43087. }, n.prototype.eqn = function(B) {
  43088. return this.cmpn(B) === 0;
  43089. }, n.prototype.eq = function(B) {
  43090. return this.cmp(B) === 0;
  43091. }, n.red = function(B) {
  43092. return new V(B);
  43093. }, n.prototype.toRed = function(B) {
  43094. return s(!this.red, "Already a number in reduction context"), s(this.negative === 0, "red works only with positives"), B.convertTo(this)._forceRed(B);
  43095. }, n.prototype.fromRed = function() {
  43096. return s(this.red, "fromRed works only with numbers in reduction context"), this.red.convertFrom(this);
  43097. }, n.prototype._forceRed = function(B) {
  43098. return this.red = B, this;
  43099. }, n.prototype.forceRed = function(B) {
  43100. return s(!this.red, "Already a number in reduction context"), this._forceRed(B);
  43101. }, n.prototype.redAdd = function(B) {
  43102. return s(this.red, "redAdd works only with red numbers"), this.red.add(this, B);
  43103. }, n.prototype.redIAdd = function(B) {
  43104. return s(this.red, "redIAdd works only with red numbers"), this.red.iadd(this, B);
  43105. }, n.prototype.redSub = function(B) {
  43106. return s(this.red, "redSub works only with red numbers"), this.red.sub(this, B);
  43107. }, n.prototype.redISub = function(B) {
  43108. return s(this.red, "redISub works only with red numbers"), this.red.isub(this, B);
  43109. }, n.prototype.redShl = function(B) {
  43110. return s(this.red, "redShl works only with red numbers"), this.red.shl(this, B);
  43111. }, n.prototype.redMul = function(B) {
  43112. return s(this.red, "redMul works only with red numbers"), this.red._verify2(this, B), this.red.mul(this, B);
  43113. }, n.prototype.redIMul = function(B) {
  43114. return s(this.red, "redMul works only with red numbers"), this.red._verify2(this, B), this.red.imul(this, B);
  43115. }, n.prototype.redSqr = function() {
  43116. return s(this.red, "redSqr works only with red numbers"), this.red._verify1(this), this.red.sqr(this);
  43117. }, n.prototype.redISqr = function() {
  43118. return s(this.red, "redISqr works only with red numbers"), this.red._verify1(this), this.red.isqr(this);
  43119. }, n.prototype.redSqrt = function() {
  43120. return s(this.red, "redSqrt works only with red numbers"), this.red._verify1(this), this.red.sqrt(this);
  43121. }, n.prototype.redInvm = function() {
  43122. return s(this.red, "redInvm works only with red numbers"), this.red._verify1(this), this.red.invm(this);
  43123. }, n.prototype.redNeg = function() {
  43124. return s(this.red, "redNeg works only with red numbers"), this.red._verify1(this), this.red.neg(this);
  43125. }, n.prototype.redPow = function(B) {
  43126. return s(this.red && !B.red, "redPow(normalNum)"), this.red._verify1(this), this.red.pow(this, B);
  43127. };
  43128. var X = { k256: null, p224: null, p192: null, p25519: null };
  43129. function H(B, G) {
  43130. this.name = B, this.p = new n(G, 16), this.n = this.p.bitLength(), this.k = new n(1).iushln(this.n).isub(this.p), this.tmp = this._tmp();
  43131. }
  43132. function S() {
  43133. H.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f");
  43134. }
  43135. function z() {
  43136. H.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001");
  43137. }
  43138. function v() {
  43139. H.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff");
  43140. }
  43141. function K() {
  43142. H.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed");
  43143. }
  43144. function V(B) {
  43145. if (typeof B == "string") {
  43146. var G = n._prime(B);
  43147. this.m = G.p, this.prime = G;
  43148. } else s(B.gtn(1), "modulus must be greater than 1"), this.m = B, this.prime = null;
  43149. }
  43150. function N(B) {
  43151. V.call(this, B), this.shift = this.m.bitLength(), this.shift % 26 != 0 && (this.shift += 26 - this.shift % 26), this.r = new n(1).iushln(this.shift), this.r2 = this.imod(this.r.sqr()), this.rinv = this.r._invmp(this.m), this.minv = this.rinv.mul(this.r).isubn(1).div(this.m), this.minv = this.minv.umod(this.r), this.minv = this.r.sub(this.minv);
  43152. }
  43153. H.prototype._tmp = function() {
  43154. var B = new n(null);
  43155. return B.words = new Array(Math.ceil(this.n / 13)), B;
  43156. }, H.prototype.ireduce = function(B) {
  43157. var G, w = B;
  43158. do
  43159. this.split(w, this.tmp), G = (w = (w = this.imulK(w)).iadd(this.tmp)).bitLength();
  43160. while (G > this.n);
  43161. var W = G < this.n ? -1 : w.ucmp(this.p);
  43162. return W === 0 ? (w.words[0] = 0, w.length = 1) : W > 0 ? w.isub(this.p) : w.strip !== void 0 ? w.strip() : w._strip(), w;
  43163. }, H.prototype.split = function(B, G) {
  43164. B.iushrn(this.n, 0, G);
  43165. }, H.prototype.imulK = function(B) {
  43166. return B.imul(this.k);
  43167. }, l(S, H), S.prototype.split = function(B, G) {
  43168. for (var w = Math.min(B.length, 9), W = 0; W < w; W++) G.words[W] = B.words[W];
  43169. if (G.length = w, B.length <= 9) return B.words[0] = 0, void (B.length = 1);
  43170. var y = B.words[9];
  43171. for (G.words[G.length++] = 4194303 & y, W = 10; W < B.length; W++) {
  43172. var f = 0 | B.words[W];
  43173. B.words[W - 10] = (4194303 & f) << 4 | y >>> 22, y = f;
  43174. }
  43175. y >>>= 22, B.words[W - 10] = y, y === 0 && B.length > 10 ? B.length -= 10 : B.length -= 9;
  43176. }, S.prototype.imulK = function(B) {
  43177. B.words[B.length] = 0, B.words[B.length + 1] = 0, B.length += 2;
  43178. for (var G = 0, w = 0; w < B.length; w++) {
  43179. var W = 0 | B.words[w];
  43180. G += 977 * W, B.words[w] = 67108863 & G, G = 64 * W + (G / 67108864 | 0);
  43181. }
  43182. return B.words[B.length - 1] === 0 && (B.length--, B.words[B.length - 1] === 0 && B.length--), B;
  43183. }, l(z, H), l(v, H), l(K, H), K.prototype.imulK = function(B) {
  43184. for (var G = 0, w = 0; w < B.length; w++) {
  43185. var W = 19 * (0 | B.words[w]) + G, y = 67108863 & W;
  43186. W >>>= 26, B.words[w] = y, G = W;
  43187. }
  43188. return G !== 0 && (B.words[B.length++] = G), B;
  43189. }, n._prime = function(B) {
  43190. if (X[B]) return X[B];
  43191. var G;
  43192. if (B === "k256") G = new S();
  43193. else if (B === "p224") G = new z();
  43194. else if (B === "p192") G = new v();
  43195. else {
  43196. if (B !== "p25519") throw new Error("Unknown prime " + B);
  43197. G = new K();
  43198. }
  43199. return X[B] = G, G;
  43200. }, V.prototype._verify1 = function(B) {
  43201. s(B.negative === 0, "red works only with positives"), s(B.red, "red works only with red numbers");
  43202. }, V.prototype._verify2 = function(B, G) {
  43203. s((B.negative | G.negative) == 0, "red works only with positives"), s(B.red && B.red === G.red, "red works only with red numbers");
  43204. }, V.prototype.imod = function(B) {
  43205. return this.prime ? this.prime.ireduce(B)._forceRed(this) : (r(B, B.umod(this.m)._forceRed(this)), B);
  43206. }, V.prototype.neg = function(B) {
  43207. return B.isZero() ? B.clone() : this.m.sub(B)._forceRed(this);
  43208. }, V.prototype.add = function(B, G) {
  43209. this._verify2(B, G);
  43210. var w = B.add(G);
  43211. return w.cmp(this.m) >= 0 && w.isub(this.m), w._forceRed(this);
  43212. }, V.prototype.iadd = function(B, G) {
  43213. this._verify2(B, G);
  43214. var w = B.iadd(G);
  43215. return w.cmp(this.m) >= 0 && w.isub(this.m), w;
  43216. }, V.prototype.sub = function(B, G) {
  43217. this._verify2(B, G);
  43218. var w = B.sub(G);
  43219. return w.cmpn(0) < 0 && w.iadd(this.m), w._forceRed(this);
  43220. }, V.prototype.isub = function(B, G) {
  43221. this._verify2(B, G);
  43222. var w = B.isub(G);
  43223. return w.cmpn(0) < 0 && w.iadd(this.m), w;
  43224. }, V.prototype.shl = function(B, G) {
  43225. return this._verify1(B), this.imod(B.ushln(G));
  43226. }, V.prototype.imul = function(B, G) {
  43227. return this._verify2(B, G), this.imod(B.imul(G));
  43228. }, V.prototype.mul = function(B, G) {
  43229. return this._verify2(B, G), this.imod(B.mul(G));
  43230. }, V.prototype.isqr = function(B) {
  43231. return this.imul(B, B.clone());
  43232. }, V.prototype.sqr = function(B) {
  43233. return this.mul(B, B);
  43234. }, V.prototype.sqrt = function(B) {
  43235. if (B.isZero()) return B.clone();
  43236. var G = this.m.andln(3);
  43237. if (s(G % 2 == 1), G === 3) {
  43238. var w = this.m.add(new n(1)).iushrn(2);
  43239. return this.pow(B, w);
  43240. }
  43241. for (var W = this.m.subn(1), y = 0; !W.isZero() && W.andln(1) === 0; ) y++, W.iushrn(1);
  43242. s(!W.isZero());
  43243. var f = new n(1).toRed(this), D = f.redNeg(), F = this.m.subn(1).iushrn(1), T = this.m.bitLength();
  43244. for (T = new n(2 * T * T).toRed(this); this.pow(T, F).cmp(D) !== 0; ) T.redIAdd(D);
  43245. for (var Q = this.pow(T, W), P = this.pow(B, W.addn(1).iushrn(1)), L = this.pow(B, W), E = y; L.cmp(f) !== 0; ) {
  43246. for (var J = L, k = 0; J.cmp(f) !== 0; k++) J = J.redSqr();
  43247. s(k < E);
  43248. var j = this.pow(Q, new n(1).iushln(E - k - 1));
  43249. P = P.redMul(j), Q = j.redSqr(), L = L.redMul(Q), E = k;
  43250. }
  43251. return P;
  43252. }, V.prototype.invm = function(B) {
  43253. var G = B._invmp(this.m);
  43254. return G.negative !== 0 ? (G.negative = 0, this.imod(G).redNeg()) : this.imod(G);
  43255. }, V.prototype.pow = function(B, G) {
  43256. if (G.isZero()) return new n(1).toRed(this);
  43257. if (G.cmpn(1) === 0) return B.clone();
  43258. var w = new Array(16);
  43259. w[0] = new n(1).toRed(this), w[1] = B;
  43260. for (var W = 2; W < w.length; W++) w[W] = this.mul(w[W - 1], B);
  43261. var y = w[0], f = 0, D = 0, F = G.bitLength() % 26;
  43262. for (F === 0 && (F = 26), W = G.length - 1; W >= 0; W--) {
  43263. for (var T = G.words[W], Q = F - 1; Q >= 0; Q--) {
  43264. var P = T >> Q & 1;
  43265. y !== w[0] && (y = this.sqr(y)), P !== 0 || f !== 0 ? (f <<= 1, f |= P, (++D === 4 || W === 0 && Q === 0) && (y = this.mul(y, w[f]), D = 0, f = 0)) : D = 0;
  43266. }
  43267. F = 26;
  43268. }
  43269. return y;
  43270. }, V.prototype.convertTo = function(B) {
  43271. var G = B.umod(this.m);
  43272. return G === B ? G.clone() : G;
  43273. }, V.prototype.convertFrom = function(B) {
  43274. var G = B.clone();
  43275. return G.red = null, G;
  43276. }, n.mont = function(B) {
  43277. return new N(B);
  43278. }, l(N, V), N.prototype.convertTo = function(B) {
  43279. return this.imod(B.ushln(this.shift));
  43280. }, N.prototype.convertFrom = function(B) {
  43281. var G = this.imod(B.mul(this.rinv));
  43282. return G.red = null, G;
  43283. }, N.prototype.imul = function(B, G) {
  43284. if (B.isZero() || G.isZero()) return B.words[0] = 0, B.length = 1, B;
  43285. var w = B.imul(G), W = w.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), y = w.isub(W).iushrn(this.shift), f = y;
  43286. return y.cmp(this.m) >= 0 ? f = y.isub(this.m) : y.cmpn(0) < 0 && (f = y.iadd(this.m)), f._forceRed(this);
  43287. }, N.prototype.mul = function(B, G) {
  43288. if (B.isZero() || G.isZero()) return new n(0)._forceRed(this);
  43289. var w = B.mul(G), W = w.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), y = w.isub(W).iushrn(this.shift), f = y;
  43290. return y.cmp(this.m) >= 0 ? f = y.isub(this.m) : y.cmpn(0) < 0 && (f = y.iadd(this.m)), f._forceRed(this);
  43291. }, N.prototype.invm = function(B) {
  43292. return this.imod(B._invmp(this.m).mul(this.r2))._forceRed(this);
  43293. };
  43294. })(C === void 0 || C);
  43295. }, { buffer: 188 }], 187: [function(g, C, i) {
  43296. var e;
  43297. function A(l) {
  43298. this.rand = l;
  43299. }
  43300. if (C.exports = function(l) {
  43301. return e || (e = new A(null)), e.generate(l);
  43302. }, C.exports.Rand = A, A.prototype.generate = function(l) {
  43303. return this._rand(l);
  43304. }, A.prototype._rand = function(l) {
  43305. if (this.rand.getBytes) return this.rand.getBytes(l);
  43306. for (var n = new Uint8Array(l), a = 0; a < n.length; a++) n[a] = this.rand.getByte();
  43307. return n;
  43308. }, typeof self == "object") self.crypto && self.crypto.getRandomValues ? A.prototype._rand = function(l) {
  43309. var n = new Uint8Array(l);
  43310. return self.crypto.getRandomValues(n), n;
  43311. } : self.msCrypto && self.msCrypto.getRandomValues ? A.prototype._rand = function(l) {
  43312. var n = new Uint8Array(l);
  43313. return self.msCrypto.getRandomValues(n), n;
  43314. } : typeof window == "object" && (A.prototype._rand = function() {
  43315. throw new Error("Not implemented yet");
  43316. });
  43317. else try {
  43318. var s = g("crypto");
  43319. if (typeof s.randomBytes != "function") throw new Error("Not supported");
  43320. A.prototype._rand = function(l) {
  43321. return s.randomBytes(l);
  43322. };
  43323. } catch {
  43324. }
  43325. }, { crypto: 188 }], 188: [function(g, C, i) {
  43326. }, {}], 189: [function(g, C, i) {
  43327. var e = g("safe-buffer").Buffer;
  43328. function A(o) {
  43329. e.isBuffer(o) || (o = e.from(o));
  43330. for (var c = o.length / 4 | 0, r = new Array(c), h = 0; h < c; h++) r[h] = o.readUInt32BE(4 * h);
  43331. return r;
  43332. }
  43333. function s(o) {
  43334. for (; 0 < o.length; o++) o[0] = 0;
  43335. }
  43336. function l(o, c, r, h, b) {
  43337. for (var u, m, Z, p, Y = r[0], R = r[1], X = r[2], H = r[3], S = o[0] ^ c[0], z = o[1] ^ c[1], v = o[2] ^ c[2], K = o[3] ^ c[3], V = 4, N = 1; N < b; N++) u = Y[S >>> 24] ^ R[z >>> 16 & 255] ^ X[v >>> 8 & 255] ^ H[255 & K] ^ c[V++], m = Y[z >>> 24] ^ R[v >>> 16 & 255] ^ X[K >>> 8 & 255] ^ H[255 & S] ^ c[V++], Z = Y[v >>> 24] ^ R[K >>> 16 & 255] ^ X[S >>> 8 & 255] ^ H[255 & z] ^ c[V++], p = Y[K >>> 24] ^ R[S >>> 16 & 255] ^ X[z >>> 8 & 255] ^ H[255 & v] ^ c[V++], S = u, z = m, v = Z, K = p;
  43338. return u = (h[S >>> 24] << 24 | h[z >>> 16 & 255] << 16 | h[v >>> 8 & 255] << 8 | h[255 & K]) ^ c[V++], m = (h[z >>> 24] << 24 | h[v >>> 16 & 255] << 16 | h[K >>> 8 & 255] << 8 | h[255 & S]) ^ c[V++], Z = (h[v >>> 24] << 24 | h[K >>> 16 & 255] << 16 | h[S >>> 8 & 255] << 8 | h[255 & z]) ^ c[V++], p = (h[K >>> 24] << 24 | h[S >>> 16 & 255] << 16 | h[z >>> 8 & 255] << 8 | h[255 & v]) ^ c[V++], [u >>>= 0, m >>>= 0, Z >>>= 0, p >>>= 0];
  43339. }
  43340. var n = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54], a = function() {
  43341. for (var o = new Array(256), c = 0; c < 256; c++) o[c] = c < 128 ? c << 1 : c << 1 ^ 283;
  43342. for (var r = [], h = [], b = [[], [], [], []], u = [[], [], [], []], m = 0, Z = 0, p = 0; p < 256; ++p) {
  43343. var Y = Z ^ Z << 1 ^ Z << 2 ^ Z << 3 ^ Z << 4;
  43344. Y = Y >>> 8 ^ 255 & Y ^ 99, r[m] = Y, h[Y] = m;
  43345. var R = o[m], X = o[R], H = o[X], S = 257 * o[Y] ^ 16843008 * Y;
  43346. b[0][m] = S << 24 | S >>> 8, b[1][m] = S << 16 | S >>> 16, b[2][m] = S << 8 | S >>> 24, b[3][m] = S, S = 16843009 * H ^ 65537 * X ^ 257 * R ^ 16843008 * m, u[0][Y] = S << 24 | S >>> 8, u[1][Y] = S << 16 | S >>> 16, u[2][Y] = S << 8 | S >>> 24, u[3][Y] = S, m === 0 ? m = Z = 1 : (m = R ^ o[o[o[H ^ R]]], Z ^= o[o[Z]]);
  43347. }
  43348. return { SBOX: r, INV_SBOX: h, SUB_MIX: b, INV_SUB_MIX: u };
  43349. }();
  43350. function d(o) {
  43351. this._key = A(o), this._reset();
  43352. }
  43353. d.blockSize = 16, d.keySize = 32, d.prototype.blockSize = d.blockSize, d.prototype.keySize = d.keySize, d.prototype._reset = function() {
  43354. for (var o = this._key, c = o.length, r = c + 6, h = 4 * (r + 1), b = [], u = 0; u < c; u++) b[u] = o[u];
  43355. for (u = c; u < h; u++) {
  43356. var m = b[u - 1];
  43357. u % c == 0 ? (m = m << 8 | m >>> 24, m = a.SBOX[m >>> 24] << 24 | a.SBOX[m >>> 16 & 255] << 16 | a.SBOX[m >>> 8 & 255] << 8 | a.SBOX[255 & m], m ^= n[u / c | 0] << 24) : c > 6 && u % c == 4 && (m = a.SBOX[m >>> 24] << 24 | a.SBOX[m >>> 16 & 255] << 16 | a.SBOX[m >>> 8 & 255] << 8 | a.SBOX[255 & m]), b[u] = b[u - c] ^ m;
  43358. }
  43359. for (var Z = [], p = 0; p < h; p++) {
  43360. var Y = h - p, R = b[Y - (p % 4 ? 0 : 4)];
  43361. Z[p] = p < 4 || Y <= 4 ? R : a.INV_SUB_MIX[0][a.SBOX[R >>> 24]] ^ a.INV_SUB_MIX[1][a.SBOX[R >>> 16 & 255]] ^ a.INV_SUB_MIX[2][a.SBOX[R >>> 8 & 255]] ^ a.INV_SUB_MIX[3][a.SBOX[255 & R]];
  43362. }
  43363. this._nRounds = r, this._keySchedule = b, this._invKeySchedule = Z;
  43364. }, d.prototype.encryptBlockRaw = function(o) {
  43365. return l(o = A(o), this._keySchedule, a.SUB_MIX, a.SBOX, this._nRounds);
  43366. }, d.prototype.encryptBlock = function(o) {
  43367. var c = this.encryptBlockRaw(o), r = e.allocUnsafe(16);
  43368. return r.writeUInt32BE(c[0], 0), r.writeUInt32BE(c[1], 4), r.writeUInt32BE(c[2], 8), r.writeUInt32BE(c[3], 12), r;
  43369. }, d.prototype.decryptBlock = function(o) {
  43370. var c = (o = A(o))[1];
  43371. o[1] = o[3], o[3] = c;
  43372. var r = l(o, this._invKeySchedule, a.INV_SUB_MIX, a.INV_SBOX, this._nRounds), h = e.allocUnsafe(16);
  43373. return h.writeUInt32BE(r[0], 0), h.writeUInt32BE(r[3], 4), h.writeUInt32BE(r[2], 8), h.writeUInt32BE(r[1], 12), h;
  43374. }, d.prototype.scrub = function() {
  43375. s(this._keySchedule), s(this._invKeySchedule), s(this._key);
  43376. }, C.exports.AES = d;
  43377. }, { "safe-buffer": 494 }], 190: [function(g, C, i) {
  43378. var e = g("./aes"), A = g("safe-buffer").Buffer, s = g("cipher-base"), l = g("inherits"), n = g("./ghash"), a = g("buffer-xor"), d = g("./incr32");
  43379. function o(c, r, h, b) {
  43380. s.call(this);
  43381. var u = A.alloc(4, 0);
  43382. this._cipher = new e.AES(r);
  43383. var m = this._cipher.encryptBlock(u);
  43384. this._ghash = new n(m), h = function(Z, p, Y) {
  43385. if (p.length === 12) return Z._finID = A.concat([p, A.from([0, 0, 0, 1])]), A.concat([p, A.from([0, 0, 0, 2])]);
  43386. var R = new n(Y), X = p.length, H = X % 16;
  43387. R.update(p), H && (H = 16 - H, R.update(A.alloc(H, 0))), R.update(A.alloc(8, 0));
  43388. var S = 8 * X, z = A.alloc(8);
  43389. z.writeUIntBE(S, 0, 8), R.update(z), Z._finID = R.state;
  43390. var v = A.from(Z._finID);
  43391. return d(v), v;
  43392. }(this, h, m), this._prev = A.from(h), this._cache = A.allocUnsafe(0), this._secCache = A.allocUnsafe(0), this._decrypt = b, this._alen = 0, this._len = 0, this._mode = c, this._authTag = null, this._called = !1;
  43393. }
  43394. l(o, s), o.prototype._update = function(c) {
  43395. if (!this._called && this._alen) {
  43396. var r = 16 - this._alen % 16;
  43397. r < 16 && (r = A.alloc(r, 0), this._ghash.update(r));
  43398. }
  43399. this._called = !0;
  43400. var h = this._mode.encrypt(this, c);
  43401. return this._decrypt ? this._ghash.update(c) : this._ghash.update(h), this._len += c.length, h;
  43402. }, o.prototype._final = function() {
  43403. if (this._decrypt && !this._authTag) throw new Error("Unsupported state or unable to authenticate data");
  43404. var c = a(this._ghash.final(8 * this._alen, 8 * this._len), this._cipher.encryptBlock(this._finID));
  43405. if (this._decrypt && function(r, h) {
  43406. var b = 0;
  43407. r.length !== h.length && b++;
  43408. for (var u = Math.min(r.length, h.length), m = 0; m < u; ++m) b += r[m] ^ h[m];
  43409. return b;
  43410. }(c, this._authTag)) throw new Error("Unsupported state or unable to authenticate data");
  43411. this._authTag = c, this._cipher.scrub();
  43412. }, o.prototype.getAuthTag = function() {
  43413. if (this._decrypt || !A.isBuffer(this._authTag)) throw new Error("Attempting to get auth tag in unsupported state");
  43414. return this._authTag;
  43415. }, o.prototype.setAuthTag = function(c) {
  43416. if (!this._decrypt) throw new Error("Attempting to set auth tag in unsupported state");
  43417. this._authTag = c;
  43418. }, o.prototype.setAAD = function(c) {
  43419. if (this._called) throw new Error("Attempting to set AAD in unsupported state");
  43420. this._ghash.update(c), this._alen += c.length;
  43421. }, C.exports = o;
  43422. }, { "./aes": 189, "./ghash": 194, "./incr32": 195, "buffer-xor": 219, "cipher-base": 221, inherits: 440, "safe-buffer": 494 }], 191: [function(g, C, i) {
  43423. var e = g("./encrypter"), A = g("./decrypter"), s = g("./modes/list.json");
  43424. i.createCipher = i.Cipher = e.createCipher, i.createCipheriv = i.Cipheriv = e.createCipheriv, i.createDecipher = i.Decipher = A.createDecipher, i.createDecipheriv = i.Decipheriv = A.createDecipheriv, i.listCiphers = i.getCiphers = function() {
  43425. return Object.keys(s);
  43426. };
  43427. }, { "./decrypter": 192, "./encrypter": 193, "./modes/list.json": 203 }], 192: [function(g, C, i) {
  43428. var e = g("./authCipher"), A = g("safe-buffer").Buffer, s = g("./modes"), l = g("./streamCipher"), n = g("cipher-base"), a = g("./aes"), d = g("evp_bytestokey");
  43429. function o(h, b, u) {
  43430. n.call(this), this._cache = new c(), this._last = void 0, this._cipher = new a.AES(b), this._prev = A.from(u), this._mode = h, this._autopadding = !0;
  43431. }
  43432. function c() {
  43433. this.cache = A.allocUnsafe(0);
  43434. }
  43435. function r(h, b, u) {
  43436. var m = s[h.toLowerCase()];
  43437. if (!m) throw new TypeError("invalid suite type");
  43438. if (typeof u == "string" && (u = A.from(u)), m.mode !== "GCM" && u.length !== m.iv) throw new TypeError("invalid iv length " + u.length);
  43439. if (typeof b == "string" && (b = A.from(b)), b.length !== m.key / 8) throw new TypeError("invalid key length " + b.length);
  43440. return m.type === "stream" ? new l(m.module, b, u, !0) : m.type === "auth" ? new e(m.module, b, u, !0) : new o(m.module, b, u);
  43441. }
  43442. g("inherits")(o, n), o.prototype._update = function(h) {
  43443. var b, u;
  43444. this._cache.add(h);
  43445. for (var m = []; b = this._cache.get(this._autopadding); ) u = this._mode.decrypt(this, b), m.push(u);
  43446. return A.concat(m);
  43447. }, o.prototype._final = function() {
  43448. var h = this._cache.flush();
  43449. if (this._autopadding) return function(b) {
  43450. var u = b[15];
  43451. if (u < 1 || u > 16) throw new Error("unable to decrypt data");
  43452. for (var m = -1; ++m < u; ) if (b[m + (16 - u)] !== u) throw new Error("unable to decrypt data");
  43453. if (u !== 16)
  43454. return b.slice(0, 16 - u);
  43455. }(this._mode.decrypt(this, h));
  43456. if (h) throw new Error("data not multiple of block length");
  43457. }, o.prototype.setAutoPadding = function(h) {
  43458. return this._autopadding = !!h, this;
  43459. }, c.prototype.add = function(h) {
  43460. this.cache = A.concat([this.cache, h]);
  43461. }, c.prototype.get = function(h) {
  43462. var b;
  43463. if (h) {
  43464. if (this.cache.length > 16) return b = this.cache.slice(0, 16), this.cache = this.cache.slice(16), b;
  43465. } else if (this.cache.length >= 16) return b = this.cache.slice(0, 16), this.cache = this.cache.slice(16), b;
  43466. return null;
  43467. }, c.prototype.flush = function() {
  43468. if (this.cache.length) return this.cache;
  43469. }, i.createDecipher = function(h, b) {
  43470. var u = s[h.toLowerCase()];
  43471. if (!u) throw new TypeError("invalid suite type");
  43472. var m = d(b, !1, u.key, u.iv);
  43473. return r(h, m.key, m.iv);
  43474. }, i.createDecipheriv = r;
  43475. }, { "./aes": 189, "./authCipher": 190, "./modes": 202, "./streamCipher": 205, "cipher-base": 221, evp_bytestokey: 423, inherits: 440, "safe-buffer": 494 }], 193: [function(g, C, i) {
  43476. var e = g("./modes"), A = g("./authCipher"), s = g("safe-buffer").Buffer, l = g("./streamCipher"), n = g("cipher-base"), a = g("./aes"), d = g("evp_bytestokey");
  43477. function o(b, u, m) {
  43478. n.call(this), this._cache = new r(), this._cipher = new a.AES(u), this._prev = s.from(m), this._mode = b, this._autopadding = !0;
  43479. }
  43480. g("inherits")(o, n), o.prototype._update = function(b) {
  43481. var u, m;
  43482. this._cache.add(b);
  43483. for (var Z = []; u = this._cache.get(); ) m = this._mode.encrypt(this, u), Z.push(m);
  43484. return s.concat(Z);
  43485. };
  43486. var c = s.alloc(16, 16);
  43487. function r() {
  43488. this.cache = s.allocUnsafe(0);
  43489. }
  43490. function h(b, u, m) {
  43491. var Z = e[b.toLowerCase()];
  43492. if (!Z) throw new TypeError("invalid suite type");
  43493. if (typeof u == "string" && (u = s.from(u)), u.length !== Z.key / 8) throw new TypeError("invalid key length " + u.length);
  43494. if (typeof m == "string" && (m = s.from(m)), Z.mode !== "GCM" && m.length !== Z.iv) throw new TypeError("invalid iv length " + m.length);
  43495. return Z.type === "stream" ? new l(Z.module, u, m) : Z.type === "auth" ? new A(Z.module, u, m) : new o(Z.module, u, m);
  43496. }
  43497. o.prototype._final = function() {
  43498. var b = this._cache.flush();
  43499. if (this._autopadding) return b = this._mode.encrypt(this, b), this._cipher.scrub(), b;
  43500. if (!b.equals(c)) throw this._cipher.scrub(), new Error("data not multiple of block length");
  43501. }, o.prototype.setAutoPadding = function(b) {
  43502. return this._autopadding = !!b, this;
  43503. }, r.prototype.add = function(b) {
  43504. this.cache = s.concat([this.cache, b]);
  43505. }, r.prototype.get = function() {
  43506. if (this.cache.length > 15) {
  43507. var b = this.cache.slice(0, 16);
  43508. return this.cache = this.cache.slice(16), b;
  43509. }
  43510. return null;
  43511. }, r.prototype.flush = function() {
  43512. for (var b = 16 - this.cache.length, u = s.allocUnsafe(b), m = -1; ++m < b; ) u.writeUInt8(b, m);
  43513. return s.concat([this.cache, u]);
  43514. }, i.createCipheriv = h, i.createCipher = function(b, u) {
  43515. var m = e[b.toLowerCase()];
  43516. if (!m) throw new TypeError("invalid suite type");
  43517. var Z = d(u, !1, m.key, m.iv);
  43518. return h(b, Z.key, Z.iv);
  43519. };
  43520. }, { "./aes": 189, "./authCipher": 190, "./modes": 202, "./streamCipher": 205, "cipher-base": 221, evp_bytestokey: 423, inherits: 440, "safe-buffer": 494 }], 194: [function(g, C, i) {
  43521. var e = g("safe-buffer").Buffer, A = e.alloc(16, 0);
  43522. function s(n) {
  43523. var a = e.allocUnsafe(16);
  43524. return a.writeUInt32BE(n[0] >>> 0, 0), a.writeUInt32BE(n[1] >>> 0, 4), a.writeUInt32BE(n[2] >>> 0, 8), a.writeUInt32BE(n[3] >>> 0, 12), a;
  43525. }
  43526. function l(n) {
  43527. this.h = n, this.state = e.alloc(16, 0), this.cache = e.allocUnsafe(0);
  43528. }
  43529. l.prototype.ghash = function(n) {
  43530. for (var a = -1; ++a < n.length; ) this.state[a] ^= n[a];
  43531. this._multiply();
  43532. }, l.prototype._multiply = function() {
  43533. for (var n, a, d, o = [(n = this.h).readUInt32BE(0), n.readUInt32BE(4), n.readUInt32BE(8), n.readUInt32BE(12)], c = [0, 0, 0, 0], r = -1; ++r < 128; ) {
  43534. for ((this.state[~~(r / 8)] & 1 << 7 - r % 8) != 0 && (c[0] ^= o[0], c[1] ^= o[1], c[2] ^= o[2], c[3] ^= o[3]), d = (1 & o[3]) != 0, a = 3; a > 0; a--) o[a] = o[a] >>> 1 | (1 & o[a - 1]) << 31;
  43535. o[0] = o[0] >>> 1, d && (o[0] = o[0] ^ 225 << 24);
  43536. }
  43537. this.state = s(c);
  43538. }, l.prototype.update = function(n) {
  43539. var a;
  43540. for (this.cache = e.concat([this.cache, n]); this.cache.length >= 16; ) a = this.cache.slice(0, 16), this.cache = this.cache.slice(16), this.ghash(a);
  43541. }, l.prototype.final = function(n, a) {
  43542. return this.cache.length && this.ghash(e.concat([this.cache, A], 16)), this.ghash(s([0, n, 0, a])), this.state;
  43543. }, C.exports = l;
  43544. }, { "safe-buffer": 494 }], 195: [function(g, C, i) {
  43545. C.exports = function(e) {
  43546. for (var A, s = e.length; s--; ) {
  43547. if ((A = e.readUInt8(s)) !== 255) {
  43548. A++, e.writeUInt8(A, s);
  43549. break;
  43550. }
  43551. e.writeUInt8(0, s);
  43552. }
  43553. };
  43554. }, {}], 196: [function(g, C, i) {
  43555. var e = g("buffer-xor");
  43556. i.encrypt = function(A, s) {
  43557. var l = e(s, A._prev);
  43558. return A._prev = A._cipher.encryptBlock(l), A._prev;
  43559. }, i.decrypt = function(A, s) {
  43560. var l = A._prev;
  43561. A._prev = s;
  43562. var n = A._cipher.decryptBlock(s);
  43563. return e(n, l);
  43564. };
  43565. }, { "buffer-xor": 219 }], 197: [function(g, C, i) {
  43566. var e = g("safe-buffer").Buffer, A = g("buffer-xor");
  43567. function s(l, n, a) {
  43568. var d = n.length, o = A(n, l._cache);
  43569. return l._cache = l._cache.slice(d), l._prev = e.concat([l._prev, a ? n : o]), o;
  43570. }
  43571. i.encrypt = function(l, n, a) {
  43572. for (var d, o = e.allocUnsafe(0); n.length; ) {
  43573. if (l._cache.length === 0 && (l._cache = l._cipher.encryptBlock(l._prev), l._prev = e.allocUnsafe(0)), !(l._cache.length <= n.length)) {
  43574. o = e.concat([o, s(l, n, a)]);
  43575. break;
  43576. }
  43577. d = l._cache.length, o = e.concat([o, s(l, n.slice(0, d), a)]), n = n.slice(d);
  43578. }
  43579. return o;
  43580. };
  43581. }, { "buffer-xor": 219, "safe-buffer": 494 }], 198: [function(g, C, i) {
  43582. var e = g("safe-buffer").Buffer;
  43583. function A(l, n, a) {
  43584. for (var d, o, c = -1, r = 0; ++c < 8; ) d = n & 1 << 7 - c ? 128 : 0, r += (128 & (o = l._cipher.encryptBlock(l._prev)[0] ^ d)) >> c % 8, l._prev = s(l._prev, a ? d : o);
  43585. return r;
  43586. }
  43587. function s(l, n) {
  43588. var a = l.length, d = -1, o = e.allocUnsafe(l.length);
  43589. for (l = e.concat([l, e.from([n])]); ++d < a; ) o[d] = l[d] << 1 | l[d + 1] >> 7;
  43590. return o;
  43591. }
  43592. i.encrypt = function(l, n, a) {
  43593. for (var d = n.length, o = e.allocUnsafe(d), c = -1; ++c < d; ) o[c] = A(l, n[c], a);
  43594. return o;
  43595. };
  43596. }, { "safe-buffer": 494 }], 199: [function(g, C, i) {
  43597. var e = g("safe-buffer").Buffer;
  43598. function A(s, l, n) {
  43599. var a = s._cipher.encryptBlock(s._prev)[0] ^ l;
  43600. return s._prev = e.concat([s._prev.slice(1), e.from([n ? l : a])]), a;
  43601. }
  43602. i.encrypt = function(s, l, n) {
  43603. for (var a = l.length, d = e.allocUnsafe(a), o = -1; ++o < a; ) d[o] = A(s, l[o], n);
  43604. return d;
  43605. };
  43606. }, { "safe-buffer": 494 }], 200: [function(g, C, i) {
  43607. var e = g("buffer-xor"), A = g("safe-buffer").Buffer, s = g("../incr32");
  43608. function l(n) {
  43609. var a = n._cipher.encryptBlockRaw(n._prev);
  43610. return s(n._prev), a;
  43611. }
  43612. i.encrypt = function(n, a) {
  43613. var d = Math.ceil(a.length / 16), o = n._cache.length;
  43614. n._cache = A.concat([n._cache, A.allocUnsafe(16 * d)]);
  43615. for (var c = 0; c < d; c++) {
  43616. var r = l(n), h = o + 16 * c;
  43617. n._cache.writeUInt32BE(r[0], h + 0), n._cache.writeUInt32BE(r[1], h + 4), n._cache.writeUInt32BE(r[2], h + 8), n._cache.writeUInt32BE(r[3], h + 12);
  43618. }
  43619. var b = n._cache.slice(0, a.length);
  43620. return n._cache = n._cache.slice(a.length), e(a, b);
  43621. };
  43622. }, { "../incr32": 195, "buffer-xor": 219, "safe-buffer": 494 }], 201: [function(g, C, i) {
  43623. i.encrypt = function(e, A) {
  43624. return e._cipher.encryptBlock(A);
  43625. }, i.decrypt = function(e, A) {
  43626. return e._cipher.decryptBlock(A);
  43627. };
  43628. }, {}], 202: [function(g, C, i) {
  43629. var e = { ECB: g("./ecb"), CBC: g("./cbc"), CFB: g("./cfb"), CFB8: g("./cfb8"), CFB1: g("./cfb1"), OFB: g("./ofb"), CTR: g("./ctr"), GCM: g("./ctr") }, A = g("./list.json");
  43630. for (var s in A) A[s].module = e[A[s].mode];
  43631. C.exports = A;
  43632. }, { "./cbc": 196, "./cfb": 197, "./cfb1": 198, "./cfb8": 199, "./ctr": 200, "./ecb": 201, "./list.json": 203, "./ofb": 204 }], 203: [function(g, C, i) {
  43633. C.exports = { "aes-128-ecb": { cipher: "AES", key: 128, iv: 0, mode: "ECB", type: "block" }, "aes-192-ecb": { cipher: "AES", key: 192, iv: 0, mode: "ECB", type: "block" }, "aes-256-ecb": { cipher: "AES", key: 256, iv: 0, mode: "ECB", type: "block" }, "aes-128-cbc": { cipher: "AES", key: 128, iv: 16, mode: "CBC", type: "block" }, "aes-192-cbc": { cipher: "AES", key: 192, iv: 16, mode: "CBC", type: "block" }, "aes-256-cbc": { cipher: "AES", key: 256, iv: 16, mode: "CBC", type: "block" }, aes128: { cipher: "AES", key: 128, iv: 16, mode: "CBC", type: "block" }, aes192: { cipher: "AES", key: 192, iv: 16, mode: "CBC", type: "block" }, aes256: { cipher: "AES", key: 256, iv: 16, mode: "CBC", type: "block" }, "aes-128-cfb": { cipher: "AES", key: 128, iv: 16, mode: "CFB", type: "stream" }, "aes-192-cfb": { cipher: "AES", key: 192, iv: 16, mode: "CFB", type: "stream" }, "aes-256-cfb": { cipher: "AES", key: 256, iv: 16, mode: "CFB", type: "stream" }, "aes-128-cfb8": { cipher: "AES", key: 128, iv: 16, mode: "CFB8", type: "stream" }, "aes-192-cfb8": { cipher: "AES", key: 192, iv: 16, mode: "CFB8", type: "stream" }, "aes-256-cfb8": { cipher: "AES", key: 256, iv: 16, mode: "CFB8", type: "stream" }, "aes-128-cfb1": { cipher: "AES", key: 128, iv: 16, mode: "CFB1", type: "stream" }, "aes-192-cfb1": { cipher: "AES", key: 192, iv: 16, mode: "CFB1", type: "stream" }, "aes-256-cfb1": { cipher: "AES", key: 256, iv: 16, mode: "CFB1", type: "stream" }, "aes-128-ofb": { cipher: "AES", key: 128, iv: 16, mode: "OFB", type: "stream" }, "aes-192-ofb": { cipher: "AES", key: 192, iv: 16, mode: "OFB", type: "stream" }, "aes-256-ofb": { cipher: "AES", key: 256, iv: 16, mode: "OFB", type: "stream" }, "aes-128-ctr": { cipher: "AES", key: 128, iv: 16, mode: "CTR", type: "stream" }, "aes-192-ctr": { cipher: "AES", key: 192, iv: 16, mode: "CTR", type: "stream" }, "aes-256-ctr": { cipher: "AES", key: 256, iv: 16, mode: "CTR", type: "stream" }, "aes-128-gcm": { cipher: "AES", key: 128, iv: 12, mode: "GCM", type: "auth" }, "aes-192-gcm": { cipher: "AES", key: 192, iv: 12, mode: "GCM", type: "auth" }, "aes-256-gcm": { cipher: "AES", key: 256, iv: 12, mode: "GCM", type: "auth" } };
  43634. }, {}], 204: [function(g, C, i) {
  43635. (function(e) {
  43636. (function() {
  43637. var A = g("buffer-xor");
  43638. function s(l) {
  43639. return l._prev = l._cipher.encryptBlock(l._prev), l._prev;
  43640. }
  43641. i.encrypt = function(l, n) {
  43642. for (; l._cache.length < n.length; ) l._cache = e.concat([l._cache, s(l)]);
  43643. var a = l._cache.slice(0, n.length);
  43644. return l._cache = l._cache.slice(n.length), A(n, a);
  43645. };
  43646. }).call(this);
  43647. }).call(this, g("buffer").Buffer);
  43648. }, { buffer: 220, "buffer-xor": 219 }], 205: [function(g, C, i) {
  43649. var e = g("./aes"), A = g("safe-buffer").Buffer, s = g("cipher-base");
  43650. function l(n, a, d, o) {
  43651. s.call(this), this._cipher = new e.AES(a), this._prev = A.from(d), this._cache = A.allocUnsafe(0), this._secCache = A.allocUnsafe(0), this._decrypt = o, this._mode = n;
  43652. }
  43653. g("inherits")(l, s), l.prototype._update = function(n) {
  43654. return this._mode.encrypt(this, n, this._decrypt);
  43655. }, l.prototype._final = function() {
  43656. this._cipher.scrub();
  43657. }, C.exports = l;
  43658. }, { "./aes": 189, "cipher-base": 221, inherits: 440, "safe-buffer": 494 }], 206: [function(g, C, i) {
  43659. var e = g("browserify-des"), A = g("browserify-aes/browser"), s = g("browserify-aes/modes"), l = g("browserify-des/modes"), n = g("evp_bytestokey");
  43660. function a(o, c, r) {
  43661. if (o = o.toLowerCase(), s[o]) return A.createCipheriv(o, c, r);
  43662. if (l[o]) return new e({ key: c, iv: r, mode: o });
  43663. throw new TypeError("invalid suite type");
  43664. }
  43665. function d(o, c, r) {
  43666. if (o = o.toLowerCase(), s[o]) return A.createDecipheriv(o, c, r);
  43667. if (l[o]) return new e({ key: c, iv: r, mode: o, decrypt: !0 });
  43668. throw new TypeError("invalid suite type");
  43669. }
  43670. i.createCipher = i.Cipher = function(o, c) {
  43671. var r, h;
  43672. if (o = o.toLowerCase(), s[o]) r = s[o].key, h = s[o].iv;
  43673. else {
  43674. if (!l[o]) throw new TypeError("invalid suite type");
  43675. r = 8 * l[o].key, h = l[o].iv;
  43676. }
  43677. var b = n(c, !1, r, h);
  43678. return a(o, b.key, b.iv);
  43679. }, i.createCipheriv = i.Cipheriv = a, i.createDecipher = i.Decipher = function(o, c) {
  43680. var r, h;
  43681. if (o = o.toLowerCase(), s[o]) r = s[o].key, h = s[o].iv;
  43682. else {
  43683. if (!l[o]) throw new TypeError("invalid suite type");
  43684. r = 8 * l[o].key, h = l[o].iv;
  43685. }
  43686. var b = n(c, !1, r, h);
  43687. return d(o, b.key, b.iv);
  43688. }, i.createDecipheriv = i.Decipheriv = d, i.listCiphers = i.getCiphers = function() {
  43689. return Object.keys(l).concat(A.getCiphers());
  43690. };
  43691. }, { "browserify-aes/browser": 191, "browserify-aes/modes": 202, "browserify-des": 207, "browserify-des/modes": 208, evp_bytestokey: 423 }], 207: [function(g, C, i) {
  43692. var e = g("cipher-base"), A = g("des.js"), s = g("inherits"), l = g("safe-buffer").Buffer, n = { "des-ede3-cbc": A.CBC.instantiate(A.EDE), "des-ede3": A.EDE, "des-ede-cbc": A.CBC.instantiate(A.EDE), "des-ede": A.EDE, "des-cbc": A.CBC.instantiate(A.DES), "des-ecb": A.DES };
  43693. function a(d) {
  43694. e.call(this);
  43695. var o, c = d.mode.toLowerCase(), r = n[c];
  43696. o = d.decrypt ? "decrypt" : "encrypt";
  43697. var h = d.key;
  43698. l.isBuffer(h) || (h = l.from(h)), c !== "des-ede" && c !== "des-ede-cbc" || (h = l.concat([h, h.slice(0, 8)]));
  43699. var b = d.iv;
  43700. l.isBuffer(b) || (b = l.from(b)), this._des = r.create({ key: h, iv: b, type: o });
  43701. }
  43702. n.des = n["des-cbc"], n.des3 = n["des-ede3-cbc"], C.exports = a, s(a, e), a.prototype._update = function(d) {
  43703. return l.from(this._des.update(d));
  43704. }, a.prototype._final = function() {
  43705. return l.from(this._des.final());
  43706. };
  43707. }, { "cipher-base": 221, "des.js": 394, inherits: 440, "safe-buffer": 494 }], 208: [function(g, C, i) {
  43708. i["des-ecb"] = { key: 8, iv: 0 }, i["des-cbc"] = i.des = { key: 8, iv: 8 }, i["des-ede3-cbc"] = i.des3 = { key: 24, iv: 8 }, i["des-ede3"] = { key: 24, iv: 0 }, i["des-ede-cbc"] = { key: 16, iv: 8 }, i["des-ede"] = { key: 16, iv: 0 };
  43709. }, {}], 209: [function(g, C, i) {
  43710. (function(e) {
  43711. (function() {
  43712. var A = g("bn.js"), s = g("randombytes");
  43713. function l(a) {
  43714. var d, o = a.modulus.byteLength();
  43715. do
  43716. d = new A(s(o));
  43717. while (d.cmp(a.modulus) >= 0 || !d.umod(a.prime1) || !d.umod(a.prime2));
  43718. return d;
  43719. }
  43720. function n(a, d) {
  43721. var o = function(X) {
  43722. var H = l(X);
  43723. return { blinder: H.toRed(A.mont(X.modulus)).redPow(new A(X.publicExponent)).fromRed(), unblinder: H.invm(X.modulus) };
  43724. }(d), c = d.modulus.byteLength(), r = new A(a).mul(o.blinder).umod(d.modulus), h = r.toRed(A.mont(d.prime1)), b = r.toRed(A.mont(d.prime2)), u = d.coefficient, m = d.prime1, Z = d.prime2, p = h.redPow(d.exponent1).fromRed(), Y = b.redPow(d.exponent2).fromRed(), R = p.isub(Y).imul(u).umod(m).imul(Z);
  43725. return Y.iadd(R).imul(o.unblinder).umod(d.modulus).toArrayLike(e, "be", c);
  43726. }
  43727. n.getr = l, C.exports = n;
  43728. }).call(this);
  43729. }).call(this, g("buffer").Buffer);
  43730. }, { "bn.js": 186, buffer: 220, randombytes: 475 }], 210: [function(g, C, i) {
  43731. C.exports = g("./browser/algorithms.json");
  43732. }, { "./browser/algorithms.json": 211 }], 211: [function(g, C, i) {
  43733. C.exports = { sha224WithRSAEncryption: { sign: "rsa", hash: "sha224", id: "302d300d06096086480165030402040500041c" }, "RSA-SHA224": { sign: "ecdsa/rsa", hash: "sha224", id: "302d300d06096086480165030402040500041c" }, sha256WithRSAEncryption: { sign: "rsa", hash: "sha256", id: "3031300d060960864801650304020105000420" }, "RSA-SHA256": { sign: "ecdsa/rsa", hash: "sha256", id: "3031300d060960864801650304020105000420" }, sha384WithRSAEncryption: { sign: "rsa", hash: "sha384", id: "3041300d060960864801650304020205000430" }, "RSA-SHA384": { sign: "ecdsa/rsa", hash: "sha384", id: "3041300d060960864801650304020205000430" }, sha512WithRSAEncryption: { sign: "rsa", hash: "sha512", id: "3051300d060960864801650304020305000440" }, "RSA-SHA512": { sign: "ecdsa/rsa", hash: "sha512", id: "3051300d060960864801650304020305000440" }, "RSA-SHA1": { sign: "rsa", hash: "sha1", id: "3021300906052b0e03021a05000414" }, "ecdsa-with-SHA1": { sign: "ecdsa", hash: "sha1", id: "" }, sha256: { sign: "ecdsa", hash: "sha256", id: "" }, sha224: { sign: "ecdsa", hash: "sha224", id: "" }, sha384: { sign: "ecdsa", hash: "sha384", id: "" }, sha512: { sign: "ecdsa", hash: "sha512", id: "" }, "DSA-SHA": { sign: "dsa", hash: "sha1", id: "" }, "DSA-SHA1": { sign: "dsa", hash: "sha1", id: "" }, DSA: { sign: "dsa", hash: "sha1", id: "" }, "DSA-WITH-SHA224": { sign: "dsa", hash: "sha224", id: "" }, "DSA-SHA224": { sign: "dsa", hash: "sha224", id: "" }, "DSA-WITH-SHA256": { sign: "dsa", hash: "sha256", id: "" }, "DSA-SHA256": { sign: "dsa", hash: "sha256", id: "" }, "DSA-WITH-SHA384": { sign: "dsa", hash: "sha384", id: "" }, "DSA-SHA384": { sign: "dsa", hash: "sha384", id: "" }, "DSA-WITH-SHA512": { sign: "dsa", hash: "sha512", id: "" }, "DSA-SHA512": { sign: "dsa", hash: "sha512", id: "" }, "DSA-RIPEMD160": { sign: "dsa", hash: "rmd160", id: "" }, ripemd160WithRSA: { sign: "rsa", hash: "rmd160", id: "3021300906052b2403020105000414" }, "RSA-RIPEMD160": { sign: "rsa", hash: "rmd160", id: "3021300906052b2403020105000414" }, md5WithRSAEncryption: { sign: "rsa", hash: "md5", id: "3020300c06082a864886f70d020505000410" }, "RSA-MD5": { sign: "rsa", hash: "md5", id: "3020300c06082a864886f70d020505000410" } };
  43734. }, {}], 212: [function(g, C, i) {
  43735. C.exports = { "1.3.132.0.10": "secp256k1", "1.3.132.0.33": "p224", "1.2.840.10045.3.1.1": "p192", "1.2.840.10045.3.1.7": "p256", "1.3.132.0.34": "p384", "1.3.132.0.35": "p521" };
  43736. }, {}], 213: [function(g, C, i) {
  43737. var e = g("safe-buffer").Buffer, A = g("create-hash"), s = g("readable-stream"), l = g("inherits"), n = g("./sign"), a = g("./verify"), d = g("./algorithms.json");
  43738. function o(b) {
  43739. s.Writable.call(this);
  43740. var u = d[b];
  43741. if (!u) throw new Error("Unknown message digest");
  43742. this._hashType = u.hash, this._hash = A(u.hash), this._tag = u.id, this._signType = u.sign;
  43743. }
  43744. function c(b) {
  43745. s.Writable.call(this);
  43746. var u = d[b];
  43747. if (!u) throw new Error("Unknown message digest");
  43748. this._hash = A(u.hash), this._tag = u.id, this._signType = u.sign;
  43749. }
  43750. function r(b) {
  43751. return new o(b);
  43752. }
  43753. function h(b) {
  43754. return new c(b);
  43755. }
  43756. Object.keys(d).forEach(function(b) {
  43757. d[b].id = e.from(d[b].id, "hex"), d[b.toLowerCase()] = d[b];
  43758. }), l(o, s.Writable), o.prototype._write = function(b, u, m) {
  43759. this._hash.update(b), m();
  43760. }, o.prototype.update = function(b, u) {
  43761. return typeof b == "string" && (b = e.from(b, u)), this._hash.update(b), this;
  43762. }, o.prototype.sign = function(b, u) {
  43763. this.end();
  43764. var m = this._hash.digest(), Z = n(m, b, this._hashType, this._signType, this._tag);
  43765. return u ? Z.toString(u) : Z;
  43766. }, l(c, s.Writable), c.prototype._write = function(b, u, m) {
  43767. this._hash.update(b), m();
  43768. }, c.prototype.update = function(b, u) {
  43769. return typeof b == "string" && (b = e.from(b, u)), this._hash.update(b), this;
  43770. }, c.prototype.verify = function(b, u, m) {
  43771. typeof u == "string" && (u = e.from(u, m)), this.end();
  43772. var Z = this._hash.digest();
  43773. return a(u, Z, b, this._signType, this._tag);
  43774. }, C.exports = { Sign: r, Verify: h, createSign: r, createVerify: h };
  43775. }, { "./algorithms.json": 211, "./sign": 214, "./verify": 215, "create-hash": 386, inherits: 440, "readable-stream": 491, "safe-buffer": 494 }], 214: [function(g, C, i) {
  43776. var e = g("safe-buffer").Buffer, A = g("create-hmac"), s = g("browserify-rsa"), l = g("elliptic").ec, n = g("bn.js"), a = g("parse-asn1"), d = g("./curves.json");
  43777. function o(b, u, m, Z) {
  43778. if ((b = e.from(b.toArray())).length < u.byteLength()) {
  43779. var p = e.alloc(u.byteLength() - b.length);
  43780. b = e.concat([p, b]);
  43781. }
  43782. var Y = m.length, R = function(S, z) {
  43783. S = (S = c(S, z)).mod(z);
  43784. var v = e.from(S.toArray());
  43785. if (v.length < z.byteLength()) {
  43786. var K = e.alloc(z.byteLength() - v.length);
  43787. v = e.concat([K, v]);
  43788. }
  43789. return v;
  43790. }(m, u), X = e.alloc(Y);
  43791. X.fill(1);
  43792. var H = e.alloc(Y);
  43793. return H = A(Z, H).update(X).update(e.from([0])).update(b).update(R).digest(), X = A(Z, H).update(X).digest(), { k: H = A(Z, H).update(X).update(e.from([1])).update(b).update(R).digest(), v: X = A(Z, H).update(X).digest() };
  43794. }
  43795. function c(b, u) {
  43796. var m = new n(b), Z = (b.length << 3) - u.bitLength();
  43797. return Z > 0 && m.ishrn(Z), m;
  43798. }
  43799. function r(b, u, m) {
  43800. var Z, p;
  43801. do {
  43802. for (Z = e.alloc(0); 8 * Z.length < b.bitLength(); ) u.v = A(m, u.k).update(u.v).digest(), Z = e.concat([Z, u.v]);
  43803. p = c(Z, b), u.k = A(m, u.k).update(u.v).update(e.from([0])).digest(), u.v = A(m, u.k).update(u.v).digest();
  43804. } while (p.cmp(b) !== -1);
  43805. return p;
  43806. }
  43807. function h(b, u, m, Z) {
  43808. return b.toRed(n.mont(m)).redPow(u).fromRed().mod(Z);
  43809. }
  43810. C.exports = function(b, u, m, Z, p) {
  43811. var Y = a(u);
  43812. if (Y.curve) {
  43813. if (Z !== "ecdsa" && Z !== "ecdsa/rsa") throw new Error("wrong private key type");
  43814. return function(S, z) {
  43815. var v = d[z.curve.join(".")];
  43816. if (!v) throw new Error("unknown curve " + z.curve.join("."));
  43817. var K = new l(v).keyFromPrivate(z.privateKey).sign(S);
  43818. return e.from(K.toDER());
  43819. }(b, Y);
  43820. }
  43821. if (Y.type === "dsa") {
  43822. if (Z !== "dsa") throw new Error("wrong private key type");
  43823. return function(S, z, v) {
  43824. for (var K, V = z.params.priv_key, N = z.params.p, B = z.params.q, G = z.params.g, w = new n(0), W = c(S, B).mod(B), y = !1, f = o(V, B, S, v); y === !1; ) K = r(B, f, v), w = h(G, K, N, B), (y = K.invm(B).imul(W.add(V.mul(w))).mod(B)).cmpn(0) === 0 && (y = !1, w = new n(0));
  43825. return function(D, F) {
  43826. D = D.toArray(), F = F.toArray(), 128 & D[0] && (D = [0].concat(D)), 128 & F[0] && (F = [0].concat(F));
  43827. var T = [48, D.length + F.length + 4, 2, D.length];
  43828. return T = T.concat(D, [2, F.length], F), e.from(T);
  43829. }(w, y);
  43830. }(b, Y, m);
  43831. }
  43832. if (Z !== "rsa" && Z !== "ecdsa/rsa") throw new Error("wrong private key type");
  43833. b = e.concat([p, b]);
  43834. for (var R = Y.modulus.byteLength(), X = [0, 1]; b.length + X.length + 1 < R; ) X.push(255);
  43835. X.push(0);
  43836. for (var H = -1; ++H < b.length; ) X.push(b[H]);
  43837. return s(X, Y);
  43838. }, C.exports.getKey = o, C.exports.makeKey = r;
  43839. }, { "./curves.json": 212, "bn.js": 186, "browserify-rsa": 209, "create-hmac": 388, elliptic: 405, "parse-asn1": 459, "safe-buffer": 494 }], 215: [function(g, C, i) {
  43840. var e = g("safe-buffer").Buffer, A = g("bn.js"), s = g("elliptic").ec, l = g("parse-asn1"), n = g("./curves.json");
  43841. function a(d, o) {
  43842. if (d.cmpn(0) <= 0) throw new Error("invalid sig");
  43843. if (d.cmp(o) >= o) throw new Error("invalid sig");
  43844. }
  43845. C.exports = function(d, o, c, r, h) {
  43846. var b = l(c);
  43847. if (b.type === "ec") {
  43848. if (r !== "ecdsa" && r !== "ecdsa/rsa") throw new Error("wrong public key type");
  43849. return function(X, H, S) {
  43850. var z = n[S.data.algorithm.curve.join(".")];
  43851. if (!z) throw new Error("unknown curve " + S.data.algorithm.curve.join("."));
  43852. var v = new s(z), K = S.data.subjectPrivateKey.data;
  43853. return v.verify(H, X, K);
  43854. }(d, o, b);
  43855. }
  43856. if (b.type === "dsa") {
  43857. if (r !== "dsa") throw new Error("wrong public key type");
  43858. return function(X, H, S) {
  43859. var z = S.data.p, v = S.data.q, K = S.data.g, V = S.data.pub_key, N = l.signature.decode(X, "der"), B = N.s, G = N.r;
  43860. a(B, v), a(G, v);
  43861. var w = A.mont(z), W = B.invm(v);
  43862. return K.toRed(w).redPow(new A(H).mul(W).mod(v)).fromRed().mul(V.toRed(w).redPow(G.mul(W).mod(v)).fromRed()).mod(z).mod(v).cmp(G) === 0;
  43863. }(d, o, b);
  43864. }
  43865. if (r !== "rsa" && r !== "ecdsa/rsa") throw new Error("wrong public key type");
  43866. o = e.concat([h, o]);
  43867. for (var u = b.modulus.byteLength(), m = [1], Z = 0; o.length + m.length + 2 < u; ) m.push(255), Z++;
  43868. m.push(0);
  43869. for (var p = -1; ++p < o.length; ) m.push(o[p]);
  43870. m = e.from(m);
  43871. var Y = A.mont(b.modulus);
  43872. d = (d = new A(d).toRed(Y)).redPow(new A(b.publicExponent)), d = e.from(d.fromRed().toArray());
  43873. var R = Z < 8 ? 1 : 0;
  43874. for (u = Math.min(d.length, m.length), d.length !== m.length && (R = 1), p = -1; ++p < u; ) R |= d[p] ^ m[p];
  43875. return R === 0;
  43876. };
  43877. }, { "./curves.json": 212, "bn.js": 186, elliptic: 405, "parse-asn1": 459, "safe-buffer": 494 }], 216: [function(g, C, i) {
  43878. }, {}], 217: [function(g, C, i) {
  43879. var e = g("buffer"), A = e.Buffer;
  43880. function s(n, a) {
  43881. for (var d in n) a[d] = n[d];
  43882. }
  43883. function l(n, a, d) {
  43884. return A(n, a, d);
  43885. }
  43886. A.from && A.alloc && A.allocUnsafe && A.allocUnsafeSlow ? C.exports = e : (s(e, i), i.Buffer = l), s(A, l), l.from = function(n, a, d) {
  43887. if (typeof n == "number") throw new TypeError("Argument must not be a number");
  43888. return A(n, a, d);
  43889. }, l.alloc = function(n, a, d) {
  43890. if (typeof n != "number") throw new TypeError("Argument must be a number");
  43891. var o = A(n);
  43892. return a !== void 0 ? typeof d == "string" ? o.fill(a, d) : o.fill(a) : o.fill(0), o;
  43893. }, l.allocUnsafe = function(n) {
  43894. if (typeof n != "number") throw new TypeError("Argument must be a number");
  43895. return A(n);
  43896. }, l.allocUnsafeSlow = function(n) {
  43897. if (typeof n != "number") throw new TypeError("Argument must be a number");
  43898. return e.SlowBuffer(n);
  43899. };
  43900. }, { buffer: 220 }], 218: [function(g, C, i) {
  43901. var e = g("safe-buffer").Buffer, A = e.isEncoding || function(b) {
  43902. switch ((b = "" + b) && b.toLowerCase()) {
  43903. case "hex":
  43904. case "utf8":
  43905. case "utf-8":
  43906. case "ascii":
  43907. case "binary":
  43908. case "base64":
  43909. case "ucs2":
  43910. case "ucs-2":
  43911. case "utf16le":
  43912. case "utf-16le":
  43913. case "raw":
  43914. return !0;
  43915. default:
  43916. return !1;
  43917. }
  43918. };
  43919. function s(b) {
  43920. var u;
  43921. switch (this.encoding = function(m) {
  43922. var Z = function(p) {
  43923. if (!p) return "utf8";
  43924. for (var Y; ; ) switch (p) {
  43925. case "utf8":
  43926. case "utf-8":
  43927. return "utf8";
  43928. case "ucs2":
  43929. case "ucs-2":
  43930. case "utf16le":
  43931. case "utf-16le":
  43932. return "utf16le";
  43933. case "latin1":
  43934. case "binary":
  43935. return "latin1";
  43936. case "base64":
  43937. case "ascii":
  43938. case "hex":
  43939. return p;
  43940. default:
  43941. if (Y) return;
  43942. p = ("" + p).toLowerCase(), Y = !0;
  43943. }
  43944. }(m);
  43945. if (typeof Z != "string" && (e.isEncoding === A || !A(m))) throw new Error("Unknown encoding: " + m);
  43946. return Z || m;
  43947. }(b), this.encoding) {
  43948. case "utf16le":
  43949. this.text = a, this.end = d, u = 4;
  43950. break;
  43951. case "utf8":
  43952. this.fillLast = n, u = 4;
  43953. break;
  43954. case "base64":
  43955. this.text = o, this.end = c, u = 3;
  43956. break;
  43957. default:
  43958. return this.write = r, void (this.end = h);
  43959. }
  43960. this.lastNeed = 0, this.lastTotal = 0, this.lastChar = e.allocUnsafe(u);
  43961. }
  43962. function l(b) {
  43963. return b <= 127 ? 0 : b >> 5 == 6 ? 2 : b >> 4 == 14 ? 3 : b >> 3 == 30 ? 4 : b >> 6 == 2 ? -1 : -2;
  43964. }
  43965. function n(b) {
  43966. var u = this.lastTotal - this.lastNeed, m = function(Z, p, Y) {
  43967. if ((192 & p[0]) != 128) return Z.lastNeed = 0, "�";
  43968. if (Z.lastNeed > 1 && p.length > 1) {
  43969. if ((192 & p[1]) != 128) return Z.lastNeed = 1, "�";
  43970. if (Z.lastNeed > 2 && p.length > 2 && (192 & p[2]) != 128) return Z.lastNeed = 2, "�";
  43971. }
  43972. }(this, b);
  43973. return m !== void 0 ? m : this.lastNeed <= b.length ? (b.copy(this.lastChar, u, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal)) : (b.copy(this.lastChar, u, 0, b.length), void (this.lastNeed -= b.length));
  43974. }
  43975. function a(b, u) {
  43976. if ((b.length - u) % 2 == 0) {
  43977. var m = b.toString("utf16le", u);
  43978. if (m) {
  43979. var Z = m.charCodeAt(m.length - 1);
  43980. if (Z >= 55296 && Z <= 56319) return this.lastNeed = 2, this.lastTotal = 4, this.lastChar[0] = b[b.length - 2], this.lastChar[1] = b[b.length - 1], m.slice(0, -1);
  43981. }
  43982. return m;
  43983. }
  43984. return this.lastNeed = 1, this.lastTotal = 2, this.lastChar[0] = b[b.length - 1], b.toString("utf16le", u, b.length - 1);
  43985. }
  43986. function d(b) {
  43987. var u = b && b.length ? this.write(b) : "";
  43988. if (this.lastNeed) {
  43989. var m = this.lastTotal - this.lastNeed;
  43990. return u + this.lastChar.toString("utf16le", 0, m);
  43991. }
  43992. return u;
  43993. }
  43994. function o(b, u) {
  43995. var m = (b.length - u) % 3;
  43996. return m === 0 ? b.toString("base64", u) : (this.lastNeed = 3 - m, this.lastTotal = 3, m === 1 ? this.lastChar[0] = b[b.length - 1] : (this.lastChar[0] = b[b.length - 2], this.lastChar[1] = b[b.length - 1]), b.toString("base64", u, b.length - m));
  43997. }
  43998. function c(b) {
  43999. var u = b && b.length ? this.write(b) : "";
  44000. return this.lastNeed ? u + this.lastChar.toString("base64", 0, 3 - this.lastNeed) : u;
  44001. }
  44002. function r(b) {
  44003. return b.toString(this.encoding);
  44004. }
  44005. function h(b) {
  44006. return b && b.length ? this.write(b) : "";
  44007. }
  44008. i.StringDecoder = s, s.prototype.write = function(b) {
  44009. if (b.length === 0) return "";
  44010. var u, m;
  44011. if (this.lastNeed) {
  44012. if ((u = this.fillLast(b)) === void 0) return "";
  44013. m = this.lastNeed, this.lastNeed = 0;
  44014. } else m = 0;
  44015. return m < b.length ? u ? u + this.text(b, m) : this.text(b, m) : u || "";
  44016. }, s.prototype.end = function(b) {
  44017. var u = b && b.length ? this.write(b) : "";
  44018. return this.lastNeed ? u + "�" : u;
  44019. }, s.prototype.text = function(b, u) {
  44020. var m = function(p, Y, R) {
  44021. var X = Y.length - 1;
  44022. if (X < R) return 0;
  44023. var H = l(Y[X]);
  44024. return H >= 0 ? (H > 0 && (p.lastNeed = H - 1), H) : --X < R || H === -2 ? 0 : (H = l(Y[X])) >= 0 ? (H > 0 && (p.lastNeed = H - 2), H) : --X < R || H === -2 ? 0 : (H = l(Y[X])) >= 0 ? (H > 0 && (H === 2 ? H = 0 : p.lastNeed = H - 3), H) : 0;
  44025. }(this, b, u);
  44026. if (!this.lastNeed) return b.toString("utf8", u);
  44027. this.lastTotal = m;
  44028. var Z = b.length - (m - this.lastNeed);
  44029. return b.copy(this.lastChar, 0, Z), b.toString("utf8", u, Z);
  44030. }, s.prototype.fillLast = function(b) {
  44031. if (this.lastNeed <= b.length) return b.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal);
  44032. b.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, b.length), this.lastNeed -= b.length;
  44033. };
  44034. }, { "safe-buffer": 217 }], 219: [function(g, C, i) {
  44035. (function(e) {
  44036. (function() {
  44037. C.exports = function(A, s) {
  44038. for (var l = Math.min(A.length, s.length), n = new e(l), a = 0; a < l; ++a) n[a] = A[a] ^ s[a];
  44039. return n;
  44040. };
  44041. }).call(this);
  44042. }).call(this, g("buffer").Buffer);
  44043. }, { buffer: 220 }], 220: [function(g, C, i) {
  44044. (function(e) {
  44045. (function() {
  44046. var A = g("base64-js"), s = g("ieee754");
  44047. i.Buffer = n, i.SlowBuffer = function(J) {
  44048. return +J != J && (J = 0), n.alloc(+J);
  44049. }, i.INSPECT_MAX_BYTES = 50;
  44050. function l(J) {
  44051. if (J > 2147483647) throw new RangeError('The value "' + J + '" is invalid for option "size"');
  44052. var k = new Uint8Array(J);
  44053. return k.__proto__ = n.prototype, k;
  44054. }
  44055. function n(J, k, j) {
  44056. if (typeof J == "number") {
  44057. if (typeof k == "string") throw new TypeError('The "string" argument must be of type string. Received type number');
  44058. return o(J);
  44059. }
  44060. return a(J, k, j);
  44061. }
  44062. function a(J, k, j) {
  44063. if (typeof J == "string") return function(Ig, x) {
  44064. if (typeof x == "string" && x !== "" || (x = "utf8"), !n.isEncoding(x)) throw new TypeError("Unknown encoding: " + x);
  44065. var Ag = 0 | h(Ig, x), eg = l(Ag), O = eg.write(Ig, x);
  44066. return O !== Ag && (eg = eg.slice(0, O)), eg;
  44067. }(J, k);
  44068. if (ArrayBuffer.isView(J)) return c(J);
  44069. if (J == null) throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof J);
  44070. if (L(J, ArrayBuffer) || J && L(J.buffer, ArrayBuffer)) return function(Ig, x, Ag) {
  44071. if (x < 0 || Ig.byteLength < x) throw new RangeError('"offset" is outside of buffer bounds');
  44072. if (Ig.byteLength < x + (Ag || 0)) throw new RangeError('"length" is outside of buffer bounds');
  44073. var eg;
  44074. return eg = x === void 0 && Ag === void 0 ? new Uint8Array(Ig) : Ag === void 0 ? new Uint8Array(Ig, x) : new Uint8Array(Ig, x, Ag), eg.__proto__ = n.prototype, eg;
  44075. }(J, k, j);
  44076. if (typeof J == "number") throw new TypeError('The "value" argument must not be of type number. Received type number');
  44077. var q = J.valueOf && J.valueOf();
  44078. if (q != null && q !== J) return n.from(q, k, j);
  44079. var Cg = function(Ig) {
  44080. if (n.isBuffer(Ig)) {
  44081. var x = 0 | r(Ig.length), Ag = l(x);
  44082. return Ag.length === 0 || Ig.copy(Ag, 0, 0, x), Ag;
  44083. }
  44084. if (Ig.length !== void 0) return typeof Ig.length != "number" || E(Ig.length) ? l(0) : c(Ig);
  44085. if (Ig.type === "Buffer" && Array.isArray(Ig.data)) return c(Ig.data);
  44086. }(J);
  44087. if (Cg) return Cg;
  44088. if (typeof Symbol < "u" && Symbol.toPrimitive != null && typeof J[Symbol.toPrimitive] == "function") return n.from(J[Symbol.toPrimitive]("string"), k, j);
  44089. throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof J);
  44090. }
  44091. function d(J) {
  44092. if (typeof J != "number") throw new TypeError('"size" argument must be of type number');
  44093. if (J < 0) throw new RangeError('The value "' + J + '" is invalid for option "size"');
  44094. }
  44095. function o(J) {
  44096. return d(J), l(J < 0 ? 0 : 0 | r(J));
  44097. }
  44098. function c(J) {
  44099. for (var k = J.length < 0 ? 0 : 0 | r(J.length), j = l(k), q = 0; q < k; q += 1) j[q] = 255 & J[q];
  44100. return j;
  44101. }
  44102. function r(J) {
  44103. if (J >= 2147483647) throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x7fffffff bytes");
  44104. return 0 | J;
  44105. }
  44106. function h(J, k) {
  44107. if (n.isBuffer(J)) return J.length;
  44108. if (ArrayBuffer.isView(J) || L(J, ArrayBuffer)) return J.byteLength;
  44109. if (typeof J != "string") throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof J);
  44110. var j = J.length, q = arguments.length > 2 && arguments[2] === !0;
  44111. if (!q && j === 0) return 0;
  44112. for (var Cg = !1; ; ) switch (k) {
  44113. case "ascii":
  44114. case "latin1":
  44115. case "binary":
  44116. return j;
  44117. case "utf8":
  44118. case "utf-8":
  44119. return T(J).length;
  44120. case "ucs2":
  44121. case "ucs-2":
  44122. case "utf16le":
  44123. case "utf-16le":
  44124. return 2 * j;
  44125. case "hex":
  44126. return j >>> 1;
  44127. case "base64":
  44128. return Q(J).length;
  44129. default:
  44130. if (Cg) return q ? -1 : T(J).length;
  44131. k = ("" + k).toLowerCase(), Cg = !0;
  44132. }
  44133. }
  44134. function b(J, k, j) {
  44135. var q = !1;
  44136. if ((k === void 0 || k < 0) && (k = 0), k > this.length || ((j === void 0 || j > this.length) && (j = this.length), j <= 0) || (j >>>= 0) <= (k >>>= 0)) return "";
  44137. for (J || (J = "utf8"); ; ) switch (J) {
  44138. case "hex":
  44139. return N(this, k, j);
  44140. case "utf8":
  44141. case "utf-8":
  44142. return v(this, k, j);
  44143. case "ascii":
  44144. return K(this, k, j);
  44145. case "latin1":
  44146. case "binary":
  44147. return V(this, k, j);
  44148. case "base64":
  44149. return z(this, k, j);
  44150. case "ucs2":
  44151. case "ucs-2":
  44152. case "utf16le":
  44153. case "utf-16le":
  44154. return B(this, k, j);
  44155. default:
  44156. if (q) throw new TypeError("Unknown encoding: " + J);
  44157. J = (J + "").toLowerCase(), q = !0;
  44158. }
  44159. }
  44160. function u(J, k, j) {
  44161. var q = J[k];
  44162. J[k] = J[j], J[j] = q;
  44163. }
  44164. function m(J, k, j, q, Cg) {
  44165. if (J.length === 0) return -1;
  44166. if (typeof j == "string" ? (q = j, j = 0) : j > 2147483647 ? j = 2147483647 : j < -2147483648 && (j = -2147483648), E(j = +j) && (j = Cg ? 0 : J.length - 1), j < 0 && (j = J.length + j), j >= J.length) {
  44167. if (Cg) return -1;
  44168. j = J.length - 1;
  44169. } else if (j < 0) {
  44170. if (!Cg) return -1;
  44171. j = 0;
  44172. }
  44173. if (typeof k == "string" && (k = n.from(k, q)), n.isBuffer(k)) return k.length === 0 ? -1 : Z(J, k, j, q, Cg);
  44174. if (typeof k == "number") return k &= 255, typeof Uint8Array.prototype.indexOf == "function" ? Cg ? Uint8Array.prototype.indexOf.call(J, k, j) : Uint8Array.prototype.lastIndexOf.call(J, k, j) : Z(J, [k], j, q, Cg);
  44175. throw new TypeError("val must be string, number or Buffer");
  44176. }
  44177. function Z(J, k, j, q, Cg) {
  44178. var Ig, x = 1, Ag = J.length, eg = k.length;
  44179. if (q !== void 0 && ((q = String(q).toLowerCase()) === "ucs2" || q === "ucs-2" || q === "utf16le" || q === "utf-16le")) {
  44180. if (J.length < 2 || k.length < 2) return -1;
  44181. x = 2, Ag /= 2, eg /= 2, j /= 2;
  44182. }
  44183. function O(ng, sg) {
  44184. return x === 1 ? ng[sg] : ng.readUInt16BE(sg * x);
  44185. }
  44186. if (Cg) {
  44187. var _ = -1;
  44188. for (Ig = j; Ig < Ag; Ig++) if (O(J, Ig) === O(k, _ === -1 ? 0 : Ig - _)) {
  44189. if (_ === -1 && (_ = Ig), Ig - _ + 1 === eg) return _ * x;
  44190. } else _ !== -1 && (Ig -= Ig - _), _ = -1;
  44191. } else for (j + eg > Ag && (j = Ag - eg), Ig = j; Ig >= 0; Ig--) {
  44192. for (var gg = !0, lg = 0; lg < eg; lg++) if (O(J, Ig + lg) !== O(k, lg)) {
  44193. gg = !1;
  44194. break;
  44195. }
  44196. if (gg) return Ig;
  44197. }
  44198. return -1;
  44199. }
  44200. function p(J, k, j, q) {
  44201. j = Number(j) || 0;
  44202. var Cg = J.length - j;
  44203. q ? (q = Number(q)) > Cg && (q = Cg) : q = Cg;
  44204. var Ig = k.length;
  44205. q > Ig / 2 && (q = Ig / 2);
  44206. for (var x = 0; x < q; ++x) {
  44207. var Ag = parseInt(k.substr(2 * x, 2), 16);
  44208. if (E(Ag)) return x;
  44209. J[j + x] = Ag;
  44210. }
  44211. return x;
  44212. }
  44213. function Y(J, k, j, q) {
  44214. return P(T(k, J.length - j), J, j, q);
  44215. }
  44216. function R(J, k, j, q) {
  44217. return P(function(Cg) {
  44218. for (var Ig = [], x = 0; x < Cg.length; ++x) Ig.push(255 & Cg.charCodeAt(x));
  44219. return Ig;
  44220. }(k), J, j, q);
  44221. }
  44222. function X(J, k, j, q) {
  44223. return R(J, k, j, q);
  44224. }
  44225. function H(J, k, j, q) {
  44226. return P(Q(k), J, j, q);
  44227. }
  44228. function S(J, k, j, q) {
  44229. return P(function(Cg, Ig) {
  44230. for (var x, Ag, eg, O = [], _ = 0; _ < Cg.length && !((Ig -= 2) < 0); ++_) x = Cg.charCodeAt(_), Ag = x >> 8, eg = x % 256, O.push(eg), O.push(Ag);
  44231. return O;
  44232. }(k, J.length - j), J, j, q);
  44233. }
  44234. function z(J, k, j) {
  44235. return k === 0 && j === J.length ? A.fromByteArray(J) : A.fromByteArray(J.slice(k, j));
  44236. }
  44237. function v(J, k, j) {
  44238. j = Math.min(J.length, j);
  44239. for (var q = [], Cg = k; Cg < j; ) {
  44240. var Ig, x, Ag, eg, O = J[Cg], _ = null, gg = O > 239 ? 4 : O > 223 ? 3 : O > 191 ? 2 : 1;
  44241. if (Cg + gg <= j) switch (gg) {
  44242. case 1:
  44243. O < 128 && (_ = O);
  44244. break;
  44245. case 2:
  44246. (192 & (Ig = J[Cg + 1])) == 128 && (eg = (31 & O) << 6 | 63 & Ig) > 127 && (_ = eg);
  44247. break;
  44248. case 3:
  44249. Ig = J[Cg + 1], x = J[Cg + 2], (192 & Ig) == 128 && (192 & x) == 128 && (eg = (15 & O) << 12 | (63 & Ig) << 6 | 63 & x) > 2047 && (eg < 55296 || eg > 57343) && (_ = eg);
  44250. break;
  44251. case 4:
  44252. Ig = J[Cg + 1], x = J[Cg + 2], Ag = J[Cg + 3], (192 & Ig) == 128 && (192 & x) == 128 && (192 & Ag) == 128 && (eg = (15 & O) << 18 | (63 & Ig) << 12 | (63 & x) << 6 | 63 & Ag) > 65535 && eg < 1114112 && (_ = eg);
  44253. }
  44254. _ === null ? (_ = 65533, gg = 1) : _ > 65535 && (_ -= 65536, q.push(_ >>> 10 & 1023 | 55296), _ = 56320 | 1023 & _), q.push(_), Cg += gg;
  44255. }
  44256. return function(lg) {
  44257. var ng = lg.length;
  44258. if (ng <= 4096) return String.fromCharCode.apply(String, lg);
  44259. for (var sg = "", og = 0; og < ng; ) sg += String.fromCharCode.apply(String, lg.slice(og, og += 4096));
  44260. return sg;
  44261. }(q);
  44262. }
  44263. i.kMaxLength = 2147483647, n.TYPED_ARRAY_SUPPORT = function() {
  44264. try {
  44265. var J = new Uint8Array(1);
  44266. return J.__proto__ = { __proto__: Uint8Array.prototype, foo: function() {
  44267. return 42;
  44268. } }, J.foo() === 42;
  44269. } catch {
  44270. return !1;
  44271. }
  44272. }(), n.TYPED_ARRAY_SUPPORT || typeof console > "u" || typeof console.error != "function" || console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."), Object.defineProperty(n.prototype, "parent", { enumerable: !0, get: function() {
  44273. if (n.isBuffer(this)) return this.buffer;
  44274. } }), Object.defineProperty(n.prototype, "offset", { enumerable: !0, get: function() {
  44275. if (n.isBuffer(this)) return this.byteOffset;
  44276. } }), typeof Symbol < "u" && Symbol.species != null && n[Symbol.species] === n && Object.defineProperty(n, Symbol.species, { value: null, configurable: !0, enumerable: !1, writable: !1 }), n.poolSize = 8192, n.from = function(J, k, j) {
  44277. return a(J, k, j);
  44278. }, n.prototype.__proto__ = Uint8Array.prototype, n.__proto__ = Uint8Array, n.alloc = function(J, k, j) {
  44279. return function(q, Cg, Ig) {
  44280. return d(q), q <= 0 ? l(q) : Cg !== void 0 ? typeof Ig == "string" ? l(q).fill(Cg, Ig) : l(q).fill(Cg) : l(q);
  44281. }(J, k, j);
  44282. }, n.allocUnsafe = function(J) {
  44283. return o(J);
  44284. }, n.allocUnsafeSlow = function(J) {
  44285. return o(J);
  44286. }, n.isBuffer = function(J) {
  44287. return J != null && J._isBuffer === !0 && J !== n.prototype;
  44288. }, n.compare = function(J, k) {
  44289. if (L(J, Uint8Array) && (J = n.from(J, J.offset, J.byteLength)), L(k, Uint8Array) && (k = n.from(k, k.offset, k.byteLength)), !n.isBuffer(J) || !n.isBuffer(k)) throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');
  44290. if (J === k) return 0;
  44291. for (var j = J.length, q = k.length, Cg = 0, Ig = Math.min(j, q); Cg < Ig; ++Cg) if (J[Cg] !== k[Cg]) {
  44292. j = J[Cg], q = k[Cg];
  44293. break;
  44294. }
  44295. return j < q ? -1 : q < j ? 1 : 0;
  44296. }, n.isEncoding = function(J) {
  44297. switch (String(J).toLowerCase()) {
  44298. case "hex":
  44299. case "utf8":
  44300. case "utf-8":
  44301. case "ascii":
  44302. case "latin1":
  44303. case "binary":
  44304. case "base64":
  44305. case "ucs2":
  44306. case "ucs-2":
  44307. case "utf16le":
  44308. case "utf-16le":
  44309. return !0;
  44310. default:
  44311. return !1;
  44312. }
  44313. }, n.concat = function(J, k) {
  44314. if (!Array.isArray(J)) throw new TypeError('"list" argument must be an Array of Buffers');
  44315. if (J.length === 0) return n.alloc(0);
  44316. var j;
  44317. if (k === void 0) for (k = 0, j = 0; j < J.length; ++j) k += J[j].length;
  44318. var q = n.allocUnsafe(k), Cg = 0;
  44319. for (j = 0; j < J.length; ++j) {
  44320. var Ig = J[j];
  44321. if (L(Ig, Uint8Array) && (Ig = n.from(Ig)), !n.isBuffer(Ig)) throw new TypeError('"list" argument must be an Array of Buffers');
  44322. Ig.copy(q, Cg), Cg += Ig.length;
  44323. }
  44324. return q;
  44325. }, n.byteLength = h, n.prototype._isBuffer = !0, n.prototype.swap16 = function() {
  44326. var J = this.length;
  44327. if (J % 2 != 0) throw new RangeError("Buffer size must be a multiple of 16-bits");
  44328. for (var k = 0; k < J; k += 2) u(this, k, k + 1);
  44329. return this;
  44330. }, n.prototype.swap32 = function() {
  44331. var J = this.length;
  44332. if (J % 4 != 0) throw new RangeError("Buffer size must be a multiple of 32-bits");
  44333. for (var k = 0; k < J; k += 4) u(this, k, k + 3), u(this, k + 1, k + 2);
  44334. return this;
  44335. }, n.prototype.swap64 = function() {
  44336. var J = this.length;
  44337. if (J % 8 != 0) throw new RangeError("Buffer size must be a multiple of 64-bits");
  44338. for (var k = 0; k < J; k += 8) u(this, k, k + 7), u(this, k + 1, k + 6), u(this, k + 2, k + 5), u(this, k + 3, k + 4);
  44339. return this;
  44340. }, n.prototype.toString = function() {
  44341. var J = this.length;
  44342. return J === 0 ? "" : arguments.length === 0 ? v(this, 0, J) : b.apply(this, arguments);
  44343. }, n.prototype.toLocaleString = n.prototype.toString, n.prototype.equals = function(J) {
  44344. if (!n.isBuffer(J)) throw new TypeError("Argument must be a Buffer");
  44345. return this === J || n.compare(this, J) === 0;
  44346. }, n.prototype.inspect = function() {
  44347. var J = "", k = i.INSPECT_MAX_BYTES;
  44348. return J = this.toString("hex", 0, k).replace(/(.{2})/g, "$1 ").trim(), this.length > k && (J += " ... "), "<Buffer " + J + ">";
  44349. }, n.prototype.compare = function(J, k, j, q, Cg) {
  44350. if (L(J, Uint8Array) && (J = n.from(J, J.offset, J.byteLength)), !n.isBuffer(J)) throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type ' + typeof J);
  44351. if (k === void 0 && (k = 0), j === void 0 && (j = J ? J.length : 0), q === void 0 && (q = 0), Cg === void 0 && (Cg = this.length), k < 0 || j > J.length || q < 0 || Cg > this.length) throw new RangeError("out of range index");
  44352. if (q >= Cg && k >= j) return 0;
  44353. if (q >= Cg) return -1;
  44354. if (k >= j) return 1;
  44355. if (this === J) return 0;
  44356. for (var Ig = (Cg >>>= 0) - (q >>>= 0), x = (j >>>= 0) - (k >>>= 0), Ag = Math.min(Ig, x), eg = this.slice(q, Cg), O = J.slice(k, j), _ = 0; _ < Ag; ++_) if (eg[_] !== O[_]) {
  44357. Ig = eg[_], x = O[_];
  44358. break;
  44359. }
  44360. return Ig < x ? -1 : x < Ig ? 1 : 0;
  44361. }, n.prototype.includes = function(J, k, j) {
  44362. return this.indexOf(J, k, j) !== -1;
  44363. }, n.prototype.indexOf = function(J, k, j) {
  44364. return m(this, J, k, j, !0);
  44365. }, n.prototype.lastIndexOf = function(J, k, j) {
  44366. return m(this, J, k, j, !1);
  44367. }, n.prototype.write = function(J, k, j, q) {
  44368. if (k === void 0) q = "utf8", j = this.length, k = 0;
  44369. else if (j === void 0 && typeof k == "string") q = k, j = this.length, k = 0;
  44370. else {
  44371. if (!isFinite(k)) throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");
  44372. k >>>= 0, isFinite(j) ? (j >>>= 0, q === void 0 && (q = "utf8")) : (q = j, j = void 0);
  44373. }
  44374. var Cg = this.length - k;
  44375. if ((j === void 0 || j > Cg) && (j = Cg), J.length > 0 && (j < 0 || k < 0) || k > this.length) throw new RangeError("Attempt to write outside buffer bounds");
  44376. q || (q = "utf8");
  44377. for (var Ig = !1; ; ) switch (q) {
  44378. case "hex":
  44379. return p(this, J, k, j);
  44380. case "utf8":
  44381. case "utf-8":
  44382. return Y(this, J, k, j);
  44383. case "ascii":
  44384. return R(this, J, k, j);
  44385. case "latin1":
  44386. case "binary":
  44387. return X(this, J, k, j);
  44388. case "base64":
  44389. return H(this, J, k, j);
  44390. case "ucs2":
  44391. case "ucs-2":
  44392. case "utf16le":
  44393. case "utf-16le":
  44394. return S(this, J, k, j);
  44395. default:
  44396. if (Ig) throw new TypeError("Unknown encoding: " + q);
  44397. q = ("" + q).toLowerCase(), Ig = !0;
  44398. }
  44399. }, n.prototype.toJSON = function() {
  44400. return { type: "Buffer", data: Array.prototype.slice.call(this._arr || this, 0) };
  44401. };
  44402. function K(J, k, j) {
  44403. var q = "";
  44404. j = Math.min(J.length, j);
  44405. for (var Cg = k; Cg < j; ++Cg) q += String.fromCharCode(127 & J[Cg]);
  44406. return q;
  44407. }
  44408. function V(J, k, j) {
  44409. var q = "";
  44410. j = Math.min(J.length, j);
  44411. for (var Cg = k; Cg < j; ++Cg) q += String.fromCharCode(J[Cg]);
  44412. return q;
  44413. }
  44414. function N(J, k, j) {
  44415. var q = J.length;
  44416. (!k || k < 0) && (k = 0), (!j || j < 0 || j > q) && (j = q);
  44417. for (var Cg = "", Ig = k; Ig < j; ++Ig) Cg += F(J[Ig]);
  44418. return Cg;
  44419. }
  44420. function B(J, k, j) {
  44421. for (var q = J.slice(k, j), Cg = "", Ig = 0; Ig < q.length; Ig += 2) Cg += String.fromCharCode(q[Ig] + 256 * q[Ig + 1]);
  44422. return Cg;
  44423. }
  44424. function G(J, k, j) {
  44425. if (J % 1 != 0 || J < 0) throw new RangeError("offset is not uint");
  44426. if (J + k > j) throw new RangeError("Trying to access beyond buffer length");
  44427. }
  44428. function w(J, k, j, q, Cg, Ig) {
  44429. if (!n.isBuffer(J)) throw new TypeError('"buffer" argument must be a Buffer instance');
  44430. if (k > Cg || k < Ig) throw new RangeError('"value" argument is out of bounds');
  44431. if (j + q > J.length) throw new RangeError("Index out of range");
  44432. }
  44433. function W(J, k, j, q, Cg, Ig) {
  44434. if (j + q > J.length) throw new RangeError("Index out of range");
  44435. if (j < 0) throw new RangeError("Index out of range");
  44436. }
  44437. function y(J, k, j, q, Cg) {
  44438. return k = +k, j >>>= 0, Cg || W(J, 0, j, 4), s.write(J, k, j, q, 23, 4), j + 4;
  44439. }
  44440. function f(J, k, j, q, Cg) {
  44441. return k = +k, j >>>= 0, Cg || W(J, 0, j, 8), s.write(J, k, j, q, 52, 8), j + 8;
  44442. }
  44443. n.prototype.slice = function(J, k) {
  44444. var j = this.length;
  44445. (J = ~~J) < 0 ? (J += j) < 0 && (J = 0) : J > j && (J = j), (k = k === void 0 ? j : ~~k) < 0 ? (k += j) < 0 && (k = 0) : k > j && (k = j), k < J && (k = J);
  44446. var q = this.subarray(J, k);
  44447. return q.__proto__ = n.prototype, q;
  44448. }, n.prototype.readUIntLE = function(J, k, j) {
  44449. J >>>= 0, k >>>= 0, j || G(J, k, this.length);
  44450. for (var q = this[J], Cg = 1, Ig = 0; ++Ig < k && (Cg *= 256); ) q += this[J + Ig] * Cg;
  44451. return q;
  44452. }, n.prototype.readUIntBE = function(J, k, j) {
  44453. J >>>= 0, k >>>= 0, j || G(J, k, this.length);
  44454. for (var q = this[J + --k], Cg = 1; k > 0 && (Cg *= 256); ) q += this[J + --k] * Cg;
  44455. return q;
  44456. }, n.prototype.readUInt8 = function(J, k) {
  44457. return J >>>= 0, k || G(J, 1, this.length), this[J];
  44458. }, n.prototype.readUInt16LE = function(J, k) {
  44459. return J >>>= 0, k || G(J, 2, this.length), this[J] | this[J + 1] << 8;
  44460. }, n.prototype.readUInt16BE = function(J, k) {
  44461. return J >>>= 0, k || G(J, 2, this.length), this[J] << 8 | this[J + 1];
  44462. }, n.prototype.readUInt32LE = function(J, k) {
  44463. return J >>>= 0, k || G(J, 4, this.length), (this[J] | this[J + 1] << 8 | this[J + 2] << 16) + 16777216 * this[J + 3];
  44464. }, n.prototype.readUInt32BE = function(J, k) {
  44465. return J >>>= 0, k || G(J, 4, this.length), 16777216 * this[J] + (this[J + 1] << 16 | this[J + 2] << 8 | this[J + 3]);
  44466. }, n.prototype.readIntLE = function(J, k, j) {
  44467. J >>>= 0, k >>>= 0, j || G(J, k, this.length);
  44468. for (var q = this[J], Cg = 1, Ig = 0; ++Ig < k && (Cg *= 256); ) q += this[J + Ig] * Cg;
  44469. return q >= (Cg *= 128) && (q -= Math.pow(2, 8 * k)), q;
  44470. }, n.prototype.readIntBE = function(J, k, j) {
  44471. J >>>= 0, k >>>= 0, j || G(J, k, this.length);
  44472. for (var q = k, Cg = 1, Ig = this[J + --q]; q > 0 && (Cg *= 256); ) Ig += this[J + --q] * Cg;
  44473. return Ig >= (Cg *= 128) && (Ig -= Math.pow(2, 8 * k)), Ig;
  44474. }, n.prototype.readInt8 = function(J, k) {
  44475. return J >>>= 0, k || G(J, 1, this.length), 128 & this[J] ? -1 * (255 - this[J] + 1) : this[J];
  44476. }, n.prototype.readInt16LE = function(J, k) {
  44477. J >>>= 0, k || G(J, 2, this.length);
  44478. var j = this[J] | this[J + 1] << 8;
  44479. return 32768 & j ? 4294901760 | j : j;
  44480. }, n.prototype.readInt16BE = function(J, k) {
  44481. J >>>= 0, k || G(J, 2, this.length);
  44482. var j = this[J + 1] | this[J] << 8;
  44483. return 32768 & j ? 4294901760 | j : j;
  44484. }, n.prototype.readInt32LE = function(J, k) {
  44485. return J >>>= 0, k || G(J, 4, this.length), this[J] | this[J + 1] << 8 | this[J + 2] << 16 | this[J + 3] << 24;
  44486. }, n.prototype.readInt32BE = function(J, k) {
  44487. return J >>>= 0, k || G(J, 4, this.length), this[J] << 24 | this[J + 1] << 16 | this[J + 2] << 8 | this[J + 3];
  44488. }, n.prototype.readFloatLE = function(J, k) {
  44489. return J >>>= 0, k || G(J, 4, this.length), s.read(this, J, !0, 23, 4);
  44490. }, n.prototype.readFloatBE = function(J, k) {
  44491. return J >>>= 0, k || G(J, 4, this.length), s.read(this, J, !1, 23, 4);
  44492. }, n.prototype.readDoubleLE = function(J, k) {
  44493. return J >>>= 0, k || G(J, 8, this.length), s.read(this, J, !0, 52, 8);
  44494. }, n.prototype.readDoubleBE = function(J, k) {
  44495. return J >>>= 0, k || G(J, 8, this.length), s.read(this, J, !1, 52, 8);
  44496. }, n.prototype.writeUIntLE = function(J, k, j, q) {
  44497. J = +J, k >>>= 0, j >>>= 0, q || w(this, J, k, j, Math.pow(2, 8 * j) - 1, 0);
  44498. var Cg = 1, Ig = 0;
  44499. for (this[k] = 255 & J; ++Ig < j && (Cg *= 256); ) this[k + Ig] = J / Cg & 255;
  44500. return k + j;
  44501. }, n.prototype.writeUIntBE = function(J, k, j, q) {
  44502. J = +J, k >>>= 0, j >>>= 0, q || w(this, J, k, j, Math.pow(2, 8 * j) - 1, 0);
  44503. var Cg = j - 1, Ig = 1;
  44504. for (this[k + Cg] = 255 & J; --Cg >= 0 && (Ig *= 256); ) this[k + Cg] = J / Ig & 255;
  44505. return k + j;
  44506. }, n.prototype.writeUInt8 = function(J, k, j) {
  44507. return J = +J, k >>>= 0, j || w(this, J, k, 1, 255, 0), this[k] = 255 & J, k + 1;
  44508. }, n.prototype.writeUInt16LE = function(J, k, j) {
  44509. return J = +J, k >>>= 0, j || w(this, J, k, 2, 65535, 0), this[k] = 255 & J, this[k + 1] = J >>> 8, k + 2;
  44510. }, n.prototype.writeUInt16BE = function(J, k, j) {
  44511. return J = +J, k >>>= 0, j || w(this, J, k, 2, 65535, 0), this[k] = J >>> 8, this[k + 1] = 255 & J, k + 2;
  44512. }, n.prototype.writeUInt32LE = function(J, k, j) {
  44513. return J = +J, k >>>= 0, j || w(this, J, k, 4, 4294967295, 0), this[k + 3] = J >>> 24, this[k + 2] = J >>> 16, this[k + 1] = J >>> 8, this[k] = 255 & J, k + 4;
  44514. }, n.prototype.writeUInt32BE = function(J, k, j) {
  44515. return J = +J, k >>>= 0, j || w(this, J, k, 4, 4294967295, 0), this[k] = J >>> 24, this[k + 1] = J >>> 16, this[k + 2] = J >>> 8, this[k + 3] = 255 & J, k + 4;
  44516. }, n.prototype.writeIntLE = function(J, k, j, q) {
  44517. if (J = +J, k >>>= 0, !q) {
  44518. var Cg = Math.pow(2, 8 * j - 1);
  44519. w(this, J, k, j, Cg - 1, -Cg);
  44520. }
  44521. var Ig = 0, x = 1, Ag = 0;
  44522. for (this[k] = 255 & J; ++Ig < j && (x *= 256); ) J < 0 && Ag === 0 && this[k + Ig - 1] !== 0 && (Ag = 1), this[k + Ig] = (J / x >> 0) - Ag & 255;
  44523. return k + j;
  44524. }, n.prototype.writeIntBE = function(J, k, j, q) {
  44525. if (J = +J, k >>>= 0, !q) {
  44526. var Cg = Math.pow(2, 8 * j - 1);
  44527. w(this, J, k, j, Cg - 1, -Cg);
  44528. }
  44529. var Ig = j - 1, x = 1, Ag = 0;
  44530. for (this[k + Ig] = 255 & J; --Ig >= 0 && (x *= 256); ) J < 0 && Ag === 0 && this[k + Ig + 1] !== 0 && (Ag = 1), this[k + Ig] = (J / x >> 0) - Ag & 255;
  44531. return k + j;
  44532. }, n.prototype.writeInt8 = function(J, k, j) {
  44533. return J = +J, k >>>= 0, j || w(this, J, k, 1, 127, -128), J < 0 && (J = 255 + J + 1), this[k] = 255 & J, k + 1;
  44534. }, n.prototype.writeInt16LE = function(J, k, j) {
  44535. return J = +J, k >>>= 0, j || w(this, J, k, 2, 32767, -32768), this[k] = 255 & J, this[k + 1] = J >>> 8, k + 2;
  44536. }, n.prototype.writeInt16BE = function(J, k, j) {
  44537. return J = +J, k >>>= 0, j || w(this, J, k, 2, 32767, -32768), this[k] = J >>> 8, this[k + 1] = 255 & J, k + 2;
  44538. }, n.prototype.writeInt32LE = function(J, k, j) {
  44539. return J = +J, k >>>= 0, j || w(this, J, k, 4, 2147483647, -2147483648), this[k] = 255 & J, this[k + 1] = J >>> 8, this[k + 2] = J >>> 16, this[k + 3] = J >>> 24, k + 4;
  44540. }, n.prototype.writeInt32BE = function(J, k, j) {
  44541. return J = +J, k >>>= 0, j || w(this, J, k, 4, 2147483647, -2147483648), J < 0 && (J = 4294967295 + J + 1), this[k] = J >>> 24, this[k + 1] = J >>> 16, this[k + 2] = J >>> 8, this[k + 3] = 255 & J, k + 4;
  44542. }, n.prototype.writeFloatLE = function(J, k, j) {
  44543. return y(this, J, k, !0, j);
  44544. }, n.prototype.writeFloatBE = function(J, k, j) {
  44545. return y(this, J, k, !1, j);
  44546. }, n.prototype.writeDoubleLE = function(J, k, j) {
  44547. return f(this, J, k, !0, j);
  44548. }, n.prototype.writeDoubleBE = function(J, k, j) {
  44549. return f(this, J, k, !1, j);
  44550. }, n.prototype.copy = function(J, k, j, q) {
  44551. if (!n.isBuffer(J)) throw new TypeError("argument should be a Buffer");
  44552. if (j || (j = 0), q || q === 0 || (q = this.length), k >= J.length && (k = J.length), k || (k = 0), q > 0 && q < j && (q = j), q === j || J.length === 0 || this.length === 0) return 0;
  44553. if (k < 0) throw new RangeError("targetStart out of bounds");
  44554. if (j < 0 || j >= this.length) throw new RangeError("Index out of range");
  44555. if (q < 0) throw new RangeError("sourceEnd out of bounds");
  44556. q > this.length && (q = this.length), J.length - k < q - j && (q = J.length - k + j);
  44557. var Cg = q - j;
  44558. if (this === J && typeof Uint8Array.prototype.copyWithin == "function") this.copyWithin(k, j, q);
  44559. else if (this === J && j < k && k < q) for (var Ig = Cg - 1; Ig >= 0; --Ig) J[Ig + k] = this[Ig + j];
  44560. else Uint8Array.prototype.set.call(J, this.subarray(j, q), k);
  44561. return Cg;
  44562. }, n.prototype.fill = function(J, k, j, q) {
  44563. if (typeof J == "string") {
  44564. if (typeof k == "string" ? (q = k, k = 0, j = this.length) : typeof j == "string" && (q = j, j = this.length), q !== void 0 && typeof q != "string") throw new TypeError("encoding must be a string");
  44565. if (typeof q == "string" && !n.isEncoding(q)) throw new TypeError("Unknown encoding: " + q);
  44566. if (J.length === 1) {
  44567. var Cg = J.charCodeAt(0);
  44568. (q === "utf8" && Cg < 128 || q === "latin1") && (J = Cg);
  44569. }
  44570. } else typeof J == "number" && (J &= 255);
  44571. if (k < 0 || this.length < k || this.length < j) throw new RangeError("Out of range index");
  44572. if (j <= k) return this;
  44573. var Ig;
  44574. if (k >>>= 0, j = j === void 0 ? this.length : j >>> 0, J || (J = 0), typeof J == "number") for (Ig = k; Ig < j; ++Ig) this[Ig] = J;
  44575. else {
  44576. var x = n.isBuffer(J) ? J : n.from(J, q), Ag = x.length;
  44577. if (Ag === 0) throw new TypeError('The value "' + J + '" is invalid for argument "value"');
  44578. for (Ig = 0; Ig < j - k; ++Ig) this[Ig + k] = x[Ig % Ag];
  44579. }
  44580. return this;
  44581. };
  44582. var D = /[^+/0-9A-Za-z-_]/g;
  44583. function F(J) {
  44584. return J < 16 ? "0" + J.toString(16) : J.toString(16);
  44585. }
  44586. function T(J, k) {
  44587. var j;
  44588. k = k || 1 / 0;
  44589. for (var q = J.length, Cg = null, Ig = [], x = 0; x < q; ++x) {
  44590. if ((j = J.charCodeAt(x)) > 55295 && j < 57344) {
  44591. if (!Cg) {
  44592. if (j > 56319) {
  44593. (k -= 3) > -1 && Ig.push(239, 191, 189);
  44594. continue;
  44595. }
  44596. if (x + 1 === q) {
  44597. (k -= 3) > -1 && Ig.push(239, 191, 189);
  44598. continue;
  44599. }
  44600. Cg = j;
  44601. continue;
  44602. }
  44603. if (j < 56320) {
  44604. (k -= 3) > -1 && Ig.push(239, 191, 189), Cg = j;
  44605. continue;
  44606. }
  44607. j = 65536 + (Cg - 55296 << 10 | j - 56320);
  44608. } else Cg && (k -= 3) > -1 && Ig.push(239, 191, 189);
  44609. if (Cg = null, j < 128) {
  44610. if ((k -= 1) < 0) break;
  44611. Ig.push(j);
  44612. } else if (j < 2048) {
  44613. if ((k -= 2) < 0) break;
  44614. Ig.push(j >> 6 | 192, 63 & j | 128);
  44615. } else if (j < 65536) {
  44616. if ((k -= 3) < 0) break;
  44617. Ig.push(j >> 12 | 224, j >> 6 & 63 | 128, 63 & j | 128);
  44618. } else {
  44619. if (!(j < 1114112)) throw new Error("Invalid code point");
  44620. if ((k -= 4) < 0) break;
  44621. Ig.push(j >> 18 | 240, j >> 12 & 63 | 128, j >> 6 & 63 | 128, 63 & j | 128);
  44622. }
  44623. }
  44624. return Ig;
  44625. }
  44626. function Q(J) {
  44627. return A.toByteArray(function(k) {
  44628. if ((k = (k = k.split("=")[0]).trim().replace(D, "")).length < 2) return "";
  44629. for (; k.length % 4 != 0; ) k += "=";
  44630. return k;
  44631. }(J));
  44632. }
  44633. function P(J, k, j, q) {
  44634. for (var Cg = 0; Cg < q && !(Cg + j >= k.length || Cg >= J.length); ++Cg) k[Cg + j] = J[Cg];
  44635. return Cg;
  44636. }
  44637. function L(J, k) {
  44638. return J instanceof k || J != null && J.constructor != null && J.constructor.name != null && J.constructor.name === k.name;
  44639. }
  44640. function E(J) {
  44641. return J != J;
  44642. }
  44643. }).call(this);
  44644. }).call(this, g("buffer").Buffer);
  44645. }, { "base64-js": 185, buffer: 220, ieee754: 439 }], 221: [function(g, C, i) {
  44646. var e = g("safe-buffer").Buffer, A = g("stream").Transform, s = g("string_decoder").StringDecoder;
  44647. function l(n) {
  44648. A.call(this), this.hashMode = typeof n == "string", this.hashMode ? this[n] = this._finalOrDigest : this.final = this._finalOrDigest, this._final && (this.__final = this._final, this._final = null), this._decoder = null, this._encoding = null;
  44649. }
  44650. g("inherits")(l, A), l.prototype.update = function(n, a, d) {
  44651. typeof n == "string" && (n = e.from(n, a));
  44652. var o = this._update(n);
  44653. return this.hashMode ? this : (d && (o = this._toString(o, d)), o);
  44654. }, l.prototype.setAutoPadding = function() {
  44655. }, l.prototype.getAuthTag = function() {
  44656. throw new Error("trying to get auth tag in unsupported state");
  44657. }, l.prototype.setAuthTag = function() {
  44658. throw new Error("trying to set auth tag in unsupported state");
  44659. }, l.prototype.setAAD = function() {
  44660. throw new Error("trying to set aad in unsupported state");
  44661. }, l.prototype._transform = function(n, a, d) {
  44662. var o;
  44663. try {
  44664. this.hashMode ? this._update(n) : this.push(this._update(n));
  44665. } catch (c) {
  44666. o = c;
  44667. } finally {
  44668. d(o);
  44669. }
  44670. }, l.prototype._flush = function(n) {
  44671. var a;
  44672. try {
  44673. this.push(this.__final());
  44674. } catch (d) {
  44675. a = d;
  44676. }
  44677. n(a);
  44678. }, l.prototype._finalOrDigest = function(n) {
  44679. var a = this.__final() || e.alloc(0);
  44680. return n && (a = this._toString(a, n, !0)), a;
  44681. }, l.prototype._toString = function(n, a, d) {
  44682. if (this._decoder || (this._decoder = new s(a), this._encoding = a), this._encoding !== a) throw new Error("can't switch encodings");
  44683. var o = this._decoder.write(n);
  44684. return d && (o += this._decoder.end()), o;
  44685. }, C.exports = l;
  44686. }, { inherits: 440, "safe-buffer": 494, stream: 505, string_decoder: 218 }], 222: [function(g, C, i) {
  44687. var e = g("../internals/is-callable"), A = g("../internals/try-to-string"), s = TypeError;
  44688. C.exports = function(l) {
  44689. if (e(l)) return l;
  44690. throw new s(A(l) + " is not a function");
  44691. };
  44692. }, { "../internals/is-callable": 285, "../internals/try-to-string": 349 }], 223: [function(g, C, i) {
  44693. var e = g("../internals/is-constructor"), A = g("../internals/try-to-string"), s = TypeError;
  44694. C.exports = function(l) {
  44695. if (e(l)) return l;
  44696. throw new s(A(l) + " is not a constructor");
  44697. };
  44698. }, { "../internals/is-constructor": 286, "../internals/try-to-string": 349 }], 224: [function(g, C, i) {
  44699. var e = g("../internals/is-callable"), A = String, s = TypeError;
  44700. C.exports = function(l) {
  44701. if (typeof l == "object" || e(l)) return l;
  44702. throw new s("Can't set " + A(l) + " as a prototype");
  44703. };
  44704. }, { "../internals/is-callable": 285 }], 225: [function(g, C, i) {
  44705. var e = g("../internals/well-known-symbol"), A = g("../internals/object-create"), s = g("../internals/object-define-property").f, l = e("unscopables"), n = Array.prototype;
  44706. n[l] === void 0 && s(n, l, { configurable: !0, value: A(null) }), C.exports = function(a) {
  44707. n[l][a] = !0;
  44708. };
  44709. }, { "../internals/object-create": 306, "../internals/object-define-property": 308, "../internals/well-known-symbol": 357 }], 226: [function(g, C, i) {
  44710. var e = g("../internals/object-is-prototype-of"), A = TypeError;
  44711. C.exports = function(s, l) {
  44712. if (e(l, s)) return s;
  44713. throw new A("Incorrect invocation");
  44714. };
  44715. }, { "../internals/object-is-prototype-of": 314 }], 227: [function(g, C, i) {
  44716. var e = g("../internals/is-object"), A = String, s = TypeError;
  44717. C.exports = function(l) {
  44718. if (e(l)) return l;
  44719. throw new s(A(l) + " is not an object");
  44720. };
  44721. }, { "../internals/is-object": 289 }], 228: [function(g, C, i) {
  44722. var e = g("../internals/to-indexed-object"), A = g("../internals/to-absolute-index"), s = g("../internals/length-of-array-like"), l = function(n) {
  44723. return function(a, d, o) {
  44724. var c, r = e(a), h = s(r), b = A(o, h);
  44725. if (n && d != d) {
  44726. for (; h > b; ) if ((c = r[b++]) != c) return !0;
  44727. } else for (; h > b; b++) if ((n || b in r) && r[b] === d) return n || b || 0;
  44728. return !n && -1;
  44729. };
  44730. };
  44731. C.exports = { includes: l(!0), indexOf: l(!1) };
  44732. }, { "../internals/length-of-array-like": 299, "../internals/to-absolute-index": 340, "../internals/to-indexed-object": 341 }], 229: [function(g, C, i) {
  44733. var e = g("../internals/function-bind-context"), A = g("../internals/function-uncurry-this"), s = g("../internals/indexed-object"), l = g("../internals/to-object"), n = g("../internals/length-of-array-like"), a = g("../internals/array-species-create"), d = A([].push), o = function(c) {
  44734. var r = c === 1, h = c === 2, b = c === 3, u = c === 4, m = c === 6, Z = c === 7, p = c === 5 || m;
  44735. return function(Y, R, X, H) {
  44736. for (var S, z, v = l(Y), K = s(v), V = e(R, X), N = n(K), B = 0, G = H || a, w = r ? G(Y, N) : h || Z ? G(Y, 0) : void 0; N > B; B++) if ((p || B in K) && (z = V(S = K[B], B, v), c)) if (r) w[B] = z;
  44737. else if (z) switch (c) {
  44738. case 3:
  44739. return !0;
  44740. case 5:
  44741. return S;
  44742. case 6:
  44743. return B;
  44744. case 2:
  44745. d(w, S);
  44746. }
  44747. else switch (c) {
  44748. case 4:
  44749. return !1;
  44750. case 7:
  44751. d(w, S);
  44752. }
  44753. return m ? -1 : b || u ? u : w;
  44754. };
  44755. };
  44756. C.exports = { forEach: o(0), map: o(1), filter: o(2), some: o(3), every: o(4), find: o(5), findIndex: o(6), filterReject: o(7) };
  44757. }, { "../internals/array-species-create": 233, "../internals/function-bind-context": 262, "../internals/function-uncurry-this": 268, "../internals/indexed-object": 280, "../internals/length-of-array-like": 299, "../internals/to-object": 344 }], 230: [function(g, C, i) {
  44758. var e = g("../internals/to-absolute-index"), A = g("../internals/length-of-array-like"), s = g("../internals/create-property"), l = Array, n = Math.max;
  44759. C.exports = function(a, d, o) {
  44760. for (var c = A(a), r = e(d, c), h = e(o === void 0 ? c : o, c), b = l(n(h - r, 0)), u = 0; r < h; r++, u++) s(b, u, a[r]);
  44761. return b.length = u, b;
  44762. };
  44763. }, { "../internals/create-property": 243, "../internals/length-of-array-like": 299, "../internals/to-absolute-index": 340 }], 231: [function(g, C, i) {
  44764. var e = g("../internals/function-uncurry-this");
  44765. C.exports = e([].slice);
  44766. }, { "../internals/function-uncurry-this": 268 }], 232: [function(g, C, i) {
  44767. var e = g("../internals/is-array"), A = g("../internals/is-constructor"), s = g("../internals/is-object"), l = g("../internals/well-known-symbol")("species"), n = Array;
  44768. C.exports = function(a) {
  44769. var d;
  44770. return e(a) && (d = a.constructor, (A(d) && (d === n || e(d.prototype)) || s(d) && (d = d[l]) === null) && (d = void 0)), d === void 0 ? n : d;
  44771. };
  44772. }, { "../internals/is-array": 284, "../internals/is-constructor": 286, "../internals/is-object": 289, "../internals/well-known-symbol": 357 }], 233: [function(g, C, i) {
  44773. var e = g("../internals/array-species-constructor");
  44774. C.exports = function(A, s) {
  44775. return new (e(A))(s === 0 ? 0 : s);
  44776. };
  44777. }, { "../internals/array-species-constructor": 232 }], 234: [function(g, C, i) {
  44778. var e = g("../internals/well-known-symbol")("iterator"), A = !1;
  44779. try {
  44780. var s = 0, l = { next: function() {
  44781. return { done: !!s++ };
  44782. }, return: function() {
  44783. A = !0;
  44784. } };
  44785. l[e] = function() {
  44786. return this;
  44787. }, Array.from(l, function() {
  44788. throw 2;
  44789. });
  44790. } catch {
  44791. }
  44792. C.exports = function(n, a) {
  44793. try {
  44794. if (!a && !A) return !1;
  44795. } catch {
  44796. return !1;
  44797. }
  44798. var d = !1;
  44799. try {
  44800. var o = {};
  44801. o[e] = function() {
  44802. return { next: function() {
  44803. return { done: d = !0 };
  44804. } };
  44805. }, n(o);
  44806. } catch {
  44807. }
  44808. return d;
  44809. };
  44810. }, { "../internals/well-known-symbol": 357 }], 235: [function(g, C, i) {
  44811. var e = g("../internals/function-uncurry-this"), A = e({}.toString), s = e("".slice);
  44812. C.exports = function(l) {
  44813. return s(A(l), 8, -1);
  44814. };
  44815. }, { "../internals/function-uncurry-this": 268 }], 236: [function(g, C, i) {
  44816. var e = g("../internals/to-string-tag-support"), A = g("../internals/is-callable"), s = g("../internals/classof-raw"), l = g("../internals/well-known-symbol")("toStringTag"), n = Object, a = s(/* @__PURE__ */ function() {
  44817. return arguments;
  44818. }()) === "Arguments";
  44819. C.exports = e ? s : function(d) {
  44820. var o, c, r;
  44821. return d === void 0 ? "Undefined" : d === null ? "Null" : typeof (c = function(h, b) {
  44822. try {
  44823. return h[b];
  44824. } catch {
  44825. }
  44826. }(o = n(d), l)) == "string" ? c : a ? s(o) : (r = s(o)) === "Object" && A(o.callee) ? "Arguments" : r;
  44827. };
  44828. }, { "../internals/classof-raw": 235, "../internals/is-callable": 285, "../internals/to-string-tag-support": 347, "../internals/well-known-symbol": 357 }], 237: [function(g, C, i) {
  44829. var e = g("../internals/has-own-property"), A = g("../internals/own-keys"), s = g("../internals/object-get-own-property-descriptor"), l = g("../internals/object-define-property");
  44830. C.exports = function(n, a, d) {
  44831. for (var o = A(a), c = l.f, r = s.f, h = 0; h < o.length; h++) {
  44832. var b = o[h];
  44833. e(n, b) || d && e(d, b) || c(n, b, r(a, b));
  44834. }
  44835. };
  44836. }, { "../internals/has-own-property": 275, "../internals/object-define-property": 308, "../internals/object-get-own-property-descriptor": 309, "../internals/own-keys": 321 }], 238: [function(g, C, i) {
  44837. var e = g("../internals/well-known-symbol")("match");
  44838. C.exports = function(A) {
  44839. var s = /./;
  44840. try {
  44841. "/./"[A](s);
  44842. } catch {
  44843. try {
  44844. return s[e] = !1, "/./"[A](s);
  44845. } catch {
  44846. }
  44847. }
  44848. return !1;
  44849. };
  44850. }, { "../internals/well-known-symbol": 357 }], 239: [function(g, C, i) {
  44851. var e = g("../internals/fails");
  44852. C.exports = !e(function() {
  44853. function A() {
  44854. }
  44855. return A.prototype.constructor = null, Object.getPrototypeOf(new A()) !== A.prototype;
  44856. });
  44857. }, { "../internals/fails": 260 }], 240: [function(g, C, i) {
  44858. C.exports = function(e, A) {
  44859. return { value: e, done: A };
  44860. };
  44861. }, {}], 241: [function(g, C, i) {
  44862. var e = g("../internals/descriptors"), A = g("../internals/object-define-property"), s = g("../internals/create-property-descriptor");
  44863. C.exports = e ? function(l, n, a) {
  44864. return A.f(l, n, s(1, a));
  44865. } : function(l, n, a) {
  44866. return l[n] = a, l;
  44867. };
  44868. }, { "../internals/create-property-descriptor": 242, "../internals/descriptors": 247, "../internals/object-define-property": 308 }], 242: [function(g, C, i) {
  44869. C.exports = function(e, A) {
  44870. return { enumerable: !(1 & e), configurable: !(2 & e), writable: !(4 & e), value: A };
  44871. };
  44872. }, {}], 243: [function(g, C, i) {
  44873. var e = g("../internals/to-property-key"), A = g("../internals/object-define-property"), s = g("../internals/create-property-descriptor");
  44874. C.exports = function(l, n, a) {
  44875. var d = e(n);
  44876. d in l ? A.f(l, d, s(0, a)) : l[d] = a;
  44877. };
  44878. }, { "../internals/create-property-descriptor": 242, "../internals/object-define-property": 308, "../internals/to-property-key": 346 }], 244: [function(g, C, i) {
  44879. var e = g("../internals/make-built-in"), A = g("../internals/object-define-property");
  44880. C.exports = function(s, l, n) {
  44881. return n.get && e(n.get, l, { getter: !0 }), n.set && e(n.set, l, { setter: !0 }), A.f(s, l, n);
  44882. };
  44883. }, { "../internals/make-built-in": 300, "../internals/object-define-property": 308 }], 245: [function(g, C, i) {
  44884. var e = g("../internals/is-callable"), A = g("../internals/object-define-property"), s = g("../internals/make-built-in"), l = g("../internals/define-global-property");
  44885. C.exports = function(n, a, d, o) {
  44886. o || (o = {});
  44887. var c = o.enumerable, r = o.name !== void 0 ? o.name : a;
  44888. if (e(d) && s(d, r, o), o.global) c ? n[a] = d : l(a, d);
  44889. else {
  44890. try {
  44891. o.unsafe ? n[a] && (c = !0) : delete n[a];
  44892. } catch {
  44893. }
  44894. c ? n[a] = d : A.f(n, a, { value: d, enumerable: !1, configurable: !o.nonConfigurable, writable: !o.nonWritable });
  44895. }
  44896. return n;
  44897. };
  44898. }, { "../internals/define-global-property": 246, "../internals/is-callable": 285, "../internals/make-built-in": 300, "../internals/object-define-property": 308 }], 246: [function(g, C, i) {
  44899. var e = g("../internals/global"), A = Object.defineProperty;
  44900. C.exports = function(s, l) {
  44901. try {
  44902. A(e, s, { value: l, configurable: !0, writable: !0 });
  44903. } catch {
  44904. e[s] = l;
  44905. }
  44906. return l;
  44907. };
  44908. }, { "../internals/global": 274 }], 247: [function(g, C, i) {
  44909. var e = g("../internals/fails");
  44910. C.exports = !e(function() {
  44911. return Object.defineProperty({}, 1, { get: function() {
  44912. return 7;
  44913. } })[1] !== 7;
  44914. });
  44915. }, { "../internals/fails": 260 }], 248: [function(g, C, i) {
  44916. var e = typeof document == "object" && document.all, A = e === void 0 && e !== void 0;
  44917. C.exports = { all: e, IS_HTMLDDA: A };
  44918. }, {}], 249: [function(g, C, i) {
  44919. var e = g("../internals/global"), A = g("../internals/is-object"), s = e.document, l = A(s) && A(s.createElement);
  44920. C.exports = function(n) {
  44921. return l ? s.createElement(n) : {};
  44922. };
  44923. }, { "../internals/global": 274, "../internals/is-object": 289 }], 250: [function(g, C, i) {
  44924. var e = g("../internals/engine-is-deno"), A = g("../internals/engine-is-node");
  44925. C.exports = !e && !A && typeof window == "object" && typeof document == "object";
  44926. }, { "../internals/engine-is-deno": 251, "../internals/engine-is-node": 254 }], 251: [function(g, C, i) {
  44927. C.exports = typeof Deno == "object" && Deno && typeof Deno.version == "object";
  44928. }, {}], 252: [function(g, C, i) {
  44929. var e = g("../internals/engine-user-agent");
  44930. C.exports = /ipad|iphone|ipod/i.test(e) && typeof Pebble < "u";
  44931. }, { "../internals/engine-user-agent": 256 }], 253: [function(g, C, i) {
  44932. var e = g("../internals/engine-user-agent");
  44933. C.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(e);
  44934. }, { "../internals/engine-user-agent": 256 }], 254: [function(g, C, i) {
  44935. var e = g("../internals/global"), A = g("../internals/classof-raw");
  44936. C.exports = A(e.process) === "process";
  44937. }, { "../internals/classof-raw": 235, "../internals/global": 274 }], 255: [function(g, C, i) {
  44938. var e = g("../internals/engine-user-agent");
  44939. C.exports = /web0s(?!.*chrome)/i.test(e);
  44940. }, { "../internals/engine-user-agent": 256 }], 256: [function(g, C, i) {
  44941. C.exports = typeof navigator < "u" && String(navigator.userAgent) || "";
  44942. }, {}], 257: [function(g, C, i) {
  44943. var e, A, s = g("../internals/global"), l = g("../internals/engine-user-agent"), n = s.process, a = s.Deno, d = n && n.versions || a && a.version, o = d && d.v8;
  44944. o && (A = (e = o.split("."))[0] > 0 && e[0] < 4 ? 1 : +(e[0] + e[1])), !A && l && (!(e = l.match(/Edge\/(\d+)/)) || e[1] >= 74) && (e = l.match(/Chrome\/(\d+)/)) && (A = +e[1]), C.exports = A;
  44945. }, { "../internals/engine-user-agent": 256, "../internals/global": 274 }], 258: [function(g, C, i) {
  44946. C.exports = ["constructor", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "toLocaleString", "toString", "valueOf"];
  44947. }, {}], 259: [function(g, C, i) {
  44948. var e = g("../internals/global"), A = g("../internals/object-get-own-property-descriptor").f, s = g("../internals/create-non-enumerable-property"), l = g("../internals/define-built-in"), n = g("../internals/define-global-property"), a = g("../internals/copy-constructor-properties"), d = g("../internals/is-forced");
  44949. C.exports = function(o, c) {
  44950. var r, h, b, u, m, Z = o.target, p = o.global, Y = o.stat;
  44951. if (r = p ? e : Y ? e[Z] || n(Z, {}) : (e[Z] || {}).prototype) for (h in c) {
  44952. if (u = c[h], b = o.dontCallGetSet ? (m = A(r, h)) && m.value : r[h], !d(p ? h : Z + (Y ? "." : "#") + h, o.forced) && b !== void 0) {
  44953. if (typeof u == typeof b) continue;
  44954. a(u, b);
  44955. }
  44956. (o.sham || b && b.sham) && s(u, "sham", !0), l(r, h, u, o);
  44957. }
  44958. };
  44959. }, { "../internals/copy-constructor-properties": 237, "../internals/create-non-enumerable-property": 241, "../internals/define-built-in": 245, "../internals/define-global-property": 246, "../internals/global": 274, "../internals/is-forced": 287, "../internals/object-get-own-property-descriptor": 309 }], 260: [function(g, C, i) {
  44960. C.exports = function(e) {
  44961. try {
  44962. return !!e();
  44963. } catch {
  44964. return !0;
  44965. }
  44966. };
  44967. }, {}], 261: [function(g, C, i) {
  44968. var e = g("../internals/function-bind-native"), A = Function.prototype, s = A.apply, l = A.call;
  44969. C.exports = typeof Reflect == "object" && Reflect.apply || (e ? l.bind(s) : function() {
  44970. return l.apply(s, arguments);
  44971. });
  44972. }, { "../internals/function-bind-native": 263 }], 262: [function(g, C, i) {
  44973. var e = g("../internals/function-uncurry-this-clause"), A = g("../internals/a-callable"), s = g("../internals/function-bind-native"), l = e(e.bind);
  44974. C.exports = function(n, a) {
  44975. return A(n), a === void 0 ? n : s ? l(n, a) : function() {
  44976. return n.apply(a, arguments);
  44977. };
  44978. };
  44979. }, { "../internals/a-callable": 222, "../internals/function-bind-native": 263, "../internals/function-uncurry-this-clause": 267 }], 263: [function(g, C, i) {
  44980. var e = g("../internals/fails");
  44981. C.exports = !e(function() {
  44982. var A = (function() {
  44983. }).bind();
  44984. return typeof A != "function" || A.hasOwnProperty("prototype");
  44985. });
  44986. }, { "../internals/fails": 260 }], 264: [function(g, C, i) {
  44987. var e = g("../internals/function-bind-native"), A = Function.prototype.call;
  44988. C.exports = e ? A.bind(A) : function() {
  44989. return A.apply(A, arguments);
  44990. };
  44991. }, { "../internals/function-bind-native": 263 }], 265: [function(g, C, i) {
  44992. var e = g("../internals/descriptors"), A = g("../internals/has-own-property"), s = Function.prototype, l = e && Object.getOwnPropertyDescriptor, n = A(s, "name"), a = n && (function() {
  44993. }).name === "something", d = n && (!e || e && l(s, "name").configurable);
  44994. C.exports = { EXISTS: n, PROPER: a, CONFIGURABLE: d };
  44995. }, { "../internals/descriptors": 247, "../internals/has-own-property": 275 }], 266: [function(g, C, i) {
  44996. var e = g("../internals/function-uncurry-this"), A = g("../internals/a-callable");
  44997. C.exports = function(s, l, n) {
  44998. try {
  44999. return e(A(Object.getOwnPropertyDescriptor(s, l)[n]));
  45000. } catch {
  45001. }
  45002. };
  45003. }, { "../internals/a-callable": 222, "../internals/function-uncurry-this": 268 }], 267: [function(g, C, i) {
  45004. var e = g("../internals/classof-raw"), A = g("../internals/function-uncurry-this");
  45005. C.exports = function(s) {
  45006. if (e(s) === "Function") return A(s);
  45007. };
  45008. }, { "../internals/classof-raw": 235, "../internals/function-uncurry-this": 268 }], 268: [function(g, C, i) {
  45009. var e = g("../internals/function-bind-native"), A = Function.prototype, s = A.call, l = e && A.bind.bind(s, s);
  45010. C.exports = e ? l : function(n) {
  45011. return function() {
  45012. return s.apply(n, arguments);
  45013. };
  45014. };
  45015. }, { "../internals/function-bind-native": 263 }], 269: [function(g, C, i) {
  45016. var e = g("../internals/global"), A = g("../internals/is-callable"), s = function(l) {
  45017. return A(l) ? l : void 0;
  45018. };
  45019. C.exports = function(l, n) {
  45020. return arguments.length < 2 ? s(e[l]) : e[l] && e[l][n];
  45021. };
  45022. }, { "../internals/global": 274, "../internals/is-callable": 285 }], 270: [function(g, C, i) {
  45023. var e = g("../internals/classof"), A = g("../internals/get-method"), s = g("../internals/is-null-or-undefined"), l = g("../internals/iterators"), n = g("../internals/well-known-symbol")("iterator");
  45024. C.exports = function(a) {
  45025. if (!s(a)) return A(a, n) || A(a, "@@iterator") || l[e(a)];
  45026. };
  45027. }, { "../internals/classof": 236, "../internals/get-method": 273, "../internals/is-null-or-undefined": 288, "../internals/iterators": 298, "../internals/well-known-symbol": 357 }], 271: [function(g, C, i) {
  45028. var e = g("../internals/function-call"), A = g("../internals/a-callable"), s = g("../internals/an-object"), l = g("../internals/try-to-string"), n = g("../internals/get-iterator-method"), a = TypeError;
  45029. C.exports = function(d, o) {
  45030. var c = arguments.length < 2 ? n(d) : o;
  45031. if (A(c)) return s(e(c, d));
  45032. throw new a(l(d) + " is not iterable");
  45033. };
  45034. }, { "../internals/a-callable": 222, "../internals/an-object": 227, "../internals/function-call": 264, "../internals/get-iterator-method": 270, "../internals/try-to-string": 349 }], 272: [function(g, C, i) {
  45035. var e = g("../internals/function-uncurry-this"), A = g("../internals/is-array"), s = g("../internals/is-callable"), l = g("../internals/classof-raw"), n = g("../internals/to-string"), a = e([].push);
  45036. C.exports = function(d) {
  45037. if (s(d)) return d;
  45038. if (A(d)) {
  45039. for (var o = d.length, c = [], r = 0; r < o; r++) {
  45040. var h = d[r];
  45041. typeof h == "string" ? a(c, h) : typeof h != "number" && l(h) !== "Number" && l(h) !== "String" || a(c, n(h));
  45042. }
  45043. var b = c.length, u = !0;
  45044. return function(m, Z) {
  45045. if (u) return u = !1, Z;
  45046. if (A(this)) return Z;
  45047. for (var p = 0; p < b; p++) if (c[p] === m) return Z;
  45048. };
  45049. }
  45050. };
  45051. }, { "../internals/classof-raw": 235, "../internals/function-uncurry-this": 268, "../internals/is-array": 284, "../internals/is-callable": 285, "../internals/to-string": 348 }], 273: [function(g, C, i) {
  45052. var e = g("../internals/a-callable"), A = g("../internals/is-null-or-undefined");
  45053. C.exports = function(s, l) {
  45054. var n = s[l];
  45055. return A(n) ? void 0 : e(n);
  45056. };
  45057. }, { "../internals/a-callable": 222, "../internals/is-null-or-undefined": 288 }], 274: [function(g, C, i) {
  45058. (function(e) {
  45059. (function() {
  45060. var A = function(s) {
  45061. return s && s.Math === Math && s;
  45062. };
  45063. C.exports = A(typeof globalThis == "object" && globalThis) || A(typeof window == "object" && window) || A(typeof self == "object" && self) || A(typeof e == "object" && e) || /* @__PURE__ */ function() {
  45064. return this;
  45065. }() || this || Function("return this")();
  45066. }).call(this);
  45067. }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  45068. }, {}], 275: [function(g, C, i) {
  45069. var e = g("../internals/function-uncurry-this"), A = g("../internals/to-object"), s = e({}.hasOwnProperty);
  45070. C.exports = Object.hasOwn || function(l, n) {
  45071. return s(A(l), n);
  45072. };
  45073. }, { "../internals/function-uncurry-this": 268, "../internals/to-object": 344 }], 276: [function(g, C, i) {
  45074. C.exports = {};
  45075. }, {}], 277: [function(g, C, i) {
  45076. C.exports = function(e, A) {
  45077. try {
  45078. arguments.length === 1 ? console.error(e) : console.error(e, A);
  45079. } catch {
  45080. }
  45081. };
  45082. }, {}], 278: [function(g, C, i) {
  45083. var e = g("../internals/get-built-in");
  45084. C.exports = e("document", "documentElement");
  45085. }, { "../internals/get-built-in": 269 }], 279: [function(g, C, i) {
  45086. var e = g("../internals/descriptors"), A = g("../internals/fails"), s = g("../internals/document-create-element");
  45087. C.exports = !e && !A(function() {
  45088. return Object.defineProperty(s("div"), "a", { get: function() {
  45089. return 7;
  45090. } }).a !== 7;
  45091. });
  45092. }, { "../internals/descriptors": 247, "../internals/document-create-element": 249, "../internals/fails": 260 }], 280: [function(g, C, i) {
  45093. var e = g("../internals/function-uncurry-this"), A = g("../internals/fails"), s = g("../internals/classof-raw"), l = Object, n = e("".split);
  45094. C.exports = A(function() {
  45095. return !l("z").propertyIsEnumerable(0);
  45096. }) ? function(a) {
  45097. return s(a) === "String" ? n(a, "") : l(a);
  45098. } : l;
  45099. }, { "../internals/classof-raw": 235, "../internals/fails": 260, "../internals/function-uncurry-this": 268 }], 281: [function(g, C, i) {
  45100. var e = g("../internals/function-uncurry-this"), A = g("../internals/is-callable"), s = g("../internals/shared-store"), l = e(Function.toString);
  45101. A(s.inspectSource) || (s.inspectSource = function(n) {
  45102. return l(n);
  45103. }), C.exports = s.inspectSource;
  45104. }, { "../internals/function-uncurry-this": 268, "../internals/is-callable": 285, "../internals/shared-store": 333 }], 282: [function(g, C, i) {
  45105. var e, A, s, l = g("../internals/weak-map-basic-detection"), n = g("../internals/global"), a = g("../internals/is-object"), d = g("../internals/create-non-enumerable-property"), o = g("../internals/has-own-property"), c = g("../internals/shared-store"), r = g("../internals/shared-key"), h = g("../internals/hidden-keys"), b = n.TypeError, u = n.WeakMap;
  45106. if (l || c.state) {
  45107. var m = c.state || (c.state = new u());
  45108. m.get = m.get, m.has = m.has, m.set = m.set, e = function(p, Y) {
  45109. if (m.has(p)) throw new b("Object already initialized");
  45110. return Y.facade = p, m.set(p, Y), Y;
  45111. }, A = function(p) {
  45112. return m.get(p) || {};
  45113. }, s = function(p) {
  45114. return m.has(p);
  45115. };
  45116. } else {
  45117. var Z = r("state");
  45118. h[Z] = !0, e = function(p, Y) {
  45119. if (o(p, Z)) throw new b("Object already initialized");
  45120. return Y.facade = p, d(p, Z, Y), Y;
  45121. }, A = function(p) {
  45122. return o(p, Z) ? p[Z] : {};
  45123. }, s = function(p) {
  45124. return o(p, Z);
  45125. };
  45126. }
  45127. C.exports = { set: e, get: A, has: s, enforce: function(p) {
  45128. return s(p) ? A(p) : e(p, {});
  45129. }, getterFor: function(p) {
  45130. return function(Y) {
  45131. var R;
  45132. if (!a(Y) || (R = A(Y)).type !== p) throw new b("Incompatible receiver, " + p + " required");
  45133. return R;
  45134. };
  45135. } };
  45136. }, { "../internals/create-non-enumerable-property": 241, "../internals/global": 274, "../internals/has-own-property": 275, "../internals/hidden-keys": 276, "../internals/is-object": 289, "../internals/shared-key": 332, "../internals/shared-store": 333, "../internals/weak-map-basic-detection": 354 }], 283: [function(g, C, i) {
  45137. var e = g("../internals/well-known-symbol"), A = g("../internals/iterators"), s = e("iterator"), l = Array.prototype;
  45138. C.exports = function(n) {
  45139. return n !== void 0 && (A.Array === n || l[s] === n);
  45140. };
  45141. }, { "../internals/iterators": 298, "../internals/well-known-symbol": 357 }], 284: [function(g, C, i) {
  45142. var e = g("../internals/classof-raw");
  45143. C.exports = Array.isArray || function(A) {
  45144. return e(A) === "Array";
  45145. };
  45146. }, { "../internals/classof-raw": 235 }], 285: [function(g, C, i) {
  45147. var e = g("../internals/document-all"), A = e.all;
  45148. C.exports = e.IS_HTMLDDA ? function(s) {
  45149. return typeof s == "function" || s === A;
  45150. } : function(s) {
  45151. return typeof s == "function";
  45152. };
  45153. }, { "../internals/document-all": 248 }], 286: [function(g, C, i) {
  45154. var e = g("../internals/function-uncurry-this"), A = g("../internals/fails"), s = g("../internals/is-callable"), l = g("../internals/classof"), n = g("../internals/get-built-in"), a = g("../internals/inspect-source"), d = function() {
  45155. }, o = [], c = n("Reflect", "construct"), r = /^\s*(?:class|function)\b/, h = e(r.exec), b = !r.test(d), u = function(Z) {
  45156. if (!s(Z)) return !1;
  45157. try {
  45158. return c(d, o, Z), !0;
  45159. } catch {
  45160. return !1;
  45161. }
  45162. }, m = function(Z) {
  45163. if (!s(Z)) return !1;
  45164. switch (l(Z)) {
  45165. case "AsyncFunction":
  45166. case "GeneratorFunction":
  45167. case "AsyncGeneratorFunction":
  45168. return !1;
  45169. }
  45170. try {
  45171. return b || !!h(r, a(Z));
  45172. } catch {
  45173. return !0;
  45174. }
  45175. };
  45176. m.sham = !0, C.exports = !c || A(function() {
  45177. var Z;
  45178. return u(u.call) || !u(Object) || !u(function() {
  45179. Z = !0;
  45180. }) || Z;
  45181. }) ? m : u;
  45182. }, { "../internals/classof": 236, "../internals/fails": 260, "../internals/function-uncurry-this": 268, "../internals/get-built-in": 269, "../internals/inspect-source": 281, "../internals/is-callable": 285 }], 287: [function(g, C, i) {
  45183. var e = g("../internals/fails"), A = g("../internals/is-callable"), s = /#|\.prototype\./, l = function(c, r) {
  45184. var h = a[n(c)];
  45185. return h === o || h !== d && (A(r) ? e(r) : !!r);
  45186. }, n = l.normalize = function(c) {
  45187. return String(c).replace(s, ".").toLowerCase();
  45188. }, a = l.data = {}, d = l.NATIVE = "N", o = l.POLYFILL = "P";
  45189. C.exports = l;
  45190. }, { "../internals/fails": 260, "../internals/is-callable": 285 }], 288: [function(g, C, i) {
  45191. C.exports = function(e) {
  45192. return e == null;
  45193. };
  45194. }, {}], 289: [function(g, C, i) {
  45195. var e = g("../internals/is-callable"), A = g("../internals/document-all"), s = A.all;
  45196. C.exports = A.IS_HTMLDDA ? function(l) {
  45197. return typeof l == "object" ? l !== null : e(l) || l === s;
  45198. } : function(l) {
  45199. return typeof l == "object" ? l !== null : e(l);
  45200. };
  45201. }, { "../internals/document-all": 248, "../internals/is-callable": 285 }], 290: [function(g, C, i) {
  45202. C.exports = !1;
  45203. }, {}], 291: [function(g, C, i) {
  45204. var e = g("../internals/is-object"), A = g("../internals/classof-raw"), s = g("../internals/well-known-symbol")("match");
  45205. C.exports = function(l) {
  45206. var n;
  45207. return e(l) && ((n = l[s]) !== void 0 ? !!n : A(l) === "RegExp");
  45208. };
  45209. }, { "../internals/classof-raw": 235, "../internals/is-object": 289, "../internals/well-known-symbol": 357 }], 292: [function(g, C, i) {
  45210. var e = g("../internals/get-built-in"), A = g("../internals/is-callable"), s = g("../internals/object-is-prototype-of"), l = g("../internals/use-symbol-as-uid"), n = Object;
  45211. C.exports = l ? function(a) {
  45212. return typeof a == "symbol";
  45213. } : function(a) {
  45214. var d = e("Symbol");
  45215. return A(d) && s(d.prototype, n(a));
  45216. };
  45217. }, { "../internals/get-built-in": 269, "../internals/is-callable": 285, "../internals/object-is-prototype-of": 314, "../internals/use-symbol-as-uid": 351 }], 293: [function(g, C, i) {
  45218. var e = g("../internals/function-bind-context"), A = g("../internals/function-call"), s = g("../internals/an-object"), l = g("../internals/try-to-string"), n = g("../internals/is-array-iterator-method"), a = g("../internals/length-of-array-like"), d = g("../internals/object-is-prototype-of"), o = g("../internals/get-iterator"), c = g("../internals/get-iterator-method"), r = g("../internals/iterator-close"), h = TypeError, b = function(m, Z) {
  45219. this.stopped = m, this.result = Z;
  45220. }, u = b.prototype;
  45221. C.exports = function(m, Z, p) {
  45222. var Y, R, X, H, S, z, v, K = p && p.that, V = !(!p || !p.AS_ENTRIES), N = !(!p || !p.IS_RECORD), B = !(!p || !p.IS_ITERATOR), G = !(!p || !p.INTERRUPTED), w = e(Z, K), W = function(f) {
  45223. return Y && r(Y, "normal", f), new b(!0, f);
  45224. }, y = function(f) {
  45225. return V ? (s(f), G ? w(f[0], f[1], W) : w(f[0], f[1])) : G ? w(f, W) : w(f);
  45226. };
  45227. if (N) Y = m.iterator;
  45228. else if (B) Y = m;
  45229. else {
  45230. if (!(R = c(m))) throw new h(l(m) + " is not iterable");
  45231. if (n(R)) {
  45232. for (X = 0, H = a(m); H > X; X++) if ((S = y(m[X])) && d(u, S)) return S;
  45233. return new b(!1);
  45234. }
  45235. Y = o(m, R);
  45236. }
  45237. for (z = N ? m.next : Y.next; !(v = A(z, Y)).done; ) {
  45238. try {
  45239. S = y(v.value);
  45240. } catch (f) {
  45241. r(Y, "throw", f);
  45242. }
  45243. if (typeof S == "object" && S && d(u, S)) return S;
  45244. }
  45245. return new b(!1);
  45246. };
  45247. }, { "../internals/an-object": 227, "../internals/function-bind-context": 262, "../internals/function-call": 264, "../internals/get-iterator": 271, "../internals/get-iterator-method": 270, "../internals/is-array-iterator-method": 283, "../internals/iterator-close": 294, "../internals/length-of-array-like": 299, "../internals/object-is-prototype-of": 314, "../internals/try-to-string": 349 }], 294: [function(g, C, i) {
  45248. var e = g("../internals/function-call"), A = g("../internals/an-object"), s = g("../internals/get-method");
  45249. C.exports = function(l, n, a) {
  45250. var d, o;
  45251. A(l);
  45252. try {
  45253. if (!(d = s(l, "return"))) {
  45254. if (n === "throw") throw a;
  45255. return a;
  45256. }
  45257. d = e(d, l);
  45258. } catch (c) {
  45259. o = !0, d = c;
  45260. }
  45261. if (n === "throw") throw a;
  45262. if (o) throw d;
  45263. return A(d), a;
  45264. };
  45265. }, { "../internals/an-object": 227, "../internals/function-call": 264, "../internals/get-method": 273 }], 295: [function(g, C, i) {
  45266. var e = g("../internals/iterators-core").IteratorPrototype, A = g("../internals/object-create"), s = g("../internals/create-property-descriptor"), l = g("../internals/set-to-string-tag"), n = g("../internals/iterators"), a = function() {
  45267. return this;
  45268. };
  45269. C.exports = function(d, o, c, r) {
  45270. var h = o + " Iterator";
  45271. return d.prototype = A(e, { next: s(+!r, c) }), l(d, h, !1, !0), n[h] = a, d;
  45272. };
  45273. }, { "../internals/create-property-descriptor": 242, "../internals/iterators": 298, "../internals/iterators-core": 297, "../internals/object-create": 306, "../internals/set-to-string-tag": 331 }], 296: [function(g, C, i) {
  45274. var e = g("../internals/export"), A = g("../internals/function-call"), s = g("../internals/is-pure"), l = g("../internals/function-name"), n = g("../internals/is-callable"), a = g("../internals/iterator-create-constructor"), d = g("../internals/object-get-prototype-of"), o = g("../internals/object-set-prototype-of"), c = g("../internals/set-to-string-tag"), r = g("../internals/create-non-enumerable-property"), h = g("../internals/define-built-in"), b = g("../internals/well-known-symbol"), u = g("../internals/iterators"), m = g("../internals/iterators-core"), Z = l.PROPER, p = l.CONFIGURABLE, Y = m.IteratorPrototype, R = m.BUGGY_SAFARI_ITERATORS, X = b("iterator"), H = function() {
  45275. return this;
  45276. };
  45277. C.exports = function(S, z, v, K, V, N, B) {
  45278. a(v, z, K);
  45279. var G, w, W, y = function(L) {
  45280. if (L === V && Q) return Q;
  45281. if (!R && L && L in F) return F[L];
  45282. switch (L) {
  45283. case "keys":
  45284. case "values":
  45285. case "entries":
  45286. return function() {
  45287. return new v(this, L);
  45288. };
  45289. }
  45290. return function() {
  45291. return new v(this);
  45292. };
  45293. }, f = z + " Iterator", D = !1, F = S.prototype, T = F[X] || F["@@iterator"] || V && F[V], Q = !R && T || y(V), P = z === "Array" && F.entries || T;
  45294. if (P && (G = d(P.call(new S()))) !== Object.prototype && G.next && (s || d(G) === Y || (o ? o(G, Y) : n(G[X]) || h(G, X, H)), c(G, f, !0, !0), s && (u[f] = H)), Z && V === "values" && T && T.name !== "values" && (!s && p ? r(F, "name", "values") : (D = !0, Q = function() {
  45295. return A(T, this);
  45296. })), V) if (w = { values: y("values"), keys: N ? Q : y("keys"), entries: y("entries") }, B) for (W in w) (R || D || !(W in F)) && h(F, W, w[W]);
  45297. else e({ target: z, proto: !0, forced: R || D }, w);
  45298. return s && !B || F[X] === Q || h(F, X, Q, { name: V }), u[z] = Q, w;
  45299. };
  45300. }, { "../internals/create-non-enumerable-property": 241, "../internals/define-built-in": 245, "../internals/export": 259, "../internals/function-call": 264, "../internals/function-name": 265, "../internals/is-callable": 285, "../internals/is-pure": 290, "../internals/iterator-create-constructor": 295, "../internals/iterators": 298, "../internals/iterators-core": 297, "../internals/object-get-prototype-of": 313, "../internals/object-set-prototype-of": 318, "../internals/set-to-string-tag": 331, "../internals/well-known-symbol": 357 }], 297: [function(g, C, i) {
  45301. var e, A, s, l = g("../internals/fails"), n = g("../internals/is-callable"), a = g("../internals/is-object"), d = g("../internals/object-create"), o = g("../internals/object-get-prototype-of"), c = g("../internals/define-built-in"), r = g("../internals/well-known-symbol"), h = g("../internals/is-pure"), b = r("iterator"), u = !1;
  45302. [].keys && ("next" in (s = [].keys()) ? (A = o(o(s))) !== Object.prototype && (e = A) : u = !0), !a(e) || l(function() {
  45303. var m = {};
  45304. return e[b].call(m) !== m;
  45305. }) ? e = {} : h && (e = d(e)), n(e[b]) || c(e, b, function() {
  45306. return this;
  45307. }), C.exports = { IteratorPrototype: e, BUGGY_SAFARI_ITERATORS: u };
  45308. }, { "../internals/define-built-in": 245, "../internals/fails": 260, "../internals/is-callable": 285, "../internals/is-object": 289, "../internals/is-pure": 290, "../internals/object-create": 306, "../internals/object-get-prototype-of": 313, "../internals/well-known-symbol": 357 }], 298: [function(g, C, i) {
  45309. arguments[4][276][0].apply(i, arguments);
  45310. }, { dup: 276 }], 299: [function(g, C, i) {
  45311. var e = g("../internals/to-length");
  45312. C.exports = function(A) {
  45313. return e(A.length);
  45314. };
  45315. }, { "../internals/to-length": 343 }], 300: [function(g, C, i) {
  45316. var e = g("../internals/function-uncurry-this"), A = g("../internals/fails"), s = g("../internals/is-callable"), l = g("../internals/has-own-property"), n = g("../internals/descriptors"), a = g("../internals/function-name").CONFIGURABLE, d = g("../internals/inspect-source"), o = g("../internals/internal-state"), c = o.enforce, r = o.get, h = String, b = Object.defineProperty, u = e("".slice), m = e("".replace), Z = e([].join), p = n && !A(function() {
  45317. return b(function() {
  45318. }, "length", { value: 8 }).length !== 8;
  45319. }), Y = String(String).split("String"), R = C.exports = function(X, H, S) {
  45320. u(h(H), 0, 7) === "Symbol(" && (H = "[" + m(h(H), /^Symbol\(([^)]*)\)/, "$1") + "]"), S && S.getter && (H = "get " + H), S && S.setter && (H = "set " + H), (!l(X, "name") || a && X.name !== H) && (n ? b(X, "name", { value: H, configurable: !0 }) : X.name = H), p && S && l(S, "arity") && X.length !== S.arity && b(X, "length", { value: S.arity });
  45321. try {
  45322. S && l(S, "constructor") && S.constructor ? n && b(X, "prototype", { writable: !1 }) : X.prototype && (X.prototype = void 0);
  45323. } catch {
  45324. }
  45325. var z = c(X);
  45326. return l(z, "source") || (z.source = Z(Y, typeof H == "string" ? H : "")), X;
  45327. };
  45328. Function.prototype.toString = R(function() {
  45329. return s(this) && r(this).source || d(this);
  45330. }, "toString");
  45331. }, { "../internals/descriptors": 247, "../internals/fails": 260, "../internals/function-name": 265, "../internals/function-uncurry-this": 268, "../internals/has-own-property": 275, "../internals/inspect-source": 281, "../internals/internal-state": 282, "../internals/is-callable": 285 }], 301: [function(g, C, i) {
  45332. var e = Math.ceil, A = Math.floor;
  45333. C.exports = Math.trunc || function(s) {
  45334. var l = +s;
  45335. return (l > 0 ? A : e)(l);
  45336. };
  45337. }, {}], 302: [function(g, C, i) {
  45338. var e, A, s, l, n, a = g("../internals/global"), d = g("../internals/function-bind-context"), o = g("../internals/object-get-own-property-descriptor").f, c = g("../internals/task").set, r = g("../internals/queue"), h = g("../internals/engine-is-ios"), b = g("../internals/engine-is-ios-pebble"), u = g("../internals/engine-is-webos-webkit"), m = g("../internals/engine-is-node"), Z = a.MutationObserver || a.WebKitMutationObserver, p = a.document, Y = a.process, R = a.Promise, X = o(a, "queueMicrotask"), H = X && X.value;
  45339. if (!H) {
  45340. var S = new r(), z = function() {
  45341. var v, K;
  45342. for (m && (v = Y.domain) && v.exit(); K = S.get(); ) try {
  45343. K();
  45344. } catch (V) {
  45345. throw S.head && e(), V;
  45346. }
  45347. v && v.enter();
  45348. };
  45349. h || m || u || !Z || !p ? !b && R && R.resolve ? ((l = R.resolve(void 0)).constructor = R, n = d(l.then, l), e = function() {
  45350. n(z);
  45351. }) : m ? e = function() {
  45352. Y.nextTick(z);
  45353. } : (c = d(c, a), e = function() {
  45354. c(z);
  45355. }) : (A = !0, s = p.createTextNode(""), new Z(z).observe(s, { characterData: !0 }), e = function() {
  45356. s.data = A = !A;
  45357. }), H = function(v) {
  45358. S.head || e(), S.add(v);
  45359. };
  45360. }
  45361. C.exports = H;
  45362. }, { "../internals/engine-is-ios": 253, "../internals/engine-is-ios-pebble": 252, "../internals/engine-is-node": 254, "../internals/engine-is-webos-webkit": 255, "../internals/function-bind-context": 262, "../internals/global": 274, "../internals/object-get-own-property-descriptor": 309, "../internals/queue": 328, "../internals/task": 339 }], 303: [function(g, C, i) {
  45363. var e = g("../internals/a-callable"), A = TypeError, s = function(l) {
  45364. var n, a;
  45365. this.promise = new l(function(d, o) {
  45366. if (n !== void 0 || a !== void 0) throw new A("Bad Promise constructor");
  45367. n = d, a = o;
  45368. }), this.resolve = e(n), this.reject = e(a);
  45369. };
  45370. C.exports.f = function(l) {
  45371. return new s(l);
  45372. };
  45373. }, { "../internals/a-callable": 222 }], 304: [function(g, C, i) {
  45374. var e = g("../internals/is-regexp"), A = TypeError;
  45375. C.exports = function(s) {
  45376. if (e(s)) throw new A("The method doesn't accept regular expressions");
  45377. return s;
  45378. };
  45379. }, { "../internals/is-regexp": 291 }], 305: [function(g, C, i) {
  45380. var e = g("../internals/descriptors"), A = g("../internals/function-uncurry-this"), s = g("../internals/function-call"), l = g("../internals/fails"), n = g("../internals/object-keys"), a = g("../internals/object-get-own-property-symbols"), d = g("../internals/object-property-is-enumerable"), o = g("../internals/to-object"), c = g("../internals/indexed-object"), r = Object.assign, h = Object.defineProperty, b = A([].concat);
  45381. C.exports = !r || l(function() {
  45382. if (e && r({ b: 1 }, r(h({}, "a", { enumerable: !0, get: function() {
  45383. h(this, "b", { value: 3, enumerable: !1 });
  45384. } }), { b: 2 })).b !== 1) return !0;
  45385. var u = {}, m = {}, Z = Symbol("assign detection");
  45386. return u[Z] = 7, "abcdefghijklmnopqrst".split("").forEach(function(p) {
  45387. m[p] = p;
  45388. }), r({}, u)[Z] !== 7 || n(r({}, m)).join("") !== "abcdefghijklmnopqrst";
  45389. }) ? function(u, m) {
  45390. for (var Z = o(u), p = arguments.length, Y = 1, R = a.f, X = d.f; p > Y; ) for (var H, S = c(arguments[Y++]), z = R ? b(n(S), R(S)) : n(S), v = z.length, K = 0; v > K; ) H = z[K++], e && !s(X, S, H) || (Z[H] = S[H]);
  45391. return Z;
  45392. } : r;
  45393. }, { "../internals/descriptors": 247, "../internals/fails": 260, "../internals/function-call": 264, "../internals/function-uncurry-this": 268, "../internals/indexed-object": 280, "../internals/object-get-own-property-symbols": 312, "../internals/object-keys": 316, "../internals/object-property-is-enumerable": 317, "../internals/to-object": 344 }], 306: [function(g, C, i) {
  45394. var e, A = g("../internals/an-object"), s = g("../internals/object-define-properties"), l = g("../internals/enum-bug-keys"), n = g("../internals/hidden-keys"), a = g("../internals/html"), d = g("../internals/document-create-element"), o = g("../internals/shared-key"), c = o("IE_PROTO"), r = function() {
  45395. }, h = function(m) {
  45396. return "<script>" + m + "<\/script>";
  45397. }, b = function(m) {
  45398. m.write(h("")), m.close();
  45399. var Z = m.parentWindow.Object;
  45400. return m = null, Z;
  45401. }, u = function() {
  45402. try {
  45403. e = new ActiveXObject("htmlfile");
  45404. } catch {
  45405. }
  45406. var m, Z;
  45407. u = typeof document < "u" ? document.domain && e ? b(e) : ((Z = d("iframe")).style.display = "none", a.appendChild(Z), Z.src = "javascript:", (m = Z.contentWindow.document).open(), m.write(h("document.F=Object")), m.close(), m.F) : b(e);
  45408. for (var p = l.length; p--; ) delete u.prototype[l[p]];
  45409. return u();
  45410. };
  45411. n[c] = !0, C.exports = Object.create || function(m, Z) {
  45412. var p;
  45413. return m !== null ? (r.prototype = A(m), p = new r(), r.prototype = null, p[c] = m) : p = u(), Z === void 0 ? p : s.f(p, Z);
  45414. };
  45415. }, { "../internals/an-object": 227, "../internals/document-create-element": 249, "../internals/enum-bug-keys": 258, "../internals/hidden-keys": 276, "../internals/html": 278, "../internals/object-define-properties": 307, "../internals/shared-key": 332 }], 307: [function(g, C, i) {
  45416. var e = g("../internals/descriptors"), A = g("../internals/v8-prototype-define-bug"), s = g("../internals/object-define-property"), l = g("../internals/an-object"), n = g("../internals/to-indexed-object"), a = g("../internals/object-keys");
  45417. i.f = e && !A ? Object.defineProperties : function(d, o) {
  45418. l(d);
  45419. for (var c, r = n(o), h = a(o), b = h.length, u = 0; b > u; ) s.f(d, c = h[u++], r[c]);
  45420. return d;
  45421. };
  45422. }, { "../internals/an-object": 227, "../internals/descriptors": 247, "../internals/object-define-property": 308, "../internals/object-keys": 316, "../internals/to-indexed-object": 341, "../internals/v8-prototype-define-bug": 352 }], 308: [function(g, C, i) {
  45423. var e = g("../internals/descriptors"), A = g("../internals/ie8-dom-define"), s = g("../internals/v8-prototype-define-bug"), l = g("../internals/an-object"), n = g("../internals/to-property-key"), a = TypeError, d = Object.defineProperty, o = Object.getOwnPropertyDescriptor;
  45424. i.f = e ? s ? function(c, r, h) {
  45425. if (l(c), r = n(r), l(h), typeof c == "function" && r === "prototype" && "value" in h && "writable" in h && !h.writable) {
  45426. var b = o(c, r);
  45427. b && b.writable && (c[r] = h.value, h = { configurable: "configurable" in h ? h.configurable : b.configurable, enumerable: "enumerable" in h ? h.enumerable : b.enumerable, writable: !1 });
  45428. }
  45429. return d(c, r, h);
  45430. } : d : function(c, r, h) {
  45431. if (l(c), r = n(r), l(h), A) try {
  45432. return d(c, r, h);
  45433. } catch {
  45434. }
  45435. if ("get" in h || "set" in h) throw new a("Accessors not supported");
  45436. return "value" in h && (c[r] = h.value), c;
  45437. };
  45438. }, { "../internals/an-object": 227, "../internals/descriptors": 247, "../internals/ie8-dom-define": 279, "../internals/to-property-key": 346, "../internals/v8-prototype-define-bug": 352 }], 309: [function(g, C, i) {
  45439. var e = g("../internals/descriptors"), A = g("../internals/function-call"), s = g("../internals/object-property-is-enumerable"), l = g("../internals/create-property-descriptor"), n = g("../internals/to-indexed-object"), a = g("../internals/to-property-key"), d = g("../internals/has-own-property"), o = g("../internals/ie8-dom-define"), c = Object.getOwnPropertyDescriptor;
  45440. i.f = e ? c : function(r, h) {
  45441. if (r = n(r), h = a(h), o) try {
  45442. return c(r, h);
  45443. } catch {
  45444. }
  45445. if (d(r, h)) return l(!A(s.f, r, h), r[h]);
  45446. };
  45447. }, { "../internals/create-property-descriptor": 242, "../internals/descriptors": 247, "../internals/function-call": 264, "../internals/has-own-property": 275, "../internals/ie8-dom-define": 279, "../internals/object-property-is-enumerable": 317, "../internals/to-indexed-object": 341, "../internals/to-property-key": 346 }], 310: [function(g, C, i) {
  45448. var e = g("../internals/classof-raw"), A = g("../internals/to-indexed-object"), s = g("../internals/object-get-own-property-names").f, l = g("../internals/array-slice-simple"), n = typeof window == "object" && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];
  45449. C.exports.f = function(a) {
  45450. return n && e(a) === "Window" ? function(d) {
  45451. try {
  45452. return s(d);
  45453. } catch {
  45454. return l(n);
  45455. }
  45456. }(a) : s(A(a));
  45457. };
  45458. }, { "../internals/array-slice-simple": 230, "../internals/classof-raw": 235, "../internals/object-get-own-property-names": 311, "../internals/to-indexed-object": 341 }], 311: [function(g, C, i) {
  45459. var e = g("../internals/object-keys-internal"), A = g("../internals/enum-bug-keys").concat("length", "prototype");
  45460. i.f = Object.getOwnPropertyNames || function(s) {
  45461. return e(s, A);
  45462. };
  45463. }, { "../internals/enum-bug-keys": 258, "../internals/object-keys-internal": 315 }], 312: [function(g, C, i) {
  45464. i.f = Object.getOwnPropertySymbols;
  45465. }, {}], 313: [function(g, C, i) {
  45466. var e = g("../internals/has-own-property"), A = g("../internals/is-callable"), s = g("../internals/to-object"), l = g("../internals/shared-key"), n = g("../internals/correct-prototype-getter"), a = l("IE_PROTO"), d = Object, o = d.prototype;
  45467. C.exports = n ? d.getPrototypeOf : function(c) {
  45468. var r = s(c);
  45469. if (e(r, a)) return r[a];
  45470. var h = r.constructor;
  45471. return A(h) && r instanceof h ? h.prototype : r instanceof d ? o : null;
  45472. };
  45473. }, { "../internals/correct-prototype-getter": 239, "../internals/has-own-property": 275, "../internals/is-callable": 285, "../internals/shared-key": 332, "../internals/to-object": 344 }], 314: [function(g, C, i) {
  45474. var e = g("../internals/function-uncurry-this");
  45475. C.exports = e({}.isPrototypeOf);
  45476. }, { "../internals/function-uncurry-this": 268 }], 315: [function(g, C, i) {
  45477. var e = g("../internals/function-uncurry-this"), A = g("../internals/has-own-property"), s = g("../internals/to-indexed-object"), l = g("../internals/array-includes").indexOf, n = g("../internals/hidden-keys"), a = e([].push);
  45478. C.exports = function(d, o) {
  45479. var c, r = s(d), h = 0, b = [];
  45480. for (c in r) !A(n, c) && A(r, c) && a(b, c);
  45481. for (; o.length > h; ) A(r, c = o[h++]) && (~l(b, c) || a(b, c));
  45482. return b;
  45483. };
  45484. }, { "../internals/array-includes": 228, "../internals/function-uncurry-this": 268, "../internals/has-own-property": 275, "../internals/hidden-keys": 276, "../internals/to-indexed-object": 341 }], 316: [function(g, C, i) {
  45485. var e = g("../internals/object-keys-internal"), A = g("../internals/enum-bug-keys");
  45486. C.exports = Object.keys || function(s) {
  45487. return e(s, A);
  45488. };
  45489. }, { "../internals/enum-bug-keys": 258, "../internals/object-keys-internal": 315 }], 317: [function(g, C, i) {
  45490. var e = {}.propertyIsEnumerable, A = Object.getOwnPropertyDescriptor, s = A && !e.call({ 1: 2 }, 1);
  45491. i.f = s ? function(l) {
  45492. var n = A(this, l);
  45493. return !!n && n.enumerable;
  45494. } : e;
  45495. }, {}], 318: [function(g, C, i) {
  45496. var e = g("../internals/function-uncurry-this-accessor"), A = g("../internals/an-object"), s = g("../internals/a-possible-prototype");
  45497. C.exports = Object.setPrototypeOf || ("__proto__" in {} ? function() {
  45498. var l, n = !1, a = {};
  45499. try {
  45500. (l = e(Object.prototype, "__proto__", "set"))(a, []), n = a instanceof Array;
  45501. } catch {
  45502. }
  45503. return function(d, o) {
  45504. return A(d), s(o), n ? l(d, o) : d.__proto__ = o, d;
  45505. };
  45506. }() : void 0);
  45507. }, { "../internals/a-possible-prototype": 224, "../internals/an-object": 227, "../internals/function-uncurry-this-accessor": 266 }], 319: [function(g, C, i) {
  45508. var e = g("../internals/descriptors"), A = g("../internals/fails"), s = g("../internals/function-uncurry-this"), l = g("../internals/object-get-prototype-of"), n = g("../internals/object-keys"), a = g("../internals/to-indexed-object"), d = s(g("../internals/object-property-is-enumerable").f), o = s([].push), c = e && A(function() {
  45509. var h = /* @__PURE__ */ Object.create(null);
  45510. return h[2] = 2, !d(h, 2);
  45511. }), r = function(h) {
  45512. return function(b) {
  45513. for (var u, m = a(b), Z = n(m), p = c && l(m) === null, Y = Z.length, R = 0, X = []; Y > R; ) u = Z[R++], e && !(p ? u in m : d(m, u)) || o(X, h ? [u, m[u]] : m[u]);
  45514. return X;
  45515. };
  45516. };
  45517. C.exports = { entries: r(!0), values: r(!1) };
  45518. }, { "../internals/descriptors": 247, "../internals/fails": 260, "../internals/function-uncurry-this": 268, "../internals/object-get-prototype-of": 313, "../internals/object-keys": 316, "../internals/object-property-is-enumerable": 317, "../internals/to-indexed-object": 341 }], 320: [function(g, C, i) {
  45519. var e = g("../internals/function-call"), A = g("../internals/is-callable"), s = g("../internals/is-object"), l = TypeError;
  45520. C.exports = function(n, a) {
  45521. var d, o;
  45522. if (a === "string" && A(d = n.toString) && !s(o = e(d, n)) || A(d = n.valueOf) && !s(o = e(d, n)) || a !== "string" && A(d = n.toString) && !s(o = e(d, n))) return o;
  45523. throw new l("Can't convert object to primitive value");
  45524. };
  45525. }, { "../internals/function-call": 264, "../internals/is-callable": 285, "../internals/is-object": 289 }], 321: [function(g, C, i) {
  45526. var e = g("../internals/get-built-in"), A = g("../internals/function-uncurry-this"), s = g("../internals/object-get-own-property-names"), l = g("../internals/object-get-own-property-symbols"), n = g("../internals/an-object"), a = A([].concat);
  45527. C.exports = e("Reflect", "ownKeys") || function(d) {
  45528. var o = s.f(n(d)), c = l.f;
  45529. return c ? a(o, c(d)) : o;
  45530. };
  45531. }, { "../internals/an-object": 227, "../internals/function-uncurry-this": 268, "../internals/get-built-in": 269, "../internals/object-get-own-property-names": 311, "../internals/object-get-own-property-symbols": 312 }], 322: [function(g, C, i) {
  45532. var e = g("../internals/global");
  45533. C.exports = e;
  45534. }, { "../internals/global": 274 }], 323: [function(g, C, i) {
  45535. C.exports = function(e) {
  45536. try {
  45537. return { error: !1, value: e() };
  45538. } catch (A) {
  45539. return { error: !0, value: A };
  45540. }
  45541. };
  45542. }, {}], 324: [function(g, C, i) {
  45543. var e = g("../internals/global"), A = g("../internals/promise-native-constructor"), s = g("../internals/is-callable"), l = g("../internals/is-forced"), n = g("../internals/inspect-source"), a = g("../internals/well-known-symbol"), d = g("../internals/engine-is-browser"), o = g("../internals/engine-is-deno"), c = g("../internals/is-pure"), r = g("../internals/engine-v8-version"), h = A && A.prototype, b = a("species"), u = !1, m = s(e.PromiseRejectionEvent), Z = l("Promise", function() {
  45544. var p = n(A), Y = p !== String(A);
  45545. if (!Y && r === 66 || c && (!h.catch || !h.finally)) return !0;
  45546. if (!r || r < 51 || !/native code/.test(p)) {
  45547. var R = new A(function(H) {
  45548. H(1);
  45549. }), X = function(H) {
  45550. H(function() {
  45551. }, function() {
  45552. });
  45553. };
  45554. if ((R.constructor = {})[b] = X, !(u = R.then(function() {
  45555. }) instanceof X)) return !0;
  45556. }
  45557. return !Y && (d || o) && !m;
  45558. });
  45559. C.exports = { CONSTRUCTOR: Z, REJECTION_EVENT: m, SUBCLASSING: u };
  45560. }, { "../internals/engine-is-browser": 250, "../internals/engine-is-deno": 251, "../internals/engine-v8-version": 257, "../internals/global": 274, "../internals/inspect-source": 281, "../internals/is-callable": 285, "../internals/is-forced": 287, "../internals/is-pure": 290, "../internals/promise-native-constructor": 325, "../internals/well-known-symbol": 357 }], 325: [function(g, C, i) {
  45561. var e = g("../internals/global");
  45562. C.exports = e.Promise;
  45563. }, { "../internals/global": 274 }], 326: [function(g, C, i) {
  45564. var e = g("../internals/an-object"), A = g("../internals/is-object"), s = g("../internals/new-promise-capability");
  45565. C.exports = function(l, n) {
  45566. if (e(l), A(n) && n.constructor === l) return n;
  45567. var a = s.f(l);
  45568. return (0, a.resolve)(n), a.promise;
  45569. };
  45570. }, { "../internals/an-object": 227, "../internals/is-object": 289, "../internals/new-promise-capability": 303 }], 327: [function(g, C, i) {
  45571. var e = g("../internals/promise-native-constructor"), A = g("../internals/check-correctness-of-iteration"), s = g("../internals/promise-constructor-detection").CONSTRUCTOR;
  45572. C.exports = s || !A(function(l) {
  45573. e.all(l).then(void 0, function() {
  45574. });
  45575. });
  45576. }, { "../internals/check-correctness-of-iteration": 234, "../internals/promise-constructor-detection": 324, "../internals/promise-native-constructor": 325 }], 328: [function(g, C, i) {
  45577. var e = function() {
  45578. this.head = null, this.tail = null;
  45579. };
  45580. e.prototype = { add: function(A) {
  45581. var s = { item: A, next: null }, l = this.tail;
  45582. l ? l.next = s : this.head = s, this.tail = s;
  45583. }, get: function() {
  45584. var A = this.head;
  45585. if (A) return (this.head = A.next) === null && (this.tail = null), A.item;
  45586. } }, C.exports = e;
  45587. }, {}], 329: [function(g, C, i) {
  45588. var e = g("../internals/is-null-or-undefined"), A = TypeError;
  45589. C.exports = function(s) {
  45590. if (e(s)) throw new A("Can't call method on " + s);
  45591. return s;
  45592. };
  45593. }, { "../internals/is-null-or-undefined": 288 }], 330: [function(g, C, i) {
  45594. var e = g("../internals/get-built-in"), A = g("../internals/define-built-in-accessor"), s = g("../internals/well-known-symbol"), l = g("../internals/descriptors"), n = s("species");
  45595. C.exports = function(a) {
  45596. var d = e(a);
  45597. l && d && !d[n] && A(d, n, { configurable: !0, get: function() {
  45598. return this;
  45599. } });
  45600. };
  45601. }, { "../internals/define-built-in-accessor": 244, "../internals/descriptors": 247, "../internals/get-built-in": 269, "../internals/well-known-symbol": 357 }], 331: [function(g, C, i) {
  45602. var e = g("../internals/object-define-property").f, A = g("../internals/has-own-property"), s = g("../internals/well-known-symbol")("toStringTag");
  45603. C.exports = function(l, n, a) {
  45604. l && !a && (l = l.prototype), l && !A(l, s) && e(l, s, { configurable: !0, value: n });
  45605. };
  45606. }, { "../internals/has-own-property": 275, "../internals/object-define-property": 308, "../internals/well-known-symbol": 357 }], 332: [function(g, C, i) {
  45607. var e = g("../internals/shared"), A = g("../internals/uid"), s = e("keys");
  45608. C.exports = function(l) {
  45609. return s[l] || (s[l] = A(l));
  45610. };
  45611. }, { "../internals/shared": 334, "../internals/uid": 350 }], 333: [function(g, C, i) {
  45612. var e = g("../internals/global"), A = g("../internals/define-global-property"), s = e["__core-js_shared__"] || A("__core-js_shared__", {});
  45613. C.exports = s;
  45614. }, { "../internals/define-global-property": 246, "../internals/global": 274 }], 334: [function(g, C, i) {
  45615. var e = g("../internals/is-pure"), A = g("../internals/shared-store");
  45616. (C.exports = function(s, l) {
  45617. return A[s] || (A[s] = l !== void 0 ? l : {});
  45618. })("versions", []).push({ version: "3.33.0", mode: e ? "pure" : "global", copyright: "© 2014-2023 Denis Pushkarev (zloirock.ru)", license: "https://github.com/zloirock/core-js/blob/v3.33.0/LICENSE", source: "https://github.com/zloirock/core-js" });
  45619. }, { "../internals/is-pure": 290, "../internals/shared-store": 333 }], 335: [function(g, C, i) {
  45620. var e = g("../internals/an-object"), A = g("../internals/a-constructor"), s = g("../internals/is-null-or-undefined"), l = g("../internals/well-known-symbol")("species");
  45621. C.exports = function(n, a) {
  45622. var d, o = e(n).constructor;
  45623. return o === void 0 || s(d = e(o)[l]) ? a : A(d);
  45624. };
  45625. }, { "../internals/a-constructor": 223, "../internals/an-object": 227, "../internals/is-null-or-undefined": 288, "../internals/well-known-symbol": 357 }], 336: [function(g, C, i) {
  45626. var e = g("../internals/engine-v8-version"), A = g("../internals/fails"), s = g("../internals/global").String;
  45627. C.exports = !!Object.getOwnPropertySymbols && !A(function() {
  45628. var l = Symbol("symbol detection");
  45629. return !s(l) || !(Object(l) instanceof Symbol) || !Symbol.sham && e && e < 41;
  45630. });
  45631. }, { "../internals/engine-v8-version": 257, "../internals/fails": 260, "../internals/global": 274 }], 337: [function(g, C, i) {
  45632. var e = g("../internals/function-call"), A = g("../internals/get-built-in"), s = g("../internals/well-known-symbol"), l = g("../internals/define-built-in");
  45633. C.exports = function() {
  45634. var n = A("Symbol"), a = n && n.prototype, d = a && a.valueOf, o = s("toPrimitive");
  45635. a && !a[o] && l(a, o, function(c) {
  45636. return e(d, this);
  45637. }, { arity: 1 });
  45638. };
  45639. }, { "../internals/define-built-in": 245, "../internals/function-call": 264, "../internals/get-built-in": 269, "../internals/well-known-symbol": 357 }], 338: [function(g, C, i) {
  45640. var e = g("../internals/symbol-constructor-detection");
  45641. C.exports = e && !!Symbol.for && !!Symbol.keyFor;
  45642. }, { "../internals/symbol-constructor-detection": 336 }], 339: [function(g, C, i) {
  45643. var e, A, s, l, n = g("../internals/global"), a = g("../internals/function-apply"), d = g("../internals/function-bind-context"), o = g("../internals/is-callable"), c = g("../internals/has-own-property"), r = g("../internals/fails"), h = g("../internals/html"), b = g("../internals/array-slice"), u = g("../internals/document-create-element"), m = g("../internals/validate-arguments-length"), Z = g("../internals/engine-is-ios"), p = g("../internals/engine-is-node"), Y = n.setImmediate, R = n.clearImmediate, X = n.process, H = n.Dispatch, S = n.Function, z = n.MessageChannel, v = n.String, K = 0, V = {};
  45644. r(function() {
  45645. e = n.location;
  45646. });
  45647. var N = function(W) {
  45648. if (c(V, W)) {
  45649. var y = V[W];
  45650. delete V[W], y();
  45651. }
  45652. }, B = function(W) {
  45653. return function() {
  45654. N(W);
  45655. };
  45656. }, G = function(W) {
  45657. N(W.data);
  45658. }, w = function(W) {
  45659. n.postMessage(v(W), e.protocol + "//" + e.host);
  45660. };
  45661. Y && R || (Y = function(W) {
  45662. m(arguments.length, 1);
  45663. var y = o(W) ? W : S(W), f = b(arguments, 1);
  45664. return V[++K] = function() {
  45665. a(y, void 0, f);
  45666. }, A(K), K;
  45667. }, R = function(W) {
  45668. delete V[W];
  45669. }, p ? A = function(W) {
  45670. X.nextTick(B(W));
  45671. } : H && H.now ? A = function(W) {
  45672. H.now(B(W));
  45673. } : z && !Z ? (l = (s = new z()).port2, s.port1.onmessage = G, A = d(l.postMessage, l)) : n.addEventListener && o(n.postMessage) && !n.importScripts && e && e.protocol !== "file:" && !r(w) ? (A = w, n.addEventListener("message", G, !1)) : A = "onreadystatechange" in u("script") ? function(W) {
  45674. h.appendChild(u("script")).onreadystatechange = function() {
  45675. h.removeChild(this), N(W);
  45676. };
  45677. } : function(W) {
  45678. setTimeout(B(W), 0);
  45679. }), C.exports = { set: Y, clear: R };
  45680. }, { "../internals/array-slice": 231, "../internals/document-create-element": 249, "../internals/engine-is-ios": 253, "../internals/engine-is-node": 254, "../internals/fails": 260, "../internals/function-apply": 261, "../internals/function-bind-context": 262, "../internals/global": 274, "../internals/has-own-property": 275, "../internals/html": 278, "../internals/is-callable": 285, "../internals/validate-arguments-length": 353 }], 340: [function(g, C, i) {
  45681. var e = g("../internals/to-integer-or-infinity"), A = Math.max, s = Math.min;
  45682. C.exports = function(l, n) {
  45683. var a = e(l);
  45684. return a < 0 ? A(a + n, 0) : s(a, n);
  45685. };
  45686. }, { "../internals/to-integer-or-infinity": 342 }], 341: [function(g, C, i) {
  45687. var e = g("../internals/indexed-object"), A = g("../internals/require-object-coercible");
  45688. C.exports = function(s) {
  45689. return e(A(s));
  45690. };
  45691. }, { "../internals/indexed-object": 280, "../internals/require-object-coercible": 329 }], 342: [function(g, C, i) {
  45692. var e = g("../internals/math-trunc");
  45693. C.exports = function(A) {
  45694. var s = +A;
  45695. return s != s || s === 0 ? 0 : e(s);
  45696. };
  45697. }, { "../internals/math-trunc": 301 }], 343: [function(g, C, i) {
  45698. var e = g("../internals/to-integer-or-infinity"), A = Math.min;
  45699. C.exports = function(s) {
  45700. return s > 0 ? A(e(s), 9007199254740991) : 0;
  45701. };
  45702. }, { "../internals/to-integer-or-infinity": 342 }], 344: [function(g, C, i) {
  45703. var e = g("../internals/require-object-coercible"), A = Object;
  45704. C.exports = function(s) {
  45705. return A(e(s));
  45706. };
  45707. }, { "../internals/require-object-coercible": 329 }], 345: [function(g, C, i) {
  45708. var e = g("../internals/function-call"), A = g("../internals/is-object"), s = g("../internals/is-symbol"), l = g("../internals/get-method"), n = g("../internals/ordinary-to-primitive"), a = g("../internals/well-known-symbol"), d = TypeError, o = a("toPrimitive");
  45709. C.exports = function(c, r) {
  45710. if (!A(c) || s(c)) return c;
  45711. var h, b = l(c, o);
  45712. if (b) {
  45713. if (r === void 0 && (r = "default"), h = e(b, c, r), !A(h) || s(h)) return h;
  45714. throw new d("Can't convert object to primitive value");
  45715. }
  45716. return r === void 0 && (r = "number"), n(c, r);
  45717. };
  45718. }, { "../internals/function-call": 264, "../internals/get-method": 273, "../internals/is-object": 289, "../internals/is-symbol": 292, "../internals/ordinary-to-primitive": 320, "../internals/well-known-symbol": 357 }], 346: [function(g, C, i) {
  45719. var e = g("../internals/to-primitive"), A = g("../internals/is-symbol");
  45720. C.exports = function(s) {
  45721. var l = e(s, "string");
  45722. return A(l) ? l : l + "";
  45723. };
  45724. }, { "../internals/is-symbol": 292, "../internals/to-primitive": 345 }], 347: [function(g, C, i) {
  45725. var e = {};
  45726. e[g("../internals/well-known-symbol")("toStringTag")] = "z", C.exports = String(e) === "[object z]";
  45727. }, { "../internals/well-known-symbol": 357 }], 348: [function(g, C, i) {
  45728. var e = g("../internals/classof"), A = String;
  45729. C.exports = function(s) {
  45730. if (e(s) === "Symbol") throw new TypeError("Cannot convert a Symbol value to a string");
  45731. return A(s);
  45732. };
  45733. }, { "../internals/classof": 236 }], 349: [function(g, C, i) {
  45734. var e = String;
  45735. C.exports = function(A) {
  45736. try {
  45737. return e(A);
  45738. } catch {
  45739. return "Object";
  45740. }
  45741. };
  45742. }, {}], 350: [function(g, C, i) {
  45743. var e = g("../internals/function-uncurry-this"), A = 0, s = Math.random(), l = e(1 .toString);
  45744. C.exports = function(n) {
  45745. return "Symbol(" + (n === void 0 ? "" : n) + ")_" + l(++A + s, 36);
  45746. };
  45747. }, { "../internals/function-uncurry-this": 268 }], 351: [function(g, C, i) {
  45748. var e = g("../internals/symbol-constructor-detection");
  45749. C.exports = e && !Symbol.sham && typeof Symbol.iterator == "symbol";
  45750. }, { "../internals/symbol-constructor-detection": 336 }], 352: [function(g, C, i) {
  45751. var e = g("../internals/descriptors"), A = g("../internals/fails");
  45752. C.exports = e && A(function() {
  45753. return Object.defineProperty(function() {
  45754. }, "prototype", { value: 42, writable: !1 }).prototype !== 42;
  45755. });
  45756. }, { "../internals/descriptors": 247, "../internals/fails": 260 }], 353: [function(g, C, i) {
  45757. var e = TypeError;
  45758. C.exports = function(A, s) {
  45759. if (A < s) throw new e("Not enough arguments");
  45760. return A;
  45761. };
  45762. }, {}], 354: [function(g, C, i) {
  45763. var e = g("../internals/global"), A = g("../internals/is-callable"), s = e.WeakMap;
  45764. C.exports = A(s) && /native code/.test(String(s));
  45765. }, { "../internals/global": 274, "../internals/is-callable": 285 }], 355: [function(g, C, i) {
  45766. var e = g("../internals/path"), A = g("../internals/has-own-property"), s = g("../internals/well-known-symbol-wrapped"), l = g("../internals/object-define-property").f;
  45767. C.exports = function(n) {
  45768. var a = e.Symbol || (e.Symbol = {});
  45769. A(a, n) || l(a, n, { value: s.f(n) });
  45770. };
  45771. }, { "../internals/has-own-property": 275, "../internals/object-define-property": 308, "../internals/path": 322, "../internals/well-known-symbol-wrapped": 356 }], 356: [function(g, C, i) {
  45772. var e = g("../internals/well-known-symbol");
  45773. i.f = e;
  45774. }, { "../internals/well-known-symbol": 357 }], 357: [function(g, C, i) {
  45775. var e = g("../internals/global"), A = g("../internals/shared"), s = g("../internals/has-own-property"), l = g("../internals/uid"), n = g("../internals/symbol-constructor-detection"), a = g("../internals/use-symbol-as-uid"), d = e.Symbol, o = A("wks"), c = a ? d.for || d : d && d.withoutSetter || l;
  45776. C.exports = function(r) {
  45777. return s(o, r) || (o[r] = n && s(d, r) ? d[r] : c("Symbol." + r)), o[r];
  45778. };
  45779. }, { "../internals/global": 274, "../internals/has-own-property": 275, "../internals/shared": 334, "../internals/symbol-constructor-detection": 336, "../internals/uid": 350, "../internals/use-symbol-as-uid": 351 }], 358: [function(g, C, i) {
  45780. var e = g("../internals/export"), A = g("../internals/array-iteration").findIndex, s = g("../internals/add-to-unscopables"), l = !0;
  45781. "findIndex" in [] && Array(1).findIndex(function() {
  45782. l = !1;
  45783. }), e({ target: "Array", proto: !0, forced: l }, { findIndex: function(n) {
  45784. return A(this, n, arguments.length > 1 ? arguments[1] : void 0);
  45785. } }), s("findIndex");
  45786. }, { "../internals/add-to-unscopables": 225, "../internals/array-iteration": 229, "../internals/export": 259 }], 359: [function(g, C, i) {
  45787. var e = g("../internals/export"), A = g("../internals/array-iteration").find, s = g("../internals/add-to-unscopables"), l = !0;
  45788. "find" in [] && Array(1).find(function() {
  45789. l = !1;
  45790. }), e({ target: "Array", proto: !0, forced: l }, { find: function(n) {
  45791. return A(this, n, arguments.length > 1 ? arguments[1] : void 0);
  45792. } }), s("find");
  45793. }, { "../internals/add-to-unscopables": 225, "../internals/array-iteration": 229, "../internals/export": 259 }], 360: [function(g, C, i) {
  45794. var e = g("../internals/export"), A = g("../internals/array-includes").includes, s = g("../internals/fails"), l = g("../internals/add-to-unscopables");
  45795. e({ target: "Array", proto: !0, forced: s(function() {
  45796. return !Array(1).includes();
  45797. }) }, { includes: function(n) {
  45798. return A(this, n, arguments.length > 1 ? arguments[1] : void 0);
  45799. } }), l("includes");
  45800. }, { "../internals/add-to-unscopables": 225, "../internals/array-includes": 228, "../internals/export": 259, "../internals/fails": 260 }], 361: [function(g, C, i) {
  45801. var e = g("../internals/to-indexed-object"), A = g("../internals/add-to-unscopables"), s = g("../internals/iterators"), l = g("../internals/internal-state"), n = g("../internals/object-define-property").f, a = g("../internals/iterator-define"), d = g("../internals/create-iter-result-object"), o = g("../internals/is-pure"), c = g("../internals/descriptors"), r = l.set, h = l.getterFor("Array Iterator");
  45802. C.exports = a(Array, "Array", function(u, m) {
  45803. r(this, { type: "Array Iterator", target: e(u), index: 0, kind: m });
  45804. }, function() {
  45805. var u = h(this), m = u.target, Z = u.kind, p = u.index++;
  45806. if (!m || p >= m.length) return u.target = void 0, d(void 0, !0);
  45807. switch (Z) {
  45808. case "keys":
  45809. return d(p, !1);
  45810. case "values":
  45811. return d(m[p], !1);
  45812. }
  45813. return d([p, m[p]], !1);
  45814. }, "values");
  45815. var b = s.Arguments = s.Array;
  45816. if (A("keys"), A("values"), A("entries"), !o && c && b.name !== "values") try {
  45817. n(b, "name", { value: "values" });
  45818. } catch {
  45819. }
  45820. }, { "../internals/add-to-unscopables": 225, "../internals/create-iter-result-object": 240, "../internals/descriptors": 247, "../internals/internal-state": 282, "../internals/is-pure": 290, "../internals/iterator-define": 296, "../internals/iterators": 298, "../internals/object-define-property": 308, "../internals/to-indexed-object": 341 }], 362: [function(g, C, i) {
  45821. var e = g("../internals/export"), A = g("../internals/get-built-in"), s = g("../internals/function-apply"), l = g("../internals/function-call"), n = g("../internals/function-uncurry-this"), a = g("../internals/fails"), d = g("../internals/is-callable"), o = g("../internals/is-symbol"), c = g("../internals/array-slice"), r = g("../internals/get-json-replacer-function"), h = g("../internals/symbol-constructor-detection"), b = String, u = A("JSON", "stringify"), m = n(/./.exec), Z = n("".charAt), p = n("".charCodeAt), Y = n("".replace), R = n(1 .toString), X = /[\uD800-\uDFFF]/g, H = /^[\uD800-\uDBFF]$/, S = /^[\uDC00-\uDFFF]$/, z = !h || a(function() {
  45822. var N = A("Symbol")("stringify detection");
  45823. return u([N]) !== "[null]" || u({ a: N }) !== "{}" || u(Object(N)) !== "{}";
  45824. }), v = a(function() {
  45825. return u("\uDF06\uD834") !== '"\\udf06\\ud834"' || u("\uDEAD") !== '"\\udead"';
  45826. }), K = function(N, B) {
  45827. var G = c(arguments), w = r(B);
  45828. if (d(w) || N !== void 0 && !o(N)) return G[1] = function(W, y) {
  45829. if (d(w) && (y = l(w, this, b(W), y)), !o(y)) return y;
  45830. }, s(u, null, G);
  45831. }, V = function(N, B, G) {
  45832. var w = Z(G, B - 1), W = Z(G, B + 1);
  45833. return m(H, N) && !m(S, W) || m(S, N) && !m(H, w) ? "\\u" + R(p(N, 0), 16) : N;
  45834. };
  45835. u && e({ target: "JSON", stat: !0, arity: 3, forced: z || v }, { stringify: function(N, B, G) {
  45836. var w = c(arguments), W = s(z ? K : u, null, w);
  45837. return v && typeof W == "string" ? Y(W, X, V) : W;
  45838. } });
  45839. }, { "../internals/array-slice": 231, "../internals/export": 259, "../internals/fails": 260, "../internals/function-apply": 261, "../internals/function-call": 264, "../internals/function-uncurry-this": 268, "../internals/get-built-in": 269, "../internals/get-json-replacer-function": 272, "../internals/is-callable": 285, "../internals/is-symbol": 292, "../internals/symbol-constructor-detection": 336 }], 363: [function(g, C, i) {
  45840. g("../internals/export")({ target: "Number", stat: !0 }, { isNaN: function(e) {
  45841. return e != e;
  45842. } });
  45843. }, { "../internals/export": 259 }], 364: [function(g, C, i) {
  45844. var e = g("../internals/export"), A = g("../internals/object-assign");
  45845. e({ target: "Object", stat: !0, arity: 2, forced: Object.assign !== A }, { assign: A });
  45846. }, { "../internals/export": 259, "../internals/object-assign": 305 }], 365: [function(g, C, i) {
  45847. var e = g("../internals/export"), A = g("../internals/symbol-constructor-detection"), s = g("../internals/fails"), l = g("../internals/object-get-own-property-symbols"), n = g("../internals/to-object");
  45848. e({ target: "Object", stat: !0, forced: !A || s(function() {
  45849. l.f(1);
  45850. }) }, { getOwnPropertySymbols: function(a) {
  45851. var d = l.f;
  45852. return d ? d(n(a)) : [];
  45853. } });
  45854. }, { "../internals/export": 259, "../internals/fails": 260, "../internals/object-get-own-property-symbols": 312, "../internals/symbol-constructor-detection": 336, "../internals/to-object": 344 }], 366: [function(g, C, i) {
  45855. var e = g("../internals/export"), A = g("../internals/to-object"), s = g("../internals/object-keys");
  45856. e({ target: "Object", stat: !0, forced: g("../internals/fails")(function() {
  45857. s(1);
  45858. }) }, { keys: function(l) {
  45859. return s(A(l));
  45860. } });
  45861. }, { "../internals/export": 259, "../internals/fails": 260, "../internals/object-keys": 316, "../internals/to-object": 344 }], 367: [function(g, C, i) {
  45862. var e = g("../internals/export"), A = g("../internals/object-to-array").values;
  45863. e({ target: "Object", stat: !0 }, { values: function(s) {
  45864. return A(s);
  45865. } });
  45866. }, { "../internals/export": 259, "../internals/object-to-array": 319 }], 368: [function(g, C, i) {
  45867. var e = g("../internals/export"), A = g("../internals/function-call"), s = g("../internals/a-callable"), l = g("../internals/new-promise-capability"), n = g("../internals/perform"), a = g("../internals/iterate");
  45868. e({ target: "Promise", stat: !0, forced: g("../internals/promise-statics-incorrect-iteration") }, { all: function(d) {
  45869. var o = this, c = l.f(o), r = c.resolve, h = c.reject, b = n(function() {
  45870. var u = s(o.resolve), m = [], Z = 0, p = 1;
  45871. a(d, function(Y) {
  45872. var R = Z++, X = !1;
  45873. p++, A(u, o, Y).then(function(H) {
  45874. X || (X = !0, m[R] = H, --p || r(m));
  45875. }, h);
  45876. }), --p || r(m);
  45877. });
  45878. return b.error && h(b.value), c.promise;
  45879. } });
  45880. }, { "../internals/a-callable": 222, "../internals/export": 259, "../internals/function-call": 264, "../internals/iterate": 293, "../internals/new-promise-capability": 303, "../internals/perform": 323, "../internals/promise-statics-incorrect-iteration": 327 }], 369: [function(g, C, i) {
  45881. var e = g("../internals/export"), A = g("../internals/is-pure"), s = g("../internals/promise-constructor-detection").CONSTRUCTOR, l = g("../internals/promise-native-constructor"), n = g("../internals/get-built-in"), a = g("../internals/is-callable"), d = g("../internals/define-built-in"), o = l && l.prototype;
  45882. if (e({ target: "Promise", proto: !0, forced: s, real: !0 }, { catch: function(r) {
  45883. return this.then(void 0, r);
  45884. } }), !A && a(l)) {
  45885. var c = n("Promise").prototype.catch;
  45886. o.catch !== c && d(o, "catch", c, { unsafe: !0 });
  45887. }
  45888. }, { "../internals/define-built-in": 245, "../internals/export": 259, "../internals/get-built-in": 269, "../internals/is-callable": 285, "../internals/is-pure": 290, "../internals/promise-constructor-detection": 324, "../internals/promise-native-constructor": 325 }], 370: [function(g, C, i) {
  45889. var e, A, s, l = g("../internals/export"), n = g("../internals/is-pure"), a = g("../internals/engine-is-node"), d = g("../internals/global"), o = g("../internals/function-call"), c = g("../internals/define-built-in"), r = g("../internals/object-set-prototype-of"), h = g("../internals/set-to-string-tag"), b = g("../internals/set-species"), u = g("../internals/a-callable"), m = g("../internals/is-callable"), Z = g("../internals/is-object"), p = g("../internals/an-instance"), Y = g("../internals/species-constructor"), R = g("../internals/task").set, X = g("../internals/microtask"), H = g("../internals/host-report-errors"), S = g("../internals/perform"), z = g("../internals/queue"), v = g("../internals/internal-state"), K = g("../internals/promise-native-constructor"), V = g("../internals/promise-constructor-detection"), N = g("../internals/new-promise-capability"), B = V.CONSTRUCTOR, G = V.REJECTION_EVENT, w = V.SUBCLASSING, W = v.getterFor("Promise"), y = v.set, f = K && K.prototype, D = K, F = f, T = d.TypeError, Q = d.document, P = d.process, L = N.f, E = L, J = !!(Q && Q.createEvent && d.dispatchEvent), k = function(gg) {
  45890. var lg;
  45891. return !(!Z(gg) || !m(lg = gg.then)) && lg;
  45892. }, j = function(gg, lg) {
  45893. var ng, sg, og, cg = lg.value, rg = lg.state === 1, dg = rg ? gg.ok : gg.fail, Bg = gg.resolve, Zg = gg.reject, Xg = gg.domain;
  45894. try {
  45895. dg ? (rg || (lg.rejection === 2 && Ag(lg), lg.rejection = 1), dg === !0 ? ng = cg : (Xg && Xg.enter(), ng = dg(cg), Xg && (Xg.exit(), og = !0)), ng === gg.promise ? Zg(new T("Promise-chain cycle")) : (sg = k(ng)) ? o(sg, ng, Bg, Zg) : Bg(ng)) : Zg(cg);
  45896. } catch (Kg) {
  45897. Xg && !og && Xg.exit(), Zg(Kg);
  45898. }
  45899. }, q = function(gg, lg) {
  45900. gg.notified || (gg.notified = !0, X(function() {
  45901. for (var ng, sg = gg.reactions; ng = sg.get(); ) j(ng, gg);
  45902. gg.notified = !1, lg && !gg.rejection && Ig(gg);
  45903. }));
  45904. }, Cg = function(gg, lg, ng) {
  45905. var sg, og;
  45906. J ? ((sg = Q.createEvent("Event")).promise = lg, sg.reason = ng, sg.initEvent(gg, !1, !0), d.dispatchEvent(sg)) : sg = { promise: lg, reason: ng }, !G && (og = d["on" + gg]) ? og(sg) : gg === "unhandledrejection" && H("Unhandled promise rejection", ng);
  45907. }, Ig = function(gg) {
  45908. o(R, d, function() {
  45909. var lg, ng = gg.facade, sg = gg.value;
  45910. if (x(gg) && (lg = S(function() {
  45911. a ? P.emit("unhandledRejection", sg, ng) : Cg("unhandledrejection", ng, sg);
  45912. }), gg.rejection = a || x(gg) ? 2 : 1, lg.error)) throw lg.value;
  45913. });
  45914. }, x = function(gg) {
  45915. return gg.rejection !== 1 && !gg.parent;
  45916. }, Ag = function(gg) {
  45917. o(R, d, function() {
  45918. var lg = gg.facade;
  45919. a ? P.emit("rejectionHandled", lg) : Cg("rejectionhandled", lg, gg.value);
  45920. });
  45921. }, eg = function(gg, lg, ng) {
  45922. return function(sg) {
  45923. gg(lg, sg, ng);
  45924. };
  45925. }, O = function(gg, lg, ng) {
  45926. gg.done || (gg.done = !0, ng && (gg = ng), gg.value = lg, gg.state = 2, q(gg, !0));
  45927. }, _ = function(gg, lg, ng) {
  45928. if (!gg.done) {
  45929. gg.done = !0, ng && (gg = ng);
  45930. try {
  45931. if (gg.facade === lg) throw new T("Promise can't be resolved itself");
  45932. var sg = k(lg);
  45933. sg ? X(function() {
  45934. var og = { done: !1 };
  45935. try {
  45936. o(sg, lg, eg(_, og, gg), eg(O, og, gg));
  45937. } catch (cg) {
  45938. O(og, cg, gg);
  45939. }
  45940. }) : (gg.value = lg, gg.state = 1, q(gg, !1));
  45941. } catch (og) {
  45942. O({ done: !1 }, og, gg);
  45943. }
  45944. }
  45945. };
  45946. if (B && (F = (D = function(gg) {
  45947. p(this, F), u(gg), o(e, this);
  45948. var lg = W(this);
  45949. try {
  45950. gg(eg(_, lg), eg(O, lg));
  45951. } catch (ng) {
  45952. O(lg, ng);
  45953. }
  45954. }).prototype, (e = function(gg) {
  45955. y(this, { type: "Promise", done: !1, notified: !1, parent: !1, reactions: new z(), rejection: !1, state: 0, value: void 0 });
  45956. }).prototype = c(F, "then", function(gg, lg) {
  45957. var ng = W(this), sg = L(Y(this, D));
  45958. return ng.parent = !0, sg.ok = !m(gg) || gg, sg.fail = m(lg) && lg, sg.domain = a ? P.domain : void 0, ng.state === 0 ? ng.reactions.add(sg) : X(function() {
  45959. j(sg, ng);
  45960. }), sg.promise;
  45961. }), A = function() {
  45962. var gg = new e(), lg = W(gg);
  45963. this.promise = gg, this.resolve = eg(_, lg), this.reject = eg(O, lg);
  45964. }, N.f = L = function(gg) {
  45965. return gg === D || gg === void 0 ? new A(gg) : E(gg);
  45966. }, !n && m(K) && f !== Object.prototype)) {
  45967. s = f.then, w || c(f, "then", function(gg, lg) {
  45968. var ng = this;
  45969. return new D(function(sg, og) {
  45970. o(s, ng, sg, og);
  45971. }).then(gg, lg);
  45972. }, { unsafe: !0 });
  45973. try {
  45974. delete f.constructor;
  45975. } catch {
  45976. }
  45977. r && r(f, F);
  45978. }
  45979. l({ global: !0, constructor: !0, wrap: !0, forced: B }, { Promise: D }), h(D, "Promise", !1, !0), b("Promise");
  45980. }, { "../internals/a-callable": 222, "../internals/an-instance": 226, "../internals/define-built-in": 245, "../internals/engine-is-node": 254, "../internals/export": 259, "../internals/function-call": 264, "../internals/global": 274, "../internals/host-report-errors": 277, "../internals/internal-state": 282, "../internals/is-callable": 285, "../internals/is-object": 289, "../internals/is-pure": 290, "../internals/microtask": 302, "../internals/new-promise-capability": 303, "../internals/object-set-prototype-of": 318, "../internals/perform": 323, "../internals/promise-constructor-detection": 324, "../internals/promise-native-constructor": 325, "../internals/queue": 328, "../internals/set-species": 330, "../internals/set-to-string-tag": 331, "../internals/species-constructor": 335, "../internals/task": 339 }], 371: [function(g, C, i) {
  45981. var e = g("../internals/export"), A = g("../internals/is-pure"), s = g("../internals/promise-native-constructor"), l = g("../internals/fails"), n = g("../internals/get-built-in"), a = g("../internals/is-callable"), d = g("../internals/species-constructor"), o = g("../internals/promise-resolve"), c = g("../internals/define-built-in"), r = s && s.prototype;
  45982. if (e({ target: "Promise", proto: !0, real: !0, forced: !!s && l(function() {
  45983. r.finally.call({ then: function() {
  45984. } }, function() {
  45985. });
  45986. }) }, { finally: function(b) {
  45987. var u = d(this, n("Promise")), m = a(b);
  45988. return this.then(m ? function(Z) {
  45989. return o(u, b()).then(function() {
  45990. return Z;
  45991. });
  45992. } : b, m ? function(Z) {
  45993. return o(u, b()).then(function() {
  45994. throw Z;
  45995. });
  45996. } : b);
  45997. } }), !A && a(s)) {
  45998. var h = n("Promise").prototype.finally;
  45999. r.finally !== h && c(r, "finally", h, { unsafe: !0 });
  46000. }
  46001. }, { "../internals/define-built-in": 245, "../internals/export": 259, "../internals/fails": 260, "../internals/get-built-in": 269, "../internals/is-callable": 285, "../internals/is-pure": 290, "../internals/promise-native-constructor": 325, "../internals/promise-resolve": 326, "../internals/species-constructor": 335 }], 372: [function(g, C, i) {
  46002. g("../modules/es.promise.constructor"), g("../modules/es.promise.all"), g("../modules/es.promise.catch"), g("../modules/es.promise.race"), g("../modules/es.promise.reject"), g("../modules/es.promise.resolve");
  46003. }, { "../modules/es.promise.all": 368, "../modules/es.promise.catch": 369, "../modules/es.promise.constructor": 370, "../modules/es.promise.race": 373, "../modules/es.promise.reject": 374, "../modules/es.promise.resolve": 375 }], 373: [function(g, C, i) {
  46004. var e = g("../internals/export"), A = g("../internals/function-call"), s = g("../internals/a-callable"), l = g("../internals/new-promise-capability"), n = g("../internals/perform"), a = g("../internals/iterate");
  46005. e({ target: "Promise", stat: !0, forced: g("../internals/promise-statics-incorrect-iteration") }, { race: function(d) {
  46006. var o = this, c = l.f(o), r = c.reject, h = n(function() {
  46007. var b = s(o.resolve);
  46008. a(d, function(u) {
  46009. A(b, o, u).then(c.resolve, r);
  46010. });
  46011. });
  46012. return h.error && r(h.value), c.promise;
  46013. } });
  46014. }, { "../internals/a-callable": 222, "../internals/export": 259, "../internals/function-call": 264, "../internals/iterate": 293, "../internals/new-promise-capability": 303, "../internals/perform": 323, "../internals/promise-statics-incorrect-iteration": 327 }], 374: [function(g, C, i) {
  46015. var e = g("../internals/export"), A = g("../internals/function-call"), s = g("../internals/new-promise-capability");
  46016. e({ target: "Promise", stat: !0, forced: g("../internals/promise-constructor-detection").CONSTRUCTOR }, { reject: function(l) {
  46017. var n = s.f(this);
  46018. return A(n.reject, void 0, l), n.promise;
  46019. } });
  46020. }, { "../internals/export": 259, "../internals/function-call": 264, "../internals/new-promise-capability": 303, "../internals/promise-constructor-detection": 324 }], 375: [function(g, C, i) {
  46021. var e = g("../internals/export"), A = g("../internals/get-built-in"), s = g("../internals/is-pure"), l = g("../internals/promise-native-constructor"), n = g("../internals/promise-constructor-detection").CONSTRUCTOR, a = g("../internals/promise-resolve"), d = A("Promise"), o = s && !n;
  46022. e({ target: "Promise", stat: !0, forced: s || n }, { resolve: function(c) {
  46023. return a(o && this === d ? l : this, c);
  46024. } });
  46025. }, { "../internals/export": 259, "../internals/get-built-in": 269, "../internals/is-pure": 290, "../internals/promise-constructor-detection": 324, "../internals/promise-native-constructor": 325, "../internals/promise-resolve": 326 }], 376: [function(g, C, i) {
  46026. var e = g("../internals/export"), A = g("../internals/function-uncurry-this"), s = g("../internals/to-absolute-index"), l = RangeError, n = String.fromCharCode, a = String.fromCodePoint, d = A([].join);
  46027. e({ target: "String", stat: !0, arity: 1, forced: !!a && a.length !== 1 }, { fromCodePoint: function(o) {
  46028. for (var c, r = [], h = arguments.length, b = 0; h > b; ) {
  46029. if (c = +arguments[b++], s(c, 1114111) !== c) throw new l(c + " is not a valid code point");
  46030. r[b] = c < 65536 ? n(c) : n(55296 + ((c -= 65536) >> 10), c % 1024 + 56320);
  46031. }
  46032. return d(r, "");
  46033. } });
  46034. }, { "../internals/export": 259, "../internals/function-uncurry-this": 268, "../internals/to-absolute-index": 340 }], 377: [function(g, C, i) {
  46035. var e = g("../internals/export"), A = g("../internals/function-uncurry-this"), s = g("../internals/not-a-regexp"), l = g("../internals/require-object-coercible"), n = g("../internals/to-string"), a = g("../internals/correct-is-regexp-logic"), d = A("".indexOf);
  46036. e({ target: "String", proto: !0, forced: !a("includes") }, { includes: function(o) {
  46037. return !!~d(n(l(this)), n(s(o)), arguments.length > 1 ? arguments[1] : void 0);
  46038. } });
  46039. }, { "../internals/correct-is-regexp-logic": 238, "../internals/export": 259, "../internals/function-uncurry-this": 268, "../internals/not-a-regexp": 304, "../internals/require-object-coercible": 329, "../internals/to-string": 348 }], 378: [function(g, C, i) {
  46040. g("../internals/well-known-symbol-define")("asyncIterator");
  46041. }, { "../internals/well-known-symbol-define": 355 }], 379: [function(g, C, i) {
  46042. var e = g("../internals/export"), A = g("../internals/global"), s = g("../internals/function-call"), l = g("../internals/function-uncurry-this"), n = g("../internals/is-pure"), a = g("../internals/descriptors"), d = g("../internals/symbol-constructor-detection"), o = g("../internals/fails"), c = g("../internals/has-own-property"), r = g("../internals/object-is-prototype-of"), h = g("../internals/an-object"), b = g("../internals/to-indexed-object"), u = g("../internals/to-property-key"), m = g("../internals/to-string"), Z = g("../internals/create-property-descriptor"), p = g("../internals/object-create"), Y = g("../internals/object-keys"), R = g("../internals/object-get-own-property-names"), X = g("../internals/object-get-own-property-names-external"), H = g("../internals/object-get-own-property-symbols"), S = g("../internals/object-get-own-property-descriptor"), z = g("../internals/object-define-property"), v = g("../internals/object-define-properties"), K = g("../internals/object-property-is-enumerable"), V = g("../internals/define-built-in"), N = g("../internals/define-built-in-accessor"), B = g("../internals/shared"), G = g("../internals/shared-key"), w = g("../internals/hidden-keys"), W = g("../internals/uid"), y = g("../internals/well-known-symbol"), f = g("../internals/well-known-symbol-wrapped"), D = g("../internals/well-known-symbol-define"), F = g("../internals/symbol-define-to-primitive"), T = g("../internals/set-to-string-tag"), Q = g("../internals/internal-state"), P = g("../internals/array-iteration").forEach, L = G("hidden"), E = Q.set, J = Q.getterFor("Symbol"), k = Object.prototype, j = A.Symbol, q = j && j.prototype, Cg = A.RangeError, Ig = A.TypeError, x = A.QObject, Ag = S.f, eg = z.f, O = X.f, _ = K.f, gg = l([].push), lg = B("symbols"), ng = B("op-symbols"), sg = B("wks"), og = !x || !x.prototype || !x.prototype.findChild, cg = function(Ng, wg, fg) {
  46043. var Jg = Ag(k, wg);
  46044. Jg && delete k[wg], eg(Ng, wg, fg), Jg && Ng !== k && eg(k, wg, Jg);
  46045. }, rg = a && o(function() {
  46046. return p(eg({}, "a", { get: function() {
  46047. return eg(this, "a", { value: 7 }).a;
  46048. } })).a !== 7;
  46049. }) ? cg : eg, dg = function(Ng, wg) {
  46050. var fg = lg[Ng] = p(q);
  46051. return E(fg, { type: "Symbol", tag: Ng, description: wg }), a || (fg.description = wg), fg;
  46052. }, Bg = function(Ng, wg, fg) {
  46053. Ng === k && Bg(ng, wg, fg), h(Ng);
  46054. var Jg = u(wg);
  46055. return h(fg), c(lg, Jg) ? (fg.enumerable ? (c(Ng, L) && Ng[L][Jg] && (Ng[L][Jg] = !1), fg = p(fg, { enumerable: Z(0, !1) })) : (c(Ng, L) || eg(Ng, L, Z(1, {})), Ng[L][Jg] = !0), rg(Ng, Jg, fg)) : eg(Ng, Jg, fg);
  46056. }, Zg = function(Ng, wg) {
  46057. h(Ng);
  46058. var fg = b(wg), Jg = Y(fg).concat(Wg(fg));
  46059. return P(Jg, function(zg) {
  46060. a && !s(Xg, fg, zg) || Bg(Ng, zg, fg[zg]);
  46061. }), Ng;
  46062. }, Xg = function(Ng) {
  46063. var wg = u(Ng), fg = s(_, this, wg);
  46064. return !(this === k && c(lg, wg) && !c(ng, wg)) && (!(fg || !c(this, wg) || !c(lg, wg) || c(this, L) && this[L][wg]) || fg);
  46065. }, Kg = function(Ng, wg) {
  46066. var fg = b(Ng), Jg = u(wg);
  46067. if (fg !== k || !c(lg, Jg) || c(ng, Jg)) {
  46068. var zg = Ag(fg, Jg);
  46069. return !zg || !c(lg, Jg) || c(fg, L) && fg[L][Jg] || (zg.enumerable = !0), zg;
  46070. }
  46071. }, kg = function(Ng) {
  46072. var wg = O(b(Ng)), fg = [];
  46073. return P(wg, function(Jg) {
  46074. c(lg, Jg) || c(w, Jg) || gg(fg, Jg);
  46075. }), fg;
  46076. }, Wg = function(Ng) {
  46077. var wg = Ng === k, fg = O(wg ? ng : b(Ng)), Jg = [];
  46078. return P(fg, function(zg) {
  46079. !c(lg, zg) || wg && !c(k, zg) || gg(Jg, lg[zg]);
  46080. }), Jg;
  46081. };
  46082. d || (V(q = (j = function() {
  46083. if (r(q, this)) throw new Ig("Symbol is not a constructor");
  46084. var Ng = arguments.length && arguments[0] !== void 0 ? m(arguments[0]) : void 0, wg = W(Ng), fg = function(Jg) {
  46085. this === k && s(fg, ng, Jg), c(this, L) && c(this[L], wg) && (this[L][wg] = !1);
  46086. var zg = Z(1, Jg);
  46087. try {
  46088. rg(this, wg, zg);
  46089. } catch (cI) {
  46090. if (!(cI instanceof Cg)) throw cI;
  46091. cg(this, wg, zg);
  46092. }
  46093. };
  46094. return a && og && rg(k, wg, { configurable: !0, set: fg }), dg(wg, Ng);
  46095. }).prototype, "toString", function() {
  46096. return J(this).tag;
  46097. }), V(j, "withoutSetter", function(Ng) {
  46098. return dg(W(Ng), Ng);
  46099. }), K.f = Xg, z.f = Bg, v.f = Zg, S.f = Kg, R.f = X.f = kg, H.f = Wg, f.f = function(Ng) {
  46100. return dg(y(Ng), Ng);
  46101. }, a && (N(q, "description", { configurable: !0, get: function() {
  46102. return J(this).description;
  46103. } }), n || V(k, "propertyIsEnumerable", Xg, { unsafe: !0 }))), e({ global: !0, constructor: !0, wrap: !0, forced: !d, sham: !d }, { Symbol: j }), P(Y(sg), function(Ng) {
  46104. D(Ng);
  46105. }), e({ target: "Symbol", stat: !0, forced: !d }, { useSetter: function() {
  46106. og = !0;
  46107. }, useSimple: function() {
  46108. og = !1;
  46109. } }), e({ target: "Object", stat: !0, forced: !d, sham: !a }, { create: function(Ng, wg) {
  46110. return wg === void 0 ? p(Ng) : Zg(p(Ng), wg);
  46111. }, defineProperty: Bg, defineProperties: Zg, getOwnPropertyDescriptor: Kg }), e({ target: "Object", stat: !0, forced: !d }, { getOwnPropertyNames: kg }), F(), T(j, "Symbol"), w[L] = !0;
  46112. }, { "../internals/an-object": 227, "../internals/array-iteration": 229, "../internals/create-property-descriptor": 242, "../internals/define-built-in": 245, "../internals/define-built-in-accessor": 244, "../internals/descriptors": 247, "../internals/export": 259, "../internals/fails": 260, "../internals/function-call": 264, "../internals/function-uncurry-this": 268, "../internals/global": 274, "../internals/has-own-property": 275, "../internals/hidden-keys": 276, "../internals/internal-state": 282, "../internals/is-pure": 290, "../internals/object-create": 306, "../internals/object-define-properties": 307, "../internals/object-define-property": 308, "../internals/object-get-own-property-descriptor": 309, "../internals/object-get-own-property-names": 311, "../internals/object-get-own-property-names-external": 310, "../internals/object-get-own-property-symbols": 312, "../internals/object-is-prototype-of": 314, "../internals/object-keys": 316, "../internals/object-property-is-enumerable": 317, "../internals/set-to-string-tag": 331, "../internals/shared": 334, "../internals/shared-key": 332, "../internals/symbol-constructor-detection": 336, "../internals/symbol-define-to-primitive": 337, "../internals/to-indexed-object": 341, "../internals/to-property-key": 346, "../internals/to-string": 348, "../internals/uid": 350, "../internals/well-known-symbol": 357, "../internals/well-known-symbol-define": 355, "../internals/well-known-symbol-wrapped": 356 }], 380: [function(g, C, i) {
  46113. var e = g("../internals/export"), A = g("../internals/get-built-in"), s = g("../internals/has-own-property"), l = g("../internals/to-string"), n = g("../internals/shared"), a = g("../internals/symbol-registry-detection"), d = n("string-to-symbol-registry"), o = n("symbol-to-string-registry");
  46114. e({ target: "Symbol", stat: !0, forced: !a }, { for: function(c) {
  46115. var r = l(c);
  46116. if (s(d, r)) return d[r];
  46117. var h = A("Symbol")(r);
  46118. return d[r] = h, o[h] = r, h;
  46119. } });
  46120. }, { "../internals/export": 259, "../internals/get-built-in": 269, "../internals/has-own-property": 275, "../internals/shared": 334, "../internals/symbol-registry-detection": 338, "../internals/to-string": 348 }], 381: [function(g, C, i) {
  46121. g("../modules/es.symbol.constructor"), g("../modules/es.symbol.for"), g("../modules/es.symbol.key-for"), g("../modules/es.json.stringify"), g("../modules/es.object.get-own-property-symbols");
  46122. }, { "../modules/es.json.stringify": 362, "../modules/es.object.get-own-property-symbols": 365, "../modules/es.symbol.constructor": 379, "../modules/es.symbol.for": 380, "../modules/es.symbol.key-for": 382 }], 382: [function(g, C, i) {
  46123. var e = g("../internals/export"), A = g("../internals/has-own-property"), s = g("../internals/is-symbol"), l = g("../internals/try-to-string"), n = g("../internals/shared"), a = g("../internals/symbol-registry-detection"), d = n("symbol-to-string-registry");
  46124. e({ target: "Symbol", stat: !0, forced: !a }, { keyFor: function(o) {
  46125. if (!s(o)) throw new TypeError(l(o) + " is not a symbol");
  46126. if (A(d, o)) return d[o];
  46127. } });
  46128. }, { "../internals/export": 259, "../internals/has-own-property": 275, "../internals/is-symbol": 292, "../internals/shared": 334, "../internals/symbol-registry-detection": 338, "../internals/try-to-string": 349 }], 383: [function(g, C, i) {
  46129. function e(A) {
  46130. return Object.prototype.toString.call(A);
  46131. }
  46132. i.isArray = function(A) {
  46133. return Array.isArray ? Array.isArray(A) : e(A) === "[object Array]";
  46134. }, i.isBoolean = function(A) {
  46135. return typeof A == "boolean";
  46136. }, i.isNull = function(A) {
  46137. return A === null;
  46138. }, i.isNullOrUndefined = function(A) {
  46139. return A == null;
  46140. }, i.isNumber = function(A) {
  46141. return typeof A == "number";
  46142. }, i.isString = function(A) {
  46143. return typeof A == "string";
  46144. }, i.isSymbol = function(A) {
  46145. return typeof A == "symbol";
  46146. }, i.isUndefined = function(A) {
  46147. return A === void 0;
  46148. }, i.isRegExp = function(A) {
  46149. return e(A) === "[object RegExp]";
  46150. }, i.isObject = function(A) {
  46151. return typeof A == "object" && A !== null;
  46152. }, i.isDate = function(A) {
  46153. return e(A) === "[object Date]";
  46154. }, i.isError = function(A) {
  46155. return e(A) === "[object Error]" || A instanceof Error;
  46156. }, i.isFunction = function(A) {
  46157. return typeof A == "function";
  46158. }, i.isPrimitive = function(A) {
  46159. return A === null || typeof A == "boolean" || typeof A == "number" || typeof A == "string" || typeof A == "symbol" || A === void 0;
  46160. }, i.isBuffer = g("buffer").Buffer.isBuffer;
  46161. }, { buffer: 220 }], 384: [function(g, C, i) {
  46162. (function(e) {
  46163. (function() {
  46164. var A = g("elliptic"), s = g("bn.js");
  46165. C.exports = function(d) {
  46166. return new n(d);
  46167. };
  46168. var l = { secp256k1: { name: "secp256k1", byteLength: 32 }, secp224r1: { name: "p224", byteLength: 28 }, prime256v1: { name: "p256", byteLength: 32 }, prime192v1: { name: "p192", byteLength: 24 }, ed25519: { name: "ed25519", byteLength: 32 }, secp384r1: { name: "p384", byteLength: 48 }, secp521r1: { name: "p521", byteLength: 66 } };
  46169. function n(d) {
  46170. this.curveType = l[d], this.curveType || (this.curveType = { name: d }), this.curve = new A.ec(this.curveType.name), this.keys = void 0;
  46171. }
  46172. function a(d, o, c) {
  46173. Array.isArray(d) || (d = d.toArray());
  46174. var r = new e(d);
  46175. if (c && r.length < c) {
  46176. var h = new e(c - r.length);
  46177. h.fill(0), r = e.concat([h, r]);
  46178. }
  46179. return o ? r.toString(o) : r;
  46180. }
  46181. l.p224 = l.secp224r1, l.p256 = l.secp256r1 = l.prime256v1, l.p192 = l.secp192r1 = l.prime192v1, l.p384 = l.secp384r1, l.p521 = l.secp521r1, n.prototype.generateKeys = function(d, o) {
  46182. return this.keys = this.curve.genKeyPair(), this.getPublicKey(d, o);
  46183. }, n.prototype.computeSecret = function(d, o, c) {
  46184. return o = o || "utf8", e.isBuffer(d) || (d = new e(d, o)), a(this.curve.keyFromPublic(d).getPublic().mul(this.keys.getPrivate()).getX(), c, this.curveType.byteLength);
  46185. }, n.prototype.getPublicKey = function(d, o) {
  46186. var c = this.keys.getPublic(o === "compressed", !0);
  46187. return o === "hybrid" && (c[c.length - 1] % 2 ? c[0] = 7 : c[0] = 6), a(c, d);
  46188. }, n.prototype.getPrivateKey = function(d) {
  46189. return a(this.keys.getPrivate(), d);
  46190. }, n.prototype.setPublicKey = function(d, o) {
  46191. return o = o || "utf8", e.isBuffer(d) || (d = new e(d, o)), this.keys._importPublic(d), this;
  46192. }, n.prototype.setPrivateKey = function(d, o) {
  46193. o = o || "utf8", e.isBuffer(d) || (d = new e(d, o));
  46194. var c = new s(d);
  46195. return c = c.toString(16), this.keys = this.curve.genKeyPair(), this.keys._importPrivate(c), this;
  46196. };
  46197. }).call(this);
  46198. }).call(this, g("buffer").Buffer);
  46199. }, { "bn.js": 385, buffer: 220, elliptic: 405 }], 385: [function(g, C, i) {
  46200. arguments[4][184][0].apply(i, arguments);
  46201. }, { buffer: 188, dup: 184 }], 386: [function(g, C, i) {
  46202. var e = g("inherits"), A = g("md5.js"), s = g("ripemd160"), l = g("sha.js"), n = g("cipher-base");
  46203. function a(d) {
  46204. n.call(this, "digest"), this._hash = d;
  46205. }
  46206. e(a, n), a.prototype._update = function(d) {
  46207. this._hash.update(d);
  46208. }, a.prototype._final = function() {
  46209. return this._hash.digest();
  46210. }, C.exports = function(d) {
  46211. return (d = d.toLowerCase()) === "md5" ? new A() : d === "rmd160" || d === "ripemd160" ? new s() : new a(l(d));
  46212. };
  46213. }, { "cipher-base": 221, inherits: 440, "md5.js": 450, ripemd160: 493, "sha.js": 498 }], 387: [function(g, C, i) {
  46214. var e = g("md5.js");
  46215. C.exports = function(A) {
  46216. return new e().update(A).digest();
  46217. };
  46218. }, { "md5.js": 450 }], 388: [function(g, C, i) {
  46219. var e = g("inherits"), A = g("./legacy"), s = g("cipher-base"), l = g("safe-buffer").Buffer, n = g("create-hash/md5"), a = g("ripemd160"), d = g("sha.js"), o = l.alloc(128);
  46220. function c(r, h) {
  46221. s.call(this, "digest"), typeof h == "string" && (h = l.from(h));
  46222. var b = r === "sha512" || r === "sha384" ? 128 : 64;
  46223. this._alg = r, this._key = h, h.length > b ? h = (r === "rmd160" ? new a() : d(r)).update(h).digest() : h.length < b && (h = l.concat([h, o], b));
  46224. for (var u = this._ipad = l.allocUnsafe(b), m = this._opad = l.allocUnsafe(b), Z = 0; Z < b; Z++) u[Z] = 54 ^ h[Z], m[Z] = 92 ^ h[Z];
  46225. this._hash = r === "rmd160" ? new a() : d(r), this._hash.update(u);
  46226. }
  46227. e(c, s), c.prototype._update = function(r) {
  46228. this._hash.update(r);
  46229. }, c.prototype._final = function() {
  46230. var r = this._hash.digest();
  46231. return (this._alg === "rmd160" ? new a() : d(this._alg)).update(this._opad).update(r).digest();
  46232. }, C.exports = function(r, h) {
  46233. return (r = r.toLowerCase()) === "rmd160" || r === "ripemd160" ? new c("rmd160", h) : r === "md5" ? new A(n, h) : new c(r, h);
  46234. };
  46235. }, { "./legacy": 389, "cipher-base": 221, "create-hash/md5": 387, inherits: 440, ripemd160: 493, "safe-buffer": 494, "sha.js": 498 }], 389: [function(g, C, i) {
  46236. var e = g("inherits"), A = g("safe-buffer").Buffer, s = g("cipher-base"), l = A.alloc(128);
  46237. function n(a, d) {
  46238. s.call(this, "digest"), typeof d == "string" && (d = A.from(d)), this._alg = a, this._key = d, d.length > 64 ? d = a(d) : d.length < 64 && (d = A.concat([d, l], 64));
  46239. for (var o = this._ipad = A.allocUnsafe(64), c = this._opad = A.allocUnsafe(64), r = 0; r < 64; r++) o[r] = 54 ^ d[r], c[r] = 92 ^ d[r];
  46240. this._hash = [o];
  46241. }
  46242. e(n, s), n.prototype._update = function(a) {
  46243. this._hash.push(a);
  46244. }, n.prototype._final = function() {
  46245. var a = this._alg(A.concat(this._hash));
  46246. return this._alg(A.concat([this._opad, a]));
  46247. }, C.exports = n;
  46248. }, { "cipher-base": 221, inherits: 440, "safe-buffer": 494 }], 390: [function(g, C, i) {
  46249. i.randomBytes = i.rng = i.pseudoRandomBytes = i.prng = g("randombytes"), i.createHash = i.Hash = g("create-hash"), i.createHmac = i.Hmac = g("create-hmac");
  46250. var e = g("browserify-sign/algos"), A = Object.keys(e), s = ["sha1", "sha224", "sha256", "sha384", "sha512", "md5", "rmd160"].concat(A);
  46251. i.getHashes = function() {
  46252. return s;
  46253. };
  46254. var l = g("pbkdf2");
  46255. i.pbkdf2 = l.pbkdf2, i.pbkdf2Sync = l.pbkdf2Sync;
  46256. var n = g("browserify-cipher");
  46257. i.Cipher = n.Cipher, i.createCipher = n.createCipher, i.Cipheriv = n.Cipheriv, i.createCipheriv = n.createCipheriv, i.Decipher = n.Decipher, i.createDecipher = n.createDecipher, i.Decipheriv = n.Decipheriv, i.createDecipheriv = n.createDecipheriv, i.getCiphers = n.getCiphers, i.listCiphers = n.listCiphers;
  46258. var a = g("diffie-hellman");
  46259. i.DiffieHellmanGroup = a.DiffieHellmanGroup, i.createDiffieHellmanGroup = a.createDiffieHellmanGroup, i.getDiffieHellman = a.getDiffieHellman, i.createDiffieHellman = a.createDiffieHellman, i.DiffieHellman = a.DiffieHellman;
  46260. var d = g("browserify-sign");
  46261. i.createSign = d.createSign, i.Sign = d.Sign, i.createVerify = d.createVerify, i.Verify = d.Verify, i.createECDH = g("create-ecdh");
  46262. var o = g("public-encrypt");
  46263. i.publicEncrypt = o.publicEncrypt, i.privateEncrypt = o.privateEncrypt, i.publicDecrypt = o.publicDecrypt, i.privateDecrypt = o.privateDecrypt;
  46264. var c = g("randomfill");
  46265. i.randomFill = c.randomFill, i.randomFillSync = c.randomFillSync, i.createCredentials = function() {
  46266. throw new Error(["sorry, createCredentials is not implemented yet", "we accept pull requests", "https://github.com/crypto-browserify/crypto-browserify"].join(`
  46267. `));
  46268. }, i.constants = { DH_CHECK_P_NOT_SAFE_PRIME: 2, DH_CHECK_P_NOT_PRIME: 1, DH_UNABLE_TO_CHECK_GENERATOR: 4, DH_NOT_SUITABLE_GENERATOR: 8, NPN_ENABLED: 1, ALPN_ENABLED: 1, RSA_PKCS1_PADDING: 1, RSA_SSLV23_PADDING: 2, RSA_NO_PADDING: 3, RSA_PKCS1_OAEP_PADDING: 4, RSA_X931_PADDING: 5, RSA_PKCS1_PSS_PADDING: 6, POINT_CONVERSION_COMPRESSED: 2, POINT_CONVERSION_UNCOMPRESSED: 4, POINT_CONVERSION_HYBRID: 6 };
  46269. }, { "browserify-cipher": 206, "browserify-sign": 213, "browserify-sign/algos": 210, "create-ecdh": 384, "create-hash": 386, "create-hmac": 388, "diffie-hellman": 400, pbkdf2: 460, "public-encrypt": 468, randombytes: 475, randomfill: 476 }], 391: [function(g, C, i) {
  46270. (function(e, A) {
  46271. typeof i == "object" && C !== void 0 ? C.exports = A() : (e = typeof globalThis < "u" ? globalThis : e || self).dayjs = A();
  46272. })(void 0, function() {
  46273. var e = 6e4, A = 36e5, s = "millisecond", l = "second", n = "minute", a = "hour", d = "day", o = "week", c = "month", r = "quarter", h = "year", b = "date", u = "Invalid Date", m = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, Z = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, p = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), ordinal: function(G) {
  46274. var w = ["th", "st", "nd", "rd"], W = G % 100;
  46275. return "[" + G + (w[(W - 20) % 10] || w[W] || w[0]) + "]";
  46276. } }, Y = function(G, w, W) {
  46277. var y = String(G);
  46278. return !y || y.length >= w ? G : "" + Array(w + 1 - y.length).join(W) + G;
  46279. }, R = { s: Y, z: function(G) {
  46280. var w = -G.utcOffset(), W = Math.abs(w), y = Math.floor(W / 60), f = W % 60;
  46281. return (w <= 0 ? "+" : "-") + Y(y, 2, "0") + ":" + Y(f, 2, "0");
  46282. }, m: function G(w, W) {
  46283. if (w.date() < W.date()) return -G(W, w);
  46284. var y = 12 * (W.year() - w.year()) + (W.month() - w.month()), f = w.clone().add(y, c), D = W - f < 0, F = w.clone().add(y + (D ? -1 : 1), c);
  46285. return +(-(y + (W - f) / (D ? f - F : F - f)) || 0);
  46286. }, a: function(G) {
  46287. return G < 0 ? Math.ceil(G) || 0 : Math.floor(G);
  46288. }, p: function(G) {
  46289. return { M: c, y: h, w: o, d, D: b, h: a, m: n, s: l, ms: s, Q: r }[G] || String(G || "").toLowerCase().replace(/s$/, "");
  46290. }, u: function(G) {
  46291. return G === void 0;
  46292. } }, X = "en", H = {};
  46293. H[X] = p;
  46294. var S = "$isDayjsObject", z = function(G) {
  46295. return G instanceof N || !(!G || !G[S]);
  46296. }, v = function G(w, W, y) {
  46297. var f;
  46298. if (!w) return X;
  46299. if (typeof w == "string") {
  46300. var D = w.toLowerCase();
  46301. H[D] && (f = D), W && (H[D] = W, f = D);
  46302. var F = w.split("-");
  46303. if (!f && F.length > 1) return G(F[0]);
  46304. } else {
  46305. var T = w.name;
  46306. H[T] = w, f = T;
  46307. }
  46308. return !y && f && (X = f), f || !y && X;
  46309. }, K = function(G, w) {
  46310. if (z(G)) return G.clone();
  46311. var W = typeof w == "object" ? w : {};
  46312. return W.date = G, W.args = arguments, new N(W);
  46313. }, V = R;
  46314. V.l = v, V.i = z, V.w = function(G, w) {
  46315. return K(G, { locale: w.$L, utc: w.$u, x: w.$x, $offset: w.$offset });
  46316. };
  46317. var N = function() {
  46318. function G(W) {
  46319. this.$L = v(W.locale, null, !0), this.parse(W), this.$x = this.$x || W.x || {}, this[S] = !0;
  46320. }
  46321. var w = G.prototype;
  46322. return w.parse = function(W) {
  46323. this.$d = function(y) {
  46324. var f = y.date, D = y.utc;
  46325. if (f === null) return /* @__PURE__ */ new Date(NaN);
  46326. if (V.u(f)) return /* @__PURE__ */ new Date();
  46327. if (f instanceof Date) return new Date(f);
  46328. if (typeof f == "string" && !/Z$/i.test(f)) {
  46329. var F = f.match(m);
  46330. if (F) {
  46331. var T = F[2] - 1 || 0, Q = (F[7] || "0").substring(0, 3);
  46332. return D ? new Date(Date.UTC(F[1], T, F[3] || 1, F[4] || 0, F[5] || 0, F[6] || 0, Q)) : new Date(F[1], T, F[3] || 1, F[4] || 0, F[5] || 0, F[6] || 0, Q);
  46333. }
  46334. }
  46335. return new Date(f);
  46336. }(W), this.init();
  46337. }, w.init = function() {
  46338. var W = this.$d;
  46339. this.$y = W.getFullYear(), this.$M = W.getMonth(), this.$D = W.getDate(), this.$W = W.getDay(), this.$H = W.getHours(), this.$m = W.getMinutes(), this.$s = W.getSeconds(), this.$ms = W.getMilliseconds();
  46340. }, w.$utils = function() {
  46341. return V;
  46342. }, w.isValid = function() {
  46343. return this.$d.toString() !== u;
  46344. }, w.isSame = function(W, y) {
  46345. var f = K(W);
  46346. return this.startOf(y) <= f && f <= this.endOf(y);
  46347. }, w.isAfter = function(W, y) {
  46348. return K(W) < this.startOf(y);
  46349. }, w.isBefore = function(W, y) {
  46350. return this.endOf(y) < K(W);
  46351. }, w.$g = function(W, y, f) {
  46352. return V.u(W) ? this[y] : this.set(f, W);
  46353. }, w.unix = function() {
  46354. return Math.floor(this.valueOf() / 1e3);
  46355. }, w.valueOf = function() {
  46356. return this.$d.getTime();
  46357. }, w.startOf = function(W, y) {
  46358. var f = this, D = !!V.u(y) || y, F = V.p(W), T = function(q, Cg) {
  46359. var Ig = V.w(f.$u ? Date.UTC(f.$y, Cg, q) : new Date(f.$y, Cg, q), f);
  46360. return D ? Ig : Ig.endOf(d);
  46361. }, Q = function(q, Cg) {
  46362. return V.w(f.toDate()[q].apply(f.toDate("s"), (D ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(Cg)), f);
  46363. }, P = this.$W, L = this.$M, E = this.$D, J = "set" + (this.$u ? "UTC" : "");
  46364. switch (F) {
  46365. case h:
  46366. return D ? T(1, 0) : T(31, 11);
  46367. case c:
  46368. return D ? T(1, L) : T(0, L + 1);
  46369. case o:
  46370. var k = this.$locale().weekStart || 0, j = (P < k ? P + 7 : P) - k;
  46371. return T(D ? E - j : E + (6 - j), L);
  46372. case d:
  46373. case b:
  46374. return Q(J + "Hours", 0);
  46375. case a:
  46376. return Q(J + "Minutes", 1);
  46377. case n:
  46378. return Q(J + "Seconds", 2);
  46379. case l:
  46380. return Q(J + "Milliseconds", 3);
  46381. default:
  46382. return this.clone();
  46383. }
  46384. }, w.endOf = function(W) {
  46385. return this.startOf(W, !1);
  46386. }, w.$set = function(W, y) {
  46387. var f, D = V.p(W), F = "set" + (this.$u ? "UTC" : ""), T = (f = {}, f[d] = F + "Date", f[b] = F + "Date", f[c] = F + "Month", f[h] = F + "FullYear", f[a] = F + "Hours", f[n] = F + "Minutes", f[l] = F + "Seconds", f[s] = F + "Milliseconds", f)[D], Q = D === d ? this.$D + (y - this.$W) : y;
  46388. if (D === c || D === h) {
  46389. var P = this.clone().set(b, 1);
  46390. P.$d[T](Q), P.init(), this.$d = P.set(b, Math.min(this.$D, P.daysInMonth())).$d;
  46391. } else T && this.$d[T](Q);
  46392. return this.init(), this;
  46393. }, w.set = function(W, y) {
  46394. return this.clone().$set(W, y);
  46395. }, w.get = function(W) {
  46396. return this[V.p(W)]();
  46397. }, w.add = function(W, y) {
  46398. var f, D = this;
  46399. W = Number(W);
  46400. var F = V.p(y), T = function(L) {
  46401. var E = K(D);
  46402. return V.w(E.date(E.date() + Math.round(L * W)), D);
  46403. };
  46404. if (F === c) return this.set(c, this.$M + W);
  46405. if (F === h) return this.set(h, this.$y + W);
  46406. if (F === d) return T(1);
  46407. if (F === o) return T(7);
  46408. var Q = (f = {}, f[n] = e, f[a] = A, f[l] = 1e3, f)[F] || 1, P = this.$d.getTime() + W * Q;
  46409. return V.w(P, this);
  46410. }, w.subtract = function(W, y) {
  46411. return this.add(-1 * W, y);
  46412. }, w.format = function(W) {
  46413. var y = this, f = this.$locale();
  46414. if (!this.isValid()) return f.invalidDate || u;
  46415. var D = W || "YYYY-MM-DDTHH:mm:ssZ", F = V.z(this), T = this.$H, Q = this.$m, P = this.$M, L = f.weekdays, E = f.months, J = f.meridiem, k = function(Cg, Ig, x, Ag) {
  46416. return Cg && (Cg[Ig] || Cg(y, D)) || x[Ig].slice(0, Ag);
  46417. }, j = function(Cg) {
  46418. return V.s(T % 12 || 12, Cg, "0");
  46419. }, q = J || function(Cg, Ig, x) {
  46420. var Ag = Cg < 12 ? "AM" : "PM";
  46421. return x ? Ag.toLowerCase() : Ag;
  46422. };
  46423. return D.replace(Z, function(Cg, Ig) {
  46424. return Ig || function(x) {
  46425. switch (x) {
  46426. case "YY":
  46427. return String(y.$y).slice(-2);
  46428. case "YYYY":
  46429. return V.s(y.$y, 4, "0");
  46430. case "M":
  46431. return P + 1;
  46432. case "MM":
  46433. return V.s(P + 1, 2, "0");
  46434. case "MMM":
  46435. return k(f.monthsShort, P, E, 3);
  46436. case "MMMM":
  46437. return k(E, P);
  46438. case "D":
  46439. return y.$D;
  46440. case "DD":
  46441. return V.s(y.$D, 2, "0");
  46442. case "d":
  46443. return String(y.$W);
  46444. case "dd":
  46445. return k(f.weekdaysMin, y.$W, L, 2);
  46446. case "ddd":
  46447. return k(f.weekdaysShort, y.$W, L, 3);
  46448. case "dddd":
  46449. return L[y.$W];
  46450. case "H":
  46451. return String(T);
  46452. case "HH":
  46453. return V.s(T, 2, "0");
  46454. case "h":
  46455. return j(1);
  46456. case "hh":
  46457. return j(2);
  46458. case "a":
  46459. return q(T, Q, !0);
  46460. case "A":
  46461. return q(T, Q, !1);
  46462. case "m":
  46463. return String(Q);
  46464. case "mm":
  46465. return V.s(Q, 2, "0");
  46466. case "s":
  46467. return String(y.$s);
  46468. case "ss":
  46469. return V.s(y.$s, 2, "0");
  46470. case "SSS":
  46471. return V.s(y.$ms, 3, "0");
  46472. case "Z":
  46473. return F;
  46474. }
  46475. return null;
  46476. }(Cg) || F.replace(":", "");
  46477. });
  46478. }, w.utcOffset = function() {
  46479. return 15 * -Math.round(this.$d.getTimezoneOffset() / 15);
  46480. }, w.diff = function(W, y, f) {
  46481. var D, F = this, T = V.p(y), Q = K(W), P = (Q.utcOffset() - this.utcOffset()) * e, L = this - Q, E = function() {
  46482. return V.m(F, Q);
  46483. };
  46484. switch (T) {
  46485. case h:
  46486. D = E() / 12;
  46487. break;
  46488. case c:
  46489. D = E();
  46490. break;
  46491. case r:
  46492. D = E() / 3;
  46493. break;
  46494. case o:
  46495. D = (L - P) / 6048e5;
  46496. break;
  46497. case d:
  46498. D = (L - P) / 864e5;
  46499. break;
  46500. case a:
  46501. D = L / A;
  46502. break;
  46503. case n:
  46504. D = L / e;
  46505. break;
  46506. case l:
  46507. D = L / 1e3;
  46508. break;
  46509. default:
  46510. D = L;
  46511. }
  46512. return f ? D : V.a(D);
  46513. }, w.daysInMonth = function() {
  46514. return this.endOf(c).$D;
  46515. }, w.$locale = function() {
  46516. return H[this.$L];
  46517. }, w.locale = function(W, y) {
  46518. if (!W) return this.$L;
  46519. var f = this.clone(), D = v(W, y, !0);
  46520. return D && (f.$L = D), f;
  46521. }, w.clone = function() {
  46522. return V.w(this.$d, this);
  46523. }, w.toDate = function() {
  46524. return new Date(this.valueOf());
  46525. }, w.toJSON = function() {
  46526. return this.isValid() ? this.toISOString() : null;
  46527. }, w.toISOString = function() {
  46528. return this.$d.toISOString();
  46529. }, w.toString = function() {
  46530. return this.$d.toUTCString();
  46531. }, G;
  46532. }(), B = N.prototype;
  46533. return K.prototype = B, [["$ms", s], ["$s", l], ["$m", n], ["$H", a], ["$W", d], ["$M", c], ["$y", h], ["$D", b]].forEach(function(G) {
  46534. B[G[1]] = function(w) {
  46535. return this.$g(w, G[0], G[1]);
  46536. };
  46537. }), K.extend = function(G, w) {
  46538. return G.$i || (G(w, N, K), G.$i = !0), K;
  46539. }, K.locale = v, K.isDayjs = z, K.unix = function(G) {
  46540. return K(1e3 * G);
  46541. }, K.en = H[X], K.Ls = H, K.p = {}, K;
  46542. });
  46543. }, {}], 392: [function(g, C, i) {
  46544. (function(e, A) {
  46545. typeof i == "object" && C !== void 0 ? C.exports = A() : (e = typeof globalThis < "u" ? globalThis : e || self).dayjs_plugin_customParseFormat = A();
  46546. })(void 0, function() {
  46547. var e = { LTS: "h:mm:ss A", LT: "h:mm A", L: "MM/DD/YYYY", LL: "MMMM D, YYYY", LLL: "MMMM D, YYYY h:mm A", LLLL: "dddd, MMMM D, YYYY h:mm A" }, A = /(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g, s = /\d\d/, l = /\d\d?/, n = /\d*[^-_:/,()\s\d]+/, a = {}, d = function(m) {
  46548. return (m = +m) + (m > 68 ? 1900 : 2e3);
  46549. }, o = function(m) {
  46550. return function(Z) {
  46551. this[m] = +Z;
  46552. };
  46553. }, c = [/[+-]\d\d:?(\d\d)?|Z/, function(m) {
  46554. (this.zone || (this.zone = {})).offset = function(Z) {
  46555. if (!Z || Z === "Z") return 0;
  46556. var p = Z.match(/([+-]|\d\d)/g), Y = 60 * p[1] + (+p[2] || 0);
  46557. return Y === 0 ? 0 : p[0] === "+" ? -Y : Y;
  46558. }(m);
  46559. }], r = function(m) {
  46560. var Z = a[m];
  46561. return Z && (Z.indexOf ? Z : Z.s.concat(Z.f));
  46562. }, h = function(m, Z) {
  46563. var p, Y = a.meridiem;
  46564. if (Y) {
  46565. for (var R = 1; R <= 24; R += 1) if (m.indexOf(Y(R, 0, Z)) > -1) {
  46566. p = R > 12;
  46567. break;
  46568. }
  46569. } else p = m === (Z ? "pm" : "PM");
  46570. return p;
  46571. }, b = { A: [n, function(m) {
  46572. this.afternoon = h(m, !1);
  46573. }], a: [n, function(m) {
  46574. this.afternoon = h(m, !0);
  46575. }], S: [/\d/, function(m) {
  46576. this.milliseconds = 100 * +m;
  46577. }], SS: [s, function(m) {
  46578. this.milliseconds = 10 * +m;
  46579. }], SSS: [/\d{3}/, function(m) {
  46580. this.milliseconds = +m;
  46581. }], s: [l, o("seconds")], ss: [l, o("seconds")], m: [l, o("minutes")], mm: [l, o("minutes")], H: [l, o("hours")], h: [l, o("hours")], HH: [l, o("hours")], hh: [l, o("hours")], D: [l, o("day")], DD: [s, o("day")], Do: [n, function(m) {
  46582. var Z = a.ordinal, p = m.match(/\d+/);
  46583. if (this.day = p[0], Z) for (var Y = 1; Y <= 31; Y += 1) Z(Y).replace(/\[|\]/g, "") === m && (this.day = Y);
  46584. }], M: [l, o("month")], MM: [s, o("month")], MMM: [n, function(m) {
  46585. var Z = r("months"), p = (r("monthsShort") || Z.map(function(Y) {
  46586. return Y.slice(0, 3);
  46587. })).indexOf(m) + 1;
  46588. if (p < 1) throw new Error();
  46589. this.month = p % 12 || p;
  46590. }], MMMM: [n, function(m) {
  46591. var Z = r("months").indexOf(m) + 1;
  46592. if (Z < 1) throw new Error();
  46593. this.month = Z % 12 || Z;
  46594. }], Y: [/[+-]?\d+/, o("year")], YY: [s, function(m) {
  46595. this.year = d(m);
  46596. }], YYYY: [/\d{4}/, o("year")], Z: c, ZZ: c };
  46597. function u(m) {
  46598. var Z, p;
  46599. Z = m, p = a && a.formats;
  46600. for (var Y = (m = Z.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g, function(K, V, N) {
  46601. var B = N && N.toUpperCase();
  46602. return V || p[N] || e[N] || p[B].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function(G, w, W) {
  46603. return w || W.slice(1);
  46604. });
  46605. })).match(A), R = Y.length, X = 0; X < R; X += 1) {
  46606. var H = Y[X], S = b[H], z = S && S[0], v = S && S[1];
  46607. Y[X] = v ? { regex: z, parser: v } : H.replace(/^\[|\]$/g, "");
  46608. }
  46609. return function(K) {
  46610. for (var V = {}, N = 0, B = 0; N < R; N += 1) {
  46611. var G = Y[N];
  46612. if (typeof G == "string") B += G.length;
  46613. else {
  46614. var w = G.regex, W = G.parser, y = K.slice(B), f = w.exec(y)[0];
  46615. W.call(V, f), K = K.replace(f, "");
  46616. }
  46617. }
  46618. return function(D) {
  46619. var F = D.afternoon;
  46620. if (F !== void 0) {
  46621. var T = D.hours;
  46622. F ? T < 12 && (D.hours += 12) : T === 12 && (D.hours = 0), delete D.afternoon;
  46623. }
  46624. }(V), V;
  46625. };
  46626. }
  46627. return function(m, Z, p) {
  46628. p.p.customParseFormat = !0, m && m.parseTwoDigitYear && (d = m.parseTwoDigitYear);
  46629. var Y = Z.prototype, R = Y.parse;
  46630. Y.parse = function(X) {
  46631. var H = X.date, S = X.utc, z = X.args;
  46632. this.$u = S;
  46633. var v = z[1];
  46634. if (typeof v == "string") {
  46635. var K = z[2] === !0, V = z[3] === !0, N = K || V, B = z[2];
  46636. V && (B = z[2]), a = this.$locale(), !K && B && (a = p.Ls[B]), this.$d = function(y, f, D) {
  46637. try {
  46638. if (["x", "X"].indexOf(f) > -1) return new Date((f === "X" ? 1e3 : 1) * y);
  46639. var F = u(f)(y), T = F.year, Q = F.month, P = F.day, L = F.hours, E = F.minutes, J = F.seconds, k = F.milliseconds, j = F.zone, q = /* @__PURE__ */ new Date(), Cg = P || (T || Q ? 1 : q.getDate()), Ig = T || q.getFullYear(), x = 0;
  46640. T && !Q || (x = Q > 0 ? Q - 1 : q.getMonth());
  46641. var Ag = L || 0, eg = E || 0, O = J || 0, _ = k || 0;
  46642. return j ? new Date(Date.UTC(Ig, x, Cg, Ag, eg, O, _ + 60 * j.offset * 1e3)) : D ? new Date(Date.UTC(Ig, x, Cg, Ag, eg, O, _)) : new Date(Ig, x, Cg, Ag, eg, O, _);
  46643. } catch {
  46644. return /* @__PURE__ */ new Date("");
  46645. }
  46646. }(H, v, S), this.init(), B && B !== !0 && (this.$L = this.locale(B).$L), N && H != this.format(v) && (this.$d = /* @__PURE__ */ new Date("")), a = {};
  46647. } else if (v instanceof Array) for (var G = v.length, w = 1; w <= G; w += 1) {
  46648. z[1] = v[w - 1];
  46649. var W = p.apply(this, z);
  46650. if (W.isValid()) {
  46651. this.$d = W.$d, this.$L = W.$L, this.init();
  46652. break;
  46653. }
  46654. w === G && (this.$d = /* @__PURE__ */ new Date(""));
  46655. }
  46656. else R.call(this, X);
  46657. };
  46658. };
  46659. });
  46660. }, {}], 393: [function(g, C, i) {
  46661. (function(e, A) {
  46662. typeof i == "object" && C !== void 0 ? C.exports = A() : (e = typeof globalThis < "u" ? globalThis : e || self).dayjs_plugin_utc = A();
  46663. })(void 0, function() {
  46664. var e = "minute", A = /[+-]\d\d(?::?\d\d)?/g, s = /([+-]|\d\d)/g;
  46665. return function(l, n, a) {
  46666. var d = n.prototype;
  46667. a.utc = function(m) {
  46668. var Z = { date: m, utc: !0, args: arguments };
  46669. return new n(Z);
  46670. }, d.utc = function(m) {
  46671. var Z = a(this.toDate(), { locale: this.$L, utc: !0 });
  46672. return m ? Z.add(this.utcOffset(), e) : Z;
  46673. }, d.local = function() {
  46674. return a(this.toDate(), { locale: this.$L, utc: !1 });
  46675. };
  46676. var o = d.parse;
  46677. d.parse = function(m) {
  46678. m.utc && (this.$u = !0), this.$utils().u(m.$offset) || (this.$offset = m.$offset), o.call(this, m);
  46679. };
  46680. var c = d.init;
  46681. d.init = function() {
  46682. if (this.$u) {
  46683. var m = this.$d;
  46684. this.$y = m.getUTCFullYear(), this.$M = m.getUTCMonth(), this.$D = m.getUTCDate(), this.$W = m.getUTCDay(), this.$H = m.getUTCHours(), this.$m = m.getUTCMinutes(), this.$s = m.getUTCSeconds(), this.$ms = m.getUTCMilliseconds();
  46685. } else c.call(this);
  46686. };
  46687. var r = d.utcOffset;
  46688. d.utcOffset = function(m, Z) {
  46689. var p = this.$utils().u;
  46690. if (p(m)) return this.$u ? 0 : p(this.$offset) ? r.call(this) : this.$offset;
  46691. if (typeof m == "string" && (m = function(H) {
  46692. H === void 0 && (H = "");
  46693. var S = H.match(A);
  46694. if (!S) return null;
  46695. var z = ("" + S[0]).match(s) || ["-", 0, 0], v = z[0], K = 60 * +z[1] + +z[2];
  46696. return K === 0 ? 0 : v === "+" ? K : -K;
  46697. }(m)) === null) return this;
  46698. var Y = Math.abs(m) <= 16 ? 60 * m : m, R = this;
  46699. if (Z) return R.$offset = Y, R.$u = m === 0, R;
  46700. if (m !== 0) {
  46701. var X = this.$u ? this.toDate().getTimezoneOffset() : -1 * this.utcOffset();
  46702. (R = this.local().add(Y + X, e)).$offset = Y, R.$x.$localOffset = X;
  46703. } else R = this.utc();
  46704. return R;
  46705. };
  46706. var h = d.format;
  46707. d.format = function(m) {
  46708. var Z = m || (this.$u ? "YYYY-MM-DDTHH:mm:ss[Z]" : "");
  46709. return h.call(this, Z);
  46710. }, d.valueOf = function() {
  46711. var m = this.$utils().u(this.$offset) ? 0 : this.$offset + (this.$x.$localOffset || this.$d.getTimezoneOffset());
  46712. return this.$d.valueOf() - 6e4 * m;
  46713. }, d.isUTC = function() {
  46714. return !!this.$u;
  46715. }, d.toISOString = function() {
  46716. return this.toDate().toISOString();
  46717. }, d.toString = function() {
  46718. return this.toDate().toUTCString();
  46719. };
  46720. var b = d.toDate;
  46721. d.toDate = function(m) {
  46722. return m === "s" && this.$offset ? a(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate() : b.call(this);
  46723. };
  46724. var u = d.diff;
  46725. d.diff = function(m, Z, p) {
  46726. if (m && this.$u === m.$u) return u.call(this, m, Z, p);
  46727. var Y = this.local(), R = a(m).local();
  46728. return u.call(Y, R, Z, p);
  46729. };
  46730. };
  46731. });
  46732. }, {}], 394: [function(g, C, i) {
  46733. i.utils = g("./des/utils"), i.Cipher = g("./des/cipher"), i.DES = g("./des/des"), i.CBC = g("./des/cbc"), i.EDE = g("./des/ede");
  46734. }, { "./des/cbc": 395, "./des/cipher": 396, "./des/des": 397, "./des/ede": 398, "./des/utils": 399 }], 395: [function(g, C, i) {
  46735. var e = g("minimalistic-assert"), A = g("inherits"), s = {};
  46736. function l(n) {
  46737. e.equal(n.length, 8, "Invalid IV length"), this.iv = new Array(8);
  46738. for (var a = 0; a < this.iv.length; a++) this.iv[a] = n[a];
  46739. }
  46740. i.instantiate = function(n) {
  46741. function a(r) {
  46742. n.call(this, r), this._cbcInit();
  46743. }
  46744. A(a, n);
  46745. for (var d = Object.keys(s), o = 0; o < d.length; o++) {
  46746. var c = d[o];
  46747. a.prototype[c] = s[c];
  46748. }
  46749. return a.create = function(r) {
  46750. return new a(r);
  46751. }, a;
  46752. }, s._cbcInit = function() {
  46753. var n = new l(this.options.iv);
  46754. this._cbcState = n;
  46755. }, s._update = function(n, a, d, o) {
  46756. var c = this._cbcState, r = this.constructor.super_.prototype, h = c.iv;
  46757. if (this.type === "encrypt") {
  46758. for (var b = 0; b < this.blockSize; b++) h[b] ^= n[a + b];
  46759. for (r._update.call(this, h, 0, d, o), b = 0; b < this.blockSize; b++) h[b] = d[o + b];
  46760. } else {
  46761. for (r._update.call(this, n, a, d, o), b = 0; b < this.blockSize; b++) d[o + b] ^= h[b];
  46762. for (b = 0; b < this.blockSize; b++) h[b] = n[a + b];
  46763. }
  46764. };
  46765. }, { inherits: 440, "minimalistic-assert": 453 }], 396: [function(g, C, i) {
  46766. var e = g("minimalistic-assert");
  46767. function A(s) {
  46768. this.options = s, this.type = this.options.type, this.blockSize = 8, this._init(), this.buffer = new Array(this.blockSize), this.bufferOff = 0, this.padding = s.padding !== !1;
  46769. }
  46770. C.exports = A, A.prototype._init = function() {
  46771. }, A.prototype.update = function(s) {
  46772. return s.length === 0 ? [] : this.type === "decrypt" ? this._updateDecrypt(s) : this._updateEncrypt(s);
  46773. }, A.prototype._buffer = function(s, l) {
  46774. for (var n = Math.min(this.buffer.length - this.bufferOff, s.length - l), a = 0; a < n; a++) this.buffer[this.bufferOff + a] = s[l + a];
  46775. return this.bufferOff += n, n;
  46776. }, A.prototype._flushBuffer = function(s, l) {
  46777. return this._update(this.buffer, 0, s, l), this.bufferOff = 0, this.blockSize;
  46778. }, A.prototype._updateEncrypt = function(s) {
  46779. var l = 0, n = 0, a = (this.bufferOff + s.length) / this.blockSize | 0, d = new Array(a * this.blockSize);
  46780. this.bufferOff !== 0 && (l += this._buffer(s, l), this.bufferOff === this.buffer.length && (n += this._flushBuffer(d, n)));
  46781. for (var o = s.length - (s.length - l) % this.blockSize; l < o; l += this.blockSize) this._update(s, l, d, n), n += this.blockSize;
  46782. for (; l < s.length; l++, this.bufferOff++) this.buffer[this.bufferOff] = s[l];
  46783. return d;
  46784. }, A.prototype._updateDecrypt = function(s) {
  46785. for (var l = 0, n = 0, a = Math.ceil((this.bufferOff + s.length) / this.blockSize) - 1, d = new Array(a * this.blockSize); a > 0; a--) l += this._buffer(s, l), n += this._flushBuffer(d, n);
  46786. return l += this._buffer(s, l), d;
  46787. }, A.prototype.final = function(s) {
  46788. var l, n;
  46789. return s && (l = this.update(s)), n = this.type === "encrypt" ? this._finalEncrypt() : this._finalDecrypt(), l ? l.concat(n) : n;
  46790. }, A.prototype._pad = function(s, l) {
  46791. if (l === 0) return !1;
  46792. for (; l < s.length; ) s[l++] = 0;
  46793. return !0;
  46794. }, A.prototype._finalEncrypt = function() {
  46795. if (!this._pad(this.buffer, this.bufferOff)) return [];
  46796. var s = new Array(this.blockSize);
  46797. return this._update(this.buffer, 0, s, 0), s;
  46798. }, A.prototype._unpad = function(s) {
  46799. return s;
  46800. }, A.prototype._finalDecrypt = function() {
  46801. e.equal(this.bufferOff, this.blockSize, "Not enough data to decrypt");
  46802. var s = new Array(this.blockSize);
  46803. return this._flushBuffer(s, 0), this._unpad(s);
  46804. };
  46805. }, { "minimalistic-assert": 453 }], 397: [function(g, C, i) {
  46806. var e = g("minimalistic-assert"), A = g("inherits"), s = g("./utils"), l = g("./cipher");
  46807. function n() {
  46808. this.tmp = new Array(2), this.keys = null;
  46809. }
  46810. function a(o) {
  46811. l.call(this, o);
  46812. var c = new n();
  46813. this._desState = c, this.deriveKeys(c, o.key);
  46814. }
  46815. A(a, l), C.exports = a, a.create = function(o) {
  46816. return new a(o);
  46817. };
  46818. var d = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1];
  46819. a.prototype.deriveKeys = function(o, c) {
  46820. o.keys = new Array(32), e.equal(c.length, this.blockSize, "Invalid key length");
  46821. var r = s.readUInt32BE(c, 0), h = s.readUInt32BE(c, 4);
  46822. s.pc1(r, h, o.tmp, 0), r = o.tmp[0], h = o.tmp[1];
  46823. for (var b = 0; b < o.keys.length; b += 2) {
  46824. var u = d[b >>> 1];
  46825. r = s.r28shl(r, u), h = s.r28shl(h, u), s.pc2(r, h, o.keys, b);
  46826. }
  46827. }, a.prototype._update = function(o, c, r, h) {
  46828. var b = this._desState, u = s.readUInt32BE(o, c), m = s.readUInt32BE(o, c + 4);
  46829. s.ip(u, m, b.tmp, 0), u = b.tmp[0], m = b.tmp[1], this.type === "encrypt" ? this._encrypt(b, u, m, b.tmp, 0) : this._decrypt(b, u, m, b.tmp, 0), u = b.tmp[0], m = b.tmp[1], s.writeUInt32BE(r, u, h), s.writeUInt32BE(r, m, h + 4);
  46830. }, a.prototype._pad = function(o, c) {
  46831. if (this.padding === !1) return !1;
  46832. for (var r = o.length - c, h = c; h < o.length; h++) o[h] = r;
  46833. return !0;
  46834. }, a.prototype._unpad = function(o) {
  46835. if (this.padding === !1) return o;
  46836. for (var c = o[o.length - 1], r = o.length - c; r < o.length; r++) e.equal(o[r], c);
  46837. return o.slice(0, o.length - c);
  46838. }, a.prototype._encrypt = function(o, c, r, h, b) {
  46839. for (var u = c, m = r, Z = 0; Z < o.keys.length; Z += 2) {
  46840. var p = o.keys[Z], Y = o.keys[Z + 1];
  46841. s.expand(m, o.tmp, 0), p ^= o.tmp[0], Y ^= o.tmp[1];
  46842. var R = s.substitute(p, Y), X = m;
  46843. m = (u ^ s.permute(R)) >>> 0, u = X;
  46844. }
  46845. s.rip(m, u, h, b);
  46846. }, a.prototype._decrypt = function(o, c, r, h, b) {
  46847. for (var u = r, m = c, Z = o.keys.length - 2; Z >= 0; Z -= 2) {
  46848. var p = o.keys[Z], Y = o.keys[Z + 1];
  46849. s.expand(u, o.tmp, 0), p ^= o.tmp[0], Y ^= o.tmp[1];
  46850. var R = s.substitute(p, Y), X = u;
  46851. u = (m ^ s.permute(R)) >>> 0, m = X;
  46852. }
  46853. s.rip(u, m, h, b);
  46854. };
  46855. }, { "./cipher": 396, "./utils": 399, inherits: 440, "minimalistic-assert": 453 }], 398: [function(g, C, i) {
  46856. var e = g("minimalistic-assert"), A = g("inherits"), s = g("./cipher"), l = g("./des");
  46857. function n(d, o) {
  46858. e.equal(o.length, 24, "Invalid key length");
  46859. var c = o.slice(0, 8), r = o.slice(8, 16), h = o.slice(16, 24);
  46860. this.ciphers = d === "encrypt" ? [l.create({ type: "encrypt", key: c }), l.create({ type: "decrypt", key: r }), l.create({ type: "encrypt", key: h })] : [l.create({ type: "decrypt", key: h }), l.create({ type: "encrypt", key: r }), l.create({ type: "decrypt", key: c })];
  46861. }
  46862. function a(d) {
  46863. s.call(this, d);
  46864. var o = new n(this.type, this.options.key);
  46865. this._edeState = o;
  46866. }
  46867. A(a, s), C.exports = a, a.create = function(d) {
  46868. return new a(d);
  46869. }, a.prototype._update = function(d, o, c, r) {
  46870. var h = this._edeState;
  46871. h.ciphers[0]._update(d, o, c, r), h.ciphers[1]._update(c, r, c, r), h.ciphers[2]._update(c, r, c, r);
  46872. }, a.prototype._pad = l.prototype._pad, a.prototype._unpad = l.prototype._unpad;
  46873. }, { "./cipher": 396, "./des": 397, inherits: 440, "minimalistic-assert": 453 }], 399: [function(g, C, i) {
  46874. i.readUInt32BE = function(l, n) {
  46875. return (l[0 + n] << 24 | l[1 + n] << 16 | l[2 + n] << 8 | l[3 + n]) >>> 0;
  46876. }, i.writeUInt32BE = function(l, n, a) {
  46877. l[0 + a] = n >>> 24, l[1 + a] = n >>> 16 & 255, l[2 + a] = n >>> 8 & 255, l[3 + a] = 255 & n;
  46878. }, i.ip = function(l, n, a, d) {
  46879. for (var o = 0, c = 0, r = 6; r >= 0; r -= 2) {
  46880. for (var h = 0; h <= 24; h += 8) o <<= 1, o |= n >>> h + r & 1;
  46881. for (h = 0; h <= 24; h += 8) o <<= 1, o |= l >>> h + r & 1;
  46882. }
  46883. for (r = 6; r >= 0; r -= 2) {
  46884. for (h = 1; h <= 25; h += 8) c <<= 1, c |= n >>> h + r & 1;
  46885. for (h = 1; h <= 25; h += 8) c <<= 1, c |= l >>> h + r & 1;
  46886. }
  46887. a[d + 0] = o >>> 0, a[d + 1] = c >>> 0;
  46888. }, i.rip = function(l, n, a, d) {
  46889. for (var o = 0, c = 0, r = 0; r < 4; r++) for (var h = 24; h >= 0; h -= 8) o <<= 1, o |= n >>> h + r & 1, o <<= 1, o |= l >>> h + r & 1;
  46890. for (r = 4; r < 8; r++) for (h = 24; h >= 0; h -= 8) c <<= 1, c |= n >>> h + r & 1, c <<= 1, c |= l >>> h + r & 1;
  46891. a[d + 0] = o >>> 0, a[d + 1] = c >>> 0;
  46892. }, i.pc1 = function(l, n, a, d) {
  46893. for (var o = 0, c = 0, r = 7; r >= 5; r--) {
  46894. for (var h = 0; h <= 24; h += 8) o <<= 1, o |= n >> h + r & 1;
  46895. for (h = 0; h <= 24; h += 8) o <<= 1, o |= l >> h + r & 1;
  46896. }
  46897. for (h = 0; h <= 24; h += 8) o <<= 1, o |= n >> h + r & 1;
  46898. for (r = 1; r <= 3; r++) {
  46899. for (h = 0; h <= 24; h += 8) c <<= 1, c |= n >> h + r & 1;
  46900. for (h = 0; h <= 24; h += 8) c <<= 1, c |= l >> h + r & 1;
  46901. }
  46902. for (h = 0; h <= 24; h += 8) c <<= 1, c |= l >> h + r & 1;
  46903. a[d + 0] = o >>> 0, a[d + 1] = c >>> 0;
  46904. }, i.r28shl = function(l, n) {
  46905. return l << n & 268435455 | l >>> 28 - n;
  46906. };
  46907. var e = [14, 11, 17, 4, 27, 23, 25, 0, 13, 22, 7, 18, 5, 9, 16, 24, 2, 20, 12, 21, 1, 8, 15, 26, 15, 4, 25, 19, 9, 1, 26, 16, 5, 11, 23, 8, 12, 7, 17, 0, 22, 3, 10, 14, 6, 20, 27, 24];
  46908. i.pc2 = function(l, n, a, d) {
  46909. for (var o = 0, c = 0, r = e.length >>> 1, h = 0; h < r; h++) o <<= 1, o |= l >>> e[h] & 1;
  46910. for (h = r; h < e.length; h++) c <<= 1, c |= n >>> e[h] & 1;
  46911. a[d + 0] = o >>> 0, a[d + 1] = c >>> 0;
  46912. }, i.expand = function(l, n, a) {
  46913. var d = 0, o = 0;
  46914. d = (1 & l) << 5 | l >>> 27;
  46915. for (var c = 23; c >= 15; c -= 4) d <<= 6, d |= l >>> c & 63;
  46916. for (c = 11; c >= 3; c -= 4) o |= l >>> c & 63, o <<= 6;
  46917. o |= (31 & l) << 1 | l >>> 31, n[a + 0] = d >>> 0, n[a + 1] = o >>> 0;
  46918. };
  46919. var A = [14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1, 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8, 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7, 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13, 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14, 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5, 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2, 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9, 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10, 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1, 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7, 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12, 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3, 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9, 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8, 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14, 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1, 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6, 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13, 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3, 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5, 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8, 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10, 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13, 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10, 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6, 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7, 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12, 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4, 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2, 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13, 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11];
  46920. i.substitute = function(l, n) {
  46921. for (var a = 0, d = 0; d < 4; d++)
  46922. a <<= 4, a |= A[64 * d + (l >>> 18 - 6 * d & 63)];
  46923. for (d = 0; d < 4; d++)
  46924. a <<= 4, a |= A[256 + 64 * d + (n >>> 18 - 6 * d & 63)];
  46925. return a >>> 0;
  46926. };
  46927. var s = [16, 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22, 30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7];
  46928. i.permute = function(l) {
  46929. for (var n = 0, a = 0; a < s.length; a++) n <<= 1, n |= l >>> s[a] & 1;
  46930. return n >>> 0;
  46931. }, i.padSplit = function(l, n, a) {
  46932. for (var d = l.toString(2); d.length < n; ) d = "0" + d;
  46933. for (var o = [], c = 0; c < n; c += a) o.push(d.slice(c, c + a));
  46934. return o.join(" ");
  46935. };
  46936. }, {}], 400: [function(g, C, i) {
  46937. (function(e) {
  46938. (function() {
  46939. var A = g("./lib/generatePrime"), s = g("./lib/primes.json"), l = g("./lib/dh"), n = { binary: !0, hex: !0, base64: !0 };
  46940. i.DiffieHellmanGroup = i.createDiffieHellmanGroup = i.getDiffieHellman = function(a) {
  46941. var d = new e(s[a].prime, "hex"), o = new e(s[a].gen, "hex");
  46942. return new l(d, o);
  46943. }, i.createDiffieHellman = i.DiffieHellman = function a(d, o, c, r) {
  46944. return e.isBuffer(o) || n[o] === void 0 ? a(d, "binary", o, c) : (o = o || "binary", r = r || "binary", c = c || new e([2]), e.isBuffer(c) || (c = new e(c, r)), typeof d == "number" ? new l(A(d, c), c, !0) : (e.isBuffer(d) || (d = new e(d, o)), new l(d, c, !0)));
  46945. };
  46946. }).call(this);
  46947. }).call(this, g("buffer").Buffer);
  46948. }, { "./lib/dh": 401, "./lib/generatePrime": 402, "./lib/primes.json": 403, buffer: 220 }], 401: [function(g, C, i) {
  46949. (function(e) {
  46950. (function() {
  46951. var A = g("bn.js"), s = new (g("miller-rabin"))(), l = new A(24), n = new A(11), a = new A(10), d = new A(3), o = new A(7), c = g("./generatePrime"), r = g("randombytes");
  46952. function h(p, Y) {
  46953. return Y = Y || "utf8", e.isBuffer(p) || (p = new e(p, Y)), this._pub = new A(p), this;
  46954. }
  46955. function b(p, Y) {
  46956. return Y = Y || "utf8", e.isBuffer(p) || (p = new e(p, Y)), this._priv = new A(p), this;
  46957. }
  46958. C.exports = m;
  46959. var u = {};
  46960. function m(p, Y, R) {
  46961. this.setGenerator(Y), this.__prime = new A(p), this._prime = A.mont(this.__prime), this._primeLen = p.length, this._pub = void 0, this._priv = void 0, this._primeCode = void 0, R ? (this.setPublicKey = h, this.setPrivateKey = b) : this._primeCode = 8;
  46962. }
  46963. function Z(p, Y) {
  46964. var R = new e(p.toArray());
  46965. return Y ? R.toString(Y) : R;
  46966. }
  46967. Object.defineProperty(m.prototype, "verifyError", { enumerable: !0, get: function() {
  46968. return typeof this._primeCode != "number" && (this._primeCode = function(p, Y) {
  46969. var R = Y.toString("hex"), X = [R, p.toString(16)].join("_");
  46970. if (X in u) return u[X];
  46971. var H, S = 0;
  46972. if (p.isEven() || !c.simpleSieve || !c.fermatTest(p) || !s.test(p)) return S += 1, S += R === "02" || R === "05" ? 8 : 4, u[X] = S, S;
  46973. switch (s.test(p.shrn(1)) || (S += 2), R) {
  46974. case "02":
  46975. p.mod(l).cmp(n) && (S += 8);
  46976. break;
  46977. case "05":
  46978. (H = p.mod(a)).cmp(d) && H.cmp(o) && (S += 8);
  46979. break;
  46980. default:
  46981. S += 4;
  46982. }
  46983. return u[X] = S, S;
  46984. }(this.__prime, this.__gen)), this._primeCode;
  46985. } }), m.prototype.generateKeys = function() {
  46986. return this._priv || (this._priv = new A(r(this._primeLen))), this._pub = this._gen.toRed(this._prime).redPow(this._priv).fromRed(), this.getPublicKey();
  46987. }, m.prototype.computeSecret = function(p) {
  46988. var Y = (p = (p = new A(p)).toRed(this._prime)).redPow(this._priv).fromRed(), R = new e(Y.toArray()), X = this.getPrime();
  46989. if (R.length < X.length) {
  46990. var H = new e(X.length - R.length);
  46991. H.fill(0), R = e.concat([H, R]);
  46992. }
  46993. return R;
  46994. }, m.prototype.getPublicKey = function(p) {
  46995. return Z(this._pub, p);
  46996. }, m.prototype.getPrivateKey = function(p) {
  46997. return Z(this._priv, p);
  46998. }, m.prototype.getPrime = function(p) {
  46999. return Z(this.__prime, p);
  47000. }, m.prototype.getGenerator = function(p) {
  47001. return Z(this._gen, p);
  47002. }, m.prototype.setGenerator = function(p, Y) {
  47003. return Y = Y || "utf8", e.isBuffer(p) || (p = new e(p, Y)), this.__gen = p, this._gen = new A(p), this;
  47004. };
  47005. }).call(this);
  47006. }).call(this, g("buffer").Buffer);
  47007. }, { "./generatePrime": 402, "bn.js": 404, buffer: 220, "miller-rabin": 451, randombytes: 475 }], 402: [function(g, C, i) {
  47008. var e = g("randombytes");
  47009. C.exports = p, p.simpleSieve = m, p.fermatTest = Z;
  47010. var A = g("bn.js"), s = new A(24), l = new (g("miller-rabin"))(), n = new A(1), a = new A(2), d = new A(5), o = (new A(16), new A(8), new A(10)), c = new A(3), r = (new A(7), new A(11)), h = new A(4), b = (new A(12), null);
  47011. function u() {
  47012. if (b !== null) return b;
  47013. var Y = [];
  47014. Y[0] = 2;
  47015. for (var R = 1, X = 3; X < 1048576; X += 2) {
  47016. for (var H = Math.ceil(Math.sqrt(X)), S = 0; S < R && Y[S] <= H && X % Y[S] != 0; S++) ;
  47017. R !== S && Y[S] <= H || (Y[R++] = X);
  47018. }
  47019. return b = Y, Y;
  47020. }
  47021. function m(Y) {
  47022. for (var R = u(), X = 0; X < R.length; X++) if (Y.modn(R[X]) === 0) return Y.cmpn(R[X]) === 0;
  47023. return !0;
  47024. }
  47025. function Z(Y) {
  47026. var R = A.mont(Y);
  47027. return a.toRed(R).redPow(Y.subn(1)).fromRed().cmpn(1) === 0;
  47028. }
  47029. function p(Y, R) {
  47030. if (Y < 16) return new A(R === 2 || R === 5 ? [140, 123] : [140, 39]);
  47031. var X, H;
  47032. for (R = new A(R); ; ) {
  47033. for (X = new A(e(Math.ceil(Y / 8))); X.bitLength() > Y; ) X.ishrn(1);
  47034. if (X.isEven() && X.iadd(n), X.testn(1) || X.iadd(a), R.cmp(a)) {
  47035. if (!R.cmp(d)) for (; X.mod(o).cmp(c); ) X.iadd(h);
  47036. } else for (; X.mod(s).cmp(r); ) X.iadd(h);
  47037. if (m(H = X.shrn(1)) && m(X) && Z(H) && Z(X) && l.test(H) && l.test(X)) return X;
  47038. }
  47039. }
  47040. }, { "bn.js": 404, "miller-rabin": 451, randombytes: 475 }], 403: [function(g, C, i) {
  47041. C.exports = { modp1: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff" }, modp2: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff" }, modp5: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff" }, modp14: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff" }, modp15: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff" }, modp16: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff" }, modp17: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff" }, modp18: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff" } };
  47042. }, {}], 404: [function(g, C, i) {
  47043. arguments[4][184][0].apply(i, arguments);
  47044. }, { buffer: 188, dup: 184 }], 405: [function(g, C, i) {
  47045. var e = i;
  47046. e.version = g("../package.json").version, e.utils = g("./elliptic/utils"), e.rand = g("brorand"), e.curve = g("./elliptic/curve"), e.curves = g("./elliptic/curves"), e.ec = g("./elliptic/ec"), e.eddsa = g("./elliptic/eddsa");
  47047. }, { "../package.json": 421, "./elliptic/curve": 408, "./elliptic/curves": 411, "./elliptic/ec": 412, "./elliptic/eddsa": 415, "./elliptic/utils": 419, brorand: 187 }], 406: [function(g, C, i) {
  47048. var e = g("bn.js"), A = g("../utils"), s = A.getNAF, l = A.getJSF, n = A.assert;
  47049. function a(o, c) {
  47050. this.type = o, this.p = new e(c.p, 16), this.red = c.prime ? e.red(c.prime) : e.mont(this.p), this.zero = new e(0).toRed(this.red), this.one = new e(1).toRed(this.red), this.two = new e(2).toRed(this.red), this.n = c.n && new e(c.n, 16), this.g = c.g && this.pointFromJSON(c.g, c.gRed), this._wnafT1 = new Array(4), this._wnafT2 = new Array(4), this._wnafT3 = new Array(4), this._wnafT4 = new Array(4), this._bitLength = this.n ? this.n.bitLength() : 0;
  47051. var r = this.n && this.p.div(this.n);
  47052. !r || r.cmpn(100) > 0 ? this.redN = null : (this._maxwellTrick = !0, this.redN = this.n.toRed(this.red));
  47053. }
  47054. function d(o, c) {
  47055. this.curve = o, this.type = c, this.precomputed = null;
  47056. }
  47057. C.exports = a, a.prototype.point = function() {
  47058. throw new Error("Not implemented");
  47059. }, a.prototype.validate = function() {
  47060. throw new Error("Not implemented");
  47061. }, a.prototype._fixedNafMul = function(o, c) {
  47062. n(o.precomputed);
  47063. var r = o._getDoubles(), h = s(c, 1, this._bitLength), b = (1 << r.step + 1) - (r.step % 2 == 0 ? 2 : 1);
  47064. b /= 3;
  47065. var u, m, Z = [];
  47066. for (u = 0; u < h.length; u += r.step) {
  47067. m = 0;
  47068. for (var p = u + r.step - 1; p >= u; p--) m = (m << 1) + h[p];
  47069. Z.push(m);
  47070. }
  47071. for (var Y = this.jpoint(null, null, null), R = this.jpoint(null, null, null), X = b; X > 0; X--) {
  47072. for (u = 0; u < Z.length; u++) (m = Z[u]) === X ? R = R.mixedAdd(r.points[u]) : m === -X && (R = R.mixedAdd(r.points[u].neg()));
  47073. Y = Y.add(R);
  47074. }
  47075. return Y.toP();
  47076. }, a.prototype._wnafMul = function(o, c) {
  47077. var r = 4, h = o._getNAFPoints(r);
  47078. r = h.wnd;
  47079. for (var b = h.points, u = s(c, r, this._bitLength), m = this.jpoint(null, null, null), Z = u.length - 1; Z >= 0; Z--) {
  47080. for (var p = 0; Z >= 0 && u[Z] === 0; Z--) p++;
  47081. if (Z >= 0 && p++, m = m.dblp(p), Z < 0) break;
  47082. var Y = u[Z];
  47083. n(Y !== 0), m = o.type === "affine" ? Y > 0 ? m.mixedAdd(b[Y - 1 >> 1]) : m.mixedAdd(b[-Y - 1 >> 1].neg()) : Y > 0 ? m.add(b[Y - 1 >> 1]) : m.add(b[-Y - 1 >> 1].neg());
  47084. }
  47085. return o.type === "affine" ? m.toP() : m;
  47086. }, a.prototype._wnafMulAdd = function(o, c, r, h, b) {
  47087. var u, m, Z, p = this._wnafT1, Y = this._wnafT2, R = this._wnafT3, X = 0;
  47088. for (u = 0; u < h; u++) {
  47089. var H = (Z = c[u])._getNAFPoints(o);
  47090. p[u] = H.wnd, Y[u] = H.points;
  47091. }
  47092. for (u = h - 1; u >= 1; u -= 2) {
  47093. var S = u - 1, z = u;
  47094. if (p[S] === 1 && p[z] === 1) {
  47095. var v = [c[S], null, null, c[z]];
  47096. c[S].y.cmp(c[z].y) === 0 ? (v[1] = c[S].add(c[z]), v[2] = c[S].toJ().mixedAdd(c[z].neg())) : c[S].y.cmp(c[z].y.redNeg()) === 0 ? (v[1] = c[S].toJ().mixedAdd(c[z]), v[2] = c[S].add(c[z].neg())) : (v[1] = c[S].toJ().mixedAdd(c[z]), v[2] = c[S].toJ().mixedAdd(c[z].neg()));
  47097. var K = [-3, -1, -5, -7, 0, 7, 5, 1, 3], V = l(r[S], r[z]);
  47098. for (X = Math.max(V[0].length, X), R[S] = new Array(X), R[z] = new Array(X), m = 0; m < X; m++) {
  47099. var N = 0 | V[0][m], B = 0 | V[1][m];
  47100. R[S][m] = K[3 * (N + 1) + (B + 1)], R[z][m] = 0, Y[S] = v;
  47101. }
  47102. } else R[S] = s(r[S], p[S], this._bitLength), R[z] = s(r[z], p[z], this._bitLength), X = Math.max(R[S].length, X), X = Math.max(R[z].length, X);
  47103. }
  47104. var G = this.jpoint(null, null, null), w = this._wnafT4;
  47105. for (u = X; u >= 0; u--) {
  47106. for (var W = 0; u >= 0; ) {
  47107. var y = !0;
  47108. for (m = 0; m < h; m++) w[m] = 0 | R[m][u], w[m] !== 0 && (y = !1);
  47109. if (!y) break;
  47110. W++, u--;
  47111. }
  47112. if (u >= 0 && W++, G = G.dblp(W), u < 0) break;
  47113. for (m = 0; m < h; m++) {
  47114. var f = w[m];
  47115. f !== 0 && (f > 0 ? Z = Y[m][f - 1 >> 1] : f < 0 && (Z = Y[m][-f - 1 >> 1].neg()), G = Z.type === "affine" ? G.mixedAdd(Z) : G.add(Z));
  47116. }
  47117. }
  47118. for (u = 0; u < h; u++) Y[u] = null;
  47119. return b ? G : G.toP();
  47120. }, a.BasePoint = d, d.prototype.eq = function() {
  47121. throw new Error("Not implemented");
  47122. }, d.prototype.validate = function() {
  47123. return this.curve.validate(this);
  47124. }, a.prototype.decodePoint = function(o, c) {
  47125. o = A.toArray(o, c);
  47126. var r = this.p.byteLength();
  47127. if ((o[0] === 4 || o[0] === 6 || o[0] === 7) && o.length - 1 == 2 * r) return o[0] === 6 ? n(o[o.length - 1] % 2 == 0) : o[0] === 7 && n(o[o.length - 1] % 2 == 1), this.point(o.slice(1, 1 + r), o.slice(1 + r, 1 + 2 * r));
  47128. if ((o[0] === 2 || o[0] === 3) && o.length - 1 === r) return this.pointFromX(o.slice(1, 1 + r), o[0] === 3);
  47129. throw new Error("Unknown point format");
  47130. }, d.prototype.encodeCompressed = function(o) {
  47131. return this.encode(o, !0);
  47132. }, d.prototype._encode = function(o) {
  47133. var c = this.curve.p.byteLength(), r = this.getX().toArray("be", c);
  47134. return o ? [this.getY().isEven() ? 2 : 3].concat(r) : [4].concat(r, this.getY().toArray("be", c));
  47135. }, d.prototype.encode = function(o, c) {
  47136. return A.encode(this._encode(c), o);
  47137. }, d.prototype.precompute = function(o) {
  47138. if (this.precomputed) return this;
  47139. var c = { doubles: null, naf: null, beta: null };
  47140. return c.naf = this._getNAFPoints(8), c.doubles = this._getDoubles(4, o), c.beta = this._getBeta(), this.precomputed = c, this;
  47141. }, d.prototype._hasDoubles = function(o) {
  47142. if (!this.precomputed) return !1;
  47143. var c = this.precomputed.doubles;
  47144. return !!c && c.points.length >= Math.ceil((o.bitLength() + 1) / c.step);
  47145. }, d.prototype._getDoubles = function(o, c) {
  47146. if (this.precomputed && this.precomputed.doubles) return this.precomputed.doubles;
  47147. for (var r = [this], h = this, b = 0; b < c; b += o) {
  47148. for (var u = 0; u < o; u++) h = h.dbl();
  47149. r.push(h);
  47150. }
  47151. return { step: o, points: r };
  47152. }, d.prototype._getNAFPoints = function(o) {
  47153. if (this.precomputed && this.precomputed.naf) return this.precomputed.naf;
  47154. for (var c = [this], r = (1 << o) - 1, h = r === 1 ? null : this.dbl(), b = 1; b < r; b++) c[b] = c[b - 1].add(h);
  47155. return { wnd: o, points: c };
  47156. }, d.prototype._getBeta = function() {
  47157. return null;
  47158. }, d.prototype.dblp = function(o) {
  47159. for (var c = this, r = 0; r < o; r++) c = c.dbl();
  47160. return c;
  47161. };
  47162. }, { "../utils": 419, "bn.js": 420 }], 407: [function(g, C, i) {
  47163. var e = g("../utils"), A = g("bn.js"), s = g("inherits"), l = g("./base"), n = e.assert;
  47164. function a(o) {
  47165. this.twisted = (0 | o.a) != 1, this.mOneA = this.twisted && (0 | o.a) == -1, this.extended = this.mOneA, l.call(this, "edwards", o), this.a = new A(o.a, 16).umod(this.red.m), this.a = this.a.toRed(this.red), this.c = new A(o.c, 16).toRed(this.red), this.c2 = this.c.redSqr(), this.d = new A(o.d, 16).toRed(this.red), this.dd = this.d.redAdd(this.d), n(!this.twisted || this.c.fromRed().cmpn(1) === 0), this.oneC = (0 | o.c) == 1;
  47166. }
  47167. function d(o, c, r, h, b) {
  47168. l.BasePoint.call(this, o, "projective"), c === null && r === null && h === null ? (this.x = this.curve.zero, this.y = this.curve.one, this.z = this.curve.one, this.t = this.curve.zero, this.zOne = !0) : (this.x = new A(c, 16), this.y = new A(r, 16), this.z = h ? new A(h, 16) : this.curve.one, this.t = b && new A(b, 16), this.x.red || (this.x = this.x.toRed(this.curve.red)), this.y.red || (this.y = this.y.toRed(this.curve.red)), this.z.red || (this.z = this.z.toRed(this.curve.red)), this.t && !this.t.red && (this.t = this.t.toRed(this.curve.red)), this.zOne = this.z === this.curve.one, this.curve.extended && !this.t && (this.t = this.x.redMul(this.y), this.zOne || (this.t = this.t.redMul(this.z.redInvm()))));
  47169. }
  47170. s(a, l), C.exports = a, a.prototype._mulA = function(o) {
  47171. return this.mOneA ? o.redNeg() : this.a.redMul(o);
  47172. }, a.prototype._mulC = function(o) {
  47173. return this.oneC ? o : this.c.redMul(o);
  47174. }, a.prototype.jpoint = function(o, c, r, h) {
  47175. return this.point(o, c, r, h);
  47176. }, a.prototype.pointFromX = function(o, c) {
  47177. (o = new A(o, 16)).red || (o = o.toRed(this.red));
  47178. var r = o.redSqr(), h = this.c2.redSub(this.a.redMul(r)), b = this.one.redSub(this.c2.redMul(this.d).redMul(r)), u = h.redMul(b.redInvm()), m = u.redSqrt();
  47179. if (m.redSqr().redSub(u).cmp(this.zero) !== 0) throw new Error("invalid point");
  47180. var Z = m.fromRed().isOdd();
  47181. return (c && !Z || !c && Z) && (m = m.redNeg()), this.point(o, m);
  47182. }, a.prototype.pointFromY = function(o, c) {
  47183. (o = new A(o, 16)).red || (o = o.toRed(this.red));
  47184. var r = o.redSqr(), h = r.redSub(this.c2), b = r.redMul(this.d).redMul(this.c2).redSub(this.a), u = h.redMul(b.redInvm());
  47185. if (u.cmp(this.zero) === 0) {
  47186. if (c) throw new Error("invalid point");
  47187. return this.point(this.zero, o);
  47188. }
  47189. var m = u.redSqrt();
  47190. if (m.redSqr().redSub(u).cmp(this.zero) !== 0) throw new Error("invalid point");
  47191. return m.fromRed().isOdd() !== c && (m = m.redNeg()), this.point(m, o);
  47192. }, a.prototype.validate = function(o) {
  47193. if (o.isInfinity()) return !0;
  47194. o.normalize();
  47195. var c = o.x.redSqr(), r = o.y.redSqr(), h = c.redMul(this.a).redAdd(r), b = this.c2.redMul(this.one.redAdd(this.d.redMul(c).redMul(r)));
  47196. return h.cmp(b) === 0;
  47197. }, s(d, l.BasePoint), a.prototype.pointFromJSON = function(o) {
  47198. return d.fromJSON(this, o);
  47199. }, a.prototype.point = function(o, c, r, h) {
  47200. return new d(this, o, c, r, h);
  47201. }, d.fromJSON = function(o, c) {
  47202. return new d(o, c[0], c[1], c[2]);
  47203. }, d.prototype.inspect = function() {
  47204. return this.isInfinity() ? "<EC Point Infinity>" : "<EC Point x: " + this.x.fromRed().toString(16, 2) + " y: " + this.y.fromRed().toString(16, 2) + " z: " + this.z.fromRed().toString(16, 2) + ">";
  47205. }, d.prototype.isInfinity = function() {
  47206. return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0);
  47207. }, d.prototype._extDbl = function() {
  47208. var o = this.x.redSqr(), c = this.y.redSqr(), r = this.z.redSqr();
  47209. r = r.redIAdd(r);
  47210. var h = this.curve._mulA(o), b = this.x.redAdd(this.y).redSqr().redISub(o).redISub(c), u = h.redAdd(c), m = u.redSub(r), Z = h.redSub(c), p = b.redMul(m), Y = u.redMul(Z), R = b.redMul(Z), X = m.redMul(u);
  47211. return this.curve.point(p, Y, X, R);
  47212. }, d.prototype._projDbl = function() {
  47213. var o, c, r, h, b, u, m = this.x.redAdd(this.y).redSqr(), Z = this.x.redSqr(), p = this.y.redSqr();
  47214. if (this.curve.twisted) {
  47215. var Y = (h = this.curve._mulA(Z)).redAdd(p);
  47216. this.zOne ? (o = m.redSub(Z).redSub(p).redMul(Y.redSub(this.curve.two)), c = Y.redMul(h.redSub(p)), r = Y.redSqr().redSub(Y).redSub(Y)) : (b = this.z.redSqr(), u = Y.redSub(b).redISub(b), o = m.redSub(Z).redISub(p).redMul(u), c = Y.redMul(h.redSub(p)), r = Y.redMul(u));
  47217. } else h = Z.redAdd(p), b = this.curve._mulC(this.z).redSqr(), u = h.redSub(b).redSub(b), o = this.curve._mulC(m.redISub(h)).redMul(u), c = this.curve._mulC(h).redMul(Z.redISub(p)), r = h.redMul(u);
  47218. return this.curve.point(o, c, r);
  47219. }, d.prototype.dbl = function() {
  47220. return this.isInfinity() ? this : this.curve.extended ? this._extDbl() : this._projDbl();
  47221. }, d.prototype._extAdd = function(o) {
  47222. var c = this.y.redSub(this.x).redMul(o.y.redSub(o.x)), r = this.y.redAdd(this.x).redMul(o.y.redAdd(o.x)), h = this.t.redMul(this.curve.dd).redMul(o.t), b = this.z.redMul(o.z.redAdd(o.z)), u = r.redSub(c), m = b.redSub(h), Z = b.redAdd(h), p = r.redAdd(c), Y = u.redMul(m), R = Z.redMul(p), X = u.redMul(p), H = m.redMul(Z);
  47223. return this.curve.point(Y, R, H, X);
  47224. }, d.prototype._projAdd = function(o) {
  47225. var c, r, h = this.z.redMul(o.z), b = h.redSqr(), u = this.x.redMul(o.x), m = this.y.redMul(o.y), Z = this.curve.d.redMul(u).redMul(m), p = b.redSub(Z), Y = b.redAdd(Z), R = this.x.redAdd(this.y).redMul(o.x.redAdd(o.y)).redISub(u).redISub(m), X = h.redMul(p).redMul(R);
  47226. return this.curve.twisted ? (c = h.redMul(Y).redMul(m.redSub(this.curve._mulA(u))), r = p.redMul(Y)) : (c = h.redMul(Y).redMul(m.redSub(u)), r = this.curve._mulC(p).redMul(Y)), this.curve.point(X, c, r);
  47227. }, d.prototype.add = function(o) {
  47228. return this.isInfinity() ? o : o.isInfinity() ? this : this.curve.extended ? this._extAdd(o) : this._projAdd(o);
  47229. }, d.prototype.mul = function(o) {
  47230. return this._hasDoubles(o) ? this.curve._fixedNafMul(this, o) : this.curve._wnafMul(this, o);
  47231. }, d.prototype.mulAdd = function(o, c, r) {
  47232. return this.curve._wnafMulAdd(1, [this, c], [o, r], 2, !1);
  47233. }, d.prototype.jmulAdd = function(o, c, r) {
  47234. return this.curve._wnafMulAdd(1, [this, c], [o, r], 2, !0);
  47235. }, d.prototype.normalize = function() {
  47236. if (this.zOne) return this;
  47237. var o = this.z.redInvm();
  47238. return this.x = this.x.redMul(o), this.y = this.y.redMul(o), this.t && (this.t = this.t.redMul(o)), this.z = this.curve.one, this.zOne = !0, this;
  47239. }, d.prototype.neg = function() {
  47240. return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg());
  47241. }, d.prototype.getX = function() {
  47242. return this.normalize(), this.x.fromRed();
  47243. }, d.prototype.getY = function() {
  47244. return this.normalize(), this.y.fromRed();
  47245. }, d.prototype.eq = function(o) {
  47246. return this === o || this.getX().cmp(o.getX()) === 0 && this.getY().cmp(o.getY()) === 0;
  47247. }, d.prototype.eqXToP = function(o) {
  47248. var c = o.toRed(this.curve.red).redMul(this.z);
  47249. if (this.x.cmp(c) === 0) return !0;
  47250. for (var r = o.clone(), h = this.curve.redN.redMul(this.z); ; ) {
  47251. if (r.iadd(this.curve.n), r.cmp(this.curve.p) >= 0) return !1;
  47252. if (c.redIAdd(h), this.x.cmp(c) === 0) return !0;
  47253. }
  47254. }, d.prototype.toP = d.prototype.normalize, d.prototype.mixedAdd = d.prototype.add;
  47255. }, { "../utils": 419, "./base": 406, "bn.js": 420, inherits: 440 }], 408: [function(g, C, i) {
  47256. var e = i;
  47257. e.base = g("./base"), e.short = g("./short"), e.mont = g("./mont"), e.edwards = g("./edwards");
  47258. }, { "./base": 406, "./edwards": 407, "./mont": 409, "./short": 410 }], 409: [function(g, C, i) {
  47259. var e = g("bn.js"), A = g("inherits"), s = g("./base"), l = g("../utils");
  47260. function n(d) {
  47261. s.call(this, "mont", d), this.a = new e(d.a, 16).toRed(this.red), this.b = new e(d.b, 16).toRed(this.red), this.i4 = new e(4).toRed(this.red).redInvm(), this.two = new e(2).toRed(this.red), this.a24 = this.i4.redMul(this.a.redAdd(this.two));
  47262. }
  47263. function a(d, o, c) {
  47264. s.BasePoint.call(this, d, "projective"), o === null && c === null ? (this.x = this.curve.one, this.z = this.curve.zero) : (this.x = new e(o, 16), this.z = new e(c, 16), this.x.red || (this.x = this.x.toRed(this.curve.red)), this.z.red || (this.z = this.z.toRed(this.curve.red)));
  47265. }
  47266. A(n, s), C.exports = n, n.prototype.validate = function(d) {
  47267. var o = d.normalize().x, c = o.redSqr(), r = c.redMul(o).redAdd(c.redMul(this.a)).redAdd(o);
  47268. return r.redSqrt().redSqr().cmp(r) === 0;
  47269. }, A(a, s.BasePoint), n.prototype.decodePoint = function(d, o) {
  47270. return this.point(l.toArray(d, o), 1);
  47271. }, n.prototype.point = function(d, o) {
  47272. return new a(this, d, o);
  47273. }, n.prototype.pointFromJSON = function(d) {
  47274. return a.fromJSON(this, d);
  47275. }, a.prototype.precompute = function() {
  47276. }, a.prototype._encode = function() {
  47277. return this.getX().toArray("be", this.curve.p.byteLength());
  47278. }, a.fromJSON = function(d, o) {
  47279. return new a(d, o[0], o[1] || d.one);
  47280. }, a.prototype.inspect = function() {
  47281. return this.isInfinity() ? "<EC Point Infinity>" : "<EC Point x: " + this.x.fromRed().toString(16, 2) + " z: " + this.z.fromRed().toString(16, 2) + ">";
  47282. }, a.prototype.isInfinity = function() {
  47283. return this.z.cmpn(0) === 0;
  47284. }, a.prototype.dbl = function() {
  47285. var d = this.x.redAdd(this.z).redSqr(), o = this.x.redSub(this.z).redSqr(), c = d.redSub(o), r = d.redMul(o), h = c.redMul(o.redAdd(this.curve.a24.redMul(c)));
  47286. return this.curve.point(r, h);
  47287. }, a.prototype.add = function() {
  47288. throw new Error("Not supported on Montgomery curve");
  47289. }, a.prototype.diffAdd = function(d, o) {
  47290. var c = this.x.redAdd(this.z), r = this.x.redSub(this.z), h = d.x.redAdd(d.z), b = d.x.redSub(d.z).redMul(c), u = h.redMul(r), m = o.z.redMul(b.redAdd(u).redSqr()), Z = o.x.redMul(b.redISub(u).redSqr());
  47291. return this.curve.point(m, Z);
  47292. }, a.prototype.mul = function(d) {
  47293. for (var o = d.clone(), c = this, r = this.curve.point(null, null), h = []; o.cmpn(0) !== 0; o.iushrn(1)) h.push(o.andln(1));
  47294. for (var b = h.length - 1; b >= 0; b--) h[b] === 0 ? (c = c.diffAdd(r, this), r = r.dbl()) : (r = c.diffAdd(r, this), c = c.dbl());
  47295. return r;
  47296. }, a.prototype.mulAdd = function() {
  47297. throw new Error("Not supported on Montgomery curve");
  47298. }, a.prototype.jumlAdd = function() {
  47299. throw new Error("Not supported on Montgomery curve");
  47300. }, a.prototype.eq = function(d) {
  47301. return this.getX().cmp(d.getX()) === 0;
  47302. }, a.prototype.normalize = function() {
  47303. return this.x = this.x.redMul(this.z.redInvm()), this.z = this.curve.one, this;
  47304. }, a.prototype.getX = function() {
  47305. return this.normalize(), this.x.fromRed();
  47306. };
  47307. }, { "../utils": 419, "./base": 406, "bn.js": 420, inherits: 440 }], 410: [function(g, C, i) {
  47308. var e = g("../utils"), A = g("bn.js"), s = g("inherits"), l = g("./base"), n = e.assert;
  47309. function a(c) {
  47310. l.call(this, "short", c), this.a = new A(c.a, 16).toRed(this.red), this.b = new A(c.b, 16).toRed(this.red), this.tinv = this.two.redInvm(), this.zeroA = this.a.fromRed().cmpn(0) === 0, this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0, this.endo = this._getEndomorphism(c), this._endoWnafT1 = new Array(4), this._endoWnafT2 = new Array(4);
  47311. }
  47312. function d(c, r, h, b) {
  47313. l.BasePoint.call(this, c, "affine"), r === null && h === null ? (this.x = null, this.y = null, this.inf = !0) : (this.x = new A(r, 16), this.y = new A(h, 16), b && (this.x.forceRed(this.curve.red), this.y.forceRed(this.curve.red)), this.x.red || (this.x = this.x.toRed(this.curve.red)), this.y.red || (this.y = this.y.toRed(this.curve.red)), this.inf = !1);
  47314. }
  47315. function o(c, r, h, b) {
  47316. l.BasePoint.call(this, c, "jacobian"), r === null && h === null && b === null ? (this.x = this.curve.one, this.y = this.curve.one, this.z = new A(0)) : (this.x = new A(r, 16), this.y = new A(h, 16), this.z = new A(b, 16)), this.x.red || (this.x = this.x.toRed(this.curve.red)), this.y.red || (this.y = this.y.toRed(this.curve.red)), this.z.red || (this.z = this.z.toRed(this.curve.red)), this.zOne = this.z === this.curve.one;
  47317. }
  47318. s(a, l), C.exports = a, a.prototype._getEndomorphism = function(c) {
  47319. if (this.zeroA && this.g && this.n && this.p.modn(3) === 1) {
  47320. var r, h;
  47321. if (c.beta) r = new A(c.beta, 16).toRed(this.red);
  47322. else {
  47323. var b = this._getEndoRoots(this.p);
  47324. r = (r = b[0].cmp(b[1]) < 0 ? b[0] : b[1]).toRed(this.red);
  47325. }
  47326. if (c.lambda) h = new A(c.lambda, 16);
  47327. else {
  47328. var u = this._getEndoRoots(this.n);
  47329. this.g.mul(u[0]).x.cmp(this.g.x.redMul(r)) === 0 ? h = u[0] : (h = u[1], n(this.g.mul(h).x.cmp(this.g.x.redMul(r)) === 0));
  47330. }
  47331. return { beta: r, lambda: h, basis: c.basis ? c.basis.map(function(m) {
  47332. return { a: new A(m.a, 16), b: new A(m.b, 16) };
  47333. }) : this._getEndoBasis(h) };
  47334. }
  47335. }, a.prototype._getEndoRoots = function(c) {
  47336. var r = c === this.p ? this.red : A.mont(c), h = new A(2).toRed(r).redInvm(), b = h.redNeg(), u = new A(3).toRed(r).redNeg().redSqrt().redMul(h);
  47337. return [b.redAdd(u).fromRed(), b.redSub(u).fromRed()];
  47338. }, a.prototype._getEndoBasis = function(c) {
  47339. for (var r, h, b, u, m, Z, p, Y, R, X = this.n.ushrn(Math.floor(this.n.bitLength() / 2)), H = c, S = this.n.clone(), z = new A(1), v = new A(0), K = new A(0), V = new A(1), N = 0; H.cmpn(0) !== 0; ) {
  47340. var B = S.div(H);
  47341. Y = S.sub(B.mul(H)), R = K.sub(B.mul(z));
  47342. var G = V.sub(B.mul(v));
  47343. if (!b && Y.cmp(X) < 0) r = p.neg(), h = z, b = Y.neg(), u = R;
  47344. else if (b && ++N == 2) break;
  47345. p = Y, S = H, H = Y, K = z, z = R, V = v, v = G;
  47346. }
  47347. m = Y.neg(), Z = R;
  47348. var w = b.sqr().add(u.sqr());
  47349. return m.sqr().add(Z.sqr()).cmp(w) >= 0 && (m = r, Z = h), b.negative && (b = b.neg(), u = u.neg()), m.negative && (m = m.neg(), Z = Z.neg()), [{ a: b, b: u }, { a: m, b: Z }];
  47350. }, a.prototype._endoSplit = function(c) {
  47351. var r = this.endo.basis, h = r[0], b = r[1], u = b.b.mul(c).divRound(this.n), m = h.b.neg().mul(c).divRound(this.n), Z = u.mul(h.a), p = m.mul(b.a), Y = u.mul(h.b), R = m.mul(b.b);
  47352. return { k1: c.sub(Z).sub(p), k2: Y.add(R).neg() };
  47353. }, a.prototype.pointFromX = function(c, r) {
  47354. (c = new A(c, 16)).red || (c = c.toRed(this.red));
  47355. var h = c.redSqr().redMul(c).redIAdd(c.redMul(this.a)).redIAdd(this.b), b = h.redSqrt();
  47356. if (b.redSqr().redSub(h).cmp(this.zero) !== 0) throw new Error("invalid point");
  47357. var u = b.fromRed().isOdd();
  47358. return (r && !u || !r && u) && (b = b.redNeg()), this.point(c, b);
  47359. }, a.prototype.validate = function(c) {
  47360. if (c.inf) return !0;
  47361. var r = c.x, h = c.y, b = this.a.redMul(r), u = r.redSqr().redMul(r).redIAdd(b).redIAdd(this.b);
  47362. return h.redSqr().redISub(u).cmpn(0) === 0;
  47363. }, a.prototype._endoWnafMulAdd = function(c, r, h) {
  47364. for (var b = this._endoWnafT1, u = this._endoWnafT2, m = 0; m < c.length; m++) {
  47365. var Z = this._endoSplit(r[m]), p = c[m], Y = p._getBeta();
  47366. Z.k1.negative && (Z.k1.ineg(), p = p.neg(!0)), Z.k2.negative && (Z.k2.ineg(), Y = Y.neg(!0)), b[2 * m] = p, b[2 * m + 1] = Y, u[2 * m] = Z.k1, u[2 * m + 1] = Z.k2;
  47367. }
  47368. for (var R = this._wnafMulAdd(1, b, u, 2 * m, h), X = 0; X < 2 * m; X++) b[X] = null, u[X] = null;
  47369. return R;
  47370. }, s(d, l.BasePoint), a.prototype.point = function(c, r, h) {
  47371. return new d(this, c, r, h);
  47372. }, a.prototype.pointFromJSON = function(c, r) {
  47373. return d.fromJSON(this, c, r);
  47374. }, d.prototype._getBeta = function() {
  47375. if (this.curve.endo) {
  47376. var c = this.precomputed;
  47377. if (c && c.beta) return c.beta;
  47378. var r = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);
  47379. if (c) {
  47380. var h = this.curve, b = function(u) {
  47381. return h.point(u.x.redMul(h.endo.beta), u.y);
  47382. };
  47383. c.beta = r, r.precomputed = { beta: null, naf: c.naf && { wnd: c.naf.wnd, points: c.naf.points.map(b) }, doubles: c.doubles && { step: c.doubles.step, points: c.doubles.points.map(b) } };
  47384. }
  47385. return r;
  47386. }
  47387. }, d.prototype.toJSON = function() {
  47388. return this.precomputed ? [this.x, this.y, this.precomputed && { doubles: this.precomputed.doubles && { step: this.precomputed.doubles.step, points: this.precomputed.doubles.points.slice(1) }, naf: this.precomputed.naf && { wnd: this.precomputed.naf.wnd, points: this.precomputed.naf.points.slice(1) } }] : [this.x, this.y];
  47389. }, d.fromJSON = function(c, r, h) {
  47390. typeof r == "string" && (r = JSON.parse(r));
  47391. var b = c.point(r[0], r[1], h);
  47392. if (!r[2]) return b;
  47393. function u(Z) {
  47394. return c.point(Z[0], Z[1], h);
  47395. }
  47396. var m = r[2];
  47397. return b.precomputed = { beta: null, doubles: m.doubles && { step: m.doubles.step, points: [b].concat(m.doubles.points.map(u)) }, naf: m.naf && { wnd: m.naf.wnd, points: [b].concat(m.naf.points.map(u)) } }, b;
  47398. }, d.prototype.inspect = function() {
  47399. return this.isInfinity() ? "<EC Point Infinity>" : "<EC Point x: " + this.x.fromRed().toString(16, 2) + " y: " + this.y.fromRed().toString(16, 2) + ">";
  47400. }, d.prototype.isInfinity = function() {
  47401. return this.inf;
  47402. }, d.prototype.add = function(c) {
  47403. if (this.inf) return c;
  47404. if (c.inf) return this;
  47405. if (this.eq(c)) return this.dbl();
  47406. if (this.neg().eq(c)) return this.curve.point(null, null);
  47407. if (this.x.cmp(c.x) === 0) return this.curve.point(null, null);
  47408. var r = this.y.redSub(c.y);
  47409. r.cmpn(0) !== 0 && (r = r.redMul(this.x.redSub(c.x).redInvm()));
  47410. var h = r.redSqr().redISub(this.x).redISub(c.x), b = r.redMul(this.x.redSub(h)).redISub(this.y);
  47411. return this.curve.point(h, b);
  47412. }, d.prototype.dbl = function() {
  47413. if (this.inf) return this;
  47414. var c = this.y.redAdd(this.y);
  47415. if (c.cmpn(0) === 0) return this.curve.point(null, null);
  47416. var r = this.curve.a, h = this.x.redSqr(), b = c.redInvm(), u = h.redAdd(h).redIAdd(h).redIAdd(r).redMul(b), m = u.redSqr().redISub(this.x.redAdd(this.x)), Z = u.redMul(this.x.redSub(m)).redISub(this.y);
  47417. return this.curve.point(m, Z);
  47418. }, d.prototype.getX = function() {
  47419. return this.x.fromRed();
  47420. }, d.prototype.getY = function() {
  47421. return this.y.fromRed();
  47422. }, d.prototype.mul = function(c) {
  47423. return c = new A(c, 16), this.isInfinity() ? this : this._hasDoubles(c) ? this.curve._fixedNafMul(this, c) : this.curve.endo ? this.curve._endoWnafMulAdd([this], [c]) : this.curve._wnafMul(this, c);
  47424. }, d.prototype.mulAdd = function(c, r, h) {
  47425. var b = [this, r], u = [c, h];
  47426. return this.curve.endo ? this.curve._endoWnafMulAdd(b, u) : this.curve._wnafMulAdd(1, b, u, 2);
  47427. }, d.prototype.jmulAdd = function(c, r, h) {
  47428. var b = [this, r], u = [c, h];
  47429. return this.curve.endo ? this.curve._endoWnafMulAdd(b, u, !0) : this.curve._wnafMulAdd(1, b, u, 2, !0);
  47430. }, d.prototype.eq = function(c) {
  47431. return this === c || this.inf === c.inf && (this.inf || this.x.cmp(c.x) === 0 && this.y.cmp(c.y) === 0);
  47432. }, d.prototype.neg = function(c) {
  47433. if (this.inf) return this;
  47434. var r = this.curve.point(this.x, this.y.redNeg());
  47435. if (c && this.precomputed) {
  47436. var h = this.precomputed, b = function(u) {
  47437. return u.neg();
  47438. };
  47439. r.precomputed = { naf: h.naf && { wnd: h.naf.wnd, points: h.naf.points.map(b) }, doubles: h.doubles && { step: h.doubles.step, points: h.doubles.points.map(b) } };
  47440. }
  47441. return r;
  47442. }, d.prototype.toJ = function() {
  47443. return this.inf ? this.curve.jpoint(null, null, null) : this.curve.jpoint(this.x, this.y, this.curve.one);
  47444. }, s(o, l.BasePoint), a.prototype.jpoint = function(c, r, h) {
  47445. return new o(this, c, r, h);
  47446. }, o.prototype.toP = function() {
  47447. if (this.isInfinity()) return this.curve.point(null, null);
  47448. var c = this.z.redInvm(), r = c.redSqr(), h = this.x.redMul(r), b = this.y.redMul(r).redMul(c);
  47449. return this.curve.point(h, b);
  47450. }, o.prototype.neg = function() {
  47451. return this.curve.jpoint(this.x, this.y.redNeg(), this.z);
  47452. }, o.prototype.add = function(c) {
  47453. if (this.isInfinity()) return c;
  47454. if (c.isInfinity()) return this;
  47455. var r = c.z.redSqr(), h = this.z.redSqr(), b = this.x.redMul(r), u = c.x.redMul(h), m = this.y.redMul(r.redMul(c.z)), Z = c.y.redMul(h.redMul(this.z)), p = b.redSub(u), Y = m.redSub(Z);
  47456. if (p.cmpn(0) === 0) return Y.cmpn(0) !== 0 ? this.curve.jpoint(null, null, null) : this.dbl();
  47457. var R = p.redSqr(), X = R.redMul(p), H = b.redMul(R), S = Y.redSqr().redIAdd(X).redISub(H).redISub(H), z = Y.redMul(H.redISub(S)).redISub(m.redMul(X)), v = this.z.redMul(c.z).redMul(p);
  47458. return this.curve.jpoint(S, z, v);
  47459. }, o.prototype.mixedAdd = function(c) {
  47460. if (this.isInfinity()) return c.toJ();
  47461. if (c.isInfinity()) return this;
  47462. var r = this.z.redSqr(), h = this.x, b = c.x.redMul(r), u = this.y, m = c.y.redMul(r).redMul(this.z), Z = h.redSub(b), p = u.redSub(m);
  47463. if (Z.cmpn(0) === 0) return p.cmpn(0) !== 0 ? this.curve.jpoint(null, null, null) : this.dbl();
  47464. var Y = Z.redSqr(), R = Y.redMul(Z), X = h.redMul(Y), H = p.redSqr().redIAdd(R).redISub(X).redISub(X), S = p.redMul(X.redISub(H)).redISub(u.redMul(R)), z = this.z.redMul(Z);
  47465. return this.curve.jpoint(H, S, z);
  47466. }, o.prototype.dblp = function(c) {
  47467. if (c === 0) return this;
  47468. if (this.isInfinity()) return this;
  47469. if (!c) return this.dbl();
  47470. var r;
  47471. if (this.curve.zeroA || this.curve.threeA) {
  47472. var h = this;
  47473. for (r = 0; r < c; r++) h = h.dbl();
  47474. return h;
  47475. }
  47476. var b = this.curve.a, u = this.curve.tinv, m = this.x, Z = this.y, p = this.z, Y = p.redSqr().redSqr(), R = Z.redAdd(Z);
  47477. for (r = 0; r < c; r++) {
  47478. var X = m.redSqr(), H = R.redSqr(), S = H.redSqr(), z = X.redAdd(X).redIAdd(X).redIAdd(b.redMul(Y)), v = m.redMul(H), K = z.redSqr().redISub(v.redAdd(v)), V = v.redISub(K), N = z.redMul(V);
  47479. N = N.redIAdd(N).redISub(S);
  47480. var B = R.redMul(p);
  47481. r + 1 < c && (Y = Y.redMul(S)), m = K, p = B, R = N;
  47482. }
  47483. return this.curve.jpoint(m, R.redMul(u), p);
  47484. }, o.prototype.dbl = function() {
  47485. return this.isInfinity() ? this : this.curve.zeroA ? this._zeroDbl() : this.curve.threeA ? this._threeDbl() : this._dbl();
  47486. }, o.prototype._zeroDbl = function() {
  47487. var c, r, h;
  47488. if (this.zOne) {
  47489. var b = this.x.redSqr(), u = this.y.redSqr(), m = u.redSqr(), Z = this.x.redAdd(u).redSqr().redISub(b).redISub(m);
  47490. Z = Z.redIAdd(Z);
  47491. var p = b.redAdd(b).redIAdd(b), Y = p.redSqr().redISub(Z).redISub(Z), R = m.redIAdd(m);
  47492. R = (R = R.redIAdd(R)).redIAdd(R), c = Y, r = p.redMul(Z.redISub(Y)).redISub(R), h = this.y.redAdd(this.y);
  47493. } else {
  47494. var X = this.x.redSqr(), H = this.y.redSqr(), S = H.redSqr(), z = this.x.redAdd(H).redSqr().redISub(X).redISub(S);
  47495. z = z.redIAdd(z);
  47496. var v = X.redAdd(X).redIAdd(X), K = v.redSqr(), V = S.redIAdd(S);
  47497. V = (V = V.redIAdd(V)).redIAdd(V), c = K.redISub(z).redISub(z), r = v.redMul(z.redISub(c)).redISub(V), h = (h = this.y.redMul(this.z)).redIAdd(h);
  47498. }
  47499. return this.curve.jpoint(c, r, h);
  47500. }, o.prototype._threeDbl = function() {
  47501. var c, r, h;
  47502. if (this.zOne) {
  47503. var b = this.x.redSqr(), u = this.y.redSqr(), m = u.redSqr(), Z = this.x.redAdd(u).redSqr().redISub(b).redISub(m);
  47504. Z = Z.redIAdd(Z);
  47505. var p = b.redAdd(b).redIAdd(b).redIAdd(this.curve.a), Y = p.redSqr().redISub(Z).redISub(Z);
  47506. c = Y;
  47507. var R = m.redIAdd(m);
  47508. R = (R = R.redIAdd(R)).redIAdd(R), r = p.redMul(Z.redISub(Y)).redISub(R), h = this.y.redAdd(this.y);
  47509. } else {
  47510. var X = this.z.redSqr(), H = this.y.redSqr(), S = this.x.redMul(H), z = this.x.redSub(X).redMul(this.x.redAdd(X));
  47511. z = z.redAdd(z).redIAdd(z);
  47512. var v = S.redIAdd(S), K = (v = v.redIAdd(v)).redAdd(v);
  47513. c = z.redSqr().redISub(K), h = this.y.redAdd(this.z).redSqr().redISub(H).redISub(X);
  47514. var V = H.redSqr();
  47515. V = (V = (V = V.redIAdd(V)).redIAdd(V)).redIAdd(V), r = z.redMul(v.redISub(c)).redISub(V);
  47516. }
  47517. return this.curve.jpoint(c, r, h);
  47518. }, o.prototype._dbl = function() {
  47519. var c = this.curve.a, r = this.x, h = this.y, b = this.z, u = b.redSqr().redSqr(), m = r.redSqr(), Z = h.redSqr(), p = m.redAdd(m).redIAdd(m).redIAdd(c.redMul(u)), Y = r.redAdd(r), R = (Y = Y.redIAdd(Y)).redMul(Z), X = p.redSqr().redISub(R.redAdd(R)), H = R.redISub(X), S = Z.redSqr();
  47520. S = (S = (S = S.redIAdd(S)).redIAdd(S)).redIAdd(S);
  47521. var z = p.redMul(H).redISub(S), v = h.redAdd(h).redMul(b);
  47522. return this.curve.jpoint(X, z, v);
  47523. }, o.prototype.trpl = function() {
  47524. if (!this.curve.zeroA) return this.dbl().add(this);
  47525. var c = this.x.redSqr(), r = this.y.redSqr(), h = this.z.redSqr(), b = r.redSqr(), u = c.redAdd(c).redIAdd(c), m = u.redSqr(), Z = this.x.redAdd(r).redSqr().redISub(c).redISub(b), p = (Z = (Z = (Z = Z.redIAdd(Z)).redAdd(Z).redIAdd(Z)).redISub(m)).redSqr(), Y = b.redIAdd(b);
  47526. Y = (Y = (Y = Y.redIAdd(Y)).redIAdd(Y)).redIAdd(Y);
  47527. var R = u.redIAdd(Z).redSqr().redISub(m).redISub(p).redISub(Y), X = r.redMul(R);
  47528. X = (X = X.redIAdd(X)).redIAdd(X);
  47529. var H = this.x.redMul(p).redISub(X);
  47530. H = (H = H.redIAdd(H)).redIAdd(H);
  47531. var S = this.y.redMul(R.redMul(Y.redISub(R)).redISub(Z.redMul(p)));
  47532. S = (S = (S = S.redIAdd(S)).redIAdd(S)).redIAdd(S);
  47533. var z = this.z.redAdd(Z).redSqr().redISub(h).redISub(p);
  47534. return this.curve.jpoint(H, S, z);
  47535. }, o.prototype.mul = function(c, r) {
  47536. return c = new A(c, r), this.curve._wnafMul(this, c);
  47537. }, o.prototype.eq = function(c) {
  47538. if (c.type === "affine") return this.eq(c.toJ());
  47539. if (this === c) return !0;
  47540. var r = this.z.redSqr(), h = c.z.redSqr();
  47541. if (this.x.redMul(h).redISub(c.x.redMul(r)).cmpn(0) !== 0) return !1;
  47542. var b = r.redMul(this.z), u = h.redMul(c.z);
  47543. return this.y.redMul(u).redISub(c.y.redMul(b)).cmpn(0) === 0;
  47544. }, o.prototype.eqXToP = function(c) {
  47545. var r = this.z.redSqr(), h = c.toRed(this.curve.red).redMul(r);
  47546. if (this.x.cmp(h) === 0) return !0;
  47547. for (var b = c.clone(), u = this.curve.redN.redMul(r); ; ) {
  47548. if (b.iadd(this.curve.n), b.cmp(this.curve.p) >= 0) return !1;
  47549. if (h.redIAdd(u), this.x.cmp(h) === 0) return !0;
  47550. }
  47551. }, o.prototype.inspect = function() {
  47552. return this.isInfinity() ? "<EC JPoint Infinity>" : "<EC JPoint x: " + this.x.toString(16, 2) + " y: " + this.y.toString(16, 2) + " z: " + this.z.toString(16, 2) + ">";
  47553. }, o.prototype.isInfinity = function() {
  47554. return this.z.cmpn(0) === 0;
  47555. };
  47556. }, { "../utils": 419, "./base": 406, "bn.js": 420, inherits: 440 }], 411: [function(g, C, i) {
  47557. var e, A = i, s = g("hash.js"), l = g("./curve"), n = g("./utils").assert;
  47558. function a(o) {
  47559. o.type === "short" ? this.curve = new l.short(o) : o.type === "edwards" ? this.curve = new l.edwards(o) : this.curve = new l.mont(o), this.g = this.curve.g, this.n = this.curve.n, this.hash = o.hash, n(this.g.validate(), "Invalid curve"), n(this.g.mul(this.n).isInfinity(), "Invalid curve, G*N != O");
  47560. }
  47561. function d(o, c) {
  47562. Object.defineProperty(A, o, { configurable: !0, enumerable: !0, get: function() {
  47563. var r = new a(c);
  47564. return Object.defineProperty(A, o, { configurable: !0, enumerable: !0, value: r }), r;
  47565. } });
  47566. }
  47567. A.PresetCurve = a, d("p192", { type: "short", prime: "p192", p: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff", a: "ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc", b: "64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1", n: "ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831", hash: s.sha256, gRed: !1, g: ["188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012", "07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"] }), d("p224", { type: "short", prime: "p224", p: "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001", a: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe", b: "b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4", n: "ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d", hash: s.sha256, gRed: !1, g: ["b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21", "bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"] }), d("p256", { type: "short", prime: null, p: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff", a: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc", b: "5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b", n: "ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551", hash: s.sha256, gRed: !1, g: ["6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296", "4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"] }), d("p384", { type: "short", prime: null, p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff", a: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc", b: "b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef", n: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973", hash: s.sha384, gRed: !1, g: ["aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7", "3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"] }), d("p521", { type: "short", prime: null, p: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff", a: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc", b: "00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00", n: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409", hash: s.sha512, gRed: !1, g: ["000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66", "00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650"] }), d("curve25519", { type: "mont", prime: "p25519", p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed", a: "76d06", b: "1", n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed", hash: s.sha256, gRed: !1, g: ["9"] }), d("ed25519", { type: "edwards", prime: "p25519", p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed", a: "-1", c: "1", d: "52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3", n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed", hash: s.sha256, gRed: !1, g: ["216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a", "6666666666666666666666666666666666666666666666666666666666666658"] });
  47568. try {
  47569. e = g("./precomputed/secp256k1");
  47570. } catch {
  47571. e = void 0;
  47572. }
  47573. d("secp256k1", { type: "short", prime: "k256", p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f", a: "0", b: "7", n: "ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141", h: "1", hash: s.sha256, beta: "7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee", lambda: "5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72", basis: [{ a: "3086d221a7d46bcde86c90e49284eb15", b: "-e4437ed6010e88286f547fa90abfe4c3" }, { a: "114ca50f7a8e2f3f657c1108d9d44cfd8", b: "3086d221a7d46bcde86c90e49284eb15" }], gRed: !1, g: ["79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", e] });
  47574. }, { "./curve": 408, "./precomputed/secp256k1": 418, "./utils": 419, "hash.js": 426 }], 412: [function(g, C, i) {
  47575. var e = g("bn.js"), A = g("hmac-drbg"), s = g("../utils"), l = g("../curves"), n = g("brorand"), a = s.assert, d = g("./key"), o = g("./signature");
  47576. function c(r) {
  47577. if (!(this instanceof c)) return new c(r);
  47578. typeof r == "string" && (a(Object.prototype.hasOwnProperty.call(l, r), "Unknown curve " + r), r = l[r]), r instanceof l.PresetCurve && (r = { curve: r }), this.curve = r.curve.curve, this.n = this.curve.n, this.nh = this.n.ushrn(1), this.g = this.curve.g, this.g = r.curve.g, this.g.precompute(r.curve.n.bitLength() + 1), this.hash = r.hash || r.curve.hash;
  47579. }
  47580. C.exports = c, c.prototype.keyPair = function(r) {
  47581. return new d(this, r);
  47582. }, c.prototype.keyFromPrivate = function(r, h) {
  47583. return d.fromPrivate(this, r, h);
  47584. }, c.prototype.keyFromPublic = function(r, h) {
  47585. return d.fromPublic(this, r, h);
  47586. }, c.prototype.genKeyPair = function(r) {
  47587. r || (r = {});
  47588. for (var h = new A({ hash: this.hash, pers: r.pers, persEnc: r.persEnc || "utf8", entropy: r.entropy || n(this.hash.hmacStrength), entropyEnc: r.entropy && r.entropyEnc || "utf8", nonce: this.n.toArray() }), b = this.n.byteLength(), u = this.n.sub(new e(2)); ; ) {
  47589. var m = new e(h.generate(b));
  47590. if (!(m.cmp(u) > 0)) return m.iaddn(1), this.keyFromPrivate(m);
  47591. }
  47592. }, c.prototype._truncateToN = function(r, h) {
  47593. var b = 8 * r.byteLength() - this.n.bitLength();
  47594. return b > 0 && (r = r.ushrn(b)), !h && r.cmp(this.n) >= 0 ? r.sub(this.n) : r;
  47595. }, c.prototype.sign = function(r, h, b, u) {
  47596. typeof b == "object" && (u = b, b = null), u || (u = {}), h = this.keyFromPrivate(h, b), r = this._truncateToN(new e(r, 16));
  47597. for (var m = this.n.byteLength(), Z = h.getPrivate().toArray("be", m), p = r.toArray("be", m), Y = new A({ hash: this.hash, entropy: Z, nonce: p, pers: u.pers, persEnc: u.persEnc || "utf8" }), R = this.n.sub(new e(1)), X = 0; ; X++) {
  47598. var H = u.k ? u.k(X) : new e(Y.generate(this.n.byteLength()));
  47599. if (!((H = this._truncateToN(H, !0)).cmpn(1) <= 0 || H.cmp(R) >= 0)) {
  47600. var S = this.g.mul(H);
  47601. if (!S.isInfinity()) {
  47602. var z = S.getX(), v = z.umod(this.n);
  47603. if (v.cmpn(0) !== 0) {
  47604. var K = H.invm(this.n).mul(v.mul(h.getPrivate()).iadd(r));
  47605. if ((K = K.umod(this.n)).cmpn(0) !== 0) {
  47606. var V = (S.getY().isOdd() ? 1 : 0) | (z.cmp(v) !== 0 ? 2 : 0);
  47607. return u.canonical && K.cmp(this.nh) > 0 && (K = this.n.sub(K), V ^= 1), new o({ r: v, s: K, recoveryParam: V });
  47608. }
  47609. }
  47610. }
  47611. }
  47612. }
  47613. }, c.prototype.verify = function(r, h, b, u) {
  47614. r = this._truncateToN(new e(r, 16)), b = this.keyFromPublic(b, u);
  47615. var m = (h = new o(h, "hex")).r, Z = h.s;
  47616. if (m.cmpn(1) < 0 || m.cmp(this.n) >= 0 || Z.cmpn(1) < 0 || Z.cmp(this.n) >= 0) return !1;
  47617. var p, Y = Z.invm(this.n), R = Y.mul(r).umod(this.n), X = Y.mul(m).umod(this.n);
  47618. return this.curve._maxwellTrick ? !(p = this.g.jmulAdd(R, b.getPublic(), X)).isInfinity() && p.eqXToP(m) : !(p = this.g.mulAdd(R, b.getPublic(), X)).isInfinity() && p.getX().umod(this.n).cmp(m) === 0;
  47619. }, c.prototype.recoverPubKey = function(r, h, b, u) {
  47620. a((3 & b) === b, "The recovery param is more than two bits"), h = new o(h, u);
  47621. var m = this.n, Z = new e(r), p = h.r, Y = h.s, R = 1 & b, X = b >> 1;
  47622. if (p.cmp(this.curve.p.umod(this.curve.n)) >= 0 && X) throw new Error("Unable to find sencond key candinate");
  47623. p = X ? this.curve.pointFromX(p.add(this.curve.n), R) : this.curve.pointFromX(p, R);
  47624. var H = h.r.invm(m), S = m.sub(Z).mul(H).umod(m), z = Y.mul(H).umod(m);
  47625. return this.g.mulAdd(S, p, z);
  47626. }, c.prototype.getKeyRecoveryParam = function(r, h, b, u) {
  47627. if ((h = new o(h, u)).recoveryParam !== null) return h.recoveryParam;
  47628. for (var m = 0; m < 4; m++) {
  47629. var Z;
  47630. try {
  47631. Z = this.recoverPubKey(r, h, m);
  47632. } catch {
  47633. continue;
  47634. }
  47635. if (Z.eq(b)) return m;
  47636. }
  47637. throw new Error("Unable to find valid recovery factor");
  47638. };
  47639. }, { "../curves": 411, "../utils": 419, "./key": 413, "./signature": 414, "bn.js": 420, brorand: 187, "hmac-drbg": 438 }], 413: [function(g, C, i) {
  47640. var e = g("bn.js"), A = g("../utils").assert;
  47641. function s(l, n) {
  47642. this.ec = l, this.priv = null, this.pub = null, n.priv && this._importPrivate(n.priv, n.privEnc), n.pub && this._importPublic(n.pub, n.pubEnc);
  47643. }
  47644. C.exports = s, s.fromPublic = function(l, n, a) {
  47645. return n instanceof s ? n : new s(l, { pub: n, pubEnc: a });
  47646. }, s.fromPrivate = function(l, n, a) {
  47647. return n instanceof s ? n : new s(l, { priv: n, privEnc: a });
  47648. }, s.prototype.validate = function() {
  47649. var l = this.getPublic();
  47650. return l.isInfinity() ? { result: !1, reason: "Invalid public key" } : l.validate() ? l.mul(this.ec.curve.n).isInfinity() ? { result: !0, reason: null } : { result: !1, reason: "Public key * N != O" } : { result: !1, reason: "Public key is not a point" };
  47651. }, s.prototype.getPublic = function(l, n) {
  47652. return typeof l == "string" && (n = l, l = null), this.pub || (this.pub = this.ec.g.mul(this.priv)), n ? this.pub.encode(n, l) : this.pub;
  47653. }, s.prototype.getPrivate = function(l) {
  47654. return l === "hex" ? this.priv.toString(16, 2) : this.priv;
  47655. }, s.prototype._importPrivate = function(l, n) {
  47656. this.priv = new e(l, n || 16), this.priv = this.priv.umod(this.ec.curve.n);
  47657. }, s.prototype._importPublic = function(l, n) {
  47658. if (l.x || l.y) return this.ec.curve.type === "mont" ? A(l.x, "Need x coordinate") : this.ec.curve.type !== "short" && this.ec.curve.type !== "edwards" || A(l.x && l.y, "Need both x and y coordinate"), void (this.pub = this.ec.curve.point(l.x, l.y));
  47659. this.pub = this.ec.curve.decodePoint(l, n);
  47660. }, s.prototype.derive = function(l) {
  47661. return l.validate() || A(l.validate(), "public point not validated"), l.mul(this.priv).getX();
  47662. }, s.prototype.sign = function(l, n, a) {
  47663. return this.ec.sign(l, this, n, a);
  47664. }, s.prototype.verify = function(l, n) {
  47665. return this.ec.verify(l, n, this);
  47666. }, s.prototype.inspect = function() {
  47667. return "<Key priv: " + (this.priv && this.priv.toString(16, 2)) + " pub: " + (this.pub && this.pub.inspect()) + " >";
  47668. };
  47669. }, { "../utils": 419, "bn.js": 420 }], 414: [function(g, C, i) {
  47670. var e = g("bn.js"), A = g("../utils"), s = A.assert;
  47671. function l(c, r) {
  47672. if (c instanceof l) return c;
  47673. this._importDER(c, r) || (s(c.r && c.s, "Signature without r or s"), this.r = new e(c.r, 16), this.s = new e(c.s, 16), c.recoveryParam === void 0 ? this.recoveryParam = null : this.recoveryParam = c.recoveryParam);
  47674. }
  47675. function n() {
  47676. this.place = 0;
  47677. }
  47678. function a(c, r) {
  47679. var h = c[r.place++];
  47680. if (!(128 & h)) return h;
  47681. var b = 15 & h;
  47682. if (b === 0 || b > 4) return !1;
  47683. for (var u = 0, m = 0, Z = r.place; m < b; m++, Z++) u <<= 8, u |= c[Z], u >>>= 0;
  47684. return !(u <= 127) && (r.place = Z, u);
  47685. }
  47686. function d(c) {
  47687. for (var r = 0, h = c.length - 1; !c[r] && !(128 & c[r + 1]) && r < h; ) r++;
  47688. return r === 0 ? c : c.slice(r);
  47689. }
  47690. function o(c, r) {
  47691. if (r < 128) c.push(r);
  47692. else {
  47693. var h = 1 + (Math.log(r) / Math.LN2 >>> 3);
  47694. for (c.push(128 | h); --h; ) c.push(r >>> (h << 3) & 255);
  47695. c.push(r);
  47696. }
  47697. }
  47698. C.exports = l, l.prototype._importDER = function(c, r) {
  47699. c = A.toArray(c, r);
  47700. var h = new n();
  47701. if (c[h.place++] !== 48) return !1;
  47702. var b = a(c, h);
  47703. if (b === !1 || b + h.place !== c.length || c[h.place++] !== 2) return !1;
  47704. var u = a(c, h);
  47705. if (u === !1) return !1;
  47706. var m = c.slice(h.place, u + h.place);
  47707. if (h.place += u, c[h.place++] !== 2) return !1;
  47708. var Z = a(c, h);
  47709. if (Z === !1 || c.length !== Z + h.place) return !1;
  47710. var p = c.slice(h.place, Z + h.place);
  47711. if (m[0] === 0) {
  47712. if (!(128 & m[1])) return !1;
  47713. m = m.slice(1);
  47714. }
  47715. if (p[0] === 0) {
  47716. if (!(128 & p[1])) return !1;
  47717. p = p.slice(1);
  47718. }
  47719. return this.r = new e(m), this.s = new e(p), this.recoveryParam = null, !0;
  47720. }, l.prototype.toDER = function(c) {
  47721. var r = this.r.toArray(), h = this.s.toArray();
  47722. for (128 & r[0] && (r = [0].concat(r)), 128 & h[0] && (h = [0].concat(h)), r = d(r), h = d(h); !(h[0] || 128 & h[1]); ) h = h.slice(1);
  47723. var b = [2];
  47724. o(b, r.length), (b = b.concat(r)).push(2), o(b, h.length);
  47725. var u = b.concat(h), m = [48];
  47726. return o(m, u.length), m = m.concat(u), A.encode(m, c);
  47727. };
  47728. }, { "../utils": 419, "bn.js": 420 }], 415: [function(g, C, i) {
  47729. var e = g("hash.js"), A = g("../curves"), s = g("../utils"), l = s.assert, n = s.parseBytes, a = g("./key"), d = g("./signature");
  47730. function o(c) {
  47731. if (l(c === "ed25519", "only tested with ed25519 so far"), !(this instanceof o)) return new o(c);
  47732. c = A[c].curve, this.curve = c, this.g = c.g, this.g.precompute(c.n.bitLength() + 1), this.pointClass = c.point().constructor, this.encodingLength = Math.ceil(c.n.bitLength() / 8), this.hash = e.sha512;
  47733. }
  47734. C.exports = o, o.prototype.sign = function(c, r) {
  47735. c = n(c);
  47736. var h = this.keyFromSecret(r), b = this.hashInt(h.messagePrefix(), c), u = this.g.mul(b), m = this.encodePoint(u), Z = this.hashInt(m, h.pubBytes(), c).mul(h.priv()), p = b.add(Z).umod(this.curve.n);
  47737. return this.makeSignature({ R: u, S: p, Rencoded: m });
  47738. }, o.prototype.verify = function(c, r, h) {
  47739. c = n(c), r = this.makeSignature(r);
  47740. var b = this.keyFromPublic(h), u = this.hashInt(r.Rencoded(), b.pubBytes(), c), m = this.g.mul(r.S());
  47741. return r.R().add(b.pub().mul(u)).eq(m);
  47742. }, o.prototype.hashInt = function() {
  47743. for (var c = this.hash(), r = 0; r < arguments.length; r++) c.update(arguments[r]);
  47744. return s.intFromLE(c.digest()).umod(this.curve.n);
  47745. }, o.prototype.keyFromPublic = function(c) {
  47746. return a.fromPublic(this, c);
  47747. }, o.prototype.keyFromSecret = function(c) {
  47748. return a.fromSecret(this, c);
  47749. }, o.prototype.makeSignature = function(c) {
  47750. return c instanceof d ? c : new d(this, c);
  47751. }, o.prototype.encodePoint = function(c) {
  47752. var r = c.getY().toArray("le", this.encodingLength);
  47753. return r[this.encodingLength - 1] |= c.getX().isOdd() ? 128 : 0, r;
  47754. }, o.prototype.decodePoint = function(c) {
  47755. var r = (c = s.parseBytes(c)).length - 1, h = c.slice(0, r).concat(-129 & c[r]), b = (128 & c[r]) != 0, u = s.intFromLE(h);
  47756. return this.curve.pointFromY(u, b);
  47757. }, o.prototype.encodeInt = function(c) {
  47758. return c.toArray("le", this.encodingLength);
  47759. }, o.prototype.decodeInt = function(c) {
  47760. return s.intFromLE(c);
  47761. }, o.prototype.isPoint = function(c) {
  47762. return c instanceof this.pointClass;
  47763. };
  47764. }, { "../curves": 411, "../utils": 419, "./key": 416, "./signature": 417, "hash.js": 426 }], 416: [function(g, C, i) {
  47765. var e = g("../utils"), A = e.assert, s = e.parseBytes, l = e.cachedProperty;
  47766. function n(a, d) {
  47767. this.eddsa = a, this._secret = s(d.secret), a.isPoint(d.pub) ? this._pub = d.pub : this._pubBytes = s(d.pub);
  47768. }
  47769. n.fromPublic = function(a, d) {
  47770. return d instanceof n ? d : new n(a, { pub: d });
  47771. }, n.fromSecret = function(a, d) {
  47772. return d instanceof n ? d : new n(a, { secret: d });
  47773. }, n.prototype.secret = function() {
  47774. return this._secret;
  47775. }, l(n, "pubBytes", function() {
  47776. return this.eddsa.encodePoint(this.pub());
  47777. }), l(n, "pub", function() {
  47778. return this._pubBytes ? this.eddsa.decodePoint(this._pubBytes) : this.eddsa.g.mul(this.priv());
  47779. }), l(n, "privBytes", function() {
  47780. var a = this.eddsa, d = this.hash(), o = a.encodingLength - 1, c = d.slice(0, a.encodingLength);
  47781. return c[0] &= 248, c[o] &= 127, c[o] |= 64, c;
  47782. }), l(n, "priv", function() {
  47783. return this.eddsa.decodeInt(this.privBytes());
  47784. }), l(n, "hash", function() {
  47785. return this.eddsa.hash().update(this.secret()).digest();
  47786. }), l(n, "messagePrefix", function() {
  47787. return this.hash().slice(this.eddsa.encodingLength);
  47788. }), n.prototype.sign = function(a) {
  47789. return A(this._secret, "KeyPair can only verify"), this.eddsa.sign(a, this);
  47790. }, n.prototype.verify = function(a, d) {
  47791. return this.eddsa.verify(a, d, this);
  47792. }, n.prototype.getSecret = function(a) {
  47793. return A(this._secret, "KeyPair is public only"), e.encode(this.secret(), a);
  47794. }, n.prototype.getPublic = function(a) {
  47795. return e.encode(this.pubBytes(), a);
  47796. }, C.exports = n;
  47797. }, { "../utils": 419 }], 417: [function(g, C, i) {
  47798. var e = g("bn.js"), A = g("../utils"), s = A.assert, l = A.cachedProperty, n = A.parseBytes;
  47799. function a(d, o) {
  47800. this.eddsa = d, typeof o != "object" && (o = n(o)), Array.isArray(o) && (o = { R: o.slice(0, d.encodingLength), S: o.slice(d.encodingLength) }), s(o.R && o.S, "Signature without R or S"), d.isPoint(o.R) && (this._R = o.R), o.S instanceof e && (this._S = o.S), this._Rencoded = Array.isArray(o.R) ? o.R : o.Rencoded, this._Sencoded = Array.isArray(o.S) ? o.S : o.Sencoded;
  47801. }
  47802. l(a, "S", function() {
  47803. return this.eddsa.decodeInt(this.Sencoded());
  47804. }), l(a, "R", function() {
  47805. return this.eddsa.decodePoint(this.Rencoded());
  47806. }), l(a, "Rencoded", function() {
  47807. return this.eddsa.encodePoint(this.R());
  47808. }), l(a, "Sencoded", function() {
  47809. return this.eddsa.encodeInt(this.S());
  47810. }), a.prototype.toBytes = function() {
  47811. return this.Rencoded().concat(this.Sencoded());
  47812. }, a.prototype.toHex = function() {
  47813. return A.encode(this.toBytes(), "hex").toUpperCase();
  47814. }, C.exports = a;
  47815. }, { "../utils": 419, "bn.js": 420 }], 418: [function(g, C, i) {
  47816. C.exports = { doubles: { step: 4, points: [["e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a", "f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821"], ["8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508", "11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"], ["175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739", "d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695"], ["363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640", "4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9"], ["8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c", "4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36"], ["723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda", "96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f"], ["eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa", "5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999"], ["100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0", "cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09"], ["e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d", "9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d"], ["feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d", "e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088"], ["da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1", "9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d"], ["53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0", "5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8"], ["8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047", "10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a"], ["385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862", "283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453"], ["6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7", "7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160"], ["3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd", "56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0"], ["85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83", "7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6"], ["948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a", "53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589"], ["6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8", "bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17"], ["e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d", "4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda"], ["e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725", "7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd"], ["213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754", "4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2"], ["4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c", "17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6"], ["fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6", "6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f"], ["76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39", "c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01"], ["c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891", "893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3"], ["d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b", "febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f"], ["b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03", "2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7"], ["e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d", "eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78"], ["a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070", "7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1"], ["90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4", "e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150"], ["8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da", "662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82"], ["e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11", "1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc"], ["8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e", "efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b"], ["e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41", "2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51"], ["b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef", "67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45"], ["d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8", "db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120"], ["324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d", "648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84"], ["4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96", "35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d"], ["9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd", "ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d"], ["6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5", "9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8"], ["a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266", "40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8"], ["7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71", "34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac"], ["928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac", "c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f"], ["85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751", "1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962"], ["ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e", "493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907"], ["827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241", "c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec"], ["eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3", "be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d"], ["e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f", "4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414"], ["1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19", "aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd"], ["146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be", "b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0"], ["fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9", "6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811"], ["da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2", "8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1"], ["a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13", "7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c"], ["174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c", "ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73"], ["959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba", "2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd"], ["d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151", "e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405"], ["64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073", "d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589"], ["8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458", "38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e"], ["13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b", "69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27"], ["bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366", "d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1"], ["8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa", "40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482"], ["8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0", "620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945"], ["dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787", "7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573"], ["f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e", "ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82"]] }, naf: { wnd: 7, points: [["f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9", "388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672"], ["2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4", "d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6"], ["5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc", "6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da"], ["acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe", "cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37"], ["774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb", "d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b"], ["f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8", "ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81"], ["d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e", "581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58"], ["defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34", "4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77"], ["2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c", "85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a"], ["352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5", "321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c"], ["2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f", "2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67"], ["9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714", "73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402"], ["daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729", "a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55"], ["c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db", "2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482"], ["6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4", "e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82"], ["1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5", "b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396"], ["605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479", "2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49"], ["62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d", "80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf"], ["80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f", "1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a"], ["7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb", "d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7"], ["d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9", "eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933"], ["49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963", "758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a"], ["77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74", "958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6"], ["f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530", "e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37"], ["463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b", "5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e"], ["f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247", "cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6"], ["caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1", "cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476"], ["2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120", "4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40"], ["7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435", "91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61"], ["754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18", "673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683"], ["e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8", "59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5"], ["186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb", "3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b"], ["df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f", "55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417"], ["5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143", "efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868"], ["290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba", "e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a"], ["af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45", "f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6"], ["766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a", "744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996"], ["59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e", "c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e"], ["f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8", "e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d"], ["7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c", "30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2"], ["948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519", "e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e"], ["7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab", "100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437"], ["3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca", "ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311"], ["d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf", "8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4"], ["1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610", "68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575"], ["733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4", "f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d"], ["15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c", "d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d"], ["a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940", "edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629"], ["e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980", "a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06"], ["311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3", "66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374"], ["34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf", "9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee"], ["f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63", "4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1"], ["d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448", "fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b"], ["32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf", "5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661"], ["7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5", "8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6"], ["ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6", "8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e"], ["16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5", "5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d"], ["eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99", "f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc"], ["78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51", "f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4"], ["494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5", "42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c"], ["a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5", "204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b"], ["c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997", "4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913"], ["841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881", "73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154"], ["5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5", "39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865"], ["36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66", "d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc"], ["336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726", "ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224"], ["8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede", "6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e"], ["1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94", "60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6"], ["85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31", "3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511"], ["29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51", "b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b"], ["a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252", "ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2"], ["4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5", "cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c"], ["d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b", "6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3"], ["ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4", "322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d"], ["af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f", "6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700"], ["e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889", "2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4"], ["591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246", "b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196"], ["11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984", "998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4"], ["3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a", "b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257"], ["cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030", "bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13"], ["c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197", "6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096"], ["c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593", "c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38"], ["a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef", "21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f"], ["347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38", "60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448"], ["da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a", "49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a"], ["c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111", "5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4"], ["4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502", "7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437"], ["3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea", "be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7"], ["cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26", "8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d"], ["b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986", "39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a"], ["d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e", "62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54"], ["48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4", "25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77"], ["dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda", "ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517"], ["6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859", "cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10"], ["e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f", "f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125"], ["eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c", "6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e"], ["13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942", "fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1"], ["ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a", "1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2"], ["b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80", "5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423"], ["ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d", "438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8"], ["8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1", "cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758"], ["52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63", "c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375"], ["e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352", "6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d"], ["7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193", "ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec"], ["5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00", "9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0"], ["32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58", "ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c"], ["e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7", "d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4"], ["8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8", "c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f"], ["4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e", "67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649"], ["3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d", "cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826"], ["674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b", "299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5"], ["d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f", "f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87"], ["30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6", "462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b"], ["be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297", "62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc"], ["93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a", "7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c"], ["b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c", "ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f"], ["d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52", "4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a"], ["d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb", "bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46"], ["463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065", "bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f"], ["7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917", "603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03"], ["74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9", "cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08"], ["30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3", "553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8"], ["9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57", "712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373"], ["176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66", "ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3"], ["75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8", "9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8"], ["809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721", "9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1"], ["1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180", "4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9"]] } };
  47817. }, {}], 419: [function(g, C, i) {
  47818. var e = i, A = g("bn.js"), s = g("minimalistic-assert"), l = g("minimalistic-crypto-utils");
  47819. e.assert = s, e.toArray = l.toArray, e.zero2 = l.zero2, e.toHex = l.toHex, e.encode = l.encode, e.getNAF = function(n, a, d) {
  47820. var o = new Array(Math.max(n.bitLength(), d) + 1);
  47821. o.fill(0);
  47822. for (var c = 1 << a + 1, r = n.clone(), h = 0; h < o.length; h++) {
  47823. var b, u = r.andln(c - 1);
  47824. r.isOdd() ? (b = u > (c >> 1) - 1 ? (c >> 1) - u : u, r.isubn(b)) : b = 0, o[h] = b, r.iushrn(1);
  47825. }
  47826. return o;
  47827. }, e.getJSF = function(n, a) {
  47828. var d = [[], []];
  47829. n = n.clone(), a = a.clone();
  47830. for (var o, c = 0, r = 0; n.cmpn(-c) > 0 || a.cmpn(-r) > 0; ) {
  47831. var h, b, u = n.andln(3) + c & 3, m = a.andln(3) + r & 3;
  47832. u === 3 && (u = -1), m === 3 && (m = -1), h = (1 & u) == 0 ? 0 : (o = n.andln(7) + c & 7) !== 3 && o !== 5 || m !== 2 ? u : -u, d[0].push(h), b = (1 & m) == 0 ? 0 : (o = a.andln(7) + r & 7) !== 3 && o !== 5 || u !== 2 ? m : -m, d[1].push(b), 2 * c === h + 1 && (c = 1 - c), 2 * r === b + 1 && (r = 1 - r), n.iushrn(1), a.iushrn(1);
  47833. }
  47834. return d;
  47835. }, e.cachedProperty = function(n, a, d) {
  47836. var o = "_" + a;
  47837. n.prototype[a] = function() {
  47838. return this[o] !== void 0 ? this[o] : this[o] = d.call(this);
  47839. };
  47840. }, e.parseBytes = function(n) {
  47841. return typeof n == "string" ? e.toArray(n, "hex") : n;
  47842. }, e.intFromLE = function(n) {
  47843. return new A(n, "hex", "le");
  47844. };
  47845. }, { "bn.js": 420, "minimalistic-assert": 453, "minimalistic-crypto-utils": 454 }], 420: [function(g, C, i) {
  47846. arguments[4][184][0].apply(i, arguments);
  47847. }, { buffer: 188, dup: 184 }], 421: [function(g, C, i) {
  47848. C.exports = { name: "elliptic", version: "6.5.4", description: "EC cryptography", main: "lib/elliptic.js", files: ["lib"], scripts: { lint: "eslint lib test", "lint:fix": "npm run lint -- --fix", unit: "istanbul test _mocha --reporter=spec test/index.js", test: "npm run lint && npm run unit", version: "grunt dist && git add dist/" }, repository: { type: "git", url: "git@github.com:indutny/elliptic" }, keywords: ["EC", "Elliptic", "curve", "Cryptography"], author: "Fedor Indutny <fedor@indutny.com>", license: "MIT", bugs: { url: "https://github.com/indutny/elliptic/issues" }, homepage: "https://github.com/indutny/elliptic", devDependencies: { brfs: "^2.0.2", coveralls: "^3.1.0", eslint: "^7.6.0", grunt: "^1.2.1", "grunt-browserify": "^5.3.0", "grunt-cli": "^1.3.2", "grunt-contrib-connect": "^3.0.0", "grunt-contrib-copy": "^1.0.0", "grunt-contrib-uglify": "^5.0.0", "grunt-mocha-istanbul": "^5.0.2", "grunt-saucelabs": "^9.0.1", istanbul: "^0.4.5", mocha: "^8.0.1" }, dependencies: { "bn.js": "^4.11.9", brorand: "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", inherits: "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } };
  47849. }, {}], 422: [function(g, C, i) {
  47850. var e = Object.create || function(H) {
  47851. var S = function() {
  47852. };
  47853. return S.prototype = H, new S();
  47854. }, A = Object.keys || function(H) {
  47855. var S = [];
  47856. for (var z in H) Object.prototype.hasOwnProperty.call(H, z) && S.push(z);
  47857. return z;
  47858. }, s = Function.prototype.bind || function(H) {
  47859. var S = this;
  47860. return function() {
  47861. return S.apply(H, arguments);
  47862. };
  47863. };
  47864. function l() {
  47865. this._events && Object.prototype.hasOwnProperty.call(this, "_events") || (this._events = e(null), this._eventsCount = 0), this._maxListeners = this._maxListeners || void 0;
  47866. }
  47867. C.exports = l, l.EventEmitter = l, l.prototype._events = void 0, l.prototype._maxListeners = void 0;
  47868. var n, a = 10;
  47869. try {
  47870. var d = {};
  47871. Object.defineProperty && Object.defineProperty(d, "x", { value: 0 }), n = d.x === 0;
  47872. } catch {
  47873. n = !1;
  47874. }
  47875. function o(H) {
  47876. return H._maxListeners === void 0 ? l.defaultMaxListeners : H._maxListeners;
  47877. }
  47878. function c(H, S, z) {
  47879. if (S) H.call(z);
  47880. else for (var v = H.length, K = X(H, v), V = 0; V < v; ++V) K[V].call(z);
  47881. }
  47882. function r(H, S, z, v) {
  47883. if (S) H.call(z, v);
  47884. else for (var K = H.length, V = X(H, K), N = 0; N < K; ++N) V[N].call(z, v);
  47885. }
  47886. function h(H, S, z, v, K) {
  47887. if (S) H.call(z, v, K);
  47888. else for (var V = H.length, N = X(H, V), B = 0; B < V; ++B) N[B].call(z, v, K);
  47889. }
  47890. function b(H, S, z, v, K, V) {
  47891. if (S) H.call(z, v, K, V);
  47892. else for (var N = H.length, B = X(H, N), G = 0; G < N; ++G) B[G].call(z, v, K, V);
  47893. }
  47894. function u(H, S, z, v) {
  47895. if (S) H.apply(z, v);
  47896. else for (var K = H.length, V = X(H, K), N = 0; N < K; ++N) V[N].apply(z, v);
  47897. }
  47898. function m(H, S, z, v) {
  47899. var K, V, N;
  47900. if (typeof z != "function") throw new TypeError('"listener" argument must be a function');
  47901. if ((V = H._events) ? (V.newListener && (H.emit("newListener", S, z.listener ? z.listener : z), V = H._events), N = V[S]) : (V = H._events = e(null), H._eventsCount = 0), N) {
  47902. if (typeof N == "function" ? N = V[S] = v ? [z, N] : [N, z] : v ? N.unshift(z) : N.push(z), !N.warned && (K = o(H)) && K > 0 && N.length > K) {
  47903. N.warned = !0;
  47904. var B = new Error("Possible EventEmitter memory leak detected. " + N.length + ' "' + String(S) + '" listeners added. Use emitter.setMaxListeners() to increase limit.');
  47905. B.name = "MaxListenersExceededWarning", B.emitter = H, B.type = S, B.count = N.length, typeof console == "object" && console.warn && console.warn("%s: %s", B.name, B.message);
  47906. }
  47907. } else N = V[S] = z, ++H._eventsCount;
  47908. return H;
  47909. }
  47910. function Z() {
  47911. if (!this.fired) switch (this.target.removeListener(this.type, this.wrapFn), this.fired = !0, arguments.length) {
  47912. case 0:
  47913. return this.listener.call(this.target);
  47914. case 1:
  47915. return this.listener.call(this.target, arguments[0]);
  47916. case 2:
  47917. return this.listener.call(this.target, arguments[0], arguments[1]);
  47918. case 3:
  47919. return this.listener.call(this.target, arguments[0], arguments[1], arguments[2]);
  47920. default:
  47921. for (var H = new Array(arguments.length), S = 0; S < H.length; ++S) H[S] = arguments[S];
  47922. this.listener.apply(this.target, H);
  47923. }
  47924. }
  47925. function p(H, S, z) {
  47926. var v = { fired: !1, wrapFn: void 0, target: H, type: S, listener: z }, K = s.call(Z, v);
  47927. return K.listener = z, v.wrapFn = K, K;
  47928. }
  47929. function Y(H, S, z) {
  47930. var v = H._events;
  47931. if (!v) return [];
  47932. var K = v[S];
  47933. return K ? typeof K == "function" ? z ? [K.listener || K] : [K] : z ? function(V) {
  47934. for (var N = new Array(V.length), B = 0; B < N.length; ++B) N[B] = V[B].listener || V[B];
  47935. return N;
  47936. }(K) : X(K, K.length) : [];
  47937. }
  47938. function R(H) {
  47939. var S = this._events;
  47940. if (S) {
  47941. var z = S[H];
  47942. if (typeof z == "function") return 1;
  47943. if (z) return z.length;
  47944. }
  47945. return 0;
  47946. }
  47947. function X(H, S) {
  47948. for (var z = new Array(S), v = 0; v < S; ++v) z[v] = H[v];
  47949. return z;
  47950. }
  47951. n ? Object.defineProperty(l, "defaultMaxListeners", { enumerable: !0, get: function() {
  47952. return a;
  47953. }, set: function(H) {
  47954. if (typeof H != "number" || H < 0 || H != H) throw new TypeError('"defaultMaxListeners" must be a positive number');
  47955. a = H;
  47956. } }) : l.defaultMaxListeners = a, l.prototype.setMaxListeners = function(H) {
  47957. if (typeof H != "number" || H < 0 || isNaN(H)) throw new TypeError('"n" argument must be a positive number');
  47958. return this._maxListeners = H, this;
  47959. }, l.prototype.getMaxListeners = function() {
  47960. return o(this);
  47961. }, l.prototype.emit = function(H) {
  47962. var S, z, v, K, V, N, B = H === "error";
  47963. if (N = this._events) B = B && N.error == null;
  47964. else if (!B) return !1;
  47965. if (B) {
  47966. if (arguments.length > 1 && (S = arguments[1]), S instanceof Error) throw S;
  47967. var G = new Error('Unhandled "error" event. (' + S + ")");
  47968. throw G.context = S, G;
  47969. }
  47970. if (!(z = N[H])) return !1;
  47971. var w = typeof z == "function";
  47972. switch (v = arguments.length) {
  47973. case 1:
  47974. c(z, w, this);
  47975. break;
  47976. case 2:
  47977. r(z, w, this, arguments[1]);
  47978. break;
  47979. case 3:
  47980. h(z, w, this, arguments[1], arguments[2]);
  47981. break;
  47982. case 4:
  47983. b(z, w, this, arguments[1], arguments[2], arguments[3]);
  47984. break;
  47985. default:
  47986. for (K = new Array(v - 1), V = 1; V < v; V++) K[V - 1] = arguments[V];
  47987. u(z, w, this, K);
  47988. }
  47989. return !0;
  47990. }, l.prototype.addListener = function(H, S) {
  47991. return m(this, H, S, !1);
  47992. }, l.prototype.on = l.prototype.addListener, l.prototype.prependListener = function(H, S) {
  47993. return m(this, H, S, !0);
  47994. }, l.prototype.once = function(H, S) {
  47995. if (typeof S != "function") throw new TypeError('"listener" argument must be a function');
  47996. return this.on(H, p(this, H, S)), this;
  47997. }, l.prototype.prependOnceListener = function(H, S) {
  47998. if (typeof S != "function") throw new TypeError('"listener" argument must be a function');
  47999. return this.prependListener(H, p(this, H, S)), this;
  48000. }, l.prototype.removeListener = function(H, S) {
  48001. var z, v, K, V, N;
  48002. if (typeof S != "function") throw new TypeError('"listener" argument must be a function');
  48003. if (!(v = this._events)) return this;
  48004. if (!(z = v[H])) return this;
  48005. if (z === S || z.listener === S) --this._eventsCount == 0 ? this._events = e(null) : (delete v[H], v.removeListener && this.emit("removeListener", H, z.listener || S));
  48006. else if (typeof z != "function") {
  48007. for (K = -1, V = z.length - 1; V >= 0; V--) if (z[V] === S || z[V].listener === S) {
  48008. N = z[V].listener, K = V;
  48009. break;
  48010. }
  48011. if (K < 0) return this;
  48012. K === 0 ? z.shift() : function(B, G) {
  48013. for (var w = G, W = w + 1, y = B.length; W < y; w += 1, W += 1) B[w] = B[W];
  48014. B.pop();
  48015. }(z, K), z.length === 1 && (v[H] = z[0]), v.removeListener && this.emit("removeListener", H, N || S);
  48016. }
  48017. return this;
  48018. }, l.prototype.removeAllListeners = function(H) {
  48019. var S, z, v;
  48020. if (!(z = this._events)) return this;
  48021. if (!z.removeListener) return arguments.length === 0 ? (this._events = e(null), this._eventsCount = 0) : z[H] && (--this._eventsCount == 0 ? this._events = e(null) : delete z[H]), this;
  48022. if (arguments.length === 0) {
  48023. var K, V = A(z);
  48024. for (v = 0; v < V.length; ++v) (K = V[v]) !== "removeListener" && this.removeAllListeners(K);
  48025. return this.removeAllListeners("removeListener"), this._events = e(null), this._eventsCount = 0, this;
  48026. }
  48027. if (typeof (S = z[H]) == "function") this.removeListener(H, S);
  48028. else if (S) for (v = S.length - 1; v >= 0; v--) this.removeListener(H, S[v]);
  48029. return this;
  48030. }, l.prototype.listeners = function(H) {
  48031. return Y(this, H, !0);
  48032. }, l.prototype.rawListeners = function(H) {
  48033. return Y(this, H, !1);
  48034. }, l.listenerCount = function(H, S) {
  48035. return typeof H.listenerCount == "function" ? H.listenerCount(S) : R.call(H, S);
  48036. }, l.prototype.listenerCount = R, l.prototype.eventNames = function() {
  48037. return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];
  48038. };
  48039. }, {}], 423: [function(g, C, i) {
  48040. var e = g("safe-buffer").Buffer, A = g("md5.js");
  48041. C.exports = function(s, l, n, a) {
  48042. if (e.isBuffer(s) || (s = e.from(s, "binary")), l && (e.isBuffer(l) || (l = e.from(l, "binary")), l.length !== 8)) throw new RangeError("salt should be Buffer with 8 byte length");
  48043. for (var d = n / 8, o = e.alloc(d), c = e.alloc(a || 0), r = e.alloc(0); d > 0 || a > 0; ) {
  48044. var h = new A();
  48045. h.update(r), h.update(s), l && h.update(l), r = h.digest();
  48046. var b = 0;
  48047. if (d > 0) {
  48048. var u = o.length - d;
  48049. b = Math.min(d, r.length), r.copy(o, u, 0, b), d -= b;
  48050. }
  48051. if (b < r.length && a > 0) {
  48052. var m = c.length - a, Z = Math.min(a, r.length - b);
  48053. r.copy(c, m, b, b + Z), a -= Z;
  48054. }
  48055. }
  48056. return r.fill(0), { key: o, iv: c };
  48057. };
  48058. }, { "md5.js": 450, "safe-buffer": 494 }], 424: [function(g, C, i) {
  48059. Object.defineProperty(i, "__esModule", { value: !0 }), i.CsvParserStream = i.ParserOptions = i.parseFile = i.parseStream = i.parseString = i.parse = i.FormatterOptions = i.CsvFormatterStream = i.writeToPath = i.writeToString = i.writeToBuffer = i.writeToStream = i.write = i.format = void 0;
  48060. var e = g("@fast-csv/format");
  48061. Object.defineProperty(i, "format", { enumerable: !0, get: function() {
  48062. return e.format;
  48063. } }), Object.defineProperty(i, "write", { enumerable: !0, get: function() {
  48064. return e.write;
  48065. } }), Object.defineProperty(i, "writeToStream", { enumerable: !0, get: function() {
  48066. return e.writeToStream;
  48067. } }), Object.defineProperty(i, "writeToBuffer", { enumerable: !0, get: function() {
  48068. return e.writeToBuffer;
  48069. } }), Object.defineProperty(i, "writeToString", { enumerable: !0, get: function() {
  48070. return e.writeToString;
  48071. } }), Object.defineProperty(i, "writeToPath", { enumerable: !0, get: function() {
  48072. return e.writeToPath;
  48073. } }), Object.defineProperty(i, "CsvFormatterStream", { enumerable: !0, get: function() {
  48074. return e.CsvFormatterStream;
  48075. } }), Object.defineProperty(i, "FormatterOptions", { enumerable: !0, get: function() {
  48076. return e.FormatterOptions;
  48077. } });
  48078. var A = g("@fast-csv/parse");
  48079. Object.defineProperty(i, "parse", { enumerable: !0, get: function() {
  48080. return A.parse;
  48081. } }), Object.defineProperty(i, "parseString", { enumerable: !0, get: function() {
  48082. return A.parseString;
  48083. } }), Object.defineProperty(i, "parseStream", { enumerable: !0, get: function() {
  48084. return A.parseStream;
  48085. } }), Object.defineProperty(i, "parseFile", { enumerable: !0, get: function() {
  48086. return A.parseFile;
  48087. } }), Object.defineProperty(i, "ParserOptions", { enumerable: !0, get: function() {
  48088. return A.ParserOptions;
  48089. } }), Object.defineProperty(i, "CsvParserStream", { enumerable: !0, get: function() {
  48090. return A.CsvParserStream;
  48091. } });
  48092. }, { "@fast-csv/format": 151, "@fast-csv/parse": 155 }], 425: [function(g, C, i) {
  48093. var e = g("safe-buffer").Buffer, A = g("readable-stream").Transform;
  48094. function s(l) {
  48095. A.call(this), this._block = e.allocUnsafe(l), this._blockSize = l, this._blockOffset = 0, this._length = [0, 0, 0, 0], this._finalized = !1;
  48096. }
  48097. g("inherits")(s, A), s.prototype._transform = function(l, n, a) {
  48098. var d = null;
  48099. try {
  48100. this.update(l, n);
  48101. } catch (o) {
  48102. d = o;
  48103. }
  48104. a(d);
  48105. }, s.prototype._flush = function(l) {
  48106. var n = null;
  48107. try {
  48108. this.push(this.digest());
  48109. } catch (a) {
  48110. n = a;
  48111. }
  48112. l(n);
  48113. }, s.prototype.update = function(l, n) {
  48114. if (function(h, b) {
  48115. if (!e.isBuffer(h) && typeof h != "string") throw new TypeError(b + " must be a string or a buffer");
  48116. }(l, "Data"), this._finalized) throw new Error("Digest already called");
  48117. e.isBuffer(l) || (l = e.from(l, n));
  48118. for (var a = this._block, d = 0; this._blockOffset + l.length - d >= this._blockSize; ) {
  48119. for (var o = this._blockOffset; o < this._blockSize; ) a[o++] = l[d++];
  48120. this._update(), this._blockOffset = 0;
  48121. }
  48122. for (; d < l.length; ) a[this._blockOffset++] = l[d++];
  48123. for (var c = 0, r = 8 * l.length; r > 0; ++c) this._length[c] += r, (r = this._length[c] / 4294967296 | 0) > 0 && (this._length[c] -= 4294967296 * r);
  48124. return this;
  48125. }, s.prototype._update = function() {
  48126. throw new Error("_update is not implemented");
  48127. }, s.prototype.digest = function(l) {
  48128. if (this._finalized) throw new Error("Digest already called");
  48129. this._finalized = !0;
  48130. var n = this._digest();
  48131. l !== void 0 && (n = n.toString(l)), this._block.fill(0), this._blockOffset = 0;
  48132. for (var a = 0; a < 4; ++a) this._length[a] = 0;
  48133. return n;
  48134. }, s.prototype._digest = function() {
  48135. throw new Error("_digest is not implemented");
  48136. }, C.exports = s;
  48137. }, { inherits: 440, "readable-stream": 491, "safe-buffer": 494 }], 426: [function(g, C, i) {
  48138. var e = i;
  48139. e.utils = g("./hash/utils"), e.common = g("./hash/common"), e.sha = g("./hash/sha"), e.ripemd = g("./hash/ripemd"), e.hmac = g("./hash/hmac"), e.sha1 = e.sha.sha1, e.sha256 = e.sha.sha256, e.sha224 = e.sha.sha224, e.sha384 = e.sha.sha384, e.sha512 = e.sha.sha512, e.ripemd160 = e.ripemd.ripemd160;
  48140. }, { "./hash/common": 427, "./hash/hmac": 428, "./hash/ripemd": 429, "./hash/sha": 430, "./hash/utils": 437 }], 427: [function(g, C, i) {
  48141. var e = g("./utils"), A = g("minimalistic-assert");
  48142. function s() {
  48143. this.pending = null, this.pendingTotal = 0, this.blockSize = this.constructor.blockSize, this.outSize = this.constructor.outSize, this.hmacStrength = this.constructor.hmacStrength, this.padLength = this.constructor.padLength / 8, this.endian = "big", this._delta8 = this.blockSize / 8, this._delta32 = this.blockSize / 32;
  48144. }
  48145. i.BlockHash = s, s.prototype.update = function(l, n) {
  48146. if (l = e.toArray(l, n), this.pending ? this.pending = this.pending.concat(l) : this.pending = l, this.pendingTotal += l.length, this.pending.length >= this._delta8) {
  48147. var a = (l = this.pending).length % this._delta8;
  48148. this.pending = l.slice(l.length - a, l.length), this.pending.length === 0 && (this.pending = null), l = e.join32(l, 0, l.length - a, this.endian);
  48149. for (var d = 0; d < l.length; d += this._delta32) this._update(l, d, d + this._delta32);
  48150. }
  48151. return this;
  48152. }, s.prototype.digest = function(l) {
  48153. return this.update(this._pad()), A(this.pending === null), this._digest(l);
  48154. }, s.prototype._pad = function() {
  48155. var l = this.pendingTotal, n = this._delta8, a = n - (l + this.padLength) % n, d = new Array(a + this.padLength);
  48156. d[0] = 128;
  48157. for (var o = 1; o < a; o++) d[o] = 0;
  48158. if (l <<= 3, this.endian === "big") {
  48159. for (var c = 8; c < this.padLength; c++) d[o++] = 0;
  48160. d[o++] = 0, d[o++] = 0, d[o++] = 0, d[o++] = 0, d[o++] = l >>> 24 & 255, d[o++] = l >>> 16 & 255, d[o++] = l >>> 8 & 255, d[o++] = 255 & l;
  48161. } else for (d[o++] = 255 & l, d[o++] = l >>> 8 & 255, d[o++] = l >>> 16 & 255, d[o++] = l >>> 24 & 255, d[o++] = 0, d[o++] = 0, d[o++] = 0, d[o++] = 0, c = 8; c < this.padLength; c++) d[o++] = 0;
  48162. return d;
  48163. };
  48164. }, { "./utils": 437, "minimalistic-assert": 453 }], 428: [function(g, C, i) {
  48165. var e = g("./utils"), A = g("minimalistic-assert");
  48166. function s(l, n, a) {
  48167. if (!(this instanceof s)) return new s(l, n, a);
  48168. this.Hash = l, this.blockSize = l.blockSize / 8, this.outSize = l.outSize / 8, this.inner = null, this.outer = null, this._init(e.toArray(n, a));
  48169. }
  48170. C.exports = s, s.prototype._init = function(l) {
  48171. l.length > this.blockSize && (l = new this.Hash().update(l).digest()), A(l.length <= this.blockSize);
  48172. for (var n = l.length; n < this.blockSize; n++) l.push(0);
  48173. for (n = 0; n < l.length; n++) l[n] ^= 54;
  48174. for (this.inner = new this.Hash().update(l), n = 0; n < l.length; n++) l[n] ^= 106;
  48175. this.outer = new this.Hash().update(l);
  48176. }, s.prototype.update = function(l, n) {
  48177. return this.inner.update(l, n), this;
  48178. }, s.prototype.digest = function(l) {
  48179. return this.outer.update(this.inner.digest()), this.outer.digest(l);
  48180. };
  48181. }, { "./utils": 437, "minimalistic-assert": 453 }], 429: [function(g, C, i) {
  48182. var e = g("./utils"), A = g("./common"), s = e.rotl32, l = e.sum32, n = e.sum32_3, a = e.sum32_4, d = A.BlockHash;
  48183. function o() {
  48184. if (!(this instanceof o)) return new o();
  48185. d.call(this), this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520], this.endian = "little";
  48186. }
  48187. function c(p, Y, R, X) {
  48188. return p <= 15 ? Y ^ R ^ X : p <= 31 ? Y & R | ~Y & X : p <= 47 ? (Y | ~R) ^ X : p <= 63 ? Y & X | R & ~X : Y ^ (R | ~X);
  48189. }
  48190. function r(p) {
  48191. return p <= 15 ? 0 : p <= 31 ? 1518500249 : p <= 47 ? 1859775393 : p <= 63 ? 2400959708 : 2840853838;
  48192. }
  48193. function h(p) {
  48194. return p <= 15 ? 1352829926 : p <= 31 ? 1548603684 : p <= 47 ? 1836072691 : p <= 63 ? 2053994217 : 0;
  48195. }
  48196. e.inherits(o, d), i.ripemd160 = o, o.blockSize = 512, o.outSize = 160, o.hmacStrength = 192, o.padLength = 64, o.prototype._update = function(p, Y) {
  48197. for (var R = this.h[0], X = this.h[1], H = this.h[2], S = this.h[3], z = this.h[4], v = R, K = X, V = H, N = S, B = z, G = 0; G < 80; G++) {
  48198. var w = l(s(a(R, c(G, X, H, S), p[b[G] + Y], r(G)), m[G]), z);
  48199. R = z, z = S, S = s(H, 10), H = X, X = w, w = l(s(a(v, c(79 - G, K, V, N), p[u[G] + Y], h(G)), Z[G]), B), v = B, B = N, N = s(V, 10), V = K, K = w;
  48200. }
  48201. w = n(this.h[1], H, N), this.h[1] = n(this.h[2], S, B), this.h[2] = n(this.h[3], z, v), this.h[3] = n(this.h[4], R, K), this.h[4] = n(this.h[0], X, V), this.h[0] = w;
  48202. }, o.prototype._digest = function(p) {
  48203. return p === "hex" ? e.toHex32(this.h, "little") : e.split32(this.h, "little");
  48204. };
  48205. var b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13], u = [5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11], m = [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6], Z = [8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11];
  48206. }, { "./common": 427, "./utils": 437 }], 430: [function(g, C, i) {
  48207. i.sha1 = g("./sha/1"), i.sha224 = g("./sha/224"), i.sha256 = g("./sha/256"), i.sha384 = g("./sha/384"), i.sha512 = g("./sha/512");
  48208. }, { "./sha/1": 431, "./sha/224": 432, "./sha/256": 433, "./sha/384": 434, "./sha/512": 435 }], 431: [function(g, C, i) {
  48209. var e = g("../utils"), A = g("../common"), s = g("./common"), l = e.rotl32, n = e.sum32, a = e.sum32_5, d = s.ft_1, o = A.BlockHash, c = [1518500249, 1859775393, 2400959708, 3395469782];
  48210. function r() {
  48211. if (!(this instanceof r)) return new r();
  48212. o.call(this), this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520], this.W = new Array(80);
  48213. }
  48214. e.inherits(r, o), C.exports = r, r.blockSize = 512, r.outSize = 160, r.hmacStrength = 80, r.padLength = 64, r.prototype._update = function(h, b) {
  48215. for (var u = this.W, m = 0; m < 16; m++) u[m] = h[b + m];
  48216. for (; m < u.length; m++) u[m] = l(u[m - 3] ^ u[m - 8] ^ u[m - 14] ^ u[m - 16], 1);
  48217. var Z = this.h[0], p = this.h[1], Y = this.h[2], R = this.h[3], X = this.h[4];
  48218. for (m = 0; m < u.length; m++) {
  48219. var H = ~~(m / 20), S = a(l(Z, 5), d(H, p, Y, R), X, u[m], c[H]);
  48220. X = R, R = Y, Y = l(p, 30), p = Z, Z = S;
  48221. }
  48222. this.h[0] = n(this.h[0], Z), this.h[1] = n(this.h[1], p), this.h[2] = n(this.h[2], Y), this.h[3] = n(this.h[3], R), this.h[4] = n(this.h[4], X);
  48223. }, r.prototype._digest = function(h) {
  48224. return h === "hex" ? e.toHex32(this.h, "big") : e.split32(this.h, "big");
  48225. };
  48226. }, { "../common": 427, "../utils": 437, "./common": 436 }], 432: [function(g, C, i) {
  48227. var e = g("../utils"), A = g("./256");
  48228. function s() {
  48229. if (!(this instanceof s)) return new s();
  48230. A.call(this), this.h = [3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428];
  48231. }
  48232. e.inherits(s, A), C.exports = s, s.blockSize = 512, s.outSize = 224, s.hmacStrength = 192, s.padLength = 64, s.prototype._digest = function(l) {
  48233. return l === "hex" ? e.toHex32(this.h.slice(0, 7), "big") : e.split32(this.h.slice(0, 7), "big");
  48234. };
  48235. }, { "../utils": 437, "./256": 433 }], 433: [function(g, C, i) {
  48236. var e = g("../utils"), A = g("../common"), s = g("./common"), l = g("minimalistic-assert"), n = e.sum32, a = e.sum32_4, d = e.sum32_5, o = s.ch32, c = s.maj32, r = s.s0_256, h = s.s1_256, b = s.g0_256, u = s.g1_256, m = A.BlockHash, Z = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298];
  48237. function p() {
  48238. if (!(this instanceof p)) return new p();
  48239. m.call(this), this.h = [1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225], this.k = Z, this.W = new Array(64);
  48240. }
  48241. e.inherits(p, m), C.exports = p, p.blockSize = 512, p.outSize = 256, p.hmacStrength = 192, p.padLength = 64, p.prototype._update = function(Y, R) {
  48242. for (var X = this.W, H = 0; H < 16; H++) X[H] = Y[R + H];
  48243. for (; H < X.length; H++) X[H] = a(u(X[H - 2]), X[H - 7], b(X[H - 15]), X[H - 16]);
  48244. var S = this.h[0], z = this.h[1], v = this.h[2], K = this.h[3], V = this.h[4], N = this.h[5], B = this.h[6], G = this.h[7];
  48245. for (l(this.k.length === X.length), H = 0; H < X.length; H++) {
  48246. var w = d(G, h(V), o(V, N, B), this.k[H], X[H]), W = n(r(S), c(S, z, v));
  48247. G = B, B = N, N = V, V = n(K, w), K = v, v = z, z = S, S = n(w, W);
  48248. }
  48249. this.h[0] = n(this.h[0], S), this.h[1] = n(this.h[1], z), this.h[2] = n(this.h[2], v), this.h[3] = n(this.h[3], K), this.h[4] = n(this.h[4], V), this.h[5] = n(this.h[5], N), this.h[6] = n(this.h[6], B), this.h[7] = n(this.h[7], G);
  48250. }, p.prototype._digest = function(Y) {
  48251. return Y === "hex" ? e.toHex32(this.h, "big") : e.split32(this.h, "big");
  48252. };
  48253. }, { "../common": 427, "../utils": 437, "./common": 436, "minimalistic-assert": 453 }], 434: [function(g, C, i) {
  48254. var e = g("../utils"), A = g("./512");
  48255. function s() {
  48256. if (!(this instanceof s)) return new s();
  48257. A.call(this), this.h = [3418070365, 3238371032, 1654270250, 914150663, 2438529370, 812702999, 355462360, 4144912697, 1731405415, 4290775857, 2394180231, 1750603025, 3675008525, 1694076839, 1203062813, 3204075428];
  48258. }
  48259. e.inherits(s, A), C.exports = s, s.blockSize = 1024, s.outSize = 384, s.hmacStrength = 192, s.padLength = 128, s.prototype._digest = function(l) {
  48260. return l === "hex" ? e.toHex32(this.h.slice(0, 12), "big") : e.split32(this.h.slice(0, 12), "big");
  48261. };
  48262. }, { "../utils": 437, "./512": 435 }], 435: [function(g, C, i) {
  48263. var e = g("../utils"), A = g("../common"), s = g("minimalistic-assert"), l = e.rotr64_hi, n = e.rotr64_lo, a = e.shr64_hi, d = e.shr64_lo, o = e.sum64, c = e.sum64_hi, r = e.sum64_lo, h = e.sum64_4_hi, b = e.sum64_4_lo, u = e.sum64_5_hi, m = e.sum64_5_lo, Z = A.BlockHash, p = [1116352408, 3609767458, 1899447441, 602891725, 3049323471, 3964484399, 3921009573, 2173295548, 961987163, 4081628472, 1508970993, 3053834265, 2453635748, 2937671579, 2870763221, 3664609560, 3624381080, 2734883394, 310598401, 1164996542, 607225278, 1323610764, 1426881987, 3590304994, 1925078388, 4068182383, 2162078206, 991336113, 2614888103, 633803317, 3248222580, 3479774868, 3835390401, 2666613458, 4022224774, 944711139, 264347078, 2341262773, 604807628, 2007800933, 770255983, 1495990901, 1249150122, 1856431235, 1555081692, 3175218132, 1996064986, 2198950837, 2554220882, 3999719339, 2821834349, 766784016, 2952996808, 2566594879, 3210313671, 3203337956, 3336571891, 1034457026, 3584528711, 2466948901, 113926993, 3758326383, 338241895, 168717936, 666307205, 1188179964, 773529912, 1546045734, 1294757372, 1522805485, 1396182291, 2643833823, 1695183700, 2343527390, 1986661051, 1014477480, 2177026350, 1206759142, 2456956037, 344077627, 2730485921, 1290863460, 2820302411, 3158454273, 3259730800, 3505952657, 3345764771, 106217008, 3516065817, 3606008344, 3600352804, 1432725776, 4094571909, 1467031594, 275423344, 851169720, 430227734, 3100823752, 506948616, 1363258195, 659060556, 3750685593, 883997877, 3785050280, 958139571, 3318307427, 1322822218, 3812723403, 1537002063, 2003034995, 1747873779, 3602036899, 1955562222, 1575990012, 2024104815, 1125592928, 2227730452, 2716904306, 2361852424, 442776044, 2428436474, 593698344, 2756734187, 3733110249, 3204031479, 2999351573, 3329325298, 3815920427, 3391569614, 3928383900, 3515267271, 566280711, 3940187606, 3454069534, 4118630271, 4000239992, 116418474, 1914138554, 174292421, 2731055270, 289380356, 3203993006, 460393269, 320620315, 685471733, 587496836, 852142971, 1086792851, 1017036298, 365543100, 1126000580, 2618297676, 1288033470, 3409855158, 1501505948, 4234509866, 1607167915, 987167468, 1816402316, 1246189591];
  48264. function Y() {
  48265. if (!(this instanceof Y)) return new Y();
  48266. Z.call(this), this.h = [1779033703, 4089235720, 3144134277, 2227873595, 1013904242, 4271175723, 2773480762, 1595750129, 1359893119, 2917565137, 2600822924, 725511199, 528734635, 4215389547, 1541459225, 327033209], this.k = p, this.W = new Array(160);
  48267. }
  48268. function R(W, y, f, D, F) {
  48269. var T = W & f ^ ~W & F;
  48270. return T < 0 && (T += 4294967296), T;
  48271. }
  48272. function X(W, y, f, D, F, T) {
  48273. var Q = y & D ^ ~y & T;
  48274. return Q < 0 && (Q += 4294967296), Q;
  48275. }
  48276. function H(W, y, f, D, F) {
  48277. var T = W & f ^ W & F ^ f & F;
  48278. return T < 0 && (T += 4294967296), T;
  48279. }
  48280. function S(W, y, f, D, F, T) {
  48281. var Q = y & D ^ y & T ^ D & T;
  48282. return Q < 0 && (Q += 4294967296), Q;
  48283. }
  48284. function z(W, y) {
  48285. var f = l(W, y, 28) ^ l(y, W, 2) ^ l(y, W, 7);
  48286. return f < 0 && (f += 4294967296), f;
  48287. }
  48288. function v(W, y) {
  48289. var f = n(W, y, 28) ^ n(y, W, 2) ^ n(y, W, 7);
  48290. return f < 0 && (f += 4294967296), f;
  48291. }
  48292. function K(W, y) {
  48293. var f = l(W, y, 14) ^ l(W, y, 18) ^ l(y, W, 9);
  48294. return f < 0 && (f += 4294967296), f;
  48295. }
  48296. function V(W, y) {
  48297. var f = n(W, y, 14) ^ n(W, y, 18) ^ n(y, W, 9);
  48298. return f < 0 && (f += 4294967296), f;
  48299. }
  48300. function N(W, y) {
  48301. var f = l(W, y, 1) ^ l(W, y, 8) ^ a(W, y, 7);
  48302. return f < 0 && (f += 4294967296), f;
  48303. }
  48304. function B(W, y) {
  48305. var f = n(W, y, 1) ^ n(W, y, 8) ^ d(W, y, 7);
  48306. return f < 0 && (f += 4294967296), f;
  48307. }
  48308. function G(W, y) {
  48309. var f = l(W, y, 19) ^ l(y, W, 29) ^ a(W, y, 6);
  48310. return f < 0 && (f += 4294967296), f;
  48311. }
  48312. function w(W, y) {
  48313. var f = n(W, y, 19) ^ n(y, W, 29) ^ d(W, y, 6);
  48314. return f < 0 && (f += 4294967296), f;
  48315. }
  48316. e.inherits(Y, Z), C.exports = Y, Y.blockSize = 1024, Y.outSize = 512, Y.hmacStrength = 192, Y.padLength = 128, Y.prototype._prepareBlock = function(W, y) {
  48317. for (var f = this.W, D = 0; D < 32; D++) f[D] = W[y + D];
  48318. for (; D < f.length; D += 2) {
  48319. var F = G(f[D - 4], f[D - 3]), T = w(f[D - 4], f[D - 3]), Q = f[D - 14], P = f[D - 13], L = N(f[D - 30], f[D - 29]), E = B(f[D - 30], f[D - 29]), J = f[D - 32], k = f[D - 31];
  48320. f[D] = h(F, T, Q, P, L, E, J, k), f[D + 1] = b(F, T, Q, P, L, E, J, k);
  48321. }
  48322. }, Y.prototype._update = function(W, y) {
  48323. this._prepareBlock(W, y);
  48324. var f = this.W, D = this.h[0], F = this.h[1], T = this.h[2], Q = this.h[3], P = this.h[4], L = this.h[5], E = this.h[6], J = this.h[7], k = this.h[8], j = this.h[9], q = this.h[10], Cg = this.h[11], Ig = this.h[12], x = this.h[13], Ag = this.h[14], eg = this.h[15];
  48325. s(this.k.length === f.length);
  48326. for (var O = 0; O < f.length; O += 2) {
  48327. var _ = Ag, gg = eg, lg = K(k, j), ng = V(k, j), sg = R(k, j, q, Cg, Ig), og = X(k, j, q, Cg, Ig, x), cg = this.k[O], rg = this.k[O + 1], dg = f[O], Bg = f[O + 1], Zg = u(_, gg, lg, ng, sg, og, cg, rg, dg, Bg), Xg = m(_, gg, lg, ng, sg, og, cg, rg, dg, Bg);
  48328. _ = z(D, F), gg = v(D, F), lg = H(D, F, T, Q, P), ng = S(D, F, T, Q, P, L);
  48329. var Kg = c(_, gg, lg, ng), kg = r(_, gg, lg, ng);
  48330. Ag = Ig, eg = x, Ig = q, x = Cg, q = k, Cg = j, k = c(E, J, Zg, Xg), j = r(J, J, Zg, Xg), E = P, J = L, P = T, L = Q, T = D, Q = F, D = c(Zg, Xg, Kg, kg), F = r(Zg, Xg, Kg, kg);
  48331. }
  48332. o(this.h, 0, D, F), o(this.h, 2, T, Q), o(this.h, 4, P, L), o(this.h, 6, E, J), o(this.h, 8, k, j), o(this.h, 10, q, Cg), o(this.h, 12, Ig, x), o(this.h, 14, Ag, eg);
  48333. }, Y.prototype._digest = function(W) {
  48334. return W === "hex" ? e.toHex32(this.h, "big") : e.split32(this.h, "big");
  48335. };
  48336. }, { "../common": 427, "../utils": 437, "minimalistic-assert": 453 }], 436: [function(g, C, i) {
  48337. var e = g("../utils").rotr32;
  48338. function A(n, a, d) {
  48339. return n & a ^ ~n & d;
  48340. }
  48341. function s(n, a, d) {
  48342. return n & a ^ n & d ^ a & d;
  48343. }
  48344. function l(n, a, d) {
  48345. return n ^ a ^ d;
  48346. }
  48347. i.ft_1 = function(n, a, d, o) {
  48348. return n === 0 ? A(a, d, o) : n === 1 || n === 3 ? l(a, d, o) : n === 2 ? s(a, d, o) : void 0;
  48349. }, i.ch32 = A, i.maj32 = s, i.p32 = l, i.s0_256 = function(n) {
  48350. return e(n, 2) ^ e(n, 13) ^ e(n, 22);
  48351. }, i.s1_256 = function(n) {
  48352. return e(n, 6) ^ e(n, 11) ^ e(n, 25);
  48353. }, i.g0_256 = function(n) {
  48354. return e(n, 7) ^ e(n, 18) ^ n >>> 3;
  48355. }, i.g1_256 = function(n) {
  48356. return e(n, 17) ^ e(n, 19) ^ n >>> 10;
  48357. };
  48358. }, { "../utils": 437 }], 437: [function(g, C, i) {
  48359. var e = g("minimalistic-assert"), A = g("inherits");
  48360. function s(d, o) {
  48361. return (64512 & d.charCodeAt(o)) == 55296 && !(o < 0 || o + 1 >= d.length) && (64512 & d.charCodeAt(o + 1)) == 56320;
  48362. }
  48363. function l(d) {
  48364. return (d >>> 24 | d >>> 8 & 65280 | d << 8 & 16711680 | (255 & d) << 24) >>> 0;
  48365. }
  48366. function n(d) {
  48367. return d.length === 1 ? "0" + d : d;
  48368. }
  48369. function a(d) {
  48370. return d.length === 7 ? "0" + d : d.length === 6 ? "00" + d : d.length === 5 ? "000" + d : d.length === 4 ? "0000" + d : d.length === 3 ? "00000" + d : d.length === 2 ? "000000" + d : d.length === 1 ? "0000000" + d : d;
  48371. }
  48372. i.inherits = A, i.toArray = function(d, o) {
  48373. if (Array.isArray(d)) return d.slice();
  48374. if (!d) return [];
  48375. var c = [];
  48376. if (typeof d == "string") if (o) {
  48377. if (o === "hex") for ((d = d.replace(/[^a-z0-9]+/gi, "")).length % 2 != 0 && (d = "0" + d), h = 0; h < d.length; h += 2) c.push(parseInt(d[h] + d[h + 1], 16));
  48378. } else for (var r = 0, h = 0; h < d.length; h++) {
  48379. var b = d.charCodeAt(h);
  48380. b < 128 ? c[r++] = b : b < 2048 ? (c[r++] = b >> 6 | 192, c[r++] = 63 & b | 128) : s(d, h) ? (b = 65536 + ((1023 & b) << 10) + (1023 & d.charCodeAt(++h)), c[r++] = b >> 18 | 240, c[r++] = b >> 12 & 63 | 128, c[r++] = b >> 6 & 63 | 128, c[r++] = 63 & b | 128) : (c[r++] = b >> 12 | 224, c[r++] = b >> 6 & 63 | 128, c[r++] = 63 & b | 128);
  48381. }
  48382. else for (h = 0; h < d.length; h++) c[h] = 0 | d[h];
  48383. return c;
  48384. }, i.toHex = function(d) {
  48385. for (var o = "", c = 0; c < d.length; c++) o += n(d[c].toString(16));
  48386. return o;
  48387. }, i.htonl = l, i.toHex32 = function(d, o) {
  48388. for (var c = "", r = 0; r < d.length; r++) {
  48389. var h = d[r];
  48390. o === "little" && (h = l(h)), c += a(h.toString(16));
  48391. }
  48392. return c;
  48393. }, i.zero2 = n, i.zero8 = a, i.join32 = function(d, o, c, r) {
  48394. var h = c - o;
  48395. e(h % 4 == 0);
  48396. for (var b = new Array(h / 4), u = 0, m = o; u < b.length; u++, m += 4) {
  48397. var Z;
  48398. Z = r === "big" ? d[m] << 24 | d[m + 1] << 16 | d[m + 2] << 8 | d[m + 3] : d[m + 3] << 24 | d[m + 2] << 16 | d[m + 1] << 8 | d[m], b[u] = Z >>> 0;
  48399. }
  48400. return b;
  48401. }, i.split32 = function(d, o) {
  48402. for (var c = new Array(4 * d.length), r = 0, h = 0; r < d.length; r++, h += 4) {
  48403. var b = d[r];
  48404. o === "big" ? (c[h] = b >>> 24, c[h + 1] = b >>> 16 & 255, c[h + 2] = b >>> 8 & 255, c[h + 3] = 255 & b) : (c[h + 3] = b >>> 24, c[h + 2] = b >>> 16 & 255, c[h + 1] = b >>> 8 & 255, c[h] = 255 & b);
  48405. }
  48406. return c;
  48407. }, i.rotr32 = function(d, o) {
  48408. return d >>> o | d << 32 - o;
  48409. }, i.rotl32 = function(d, o) {
  48410. return d << o | d >>> 32 - o;
  48411. }, i.sum32 = function(d, o) {
  48412. return d + o >>> 0;
  48413. }, i.sum32_3 = function(d, o, c) {
  48414. return d + o + c >>> 0;
  48415. }, i.sum32_4 = function(d, o, c, r) {
  48416. return d + o + c + r >>> 0;
  48417. }, i.sum32_5 = function(d, o, c, r, h) {
  48418. return d + o + c + r + h >>> 0;
  48419. }, i.sum64 = function(d, o, c, r) {
  48420. var h = d[o], b = r + d[o + 1] >>> 0, u = (b < r ? 1 : 0) + c + h;
  48421. d[o] = u >>> 0, d[o + 1] = b;
  48422. }, i.sum64_hi = function(d, o, c, r) {
  48423. return (o + r >>> 0 < o ? 1 : 0) + d + c >>> 0;
  48424. }, i.sum64_lo = function(d, o, c, r) {
  48425. return o + r >>> 0;
  48426. }, i.sum64_4_hi = function(d, o, c, r, h, b, u, m) {
  48427. var Z = 0, p = o;
  48428. return Z += (p = p + r >>> 0) < o ? 1 : 0, Z += (p = p + b >>> 0) < b ? 1 : 0, d + c + h + u + (Z += (p = p + m >>> 0) < m ? 1 : 0) >>> 0;
  48429. }, i.sum64_4_lo = function(d, o, c, r, h, b, u, m) {
  48430. return o + r + b + m >>> 0;
  48431. }, i.sum64_5_hi = function(d, o, c, r, h, b, u, m, Z, p) {
  48432. var Y = 0, R = o;
  48433. return Y += (R = R + r >>> 0) < o ? 1 : 0, Y += (R = R + b >>> 0) < b ? 1 : 0, Y += (R = R + m >>> 0) < m ? 1 : 0, d + c + h + u + Z + (Y += (R = R + p >>> 0) < p ? 1 : 0) >>> 0;
  48434. }, i.sum64_5_lo = function(d, o, c, r, h, b, u, m, Z, p) {
  48435. return o + r + b + m + p >>> 0;
  48436. }, i.rotr64_hi = function(d, o, c) {
  48437. return (o << 32 - c | d >>> c) >>> 0;
  48438. }, i.rotr64_lo = function(d, o, c) {
  48439. return (d << 32 - c | o >>> c) >>> 0;
  48440. }, i.shr64_hi = function(d, o, c) {
  48441. return d >>> c;
  48442. }, i.shr64_lo = function(d, o, c) {
  48443. return (d << 32 - c | o >>> c) >>> 0;
  48444. };
  48445. }, { inherits: 440, "minimalistic-assert": 453 }], 438: [function(g, C, i) {
  48446. var e = g("hash.js"), A = g("minimalistic-crypto-utils"), s = g("minimalistic-assert");
  48447. function l(n) {
  48448. if (!(this instanceof l)) return new l(n);
  48449. this.hash = n.hash, this.predResist = !!n.predResist, this.outLen = this.hash.outSize, this.minEntropy = n.minEntropy || this.hash.hmacStrength, this._reseed = null, this.reseedInterval = null, this.K = null, this.V = null;
  48450. var a = A.toArray(n.entropy, n.entropyEnc || "hex"), d = A.toArray(n.nonce, n.nonceEnc || "hex"), o = A.toArray(n.pers, n.persEnc || "hex");
  48451. s(a.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits"), this._init(a, d, o);
  48452. }
  48453. C.exports = l, l.prototype._init = function(n, a, d) {
  48454. var o = n.concat(a).concat(d);
  48455. this.K = new Array(this.outLen / 8), this.V = new Array(this.outLen / 8);
  48456. for (var c = 0; c < this.V.length; c++) this.K[c] = 0, this.V[c] = 1;
  48457. this._update(o), this._reseed = 1, this.reseedInterval = 281474976710656;
  48458. }, l.prototype._hmac = function() {
  48459. return new e.hmac(this.hash, this.K);
  48460. }, l.prototype._update = function(n) {
  48461. var a = this._hmac().update(this.V).update([0]);
  48462. n && (a = a.update(n)), this.K = a.digest(), this.V = this._hmac().update(this.V).digest(), n && (this.K = this._hmac().update(this.V).update([1]).update(n).digest(), this.V = this._hmac().update(this.V).digest());
  48463. }, l.prototype.reseed = function(n, a, d, o) {
  48464. typeof a != "string" && (o = d, d = a, a = null), n = A.toArray(n, a), d = A.toArray(d, o), s(n.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits"), this._update(n.concat(d || [])), this._reseed = 1;
  48465. }, l.prototype.generate = function(n, a, d, o) {
  48466. if (this._reseed > this.reseedInterval) throw new Error("Reseed is required");
  48467. typeof a != "string" && (o = d, d = a, a = null), d && (d = A.toArray(d, o || "hex"), this._update(d));
  48468. for (var c = []; c.length < n; ) this.V = this._hmac().update(this.V).digest(), c = c.concat(this.V);
  48469. var r = c.slice(0, n);
  48470. return this._update(d), this._reseed++, A.encode(r, a);
  48471. };
  48472. }, { "hash.js": 426, "minimalistic-assert": 453, "minimalistic-crypto-utils": 454 }], 439: [function(g, C, i) {
  48473. /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
  48474. i.read = function(e, A, s, l, n) {
  48475. var a, d, o = 8 * n - l - 1, c = (1 << o) - 1, r = c >> 1, h = -7, b = s ? n - 1 : 0, u = s ? -1 : 1, m = e[A + b];
  48476. for (b += u, a = m & (1 << -h) - 1, m >>= -h, h += o; h > 0; a = 256 * a + e[A + b], b += u, h -= 8) ;
  48477. for (d = a & (1 << -h) - 1, a >>= -h, h += l; h > 0; d = 256 * d + e[A + b], b += u, h -= 8) ;
  48478. if (a === 0) a = 1 - r;
  48479. else {
  48480. if (a === c) return d ? NaN : 1 / 0 * (m ? -1 : 1);
  48481. d += Math.pow(2, l), a -= r;
  48482. }
  48483. return (m ? -1 : 1) * d * Math.pow(2, a - l);
  48484. }, i.write = function(e, A, s, l, n, a) {
  48485. var d, o, c, r = 8 * a - n - 1, h = (1 << r) - 1, b = h >> 1, u = n === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0, m = l ? 0 : a - 1, Z = l ? 1 : -1, p = A < 0 || A === 0 && 1 / A < 0 ? 1 : 0;
  48486. for (A = Math.abs(A), isNaN(A) || A === 1 / 0 ? (o = isNaN(A) ? 1 : 0, d = h) : (d = Math.floor(Math.log(A) / Math.LN2), A * (c = Math.pow(2, -d)) < 1 && (d--, c *= 2), (A += d + b >= 1 ? u / c : u * Math.pow(2, 1 - b)) * c >= 2 && (d++, c /= 2), d + b >= h ? (o = 0, d = h) : d + b >= 1 ? (o = (A * c - 1) * Math.pow(2, n), d += b) : (o = A * Math.pow(2, b - 1) * Math.pow(2, n), d = 0)); n >= 8; e[s + m] = 255 & o, m += Z, o /= 256, n -= 8) ;
  48487. for (d = d << n | o, r += n; r > 0; e[s + m] = 255 & d, m += Z, d /= 256, r -= 8) ;
  48488. e[s + m - Z] |= 128 * p;
  48489. };
  48490. }, {}], 440: [function(g, C, i) {
  48491. typeof Object.create == "function" ? C.exports = function(e, A) {
  48492. A && (e.super_ = A, e.prototype = Object.create(A.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }));
  48493. } : C.exports = function(e, A) {
  48494. if (A) {
  48495. e.super_ = A;
  48496. var s = function() {
  48497. };
  48498. s.prototype = A.prototype, e.prototype = new s(), e.prototype.constructor = e;
  48499. }
  48500. };
  48501. }, {}], 441: [function(g, C, i) {
  48502. (function(e, A, s, l, n, a, d, o) {
  48503. (function() {
  48504. /*!
  48505. JSZip v3.10.1 - A JavaScript class for generating and reading zip files
  48506. <http://stuartk.com/jszip>
  48507. (c) 2009-2016 Stuart Knightley <stuart [at] stuartk.com>
  48508. Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.
  48509. JSZip uses the library pako released under the MIT license :
  48510. https://github.com/nodeca/pako/blob/main/LICENSE
  48511. */
  48512. (function(c) {
  48513. typeof i == "object" && C !== void 0 ? C.exports = c() : (typeof window < "u" ? window : A !== void 0 ? A : typeof self < "u" ? self : this).JSZip = c();
  48514. })(function() {
  48515. return function c(r, h, b) {
  48516. function u(p, Y) {
  48517. if (!h[p]) {
  48518. if (!r[p]) {
  48519. var R = typeof g == "function" && g;
  48520. if (!Y && R) return R(p, !0);
  48521. if (m) return m(p, !0);
  48522. var X = new Error("Cannot find module '" + p + "'");
  48523. throw X.code = "MODULE_NOT_FOUND", X;
  48524. }
  48525. var H = h[p] = { exports: {} };
  48526. r[p][0].call(H.exports, function(S) {
  48527. return u(r[p][1][S] || S);
  48528. }, H, H.exports, c, r, h, b);
  48529. }
  48530. return h[p].exports;
  48531. }
  48532. for (var m = typeof g == "function" && g, Z = 0; Z < b.length; Z++) u(b[Z]);
  48533. return u;
  48534. }({ 1: [function(c, r, h) {
  48535. var b = c("./utils"), u = c("./support"), m = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  48536. h.encode = function(Z) {
  48537. for (var p, Y, R, X, H, S, z, v = [], K = 0, V = Z.length, N = V, B = b.getTypeOf(Z) !== "string"; K < Z.length; ) N = V - K, R = B ? (p = Z[K++], Y = K < V ? Z[K++] : 0, K < V ? Z[K++] : 0) : (p = Z.charCodeAt(K++), Y = K < V ? Z.charCodeAt(K++) : 0, K < V ? Z.charCodeAt(K++) : 0), X = p >> 2, H = (3 & p) << 4 | Y >> 4, S = 1 < N ? (15 & Y) << 2 | R >> 6 : 64, z = 2 < N ? 63 & R : 64, v.push(m.charAt(X) + m.charAt(H) + m.charAt(S) + m.charAt(z));
  48538. return v.join("");
  48539. }, h.decode = function(Z) {
  48540. var p, Y, R, X, H, S, z = 0, v = 0, K = "data:";
  48541. if (Z.substr(0, K.length) === K) throw new Error("Invalid base64 input, it looks like a data url.");
  48542. var V, N = 3 * (Z = Z.replace(/[^A-Za-z0-9+/=]/g, "")).length / 4;
  48543. if (Z.charAt(Z.length - 1) === m.charAt(64) && N--, Z.charAt(Z.length - 2) === m.charAt(64) && N--, N % 1 != 0) throw new Error("Invalid base64 input, bad content length.");
  48544. for (V = u.uint8array ? new Uint8Array(0 | N) : new Array(0 | N); z < Z.length; ) p = m.indexOf(Z.charAt(z++)) << 2 | (X = m.indexOf(Z.charAt(z++))) >> 4, Y = (15 & X) << 4 | (H = m.indexOf(Z.charAt(z++))) >> 2, R = (3 & H) << 6 | (S = m.indexOf(Z.charAt(z++))), V[v++] = p, H !== 64 && (V[v++] = Y), S !== 64 && (V[v++] = R);
  48545. return V;
  48546. };
  48547. }, { "./support": 30, "./utils": 32 }], 2: [function(c, r, h) {
  48548. var b = c("./external"), u = c("./stream/DataWorker"), m = c("./stream/Crc32Probe"), Z = c("./stream/DataLengthProbe");
  48549. function p(Y, R, X, H, S) {
  48550. this.compressedSize = Y, this.uncompressedSize = R, this.crc32 = X, this.compression = H, this.compressedContent = S;
  48551. }
  48552. p.prototype = { getContentWorker: function() {
  48553. var Y = new u(b.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new Z("data_length")), R = this;
  48554. return Y.on("end", function() {
  48555. if (this.streamInfo.data_length !== R.uncompressedSize) throw new Error("Bug : uncompressed data size mismatch");
  48556. }), Y;
  48557. }, getCompressedWorker: function() {
  48558. return new u(b.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize", this.compressedSize).withStreamInfo("uncompressedSize", this.uncompressedSize).withStreamInfo("crc32", this.crc32).withStreamInfo("compression", this.compression);
  48559. } }, p.createWorkerFrom = function(Y, R, X) {
  48560. return Y.pipe(new m()).pipe(new Z("uncompressedSize")).pipe(R.compressWorker(X)).pipe(new Z("compressedSize")).withStreamInfo("compression", R);
  48561. }, r.exports = p;
  48562. }, { "./external": 6, "./stream/Crc32Probe": 25, "./stream/DataLengthProbe": 26, "./stream/DataWorker": 27 }], 3: [function(c, r, h) {
  48563. var b = c("./stream/GenericWorker");
  48564. h.STORE = { magic: "\0\0", compressWorker: function() {
  48565. return new b("STORE compression");
  48566. }, uncompressWorker: function() {
  48567. return new b("STORE decompression");
  48568. } }, h.DEFLATE = c("./flate");
  48569. }, { "./flate": 7, "./stream/GenericWorker": 28 }], 4: [function(c, r, h) {
  48570. var b = c("./utils"), u = function() {
  48571. for (var m, Z = [], p = 0; p < 256; p++) {
  48572. m = p;
  48573. for (var Y = 0; Y < 8; Y++) m = 1 & m ? 3988292384 ^ m >>> 1 : m >>> 1;
  48574. Z[p] = m;
  48575. }
  48576. return Z;
  48577. }();
  48578. r.exports = function(m, Z) {
  48579. return m !== void 0 && m.length ? b.getTypeOf(m) !== "string" ? function(p, Y, R, X) {
  48580. var H = u, S = 0 + R;
  48581. p ^= -1;
  48582. for (var z = 0; z < S; z++) p = p >>> 8 ^ H[255 & (p ^ Y[z])];
  48583. return -1 ^ p;
  48584. }(0 | Z, m, m.length) : function(p, Y, R, X) {
  48585. var H = u, S = 0 + R;
  48586. p ^= -1;
  48587. for (var z = 0; z < S; z++) p = p >>> 8 ^ H[255 & (p ^ Y.charCodeAt(z))];
  48588. return -1 ^ p;
  48589. }(0 | Z, m, m.length) : 0;
  48590. };
  48591. }, { "./utils": 32 }], 5: [function(c, r, h) {
  48592. h.base64 = !1, h.binary = !1, h.dir = !1, h.createFolders = !0, h.date = null, h.compression = null, h.compressionOptions = null, h.comment = null, h.unixPermissions = null, h.dosPermissions = null;
  48593. }, {}], 6: [function(c, r, h) {
  48594. var b;
  48595. b = typeof Promise < "u" ? Promise : c("lie"), r.exports = { Promise: b };
  48596. }, { lie: 37 }], 7: [function(c, r, h) {
  48597. var b = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Uint32Array < "u", u = c("pako"), m = c("./utils"), Z = c("./stream/GenericWorker"), p = b ? "uint8array" : "array";
  48598. function Y(R, X) {
  48599. Z.call(this, "FlateWorker/" + R), this._pako = null, this._pakoAction = R, this._pakoOptions = X, this.meta = {};
  48600. }
  48601. h.magic = "\b\0", m.inherits(Y, Z), Y.prototype.processChunk = function(R) {
  48602. this.meta = R.meta, this._pako === null && this._createPako(), this._pako.push(m.transformTo(p, R.data), !1);
  48603. }, Y.prototype.flush = function() {
  48604. Z.prototype.flush.call(this), this._pako === null && this._createPako(), this._pako.push([], !0);
  48605. }, Y.prototype.cleanUp = function() {
  48606. Z.prototype.cleanUp.call(this), this._pako = null;
  48607. }, Y.prototype._createPako = function() {
  48608. this._pako = new u[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });
  48609. var R = this;
  48610. this._pako.onData = function(X) {
  48611. R.push({ data: X, meta: R.meta });
  48612. };
  48613. }, h.compressWorker = function(R) {
  48614. return new Y("Deflate", R);
  48615. }, h.uncompressWorker = function() {
  48616. return new Y("Inflate", {});
  48617. };
  48618. }, { "./stream/GenericWorker": 28, "./utils": 32, pako: 38 }], 8: [function(c, r, h) {
  48619. function b(H, S) {
  48620. var z, v = "";
  48621. for (z = 0; z < S; z++) v += String.fromCharCode(255 & H), H >>>= 8;
  48622. return v;
  48623. }
  48624. function u(H, S, z, v, K, V) {
  48625. var N, B, G = H.file, w = H.compression, W = V !== p.utf8encode, y = m.transformTo("string", V(G.name)), f = m.transformTo("string", p.utf8encode(G.name)), D = G.comment, F = m.transformTo("string", V(D)), T = m.transformTo("string", p.utf8encode(D)), Q = f.length !== G.name.length, P = T.length !== D.length, L = "", E = "", J = "", k = G.dir, j = G.date, q = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };
  48626. S && !z || (q.crc32 = H.crc32, q.compressedSize = H.compressedSize, q.uncompressedSize = H.uncompressedSize);
  48627. var Cg = 0;
  48628. S && (Cg |= 8), W || !Q && !P || (Cg |= 2048);
  48629. var Ig = 0, x = 0;
  48630. k && (Ig |= 16), K === "UNIX" ? (x = 798, Ig |= function(eg, O) {
  48631. var _ = eg;
  48632. return eg || (_ = O ? 16893 : 33204), (65535 & _) << 16;
  48633. }(G.unixPermissions, k)) : (x = 20, Ig |= function(eg) {
  48634. return 63 & (eg || 0);
  48635. }(G.dosPermissions)), N = j.getUTCHours(), N <<= 6, N |= j.getUTCMinutes(), N <<= 5, N |= j.getUTCSeconds() / 2, B = j.getUTCFullYear() - 1980, B <<= 4, B |= j.getUTCMonth() + 1, B <<= 5, B |= j.getUTCDate(), Q && (E = b(1, 1) + b(Y(y), 4) + f, L += "up" + b(E.length, 2) + E), P && (J = b(1, 1) + b(Y(F), 4) + T, L += "uc" + b(J.length, 2) + J);
  48636. var Ag = "";
  48637. return Ag += `
  48638. \0`, Ag += b(Cg, 2), Ag += w.magic, Ag += b(N, 2), Ag += b(B, 2), Ag += b(q.crc32, 4), Ag += b(q.compressedSize, 4), Ag += b(q.uncompressedSize, 4), Ag += b(y.length, 2), Ag += b(L.length, 2), { fileRecord: R.LOCAL_FILE_HEADER + Ag + y + L, dirRecord: R.CENTRAL_FILE_HEADER + b(x, 2) + Ag + b(F.length, 2) + "\0\0\0\0" + b(Ig, 4) + b(v, 4) + y + L + F };
  48639. }
  48640. var m = c("../utils"), Z = c("../stream/GenericWorker"), p = c("../utf8"), Y = c("../crc32"), R = c("../signature");
  48641. function X(H, S, z, v) {
  48642. Z.call(this, "ZipFileWorker"), this.bytesWritten = 0, this.zipComment = S, this.zipPlatform = z, this.encodeFileName = v, this.streamFiles = H, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];
  48643. }
  48644. m.inherits(X, Z), X.prototype.push = function(H) {
  48645. var S = H.meta.percent || 0, z = this.entriesCount, v = this._sources.length;
  48646. this.accumulate ? this.contentBuffer.push(H) : (this.bytesWritten += H.data.length, Z.prototype.push.call(this, { data: H.data, meta: { currentFile: this.currentFile, percent: z ? (S + 100 * (z - v - 1)) / z : 100 } }));
  48647. }, X.prototype.openedSource = function(H) {
  48648. this.currentSourceOffset = this.bytesWritten, this.currentFile = H.file.name;
  48649. var S = this.streamFiles && !H.file.dir;
  48650. if (S) {
  48651. var z = u(H, S, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
  48652. this.push({ data: z.fileRecord, meta: { percent: 0 } });
  48653. } else this.accumulate = !0;
  48654. }, X.prototype.closedSource = function(H) {
  48655. this.accumulate = !1;
  48656. var S = this.streamFiles && !H.file.dir, z = u(H, S, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
  48657. if (this.dirRecords.push(z.dirRecord), S) this.push({ data: function(v) {
  48658. return R.DATA_DESCRIPTOR + b(v.crc32, 4) + b(v.compressedSize, 4) + b(v.uncompressedSize, 4);
  48659. }(H), meta: { percent: 100 } });
  48660. else for (this.push({ data: z.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length; ) this.push(this.contentBuffer.shift());
  48661. this.currentFile = null;
  48662. }, X.prototype.flush = function() {
  48663. for (var H = this.bytesWritten, S = 0; S < this.dirRecords.length; S++) this.push({ data: this.dirRecords[S], meta: { percent: 100 } });
  48664. var z = this.bytesWritten - H, v = function(K, V, N, B, G) {
  48665. var w = m.transformTo("string", G(B));
  48666. return R.CENTRAL_DIRECTORY_END + "\0\0\0\0" + b(K, 2) + b(K, 2) + b(V, 4) + b(N, 4) + b(w.length, 2) + w;
  48667. }(this.dirRecords.length, z, H, this.zipComment, this.encodeFileName);
  48668. this.push({ data: v, meta: { percent: 100 } });
  48669. }, X.prototype.prepareNextSource = function() {
  48670. this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();
  48671. }, X.prototype.registerPrevious = function(H) {
  48672. this._sources.push(H);
  48673. var S = this;
  48674. return H.on("data", function(z) {
  48675. S.processChunk(z);
  48676. }), H.on("end", function() {
  48677. S.closedSource(S.previous.streamInfo), S._sources.length ? S.prepareNextSource() : S.end();
  48678. }), H.on("error", function(z) {
  48679. S.error(z);
  48680. }), this;
  48681. }, X.prototype.resume = function() {
  48682. return !!Z.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));
  48683. }, X.prototype.error = function(H) {
  48684. var S = this._sources;
  48685. if (!Z.prototype.error.call(this, H)) return !1;
  48686. for (var z = 0; z < S.length; z++) try {
  48687. S[z].error(H);
  48688. } catch {
  48689. }
  48690. return !0;
  48691. }, X.prototype.lock = function() {
  48692. Z.prototype.lock.call(this);
  48693. for (var H = this._sources, S = 0; S < H.length; S++) H[S].lock();
  48694. }, r.exports = X;
  48695. }, { "../crc32": 4, "../signature": 23, "../stream/GenericWorker": 28, "../utf8": 31, "../utils": 32 }], 9: [function(c, r, h) {
  48696. var b = c("../compressions"), u = c("./ZipFileWorker");
  48697. h.generateWorker = function(m, Z, p) {
  48698. var Y = new u(Z.streamFiles, p, Z.platform, Z.encodeFileName), R = 0;
  48699. try {
  48700. m.forEach(function(X, H) {
  48701. R++;
  48702. var S = function(V, N) {
  48703. var B = V || N, G = b[B];
  48704. if (!G) throw new Error(B + " is not a valid compression method !");
  48705. return G;
  48706. }(H.options.compression, Z.compression), z = H.options.compressionOptions || Z.compressionOptions || {}, v = H.dir, K = H.date;
  48707. H._compressWorker(S, z).withStreamInfo("file", { name: X, dir: v, date: K, comment: H.comment || "", unixPermissions: H.unixPermissions, dosPermissions: H.dosPermissions }).pipe(Y);
  48708. }), Y.entriesCount = R;
  48709. } catch (X) {
  48710. Y.error(X);
  48711. }
  48712. return Y;
  48713. };
  48714. }, { "../compressions": 3, "./ZipFileWorker": 8 }], 10: [function(c, r, h) {
  48715. function b() {
  48716. if (!(this instanceof b)) return new b();
  48717. if (arguments.length) throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");
  48718. this.files = /* @__PURE__ */ Object.create(null), this.comment = null, this.root = "", this.clone = function() {
  48719. var u = new b();
  48720. for (var m in this) typeof this[m] != "function" && (u[m] = this[m]);
  48721. return u;
  48722. };
  48723. }
  48724. (b.prototype = c("./object")).loadAsync = c("./load"), b.support = c("./support"), b.defaults = c("./defaults"), b.version = "3.10.1", b.loadAsync = function(u, m) {
  48725. return new b().loadAsync(u, m);
  48726. }, b.external = c("./external"), r.exports = b;
  48727. }, { "./defaults": 5, "./external": 6, "./load": 11, "./object": 15, "./support": 30 }], 11: [function(c, r, h) {
  48728. var b = c("./utils"), u = c("./external"), m = c("./utf8"), Z = c("./zipEntries"), p = c("./stream/Crc32Probe"), Y = c("./nodejsUtils");
  48729. function R(X) {
  48730. return new u.Promise(function(H, S) {
  48731. var z = X.decompressed.getContentWorker().pipe(new p());
  48732. z.on("error", function(v) {
  48733. S(v);
  48734. }).on("end", function() {
  48735. z.streamInfo.crc32 !== X.decompressed.crc32 ? S(new Error("Corrupted zip : CRC32 mismatch")) : H();
  48736. }).resume();
  48737. });
  48738. }
  48739. r.exports = function(X, H) {
  48740. var S = this;
  48741. return H = b.extend(H || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: m.utf8decode }), Y.isNode && Y.isStream(X) ? u.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")) : b.prepareContent("the loaded zip file", X, !0, H.optimizedBinaryString, H.base64).then(function(z) {
  48742. var v = new Z(H);
  48743. return v.load(z), v;
  48744. }).then(function(z) {
  48745. var v = [u.Promise.resolve(z)], K = z.files;
  48746. if (H.checkCRC32) for (var V = 0; V < K.length; V++) v.push(R(K[V]));
  48747. return u.Promise.all(v);
  48748. }).then(function(z) {
  48749. for (var v = z.shift(), K = v.files, V = 0; V < K.length; V++) {
  48750. var N = K[V], B = N.fileNameStr, G = b.resolve(N.fileNameStr);
  48751. S.file(G, N.decompressed, { binary: !0, optimizedBinaryString: !0, date: N.date, dir: N.dir, comment: N.fileCommentStr.length ? N.fileCommentStr : null, unixPermissions: N.unixPermissions, dosPermissions: N.dosPermissions, createFolders: H.createFolders }), N.dir || (S.file(G).unsafeOriginalName = B);
  48752. }
  48753. return v.zipComment.length && (S.comment = v.zipComment), S;
  48754. });
  48755. };
  48756. }, { "./external": 6, "./nodejsUtils": 14, "./stream/Crc32Probe": 25, "./utf8": 31, "./utils": 32, "./zipEntries": 33 }], 12: [function(c, r, h) {
  48757. var b = c("../utils"), u = c("../stream/GenericWorker");
  48758. function m(Z, p) {
  48759. u.call(this, "Nodejs stream input adapter for " + Z), this._upstreamEnded = !1, this._bindStream(p);
  48760. }
  48761. b.inherits(m, u), m.prototype._bindStream = function(Z) {
  48762. var p = this;
  48763. (this._stream = Z).pause(), Z.on("data", function(Y) {
  48764. p.push({ data: Y, meta: { percent: 0 } });
  48765. }).on("error", function(Y) {
  48766. p.isPaused ? this.generatedError = Y : p.error(Y);
  48767. }).on("end", function() {
  48768. p.isPaused ? p._upstreamEnded = !0 : p.end();
  48769. });
  48770. }, m.prototype.pause = function() {
  48771. return !!u.prototype.pause.call(this) && (this._stream.pause(), !0);
  48772. }, m.prototype.resume = function() {
  48773. return !!u.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);
  48774. }, r.exports = m;
  48775. }, { "../stream/GenericWorker": 28, "../utils": 32 }], 13: [function(c, r, h) {
  48776. var b = c("readable-stream").Readable;
  48777. function u(m, Z, p) {
  48778. b.call(this, Z), this._helper = m;
  48779. var Y = this;
  48780. m.on("data", function(R, X) {
  48781. Y.push(R) || Y._helper.pause(), p && p(X);
  48782. }).on("error", function(R) {
  48783. Y.emit("error", R);
  48784. }).on("end", function() {
  48785. Y.push(null);
  48786. });
  48787. }
  48788. c("../utils").inherits(u, b), u.prototype._read = function() {
  48789. this._helper.resume();
  48790. }, r.exports = u;
  48791. }, { "../utils": 32, "readable-stream": 16 }], 14: [function(c, r, h) {
  48792. r.exports = { isNode: s !== void 0, newBufferFrom: function(b, u) {
  48793. if (s.from && s.from !== Uint8Array.from) return s.from(b, u);
  48794. if (typeof b == "number") throw new Error('The "data" argument must not be a number');
  48795. return new s(b, u);
  48796. }, allocBuffer: function(b) {
  48797. if (s.alloc) return s.alloc(b);
  48798. var u = new s(b);
  48799. return u.fill(0), u;
  48800. }, isBuffer: function(b) {
  48801. return s.isBuffer(b);
  48802. }, isStream: function(b) {
  48803. return b && typeof b.on == "function" && typeof b.pause == "function" && typeof b.resume == "function";
  48804. } };
  48805. }, {}], 15: [function(c, r, h) {
  48806. function b(G, w, W) {
  48807. var y, f = m.getTypeOf(w), D = m.extend(W || {}, Y);
  48808. D.date = D.date || /* @__PURE__ */ new Date(), D.compression !== null && (D.compression = D.compression.toUpperCase()), typeof D.unixPermissions == "string" && (D.unixPermissions = parseInt(D.unixPermissions, 8)), D.unixPermissions && 16384 & D.unixPermissions && (D.dir = !0), D.dosPermissions && 16 & D.dosPermissions && (D.dir = !0), D.dir && (G = K(G)), D.createFolders && (y = v(G)) && V.call(this, y, !0);
  48809. var F = f === "string" && D.binary === !1 && D.base64 === !1;
  48810. W && W.binary !== void 0 || (D.binary = !F), (w instanceof R && w.uncompressedSize === 0 || D.dir || !w || w.length === 0) && (D.base64 = !1, D.binary = !0, w = "", D.compression = "STORE", f = "string");
  48811. var T;
  48812. T = w instanceof R || w instanceof Z ? w : S.isNode && S.isStream(w) ? new z(G, w) : m.prepareContent(G, w, D.binary, D.optimizedBinaryString, D.base64);
  48813. var Q = new X(G, T, D);
  48814. this.files[G] = Q;
  48815. }
  48816. var u = c("./utf8"), m = c("./utils"), Z = c("./stream/GenericWorker"), p = c("./stream/StreamHelper"), Y = c("./defaults"), R = c("./compressedObject"), X = c("./zipObject"), H = c("./generate"), S = c("./nodejsUtils"), z = c("./nodejs/NodejsStreamInputAdapter"), v = function(G) {
  48817. G.slice(-1) === "/" && (G = G.substring(0, G.length - 1));
  48818. var w = G.lastIndexOf("/");
  48819. return 0 < w ? G.substring(0, w) : "";
  48820. }, K = function(G) {
  48821. return G.slice(-1) !== "/" && (G += "/"), G;
  48822. }, V = function(G, w) {
  48823. return w = w !== void 0 ? w : Y.createFolders, G = K(G), this.files[G] || b.call(this, G, null, { dir: !0, createFolders: w }), this.files[G];
  48824. };
  48825. function N(G) {
  48826. return Object.prototype.toString.call(G) === "[object RegExp]";
  48827. }
  48828. var B = { load: function() {
  48829. throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
  48830. }, forEach: function(G) {
  48831. var w, W, y;
  48832. for (w in this.files) y = this.files[w], (W = w.slice(this.root.length, w.length)) && w.slice(0, this.root.length) === this.root && G(W, y);
  48833. }, filter: function(G) {
  48834. var w = [];
  48835. return this.forEach(function(W, y) {
  48836. G(W, y) && w.push(y);
  48837. }), w;
  48838. }, file: function(G, w, W) {
  48839. if (arguments.length !== 1) return G = this.root + G, b.call(this, G, w, W), this;
  48840. if (N(G)) {
  48841. var y = G;
  48842. return this.filter(function(D, F) {
  48843. return !F.dir && y.test(D);
  48844. });
  48845. }
  48846. var f = this.files[this.root + G];
  48847. return f && !f.dir ? f : null;
  48848. }, folder: function(G) {
  48849. if (!G) return this;
  48850. if (N(G)) return this.filter(function(f, D) {
  48851. return D.dir && G.test(f);
  48852. });
  48853. var w = this.root + G, W = V.call(this, w), y = this.clone();
  48854. return y.root = W.name, y;
  48855. }, remove: function(G) {
  48856. G = this.root + G;
  48857. var w = this.files[G];
  48858. if (w || (G.slice(-1) !== "/" && (G += "/"), w = this.files[G]), w && !w.dir) delete this.files[G];
  48859. else for (var W = this.filter(function(f, D) {
  48860. return D.name.slice(0, G.length) === G;
  48861. }), y = 0; y < W.length; y++) delete this.files[W[y].name];
  48862. return this;
  48863. }, generate: function() {
  48864. throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
  48865. }, generateInternalStream: function(G) {
  48866. var w, W = {};
  48867. try {
  48868. if ((W = m.extend(G || {}, { streamFiles: !1, compression: "STORE", compressionOptions: null, type: "", platform: "DOS", comment: null, mimeType: "application/zip", encodeFileName: u.utf8encode })).type = W.type.toLowerCase(), W.compression = W.compression.toUpperCase(), W.type === "binarystring" && (W.type = "string"), !W.type) throw new Error("No output type specified.");
  48869. m.checkSupport(W.type), W.platform !== "darwin" && W.platform !== "freebsd" && W.platform !== "linux" && W.platform !== "sunos" || (W.platform = "UNIX"), W.platform === "win32" && (W.platform = "DOS");
  48870. var y = W.comment || this.comment || "";
  48871. w = H.generateWorker(this, W, y);
  48872. } catch (f) {
  48873. (w = new Z("error")).error(f);
  48874. }
  48875. return new p(w, W.type || "string", W.mimeType);
  48876. }, generateAsync: function(G, w) {
  48877. return this.generateInternalStream(G).accumulate(w);
  48878. }, generateNodeStream: function(G, w) {
  48879. return (G = G || {}).type || (G.type = "nodebuffer"), this.generateInternalStream(G).toNodejsStream(w);
  48880. } };
  48881. r.exports = B;
  48882. }, { "./compressedObject": 2, "./defaults": 5, "./generate": 9, "./nodejs/NodejsStreamInputAdapter": 12, "./nodejsUtils": 14, "./stream/GenericWorker": 28, "./stream/StreamHelper": 29, "./utf8": 31, "./utils": 32, "./zipObject": 35 }], 16: [function(c, r, h) {
  48883. r.exports = c("stream");
  48884. }, { stream: void 0 }], 17: [function(c, r, h) {
  48885. var b = c("./DataReader");
  48886. function u(m) {
  48887. b.call(this, m);
  48888. for (var Z = 0; Z < this.data.length; Z++) m[Z] = 255 & m[Z];
  48889. }
  48890. c("../utils").inherits(u, b), u.prototype.byteAt = function(m) {
  48891. return this.data[this.zero + m];
  48892. }, u.prototype.lastIndexOfSignature = function(m) {
  48893. for (var Z = m.charCodeAt(0), p = m.charCodeAt(1), Y = m.charCodeAt(2), R = m.charCodeAt(3), X = this.length - 4; 0 <= X; --X) if (this.data[X] === Z && this.data[X + 1] === p && this.data[X + 2] === Y && this.data[X + 3] === R) return X - this.zero;
  48894. return -1;
  48895. }, u.prototype.readAndCheckSignature = function(m) {
  48896. var Z = m.charCodeAt(0), p = m.charCodeAt(1), Y = m.charCodeAt(2), R = m.charCodeAt(3), X = this.readData(4);
  48897. return Z === X[0] && p === X[1] && Y === X[2] && R === X[3];
  48898. }, u.prototype.readData = function(m) {
  48899. if (this.checkOffset(m), m === 0) return [];
  48900. var Z = this.data.slice(this.zero + this.index, this.zero + this.index + m);
  48901. return this.index += m, Z;
  48902. }, r.exports = u;
  48903. }, { "../utils": 32, "./DataReader": 18 }], 18: [function(c, r, h) {
  48904. var b = c("../utils");
  48905. function u(m) {
  48906. this.data = m, this.length = m.length, this.index = 0, this.zero = 0;
  48907. }
  48908. u.prototype = { checkOffset: function(m) {
  48909. this.checkIndex(this.index + m);
  48910. }, checkIndex: function(m) {
  48911. if (this.length < this.zero + m || m < 0) throw new Error("End of data reached (data length = " + this.length + ", asked index = " + m + "). Corrupted zip ?");
  48912. }, setIndex: function(m) {
  48913. this.checkIndex(m), this.index = m;
  48914. }, skip: function(m) {
  48915. this.setIndex(this.index + m);
  48916. }, byteAt: function() {
  48917. }, readInt: function(m) {
  48918. var Z, p = 0;
  48919. for (this.checkOffset(m), Z = this.index + m - 1; Z >= this.index; Z--) p = (p << 8) + this.byteAt(Z);
  48920. return this.index += m, p;
  48921. }, readString: function(m) {
  48922. return b.transformTo("string", this.readData(m));
  48923. }, readData: function() {
  48924. }, lastIndexOfSignature: function() {
  48925. }, readAndCheckSignature: function() {
  48926. }, readDate: function() {
  48927. var m = this.readInt(4);
  48928. return new Date(Date.UTC(1980 + (m >> 25 & 127), (m >> 21 & 15) - 1, m >> 16 & 31, m >> 11 & 31, m >> 5 & 63, (31 & m) << 1));
  48929. } }, r.exports = u;
  48930. }, { "../utils": 32 }], 19: [function(c, r, h) {
  48931. var b = c("./Uint8ArrayReader");
  48932. function u(m) {
  48933. b.call(this, m);
  48934. }
  48935. c("../utils").inherits(u, b), u.prototype.readData = function(m) {
  48936. this.checkOffset(m);
  48937. var Z = this.data.slice(this.zero + this.index, this.zero + this.index + m);
  48938. return this.index += m, Z;
  48939. }, r.exports = u;
  48940. }, { "../utils": 32, "./Uint8ArrayReader": 21 }], 20: [function(c, r, h) {
  48941. var b = c("./DataReader");
  48942. function u(m) {
  48943. b.call(this, m);
  48944. }
  48945. c("../utils").inherits(u, b), u.prototype.byteAt = function(m) {
  48946. return this.data.charCodeAt(this.zero + m);
  48947. }, u.prototype.lastIndexOfSignature = function(m) {
  48948. return this.data.lastIndexOf(m) - this.zero;
  48949. }, u.prototype.readAndCheckSignature = function(m) {
  48950. return m === this.readData(4);
  48951. }, u.prototype.readData = function(m) {
  48952. this.checkOffset(m);
  48953. var Z = this.data.slice(this.zero + this.index, this.zero + this.index + m);
  48954. return this.index += m, Z;
  48955. }, r.exports = u;
  48956. }, { "../utils": 32, "./DataReader": 18 }], 21: [function(c, r, h) {
  48957. var b = c("./ArrayReader");
  48958. function u(m) {
  48959. b.call(this, m);
  48960. }
  48961. c("../utils").inherits(u, b), u.prototype.readData = function(m) {
  48962. if (this.checkOffset(m), m === 0) return new Uint8Array(0);
  48963. var Z = this.data.subarray(this.zero + this.index, this.zero + this.index + m);
  48964. return this.index += m, Z;
  48965. }, r.exports = u;
  48966. }, { "../utils": 32, "./ArrayReader": 17 }], 22: [function(c, r, h) {
  48967. var b = c("../utils"), u = c("../support"), m = c("./ArrayReader"), Z = c("./StringReader"), p = c("./NodeBufferReader"), Y = c("./Uint8ArrayReader");
  48968. r.exports = function(R) {
  48969. var X = b.getTypeOf(R);
  48970. return b.checkSupport(X), X !== "string" || u.uint8array ? X === "nodebuffer" ? new p(R) : u.uint8array ? new Y(b.transformTo("uint8array", R)) : new m(b.transformTo("array", R)) : new Z(R);
  48971. };
  48972. }, { "../support": 30, "../utils": 32, "./ArrayReader": 17, "./NodeBufferReader": 19, "./StringReader": 20, "./Uint8ArrayReader": 21 }], 23: [function(c, r, h) {
  48973. h.LOCAL_FILE_HEADER = "PK", h.CENTRAL_FILE_HEADER = "PK", h.CENTRAL_DIRECTORY_END = "PK", h.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x07", h.ZIP64_CENTRAL_DIRECTORY_END = "PK", h.DATA_DESCRIPTOR = "PK\x07\b";
  48974. }, {}], 24: [function(c, r, h) {
  48975. var b = c("./GenericWorker"), u = c("../utils");
  48976. function m(Z) {
  48977. b.call(this, "ConvertWorker to " + Z), this.destType = Z;
  48978. }
  48979. u.inherits(m, b), m.prototype.processChunk = function(Z) {
  48980. this.push({ data: u.transformTo(this.destType, Z.data), meta: Z.meta });
  48981. }, r.exports = m;
  48982. }, { "../utils": 32, "./GenericWorker": 28 }], 25: [function(c, r, h) {
  48983. var b = c("./GenericWorker"), u = c("../crc32");
  48984. function m() {
  48985. b.call(this, "Crc32Probe"), this.withStreamInfo("crc32", 0);
  48986. }
  48987. c("../utils").inherits(m, b), m.prototype.processChunk = function(Z) {
  48988. this.streamInfo.crc32 = u(Z.data, this.streamInfo.crc32 || 0), this.push(Z);
  48989. }, r.exports = m;
  48990. }, { "../crc32": 4, "../utils": 32, "./GenericWorker": 28 }], 26: [function(c, r, h) {
  48991. var b = c("../utils"), u = c("./GenericWorker");
  48992. function m(Z) {
  48993. u.call(this, "DataLengthProbe for " + Z), this.propName = Z, this.withStreamInfo(Z, 0);
  48994. }
  48995. b.inherits(m, u), m.prototype.processChunk = function(Z) {
  48996. if (Z) {
  48997. var p = this.streamInfo[this.propName] || 0;
  48998. this.streamInfo[this.propName] = p + Z.data.length;
  48999. }
  49000. u.prototype.processChunk.call(this, Z);
  49001. }, r.exports = m;
  49002. }, { "../utils": 32, "./GenericWorker": 28 }], 27: [function(c, r, h) {
  49003. var b = c("../utils"), u = c("./GenericWorker");
  49004. function m(Z) {
  49005. u.call(this, "DataWorker");
  49006. var p = this;
  49007. this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = "", this._tickScheduled = !1, Z.then(function(Y) {
  49008. p.dataIsReady = !0, p.data = Y, p.max = Y && Y.length || 0, p.type = b.getTypeOf(Y), p.isPaused || p._tickAndRepeat();
  49009. }, function(Y) {
  49010. p.error(Y);
  49011. });
  49012. }
  49013. b.inherits(m, u), m.prototype.cleanUp = function() {
  49014. u.prototype.cleanUp.call(this), this.data = null;
  49015. }, m.prototype.resume = function() {
  49016. return !!u.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, b.delay(this._tickAndRepeat, [], this)), !0);
  49017. }, m.prototype._tickAndRepeat = function() {
  49018. this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (b.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));
  49019. }, m.prototype._tick = function() {
  49020. if (this.isPaused || this.isFinished) return !1;
  49021. var Z = null, p = Math.min(this.max, this.index + 16384);
  49022. if (this.index >= this.max) return this.end();
  49023. switch (this.type) {
  49024. case "string":
  49025. Z = this.data.substring(this.index, p);
  49026. break;
  49027. case "uint8array":
  49028. Z = this.data.subarray(this.index, p);
  49029. break;
  49030. case "array":
  49031. case "nodebuffer":
  49032. Z = this.data.slice(this.index, p);
  49033. }
  49034. return this.index = p, this.push({ data: Z, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });
  49035. }, r.exports = m;
  49036. }, { "../utils": 32, "./GenericWorker": 28 }], 28: [function(c, r, h) {
  49037. function b(u) {
  49038. this.name = u || "default", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;
  49039. }
  49040. b.prototype = { push: function(u) {
  49041. this.emit("data", u);
  49042. }, end: function() {
  49043. if (this.isFinished) return !1;
  49044. this.flush();
  49045. try {
  49046. this.emit("end"), this.cleanUp(), this.isFinished = !0;
  49047. } catch (u) {
  49048. this.emit("error", u);
  49049. }
  49050. return !0;
  49051. }, error: function(u) {
  49052. return !this.isFinished && (this.isPaused ? this.generatedError = u : (this.isFinished = !0, this.emit("error", u), this.previous && this.previous.error(u), this.cleanUp()), !0);
  49053. }, on: function(u, m) {
  49054. return this._listeners[u].push(m), this;
  49055. }, cleanUp: function() {
  49056. this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];
  49057. }, emit: function(u, m) {
  49058. if (this._listeners[u]) for (var Z = 0; Z < this._listeners[u].length; Z++) this._listeners[u][Z].call(this, m);
  49059. }, pipe: function(u) {
  49060. return u.registerPrevious(this);
  49061. }, registerPrevious: function(u) {
  49062. if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
  49063. this.streamInfo = u.streamInfo, this.mergeStreamInfo(), this.previous = u;
  49064. var m = this;
  49065. return u.on("data", function(Z) {
  49066. m.processChunk(Z);
  49067. }), u.on("end", function() {
  49068. m.end();
  49069. }), u.on("error", function(Z) {
  49070. m.error(Z);
  49071. }), this;
  49072. }, pause: function() {
  49073. return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);
  49074. }, resume: function() {
  49075. if (!this.isPaused || this.isFinished) return !1;
  49076. var u = this.isPaused = !1;
  49077. return this.generatedError && (this.error(this.generatedError), u = !0), this.previous && this.previous.resume(), !u;
  49078. }, flush: function() {
  49079. }, processChunk: function(u) {
  49080. this.push(u);
  49081. }, withStreamInfo: function(u, m) {
  49082. return this.extraStreamInfo[u] = m, this.mergeStreamInfo(), this;
  49083. }, mergeStreamInfo: function() {
  49084. for (var u in this.extraStreamInfo) Object.prototype.hasOwnProperty.call(this.extraStreamInfo, u) && (this.streamInfo[u] = this.extraStreamInfo[u]);
  49085. }, lock: function() {
  49086. if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
  49087. this.isLocked = !0, this.previous && this.previous.lock();
  49088. }, toString: function() {
  49089. var u = "Worker " + this.name;
  49090. return this.previous ? this.previous + " -> " + u : u;
  49091. } }, r.exports = b;
  49092. }, {}], 29: [function(c, r, h) {
  49093. var b = c("../utils"), u = c("./ConvertWorker"), m = c("./GenericWorker"), Z = c("../base64"), p = c("../support"), Y = c("../external"), R = null;
  49094. if (p.nodestream) try {
  49095. R = c("../nodejs/NodejsStreamOutputAdapter");
  49096. } catch {
  49097. }
  49098. function X(H, S, z) {
  49099. var v = S;
  49100. switch (S) {
  49101. case "blob":
  49102. case "arraybuffer":
  49103. v = "uint8array";
  49104. break;
  49105. case "base64":
  49106. v = "string";
  49107. }
  49108. try {
  49109. this._internalType = v, this._outputType = S, this._mimeType = z, b.checkSupport(v), this._worker = H.pipe(new u(v)), H.lock();
  49110. } catch (K) {
  49111. this._worker = new m("error"), this._worker.error(K);
  49112. }
  49113. }
  49114. X.prototype = { accumulate: function(H) {
  49115. return function(S, z) {
  49116. return new Y.Promise(function(v, K) {
  49117. var V = [], N = S._internalType, B = S._outputType, G = S._mimeType;
  49118. S.on("data", function(w, W) {
  49119. V.push(w), z && z(W);
  49120. }).on("error", function(w) {
  49121. V = [], K(w);
  49122. }).on("end", function() {
  49123. try {
  49124. var w = function(W, y, f) {
  49125. switch (W) {
  49126. case "blob":
  49127. return b.newBlob(b.transformTo("arraybuffer", y), f);
  49128. case "base64":
  49129. return Z.encode(y);
  49130. default:
  49131. return b.transformTo(W, y);
  49132. }
  49133. }(B, function(W, y) {
  49134. var f, D = 0, F = null, T = 0;
  49135. for (f = 0; f < y.length; f++) T += y[f].length;
  49136. switch (W) {
  49137. case "string":
  49138. return y.join("");
  49139. case "array":
  49140. return Array.prototype.concat.apply([], y);
  49141. case "uint8array":
  49142. for (F = new Uint8Array(T), f = 0; f < y.length; f++) F.set(y[f], D), D += y[f].length;
  49143. return F;
  49144. case "nodebuffer":
  49145. return s.concat(y);
  49146. default:
  49147. throw new Error("concat : unsupported type '" + W + "'");
  49148. }
  49149. }(N, V), G);
  49150. v(w);
  49151. } catch (W) {
  49152. K(W);
  49153. }
  49154. V = [];
  49155. }).resume();
  49156. });
  49157. }(this, H);
  49158. }, on: function(H, S) {
  49159. var z = this;
  49160. return H === "data" ? this._worker.on(H, function(v) {
  49161. S.call(z, v.data, v.meta);
  49162. }) : this._worker.on(H, function() {
  49163. b.delay(S, arguments, z);
  49164. }), this;
  49165. }, resume: function() {
  49166. return b.delay(this._worker.resume, [], this._worker), this;
  49167. }, pause: function() {
  49168. return this._worker.pause(), this;
  49169. }, toNodejsStream: function(H) {
  49170. if (b.checkSupport("nodestream"), this._outputType !== "nodebuffer") throw new Error(this._outputType + " is not supported by this method");
  49171. return new R(this, { objectMode: this._outputType !== "nodebuffer" }, H);
  49172. } }, r.exports = X;
  49173. }, { "../base64": 1, "../external": 6, "../nodejs/NodejsStreamOutputAdapter": 13, "../support": 30, "../utils": 32, "./ConvertWorker": 24, "./GenericWorker": 28 }], 30: [function(c, r, h) {
  49174. if (h.base64 = !0, h.array = !0, h.string = !0, h.arraybuffer = typeof ArrayBuffer < "u" && typeof Uint8Array < "u", h.nodebuffer = s !== void 0, h.uint8array = typeof Uint8Array < "u", typeof ArrayBuffer > "u") h.blob = !1;
  49175. else {
  49176. var b = new ArrayBuffer(0);
  49177. try {
  49178. h.blob = new Blob([b], { type: "application/zip" }).size === 0;
  49179. } catch {
  49180. try {
  49181. var u = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
  49182. u.append(b), h.blob = u.getBlob("application/zip").size === 0;
  49183. } catch {
  49184. h.blob = !1;
  49185. }
  49186. }
  49187. }
  49188. try {
  49189. h.nodestream = !!c("readable-stream").Readable;
  49190. } catch {
  49191. h.nodestream = !1;
  49192. }
  49193. }, { "readable-stream": 16 }], 31: [function(c, r, h) {
  49194. for (var b = c("./utils"), u = c("./support"), m = c("./nodejsUtils"), Z = c("./stream/GenericWorker"), p = new Array(256), Y = 0; Y < 256; Y++) p[Y] = 252 <= Y ? 6 : 248 <= Y ? 5 : 240 <= Y ? 4 : 224 <= Y ? 3 : 192 <= Y ? 2 : 1;
  49195. function R() {
  49196. Z.call(this, "utf-8 decode"), this.leftOver = null;
  49197. }
  49198. function X() {
  49199. Z.call(this, "utf-8 encode");
  49200. }
  49201. p[254] = p[254] = 1, h.utf8encode = function(H) {
  49202. return u.nodebuffer ? m.newBufferFrom(H, "utf-8") : function(S) {
  49203. var z, v, K, V, N, B = S.length, G = 0;
  49204. for (V = 0; V < B; V++) (64512 & (v = S.charCodeAt(V))) == 55296 && V + 1 < B && (64512 & (K = S.charCodeAt(V + 1))) == 56320 && (v = 65536 + (v - 55296 << 10) + (K - 56320), V++), G += v < 128 ? 1 : v < 2048 ? 2 : v < 65536 ? 3 : 4;
  49205. for (z = u.uint8array ? new Uint8Array(G) : new Array(G), V = N = 0; N < G; V++) (64512 & (v = S.charCodeAt(V))) == 55296 && V + 1 < B && (64512 & (K = S.charCodeAt(V + 1))) == 56320 && (v = 65536 + (v - 55296 << 10) + (K - 56320), V++), v < 128 ? z[N++] = v : (v < 2048 ? z[N++] = 192 | v >>> 6 : (v < 65536 ? z[N++] = 224 | v >>> 12 : (z[N++] = 240 | v >>> 18, z[N++] = 128 | v >>> 12 & 63), z[N++] = 128 | v >>> 6 & 63), z[N++] = 128 | 63 & v);
  49206. return z;
  49207. }(H);
  49208. }, h.utf8decode = function(H) {
  49209. return u.nodebuffer ? b.transformTo("nodebuffer", H).toString("utf-8") : function(S) {
  49210. var z, v, K, V, N = S.length, B = new Array(2 * N);
  49211. for (z = v = 0; z < N; ) if ((K = S[z++]) < 128) B[v++] = K;
  49212. else if (4 < (V = p[K])) B[v++] = 65533, z += V - 1;
  49213. else {
  49214. for (K &= V === 2 ? 31 : V === 3 ? 15 : 7; 1 < V && z < N; ) K = K << 6 | 63 & S[z++], V--;
  49215. 1 < V ? B[v++] = 65533 : K < 65536 ? B[v++] = K : (K -= 65536, B[v++] = 55296 | K >> 10 & 1023, B[v++] = 56320 | 1023 & K);
  49216. }
  49217. return B.length !== v && (B.subarray ? B = B.subarray(0, v) : B.length = v), b.applyFromCharCode(B);
  49218. }(H = b.transformTo(u.uint8array ? "uint8array" : "array", H));
  49219. }, b.inherits(R, Z), R.prototype.processChunk = function(H) {
  49220. var S = b.transformTo(u.uint8array ? "uint8array" : "array", H.data);
  49221. if (this.leftOver && this.leftOver.length) {
  49222. if (u.uint8array) {
  49223. var z = S;
  49224. (S = new Uint8Array(z.length + this.leftOver.length)).set(this.leftOver, 0), S.set(z, this.leftOver.length);
  49225. } else S = this.leftOver.concat(S);
  49226. this.leftOver = null;
  49227. }
  49228. var v = function(V, N) {
  49229. var B;
  49230. for ((N = N || V.length) > V.length && (N = V.length), B = N - 1; 0 <= B && (192 & V[B]) == 128; ) B--;
  49231. return B < 0 || B === 0 ? N : B + p[V[B]] > N ? B : N;
  49232. }(S), K = S;
  49233. v !== S.length && (u.uint8array ? (K = S.subarray(0, v), this.leftOver = S.subarray(v, S.length)) : (K = S.slice(0, v), this.leftOver = S.slice(v, S.length))), this.push({ data: h.utf8decode(K), meta: H.meta });
  49234. }, R.prototype.flush = function() {
  49235. this.leftOver && this.leftOver.length && (this.push({ data: h.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);
  49236. }, h.Utf8DecodeWorker = R, b.inherits(X, Z), X.prototype.processChunk = function(H) {
  49237. this.push({ data: h.utf8encode(H.data), meta: H.meta });
  49238. }, h.Utf8EncodeWorker = X;
  49239. }, { "./nodejsUtils": 14, "./stream/GenericWorker": 28, "./support": 30, "./utils": 32 }], 32: [function(c, r, h) {
  49240. var b = c("./support"), u = c("./base64"), m = c("./nodejsUtils"), Z = c("./external");
  49241. function p(z) {
  49242. return z;
  49243. }
  49244. function Y(z, v) {
  49245. for (var K = 0; K < z.length; ++K) v[K] = 255 & z.charCodeAt(K);
  49246. return v;
  49247. }
  49248. c("setimmediate"), h.newBlob = function(z, v) {
  49249. h.checkSupport("blob");
  49250. try {
  49251. return new Blob([z], { type: v });
  49252. } catch {
  49253. try {
  49254. var K = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
  49255. return K.append(z), K.getBlob(v);
  49256. } catch {
  49257. throw new Error("Bug : can't construct the Blob.");
  49258. }
  49259. }
  49260. };
  49261. var R = { stringifyByChunk: function(z, v, K) {
  49262. var V = [], N = 0, B = z.length;
  49263. if (B <= K) return String.fromCharCode.apply(null, z);
  49264. for (; N < B; ) v === "array" || v === "nodebuffer" ? V.push(String.fromCharCode.apply(null, z.slice(N, Math.min(N + K, B)))) : V.push(String.fromCharCode.apply(null, z.subarray(N, Math.min(N + K, B)))), N += K;
  49265. return V.join("");
  49266. }, stringifyByChar: function(z) {
  49267. for (var v = "", K = 0; K < z.length; K++) v += String.fromCharCode(z[K]);
  49268. return v;
  49269. }, applyCanBeUsed: { uint8array: function() {
  49270. try {
  49271. return b.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;
  49272. } catch {
  49273. return !1;
  49274. }
  49275. }(), nodebuffer: function() {
  49276. try {
  49277. return b.nodebuffer && String.fromCharCode.apply(null, m.allocBuffer(1)).length === 1;
  49278. } catch {
  49279. return !1;
  49280. }
  49281. }() } };
  49282. function X(z) {
  49283. var v = 65536, K = h.getTypeOf(z), V = !0;
  49284. if (K === "uint8array" ? V = R.applyCanBeUsed.uint8array : K === "nodebuffer" && (V = R.applyCanBeUsed.nodebuffer), V) for (; 1 < v; ) try {
  49285. return R.stringifyByChunk(z, K, v);
  49286. } catch {
  49287. v = Math.floor(v / 2);
  49288. }
  49289. return R.stringifyByChar(z);
  49290. }
  49291. function H(z, v) {
  49292. for (var K = 0; K < z.length; K++) v[K] = z[K];
  49293. return v;
  49294. }
  49295. h.applyFromCharCode = X;
  49296. var S = {};
  49297. S.string = { string: p, array: function(z) {
  49298. return Y(z, new Array(z.length));
  49299. }, arraybuffer: function(z) {
  49300. return S.string.uint8array(z).buffer;
  49301. }, uint8array: function(z) {
  49302. return Y(z, new Uint8Array(z.length));
  49303. }, nodebuffer: function(z) {
  49304. return Y(z, m.allocBuffer(z.length));
  49305. } }, S.array = { string: X, array: p, arraybuffer: function(z) {
  49306. return new Uint8Array(z).buffer;
  49307. }, uint8array: function(z) {
  49308. return new Uint8Array(z);
  49309. }, nodebuffer: function(z) {
  49310. return m.newBufferFrom(z);
  49311. } }, S.arraybuffer = { string: function(z) {
  49312. return X(new Uint8Array(z));
  49313. }, array: function(z) {
  49314. return H(new Uint8Array(z), new Array(z.byteLength));
  49315. }, arraybuffer: p, uint8array: function(z) {
  49316. return new Uint8Array(z);
  49317. }, nodebuffer: function(z) {
  49318. return m.newBufferFrom(new Uint8Array(z));
  49319. } }, S.uint8array = { string: X, array: function(z) {
  49320. return H(z, new Array(z.length));
  49321. }, arraybuffer: function(z) {
  49322. return z.buffer;
  49323. }, uint8array: p, nodebuffer: function(z) {
  49324. return m.newBufferFrom(z);
  49325. } }, S.nodebuffer = { string: X, array: function(z) {
  49326. return H(z, new Array(z.length));
  49327. }, arraybuffer: function(z) {
  49328. return S.nodebuffer.uint8array(z).buffer;
  49329. }, uint8array: function(z) {
  49330. return H(z, new Uint8Array(z.length));
  49331. }, nodebuffer: p }, h.transformTo = function(z, v) {
  49332. if (v = v || "", !z) return v;
  49333. h.checkSupport(z);
  49334. var K = h.getTypeOf(v);
  49335. return S[K][z](v);
  49336. }, h.resolve = function(z) {
  49337. for (var v = z.split("/"), K = [], V = 0; V < v.length; V++) {
  49338. var N = v[V];
  49339. N === "." || N === "" && V !== 0 && V !== v.length - 1 || (N === ".." ? K.pop() : K.push(N));
  49340. }
  49341. return K.join("/");
  49342. }, h.getTypeOf = function(z) {
  49343. return typeof z == "string" ? "string" : Object.prototype.toString.call(z) === "[object Array]" ? "array" : b.nodebuffer && m.isBuffer(z) ? "nodebuffer" : b.uint8array && z instanceof Uint8Array ? "uint8array" : b.arraybuffer && z instanceof ArrayBuffer ? "arraybuffer" : void 0;
  49344. }, h.checkSupport = function(z) {
  49345. if (!b[z.toLowerCase()]) throw new Error(z + " is not supported by this platform");
  49346. }, h.MAX_VALUE_16BITS = 65535, h.MAX_VALUE_32BITS = -1, h.pretty = function(z) {
  49347. var v, K, V = "";
  49348. for (K = 0; K < (z || "").length; K++) V += "\\x" + ((v = z.charCodeAt(K)) < 16 ? "0" : "") + v.toString(16).toUpperCase();
  49349. return V;
  49350. }, h.delay = function(z, v, K) {
  49351. o(function() {
  49352. z.apply(K || null, v || []);
  49353. });
  49354. }, h.inherits = function(z, v) {
  49355. function K() {
  49356. }
  49357. K.prototype = v.prototype, z.prototype = new K();
  49358. }, h.extend = function() {
  49359. var z, v, K = {};
  49360. for (z = 0; z < arguments.length; z++) for (v in arguments[z]) Object.prototype.hasOwnProperty.call(arguments[z], v) && K[v] === void 0 && (K[v] = arguments[z][v]);
  49361. return K;
  49362. }, h.prepareContent = function(z, v, K, V, N) {
  49363. return Z.Promise.resolve(v).then(function(B) {
  49364. return b.blob && (B instanceof Blob || ["[object File]", "[object Blob]"].indexOf(Object.prototype.toString.call(B)) !== -1) && typeof FileReader < "u" ? new Z.Promise(function(G, w) {
  49365. var W = new FileReader();
  49366. W.onload = function(y) {
  49367. G(y.target.result);
  49368. }, W.onerror = function(y) {
  49369. w(y.target.error);
  49370. }, W.readAsArrayBuffer(B);
  49371. }) : B;
  49372. }).then(function(B) {
  49373. var G = h.getTypeOf(B);
  49374. return G ? (G === "arraybuffer" ? B = h.transformTo("uint8array", B) : G === "string" && (N ? B = u.decode(B) : K && V !== !0 && (B = function(w) {
  49375. return Y(w, b.uint8array ? new Uint8Array(w.length) : new Array(w.length));
  49376. }(B))), B) : Z.Promise.reject(new Error("Can't read the data of '" + z + "'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?"));
  49377. });
  49378. };
  49379. }, { "./base64": 1, "./external": 6, "./nodejsUtils": 14, "./support": 30, setimmediate: 54 }], 33: [function(c, r, h) {
  49380. var b = c("./reader/readerFor"), u = c("./utils"), m = c("./signature"), Z = c("./zipEntry"), p = c("./support");
  49381. function Y(R) {
  49382. this.files = [], this.loadOptions = R;
  49383. }
  49384. Y.prototype = { checkSignature: function(R) {
  49385. if (!this.reader.readAndCheckSignature(R)) {
  49386. this.reader.index -= 4;
  49387. var X = this.reader.readString(4);
  49388. throw new Error("Corrupted zip or bug: unexpected signature (" + u.pretty(X) + ", expected " + u.pretty(R) + ")");
  49389. }
  49390. }, isSignature: function(R, X) {
  49391. var H = this.reader.index;
  49392. this.reader.setIndex(R);
  49393. var S = this.reader.readString(4) === X;
  49394. return this.reader.setIndex(H), S;
  49395. }, readBlockEndOfCentral: function() {
  49396. this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);
  49397. var R = this.reader.readData(this.zipCommentLength), X = p.uint8array ? "uint8array" : "array", H = u.transformTo(X, R);
  49398. this.zipComment = this.loadOptions.decodeFileName(H);
  49399. }, readBlockZip64EndOfCentral: function() {
  49400. this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};
  49401. for (var R, X, H, S = this.zip64EndOfCentralSize - 44; 0 < S; ) R = this.reader.readInt(2), X = this.reader.readInt(4), H = this.reader.readData(X), this.zip64ExtensibleData[R] = { id: R, length: X, value: H };
  49402. }, readBlockZip64EndOfCentralLocator: function() {
  49403. if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), 1 < this.disksCount) throw new Error("Multi-volumes zip are not supported");
  49404. }, readLocalFiles: function() {
  49405. var R, X;
  49406. for (R = 0; R < this.files.length; R++) X = this.files[R], this.reader.setIndex(X.localHeaderOffset), this.checkSignature(m.LOCAL_FILE_HEADER), X.readLocalPart(this.reader), X.handleUTF8(), X.processAttributes();
  49407. }, readCentralDir: function() {
  49408. var R;
  49409. for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(m.CENTRAL_FILE_HEADER); ) (R = new Z({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(R);
  49410. if (this.centralDirRecords !== this.files.length && this.centralDirRecords !== 0 && this.files.length === 0) throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length);
  49411. }, readEndOfCentral: function() {
  49412. var R = this.reader.lastIndexOfSignature(m.CENTRAL_DIRECTORY_END);
  49413. if (R < 0) throw this.isSignature(0, m.LOCAL_FILE_HEADER) ? new Error("Corrupted zip: can't find end of central directory") : new Error("Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html");
  49414. this.reader.setIndex(R);
  49415. var X = R;
  49416. if (this.checkSignature(m.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === u.MAX_VALUE_16BITS || this.diskWithCentralDirStart === u.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === u.MAX_VALUE_16BITS || this.centralDirRecords === u.MAX_VALUE_16BITS || this.centralDirSize === u.MAX_VALUE_32BITS || this.centralDirOffset === u.MAX_VALUE_32BITS) {
  49417. if (this.zip64 = !0, (R = this.reader.lastIndexOfSignature(m.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");
  49418. if (this.reader.setIndex(R), this.checkSignature(m.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, m.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(m.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");
  49419. this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(m.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();
  49420. }
  49421. var H = this.centralDirOffset + this.centralDirSize;
  49422. this.zip64 && (H += 20, H += 12 + this.zip64EndOfCentralSize);
  49423. var S = X - H;
  49424. if (0 < S) this.isSignature(X, m.CENTRAL_FILE_HEADER) || (this.reader.zero = S);
  49425. else if (S < 0) throw new Error("Corrupted zip: missing " + Math.abs(S) + " bytes.");
  49426. }, prepareReader: function(R) {
  49427. this.reader = b(R);
  49428. }, load: function(R) {
  49429. this.prepareReader(R), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();
  49430. } }, r.exports = Y;
  49431. }, { "./reader/readerFor": 22, "./signature": 23, "./support": 30, "./utils": 32, "./zipEntry": 34 }], 34: [function(c, r, h) {
  49432. var b = c("./reader/readerFor"), u = c("./utils"), m = c("./compressedObject"), Z = c("./crc32"), p = c("./utf8"), Y = c("./compressions"), R = c("./support");
  49433. function X(H, S) {
  49434. this.options = H, this.loadOptions = S;
  49435. }
  49436. X.prototype = { isEncrypted: function() {
  49437. return (1 & this.bitFlag) == 1;
  49438. }, useUTF8: function() {
  49439. return (2048 & this.bitFlag) == 2048;
  49440. }, readLocalPart: function(H) {
  49441. var S, z;
  49442. if (H.skip(22), this.fileNameLength = H.readInt(2), z = H.readInt(2), this.fileName = H.readData(this.fileNameLength), H.skip(z), this.compressedSize === -1 || this.uncompressedSize === -1) throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");
  49443. if ((S = function(v) {
  49444. for (var K in Y) if (Object.prototype.hasOwnProperty.call(Y, K) && Y[K].magic === v) return Y[K];
  49445. return null;
  49446. }(this.compressionMethod)) === null) throw new Error("Corrupted zip : compression " + u.pretty(this.compressionMethod) + " unknown (inner file : " + u.transformTo("string", this.fileName) + ")");
  49447. this.decompressed = new m(this.compressedSize, this.uncompressedSize, this.crc32, S, H.readData(this.compressedSize));
  49448. }, readCentralPart: function(H) {
  49449. this.versionMadeBy = H.readInt(2), H.skip(2), this.bitFlag = H.readInt(2), this.compressionMethod = H.readString(2), this.date = H.readDate(), this.crc32 = H.readInt(4), this.compressedSize = H.readInt(4), this.uncompressedSize = H.readInt(4);
  49450. var S = H.readInt(2);
  49451. if (this.extraFieldsLength = H.readInt(2), this.fileCommentLength = H.readInt(2), this.diskNumberStart = H.readInt(2), this.internalFileAttributes = H.readInt(2), this.externalFileAttributes = H.readInt(4), this.localHeaderOffset = H.readInt(4), this.isEncrypted()) throw new Error("Encrypted zip are not supported");
  49452. H.skip(S), this.readExtraFields(H), this.parseZIP64ExtraField(H), this.fileComment = H.readData(this.fileCommentLength);
  49453. }, processAttributes: function() {
  49454. this.unixPermissions = null, this.dosPermissions = null;
  49455. var H = this.versionMadeBy >> 8;
  49456. this.dir = !!(16 & this.externalFileAttributes), H == 0 && (this.dosPermissions = 63 & this.externalFileAttributes), H == 3 && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || this.fileNameStr.slice(-1) !== "/" || (this.dir = !0);
  49457. }, parseZIP64ExtraField: function() {
  49458. if (this.extraFields[1]) {
  49459. var H = b(this.extraFields[1].value);
  49460. this.uncompressedSize === u.MAX_VALUE_32BITS && (this.uncompressedSize = H.readInt(8)), this.compressedSize === u.MAX_VALUE_32BITS && (this.compressedSize = H.readInt(8)), this.localHeaderOffset === u.MAX_VALUE_32BITS && (this.localHeaderOffset = H.readInt(8)), this.diskNumberStart === u.MAX_VALUE_32BITS && (this.diskNumberStart = H.readInt(4));
  49461. }
  49462. }, readExtraFields: function(H) {
  49463. var S, z, v, K = H.index + this.extraFieldsLength;
  49464. for (this.extraFields || (this.extraFields = {}); H.index + 4 < K; ) S = H.readInt(2), z = H.readInt(2), v = H.readData(z), this.extraFields[S] = { id: S, length: z, value: v };
  49465. H.setIndex(K);
  49466. }, handleUTF8: function() {
  49467. var H = R.uint8array ? "uint8array" : "array";
  49468. if (this.useUTF8()) this.fileNameStr = p.utf8decode(this.fileName), this.fileCommentStr = p.utf8decode(this.fileComment);
  49469. else {
  49470. var S = this.findExtraFieldUnicodePath();
  49471. if (S !== null) this.fileNameStr = S;
  49472. else {
  49473. var z = u.transformTo(H, this.fileName);
  49474. this.fileNameStr = this.loadOptions.decodeFileName(z);
  49475. }
  49476. var v = this.findExtraFieldUnicodeComment();
  49477. if (v !== null) this.fileCommentStr = v;
  49478. else {
  49479. var K = u.transformTo(H, this.fileComment);
  49480. this.fileCommentStr = this.loadOptions.decodeFileName(K);
  49481. }
  49482. }
  49483. }, findExtraFieldUnicodePath: function() {
  49484. var H = this.extraFields[28789];
  49485. if (H) {
  49486. var S = b(H.value);
  49487. return S.readInt(1) !== 1 || Z(this.fileName) !== S.readInt(4) ? null : p.utf8decode(S.readData(H.length - 5));
  49488. }
  49489. return null;
  49490. }, findExtraFieldUnicodeComment: function() {
  49491. var H = this.extraFields[25461];
  49492. if (H) {
  49493. var S = b(H.value);
  49494. return S.readInt(1) !== 1 || Z(this.fileComment) !== S.readInt(4) ? null : p.utf8decode(S.readData(H.length - 5));
  49495. }
  49496. return null;
  49497. } }, r.exports = X;
  49498. }, { "./compressedObject": 2, "./compressions": 3, "./crc32": 4, "./reader/readerFor": 22, "./support": 30, "./utf8": 31, "./utils": 32 }], 35: [function(c, r, h) {
  49499. function b(S, z, v) {
  49500. this.name = S, this.dir = v.dir, this.date = v.date, this.comment = v.comment, this.unixPermissions = v.unixPermissions, this.dosPermissions = v.dosPermissions, this._data = z, this._dataBinary = v.binary, this.options = { compression: v.compression, compressionOptions: v.compressionOptions };
  49501. }
  49502. var u = c("./stream/StreamHelper"), m = c("./stream/DataWorker"), Z = c("./utf8"), p = c("./compressedObject"), Y = c("./stream/GenericWorker");
  49503. b.prototype = { internalStream: function(S) {
  49504. var z = null, v = "string";
  49505. try {
  49506. if (!S) throw new Error("No output type specified.");
  49507. var K = (v = S.toLowerCase()) === "string" || v === "text";
  49508. v !== "binarystring" && v !== "text" || (v = "string"), z = this._decompressWorker();
  49509. var V = !this._dataBinary;
  49510. V && !K && (z = z.pipe(new Z.Utf8EncodeWorker())), !V && K && (z = z.pipe(new Z.Utf8DecodeWorker()));
  49511. } catch (N) {
  49512. (z = new Y("error")).error(N);
  49513. }
  49514. return new u(z, v, "");
  49515. }, async: function(S, z) {
  49516. return this.internalStream(S).accumulate(z);
  49517. }, nodeStream: function(S, z) {
  49518. return this.internalStream(S || "nodebuffer").toNodejsStream(z);
  49519. }, _compressWorker: function(S, z) {
  49520. if (this._data instanceof p && this._data.compression.magic === S.magic) return this._data.getCompressedWorker();
  49521. var v = this._decompressWorker();
  49522. return this._dataBinary || (v = v.pipe(new Z.Utf8EncodeWorker())), p.createWorkerFrom(v, S, z);
  49523. }, _decompressWorker: function() {
  49524. return this._data instanceof p ? this._data.getContentWorker() : this._data instanceof Y ? this._data : new m(this._data);
  49525. } };
  49526. for (var R = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"], X = function() {
  49527. throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
  49528. }, H = 0; H < R.length; H++) b.prototype[R[H]] = X;
  49529. r.exports = b;
  49530. }, { "./compressedObject": 2, "./stream/DataWorker": 27, "./stream/GenericWorker": 28, "./stream/StreamHelper": 29, "./utf8": 31 }], 36: [function(c, r, h) {
  49531. (function(b) {
  49532. var u, m, Z = b.MutationObserver || b.WebKitMutationObserver;
  49533. if (Z) {
  49534. var p = 0, Y = new Z(S), R = b.document.createTextNode("");
  49535. Y.observe(R, { characterData: !0 }), u = function() {
  49536. R.data = p = ++p % 2;
  49537. };
  49538. } else if (b.setImmediate || b.MessageChannel === void 0) u = "document" in b && "onreadystatechange" in b.document.createElement("script") ? function() {
  49539. var z = b.document.createElement("script");
  49540. z.onreadystatechange = function() {
  49541. S(), z.onreadystatechange = null, z.parentNode.removeChild(z), z = null;
  49542. }, b.document.documentElement.appendChild(z);
  49543. } : function() {
  49544. setTimeout(S, 0);
  49545. };
  49546. else {
  49547. var X = new b.MessageChannel();
  49548. X.port1.onmessage = S, u = function() {
  49549. X.port2.postMessage(0);
  49550. };
  49551. }
  49552. var H = [];
  49553. function S() {
  49554. var z, v;
  49555. m = !0;
  49556. for (var K = H.length; K; ) {
  49557. for (v = H, H = [], z = -1; ++z < K; ) v[z]();
  49558. K = H.length;
  49559. }
  49560. m = !1;
  49561. }
  49562. r.exports = function(z) {
  49563. H.push(z) !== 1 || m || u();
  49564. };
  49565. }).call(this, A !== void 0 ? A : typeof self < "u" ? self : typeof window < "u" ? window : {});
  49566. }, {}], 37: [function(c, r, h) {
  49567. var b = c("immediate");
  49568. function u() {
  49569. }
  49570. var m = {}, Z = ["REJECTED"], p = ["FULFILLED"], Y = ["PENDING"];
  49571. function R(K) {
  49572. if (typeof K != "function") throw new TypeError("resolver must be a function");
  49573. this.state = Y, this.queue = [], this.outcome = void 0, K !== u && z(this, K);
  49574. }
  49575. function X(K, V, N) {
  49576. this.promise = K, typeof V == "function" && (this.onFulfilled = V, this.callFulfilled = this.otherCallFulfilled), typeof N == "function" && (this.onRejected = N, this.callRejected = this.otherCallRejected);
  49577. }
  49578. function H(K, V, N) {
  49579. b(function() {
  49580. var B;
  49581. try {
  49582. B = V(N);
  49583. } catch (G) {
  49584. return m.reject(K, G);
  49585. }
  49586. B === K ? m.reject(K, new TypeError("Cannot resolve promise with itself")) : m.resolve(K, B);
  49587. });
  49588. }
  49589. function S(K) {
  49590. var V = K && K.then;
  49591. if (K && (typeof K == "object" || typeof K == "function") && typeof V == "function") return function() {
  49592. V.apply(K, arguments);
  49593. };
  49594. }
  49595. function z(K, V) {
  49596. var N = !1;
  49597. function B(W) {
  49598. N || (N = !0, m.reject(K, W));
  49599. }
  49600. function G(W) {
  49601. N || (N = !0, m.resolve(K, W));
  49602. }
  49603. var w = v(function() {
  49604. V(G, B);
  49605. });
  49606. w.status === "error" && B(w.value);
  49607. }
  49608. function v(K, V) {
  49609. var N = {};
  49610. try {
  49611. N.value = K(V), N.status = "success";
  49612. } catch (B) {
  49613. N.status = "error", N.value = B;
  49614. }
  49615. return N;
  49616. }
  49617. (r.exports = R).prototype.finally = function(K) {
  49618. if (typeof K != "function") return this;
  49619. var V = this.constructor;
  49620. return this.then(function(N) {
  49621. return V.resolve(K()).then(function() {
  49622. return N;
  49623. });
  49624. }, function(N) {
  49625. return V.resolve(K()).then(function() {
  49626. throw N;
  49627. });
  49628. });
  49629. }, R.prototype.catch = function(K) {
  49630. return this.then(null, K);
  49631. }, R.prototype.then = function(K, V) {
  49632. if (typeof K != "function" && this.state === p || typeof V != "function" && this.state === Z) return this;
  49633. var N = new this.constructor(u);
  49634. return this.state !== Y ? H(N, this.state === p ? K : V, this.outcome) : this.queue.push(new X(N, K, V)), N;
  49635. }, X.prototype.callFulfilled = function(K) {
  49636. m.resolve(this.promise, K);
  49637. }, X.prototype.otherCallFulfilled = function(K) {
  49638. H(this.promise, this.onFulfilled, K);
  49639. }, X.prototype.callRejected = function(K) {
  49640. m.reject(this.promise, K);
  49641. }, X.prototype.otherCallRejected = function(K) {
  49642. H(this.promise, this.onRejected, K);
  49643. }, m.resolve = function(K, V) {
  49644. var N = v(S, V);
  49645. if (N.status === "error") return m.reject(K, N.value);
  49646. var B = N.value;
  49647. if (B) z(K, B);
  49648. else {
  49649. K.state = p, K.outcome = V;
  49650. for (var G = -1, w = K.queue.length; ++G < w; ) K.queue[G].callFulfilled(V);
  49651. }
  49652. return K;
  49653. }, m.reject = function(K, V) {
  49654. K.state = Z, K.outcome = V;
  49655. for (var N = -1, B = K.queue.length; ++N < B; ) K.queue[N].callRejected(V);
  49656. return K;
  49657. }, R.resolve = function(K) {
  49658. return K instanceof this ? K : m.resolve(new this(u), K);
  49659. }, R.reject = function(K) {
  49660. var V = new this(u);
  49661. return m.reject(V, K);
  49662. }, R.all = function(K) {
  49663. var V = this;
  49664. if (Object.prototype.toString.call(K) !== "[object Array]") return this.reject(new TypeError("must be an array"));
  49665. var N = K.length, B = !1;
  49666. if (!N) return this.resolve([]);
  49667. for (var G = new Array(N), w = 0, W = -1, y = new this(u); ++W < N; ) f(K[W], W);
  49668. return y;
  49669. function f(D, F) {
  49670. V.resolve(D).then(function(T) {
  49671. G[F] = T, ++w !== N || B || (B = !0, m.resolve(y, G));
  49672. }, function(T) {
  49673. B || (B = !0, m.reject(y, T));
  49674. });
  49675. }
  49676. }, R.race = function(K) {
  49677. if (Object.prototype.toString.call(K) !== "[object Array]") return this.reject(new TypeError("must be an array"));
  49678. var V = K.length, N = !1;
  49679. if (!V) return this.resolve([]);
  49680. for (var B, G = -1, w = new this(u); ++G < V; ) B = K[G], this.resolve(B).then(function(W) {
  49681. N || (N = !0, m.resolve(w, W));
  49682. }, function(W) {
  49683. N || (N = !0, m.reject(w, W));
  49684. });
  49685. return w;
  49686. };
  49687. }, { immediate: 36 }], 38: [function(c, r, h) {
  49688. var b = {};
  49689. (0, c("./lib/utils/common").assign)(b, c("./lib/deflate"), c("./lib/inflate"), c("./lib/zlib/constants")), r.exports = b;
  49690. }, { "./lib/deflate": 39, "./lib/inflate": 40, "./lib/utils/common": 41, "./lib/zlib/constants": 44 }], 39: [function(c, r, h) {
  49691. var b = c("./zlib/deflate"), u = c("./utils/common"), m = c("./utils/strings"), Z = c("./zlib/messages"), p = c("./zlib/zstream"), Y = Object.prototype.toString;
  49692. function R(H) {
  49693. if (!(this instanceof R)) return new R(H);
  49694. this.options = u.assign({ level: -1, method: 8, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: 0, to: "" }, H || {});
  49695. var S = this.options;
  49696. S.raw && 0 < S.windowBits ? S.windowBits = -S.windowBits : S.gzip && 0 < S.windowBits && S.windowBits < 16 && (S.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new p(), this.strm.avail_out = 0;
  49697. var z = b.deflateInit2(this.strm, S.level, S.method, S.windowBits, S.memLevel, S.strategy);
  49698. if (z !== 0) throw new Error(Z[z]);
  49699. if (S.header && b.deflateSetHeader(this.strm, S.header), S.dictionary) {
  49700. var v;
  49701. if (v = typeof S.dictionary == "string" ? m.string2buf(S.dictionary) : Y.call(S.dictionary) === "[object ArrayBuffer]" ? new Uint8Array(S.dictionary) : S.dictionary, (z = b.deflateSetDictionary(this.strm, v)) !== 0) throw new Error(Z[z]);
  49702. this._dict_set = !0;
  49703. }
  49704. }
  49705. function X(H, S) {
  49706. var z = new R(S);
  49707. if (z.push(H, !0), z.err) throw z.msg || Z[z.err];
  49708. return z.result;
  49709. }
  49710. R.prototype.push = function(H, S) {
  49711. var z, v, K = this.strm, V = this.options.chunkSize;
  49712. if (this.ended) return !1;
  49713. v = S === ~~S ? S : S === !0 ? 4 : 0, typeof H == "string" ? K.input = m.string2buf(H) : Y.call(H) === "[object ArrayBuffer]" ? K.input = new Uint8Array(H) : K.input = H, K.next_in = 0, K.avail_in = K.input.length;
  49714. do {
  49715. if (K.avail_out === 0 && (K.output = new u.Buf8(V), K.next_out = 0, K.avail_out = V), (z = b.deflate(K, v)) !== 1 && z !== 0) return this.onEnd(z), !(this.ended = !0);
  49716. K.avail_out !== 0 && (K.avail_in !== 0 || v !== 4 && v !== 2) || (this.options.to === "string" ? this.onData(m.buf2binstring(u.shrinkBuf(K.output, K.next_out))) : this.onData(u.shrinkBuf(K.output, K.next_out)));
  49717. } while ((0 < K.avail_in || K.avail_out === 0) && z !== 1);
  49718. return v === 4 ? (z = b.deflateEnd(this.strm), this.onEnd(z), this.ended = !0, z === 0) : v !== 2 || (this.onEnd(0), !(K.avail_out = 0));
  49719. }, R.prototype.onData = function(H) {
  49720. this.chunks.push(H);
  49721. }, R.prototype.onEnd = function(H) {
  49722. H === 0 && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = u.flattenChunks(this.chunks)), this.chunks = [], this.err = H, this.msg = this.strm.msg;
  49723. }, h.Deflate = R, h.deflate = X, h.deflateRaw = function(H, S) {
  49724. return (S = S || {}).raw = !0, X(H, S);
  49725. }, h.gzip = function(H, S) {
  49726. return (S = S || {}).gzip = !0, X(H, S);
  49727. };
  49728. }, { "./utils/common": 41, "./utils/strings": 42, "./zlib/deflate": 46, "./zlib/messages": 51, "./zlib/zstream": 53 }], 40: [function(c, r, h) {
  49729. var b = c("./zlib/inflate"), u = c("./utils/common"), m = c("./utils/strings"), Z = c("./zlib/constants"), p = c("./zlib/messages"), Y = c("./zlib/zstream"), R = c("./zlib/gzheader"), X = Object.prototype.toString;
  49730. function H(z) {
  49731. if (!(this instanceof H)) return new H(z);
  49732. this.options = u.assign({ chunkSize: 16384, windowBits: 0, to: "" }, z || {});
  49733. var v = this.options;
  49734. v.raw && 0 <= v.windowBits && v.windowBits < 16 && (v.windowBits = -v.windowBits, v.windowBits === 0 && (v.windowBits = -15)), !(0 <= v.windowBits && v.windowBits < 16) || z && z.windowBits || (v.windowBits += 32), 15 < v.windowBits && v.windowBits < 48 && (15 & v.windowBits) == 0 && (v.windowBits |= 15), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new Y(), this.strm.avail_out = 0;
  49735. var K = b.inflateInit2(this.strm, v.windowBits);
  49736. if (K !== Z.Z_OK) throw new Error(p[K]);
  49737. this.header = new R(), b.inflateGetHeader(this.strm, this.header);
  49738. }
  49739. function S(z, v) {
  49740. var K = new H(v);
  49741. if (K.push(z, !0), K.err) throw K.msg || p[K.err];
  49742. return K.result;
  49743. }
  49744. H.prototype.push = function(z, v) {
  49745. var K, V, N, B, G, w, W = this.strm, y = this.options.chunkSize, f = this.options.dictionary, D = !1;
  49746. if (this.ended) return !1;
  49747. V = v === ~~v ? v : v === !0 ? Z.Z_FINISH : Z.Z_NO_FLUSH, typeof z == "string" ? W.input = m.binstring2buf(z) : X.call(z) === "[object ArrayBuffer]" ? W.input = new Uint8Array(z) : W.input = z, W.next_in = 0, W.avail_in = W.input.length;
  49748. do {
  49749. if (W.avail_out === 0 && (W.output = new u.Buf8(y), W.next_out = 0, W.avail_out = y), (K = b.inflate(W, Z.Z_NO_FLUSH)) === Z.Z_NEED_DICT && f && (w = typeof f == "string" ? m.string2buf(f) : X.call(f) === "[object ArrayBuffer]" ? new Uint8Array(f) : f, K = b.inflateSetDictionary(this.strm, w)), K === Z.Z_BUF_ERROR && D === !0 && (K = Z.Z_OK, D = !1), K !== Z.Z_STREAM_END && K !== Z.Z_OK) return this.onEnd(K), !(this.ended = !0);
  49750. W.next_out && (W.avail_out !== 0 && K !== Z.Z_STREAM_END && (W.avail_in !== 0 || V !== Z.Z_FINISH && V !== Z.Z_SYNC_FLUSH) || (this.options.to === "string" ? (N = m.utf8border(W.output, W.next_out), B = W.next_out - N, G = m.buf2string(W.output, N), W.next_out = B, W.avail_out = y - B, B && u.arraySet(W.output, W.output, N, B, 0), this.onData(G)) : this.onData(u.shrinkBuf(W.output, W.next_out)))), W.avail_in === 0 && W.avail_out === 0 && (D = !0);
  49751. } while ((0 < W.avail_in || W.avail_out === 0) && K !== Z.Z_STREAM_END);
  49752. return K === Z.Z_STREAM_END && (V = Z.Z_FINISH), V === Z.Z_FINISH ? (K = b.inflateEnd(this.strm), this.onEnd(K), this.ended = !0, K === Z.Z_OK) : V !== Z.Z_SYNC_FLUSH || (this.onEnd(Z.Z_OK), !(W.avail_out = 0));
  49753. }, H.prototype.onData = function(z) {
  49754. this.chunks.push(z);
  49755. }, H.prototype.onEnd = function(z) {
  49756. z === Z.Z_OK && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = u.flattenChunks(this.chunks)), this.chunks = [], this.err = z, this.msg = this.strm.msg;
  49757. }, h.Inflate = H, h.inflate = S, h.inflateRaw = function(z, v) {
  49758. return (v = v || {}).raw = !0, S(z, v);
  49759. }, h.ungzip = S;
  49760. }, { "./utils/common": 41, "./utils/strings": 42, "./zlib/constants": 44, "./zlib/gzheader": 47, "./zlib/inflate": 49, "./zlib/messages": 51, "./zlib/zstream": 53 }], 41: [function(c, r, h) {
  49761. var b = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Int32Array < "u";
  49762. h.assign = function(Z) {
  49763. for (var p = Array.prototype.slice.call(arguments, 1); p.length; ) {
  49764. var Y = p.shift();
  49765. if (Y) {
  49766. if (typeof Y != "object") throw new TypeError(Y + "must be non-object");
  49767. for (var R in Y) Y.hasOwnProperty(R) && (Z[R] = Y[R]);
  49768. }
  49769. }
  49770. return Z;
  49771. }, h.shrinkBuf = function(Z, p) {
  49772. return Z.length === p ? Z : Z.subarray ? Z.subarray(0, p) : (Z.length = p, Z);
  49773. };
  49774. var u = { arraySet: function(Z, p, Y, R, X) {
  49775. if (p.subarray && Z.subarray) Z.set(p.subarray(Y, Y + R), X);
  49776. else for (var H = 0; H < R; H++) Z[X + H] = p[Y + H];
  49777. }, flattenChunks: function(Z) {
  49778. var p, Y, R, X, H, S;
  49779. for (p = R = 0, Y = Z.length; p < Y; p++) R += Z[p].length;
  49780. for (S = new Uint8Array(R), p = X = 0, Y = Z.length; p < Y; p++) H = Z[p], S.set(H, X), X += H.length;
  49781. return S;
  49782. } }, m = { arraySet: function(Z, p, Y, R, X) {
  49783. for (var H = 0; H < R; H++) Z[X + H] = p[Y + H];
  49784. }, flattenChunks: function(Z) {
  49785. return [].concat.apply([], Z);
  49786. } };
  49787. h.setTyped = function(Z) {
  49788. Z ? (h.Buf8 = Uint8Array, h.Buf16 = Uint16Array, h.Buf32 = Int32Array, h.assign(h, u)) : (h.Buf8 = Array, h.Buf16 = Array, h.Buf32 = Array, h.assign(h, m));
  49789. }, h.setTyped(b);
  49790. }, {}], 42: [function(c, r, h) {
  49791. var b = c("./common"), u = !0, m = !0;
  49792. try {
  49793. String.fromCharCode.apply(null, [0]);
  49794. } catch {
  49795. u = !1;
  49796. }
  49797. try {
  49798. String.fromCharCode.apply(null, new Uint8Array(1));
  49799. } catch {
  49800. m = !1;
  49801. }
  49802. for (var Z = new b.Buf8(256), p = 0; p < 256; p++) Z[p] = 252 <= p ? 6 : 248 <= p ? 5 : 240 <= p ? 4 : 224 <= p ? 3 : 192 <= p ? 2 : 1;
  49803. function Y(R, X) {
  49804. if (X < 65537 && (R.subarray && m || !R.subarray && u)) return String.fromCharCode.apply(null, b.shrinkBuf(R, X));
  49805. for (var H = "", S = 0; S < X; S++) H += String.fromCharCode(R[S]);
  49806. return H;
  49807. }
  49808. Z[254] = Z[254] = 1, h.string2buf = function(R) {
  49809. var X, H, S, z, v, K = R.length, V = 0;
  49810. for (z = 0; z < K; z++) (64512 & (H = R.charCodeAt(z))) == 55296 && z + 1 < K && (64512 & (S = R.charCodeAt(z + 1))) == 56320 && (H = 65536 + (H - 55296 << 10) + (S - 56320), z++), V += H < 128 ? 1 : H < 2048 ? 2 : H < 65536 ? 3 : 4;
  49811. for (X = new b.Buf8(V), z = v = 0; v < V; z++) (64512 & (H = R.charCodeAt(z))) == 55296 && z + 1 < K && (64512 & (S = R.charCodeAt(z + 1))) == 56320 && (H = 65536 + (H - 55296 << 10) + (S - 56320), z++), H < 128 ? X[v++] = H : (H < 2048 ? X[v++] = 192 | H >>> 6 : (H < 65536 ? X[v++] = 224 | H >>> 12 : (X[v++] = 240 | H >>> 18, X[v++] = 128 | H >>> 12 & 63), X[v++] = 128 | H >>> 6 & 63), X[v++] = 128 | 63 & H);
  49812. return X;
  49813. }, h.buf2binstring = function(R) {
  49814. return Y(R, R.length);
  49815. }, h.binstring2buf = function(R) {
  49816. for (var X = new b.Buf8(R.length), H = 0, S = X.length; H < S; H++) X[H] = R.charCodeAt(H);
  49817. return X;
  49818. }, h.buf2string = function(R, X) {
  49819. var H, S, z, v, K = X || R.length, V = new Array(2 * K);
  49820. for (H = S = 0; H < K; ) if ((z = R[H++]) < 128) V[S++] = z;
  49821. else if (4 < (v = Z[z])) V[S++] = 65533, H += v - 1;
  49822. else {
  49823. for (z &= v === 2 ? 31 : v === 3 ? 15 : 7; 1 < v && H < K; ) z = z << 6 | 63 & R[H++], v--;
  49824. 1 < v ? V[S++] = 65533 : z < 65536 ? V[S++] = z : (z -= 65536, V[S++] = 55296 | z >> 10 & 1023, V[S++] = 56320 | 1023 & z);
  49825. }
  49826. return Y(V, S);
  49827. }, h.utf8border = function(R, X) {
  49828. var H;
  49829. for ((X = X || R.length) > R.length && (X = R.length), H = X - 1; 0 <= H && (192 & R[H]) == 128; ) H--;
  49830. return H < 0 || H === 0 ? X : H + Z[R[H]] > X ? H : X;
  49831. };
  49832. }, { "./common": 41 }], 43: [function(c, r, h) {
  49833. r.exports = function(b, u, m, Z) {
  49834. for (var p = 65535 & b | 0, Y = b >>> 16 & 65535 | 0, R = 0; m !== 0; ) {
  49835. for (m -= R = 2e3 < m ? 2e3 : m; Y = Y + (p = p + u[Z++] | 0) | 0, --R; ) ;
  49836. p %= 65521, Y %= 65521;
  49837. }
  49838. return p | Y << 16 | 0;
  49839. };
  49840. }, {}], 44: [function(c, r, h) {
  49841. r.exports = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 };
  49842. }, {}], 45: [function(c, r, h) {
  49843. var b = function() {
  49844. for (var u, m = [], Z = 0; Z < 256; Z++) {
  49845. u = Z;
  49846. for (var p = 0; p < 8; p++) u = 1 & u ? 3988292384 ^ u >>> 1 : u >>> 1;
  49847. m[Z] = u;
  49848. }
  49849. return m;
  49850. }();
  49851. r.exports = function(u, m, Z, p) {
  49852. var Y = b, R = p + Z;
  49853. u ^= -1;
  49854. for (var X = p; X < R; X++) u = u >>> 8 ^ Y[255 & (u ^ m[X])];
  49855. return -1 ^ u;
  49856. };
  49857. }, {}], 46: [function(c, r, h) {
  49858. var b, u = c("../utils/common"), m = c("./trees"), Z = c("./adler32"), p = c("./crc32"), Y = c("./messages"), R = -2, X = 258, H = 262, S = 113;
  49859. function z(L, E) {
  49860. return L.msg = Y[E], E;
  49861. }
  49862. function v(L) {
  49863. return (L << 1) - (4 < L ? 9 : 0);
  49864. }
  49865. function K(L) {
  49866. for (var E = L.length; 0 <= --E; ) L[E] = 0;
  49867. }
  49868. function V(L) {
  49869. var E = L.state, J = E.pending;
  49870. J > L.avail_out && (J = L.avail_out), J !== 0 && (u.arraySet(L.output, E.pending_buf, E.pending_out, J, L.next_out), L.next_out += J, E.pending_out += J, L.total_out += J, L.avail_out -= J, E.pending -= J, E.pending === 0 && (E.pending_out = 0));
  49871. }
  49872. function N(L, E) {
  49873. m._tr_flush_block(L, 0 <= L.block_start ? L.block_start : -1, L.strstart - L.block_start, E), L.block_start = L.strstart, V(L.strm);
  49874. }
  49875. function B(L, E) {
  49876. L.pending_buf[L.pending++] = E;
  49877. }
  49878. function G(L, E) {
  49879. L.pending_buf[L.pending++] = E >>> 8 & 255, L.pending_buf[L.pending++] = 255 & E;
  49880. }
  49881. function w(L, E) {
  49882. var J, k, j = L.max_chain_length, q = L.strstart, Cg = L.prev_length, Ig = L.nice_match, x = L.strstart > L.w_size - H ? L.strstart - (L.w_size - H) : 0, Ag = L.window, eg = L.w_mask, O = L.prev, _ = L.strstart + X, gg = Ag[q + Cg - 1], lg = Ag[q + Cg];
  49883. L.prev_length >= L.good_match && (j >>= 2), Ig > L.lookahead && (Ig = L.lookahead);
  49884. do
  49885. if (Ag[(J = E) + Cg] === lg && Ag[J + Cg - 1] === gg && Ag[J] === Ag[q] && Ag[++J] === Ag[q + 1]) {
  49886. q += 2, J++;
  49887. do
  49888. ;
  49889. while (Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && q < _);
  49890. if (k = X - (_ - q), q = _ - X, Cg < k) {
  49891. if (L.match_start = E, Ig <= (Cg = k)) break;
  49892. gg = Ag[q + Cg - 1], lg = Ag[q + Cg];
  49893. }
  49894. }
  49895. while ((E = O[E & eg]) > x && --j != 0);
  49896. return Cg <= L.lookahead ? Cg : L.lookahead;
  49897. }
  49898. function W(L) {
  49899. var E, J, k, j, q, Cg, Ig, x, Ag, eg, O = L.w_size;
  49900. do {
  49901. if (j = L.window_size - L.lookahead - L.strstart, L.strstart >= O + (O - H)) {
  49902. for (u.arraySet(L.window, L.window, O, O, 0), L.match_start -= O, L.strstart -= O, L.block_start -= O, E = J = L.hash_size; k = L.head[--E], L.head[E] = O <= k ? k - O : 0, --J; ) ;
  49903. for (E = J = O; k = L.prev[--E], L.prev[E] = O <= k ? k - O : 0, --J; ) ;
  49904. j += O;
  49905. }
  49906. if (L.strm.avail_in === 0) break;
  49907. if (Cg = L.strm, Ig = L.window, x = L.strstart + L.lookahead, eg = void 0, (Ag = j) < (eg = Cg.avail_in) && (eg = Ag), J = eg === 0 ? 0 : (Cg.avail_in -= eg, u.arraySet(Ig, Cg.input, Cg.next_in, eg, x), Cg.state.wrap === 1 ? Cg.adler = Z(Cg.adler, Ig, eg, x) : Cg.state.wrap === 2 && (Cg.adler = p(Cg.adler, Ig, eg, x)), Cg.next_in += eg, Cg.total_in += eg, eg), L.lookahead += J, L.lookahead + L.insert >= 3) for (q = L.strstart - L.insert, L.ins_h = L.window[q], L.ins_h = (L.ins_h << L.hash_shift ^ L.window[q + 1]) & L.hash_mask; L.insert && (L.ins_h = (L.ins_h << L.hash_shift ^ L.window[q + 3 - 1]) & L.hash_mask, L.prev[q & L.w_mask] = L.head[L.ins_h], L.head[L.ins_h] = q, q++, L.insert--, !(L.lookahead + L.insert < 3)); ) ;
  49908. } while (L.lookahead < H && L.strm.avail_in !== 0);
  49909. }
  49910. function y(L, E) {
  49911. for (var J, k; ; ) {
  49912. if (L.lookahead < H) {
  49913. if (W(L), L.lookahead < H && E === 0) return 1;
  49914. if (L.lookahead === 0) break;
  49915. }
  49916. if (J = 0, L.lookahead >= 3 && (L.ins_h = (L.ins_h << L.hash_shift ^ L.window[L.strstart + 3 - 1]) & L.hash_mask, J = L.prev[L.strstart & L.w_mask] = L.head[L.ins_h], L.head[L.ins_h] = L.strstart), J !== 0 && L.strstart - J <= L.w_size - H && (L.match_length = w(L, J)), L.match_length >= 3) if (k = m._tr_tally(L, L.strstart - L.match_start, L.match_length - 3), L.lookahead -= L.match_length, L.match_length <= L.max_lazy_match && L.lookahead >= 3) {
  49917. for (L.match_length--; L.strstart++, L.ins_h = (L.ins_h << L.hash_shift ^ L.window[L.strstart + 3 - 1]) & L.hash_mask, J = L.prev[L.strstart & L.w_mask] = L.head[L.ins_h], L.head[L.ins_h] = L.strstart, --L.match_length != 0; ) ;
  49918. L.strstart++;
  49919. } else L.strstart += L.match_length, L.match_length = 0, L.ins_h = L.window[L.strstart], L.ins_h = (L.ins_h << L.hash_shift ^ L.window[L.strstart + 1]) & L.hash_mask;
  49920. else k = m._tr_tally(L, 0, L.window[L.strstart]), L.lookahead--, L.strstart++;
  49921. if (k && (N(L, !1), L.strm.avail_out === 0)) return 1;
  49922. }
  49923. return L.insert = L.strstart < 2 ? L.strstart : 2, E === 4 ? (N(L, !0), L.strm.avail_out === 0 ? 3 : 4) : L.last_lit && (N(L, !1), L.strm.avail_out === 0) ? 1 : 2;
  49924. }
  49925. function f(L, E) {
  49926. for (var J, k, j; ; ) {
  49927. if (L.lookahead < H) {
  49928. if (W(L), L.lookahead < H && E === 0) return 1;
  49929. if (L.lookahead === 0) break;
  49930. }
  49931. if (J = 0, L.lookahead >= 3 && (L.ins_h = (L.ins_h << L.hash_shift ^ L.window[L.strstart + 3 - 1]) & L.hash_mask, J = L.prev[L.strstart & L.w_mask] = L.head[L.ins_h], L.head[L.ins_h] = L.strstart), L.prev_length = L.match_length, L.prev_match = L.match_start, L.match_length = 2, J !== 0 && L.prev_length < L.max_lazy_match && L.strstart - J <= L.w_size - H && (L.match_length = w(L, J), L.match_length <= 5 && (L.strategy === 1 || L.match_length === 3 && 4096 < L.strstart - L.match_start) && (L.match_length = 2)), L.prev_length >= 3 && L.match_length <= L.prev_length) {
  49932. for (j = L.strstart + L.lookahead - 3, k = m._tr_tally(L, L.strstart - 1 - L.prev_match, L.prev_length - 3), L.lookahead -= L.prev_length - 1, L.prev_length -= 2; ++L.strstart <= j && (L.ins_h = (L.ins_h << L.hash_shift ^ L.window[L.strstart + 3 - 1]) & L.hash_mask, J = L.prev[L.strstart & L.w_mask] = L.head[L.ins_h], L.head[L.ins_h] = L.strstart), --L.prev_length != 0; ) ;
  49933. if (L.match_available = 0, L.match_length = 2, L.strstart++, k && (N(L, !1), L.strm.avail_out === 0)) return 1;
  49934. } else if (L.match_available) {
  49935. if ((k = m._tr_tally(L, 0, L.window[L.strstart - 1])) && N(L, !1), L.strstart++, L.lookahead--, L.strm.avail_out === 0) return 1;
  49936. } else L.match_available = 1, L.strstart++, L.lookahead--;
  49937. }
  49938. return L.match_available && (k = m._tr_tally(L, 0, L.window[L.strstart - 1]), L.match_available = 0), L.insert = L.strstart < 2 ? L.strstart : 2, E === 4 ? (N(L, !0), L.strm.avail_out === 0 ? 3 : 4) : L.last_lit && (N(L, !1), L.strm.avail_out === 0) ? 1 : 2;
  49939. }
  49940. function D(L, E, J, k, j) {
  49941. this.good_length = L, this.max_lazy = E, this.nice_length = J, this.max_chain = k, this.func = j;
  49942. }
  49943. function F() {
  49944. this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = 8, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new u.Buf16(1146), this.dyn_dtree = new u.Buf16(122), this.bl_tree = new u.Buf16(78), K(this.dyn_ltree), K(this.dyn_dtree), K(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new u.Buf16(16), this.heap = new u.Buf16(573), K(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new u.Buf16(573), K(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;
  49945. }
  49946. function T(L) {
  49947. var E;
  49948. return L && L.state ? (L.total_in = L.total_out = 0, L.data_type = 2, (E = L.state).pending = 0, E.pending_out = 0, E.wrap < 0 && (E.wrap = -E.wrap), E.status = E.wrap ? 42 : S, L.adler = E.wrap === 2 ? 0 : 1, E.last_flush = 0, m._tr_init(E), 0) : z(L, R);
  49949. }
  49950. function Q(L) {
  49951. var E = T(L);
  49952. return E === 0 && function(J) {
  49953. J.window_size = 2 * J.w_size, K(J.head), J.max_lazy_match = b[J.level].max_lazy, J.good_match = b[J.level].good_length, J.nice_match = b[J.level].nice_length, J.max_chain_length = b[J.level].max_chain, J.strstart = 0, J.block_start = 0, J.lookahead = 0, J.insert = 0, J.match_length = J.prev_length = 2, J.match_available = 0, J.ins_h = 0;
  49954. }(L.state), E;
  49955. }
  49956. function P(L, E, J, k, j, q) {
  49957. if (!L) return R;
  49958. var Cg = 1;
  49959. if (E === -1 && (E = 6), k < 0 ? (Cg = 0, k = -k) : 15 < k && (Cg = 2, k -= 16), j < 1 || 9 < j || J !== 8 || k < 8 || 15 < k || E < 0 || 9 < E || q < 0 || 4 < q) return z(L, R);
  49960. k === 8 && (k = 9);
  49961. var Ig = new F();
  49962. return (L.state = Ig).strm = L, Ig.wrap = Cg, Ig.gzhead = null, Ig.w_bits = k, Ig.w_size = 1 << Ig.w_bits, Ig.w_mask = Ig.w_size - 1, Ig.hash_bits = j + 7, Ig.hash_size = 1 << Ig.hash_bits, Ig.hash_mask = Ig.hash_size - 1, Ig.hash_shift = ~~((Ig.hash_bits + 3 - 1) / 3), Ig.window = new u.Buf8(2 * Ig.w_size), Ig.head = new u.Buf16(Ig.hash_size), Ig.prev = new u.Buf16(Ig.w_size), Ig.lit_bufsize = 1 << j + 6, Ig.pending_buf_size = 4 * Ig.lit_bufsize, Ig.pending_buf = new u.Buf8(Ig.pending_buf_size), Ig.d_buf = 1 * Ig.lit_bufsize, Ig.l_buf = 3 * Ig.lit_bufsize, Ig.level = E, Ig.strategy = q, Ig.method = J, Q(L);
  49963. }
  49964. b = [new D(0, 0, 0, 0, function(L, E) {
  49965. var J = 65535;
  49966. for (J > L.pending_buf_size - 5 && (J = L.pending_buf_size - 5); ; ) {
  49967. if (L.lookahead <= 1) {
  49968. if (W(L), L.lookahead === 0 && E === 0) return 1;
  49969. if (L.lookahead === 0) break;
  49970. }
  49971. L.strstart += L.lookahead, L.lookahead = 0;
  49972. var k = L.block_start + J;
  49973. if ((L.strstart === 0 || L.strstart >= k) && (L.lookahead = L.strstart - k, L.strstart = k, N(L, !1), L.strm.avail_out === 0) || L.strstart - L.block_start >= L.w_size - H && (N(L, !1), L.strm.avail_out === 0)) return 1;
  49974. }
  49975. return L.insert = 0, E === 4 ? (N(L, !0), L.strm.avail_out === 0 ? 3 : 4) : (L.strstart > L.block_start && (N(L, !1), L.strm.avail_out), 1);
  49976. }), new D(4, 4, 8, 4, y), new D(4, 5, 16, 8, y), new D(4, 6, 32, 32, y), new D(4, 4, 16, 16, f), new D(8, 16, 32, 32, f), new D(8, 16, 128, 128, f), new D(8, 32, 128, 256, f), new D(32, 128, 258, 1024, f), new D(32, 258, 258, 4096, f)], h.deflateInit = function(L, E) {
  49977. return P(L, E, 8, 15, 8, 0);
  49978. }, h.deflateInit2 = P, h.deflateReset = Q, h.deflateResetKeep = T, h.deflateSetHeader = function(L, E) {
  49979. return L && L.state ? L.state.wrap !== 2 ? R : (L.state.gzhead = E, 0) : R;
  49980. }, h.deflate = function(L, E) {
  49981. var J, k, j, q;
  49982. if (!L || !L.state || 5 < E || E < 0) return L ? z(L, R) : R;
  49983. if (k = L.state, !L.output || !L.input && L.avail_in !== 0 || k.status === 666 && E !== 4) return z(L, L.avail_out === 0 ? -5 : R);
  49984. if (k.strm = L, J = k.last_flush, k.last_flush = E, k.status === 42) if (k.wrap === 2) L.adler = 0, B(k, 31), B(k, 139), B(k, 8), k.gzhead ? (B(k, (k.gzhead.text ? 1 : 0) + (k.gzhead.hcrc ? 2 : 0) + (k.gzhead.extra ? 4 : 0) + (k.gzhead.name ? 8 : 0) + (k.gzhead.comment ? 16 : 0)), B(k, 255 & k.gzhead.time), B(k, k.gzhead.time >> 8 & 255), B(k, k.gzhead.time >> 16 & 255), B(k, k.gzhead.time >> 24 & 255), B(k, k.level === 9 ? 2 : 2 <= k.strategy || k.level < 2 ? 4 : 0), B(k, 255 & k.gzhead.os), k.gzhead.extra && k.gzhead.extra.length && (B(k, 255 & k.gzhead.extra.length), B(k, k.gzhead.extra.length >> 8 & 255)), k.gzhead.hcrc && (L.adler = p(L.adler, k.pending_buf, k.pending, 0)), k.gzindex = 0, k.status = 69) : (B(k, 0), B(k, 0), B(k, 0), B(k, 0), B(k, 0), B(k, k.level === 9 ? 2 : 2 <= k.strategy || k.level < 2 ? 4 : 0), B(k, 3), k.status = S);
  49985. else {
  49986. var Cg = 8 + (k.w_bits - 8 << 4) << 8;
  49987. Cg |= (2 <= k.strategy || k.level < 2 ? 0 : k.level < 6 ? 1 : k.level === 6 ? 2 : 3) << 6, k.strstart !== 0 && (Cg |= 32), Cg += 31 - Cg % 31, k.status = S, G(k, Cg), k.strstart !== 0 && (G(k, L.adler >>> 16), G(k, 65535 & L.adler)), L.adler = 1;
  49988. }
  49989. if (k.status === 69) if (k.gzhead.extra) {
  49990. for (j = k.pending; k.gzindex < (65535 & k.gzhead.extra.length) && (k.pending !== k.pending_buf_size || (k.gzhead.hcrc && k.pending > j && (L.adler = p(L.adler, k.pending_buf, k.pending - j, j)), V(L), j = k.pending, k.pending !== k.pending_buf_size)); ) B(k, 255 & k.gzhead.extra[k.gzindex]), k.gzindex++;
  49991. k.gzhead.hcrc && k.pending > j && (L.adler = p(L.adler, k.pending_buf, k.pending - j, j)), k.gzindex === k.gzhead.extra.length && (k.gzindex = 0, k.status = 73);
  49992. } else k.status = 73;
  49993. if (k.status === 73) if (k.gzhead.name) {
  49994. j = k.pending;
  49995. do {
  49996. if (k.pending === k.pending_buf_size && (k.gzhead.hcrc && k.pending > j && (L.adler = p(L.adler, k.pending_buf, k.pending - j, j)), V(L), j = k.pending, k.pending === k.pending_buf_size)) {
  49997. q = 1;
  49998. break;
  49999. }
  50000. q = k.gzindex < k.gzhead.name.length ? 255 & k.gzhead.name.charCodeAt(k.gzindex++) : 0, B(k, q);
  50001. } while (q !== 0);
  50002. k.gzhead.hcrc && k.pending > j && (L.adler = p(L.adler, k.pending_buf, k.pending - j, j)), q === 0 && (k.gzindex = 0, k.status = 91);
  50003. } else k.status = 91;
  50004. if (k.status === 91) if (k.gzhead.comment) {
  50005. j = k.pending;
  50006. do {
  50007. if (k.pending === k.pending_buf_size && (k.gzhead.hcrc && k.pending > j && (L.adler = p(L.adler, k.pending_buf, k.pending - j, j)), V(L), j = k.pending, k.pending === k.pending_buf_size)) {
  50008. q = 1;
  50009. break;
  50010. }
  50011. q = k.gzindex < k.gzhead.comment.length ? 255 & k.gzhead.comment.charCodeAt(k.gzindex++) : 0, B(k, q);
  50012. } while (q !== 0);
  50013. k.gzhead.hcrc && k.pending > j && (L.adler = p(L.adler, k.pending_buf, k.pending - j, j)), q === 0 && (k.status = 103);
  50014. } else k.status = 103;
  50015. if (k.status === 103 && (k.gzhead.hcrc ? (k.pending + 2 > k.pending_buf_size && V(L), k.pending + 2 <= k.pending_buf_size && (B(k, 255 & L.adler), B(k, L.adler >> 8 & 255), L.adler = 0, k.status = S)) : k.status = S), k.pending !== 0) {
  50016. if (V(L), L.avail_out === 0) return k.last_flush = -1, 0;
  50017. } else if (L.avail_in === 0 && v(E) <= v(J) && E !== 4) return z(L, -5);
  50018. if (k.status === 666 && L.avail_in !== 0) return z(L, -5);
  50019. if (L.avail_in !== 0 || k.lookahead !== 0 || E !== 0 && k.status !== 666) {
  50020. var Ig = k.strategy === 2 ? function(x, Ag) {
  50021. for (var eg; ; ) {
  50022. if (x.lookahead === 0 && (W(x), x.lookahead === 0)) {
  50023. if (Ag === 0) return 1;
  50024. break;
  50025. }
  50026. if (x.match_length = 0, eg = m._tr_tally(x, 0, x.window[x.strstart]), x.lookahead--, x.strstart++, eg && (N(x, !1), x.strm.avail_out === 0)) return 1;
  50027. }
  50028. return x.insert = 0, Ag === 4 ? (N(x, !0), x.strm.avail_out === 0 ? 3 : 4) : x.last_lit && (N(x, !1), x.strm.avail_out === 0) ? 1 : 2;
  50029. }(k, E) : k.strategy === 3 ? function(x, Ag) {
  50030. for (var eg, O, _, gg, lg = x.window; ; ) {
  50031. if (x.lookahead <= X) {
  50032. if (W(x), x.lookahead <= X && Ag === 0) return 1;
  50033. if (x.lookahead === 0) break;
  50034. }
  50035. if (x.match_length = 0, x.lookahead >= 3 && 0 < x.strstart && (O = lg[_ = x.strstart - 1]) === lg[++_] && O === lg[++_] && O === lg[++_]) {
  50036. gg = x.strstart + X;
  50037. do
  50038. ;
  50039. while (O === lg[++_] && O === lg[++_] && O === lg[++_] && O === lg[++_] && O === lg[++_] && O === lg[++_] && O === lg[++_] && O === lg[++_] && _ < gg);
  50040. x.match_length = X - (gg - _), x.match_length > x.lookahead && (x.match_length = x.lookahead);
  50041. }
  50042. if (x.match_length >= 3 ? (eg = m._tr_tally(x, 1, x.match_length - 3), x.lookahead -= x.match_length, x.strstart += x.match_length, x.match_length = 0) : (eg = m._tr_tally(x, 0, x.window[x.strstart]), x.lookahead--, x.strstart++), eg && (N(x, !1), x.strm.avail_out === 0)) return 1;
  50043. }
  50044. return x.insert = 0, Ag === 4 ? (N(x, !0), x.strm.avail_out === 0 ? 3 : 4) : x.last_lit && (N(x, !1), x.strm.avail_out === 0) ? 1 : 2;
  50045. }(k, E) : b[k.level].func(k, E);
  50046. if (Ig !== 3 && Ig !== 4 || (k.status = 666), Ig === 1 || Ig === 3) return L.avail_out === 0 && (k.last_flush = -1), 0;
  50047. if (Ig === 2 && (E === 1 ? m._tr_align(k) : E !== 5 && (m._tr_stored_block(k, 0, 0, !1), E === 3 && (K(k.head), k.lookahead === 0 && (k.strstart = 0, k.block_start = 0, k.insert = 0))), V(L), L.avail_out === 0)) return k.last_flush = -1, 0;
  50048. }
  50049. return E !== 4 ? 0 : k.wrap <= 0 ? 1 : (k.wrap === 2 ? (B(k, 255 & L.adler), B(k, L.adler >> 8 & 255), B(k, L.adler >> 16 & 255), B(k, L.adler >> 24 & 255), B(k, 255 & L.total_in), B(k, L.total_in >> 8 & 255), B(k, L.total_in >> 16 & 255), B(k, L.total_in >> 24 & 255)) : (G(k, L.adler >>> 16), G(k, 65535 & L.adler)), V(L), 0 < k.wrap && (k.wrap = -k.wrap), k.pending !== 0 ? 0 : 1);
  50050. }, h.deflateEnd = function(L) {
  50051. var E;
  50052. return L && L.state ? (E = L.state.status) !== 42 && E !== 69 && E !== 73 && E !== 91 && E !== 103 && E !== S && E !== 666 ? z(L, R) : (L.state = null, E === S ? z(L, -3) : 0) : R;
  50053. }, h.deflateSetDictionary = function(L, E) {
  50054. var J, k, j, q, Cg, Ig, x, Ag, eg = E.length;
  50055. if (!L || !L.state || (q = (J = L.state).wrap) === 2 || q === 1 && J.status !== 42 || J.lookahead) return R;
  50056. for (q === 1 && (L.adler = Z(L.adler, E, eg, 0)), J.wrap = 0, eg >= J.w_size && (q === 0 && (K(J.head), J.strstart = 0, J.block_start = 0, J.insert = 0), Ag = new u.Buf8(J.w_size), u.arraySet(Ag, E, eg - J.w_size, J.w_size, 0), E = Ag, eg = J.w_size), Cg = L.avail_in, Ig = L.next_in, x = L.input, L.avail_in = eg, L.next_in = 0, L.input = E, W(J); J.lookahead >= 3; ) {
  50057. for (k = J.strstart, j = J.lookahead - 2; J.ins_h = (J.ins_h << J.hash_shift ^ J.window[k + 3 - 1]) & J.hash_mask, J.prev[k & J.w_mask] = J.head[J.ins_h], J.head[J.ins_h] = k, k++, --j; ) ;
  50058. J.strstart = k, J.lookahead = 2, W(J);
  50059. }
  50060. return J.strstart += J.lookahead, J.block_start = J.strstart, J.insert = J.lookahead, J.lookahead = 0, J.match_length = J.prev_length = 2, J.match_available = 0, L.next_in = Ig, L.input = x, L.avail_in = Cg, J.wrap = q, 0;
  50061. }, h.deflateInfo = "pako deflate (from Nodeca project)";
  50062. }, { "../utils/common": 41, "./adler32": 43, "./crc32": 45, "./messages": 51, "./trees": 52 }], 47: [function(c, r, h) {
  50063. r.exports = function() {
  50064. this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = "", this.comment = "", this.hcrc = 0, this.done = !1;
  50065. };
  50066. }, {}], 48: [function(c, r, h) {
  50067. r.exports = function(b, u) {
  50068. var m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L;
  50069. m = b.state, Z = b.next_in, P = b.input, p = Z + (b.avail_in - 5), Y = b.next_out, L = b.output, R = Y - (u - b.avail_out), X = Y + (b.avail_out - 257), H = m.dmax, S = m.wsize, z = m.whave, v = m.wnext, K = m.window, V = m.hold, N = m.bits, B = m.lencode, G = m.distcode, w = (1 << m.lenbits) - 1, W = (1 << m.distbits) - 1;
  50070. g: do {
  50071. N < 15 && (V += P[Z++] << N, N += 8, V += P[Z++] << N, N += 8), y = B[V & w];
  50072. I: for (; ; ) {
  50073. if (V >>>= f = y >>> 24, N -= f, (f = y >>> 16 & 255) == 0) L[Y++] = 65535 & y;
  50074. else {
  50075. if (!(16 & f)) {
  50076. if ((64 & f) == 0) {
  50077. y = B[(65535 & y) + (V & (1 << f) - 1)];
  50078. continue I;
  50079. }
  50080. if (32 & f) {
  50081. m.mode = 12;
  50082. break g;
  50083. }
  50084. b.msg = "invalid literal/length code", m.mode = 30;
  50085. break g;
  50086. }
  50087. D = 65535 & y, (f &= 15) && (N < f && (V += P[Z++] << N, N += 8), D += V & (1 << f) - 1, V >>>= f, N -= f), N < 15 && (V += P[Z++] << N, N += 8, V += P[Z++] << N, N += 8), y = G[V & W];
  50088. C: for (; ; ) {
  50089. if (V >>>= f = y >>> 24, N -= f, !(16 & (f = y >>> 16 & 255))) {
  50090. if ((64 & f) == 0) {
  50091. y = G[(65535 & y) + (V & (1 << f) - 1)];
  50092. continue C;
  50093. }
  50094. b.msg = "invalid distance code", m.mode = 30;
  50095. break g;
  50096. }
  50097. if (F = 65535 & y, N < (f &= 15) && (V += P[Z++] << N, (N += 8) < f && (V += P[Z++] << N, N += 8)), H < (F += V & (1 << f) - 1)) {
  50098. b.msg = "invalid distance too far back", m.mode = 30;
  50099. break g;
  50100. }
  50101. if (V >>>= f, N -= f, (f = Y - R) < F) {
  50102. if (z < (f = F - f) && m.sane) {
  50103. b.msg = "invalid distance too far back", m.mode = 30;
  50104. break g;
  50105. }
  50106. if (Q = K, (T = 0) === v) {
  50107. if (T += S - f, f < D) {
  50108. for (D -= f; L[Y++] = K[T++], --f; ) ;
  50109. T = Y - F, Q = L;
  50110. }
  50111. } else if (v < f) {
  50112. if (T += S + v - f, (f -= v) < D) {
  50113. for (D -= f; L[Y++] = K[T++], --f; ) ;
  50114. if (T = 0, v < D) {
  50115. for (D -= f = v; L[Y++] = K[T++], --f; ) ;
  50116. T = Y - F, Q = L;
  50117. }
  50118. }
  50119. } else if (T += v - f, f < D) {
  50120. for (D -= f; L[Y++] = K[T++], --f; ) ;
  50121. T = Y - F, Q = L;
  50122. }
  50123. for (; 2 < D; ) L[Y++] = Q[T++], L[Y++] = Q[T++], L[Y++] = Q[T++], D -= 3;
  50124. D && (L[Y++] = Q[T++], 1 < D && (L[Y++] = Q[T++]));
  50125. } else {
  50126. for (T = Y - F; L[Y++] = L[T++], L[Y++] = L[T++], L[Y++] = L[T++], 2 < (D -= 3); ) ;
  50127. D && (L[Y++] = L[T++], 1 < D && (L[Y++] = L[T++]));
  50128. }
  50129. break;
  50130. }
  50131. }
  50132. break;
  50133. }
  50134. } while (Z < p && Y < X);
  50135. Z -= D = N >> 3, V &= (1 << (N -= D << 3)) - 1, b.next_in = Z, b.next_out = Y, b.avail_in = Z < p ? p - Z + 5 : 5 - (Z - p), b.avail_out = Y < X ? X - Y + 257 : 257 - (Y - X), m.hold = V, m.bits = N;
  50136. };
  50137. }, {}], 49: [function(c, r, h) {
  50138. var b = c("../utils/common"), u = c("./adler32"), m = c("./crc32"), Z = c("./inffast"), p = c("./inftrees"), Y = -2;
  50139. function R(w) {
  50140. return (w >>> 24 & 255) + (w >>> 8 & 65280) + ((65280 & w) << 8) + ((255 & w) << 24);
  50141. }
  50142. function X() {
  50143. this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new b.Buf16(320), this.work = new b.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;
  50144. }
  50145. function H(w) {
  50146. var W;
  50147. return w && w.state ? (W = w.state, w.total_in = w.total_out = W.total = 0, w.msg = "", W.wrap && (w.adler = 1 & W.wrap), W.mode = 1, W.last = 0, W.havedict = 0, W.dmax = 32768, W.head = null, W.hold = 0, W.bits = 0, W.lencode = W.lendyn = new b.Buf32(852), W.distcode = W.distdyn = new b.Buf32(592), W.sane = 1, W.back = -1, 0) : Y;
  50148. }
  50149. function S(w) {
  50150. var W;
  50151. return w && w.state ? ((W = w.state).wsize = 0, W.whave = 0, W.wnext = 0, H(w)) : Y;
  50152. }
  50153. function z(w, W) {
  50154. var y, f;
  50155. return w && w.state ? (f = w.state, W < 0 ? (y = 0, W = -W) : (y = 1 + (W >> 4), W < 48 && (W &= 15)), W && (W < 8 || 15 < W) ? Y : (f.window !== null && f.wbits !== W && (f.window = null), f.wrap = y, f.wbits = W, S(w))) : Y;
  50156. }
  50157. function v(w, W) {
  50158. var y, f;
  50159. return w ? (f = new X(), (w.state = f).window = null, (y = z(w, W)) !== 0 && (w.state = null), y) : Y;
  50160. }
  50161. var K, V, N = !0;
  50162. function B(w) {
  50163. if (N) {
  50164. var W;
  50165. for (K = new b.Buf32(512), V = new b.Buf32(32), W = 0; W < 144; ) w.lens[W++] = 8;
  50166. for (; W < 256; ) w.lens[W++] = 9;
  50167. for (; W < 280; ) w.lens[W++] = 7;
  50168. for (; W < 288; ) w.lens[W++] = 8;
  50169. for (p(1, w.lens, 0, 288, K, 0, w.work, { bits: 9 }), W = 0; W < 32; ) w.lens[W++] = 5;
  50170. p(2, w.lens, 0, 32, V, 0, w.work, { bits: 5 }), N = !1;
  50171. }
  50172. w.lencode = K, w.lenbits = 9, w.distcode = V, w.distbits = 5;
  50173. }
  50174. function G(w, W, y, f) {
  50175. var D, F = w.state;
  50176. return F.window === null && (F.wsize = 1 << F.wbits, F.wnext = 0, F.whave = 0, F.window = new b.Buf8(F.wsize)), f >= F.wsize ? (b.arraySet(F.window, W, y - F.wsize, F.wsize, 0), F.wnext = 0, F.whave = F.wsize) : (f < (D = F.wsize - F.wnext) && (D = f), b.arraySet(F.window, W, y - f, D, F.wnext), (f -= D) ? (b.arraySet(F.window, W, y - f, f, 0), F.wnext = f, F.whave = F.wsize) : (F.wnext += D, F.wnext === F.wsize && (F.wnext = 0), F.whave < F.wsize && (F.whave += D))), 0;
  50177. }
  50178. h.inflateReset = S, h.inflateReset2 = z, h.inflateResetKeep = H, h.inflateInit = function(w) {
  50179. return v(w, 15);
  50180. }, h.inflateInit2 = v, h.inflate = function(w, W) {
  50181. var y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og = 0, cg = new b.Buf8(4), rg = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
  50182. if (!w || !w.state || !w.output || !w.input && w.avail_in !== 0) return Y;
  50183. (y = w.state).mode === 12 && (y.mode = 13), T = w.next_out, D = w.output, P = w.avail_out, F = w.next_in, f = w.input, Q = w.avail_in, L = y.hold, E = y.bits, J = Q, k = P, lg = 0;
  50184. g: for (; ; ) switch (y.mode) {
  50185. case 1:
  50186. if (y.wrap === 0) {
  50187. y.mode = 13;
  50188. break;
  50189. }
  50190. for (; E < 16; ) {
  50191. if (Q === 0) break g;
  50192. Q--, L += f[F++] << E, E += 8;
  50193. }
  50194. if (2 & y.wrap && L === 35615) {
  50195. cg[y.check = 0] = 255 & L, cg[1] = L >>> 8 & 255, y.check = m(y.check, cg, 2, 0), E = L = 0, y.mode = 2;
  50196. break;
  50197. }
  50198. if (y.flags = 0, y.head && (y.head.done = !1), !(1 & y.wrap) || (((255 & L) << 8) + (L >> 8)) % 31) {
  50199. w.msg = "incorrect header check", y.mode = 30;
  50200. break;
  50201. }
  50202. if ((15 & L) != 8) {
  50203. w.msg = "unknown compression method", y.mode = 30;
  50204. break;
  50205. }
  50206. if (E -= 4, gg = 8 + (15 & (L >>>= 4)), y.wbits === 0) y.wbits = gg;
  50207. else if (gg > y.wbits) {
  50208. w.msg = "invalid window size", y.mode = 30;
  50209. break;
  50210. }
  50211. y.dmax = 1 << gg, w.adler = y.check = 1, y.mode = 512 & L ? 10 : 12, E = L = 0;
  50212. break;
  50213. case 2:
  50214. for (; E < 16; ) {
  50215. if (Q === 0) break g;
  50216. Q--, L += f[F++] << E, E += 8;
  50217. }
  50218. if (y.flags = L, (255 & y.flags) != 8) {
  50219. w.msg = "unknown compression method", y.mode = 30;
  50220. break;
  50221. }
  50222. if (57344 & y.flags) {
  50223. w.msg = "unknown header flags set", y.mode = 30;
  50224. break;
  50225. }
  50226. y.head && (y.head.text = L >> 8 & 1), 512 & y.flags && (cg[0] = 255 & L, cg[1] = L >>> 8 & 255, y.check = m(y.check, cg, 2, 0)), E = L = 0, y.mode = 3;
  50227. case 3:
  50228. for (; E < 32; ) {
  50229. if (Q === 0) break g;
  50230. Q--, L += f[F++] << E, E += 8;
  50231. }
  50232. y.head && (y.head.time = L), 512 & y.flags && (cg[0] = 255 & L, cg[1] = L >>> 8 & 255, cg[2] = L >>> 16 & 255, cg[3] = L >>> 24 & 255, y.check = m(y.check, cg, 4, 0)), E = L = 0, y.mode = 4;
  50233. case 4:
  50234. for (; E < 16; ) {
  50235. if (Q === 0) break g;
  50236. Q--, L += f[F++] << E, E += 8;
  50237. }
  50238. y.head && (y.head.xflags = 255 & L, y.head.os = L >> 8), 512 & y.flags && (cg[0] = 255 & L, cg[1] = L >>> 8 & 255, y.check = m(y.check, cg, 2, 0)), E = L = 0, y.mode = 5;
  50239. case 5:
  50240. if (1024 & y.flags) {
  50241. for (; E < 16; ) {
  50242. if (Q === 0) break g;
  50243. Q--, L += f[F++] << E, E += 8;
  50244. }
  50245. y.length = L, y.head && (y.head.extra_len = L), 512 & y.flags && (cg[0] = 255 & L, cg[1] = L >>> 8 & 255, y.check = m(y.check, cg, 2, 0)), E = L = 0;
  50246. } else y.head && (y.head.extra = null);
  50247. y.mode = 6;
  50248. case 6:
  50249. if (1024 & y.flags && (Q < (j = y.length) && (j = Q), j && (y.head && (gg = y.head.extra_len - y.length, y.head.extra || (y.head.extra = new Array(y.head.extra_len)), b.arraySet(y.head.extra, f, F, j, gg)), 512 & y.flags && (y.check = m(y.check, f, j, F)), Q -= j, F += j, y.length -= j), y.length)) break g;
  50250. y.length = 0, y.mode = 7;
  50251. case 7:
  50252. if (2048 & y.flags) {
  50253. if (Q === 0) break g;
  50254. for (j = 0; gg = f[F + j++], y.head && gg && y.length < 65536 && (y.head.name += String.fromCharCode(gg)), gg && j < Q; ) ;
  50255. if (512 & y.flags && (y.check = m(y.check, f, j, F)), Q -= j, F += j, gg) break g;
  50256. } else y.head && (y.head.name = null);
  50257. y.length = 0, y.mode = 8;
  50258. case 8:
  50259. if (4096 & y.flags) {
  50260. if (Q === 0) break g;
  50261. for (j = 0; gg = f[F + j++], y.head && gg && y.length < 65536 && (y.head.comment += String.fromCharCode(gg)), gg && j < Q; ) ;
  50262. if (512 & y.flags && (y.check = m(y.check, f, j, F)), Q -= j, F += j, gg) break g;
  50263. } else y.head && (y.head.comment = null);
  50264. y.mode = 9;
  50265. case 9:
  50266. if (512 & y.flags) {
  50267. for (; E < 16; ) {
  50268. if (Q === 0) break g;
  50269. Q--, L += f[F++] << E, E += 8;
  50270. }
  50271. if (L !== (65535 & y.check)) {
  50272. w.msg = "header crc mismatch", y.mode = 30;
  50273. break;
  50274. }
  50275. E = L = 0;
  50276. }
  50277. y.head && (y.head.hcrc = y.flags >> 9 & 1, y.head.done = !0), w.adler = y.check = 0, y.mode = 12;
  50278. break;
  50279. case 10:
  50280. for (; E < 32; ) {
  50281. if (Q === 0) break g;
  50282. Q--, L += f[F++] << E, E += 8;
  50283. }
  50284. w.adler = y.check = R(L), E = L = 0, y.mode = 11;
  50285. case 11:
  50286. if (y.havedict === 0) return w.next_out = T, w.avail_out = P, w.next_in = F, w.avail_in = Q, y.hold = L, y.bits = E, 2;
  50287. w.adler = y.check = 1, y.mode = 12;
  50288. case 12:
  50289. if (W === 5 || W === 6) break g;
  50290. case 13:
  50291. if (y.last) {
  50292. L >>>= 7 & E, E -= 7 & E, y.mode = 27;
  50293. break;
  50294. }
  50295. for (; E < 3; ) {
  50296. if (Q === 0) break g;
  50297. Q--, L += f[F++] << E, E += 8;
  50298. }
  50299. switch (y.last = 1 & L, E -= 1, 3 & (L >>>= 1)) {
  50300. case 0:
  50301. y.mode = 14;
  50302. break;
  50303. case 1:
  50304. if (B(y), y.mode = 20, W !== 6) break;
  50305. L >>>= 2, E -= 2;
  50306. break g;
  50307. case 2:
  50308. y.mode = 17;
  50309. break;
  50310. case 3:
  50311. w.msg = "invalid block type", y.mode = 30;
  50312. }
  50313. L >>>= 2, E -= 2;
  50314. break;
  50315. case 14:
  50316. for (L >>>= 7 & E, E -= 7 & E; E < 32; ) {
  50317. if (Q === 0) break g;
  50318. Q--, L += f[F++] << E, E += 8;
  50319. }
  50320. if ((65535 & L) != (L >>> 16 ^ 65535)) {
  50321. w.msg = "invalid stored block lengths", y.mode = 30;
  50322. break;
  50323. }
  50324. if (y.length = 65535 & L, E = L = 0, y.mode = 15, W === 6) break g;
  50325. case 15:
  50326. y.mode = 16;
  50327. case 16:
  50328. if (j = y.length) {
  50329. if (Q < j && (j = Q), P < j && (j = P), j === 0) break g;
  50330. b.arraySet(D, f, F, j, T), Q -= j, F += j, P -= j, T += j, y.length -= j;
  50331. break;
  50332. }
  50333. y.mode = 12;
  50334. break;
  50335. case 17:
  50336. for (; E < 14; ) {
  50337. if (Q === 0) break g;
  50338. Q--, L += f[F++] << E, E += 8;
  50339. }
  50340. if (y.nlen = 257 + (31 & L), L >>>= 5, E -= 5, y.ndist = 1 + (31 & L), L >>>= 5, E -= 5, y.ncode = 4 + (15 & L), L >>>= 4, E -= 4, 286 < y.nlen || 30 < y.ndist) {
  50341. w.msg = "too many length or distance symbols", y.mode = 30;
  50342. break;
  50343. }
  50344. y.have = 0, y.mode = 18;
  50345. case 18:
  50346. for (; y.have < y.ncode; ) {
  50347. for (; E < 3; ) {
  50348. if (Q === 0) break g;
  50349. Q--, L += f[F++] << E, E += 8;
  50350. }
  50351. y.lens[rg[y.have++]] = 7 & L, L >>>= 3, E -= 3;
  50352. }
  50353. for (; y.have < 19; ) y.lens[rg[y.have++]] = 0;
  50354. if (y.lencode = y.lendyn, y.lenbits = 7, ng = { bits: y.lenbits }, lg = p(0, y.lens, 0, 19, y.lencode, 0, y.work, ng), y.lenbits = ng.bits, lg) {
  50355. w.msg = "invalid code lengths set", y.mode = 30;
  50356. break;
  50357. }
  50358. y.have = 0, y.mode = 19;
  50359. case 19:
  50360. for (; y.have < y.nlen + y.ndist; ) {
  50361. for (; x = (og = y.lencode[L & (1 << y.lenbits) - 1]) >>> 16 & 255, Ag = 65535 & og, !((Ig = og >>> 24) <= E); ) {
  50362. if (Q === 0) break g;
  50363. Q--, L += f[F++] << E, E += 8;
  50364. }
  50365. if (Ag < 16) L >>>= Ig, E -= Ig, y.lens[y.have++] = Ag;
  50366. else {
  50367. if (Ag === 16) {
  50368. for (sg = Ig + 2; E < sg; ) {
  50369. if (Q === 0) break g;
  50370. Q--, L += f[F++] << E, E += 8;
  50371. }
  50372. if (L >>>= Ig, E -= Ig, y.have === 0) {
  50373. w.msg = "invalid bit length repeat", y.mode = 30;
  50374. break;
  50375. }
  50376. gg = y.lens[y.have - 1], j = 3 + (3 & L), L >>>= 2, E -= 2;
  50377. } else if (Ag === 17) {
  50378. for (sg = Ig + 3; E < sg; ) {
  50379. if (Q === 0) break g;
  50380. Q--, L += f[F++] << E, E += 8;
  50381. }
  50382. E -= Ig, gg = 0, j = 3 + (7 & (L >>>= Ig)), L >>>= 3, E -= 3;
  50383. } else {
  50384. for (sg = Ig + 7; E < sg; ) {
  50385. if (Q === 0) break g;
  50386. Q--, L += f[F++] << E, E += 8;
  50387. }
  50388. E -= Ig, gg = 0, j = 11 + (127 & (L >>>= Ig)), L >>>= 7, E -= 7;
  50389. }
  50390. if (y.have + j > y.nlen + y.ndist) {
  50391. w.msg = "invalid bit length repeat", y.mode = 30;
  50392. break;
  50393. }
  50394. for (; j--; ) y.lens[y.have++] = gg;
  50395. }
  50396. }
  50397. if (y.mode === 30) break;
  50398. if (y.lens[256] === 0) {
  50399. w.msg = "invalid code -- missing end-of-block", y.mode = 30;
  50400. break;
  50401. }
  50402. if (y.lenbits = 9, ng = { bits: y.lenbits }, lg = p(1, y.lens, 0, y.nlen, y.lencode, 0, y.work, ng), y.lenbits = ng.bits, lg) {
  50403. w.msg = "invalid literal/lengths set", y.mode = 30;
  50404. break;
  50405. }
  50406. if (y.distbits = 6, y.distcode = y.distdyn, ng = { bits: y.distbits }, lg = p(2, y.lens, y.nlen, y.ndist, y.distcode, 0, y.work, ng), y.distbits = ng.bits, lg) {
  50407. w.msg = "invalid distances set", y.mode = 30;
  50408. break;
  50409. }
  50410. if (y.mode = 20, W === 6) break g;
  50411. case 20:
  50412. y.mode = 21;
  50413. case 21:
  50414. if (6 <= Q && 258 <= P) {
  50415. w.next_out = T, w.avail_out = P, w.next_in = F, w.avail_in = Q, y.hold = L, y.bits = E, Z(w, k), T = w.next_out, D = w.output, P = w.avail_out, F = w.next_in, f = w.input, Q = w.avail_in, L = y.hold, E = y.bits, y.mode === 12 && (y.back = -1);
  50416. break;
  50417. }
  50418. for (y.back = 0; x = (og = y.lencode[L & (1 << y.lenbits) - 1]) >>> 16 & 255, Ag = 65535 & og, !((Ig = og >>> 24) <= E); ) {
  50419. if (Q === 0) break g;
  50420. Q--, L += f[F++] << E, E += 8;
  50421. }
  50422. if (x && (240 & x) == 0) {
  50423. for (eg = Ig, O = x, _ = Ag; x = (og = y.lencode[_ + ((L & (1 << eg + O) - 1) >> eg)]) >>> 16 & 255, Ag = 65535 & og, !(eg + (Ig = og >>> 24) <= E); ) {
  50424. if (Q === 0) break g;
  50425. Q--, L += f[F++] << E, E += 8;
  50426. }
  50427. L >>>= eg, E -= eg, y.back += eg;
  50428. }
  50429. if (L >>>= Ig, E -= Ig, y.back += Ig, y.length = Ag, x === 0) {
  50430. y.mode = 26;
  50431. break;
  50432. }
  50433. if (32 & x) {
  50434. y.back = -1, y.mode = 12;
  50435. break;
  50436. }
  50437. if (64 & x) {
  50438. w.msg = "invalid literal/length code", y.mode = 30;
  50439. break;
  50440. }
  50441. y.extra = 15 & x, y.mode = 22;
  50442. case 22:
  50443. if (y.extra) {
  50444. for (sg = y.extra; E < sg; ) {
  50445. if (Q === 0) break g;
  50446. Q--, L += f[F++] << E, E += 8;
  50447. }
  50448. y.length += L & (1 << y.extra) - 1, L >>>= y.extra, E -= y.extra, y.back += y.extra;
  50449. }
  50450. y.was = y.length, y.mode = 23;
  50451. case 23:
  50452. for (; x = (og = y.distcode[L & (1 << y.distbits) - 1]) >>> 16 & 255, Ag = 65535 & og, !((Ig = og >>> 24) <= E); ) {
  50453. if (Q === 0) break g;
  50454. Q--, L += f[F++] << E, E += 8;
  50455. }
  50456. if ((240 & x) == 0) {
  50457. for (eg = Ig, O = x, _ = Ag; x = (og = y.distcode[_ + ((L & (1 << eg + O) - 1) >> eg)]) >>> 16 & 255, Ag = 65535 & og, !(eg + (Ig = og >>> 24) <= E); ) {
  50458. if (Q === 0) break g;
  50459. Q--, L += f[F++] << E, E += 8;
  50460. }
  50461. L >>>= eg, E -= eg, y.back += eg;
  50462. }
  50463. if (L >>>= Ig, E -= Ig, y.back += Ig, 64 & x) {
  50464. w.msg = "invalid distance code", y.mode = 30;
  50465. break;
  50466. }
  50467. y.offset = Ag, y.extra = 15 & x, y.mode = 24;
  50468. case 24:
  50469. if (y.extra) {
  50470. for (sg = y.extra; E < sg; ) {
  50471. if (Q === 0) break g;
  50472. Q--, L += f[F++] << E, E += 8;
  50473. }
  50474. y.offset += L & (1 << y.extra) - 1, L >>>= y.extra, E -= y.extra, y.back += y.extra;
  50475. }
  50476. if (y.offset > y.dmax) {
  50477. w.msg = "invalid distance too far back", y.mode = 30;
  50478. break;
  50479. }
  50480. y.mode = 25;
  50481. case 25:
  50482. if (P === 0) break g;
  50483. if (j = k - P, y.offset > j) {
  50484. if ((j = y.offset - j) > y.whave && y.sane) {
  50485. w.msg = "invalid distance too far back", y.mode = 30;
  50486. break;
  50487. }
  50488. q = j > y.wnext ? (j -= y.wnext, y.wsize - j) : y.wnext - j, j > y.length && (j = y.length), Cg = y.window;
  50489. } else Cg = D, q = T - y.offset, j = y.length;
  50490. for (P < j && (j = P), P -= j, y.length -= j; D[T++] = Cg[q++], --j; ) ;
  50491. y.length === 0 && (y.mode = 21);
  50492. break;
  50493. case 26:
  50494. if (P === 0) break g;
  50495. D[T++] = y.length, P--, y.mode = 21;
  50496. break;
  50497. case 27:
  50498. if (y.wrap) {
  50499. for (; E < 32; ) {
  50500. if (Q === 0) break g;
  50501. Q--, L |= f[F++] << E, E += 8;
  50502. }
  50503. if (k -= P, w.total_out += k, y.total += k, k && (w.adler = y.check = y.flags ? m(y.check, D, k, T - k) : u(y.check, D, k, T - k)), k = P, (y.flags ? L : R(L)) !== y.check) {
  50504. w.msg = "incorrect data check", y.mode = 30;
  50505. break;
  50506. }
  50507. E = L = 0;
  50508. }
  50509. y.mode = 28;
  50510. case 28:
  50511. if (y.wrap && y.flags) {
  50512. for (; E < 32; ) {
  50513. if (Q === 0) break g;
  50514. Q--, L += f[F++] << E, E += 8;
  50515. }
  50516. if (L !== (4294967295 & y.total)) {
  50517. w.msg = "incorrect length check", y.mode = 30;
  50518. break;
  50519. }
  50520. E = L = 0;
  50521. }
  50522. y.mode = 29;
  50523. case 29:
  50524. lg = 1;
  50525. break g;
  50526. case 30:
  50527. lg = -3;
  50528. break g;
  50529. case 31:
  50530. return -4;
  50531. case 32:
  50532. default:
  50533. return Y;
  50534. }
  50535. return w.next_out = T, w.avail_out = P, w.next_in = F, w.avail_in = Q, y.hold = L, y.bits = E, (y.wsize || k !== w.avail_out && y.mode < 30 && (y.mode < 27 || W !== 4)) && G(w, w.output, w.next_out, k - w.avail_out) ? (y.mode = 31, -4) : (J -= w.avail_in, k -= w.avail_out, w.total_in += J, w.total_out += k, y.total += k, y.wrap && k && (w.adler = y.check = y.flags ? m(y.check, D, k, w.next_out - k) : u(y.check, D, k, w.next_out - k)), w.data_type = y.bits + (y.last ? 64 : 0) + (y.mode === 12 ? 128 : 0) + (y.mode === 20 || y.mode === 15 ? 256 : 0), (J == 0 && k === 0 || W === 4) && lg === 0 && (lg = -5), lg);
  50536. }, h.inflateEnd = function(w) {
  50537. if (!w || !w.state) return Y;
  50538. var W = w.state;
  50539. return W.window && (W.window = null), w.state = null, 0;
  50540. }, h.inflateGetHeader = function(w, W) {
  50541. var y;
  50542. return w && w.state ? (2 & (y = w.state).wrap) == 0 ? Y : ((y.head = W).done = !1, 0) : Y;
  50543. }, h.inflateSetDictionary = function(w, W) {
  50544. var y, f = W.length;
  50545. return w && w.state ? (y = w.state).wrap !== 0 && y.mode !== 11 ? Y : y.mode === 11 && u(1, W, f, 0) !== y.check ? -3 : G(w, W, f, f) ? (y.mode = 31, -4) : (y.havedict = 1, 0) : Y;
  50546. }, h.inflateInfo = "pako inflate (from Nodeca project)";
  50547. }, { "../utils/common": 41, "./adler32": 43, "./crc32": 45, "./inffast": 48, "./inftrees": 50 }], 50: [function(c, r, h) {
  50548. var b = c("../utils/common"), u = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], m = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], Z = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], p = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];
  50549. r.exports = function(Y, R, X, H, S, z, v, K) {
  50550. var V, N, B, G, w, W, y, f, D, F = K.bits, T = 0, Q = 0, P = 0, L = 0, E = 0, J = 0, k = 0, j = 0, q = 0, Cg = 0, Ig = null, x = 0, Ag = new b.Buf16(16), eg = new b.Buf16(16), O = null, _ = 0;
  50551. for (T = 0; T <= 15; T++) Ag[T] = 0;
  50552. for (Q = 0; Q < H; Q++) Ag[R[X + Q]]++;
  50553. for (E = F, L = 15; 1 <= L && Ag[L] === 0; L--) ;
  50554. if (L < E && (E = L), L === 0) return S[z++] = 20971520, S[z++] = 20971520, K.bits = 1, 0;
  50555. for (P = 1; P < L && Ag[P] === 0; P++) ;
  50556. for (E < P && (E = P), T = j = 1; T <= 15; T++) if (j <<= 1, (j -= Ag[T]) < 0) return -1;
  50557. if (0 < j && (Y === 0 || L !== 1)) return -1;
  50558. for (eg[1] = 0, T = 1; T < 15; T++) eg[T + 1] = eg[T] + Ag[T];
  50559. for (Q = 0; Q < H; Q++) R[X + Q] !== 0 && (v[eg[R[X + Q]]++] = Q);
  50560. if (W = Y === 0 ? (Ig = O = v, 19) : Y === 1 ? (Ig = u, x -= 257, O = m, _ -= 257, 256) : (Ig = Z, O = p, -1), T = P, w = z, k = Q = Cg = 0, B = -1, G = (q = 1 << (J = E)) - 1, Y === 1 && 852 < q || Y === 2 && 592 < q) return 1;
  50561. for (; ; ) {
  50562. for (y = T - k, D = v[Q] < W ? (f = 0, v[Q]) : v[Q] > W ? (f = O[_ + v[Q]], Ig[x + v[Q]]) : (f = 96, 0), V = 1 << T - k, P = N = 1 << J; S[w + (Cg >> k) + (N -= V)] = y << 24 | f << 16 | D | 0, N !== 0; ) ;
  50563. for (V = 1 << T - 1; Cg & V; ) V >>= 1;
  50564. if (V !== 0 ? (Cg &= V - 1, Cg += V) : Cg = 0, Q++, --Ag[T] == 0) {
  50565. if (T === L) break;
  50566. T = R[X + v[Q]];
  50567. }
  50568. if (E < T && (Cg & G) !== B) {
  50569. for (k === 0 && (k = E), w += P, j = 1 << (J = T - k); J + k < L && !((j -= Ag[J + k]) <= 0); ) J++, j <<= 1;
  50570. if (q += 1 << J, Y === 1 && 852 < q || Y === 2 && 592 < q) return 1;
  50571. S[B = Cg & G] = E << 24 | J << 16 | w - z | 0;
  50572. }
  50573. }
  50574. return Cg !== 0 && (S[w + Cg] = T - k << 24 | 64 << 16 | 0), K.bits = E, 0;
  50575. };
  50576. }, { "../utils/common": 41 }], 51: [function(c, r, h) {
  50577. r.exports = { 2: "need dictionary", 1: "stream end", 0: "", "-1": "file error", "-2": "stream error", "-3": "data error", "-4": "insufficient memory", "-5": "buffer error", "-6": "incompatible version" };
  50578. }, {}], 52: [function(c, r, h) {
  50579. var b = c("../utils/common");
  50580. function u(O) {
  50581. for (var _ = O.length; 0 <= --_; ) O[_] = 0;
  50582. }
  50583. var m = 256, Z = 286, p = 30, Y = 15, R = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], X = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], H = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], S = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], z = new Array(576);
  50584. u(z);
  50585. var v = new Array(60);
  50586. u(v);
  50587. var K = new Array(512);
  50588. u(K);
  50589. var V = new Array(256);
  50590. u(V);
  50591. var N = new Array(29);
  50592. u(N);
  50593. var B, G, w, W = new Array(p);
  50594. function y(O, _, gg, lg, ng) {
  50595. this.static_tree = O, this.extra_bits = _, this.extra_base = gg, this.elems = lg, this.max_length = ng, this.has_stree = O && O.length;
  50596. }
  50597. function f(O, _) {
  50598. this.dyn_tree = O, this.max_code = 0, this.stat_desc = _;
  50599. }
  50600. function D(O) {
  50601. return O < 256 ? K[O] : K[256 + (O >>> 7)];
  50602. }
  50603. function F(O, _) {
  50604. O.pending_buf[O.pending++] = 255 & _, O.pending_buf[O.pending++] = _ >>> 8 & 255;
  50605. }
  50606. function T(O, _, gg) {
  50607. O.bi_valid > 16 - gg ? (O.bi_buf |= _ << O.bi_valid & 65535, F(O, O.bi_buf), O.bi_buf = _ >> 16 - O.bi_valid, O.bi_valid += gg - 16) : (O.bi_buf |= _ << O.bi_valid & 65535, O.bi_valid += gg);
  50608. }
  50609. function Q(O, _, gg) {
  50610. T(O, gg[2 * _], gg[2 * _ + 1]);
  50611. }
  50612. function P(O, _) {
  50613. for (var gg = 0; gg |= 1 & O, O >>>= 1, gg <<= 1, 0 < --_; ) ;
  50614. return gg >>> 1;
  50615. }
  50616. function L(O, _, gg) {
  50617. var lg, ng, sg = new Array(16), og = 0;
  50618. for (lg = 1; lg <= Y; lg++) sg[lg] = og = og + gg[lg - 1] << 1;
  50619. for (ng = 0; ng <= _; ng++) {
  50620. var cg = O[2 * ng + 1];
  50621. cg !== 0 && (O[2 * ng] = P(sg[cg]++, cg));
  50622. }
  50623. }
  50624. function E(O) {
  50625. var _;
  50626. for (_ = 0; _ < Z; _++) O.dyn_ltree[2 * _] = 0;
  50627. for (_ = 0; _ < p; _++) O.dyn_dtree[2 * _] = 0;
  50628. for (_ = 0; _ < 19; _++) O.bl_tree[2 * _] = 0;
  50629. O.dyn_ltree[512] = 1, O.opt_len = O.static_len = 0, O.last_lit = O.matches = 0;
  50630. }
  50631. function J(O) {
  50632. 8 < O.bi_valid ? F(O, O.bi_buf) : 0 < O.bi_valid && (O.pending_buf[O.pending++] = O.bi_buf), O.bi_buf = 0, O.bi_valid = 0;
  50633. }
  50634. function k(O, _, gg, lg) {
  50635. var ng = 2 * _, sg = 2 * gg;
  50636. return O[ng] < O[sg] || O[ng] === O[sg] && lg[_] <= lg[gg];
  50637. }
  50638. function j(O, _, gg) {
  50639. for (var lg = O.heap[gg], ng = gg << 1; ng <= O.heap_len && (ng < O.heap_len && k(_, O.heap[ng + 1], O.heap[ng], O.depth) && ng++, !k(_, lg, O.heap[ng], O.depth)); ) O.heap[gg] = O.heap[ng], gg = ng, ng <<= 1;
  50640. O.heap[gg] = lg;
  50641. }
  50642. function q(O, _, gg) {
  50643. var lg, ng, sg, og, cg = 0;
  50644. if (O.last_lit !== 0) for (; lg = O.pending_buf[O.d_buf + 2 * cg] << 8 | O.pending_buf[O.d_buf + 2 * cg + 1], ng = O.pending_buf[O.l_buf + cg], cg++, lg === 0 ? Q(O, ng, _) : (Q(O, (sg = V[ng]) + m + 1, _), (og = R[sg]) !== 0 && T(O, ng -= N[sg], og), Q(O, sg = D(--lg), gg), (og = X[sg]) !== 0 && T(O, lg -= W[sg], og)), cg < O.last_lit; ) ;
  50645. Q(O, 256, _);
  50646. }
  50647. function Cg(O, _) {
  50648. var gg, lg, ng, sg = _.dyn_tree, og = _.stat_desc.static_tree, cg = _.stat_desc.has_stree, rg = _.stat_desc.elems, dg = -1;
  50649. for (O.heap_len = 0, O.heap_max = 573, gg = 0; gg < rg; gg++) sg[2 * gg] !== 0 ? (O.heap[++O.heap_len] = dg = gg, O.depth[gg] = 0) : sg[2 * gg + 1] = 0;
  50650. for (; O.heap_len < 2; ) sg[2 * (ng = O.heap[++O.heap_len] = dg < 2 ? ++dg : 0)] = 1, O.depth[ng] = 0, O.opt_len--, cg && (O.static_len -= og[2 * ng + 1]);
  50651. for (_.max_code = dg, gg = O.heap_len >> 1; 1 <= gg; gg--) j(O, sg, gg);
  50652. for (ng = rg; gg = O.heap[1], O.heap[1] = O.heap[O.heap_len--], j(O, sg, 1), lg = O.heap[1], O.heap[--O.heap_max] = gg, O.heap[--O.heap_max] = lg, sg[2 * ng] = sg[2 * gg] + sg[2 * lg], O.depth[ng] = (O.depth[gg] >= O.depth[lg] ? O.depth[gg] : O.depth[lg]) + 1, sg[2 * gg + 1] = sg[2 * lg + 1] = ng, O.heap[1] = ng++, j(O, sg, 1), 2 <= O.heap_len; ) ;
  50653. O.heap[--O.heap_max] = O.heap[1], function(Bg, Zg) {
  50654. var Xg, Kg, kg, Wg, Ng, wg, fg = Zg.dyn_tree, Jg = Zg.max_code, zg = Zg.stat_desc.static_tree, cI = Zg.stat_desc.has_stree, YI = Zg.stat_desc.extra_bits, Eg = Zg.stat_desc.extra_base, aI = Zg.stat_desc.max_length, dI = 0;
  50655. for (Wg = 0; Wg <= Y; Wg++) Bg.bl_count[Wg] = 0;
  50656. for (fg[2 * Bg.heap[Bg.heap_max] + 1] = 0, Xg = Bg.heap_max + 1; Xg < 573; Xg++) aI < (Wg = fg[2 * fg[2 * (Kg = Bg.heap[Xg]) + 1] + 1] + 1) && (Wg = aI, dI++), fg[2 * Kg + 1] = Wg, Jg < Kg || (Bg.bl_count[Wg]++, Ng = 0, Eg <= Kg && (Ng = YI[Kg - Eg]), wg = fg[2 * Kg], Bg.opt_len += wg * (Wg + Ng), cI && (Bg.static_len += wg * (zg[2 * Kg + 1] + Ng)));
  50657. if (dI !== 0) {
  50658. do {
  50659. for (Wg = aI - 1; Bg.bl_count[Wg] === 0; ) Wg--;
  50660. Bg.bl_count[Wg]--, Bg.bl_count[Wg + 1] += 2, Bg.bl_count[aI]--, dI -= 2;
  50661. } while (0 < dI);
  50662. for (Wg = aI; Wg !== 0; Wg--) for (Kg = Bg.bl_count[Wg]; Kg !== 0; ) Jg < (kg = Bg.heap[--Xg]) || (fg[2 * kg + 1] !== Wg && (Bg.opt_len += (Wg - fg[2 * kg + 1]) * fg[2 * kg], fg[2 * kg + 1] = Wg), Kg--);
  50663. }
  50664. }(O, _), L(sg, dg, O.bl_count);
  50665. }
  50666. function Ig(O, _, gg) {
  50667. var lg, ng, sg = -1, og = _[1], cg = 0, rg = 7, dg = 4;
  50668. for (og === 0 && (rg = 138, dg = 3), _[2 * (gg + 1) + 1] = 65535, lg = 0; lg <= gg; lg++) ng = og, og = _[2 * (lg + 1) + 1], ++cg < rg && ng === og || (cg < dg ? O.bl_tree[2 * ng] += cg : ng !== 0 ? (ng !== sg && O.bl_tree[2 * ng]++, O.bl_tree[32]++) : cg <= 10 ? O.bl_tree[34]++ : O.bl_tree[36]++, sg = ng, dg = (cg = 0) === og ? (rg = 138, 3) : ng === og ? (rg = 6, 3) : (rg = 7, 4));
  50669. }
  50670. function x(O, _, gg) {
  50671. var lg, ng, sg = -1, og = _[1], cg = 0, rg = 7, dg = 4;
  50672. for (og === 0 && (rg = 138, dg = 3), lg = 0; lg <= gg; lg++) if (ng = og, og = _[2 * (lg + 1) + 1], !(++cg < rg && ng === og)) {
  50673. if (cg < dg) for (; Q(O, ng, O.bl_tree), --cg != 0; ) ;
  50674. else ng !== 0 ? (ng !== sg && (Q(O, ng, O.bl_tree), cg--), Q(O, 16, O.bl_tree), T(O, cg - 3, 2)) : cg <= 10 ? (Q(O, 17, O.bl_tree), T(O, cg - 3, 3)) : (Q(O, 18, O.bl_tree), T(O, cg - 11, 7));
  50675. sg = ng, dg = (cg = 0) === og ? (rg = 138, 3) : ng === og ? (rg = 6, 3) : (rg = 7, 4);
  50676. }
  50677. }
  50678. u(W);
  50679. var Ag = !1;
  50680. function eg(O, _, gg, lg) {
  50681. T(O, 0 + (lg ? 1 : 0), 3), function(ng, sg, og, cg) {
  50682. J(ng), F(ng, og), F(ng, ~og), b.arraySet(ng.pending_buf, ng.window, sg, og, ng.pending), ng.pending += og;
  50683. }(O, _, gg);
  50684. }
  50685. h._tr_init = function(O) {
  50686. Ag || (function() {
  50687. var _, gg, lg, ng, sg, og = new Array(16);
  50688. for (ng = lg = 0; ng < 28; ng++) for (N[ng] = lg, _ = 0; _ < 1 << R[ng]; _++) V[lg++] = ng;
  50689. for (V[lg - 1] = ng, ng = sg = 0; ng < 16; ng++) for (W[ng] = sg, _ = 0; _ < 1 << X[ng]; _++) K[sg++] = ng;
  50690. for (sg >>= 7; ng < p; ng++) for (W[ng] = sg << 7, _ = 0; _ < 1 << X[ng] - 7; _++) K[256 + sg++] = ng;
  50691. for (gg = 0; gg <= Y; gg++) og[gg] = 0;
  50692. for (_ = 0; _ <= 143; ) z[2 * _ + 1] = 8, _++, og[8]++;
  50693. for (; _ <= 255; ) z[2 * _ + 1] = 9, _++, og[9]++;
  50694. for (; _ <= 279; ) z[2 * _ + 1] = 7, _++, og[7]++;
  50695. for (; _ <= 287; ) z[2 * _ + 1] = 8, _++, og[8]++;
  50696. for (L(z, 287, og), _ = 0; _ < p; _++) v[2 * _ + 1] = 5, v[2 * _] = P(_, 5);
  50697. B = new y(z, R, 257, Z, Y), G = new y(v, X, 0, p, Y), w = new y(new Array(0), H, 0, 19, 7);
  50698. }(), Ag = !0), O.l_desc = new f(O.dyn_ltree, B), O.d_desc = new f(O.dyn_dtree, G), O.bl_desc = new f(O.bl_tree, w), O.bi_buf = 0, O.bi_valid = 0, E(O);
  50699. }, h._tr_stored_block = eg, h._tr_flush_block = function(O, _, gg, lg) {
  50700. var ng, sg, og = 0;
  50701. 0 < O.level ? (O.strm.data_type === 2 && (O.strm.data_type = function(cg) {
  50702. var rg, dg = 4093624447;
  50703. for (rg = 0; rg <= 31; rg++, dg >>>= 1) if (1 & dg && cg.dyn_ltree[2 * rg] !== 0) return 0;
  50704. if (cg.dyn_ltree[18] !== 0 || cg.dyn_ltree[20] !== 0 || cg.dyn_ltree[26] !== 0) return 1;
  50705. for (rg = 32; rg < m; rg++) if (cg.dyn_ltree[2 * rg] !== 0) return 1;
  50706. return 0;
  50707. }(O)), Cg(O, O.l_desc), Cg(O, O.d_desc), og = function(cg) {
  50708. var rg;
  50709. for (Ig(cg, cg.dyn_ltree, cg.l_desc.max_code), Ig(cg, cg.dyn_dtree, cg.d_desc.max_code), Cg(cg, cg.bl_desc), rg = 18; 3 <= rg && cg.bl_tree[2 * S[rg] + 1] === 0; rg--) ;
  50710. return cg.opt_len += 3 * (rg + 1) + 5 + 5 + 4, rg;
  50711. }(O), ng = O.opt_len + 3 + 7 >>> 3, (sg = O.static_len + 3 + 7 >>> 3) <= ng && (ng = sg)) : ng = sg = gg + 5, gg + 4 <= ng && _ !== -1 ? eg(O, _, gg, lg) : O.strategy === 4 || sg === ng ? (T(O, 2 + (lg ? 1 : 0), 3), q(O, z, v)) : (T(O, 4 + (lg ? 1 : 0), 3), function(cg, rg, dg, Bg) {
  50712. var Zg;
  50713. for (T(cg, rg - 257, 5), T(cg, dg - 1, 5), T(cg, Bg - 4, 4), Zg = 0; Zg < Bg; Zg++) T(cg, cg.bl_tree[2 * S[Zg] + 1], 3);
  50714. x(cg, cg.dyn_ltree, rg - 1), x(cg, cg.dyn_dtree, dg - 1);
  50715. }(O, O.l_desc.max_code + 1, O.d_desc.max_code + 1, og + 1), q(O, O.dyn_ltree, O.dyn_dtree)), E(O), lg && J(O);
  50716. }, h._tr_tally = function(O, _, gg) {
  50717. return O.pending_buf[O.d_buf + 2 * O.last_lit] = _ >>> 8 & 255, O.pending_buf[O.d_buf + 2 * O.last_lit + 1] = 255 & _, O.pending_buf[O.l_buf + O.last_lit] = 255 & gg, O.last_lit++, _ === 0 ? O.dyn_ltree[2 * gg]++ : (O.matches++, _--, O.dyn_ltree[2 * (V[gg] + m + 1)]++, O.dyn_dtree[2 * D(_)]++), O.last_lit === O.lit_bufsize - 1;
  50718. }, h._tr_align = function(O) {
  50719. T(O, 2, 3), Q(O, 256, z), function(_) {
  50720. _.bi_valid === 16 ? (F(_, _.bi_buf), _.bi_buf = 0, _.bi_valid = 0) : 8 <= _.bi_valid && (_.pending_buf[_.pending++] = 255 & _.bi_buf, _.bi_buf >>= 8, _.bi_valid -= 8);
  50721. }(O);
  50722. };
  50723. }, { "../utils/common": 41 }], 53: [function(c, r, h) {
  50724. r.exports = function() {
  50725. this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler = 0;
  50726. };
  50727. }, {}], 54: [function(c, r, h) {
  50728. (function(b) {
  50729. (function(u, m) {
  50730. if (!u.setImmediate) {
  50731. var Z, p, Y, R, X = 1, H = {}, S = !1, z = u.document, v = Object.getPrototypeOf && Object.getPrototypeOf(u);
  50732. v = v && v.setTimeout ? v : u, Z = {}.toString.call(u.process) === "[object process]" ? function(B) {
  50733. e.nextTick(function() {
  50734. V(B);
  50735. });
  50736. } : function() {
  50737. if (u.postMessage && !u.importScripts) {
  50738. var B = !0, G = u.onmessage;
  50739. return u.onmessage = function() {
  50740. B = !1;
  50741. }, u.postMessage("", "*"), u.onmessage = G, B;
  50742. }
  50743. }() ? (R = "setImmediate$" + Math.random() + "$", u.addEventListener ? u.addEventListener("message", N, !1) : u.attachEvent("onmessage", N), function(B) {
  50744. u.postMessage(R + B, "*");
  50745. }) : u.MessageChannel ? ((Y = new MessageChannel()).port1.onmessage = function(B) {
  50746. V(B.data);
  50747. }, function(B) {
  50748. Y.port2.postMessage(B);
  50749. }) : z && "onreadystatechange" in z.createElement("script") ? (p = z.documentElement, function(B) {
  50750. var G = z.createElement("script");
  50751. G.onreadystatechange = function() {
  50752. V(B), G.onreadystatechange = null, p.removeChild(G), G = null;
  50753. }, p.appendChild(G);
  50754. }) : function(B) {
  50755. setTimeout(V, 0, B);
  50756. }, v.setImmediate = function(B) {
  50757. typeof B != "function" && (B = new Function("" + B));
  50758. for (var G = new Array(arguments.length - 1), w = 0; w < G.length; w++) G[w] = arguments[w + 1];
  50759. var W = { callback: B, args: G };
  50760. return H[X] = W, Z(X), X++;
  50761. }, v.clearImmediate = K;
  50762. }
  50763. function K(B) {
  50764. delete H[B];
  50765. }
  50766. function V(B) {
  50767. if (S) setTimeout(V, 0, B);
  50768. else {
  50769. var G = H[B];
  50770. if (G) {
  50771. S = !0;
  50772. try {
  50773. (function(w) {
  50774. var W = w.callback, y = w.args;
  50775. switch (y.length) {
  50776. case 0:
  50777. W();
  50778. break;
  50779. case 1:
  50780. W(y[0]);
  50781. break;
  50782. case 2:
  50783. W(y[0], y[1]);
  50784. break;
  50785. case 3:
  50786. W(y[0], y[1], y[2]);
  50787. break;
  50788. default:
  50789. W.apply(void 0, y);
  50790. }
  50791. })(G);
  50792. } finally {
  50793. K(B), S = !1;
  50794. }
  50795. }
  50796. }
  50797. }
  50798. function N(B) {
  50799. B.source === u && typeof B.data == "string" && B.data.indexOf(R) === 0 && V(+B.data.slice(R.length));
  50800. }
  50801. })(typeof self > "u" ? b === void 0 ? this : b : self);
  50802. }).call(this, A !== void 0 ? A : typeof self < "u" ? self : typeof window < "u" ? window : {});
  50803. }, {}] }, {}, [10])(10);
  50804. });
  50805. }).call(this);
  50806. }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {}, g("buffer").Buffer, arguments[3], arguments[4], arguments[5], arguments[6], g("timers").setImmediate);
  50807. }, { _process: 467, buffer: 220, timers: 523 }], 442: [function(g, C, i) {
  50808. (function(e) {
  50809. (function() {
  50810. var A = /[\\^$.*+?()[\]{}|]/g, s = RegExp(A.source), l = typeof e == "object" && e && e.Object === Object && e, n = typeof self == "object" && self && self.Object === Object && self, a = l || n || Function("return this")(), d = Object.prototype.toString, o = a.Symbol, c = o ? o.prototype : void 0, r = c ? c.toString : void 0;
  50811. function h(b) {
  50812. if (typeof b == "string") return b;
  50813. if (function(m) {
  50814. return typeof m == "symbol" || /* @__PURE__ */ function(Z) {
  50815. return !!Z && typeof Z == "object";
  50816. }(m) && d.call(m) == "[object Symbol]";
  50817. }(b)) return r ? r.call(b) : "";
  50818. var u = b + "";
  50819. return u == "0" && 1 / b == -1 / 0 ? "-0" : u;
  50820. }
  50821. C.exports = function(b) {
  50822. var u;
  50823. return (b = (u = b) == null ? "" : h(u)) && s.test(b) ? b.replace(A, "\\$&") : b;
  50824. };
  50825. }).call(this);
  50826. }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  50827. }, {}], 443: [function(g, C, i) {
  50828. (function(e) {
  50829. (function() {
  50830. var A = "[object Arguments]", s = "[object Map]", l = "[object Object]", n = "[object Set]", a = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, d = /^\w*$/, o = /^\./, c = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g, r = /\\(\\)?/g, h = /^\[object .+?Constructor\]$/, b = /^(?:0|[1-9]\d*)$/, u = {};
  50831. u["[object Float32Array]"] = u["[object Float64Array]"] = u["[object Int8Array]"] = u["[object Int16Array]"] = u["[object Int32Array]"] = u["[object Uint8Array]"] = u["[object Uint8ClampedArray]"] = u["[object Uint16Array]"] = u["[object Uint32Array]"] = !0, u[A] = u["[object Array]"] = u["[object ArrayBuffer]"] = u["[object Boolean]"] = u["[object DataView]"] = u["[object Date]"] = u["[object Error]"] = u["[object Function]"] = u[s] = u["[object Number]"] = u[l] = u["[object RegExp]"] = u[n] = u["[object String]"] = u["[object WeakMap]"] = !1;
  50832. var m = typeof e == "object" && e && e.Object === Object && e, Z = typeof self == "object" && self && self.Object === Object && self, p = m || Z || Function("return this")(), Y = typeof i == "object" && i && !i.nodeType && i, R = Y && typeof C == "object" && C && !C.nodeType && C, X = R && R.exports === Y && m.process, H = function() {
  50833. try {
  50834. return X && X.binding("util");
  50835. } catch {
  50836. }
  50837. }(), S = H && H.isTypedArray;
  50838. function z(ag, mg, Sg, Fg) {
  50839. for (var tI = -1, vg = ag ? ag.length : 0; ++tI < vg; ) {
  50840. var xg = ag[tI];
  50841. mg(Fg, xg, Sg(xg), ag);
  50842. }
  50843. return Fg;
  50844. }
  50845. function v(ag, mg) {
  50846. for (var Sg = -1, Fg = ag ? ag.length : 0; ++Sg < Fg; ) if (mg(ag[Sg], Sg, ag)) return !0;
  50847. return !1;
  50848. }
  50849. function K(ag) {
  50850. var mg = !1;
  50851. if (ag != null && typeof ag.toString != "function") try {
  50852. mg = !!(ag + "");
  50853. } catch {
  50854. }
  50855. return mg;
  50856. }
  50857. function V(ag) {
  50858. var mg = -1, Sg = Array(ag.size);
  50859. return ag.forEach(function(Fg, tI) {
  50860. Sg[++mg] = [tI, Fg];
  50861. }), Sg;
  50862. }
  50863. function N(ag) {
  50864. var mg = -1, Sg = Array(ag.size);
  50865. return ag.forEach(function(Fg) {
  50866. Sg[++mg] = Fg;
  50867. }), Sg;
  50868. }
  50869. var B, G, w, W = Array.prototype, y = Function.prototype, f = Object.prototype, D = p["__core-js_shared__"], F = (B = /[^.]+$/.exec(D && D.keys && D.keys.IE_PROTO || "")) ? "Symbol(src)_1." + B : "", T = y.toString, Q = f.hasOwnProperty, P = f.toString, L = RegExp("^" + T.call(Q).replace(/[\\^$.*+?()[\]{}|]/g, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"), E = p.Symbol, J = p.Uint8Array, k = f.propertyIsEnumerable, j = W.splice, q = (G = Object.keys, w = Object, function(ag) {
  50870. return G(w(ag));
  50871. }), Cg = eI(p, "DataView"), Ig = eI(p, "Map"), x = eI(p, "Promise"), Ag = eI(p, "Set"), eg = eI(p, "WeakMap"), O = eI(Object, "create"), _ = bg(Cg), gg = bg(Ig), lg = bg(x), ng = bg(Ag), sg = bg(eg), og = E ? E.prototype : void 0, cg = og ? og.valueOf : void 0, rg = og ? og.toString : void 0;
  50872. function dg(ag) {
  50873. var mg = -1, Sg = ag ? ag.length : 0;
  50874. for (this.clear(); ++mg < Sg; ) {
  50875. var Fg = ag[mg];
  50876. this.set(Fg[0], Fg[1]);
  50877. }
  50878. }
  50879. function Bg(ag) {
  50880. var mg = -1, Sg = ag ? ag.length : 0;
  50881. for (this.clear(); ++mg < Sg; ) {
  50882. var Fg = ag[mg];
  50883. this.set(Fg[0], Fg[1]);
  50884. }
  50885. }
  50886. function Zg(ag) {
  50887. var mg = -1, Sg = ag ? ag.length : 0;
  50888. for (this.clear(); ++mg < Sg; ) {
  50889. var Fg = ag[mg];
  50890. this.set(Fg[0], Fg[1]);
  50891. }
  50892. }
  50893. function Xg(ag) {
  50894. var mg = -1, Sg = ag ? ag.length : 0;
  50895. for (this.__data__ = new Zg(); ++mg < Sg; ) this.add(ag[mg]);
  50896. }
  50897. function Kg(ag) {
  50898. this.__data__ = new Bg(ag);
  50899. }
  50900. function kg(ag, mg) {
  50901. var Sg = nI(ag) || GI(ag) ? function(xg, vI) {
  50902. for (var fI = -1, MI = Array(xg); ++fI < xg; ) MI[fI] = vI(fI);
  50903. return MI;
  50904. }(ag.length, String) : [], Fg = Sg.length, tI = !!Fg;
  50905. for (var vg in ag) !Q.call(ag, vg) || tI && (vg == "length" || EI(vg, Fg)) || Sg.push(vg);
  50906. return Sg;
  50907. }
  50908. function Wg(ag, mg) {
  50909. for (var Sg = ag.length; Sg--; ) if (jg(ag[Sg][0], mg)) return Sg;
  50910. return -1;
  50911. }
  50912. function Ng(ag, mg, Sg, Fg) {
  50913. return fg(ag, function(tI, vg, xg) {
  50914. mg(Fg, tI, Sg(tI), xg);
  50915. }), Fg;
  50916. }
  50917. dg.prototype.clear = function() {
  50918. this.__data__ = O ? O(null) : {};
  50919. }, dg.prototype.delete = function(ag) {
  50920. return this.has(ag) && delete this.__data__[ag];
  50921. }, dg.prototype.get = function(ag) {
  50922. var mg = this.__data__;
  50923. if (O) {
  50924. var Sg = mg[ag];
  50925. return Sg === "__lodash_hash_undefined__" ? void 0 : Sg;
  50926. }
  50927. return Q.call(mg, ag) ? mg[ag] : void 0;
  50928. }, dg.prototype.has = function(ag) {
  50929. var mg = this.__data__;
  50930. return O ? mg[ag] !== void 0 : Q.call(mg, ag);
  50931. }, dg.prototype.set = function(ag, mg) {
  50932. return this.__data__[ag] = O && mg === void 0 ? "__lodash_hash_undefined__" : mg, this;
  50933. }, Bg.prototype.clear = function() {
  50934. this.__data__ = [];
  50935. }, Bg.prototype.delete = function(ag) {
  50936. var mg = this.__data__, Sg = Wg(mg, ag);
  50937. return !(Sg < 0) && (Sg == mg.length - 1 ? mg.pop() : j.call(mg, Sg, 1), !0);
  50938. }, Bg.prototype.get = function(ag) {
  50939. var mg = this.__data__, Sg = Wg(mg, ag);
  50940. return Sg < 0 ? void 0 : mg[Sg][1];
  50941. }, Bg.prototype.has = function(ag) {
  50942. return Wg(this.__data__, ag) > -1;
  50943. }, Bg.prototype.set = function(ag, mg) {
  50944. var Sg = this.__data__, Fg = Wg(Sg, ag);
  50945. return Fg < 0 ? Sg.push([ag, mg]) : Sg[Fg][1] = mg, this;
  50946. }, Zg.prototype.clear = function() {
  50947. this.__data__ = { hash: new dg(), map: new (Ig || Bg)(), string: new dg() };
  50948. }, Zg.prototype.delete = function(ag) {
  50949. return SI(this, ag).delete(ag);
  50950. }, Zg.prototype.get = function(ag) {
  50951. return SI(this, ag).get(ag);
  50952. }, Zg.prototype.has = function(ag) {
  50953. return SI(this, ag).has(ag);
  50954. }, Zg.prototype.set = function(ag, mg) {
  50955. return SI(this, ag).set(ag, mg), this;
  50956. }, Xg.prototype.add = Xg.prototype.push = function(ag) {
  50957. return this.__data__.set(ag, "__lodash_hash_undefined__"), this;
  50958. }, Xg.prototype.has = function(ag) {
  50959. return this.__data__.has(ag);
  50960. }, Kg.prototype.clear = function() {
  50961. this.__data__ = new Bg();
  50962. }, Kg.prototype.delete = function(ag) {
  50963. return this.__data__.delete(ag);
  50964. }, Kg.prototype.get = function(ag) {
  50965. return this.__data__.get(ag);
  50966. }, Kg.prototype.has = function(ag) {
  50967. return this.__data__.has(ag);
  50968. }, Kg.prototype.set = function(ag, mg) {
  50969. var Sg = this.__data__;
  50970. if (Sg instanceof Bg) {
  50971. var Fg = Sg.__data__;
  50972. if (!Ig || Fg.length < 199) return Fg.push([ag, mg]), this;
  50973. Sg = this.__data__ = new Zg(Fg);
  50974. }
  50975. return Sg.set(ag, mg), this;
  50976. };
  50977. var wg, fg = (wg = function(ag, mg) {
  50978. return ag && Jg(ag, mg, dC);
  50979. }, function(ag, mg) {
  50980. if (ag == null) return ag;
  50981. if (!CI(ag)) return wg(ag, mg);
  50982. for (var Sg = ag.length, Fg = -1, tI = Object(ag); ++Fg < Sg && mg(tI[Fg], Fg, tI) !== !1; ) ;
  50983. return ag;
  50984. }), Jg = /* @__PURE__ */ function(ag) {
  50985. return function(mg, Sg, Fg) {
  50986. for (var tI = -1, vg = Object(mg), xg = Fg(mg), vI = xg.length; vI--; ) {
  50987. var fI = xg[++tI];
  50988. if (Sg(vg[fI], fI, vg) === !1) break;
  50989. }
  50990. return mg;
  50991. };
  50992. }();
  50993. function zg(ag, mg) {
  50994. for (var Sg = 0, Fg = (mg = oI(mg, ag) ? [mg] : _g(mg)).length; ag != null && Sg < Fg; ) ag = ag[hg(mg[Sg++])];
  50995. return Sg && Sg == Fg ? ag : void 0;
  50996. }
  50997. function cI(ag, mg) {
  50998. return ag != null && mg in Object(ag);
  50999. }
  51000. function YI(ag, mg, Sg, Fg, tI) {
  51001. return ag === mg || (ag == null || mg == null || !VI(ag) && !yC(mg) ? ag != ag && mg != mg : function(vg, xg, vI, fI, MI, hI) {
  51002. var AC = nI(vg), PI = nI(xg), jI = "[object Array]", mC = "[object Array]";
  51003. AC || (jI = (jI = NI(vg)) == A ? l : jI), PI || (mC = (mC = NI(xg)) == A ? l : mC);
  51004. var ZC = jI == l && !K(vg), Vt = mC == l && !K(xg), Si = jI == mC;
  51005. if (Si && !ZC) return hI || (hI = new Kg()), AC || It(vg) ? xI(vg, xg, vI, fI, MI, hI) : function(IC, QI, sA, vA, An, Bi, lA) {
  51006. switch (sA) {
  51007. case "[object DataView]":
  51008. if (IC.byteLength != QI.byteLength || IC.byteOffset != QI.byteOffset) return !1;
  51009. IC = IC.buffer, QI = QI.buffer;
  51010. case "[object ArrayBuffer]":
  51011. return !(IC.byteLength != QI.byteLength || !vA(new J(IC), new J(QI)));
  51012. case "[object Boolean]":
  51013. case "[object Date]":
  51014. case "[object Number]":
  51015. return jg(+IC, +QI);
  51016. case "[object Error]":
  51017. return IC.name == QI.name && IC.message == QI.message;
  51018. case "[object RegExp]":
  51019. case "[object String]":
  51020. return IC == QI + "";
  51021. case s:
  51022. var nA = V;
  51023. case n:
  51024. var Io = 2 & Bi;
  51025. if (nA || (nA = N), IC.size != QI.size && !Io) return !1;
  51026. var xs = lA.get(IC);
  51027. if (xs) return xs == QI;
  51028. Bi |= 1, lA.set(IC, QI);
  51029. var xt = xI(nA(IC), nA(QI), vA, An, Bi, lA);
  51030. return lA.delete(IC), xt;
  51031. case "[object Symbol]":
  51032. if (cg) return cg.call(IC) == cg.call(QI);
  51033. }
  51034. return !1;
  51035. }(vg, xg, jI, vI, fI, MI, hI);
  51036. if (!(2 & MI)) {
  51037. var LA = ZC && Q.call(vg, "__wrapped__"), vs = Vt && Q.call(xg, "__wrapped__");
  51038. if (LA || vs) {
  51039. var AA = LA ? vg.value() : vg, Ts = vs ? xg.value() : xg;
  51040. return hI || (hI = new Kg()), vI(AA, Ts, fI, MI, hI);
  51041. }
  51042. }
  51043. return Si ? (hI || (hI = new Kg()), function(IC, QI, sA, vA, An, Bi) {
  51044. var lA = 2 & An, nA = dC(IC), Io = nA.length, xs = dC(QI).length;
  51045. if (Io != xs && !lA) return !1;
  51046. for (var xt = Io; xt--; ) {
  51047. var Mt = nA[xt];
  51048. if (!(lA ? Mt in QI : Q.call(QI, Mt))) return !1;
  51049. }
  51050. var S0 = Bi.get(IC);
  51051. if (S0 && Bi.get(QI)) return S0 == QI;
  51052. var _C = !0;
  51053. Bi.set(IC, QI), Bi.set(QI, IC);
  51054. for (var Gd = lA; ++xt < Io; ) {
  51055. Mt = nA[xt];
  51056. var Co = IC[Mt], to = QI[Mt];
  51057. if (vA) var pG = lA ? vA(to, Co, Mt, QI, IC, Bi) : vA(Co, to, Mt, IC, QI, Bi);
  51058. if (!(pG === void 0 ? Co === to || sA(Co, to, vA, An, Bi) : pG)) {
  51059. _C = !1;
  51060. break;
  51061. }
  51062. Gd || (Gd = Mt == "constructor");
  51063. }
  51064. if (_C && !Gd) {
  51065. var js = IC.constructor, wd = QI.constructor;
  51066. js == wd || !("constructor" in IC) || !("constructor" in QI) || typeof js == "function" && js instanceof js && typeof wd == "function" && wd instanceof wd || (_C = !1);
  51067. }
  51068. return Bi.delete(IC), Bi.delete(QI), _C;
  51069. }(vg, xg, vI, fI, MI, hI)) : !1;
  51070. }(ag, mg, YI, Sg, Fg, tI));
  51071. }
  51072. function Eg(ag) {
  51073. return !(!VI(ag) || function(mg) {
  51074. return !!F && F in mg;
  51075. }(ag)) && (WI(ag) || K(ag) ? L : h).test(bg(ag));
  51076. }
  51077. function aI(ag) {
  51078. return typeof ag == "function" ? ag : ag == null ? Tt : typeof ag == "object" ? nI(ag) ? function(Fg, tI) {
  51079. return oI(Fg) && LI(tI) ? pg(hg(Fg), tI) : function(vg) {
  51080. var xg = function(vI, fI, MI) {
  51081. var hI = vI == null ? void 0 : zg(vI, fI);
  51082. return hI === void 0 ? MI : hI;
  51083. }(vg, Fg);
  51084. return xg === void 0 && xg === tI ? function(vI, fI) {
  51085. return vI != null && function(MI, hI, AC) {
  51086. hI = oI(hI, MI) ? [hI] : _g(hI);
  51087. for (var PI, jI = -1, mC = hI.length; ++jI < mC; ) {
  51088. var ZC = hg(hI[jI]);
  51089. if (!(PI = MI != null && AC(MI, ZC))) break;
  51090. MI = MI[ZC];
  51091. }
  51092. return PI || !!(mC = MI ? MI.length : 0) && mI(mC) && EI(ZC, mC) && (nI(MI) || GI(MI));
  51093. }(vI, fI, cI);
  51094. }(vg, Fg) : YI(tI, xg, void 0, 3);
  51095. };
  51096. }(ag[0], ag[1]) : function(Fg) {
  51097. var tI = function(vg) {
  51098. for (var xg = dC(vg), vI = xg.length; vI--; ) {
  51099. var fI = xg[vI], MI = vg[fI];
  51100. xg[vI] = [fI, MI, LI(MI)];
  51101. }
  51102. return xg;
  51103. }(Fg);
  51104. return tI.length == 1 && tI[0][2] ? pg(tI[0][0], tI[0][1]) : function(vg) {
  51105. return vg === Fg || function(xg, vI, fI, MI) {
  51106. var hI = fI.length, AC = hI;
  51107. if (xg == null) return !AC;
  51108. for (xg = Object(xg); hI--; ) {
  51109. var PI = fI[hI];
  51110. if (PI[2] ? PI[1] !== xg[PI[0]] : !(PI[0] in xg)) return !1;
  51111. }
  51112. for (; ++hI < AC; ) {
  51113. var jI = (PI = fI[hI])[0], mC = xg[jI], ZC = PI[1];
  51114. if (PI[2]) {
  51115. if (mC === void 0 && !(jI in xg)) return !1;
  51116. } else {
  51117. var Vt = new Kg(), Si;
  51118. if (!(Si === void 0 ? YI(ZC, mC, MI, 3, Vt) : Si)) return !1;
  51119. }
  51120. }
  51121. return !0;
  51122. }(vg, Fg, tI);
  51123. };
  51124. }(ag) : oI(mg = ag) ? (Sg = hg(mg), function(Fg) {
  51125. return Fg == null ? void 0 : Fg[Sg];
  51126. }) : /* @__PURE__ */ function(Fg) {
  51127. return function(tI) {
  51128. return zg(tI, Fg);
  51129. };
  51130. }(mg);
  51131. var mg, Sg;
  51132. }
  51133. function dI(ag) {
  51134. if (Sg = (mg = ag) && mg.constructor, Fg = typeof Sg == "function" && Sg.prototype || f, mg !== Fg) return q(ag);
  51135. var mg, Sg, Fg, tI = [];
  51136. for (var vg in Object(ag)) Q.call(ag, vg) && vg != "constructor" && tI.push(vg);
  51137. return tI;
  51138. }
  51139. function _g(ag) {
  51140. return nI(ag) ? ag : uI(ag);
  51141. }
  51142. function xI(ag, mg, Sg, Fg, tI, vg) {
  51143. var xg = 2 & tI, vI = ag.length, fI = mg.length;
  51144. if (vI != fI && !(xg && fI > vI)) return !1;
  51145. var MI = vg.get(ag);
  51146. if (MI && vg.get(mg)) return MI == mg;
  51147. var hI = -1, AC = !0, PI = 1 & tI ? new Xg() : void 0;
  51148. for (vg.set(ag, mg), vg.set(mg, ag); ++hI < vI; ) {
  51149. var jI = ag[hI], mC = mg[hI];
  51150. if (Fg) var ZC = xg ? Fg(mC, jI, hI, mg, ag, vg) : Fg(jI, mC, hI, ag, mg, vg);
  51151. if (ZC !== void 0) {
  51152. if (ZC) continue;
  51153. AC = !1;
  51154. break;
  51155. }
  51156. if (PI) {
  51157. if (!v(mg, function(Vt, Si) {
  51158. if (!PI.has(Si) && (jI === Vt || Sg(jI, Vt, Fg, tI, vg))) return PI.add(Si);
  51159. })) {
  51160. AC = !1;
  51161. break;
  51162. }
  51163. } else if (jI !== mC && !Sg(jI, mC, Fg, tI, vg)) {
  51164. AC = !1;
  51165. break;
  51166. }
  51167. }
  51168. return vg.delete(ag), vg.delete(mg), AC;
  51169. }
  51170. function SI(ag, mg) {
  51171. var Sg, Fg, tI = ag.__data__;
  51172. return ((Fg = typeof (Sg = mg)) == "string" || Fg == "number" || Fg == "symbol" || Fg == "boolean" ? Sg !== "__proto__" : Sg === null) ? tI[typeof mg == "string" ? "string" : "hash"] : tI.map;
  51173. }
  51174. function eI(ag, mg) {
  51175. var Sg = function(Fg, tI) {
  51176. return Fg == null ? void 0 : Fg[tI];
  51177. }(ag, mg);
  51178. return Eg(Sg) ? Sg : void 0;
  51179. }
  51180. var NI = function(ag) {
  51181. return P.call(ag);
  51182. };
  51183. function EI(ag, mg) {
  51184. return !!(mg = mg ?? 9007199254740991) && (typeof ag == "number" || b.test(ag)) && ag > -1 && ag % 1 == 0 && ag < mg;
  51185. }
  51186. function oI(ag, mg) {
  51187. if (nI(ag)) return !1;
  51188. var Sg = typeof ag;
  51189. return !(Sg != "number" && Sg != "symbol" && Sg != "boolean" && ag != null && !gC(ag)) || d.test(ag) || !a.test(ag) || mg != null && ag in Object(mg);
  51190. }
  51191. function LI(ag) {
  51192. return ag == ag && !VI(ag);
  51193. }
  51194. function pg(ag, mg) {
  51195. return function(Sg) {
  51196. return Sg != null && Sg[ag] === mg && (mg !== void 0 || ag in Object(Sg));
  51197. };
  51198. }
  51199. (Cg && NI(new Cg(new ArrayBuffer(1))) != "[object DataView]" || Ig && NI(new Ig()) != s || x && NI(x.resolve()) != "[object Promise]" || Ag && NI(new Ag()) != n || eg && NI(new eg()) != "[object WeakMap]") && (NI = function(ag) {
  51200. var mg = P.call(ag), Sg = mg == l ? ag.constructor : void 0, Fg = Sg ? bg(Sg) : void 0;
  51201. if (Fg) switch (Fg) {
  51202. case _:
  51203. return "[object DataView]";
  51204. case gg:
  51205. return s;
  51206. case lg:
  51207. return "[object Promise]";
  51208. case ng:
  51209. return n;
  51210. case sg:
  51211. return "[object WeakMap]";
  51212. }
  51213. return mg;
  51214. });
  51215. var uI = rI(function(ag) {
  51216. var mg;
  51217. ag = (mg = ag) == null ? "" : function(Fg) {
  51218. if (typeof Fg == "string") return Fg;
  51219. if (gC(Fg)) return rg ? rg.call(Fg) : "";
  51220. var tI = Fg + "";
  51221. return tI == "0" && 1 / Fg == -1 / 0 ? "-0" : tI;
  51222. }(mg);
  51223. var Sg = [];
  51224. return o.test(ag) && Sg.push(""), ag.replace(c, function(Fg, tI, vg, xg) {
  51225. Sg.push(vg ? xg.replace(r, "$1") : tI || Fg);
  51226. }), Sg;
  51227. });
  51228. function hg(ag) {
  51229. if (typeof ag == "string" || gC(ag)) return ag;
  51230. var mg = ag + "";
  51231. return mg == "0" && 1 / ag == -1 / 0 ? "-0" : mg;
  51232. }
  51233. function bg(ag) {
  51234. if (ag != null) {
  51235. try {
  51236. return T.call(ag);
  51237. } catch {
  51238. }
  51239. try {
  51240. return ag + "";
  51241. } catch {
  51242. }
  51243. }
  51244. return "";
  51245. }
  51246. var Rg, Tg = (Rg = function(ag, mg, Sg) {
  51247. Q.call(ag, Sg) ? ag[Sg].push(mg) : ag[Sg] = [mg];
  51248. }, function(ag, mg) {
  51249. var Sg = nI(ag) ? z : Ng, Fg = {};
  51250. return Sg(ag, Rg, aI(mg), Fg);
  51251. });
  51252. function rI(ag, mg) {
  51253. if (typeof ag != "function" || mg && typeof mg != "function") throw new TypeError("Expected a function");
  51254. var Sg = function() {
  51255. var Fg = arguments, tI = mg ? mg.apply(this, Fg) : Fg[0], vg = Sg.cache;
  51256. if (vg.has(tI)) return vg.get(tI);
  51257. var xg = ag.apply(this, Fg);
  51258. return Sg.cache = vg.set(tI, xg), xg;
  51259. };
  51260. return Sg.cache = new (rI.Cache || Zg)(), Sg;
  51261. }
  51262. function jg(ag, mg) {
  51263. return ag === mg || ag != ag && mg != mg;
  51264. }
  51265. function GI(ag) {
  51266. return function(mg) {
  51267. return yC(mg) && CI(mg);
  51268. }(ag) && Q.call(ag, "callee") && (!k.call(ag, "callee") || P.call(ag) == A);
  51269. }
  51270. rI.Cache = Zg;
  51271. var nI = Array.isArray;
  51272. function CI(ag) {
  51273. return ag != null && mI(ag.length) && !WI(ag);
  51274. }
  51275. function WI(ag) {
  51276. var mg = VI(ag) ? P.call(ag) : "";
  51277. return mg == "[object Function]" || mg == "[object GeneratorFunction]";
  51278. }
  51279. function mI(ag) {
  51280. return typeof ag == "number" && ag > -1 && ag % 1 == 0 && ag <= 9007199254740991;
  51281. }
  51282. function VI(ag) {
  51283. var mg = typeof ag;
  51284. return !!ag && (mg == "object" || mg == "function");
  51285. }
  51286. function yC(ag) {
  51287. return !!ag && typeof ag == "object";
  51288. }
  51289. function gC(ag) {
  51290. return typeof ag == "symbol" || yC(ag) && P.call(ag) == "[object Symbol]";
  51291. }
  51292. var It = S ? /* @__PURE__ */ function(ag) {
  51293. return function(mg) {
  51294. return ag(mg);
  51295. };
  51296. }(S) : function(ag) {
  51297. return yC(ag) && mI(ag.length) && !!u[P.call(ag)];
  51298. };
  51299. function dC(ag) {
  51300. return CI(ag) ? kg(ag) : dI(ag);
  51301. }
  51302. function Tt(ag) {
  51303. return ag;
  51304. }
  51305. C.exports = Tg;
  51306. }).call(this);
  51307. }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  51308. }, {}], 444: [function(g, C, i) {
  51309. var e = Object.prototype.toString;
  51310. C.exports = function(A) {
  51311. return A === !0 || A === !1 || /* @__PURE__ */ function(s) {
  51312. return !!s && typeof s == "object";
  51313. }(A) && e.call(A) == "[object Boolean]";
  51314. };
  51315. }, {}], 445: [function(g, C, i) {
  51316. (function(e) {
  51317. (function() {
  51318. var A = "[object Arguments]", s = "[object Map]", l = "[object Object]", n = "[object Set]", a = /^\[object .+?Constructor\]$/, d = /^(?:0|[1-9]\d*)$/, o = {};
  51319. o["[object Float32Array]"] = o["[object Float64Array]"] = o["[object Int8Array]"] = o["[object Int16Array]"] = o["[object Int32Array]"] = o["[object Uint8Array]"] = o["[object Uint8ClampedArray]"] = o["[object Uint16Array]"] = o["[object Uint32Array]"] = !0, o[A] = o["[object Array]"] = o["[object ArrayBuffer]"] = o["[object Boolean]"] = o["[object DataView]"] = o["[object Date]"] = o["[object Error]"] = o["[object Function]"] = o[s] = o["[object Number]"] = o[l] = o["[object RegExp]"] = o[n] = o["[object String]"] = o["[object WeakMap]"] = !1;
  51320. var c = typeof e == "object" && e && e.Object === Object && e, r = typeof self == "object" && self && self.Object === Object && self, h = c || r || Function("return this")(), b = typeof i == "object" && i && !i.nodeType && i, u = b && typeof C == "object" && C && !C.nodeType && C, m = u && u.exports === b, Z = m && c.process, p = function() {
  51321. try {
  51322. return Z && Z.binding && Z.binding("util");
  51323. } catch {
  51324. }
  51325. }(), Y = p && p.isTypedArray;
  51326. function R(hg, bg) {
  51327. for (var Rg = -1, Tg = hg == null ? 0 : hg.length; ++Rg < Tg; ) if (bg(hg[Rg], Rg, hg)) return !0;
  51328. return !1;
  51329. }
  51330. function X(hg) {
  51331. var bg = -1, Rg = Array(hg.size);
  51332. return hg.forEach(function(Tg, rI) {
  51333. Rg[++bg] = [rI, Tg];
  51334. }), Rg;
  51335. }
  51336. function H(hg) {
  51337. var bg = -1, Rg = Array(hg.size);
  51338. return hg.forEach(function(Tg) {
  51339. Rg[++bg] = Tg;
  51340. }), Rg;
  51341. }
  51342. var S, z, v, K = Array.prototype, V = Function.prototype, N = Object.prototype, B = h["__core-js_shared__"], G = V.toString, w = N.hasOwnProperty, W = (S = /[^.]+$/.exec(B && B.keys && B.keys.IE_PROTO || "")) ? "Symbol(src)_1." + S : "", y = N.toString, f = RegExp("^" + G.call(w).replace(/[\\^$.*+?()[\]{}|]/g, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"), D = m ? h.Buffer : void 0, F = h.Symbol, T = h.Uint8Array, Q = N.propertyIsEnumerable, P = K.splice, L = F ? F.toStringTag : void 0, E = Object.getOwnPropertySymbols, J = D ? D.isBuffer : void 0, k = (z = Object.keys, v = Object, function(hg) {
  51343. return z(v(hg));
  51344. }), j = cI(h, "DataView"), q = cI(h, "Map"), Cg = cI(h, "Promise"), Ig = cI(h, "Set"), x = cI(h, "WeakMap"), Ag = cI(Object, "create"), eg = dI(j), O = dI(q), _ = dI(Cg), gg = dI(Ig), lg = dI(x), ng = F ? F.prototype : void 0, sg = ng ? ng.valueOf : void 0;
  51345. function og(hg) {
  51346. var bg = -1, Rg = hg == null ? 0 : hg.length;
  51347. for (this.clear(); ++bg < Rg; ) {
  51348. var Tg = hg[bg];
  51349. this.set(Tg[0], Tg[1]);
  51350. }
  51351. }
  51352. function cg(hg) {
  51353. var bg = -1, Rg = hg == null ? 0 : hg.length;
  51354. for (this.clear(); ++bg < Rg; ) {
  51355. var Tg = hg[bg];
  51356. this.set(Tg[0], Tg[1]);
  51357. }
  51358. }
  51359. function rg(hg) {
  51360. var bg = -1, Rg = hg == null ? 0 : hg.length;
  51361. for (this.clear(); ++bg < Rg; ) {
  51362. var Tg = hg[bg];
  51363. this.set(Tg[0], Tg[1]);
  51364. }
  51365. }
  51366. function dg(hg) {
  51367. var bg = -1, Rg = hg == null ? 0 : hg.length;
  51368. for (this.__data__ = new rg(); ++bg < Rg; ) this.add(hg[bg]);
  51369. }
  51370. function Bg(hg) {
  51371. var bg = this.__data__ = new cg(hg);
  51372. this.size = bg.size;
  51373. }
  51374. function Zg(hg, bg) {
  51375. var Rg = SI(hg), Tg = !Rg && xI(hg), rI = !Rg && !Tg && eI(hg), jg = !Rg && !Tg && !rI && pg(hg), GI = Rg || Tg || rI || jg, nI = GI ? function(mI, VI) {
  51376. for (var yC = -1, gC = Array(mI); ++yC < mI; ) gC[yC] = VI(yC);
  51377. return gC;
  51378. }(hg.length, String) : [], CI = nI.length;
  51379. for (var WI in hg) !w.call(hg, WI) || GI && (WI == "length" || rI && (WI == "offset" || WI == "parent") || jg && (WI == "buffer" || WI == "byteLength" || WI == "byteOffset") || aI(WI, CI)) || nI.push(WI);
  51380. return nI;
  51381. }
  51382. function Xg(hg, bg) {
  51383. for (var Rg = hg.length; Rg--; ) if (_g(hg[Rg][0], bg)) return Rg;
  51384. return -1;
  51385. }
  51386. function Kg(hg) {
  51387. return hg == null ? hg === void 0 ? "[object Undefined]" : "[object Null]" : L && L in Object(hg) ? function(bg) {
  51388. var Rg = w.call(bg, L), Tg = bg[L];
  51389. try {
  51390. bg[L] = void 0;
  51391. var rI = !0;
  51392. } catch {
  51393. }
  51394. var jg = y.call(bg);
  51395. return rI && (Rg ? bg[L] = Tg : delete bg[L]), jg;
  51396. }(hg) : function(bg) {
  51397. return y.call(bg);
  51398. }(hg);
  51399. }
  51400. function kg(hg) {
  51401. return LI(hg) && Kg(hg) == A;
  51402. }
  51403. function Wg(hg, bg, Rg, Tg, rI) {
  51404. return hg === bg || (hg == null || bg == null || !LI(hg) && !LI(bg) ? hg != hg && bg != bg : function(jg, GI, nI, CI, WI, mI) {
  51405. var VI = SI(jg), yC = SI(GI), gC = VI ? "[object Array]" : Eg(jg), It = yC ? "[object Array]" : Eg(GI), dC = (gC = gC == A ? l : gC) == l, Tt = (It = It == A ? l : It) == l, ag = gC == It;
  51406. if (ag && eI(jg)) {
  51407. if (!eI(GI)) return !1;
  51408. VI = !0, dC = !1;
  51409. }
  51410. if (ag && !dC) return mI || (mI = new Bg()), VI || pg(jg) ? fg(jg, GI, nI, CI, WI, mI) : function(vg, xg, vI, fI, MI, hI, AC) {
  51411. switch (vI) {
  51412. case "[object DataView]":
  51413. if (vg.byteLength != xg.byteLength || vg.byteOffset != xg.byteOffset) return !1;
  51414. vg = vg.buffer, xg = xg.buffer;
  51415. case "[object ArrayBuffer]":
  51416. return !(vg.byteLength != xg.byteLength || !hI(new T(vg), new T(xg)));
  51417. case "[object Boolean]":
  51418. case "[object Date]":
  51419. case "[object Number]":
  51420. return _g(+vg, +xg);
  51421. case "[object Error]":
  51422. return vg.name == xg.name && vg.message == xg.message;
  51423. case "[object RegExp]":
  51424. case "[object String]":
  51425. return vg == xg + "";
  51426. case s:
  51427. var PI = X;
  51428. case n:
  51429. var jI = 1 & fI;
  51430. if (PI || (PI = H), vg.size != xg.size && !jI) return !1;
  51431. var mC = AC.get(vg);
  51432. if (mC) return mC == xg;
  51433. fI |= 2, AC.set(vg, xg);
  51434. var ZC = fg(PI(vg), PI(xg), fI, MI, hI, AC);
  51435. return AC.delete(vg), ZC;
  51436. case "[object Symbol]":
  51437. if (sg) return sg.call(vg) == sg.call(xg);
  51438. }
  51439. return !1;
  51440. }(jg, GI, gC, nI, CI, WI, mI);
  51441. if (!(1 & nI)) {
  51442. var mg = dC && w.call(jg, "__wrapped__"), Sg = Tt && w.call(GI, "__wrapped__");
  51443. if (mg || Sg) {
  51444. var Fg = mg ? jg.value() : jg, tI = Sg ? GI.value() : GI;
  51445. return mI || (mI = new Bg()), WI(Fg, tI, nI, CI, mI);
  51446. }
  51447. }
  51448. return ag ? (mI || (mI = new Bg()), function(vg, xg, vI, fI, MI, hI) {
  51449. var AC = 1 & vI, PI = Jg(vg), jI = PI.length, mC = Jg(xg).length;
  51450. if (jI != mC && !AC) return !1;
  51451. for (var ZC = jI; ZC--; ) {
  51452. var Vt = PI[ZC];
  51453. if (!(AC ? Vt in xg : w.call(xg, Vt))) return !1;
  51454. }
  51455. var Si = hI.get(vg);
  51456. if (Si && hI.get(xg)) return Si == xg;
  51457. var LA = !0;
  51458. hI.set(vg, xg), hI.set(xg, vg);
  51459. for (var vs = AC; ++ZC < jI; ) {
  51460. Vt = PI[ZC];
  51461. var AA = vg[Vt], Ts = xg[Vt];
  51462. if (fI) var IC = AC ? fI(Ts, AA, Vt, xg, vg, hI) : fI(AA, Ts, Vt, vg, xg, hI);
  51463. if (!(IC === void 0 ? AA === Ts || MI(AA, Ts, vI, fI, hI) : IC)) {
  51464. LA = !1;
  51465. break;
  51466. }
  51467. vs || (vs = Vt == "constructor");
  51468. }
  51469. if (LA && !vs) {
  51470. var QI = vg.constructor, sA = xg.constructor;
  51471. QI == sA || !("constructor" in vg) || !("constructor" in xg) || typeof QI == "function" && QI instanceof QI && typeof sA == "function" && sA instanceof sA || (LA = !1);
  51472. }
  51473. return hI.delete(vg), hI.delete(xg), LA;
  51474. }(jg, GI, nI, CI, WI, mI)) : !1;
  51475. }(hg, bg, Rg, Tg, Wg, rI));
  51476. }
  51477. function Ng(hg) {
  51478. return !(!oI(hg) || function(bg) {
  51479. return !!W && W in bg;
  51480. }(hg)) && (NI(hg) ? f : a).test(dI(hg));
  51481. }
  51482. function wg(hg) {
  51483. if (Rg = (bg = hg) && bg.constructor, Tg = typeof Rg == "function" && Rg.prototype || N, bg !== Tg) return k(hg);
  51484. var bg, Rg, Tg, rI = [];
  51485. for (var jg in Object(hg)) w.call(hg, jg) && jg != "constructor" && rI.push(jg);
  51486. return rI;
  51487. }
  51488. function fg(hg, bg, Rg, Tg, rI, jg) {
  51489. var GI = 1 & Rg, nI = hg.length, CI = bg.length;
  51490. if (nI != CI && !(GI && CI > nI)) return !1;
  51491. var WI = jg.get(hg);
  51492. if (WI && jg.get(bg)) return WI == bg;
  51493. var mI = -1, VI = !0, yC = 2 & Rg ? new dg() : void 0;
  51494. for (jg.set(hg, bg), jg.set(bg, hg); ++mI < nI; ) {
  51495. var gC = hg[mI], It = bg[mI];
  51496. if (Tg) var dC = GI ? Tg(It, gC, mI, bg, hg, jg) : Tg(gC, It, mI, hg, bg, jg);
  51497. if (dC !== void 0) {
  51498. if (dC) continue;
  51499. VI = !1;
  51500. break;
  51501. }
  51502. if (yC) {
  51503. if (!R(bg, function(Tt, ag) {
  51504. if (mg = ag, !yC.has(mg) && (gC === Tt || rI(gC, Tt, Rg, Tg, jg))) return yC.push(ag);
  51505. var mg;
  51506. })) {
  51507. VI = !1;
  51508. break;
  51509. }
  51510. } else if (gC !== It && !rI(gC, It, Rg, Tg, jg)) {
  51511. VI = !1;
  51512. break;
  51513. }
  51514. }
  51515. return jg.delete(hg), jg.delete(bg), VI;
  51516. }
  51517. function Jg(hg) {
  51518. return function(bg, Rg, Tg) {
  51519. var rI = Rg(bg);
  51520. return SI(bg) ? rI : function(jg, GI) {
  51521. for (var nI = -1, CI = GI.length, WI = jg.length; ++nI < CI; ) jg[WI + nI] = GI[nI];
  51522. return jg;
  51523. }(rI, Tg(bg));
  51524. }(hg, uI, YI);
  51525. }
  51526. function zg(hg, bg) {
  51527. var Rg, Tg, rI = hg.__data__;
  51528. return ((Tg = typeof (Rg = bg)) == "string" || Tg == "number" || Tg == "symbol" || Tg == "boolean" ? Rg !== "__proto__" : Rg === null) ? rI[typeof bg == "string" ? "string" : "hash"] : rI.map;
  51529. }
  51530. function cI(hg, bg) {
  51531. var Rg = function(Tg, rI) {
  51532. return Tg == null ? void 0 : Tg[rI];
  51533. }(hg, bg);
  51534. return Ng(Rg) ? Rg : void 0;
  51535. }
  51536. og.prototype.clear = function() {
  51537. this.__data__ = Ag ? Ag(null) : {}, this.size = 0;
  51538. }, og.prototype.delete = function(hg) {
  51539. var bg = this.has(hg) && delete this.__data__[hg];
  51540. return this.size -= bg ? 1 : 0, bg;
  51541. }, og.prototype.get = function(hg) {
  51542. var bg = this.__data__;
  51543. if (Ag) {
  51544. var Rg = bg[hg];
  51545. return Rg === "__lodash_hash_undefined__" ? void 0 : Rg;
  51546. }
  51547. return w.call(bg, hg) ? bg[hg] : void 0;
  51548. }, og.prototype.has = function(hg) {
  51549. var bg = this.__data__;
  51550. return Ag ? bg[hg] !== void 0 : w.call(bg, hg);
  51551. }, og.prototype.set = function(hg, bg) {
  51552. var Rg = this.__data__;
  51553. return this.size += this.has(hg) ? 0 : 1, Rg[hg] = Ag && bg === void 0 ? "__lodash_hash_undefined__" : bg, this;
  51554. }, cg.prototype.clear = function() {
  51555. this.__data__ = [], this.size = 0;
  51556. }, cg.prototype.delete = function(hg) {
  51557. var bg = this.__data__, Rg = Xg(bg, hg);
  51558. return !(Rg < 0) && (Rg == bg.length - 1 ? bg.pop() : P.call(bg, Rg, 1), --this.size, !0);
  51559. }, cg.prototype.get = function(hg) {
  51560. var bg = this.__data__, Rg = Xg(bg, hg);
  51561. return Rg < 0 ? void 0 : bg[Rg][1];
  51562. }, cg.prototype.has = function(hg) {
  51563. return Xg(this.__data__, hg) > -1;
  51564. }, cg.prototype.set = function(hg, bg) {
  51565. var Rg = this.__data__, Tg = Xg(Rg, hg);
  51566. return Tg < 0 ? (++this.size, Rg.push([hg, bg])) : Rg[Tg][1] = bg, this;
  51567. }, rg.prototype.clear = function() {
  51568. this.size = 0, this.__data__ = { hash: new og(), map: new (q || cg)(), string: new og() };
  51569. }, rg.prototype.delete = function(hg) {
  51570. var bg = zg(this, hg).delete(hg);
  51571. return this.size -= bg ? 1 : 0, bg;
  51572. }, rg.prototype.get = function(hg) {
  51573. return zg(this, hg).get(hg);
  51574. }, rg.prototype.has = function(hg) {
  51575. return zg(this, hg).has(hg);
  51576. }, rg.prototype.set = function(hg, bg) {
  51577. var Rg = zg(this, hg), Tg = Rg.size;
  51578. return Rg.set(hg, bg), this.size += Rg.size == Tg ? 0 : 1, this;
  51579. }, dg.prototype.add = dg.prototype.push = function(hg) {
  51580. return this.__data__.set(hg, "__lodash_hash_undefined__"), this;
  51581. }, dg.prototype.has = function(hg) {
  51582. return this.__data__.has(hg);
  51583. }, Bg.prototype.clear = function() {
  51584. this.__data__ = new cg(), this.size = 0;
  51585. }, Bg.prototype.delete = function(hg) {
  51586. var bg = this.__data__, Rg = bg.delete(hg);
  51587. return this.size = bg.size, Rg;
  51588. }, Bg.prototype.get = function(hg) {
  51589. return this.__data__.get(hg);
  51590. }, Bg.prototype.has = function(hg) {
  51591. return this.__data__.has(hg);
  51592. }, Bg.prototype.set = function(hg, bg) {
  51593. var Rg = this.__data__;
  51594. if (Rg instanceof cg) {
  51595. var Tg = Rg.__data__;
  51596. if (!q || Tg.length < 199) return Tg.push([hg, bg]), this.size = ++Rg.size, this;
  51597. Rg = this.__data__ = new rg(Tg);
  51598. }
  51599. return Rg.set(hg, bg), this.size = Rg.size, this;
  51600. };
  51601. var YI = E ? function(hg) {
  51602. return hg == null ? [] : (hg = Object(hg), function(bg, Rg) {
  51603. for (var Tg = -1, rI = bg == null ? 0 : bg.length, jg = 0, GI = []; ++Tg < rI; ) {
  51604. var nI = bg[Tg];
  51605. Rg(nI, Tg, bg) && (GI[jg++] = nI);
  51606. }
  51607. return GI;
  51608. }(E(hg), function(bg) {
  51609. return Q.call(hg, bg);
  51610. }));
  51611. } : function() {
  51612. return [];
  51613. }, Eg = Kg;
  51614. function aI(hg, bg) {
  51615. return !!(bg = bg ?? 9007199254740991) && (typeof hg == "number" || d.test(hg)) && hg > -1 && hg % 1 == 0 && hg < bg;
  51616. }
  51617. function dI(hg) {
  51618. if (hg != null) {
  51619. try {
  51620. return G.call(hg);
  51621. } catch {
  51622. }
  51623. try {
  51624. return hg + "";
  51625. } catch {
  51626. }
  51627. }
  51628. return "";
  51629. }
  51630. function _g(hg, bg) {
  51631. return hg === bg || hg != hg && bg != bg;
  51632. }
  51633. (j && Eg(new j(new ArrayBuffer(1))) != "[object DataView]" || q && Eg(new q()) != s || Cg && Eg(Cg.resolve()) != "[object Promise]" || Ig && Eg(new Ig()) != n || x && Eg(new x()) != "[object WeakMap]") && (Eg = function(hg) {
  51634. var bg = Kg(hg), Rg = bg == l ? hg.constructor : void 0, Tg = Rg ? dI(Rg) : "";
  51635. if (Tg) switch (Tg) {
  51636. case eg:
  51637. return "[object DataView]";
  51638. case O:
  51639. return s;
  51640. case _:
  51641. return "[object Promise]";
  51642. case gg:
  51643. return n;
  51644. case lg:
  51645. return "[object WeakMap]";
  51646. }
  51647. return bg;
  51648. });
  51649. var xI = kg(/* @__PURE__ */ function() {
  51650. return arguments;
  51651. }()) ? kg : function(hg) {
  51652. return LI(hg) && w.call(hg, "callee") && !Q.call(hg, "callee");
  51653. }, SI = Array.isArray, eI = J || function() {
  51654. return !1;
  51655. };
  51656. function NI(hg) {
  51657. if (!oI(hg)) return !1;
  51658. var bg = Kg(hg);
  51659. return bg == "[object Function]" || bg == "[object GeneratorFunction]" || bg == "[object AsyncFunction]" || bg == "[object Proxy]";
  51660. }
  51661. function EI(hg) {
  51662. return typeof hg == "number" && hg > -1 && hg % 1 == 0 && hg <= 9007199254740991;
  51663. }
  51664. function oI(hg) {
  51665. var bg = typeof hg;
  51666. return hg != null && (bg == "object" || bg == "function");
  51667. }
  51668. function LI(hg) {
  51669. return hg != null && typeof hg == "object";
  51670. }
  51671. var pg = Y ? /* @__PURE__ */ function(hg) {
  51672. return function(bg) {
  51673. return hg(bg);
  51674. };
  51675. }(Y) : function(hg) {
  51676. return LI(hg) && EI(hg.length) && !!o[Kg(hg)];
  51677. };
  51678. function uI(hg) {
  51679. return (bg = hg) != null && EI(bg.length) && !NI(bg) ? Zg(hg) : wg(hg);
  51680. var bg;
  51681. }
  51682. C.exports = function(hg, bg) {
  51683. return Wg(hg, bg);
  51684. };
  51685. }).call(this);
  51686. }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  51687. }, {}], 446: [function(g, C, i) {
  51688. (function(e) {
  51689. (function() {
  51690. var A = typeof e == "object" && e && e.Object === Object && e, s = typeof self == "object" && self && self.Object === Object && self, l = A || s || Function("return this")(), n = Object.prototype, a = n.hasOwnProperty, d = n.toString, o = l.Symbol, c = o ? o.toStringTag : void 0;
  51691. function r(h) {
  51692. return h == null ? h === void 0 ? "[object Undefined]" : "[object Null]" : c && c in Object(h) ? function(b) {
  51693. var u = a.call(b, c), m = b[c];
  51694. try {
  51695. b[c] = void 0;
  51696. var Z = !0;
  51697. } catch {
  51698. }
  51699. var p = d.call(b);
  51700. return Z && (u ? b[c] = m : delete b[c]), p;
  51701. }(h) : function(b) {
  51702. return d.call(b);
  51703. }(h);
  51704. }
  51705. C.exports = function(h) {
  51706. if (!function(u) {
  51707. var m = typeof u;
  51708. return u != null && (m == "object" || m == "function");
  51709. }(h)) return !1;
  51710. var b = r(h);
  51711. return b == "[object Function]" || b == "[object GeneratorFunction]" || b == "[object AsyncFunction]" || b == "[object Proxy]";
  51712. };
  51713. }).call(this);
  51714. }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  51715. }, {}], 447: [function(g, C, i) {
  51716. C.exports = function(e) {
  51717. return e == null;
  51718. };
  51719. }, {}], 448: [function(g, C, i) {
  51720. C.exports = function(e) {
  51721. return e === void 0;
  51722. };
  51723. }, {}], 449: [function(g, C, i) {
  51724. (function(e) {
  51725. (function() {
  51726. var A = /^\[object .+?Constructor\]$/, s = typeof e == "object" && e && e.Object === Object && e, l = typeof self == "object" && self && self.Object === Object && self, n = s || l || Function("return this")();
  51727. function a(F, T) {
  51728. return !!(F && F.length) && function(Q, P, L) {
  51729. if (P != P) return function(k, j, q, Cg) {
  51730. for (var Ig = k.length, x = q + -1; ++x < Ig; ) if (j(k[x], x, k)) return x;
  51731. return -1;
  51732. }(Q, d, L);
  51733. for (var E = L - 1, J = Q.length; ++E < J; ) if (Q[E] === P) return E;
  51734. return -1;
  51735. }(F, T, 0) > -1;
  51736. }
  51737. function d(F) {
  51738. return F != F;
  51739. }
  51740. function o(F, T) {
  51741. return F.has(T);
  51742. }
  51743. function c(F) {
  51744. var T = -1, Q = Array(F.size);
  51745. return F.forEach(function(P) {
  51746. Q[++T] = P;
  51747. }), Q;
  51748. }
  51749. var r, h = Array.prototype, b = Function.prototype, u = Object.prototype, m = n["__core-js_shared__"], Z = (r = /[^.]+$/.exec(m && m.keys && m.keys.IE_PROTO || "")) ? "Symbol(src)_1." + r : "", p = b.toString, Y = u.hasOwnProperty, R = u.toString, X = RegExp("^" + p.call(Y).replace(/[\\^$.*+?()[\]{}|]/g, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"), H = h.splice, S = f(n, "Map"), z = f(n, "Set"), v = f(Object, "create");
  51750. function K(F) {
  51751. var T = -1, Q = F ? F.length : 0;
  51752. for (this.clear(); ++T < Q; ) {
  51753. var P = F[T];
  51754. this.set(P[0], P[1]);
  51755. }
  51756. }
  51757. function V(F) {
  51758. var T = -1, Q = F ? F.length : 0;
  51759. for (this.clear(); ++T < Q; ) {
  51760. var P = F[T];
  51761. this.set(P[0], P[1]);
  51762. }
  51763. }
  51764. function N(F) {
  51765. var T = -1, Q = F ? F.length : 0;
  51766. for (this.clear(); ++T < Q; ) {
  51767. var P = F[T];
  51768. this.set(P[0], P[1]);
  51769. }
  51770. }
  51771. function B(F) {
  51772. var T = -1, Q = F ? F.length : 0;
  51773. for (this.__data__ = new N(); ++T < Q; ) this.add(F[T]);
  51774. }
  51775. function G(F, T) {
  51776. for (var Q, P, L = F.length; L--; ) if ((Q = F[L][0]) === (P = T) || Q != Q && P != P) return L;
  51777. return -1;
  51778. }
  51779. function w(F) {
  51780. return !(!D(F) || (T = F, Z && Z in T)) && (function(Q) {
  51781. var P = D(Q) ? R.call(Q) : "";
  51782. return P == "[object Function]" || P == "[object GeneratorFunction]";
  51783. }(F) || function(Q) {
  51784. var P = !1;
  51785. if (Q != null && typeof Q.toString != "function") try {
  51786. P = !!(Q + "");
  51787. } catch {
  51788. }
  51789. return P;
  51790. }(F) ? X : A).test(function(Q) {
  51791. if (Q != null) {
  51792. try {
  51793. return p.call(Q);
  51794. } catch {
  51795. }
  51796. try {
  51797. return Q + "";
  51798. } catch {
  51799. }
  51800. }
  51801. return "";
  51802. }(F));
  51803. var T;
  51804. }
  51805. K.prototype.clear = function() {
  51806. this.__data__ = v ? v(null) : {};
  51807. }, K.prototype.delete = function(F) {
  51808. return this.has(F) && delete this.__data__[F];
  51809. }, K.prototype.get = function(F) {
  51810. var T = this.__data__;
  51811. if (v) {
  51812. var Q = T[F];
  51813. return Q === "__lodash_hash_undefined__" ? void 0 : Q;
  51814. }
  51815. return Y.call(T, F) ? T[F] : void 0;
  51816. }, K.prototype.has = function(F) {
  51817. var T = this.__data__;
  51818. return v ? T[F] !== void 0 : Y.call(T, F);
  51819. }, K.prototype.set = function(F, T) {
  51820. return this.__data__[F] = v && T === void 0 ? "__lodash_hash_undefined__" : T, this;
  51821. }, V.prototype.clear = function() {
  51822. this.__data__ = [];
  51823. }, V.prototype.delete = function(F) {
  51824. var T = this.__data__, Q = G(T, F);
  51825. return !(Q < 0) && (Q == T.length - 1 ? T.pop() : H.call(T, Q, 1), !0);
  51826. }, V.prototype.get = function(F) {
  51827. var T = this.__data__, Q = G(T, F);
  51828. return Q < 0 ? void 0 : T[Q][1];
  51829. }, V.prototype.has = function(F) {
  51830. return G(this.__data__, F) > -1;
  51831. }, V.prototype.set = function(F, T) {
  51832. var Q = this.__data__, P = G(Q, F);
  51833. return P < 0 ? Q.push([F, T]) : Q[P][1] = T, this;
  51834. }, N.prototype.clear = function() {
  51835. this.__data__ = { hash: new K(), map: new (S || V)(), string: new K() };
  51836. }, N.prototype.delete = function(F) {
  51837. return y(this, F).delete(F);
  51838. }, N.prototype.get = function(F) {
  51839. return y(this, F).get(F);
  51840. }, N.prototype.has = function(F) {
  51841. return y(this, F).has(F);
  51842. }, N.prototype.set = function(F, T) {
  51843. return y(this, F).set(F, T), this;
  51844. }, B.prototype.add = B.prototype.push = function(F) {
  51845. return this.__data__.set(F, "__lodash_hash_undefined__"), this;
  51846. }, B.prototype.has = function(F) {
  51847. return this.__data__.has(F);
  51848. };
  51849. var W = z && 1 / c(new z([, -0]))[1] == 1 / 0 ? function(F) {
  51850. return new z(F);
  51851. } : function() {
  51852. };
  51853. function y(F, T) {
  51854. var Q, P, L = F.__data__;
  51855. return ((P = typeof (Q = T)) == "string" || P == "number" || P == "symbol" || P == "boolean" ? Q !== "__proto__" : Q === null) ? L[typeof T == "string" ? "string" : "hash"] : L.map;
  51856. }
  51857. function f(F, T) {
  51858. var Q = function(P, L) {
  51859. return P == null ? void 0 : P[L];
  51860. }(F, T);
  51861. return w(Q) ? Q : void 0;
  51862. }
  51863. function D(F) {
  51864. var T = typeof F;
  51865. return !!F && (T == "object" || T == "function");
  51866. }
  51867. C.exports = function(F) {
  51868. return F && F.length ? function(T, Q, P) {
  51869. var L = -1, E = a, J = T.length, k = !0, j = [], q = j;
  51870. if (J >= 200) {
  51871. var Cg = W(T);
  51872. if (Cg) return c(Cg);
  51873. k = !1, E = o, q = new B();
  51874. } else q = j;
  51875. g: for (; ++L < J; ) {
  51876. var Ig = T[L], x = Ig;
  51877. if (Ig = Ig !== 0 ? Ig : 0, k && x == x) {
  51878. for (var Ag = q.length; Ag--; ) if (q[Ag] === x) continue g;
  51879. j.push(Ig);
  51880. } else E(q, x, P) || (q !== j && q.push(x), j.push(Ig));
  51881. }
  51882. return j;
  51883. }(F) : [];
  51884. };
  51885. }).call(this);
  51886. }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  51887. }, {}], 450: [function(g, C, i) {
  51888. var e = g("inherits"), A = g("hash-base"), s = g("safe-buffer").Buffer, l = new Array(16);
  51889. function n() {
  51890. A.call(this, 64), this._a = 1732584193, this._b = 4023233417, this._c = 2562383102, this._d = 271733878;
  51891. }
  51892. function a(h, b) {
  51893. return h << b | h >>> 32 - b;
  51894. }
  51895. function d(h, b, u, m, Z, p, Y) {
  51896. return a(h + (b & u | ~b & m) + Z + p | 0, Y) + b | 0;
  51897. }
  51898. function o(h, b, u, m, Z, p, Y) {
  51899. return a(h + (b & m | u & ~m) + Z + p | 0, Y) + b | 0;
  51900. }
  51901. function c(h, b, u, m, Z, p, Y) {
  51902. return a(h + (b ^ u ^ m) + Z + p | 0, Y) + b | 0;
  51903. }
  51904. function r(h, b, u, m, Z, p, Y) {
  51905. return a(h + (u ^ (b | ~m)) + Z + p | 0, Y) + b | 0;
  51906. }
  51907. e(n, A), n.prototype._update = function() {
  51908. for (var h = l, b = 0; b < 16; ++b) h[b] = this._block.readInt32LE(4 * b);
  51909. var u = this._a, m = this._b, Z = this._c, p = this._d;
  51910. u = d(u, m, Z, p, h[0], 3614090360, 7), p = d(p, u, m, Z, h[1], 3905402710, 12), Z = d(Z, p, u, m, h[2], 606105819, 17), m = d(m, Z, p, u, h[3], 3250441966, 22), u = d(u, m, Z, p, h[4], 4118548399, 7), p = d(p, u, m, Z, h[5], 1200080426, 12), Z = d(Z, p, u, m, h[6], 2821735955, 17), m = d(m, Z, p, u, h[7], 4249261313, 22), u = d(u, m, Z, p, h[8], 1770035416, 7), p = d(p, u, m, Z, h[9], 2336552879, 12), Z = d(Z, p, u, m, h[10], 4294925233, 17), m = d(m, Z, p, u, h[11], 2304563134, 22), u = d(u, m, Z, p, h[12], 1804603682, 7), p = d(p, u, m, Z, h[13], 4254626195, 12), Z = d(Z, p, u, m, h[14], 2792965006, 17), u = o(u, m = d(m, Z, p, u, h[15], 1236535329, 22), Z, p, h[1], 4129170786, 5), p = o(p, u, m, Z, h[6], 3225465664, 9), Z = o(Z, p, u, m, h[11], 643717713, 14), m = o(m, Z, p, u, h[0], 3921069994, 20), u = o(u, m, Z, p, h[5], 3593408605, 5), p = o(p, u, m, Z, h[10], 38016083, 9), Z = o(Z, p, u, m, h[15], 3634488961, 14), m = o(m, Z, p, u, h[4], 3889429448, 20), u = o(u, m, Z, p, h[9], 568446438, 5), p = o(p, u, m, Z, h[14], 3275163606, 9), Z = o(Z, p, u, m, h[3], 4107603335, 14), m = o(m, Z, p, u, h[8], 1163531501, 20), u = o(u, m, Z, p, h[13], 2850285829, 5), p = o(p, u, m, Z, h[2], 4243563512, 9), Z = o(Z, p, u, m, h[7], 1735328473, 14), u = c(u, m = o(m, Z, p, u, h[12], 2368359562, 20), Z, p, h[5], 4294588738, 4), p = c(p, u, m, Z, h[8], 2272392833, 11), Z = c(Z, p, u, m, h[11], 1839030562, 16), m = c(m, Z, p, u, h[14], 4259657740, 23), u = c(u, m, Z, p, h[1], 2763975236, 4), p = c(p, u, m, Z, h[4], 1272893353, 11), Z = c(Z, p, u, m, h[7], 4139469664, 16), m = c(m, Z, p, u, h[10], 3200236656, 23), u = c(u, m, Z, p, h[13], 681279174, 4), p = c(p, u, m, Z, h[0], 3936430074, 11), Z = c(Z, p, u, m, h[3], 3572445317, 16), m = c(m, Z, p, u, h[6], 76029189, 23), u = c(u, m, Z, p, h[9], 3654602809, 4), p = c(p, u, m, Z, h[12], 3873151461, 11), Z = c(Z, p, u, m, h[15], 530742520, 16), u = r(u, m = c(m, Z, p, u, h[2], 3299628645, 23), Z, p, h[0], 4096336452, 6), p = r(p, u, m, Z, h[7], 1126891415, 10), Z = r(Z, p, u, m, h[14], 2878612391, 15), m = r(m, Z, p, u, h[5], 4237533241, 21), u = r(u, m, Z, p, h[12], 1700485571, 6), p = r(p, u, m, Z, h[3], 2399980690, 10), Z = r(Z, p, u, m, h[10], 4293915773, 15), m = r(m, Z, p, u, h[1], 2240044497, 21), u = r(u, m, Z, p, h[8], 1873313359, 6), p = r(p, u, m, Z, h[15], 4264355552, 10), Z = r(Z, p, u, m, h[6], 2734768916, 15), m = r(m, Z, p, u, h[13], 1309151649, 21), u = r(u, m, Z, p, h[4], 4149444226, 6), p = r(p, u, m, Z, h[11], 3174756917, 10), Z = r(Z, p, u, m, h[2], 718787259, 15), m = r(m, Z, p, u, h[9], 3951481745, 21), this._a = this._a + u | 0, this._b = this._b + m | 0, this._c = this._c + Z | 0, this._d = this._d + p | 0;
  51911. }, n.prototype._digest = function() {
  51912. this._block[this._blockOffset++] = 128, this._blockOffset > 56 && (this._block.fill(0, this._blockOffset, 64), this._update(), this._blockOffset = 0), this._block.fill(0, this._blockOffset, 56), this._block.writeUInt32LE(this._length[0], 56), this._block.writeUInt32LE(this._length[1], 60), this._update();
  51913. var h = s.allocUnsafe(16);
  51914. return h.writeInt32LE(this._a, 0), h.writeInt32LE(this._b, 4), h.writeInt32LE(this._c, 8), h.writeInt32LE(this._d, 12), h;
  51915. }, C.exports = n;
  51916. }, { "hash-base": 425, inherits: 440, "safe-buffer": 494 }], 451: [function(g, C, i) {
  51917. var e = g("bn.js"), A = g("brorand");
  51918. function s(l) {
  51919. this.rand = l || new A.Rand();
  51920. }
  51921. C.exports = s, s.create = function(l) {
  51922. return new s(l);
  51923. }, s.prototype._randbelow = function(l) {
  51924. var n = l.bitLength(), a = Math.ceil(n / 8);
  51925. do
  51926. var d = new e(this.rand.generate(a));
  51927. while (d.cmp(l) >= 0);
  51928. return d;
  51929. }, s.prototype._randrange = function(l, n) {
  51930. var a = n.sub(l);
  51931. return l.add(this._randbelow(a));
  51932. }, s.prototype.test = function(l, n, a) {
  51933. var d = l.bitLength(), o = e.mont(l), c = new e(1).toRed(o);
  51934. n || (n = Math.max(1, d / 48 | 0));
  51935. for (var r = l.subn(1), h = 0; !r.testn(h); h++) ;
  51936. for (var b = l.shrn(h), u = r.toRed(o); n > 0; n--) {
  51937. var m = this._randrange(new e(2), r);
  51938. a && a(m);
  51939. var Z = m.toRed(o).redPow(b);
  51940. if (Z.cmp(c) !== 0 && Z.cmp(u) !== 0) {
  51941. for (var p = 1; p < h; p++) {
  51942. if ((Z = Z.redSqr()).cmp(c) === 0) return !1;
  51943. if (Z.cmp(u) === 0) break;
  51944. }
  51945. if (p === h) return !1;
  51946. }
  51947. }
  51948. return !0;
  51949. }, s.prototype.getDivisor = function(l, n) {
  51950. var a = l.bitLength(), d = e.mont(l), o = new e(1).toRed(d);
  51951. n || (n = Math.max(1, a / 48 | 0));
  51952. for (var c = l.subn(1), r = 0; !c.testn(r); r++) ;
  51953. for (var h = l.shrn(r), b = c.toRed(d); n > 0; n--) {
  51954. var u = this._randrange(new e(2), c), m = l.gcd(u);
  51955. if (m.cmpn(1) !== 0) return m;
  51956. var Z = u.toRed(d).redPow(h);
  51957. if (Z.cmp(o) !== 0 && Z.cmp(b) !== 0) {
  51958. for (var p = 1; p < r; p++) {
  51959. if ((Z = Z.redSqr()).cmp(o) === 0) return Z.fromRed().subn(1).gcd(l);
  51960. if (Z.cmp(b) === 0) break;
  51961. }
  51962. if (p === r) return (Z = Z.redSqr()).fromRed().subn(1).gcd(l);
  51963. }
  51964. }
  51965. return !1;
  51966. };
  51967. }, { "bn.js": 452, brorand: 187 }], 452: [function(g, C, i) {
  51968. arguments[4][184][0].apply(i, arguments);
  51969. }, { buffer: 188, dup: 184 }], 453: [function(g, C, i) {
  51970. function e(A, s) {
  51971. if (!A) throw new Error(s || "Assertion failed");
  51972. }
  51973. C.exports = e, e.equal = function(A, s, l) {
  51974. if (A != s) throw new Error(l || "Assertion failed: " + A + " != " + s);
  51975. };
  51976. }, {}], 454: [function(g, C, i) {
  51977. var e = i;
  51978. function A(l) {
  51979. return l.length === 1 ? "0" + l : l;
  51980. }
  51981. function s(l) {
  51982. for (var n = "", a = 0; a < l.length; a++) n += A(l[a].toString(16));
  51983. return n;
  51984. }
  51985. e.toArray = function(l, n) {
  51986. if (Array.isArray(l)) return l.slice();
  51987. if (!l) return [];
  51988. var a = [];
  51989. if (typeof l != "string") {
  51990. for (var d = 0; d < l.length; d++) a[d] = 0 | l[d];
  51991. return a;
  51992. }
  51993. if (n === "hex")
  51994. for ((l = l.replace(/[^a-z0-9]+/gi, "")).length % 2 != 0 && (l = "0" + l), d = 0; d < l.length; d += 2) a.push(parseInt(l[d] + l[d + 1], 16));
  51995. else for (d = 0; d < l.length; d++) {
  51996. var o = l.charCodeAt(d), c = o >> 8, r = 255 & o;
  51997. c ? a.push(c, r) : a.push(r);
  51998. }
  51999. return a;
  52000. }, e.zero2 = A, e.toHex = s, e.encode = function(l, n) {
  52001. return n === "hex" ? s(l) : l;
  52002. };
  52003. }, {}], 455: [function(g, C, i) {
  52004. C.exports = { "2.16.840.1.101.3.4.1.1": "aes-128-ecb", "2.16.840.1.101.3.4.1.2": "aes-128-cbc", "2.16.840.1.101.3.4.1.3": "aes-128-ofb", "2.16.840.1.101.3.4.1.4": "aes-128-cfb", "2.16.840.1.101.3.4.1.21": "aes-192-ecb", "2.16.840.1.101.3.4.1.22": "aes-192-cbc", "2.16.840.1.101.3.4.1.23": "aes-192-ofb", "2.16.840.1.101.3.4.1.24": "aes-192-cfb", "2.16.840.1.101.3.4.1.41": "aes-256-ecb", "2.16.840.1.101.3.4.1.42": "aes-256-cbc", "2.16.840.1.101.3.4.1.43": "aes-256-ofb", "2.16.840.1.101.3.4.1.44": "aes-256-cfb" };
  52005. }, {}], 456: [function(g, C, i) {
  52006. var e = g("asn1.js");
  52007. i.certificate = g("./certificate");
  52008. var A = e.define("RSAPrivateKey", function() {
  52009. this.seq().obj(this.key("version").int(), this.key("modulus").int(), this.key("publicExponent").int(), this.key("privateExponent").int(), this.key("prime1").int(), this.key("prime2").int(), this.key("exponent1").int(), this.key("exponent2").int(), this.key("coefficient").int());
  52010. });
  52011. i.RSAPrivateKey = A;
  52012. var s = e.define("RSAPublicKey", function() {
  52013. this.seq().obj(this.key("modulus").int(), this.key("publicExponent").int());
  52014. });
  52015. i.RSAPublicKey = s;
  52016. var l = e.define("SubjectPublicKeyInfo", function() {
  52017. this.seq().obj(this.key("algorithm").use(n), this.key("subjectPublicKey").bitstr());
  52018. });
  52019. i.PublicKey = l;
  52020. var n = e.define("AlgorithmIdentifier", function() {
  52021. this.seq().obj(this.key("algorithm").objid(), this.key("none").null_().optional(), this.key("curve").objid().optional(), this.key("params").seq().obj(this.key("p").int(), this.key("q").int(), this.key("g").int()).optional());
  52022. }), a = e.define("PrivateKeyInfo", function() {
  52023. this.seq().obj(this.key("version").int(), this.key("algorithm").use(n), this.key("subjectPrivateKey").octstr());
  52024. });
  52025. i.PrivateKey = a;
  52026. var d = e.define("EncryptedPrivateKeyInfo", function() {
  52027. this.seq().obj(this.key("algorithm").seq().obj(this.key("id").objid(), this.key("decrypt").seq().obj(this.key("kde").seq().obj(this.key("id").objid(), this.key("kdeparams").seq().obj(this.key("salt").octstr(), this.key("iters").int())), this.key("cipher").seq().obj(this.key("algo").objid(), this.key("iv").octstr()))), this.key("subjectPrivateKey").octstr());
  52028. });
  52029. i.EncryptedPrivateKey = d;
  52030. var o = e.define("DSAPrivateKey", function() {
  52031. this.seq().obj(this.key("version").int(), this.key("p").int(), this.key("q").int(), this.key("g").int(), this.key("pub_key").int(), this.key("priv_key").int());
  52032. });
  52033. i.DSAPrivateKey = o, i.DSAparam = e.define("DSAparam", function() {
  52034. this.int();
  52035. });
  52036. var c = e.define("ECPrivateKey", function() {
  52037. this.seq().obj(this.key("version").int(), this.key("privateKey").octstr(), this.key("parameters").optional().explicit(0).use(r), this.key("publicKey").optional().explicit(1).bitstr());
  52038. });
  52039. i.ECPrivateKey = c;
  52040. var r = e.define("ECParameters", function() {
  52041. this.choice({ namedCurve: this.objid() });
  52042. });
  52043. i.signature = e.define("signature", function() {
  52044. this.seq().obj(this.key("r").int(), this.key("s").int());
  52045. });
  52046. }, { "./certificate": 457, "asn1.js": 170 }], 457: [function(g, C, i) {
  52047. var e = g("asn1.js"), A = e.define("Time", function() {
  52048. this.choice({ utcTime: this.utctime(), generalTime: this.gentime() });
  52049. }), s = e.define("AttributeTypeValue", function() {
  52050. this.seq().obj(this.key("type").objid(), this.key("value").any());
  52051. }), l = e.define("AlgorithmIdentifier", function() {
  52052. this.seq().obj(this.key("algorithm").objid(), this.key("parameters").optional(), this.key("curve").objid().optional());
  52053. }), n = e.define("SubjectPublicKeyInfo", function() {
  52054. this.seq().obj(this.key("algorithm").use(l), this.key("subjectPublicKey").bitstr());
  52055. }), a = e.define("RelativeDistinguishedName", function() {
  52056. this.setof(s);
  52057. }), d = e.define("RDNSequence", function() {
  52058. this.seqof(a);
  52059. }), o = e.define("Name", function() {
  52060. this.choice({ rdnSequence: this.use(d) });
  52061. }), c = e.define("Validity", function() {
  52062. this.seq().obj(this.key("notBefore").use(A), this.key("notAfter").use(A));
  52063. }), r = e.define("Extension", function() {
  52064. this.seq().obj(this.key("extnID").objid(), this.key("critical").bool().def(!1), this.key("extnValue").octstr());
  52065. }), h = e.define("TBSCertificate", function() {
  52066. this.seq().obj(this.key("version").explicit(0).int().optional(), this.key("serialNumber").int(), this.key("signature").use(l), this.key("issuer").use(o), this.key("validity").use(c), this.key("subject").use(o), this.key("subjectPublicKeyInfo").use(n), this.key("issuerUniqueID").implicit(1).bitstr().optional(), this.key("subjectUniqueID").implicit(2).bitstr().optional(), this.key("extensions").explicit(3).seqof(r).optional());
  52067. }), b = e.define("X509Certificate", function() {
  52068. this.seq().obj(this.key("tbsCertificate").use(h), this.key("signatureAlgorithm").use(l), this.key("signatureValue").bitstr());
  52069. });
  52070. C.exports = b;
  52071. }, { "asn1.js": 170 }], 458: [function(g, C, i) {
  52072. var e = /Proc-Type: 4,ENCRYPTED[\n\r]+DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)[\n\r]+([0-9A-z\n\r+/=]+)[\n\r]+/m, A = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----/m, s = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----([0-9A-z\n\r+/=]+)-----END \1-----$/m, l = g("evp_bytestokey"), n = g("browserify-aes"), a = g("safe-buffer").Buffer;
  52073. C.exports = function(d, o) {
  52074. var c, r = d.toString(), h = r.match(e);
  52075. if (h) {
  52076. var b = "aes" + h[1], u = a.from(h[2], "hex"), m = a.from(h[3].replace(/[\r\n]/g, ""), "base64"), Z = l(o, u.slice(0, 8), parseInt(h[1], 10)).key, p = [], Y = n.createDecipheriv(b, Z, u);
  52077. p.push(Y.update(m)), p.push(Y.final()), c = a.concat(p);
  52078. } else {
  52079. var R = r.match(s);
  52080. c = a.from(R[2].replace(/[\r\n]/g, ""), "base64");
  52081. }
  52082. return { tag: r.match(A)[1], data: c };
  52083. };
  52084. }, { "browserify-aes": 191, evp_bytestokey: 423, "safe-buffer": 494 }], 459: [function(g, C, i) {
  52085. var e = g("./asn1"), A = g("./aesid.json"), s = g("./fixProc"), l = g("browserify-aes"), n = g("pbkdf2"), a = g("safe-buffer").Buffer;
  52086. function d(o) {
  52087. var c;
  52088. typeof o != "object" || a.isBuffer(o) || (c = o.passphrase, o = o.key), typeof o == "string" && (o = a.from(o));
  52089. var r, h, b = s(o, c), u = b.tag, m = b.data;
  52090. switch (u) {
  52091. case "CERTIFICATE":
  52092. h = e.certificate.decode(m, "der").tbsCertificate.subjectPublicKeyInfo;
  52093. case "PUBLIC KEY":
  52094. switch (h || (h = e.PublicKey.decode(m, "der")), r = h.algorithm.algorithm.join(".")) {
  52095. case "1.2.840.113549.1.1.1":
  52096. return e.RSAPublicKey.decode(h.subjectPublicKey.data, "der");
  52097. case "1.2.840.10045.2.1":
  52098. return h.subjectPrivateKey = h.subjectPublicKey, { type: "ec", data: h };
  52099. case "1.2.840.10040.4.1":
  52100. return h.algorithm.params.pub_key = e.DSAparam.decode(h.subjectPublicKey.data, "der"), { type: "dsa", data: h.algorithm.params };
  52101. default:
  52102. throw new Error("unknown key id " + r);
  52103. }
  52104. case "ENCRYPTED PRIVATE KEY":
  52105. m = function(Z, p) {
  52106. var Y = Z.algorithm.decrypt.kde.kdeparams.salt, R = parseInt(Z.algorithm.decrypt.kde.kdeparams.iters.toString(), 10), X = A[Z.algorithm.decrypt.cipher.algo.join(".")], H = Z.algorithm.decrypt.cipher.iv, S = Z.subjectPrivateKey, z = parseInt(X.split("-")[1], 10) / 8, v = n.pbkdf2Sync(p, Y, R, z, "sha1"), K = l.createDecipheriv(X, v, H), V = [];
  52107. return V.push(K.update(S)), V.push(K.final()), a.concat(V);
  52108. }(m = e.EncryptedPrivateKey.decode(m, "der"), c);
  52109. case "PRIVATE KEY":
  52110. switch (r = (h = e.PrivateKey.decode(m, "der")).algorithm.algorithm.join(".")) {
  52111. case "1.2.840.113549.1.1.1":
  52112. return e.RSAPrivateKey.decode(h.subjectPrivateKey, "der");
  52113. case "1.2.840.10045.2.1":
  52114. return { curve: h.algorithm.curve, privateKey: e.ECPrivateKey.decode(h.subjectPrivateKey, "der").privateKey };
  52115. case "1.2.840.10040.4.1":
  52116. return h.algorithm.params.priv_key = e.DSAparam.decode(h.subjectPrivateKey, "der"), { type: "dsa", params: h.algorithm.params };
  52117. default:
  52118. throw new Error("unknown key id " + r);
  52119. }
  52120. case "RSA PUBLIC KEY":
  52121. return e.RSAPublicKey.decode(m, "der");
  52122. case "RSA PRIVATE KEY":
  52123. return e.RSAPrivateKey.decode(m, "der");
  52124. case "DSA PRIVATE KEY":
  52125. return { type: "dsa", params: e.DSAPrivateKey.decode(m, "der") };
  52126. case "EC PRIVATE KEY":
  52127. return { curve: (m = e.ECPrivateKey.decode(m, "der")).parameters.value, privateKey: m.privateKey };
  52128. default:
  52129. throw new Error("unknown key type " + u);
  52130. }
  52131. }
  52132. C.exports = d, d.signature = e.signature;
  52133. }, { "./aesid.json": 455, "./asn1": 456, "./fixProc": 458, "browserify-aes": 191, pbkdf2: 460, "safe-buffer": 494 }], 460: [function(g, C, i) {
  52134. i.pbkdf2 = g("./lib/async"), i.pbkdf2Sync = g("./lib/sync");
  52135. }, { "./lib/async": 461, "./lib/sync": 464 }], 461: [function(g, C, i) {
  52136. (function(e) {
  52137. (function() {
  52138. var A, s, l = g("safe-buffer").Buffer, n = g("./precondition"), a = g("./default-encoding"), d = g("./sync"), o = g("./to-buffer"), c = e.crypto && e.crypto.subtle, r = { sha: "SHA-1", "sha-1": "SHA-1", sha1: "SHA-1", sha256: "SHA-256", "sha-256": "SHA-256", sha384: "SHA-384", "sha-384": "SHA-384", "sha-512": "SHA-512", sha512: "SHA-512" }, h = [];
  52139. function b() {
  52140. return s || (s = e.process && e.process.nextTick ? e.process.nextTick : e.queueMicrotask ? e.queueMicrotask : e.setImmediate ? e.setImmediate : e.setTimeout);
  52141. }
  52142. function u(m, Z, p, Y, R) {
  52143. return c.importKey("raw", m, { name: "PBKDF2" }, !1, ["deriveBits"]).then(function(X) {
  52144. return c.deriveBits({ name: "PBKDF2", salt: Z, iterations: p, hash: { name: R } }, X, Y << 3);
  52145. }).then(function(X) {
  52146. return l.from(X);
  52147. });
  52148. }
  52149. C.exports = function(m, Z, p, Y, R, X) {
  52150. typeof R == "function" && (X = R, R = void 0);
  52151. var H = r[(R = R || "sha1").toLowerCase()];
  52152. if (H && typeof e.Promise == "function") {
  52153. if (n(p, Y), m = o(m, a, "Password"), Z = o(Z, a, "Salt"), typeof X != "function") throw new Error("No callback provided to pbkdf2");
  52154. (function(S, z) {
  52155. S.then(function(v) {
  52156. b()(function() {
  52157. z(null, v);
  52158. });
  52159. }, function(v) {
  52160. b()(function() {
  52161. z(v);
  52162. });
  52163. });
  52164. })(function(S) {
  52165. if (e.process && !e.process.browser || !c || !c.importKey || !c.deriveBits) return Promise.resolve(!1);
  52166. if (h[S] !== void 0) return h[S];
  52167. var z = u(A = A || l.alloc(8), A, 10, 128, S).then(function() {
  52168. return !0;
  52169. }).catch(function() {
  52170. return !1;
  52171. });
  52172. return h[S] = z, z;
  52173. }(H).then(function(S) {
  52174. return S ? u(m, Z, p, Y, H) : d(m, Z, p, Y, R);
  52175. }), X);
  52176. } else b()(function() {
  52177. var S;
  52178. try {
  52179. S = d(m, Z, p, Y, R);
  52180. } catch (z) {
  52181. return X(z);
  52182. }
  52183. X(null, S);
  52184. });
  52185. };
  52186. }).call(this);
  52187. }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  52188. }, { "./default-encoding": 462, "./precondition": 463, "./sync": 464, "./to-buffer": 465, "safe-buffer": 494 }], 462: [function(g, C, i) {
  52189. (function(e, A) {
  52190. (function() {
  52191. var s;
  52192. A.process && A.process.browser ? s = "utf-8" : A.process && A.process.version ? s = parseInt(e.version.split(".")[0].slice(1), 10) >= 6 ? "utf-8" : "binary" : s = "utf-8", C.exports = s;
  52193. }).call(this);
  52194. }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  52195. }, { _process: 467 }], 463: [function(g, C, i) {
  52196. var e = Math.pow(2, 30) - 1;
  52197. C.exports = function(A, s) {
  52198. if (typeof A != "number") throw new TypeError("Iterations not a number");
  52199. if (A < 0) throw new TypeError("Bad iterations");
  52200. if (typeof s != "number") throw new TypeError("Key length not a number");
  52201. if (s < 0 || s > e || s != s) throw new TypeError("Bad key length");
  52202. };
  52203. }, {}], 464: [function(g, C, i) {
  52204. var e = g("create-hash/md5"), A = g("ripemd160"), s = g("sha.js"), l = g("safe-buffer").Buffer, n = g("./precondition"), a = g("./default-encoding"), d = g("./to-buffer"), o = l.alloc(128), c = { md5: 16, sha1: 20, sha224: 28, sha256: 32, sha384: 48, sha512: 64, rmd160: 20, ripemd160: 20 };
  52205. function r(h, b, u) {
  52206. var m = /* @__PURE__ */ function(H) {
  52207. function S(z) {
  52208. return s(H).update(z).digest();
  52209. }
  52210. return H === "rmd160" || H === "ripemd160" ? function(z) {
  52211. return new A().update(z).digest();
  52212. } : H === "md5" ? e : S;
  52213. }(h), Z = h === "sha512" || h === "sha384" ? 128 : 64;
  52214. b.length > Z ? b = m(b) : b.length < Z && (b = l.concat([b, o], Z));
  52215. for (var p = l.allocUnsafe(Z + c[h]), Y = l.allocUnsafe(Z + c[h]), R = 0; R < Z; R++) p[R] = 54 ^ b[R], Y[R] = 92 ^ b[R];
  52216. var X = l.allocUnsafe(Z + u + 4);
  52217. p.copy(X, 0, 0, Z), this.ipad1 = X, this.ipad2 = p, this.opad = Y, this.alg = h, this.blocksize = Z, this.hash = m, this.size = c[h];
  52218. }
  52219. r.prototype.run = function(h, b) {
  52220. return h.copy(b, this.blocksize), this.hash(b).copy(this.opad, this.blocksize), this.hash(this.opad);
  52221. }, C.exports = function(h, b, u, m, Z) {
  52222. n(u, m);
  52223. var p = new r(Z = Z || "sha1", h = d(h, a, "Password"), (b = d(b, a, "Salt")).length), Y = l.allocUnsafe(m), R = l.allocUnsafe(b.length + 4);
  52224. b.copy(R, 0, 0, b.length);
  52225. for (var X = 0, H = c[Z], S = Math.ceil(m / H), z = 1; z <= S; z++) {
  52226. R.writeUInt32BE(z, b.length);
  52227. for (var v = p.run(R, p.ipad1), K = v, V = 1; V < u; V++) {
  52228. K = p.run(K, p.ipad2);
  52229. for (var N = 0; N < H; N++) v[N] ^= K[N];
  52230. }
  52231. v.copy(Y, X), X += H;
  52232. }
  52233. return Y;
  52234. };
  52235. }, { "./default-encoding": 462, "./precondition": 463, "./to-buffer": 465, "create-hash/md5": 387, ripemd160: 493, "safe-buffer": 494, "sha.js": 498 }], 465: [function(g, C, i) {
  52236. var e = g("safe-buffer").Buffer;
  52237. C.exports = function(A, s, l) {
  52238. if (e.isBuffer(A)) return A;
  52239. if (typeof A == "string") return e.from(A, s);
  52240. if (ArrayBuffer.isView(A)) return e.from(A.buffer);
  52241. throw new TypeError(l + " must be a string, a Buffer, a typed array or a DataView");
  52242. };
  52243. }, { "safe-buffer": 494 }], 466: [function(g, C, i) {
  52244. (function(e) {
  52245. (function() {
  52246. e === void 0 || !e.version || e.version.indexOf("v0.") === 0 || e.version.indexOf("v1.") === 0 && e.version.indexOf("v1.8.") !== 0 ? C.exports = { nextTick: function(A, s, l, n) {
  52247. if (typeof A != "function") throw new TypeError('"callback" argument must be a function');
  52248. var a, d, o = arguments.length;
  52249. switch (o) {
  52250. case 0:
  52251. case 1:
  52252. return e.nextTick(A);
  52253. case 2:
  52254. return e.nextTick(function() {
  52255. A.call(null, s);
  52256. });
  52257. case 3:
  52258. return e.nextTick(function() {
  52259. A.call(null, s, l);
  52260. });
  52261. case 4:
  52262. return e.nextTick(function() {
  52263. A.call(null, s, l, n);
  52264. });
  52265. default:
  52266. for (a = new Array(o - 1), d = 0; d < a.length; ) a[d++] = arguments[d];
  52267. return e.nextTick(function() {
  52268. A.apply(null, a);
  52269. });
  52270. }
  52271. } } : C.exports = e;
  52272. }).call(this);
  52273. }).call(this, g("_process"));
  52274. }, { _process: 467 }], 467: [function(g, C, i) {
  52275. var e, A, s = C.exports = {};
  52276. function l() {
  52277. throw new Error("setTimeout has not been defined");
  52278. }
  52279. function n() {
  52280. throw new Error("clearTimeout has not been defined");
  52281. }
  52282. function a(Z) {
  52283. if (e === setTimeout) return setTimeout(Z, 0);
  52284. if ((e === l || !e) && setTimeout) return e = setTimeout, setTimeout(Z, 0);
  52285. try {
  52286. return e(Z, 0);
  52287. } catch {
  52288. try {
  52289. return e.call(null, Z, 0);
  52290. } catch {
  52291. return e.call(this, Z, 0);
  52292. }
  52293. }
  52294. }
  52295. (function() {
  52296. try {
  52297. e = typeof setTimeout == "function" ? setTimeout : l;
  52298. } catch {
  52299. e = l;
  52300. }
  52301. try {
  52302. A = typeof clearTimeout == "function" ? clearTimeout : n;
  52303. } catch {
  52304. A = n;
  52305. }
  52306. })();
  52307. var d, o = [], c = !1, r = -1;
  52308. function h() {
  52309. c && d && (c = !1, d.length ? o = d.concat(o) : r = -1, o.length && b());
  52310. }
  52311. function b() {
  52312. if (!c) {
  52313. var Z = a(h);
  52314. c = !0;
  52315. for (var p = o.length; p; ) {
  52316. for (d = o, o = []; ++r < p; ) d && d[r].run();
  52317. r = -1, p = o.length;
  52318. }
  52319. d = null, c = !1, function(Y) {
  52320. if (A === clearTimeout) return clearTimeout(Y);
  52321. if ((A === n || !A) && clearTimeout) return A = clearTimeout, clearTimeout(Y);
  52322. try {
  52323. A(Y);
  52324. } catch {
  52325. try {
  52326. return A.call(null, Y);
  52327. } catch {
  52328. return A.call(this, Y);
  52329. }
  52330. }
  52331. }(Z);
  52332. }
  52333. }
  52334. function u(Z, p) {
  52335. this.fun = Z, this.array = p;
  52336. }
  52337. function m() {
  52338. }
  52339. s.nextTick = function(Z) {
  52340. var p = new Array(arguments.length - 1);
  52341. if (arguments.length > 1) for (var Y = 1; Y < arguments.length; Y++) p[Y - 1] = arguments[Y];
  52342. o.push(new u(Z, p)), o.length !== 1 || c || a(b);
  52343. }, u.prototype.run = function() {
  52344. this.fun.apply(null, this.array);
  52345. }, s.title = "browser", s.browser = !0, s.env = {}, s.argv = [], s.version = "", s.versions = {}, s.on = m, s.addListener = m, s.once = m, s.off = m, s.removeListener = m, s.removeAllListeners = m, s.emit = m, s.prependListener = m, s.prependOnceListener = m, s.listeners = function(Z) {
  52346. return [];
  52347. }, s.binding = function(Z) {
  52348. throw new Error("process.binding is not supported");
  52349. }, s.cwd = function() {
  52350. return "/";
  52351. }, s.chdir = function(Z) {
  52352. throw new Error("process.chdir is not supported");
  52353. }, s.umask = function() {
  52354. return 0;
  52355. };
  52356. }, {}], 468: [function(g, C, i) {
  52357. i.publicEncrypt = g("./publicEncrypt"), i.privateDecrypt = g("./privateDecrypt"), i.privateEncrypt = function(e, A) {
  52358. return i.publicEncrypt(e, A, !0);
  52359. }, i.publicDecrypt = function(e, A) {
  52360. return i.privateDecrypt(e, A, !0);
  52361. };
  52362. }, { "./privateDecrypt": 471, "./publicEncrypt": 472 }], 469: [function(g, C, i) {
  52363. var e = g("create-hash"), A = g("safe-buffer").Buffer;
  52364. function s(l) {
  52365. var n = A.allocUnsafe(4);
  52366. return n.writeUInt32BE(l, 0), n;
  52367. }
  52368. C.exports = function(l, n) {
  52369. for (var a, d = A.alloc(0), o = 0; d.length < n; ) a = s(o++), d = A.concat([d, e("sha1").update(l).update(a).digest()]);
  52370. return d.slice(0, n);
  52371. };
  52372. }, { "create-hash": 386, "safe-buffer": 494 }], 470: [function(g, C, i) {
  52373. arguments[4][184][0].apply(i, arguments);
  52374. }, { buffer: 188, dup: 184 }], 471: [function(g, C, i) {
  52375. var e = g("parse-asn1"), A = g("./mgf"), s = g("./xor"), l = g("bn.js"), n = g("browserify-rsa"), a = g("create-hash"), d = g("./withPublic"), o = g("safe-buffer").Buffer;
  52376. C.exports = function(c, r, h) {
  52377. var b;
  52378. b = c.padding ? c.padding : h ? 1 : 4;
  52379. var u, m = e(c), Z = m.modulus.byteLength();
  52380. if (r.length > Z || new l(r).cmp(m.modulus) >= 0) throw new Error("decryption error");
  52381. u = h ? d(new l(r), m) : n(r, m);
  52382. var p = o.alloc(Z - u.length);
  52383. if (u = o.concat([p, u], Z), b === 4) return function(Y, R) {
  52384. var X = Y.modulus.byteLength(), H = a("sha1").update(o.alloc(0)).digest(), S = H.length;
  52385. if (R[0] !== 0) throw new Error("decryption error");
  52386. var z = R.slice(1, S + 1), v = R.slice(S + 1), K = s(z, A(v, S)), V = s(v, A(K, X - S - 1));
  52387. if (function(B, G) {
  52388. B = o.from(B), G = o.from(G);
  52389. var w = 0, W = B.length;
  52390. B.length !== G.length && (w++, W = Math.min(B.length, G.length));
  52391. for (var y = -1; ++y < W; ) w += B[y] ^ G[y];
  52392. return w;
  52393. }(H, V.slice(0, S))) throw new Error("decryption error");
  52394. for (var N = S; V[N] === 0; ) N++;
  52395. if (V[N++] !== 1) throw new Error("decryption error");
  52396. return V.slice(N);
  52397. }(m, u);
  52398. if (b === 1) return function(Y, R, X) {
  52399. for (var H = R.slice(0, 2), S = 2, z = 0; R[S++] !== 0; ) if (S >= R.length) {
  52400. z++;
  52401. break;
  52402. }
  52403. var v = R.slice(2, S - 1);
  52404. if ((H.toString("hex") !== "0002" && !X || H.toString("hex") !== "0001" && X) && z++, v.length < 8 && z++, z) throw new Error("decryption error");
  52405. return R.slice(S);
  52406. }(0, u, h);
  52407. if (b === 3) return u;
  52408. throw new Error("unknown padding");
  52409. };
  52410. }, { "./mgf": 469, "./withPublic": 473, "./xor": 474, "bn.js": 470, "browserify-rsa": 209, "create-hash": 386, "parse-asn1": 459, "safe-buffer": 494 }], 472: [function(g, C, i) {
  52411. var e = g("parse-asn1"), A = g("randombytes"), s = g("create-hash"), l = g("./mgf"), n = g("./xor"), a = g("bn.js"), d = g("./withPublic"), o = g("browserify-rsa"), c = g("safe-buffer").Buffer;
  52412. C.exports = function(r, h, b) {
  52413. var u;
  52414. u = r.padding ? r.padding : b ? 1 : 4;
  52415. var m, Z = e(r);
  52416. if (u === 4) m = function(p, Y) {
  52417. var R = p.modulus.byteLength(), X = Y.length, H = s("sha1").update(c.alloc(0)).digest(), S = H.length, z = 2 * S;
  52418. if (X > R - z - 2) throw new Error("message too long");
  52419. var v = c.alloc(R - X - z - 2), K = R - S - 1, V = A(S), N = n(c.concat([H, v, c.alloc(1, 1), Y], K), l(V, K)), B = n(V, l(N, S));
  52420. return new a(c.concat([c.alloc(1), B, N], R));
  52421. }(Z, h);
  52422. else if (u === 1) m = function(p, Y, R) {
  52423. var X, H = Y.length, S = p.modulus.byteLength();
  52424. if (H > S - 11) throw new Error("message too long");
  52425. return X = R ? c.alloc(S - H - 3, 255) : function(z) {
  52426. for (var v, K = c.allocUnsafe(z), V = 0, N = A(2 * z), B = 0; V < z; ) B === N.length && (N = A(2 * z), B = 0), (v = N[B++]) && (K[V++] = v);
  52427. return K;
  52428. }(S - H - 3), new a(c.concat([c.from([0, R ? 1 : 2]), X, c.alloc(1), Y], S));
  52429. }(Z, h, b);
  52430. else {
  52431. if (u !== 3) throw new Error("unknown padding");
  52432. if ((m = new a(h)).cmp(Z.modulus) >= 0) throw new Error("data too long for modulus");
  52433. }
  52434. return b ? o(m, Z) : d(m, Z);
  52435. };
  52436. }, { "./mgf": 469, "./withPublic": 473, "./xor": 474, "bn.js": 470, "browserify-rsa": 209, "create-hash": 386, "parse-asn1": 459, randombytes: 475, "safe-buffer": 494 }], 473: [function(g, C, i) {
  52437. var e = g("bn.js"), A = g("safe-buffer").Buffer;
  52438. C.exports = function(s, l) {
  52439. return A.from(s.toRed(e.mont(l.modulus)).redPow(new e(l.publicExponent)).fromRed().toArray());
  52440. };
  52441. }, { "bn.js": 470, "safe-buffer": 494 }], 474: [function(g, C, i) {
  52442. C.exports = function(e, A) {
  52443. for (var s = e.length, l = -1; ++l < s; ) e[l] ^= A[l];
  52444. return e;
  52445. };
  52446. }, {}], 475: [function(g, C, i) {
  52447. (function(e, A) {
  52448. (function() {
  52449. var s = g("safe-buffer").Buffer, l = A.crypto || A.msCrypto;
  52450. l && l.getRandomValues ? C.exports = function(n, a) {
  52451. if (n > 4294967295) throw new RangeError("requested too many random bytes");
  52452. var d = s.allocUnsafe(n);
  52453. if (n > 0) if (n > 65536) for (var o = 0; o < n; o += 65536) l.getRandomValues(d.slice(o, o + 65536));
  52454. else l.getRandomValues(d);
  52455. return typeof a == "function" ? e.nextTick(function() {
  52456. a(null, d);
  52457. }) : d;
  52458. } : C.exports = function() {
  52459. throw new Error(`Secure random number generation is not supported by this browser.
  52460. Use Chrome, Firefox or Internet Explorer 11`);
  52461. };
  52462. }).call(this);
  52463. }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  52464. }, { _process: 467, "safe-buffer": 494 }], 476: [function(g, C, i) {
  52465. (function(e, A) {
  52466. (function() {
  52467. function s() {
  52468. throw new Error(`secure random number generation not supported by this browser
  52469. use chrome, FireFox or Internet Explorer 11`);
  52470. }
  52471. var l = g("safe-buffer"), n = g("randombytes"), a = l.Buffer, d = l.kMaxLength, o = A.crypto || A.msCrypto, c = Math.pow(2, 32) - 1;
  52472. function r(u, m) {
  52473. if (typeof u != "number" || u != u) throw new TypeError("offset must be a number");
  52474. if (u > c || u < 0) throw new TypeError("offset must be a uint32");
  52475. if (u > d || u > m) throw new RangeError("offset out of range");
  52476. }
  52477. function h(u, m, Z) {
  52478. if (typeof u != "number" || u != u) throw new TypeError("size must be a number");
  52479. if (u > c || u < 0) throw new TypeError("size must be a uint32");
  52480. if (u + m > Z || u > d) throw new RangeError("buffer too small");
  52481. }
  52482. function b(u, m, Z, p) {
  52483. if (e.browser) {
  52484. var Y = u.buffer, R = new Uint8Array(Y, m, Z);
  52485. return o.getRandomValues(R), p ? void e.nextTick(function() {
  52486. p(null, u);
  52487. }) : u;
  52488. }
  52489. if (!p) return n(Z).copy(u, m), u;
  52490. n(Z, function(X, H) {
  52491. if (X) return p(X);
  52492. H.copy(u, m), p(null, u);
  52493. });
  52494. }
  52495. o && o.getRandomValues || !e.browser ? (i.randomFill = function(u, m, Z, p) {
  52496. if (!(a.isBuffer(u) || u instanceof A.Uint8Array)) throw new TypeError('"buf" argument must be a Buffer or Uint8Array');
  52497. if (typeof m == "function") p = m, m = 0, Z = u.length;
  52498. else if (typeof Z == "function") p = Z, Z = u.length - m;
  52499. else if (typeof p != "function") throw new TypeError('"cb" argument must be a function');
  52500. return r(m, u.length), h(Z, m, u.length), b(u, m, Z, p);
  52501. }, i.randomFillSync = function(u, m, Z) {
  52502. if (m === void 0 && (m = 0), !(a.isBuffer(u) || u instanceof A.Uint8Array)) throw new TypeError('"buf" argument must be a Buffer or Uint8Array');
  52503. return r(m, u.length), Z === void 0 && (Z = u.length - m), h(Z, m, u.length), b(u, m, Z);
  52504. }) : (i.randomFill = s, i.randomFillSync = s);
  52505. }).call(this);
  52506. }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  52507. }, { _process: 467, randombytes: 475, "safe-buffer": 494 }], 477: [function(g, C, i) {
  52508. var e = {};
  52509. function A(l, n, a) {
  52510. a || (a = Error);
  52511. var d = function(o) {
  52512. var c, r;
  52513. function h(b, u, m) {
  52514. return o.call(this, function(Z, p, Y) {
  52515. return typeof n == "string" ? n : n(Z, p, Y);
  52516. }(b, u, m)) || this;
  52517. }
  52518. return r = o, (c = h).prototype = Object.create(r.prototype), c.prototype.constructor = c, c.__proto__ = r, h;
  52519. }(a);
  52520. d.prototype.name = a.name, d.prototype.code = l, e[l] = d;
  52521. }
  52522. function s(l, n) {
  52523. if (Array.isArray(l)) {
  52524. var a = l.length;
  52525. return l = l.map(function(d) {
  52526. return String(d);
  52527. }), a > 2 ? "one of ".concat(n, " ").concat(l.slice(0, a - 1).join(", "), ", or ") + l[a - 1] : a === 2 ? "one of ".concat(n, " ").concat(l[0], " or ").concat(l[1]) : "of ".concat(n, " ").concat(l[0]);
  52528. }
  52529. return "of ".concat(n, " ").concat(String(l));
  52530. }
  52531. A("ERR_INVALID_OPT_VALUE", function(l, n) {
  52532. return 'The value "' + n + '" is invalid for option "' + l + '"';
  52533. }, TypeError), A("ERR_INVALID_ARG_TYPE", function(l, n, a) {
  52534. var d, o, c;
  52535. if (typeof n == "string" && (o = "not ", n.substr(0, o.length) === o) ? (d = "must not be", n = n.replace(/^not /, "")) : d = "must be", function(h, b, u) {
  52536. return (u === void 0 || u > h.length) && (u = h.length), h.substring(u - b.length, u) === b;
  52537. }(l, " argument")) c = "The ".concat(l, " ").concat(d, " ").concat(s(n, "type"));
  52538. else {
  52539. var r = function(h, b, u) {
  52540. return typeof u != "number" && (u = 0), !(u + b.length > h.length) && h.indexOf(b, u) !== -1;
  52541. }(l, ".") ? "property" : "argument";
  52542. c = 'The "'.concat(l, '" ').concat(r, " ").concat(d, " ").concat(s(n, "type"));
  52543. }
  52544. return c += ". Received type ".concat(typeof a);
  52545. }, TypeError), A("ERR_STREAM_PUSH_AFTER_EOF", "stream.push() after EOF"), A("ERR_METHOD_NOT_IMPLEMENTED", function(l) {
  52546. return "The " + l + " method is not implemented";
  52547. }), A("ERR_STREAM_PREMATURE_CLOSE", "Premature close"), A("ERR_STREAM_DESTROYED", function(l) {
  52548. return "Cannot call " + l + " after a stream was destroyed";
  52549. }), A("ERR_MULTIPLE_CALLBACK", "Callback called multiple times"), A("ERR_STREAM_CANNOT_PIPE", "Cannot pipe, not readable"), A("ERR_STREAM_WRITE_AFTER_END", "write after end"), A("ERR_STREAM_NULL_VALUES", "May not write null values to stream", TypeError), A("ERR_UNKNOWN_ENCODING", function(l) {
  52550. return "Unknown encoding: " + l;
  52551. }, TypeError), A("ERR_STREAM_UNSHIFT_AFTER_END_EVENT", "stream.unshift() after end event"), C.exports.codes = e;
  52552. }, {}], 478: [function(g, C, i) {
  52553. (function(e) {
  52554. (function() {
  52555. var A = Object.keys || function(h) {
  52556. var b = [];
  52557. for (var u in h) b.push(u);
  52558. return b;
  52559. };
  52560. C.exports = o;
  52561. var s = g("./_stream_readable"), l = g("./_stream_writable");
  52562. g("inherits")(o, s);
  52563. for (var n = A(l.prototype), a = 0; a < n.length; a++) {
  52564. var d = n[a];
  52565. o.prototype[d] || (o.prototype[d] = l.prototype[d]);
  52566. }
  52567. function o(h) {
  52568. if (!(this instanceof o)) return new o(h);
  52569. s.call(this, h), l.call(this, h), this.allowHalfOpen = !0, h && (h.readable === !1 && (this.readable = !1), h.writable === !1 && (this.writable = !1), h.allowHalfOpen === !1 && (this.allowHalfOpen = !1, this.once("end", c)));
  52570. }
  52571. function c() {
  52572. this._writableState.ended || e.nextTick(r, this);
  52573. }
  52574. function r(h) {
  52575. h.end();
  52576. }
  52577. Object.defineProperty(o.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
  52578. return this._writableState.highWaterMark;
  52579. } }), Object.defineProperty(o.prototype, "writableBuffer", { enumerable: !1, get: function() {
  52580. return this._writableState && this._writableState.getBuffer();
  52581. } }), Object.defineProperty(o.prototype, "writableLength", { enumerable: !1, get: function() {
  52582. return this._writableState.length;
  52583. } }), Object.defineProperty(o.prototype, "destroyed", { enumerable: !1, get: function() {
  52584. return this._readableState !== void 0 && this._writableState !== void 0 && this._readableState.destroyed && this._writableState.destroyed;
  52585. }, set: function(h) {
  52586. this._readableState !== void 0 && this._writableState !== void 0 && (this._readableState.destroyed = h, this._writableState.destroyed = h);
  52587. } });
  52588. }).call(this);
  52589. }).call(this, g("_process"));
  52590. }, { "./_stream_readable": 480, "./_stream_writable": 482, _process: 467, inherits: 440 }], 479: [function(g, C, i) {
  52591. C.exports = A;
  52592. var e = g("./_stream_transform");
  52593. function A(s) {
  52594. if (!(this instanceof A)) return new A(s);
  52595. e.call(this, s);
  52596. }
  52597. g("inherits")(A, e), A.prototype._transform = function(s, l, n) {
  52598. n(null, s);
  52599. };
  52600. }, { "./_stream_transform": 481, inherits: 440 }], 480: [function(g, C, i) {
  52601. (function(e, A) {
  52602. (function() {
  52603. var s;
  52604. C.exports = K, K.ReadableState = v, g("events").EventEmitter;
  52605. var l = function(J, k) {
  52606. return J.listeners(k).length;
  52607. }, n = g("./internal/streams/stream"), a = g("buffer").Buffer, d = (A !== void 0 ? A : typeof window < "u" ? window : typeof self < "u" ? self : {}).Uint8Array || function() {
  52608. }, o, c = g("util");
  52609. o = c && c.debuglog ? c.debuglog("stream") : function() {
  52610. };
  52611. var r, h, b, u = g("./internal/streams/buffer_list"), m = g("./internal/streams/destroy"), Z = g("./internal/streams/state").getHighWaterMark, p = g("../errors").codes, Y = p.ERR_INVALID_ARG_TYPE, R = p.ERR_STREAM_PUSH_AFTER_EOF, X = p.ERR_METHOD_NOT_IMPLEMENTED, H = p.ERR_STREAM_UNSHIFT_AFTER_END_EVENT;
  52612. g("inherits")(K, n);
  52613. var S = m.errorOrDestroy, z = ["error", "close", "destroy", "pause", "resume"];
  52614. function v(J, k, j) {
  52615. s = s || g("./_stream_duplex"), J = J || {}, typeof j != "boolean" && (j = k instanceof s), this.objectMode = !!J.objectMode, j && (this.objectMode = this.objectMode || !!J.readableObjectMode), this.highWaterMark = Z(this, J, "readableHighWaterMark", j), this.buffer = new u(), this.length = 0, this.pipes = null, this.pipesCount = 0, this.flowing = null, this.ended = !1, this.endEmitted = !1, this.reading = !1, this.sync = !0, this.needReadable = !1, this.emittedReadable = !1, this.readableListening = !1, this.resumeScheduled = !1, this.paused = !0, this.emitClose = J.emitClose !== !1, this.autoDestroy = !!J.autoDestroy, this.destroyed = !1, this.defaultEncoding = J.defaultEncoding || "utf8", this.awaitDrain = 0, this.readingMore = !1, this.decoder = null, this.encoding = null, J.encoding && (r || (r = g("string_decoder/").StringDecoder), this.decoder = new r(J.encoding), this.encoding = J.encoding);
  52616. }
  52617. function K(J) {
  52618. if (s = s || g("./_stream_duplex"), !(this instanceof K)) return new K(J);
  52619. var k = this instanceof s;
  52620. this._readableState = new v(J, this, k), this.readable = !0, J && (typeof J.read == "function" && (this._read = J.read), typeof J.destroy == "function" && (this._destroy = J.destroy)), n.call(this);
  52621. }
  52622. function V(J, k, j, q, Cg) {
  52623. o("readableAddChunk", k);
  52624. var Ig, x = J._readableState;
  52625. if (k === null) x.reading = !1, function(Ag, eg) {
  52626. if (o("onEofChunk"), !eg.ended) {
  52627. if (eg.decoder) {
  52628. var O = eg.decoder.end();
  52629. O && O.length && (eg.buffer.push(O), eg.length += eg.objectMode ? 1 : O.length);
  52630. }
  52631. eg.ended = !0, eg.sync ? G(Ag) : (eg.needReadable = !1, eg.emittedReadable || (eg.emittedReadable = !0, w(Ag)));
  52632. }
  52633. }(J, x);
  52634. else if (Cg || (Ig = function(Ag, eg) {
  52635. var O;
  52636. _ = eg, a.isBuffer(_) || _ instanceof d || typeof eg == "string" || eg === void 0 || Ag.objectMode || (O = new Y("chunk", ["string", "Buffer", "Uint8Array"], eg));
  52637. var _;
  52638. return O;
  52639. }(x, k)), Ig) S(J, Ig);
  52640. else if (x.objectMode || k && k.length > 0) if (typeof k == "string" || x.objectMode || Object.getPrototypeOf(k) === a.prototype || (k = function(Ag) {
  52641. return a.from(Ag);
  52642. }(k)), q) x.endEmitted ? S(J, new H()) : N(J, x, k, !0);
  52643. else if (x.ended) S(J, new R());
  52644. else {
  52645. if (x.destroyed) return !1;
  52646. x.reading = !1, x.decoder && !j ? (k = x.decoder.write(k), x.objectMode || k.length !== 0 ? N(J, x, k, !1) : W(J, x)) : N(J, x, k, !1);
  52647. }
  52648. else q || (x.reading = !1, W(J, x));
  52649. return !x.ended && (x.length < x.highWaterMark || x.length === 0);
  52650. }
  52651. function N(J, k, j, q) {
  52652. k.flowing && k.length === 0 && !k.sync ? (k.awaitDrain = 0, J.emit("data", j)) : (k.length += k.objectMode ? 1 : j.length, q ? k.buffer.unshift(j) : k.buffer.push(j), k.needReadable && G(J)), W(J, k);
  52653. }
  52654. Object.defineProperty(K.prototype, "destroyed", { enumerable: !1, get: function() {
  52655. return this._readableState !== void 0 && this._readableState.destroyed;
  52656. }, set: function(J) {
  52657. this._readableState && (this._readableState.destroyed = J);
  52658. } }), K.prototype.destroy = m.destroy, K.prototype._undestroy = m.undestroy, K.prototype._destroy = function(J, k) {
  52659. k(J);
  52660. }, K.prototype.push = function(J, k) {
  52661. var j, q = this._readableState;
  52662. return q.objectMode ? j = !0 : typeof J == "string" && ((k = k || q.defaultEncoding) !== q.encoding && (J = a.from(J, k), k = ""), j = !0), V(this, J, k, !1, j);
  52663. }, K.prototype.unshift = function(J) {
  52664. return V(this, J, null, !0, !1);
  52665. }, K.prototype.isPaused = function() {
  52666. return this._readableState.flowing === !1;
  52667. }, K.prototype.setEncoding = function(J) {
  52668. r || (r = g("string_decoder/").StringDecoder);
  52669. var k = new r(J);
  52670. this._readableState.decoder = k, this._readableState.encoding = this._readableState.decoder.encoding;
  52671. for (var j = this._readableState.buffer.head, q = ""; j !== null; ) q += k.write(j.data), j = j.next;
  52672. return this._readableState.buffer.clear(), q !== "" && this._readableState.buffer.push(q), this._readableState.length = q.length, this;
  52673. };
  52674. function B(J, k) {
  52675. return J <= 0 || k.length === 0 && k.ended ? 0 : k.objectMode ? 1 : J != J ? k.flowing && k.length ? k.buffer.head.data.length : k.length : (J > k.highWaterMark && (k.highWaterMark = function(j) {
  52676. return j >= 1073741824 ? j = 1073741824 : (j--, j |= j >>> 1, j |= j >>> 2, j |= j >>> 4, j |= j >>> 8, j |= j >>> 16, j++), j;
  52677. }(J)), J <= k.length ? J : k.ended ? k.length : (k.needReadable = !0, 0));
  52678. }
  52679. function G(J) {
  52680. var k = J._readableState;
  52681. o("emitReadable", k.needReadable, k.emittedReadable), k.needReadable = !1, k.emittedReadable || (o("emitReadable", k.flowing), k.emittedReadable = !0, e.nextTick(w, J));
  52682. }
  52683. function w(J) {
  52684. var k = J._readableState;
  52685. o("emitReadable_", k.destroyed, k.length, k.ended), k.destroyed || !k.length && !k.ended || (J.emit("readable"), k.emittedReadable = !1), k.needReadable = !k.flowing && !k.ended && k.length <= k.highWaterMark, T(J);
  52686. }
  52687. function W(J, k) {
  52688. k.readingMore || (k.readingMore = !0, e.nextTick(y, J, k));
  52689. }
  52690. function y(J, k) {
  52691. for (; !k.reading && !k.ended && (k.length < k.highWaterMark || k.flowing && k.length === 0); ) {
  52692. var j = k.length;
  52693. if (o("maybeReadMore read 0"), J.read(0), j === k.length) break;
  52694. }
  52695. k.readingMore = !1;
  52696. }
  52697. function f(J) {
  52698. var k = J._readableState;
  52699. k.readableListening = J.listenerCount("readable") > 0, k.resumeScheduled && !k.paused ? k.flowing = !0 : J.listenerCount("data") > 0 && J.resume();
  52700. }
  52701. function D(J) {
  52702. o("readable nexttick read 0"), J.read(0);
  52703. }
  52704. function F(J, k) {
  52705. o("resume", k.reading), k.reading || J.read(0), k.resumeScheduled = !1, J.emit("resume"), T(J), k.flowing && !k.reading && J.read(0);
  52706. }
  52707. function T(J) {
  52708. var k = J._readableState;
  52709. for (o("flow", k.flowing); k.flowing && J.read() !== null; ) ;
  52710. }
  52711. function Q(J, k) {
  52712. return k.length === 0 ? null : (k.objectMode ? j = k.buffer.shift() : !J || J >= k.length ? (j = k.decoder ? k.buffer.join("") : k.buffer.length === 1 ? k.buffer.first() : k.buffer.concat(k.length), k.buffer.clear()) : j = k.buffer.consume(J, k.decoder), j);
  52713. var j;
  52714. }
  52715. function P(J) {
  52716. var k = J._readableState;
  52717. o("endReadable", k.endEmitted), k.endEmitted || (k.ended = !0, e.nextTick(L, k, J));
  52718. }
  52719. function L(J, k) {
  52720. if (o("endReadableNT", J.endEmitted, J.length), !J.endEmitted && J.length === 0 && (J.endEmitted = !0, k.readable = !1, k.emit("end"), J.autoDestroy)) {
  52721. var j = k._writableState;
  52722. (!j || j.autoDestroy && j.finished) && k.destroy();
  52723. }
  52724. }
  52725. function E(J, k) {
  52726. for (var j = 0, q = J.length; j < q; j++) if (J[j] === k) return j;
  52727. return -1;
  52728. }
  52729. K.prototype.read = function(J) {
  52730. o("read", J), J = parseInt(J, 10);
  52731. var k = this._readableState, j = J;
  52732. if (J !== 0 && (k.emittedReadable = !1), J === 0 && k.needReadable && ((k.highWaterMark !== 0 ? k.length >= k.highWaterMark : k.length > 0) || k.ended)) return o("read: emitReadable", k.length, k.ended), k.length === 0 && k.ended ? P(this) : G(this), null;
  52733. if ((J = B(J, k)) === 0 && k.ended) return k.length === 0 && P(this), null;
  52734. var q, Cg = k.needReadable;
  52735. return o("need readable", Cg), (k.length === 0 || k.length - J < k.highWaterMark) && o("length less than watermark", Cg = !0), k.ended || k.reading ? o("reading or ended", Cg = !1) : Cg && (o("do read"), k.reading = !0, k.sync = !0, k.length === 0 && (k.needReadable = !0), this._read(k.highWaterMark), k.sync = !1, k.reading || (J = B(j, k))), (q = J > 0 ? Q(J, k) : null) === null ? (k.needReadable = k.length <= k.highWaterMark, J = 0) : (k.length -= J, k.awaitDrain = 0), k.length === 0 && (k.ended || (k.needReadable = !0), j !== J && k.ended && P(this)), q !== null && this.emit("data", q), q;
  52736. }, K.prototype._read = function(J) {
  52737. S(this, new X("_read()"));
  52738. }, K.prototype.pipe = function(J, k) {
  52739. var j = this, q = this._readableState;
  52740. switch (q.pipesCount) {
  52741. case 0:
  52742. q.pipes = J;
  52743. break;
  52744. case 1:
  52745. q.pipes = [q.pipes, J];
  52746. break;
  52747. default:
  52748. q.pipes.push(J);
  52749. }
  52750. q.pipesCount += 1, o("pipe count=%d opts=%j", q.pipesCount, k);
  52751. var Cg = (!k || k.end !== !1) && J !== e.stdout && J !== e.stderr ? x : ng;
  52752. function Ig(sg, og) {
  52753. o("onunpipe"), sg === j && og && og.hasUnpiped === !1 && (og.hasUnpiped = !0, o("cleanup"), J.removeListener("close", gg), J.removeListener("finish", lg), J.removeListener("drain", Ag), J.removeListener("error", _), J.removeListener("unpipe", Ig), j.removeListener("end", x), j.removeListener("end", ng), j.removeListener("data", O), eg = !0, !q.awaitDrain || J._writableState && !J._writableState.needDrain || Ag());
  52754. }
  52755. function x() {
  52756. o("onend"), J.end();
  52757. }
  52758. q.endEmitted ? e.nextTick(Cg) : j.once("end", Cg), J.on("unpipe", Ig);
  52759. var Ag = /* @__PURE__ */ function(sg) {
  52760. return function() {
  52761. var og = sg._readableState;
  52762. o("pipeOnDrain", og.awaitDrain), og.awaitDrain && og.awaitDrain--, og.awaitDrain === 0 && l(sg, "data") && (og.flowing = !0, T(sg));
  52763. };
  52764. }(j);
  52765. J.on("drain", Ag);
  52766. var eg = !1;
  52767. function O(sg) {
  52768. o("ondata");
  52769. var og = J.write(sg);
  52770. o("dest.write", og), og === !1 && ((q.pipesCount === 1 && q.pipes === J || q.pipesCount > 1 && E(q.pipes, J) !== -1) && !eg && (o("false write response, pause", q.awaitDrain), q.awaitDrain++), j.pause());
  52771. }
  52772. function _(sg) {
  52773. o("onerror", sg), ng(), J.removeListener("error", _), l(J, "error") === 0 && S(J, sg);
  52774. }
  52775. function gg() {
  52776. J.removeListener("finish", lg), ng();
  52777. }
  52778. function lg() {
  52779. o("onfinish"), J.removeListener("close", gg), ng();
  52780. }
  52781. function ng() {
  52782. o("unpipe"), j.unpipe(J);
  52783. }
  52784. return j.on("data", O), function(sg, og, cg) {
  52785. if (typeof sg.prependListener == "function") return sg.prependListener(og, cg);
  52786. sg._events && sg._events[og] ? Array.isArray(sg._events[og]) ? sg._events[og].unshift(cg) : sg._events[og] = [cg, sg._events[og]] : sg.on(og, cg);
  52787. }(J, "error", _), J.once("close", gg), J.once("finish", lg), J.emit("pipe", j), q.flowing || (o("pipe resume"), j.resume()), J;
  52788. }, K.prototype.unpipe = function(J) {
  52789. var k = this._readableState, j = { hasUnpiped: !1 };
  52790. if (k.pipesCount === 0) return this;
  52791. if (k.pipesCount === 1) return J && J !== k.pipes || (J || (J = k.pipes), k.pipes = null, k.pipesCount = 0, k.flowing = !1, J && J.emit("unpipe", this, j)), this;
  52792. if (!J) {
  52793. var q = k.pipes, Cg = k.pipesCount;
  52794. k.pipes = null, k.pipesCount = 0, k.flowing = !1;
  52795. for (var Ig = 0; Ig < Cg; Ig++) q[Ig].emit("unpipe", this, { hasUnpiped: !1 });
  52796. return this;
  52797. }
  52798. var x = E(k.pipes, J);
  52799. return x === -1 || (k.pipes.splice(x, 1), k.pipesCount -= 1, k.pipesCount === 1 && (k.pipes = k.pipes[0]), J.emit("unpipe", this, j)), this;
  52800. }, K.prototype.on = function(J, k) {
  52801. var j = n.prototype.on.call(this, J, k), q = this._readableState;
  52802. return J === "data" ? (q.readableListening = this.listenerCount("readable") > 0, q.flowing !== !1 && this.resume()) : J === "readable" && (q.endEmitted || q.readableListening || (q.readableListening = q.needReadable = !0, q.flowing = !1, q.emittedReadable = !1, o("on readable", q.length, q.reading), q.length ? G(this) : q.reading || e.nextTick(D, this))), j;
  52803. }, K.prototype.addListener = K.prototype.on, K.prototype.removeListener = function(J, k) {
  52804. var j = n.prototype.removeListener.call(this, J, k);
  52805. return J === "readable" && e.nextTick(f, this), j;
  52806. }, K.prototype.removeAllListeners = function(J) {
  52807. var k = n.prototype.removeAllListeners.apply(this, arguments);
  52808. return J !== "readable" && J !== void 0 || e.nextTick(f, this), k;
  52809. }, K.prototype.resume = function() {
  52810. var J = this._readableState;
  52811. return J.flowing || (o("resume"), J.flowing = !J.readableListening, function(k, j) {
  52812. j.resumeScheduled || (j.resumeScheduled = !0, e.nextTick(F, k, j));
  52813. }(this, J)), J.paused = !1, this;
  52814. }, K.prototype.pause = function() {
  52815. return o("call pause flowing=%j", this._readableState.flowing), this._readableState.flowing !== !1 && (o("pause"), this._readableState.flowing = !1, this.emit("pause")), this._readableState.paused = !0, this;
  52816. }, K.prototype.wrap = function(J) {
  52817. var k = this, j = this._readableState, q = !1;
  52818. for (var Cg in J.on("end", function() {
  52819. if (o("wrapped end"), j.decoder && !j.ended) {
  52820. var x = j.decoder.end();
  52821. x && x.length && k.push(x);
  52822. }
  52823. k.push(null);
  52824. }), J.on("data", function(x) {
  52825. o("wrapped data"), j.decoder && (x = j.decoder.write(x)), j.objectMode && x == null || (j.objectMode || x && x.length) && (k.push(x) || (q = !0, J.pause()));
  52826. }), J) this[Cg] === void 0 && typeof J[Cg] == "function" && (this[Cg] = /* @__PURE__ */ function(x) {
  52827. return function() {
  52828. return J[x].apply(J, arguments);
  52829. };
  52830. }(Cg));
  52831. for (var Ig = 0; Ig < z.length; Ig++) J.on(z[Ig], this.emit.bind(this, z[Ig]));
  52832. return this._read = function(x) {
  52833. o("wrapped _read", x), q && (q = !1, J.resume());
  52834. }, this;
  52835. }, typeof Symbol == "function" && (K.prototype[Symbol.asyncIterator] = function() {
  52836. return h === void 0 && (h = g("./internal/streams/async_iterator")), h(this);
  52837. }), Object.defineProperty(K.prototype, "readableHighWaterMark", { enumerable: !1, get: function() {
  52838. return this._readableState.highWaterMark;
  52839. } }), Object.defineProperty(K.prototype, "readableBuffer", { enumerable: !1, get: function() {
  52840. return this._readableState && this._readableState.buffer;
  52841. } }), Object.defineProperty(K.prototype, "readableFlowing", { enumerable: !1, get: function() {
  52842. return this._readableState.flowing;
  52843. }, set: function(J) {
  52844. this._readableState && (this._readableState.flowing = J);
  52845. } }), K._fromList = Q, Object.defineProperty(K.prototype, "readableLength", { enumerable: !1, get: function() {
  52846. return this._readableState.length;
  52847. } }), typeof Symbol == "function" && (K.from = function(J, k) {
  52848. return b === void 0 && (b = g("./internal/streams/from")), b(K, J, k);
  52849. });
  52850. }).call(this);
  52851. }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  52852. }, { "../errors": 477, "./_stream_duplex": 478, "./internal/streams/async_iterator": 483, "./internal/streams/buffer_list": 484, "./internal/streams/destroy": 485, "./internal/streams/from": 487, "./internal/streams/state": 489, "./internal/streams/stream": 490, _process: 467, buffer: 220, events: 422, inherits: 440, "string_decoder/": 522, util: 188 }], 481: [function(g, C, i) {
  52853. C.exports = o;
  52854. var e = g("../errors").codes, A = e.ERR_METHOD_NOT_IMPLEMENTED, s = e.ERR_MULTIPLE_CALLBACK, l = e.ERR_TRANSFORM_ALREADY_TRANSFORMING, n = e.ERR_TRANSFORM_WITH_LENGTH_0, a = g("./_stream_duplex");
  52855. function d(h, b) {
  52856. var u = this._transformState;
  52857. u.transforming = !1;
  52858. var m = u.writecb;
  52859. if (m === null) return this.emit("error", new s());
  52860. u.writechunk = null, u.writecb = null, b != null && this.push(b), m(h);
  52861. var Z = this._readableState;
  52862. Z.reading = !1, (Z.needReadable || Z.length < Z.highWaterMark) && this._read(Z.highWaterMark);
  52863. }
  52864. function o(h) {
  52865. if (!(this instanceof o)) return new o(h);
  52866. a.call(this, h), this._transformState = { afterTransform: d.bind(this), needTransform: !1, transforming: !1, writecb: null, writechunk: null, writeencoding: null }, this._readableState.needReadable = !0, this._readableState.sync = !1, h && (typeof h.transform == "function" && (this._transform = h.transform), typeof h.flush == "function" && (this._flush = h.flush)), this.on("prefinish", c);
  52867. }
  52868. function c() {
  52869. var h = this;
  52870. typeof this._flush != "function" || this._readableState.destroyed ? r(this, null, null) : this._flush(function(b, u) {
  52871. r(h, b, u);
  52872. });
  52873. }
  52874. function r(h, b, u) {
  52875. if (b) return h.emit("error", b);
  52876. if (u != null && h.push(u), h._writableState.length) throw new n();
  52877. if (h._transformState.transforming) throw new l();
  52878. return h.push(null);
  52879. }
  52880. g("inherits")(o, a), o.prototype.push = function(h, b) {
  52881. return this._transformState.needTransform = !1, a.prototype.push.call(this, h, b);
  52882. }, o.prototype._transform = function(h, b, u) {
  52883. u(new A("_transform()"));
  52884. }, o.prototype._write = function(h, b, u) {
  52885. var m = this._transformState;
  52886. if (m.writecb = u, m.writechunk = h, m.writeencoding = b, !m.transforming) {
  52887. var Z = this._readableState;
  52888. (m.needTransform || Z.needReadable || Z.length < Z.highWaterMark) && this._read(Z.highWaterMark);
  52889. }
  52890. }, o.prototype._read = function(h) {
  52891. var b = this._transformState;
  52892. b.writechunk === null || b.transforming ? b.needTransform = !0 : (b.transforming = !0, this._transform(b.writechunk, b.writeencoding, b.afterTransform));
  52893. }, o.prototype._destroy = function(h, b) {
  52894. a.prototype._destroy.call(this, h, function(u) {
  52895. b(u);
  52896. });
  52897. };
  52898. }, { "../errors": 477, "./_stream_duplex": 478, inherits: 440 }], 482: [function(g, C, i) {
  52899. (function(e, A) {
  52900. (function() {
  52901. function s(y) {
  52902. var f = this;
  52903. this.next = null, this.entry = null, this.finish = function() {
  52904. (function(D, F, T) {
  52905. var Q = D.entry;
  52906. for (D.entry = null; Q; ) {
  52907. var P = Q.callback;
  52908. F.pendingcb--, P(T), Q = Q.next;
  52909. }
  52910. F.corkedRequestsFree.next = D;
  52911. })(f, y);
  52912. };
  52913. }
  52914. var l;
  52915. C.exports = K, K.WritableState = v;
  52916. var n = { deprecate: g("util-deprecate") }, a = g("./internal/streams/stream"), d = g("buffer").Buffer, o = (A !== void 0 ? A : typeof window < "u" ? window : typeof self < "u" ? self : {}).Uint8Array || function() {
  52917. }, c, r = g("./internal/streams/destroy"), h = g("./internal/streams/state").getHighWaterMark, b = g("../errors").codes, u = b.ERR_INVALID_ARG_TYPE, m = b.ERR_METHOD_NOT_IMPLEMENTED, Z = b.ERR_MULTIPLE_CALLBACK, p = b.ERR_STREAM_CANNOT_PIPE, Y = b.ERR_STREAM_DESTROYED, R = b.ERR_STREAM_NULL_VALUES, X = b.ERR_STREAM_WRITE_AFTER_END, H = b.ERR_UNKNOWN_ENCODING, S = r.errorOrDestroy;
  52918. function z() {
  52919. }
  52920. function v(y, f, D) {
  52921. l = l || g("./_stream_duplex"), y = y || {}, typeof D != "boolean" && (D = f instanceof l), this.objectMode = !!y.objectMode, D && (this.objectMode = this.objectMode || !!y.writableObjectMode), this.highWaterMark = h(this, y, "writableHighWaterMark", D), this.finalCalled = !1, this.needDrain = !1, this.ending = !1, this.ended = !1, this.finished = !1, this.destroyed = !1;
  52922. var F = y.decodeStrings === !1;
  52923. this.decodeStrings = !F, this.defaultEncoding = y.defaultEncoding || "utf8", this.length = 0, this.writing = !1, this.corked = 0, this.sync = !0, this.bufferProcessing = !1, this.onwrite = function(T) {
  52924. (function(Q, P) {
  52925. var L = Q._writableState, E = L.sync, J = L.writecb;
  52926. if (typeof J != "function") throw new Z();
  52927. if (function(j) {
  52928. j.writing = !1, j.writecb = null, j.length -= j.writelen, j.writelen = 0;
  52929. }(L), P) (function(j, q, Cg, Ig, x) {
  52930. --q.pendingcb, Cg ? (e.nextTick(x, Ig), e.nextTick(W, j, q), j._writableState.errorEmitted = !0, S(j, Ig)) : (x(Ig), j._writableState.errorEmitted = !0, S(j, Ig), W(j, q));
  52931. })(Q, L, E, P, J);
  52932. else {
  52933. var k = G(L) || Q.destroyed;
  52934. k || L.corked || L.bufferProcessing || !L.bufferedRequest || B(Q, L), E ? e.nextTick(N, Q, L, k, J) : N(Q, L, k, J);
  52935. }
  52936. })(f, T);
  52937. }, this.writecb = null, this.writelen = 0, this.bufferedRequest = null, this.lastBufferedRequest = null, this.pendingcb = 0, this.prefinished = !1, this.errorEmitted = !1, this.emitClose = y.emitClose !== !1, this.autoDestroy = !!y.autoDestroy, this.bufferedRequestCount = 0, this.corkedRequestsFree = new s(this);
  52938. }
  52939. function K(y) {
  52940. var f = this instanceof (l = l || g("./_stream_duplex"));
  52941. if (!f && !c.call(K, this)) return new K(y);
  52942. this._writableState = new v(y, this, f), this.writable = !0, y && (typeof y.write == "function" && (this._write = y.write), typeof y.writev == "function" && (this._writev = y.writev), typeof y.destroy == "function" && (this._destroy = y.destroy), typeof y.final == "function" && (this._final = y.final)), a.call(this);
  52943. }
  52944. function V(y, f, D, F, T, Q, P) {
  52945. f.writelen = F, f.writecb = P, f.writing = !0, f.sync = !0, f.destroyed ? f.onwrite(new Y("write")) : D ? y._writev(T, f.onwrite) : y._write(T, Q, f.onwrite), f.sync = !1;
  52946. }
  52947. function N(y, f, D, F) {
  52948. D || function(T, Q) {
  52949. Q.length === 0 && Q.needDrain && (Q.needDrain = !1, T.emit("drain"));
  52950. }(y, f), f.pendingcb--, F(), W(y, f);
  52951. }
  52952. function B(y, f) {
  52953. f.bufferProcessing = !0;
  52954. var D = f.bufferedRequest;
  52955. if (y._writev && D && D.next) {
  52956. var F = f.bufferedRequestCount, T = new Array(F), Q = f.corkedRequestsFree;
  52957. Q.entry = D;
  52958. for (var P = 0, L = !0; D; ) T[P] = D, D.isBuf || (L = !1), D = D.next, P += 1;
  52959. T.allBuffers = L, V(y, f, !0, f.length, T, "", Q.finish), f.pendingcb++, f.lastBufferedRequest = null, Q.next ? (f.corkedRequestsFree = Q.next, Q.next = null) : f.corkedRequestsFree = new s(f), f.bufferedRequestCount = 0;
  52960. } else {
  52961. for (; D; ) {
  52962. var E = D.chunk, J = D.encoding, k = D.callback;
  52963. if (V(y, f, !1, f.objectMode ? 1 : E.length, E, J, k), D = D.next, f.bufferedRequestCount--, f.writing) break;
  52964. }
  52965. D === null && (f.lastBufferedRequest = null);
  52966. }
  52967. f.bufferedRequest = D, f.bufferProcessing = !1;
  52968. }
  52969. function G(y) {
  52970. return y.ending && y.length === 0 && y.bufferedRequest === null && !y.finished && !y.writing;
  52971. }
  52972. function w(y, f) {
  52973. y._final(function(D) {
  52974. f.pendingcb--, D && S(y, D), f.prefinished = !0, y.emit("prefinish"), W(y, f);
  52975. });
  52976. }
  52977. function W(y, f) {
  52978. var D = G(f);
  52979. if (D && (function(T, Q) {
  52980. Q.prefinished || Q.finalCalled || (typeof T._final != "function" || Q.destroyed ? (Q.prefinished = !0, T.emit("prefinish")) : (Q.pendingcb++, Q.finalCalled = !0, e.nextTick(w, T, Q)));
  52981. }(y, f), f.pendingcb === 0 && (f.finished = !0, y.emit("finish"), f.autoDestroy))) {
  52982. var F = y._readableState;
  52983. (!F || F.autoDestroy && F.endEmitted) && y.destroy();
  52984. }
  52985. return D;
  52986. }
  52987. g("inherits")(K, a), v.prototype.getBuffer = function() {
  52988. for (var y = this.bufferedRequest, f = []; y; ) f.push(y), y = y.next;
  52989. return f;
  52990. }, function() {
  52991. try {
  52992. Object.defineProperty(v.prototype, "buffer", { get: n.deprecate(function() {
  52993. return this.getBuffer();
  52994. }, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.", "DEP0003") });
  52995. } catch {
  52996. }
  52997. }(), typeof Symbol == "function" && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] == "function" ? (c = Function.prototype[Symbol.hasInstance], Object.defineProperty(K, Symbol.hasInstance, { value: function(y) {
  52998. return !!c.call(this, y) || this === K && y && y._writableState instanceof v;
  52999. } })) : c = function(y) {
  53000. return y instanceof this;
  53001. }, K.prototype.pipe = function() {
  53002. S(this, new p());
  53003. }, K.prototype.write = function(y, f, D) {
  53004. var F, T = this._writableState, Q = !1, P = !T.objectMode && (F = y, d.isBuffer(F) || F instanceof o);
  53005. return P && !d.isBuffer(y) && (y = function(L) {
  53006. return d.from(L);
  53007. }(y)), typeof f == "function" && (D = f, f = null), P ? f = "buffer" : f || (f = T.defaultEncoding), typeof D != "function" && (D = z), T.ending ? function(L, E) {
  53008. var J = new X();
  53009. S(L, J), e.nextTick(E, J);
  53010. }(this, D) : (P || function(L, E, J, k) {
  53011. var j;
  53012. return J === null ? j = new R() : typeof J == "string" || E.objectMode || (j = new u("chunk", ["string", "Buffer"], J)), !j || (S(L, j), e.nextTick(k, j), !1);
  53013. }(this, T, y, D)) && (T.pendingcb++, Q = function(L, E, J, k, j, q) {
  53014. if (!J) {
  53015. var Cg = function(eg, O, _) {
  53016. return eg.objectMode || eg.decodeStrings === !1 || typeof O != "string" || (O = d.from(O, _)), O;
  53017. }(E, k, j);
  53018. k !== Cg && (J = !0, j = "buffer", k = Cg);
  53019. }
  53020. var Ig = E.objectMode ? 1 : k.length;
  53021. E.length += Ig;
  53022. var x = E.length < E.highWaterMark;
  53023. if (x || (E.needDrain = !0), E.writing || E.corked) {
  53024. var Ag = E.lastBufferedRequest;
  53025. E.lastBufferedRequest = { chunk: k, encoding: j, isBuf: J, callback: q, next: null }, Ag ? Ag.next = E.lastBufferedRequest : E.bufferedRequest = E.lastBufferedRequest, E.bufferedRequestCount += 1;
  53026. } else V(L, E, !1, Ig, k, j, q);
  53027. return x;
  53028. }(this, T, P, y, f, D)), Q;
  53029. }, K.prototype.cork = function() {
  53030. this._writableState.corked++;
  53031. }, K.prototype.uncork = function() {
  53032. var y = this._writableState;
  53033. y.corked && (y.corked--, y.writing || y.corked || y.bufferProcessing || !y.bufferedRequest || B(this, y));
  53034. }, K.prototype.setDefaultEncoding = function(y) {
  53035. if (typeof y == "string" && (y = y.toLowerCase()), !(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((y + "").toLowerCase()) > -1)) throw new H(y);
  53036. return this._writableState.defaultEncoding = y, this;
  53037. }, Object.defineProperty(K.prototype, "writableBuffer", { enumerable: !1, get: function() {
  53038. return this._writableState && this._writableState.getBuffer();
  53039. } }), Object.defineProperty(K.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
  53040. return this._writableState.highWaterMark;
  53041. } }), K.prototype._write = function(y, f, D) {
  53042. D(new m("_write()"));
  53043. }, K.prototype._writev = null, K.prototype.end = function(y, f, D) {
  53044. var F = this._writableState;
  53045. return typeof y == "function" ? (D = y, y = null, f = null) : typeof f == "function" && (D = f, f = null), y != null && this.write(y, f), F.corked && (F.corked = 1, this.uncork()), F.ending || function(T, Q, P) {
  53046. Q.ending = !0, W(T, Q), P && (Q.finished ? e.nextTick(P) : T.once("finish", P)), Q.ended = !0, T.writable = !1;
  53047. }(this, F, D), this;
  53048. }, Object.defineProperty(K.prototype, "writableLength", { enumerable: !1, get: function() {
  53049. return this._writableState.length;
  53050. } }), Object.defineProperty(K.prototype, "destroyed", { enumerable: !1, get: function() {
  53051. return this._writableState !== void 0 && this._writableState.destroyed;
  53052. }, set: function(y) {
  53053. this._writableState && (this._writableState.destroyed = y);
  53054. } }), K.prototype.destroy = r.destroy, K.prototype._undestroy = r.undestroy, K.prototype._destroy = function(y, f) {
  53055. f(y);
  53056. };
  53057. }).call(this);
  53058. }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  53059. }, { "../errors": 477, "./_stream_duplex": 478, "./internal/streams/destroy": 485, "./internal/streams/state": 489, "./internal/streams/stream": 490, _process: 467, buffer: 220, inherits: 440, "util-deprecate": 524 }], 483: [function(g, C, i) {
  53060. (function(e) {
  53061. (function() {
  53062. var A;
  53063. function s(Y, R, X) {
  53064. return (R = function(H) {
  53065. var S = function(z, v) {
  53066. if (typeof z != "object" || z === null) return z;
  53067. var K = z[Symbol.toPrimitive];
  53068. if (K !== void 0) {
  53069. var V = K.call(z, v);
  53070. if (typeof V != "object") return V;
  53071. throw new TypeError("@@toPrimitive must return a primitive value.");
  53072. }
  53073. return (v === "string" ? String : Number)(z);
  53074. }(H, "string");
  53075. return typeof S == "symbol" ? S : String(S);
  53076. }(R)) in Y ? Object.defineProperty(Y, R, { value: X, enumerable: !0, configurable: !0, writable: !0 }) : Y[R] = X, Y;
  53077. }
  53078. var l = g("./end-of-stream"), n = Symbol("lastResolve"), a = Symbol("lastReject"), d = Symbol("error"), o = Symbol("ended"), c = Symbol("lastPromise"), r = Symbol("handlePromise"), h = Symbol("stream");
  53079. function b(Y, R) {
  53080. return { value: Y, done: R };
  53081. }
  53082. function u(Y) {
  53083. var R = Y[n];
  53084. if (R !== null) {
  53085. var X = Y[h].read();
  53086. X !== null && (Y[c] = null, Y[n] = null, Y[a] = null, R(b(X, !1)));
  53087. }
  53088. }
  53089. function m(Y) {
  53090. e.nextTick(u, Y);
  53091. }
  53092. var Z = Object.getPrototypeOf(function() {
  53093. }), p = Object.setPrototypeOf((s(A = { get stream() {
  53094. return this[h];
  53095. }, next: function() {
  53096. var Y = this, R = this[d];
  53097. if (R !== null) return Promise.reject(R);
  53098. if (this[o]) return Promise.resolve(b(void 0, !0));
  53099. if (this[h].destroyed) return new Promise(function(z, v) {
  53100. e.nextTick(function() {
  53101. Y[d] ? v(Y[d]) : z(b(void 0, !0));
  53102. });
  53103. });
  53104. var X, H = this[c];
  53105. if (H) X = new Promise(/* @__PURE__ */ function(z, v) {
  53106. return function(K, V) {
  53107. z.then(function() {
  53108. v[o] ? K(b(void 0, !0)) : v[r](K, V);
  53109. }, V);
  53110. };
  53111. }(H, this));
  53112. else {
  53113. var S = this[h].read();
  53114. if (S !== null) return Promise.resolve(b(S, !1));
  53115. X = new Promise(this[r]);
  53116. }
  53117. return this[c] = X, X;
  53118. } }, Symbol.asyncIterator, function() {
  53119. return this;
  53120. }), s(A, "return", function() {
  53121. var Y = this;
  53122. return new Promise(function(R, X) {
  53123. Y[h].destroy(null, function(H) {
  53124. H ? X(H) : R(b(void 0, !0));
  53125. });
  53126. });
  53127. }), A), Z);
  53128. C.exports = function(Y) {
  53129. var R, X = Object.create(p, (s(R = {}, h, { value: Y, writable: !0 }), s(R, n, { value: null, writable: !0 }), s(R, a, { value: null, writable: !0 }), s(R, d, { value: null, writable: !0 }), s(R, o, { value: Y._readableState.endEmitted, writable: !0 }), s(R, r, { value: function(H, S) {
  53130. var z = X[h].read();
  53131. z ? (X[c] = null, X[n] = null, X[a] = null, H(b(z, !1))) : (X[n] = H, X[a] = S);
  53132. }, writable: !0 }), R));
  53133. return X[c] = null, l(Y, function(H) {
  53134. if (H && H.code !== "ERR_STREAM_PREMATURE_CLOSE") {
  53135. var S = X[a];
  53136. return S !== null && (X[c] = null, X[n] = null, X[a] = null, S(H)), void (X[d] = H);
  53137. }
  53138. var z = X[n];
  53139. z !== null && (X[c] = null, X[n] = null, X[a] = null, z(b(void 0, !0))), X[o] = !0;
  53140. }), Y.on("readable", m.bind(null, X)), X;
  53141. };
  53142. }).call(this);
  53143. }).call(this, g("_process"));
  53144. }, { "./end-of-stream": 486, _process: 467 }], 484: [function(g, C, i) {
  53145. function e(c, r) {
  53146. var h = Object.keys(c);
  53147. if (Object.getOwnPropertySymbols) {
  53148. var b = Object.getOwnPropertySymbols(c);
  53149. r && (b = b.filter(function(u) {
  53150. return Object.getOwnPropertyDescriptor(c, u).enumerable;
  53151. })), h.push.apply(h, b);
  53152. }
  53153. return h;
  53154. }
  53155. function A(c) {
  53156. for (var r = 1; r < arguments.length; r++) {
  53157. var h = arguments[r] != null ? arguments[r] : {};
  53158. r % 2 ? e(Object(h), !0).forEach(function(b) {
  53159. s(c, b, h[b]);
  53160. }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(c, Object.getOwnPropertyDescriptors(h)) : e(Object(h)).forEach(function(b) {
  53161. Object.defineProperty(c, b, Object.getOwnPropertyDescriptor(h, b));
  53162. });
  53163. }
  53164. return c;
  53165. }
  53166. function s(c, r, h) {
  53167. return (r = n(r)) in c ? Object.defineProperty(c, r, { value: h, enumerable: !0, configurable: !0, writable: !0 }) : c[r] = h, c;
  53168. }
  53169. function l(c, r) {
  53170. for (var h = 0; h < r.length; h++) {
  53171. var b = r[h];
  53172. b.enumerable = b.enumerable || !1, b.configurable = !0, "value" in b && (b.writable = !0), Object.defineProperty(c, n(b.key), b);
  53173. }
  53174. }
  53175. function n(c) {
  53176. var r = function(h, b) {
  53177. if (typeof h != "object" || h === null) return h;
  53178. var u = h[Symbol.toPrimitive];
  53179. if (u !== void 0) {
  53180. var m = u.call(h, b);
  53181. if (typeof m != "object") return m;
  53182. throw new TypeError("@@toPrimitive must return a primitive value.");
  53183. }
  53184. return (b === "string" ? String : Number)(h);
  53185. }(c, "string");
  53186. return typeof r == "symbol" ? r : String(r);
  53187. }
  53188. var a = g("buffer").Buffer, d = g("util").inspect, o = d && d.custom || "inspect";
  53189. C.exports = function() {
  53190. function c() {
  53191. (function(b, u) {
  53192. if (!(b instanceof u)) throw new TypeError("Cannot call a class as a function");
  53193. })(this, c), this.head = null, this.tail = null, this.length = 0;
  53194. }
  53195. var r, h;
  53196. return r = c, (h = [{ key: "push", value: function(b) {
  53197. var u = { data: b, next: null };
  53198. this.length > 0 ? this.tail.next = u : this.head = u, this.tail = u, ++this.length;
  53199. } }, { key: "unshift", value: function(b) {
  53200. var u = { data: b, next: this.head };
  53201. this.length === 0 && (this.tail = u), this.head = u, ++this.length;
  53202. } }, { key: "shift", value: function() {
  53203. if (this.length !== 0) {
  53204. var b = this.head.data;
  53205. return this.length === 1 ? this.head = this.tail = null : this.head = this.head.next, --this.length, b;
  53206. }
  53207. } }, { key: "clear", value: function() {
  53208. this.head = this.tail = null, this.length = 0;
  53209. } }, { key: "join", value: function(b) {
  53210. if (this.length === 0) return "";
  53211. for (var u = this.head, m = "" + u.data; u = u.next; ) m += b + u.data;
  53212. return m;
  53213. } }, { key: "concat", value: function(b) {
  53214. if (this.length === 0) return a.alloc(0);
  53215. for (var u, m, Z, p = a.allocUnsafe(b >>> 0), Y = this.head, R = 0; Y; ) u = Y.data, m = p, Z = R, a.prototype.copy.call(u, m, Z), R += Y.data.length, Y = Y.next;
  53216. return p;
  53217. } }, { key: "consume", value: function(b, u) {
  53218. var m;
  53219. return b < this.head.data.length ? (m = this.head.data.slice(0, b), this.head.data = this.head.data.slice(b)) : m = b === this.head.data.length ? this.shift() : u ? this._getString(b) : this._getBuffer(b), m;
  53220. } }, { key: "first", value: function() {
  53221. return this.head.data;
  53222. } }, { key: "_getString", value: function(b) {
  53223. var u = this.head, m = 1, Z = u.data;
  53224. for (b -= Z.length; u = u.next; ) {
  53225. var p = u.data, Y = b > p.length ? p.length : b;
  53226. if (Y === p.length ? Z += p : Z += p.slice(0, b), (b -= Y) == 0) {
  53227. Y === p.length ? (++m, u.next ? this.head = u.next : this.head = this.tail = null) : (this.head = u, u.data = p.slice(Y));
  53228. break;
  53229. }
  53230. ++m;
  53231. }
  53232. return this.length -= m, Z;
  53233. } }, { key: "_getBuffer", value: function(b) {
  53234. var u = a.allocUnsafe(b), m = this.head, Z = 1;
  53235. for (m.data.copy(u), b -= m.data.length; m = m.next; ) {
  53236. var p = m.data, Y = b > p.length ? p.length : b;
  53237. if (p.copy(u, u.length - b, 0, Y), (b -= Y) == 0) {
  53238. Y === p.length ? (++Z, m.next ? this.head = m.next : this.head = this.tail = null) : (this.head = m, m.data = p.slice(Y));
  53239. break;
  53240. }
  53241. ++Z;
  53242. }
  53243. return this.length -= Z, u;
  53244. } }, { key: o, value: function(b, u) {
  53245. return d(this, A(A({}, u), {}, { depth: 0, customInspect: !1 }));
  53246. } }]) && l(r.prototype, h), Object.defineProperty(r, "prototype", { writable: !1 }), c;
  53247. }();
  53248. }, { buffer: 220, util: 188 }], 485: [function(g, C, i) {
  53249. (function(e) {
  53250. (function() {
  53251. function A(n, a) {
  53252. l(n, a), s(n);
  53253. }
  53254. function s(n) {
  53255. n._writableState && !n._writableState.emitClose || n._readableState && !n._readableState.emitClose || n.emit("close");
  53256. }
  53257. function l(n, a) {
  53258. n.emit("error", a);
  53259. }
  53260. C.exports = { destroy: function(n, a) {
  53261. var d = this, o = this._readableState && this._readableState.destroyed, c = this._writableState && this._writableState.destroyed;
  53262. return o || c ? (a ? a(n) : n && (this._writableState ? this._writableState.errorEmitted || (this._writableState.errorEmitted = !0, e.nextTick(l, this, n)) : e.nextTick(l, this, n)), this) : (this._readableState && (this._readableState.destroyed = !0), this._writableState && (this._writableState.destroyed = !0), this._destroy(n || null, function(r) {
  53263. !a && r ? d._writableState ? d._writableState.errorEmitted ? e.nextTick(s, d) : (d._writableState.errorEmitted = !0, e.nextTick(A, d, r)) : e.nextTick(A, d, r) : a ? (e.nextTick(s, d), a(r)) : e.nextTick(s, d);
  53264. }), this);
  53265. }, undestroy: function() {
  53266. this._readableState && (this._readableState.destroyed = !1, this._readableState.reading = !1, this._readableState.ended = !1, this._readableState.endEmitted = !1), this._writableState && (this._writableState.destroyed = !1, this._writableState.ended = !1, this._writableState.ending = !1, this._writableState.finalCalled = !1, this._writableState.prefinished = !1, this._writableState.finished = !1, this._writableState.errorEmitted = !1);
  53267. }, errorOrDestroy: function(n, a) {
  53268. var d = n._readableState, o = n._writableState;
  53269. d && d.autoDestroy || o && o.autoDestroy ? n.destroy(a) : n.emit("error", a);
  53270. } };
  53271. }).call(this);
  53272. }).call(this, g("_process"));
  53273. }, { _process: 467 }], 486: [function(g, C, i) {
  53274. var e = g("../../../errors").codes.ERR_STREAM_PREMATURE_CLOSE;
  53275. function A() {
  53276. }
  53277. C.exports = function s(l, n, a) {
  53278. if (typeof n == "function") return s(l, null, n);
  53279. n || (n = {}), a = /* @__PURE__ */ function(Y) {
  53280. var R = !1;
  53281. return function() {
  53282. if (!R) {
  53283. R = !0;
  53284. for (var X = arguments.length, H = new Array(X), S = 0; S < X; S++) H[S] = arguments[S];
  53285. Y.apply(this, H);
  53286. }
  53287. };
  53288. }(a || A);
  53289. var d = n.readable || n.readable !== !1 && l.readable, o = n.writable || n.writable !== !1 && l.writable, c = function() {
  53290. l.writable || h();
  53291. }, r = l._writableState && l._writableState.finished, h = function() {
  53292. o = !1, r = !0, d || a.call(l);
  53293. }, b = l._readableState && l._readableState.endEmitted, u = function() {
  53294. d = !1, b = !0, o || a.call(l);
  53295. }, m = function(Y) {
  53296. a.call(l, Y);
  53297. }, Z = function() {
  53298. var Y;
  53299. return d && !b ? (l._readableState && l._readableState.ended || (Y = new e()), a.call(l, Y)) : o && !r ? (l._writableState && l._writableState.ended || (Y = new e()), a.call(l, Y)) : void 0;
  53300. }, p = function() {
  53301. l.req.on("finish", h);
  53302. };
  53303. return function(Y) {
  53304. return Y.setHeader && typeof Y.abort == "function";
  53305. }(l) ? (l.on("complete", h), l.on("abort", Z), l.req ? p() : l.on("request", p)) : o && !l._writableState && (l.on("end", c), l.on("close", c)), l.on("end", u), l.on("finish", h), n.error !== !1 && l.on("error", m), l.on("close", Z), function() {
  53306. l.removeListener("complete", h), l.removeListener("abort", Z), l.removeListener("request", p), l.req && l.req.removeListener("finish", h), l.removeListener("end", c), l.removeListener("close", c), l.removeListener("finish", h), l.removeListener("end", u), l.removeListener("error", m), l.removeListener("close", Z);
  53307. };
  53308. };
  53309. }, { "../../../errors": 477 }], 487: [function(g, C, i) {
  53310. C.exports = function() {
  53311. throw new Error("Readable.from is not available in the browser");
  53312. };
  53313. }, {}], 488: [function(g, C, i) {
  53314. var e, A = g("../../../errors").codes, s = A.ERR_MISSING_ARGS, l = A.ERR_STREAM_DESTROYED;
  53315. function n(r) {
  53316. if (r) throw r;
  53317. }
  53318. function a(r, h, b, u) {
  53319. u = /* @__PURE__ */ function(p) {
  53320. var Y = !1;
  53321. return function() {
  53322. Y || (Y = !0, p.apply(void 0, arguments));
  53323. };
  53324. }(u);
  53325. var m = !1;
  53326. r.on("close", function() {
  53327. m = !0;
  53328. }), e === void 0 && (e = g("./end-of-stream")), e(r, { readable: h, writable: b }, function(p) {
  53329. if (p) return u(p);
  53330. m = !0, u();
  53331. });
  53332. var Z = !1;
  53333. return function(p) {
  53334. if (!m && !Z) return Z = !0, function(Y) {
  53335. return Y.setHeader && typeof Y.abort == "function";
  53336. }(r) ? r.abort() : typeof r.destroy == "function" ? r.destroy() : void u(p || new l("pipe"));
  53337. };
  53338. }
  53339. function d(r) {
  53340. r();
  53341. }
  53342. function o(r, h) {
  53343. return r.pipe(h);
  53344. }
  53345. function c(r) {
  53346. return r.length ? typeof r[r.length - 1] != "function" ? n : r.pop() : n;
  53347. }
  53348. C.exports = function() {
  53349. for (var r = arguments.length, h = new Array(r), b = 0; b < r; b++) h[b] = arguments[b];
  53350. var u, m = c(h);
  53351. if (Array.isArray(h[0]) && (h = h[0]), h.length < 2) throw new s("streams");
  53352. var Z = h.map(function(p, Y) {
  53353. var R = Y < h.length - 1;
  53354. return a(p, R, Y > 0, function(X) {
  53355. u || (u = X), X && Z.forEach(d), R || (Z.forEach(d), m(u));
  53356. });
  53357. });
  53358. return h.reduce(o);
  53359. };
  53360. }, { "../../../errors": 477, "./end-of-stream": 486 }], 489: [function(g, C, i) {
  53361. var e = g("../../../errors").codes.ERR_INVALID_OPT_VALUE;
  53362. C.exports = { getHighWaterMark: function(A, s, l, n) {
  53363. var a = function(d, o, c) {
  53364. return d.highWaterMark != null ? d.highWaterMark : o ? d[c] : null;
  53365. }(s, n, l);
  53366. if (a != null) {
  53367. if (!isFinite(a) || Math.floor(a) !== a || a < 0) throw new e(n ? l : "highWaterMark", a);
  53368. return Math.floor(a);
  53369. }
  53370. return A.objectMode ? 16 : 16384;
  53371. } };
  53372. }, { "../../../errors": 477 }], 490: [function(g, C, i) {
  53373. C.exports = g("events").EventEmitter;
  53374. }, { events: 422 }], 491: [function(g, C, i) {
  53375. (i = C.exports = g("./lib/_stream_readable.js")).Stream = i, i.Readable = i, i.Writable = g("./lib/_stream_writable.js"), i.Duplex = g("./lib/_stream_duplex.js"), i.Transform = g("./lib/_stream_transform.js"), i.PassThrough = g("./lib/_stream_passthrough.js"), i.finished = g("./lib/internal/streams/end-of-stream.js"), i.pipeline = g("./lib/internal/streams/pipeline.js");
  53376. }, { "./lib/_stream_duplex.js": 478, "./lib/_stream_passthrough.js": 479, "./lib/_stream_readable.js": 480, "./lib/_stream_transform.js": 481, "./lib/_stream_writable.js": 482, "./lib/internal/streams/end-of-stream.js": 486, "./lib/internal/streams/pipeline.js": 488 }], 492: [function(g, C, i) {
  53377. var e = function(A) {
  53378. var s = Object.prototype, l = s.hasOwnProperty, n = Object.defineProperty || function(W, y, f) {
  53379. W[y] = f.value;
  53380. }, a = typeof Symbol == "function" ? Symbol : {}, d = a.iterator || "@@iterator", o = a.asyncIterator || "@@asyncIterator", c = a.toStringTag || "@@toStringTag";
  53381. function r(W, y, f) {
  53382. return Object.defineProperty(W, y, { value: f, enumerable: !0, configurable: !0, writable: !0 }), W[y];
  53383. }
  53384. try {
  53385. r({}, "");
  53386. } catch {
  53387. r = function(y, f, D) {
  53388. return y[f] = D;
  53389. };
  53390. }
  53391. function h(W, y, f, D) {
  53392. var F = y && y.prototype instanceof m ? y : m, T = Object.create(F.prototype), Q = new B(D || []);
  53393. return n(T, "_invoke", { value: v(W, f, Q) }), T;
  53394. }
  53395. function b(W, y, f) {
  53396. try {
  53397. return { type: "normal", arg: W.call(y, f) };
  53398. } catch (D) {
  53399. return { type: "throw", arg: D };
  53400. }
  53401. }
  53402. A.wrap = h;
  53403. var u = {};
  53404. function m() {
  53405. }
  53406. function Z() {
  53407. }
  53408. function p() {
  53409. }
  53410. var Y = {};
  53411. r(Y, d, function() {
  53412. return this;
  53413. });
  53414. var R = Object.getPrototypeOf, X = R && R(R(G([])));
  53415. X && X !== s && l.call(X, d) && (Y = X);
  53416. var H = p.prototype = m.prototype = Object.create(Y);
  53417. function S(W) {
  53418. ["next", "throw", "return"].forEach(function(y) {
  53419. r(W, y, function(f) {
  53420. return this._invoke(y, f);
  53421. });
  53422. });
  53423. }
  53424. function z(W, y) {
  53425. var f;
  53426. n(this, "_invoke", { value: function(D, F) {
  53427. function T() {
  53428. return new y(function(Q, P) {
  53429. (function L(E, J, k, j) {
  53430. var q = b(W[E], W, J);
  53431. if (q.type !== "throw") {
  53432. var Cg = q.arg, Ig = Cg.value;
  53433. return Ig && typeof Ig == "object" && l.call(Ig, "__await") ? y.resolve(Ig.__await).then(function(x) {
  53434. L("next", x, k, j);
  53435. }, function(x) {
  53436. L("throw", x, k, j);
  53437. }) : y.resolve(Ig).then(function(x) {
  53438. Cg.value = x, k(Cg);
  53439. }, function(x) {
  53440. return L("throw", x, k, j);
  53441. });
  53442. }
  53443. j(q.arg);
  53444. })(D, F, Q, P);
  53445. });
  53446. }
  53447. return f = f ? f.then(T, T) : T();
  53448. } });
  53449. }
  53450. function v(W, y, f) {
  53451. var D = "suspendedStart";
  53452. return function(F, T) {
  53453. if (D === "executing") throw new Error("Generator is already running");
  53454. if (D === "completed") {
  53455. if (F === "throw") throw T;
  53456. return w();
  53457. }
  53458. for (f.method = F, f.arg = T; ; ) {
  53459. var Q = f.delegate;
  53460. if (Q) {
  53461. var P = K(Q, f);
  53462. if (P) {
  53463. if (P === u) continue;
  53464. return P;
  53465. }
  53466. }
  53467. if (f.method === "next") f.sent = f._sent = f.arg;
  53468. else if (f.method === "throw") {
  53469. if (D === "suspendedStart") throw D = "completed", f.arg;
  53470. f.dispatchException(f.arg);
  53471. } else f.method === "return" && f.abrupt("return", f.arg);
  53472. D = "executing";
  53473. var L = b(W, y, f);
  53474. if (L.type === "normal") {
  53475. if (D = f.done ? "completed" : "suspendedYield", L.arg === u) continue;
  53476. return { value: L.arg, done: f.done };
  53477. }
  53478. L.type === "throw" && (D = "completed", f.method = "throw", f.arg = L.arg);
  53479. }
  53480. };
  53481. }
  53482. function K(W, y) {
  53483. var f = y.method, D = W.iterator[f];
  53484. if (D === void 0) return y.delegate = null, f === "throw" && W.iterator.return && (y.method = "return", y.arg = void 0, K(W, y), y.method === "throw") || f !== "return" && (y.method = "throw", y.arg = new TypeError("The iterator does not provide a '" + f + "' method")), u;
  53485. var F = b(D, W.iterator, y.arg);
  53486. if (F.type === "throw") return y.method = "throw", y.arg = F.arg, y.delegate = null, u;
  53487. var T = F.arg;
  53488. return T ? T.done ? (y[W.resultName] = T.value, y.next = W.nextLoc, y.method !== "return" && (y.method = "next", y.arg = void 0), y.delegate = null, u) : T : (y.method = "throw", y.arg = new TypeError("iterator result is not an object"), y.delegate = null, u);
  53489. }
  53490. function V(W) {
  53491. var y = { tryLoc: W[0] };
  53492. 1 in W && (y.catchLoc = W[1]), 2 in W && (y.finallyLoc = W[2], y.afterLoc = W[3]), this.tryEntries.push(y);
  53493. }
  53494. function N(W) {
  53495. var y = W.completion || {};
  53496. y.type = "normal", delete y.arg, W.completion = y;
  53497. }
  53498. function B(W) {
  53499. this.tryEntries = [{ tryLoc: "root" }], W.forEach(V, this), this.reset(!0);
  53500. }
  53501. function G(W) {
  53502. if (W) {
  53503. var y = W[d];
  53504. if (y) return y.call(W);
  53505. if (typeof W.next == "function") return W;
  53506. if (!isNaN(W.length)) {
  53507. var f = -1, D = function F() {
  53508. for (; ++f < W.length; ) if (l.call(W, f)) return F.value = W[f], F.done = !1, F;
  53509. return F.value = void 0, F.done = !0, F;
  53510. };
  53511. return D.next = D;
  53512. }
  53513. }
  53514. return { next: w };
  53515. }
  53516. function w() {
  53517. return { value: void 0, done: !0 };
  53518. }
  53519. return Z.prototype = p, n(H, "constructor", { value: p, configurable: !0 }), n(p, "constructor", { value: Z, configurable: !0 }), Z.displayName = r(p, c, "GeneratorFunction"), A.isGeneratorFunction = function(W) {
  53520. var y = typeof W == "function" && W.constructor;
  53521. return !!y && (y === Z || (y.displayName || y.name) === "GeneratorFunction");
  53522. }, A.mark = function(W) {
  53523. return Object.setPrototypeOf ? Object.setPrototypeOf(W, p) : (W.__proto__ = p, r(W, c, "GeneratorFunction")), W.prototype = Object.create(H), W;
  53524. }, A.awrap = function(W) {
  53525. return { __await: W };
  53526. }, S(z.prototype), r(z.prototype, o, function() {
  53527. return this;
  53528. }), A.AsyncIterator = z, A.async = function(W, y, f, D, F) {
  53529. F === void 0 && (F = Promise);
  53530. var T = new z(h(W, y, f, D), F);
  53531. return A.isGeneratorFunction(y) ? T : T.next().then(function(Q) {
  53532. return Q.done ? Q.value : T.next();
  53533. });
  53534. }, S(H), r(H, c, "Generator"), r(H, d, function() {
  53535. return this;
  53536. }), r(H, "toString", function() {
  53537. return "[object Generator]";
  53538. }), A.keys = function(W) {
  53539. var y = Object(W), f = [];
  53540. for (var D in y) f.push(D);
  53541. return f.reverse(), function F() {
  53542. for (; f.length; ) {
  53543. var T = f.pop();
  53544. if (T in y) return F.value = T, F.done = !1, F;
  53545. }
  53546. return F.done = !0, F;
  53547. };
  53548. }, A.values = G, B.prototype = { constructor: B, reset: function(W) {
  53549. if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = !1, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(N), !W) for (var y in this) y.charAt(0) === "t" && l.call(this, y) && !isNaN(+y.slice(1)) && (this[y] = void 0);
  53550. }, stop: function() {
  53551. this.done = !0;
  53552. var W = this.tryEntries[0].completion;
  53553. if (W.type === "throw") throw W.arg;
  53554. return this.rval;
  53555. }, dispatchException: function(W) {
  53556. if (this.done) throw W;
  53557. var y = this;
  53558. function f(L, E) {
  53559. return T.type = "throw", T.arg = W, y.next = L, E && (y.method = "next", y.arg = void 0), !!E;
  53560. }
  53561. for (var D = this.tryEntries.length - 1; D >= 0; --D) {
  53562. var F = this.tryEntries[D], T = F.completion;
  53563. if (F.tryLoc === "root") return f("end");
  53564. if (F.tryLoc <= this.prev) {
  53565. var Q = l.call(F, "catchLoc"), P = l.call(F, "finallyLoc");
  53566. if (Q && P) {
  53567. if (this.prev < F.catchLoc) return f(F.catchLoc, !0);
  53568. if (this.prev < F.finallyLoc) return f(F.finallyLoc);
  53569. } else if (Q) {
  53570. if (this.prev < F.catchLoc) return f(F.catchLoc, !0);
  53571. } else {
  53572. if (!P) throw new Error("try statement without catch or finally");
  53573. if (this.prev < F.finallyLoc) return f(F.finallyLoc);
  53574. }
  53575. }
  53576. }
  53577. }, abrupt: function(W, y) {
  53578. for (var f = this.tryEntries.length - 1; f >= 0; --f) {
  53579. var D = this.tryEntries[f];
  53580. if (D.tryLoc <= this.prev && l.call(D, "finallyLoc") && this.prev < D.finallyLoc) {
  53581. var F = D;
  53582. break;
  53583. }
  53584. }
  53585. F && (W === "break" || W === "continue") && F.tryLoc <= y && y <= F.finallyLoc && (F = null);
  53586. var T = F ? F.completion : {};
  53587. return T.type = W, T.arg = y, F ? (this.method = "next", this.next = F.finallyLoc, u) : this.complete(T);
  53588. }, complete: function(W, y) {
  53589. if (W.type === "throw") throw W.arg;
  53590. return W.type === "break" || W.type === "continue" ? this.next = W.arg : W.type === "return" ? (this.rval = this.arg = W.arg, this.method = "return", this.next = "end") : W.type === "normal" && y && (this.next = y), u;
  53591. }, finish: function(W) {
  53592. for (var y = this.tryEntries.length - 1; y >= 0; --y) {
  53593. var f = this.tryEntries[y];
  53594. if (f.finallyLoc === W) return this.complete(f.completion, f.afterLoc), N(f), u;
  53595. }
  53596. }, catch: function(W) {
  53597. for (var y = this.tryEntries.length - 1; y >= 0; --y) {
  53598. var f = this.tryEntries[y];
  53599. if (f.tryLoc === W) {
  53600. var D = f.completion;
  53601. if (D.type === "throw") {
  53602. var F = D.arg;
  53603. N(f);
  53604. }
  53605. return F;
  53606. }
  53607. }
  53608. throw new Error("illegal catch attempt");
  53609. }, delegateYield: function(W, y, f) {
  53610. return this.delegate = { iterator: G(W), resultName: y, nextLoc: f }, this.method === "next" && (this.arg = void 0), u;
  53611. } }, A;
  53612. }(typeof C == "object" ? C.exports : {});
  53613. try {
  53614. regeneratorRuntime = e;
  53615. } catch {
  53616. typeof globalThis == "object" ? globalThis.regeneratorRuntime = e : Function("r", "regeneratorRuntime = r")(e);
  53617. }
  53618. }, {}], 493: [function(g, C, i) {
  53619. var e = g("buffer").Buffer, A = g("inherits"), s = g("hash-base"), l = new Array(16), n = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13], a = [5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11], d = [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6], o = [8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11], c = [0, 1518500249, 1859775393, 2400959708, 2840853838], r = [1352829926, 1548603684, 1836072691, 2053994217, 0];
  53620. function h() {
  53621. s.call(this, 64), this._a = 1732584193, this._b = 4023233417, this._c = 2562383102, this._d = 271733878, this._e = 3285377520;
  53622. }
  53623. function b(R, X) {
  53624. return R << X | R >>> 32 - X;
  53625. }
  53626. function u(R, X, H, S, z, v, K, V) {
  53627. return b(R + (X ^ H ^ S) + v + K | 0, V) + z | 0;
  53628. }
  53629. function m(R, X, H, S, z, v, K, V) {
  53630. return b(R + (X & H | ~X & S) + v + K | 0, V) + z | 0;
  53631. }
  53632. function Z(R, X, H, S, z, v, K, V) {
  53633. return b(R + ((X | ~H) ^ S) + v + K | 0, V) + z | 0;
  53634. }
  53635. function p(R, X, H, S, z, v, K, V) {
  53636. return b(R + (X & S | H & ~S) + v + K | 0, V) + z | 0;
  53637. }
  53638. function Y(R, X, H, S, z, v, K, V) {
  53639. return b(R + (X ^ (H | ~S)) + v + K | 0, V) + z | 0;
  53640. }
  53641. A(h, s), h.prototype._update = function() {
  53642. for (var R = l, X = 0; X < 16; ++X) R[X] = this._block.readInt32LE(4 * X);
  53643. for (var H = 0 | this._a, S = 0 | this._b, z = 0 | this._c, v = 0 | this._d, K = 0 | this._e, V = 0 | this._a, N = 0 | this._b, B = 0 | this._c, G = 0 | this._d, w = 0 | this._e, W = 0; W < 80; W += 1) {
  53644. var y, f;
  53645. W < 16 ? (y = u(H, S, z, v, K, R[n[W]], c[0], d[W]), f = Y(V, N, B, G, w, R[a[W]], r[0], o[W])) : W < 32 ? (y = m(H, S, z, v, K, R[n[W]], c[1], d[W]), f = p(V, N, B, G, w, R[a[W]], r[1], o[W])) : W < 48 ? (y = Z(H, S, z, v, K, R[n[W]], c[2], d[W]), f = Z(V, N, B, G, w, R[a[W]], r[2], o[W])) : W < 64 ? (y = p(H, S, z, v, K, R[n[W]], c[3], d[W]), f = m(V, N, B, G, w, R[a[W]], r[3], o[W])) : (y = Y(H, S, z, v, K, R[n[W]], c[4], d[W]), f = u(V, N, B, G, w, R[a[W]], r[4], o[W])), H = K, K = v, v = b(z, 10), z = S, S = y, V = w, w = G, G = b(B, 10), B = N, N = f;
  53646. }
  53647. var D = this._b + z + G | 0;
  53648. this._b = this._c + v + w | 0, this._c = this._d + K + V | 0, this._d = this._e + H + N | 0, this._e = this._a + S + B | 0, this._a = D;
  53649. }, h.prototype._digest = function() {
  53650. this._block[this._blockOffset++] = 128, this._blockOffset > 56 && (this._block.fill(0, this._blockOffset, 64), this._update(), this._blockOffset = 0), this._block.fill(0, this._blockOffset, 56), this._block.writeUInt32LE(this._length[0], 56), this._block.writeUInt32LE(this._length[1], 60), this._update();
  53651. var R = e.alloc ? e.alloc(20) : new e(20);
  53652. return R.writeInt32LE(this._a, 0), R.writeInt32LE(this._b, 4), R.writeInt32LE(this._c, 8), R.writeInt32LE(this._d, 12), R.writeInt32LE(this._e, 16), R;
  53653. }, C.exports = h;
  53654. }, { buffer: 220, "hash-base": 425, inherits: 440 }], 494: [function(g, C, i) {
  53655. /*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
  53656. var e = g("buffer"), A = e.Buffer;
  53657. function s(n, a) {
  53658. for (var d in n) a[d] = n[d];
  53659. }
  53660. function l(n, a, d) {
  53661. return A(n, a, d);
  53662. }
  53663. A.from && A.alloc && A.allocUnsafe && A.allocUnsafeSlow ? C.exports = e : (s(e, i), i.Buffer = l), l.prototype = Object.create(A.prototype), s(A, l), l.from = function(n, a, d) {
  53664. if (typeof n == "number") throw new TypeError("Argument must not be a number");
  53665. return A(n, a, d);
  53666. }, l.alloc = function(n, a, d) {
  53667. if (typeof n != "number") throw new TypeError("Argument must be a number");
  53668. var o = A(n);
  53669. return a !== void 0 ? typeof d == "string" ? o.fill(a, d) : o.fill(a) : o.fill(0), o;
  53670. }, l.allocUnsafe = function(n) {
  53671. if (typeof n != "number") throw new TypeError("Argument must be a number");
  53672. return A(n);
  53673. }, l.allocUnsafeSlow = function(n) {
  53674. if (typeof n != "number") throw new TypeError("Argument must be a number");
  53675. return e.SlowBuffer(n);
  53676. };
  53677. }, { buffer: 220 }], 495: [function(g, C, i) {
  53678. (function(e) {
  53679. (function() {
  53680. var A, s = g("buffer"), l = s.Buffer, n = {};
  53681. for (A in s) s.hasOwnProperty(A) && A !== "SlowBuffer" && A !== "Buffer" && (n[A] = s[A]);
  53682. var a = n.Buffer = {};
  53683. for (A in l) l.hasOwnProperty(A) && A !== "allocUnsafe" && A !== "allocUnsafeSlow" && (a[A] = l[A]);
  53684. if (n.Buffer.prototype = l.prototype, a.from && a.from !== Uint8Array.from || (a.from = function(d, o, c) {
  53685. if (typeof d == "number") throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof d);
  53686. if (d && d.length === void 0) throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof d);
  53687. return l(d, o, c);
  53688. }), a.alloc || (a.alloc = function(d, o, c) {
  53689. if (typeof d != "number") throw new TypeError('The "size" argument must be of type number. Received type ' + typeof d);
  53690. if (d < 0 || d >= 2 * (1 << 30)) throw new RangeError('The value "' + d + '" is invalid for option "size"');
  53691. var r = l(d);
  53692. return o && o.length !== 0 ? typeof c == "string" ? r.fill(o, c) : r.fill(o) : r.fill(0), r;
  53693. }), !n.kStringMaxLength) try {
  53694. n.kStringMaxLength = e.binding("buffer").kStringMaxLength;
  53695. } catch {
  53696. }
  53697. n.constants || (n.constants = { MAX_LENGTH: n.kMaxLength }, n.kStringMaxLength && (n.constants.MAX_STRING_LENGTH = n.kStringMaxLength)), C.exports = n;
  53698. }).call(this);
  53699. }).call(this, g("_process"));
  53700. }, { _process: 467, buffer: 220 }], 496: [function(g, C, i) {
  53701. Object.defineProperty(i, "__esModule", { value: !0 });
  53702. const e = g("xmlchars/xml/1.0/ed5"), A = g("xmlchars/xml/1.1/ed2"), s = g("xmlchars/xmlns/1.0/ed3");
  53703. var l = e.isS, n = e.isChar, a = e.isNameStartChar, d = e.isNameChar, o = e.S_LIST, c = e.NAME_RE, r = A.isChar, h = s.isNCNameStartChar, b = s.isNCNameChar, u = s.NC_NAME_RE;
  53704. const m = "http://www.w3.org/XML/1998/namespace", Z = "http://www.w3.org/2000/xmlns/", p = { __proto__: null, xml: m, xmlns: Z }, Y = { __proto__: null, amp: "&", gt: ">", lt: "<", quot: '"', apos: "'" }, R = (G) => G === 34 || G === 39, X = [34, 39], H = [...X, 91, 62], S = [...X, 60, 93], z = [61, 63, ...o], v = [...o, 62, 38, 60];
  53705. function K(G, w, W) {
  53706. switch (w) {
  53707. case "xml":
  53708. W !== m && G.fail(`xml prefix must be bound to ${m}.`);
  53709. break;
  53710. case "xmlns":
  53711. W !== Z && G.fail(`xmlns prefix must be bound to ${Z}.`);
  53712. }
  53713. switch (W) {
  53714. case Z:
  53715. G.fail(w === "" ? `the default namespace may not be set to ${W}.` : `may not assign a prefix (even "xmlns") to the URI ${Z}.`);
  53716. break;
  53717. case m:
  53718. switch (w) {
  53719. case "xml":
  53720. break;
  53721. case "":
  53722. G.fail(`the default namespace may not be set to ${W}.`);
  53723. break;
  53724. default:
  53725. G.fail("may not assign the xml namespace to another prefix.");
  53726. }
  53727. }
  53728. }
  53729. const V = (G) => u.test(G), N = (G) => c.test(G);
  53730. i.EVENTS = ["xmldecl", "text", "processinginstruction", "doctype", "comment", "opentagstart", "attribute", "opentag", "closetag", "cdata", "error", "end", "ready"];
  53731. const B = { xmldecl: "xmldeclHandler", text: "textHandler", processinginstruction: "piHandler", doctype: "doctypeHandler", comment: "commentHandler", opentagstart: "openTagStartHandler", attribute: "attributeHandler", opentag: "openTagHandler", closetag: "closeTagHandler", cdata: "cdataHandler", error: "errorHandler", end: "endHandler", ready: "readyHandler" };
  53732. i.SaxesParser = class {
  53733. constructor(G) {
  53734. this.opt = G ?? {}, this.fragmentOpt = !!this.opt.fragment;
  53735. const w = this.xmlnsOpt = !!this.opt.xmlns;
  53736. if (this.trackPosition = this.opt.position !== !1, this.fileName = this.opt.fileName, w) {
  53737. this.nameStartCheck = h, this.nameCheck = b, this.isName = V, this.processAttribs = this.processAttribsNS, this.pushAttrib = this.pushAttribNS, this.ns = Object.assign({ __proto__: null }, p);
  53738. const W = this.opt.additionalNamespaces;
  53739. W != null && (function(y, f) {
  53740. for (const D of Object.keys(f)) K(y, D, f[D]);
  53741. }(this, W), Object.assign(this.ns, W));
  53742. } else this.nameStartCheck = a, this.nameCheck = d, this.isName = N, this.processAttribs = this.processAttribsPlain, this.pushAttrib = this.pushAttribPlain;
  53743. this.stateTable = [this.sBegin, this.sBeginWhitespace, this.sDoctype, this.sDoctypeQuote, this.sDTD, this.sDTDQuoted, this.sDTDOpenWaka, this.sDTDOpenWakaBang, this.sDTDComment, this.sDTDCommentEnding, this.sDTDCommentEnded, this.sDTDPI, this.sDTDPIEnding, this.sText, this.sEntity, this.sOpenWaka, this.sOpenWakaBang, this.sComment, this.sCommentEnding, this.sCommentEnded, this.sCData, this.sCDataEnding, this.sCDataEnding2, this.sPIFirstChar, this.sPIRest, this.sPIBody, this.sPIEnding, this.sXMLDeclNameStart, this.sXMLDeclName, this.sXMLDeclEq, this.sXMLDeclValueStart, this.sXMLDeclValue, this.sXMLDeclSeparator, this.sXMLDeclEnding, this.sOpenTag, this.sOpenTagSlash, this.sAttrib, this.sAttribName, this.sAttribNameSawWhite, this.sAttribValue, this.sAttribValueQuoted, this.sAttribValueClosed, this.sAttribValueUnquoted, this.sCloseTag, this.sCloseTagSawWhite], this._init();
  53744. }
  53745. get closed() {
  53746. return this._closed;
  53747. }
  53748. _init() {
  53749. var G;
  53750. this.openWakaBang = "", this.text = "", this.name = "", this.piTarget = "", this.entity = "", this.q = null, this.tags = [], this.tag = null, this.topNS = null, this.chunk = "", this.chunkPosition = 0, this.i = 0, this.prevI = 0, this.carriedFromPrevious = void 0, this.forbiddenState = 0, this.attribList = [];
  53751. const { fragmentOpt: w } = this;
  53752. this.state = w ? 13 : 0, this.reportedTextBeforeRoot = this.reportedTextAfterRoot = this.closedRoot = this.sawRoot = w, this.xmlDeclPossible = !w, this.xmlDeclExpects = ["version"], this.entityReturnState = void 0;
  53753. let { defaultXMLVersion: W } = this.opt;
  53754. if (W === void 0) {
  53755. if (this.opt.forceXMLVersion === !0) throw new Error("forceXMLVersion set but defaultXMLVersion is not set");
  53756. W = "1.0";
  53757. }
  53758. this.setXMLVersion(W), this.positionAtNewLine = 0, this.doctype = !1, this._closed = !1, this.xmlDecl = { version: void 0, encoding: void 0, standalone: void 0 }, this.line = 1, this.column = 0, this.ENTITIES = Object.create(Y), (G = this.readyHandler) === null || G === void 0 || G.call(this);
  53759. }
  53760. get position() {
  53761. return this.chunkPosition + this.i;
  53762. }
  53763. get columnIndex() {
  53764. return this.position - this.positionAtNewLine;
  53765. }
  53766. on(G, w) {
  53767. this[B[G]] = w;
  53768. }
  53769. off(G) {
  53770. this[B[G]] = void 0;
  53771. }
  53772. makeError(G) {
  53773. var w;
  53774. let W = (w = this.fileName) !== null && w !== void 0 ? w : "";
  53775. return this.trackPosition && (W.length > 0 && (W += ":"), W += `${this.line}:${this.column}`), W.length > 0 && (W += ": "), new Error(W + G);
  53776. }
  53777. fail(G) {
  53778. const w = this.makeError(G), W = this.errorHandler;
  53779. if (W === void 0) throw w;
  53780. return W(w), this;
  53781. }
  53782. write(G) {
  53783. if (this.closed) return this.fail("cannot write after close; assign an onready handler.");
  53784. let w = !1;
  53785. G === null ? (w = !0, G = "") : typeof G == "object" && (G = G.toString()), this.carriedFromPrevious !== void 0 && (G = `${this.carriedFromPrevious}${G}`, this.carriedFromPrevious = void 0);
  53786. let W = G.length;
  53787. const y = G.charCodeAt(W - 1);
  53788. !w && (y === 13 || y >= 55296 && y <= 56319) && (this.carriedFromPrevious = G[W - 1], W--, G = G.slice(0, W));
  53789. const { stateTable: f } = this;
  53790. for (this.chunk = G, this.i = 0; this.i < W; ) f[this.state].call(this);
  53791. return this.chunkPosition += W, w ? this.end() : this;
  53792. }
  53793. close() {
  53794. return this.write(null);
  53795. }
  53796. getCode10() {
  53797. const { chunk: G, i: w } = this;
  53798. if (this.prevI = w, this.i = w + 1, w >= G.length) return -1;
  53799. const W = G.charCodeAt(w);
  53800. if (this.column++, W < 55296) {
  53801. if (W >= 32 || W === 9) return W;
  53802. switch (W) {
  53803. case 10:
  53804. return this.line++, this.column = 0, this.positionAtNewLine = this.position, 10;
  53805. case 13:
  53806. return G.charCodeAt(w + 1) === 10 && (this.i = w + 2), this.line++, this.column = 0, this.positionAtNewLine = this.position, -2;
  53807. default:
  53808. return this.fail("disallowed character."), W;
  53809. }
  53810. }
  53811. if (W > 56319) return W >= 57344 && W <= 65533 || this.fail("disallowed character."), W;
  53812. const y = 65536 + 1024 * (W - 55296) + (G.charCodeAt(w + 1) - 56320);
  53813. return this.i = w + 2, y > 1114111 && this.fail("disallowed character."), y;
  53814. }
  53815. getCode11() {
  53816. const { chunk: G, i: w } = this;
  53817. if (this.prevI = w, this.i = w + 1, w >= G.length) return -1;
  53818. const W = G.charCodeAt(w);
  53819. if (this.column++, W < 55296) {
  53820. if (W > 31 && W < 127 || W > 159 && W !== 8232 || W === 9) return W;
  53821. switch (W) {
  53822. case 10:
  53823. return this.line++, this.column = 0, this.positionAtNewLine = this.position, 10;
  53824. case 13: {
  53825. const f = G.charCodeAt(w + 1);
  53826. f !== 10 && f !== 133 || (this.i = w + 2);
  53827. }
  53828. case 133:
  53829. case 8232:
  53830. return this.line++, this.column = 0, this.positionAtNewLine = this.position, -2;
  53831. default:
  53832. return this.fail("disallowed character."), W;
  53833. }
  53834. }
  53835. if (W > 56319) return W >= 57344 && W <= 65533 || this.fail("disallowed character."), W;
  53836. const y = 65536 + 1024 * (W - 55296) + (G.charCodeAt(w + 1) - 56320);
  53837. return this.i = w + 2, y > 1114111 && this.fail("disallowed character."), y;
  53838. }
  53839. getCodeNorm() {
  53840. const G = this.getCode();
  53841. return G === -2 ? 10 : G;
  53842. }
  53843. unget() {
  53844. this.i = this.prevI, this.column--;
  53845. }
  53846. captureTo(G) {
  53847. let { i: w } = this;
  53848. const { chunk: W } = this;
  53849. for (; ; ) {
  53850. const y = this.getCode(), f = y === -2, D = f ? 10 : y;
  53851. if (D === -1 || G.includes(D)) return this.text += W.slice(w, this.prevI), D;
  53852. f && (this.text += W.slice(w, this.prevI) + `
  53853. `, w = this.i);
  53854. }
  53855. }
  53856. captureToChar(G) {
  53857. let { i: w } = this;
  53858. const { chunk: W } = this;
  53859. for (; ; ) {
  53860. let y = this.getCode();
  53861. switch (y) {
  53862. case -2:
  53863. this.text += W.slice(w, this.prevI) + `
  53864. `, w = this.i, y = 10;
  53865. break;
  53866. case -1:
  53867. return this.text += W.slice(w), !1;
  53868. }
  53869. if (y === G) return this.text += W.slice(w, this.prevI), !0;
  53870. }
  53871. }
  53872. captureNameChars() {
  53873. const { chunk: G, i: w } = this;
  53874. for (; ; ) {
  53875. const W = this.getCode();
  53876. if (W === -1) return this.name += G.slice(w), -1;
  53877. if (!d(W)) return this.name += G.slice(w, this.prevI), W === -2 ? 10 : W;
  53878. }
  53879. }
  53880. skipSpaces() {
  53881. for (; ; ) {
  53882. const G = this.getCodeNorm();
  53883. if (G === -1 || !l(G)) return G;
  53884. }
  53885. }
  53886. setXMLVersion(G) {
  53887. this.currentXMLVersion = G, G === "1.0" ? (this.isChar = n, this.getCode = this.getCode10) : (this.isChar = r, this.getCode = this.getCode11);
  53888. }
  53889. sBegin() {
  53890. this.chunk.charCodeAt(0) === 65279 && (this.i++, this.column++), this.state = 1;
  53891. }
  53892. sBeginWhitespace() {
  53893. const G = this.i, w = this.skipSpaces();
  53894. switch (this.prevI !== G && (this.xmlDeclPossible = !1), w) {
  53895. case 60:
  53896. if (this.state = 15, this.text.length !== 0) throw new Error("no-empty text at start");
  53897. break;
  53898. case -1:
  53899. break;
  53900. default:
  53901. this.unget(), this.state = 13, this.xmlDeclPossible = !1;
  53902. }
  53903. }
  53904. sDoctype() {
  53905. var G;
  53906. const w = this.captureTo(H);
  53907. switch (w) {
  53908. case 62:
  53909. (G = this.doctypeHandler) === null || G === void 0 || G.call(this, this.text), this.text = "", this.state = 13, this.doctype = !0;
  53910. break;
  53911. case -1:
  53912. break;
  53913. default:
  53914. this.text += String.fromCodePoint(w), w === 91 ? this.state = 4 : R(w) && (this.state = 3, this.q = w);
  53915. }
  53916. }
  53917. sDoctypeQuote() {
  53918. const G = this.q;
  53919. this.captureToChar(G) && (this.text += String.fromCodePoint(G), this.q = null, this.state = 2);
  53920. }
  53921. sDTD() {
  53922. const G = this.captureTo(S);
  53923. G !== -1 && (this.text += String.fromCodePoint(G), G === 93 ? this.state = 2 : G === 60 ? this.state = 6 : R(G) && (this.state = 5, this.q = G));
  53924. }
  53925. sDTDQuoted() {
  53926. const G = this.q;
  53927. this.captureToChar(G) && (this.text += String.fromCodePoint(G), this.state = 4, this.q = null);
  53928. }
  53929. sDTDOpenWaka() {
  53930. const G = this.getCodeNorm();
  53931. switch (this.text += String.fromCodePoint(G), G) {
  53932. case 33:
  53933. this.state = 7, this.openWakaBang = "";
  53934. break;
  53935. case 63:
  53936. this.state = 11;
  53937. break;
  53938. default:
  53939. this.state = 4;
  53940. }
  53941. }
  53942. sDTDOpenWakaBang() {
  53943. const G = String.fromCodePoint(this.getCodeNorm()), w = this.openWakaBang += G;
  53944. this.text += G, w !== "-" && (this.state = w === "--" ? 8 : 4, this.openWakaBang = "");
  53945. }
  53946. sDTDComment() {
  53947. this.captureToChar(45) && (this.text += "-", this.state = 9);
  53948. }
  53949. sDTDCommentEnding() {
  53950. const G = this.getCodeNorm();
  53951. this.text += String.fromCodePoint(G), this.state = G === 45 ? 10 : 8;
  53952. }
  53953. sDTDCommentEnded() {
  53954. const G = this.getCodeNorm();
  53955. this.text += String.fromCodePoint(G), G === 62 ? this.state = 4 : (this.fail("malformed comment."), this.state = 8);
  53956. }
  53957. sDTDPI() {
  53958. this.captureToChar(63) && (this.text += "?", this.state = 12);
  53959. }
  53960. sDTDPIEnding() {
  53961. const G = this.getCodeNorm();
  53962. this.text += String.fromCodePoint(G), G === 62 && (this.state = 4);
  53963. }
  53964. sText() {
  53965. this.tags.length !== 0 ? this.handleTextInRoot() : this.handleTextOutsideRoot();
  53966. }
  53967. sEntity() {
  53968. let { i: G } = this;
  53969. const { chunk: w } = this;
  53970. g: for (; ; ) switch (this.getCode()) {
  53971. case -2:
  53972. this.entity += w.slice(G, this.prevI) + `
  53973. `, G = this.i;
  53974. break;
  53975. case 59: {
  53976. const { entityReturnState: W } = this, y = this.entity + w.slice(G, this.prevI);
  53977. let f;
  53978. this.state = W, y === "" ? (this.fail("empty entity name."), f = "&;") : (f = this.parseEntity(y), this.entity = ""), W === 13 && this.textHandler === void 0 || (this.text += f);
  53979. break g;
  53980. }
  53981. case -1:
  53982. this.entity += w.slice(G);
  53983. break g;
  53984. }
  53985. }
  53986. sOpenWaka() {
  53987. const G = this.getCode();
  53988. if (a(G)) this.state = 34, this.unget(), this.xmlDeclPossible = !1;
  53989. else switch (G) {
  53990. case 47:
  53991. this.state = 43, this.xmlDeclPossible = !1;
  53992. break;
  53993. case 33:
  53994. this.state = 16, this.openWakaBang = "", this.xmlDeclPossible = !1;
  53995. break;
  53996. case 63:
  53997. this.state = 23;
  53998. break;
  53999. default:
  54000. this.fail("disallowed character in tag name"), this.state = 13, this.xmlDeclPossible = !1;
  54001. }
  54002. }
  54003. sOpenWakaBang() {
  54004. switch (this.openWakaBang += String.fromCodePoint(this.getCodeNorm()), this.openWakaBang) {
  54005. case "[CDATA[":
  54006. this.sawRoot || this.reportedTextBeforeRoot || (this.fail("text data outside of root node."), this.reportedTextBeforeRoot = !0), this.closedRoot && !this.reportedTextAfterRoot && (this.fail("text data outside of root node."), this.reportedTextAfterRoot = !0), this.state = 20, this.openWakaBang = "";
  54007. break;
  54008. case "--":
  54009. this.state = 17, this.openWakaBang = "";
  54010. break;
  54011. case "DOCTYPE":
  54012. this.state = 2, (this.doctype || this.sawRoot) && this.fail("inappropriately located doctype declaration."), this.openWakaBang = "";
  54013. break;
  54014. default:
  54015. this.openWakaBang.length >= 7 && this.fail("incorrect syntax.");
  54016. }
  54017. }
  54018. sComment() {
  54019. this.captureToChar(45) && (this.state = 18);
  54020. }
  54021. sCommentEnding() {
  54022. var G;
  54023. const w = this.getCodeNorm();
  54024. w === 45 ? (this.state = 19, (G = this.commentHandler) === null || G === void 0 || G.call(this, this.text), this.text = "") : (this.text += "-" + String.fromCodePoint(w), this.state = 17);
  54025. }
  54026. sCommentEnded() {
  54027. const G = this.getCodeNorm();
  54028. G !== 62 ? (this.fail("malformed comment."), this.text += "--" + String.fromCodePoint(G), this.state = 17) : this.state = 13;
  54029. }
  54030. sCData() {
  54031. this.captureToChar(93) && (this.state = 21);
  54032. }
  54033. sCDataEnding() {
  54034. const G = this.getCodeNorm();
  54035. G === 93 ? this.state = 22 : (this.text += "]" + String.fromCodePoint(G), this.state = 20);
  54036. }
  54037. sCDataEnding2() {
  54038. var G;
  54039. const w = this.getCodeNorm();
  54040. switch (w) {
  54041. case 62:
  54042. (G = this.cdataHandler) === null || G === void 0 || G.call(this, this.text), this.text = "", this.state = 13;
  54043. break;
  54044. case 93:
  54045. this.text += "]";
  54046. break;
  54047. default:
  54048. this.text += "]]" + String.fromCodePoint(w), this.state = 20;
  54049. }
  54050. }
  54051. sPIFirstChar() {
  54052. const G = this.getCodeNorm();
  54053. this.nameStartCheck(G) ? (this.piTarget += String.fromCodePoint(G), this.state = 24) : G === 63 || l(G) ? (this.fail("processing instruction without a target."), this.state = G === 63 ? 26 : 25) : (this.fail("disallowed character in processing instruction name."), this.piTarget += String.fromCodePoint(G), this.state = 24);
  54054. }
  54055. sPIRest() {
  54056. const { chunk: G, i: w } = this;
  54057. for (; ; ) {
  54058. const W = this.getCodeNorm();
  54059. if (W === -1) return void (this.piTarget += G.slice(w));
  54060. if (!this.nameCheck(W)) {
  54061. this.piTarget += G.slice(w, this.prevI);
  54062. const y = W === 63;
  54063. y || l(W) ? this.piTarget === "xml" ? (this.xmlDeclPossible || this.fail("an XML declaration must be at the start of the document."), this.state = y ? 33 : 27) : this.state = y ? 26 : 25 : (this.fail("disallowed character in processing instruction name."), this.piTarget += String.fromCodePoint(W));
  54064. break;
  54065. }
  54066. }
  54067. }
  54068. sPIBody() {
  54069. if (this.text.length === 0) {
  54070. const G = this.getCodeNorm();
  54071. G === 63 ? this.state = 26 : l(G) || (this.text = String.fromCodePoint(G));
  54072. } else this.captureToChar(63) && (this.state = 26);
  54073. }
  54074. sPIEnding() {
  54075. var G;
  54076. const w = this.getCodeNorm();
  54077. if (w === 62) {
  54078. const { piTarget: W } = this;
  54079. W.toLowerCase() === "xml" && this.fail("the XML declaration must appear at the start of the document."), (G = this.piHandler) === null || G === void 0 || G.call(this, { target: W, body: this.text }), this.piTarget = this.text = "", this.state = 13;
  54080. } else w === 63 ? this.text += "?" : (this.text += "?" + String.fromCodePoint(w), this.state = 25);
  54081. this.xmlDeclPossible = !1;
  54082. }
  54083. sXMLDeclNameStart() {
  54084. const G = this.skipSpaces();
  54085. G !== 63 ? G !== -1 && (this.state = 28, this.name = String.fromCodePoint(G)) : this.state = 33;
  54086. }
  54087. sXMLDeclName() {
  54088. const G = this.captureTo(z);
  54089. if (G === 63) return this.state = 33, this.name += this.text, this.text = "", void this.fail("XML declaration is incomplete.");
  54090. if (l(G) || G === 61) {
  54091. if (this.name += this.text, this.text = "", !this.xmlDeclExpects.includes(this.name)) switch (this.name.length) {
  54092. case 0:
  54093. this.fail("did not expect any more name/value pairs.");
  54094. break;
  54095. case 1:
  54096. this.fail(`expected the name ${this.xmlDeclExpects[0]}.`);
  54097. break;
  54098. default:
  54099. this.fail("expected one of " + this.xmlDeclExpects.join(", "));
  54100. }
  54101. this.state = G === 61 ? 30 : 29;
  54102. }
  54103. }
  54104. sXMLDeclEq() {
  54105. const G = this.getCodeNorm();
  54106. if (G === 63) return this.state = 33, void this.fail("XML declaration is incomplete.");
  54107. l(G) || (G !== 61 && this.fail("value required."), this.state = 30);
  54108. }
  54109. sXMLDeclValueStart() {
  54110. const G = this.getCodeNorm();
  54111. if (G === 63) return this.state = 33, void this.fail("XML declaration is incomplete.");
  54112. l(G) || (R(G) ? this.q = G : (this.fail("value must be quoted."), this.q = 32), this.state = 31);
  54113. }
  54114. sXMLDeclValue() {
  54115. const G = this.captureTo([this.q, 63]);
  54116. if (G === 63) return this.state = 33, this.text = "", void this.fail("XML declaration is incomplete.");
  54117. if (G === -1) return;
  54118. const w = this.text;
  54119. switch (this.text = "", this.name) {
  54120. case "version": {
  54121. this.xmlDeclExpects = ["encoding", "standalone"];
  54122. const W = w;
  54123. this.xmlDecl.version = W, /^1\.[0-9]+$/.test(W) ? this.opt.forceXMLVersion || this.setXMLVersion(W) : this.fail("version number must match /^1\\.[0-9]+$/.");
  54124. break;
  54125. }
  54126. case "encoding":
  54127. /^[A-Za-z][A-Za-z0-9._-]*$/.test(w) || this.fail("encoding value must match /^[A-Za-z0-9][A-Za-z0-9._-]*$/."), this.xmlDeclExpects = ["standalone"], this.xmlDecl.encoding = w;
  54128. break;
  54129. case "standalone":
  54130. w !== "yes" && w !== "no" && this.fail('standalone value must match "yes" or "no".'), this.xmlDeclExpects = [], this.xmlDecl.standalone = w;
  54131. }
  54132. this.name = "", this.state = 32;
  54133. }
  54134. sXMLDeclSeparator() {
  54135. const G = this.getCodeNorm();
  54136. G !== 63 ? (l(G) || (this.fail("whitespace required."), this.unget()), this.state = 27) : this.state = 33;
  54137. }
  54138. sXMLDeclEnding() {
  54139. var G;
  54140. this.getCodeNorm() === 62 ? (this.piTarget !== "xml" ? this.fail("processing instructions are not allowed before root.") : this.name !== "version" && this.xmlDeclExpects.includes("version") && this.fail("XML declaration must contain a version."), (G = this.xmldeclHandler) === null || G === void 0 || G.call(this, this.xmlDecl), this.name = "", this.piTarget = this.text = "", this.state = 13) : this.fail("The character ? is disallowed anywhere in XML declarations."), this.xmlDeclPossible = !1;
  54141. }
  54142. sOpenTag() {
  54143. var G;
  54144. const w = this.captureNameChars();
  54145. if (w === -1) return;
  54146. const W = this.tag = { name: this.name, attributes: /* @__PURE__ */ Object.create(null) };
  54147. switch (this.name = "", this.xmlnsOpt && (this.topNS = W.ns = /* @__PURE__ */ Object.create(null)), (G = this.openTagStartHandler) === null || G === void 0 || G.call(this, W), this.sawRoot = !0, !this.fragmentOpt && this.closedRoot && this.fail("documents may contain only one root."), w) {
  54148. case 62:
  54149. this.openTag();
  54150. break;
  54151. case 47:
  54152. this.state = 35;
  54153. break;
  54154. default:
  54155. l(w) || this.fail("disallowed character in tag name."), this.state = 36;
  54156. }
  54157. }
  54158. sOpenTagSlash() {
  54159. this.getCode() === 62 ? this.openSelfClosingTag() : (this.fail("forward-slash in opening tag not followed by >."), this.state = 36);
  54160. }
  54161. sAttrib() {
  54162. const G = this.skipSpaces();
  54163. G !== -1 && (a(G) ? (this.unget(), this.state = 37) : G === 62 ? this.openTag() : G === 47 ? this.state = 35 : this.fail("disallowed character in attribute name."));
  54164. }
  54165. sAttribName() {
  54166. const G = this.captureNameChars();
  54167. G === 61 ? this.state = 39 : l(G) ? this.state = 38 : G === 62 ? (this.fail("attribute without value."), this.pushAttrib(this.name, this.name), this.name = this.text = "", this.openTag()) : G !== -1 && this.fail("disallowed character in attribute name.");
  54168. }
  54169. sAttribNameSawWhite() {
  54170. const G = this.skipSpaces();
  54171. switch (G) {
  54172. case -1:
  54173. return;
  54174. case 61:
  54175. this.state = 39;
  54176. break;
  54177. default:
  54178. this.fail("attribute without value."), this.text = "", this.name = "", G === 62 ? this.openTag() : a(G) ? (this.unget(), this.state = 37) : (this.fail("disallowed character in attribute name."), this.state = 36);
  54179. }
  54180. }
  54181. sAttribValue() {
  54182. const G = this.getCodeNorm();
  54183. R(G) ? (this.q = G, this.state = 40) : l(G) || (this.fail("unquoted attribute value."), this.state = 42, this.unget());
  54184. }
  54185. sAttribValueQuoted() {
  54186. const { q: G, chunk: w } = this;
  54187. let { i: W } = this;
  54188. for (; ; ) switch (this.getCode()) {
  54189. case G:
  54190. return this.pushAttrib(this.name, this.text + w.slice(W, this.prevI)), this.name = this.text = "", this.q = null, void (this.state = 41);
  54191. case 38:
  54192. return this.text += w.slice(W, this.prevI), this.state = 14, void (this.entityReturnState = 40);
  54193. case 10:
  54194. case -2:
  54195. case 9:
  54196. this.text += w.slice(W, this.prevI) + " ", W = this.i;
  54197. break;
  54198. case 60:
  54199. return this.text += w.slice(W, this.prevI), void this.fail("disallowed character.");
  54200. case -1:
  54201. return void (this.text += w.slice(W));
  54202. }
  54203. }
  54204. sAttribValueClosed() {
  54205. const G = this.getCodeNorm();
  54206. l(G) ? this.state = 36 : G === 62 ? this.openTag() : G === 47 ? this.state = 35 : a(G) ? (this.fail("no whitespace between attributes."), this.unget(), this.state = 37) : this.fail("disallowed character in attribute name.");
  54207. }
  54208. sAttribValueUnquoted() {
  54209. const G = this.captureTo(v);
  54210. switch (G) {
  54211. case 38:
  54212. this.state = 14, this.entityReturnState = 42;
  54213. break;
  54214. case 60:
  54215. this.fail("disallowed character.");
  54216. break;
  54217. case -1:
  54218. break;
  54219. default:
  54220. this.text.includes("]]>") && this.fail('the string "]]>" is disallowed in char data.'), this.pushAttrib(this.name, this.text), this.name = this.text = "", G === 62 ? this.openTag() : this.state = 36;
  54221. }
  54222. }
  54223. sCloseTag() {
  54224. const G = this.captureNameChars();
  54225. G === 62 ? this.closeTag() : l(G) ? this.state = 44 : G !== -1 && this.fail("disallowed character in closing tag.");
  54226. }
  54227. sCloseTagSawWhite() {
  54228. switch (this.skipSpaces()) {
  54229. case 62:
  54230. this.closeTag();
  54231. break;
  54232. case -1:
  54233. break;
  54234. default:
  54235. this.fail("disallowed character in closing tag.");
  54236. }
  54237. }
  54238. handleTextInRoot() {
  54239. let { i: G, forbiddenState: w } = this;
  54240. const { chunk: W, textHandler: y } = this;
  54241. g: for (; ; ) switch (this.getCode()) {
  54242. case 60:
  54243. if (this.state = 15, y !== void 0) {
  54244. const { text: f } = this, D = W.slice(G, this.prevI);
  54245. f.length !== 0 ? (y(f + D), this.text = "") : D.length !== 0 && y(D);
  54246. }
  54247. w = 0;
  54248. break g;
  54249. case 38:
  54250. this.state = 14, this.entityReturnState = 13, y !== void 0 && (this.text += W.slice(G, this.prevI)), w = 0;
  54251. break g;
  54252. case 93:
  54253. switch (w) {
  54254. case 0:
  54255. w = 1;
  54256. break;
  54257. case 1:
  54258. w = 2;
  54259. break;
  54260. case 2:
  54261. break;
  54262. default:
  54263. throw new Error("impossible state");
  54264. }
  54265. break;
  54266. case 62:
  54267. w === 2 && this.fail('the string "]]>" is disallowed in char data.'), w = 0;
  54268. break;
  54269. case -2:
  54270. y !== void 0 && (this.text += W.slice(G, this.prevI) + `
  54271. `), G = this.i, w = 0;
  54272. break;
  54273. case -1:
  54274. y !== void 0 && (this.text += W.slice(G));
  54275. break g;
  54276. default:
  54277. w = 0;
  54278. }
  54279. this.forbiddenState = w;
  54280. }
  54281. handleTextOutsideRoot() {
  54282. let { i: G } = this;
  54283. const { chunk: w, textHandler: W } = this;
  54284. let y = !1;
  54285. g: for (; ; ) {
  54286. const f = this.getCode();
  54287. switch (f) {
  54288. case 60:
  54289. if (this.state = 15, W !== void 0) {
  54290. const { text: D } = this, F = w.slice(G, this.prevI);
  54291. D.length !== 0 ? (W(D + F), this.text = "") : F.length !== 0 && W(F);
  54292. }
  54293. break g;
  54294. case 38:
  54295. this.state = 14, this.entityReturnState = 13, W !== void 0 && (this.text += w.slice(G, this.prevI)), y = !0;
  54296. break g;
  54297. case -2:
  54298. W !== void 0 && (this.text += w.slice(G, this.prevI) + `
  54299. `), G = this.i;
  54300. break;
  54301. case -1:
  54302. W !== void 0 && (this.text += w.slice(G));
  54303. break g;
  54304. default:
  54305. l(f) || (y = !0);
  54306. }
  54307. }
  54308. y && (this.sawRoot || this.reportedTextBeforeRoot || (this.fail("text data outside of root node."), this.reportedTextBeforeRoot = !0), this.closedRoot && !this.reportedTextAfterRoot && (this.fail("text data outside of root node."), this.reportedTextAfterRoot = !0));
  54309. }
  54310. pushAttribNS(G, w) {
  54311. var W;
  54312. const { prefix: y, local: f } = this.qname(G), D = { name: G, prefix: y, local: f, value: w };
  54313. if (this.attribList.push(D), (W = this.attributeHandler) === null || W === void 0 || W.call(this, D), y === "xmlns") {
  54314. const F = w.trim();
  54315. this.currentXMLVersion === "1.0" && F === "" && this.fail("invalid attempt to undefine prefix in XML 1.0"), this.topNS[f] = F, K(this, f, F);
  54316. } else if (G === "xmlns") {
  54317. const F = w.trim();
  54318. this.topNS[""] = F, K(this, "", F);
  54319. }
  54320. }
  54321. pushAttribPlain(G, w) {
  54322. var W;
  54323. const y = { name: G, value: w };
  54324. this.attribList.push(y), (W = this.attributeHandler) === null || W === void 0 || W.call(this, y);
  54325. }
  54326. end() {
  54327. var G, w;
  54328. this.sawRoot || this.fail("document must contain a root element.");
  54329. const { tags: W } = this;
  54330. for (; W.length > 0; ) {
  54331. const f = W.pop();
  54332. this.fail("unclosed tag: " + f.name);
  54333. }
  54334. this.state !== 0 && this.state !== 13 && this.fail("unexpected end.");
  54335. const { text: y } = this;
  54336. return y.length !== 0 && ((G = this.textHandler) === null || G === void 0 || G.call(this, y), this.text = ""), this._closed = !0, (w = this.endHandler) === null || w === void 0 || w.call(this), this._init(), this;
  54337. }
  54338. resolve(G) {
  54339. var w, W;
  54340. let y = this.topNS[G];
  54341. if (y !== void 0) return y;
  54342. const { tags: f } = this;
  54343. for (let D = f.length - 1; D >= 0; D--) if (y = f[D].ns[G], y !== void 0) return y;
  54344. return y = this.ns[G], y !== void 0 ? y : (W = (w = this.opt).resolvePrefix) === null || W === void 0 ? void 0 : W.call(w, G);
  54345. }
  54346. qname(G) {
  54347. const w = G.indexOf(":");
  54348. if (w === -1) return { prefix: "", local: G };
  54349. const W = G.slice(w + 1), y = G.slice(0, w);
  54350. return (y === "" || W === "" || W.includes(":")) && this.fail(`malformed name: ${G}.`), { prefix: y, local: W };
  54351. }
  54352. processAttribsNS() {
  54353. var G;
  54354. const { attribList: w } = this, W = this.tag;
  54355. {
  54356. const { prefix: D, local: F } = this.qname(W.name);
  54357. W.prefix = D, W.local = F;
  54358. const T = W.uri = (G = this.resolve(D)) !== null && G !== void 0 ? G : "";
  54359. D !== "" && (D === "xmlns" && this.fail('tags may not have "xmlns" as prefix.'), T === "" && (this.fail(`unbound namespace prefix: ${JSON.stringify(D)}.`), W.uri = D));
  54360. }
  54361. if (w.length === 0) return;
  54362. const { attributes: y } = W, f = /* @__PURE__ */ new Set();
  54363. for (const D of w) {
  54364. const { name: F, prefix: T, local: Q } = D;
  54365. let P, L;
  54366. T === "" ? (P = F === "xmlns" ? Z : "", L = F) : (P = this.resolve(T), P === void 0 && (this.fail(`unbound namespace prefix: ${JSON.stringify(T)}.`), P = T), L = `{${P}}${Q}`), f.has(L) && this.fail(`duplicate attribute: ${L}.`), f.add(L), D.uri = P, y[F] = D;
  54367. }
  54368. this.attribList = [];
  54369. }
  54370. processAttribsPlain() {
  54371. const { attribList: G } = this, w = this.tag.attributes;
  54372. for (const { name: W, value: y } of G) w[W] !== void 0 && this.fail(`duplicate attribute: ${W}.`), w[W] = y;
  54373. this.attribList = [];
  54374. }
  54375. openTag() {
  54376. var G;
  54377. this.processAttribs();
  54378. const { tags: w } = this, W = this.tag;
  54379. W.isSelfClosing = !1, (G = this.openTagHandler) === null || G === void 0 || G.call(this, W), w.push(W), this.state = 13, this.name = "";
  54380. }
  54381. openSelfClosingTag() {
  54382. var G, w, W;
  54383. this.processAttribs();
  54384. const { tags: y } = this, f = this.tag;
  54385. f.isSelfClosing = !0, (G = this.openTagHandler) === null || G === void 0 || G.call(this, f), (w = this.closeTagHandler) === null || w === void 0 || w.call(this, f), (this.tag = (W = y[y.length - 1]) !== null && W !== void 0 ? W : null) === null && (this.closedRoot = !0), this.state = 13, this.name = "";
  54386. }
  54387. closeTag() {
  54388. const { tags: G, name: w } = this;
  54389. if (this.state = 13, this.name = "", w === "") return this.fail("weird empty close tag."), void (this.text += "</>");
  54390. const W = this.closeTagHandler;
  54391. let y = G.length;
  54392. for (; y-- > 0; ) {
  54393. const f = this.tag = G.pop();
  54394. if (this.topNS = f.ns, W == null || W(f), f.name === w) break;
  54395. this.fail("unexpected close tag.");
  54396. }
  54397. y === 0 ? this.closedRoot = !0 : y < 0 && (this.fail(`unmatched closing tag: ${w}.`), this.text += `</${w}>`);
  54398. }
  54399. parseEntity(G) {
  54400. if (G[0] !== "#") {
  54401. const W = this.ENTITIES[G];
  54402. return W !== void 0 ? W : (this.fail(this.isName(G) ? "undefined entity." : "disallowed character in entity name."), `&${G};`);
  54403. }
  54404. let w = NaN;
  54405. return G[1] === "x" && /^#x[0-9a-f]+$/i.test(G) ? w = parseInt(G.slice(2), 16) : /^#[0-9]+$/.test(G) && (w = parseInt(G.slice(1), 10)), this.isChar(w) ? String.fromCodePoint(w) : (this.fail("malformed character entity."), `&${G};`);
  54406. }
  54407. };
  54408. }, { "xmlchars/xml/1.0/ed5": 543, "xmlchars/xml/1.1/ed2": 544, "xmlchars/xmlns/1.0/ed3": 545 }], 497: [function(g, C, i) {
  54409. var e = g("safe-buffer").Buffer;
  54410. function A(s, l) {
  54411. this._block = e.alloc(s), this._finalSize = l, this._blockSize = s, this._len = 0;
  54412. }
  54413. A.prototype.update = function(s, l) {
  54414. typeof s == "string" && (l = l || "utf8", s = e.from(s, l));
  54415. for (var n = this._block, a = this._blockSize, d = s.length, o = this._len, c = 0; c < d; ) {
  54416. for (var r = o % a, h = Math.min(d - c, a - r), b = 0; b < h; b++) n[r + b] = s[c + b];
  54417. c += h, (o += h) % a == 0 && this._update(n);
  54418. }
  54419. return this._len += d, this;
  54420. }, A.prototype.digest = function(s) {
  54421. var l = this._len % this._blockSize;
  54422. this._block[l] = 128, this._block.fill(0, l + 1), l >= this._finalSize && (this._update(this._block), this._block.fill(0));
  54423. var n = 8 * this._len;
  54424. if (n <= 4294967295) this._block.writeUInt32BE(n, this._blockSize - 4);
  54425. else {
  54426. var a = (4294967295 & n) >>> 0, d = (n - a) / 4294967296;
  54427. this._block.writeUInt32BE(d, this._blockSize - 8), this._block.writeUInt32BE(a, this._blockSize - 4);
  54428. }
  54429. this._update(this._block);
  54430. var o = this._hash();
  54431. return s ? o.toString(s) : o;
  54432. }, A.prototype._update = function() {
  54433. throw new Error("_update must be implemented by subclass");
  54434. }, C.exports = A;
  54435. }, { "safe-buffer": 494 }], 498: [function(g, C, i) {
  54436. var e = C.exports = function(A) {
  54437. A = A.toLowerCase();
  54438. var s = e[A];
  54439. if (!s) throw new Error(A + " is not supported (we accept pull requests)");
  54440. return new s();
  54441. };
  54442. e.sha = g("./sha"), e.sha1 = g("./sha1"), e.sha224 = g("./sha224"), e.sha256 = g("./sha256"), e.sha384 = g("./sha384"), e.sha512 = g("./sha512");
  54443. }, { "./sha": 499, "./sha1": 500, "./sha224": 501, "./sha256": 502, "./sha384": 503, "./sha512": 504 }], 499: [function(g, C, i) {
  54444. var e = g("inherits"), A = g("./hash"), s = g("safe-buffer").Buffer, l = [1518500249, 1859775393, -1894007588, -899497514], n = new Array(80);
  54445. function a() {
  54446. this.init(), this._w = n, A.call(this, 64, 56);
  54447. }
  54448. function d(c) {
  54449. return c << 30 | c >>> 2;
  54450. }
  54451. function o(c, r, h, b) {
  54452. return c === 0 ? r & h | ~r & b : c === 2 ? r & h | r & b | h & b : r ^ h ^ b;
  54453. }
  54454. e(a, A), a.prototype.init = function() {
  54455. return this._a = 1732584193, this._b = 4023233417, this._c = 2562383102, this._d = 271733878, this._e = 3285377520, this;
  54456. }, a.prototype._update = function(c) {
  54457. for (var r, h = this._w, b = 0 | this._a, u = 0 | this._b, m = 0 | this._c, Z = 0 | this._d, p = 0 | this._e, Y = 0; Y < 16; ++Y) h[Y] = c.readInt32BE(4 * Y);
  54458. for (; Y < 80; ++Y) h[Y] = h[Y - 3] ^ h[Y - 8] ^ h[Y - 14] ^ h[Y - 16];
  54459. for (var R = 0; R < 80; ++R) {
  54460. var X = ~~(R / 20), H = 0 | ((r = b) << 5 | r >>> 27) + o(X, u, m, Z) + p + h[R] + l[X];
  54461. p = Z, Z = m, m = d(u), u = b, b = H;
  54462. }
  54463. this._a = b + this._a | 0, this._b = u + this._b | 0, this._c = m + this._c | 0, this._d = Z + this._d | 0, this._e = p + this._e | 0;
  54464. }, a.prototype._hash = function() {
  54465. var c = s.allocUnsafe(20);
  54466. return c.writeInt32BE(0 | this._a, 0), c.writeInt32BE(0 | this._b, 4), c.writeInt32BE(0 | this._c, 8), c.writeInt32BE(0 | this._d, 12), c.writeInt32BE(0 | this._e, 16), c;
  54467. }, C.exports = a;
  54468. }, { "./hash": 497, inherits: 440, "safe-buffer": 494 }], 500: [function(g, C, i) {
  54469. var e = g("inherits"), A = g("./hash"), s = g("safe-buffer").Buffer, l = [1518500249, 1859775393, -1894007588, -899497514], n = new Array(80);
  54470. function a() {
  54471. this.init(), this._w = n, A.call(this, 64, 56);
  54472. }
  54473. function d(r) {
  54474. return r << 5 | r >>> 27;
  54475. }
  54476. function o(r) {
  54477. return r << 30 | r >>> 2;
  54478. }
  54479. function c(r, h, b, u) {
  54480. return r === 0 ? h & b | ~h & u : r === 2 ? h & b | h & u | b & u : h ^ b ^ u;
  54481. }
  54482. e(a, A), a.prototype.init = function() {
  54483. return this._a = 1732584193, this._b = 4023233417, this._c = 2562383102, this._d = 271733878, this._e = 3285377520, this;
  54484. }, a.prototype._update = function(r) {
  54485. for (var h, b = this._w, u = 0 | this._a, m = 0 | this._b, Z = 0 | this._c, p = 0 | this._d, Y = 0 | this._e, R = 0; R < 16; ++R) b[R] = r.readInt32BE(4 * R);
  54486. for (; R < 80; ++R) b[R] = (h = b[R - 3] ^ b[R - 8] ^ b[R - 14] ^ b[R - 16]) << 1 | h >>> 31;
  54487. for (var X = 0; X < 80; ++X) {
  54488. var H = ~~(X / 20), S = d(u) + c(H, m, Z, p) + Y + b[X] + l[H] | 0;
  54489. Y = p, p = Z, Z = o(m), m = u, u = S;
  54490. }
  54491. this._a = u + this._a | 0, this._b = m + this._b | 0, this._c = Z + this._c | 0, this._d = p + this._d | 0, this._e = Y + this._e | 0;
  54492. }, a.prototype._hash = function() {
  54493. var r = s.allocUnsafe(20);
  54494. return r.writeInt32BE(0 | this._a, 0), r.writeInt32BE(0 | this._b, 4), r.writeInt32BE(0 | this._c, 8), r.writeInt32BE(0 | this._d, 12), r.writeInt32BE(0 | this._e, 16), r;
  54495. }, C.exports = a;
  54496. }, { "./hash": 497, inherits: 440, "safe-buffer": 494 }], 501: [function(g, C, i) {
  54497. var e = g("inherits"), A = g("./sha256"), s = g("./hash"), l = g("safe-buffer").Buffer, n = new Array(64);
  54498. function a() {
  54499. this.init(), this._w = n, s.call(this, 64, 56);
  54500. }
  54501. e(a, A), a.prototype.init = function() {
  54502. return this._a = 3238371032, this._b = 914150663, this._c = 812702999, this._d = 4144912697, this._e = 4290775857, this._f = 1750603025, this._g = 1694076839, this._h = 3204075428, this;
  54503. }, a.prototype._hash = function() {
  54504. var d = l.allocUnsafe(28);
  54505. return d.writeInt32BE(this._a, 0), d.writeInt32BE(this._b, 4), d.writeInt32BE(this._c, 8), d.writeInt32BE(this._d, 12), d.writeInt32BE(this._e, 16), d.writeInt32BE(this._f, 20), d.writeInt32BE(this._g, 24), d;
  54506. }, C.exports = a;
  54507. }, { "./hash": 497, "./sha256": 502, inherits: 440, "safe-buffer": 494 }], 502: [function(g, C, i) {
  54508. var e = g("inherits"), A = g("./hash"), s = g("safe-buffer").Buffer, l = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298], n = new Array(64);
  54509. function a() {
  54510. this.init(), this._w = n, A.call(this, 64, 56);
  54511. }
  54512. function d(b, u, m) {
  54513. return m ^ b & (u ^ m);
  54514. }
  54515. function o(b, u, m) {
  54516. return b & u | m & (b | u);
  54517. }
  54518. function c(b) {
  54519. return (b >>> 2 | b << 30) ^ (b >>> 13 | b << 19) ^ (b >>> 22 | b << 10);
  54520. }
  54521. function r(b) {
  54522. return (b >>> 6 | b << 26) ^ (b >>> 11 | b << 21) ^ (b >>> 25 | b << 7);
  54523. }
  54524. function h(b) {
  54525. return (b >>> 7 | b << 25) ^ (b >>> 18 | b << 14) ^ b >>> 3;
  54526. }
  54527. e(a, A), a.prototype.init = function() {
  54528. return this._a = 1779033703, this._b = 3144134277, this._c = 1013904242, this._d = 2773480762, this._e = 1359893119, this._f = 2600822924, this._g = 528734635, this._h = 1541459225, this;
  54529. }, a.prototype._update = function(b) {
  54530. for (var u, m = this._w, Z = 0 | this._a, p = 0 | this._b, Y = 0 | this._c, R = 0 | this._d, X = 0 | this._e, H = 0 | this._f, S = 0 | this._g, z = 0 | this._h, v = 0; v < 16; ++v) m[v] = b.readInt32BE(4 * v);
  54531. for (; v < 64; ++v) m[v] = 0 | (((u = m[v - 2]) >>> 17 | u << 15) ^ (u >>> 19 | u << 13) ^ u >>> 10) + m[v - 7] + h(m[v - 15]) + m[v - 16];
  54532. for (var K = 0; K < 64; ++K) {
  54533. var V = z + r(X) + d(X, H, S) + l[K] + m[K] | 0, N = c(Z) + o(Z, p, Y) | 0;
  54534. z = S, S = H, H = X, X = R + V | 0, R = Y, Y = p, p = Z, Z = V + N | 0;
  54535. }
  54536. this._a = Z + this._a | 0, this._b = p + this._b | 0, this._c = Y + this._c | 0, this._d = R + this._d | 0, this._e = X + this._e | 0, this._f = H + this._f | 0, this._g = S + this._g | 0, this._h = z + this._h | 0;
  54537. }, a.prototype._hash = function() {
  54538. var b = s.allocUnsafe(32);
  54539. return b.writeInt32BE(this._a, 0), b.writeInt32BE(this._b, 4), b.writeInt32BE(this._c, 8), b.writeInt32BE(this._d, 12), b.writeInt32BE(this._e, 16), b.writeInt32BE(this._f, 20), b.writeInt32BE(this._g, 24), b.writeInt32BE(this._h, 28), b;
  54540. }, C.exports = a;
  54541. }, { "./hash": 497, inherits: 440, "safe-buffer": 494 }], 503: [function(g, C, i) {
  54542. var e = g("inherits"), A = g("./sha512"), s = g("./hash"), l = g("safe-buffer").Buffer, n = new Array(160);
  54543. function a() {
  54544. this.init(), this._w = n, s.call(this, 128, 112);
  54545. }
  54546. e(a, A), a.prototype.init = function() {
  54547. return this._ah = 3418070365, this._bh = 1654270250, this._ch = 2438529370, this._dh = 355462360, this._eh = 1731405415, this._fh = 2394180231, this._gh = 3675008525, this._hh = 1203062813, this._al = 3238371032, this._bl = 914150663, this._cl = 812702999, this._dl = 4144912697, this._el = 4290775857, this._fl = 1750603025, this._gl = 1694076839, this._hl = 3204075428, this;
  54548. }, a.prototype._hash = function() {
  54549. var d = l.allocUnsafe(48);
  54550. function o(c, r, h) {
  54551. d.writeInt32BE(c, h), d.writeInt32BE(r, h + 4);
  54552. }
  54553. return o(this._ah, this._al, 0), o(this._bh, this._bl, 8), o(this._ch, this._cl, 16), o(this._dh, this._dl, 24), o(this._eh, this._el, 32), o(this._fh, this._fl, 40), d;
  54554. }, C.exports = a;
  54555. }, { "./hash": 497, "./sha512": 504, inherits: 440, "safe-buffer": 494 }], 504: [function(g, C, i) {
  54556. var e = g("inherits"), A = g("./hash"), s = g("safe-buffer").Buffer, l = [1116352408, 3609767458, 1899447441, 602891725, 3049323471, 3964484399, 3921009573, 2173295548, 961987163, 4081628472, 1508970993, 3053834265, 2453635748, 2937671579, 2870763221, 3664609560, 3624381080, 2734883394, 310598401, 1164996542, 607225278, 1323610764, 1426881987, 3590304994, 1925078388, 4068182383, 2162078206, 991336113, 2614888103, 633803317, 3248222580, 3479774868, 3835390401, 2666613458, 4022224774, 944711139, 264347078, 2341262773, 604807628, 2007800933, 770255983, 1495990901, 1249150122, 1856431235, 1555081692, 3175218132, 1996064986, 2198950837, 2554220882, 3999719339, 2821834349, 766784016, 2952996808, 2566594879, 3210313671, 3203337956, 3336571891, 1034457026, 3584528711, 2466948901, 113926993, 3758326383, 338241895, 168717936, 666307205, 1188179964, 773529912, 1546045734, 1294757372, 1522805485, 1396182291, 2643833823, 1695183700, 2343527390, 1986661051, 1014477480, 2177026350, 1206759142, 2456956037, 344077627, 2730485921, 1290863460, 2820302411, 3158454273, 3259730800, 3505952657, 3345764771, 106217008, 3516065817, 3606008344, 3600352804, 1432725776, 4094571909, 1467031594, 275423344, 851169720, 430227734, 3100823752, 506948616, 1363258195, 659060556, 3750685593, 883997877, 3785050280, 958139571, 3318307427, 1322822218, 3812723403, 1537002063, 2003034995, 1747873779, 3602036899, 1955562222, 1575990012, 2024104815, 1125592928, 2227730452, 2716904306, 2361852424, 442776044, 2428436474, 593698344, 2756734187, 3733110249, 3204031479, 2999351573, 3329325298, 3815920427, 3391569614, 3928383900, 3515267271, 566280711, 3940187606, 3454069534, 4118630271, 4000239992, 116418474, 1914138554, 174292421, 2731055270, 289380356, 3203993006, 460393269, 320620315, 685471733, 587496836, 852142971, 1086792851, 1017036298, 365543100, 1126000580, 2618297676, 1288033470, 3409855158, 1501505948, 4234509866, 1607167915, 987167468, 1816402316, 1246189591], n = new Array(160);
  54557. function a() {
  54558. this.init(), this._w = n, A.call(this, 128, 112);
  54559. }
  54560. function d(p, Y, R) {
  54561. return R ^ p & (Y ^ R);
  54562. }
  54563. function o(p, Y, R) {
  54564. return p & Y | R & (p | Y);
  54565. }
  54566. function c(p, Y) {
  54567. return (p >>> 28 | Y << 4) ^ (Y >>> 2 | p << 30) ^ (Y >>> 7 | p << 25);
  54568. }
  54569. function r(p, Y) {
  54570. return (p >>> 14 | Y << 18) ^ (p >>> 18 | Y << 14) ^ (Y >>> 9 | p << 23);
  54571. }
  54572. function h(p, Y) {
  54573. return (p >>> 1 | Y << 31) ^ (p >>> 8 | Y << 24) ^ p >>> 7;
  54574. }
  54575. function b(p, Y) {
  54576. return (p >>> 1 | Y << 31) ^ (p >>> 8 | Y << 24) ^ (p >>> 7 | Y << 25);
  54577. }
  54578. function u(p, Y) {
  54579. return (p >>> 19 | Y << 13) ^ (Y >>> 29 | p << 3) ^ p >>> 6;
  54580. }
  54581. function m(p, Y) {
  54582. return (p >>> 19 | Y << 13) ^ (Y >>> 29 | p << 3) ^ (p >>> 6 | Y << 26);
  54583. }
  54584. function Z(p, Y) {
  54585. return p >>> 0 < Y >>> 0 ? 1 : 0;
  54586. }
  54587. e(a, A), a.prototype.init = function() {
  54588. return this._ah = 1779033703, this._bh = 3144134277, this._ch = 1013904242, this._dh = 2773480762, this._eh = 1359893119, this._fh = 2600822924, this._gh = 528734635, this._hh = 1541459225, this._al = 4089235720, this._bl = 2227873595, this._cl = 4271175723, this._dl = 1595750129, this._el = 2917565137, this._fl = 725511199, this._gl = 4215389547, this._hl = 327033209, this;
  54589. }, a.prototype._update = function(p) {
  54590. for (var Y = this._w, R = 0 | this._ah, X = 0 | this._bh, H = 0 | this._ch, S = 0 | this._dh, z = 0 | this._eh, v = 0 | this._fh, K = 0 | this._gh, V = 0 | this._hh, N = 0 | this._al, B = 0 | this._bl, G = 0 | this._cl, w = 0 | this._dl, W = 0 | this._el, y = 0 | this._fl, f = 0 | this._gl, D = 0 | this._hl, F = 0; F < 32; F += 2) Y[F] = p.readInt32BE(4 * F), Y[F + 1] = p.readInt32BE(4 * F + 4);
  54591. for (; F < 160; F += 2) {
  54592. var T = Y[F - 30], Q = Y[F - 30 + 1], P = h(T, Q), L = b(Q, T), E = u(T = Y[F - 4], Q = Y[F - 4 + 1]), J = m(Q, T), k = Y[F - 14], j = Y[F - 14 + 1], q = Y[F - 32], Cg = Y[F - 32 + 1], Ig = L + j | 0, x = P + k + Z(Ig, L) | 0;
  54593. x = (x = x + E + Z(Ig = Ig + J | 0, J) | 0) + q + Z(Ig = Ig + Cg | 0, Cg) | 0, Y[F] = x, Y[F + 1] = Ig;
  54594. }
  54595. for (var Ag = 0; Ag < 160; Ag += 2) {
  54596. x = Y[Ag], Ig = Y[Ag + 1];
  54597. var eg = o(R, X, H), O = o(N, B, G), _ = c(R, N), gg = c(N, R), lg = r(z, W), ng = r(W, z), sg = l[Ag], og = l[Ag + 1], cg = d(z, v, K), rg = d(W, y, f), dg = D + ng | 0, Bg = V + lg + Z(dg, D) | 0;
  54598. Bg = (Bg = (Bg = Bg + cg + Z(dg = dg + rg | 0, rg) | 0) + sg + Z(dg = dg + og | 0, og) | 0) + x + Z(dg = dg + Ig | 0, Ig) | 0;
  54599. var Zg = gg + O | 0, Xg = _ + eg + Z(Zg, gg) | 0;
  54600. V = K, D = f, K = v, f = y, v = z, y = W, z = S + Bg + Z(W = w + dg | 0, w) | 0, S = H, w = G, H = X, G = B, X = R, B = N, R = Bg + Xg + Z(N = dg + Zg | 0, dg) | 0;
  54601. }
  54602. this._al = this._al + N | 0, this._bl = this._bl + B | 0, this._cl = this._cl + G | 0, this._dl = this._dl + w | 0, this._el = this._el + W | 0, this._fl = this._fl + y | 0, this._gl = this._gl + f | 0, this._hl = this._hl + D | 0, this._ah = this._ah + R + Z(this._al, N) | 0, this._bh = this._bh + X + Z(this._bl, B) | 0, this._ch = this._ch + H + Z(this._cl, G) | 0, this._dh = this._dh + S + Z(this._dl, w) | 0, this._eh = this._eh + z + Z(this._el, W) | 0, this._fh = this._fh + v + Z(this._fl, y) | 0, this._gh = this._gh + K + Z(this._gl, f) | 0, this._hh = this._hh + V + Z(this._hl, D) | 0;
  54603. }, a.prototype._hash = function() {
  54604. var p = s.allocUnsafe(64);
  54605. function Y(R, X, H) {
  54606. p.writeInt32BE(R, H), p.writeInt32BE(X, H + 4);
  54607. }
  54608. return Y(this._ah, this._al, 0), Y(this._bh, this._bl, 8), Y(this._ch, this._cl, 16), Y(this._dh, this._dl, 24), Y(this._eh, this._el, 32), Y(this._fh, this._fl, 40), Y(this._gh, this._gl, 48), Y(this._hh, this._hl, 56), p;
  54609. }, C.exports = a;
  54610. }, { "./hash": 497, inherits: 440, "safe-buffer": 494 }], 505: [function(g, C, i) {
  54611. C.exports = A;
  54612. var e = g("events").EventEmitter;
  54613. function A() {
  54614. e.call(this);
  54615. }
  54616. g("inherits")(A, e), A.Readable = g("readable-stream/readable.js"), A.Writable = g("readable-stream/writable.js"), A.Duplex = g("readable-stream/duplex.js"), A.Transform = g("readable-stream/transform.js"), A.PassThrough = g("readable-stream/passthrough.js"), A.Stream = A, A.prototype.pipe = function(s, l) {
  54617. var n = this;
  54618. function a(u) {
  54619. s.writable && s.write(u) === !1 && n.pause && n.pause();
  54620. }
  54621. function d() {
  54622. n.readable && n.resume && n.resume();
  54623. }
  54624. n.on("data", a), s.on("drain", d), s._isStdio || l && l.end === !1 || (n.on("end", c), n.on("close", r));
  54625. var o = !1;
  54626. function c() {
  54627. o || (o = !0, s.end());
  54628. }
  54629. function r() {
  54630. o || (o = !0, typeof s.destroy == "function" && s.destroy());
  54631. }
  54632. function h(u) {
  54633. if (b(), e.listenerCount(this, "error") === 0) throw u;
  54634. }
  54635. function b() {
  54636. n.removeListener("data", a), s.removeListener("drain", d), n.removeListener("end", c), n.removeListener("close", r), n.removeListener("error", h), s.removeListener("error", h), n.removeListener("end", b), n.removeListener("close", b), s.removeListener("close", b);
  54637. }
  54638. return n.on("error", h), s.on("error", h), n.on("end", b), n.on("close", b), s.on("close", b), s.emit("pipe", n), s;
  54639. };
  54640. }, { events: 422, inherits: 440, "readable-stream/duplex.js": 507, "readable-stream/passthrough.js": 516, "readable-stream/readable.js": 517, "readable-stream/transform.js": 518, "readable-stream/writable.js": 519 }], 506: [function(g, C, i) {
  54641. var e = {}.toString;
  54642. C.exports = Array.isArray || function(A) {
  54643. return e.call(A) == "[object Array]";
  54644. };
  54645. }, {}], 507: [function(g, C, i) {
  54646. C.exports = g("./lib/_stream_duplex.js");
  54647. }, { "./lib/_stream_duplex.js": 508 }], 508: [function(g, C, i) {
  54648. var e = g("process-nextick-args"), A = Object.keys || function(b) {
  54649. var u = [];
  54650. for (var m in b) u.push(m);
  54651. return u;
  54652. };
  54653. C.exports = c;
  54654. var s = Object.create(g("core-util-is"));
  54655. s.inherits = g("inherits");
  54656. var l = g("./_stream_readable"), n = g("./_stream_writable");
  54657. s.inherits(c, l);
  54658. for (var a = A(n.prototype), d = 0; d < a.length; d++) {
  54659. var o = a[d];
  54660. c.prototype[o] || (c.prototype[o] = n.prototype[o]);
  54661. }
  54662. function c(b) {
  54663. if (!(this instanceof c)) return new c(b);
  54664. l.call(this, b), n.call(this, b), b && b.readable === !1 && (this.readable = !1), b && b.writable === !1 && (this.writable = !1), this.allowHalfOpen = !0, b && b.allowHalfOpen === !1 && (this.allowHalfOpen = !1), this.once("end", r);
  54665. }
  54666. function r() {
  54667. this.allowHalfOpen || this._writableState.ended || e.nextTick(h, this);
  54668. }
  54669. function h(b) {
  54670. b.end();
  54671. }
  54672. Object.defineProperty(c.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
  54673. return this._writableState.highWaterMark;
  54674. } }), Object.defineProperty(c.prototype, "destroyed", { get: function() {
  54675. return this._readableState !== void 0 && this._writableState !== void 0 && this._readableState.destroyed && this._writableState.destroyed;
  54676. }, set: function(b) {
  54677. this._readableState !== void 0 && this._writableState !== void 0 && (this._readableState.destroyed = b, this._writableState.destroyed = b);
  54678. } }), c.prototype._destroy = function(b, u) {
  54679. this.push(null), this.end(), e.nextTick(u, b);
  54680. };
  54681. }, { "./_stream_readable": 510, "./_stream_writable": 512, "core-util-is": 383, inherits: 440, "process-nextick-args": 466 }], 509: [function(g, C, i) {
  54682. C.exports = s;
  54683. var e = g("./_stream_transform"), A = Object.create(g("core-util-is"));
  54684. function s(l) {
  54685. if (!(this instanceof s)) return new s(l);
  54686. e.call(this, l);
  54687. }
  54688. A.inherits = g("inherits"), A.inherits(s, e), s.prototype._transform = function(l, n, a) {
  54689. a(null, l);
  54690. };
  54691. }, { "./_stream_transform": 511, "core-util-is": 383, inherits: 440 }], 510: [function(g, C, i) {
  54692. (function(e, A) {
  54693. (function() {
  54694. var s = g("process-nextick-args");
  54695. C.exports = R;
  54696. var l, n = g("isarray");
  54697. R.ReadableState = Y, g("events").EventEmitter;
  54698. var a = function(D, F) {
  54699. return D.listeners(F).length;
  54700. }, d = g("./internal/streams/stream"), o = g("safe-buffer").Buffer, c = (A !== void 0 ? A : typeof window < "u" ? window : typeof self < "u" ? self : {}).Uint8Array || function() {
  54701. }, r = Object.create(g("core-util-is"));
  54702. r.inherits = g("inherits");
  54703. var h = g("util"), b = void 0;
  54704. b = h && h.debuglog ? h.debuglog("stream") : function() {
  54705. };
  54706. var u, m = g("./internal/streams/BufferList"), Z = g("./internal/streams/destroy");
  54707. r.inherits(R, d);
  54708. var p = ["error", "close", "destroy", "pause", "resume"];
  54709. function Y(D, F) {
  54710. D = D || {};
  54711. var T = F instanceof (l = l || g("./_stream_duplex"));
  54712. this.objectMode = !!D.objectMode, T && (this.objectMode = this.objectMode || !!D.readableObjectMode);
  54713. var Q = D.highWaterMark, P = D.readableHighWaterMark, L = this.objectMode ? 16 : 16384;
  54714. this.highWaterMark = Q || Q === 0 ? Q : T && (P || P === 0) ? P : L, this.highWaterMark = Math.floor(this.highWaterMark), this.buffer = new m(), this.length = 0, this.pipes = null, this.pipesCount = 0, this.flowing = null, this.ended = !1, this.endEmitted = !1, this.reading = !1, this.sync = !0, this.needReadable = !1, this.emittedReadable = !1, this.readableListening = !1, this.resumeScheduled = !1, this.destroyed = !1, this.defaultEncoding = D.defaultEncoding || "utf8", this.awaitDrain = 0, this.readingMore = !1, this.decoder = null, this.encoding = null, D.encoding && (u || (u = g("string_decoder/").StringDecoder), this.decoder = new u(D.encoding), this.encoding = D.encoding);
  54715. }
  54716. function R(D) {
  54717. if (l = l || g("./_stream_duplex"), !(this instanceof R)) return new R(D);
  54718. this._readableState = new Y(D, this), this.readable = !0, D && (typeof D.read == "function" && (this._read = D.read), typeof D.destroy == "function" && (this._destroy = D.destroy)), d.call(this);
  54719. }
  54720. function X(D, F, T, Q, P) {
  54721. var L, E = D._readableState;
  54722. return F === null ? (E.reading = !1, function(J, k) {
  54723. if (!k.ended) {
  54724. if (k.decoder) {
  54725. var j = k.decoder.end();
  54726. j && j.length && (k.buffer.push(j), k.length += k.objectMode ? 1 : j.length);
  54727. }
  54728. k.ended = !0, z(J);
  54729. }
  54730. }(D, E)) : (P || (L = function(J, k) {
  54731. var j;
  54732. q = k, o.isBuffer(q) || q instanceof c || typeof k == "string" || k === void 0 || J.objectMode || (j = new TypeError("Invalid non-string/buffer chunk"));
  54733. var q;
  54734. return j;
  54735. }(E, F)), L ? D.emit("error", L) : E.objectMode || F && F.length > 0 ? (typeof F == "string" || E.objectMode || Object.getPrototypeOf(F) === o.prototype || (F = function(J) {
  54736. return o.from(J);
  54737. }(F)), Q ? E.endEmitted ? D.emit("error", new Error("stream.unshift() after end event")) : H(D, E, F, !0) : E.ended ? D.emit("error", new Error("stream.push() after EOF")) : (E.reading = !1, E.decoder && !T ? (F = E.decoder.write(F), E.objectMode || F.length !== 0 ? H(D, E, F, !1) : K(D, E)) : H(D, E, F, !1))) : Q || (E.reading = !1)), function(J) {
  54738. return !J.ended && (J.needReadable || J.length < J.highWaterMark || J.length === 0);
  54739. }(E);
  54740. }
  54741. function H(D, F, T, Q) {
  54742. F.flowing && F.length === 0 && !F.sync ? (D.emit("data", T), D.read(0)) : (F.length += F.objectMode ? 1 : T.length, Q ? F.buffer.unshift(T) : F.buffer.push(T), F.needReadable && z(D)), K(D, F);
  54743. }
  54744. Object.defineProperty(R.prototype, "destroyed", { get: function() {
  54745. return this._readableState !== void 0 && this._readableState.destroyed;
  54746. }, set: function(D) {
  54747. this._readableState && (this._readableState.destroyed = D);
  54748. } }), R.prototype.destroy = Z.destroy, R.prototype._undestroy = Z.undestroy, R.prototype._destroy = function(D, F) {
  54749. this.push(null), F(D);
  54750. }, R.prototype.push = function(D, F) {
  54751. var T, Q = this._readableState;
  54752. return Q.objectMode ? T = !0 : typeof D == "string" && ((F = F || Q.defaultEncoding) !== Q.encoding && (D = o.from(D, F), F = ""), T = !0), X(this, D, F, !1, T);
  54753. }, R.prototype.unshift = function(D) {
  54754. return X(this, D, null, !0, !1);
  54755. }, R.prototype.isPaused = function() {
  54756. return this._readableState.flowing === !1;
  54757. }, R.prototype.setEncoding = function(D) {
  54758. return u || (u = g("string_decoder/").StringDecoder), this._readableState.decoder = new u(D), this._readableState.encoding = D, this;
  54759. };
  54760. function S(D, F) {
  54761. return D <= 0 || F.length === 0 && F.ended ? 0 : F.objectMode ? 1 : D != D ? F.flowing && F.length ? F.buffer.head.data.length : F.length : (D > F.highWaterMark && (F.highWaterMark = function(T) {
  54762. return T >= 8388608 ? T = 8388608 : (T--, T |= T >>> 1, T |= T >>> 2, T |= T >>> 4, T |= T >>> 8, T |= T >>> 16, T++), T;
  54763. }(D)), D <= F.length ? D : F.ended ? F.length : (F.needReadable = !0, 0));
  54764. }
  54765. function z(D) {
  54766. var F = D._readableState;
  54767. F.needReadable = !1, F.emittedReadable || (b("emitReadable", F.flowing), F.emittedReadable = !0, F.sync ? s.nextTick(v, D) : v(D));
  54768. }
  54769. function v(D) {
  54770. b("emit readable"), D.emit("readable"), G(D);
  54771. }
  54772. function K(D, F) {
  54773. F.readingMore || (F.readingMore = !0, s.nextTick(V, D, F));
  54774. }
  54775. function V(D, F) {
  54776. for (var T = F.length; !F.reading && !F.flowing && !F.ended && F.length < F.highWaterMark && (b("maybeReadMore read 0"), D.read(0), T !== F.length); ) T = F.length;
  54777. F.readingMore = !1;
  54778. }
  54779. function N(D) {
  54780. b("readable nexttick read 0"), D.read(0);
  54781. }
  54782. function B(D, F) {
  54783. F.reading || (b("resume read 0"), D.read(0)), F.resumeScheduled = !1, F.awaitDrain = 0, D.emit("resume"), G(D), F.flowing && !F.reading && D.read(0);
  54784. }
  54785. function G(D) {
  54786. var F = D._readableState;
  54787. for (b("flow", F.flowing); F.flowing && D.read() !== null; ) ;
  54788. }
  54789. function w(D, F) {
  54790. return F.length === 0 ? null : (F.objectMode ? T = F.buffer.shift() : !D || D >= F.length ? (T = F.decoder ? F.buffer.join("") : F.buffer.length === 1 ? F.buffer.head.data : F.buffer.concat(F.length), F.buffer.clear()) : T = function(Q, P, L) {
  54791. var E;
  54792. return Q < P.head.data.length ? (E = P.head.data.slice(0, Q), P.head.data = P.head.data.slice(Q)) : E = Q === P.head.data.length ? P.shift() : L ? function(J, k) {
  54793. var j = k.head, q = 1, Cg = j.data;
  54794. for (J -= Cg.length; j = j.next; ) {
  54795. var Ig = j.data, x = J > Ig.length ? Ig.length : J;
  54796. if (x === Ig.length ? Cg += Ig : Cg += Ig.slice(0, J), (J -= x) === 0) {
  54797. x === Ig.length ? (++q, j.next ? k.head = j.next : k.head = k.tail = null) : (k.head = j, j.data = Ig.slice(x));
  54798. break;
  54799. }
  54800. ++q;
  54801. }
  54802. return k.length -= q, Cg;
  54803. }(Q, P) : function(J, k) {
  54804. var j = o.allocUnsafe(J), q = k.head, Cg = 1;
  54805. for (q.data.copy(j), J -= q.data.length; q = q.next; ) {
  54806. var Ig = q.data, x = J > Ig.length ? Ig.length : J;
  54807. if (Ig.copy(j, j.length - J, 0, x), (J -= x) === 0) {
  54808. x === Ig.length ? (++Cg, q.next ? k.head = q.next : k.head = k.tail = null) : (k.head = q, q.data = Ig.slice(x));
  54809. break;
  54810. }
  54811. ++Cg;
  54812. }
  54813. return k.length -= Cg, j;
  54814. }(Q, P), E;
  54815. }(D, F.buffer, F.decoder), T);
  54816. var T;
  54817. }
  54818. function W(D) {
  54819. var F = D._readableState;
  54820. if (F.length > 0) throw new Error('"endReadable()" called on non-empty stream');
  54821. F.endEmitted || (F.ended = !0, s.nextTick(y, F, D));
  54822. }
  54823. function y(D, F) {
  54824. D.endEmitted || D.length !== 0 || (D.endEmitted = !0, F.readable = !1, F.emit("end"));
  54825. }
  54826. function f(D, F) {
  54827. for (var T = 0, Q = D.length; T < Q; T++) if (D[T] === F) return T;
  54828. return -1;
  54829. }
  54830. R.prototype.read = function(D) {
  54831. b("read", D), D = parseInt(D, 10);
  54832. var F = this._readableState, T = D;
  54833. if (D !== 0 && (F.emittedReadable = !1), D === 0 && F.needReadable && (F.length >= F.highWaterMark || F.ended)) return b("read: emitReadable", F.length, F.ended), F.length === 0 && F.ended ? W(this) : z(this), null;
  54834. if ((D = S(D, F)) === 0 && F.ended) return F.length === 0 && W(this), null;
  54835. var Q, P = F.needReadable;
  54836. return b("need readable", P), (F.length === 0 || F.length - D < F.highWaterMark) && b("length less than watermark", P = !0), F.ended || F.reading ? b("reading or ended", P = !1) : P && (b("do read"), F.reading = !0, F.sync = !0, F.length === 0 && (F.needReadable = !0), this._read(F.highWaterMark), F.sync = !1, F.reading || (D = S(T, F))), (Q = D > 0 ? w(D, F) : null) === null ? (F.needReadable = !0, D = 0) : F.length -= D, F.length === 0 && (F.ended || (F.needReadable = !0), T !== D && F.ended && W(this)), Q !== null && this.emit("data", Q), Q;
  54837. }, R.prototype._read = function(D) {
  54838. this.emit("error", new Error("_read() is not implemented"));
  54839. }, R.prototype.pipe = function(D, F) {
  54840. var T = this, Q = this._readableState;
  54841. switch (Q.pipesCount) {
  54842. case 0:
  54843. Q.pipes = D;
  54844. break;
  54845. case 1:
  54846. Q.pipes = [Q.pipes, D];
  54847. break;
  54848. default:
  54849. Q.pipes.push(D);
  54850. }
  54851. Q.pipesCount += 1, b("pipe count=%d opts=%j", Q.pipesCount, F);
  54852. var P = (!F || F.end !== !1) && D !== e.stdout && D !== e.stderr ? E : Ag;
  54853. function L(eg, O) {
  54854. b("onunpipe"), eg === T && O && O.hasUnpiped === !1 && (O.hasUnpiped = !0, b("cleanup"), D.removeListener("close", Ig), D.removeListener("finish", x), D.removeListener("drain", J), D.removeListener("error", Cg), D.removeListener("unpipe", L), T.removeListener("end", E), T.removeListener("end", Ag), T.removeListener("data", q), k = !0, !Q.awaitDrain || D._writableState && !D._writableState.needDrain || J());
  54855. }
  54856. function E() {
  54857. b("onend"), D.end();
  54858. }
  54859. Q.endEmitted ? s.nextTick(P) : T.once("end", P), D.on("unpipe", L);
  54860. var J = /* @__PURE__ */ function(eg) {
  54861. return function() {
  54862. var O = eg._readableState;
  54863. b("pipeOnDrain", O.awaitDrain), O.awaitDrain && O.awaitDrain--, O.awaitDrain === 0 && a(eg, "data") && (O.flowing = !0, G(eg));
  54864. };
  54865. }(T);
  54866. D.on("drain", J);
  54867. var k = !1, j = !1;
  54868. function q(eg) {
  54869. b("ondata"), j = !1, D.write(eg) !== !1 || j || ((Q.pipesCount === 1 && Q.pipes === D || Q.pipesCount > 1 && f(Q.pipes, D) !== -1) && !k && (b("false write response, pause", Q.awaitDrain), Q.awaitDrain++, j = !0), T.pause());
  54870. }
  54871. function Cg(eg) {
  54872. b("onerror", eg), Ag(), D.removeListener("error", Cg), a(D, "error") === 0 && D.emit("error", eg);
  54873. }
  54874. function Ig() {
  54875. D.removeListener("finish", x), Ag();
  54876. }
  54877. function x() {
  54878. b("onfinish"), D.removeListener("close", Ig), Ag();
  54879. }
  54880. function Ag() {
  54881. b("unpipe"), T.unpipe(D);
  54882. }
  54883. return T.on("data", q), function(eg, O, _) {
  54884. if (typeof eg.prependListener == "function") return eg.prependListener(O, _);
  54885. eg._events && eg._events[O] ? n(eg._events[O]) ? eg._events[O].unshift(_) : eg._events[O] = [_, eg._events[O]] : eg.on(O, _);
  54886. }(D, "error", Cg), D.once("close", Ig), D.once("finish", x), D.emit("pipe", T), Q.flowing || (b("pipe resume"), T.resume()), D;
  54887. }, R.prototype.unpipe = function(D) {
  54888. var F = this._readableState, T = { hasUnpiped: !1 };
  54889. if (F.pipesCount === 0) return this;
  54890. if (F.pipesCount === 1) return D && D !== F.pipes || (D || (D = F.pipes), F.pipes = null, F.pipesCount = 0, F.flowing = !1, D && D.emit("unpipe", this, T)), this;
  54891. if (!D) {
  54892. var Q = F.pipes, P = F.pipesCount;
  54893. F.pipes = null, F.pipesCount = 0, F.flowing = !1;
  54894. for (var L = 0; L < P; L++) Q[L].emit("unpipe", this, { hasUnpiped: !1 });
  54895. return this;
  54896. }
  54897. var E = f(F.pipes, D);
  54898. return E === -1 || (F.pipes.splice(E, 1), F.pipesCount -= 1, F.pipesCount === 1 && (F.pipes = F.pipes[0]), D.emit("unpipe", this, T)), this;
  54899. }, R.prototype.on = function(D, F) {
  54900. var T = d.prototype.on.call(this, D, F);
  54901. if (D === "data") this._readableState.flowing !== !1 && this.resume();
  54902. else if (D === "readable") {
  54903. var Q = this._readableState;
  54904. Q.endEmitted || Q.readableListening || (Q.readableListening = Q.needReadable = !0, Q.emittedReadable = !1, Q.reading ? Q.length && z(this) : s.nextTick(N, this));
  54905. }
  54906. return T;
  54907. }, R.prototype.addListener = R.prototype.on, R.prototype.resume = function() {
  54908. var D = this._readableState;
  54909. return D.flowing || (b("resume"), D.flowing = !0, function(F, T) {
  54910. T.resumeScheduled || (T.resumeScheduled = !0, s.nextTick(B, F, T));
  54911. }(this, D)), this;
  54912. }, R.prototype.pause = function() {
  54913. return b("call pause flowing=%j", this._readableState.flowing), this._readableState.flowing !== !1 && (b("pause"), this._readableState.flowing = !1, this.emit("pause")), this;
  54914. }, R.prototype.wrap = function(D) {
  54915. var F = this, T = this._readableState, Q = !1;
  54916. for (var P in D.on("end", function() {
  54917. if (b("wrapped end"), T.decoder && !T.ended) {
  54918. var E = T.decoder.end();
  54919. E && E.length && F.push(E);
  54920. }
  54921. F.push(null);
  54922. }), D.on("data", function(E) {
  54923. b("wrapped data"), T.decoder && (E = T.decoder.write(E)), T.objectMode && E == null || (T.objectMode || E && E.length) && (F.push(E) || (Q = !0, D.pause()));
  54924. }), D) this[P] === void 0 && typeof D[P] == "function" && (this[P] = /* @__PURE__ */ function(E) {
  54925. return function() {
  54926. return D[E].apply(D, arguments);
  54927. };
  54928. }(P));
  54929. for (var L = 0; L < p.length; L++) D.on(p[L], this.emit.bind(this, p[L]));
  54930. return this._read = function(E) {
  54931. b("wrapped _read", E), Q && (Q = !1, D.resume());
  54932. }, this;
  54933. }, Object.defineProperty(R.prototype, "readableHighWaterMark", { enumerable: !1, get: function() {
  54934. return this._readableState.highWaterMark;
  54935. } }), R._fromList = w;
  54936. }).call(this);
  54937. }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  54938. }, { "./_stream_duplex": 508, "./internal/streams/BufferList": 513, "./internal/streams/destroy": 514, "./internal/streams/stream": 515, _process: 467, "core-util-is": 383, events: 422, inherits: 440, isarray: 506, "process-nextick-args": 466, "safe-buffer": 520, "string_decoder/": 521, util: 188 }], 511: [function(g, C, i) {
  54939. C.exports = l;
  54940. var e = g("./_stream_duplex"), A = Object.create(g("core-util-is"));
  54941. function s(d, o) {
  54942. var c = this._transformState;
  54943. c.transforming = !1;
  54944. var r = c.writecb;
  54945. if (!r) return this.emit("error", new Error("write callback called multiple times"));
  54946. c.writechunk = null, c.writecb = null, o != null && this.push(o), r(d);
  54947. var h = this._readableState;
  54948. h.reading = !1, (h.needReadable || h.length < h.highWaterMark) && this._read(h.highWaterMark);
  54949. }
  54950. function l(d) {
  54951. if (!(this instanceof l)) return new l(d);
  54952. e.call(this, d), this._transformState = { afterTransform: s.bind(this), needTransform: !1, transforming: !1, writecb: null, writechunk: null, writeencoding: null }, this._readableState.needReadable = !0, this._readableState.sync = !1, d && (typeof d.transform == "function" && (this._transform = d.transform), typeof d.flush == "function" && (this._flush = d.flush)), this.on("prefinish", n);
  54953. }
  54954. function n() {
  54955. var d = this;
  54956. typeof this._flush == "function" ? this._flush(function(o, c) {
  54957. a(d, o, c);
  54958. }) : a(this, null, null);
  54959. }
  54960. function a(d, o, c) {
  54961. if (o) return d.emit("error", o);
  54962. if (c != null && d.push(c), d._writableState.length) throw new Error("Calling transform done when ws.length != 0");
  54963. if (d._transformState.transforming) throw new Error("Calling transform done when still transforming");
  54964. return d.push(null);
  54965. }
  54966. A.inherits = g("inherits"), A.inherits(l, e), l.prototype.push = function(d, o) {
  54967. return this._transformState.needTransform = !1, e.prototype.push.call(this, d, o);
  54968. }, l.prototype._transform = function(d, o, c) {
  54969. throw new Error("_transform() is not implemented");
  54970. }, l.prototype._write = function(d, o, c) {
  54971. var r = this._transformState;
  54972. if (r.writecb = c, r.writechunk = d, r.writeencoding = o, !r.transforming) {
  54973. var h = this._readableState;
  54974. (r.needTransform || h.needReadable || h.length < h.highWaterMark) && this._read(h.highWaterMark);
  54975. }
  54976. }, l.prototype._read = function(d) {
  54977. var o = this._transformState;
  54978. o.writechunk !== null && o.writecb && !o.transforming ? (o.transforming = !0, this._transform(o.writechunk, o.writeencoding, o.afterTransform)) : o.needTransform = !0;
  54979. }, l.prototype._destroy = function(d, o) {
  54980. var c = this;
  54981. e.prototype._destroy.call(this, d, function(r) {
  54982. o(r), c.emit("close");
  54983. });
  54984. };
  54985. }, { "./_stream_duplex": 508, "core-util-is": 383, inherits: 440 }], 512: [function(g, C, i) {
  54986. (function(e, A, s) {
  54987. (function() {
  54988. var l = g("process-nextick-args");
  54989. function n(K) {
  54990. var V = this;
  54991. this.next = null, this.entry = null, this.finish = function() {
  54992. (function(N, B, G) {
  54993. var w = N.entry;
  54994. for (N.entry = null; w; ) {
  54995. var W = w.callback;
  54996. B.pendingcb--, W(G), w = w.next;
  54997. }
  54998. B.corkedRequestsFree.next = N;
  54999. })(V, K);
  55000. };
  55001. }
  55002. C.exports = Y;
  55003. var a, d = !e.browser && ["v0.10", "v0.9."].indexOf(e.version.slice(0, 5)) > -1 ? s : l.nextTick;
  55004. Y.WritableState = p;
  55005. var o = Object.create(g("core-util-is"));
  55006. o.inherits = g("inherits");
  55007. var c = { deprecate: g("util-deprecate") }, r = g("./internal/streams/stream"), h = g("safe-buffer").Buffer, b = (A !== void 0 ? A : typeof window < "u" ? window : typeof self < "u" ? self : {}).Uint8Array || function() {
  55008. }, u, m = g("./internal/streams/destroy");
  55009. function Z() {
  55010. }
  55011. function p(K, V) {
  55012. a = a || g("./_stream_duplex"), K = K || {};
  55013. var N = V instanceof a;
  55014. this.objectMode = !!K.objectMode, N && (this.objectMode = this.objectMode || !!K.writableObjectMode);
  55015. var B = K.highWaterMark, G = K.writableHighWaterMark, w = this.objectMode ? 16 : 16384;
  55016. this.highWaterMark = B || B === 0 ? B : N && (G || G === 0) ? G : w, this.highWaterMark = Math.floor(this.highWaterMark), this.finalCalled = !1, this.needDrain = !1, this.ending = !1, this.ended = !1, this.finished = !1, this.destroyed = !1;
  55017. var W = K.decodeStrings === !1;
  55018. this.decodeStrings = !W, this.defaultEncoding = K.defaultEncoding || "utf8", this.length = 0, this.writing = !1, this.corked = 0, this.sync = !0, this.bufferProcessing = !1, this.onwrite = function(y) {
  55019. (function(f, D) {
  55020. var F = f._writableState, T = F.sync, Q = F.writecb;
  55021. if (function(L) {
  55022. L.writing = !1, L.writecb = null, L.length -= L.writelen, L.writelen = 0;
  55023. }(F), D) (function(L, E, J, k, j) {
  55024. --E.pendingcb, J ? (l.nextTick(j, k), l.nextTick(v, L, E), L._writableState.errorEmitted = !0, L.emit("error", k)) : (j(k), L._writableState.errorEmitted = !0, L.emit("error", k), v(L, E));
  55025. })(f, F, T, D, Q);
  55026. else {
  55027. var P = S(F);
  55028. P || F.corked || F.bufferProcessing || !F.bufferedRequest || H(f, F), T ? d(X, f, F, P, Q) : X(f, F, P, Q);
  55029. }
  55030. })(V, y);
  55031. }, this.writecb = null, this.writelen = 0, this.bufferedRequest = null, this.lastBufferedRequest = null, this.pendingcb = 0, this.prefinished = !1, this.errorEmitted = !1, this.bufferedRequestCount = 0, this.corkedRequestsFree = new n(this);
  55032. }
  55033. function Y(K) {
  55034. if (a = a || g("./_stream_duplex"), !(u.call(Y, this) || this instanceof a)) return new Y(K);
  55035. this._writableState = new p(K, this), this.writable = !0, K && (typeof K.write == "function" && (this._write = K.write), typeof K.writev == "function" && (this._writev = K.writev), typeof K.destroy == "function" && (this._destroy = K.destroy), typeof K.final == "function" && (this._final = K.final)), r.call(this);
  55036. }
  55037. function R(K, V, N, B, G, w, W) {
  55038. V.writelen = B, V.writecb = W, V.writing = !0, V.sync = !0, N ? K._writev(G, V.onwrite) : K._write(G, w, V.onwrite), V.sync = !1;
  55039. }
  55040. function X(K, V, N, B) {
  55041. N || function(G, w) {
  55042. w.length === 0 && w.needDrain && (w.needDrain = !1, G.emit("drain"));
  55043. }(K, V), V.pendingcb--, B(), v(K, V);
  55044. }
  55045. function H(K, V) {
  55046. V.bufferProcessing = !0;
  55047. var N = V.bufferedRequest;
  55048. if (K._writev && N && N.next) {
  55049. var B = V.bufferedRequestCount, G = new Array(B), w = V.corkedRequestsFree;
  55050. w.entry = N;
  55051. for (var W = 0, y = !0; N; ) G[W] = N, N.isBuf || (y = !1), N = N.next, W += 1;
  55052. G.allBuffers = y, R(K, V, !0, V.length, G, "", w.finish), V.pendingcb++, V.lastBufferedRequest = null, w.next ? (V.corkedRequestsFree = w.next, w.next = null) : V.corkedRequestsFree = new n(V), V.bufferedRequestCount = 0;
  55053. } else {
  55054. for (; N; ) {
  55055. var f = N.chunk, D = N.encoding, F = N.callback;
  55056. if (R(K, V, !1, V.objectMode ? 1 : f.length, f, D, F), N = N.next, V.bufferedRequestCount--, V.writing) break;
  55057. }
  55058. N === null && (V.lastBufferedRequest = null);
  55059. }
  55060. V.bufferedRequest = N, V.bufferProcessing = !1;
  55061. }
  55062. function S(K) {
  55063. return K.ending && K.length === 0 && K.bufferedRequest === null && !K.finished && !K.writing;
  55064. }
  55065. function z(K, V) {
  55066. K._final(function(N) {
  55067. V.pendingcb--, N && K.emit("error", N), V.prefinished = !0, K.emit("prefinish"), v(K, V);
  55068. });
  55069. }
  55070. function v(K, V) {
  55071. var N = S(V);
  55072. return N && (function(B, G) {
  55073. G.prefinished || G.finalCalled || (typeof B._final == "function" ? (G.pendingcb++, G.finalCalled = !0, l.nextTick(z, B, G)) : (G.prefinished = !0, B.emit("prefinish")));
  55074. }(K, V), V.pendingcb === 0 && (V.finished = !0, K.emit("finish"))), N;
  55075. }
  55076. o.inherits(Y, r), p.prototype.getBuffer = function() {
  55077. for (var K = this.bufferedRequest, V = []; K; ) V.push(K), K = K.next;
  55078. return V;
  55079. }, function() {
  55080. try {
  55081. Object.defineProperty(p.prototype, "buffer", { get: c.deprecate(function() {
  55082. return this.getBuffer();
  55083. }, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.", "DEP0003") });
  55084. } catch {
  55085. }
  55086. }(), typeof Symbol == "function" && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] == "function" ? (u = Function.prototype[Symbol.hasInstance], Object.defineProperty(Y, Symbol.hasInstance, { value: function(K) {
  55087. return !!u.call(this, K) || this === Y && K && K._writableState instanceof p;
  55088. } })) : u = function(K) {
  55089. return K instanceof this;
  55090. }, Y.prototype.pipe = function() {
  55091. this.emit("error", new Error("Cannot pipe, not readable"));
  55092. }, Y.prototype.write = function(K, V, N) {
  55093. var B, G = this._writableState, w = !1, W = !G.objectMode && (B = K, h.isBuffer(B) || B instanceof b);
  55094. return W && !h.isBuffer(K) && (K = function(y) {
  55095. return h.from(y);
  55096. }(K)), typeof V == "function" && (N = V, V = null), W ? V = "buffer" : V || (V = G.defaultEncoding), typeof N != "function" && (N = Z), G.ended ? function(y, f) {
  55097. var D = new Error("write after end");
  55098. y.emit("error", D), l.nextTick(f, D);
  55099. }(this, N) : (W || function(y, f, D, F) {
  55100. var T = !0, Q = !1;
  55101. return D === null ? Q = new TypeError("May not write null values to stream") : typeof D == "string" || D === void 0 || f.objectMode || (Q = new TypeError("Invalid non-string/buffer chunk")), Q && (y.emit("error", Q), l.nextTick(F, Q), T = !1), T;
  55102. }(this, G, K, N)) && (G.pendingcb++, w = function(y, f, D, F, T, Q) {
  55103. if (!D) {
  55104. var P = function(k, j, q) {
  55105. return k.objectMode || k.decodeStrings === !1 || typeof j != "string" || (j = h.from(j, q)), j;
  55106. }(f, F, T);
  55107. F !== P && (D = !0, T = "buffer", F = P);
  55108. }
  55109. var L = f.objectMode ? 1 : F.length;
  55110. f.length += L;
  55111. var E = f.length < f.highWaterMark;
  55112. if (E || (f.needDrain = !0), f.writing || f.corked) {
  55113. var J = f.lastBufferedRequest;
  55114. f.lastBufferedRequest = { chunk: F, encoding: T, isBuf: D, callback: Q, next: null }, J ? J.next = f.lastBufferedRequest : f.bufferedRequest = f.lastBufferedRequest, f.bufferedRequestCount += 1;
  55115. } else R(y, f, !1, L, F, T, Q);
  55116. return E;
  55117. }(this, G, W, K, V, N)), w;
  55118. }, Y.prototype.cork = function() {
  55119. this._writableState.corked++;
  55120. }, Y.prototype.uncork = function() {
  55121. var K = this._writableState;
  55122. K.corked && (K.corked--, K.writing || K.corked || K.bufferProcessing || !K.bufferedRequest || H(this, K));
  55123. }, Y.prototype.setDefaultEncoding = function(K) {
  55124. if (typeof K == "string" && (K = K.toLowerCase()), !(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((K + "").toLowerCase()) > -1)) throw new TypeError("Unknown encoding: " + K);
  55125. return this._writableState.defaultEncoding = K, this;
  55126. }, Object.defineProperty(Y.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
  55127. return this._writableState.highWaterMark;
  55128. } }), Y.prototype._write = function(K, V, N) {
  55129. N(new Error("_write() is not implemented"));
  55130. }, Y.prototype._writev = null, Y.prototype.end = function(K, V, N) {
  55131. var B = this._writableState;
  55132. typeof K == "function" ? (N = K, K = null, V = null) : typeof V == "function" && (N = V, V = null), K != null && this.write(K, V), B.corked && (B.corked = 1, this.uncork()), B.ending || function(G, w, W) {
  55133. w.ending = !0, v(G, w), W && (w.finished ? l.nextTick(W) : G.once("finish", W)), w.ended = !0, G.writable = !1;
  55134. }(this, B, N);
  55135. }, Object.defineProperty(Y.prototype, "destroyed", { get: function() {
  55136. return this._writableState !== void 0 && this._writableState.destroyed;
  55137. }, set: function(K) {
  55138. this._writableState && (this._writableState.destroyed = K);
  55139. } }), Y.prototype.destroy = m.destroy, Y.prototype._undestroy = m.undestroy, Y.prototype._destroy = function(K, V) {
  55140. this.end(), V(K);
  55141. };
  55142. }).call(this);
  55143. }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {}, g("timers").setImmediate);
  55144. }, { "./_stream_duplex": 508, "./internal/streams/destroy": 514, "./internal/streams/stream": 515, _process: 467, "core-util-is": 383, inherits: 440, "process-nextick-args": 466, "safe-buffer": 520, timers: 523, "util-deprecate": 524 }], 513: [function(g, C, i) {
  55145. var e = g("safe-buffer").Buffer, A = g("util");
  55146. C.exports = function() {
  55147. function s() {
  55148. (function(l, n) {
  55149. if (!(l instanceof n)) throw new TypeError("Cannot call a class as a function");
  55150. })(this, s), this.head = null, this.tail = null, this.length = 0;
  55151. }
  55152. return s.prototype.push = function(l) {
  55153. var n = { data: l, next: null };
  55154. this.length > 0 ? this.tail.next = n : this.head = n, this.tail = n, ++this.length;
  55155. }, s.prototype.unshift = function(l) {
  55156. var n = { data: l, next: this.head };
  55157. this.length === 0 && (this.tail = n), this.head = n, ++this.length;
  55158. }, s.prototype.shift = function() {
  55159. if (this.length !== 0) {
  55160. var l = this.head.data;
  55161. return this.length === 1 ? this.head = this.tail = null : this.head = this.head.next, --this.length, l;
  55162. }
  55163. }, s.prototype.clear = function() {
  55164. this.head = this.tail = null, this.length = 0;
  55165. }, s.prototype.join = function(l) {
  55166. if (this.length === 0) return "";
  55167. for (var n = this.head, a = "" + n.data; n = n.next; ) a += l + n.data;
  55168. return a;
  55169. }, s.prototype.concat = function(l) {
  55170. if (this.length === 0) return e.alloc(0);
  55171. for (var n, a, d, o = e.allocUnsafe(l >>> 0), c = this.head, r = 0; c; ) n = c.data, a = o, d = r, n.copy(a, d), r += c.data.length, c = c.next;
  55172. return o;
  55173. }, s;
  55174. }(), A && A.inspect && A.inspect.custom && (C.exports.prototype[A.inspect.custom] = function() {
  55175. var s = A.inspect({ length: this.length });
  55176. return this.constructor.name + " " + s;
  55177. });
  55178. }, { "safe-buffer": 520, util: 188 }], 514: [function(g, C, i) {
  55179. var e = g("process-nextick-args");
  55180. function A(s, l) {
  55181. s.emit("error", l);
  55182. }
  55183. C.exports = { destroy: function(s, l) {
  55184. var n = this, a = this._readableState && this._readableState.destroyed, d = this._writableState && this._writableState.destroyed;
  55185. return a || d ? (l ? l(s) : s && (this._writableState ? this._writableState.errorEmitted || (this._writableState.errorEmitted = !0, e.nextTick(A, this, s)) : e.nextTick(A, this, s)), this) : (this._readableState && (this._readableState.destroyed = !0), this._writableState && (this._writableState.destroyed = !0), this._destroy(s || null, function(o) {
  55186. !l && o ? n._writableState ? n._writableState.errorEmitted || (n._writableState.errorEmitted = !0, e.nextTick(A, n, o)) : e.nextTick(A, n, o) : l && l(o);
  55187. }), this);
  55188. }, undestroy: function() {
  55189. this._readableState && (this._readableState.destroyed = !1, this._readableState.reading = !1, this._readableState.ended = !1, this._readableState.endEmitted = !1), this._writableState && (this._writableState.destroyed = !1, this._writableState.ended = !1, this._writableState.ending = !1, this._writableState.finalCalled = !1, this._writableState.prefinished = !1, this._writableState.finished = !1, this._writableState.errorEmitted = !1);
  55190. } };
  55191. }, { "process-nextick-args": 466 }], 515: [function(g, C, i) {
  55192. arguments[4][490][0].apply(i, arguments);
  55193. }, { dup: 490, events: 422 }], 516: [function(g, C, i) {
  55194. C.exports = g("./readable").PassThrough;
  55195. }, { "./readable": 517 }], 517: [function(g, C, i) {
  55196. (i = C.exports = g("./lib/_stream_readable.js")).Stream = i, i.Readable = i, i.Writable = g("./lib/_stream_writable.js"), i.Duplex = g("./lib/_stream_duplex.js"), i.Transform = g("./lib/_stream_transform.js"), i.PassThrough = g("./lib/_stream_passthrough.js");
  55197. }, { "./lib/_stream_duplex.js": 508, "./lib/_stream_passthrough.js": 509, "./lib/_stream_readable.js": 510, "./lib/_stream_transform.js": 511, "./lib/_stream_writable.js": 512 }], 518: [function(g, C, i) {
  55198. C.exports = g("./readable").Transform;
  55199. }, { "./readable": 517 }], 519: [function(g, C, i) {
  55200. C.exports = g("./lib/_stream_writable.js");
  55201. }, { "./lib/_stream_writable.js": 512 }], 520: [function(g, C, i) {
  55202. arguments[4][217][0].apply(i, arguments);
  55203. }, { buffer: 220, dup: 217 }], 521: [function(g, C, i) {
  55204. arguments[4][218][0].apply(i, arguments);
  55205. }, { dup: 218, "safe-buffer": 520 }], 522: [function(g, C, i) {
  55206. arguments[4][218][0].apply(i, arguments);
  55207. }, { dup: 218, "safe-buffer": 494 }], 523: [function(g, C, i) {
  55208. (function(e, A) {
  55209. (function() {
  55210. var s = g("process/browser.js").nextTick, l = Function.prototype.apply, n = Array.prototype.slice, a = {}, d = 0;
  55211. function o(c, r) {
  55212. this._id = c, this._clearFn = r;
  55213. }
  55214. i.setTimeout = function() {
  55215. return new o(l.call(setTimeout, window, arguments), clearTimeout);
  55216. }, i.setInterval = function() {
  55217. return new o(l.call(setInterval, window, arguments), clearInterval);
  55218. }, i.clearTimeout = i.clearInterval = function(c) {
  55219. c.close();
  55220. }, o.prototype.unref = o.prototype.ref = function() {
  55221. }, o.prototype.close = function() {
  55222. this._clearFn.call(window, this._id);
  55223. }, i.enroll = function(c, r) {
  55224. clearTimeout(c._idleTimeoutId), c._idleTimeout = r;
  55225. }, i.unenroll = function(c) {
  55226. clearTimeout(c._idleTimeoutId), c._idleTimeout = -1;
  55227. }, i._unrefActive = i.active = function(c) {
  55228. clearTimeout(c._idleTimeoutId);
  55229. var r = c._idleTimeout;
  55230. r >= 0 && (c._idleTimeoutId = setTimeout(function() {
  55231. c._onTimeout && c._onTimeout();
  55232. }, r));
  55233. }, i.setImmediate = typeof e == "function" ? e : function(c) {
  55234. var r = d++, h = !(arguments.length < 2) && n.call(arguments, 1);
  55235. return a[r] = !0, s(function() {
  55236. a[r] && (h ? c.apply(null, h) : c.call(null), i.clearImmediate(r));
  55237. }), r;
  55238. }, i.clearImmediate = typeof A == "function" ? A : function(c) {
  55239. delete a[c];
  55240. };
  55241. }).call(this);
  55242. }).call(this, g("timers").setImmediate, g("timers").clearImmediate);
  55243. }, { "process/browser.js": 467, timers: 523 }], 524: [function(g, C, i) {
  55244. (function(e) {
  55245. (function() {
  55246. function A(s) {
  55247. try {
  55248. if (!e.localStorage) return !1;
  55249. } catch {
  55250. return !1;
  55251. }
  55252. var l = e.localStorage[s];
  55253. return l != null && String(l).toLowerCase() === "true";
  55254. }
  55255. C.exports = function(s, l) {
  55256. if (A("noDeprecation")) return s;
  55257. var n = !1;
  55258. return function() {
  55259. if (!n) {
  55260. if (A("throwDeprecation")) throw new Error(l);
  55261. A("traceDeprecation") ? console.trace(l) : console.warn(l), n = !0;
  55262. }
  55263. return s.apply(this, arguments);
  55264. };
  55265. };
  55266. }).call(this);
  55267. }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  55268. }, {}], 525: [function(g, C, i) {
  55269. typeof Object.create == "function" ? C.exports = function(e, A) {
  55270. e.super_ = A, e.prototype = Object.create(A.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } });
  55271. } : C.exports = function(e, A) {
  55272. e.super_ = A;
  55273. var s = function() {
  55274. };
  55275. s.prototype = A.prototype, e.prototype = new s(), e.prototype.constructor = e;
  55276. };
  55277. }, {}], 526: [function(g, C, i) {
  55278. C.exports = function(e) {
  55279. return e && typeof e == "object" && typeof e.copy == "function" && typeof e.fill == "function" && typeof e.readUInt8 == "function";
  55280. };
  55281. }, {}], 527: [function(g, C, i) {
  55282. (function(e, A) {
  55283. (function() {
  55284. var s = /%[sdj%]/g;
  55285. i.format = function(G) {
  55286. if (!p(G)) {
  55287. for (var w = [], W = 0; W < arguments.length; W++) w.push(a(arguments[W]));
  55288. return w.join(" ");
  55289. }
  55290. W = 1;
  55291. for (var y = arguments, f = y.length, D = String(G).replace(s, function(T) {
  55292. if (T === "%%") return "%";
  55293. if (W >= f) return T;
  55294. switch (T) {
  55295. case "%s":
  55296. return String(y[W++]);
  55297. case "%d":
  55298. return Number(y[W++]);
  55299. case "%j":
  55300. try {
  55301. return JSON.stringify(y[W++]);
  55302. } catch {
  55303. return "[Circular]";
  55304. }
  55305. default:
  55306. return T;
  55307. }
  55308. }), F = y[W]; W < f; F = y[++W]) m(F) || !X(F) ? D += " " + F : D += " " + a(F);
  55309. return D;
  55310. }, i.deprecate = function(G, w) {
  55311. if (Y(A.process)) return function() {
  55312. return i.deprecate(G, w).apply(this, arguments);
  55313. };
  55314. if (e.noDeprecation === !0) return G;
  55315. var W = !1;
  55316. return function() {
  55317. if (!W) {
  55318. if (e.throwDeprecation) throw new Error(w);
  55319. e.traceDeprecation ? console.trace(w) : console.error(w), W = !0;
  55320. }
  55321. return G.apply(this, arguments);
  55322. };
  55323. };
  55324. var l, n = {};
  55325. function a(G, w) {
  55326. var W = { seen: [], stylize: o };
  55327. return arguments.length >= 3 && (W.depth = arguments[2]), arguments.length >= 4 && (W.colors = arguments[3]), u(w) ? W.showHidden = w : w && i._extend(W, w), Y(W.showHidden) && (W.showHidden = !1), Y(W.depth) && (W.depth = 2), Y(W.colors) && (W.colors = !1), Y(W.customInspect) && (W.customInspect = !0), W.colors && (W.stylize = d), c(W, G, W.depth);
  55328. }
  55329. function d(G, w) {
  55330. var W = a.styles[w];
  55331. return W ? "\x1B[" + a.colors[W][0] + "m" + G + "\x1B[" + a.colors[W][1] + "m" : G;
  55332. }
  55333. function o(G, w) {
  55334. return G;
  55335. }
  55336. function c(G, w, W) {
  55337. if (G.customInspect && w && z(w.inspect) && w.inspect !== i.inspect && (!w.constructor || w.constructor.prototype !== w)) {
  55338. var y = w.inspect(W, G);
  55339. return p(y) || (y = c(G, y, W)), y;
  55340. }
  55341. var f = function(J, k) {
  55342. if (Y(k)) return J.stylize("undefined", "undefined");
  55343. if (p(k)) {
  55344. var j = "'" + JSON.stringify(k).replace(/^"|"$/g, "").replace(/'/g, "\\'").replace(/\\"/g, '"') + "'";
  55345. return J.stylize(j, "string");
  55346. }
  55347. if (Z(k)) return J.stylize("" + k, "number");
  55348. if (u(k)) return J.stylize("" + k, "boolean");
  55349. if (m(k)) return J.stylize("null", "null");
  55350. }(G, w);
  55351. if (f) return f;
  55352. var D = Object.keys(w), F = function(J) {
  55353. var k = {};
  55354. return J.forEach(function(j, q) {
  55355. k[j] = !0;
  55356. }), k;
  55357. }(D);
  55358. if (G.showHidden && (D = Object.getOwnPropertyNames(w)), S(w) && (D.indexOf("message") >= 0 || D.indexOf("description") >= 0)) return r(w);
  55359. if (D.length === 0) {
  55360. if (z(w)) {
  55361. var T = w.name ? ": " + w.name : "";
  55362. return G.stylize("[Function" + T + "]", "special");
  55363. }
  55364. if (R(w)) return G.stylize(RegExp.prototype.toString.call(w), "regexp");
  55365. if (H(w)) return G.stylize(Date.prototype.toString.call(w), "date");
  55366. if (S(w)) return r(w);
  55367. }
  55368. var Q, P = "", L = !1, E = ["{", "}"];
  55369. return b(w) && (L = !0, E = ["[", "]"]), z(w) && (P = " [Function" + (w.name ? ": " + w.name : "") + "]"), R(w) && (P = " " + RegExp.prototype.toString.call(w)), H(w) && (P = " " + Date.prototype.toUTCString.call(w)), S(w) && (P = " " + r(w)), D.length !== 0 || L && w.length != 0 ? W < 0 ? R(w) ? G.stylize(RegExp.prototype.toString.call(w), "regexp") : G.stylize("[Object]", "special") : (G.seen.push(w), Q = L ? function(J, k, j, q, Cg) {
  55370. for (var Ig = [], x = 0, Ag = k.length; x < Ag; ++x) B(k, String(x)) ? Ig.push(h(J, k, j, q, String(x), !0)) : Ig.push("");
  55371. return Cg.forEach(function(eg) {
  55372. eg.match(/^\d+$/) || Ig.push(h(J, k, j, q, eg, !0));
  55373. }), Ig;
  55374. }(G, w, W, F, D) : D.map(function(J) {
  55375. return h(G, w, W, F, J, L);
  55376. }), G.seen.pop(), function(J, k, j) {
  55377. return J.reduce(function(q, Cg) {
  55378. return Cg.indexOf(`
  55379. `) >= 0, q + Cg.replace(/\u001b\[\d\d?m/g, "").length + 1;
  55380. }, 0) > 60 ? j[0] + (k === "" ? "" : k + `
  55381. `) + " " + J.join(`,
  55382. `) + " " + j[1] : j[0] + k + " " + J.join(", ") + " " + j[1];
  55383. }(Q, P, E)) : E[0] + P + E[1];
  55384. }
  55385. function r(G) {
  55386. return "[" + Error.prototype.toString.call(G) + "]";
  55387. }
  55388. function h(G, w, W, y, f, D) {
  55389. var F, T, Q;
  55390. if ((Q = Object.getOwnPropertyDescriptor(w, f) || { value: w[f] }).get ? T = Q.set ? G.stylize("[Getter/Setter]", "special") : G.stylize("[Getter]", "special") : Q.set && (T = G.stylize("[Setter]", "special")), B(y, f) || (F = "[" + f + "]"), T || (G.seen.indexOf(Q.value) < 0 ? (T = m(W) ? c(G, Q.value, null) : c(G, Q.value, W - 1)).indexOf(`
  55391. `) > -1 && (T = D ? T.split(`
  55392. `).map(function(P) {
  55393. return " " + P;
  55394. }).join(`
  55395. `).substr(2) : `
  55396. ` + T.split(`
  55397. `).map(function(P) {
  55398. return " " + P;
  55399. }).join(`
  55400. `)) : T = G.stylize("[Circular]", "special")), Y(F)) {
  55401. if (D && f.match(/^\d+$/)) return T;
  55402. (F = JSON.stringify("" + f)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/) ? (F = F.substr(1, F.length - 2), F = G.stylize(F, "name")) : (F = F.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"), F = G.stylize(F, "string"));
  55403. }
  55404. return F + ": " + T;
  55405. }
  55406. function b(G) {
  55407. return Array.isArray(G);
  55408. }
  55409. function u(G) {
  55410. return typeof G == "boolean";
  55411. }
  55412. function m(G) {
  55413. return G === null;
  55414. }
  55415. function Z(G) {
  55416. return typeof G == "number";
  55417. }
  55418. function p(G) {
  55419. return typeof G == "string";
  55420. }
  55421. function Y(G) {
  55422. return G === void 0;
  55423. }
  55424. function R(G) {
  55425. return X(G) && v(G) === "[object RegExp]";
  55426. }
  55427. function X(G) {
  55428. return typeof G == "object" && G !== null;
  55429. }
  55430. function H(G) {
  55431. return X(G) && v(G) === "[object Date]";
  55432. }
  55433. function S(G) {
  55434. return X(G) && (v(G) === "[object Error]" || G instanceof Error);
  55435. }
  55436. function z(G) {
  55437. return typeof G == "function";
  55438. }
  55439. function v(G) {
  55440. return Object.prototype.toString.call(G);
  55441. }
  55442. function K(G) {
  55443. return G < 10 ? "0" + G.toString(10) : G.toString(10);
  55444. }
  55445. i.debuglog = function(G) {
  55446. if (Y(l) && (l = e.env.NODE_DEBUG || ""), G = G.toUpperCase(), !n[G]) if (new RegExp("\\b" + G + "\\b", "i").test(l)) {
  55447. var w = e.pid;
  55448. n[G] = function() {
  55449. var W = i.format.apply(i, arguments);
  55450. console.error("%s %d: %s", G, w, W);
  55451. };
  55452. } else n[G] = function() {
  55453. };
  55454. return n[G];
  55455. }, i.inspect = a, a.colors = { bold: [1, 22], italic: [3, 23], underline: [4, 24], inverse: [7, 27], white: [37, 39], grey: [90, 39], black: [30, 39], blue: [34, 39], cyan: [36, 39], green: [32, 39], magenta: [35, 39], red: [31, 39], yellow: [33, 39] }, a.styles = { special: "cyan", number: "yellow", boolean: "yellow", undefined: "grey", null: "bold", string: "green", date: "magenta", regexp: "red" }, i.isArray = b, i.isBoolean = u, i.isNull = m, i.isNullOrUndefined = function(G) {
  55456. return G == null;
  55457. }, i.isNumber = Z, i.isString = p, i.isSymbol = function(G) {
  55458. return typeof G == "symbol";
  55459. }, i.isUndefined = Y, i.isRegExp = R, i.isObject = X, i.isDate = H, i.isError = S, i.isFunction = z, i.isPrimitive = function(G) {
  55460. return G === null || typeof G == "boolean" || typeof G == "number" || typeof G == "string" || typeof G == "symbol" || G === void 0;
  55461. }, i.isBuffer = g("./support/isBuffer");
  55462. var V = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
  55463. function N() {
  55464. var G = /* @__PURE__ */ new Date(), w = [K(G.getHours()), K(G.getMinutes()), K(G.getSeconds())].join(":");
  55465. return [G.getDate(), V[G.getMonth()], w].join(" ");
  55466. }
  55467. function B(G, w) {
  55468. return Object.prototype.hasOwnProperty.call(G, w);
  55469. }
  55470. i.log = function() {
  55471. console.log("%s - %s", N(), i.format.apply(i, arguments));
  55472. }, i.inherits = g("inherits"), i._extend = function(G, w) {
  55473. if (!w || !X(w)) return G;
  55474. for (var W = Object.keys(w), y = W.length; y--; ) G[W[y]] = w[W[y]];
  55475. return G;
  55476. };
  55477. }).call(this);
  55478. }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
  55479. }, { "./support/isBuffer": 526, _process: 467, inherits: 525 }], 528: [function(g, C, i) {
  55480. Object.defineProperty(i, "__esModule", { value: !0 }), Object.defineProperty(i, "v1", { enumerable: !0, get: function() {
  55481. return e.default;
  55482. } }), Object.defineProperty(i, "v3", { enumerable: !0, get: function() {
  55483. return A.default;
  55484. } }), Object.defineProperty(i, "v4", { enumerable: !0, get: function() {
  55485. return s.default;
  55486. } }), Object.defineProperty(i, "v5", { enumerable: !0, get: function() {
  55487. return l.default;
  55488. } }), Object.defineProperty(i, "NIL", { enumerable: !0, get: function() {
  55489. return n.default;
  55490. } }), Object.defineProperty(i, "version", { enumerable: !0, get: function() {
  55491. return a.default;
  55492. } }), Object.defineProperty(i, "validate", { enumerable: !0, get: function() {
  55493. return d.default;
  55494. } }), Object.defineProperty(i, "stringify", { enumerable: !0, get: function() {
  55495. return o.default;
  55496. } }), Object.defineProperty(i, "parse", { enumerable: !0, get: function() {
  55497. return c.default;
  55498. } });
  55499. var e = r(g("./v1.js")), A = r(g("./v3.js")), s = r(g("./v4.js")), l = r(g("./v5.js")), n = r(g("./nil.js")), a = r(g("./version.js")), d = r(g("./validate.js")), o = r(g("./stringify.js")), c = r(g("./parse.js"));
  55500. function r(h) {
  55501. return h && h.__esModule ? h : { default: h };
  55502. }
  55503. }, { "./nil.js": 530, "./parse.js": 531, "./stringify.js": 535, "./v1.js": 536, "./v3.js": 537, "./v4.js": 539, "./v5.js": 540, "./validate.js": 541, "./version.js": 542 }], 529: [function(g, C, i) {
  55504. function e(c) {
  55505. return 14 + (c + 64 >>> 9 << 4) + 1;
  55506. }
  55507. function A(c, r) {
  55508. const h = (65535 & c) + (65535 & r);
  55509. return (c >> 16) + (r >> 16) + (h >> 16) << 16 | 65535 & h;
  55510. }
  55511. function s(c, r, h, b, u, m) {
  55512. return A((Z = A(A(r, c), A(b, m))) << (p = u) | Z >>> 32 - p, h);
  55513. var Z, p;
  55514. }
  55515. function l(c, r, h, b, u, m, Z) {
  55516. return s(r & h | ~r & b, c, r, u, m, Z);
  55517. }
  55518. function n(c, r, h, b, u, m, Z) {
  55519. return s(r & b | h & ~b, c, r, u, m, Z);
  55520. }
  55521. function a(c, r, h, b, u, m, Z) {
  55522. return s(r ^ h ^ b, c, r, u, m, Z);
  55523. }
  55524. function d(c, r, h, b, u, m, Z) {
  55525. return s(h ^ (r | ~b), c, r, u, m, Z);
  55526. }
  55527. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
  55528. var o = function(c) {
  55529. if (typeof c == "string") {
  55530. const r = unescape(encodeURIComponent(c));
  55531. c = new Uint8Array(r.length);
  55532. for (let h = 0; h < r.length; ++h) c[h] = r.charCodeAt(h);
  55533. }
  55534. return function(r) {
  55535. const h = [], b = 32 * r.length;
  55536. for (let u = 0; u < b; u += 8) {
  55537. const m = r[u >> 5] >>> u % 32 & 255, Z = parseInt("0123456789abcdef".charAt(m >>> 4 & 15) + "0123456789abcdef".charAt(15 & m), 16);
  55538. h.push(Z);
  55539. }
  55540. return h;
  55541. }(function(r, h) {
  55542. r[h >> 5] |= 128 << h % 32, r[e(h) - 1] = h;
  55543. let b = 1732584193, u = -271733879, m = -1732584194, Z = 271733878;
  55544. for (let p = 0; p < r.length; p += 16) {
  55545. const Y = b, R = u, X = m, H = Z;
  55546. b = l(b, u, m, Z, r[p], 7, -680876936), Z = l(Z, b, u, m, r[p + 1], 12, -389564586), m = l(m, Z, b, u, r[p + 2], 17, 606105819), u = l(u, m, Z, b, r[p + 3], 22, -1044525330), b = l(b, u, m, Z, r[p + 4], 7, -176418897), Z = l(Z, b, u, m, r[p + 5], 12, 1200080426), m = l(m, Z, b, u, r[p + 6], 17, -1473231341), u = l(u, m, Z, b, r[p + 7], 22, -45705983), b = l(b, u, m, Z, r[p + 8], 7, 1770035416), Z = l(Z, b, u, m, r[p + 9], 12, -1958414417), m = l(m, Z, b, u, r[p + 10], 17, -42063), u = l(u, m, Z, b, r[p + 11], 22, -1990404162), b = l(b, u, m, Z, r[p + 12], 7, 1804603682), Z = l(Z, b, u, m, r[p + 13], 12, -40341101), m = l(m, Z, b, u, r[p + 14], 17, -1502002290), u = l(u, m, Z, b, r[p + 15], 22, 1236535329), b = n(b, u, m, Z, r[p + 1], 5, -165796510), Z = n(Z, b, u, m, r[p + 6], 9, -1069501632), m = n(m, Z, b, u, r[p + 11], 14, 643717713), u = n(u, m, Z, b, r[p], 20, -373897302), b = n(b, u, m, Z, r[p + 5], 5, -701558691), Z = n(Z, b, u, m, r[p + 10], 9, 38016083), m = n(m, Z, b, u, r[p + 15], 14, -660478335), u = n(u, m, Z, b, r[p + 4], 20, -405537848), b = n(b, u, m, Z, r[p + 9], 5, 568446438), Z = n(Z, b, u, m, r[p + 14], 9, -1019803690), m = n(m, Z, b, u, r[p + 3], 14, -187363961), u = n(u, m, Z, b, r[p + 8], 20, 1163531501), b = n(b, u, m, Z, r[p + 13], 5, -1444681467), Z = n(Z, b, u, m, r[p + 2], 9, -51403784), m = n(m, Z, b, u, r[p + 7], 14, 1735328473), u = n(u, m, Z, b, r[p + 12], 20, -1926607734), b = a(b, u, m, Z, r[p + 5], 4, -378558), Z = a(Z, b, u, m, r[p + 8], 11, -2022574463), m = a(m, Z, b, u, r[p + 11], 16, 1839030562), u = a(u, m, Z, b, r[p + 14], 23, -35309556), b = a(b, u, m, Z, r[p + 1], 4, -1530992060), Z = a(Z, b, u, m, r[p + 4], 11, 1272893353), m = a(m, Z, b, u, r[p + 7], 16, -155497632), u = a(u, m, Z, b, r[p + 10], 23, -1094730640), b = a(b, u, m, Z, r[p + 13], 4, 681279174), Z = a(Z, b, u, m, r[p], 11, -358537222), m = a(m, Z, b, u, r[p + 3], 16, -722521979), u = a(u, m, Z, b, r[p + 6], 23, 76029189), b = a(b, u, m, Z, r[p + 9], 4, -640364487), Z = a(Z, b, u, m, r[p + 12], 11, -421815835), m = a(m, Z, b, u, r[p + 15], 16, 530742520), u = a(u, m, Z, b, r[p + 2], 23, -995338651), b = d(b, u, m, Z, r[p], 6, -198630844), Z = d(Z, b, u, m, r[p + 7], 10, 1126891415), m = d(m, Z, b, u, r[p + 14], 15, -1416354905), u = d(u, m, Z, b, r[p + 5], 21, -57434055), b = d(b, u, m, Z, r[p + 12], 6, 1700485571), Z = d(Z, b, u, m, r[p + 3], 10, -1894986606), m = d(m, Z, b, u, r[p + 10], 15, -1051523), u = d(u, m, Z, b, r[p + 1], 21, -2054922799), b = d(b, u, m, Z, r[p + 8], 6, 1873313359), Z = d(Z, b, u, m, r[p + 15], 10, -30611744), m = d(m, Z, b, u, r[p + 6], 15, -1560198380), u = d(u, m, Z, b, r[p + 13], 21, 1309151649), b = d(b, u, m, Z, r[p + 4], 6, -145523070), Z = d(Z, b, u, m, r[p + 11], 10, -1120210379), m = d(m, Z, b, u, r[p + 2], 15, 718787259), u = d(u, m, Z, b, r[p + 9], 21, -343485551), b = A(b, Y), u = A(u, R), m = A(m, X), Z = A(Z, H);
  55547. }
  55548. return [b, u, m, Z];
  55549. }(function(r) {
  55550. if (r.length === 0) return [];
  55551. const h = 8 * r.length, b = new Uint32Array(e(h));
  55552. for (let u = 0; u < h; u += 8) b[u >> 5] |= (255 & r[u / 8]) << u % 32;
  55553. return b;
  55554. }(c), 8 * c.length));
  55555. };
  55556. i.default = o;
  55557. }, {}], 530: [function(g, C, i) {
  55558. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0, i.default = "00000000-0000-0000-0000-000000000000";
  55559. }, {}], 531: [function(g, C, i) {
  55560. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
  55561. var e, A = (e = g("./validate.js")) && e.__esModule ? e : { default: e }, s = function(l) {
  55562. if (!(0, A.default)(l)) throw TypeError("Invalid UUID");
  55563. let n;
  55564. const a = new Uint8Array(16);
  55565. return a[0] = (n = parseInt(l.slice(0, 8), 16)) >>> 24, a[1] = n >>> 16 & 255, a[2] = n >>> 8 & 255, a[3] = 255 & n, a[4] = (n = parseInt(l.slice(9, 13), 16)) >>> 8, a[5] = 255 & n, a[6] = (n = parseInt(l.slice(14, 18), 16)) >>> 8, a[7] = 255 & n, a[8] = (n = parseInt(l.slice(19, 23), 16)) >>> 8, a[9] = 255 & n, a[10] = (n = parseInt(l.slice(24, 36), 16)) / 1099511627776 & 255, a[11] = n / 4294967296 & 255, a[12] = n >>> 24 & 255, a[13] = n >>> 16 & 255, a[14] = n >>> 8 & 255, a[15] = 255 & n, a;
  55566. };
  55567. i.default = s;
  55568. }, { "./validate.js": 541 }], 532: [function(g, C, i) {
  55569. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0, i.default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
  55570. }, {}], 533: [function(g, C, i) {
  55571. let e;
  55572. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = function() {
  55573. if (!e && (e = typeof crypto < "u" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto < "u" && typeof msCrypto.getRandomValues == "function" && msCrypto.getRandomValues.bind(msCrypto), !e)) throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
  55574. return e(A);
  55575. };
  55576. const A = new Uint8Array(16);
  55577. }, {}], 534: [function(g, C, i) {
  55578. function e(l, n, a, d) {
  55579. switch (l) {
  55580. case 0:
  55581. return n & a ^ ~n & d;
  55582. case 1:
  55583. return n ^ a ^ d;
  55584. case 2:
  55585. return n & a ^ n & d ^ a & d;
  55586. case 3:
  55587. return n ^ a ^ d;
  55588. }
  55589. }
  55590. function A(l, n) {
  55591. return l << n | l >>> 32 - n;
  55592. }
  55593. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
  55594. var s = function(l) {
  55595. const n = [1518500249, 1859775393, 2400959708, 3395469782], a = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];
  55596. if (typeof l == "string") {
  55597. const r = unescape(encodeURIComponent(l));
  55598. l = [];
  55599. for (let h = 0; h < r.length; ++h) l.push(r.charCodeAt(h));
  55600. } else Array.isArray(l) || (l = Array.prototype.slice.call(l));
  55601. l.push(128);
  55602. const d = l.length / 4 + 2, o = Math.ceil(d / 16), c = new Array(o);
  55603. for (let r = 0; r < o; ++r) {
  55604. const h = new Uint32Array(16);
  55605. for (let b = 0; b < 16; ++b) h[b] = l[64 * r + 4 * b] << 24 | l[64 * r + 4 * b + 1] << 16 | l[64 * r + 4 * b + 2] << 8 | l[64 * r + 4 * b + 3];
  55606. c[r] = h;
  55607. }
  55608. c[o - 1][14] = 8 * (l.length - 1) / Math.pow(2, 32), c[o - 1][14] = Math.floor(c[o - 1][14]), c[o - 1][15] = 8 * (l.length - 1) & 4294967295;
  55609. for (let r = 0; r < o; ++r) {
  55610. const h = new Uint32Array(80);
  55611. for (let Y = 0; Y < 16; ++Y) h[Y] = c[r][Y];
  55612. for (let Y = 16; Y < 80; ++Y) h[Y] = A(h[Y - 3] ^ h[Y - 8] ^ h[Y - 14] ^ h[Y - 16], 1);
  55613. let b = a[0], u = a[1], m = a[2], Z = a[3], p = a[4];
  55614. for (let Y = 0; Y < 80; ++Y) {
  55615. const R = Math.floor(Y / 20), X = A(b, 5) + e(R, u, m, Z) + p + n[R] + h[Y] >>> 0;
  55616. p = Z, Z = m, m = A(u, 30) >>> 0, u = b, b = X;
  55617. }
  55618. a[0] = a[0] + b >>> 0, a[1] = a[1] + u >>> 0, a[2] = a[2] + m >>> 0, a[3] = a[3] + Z >>> 0, a[4] = a[4] + p >>> 0;
  55619. }
  55620. return [a[0] >> 24 & 255, a[0] >> 16 & 255, a[0] >> 8 & 255, 255 & a[0], a[1] >> 24 & 255, a[1] >> 16 & 255, a[1] >> 8 & 255, 255 & a[1], a[2] >> 24 & 255, a[2] >> 16 & 255, a[2] >> 8 & 255, 255 & a[2], a[3] >> 24 & 255, a[3] >> 16 & 255, a[3] >> 8 & 255, 255 & a[3], a[4] >> 24 & 255, a[4] >> 16 & 255, a[4] >> 8 & 255, 255 & a[4]];
  55621. };
  55622. i.default = s;
  55623. }, {}], 535: [function(g, C, i) {
  55624. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
  55625. var e, A = (e = g("./validate.js")) && e.__esModule ? e : { default: e };
  55626. const s = [];
  55627. for (let n = 0; n < 256; ++n) s.push((n + 256).toString(16).substr(1));
  55628. var l = function(n) {
  55629. let a = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0;
  55630. const d = (s[n[a + 0]] + s[n[a + 1]] + s[n[a + 2]] + s[n[a + 3]] + "-" + s[n[a + 4]] + s[n[a + 5]] + "-" + s[n[a + 6]] + s[n[a + 7]] + "-" + s[n[a + 8]] + s[n[a + 9]] + "-" + s[n[a + 10]] + s[n[a + 11]] + s[n[a + 12]] + s[n[a + 13]] + s[n[a + 14]] + s[n[a + 15]]).toLowerCase();
  55631. if (!(0, A.default)(d)) throw TypeError("Stringified UUID is invalid");
  55632. return d;
  55633. };
  55634. i.default = l;
  55635. }, { "./validate.js": 541 }], 536: [function(g, C, i) {
  55636. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
  55637. var e = s(g("./rng.js")), A = s(g("./stringify.js"));
  55638. function s(c) {
  55639. return c && c.__esModule ? c : { default: c };
  55640. }
  55641. let l, n, a = 0, d = 0;
  55642. var o = function(c, r, h) {
  55643. let b = r && h || 0;
  55644. const u = r || new Array(16);
  55645. let m = (c = c || {}).node || l, Z = c.clockseq !== void 0 ? c.clockseq : n;
  55646. if (m == null || Z == null) {
  55647. const S = c.random || (c.rng || e.default)();
  55648. m == null && (m = l = [1 | S[0], S[1], S[2], S[3], S[4], S[5]]), Z == null && (Z = n = 16383 & (S[6] << 8 | S[7]));
  55649. }
  55650. let p = c.msecs !== void 0 ? c.msecs : Date.now(), Y = c.nsecs !== void 0 ? c.nsecs : d + 1;
  55651. const R = p - a + (Y - d) / 1e4;
  55652. if (R < 0 && c.clockseq === void 0 && (Z = Z + 1 & 16383), (R < 0 || p > a) && c.nsecs === void 0 && (Y = 0), Y >= 1e4) throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  55653. a = p, d = Y, n = Z, p += 122192928e5;
  55654. const X = (1e4 * (268435455 & p) + Y) % 4294967296;
  55655. u[b++] = X >>> 24 & 255, u[b++] = X >>> 16 & 255, u[b++] = X >>> 8 & 255, u[b++] = 255 & X;
  55656. const H = p / 4294967296 * 1e4 & 268435455;
  55657. u[b++] = H >>> 8 & 255, u[b++] = 255 & H, u[b++] = H >>> 24 & 15 | 16, u[b++] = H >>> 16 & 255, u[b++] = Z >>> 8 | 128, u[b++] = 255 & Z;
  55658. for (let S = 0; S < 6; ++S) u[b + S] = m[S];
  55659. return r || (0, A.default)(u);
  55660. };
  55661. i.default = o;
  55662. }, { "./rng.js": 533, "./stringify.js": 535 }], 537: [function(g, C, i) {
  55663. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
  55664. var e = s(g("./v35.js")), A = s(g("./md5.js"));
  55665. function s(n) {
  55666. return n && n.__esModule ? n : { default: n };
  55667. }
  55668. var l = (0, e.default)("v3", 48, A.default);
  55669. i.default = l;
  55670. }, { "./md5.js": 529, "./v35.js": 538 }], 538: [function(g, C, i) {
  55671. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = function(a, d, o) {
  55672. function c(r, h, b, u) {
  55673. if (typeof r == "string" && (r = function(Z) {
  55674. Z = unescape(encodeURIComponent(Z));
  55675. const p = [];
  55676. for (let Y = 0; Y < Z.length; ++Y) p.push(Z.charCodeAt(Y));
  55677. return p;
  55678. }(r)), typeof h == "string" && (h = (0, A.default)(h)), h.length !== 16) throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");
  55679. let m = new Uint8Array(16 + r.length);
  55680. if (m.set(h), m.set(r, h.length), m = o(m), m[6] = 15 & m[6] | d, m[8] = 63 & m[8] | 128, b) {
  55681. u = u || 0;
  55682. for (let Z = 0; Z < 16; ++Z) b[u + Z] = m[Z];
  55683. return b;
  55684. }
  55685. return (0, e.default)(m);
  55686. }
  55687. try {
  55688. c.name = a;
  55689. } catch {
  55690. }
  55691. return c.DNS = l, c.URL = n, c;
  55692. }, i.URL = i.DNS = void 0;
  55693. var e = s(g("./stringify.js")), A = s(g("./parse.js"));
  55694. function s(a) {
  55695. return a && a.__esModule ? a : { default: a };
  55696. }
  55697. const l = "6ba7b810-9dad-11d1-80b4-00c04fd430c8";
  55698. i.DNS = l;
  55699. const n = "6ba7b811-9dad-11d1-80b4-00c04fd430c8";
  55700. i.URL = n;
  55701. }, { "./parse.js": 531, "./stringify.js": 535 }], 539: [function(g, C, i) {
  55702. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
  55703. var e = s(g("./rng.js")), A = s(g("./stringify.js"));
  55704. function s(n) {
  55705. return n && n.__esModule ? n : { default: n };
  55706. }
  55707. var l = function(n, a, d) {
  55708. const o = (n = n || {}).random || (n.rng || e.default)();
  55709. if (o[6] = 15 & o[6] | 64, o[8] = 63 & o[8] | 128, a) {
  55710. d = d || 0;
  55711. for (let c = 0; c < 16; ++c) a[d + c] = o[c];
  55712. return a;
  55713. }
  55714. return (0, A.default)(o);
  55715. };
  55716. i.default = l;
  55717. }, { "./rng.js": 533, "./stringify.js": 535 }], 540: [function(g, C, i) {
  55718. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
  55719. var e = s(g("./v35.js")), A = s(g("./sha1.js"));
  55720. function s(n) {
  55721. return n && n.__esModule ? n : { default: n };
  55722. }
  55723. var l = (0, e.default)("v5", 80, A.default);
  55724. i.default = l;
  55725. }, { "./sha1.js": 534, "./v35.js": 538 }], 541: [function(g, C, i) {
  55726. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
  55727. var e, A = (e = g("./regex.js")) && e.__esModule ? e : { default: e }, s = function(l) {
  55728. return typeof l == "string" && A.default.test(l);
  55729. };
  55730. i.default = s;
  55731. }, { "./regex.js": 532 }], 542: [function(g, C, i) {
  55732. Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
  55733. var e, A = (e = g("./validate.js")) && e.__esModule ? e : { default: e }, s = function(l) {
  55734. if (!(0, A.default)(l)) throw TypeError("Invalid UUID");
  55735. return parseInt(l.substr(14, 1), 16);
  55736. };
  55737. i.default = s;
  55738. }, { "./validate.js": 541 }], 543: [function(g, C, i) {
  55739. /**
  55740. * Character classes and associated utilities for the 5th edition of XML 1.0.
  55741. *
  55742. * @author Louis-Dominique Dubeau
  55743. * @license MIT
  55744. * @copyright Louis-Dominique Dubeau
  55745. */
  55746. Object.defineProperty(i, "__esModule", { value: !0 }), i.CHAR = `
  55747. \r -퟿-�𐀀-􏿿`, i.S = ` \r
  55748. `, i.NAME_START_CHAR = ":A-Z_a-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-῿‌‍⁰-↏Ⰰ-⿯、-퟿豈-﷏ﷰ-�𐀀-󯿿", i.NAME_CHAR = "-" + i.NAME_START_CHAR + ".0-9·̀-ͯ‿-⁀", i.CHAR_RE = new RegExp("^[" + i.CHAR + "]$", "u"), i.S_RE = new RegExp("^[" + i.S + "]+$", "u"), i.NAME_START_CHAR_RE = new RegExp("^[" + i.NAME_START_CHAR + "]$", "u"), i.NAME_CHAR_RE = new RegExp("^[" + i.NAME_CHAR + "]$", "u"), i.NAME_RE = new RegExp("^[" + i.NAME_START_CHAR + "][" + i.NAME_CHAR + "]*$", "u"), i.NMTOKEN_RE = new RegExp("^[" + i.NAME_CHAR + "]+$", "u");
  55749. function e(A) {
  55750. return A >= 65 && A <= 90 || A >= 97 && A <= 122 || A === 58 || A === 95 || A === 8204 || A === 8205 || A >= 192 && A <= 214 || A >= 216 && A <= 246 || A >= 248 && A <= 767 || A >= 880 && A <= 893 || A >= 895 && A <= 8191 || A >= 8304 && A <= 8591 || A >= 11264 && A <= 12271 || A >= 12289 && A <= 55295 || A >= 63744 && A <= 64975 || A >= 65008 && A <= 65533 || A >= 65536 && A <= 983039;
  55751. }
  55752. i.S_LIST = [32, 10, 13, 9], i.isChar = function(A) {
  55753. return A >= 32 && A <= 55295 || A === 10 || A === 13 || A === 9 || A >= 57344 && A <= 65533 || A >= 65536 && A <= 1114111;
  55754. }, i.isS = function(A) {
  55755. return A === 32 || A === 10 || A === 13 || A === 9;
  55756. }, i.isNameStartChar = e, i.isNameChar = function(A) {
  55757. return e(A) || A >= 48 && A <= 57 || A === 45 || A === 46 || A === 183 || A >= 768 && A <= 879 || A >= 8255 && A <= 8256;
  55758. };
  55759. }, {}], 544: [function(g, C, i) {
  55760. /**
  55761. * Character classes and associated utilities for the 2nd edition of XML 1.1.
  55762. *
  55763. * @author Louis-Dominique Dubeau
  55764. * @license MIT
  55765. * @copyright Louis-Dominique Dubeau
  55766. */
  55767. Object.defineProperty(i, "__esModule", { value: !0 }), i.CHAR = "-퟿-�𐀀-􏿿", i.RESTRICTED_CHAR = "-\b\v\f--„†-Ÿ", i.S = ` \r
  55768. `, i.NAME_START_CHAR = ":A-Z_a-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-῿‌‍⁰-↏Ⰰ-⿯、-퟿豈-﷏ﷰ-�𐀀-󯿿", i.NAME_CHAR = "-" + i.NAME_START_CHAR + ".0-9·̀-ͯ‿-⁀", i.CHAR_RE = new RegExp("^[" + i.CHAR + "]$", "u"), i.RESTRICTED_CHAR_RE = new RegExp("^[" + i.RESTRICTED_CHAR + "]$", "u"), i.S_RE = new RegExp("^[" + i.S + "]+$", "u"), i.NAME_START_CHAR_RE = new RegExp("^[" + i.NAME_START_CHAR + "]$", "u"), i.NAME_CHAR_RE = new RegExp("^[" + i.NAME_CHAR + "]$", "u"), i.NAME_RE = new RegExp("^[" + i.NAME_START_CHAR + "][" + i.NAME_CHAR + "]*$", "u"), i.NMTOKEN_RE = new RegExp("^[" + i.NAME_CHAR + "]+$", "u");
  55769. function e(A) {
  55770. return A >= 65 && A <= 90 || A >= 97 && A <= 122 || A === 58 || A === 95 || A === 8204 || A === 8205 || A >= 192 && A <= 214 || A >= 216 && A <= 246 || A >= 248 && A <= 767 || A >= 880 && A <= 893 || A >= 895 && A <= 8191 || A >= 8304 && A <= 8591 || A >= 11264 && A <= 12271 || A >= 12289 && A <= 55295 || A >= 63744 && A <= 64975 || A >= 65008 && A <= 65533 || A >= 65536 && A <= 983039;
  55771. }
  55772. i.S_LIST = [32, 10, 13, 9], i.isChar = function(A) {
  55773. return A >= 1 && A <= 55295 || A >= 57344 && A <= 65533 || A >= 65536 && A <= 1114111;
  55774. }, i.isRestrictedChar = function(A) {
  55775. return A >= 1 && A <= 8 || A === 11 || A === 12 || A >= 14 && A <= 31 || A >= 127 && A <= 132 || A >= 134 && A <= 159;
  55776. }, i.isCharAndNotRestricted = function(A) {
  55777. return A === 9 || A === 10 || A === 13 || A > 31 && A < 127 || A === 133 || A > 159 && A <= 55295 || A >= 57344 && A <= 65533 || A >= 65536 && A <= 1114111;
  55778. }, i.isS = function(A) {
  55779. return A === 32 || A === 10 || A === 13 || A === 9;
  55780. }, i.isNameStartChar = e, i.isNameChar = function(A) {
  55781. return e(A) || A >= 48 && A <= 57 || A === 45 || A === 46 || A === 183 || A >= 768 && A <= 879 || A >= 8255 && A <= 8256;
  55782. };
  55783. }, {}], 545: [function(g, C, i) {
  55784. /**
  55785. * Character class utilities for XML NS 1.0 edition 3.
  55786. *
  55787. * @author Louis-Dominique Dubeau
  55788. * @license MIT
  55789. * @copyright Louis-Dominique Dubeau
  55790. */
  55791. function e(A) {
  55792. return A >= 65 && A <= 90 || A === 95 || A >= 97 && A <= 122 || A >= 192 && A <= 214 || A >= 216 && A <= 246 || A >= 248 && A <= 767 || A >= 880 && A <= 893 || A >= 895 && A <= 8191 || A >= 8204 && A <= 8205 || A >= 8304 && A <= 8591 || A >= 11264 && A <= 12271 || A >= 12289 && A <= 55295 || A >= 63744 && A <= 64975 || A >= 65008 && A <= 65533 || A >= 65536 && A <= 983039;
  55793. }
  55794. Object.defineProperty(i, "__esModule", { value: !0 }), i.NC_NAME_START_CHAR = "A-Z_a-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-῿‌-‍⁰-↏Ⰰ-⿯、-퟿豈-﷏ﷰ-�𐀀-󯿿", i.NC_NAME_CHAR = "-" + i.NC_NAME_START_CHAR + ".0-9·̀-ͯ‿-⁀", i.NC_NAME_START_CHAR_RE = new RegExp("^[" + i.NC_NAME_START_CHAR + "]$", "u"), i.NC_NAME_CHAR_RE = new RegExp("^[" + i.NC_NAME_CHAR + "]$", "u"), i.NC_NAME_RE = new RegExp("^[" + i.NC_NAME_START_CHAR + "][" + i.NC_NAME_CHAR + "]*$", "u"), i.isNCNameStartChar = e, i.isNCNameChar = function(A) {
  55795. return e(A) || A === 45 || A === 46 || A >= 48 && A <= 57 || A === 183 || A >= 768 && A <= 879 || A >= 8255 && A <= 8256;
  55796. };
  55797. }, {}] }, {}, [15])(15);
  55798. });
  55799. }(kX)), kX.exports;
  55800. }
  55801. var qbg = _bg();
  55802. const $bg = /* @__PURE__ */ u$(qbg);
  55803. class hd {
  55804. constructor(I, g = "") {
  55805. typeof I == "string" ? (this.el = document.createElement(I), this.el.className = g) : this.el = I, this.data = {};
  55806. }
  55807. data(I, g) {
  55808. return g !== void 0 ? (this.data[I] = g, this) : this.data[I];
  55809. }
  55810. on(I, g) {
  55811. const [C, ...i] = I.split(".");
  55812. let e = C;
  55813. return e === "mousewheel" && /Firefox/i.test(window.navigator.userAgent) && (e = "DOMMouseScroll"), this.el.addEventListener(e, (A) => {
  55814. g(A);
  55815. for (let s = 0; s < i.length; s += 1) {
  55816. const l = i[s];
  55817. if (l === "left" && A.button !== 0 || l === "right" && A.button !== 2)
  55818. return;
  55819. l === "stop" && A.stopPropagation();
  55820. }
  55821. }), this;
  55822. }
  55823. offset(I) {
  55824. if (I !== void 0)
  55825. return Object.keys(I).forEach((A) => {
  55826. this.css(A, `${I[A]}px`);
  55827. }), this;
  55828. const {
  55829. offsetTop: g,
  55830. offsetLeft: C,
  55831. offsetHeight: i,
  55832. offsetWidth: e
  55833. } = this.el;
  55834. return {
  55835. top: g,
  55836. left: C,
  55837. height: i,
  55838. width: e
  55839. };
  55840. }
  55841. scroll(I) {
  55842. const { el: g } = this;
  55843. return I !== void 0 && (I.left !== void 0 && (g.scrollLeft = I.left), I.top !== void 0 && (g.scrollTop = I.top)), { left: g.scrollLeft, top: g.scrollTop };
  55844. }
  55845. box() {
  55846. return this.el.getBoundingClientRect();
  55847. }
  55848. parent() {
  55849. return new hd(this.el.parentNode);
  55850. }
  55851. children(...I) {
  55852. return arguments.length === 0 ? this.el.childNodes : (I.forEach((g) => this.child(g)), this);
  55853. }
  55854. removeChild(I) {
  55855. this.el.removeChild(I);
  55856. }
  55857. /*
  55858. first() {
  55859. return this.el.firstChild;
  55860. }
  55861. last() {
  55862. return this.el.lastChild;
  55863. }
  55864. remove(ele) {
  55865. return this.el.removeChild(ele);
  55866. }
  55867. prepend(ele) {
  55868. const { el } = this;
  55869. if (el.children.length > 0) {
  55870. el.insertBefore(ele, el.firstChild);
  55871. } else {
  55872. el.appendChild(ele);
  55873. }
  55874. return this;
  55875. }
  55876. prev() {
  55877. return this.el.previousSibling;
  55878. }
  55879. next() {
  55880. return this.el.nextSibling;
  55881. }
  55882. */
  55883. child(I) {
  55884. let g = I;
  55885. return typeof I == "string" ? g = document.createTextNode(I) : I instanceof hd && (g = I.el), this.el.appendChild(g), this;
  55886. }
  55887. contains(I) {
  55888. return this.el.contains(I);
  55889. }
  55890. className(I) {
  55891. return I !== void 0 ? (this.el.className = I, this) : this.el.className;
  55892. }
  55893. addClass(I) {
  55894. return this.el.classList.add(I), this;
  55895. }
  55896. hasClass(I) {
  55897. return this.el.classList.contains(I);
  55898. }
  55899. removeClass(I) {
  55900. return this.el.classList.remove(I), this;
  55901. }
  55902. toggle(I = "active") {
  55903. return this.toggleClass(I);
  55904. }
  55905. toggleClass(I) {
  55906. return this.el.classList.toggle(I);
  55907. }
  55908. active(I = !0, g = "active") {
  55909. return I ? this.addClass(g) : this.removeClass(g), this;
  55910. }
  55911. checked(I = !0) {
  55912. return this.active(I, "checked"), this;
  55913. }
  55914. disabled(I = !0) {
  55915. return I ? this.addClass("disabled") : this.removeClass("disabled"), this;
  55916. }
  55917. // key, value
  55918. // key
  55919. // {k, v}...
  55920. attr(I, g) {
  55921. if (g !== void 0)
  55922. this.el.setAttribute(I, g);
  55923. else {
  55924. if (typeof I == "string")
  55925. return this.el.getAttribute(I);
  55926. Object.keys(I).forEach((C) => {
  55927. this.el.setAttribute(C, I[C]);
  55928. });
  55929. }
  55930. return this;
  55931. }
  55932. removeAttr(I) {
  55933. return this.el.removeAttribute(I), this;
  55934. }
  55935. html(I) {
  55936. return I !== void 0 ? (this.el.innerHTML = I, this) : this.el.innerHTML;
  55937. }
  55938. val(I) {
  55939. return I !== void 0 ? (this.el.value = I, this) : this.el.value;
  55940. }
  55941. focus() {
  55942. this.el.focus();
  55943. }
  55944. cssRemoveKeys(...I) {
  55945. return I.forEach((g) => this.el.style.removeProperty(g)), this;
  55946. }
  55947. // css( propertyName )
  55948. // css( propertyName, value )
  55949. // css( properties )
  55950. css(I, g) {
  55951. return g === void 0 && typeof I != "string" ? (Object.keys(I).forEach((C) => {
  55952. this.el.style[C] = I[C];
  55953. }), this) : g !== void 0 ? (this.el.style[I] = g, this) : this.el.style[I];
  55954. }
  55955. computedStyle() {
  55956. return window.getComputedStyle(this.el, null);
  55957. }
  55958. show() {
  55959. return this.css("display", "block"), this;
  55960. }
  55961. hide() {
  55962. return this.css("display", "none"), this;
  55963. }
  55964. }
  55965. const yg = (t, I = "") => new hd(t, I), sa = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
  55966. function eig(t) {
  55967. let I = "", g = t;
  55968. for (; g >= sa.length; )
  55969. g /= sa.length, g -= 1, I += sa[parseInt(g, 10) % sa.length];
  55970. const C = t % sa.length;
  55971. return I += sa[C], I;
  55972. }
  55973. function gug(t) {
  55974. let I = 0;
  55975. for (let g = 0; g < t.length - 1; g += 1) {
  55976. const C = t.charCodeAt(g) - 65, i = t.length - 1 - g;
  55977. I += sa.length ** i + sa.length * C;
  55978. }
  55979. return I += t.charCodeAt(t.length - 1) - 65, I;
  55980. }
  55981. function Ua(t) {
  55982. let I = "", g = "";
  55983. for (let C = 0; C < t.length; C += 1)
  55984. t.charAt(C) >= "0" && t.charAt(C) <= "9" ? g += t.charAt(C) : I += t.charAt(C);
  55985. return [gug(I), parseInt(g, 10) - 1];
  55986. }
  55987. function El(t, I) {
  55988. return `${eig(t)}${I + 1}`;
  55989. }
  55990. function Lu(t, I, g, C = () => !0) {
  55991. if (I === 0 && g === 0) return t;
  55992. const [i, e] = Ua(t);
  55993. return C(i, e) ? El(i + I, e + g) : t;
  55994. }
  55995. class lt {
  55996. constructor(I, g, C, i, e = 0, A = 0) {
  55997. this.sri = I, this.sci = g, this.eri = C, this.eci = i, this.w = e, this.h = A;
  55998. }
  55999. set(I, g, C, i) {
  56000. this.sri = I, this.sci = g, this.eri = C, this.eci = i;
  56001. }
  56002. multiple() {
  56003. return this.eri - this.sri > 0 || this.eci - this.sci > 0;
  56004. }
  56005. // cell-index: ri, ci
  56006. // cell-ref: A10
  56007. includes(...I) {
  56008. let [g, C] = [0, 0];
  56009. I.length === 1 ? [C, g] = Ua(I[0]) : I.length === 2 && ([g, C] = I);
  56010. const {
  56011. sri: i,
  56012. sci: e,
  56013. eri: A,
  56014. eci: s
  56015. } = this;
  56016. return i <= g && g <= A && e <= C && C <= s;
  56017. }
  56018. each(I, g = () => !0) {
  56019. const {
  56020. sri: C,
  56021. sci: i,
  56022. eri: e,
  56023. eci: A
  56024. } = this;
  56025. for (let s = C; s <= e; s += 1)
  56026. if (g(s))
  56027. for (let l = i; l <= A; l += 1)
  56028. I(s, l);
  56029. }
  56030. contains(I) {
  56031. return this.sri <= I.sri && this.sci <= I.sci && this.eri >= I.eri && this.eci >= I.eci;
  56032. }
  56033. // within
  56034. within(I) {
  56035. return this.sri >= I.sri && this.sci >= I.sci && this.eri <= I.eri && this.eci <= I.eci;
  56036. }
  56037. // disjoint
  56038. disjoint(I) {
  56039. return this.sri > I.eri || this.sci > I.eci || I.sri > this.eri || I.sci > this.eci;
  56040. }
  56041. // intersects
  56042. intersects(I) {
  56043. return this.sri <= I.eri && this.sci <= I.eci && I.sri <= this.eri && I.sci <= this.eci;
  56044. }
  56045. // union
  56046. union(I) {
  56047. const {
  56048. sri: g,
  56049. sci: C,
  56050. eri: i,
  56051. eci: e
  56052. } = this;
  56053. return new lt(
  56054. I.sri < g ? I.sri : g,
  56055. I.sci < C ? I.sci : C,
  56056. I.eri > i ? I.eri : i,
  56057. I.eci > e ? I.eci : e
  56058. );
  56059. }
  56060. // intersection
  56061. // intersection(other) {}
  56062. // Returns Array<CellRange> that represents that part of this that does not intersect with other
  56063. // difference
  56064. difference(I) {
  56065. const g = [], C = (o, c, r, h) => {
  56066. g.push(new lt(o, c, r, h));
  56067. }, {
  56068. sri: i,
  56069. sci: e,
  56070. eri: A,
  56071. eci: s
  56072. } = this, l = I.sri - i, n = I.sci - e, a = A - I.eri, d = s - I.eci;
  56073. return l > 0 ? (C(i, e, I.sri - 1, s), a > 0 ? (C(I.eri + 1, e, A, s), n > 0 && C(I.sri, e, I.eri, I.sci - 1), d > 0 && C(I.sri, I.eci + 1, I.eri, s)) : (n > 0 && C(I.sri, e, A, I.sci - 1), d > 0 && C(I.sri, I.eci + 1, A, s))) : a > 0 && (C(I.eri + 1, e, A, s), n > 0 && C(i, e, I.eri, I.sci - 1), d > 0 && C(i, I.eci + 1, I.eri, s)), n > 0 ? (C(i, e, A, I.sci - 1), d > 0 ? (C(i, I.eri + 1, A, s), l > 0 && C(i, I.sci, I.sri - 1, I.eci), a > 0 && C(I.sri + 1, I.sci, A, I.eci)) : (l > 0 && C(i, I.sci, I.sri - 1, s), a > 0 && C(I.sri + 1, I.sci, A, s))) : d > 0 && (C(A, I.eci + 1, A, s), l > 0 && C(i, e, I.sri - 1, I.eci), a > 0 && C(I.eri + 1, e, A, I.eci)), g;
  56074. }
  56075. size() {
  56076. return [
  56077. this.eri - this.sri + 1,
  56078. this.eci - this.sci + 1
  56079. ];
  56080. }
  56081. toString() {
  56082. const {
  56083. sri: I,
  56084. sci: g,
  56085. eri: C,
  56086. eci: i
  56087. } = this;
  56088. let e = El(g, I);
  56089. return this.multiple() && (e = `${e}:${El(i, C)}`), e;
  56090. }
  56091. clone() {
  56092. const {
  56093. sri: I,
  56094. sci: g,
  56095. eri: C,
  56096. eci: i,
  56097. w: e,
  56098. h: A
  56099. } = this;
  56100. return new lt(I, g, C, i, e, A);
  56101. }
  56102. /*
  56103. toJSON() {
  56104. return this.toString();
  56105. }
  56106. */
  56107. equals(I) {
  56108. return this.eri === I.eri && this.eci === I.eci && this.sri === I.sri && this.sci === I.sci;
  56109. }
  56110. static valueOf(I) {
  56111. const g = I.split(":"), [C, i] = Ua(g[0]);
  56112. let [e, A] = [i, C];
  56113. return g.length > 1 && ([A, e] = Ua(g[1])), new lt(i, C, e, A);
  56114. }
  56115. }
  56116. let Iug = class {
  56117. constructor() {
  56118. this.range = new lt(0, 0, 0, 0), this.ri = 0, this.ci = 0;
  56119. }
  56120. multiple() {
  56121. return this.range.multiple();
  56122. }
  56123. setIndexes(I, g) {
  56124. this.ri = I, this.ci = g;
  56125. }
  56126. size() {
  56127. return this.range.size();
  56128. }
  56129. };
  56130. class Cug {
  56131. constructor() {
  56132. this.x = 0, this.y = 0, this.ri = 0, this.ci = 0;
  56133. }
  56134. }
  56135. class tug {
  56136. constructor() {
  56137. this.undoItems = [], this.redoItems = [];
  56138. }
  56139. add(I) {
  56140. this.undoItems.push(JSON.stringify(I)), this.redoItems = [];
  56141. }
  56142. canUndo() {
  56143. return this.undoItems.length > 0;
  56144. }
  56145. canRedo() {
  56146. return this.redoItems.length > 0;
  56147. }
  56148. undo(I, g) {
  56149. const { undoItems: C, redoItems: i } = this;
  56150. this.canUndo() && (i.push(JSON.stringify(I)), g(JSON.parse(C.pop())));
  56151. }
  56152. redo(I, g) {
  56153. const { undoItems: C, redoItems: i } = this;
  56154. this.canRedo() && (C.push(JSON.stringify(I)), g(JSON.parse(i.pop())));
  56155. }
  56156. }
  56157. class iug {
  56158. constructor() {
  56159. this.range = null, this.state = "clear";
  56160. }
  56161. copy(I) {
  56162. return this.range = I, this.state = "copy", this;
  56163. }
  56164. cut(I) {
  56165. return this.range = I, this.state = "cut", this;
  56166. }
  56167. isCopy() {
  56168. return this.state === "copy";
  56169. }
  56170. isCut() {
  56171. return this.state === "cut";
  56172. }
  56173. isClear() {
  56174. return this.state === "clear";
  56175. }
  56176. clear() {
  56177. this.range = null, this.state = "clear";
  56178. }
  56179. }
  56180. class Rq {
  56181. constructor(I, g, C) {
  56182. this.ci = I, this.operator = g, this.value = C;
  56183. }
  56184. set(I, g) {
  56185. this.operator = I, this.value = g;
  56186. }
  56187. includes(I) {
  56188. const { operator: g, value: C } = this;
  56189. return g === "all" ? !0 : g === "in" ? C.includes(I) : !1;
  56190. }
  56191. vlength() {
  56192. const { operator: I, value: g } = this;
  56193. return I === "in" ? g.length : 0;
  56194. }
  56195. getData() {
  56196. const { ci: I, operator: g, value: C } = this;
  56197. return { ci: I, operator: g, value: C };
  56198. }
  56199. }
  56200. class fq {
  56201. constructor(I, g) {
  56202. this.ci = I, this.order = g;
  56203. }
  56204. asc() {
  56205. return this.order === "asc";
  56206. }
  56207. desc() {
  56208. return this.order === "desc";
  56209. }
  56210. }
  56211. class eug {
  56212. constructor() {
  56213. this.ref = null, this.filters = [], this.sort = null;
  56214. }
  56215. setData({ ref: I, filters: g, sort: C }) {
  56216. I != null && (this.ref = I, this.filters = g.map((i) => new Rq(i.ci, i.operator, i.value)), C && (this.sort = new fq(C.ci, C.order)));
  56217. }
  56218. getData() {
  56219. if (this.active()) {
  56220. const { ref: I, filters: g, sort: C } = this;
  56221. return { ref: I, filters: g.map((i) => i.getData()), sort: C };
  56222. }
  56223. return {};
  56224. }
  56225. addFilter(I, g, C) {
  56226. const i = this.getFilter(I);
  56227. i == null ? this.filters.push(new Rq(I, g, C)) : i.set(g, C);
  56228. }
  56229. setSort(I, g) {
  56230. this.sort = g ? new fq(I, g) : null;
  56231. }
  56232. includes(I, g) {
  56233. return this.active() ? this.hrange().includes(I, g) : !1;
  56234. }
  56235. getSort(I) {
  56236. const { sort: g } = this;
  56237. return g && g.ci === I ? g : null;
  56238. }
  56239. getFilter(I) {
  56240. const { filters: g } = this;
  56241. for (let C = 0; C < g.length; C += 1)
  56242. if (g[C].ci === I)
  56243. return g[C];
  56244. return null;
  56245. }
  56246. filteredRows(I) {
  56247. const g = /* @__PURE__ */ new Set(), C = /* @__PURE__ */ new Set();
  56248. if (this.active()) {
  56249. const { sri: i, eri: e } = this.range(), { filters: A } = this;
  56250. for (let s = i + 1; s <= e; s += 1)
  56251. for (let l = 0; l < A.length; l += 1) {
  56252. const n = A[l], a = I(s, n.ci), d = a ? a.text : "";
  56253. if (n.includes(d))
  56254. C.add(s);
  56255. else {
  56256. g.add(s);
  56257. break;
  56258. }
  56259. }
  56260. }
  56261. return { rset: g, fset: C };
  56262. }
  56263. items(I, g) {
  56264. const C = {};
  56265. if (this.active()) {
  56266. const { sri: i, eri: e } = this.range();
  56267. for (let A = i + 1; A <= e; A += 1) {
  56268. const s = g(A, I);
  56269. if (s !== null && !/^\s*$/.test(s.text)) {
  56270. const l = s.text, n = (C[l] || 0) + 1;
  56271. C[l] = n;
  56272. } else
  56273. C[""] = (C[""] || 0) + 1;
  56274. }
  56275. }
  56276. return C;
  56277. }
  56278. range() {
  56279. return lt.valueOf(this.ref);
  56280. }
  56281. hrange() {
  56282. const I = this.range();
  56283. return I.eri = I.sri, I;
  56284. }
  56285. clear() {
  56286. this.ref = null, this.filters = [], this.sort = null;
  56287. }
  56288. active() {
  56289. return this.ref !== null;
  56290. }
  56291. }
  56292. class Q9 {
  56293. constructor(I = []) {
  56294. this._ = I;
  56295. }
  56296. forEach(I) {
  56297. this._.forEach(I);
  56298. }
  56299. deleteWithin(I) {
  56300. this._ = this._.filter((g) => !g.within(I));
  56301. }
  56302. getFirstIncludes(I, g) {
  56303. for (let C = 0; C < this._.length; C += 1) {
  56304. const i = this._[C];
  56305. if (i.includes(I, g))
  56306. return i;
  56307. }
  56308. return null;
  56309. }
  56310. filterIntersects(I) {
  56311. return new Q9(this._.filter((g) => g.intersects(I)));
  56312. }
  56313. intersects(I) {
  56314. for (let g = 0; g < this._.length; g += 1)
  56315. if (this._[g].intersects(I))
  56316. return !0;
  56317. return !1;
  56318. }
  56319. union(I) {
  56320. let g = I;
  56321. return this._.forEach((C) => {
  56322. C.intersects(g) && (g = C.union(g));
  56323. }), g;
  56324. }
  56325. add(I) {
  56326. this.deleteWithin(I), this._.push(I);
  56327. }
  56328. // type: row | column
  56329. shift(I, g, C, i) {
  56330. this._.forEach((e) => {
  56331. const {
  56332. sri: A,
  56333. sci: s,
  56334. eri: l,
  56335. eci: n
  56336. } = e, a = e;
  56337. I === "row" ? A >= g ? (a.sri += C, a.eri += C) : A < g && g <= l && (a.eri += C, i(A, s, C, 0)) : I === "column" && (s >= g ? (a.sci += C, a.eci += C) : s < g && g <= n && (a.eci += C, i(A, s, 0, C)));
  56338. });
  56339. }
  56340. move(I, g, C) {
  56341. this._.forEach((i) => {
  56342. const e = i;
  56343. e.within(I) && (e.eri += g, e.sri += g, e.sci += C, e.eci += C);
  56344. });
  56345. }
  56346. setData(I) {
  56347. return this._ = I.map((g) => lt.valueOf(g)), this;
  56348. }
  56349. getData() {
  56350. return this._.map((I) => I.toString());
  56351. }
  56352. }
  56353. function Aug(t) {
  56354. return JSON.parse(JSON.stringify(t));
  56355. }
  56356. const Aig = (t = {}, ...I) => (I.forEach((g) => {
  56357. Object.keys(g).forEach((C) => {
  56358. const i = g[C];
  56359. typeof i == "string" || typeof i == "number" || typeof i == "boolean" ? t[C] = i : typeof i != "function" && !Array.isArray(i) && i instanceof Object ? (t[C] = t[C] || {}, Aig(t[C], i)) : t[C] = i;
  56360. });
  56361. }), t);
  56362. function _D(t, I) {
  56363. const g = Object.keys(t);
  56364. if (g.length !== Object.keys(I).length) return !1;
  56365. for (let C = 0; C < g.length; C += 1) {
  56366. const i = g[C], e = t[i], A = I[i];
  56367. if (A === void 0) return !1;
  56368. if (typeof e == "string" || typeof e == "number" || typeof e == "boolean") {
  56369. if (e !== A) return !1;
  56370. } else if (Array.isArray(e)) {
  56371. if (e.length !== A.length) return !1;
  56372. for (let s = 0; s < e.length; s += 1)
  56373. if (!_D(e[s], A[s])) return !1;
  56374. } else if (typeof e != "function" && !Array.isArray(e) && e instanceof Object && !_D(e, A))
  56375. return !1;
  56376. }
  56377. return !0;
  56378. }
  56379. const sug = (t, I = (g) => g) => {
  56380. let g = 0, C = 0;
  56381. return Object.keys(t).forEach((i) => {
  56382. g += I(t[i], i), C += 1;
  56383. }), [g, C];
  56384. };
  56385. function lug(t, I) {
  56386. const g = t[`${I}`];
  56387. return delete t[`${I}`], g;
  56388. }
  56389. function nug(t, I, g, C, i, e) {
  56390. let A = g, s = C, l = t;
  56391. for (; l < I && !(A > i); l += 1)
  56392. s = e(l), A += s;
  56393. return [l, A - s, s];
  56394. }
  56395. function aug(t, I, g) {
  56396. let C = 0;
  56397. for (let i = t; i < I; i += 1)
  56398. C += g(i);
  56399. return C;
  56400. }
  56401. function oug(t, I, g) {
  56402. for (let C = t; C < I; C += 1)
  56403. g(C);
  56404. }
  56405. function cug(t, I) {
  56406. if (t.length === I.length) {
  56407. for (let g = 0; g < t.length; g += 1)
  56408. if (t[g] !== I[g]) return !1;
  56409. } else return !1;
  56410. return !0;
  56411. }
  56412. function zX(t) {
  56413. const I = `${t}`;
  56414. let g = 0, C = !1;
  56415. for (let i = 0; i < I.length; i += 1)
  56416. C === !0 && (g += 1), I.charAt(i) === "." && (C = !0);
  56417. return g;
  56418. }
  56419. function Po(t, I, g) {
  56420. if (Number.isNaN(I) || Number.isNaN(g))
  56421. return I + t + g;
  56422. const C = zX(I), i = zX(g), e = Number(I), A = Number(g);
  56423. let s = 0;
  56424. if (t === "-")
  56425. s = e - A;
  56426. else if (t === "+")
  56427. s = e + A;
  56428. else if (t === "*")
  56429. s = e * A;
  56430. else if (t === "/")
  56431. return s = e / A, zX(s) > 5 ? s.toFixed(2) : s;
  56432. return s.toFixed(Math.max(C, i));
  56433. }
  56434. const _i = {
  56435. cloneDeep: Aug,
  56436. merge: (...t) => Aig({}, ...t),
  56437. equals: _D,
  56438. arrayEquals: cug,
  56439. sum: sug,
  56440. rangeEach: oug,
  56441. rangeSum: aug,
  56442. rangeReduceIf: nug,
  56443. deleteProperty: lug,
  56444. numberCalc: Po
  56445. };
  56446. class dug {
  56447. constructor({ len: I, height: g }) {
  56448. this._ = {}, this.len = I, this.height = g;
  56449. }
  56450. getHeight(I) {
  56451. if (this.isHide(I)) return 0;
  56452. const g = this.get(I);
  56453. return g && g.height ? g.height : this.height;
  56454. }
  56455. setHeight(I, g) {
  56456. const C = this.getOrNew(I);
  56457. C.height = g;
  56458. }
  56459. unhide(I) {
  56460. let g = I;
  56461. for (; g > 0 && (g -= 1, this.isHide(g)); )
  56462. this.setHide(g, !1);
  56463. }
  56464. isHide(I) {
  56465. const g = this.get(I);
  56466. return g && g.hide;
  56467. }
  56468. setHide(I, g) {
  56469. const C = this.getOrNew(I);
  56470. g === !0 ? C.hide = !0 : delete C.hide;
  56471. }
  56472. setStyle(I, g) {
  56473. const C = this.getOrNew(I);
  56474. C.style = g;
  56475. }
  56476. sumHeight(I, g, C) {
  56477. return _i.rangeSum(I, g, (i) => C && C.has(i) ? 0 : this.getHeight(i));
  56478. }
  56479. totalHeight() {
  56480. return this.sumHeight(0, this.len);
  56481. }
  56482. get(I) {
  56483. return this._[I];
  56484. }
  56485. getOrNew(I) {
  56486. return this._[I] = this._[I] || { cells: {} }, this._[I];
  56487. }
  56488. getCell(I, g) {
  56489. const C = this.get(I);
  56490. return C !== void 0 && C.cells !== void 0 && C.cells[g] !== void 0 ? C.cells[g] : null;
  56491. }
  56492. getCellMerge(I, g) {
  56493. const C = this.getCell(I, g);
  56494. return C && C.merge ? C.merge : [0, 0];
  56495. }
  56496. getCellOrNew(I, g) {
  56497. const C = this.getOrNew(I);
  56498. return C.cells[g] = C.cells[g] || {}, C.cells[g];
  56499. }
  56500. // what: all | text | format
  56501. setCell(I, g, C, i = "all") {
  56502. const e = this.getOrNew(I);
  56503. i === "all" ? e.cells[g] = C : i === "text" ? (e.cells[g] = e.cells[g] || {}, e.cells[g].text = C.text) : i === "format" && (e.cells[g] = e.cells[g] || {}, e.cells[g].style = C.style, C.merge && (e.cells[g].merge = C.merge));
  56504. }
  56505. setCellText(I, g, C) {
  56506. const i = this.getCellOrNew(I, g);
  56507. i.editable !== !1 && (i.text = C);
  56508. }
  56509. // what: all | format | text
  56510. copyPaste(I, g, C, i = !1, e = () => {
  56511. }) {
  56512. const {
  56513. sri: A,
  56514. sci: s,
  56515. eri: l,
  56516. eci: n
  56517. } = I, a = g.sri, d = g.sci, o = g.eri, c = g.eci, [r, h] = I.size(), [b, u] = g.size();
  56518. let m = !0, Z = 0;
  56519. (o < A || c < s) && (m = !1, o < A ? Z = b : Z = u);
  56520. for (let p = A; p <= l; p += 1)
  56521. if (this._[p]) {
  56522. for (let Y = s; Y <= n; Y += 1)
  56523. if (this._[p].cells && this._[p].cells[Y])
  56524. for (let R = a; R <= o; R += r)
  56525. for (let X = d; X <= c; X += h) {
  56526. const H = R + (p - A), S = X + (Y - s), z = _i.cloneDeep(this._[p].cells[Y]);
  56527. if (i && z && z.text && z.text.length > 0) {
  56528. const { text: v } = z;
  56529. let K = X - d + (R - a) + 2;
  56530. if (m || (K -= Z + 1), v[0] === "=")
  56531. z.text = v.replace(/[a-zA-Z]{1,3}\d+/g, (V) => {
  56532. let [N, B] = [0, 0];
  56533. return A === a ? N = K - 1 : B = K - 1, /^\d+$/.test(V) ? V : Lu(V, N, B);
  56534. });
  56535. else if (r <= 1 && h > 1 && (a > l || o < A) || h <= 1 && r > 1 && (d > n || c < s) || r <= 1 && h <= 1) {
  56536. const V = /[\\.\d]+$/.exec(v);
  56537. if (V !== null) {
  56538. const N = Number(V[0]) + K - 1;
  56539. z.text = v.substring(0, V.index) + N;
  56540. }
  56541. }
  56542. }
  56543. this.setCell(H, S, z, C), e(H, S, z);
  56544. }
  56545. }
  56546. }
  56547. cutPaste(I, g) {
  56548. const C = {};
  56549. this.each((i) => {
  56550. this.eachCells(i, (e) => {
  56551. let A = parseInt(i, 10), s = parseInt(e, 10);
  56552. I.includes(i, e) && (A = g.sri + (A - I.sri), s = g.sci + (s - I.sci)), C[A] = C[A] || { cells: {} }, C[A].cells[s] = this._[i].cells[e];
  56553. });
  56554. }), this._ = C;
  56555. }
  56556. // src: Array<Array<String>>
  56557. paste(I, g) {
  56558. if (I.length <= 0) return;
  56559. const { sri: C, sci: i } = g;
  56560. I.forEach((e, A) => {
  56561. const s = C + A;
  56562. e.forEach((l, n) => {
  56563. const a = i + n;
  56564. this.setCellText(s, a, l);
  56565. });
  56566. });
  56567. }
  56568. insert(I, g = 1) {
  56569. const C = {};
  56570. this.each((i, e) => {
  56571. let A = parseInt(i, 10);
  56572. A >= I && (A += g, this.eachCells(i, (s, l) => {
  56573. l.text && l.text[0] === "=" && (l.text = l.text.replace(/[a-zA-Z]{1,3}\d+/g, (n) => Lu(n, 0, g, (a, d) => d >= I)));
  56574. })), C[A] = e;
  56575. }), this._ = C, this.len += g;
  56576. }
  56577. delete(I, g) {
  56578. const C = g - I + 1, i = {};
  56579. this.each((e, A) => {
  56580. const s = parseInt(e, 10);
  56581. s < I ? i[s] = A : e > g && (i[s - C] = A, this.eachCells(e, (l, n) => {
  56582. n.text && n.text[0] === "=" && (n.text = n.text.replace(/[a-zA-Z]{1,3}\d+/g, (a) => Lu(a, 0, -C, (d, o) => o > g)));
  56583. }));
  56584. }), this._ = i, this.len -= C;
  56585. }
  56586. insertColumn(I, g = 1) {
  56587. this.each((C, i) => {
  56588. const e = {};
  56589. this.eachCells(C, (A, s) => {
  56590. let l = parseInt(A, 10);
  56591. l >= I && (l += g, s.text && s.text[0] === "=" && (s.text = s.text.replace(/[a-zA-Z]{1,3}\d+/g, (n) => Lu(n, g, 0, (a) => a >= I)))), e[l] = s;
  56592. }), i.cells = e;
  56593. });
  56594. }
  56595. deleteColumn(I, g) {
  56596. const C = g - I + 1;
  56597. this.each((i, e) => {
  56598. const A = {};
  56599. this.eachCells(i, (s, l) => {
  56600. const n = parseInt(s, 10);
  56601. n < I ? A[n] = l : n > g && (A[n - C] = l, l.text && l.text[0] === "=" && (l.text = l.text.replace(/[a-zA-Z]{1,3}\d+/g, (a) => Lu(a, -C, 0, (d) => d > g))));
  56602. }), e.cells = A;
  56603. });
  56604. }
  56605. // what: all | text | format | merge
  56606. deleteCells(I, g = "all") {
  56607. I.each((C, i) => {
  56608. this.deleteCell(C, i, g);
  56609. });
  56610. }
  56611. // what: all | text | format | merge
  56612. deleteCell(I, g, C = "all") {
  56613. const i = this.get(I);
  56614. if (i !== null) {
  56615. const e = this.getCell(I, g);
  56616. e !== null && e.editable !== !1 && (C === "all" ? delete i.cells[g] : C === "text" ? (e.text && delete e.text, e.value && delete e.value) : C === "format" ? (e.style !== void 0 && delete e.style, e.merge && delete e.merge) : C === "merge" && e.merge && delete e.merge);
  56617. }
  56618. }
  56619. maxCell() {
  56620. const I = Object.keys(this._), g = I[I.length - 1], C = this._[g];
  56621. if (C) {
  56622. const { cells: i } = C, e = Object.keys(i), A = e[e.length - 1];
  56623. return [parseInt(g, 10), parseInt(A, 10)];
  56624. }
  56625. return [0, 0];
  56626. }
  56627. each(I) {
  56628. Object.entries(this._).forEach(([g, C]) => {
  56629. I(g, C);
  56630. });
  56631. }
  56632. eachCells(I, g) {
  56633. this._[I] && this._[I].cells && Object.entries(this._[I].cells).forEach(([C, i]) => {
  56634. g(C, i);
  56635. });
  56636. }
  56637. setData(I) {
  56638. I.len && (this.len = I.len, delete I.len), this._ = I;
  56639. }
  56640. getData() {
  56641. const { len: I } = this;
  56642. return Object.assign({ len: I }, this._);
  56643. }
  56644. }
  56645. class rug {
  56646. constructor({
  56647. len: I,
  56648. width: g,
  56649. indexWidth: C,
  56650. minWidth: i
  56651. }) {
  56652. this._ = {}, this.len = I, this.width = g, this.indexWidth = C, this.minWidth = i;
  56653. }
  56654. setData(I) {
  56655. I.len && (this.len = I.len, delete I.len), this._ = I;
  56656. }
  56657. getData() {
  56658. const { len: I } = this;
  56659. return Object.assign({ len: I }, this._);
  56660. }
  56661. getWidth(I) {
  56662. if (this.isHide(I)) return 0;
  56663. const g = this._[I];
  56664. return g && g.width ? g.width : this.width;
  56665. }
  56666. getOrNew(I) {
  56667. return this._[I] = this._[I] || {}, this._[I];
  56668. }
  56669. setWidth(I, g) {
  56670. const C = this.getOrNew(I);
  56671. C.width = g;
  56672. }
  56673. unhide(I) {
  56674. let g = I;
  56675. for (; g > 0 && (g -= 1, this.isHide(g)); )
  56676. this.setHide(g, !1);
  56677. }
  56678. isHide(I) {
  56679. const g = this._[I];
  56680. return g && g.hide;
  56681. }
  56682. setHide(I, g) {
  56683. const C = this.getOrNew(I);
  56684. g === !0 ? C.hide = !0 : delete C.hide;
  56685. }
  56686. setStyle(I, g) {
  56687. const C = this.getOrNew(I);
  56688. C.style = g;
  56689. }
  56690. sumWidth(I, g) {
  56691. return _i.rangeSum(I, g, (C) => this.getWidth(C));
  56692. }
  56693. totalWidth() {
  56694. return this.sumWidth(0, this.len);
  56695. }
  56696. }
  56697. const hug = {
  56698. toolbar: {
  56699. undo: "Undo",
  56700. redo: "Redo",
  56701. print: "Print",
  56702. paintformat: "Paint format",
  56703. clearformat: "Clear format",
  56704. format: "Format",
  56705. fontName: "Font",
  56706. fontSize: "Font size",
  56707. fontBold: "Font bold",
  56708. fontItalic: "Font italic",
  56709. underline: "Underline",
  56710. strike: "Strike",
  56711. color: "Text color",
  56712. bgcolor: "Fill color",
  56713. border: "Borders",
  56714. merge: "Merge cells",
  56715. align: "Horizontal align",
  56716. valign: "Vertical align",
  56717. textwrap: "Text wrapping",
  56718. freeze: "Freeze cell",
  56719. autofilter: "Filter",
  56720. formula: "Functions",
  56721. more: "More"
  56722. },
  56723. contextmenu: {
  56724. copy: "Copy",
  56725. cut: "Cut",
  56726. paste: "Paste",
  56727. pasteValue: "Paste values only",
  56728. pasteFormat: "Paste format only",
  56729. hide: "Hide",
  56730. insertRow: "Insert row",
  56731. insertColumn: "Insert column",
  56732. deleteSheet: "Delete",
  56733. deleteRow: "Delete row",
  56734. deleteColumn: "Delete column",
  56735. deleteCell: "Delete cell",
  56736. deleteCellText: "Delete cell text",
  56737. validation: "Data validations",
  56738. cellprintable: "Enable export",
  56739. cellnonprintable: "Disable export",
  56740. celleditable: "Enable editing",
  56741. cellnoneditable: "Disable editing"
  56742. },
  56743. print: {
  56744. size: "Paper size",
  56745. orientation: "Page orientation",
  56746. orientations: ["Landscape", "Portrait"]
  56747. },
  56748. format: {
  56749. normal: "Normal",
  56750. text: "Plain Text",
  56751. number: "Number",
  56752. percent: "Percent",
  56753. rmb: "RMB",
  56754. usd: "USD",
  56755. eur: "EUR",
  56756. date: "Date",
  56757. time: "Time",
  56758. datetime: "Date time",
  56759. duration: "Duration"
  56760. },
  56761. formula: {
  56762. sum: "Sum",
  56763. average: "Average",
  56764. max: "Max",
  56765. min: "Min",
  56766. _if: "IF",
  56767. and: "AND",
  56768. or: "OR",
  56769. concat: "Concat"
  56770. },
  56771. validation: {
  56772. required: "it must be required",
  56773. notMatch: "it not match its validation rule",
  56774. between: "it is between {} and {}",
  56775. notBetween: "it is not between {} and {}",
  56776. notIn: "it is not in list",
  56777. equal: "it equal to {}",
  56778. notEqual: "it not equal to {}",
  56779. lessThan: "it less than {}",
  56780. lessThanEqual: "it less than or equal to {}",
  56781. greaterThan: "it greater than {}",
  56782. greaterThanEqual: "it greater than or equal to {}"
  56783. },
  56784. error: {
  56785. pasteForMergedCell: "Unable to do this for merged cells"
  56786. },
  56787. calendar: {
  56788. weeks: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
  56789. months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
  56790. },
  56791. button: {
  56792. next: "Next",
  56793. cancel: "Cancel",
  56794. remove: "Remove",
  56795. save: "Save",
  56796. ok: "OK"
  56797. },
  56798. sort: {
  56799. desc: "Sort Z -> A",
  56800. asc: "Sort A -> Z"
  56801. },
  56802. filter: {
  56803. empty: "empty"
  56804. },
  56805. dataValidation: {
  56806. mode: "Mode",
  56807. range: "Cell Range",
  56808. criteria: "Criteria",
  56809. modeType: {
  56810. cell: "Cell",
  56811. column: "Colun",
  56812. row: "Row"
  56813. },
  56814. type: {
  56815. list: "List",
  56816. number: "Number",
  56817. date: "Date",
  56818. phone: "Phone",
  56819. email: "Email"
  56820. },
  56821. operator: {
  56822. be: "between",
  56823. nbe: "not betwwen",
  56824. lt: "less than",
  56825. lte: "less than or equal to",
  56826. gt: "greater than",
  56827. gte: "greater than or equal to",
  56828. eq: "equal to",
  56829. neq: "not equal to"
  56830. }
  56831. }
  56832. };
  56833. let qD = ["en"];
  56834. const sig = {
  56835. en: hug
  56836. };
  56837. function Hq(t, I) {
  56838. if (I)
  56839. for (const g of qD) {
  56840. if (!I[g]) break;
  56841. let C = I[g];
  56842. const i = t.match(/(?:\\.|[^.])+/g);
  56843. for (let e = 0; e < i.length; e += 1) {
  56844. const A = i[e], s = C[A];
  56845. if (!s) break;
  56846. if (e === i.length - 1) return s;
  56847. C = s;
  56848. }
  56849. }
  56850. }
  56851. function bt(t) {
  56852. let I = Hq(t, sig);
  56853. return !I && window && window.x_spreadsheet && window.x_spreadsheet.$messages && (I = Hq(t, window.x_spreadsheet.$messages)), I || "";
  56854. }
  56855. function $I(t) {
  56856. return () => bt(t);
  56857. }
  56858. function lig(t, I, g = !1) {
  56859. g ? qD = [t] : qD.unshift(t), I && (sig[t] = I);
  56860. }
  56861. const Xq = {
  56862. phone: /^[1-9]\d{10}$/,
  56863. email: /w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*/
  56864. };
  56865. function hA(t, I, ...g) {
  56866. let C = "";
  56867. return t || (C = bt(`validation.${I}`, ...g)), [t, C];
  56868. }
  56869. class nig {
  56870. // operator: b|nb|eq|neq|lt|lte|gt|gte
  56871. // type: date|number|list|phone|email
  56872. constructor(I, g, C, i) {
  56873. this.required = g, this.value = C, this.type = I, this.operator = i, this.message = "";
  56874. }
  56875. parseValue(I) {
  56876. const { type: g } = this;
  56877. return g === "date" ? new Date(I) : g === "number" ? Number(I) : I;
  56878. }
  56879. equals(I) {
  56880. let g = this.type === I.type && this.required === I.required && this.operator === I.operator;
  56881. return g && (Array.isArray(this.value) ? g = _i.arrayEquals(this.value, I.value) : g = this.value === I.value), g;
  56882. }
  56883. values() {
  56884. return this.value.split(",");
  56885. }
  56886. validate(I) {
  56887. const {
  56888. required: g,
  56889. operator: C,
  56890. value: i,
  56891. type: e
  56892. } = this;
  56893. if (g && /^\s*$/.test(I))
  56894. return hA(!1, "required");
  56895. if (/^\s*$/.test(I)) return [!0];
  56896. if (Xq[e] && !Xq[e].test(I))
  56897. return hA(!1, "notMatch");
  56898. if (e === "list")
  56899. return hA(this.values().includes(I), "notIn");
  56900. if (C) {
  56901. const A = this.parseValue(I);
  56902. if (C === "be") {
  56903. const [s, l] = i;
  56904. return hA(
  56905. A >= this.parseValue(s) && A <= this.parseValue(l),
  56906. "between",
  56907. s,
  56908. l
  56909. );
  56910. }
  56911. if (C === "nbe") {
  56912. const [s, l] = i;
  56913. return hA(
  56914. A < this.parseValue(s) || A > this.parseValue(l),
  56915. "notBetween",
  56916. s,
  56917. l
  56918. );
  56919. }
  56920. if (C === "eq")
  56921. return hA(
  56922. A === this.parseValue(i),
  56923. "equal",
  56924. i
  56925. );
  56926. if (C === "neq")
  56927. return hA(
  56928. A !== this.parseValue(i),
  56929. "notEqual",
  56930. i
  56931. );
  56932. if (C === "lt")
  56933. return hA(
  56934. A < this.parseValue(i),
  56935. "lessThan",
  56936. i
  56937. );
  56938. if (C === "lte")
  56939. return hA(
  56940. A <= this.parseValue(i),
  56941. "lessThanEqual",
  56942. i
  56943. );
  56944. if (C === "gt")
  56945. return hA(
  56946. A > this.parseValue(i),
  56947. "greaterThan",
  56948. i
  56949. );
  56950. if (C === "gte")
  56951. return hA(
  56952. A >= this.parseValue(i),
  56953. "greaterThanEqual",
  56954. i
  56955. );
  56956. }
  56957. return [!0];
  56958. }
  56959. }
  56960. class WV {
  56961. constructor(I, g, C) {
  56962. this.refs = g, this.mode = I, this.validator = C;
  56963. }
  56964. includes(I, g) {
  56965. const { refs: C } = this;
  56966. for (let i = 0; i < C.length; i += 1)
  56967. if (lt.valueOf(C[i]).includes(I, g)) return !0;
  56968. return !1;
  56969. }
  56970. addRef(I) {
  56971. this.remove(lt.valueOf(I)), this.refs.push(I);
  56972. }
  56973. remove(I) {
  56974. const g = [];
  56975. this.refs.forEach((C) => {
  56976. const i = lt.valueOf(C);
  56977. i.intersects(I) ? i.difference(I).forEach((A) => g.push(A.toString())) : g.push(C);
  56978. }), this.refs = g;
  56979. }
  56980. getData() {
  56981. const { refs: I, mode: g, validator: C } = this, {
  56982. type: i,
  56983. required: e,
  56984. operator: A,
  56985. value: s
  56986. } = C;
  56987. return {
  56988. refs: I,
  56989. mode: g,
  56990. type: i,
  56991. required: e,
  56992. operator: A,
  56993. value: s
  56994. };
  56995. }
  56996. static valueOf({
  56997. refs: I,
  56998. mode: g,
  56999. type: C,
  57000. required: i,
  57001. operator: e,
  57002. value: A
  57003. }) {
  57004. return new WV(g, I, new nig(C, i, A, e));
  57005. }
  57006. }
  57007. class bug {
  57008. constructor() {
  57009. this._ = [], this.errors = /* @__PURE__ */ new Map();
  57010. }
  57011. getError(I, g) {
  57012. return this.errors.get(`${I}_${g}`);
  57013. }
  57014. validate(I, g, C) {
  57015. const i = this.get(I, g), e = `${I}_${g}`, { errors: A } = this;
  57016. if (i !== null) {
  57017. const [s, l] = i.validator.validate(C);
  57018. s ? A.delete(e) : A.set(e, l);
  57019. } else
  57020. A.delete(e);
  57021. return !0;
  57022. }
  57023. // type: date|number|phone|email|list
  57024. // validator: { required, value, operator }
  57025. add(I, g, {
  57026. type: C,
  57027. required: i,
  57028. value: e,
  57029. operator: A
  57030. }) {
  57031. const s = new nig(
  57032. C,
  57033. i,
  57034. e,
  57035. A
  57036. ), l = this.getByValidator(s);
  57037. l !== null ? l.addRef(g) : this._.push(new WV(I, [g], s));
  57038. }
  57039. getByValidator(I) {
  57040. for (let g = 0; g < this._.length; g += 1) {
  57041. const C = this._[g];
  57042. if (C.validator.equals(I))
  57043. return C;
  57044. }
  57045. return null;
  57046. }
  57047. get(I, g) {
  57048. for (let C = 0; C < this._.length; C += 1) {
  57049. const i = this._[C];
  57050. if (i.includes(I, g)) return i;
  57051. }
  57052. return null;
  57053. }
  57054. remove(I) {
  57055. this.each((g) => {
  57056. g.remove(I);
  57057. });
  57058. }
  57059. each(I) {
  57060. this._.forEach((g) => I(g));
  57061. }
  57062. getData() {
  57063. return this._.filter((I) => I.refs.length > 0).map((I) => I.getData());
  57064. }
  57065. setData(I) {
  57066. this._ = I.map((g) => WV.valueOf(g));
  57067. }
  57068. }
  57069. const uug = {
  57070. mode: "edit",
  57071. // edit | read
  57072. view: {
  57073. height: () => document.documentElement.clientHeight,
  57074. width: () => document.documentElement.clientWidth
  57075. },
  57076. showGrid: !0,
  57077. showToolbar: !0,
  57078. showContextmenu: !0,
  57079. showBottomBar: !0,
  57080. row: {
  57081. len: 100,
  57082. height: 25
  57083. },
  57084. col: {
  57085. len: 26,
  57086. width: 100,
  57087. indexWidth: 60,
  57088. minWidth: 60
  57089. },
  57090. style: {
  57091. bgcolor: "#ffffff",
  57092. align: "left",
  57093. valign: "middle",
  57094. textwrap: !1,
  57095. strike: !1,
  57096. underline: !1,
  57097. color: "#0a0a0a",
  57098. font: {
  57099. name: "Arial",
  57100. size: 10,
  57101. bold: !1,
  57102. italic: !1
  57103. },
  57104. format: "normal"
  57105. }
  57106. }, mug = 41, Zug = 41, Sq = (t, I) => Object.prototype.hasOwnProperty.call(t, I);
  57107. function Dq(t, I, g = () => {
  57108. }) {
  57109. const { merges: C } = this, i = I.clone(), [e, A] = t.size(), [s, l] = I.size();
  57110. return e > s && (i.eri = I.sri + e - 1), A > l && (i.eci = I.sci + A - 1), C.intersects(i) ? (g(bt("error.pasteForMergedCell")), !1) : !0;
  57111. }
  57112. function Kq(t, I, g, C = !1) {
  57113. const { rows: i, merges: e } = this;
  57114. (g === "all" || g === "format") && (i.deleteCells(I, g), e.deleteWithin(I)), i.copyPaste(t, I, g, C, (A, s, l) => {
  57115. if (l && l.merge) {
  57116. const [n, a] = l.merge;
  57117. if (n <= 0 && a <= 0) return;
  57118. e.add(new lt(A, s, A + n, s + a));
  57119. }
  57120. });
  57121. }
  57122. function Gug(t, I) {
  57123. const { clipboard: g, rows: C, merges: i } = this;
  57124. C.cutPaste(t, I), i.move(
  57125. t,
  57126. I.sri - t.sri,
  57127. I.sci - t.sci
  57128. ), g.clear();
  57129. }
  57130. function vr(t, I, g) {
  57131. const { styles: C, rows: i } = this, e = i.getCellOrNew(t, I);
  57132. let A = {};
  57133. e.style !== void 0 && (A = _i.cloneDeep(C[e.style])), A = _i.merge(A, { border: g }), e.style = this.addStyle(A);
  57134. }
  57135. function wug({ mode: t, style: I, color: g }) {
  57136. const { styles: C, selector: i, rows: e } = this, {
  57137. sri: A,
  57138. sci: s,
  57139. eri: l,
  57140. eci: n
  57141. } = i.range, a = !this.isSignleSelected();
  57142. if (!(!a && (t === "inside" || t === "horizontal" || t === "vertical"))) {
  57143. if (t === "outside" && !a)
  57144. vr.call(this, A, s, {
  57145. top: [I, g],
  57146. bottom: [I, g],
  57147. left: [I, g],
  57148. right: [I, g]
  57149. });
  57150. else if (t === "none")
  57151. i.range.each((d, o) => {
  57152. const c = e.getCell(d, o);
  57153. if (c && c.style !== void 0) {
  57154. const r = _i.cloneDeep(C[c.style]);
  57155. delete r.border, c.style = this.addStyle(r);
  57156. }
  57157. });
  57158. else if (t === "all" || t === "inside" || t === "outside" || t === "horizontal" || t === "vertical") {
  57159. const d = [];
  57160. for (let o = A; o <= l; o += 1)
  57161. for (let c = s; c <= n; c += 1) {
  57162. const r = [];
  57163. for (let Y = 0; Y < d.length; Y += 1) {
  57164. const [R, X, H, S] = d[Y];
  57165. if (o === R + H + 1 && r.push(Y), R <= o && o <= R + H && c === X) {
  57166. c += S + 1;
  57167. break;
  57168. }
  57169. }
  57170. if (r.forEach((Y) => d.splice(Y, 1)), c > n) break;
  57171. const h = e.getCell(o, c);
  57172. let [b, u] = [0, 0];
  57173. h && h.merge && ([b, u] = h.merge, d.push([o, c, b, u]));
  57174. const m = b > 0 && o + b === l, Z = u > 0 && c + u === n;
  57175. let p = {};
  57176. t === "all" ? p = {
  57177. bottom: [I, g],
  57178. top: [I, g],
  57179. left: [I, g],
  57180. right: [I, g]
  57181. } : t === "inside" ? (!Z && c < n && (p.right = [I, g]), !m && o < l && (p.bottom = [I, g])) : t === "horizontal" ? !m && o < l && (p.bottom = [I, g]) : t === "vertical" ? !Z && c < n && (p.right = [I, g]) : t === "outside" && a && (A === o && (p.top = [I, g]), (m || l === o) && (p.bottom = [I, g]), s === c && (p.left = [I, g]), (Z || n === c) && (p.right = [I, g])), Object.keys(p).length > 0 && vr.call(this, o, c, p), c += u;
  57182. }
  57183. } else if (t === "top" || t === "bottom")
  57184. for (let d = s; d <= n; d += 1)
  57185. t === "top" && (vr.call(this, A, d, { top: [I, g] }), d += e.getCellMerge(A, d)[1]), t === "bottom" && (vr.call(this, l, d, { bottom: [I, g] }), d += e.getCellMerge(l, d)[1]);
  57186. else if (t === "left" || t === "right")
  57187. for (let d = A; d <= l; d += 1)
  57188. t === "left" && (vr.call(this, d, s, { left: [I, g] }), d += e.getCellMerge(d, s)[0]), t === "right" && (vr.call(this, d, n, { right: [I, g] }), d += e.getCellMerge(d, n)[0]);
  57189. }
  57190. }
  57191. function pug(t, I) {
  57192. const { rows: g } = this, C = this.freezeTotalHeight();
  57193. let i = g.height;
  57194. C + g.height < t && (i -= I);
  57195. const e = this.exceptRowSet;
  57196. let A = 0, s = i, { height: l } = g;
  57197. for (; A < g.len && !(s > t); A += 1)
  57198. e.has(A) || (l = g.getHeight(A), s += l);
  57199. return s -= l, s <= 0 ? { ri: -1, top: 0, height: l } : { ri: A - 1, top: s, height: l };
  57200. }
  57201. function Bug(t, I) {
  57202. const { cols: g } = this, C = this.freezeTotalWidth();
  57203. let i = g.indexWidth;
  57204. C + g.indexWidth < t && (i -= I);
  57205. const [e, A, s] = _i.rangeReduceIf(
  57206. 0,
  57207. g.len,
  57208. i,
  57209. g.indexWidth,
  57210. t,
  57211. (l) => g.getWidth(l)
  57212. );
  57213. return A <= 0 ? { ci: -1, left: 0, width: g.indexWidth } : { ci: e - 1, left: A, width: s };
  57214. }
  57215. class Wug {
  57216. constructor(I, g) {
  57217. this.settings = _i.merge(uug, g || {}), this.name = I || "sheet", this.freeze = [0, 0], this.styles = [], this.merges = new Q9(), this.rows = new dug(this.settings.row), this.cols = new rug(this.settings.col), this.validations = new bug(), this.hyperlinks = {}, this.comments = {}, this.selector = new Iug(), this.scroll = new Cug(), this.history = new tug(), this.clipboard = new iug(), this.autoFilter = new eug(), this.change = () => {
  57218. }, this.exceptRowSet = /* @__PURE__ */ new Set(), this.sortedRowMap = /* @__PURE__ */ new Map(), this.unsortedRowMap = /* @__PURE__ */ new Map();
  57219. }
  57220. addValidation(I, g, C) {
  57221. this.changeData(() => {
  57222. this.validations.add(I, g, C);
  57223. });
  57224. }
  57225. removeValidation() {
  57226. const { range: I } = this.selector;
  57227. this.changeData(() => {
  57228. this.validations.remove(I);
  57229. });
  57230. }
  57231. getSelectedValidator() {
  57232. const { ri: I, ci: g } = this.selector, C = this.validations.get(I, g);
  57233. return C ? C.validator : null;
  57234. }
  57235. getSelectedValidation() {
  57236. const { ri: I, ci: g, range: C } = this.selector, i = this.validations.get(I, g), e = { ref: C.toString() };
  57237. return i !== null && (e.mode = i.mode, e.validator = i.validator), e;
  57238. }
  57239. canUndo() {
  57240. return this.history.canUndo();
  57241. }
  57242. canRedo() {
  57243. return this.history.canRedo();
  57244. }
  57245. undo() {
  57246. this.history.undo(this.getData(), (I) => {
  57247. this.setData(I);
  57248. });
  57249. }
  57250. redo() {
  57251. this.history.redo(this.getData(), (I) => {
  57252. this.setData(I);
  57253. });
  57254. }
  57255. copy() {
  57256. this.clipboard.copy(this.selector.range);
  57257. }
  57258. copyToSystemClipboard() {
  57259. if (navigator.clipboard === void 0)
  57260. return;
  57261. let I = "";
  57262. const g = this.rows.getData();
  57263. for (let C = this.selector.range.sri; C <= this.selector.range.eri; C += 1) {
  57264. if (Sq(g, C)) {
  57265. for (let i = this.selector.range.sci; i <= this.selector.range.eci; i += 1)
  57266. if (i > this.selector.range.sci && (I += " "), Sq(g[C].cells, i)) {
  57267. const e = String(g[C].cells[i].text);
  57268. e.indexOf(`
  57269. `) === -1 && e.indexOf(" ") === -1 && e.indexOf('"') === -1 ? I += e : I += `"${e}"`;
  57270. }
  57271. } else
  57272. for (let i = this.selector.range.sci; i <= this.selector.range.eci; i += 1)
  57273. I += " ";
  57274. I += `
  57275. `;
  57276. }
  57277. navigator.clipboard.writeText(I).then(() => {
  57278. }, (C) => {
  57279. console.log("text copy to the system clipboard error ", I, C);
  57280. });
  57281. }
  57282. cut() {
  57283. this.clipboard.cut(this.selector.range);
  57284. }
  57285. // what: all | text | format
  57286. paste(I = "all", g = () => {
  57287. }) {
  57288. const { clipboard: C, selector: i } = this;
  57289. return C.isClear() || !Dq.call(this, C.range, i.range, g) ? !1 : (this.changeData(() => {
  57290. C.isCopy() ? Kq.call(this, C.range, i.range, I) : C.isCut() && Gug.call(this, C.range, i.range);
  57291. }), !0);
  57292. }
  57293. pasteFromText(I) {
  57294. const g = I.split(`\r
  57295. `).map((e) => e.replace(/"/g, "").split(" "));
  57296. g.length > 0 && (g.length -= 1);
  57297. const { rows: C, selector: i } = this;
  57298. this.changeData(() => {
  57299. C.paste(g, i.range);
  57300. });
  57301. }
  57302. autofill(I, g, C = () => {
  57303. }) {
  57304. const i = this.selector.range;
  57305. return Dq.call(this, i, I, C) ? (this.changeData(() => {
  57306. Kq.call(this, i, I, g, !0);
  57307. }), !0) : !1;
  57308. }
  57309. clearClipboard() {
  57310. this.clipboard.clear();
  57311. }
  57312. calSelectedRangeByEnd(I, g) {
  57313. const {
  57314. selector: C,
  57315. rows: i,
  57316. cols: e,
  57317. merges: A
  57318. } = this;
  57319. let {
  57320. sri: s,
  57321. sci: l,
  57322. eri: n,
  57323. eci: a
  57324. } = C.range;
  57325. const d = C.ri, o = C.ci;
  57326. let [c, r] = [I, g];
  57327. return I < 0 && (c = i.len - 1), g < 0 && (r = e.len - 1), c > d ? [s, n] = [d, c] : [s, n] = [c, d], r > o ? [l, a] = [o, r] : [l, a] = [r, o], C.range = A.union(new lt(
  57328. s,
  57329. l,
  57330. n,
  57331. a
  57332. )), C.range = A.union(C.range), C.range;
  57333. }
  57334. calSelectedRangeByStart(I, g) {
  57335. const {
  57336. selector: C,
  57337. rows: i,
  57338. cols: e,
  57339. merges: A
  57340. } = this;
  57341. let s = A.getFirstIncludes(I, g);
  57342. return s === null && (s = new lt(I, g, I, g), I === -1 && (s.sri = 0, s.eri = i.len - 1), g === -1 && (s.sci = 0, s.eci = e.len - 1)), C.range = s, s;
  57343. }
  57344. setSelectedCellAttr(I, g) {
  57345. this.changeData(() => {
  57346. const { selector: C, styles: i, rows: e } = this;
  57347. if (I === "merge")
  57348. g ? this.merge() : this.unmerge();
  57349. else if (I === "border")
  57350. wug.call(this, g);
  57351. else if (I === "formula") {
  57352. const { ri: A, ci: s, range: l } = C;
  57353. if (C.multiple()) {
  57354. const [n, a] = C.size(), {
  57355. sri: d,
  57356. sci: o,
  57357. eri: c,
  57358. eci: r
  57359. } = l;
  57360. if (n > 1)
  57361. for (let h = o; h <= r; h += 1) {
  57362. const b = e.getCellOrNew(c + 1, h);
  57363. b.text = `=${g}(${El(h, d)}:${El(h, c)})`;
  57364. }
  57365. else if (a > 1) {
  57366. const h = e.getCellOrNew(A, r + 1);
  57367. h.text = `=${g}(${El(o, A)}:${El(r, A)})`;
  57368. }
  57369. } else {
  57370. const n = e.getCellOrNew(A, s);
  57371. n.text = `=${g}()`;
  57372. }
  57373. } else
  57374. C.range.each((A, s) => {
  57375. const l = e.getCellOrNew(A, s);
  57376. let n = {};
  57377. if (l.style !== void 0 && (n = _i.cloneDeep(i[l.style])), I === "format")
  57378. n.format = g, l.style = this.addStyle(n);
  57379. else if (I === "font-bold" || I === "font-italic" || I === "font-name" || I === "font-size") {
  57380. const a = {};
  57381. a[I.split("-")[1]] = g, n.font = Object.assign(n.font || {}, a), l.style = this.addStyle(n);
  57382. } else I === "strike" || I === "textwrap" || I === "underline" || I === "align" || I === "valign" || I === "color" || I === "bgcolor" ? (n[I] = g, l.style = this.addStyle(n)) : l[I] = g;
  57383. });
  57384. });
  57385. }
  57386. // state: input | finished
  57387. setSelectedCellText(I, g = "input") {
  57388. const { autoFilter: C, selector: i, rows: e } = this, { ri: A, ci: s } = i;
  57389. let l = A;
  57390. this.unsortedRowMap.has(A) && (l = this.unsortedRowMap.get(A));
  57391. const n = e.getCell(l, s), a = n ? n.text : "";
  57392. if (this.setCellText(l, s, I, g), C.active()) {
  57393. const d = C.getFilter(s);
  57394. if (d) {
  57395. const o = d.value.findIndex((c) => c === a);
  57396. o >= 0 && d.value.splice(o, 1, I);
  57397. }
  57398. }
  57399. }
  57400. getSelectedCell() {
  57401. const { ri: I, ci: g } = this.selector;
  57402. let C = I;
  57403. return this.unsortedRowMap.has(I) && (C = this.unsortedRowMap.get(I)), this.rows.getCell(C, g);
  57404. }
  57405. xyInSelectedRect(I, g) {
  57406. const {
  57407. left: C,
  57408. top: i,
  57409. width: e,
  57410. height: A
  57411. } = this.getSelectedRect(), s = I - this.cols.indexWidth, l = g - this.rows.height;
  57412. return s > C && s < C + e && l > i && l < i + A;
  57413. }
  57414. getSelectedRect() {
  57415. return this.getRect(this.selector.range);
  57416. }
  57417. getClipboardRect() {
  57418. const { clipboard: I } = this;
  57419. return I.isClear() ? { left: -100, top: -100 } : this.getRect(I.range);
  57420. }
  57421. getRect(I) {
  57422. const {
  57423. scroll: g,
  57424. rows: C,
  57425. cols: i,
  57426. exceptRowSet: e
  57427. } = this, {
  57428. sri: A,
  57429. sci: s,
  57430. eri: l,
  57431. eci: n
  57432. } = I;
  57433. if (A < 0 && s < 0)
  57434. return {
  57435. left: 0,
  57436. l: 0,
  57437. top: 0,
  57438. t: 0,
  57439. scroll: g
  57440. };
  57441. const a = i.sumWidth(0, s), d = C.sumHeight(0, A, e), o = C.sumHeight(A, l + 1, e), c = i.sumWidth(s, n + 1);
  57442. let r = a - g.x, h = d - g.y;
  57443. const b = this.freezeTotalHeight(), u = this.freezeTotalWidth();
  57444. return u > 0 && u > a && (r = a), b > 0 && b > d && (h = d), {
  57445. l: a,
  57446. t: d,
  57447. left: r,
  57448. top: h,
  57449. height: o,
  57450. width: c,
  57451. scroll: g
  57452. };
  57453. }
  57454. getCellRectByXY(I, g) {
  57455. const {
  57456. scroll: C,
  57457. merges: i,
  57458. rows: e,
  57459. cols: A
  57460. } = this;
  57461. let { ri: s, top: l, height: n } = pug.call(this, g, C.y), { ci: a, left: d, width: o } = Bug.call(this, I, C.x);
  57462. if (a === -1 && (o = A.totalWidth()), s === -1 && (n = e.totalHeight()), s >= 0 || a >= 0) {
  57463. const c = i.getFirstIncludes(s, a);
  57464. c && (s = c.sri, a = c.sci, {
  57465. left: d,
  57466. top: l,
  57467. width: o,
  57468. height: n
  57469. } = this.cellRect(s, a));
  57470. }
  57471. return {
  57472. ri: s,
  57473. ci: a,
  57474. left: d,
  57475. top: l,
  57476. width: o,
  57477. height: n
  57478. };
  57479. }
  57480. isSignleSelected() {
  57481. const {
  57482. sri: I,
  57483. sci: g,
  57484. eri: C,
  57485. eci: i
  57486. } = this.selector.range, e = this.getCell(I, g);
  57487. if (e && e.merge) {
  57488. const [A, s] = e.merge;
  57489. if (I + A === C && g + s === i) return !0;
  57490. }
  57491. return !this.selector.multiple();
  57492. }
  57493. canUnmerge() {
  57494. const {
  57495. sri: I,
  57496. sci: g,
  57497. eri: C,
  57498. eci: i
  57499. } = this.selector.range, e = this.getCell(I, g);
  57500. if (e && e.merge) {
  57501. const [A, s] = e.merge;
  57502. if (I + A === C && g + s === i) return !0;
  57503. }
  57504. return !1;
  57505. }
  57506. merge() {
  57507. const { selector: I, rows: g } = this;
  57508. if (this.isSignleSelected()) return;
  57509. const [C, i] = I.size();
  57510. if (C > 1 || i > 1) {
  57511. const { sri: e, sci: A } = I.range;
  57512. this.changeData(() => {
  57513. const s = g.getCellOrNew(e, A);
  57514. s.merge = [C - 1, i - 1], this.merges.add(I.range), this.rows.deleteCells(I.range), this.rows.setCell(e, A, s);
  57515. });
  57516. }
  57517. }
  57518. unmerge() {
  57519. const { selector: I } = this;
  57520. if (!this.isSignleSelected()) return;
  57521. const { sri: g, sci: C } = I.range;
  57522. this.changeData(() => {
  57523. this.rows.deleteCell(g, C, "merge"), this.merges.deleteWithin(I.range);
  57524. });
  57525. }
  57526. canAutofilter() {
  57527. return !this.autoFilter.active();
  57528. }
  57529. autofilter() {
  57530. const { autoFilter: I, selector: g } = this;
  57531. this.changeData(() => {
  57532. I.active() ? (I.clear(), this.exceptRowSet = /* @__PURE__ */ new Set(), this.sortedRowMap = /* @__PURE__ */ new Map(), this.unsortedRowMap = /* @__PURE__ */ new Map()) : I.ref = g.range.toString();
  57533. });
  57534. }
  57535. setAutoFilter(I, g, C, i) {
  57536. const { autoFilter: e } = this;
  57537. e.addFilter(I, C, i), e.setSort(I, g), this.resetAutoFilter();
  57538. }
  57539. resetAutoFilter() {
  57540. const { autoFilter: I, rows: g } = this;
  57541. if (!I.active()) return;
  57542. const { sort: C } = I, { rset: i, fset: e } = I.filteredRows((l, n) => g.getCell(l, n)), A = Array.from(e), s = Array.from(e);
  57543. C && A.sort((l, n) => C.order === "asc" ? l - n : C.order === "desc" ? n - l : 0), this.exceptRowSet = i, this.sortedRowMap = /* @__PURE__ */ new Map(), this.unsortedRowMap = /* @__PURE__ */ new Map(), A.forEach((l, n) => {
  57544. this.sortedRowMap.set(s[n], l), this.unsortedRowMap.set(l, s[n]);
  57545. });
  57546. }
  57547. deleteCell(I = "all") {
  57548. const { selector: g } = this;
  57549. this.changeData(() => {
  57550. this.rows.deleteCells(g.range, I), (I === "all" || I === "format") && this.merges.deleteWithin(g.range);
  57551. });
  57552. }
  57553. // type: row | column
  57554. insert(I, g = 1) {
  57555. this.changeData(() => {
  57556. const { sri: C, sci: i } = this.selector.range, { rows: e, merges: A, cols: s } = this;
  57557. let l = C;
  57558. I === "row" ? e.insert(C, g) : I === "column" && (e.insertColumn(i, g), l = i, s.len += 1), A.shift(I, l, g, (n, a, d, o) => {
  57559. const c = e.getCell(n, a);
  57560. c.merge[0] += d, c.merge[1] += o;
  57561. });
  57562. });
  57563. }
  57564. // type: row | column
  57565. delete(I) {
  57566. this.changeData(() => {
  57567. const {
  57568. rows: g,
  57569. merges: C,
  57570. selector: i,
  57571. cols: e
  57572. } = this, { range: A } = i, {
  57573. sri: s,
  57574. sci: l,
  57575. eri: n,
  57576. eci: a
  57577. } = i.range, [d, o] = i.range.size();
  57578. let c = s, r = d;
  57579. I === "row" ? g.delete(s, n) : I === "column" && (g.deleteColumn(l, a), c = A.sci, r = o, e.len -= 1), C.shift(I, c, -r, (h, b, u, m) => {
  57580. const Z = g.getCell(h, b);
  57581. Z.merge[0] += u, Z.merge[1] += m, Z.merge[0] === 0 && Z.merge[1] === 0 && delete Z.merge;
  57582. });
  57583. });
  57584. }
  57585. scrollx(I, g) {
  57586. const { scroll: C, freeze: i, cols: e } = this, [, A] = i, [
  57587. s,
  57588. l,
  57589. n
  57590. ] = _i.rangeReduceIf(A, e.len, 0, 0, I, (d) => e.getWidth(d));
  57591. let a = l;
  57592. I > 0 && (a += n), C.x !== a && (C.ci = I > 0 ? s : 0, C.x = a, g());
  57593. }
  57594. scrolly(I, g) {
  57595. const { scroll: C, freeze: i, rows: e } = this, [A] = i, [
  57596. s,
  57597. l,
  57598. n
  57599. ] = _i.rangeReduceIf(A, e.len, 0, 0, I, (d) => e.getHeight(d));
  57600. let a = l;
  57601. I > 0 && (a += n), C.y !== a && (C.ri = I > 0 ? s : 0, C.y = a, g());
  57602. }
  57603. cellRect(I, g) {
  57604. const { rows: C, cols: i } = this, e = i.sumWidth(0, g), A = C.sumHeight(0, I), s = C.getCell(I, g);
  57605. let l = i.getWidth(g), n = C.getHeight(I);
  57606. if (s !== null && s.merge) {
  57607. const [a, d] = s.merge;
  57608. if (a > 0)
  57609. for (let o = 1; o <= a; o += 1)
  57610. n += C.getHeight(I + o);
  57611. if (d > 0)
  57612. for (let o = 1; o <= d; o += 1)
  57613. l += i.getWidth(g + o);
  57614. }
  57615. return {
  57616. left: e,
  57617. top: A,
  57618. width: l,
  57619. height: n,
  57620. cell: s
  57621. };
  57622. }
  57623. getCell(I, g) {
  57624. return this.rows.getCell(I, g);
  57625. }
  57626. getCellTextOrDefault(I, g) {
  57627. const C = this.getCell(I, g);
  57628. return C && C.text ? C.text : "";
  57629. }
  57630. getCellStyle(I, g) {
  57631. const C = this.getCell(I, g);
  57632. return C && C.style !== void 0 ? this.styles[C.style] : null;
  57633. }
  57634. getCellStyleOrDefault(I, g) {
  57635. const { styles: C, rows: i } = this, e = i.getCell(I, g), A = e && e.style !== void 0 ? C[e.style] : {};
  57636. return _i.merge(this.defaultStyle(), A);
  57637. }
  57638. getSelectedCellStyle() {
  57639. const { ri: I, ci: g } = this.selector;
  57640. return this.getCellStyleOrDefault(I, g);
  57641. }
  57642. // state: input | finished
  57643. setCellText(I, g, C, i) {
  57644. const { rows: e, history: A, validations: s } = this;
  57645. i === "finished" ? (e.setCellText(I, g, ""), A.add(this.getData()), e.setCellText(I, g, C)) : (e.setCellText(I, g, C), this.change(this.getData())), s.validate(I, g, C);
  57646. }
  57647. freezeIsActive() {
  57648. const [I, g] = this.freeze;
  57649. return I > 0 || g > 0;
  57650. }
  57651. setFreeze(I, g) {
  57652. this.changeData(() => {
  57653. this.freeze = [I, g];
  57654. });
  57655. }
  57656. freezeTotalWidth() {
  57657. return this.cols.sumWidth(0, this.freeze[1]);
  57658. }
  57659. freezeTotalHeight() {
  57660. return this.rows.sumHeight(0, this.freeze[0]);
  57661. }
  57662. setRowHeight(I, g) {
  57663. this.changeData(() => {
  57664. this.rows.setHeight(I, g);
  57665. });
  57666. }
  57667. setColWidth(I, g) {
  57668. this.changeData(() => {
  57669. this.cols.setWidth(I, g);
  57670. });
  57671. }
  57672. viewHeight() {
  57673. const { view: I, showToolbar: g, showBottomBar: C } = this.settings;
  57674. let i = I.height();
  57675. return C && (i -= Zug), g && (i -= mug), i;
  57676. }
  57677. viewWidth() {
  57678. return this.settings.view.width();
  57679. }
  57680. freezeViewRange() {
  57681. const [I, g] = this.freeze;
  57682. return new lt(0, 0, I - 1, g - 1, this.freezeTotalWidth(), this.freezeTotalHeight());
  57683. }
  57684. contentRange() {
  57685. const { rows: I, cols: g } = this, [C, i] = I.maxCell(), e = I.sumHeight(0, C + 1), A = g.sumWidth(0, i + 1);
  57686. return new lt(0, 0, C, i, A, e);
  57687. }
  57688. exceptRowTotalHeight(I, g) {
  57689. const { exceptRowSet: C, rows: i } = this, e = Array.from(C);
  57690. let A = 0;
  57691. return e.forEach((s) => {
  57692. if (s < I || s > g) {
  57693. const l = i.getHeight(s);
  57694. A += l;
  57695. }
  57696. }), A;
  57697. }
  57698. viewRange() {
  57699. const {
  57700. scroll: I,
  57701. rows: g,
  57702. cols: C,
  57703. freeze: i,
  57704. exceptRowSet: e
  57705. } = this;
  57706. let { ri: A, ci: s } = I;
  57707. A <= 0 && ([A] = i), s <= 0 && ([, s] = i);
  57708. let [l, n] = [0, 0], [a, d] = [g.len, C.len];
  57709. for (let o = A; o < g.len && (e.has(o) || (n += g.getHeight(o), a = o), !(n > this.viewHeight())); o += 1)
  57710. ;
  57711. for (let o = s; o < C.len && (l += C.getWidth(o), d = o, !(l > this.viewWidth())); o += 1)
  57712. ;
  57713. return new lt(A, s, a, d, l, n);
  57714. }
  57715. eachMergesInView(I, g) {
  57716. this.merges.filterIntersects(I).forEach((C) => g(C));
  57717. }
  57718. hideRowsOrCols() {
  57719. const { rows: I, cols: g, selector: C } = this, [i, e] = C.size(), {
  57720. sri: A,
  57721. sci: s,
  57722. eri: l,
  57723. eci: n
  57724. } = C.range;
  57725. if (i === I.len)
  57726. for (let a = s; a <= n; a += 1)
  57727. g.setHide(a, !0);
  57728. else if (e === g.len)
  57729. for (let a = A; a <= l; a += 1)
  57730. I.setHide(a, !0);
  57731. }
  57732. // type: row | col
  57733. // index row-index | col-index
  57734. unhideRowsOrCols(I, g) {
  57735. this[`${I}s`].unhide(g);
  57736. }
  57737. rowEach(I, g, C) {
  57738. let i = 0;
  57739. const { rows: e } = this, A = this.exceptRowSet, s = [...A];
  57740. let l = 0;
  57741. for (let n = 0; n < s.length; n += 1)
  57742. s[n] < I && (l += 1);
  57743. for (let n = I + l; n <= g + l; n += 1)
  57744. if (A.has(n))
  57745. l += 1;
  57746. else {
  57747. const a = e.getHeight(n);
  57748. if (a > 0 && (C(n, i, a), i += a, i > this.viewHeight()))
  57749. break;
  57750. }
  57751. }
  57752. colEach(I, g, C) {
  57753. let i = 0;
  57754. const { cols: e } = this;
  57755. for (let A = I; A <= g; A += 1) {
  57756. const s = e.getWidth(A);
  57757. if (s > 0 && (C(A, i, s), i += s, i > this.viewWidth()))
  57758. break;
  57759. }
  57760. }
  57761. defaultStyle() {
  57762. return this.settings.style;
  57763. }
  57764. addStyle(I) {
  57765. const { styles: g } = this;
  57766. for (let C = 0; C < g.length; C += 1) {
  57767. const i = g[C];
  57768. if (_i.equals(i, I)) return C;
  57769. }
  57770. return g.push(I), g.length - 1;
  57771. }
  57772. changeData(I) {
  57773. this.history.add(this.getData()), I(), this.change(this.getData());
  57774. }
  57775. setData(I) {
  57776. return Object.keys(I).forEach((g) => {
  57777. if (g === "merges" || g === "rows" || g === "cols" || g === "validations")
  57778. this[g].setData(I[g]);
  57779. else if (g === "freeze") {
  57780. const [C, i] = Ua(I[g]);
  57781. this.freeze = [i, C];
  57782. } else g === "autofilter" ? this.autoFilter.setData(I[g]) : I[g] !== void 0 && (this[g] = I[g]);
  57783. }), this;
  57784. }
  57785. getData() {
  57786. const {
  57787. name: I,
  57788. freeze: g,
  57789. styles: C,
  57790. merges: i,
  57791. rows: e,
  57792. cols: A,
  57793. validations: s,
  57794. autoFilter: l
  57795. } = this;
  57796. return {
  57797. name: I,
  57798. freeze: El(g[1], g[0]),
  57799. styles: C,
  57800. merges: i.getData(),
  57801. rows: e.getData(),
  57802. cols: A.getData(),
  57803. validations: s.getData(),
  57804. autofilter: l.getData()
  57805. };
  57806. }
  57807. }
  57808. function $i(t, I, g) {
  57809. t.addEventListener(I, g);
  57810. }
  57811. function yV(t, I, g) {
  57812. t.removeEventListener(I, g);
  57813. }
  57814. function X0(t) {
  57815. t.xclickoutside && (yV(window.document.body, "click", t.xclickoutside), delete t.xclickoutside);
  57816. }
  57817. function ZG(t, I) {
  57818. t.xclickoutside = (g) => {
  57819. g.detail === 2 || t.contains(g.target) || (I ? I(t) : (t.hide(), X0(t)));
  57820. }, $i(window.document.body, "click", t.xclickoutside);
  57821. }
  57822. function aig(t, I, g) {
  57823. $i(t, "mousemove", I);
  57824. const C = t;
  57825. C.xEvtUp = (i) => {
  57826. yV(t, "mousemove", I), yV(t, "mouseup", t.xEvtUp), g(i);
  57827. }, $i(t, "mouseup", t.xEvtUp);
  57828. }
  57829. function Fq(t, I, g, C) {
  57830. let i = "";
  57831. Math.abs(t) > Math.abs(I) ? (i = t > 0 ? "right" : "left", C(i, t, g)) : (i = I > 0 ? "down" : "up", C(i, I, g));
  57832. }
  57833. function yug(t, { move: I, end: g }) {
  57834. let C = 0, i = 0;
  57835. $i(t, "touchstart", (e) => {
  57836. const { pageX: A, pageY: s } = e.touches[0];
  57837. C = A, i = s;
  57838. }), $i(t, "touchmove", (e) => {
  57839. if (!I) return;
  57840. const { pageX: A, pageY: s } = e.changedTouches[0], l = A - C, n = s - i;
  57841. (Math.abs(l) > 10 || Math.abs(n) > 10) && (Fq(l, n, e, I), C = A, i = s), e.preventDefault();
  57842. }), $i(t, "touchend", (e) => {
  57843. if (!g) return;
  57844. const { pageX: A, pageY: s } = e.changedTouches[0], l = A - C, n = s - i;
  57845. Fq(l, n, e, g);
  57846. });
  57847. }
  57848. function Yug() {
  57849. const t = /* @__PURE__ */ new Map();
  57850. function I(A, s) {
  57851. const l = () => {
  57852. const a = t.get(A);
  57853. return Array.isArray(a) && a.push(s) || !1;
  57854. }, n = () => t.set(A, [].concat(s));
  57855. return t.has(A) && l() || n();
  57856. }
  57857. function g(A, s) {
  57858. const l = () => {
  57859. const n = t.get(A);
  57860. for (const a of n) a.call(null, ...s);
  57861. };
  57862. return t.has(A) && l();
  57863. }
  57864. function C(A, s) {
  57865. const l = () => {
  57866. const n = t.get(A), a = n.indexOf(s);
  57867. return a >= 0 && n.splice(a, 1) && t.get(A).length === 0 && t.delete(A);
  57868. };
  57869. return t.has(A) && l();
  57870. }
  57871. function i(A, s) {
  57872. const l = (...n) => {
  57873. s.call(null, ...n), C(A, l);
  57874. };
  57875. return I(A, l);
  57876. }
  57877. function e() {
  57878. t.clear();
  57879. }
  57880. return {
  57881. get current() {
  57882. return t;
  57883. },
  57884. on: I,
  57885. once: i,
  57886. fire: g,
  57887. removeListener: C,
  57888. removeAllListeners: e
  57889. };
  57890. }
  57891. const Lg = "x-spreadsheet";
  57892. class kq {
  57893. constructor(I = !1, g) {
  57894. this.moving = !1, this.vertical = I, this.el = yg("div", `${Lg}-resizer ${I ? "vertical" : "horizontal"}`).children(
  57895. this.unhideHoverEl = yg("div", `${Lg}-resizer-hover`).on("dblclick.stop", (C) => this.mousedblclickHandler(C)).css("position", "absolute").hide(),
  57896. this.hoverEl = yg("div", `${Lg}-resizer-hover`).on("mousedown.stop", (C) => this.mousedownHandler(C)),
  57897. this.lineEl = yg("div", `${Lg}-resizer-line`).hide()
  57898. ).hide(), this.cRect = null, this.finishedFn = null, this.minDistance = g, this.unhideFn = () => {
  57899. };
  57900. }
  57901. showUnhide(I) {
  57902. this.unhideIndex = I, this.unhideHoverEl.show();
  57903. }
  57904. hideUnhide() {
  57905. this.unhideHoverEl.hide();
  57906. }
  57907. // rect : {top, left, width, height}
  57908. // line : {width, height}
  57909. show(I, g) {
  57910. const {
  57911. moving: C,
  57912. vertical: i,
  57913. hoverEl: e,
  57914. lineEl: A,
  57915. el: s,
  57916. unhideHoverEl: l
  57917. } = this;
  57918. if (C) return;
  57919. this.cRect = I;
  57920. const {
  57921. left: n,
  57922. top: a,
  57923. width: d,
  57924. height: o
  57925. } = I;
  57926. s.offset({
  57927. left: i ? n + d - 5 : n,
  57928. top: i ? a : a + o - 5
  57929. }).show(), e.offset({
  57930. width: i ? 5 : d,
  57931. height: i ? o : 5
  57932. }), A.offset({
  57933. width: i ? 0 : g.width,
  57934. height: i ? g.height : 0
  57935. }), l.offset({
  57936. left: i ? 5 - d : n,
  57937. top: i ? a : 5 - o,
  57938. width: i ? 5 : d,
  57939. height: i ? o : 5
  57940. });
  57941. }
  57942. hide() {
  57943. this.el.offset({
  57944. left: 0,
  57945. top: 0
  57946. }).hide(), this.hideUnhide();
  57947. }
  57948. mousedblclickHandler() {
  57949. this.unhideIndex && this.unhideFn(this.unhideIndex);
  57950. }
  57951. mousedownHandler(I) {
  57952. let g = I;
  57953. const {
  57954. el: C,
  57955. lineEl: i,
  57956. cRect: e,
  57957. vertical: A,
  57958. minDistance: s
  57959. } = this;
  57960. let l = A ? e.width : e.height;
  57961. i.show(), aig(window, (n) => {
  57962. this.moving = !0, g !== null && n.buttons === 1 && (A ? (l += n.movementX, l > s && C.css("left", `${e.left + l}px`)) : (l += n.movementY, l > s && C.css("top", `${e.top + l}px`)), g = n);
  57963. }, () => {
  57964. g = null, i.hide(), this.moving = !1, this.hide(), this.finishedFn && (l < s && (l = s), this.finishedFn(e, l));
  57965. });
  57966. }
  57967. }
  57968. class zq {
  57969. constructor(I) {
  57970. this.vertical = I, this.moveFn = null, this.el = yg("div", `${Lg}-scrollbar ${I ? "vertical" : "horizontal"}`).child(this.contentEl = yg("div", "")).on("mousemove.stop", () => {
  57971. }).on("scroll.stop", (g) => {
  57972. const { scrollTop: C, scrollLeft: i } = g.target;
  57973. this.moveFn && this.moveFn(this.vertical ? C : i, g);
  57974. });
  57975. }
  57976. move(I) {
  57977. return this.el.scroll(I), this;
  57978. }
  57979. scroll() {
  57980. return this.el.scroll();
  57981. }
  57982. set(I, g) {
  57983. const C = I - 1;
  57984. if (g > C) {
  57985. const i = this.vertical ? "height" : "width";
  57986. this.el.css(i, `${C - 15}px`).show(), this.contentEl.css(this.vertical ? "width" : "height", "1px").css(i, `${g}px`);
  57987. } else
  57988. this.el.hide();
  57989. return this;
  57990. }
  57991. }
  57992. const CN = 2 * 2 - 1;
  57993. let $D = 10;
  57994. class tN {
  57995. constructor(I = !1) {
  57996. this.useHideInput = I, this.inputChange = () => {
  57997. }, this.cornerEl = yg("div", `${Lg}-selector-corner`), this.areaEl = yg("div", `${Lg}-selector-area`).child(this.cornerEl).hide(), this.clipboardEl = yg("div", `${Lg}-selector-clipboard`).hide(), this.autofillEl = yg("div", `${Lg}-selector-autofill`).hide(), this.el = yg("div", `${Lg}-selector`).css("z-index", `${$D}`).children(this.areaEl, this.clipboardEl, this.autofillEl).hide(), I && (this.hideInput = yg("input", "").on("compositionend", (g) => {
  57998. this.inputChange(g.target.value);
  57999. }), this.el.child(this.hideInputDiv = yg("div", "hide-input").child(this.hideInput)), this.el.child(this.hideInputDiv = yg("div", "hide-input").child(this.hideInput))), $D += 1;
  58000. }
  58001. setOffset(I) {
  58002. return this.el.offset(I).show(), this;
  58003. }
  58004. hide() {
  58005. return this.el.hide(), this;
  58006. }
  58007. setAreaOffset(I) {
  58008. const {
  58009. left: g,
  58010. top: C,
  58011. width: i,
  58012. height: e
  58013. } = I, A = {
  58014. width: i - CN + 0.8,
  58015. height: e - CN + 0.8,
  58016. left: g - 0.8,
  58017. top: C - 0.8
  58018. };
  58019. this.areaEl.offset(A).show(), this.useHideInput && (this.hideInputDiv.offset(A), this.hideInput.val("").focus());
  58020. }
  58021. setClipboardOffset(I) {
  58022. const {
  58023. left: g,
  58024. top: C,
  58025. width: i,
  58026. height: e
  58027. } = I;
  58028. this.clipboardEl.offset({
  58029. left: g,
  58030. top: C,
  58031. width: i - 5,
  58032. height: e - 5
  58033. });
  58034. }
  58035. showAutofill(I) {
  58036. const {
  58037. left: g,
  58038. top: C,
  58039. width: i,
  58040. height: e
  58041. } = I;
  58042. this.autofillEl.offset({
  58043. width: i - CN,
  58044. height: e - CN,
  58045. left: g,
  58046. top: C
  58047. }).show();
  58048. }
  58049. hideAutofill() {
  58050. this.autofillEl.hide();
  58051. }
  58052. showClipboard() {
  58053. this.clipboardEl.show();
  58054. }
  58055. hideClipboard() {
  58056. this.clipboardEl.hide();
  58057. }
  58058. }
  58059. function O9(t) {
  58060. const { data: I } = this, {
  58061. left: g,
  58062. top: C,
  58063. width: i,
  58064. height: e,
  58065. scroll: A,
  58066. l: s,
  58067. t: l
  58068. } = t, n = I.freezeTotalWidth(), a = I.freezeTotalHeight();
  58069. let d = g - n;
  58070. n > s && (d -= A.x);
  58071. let o = C - a;
  58072. return a > l && (o -= A.y), {
  58073. left: d,
  58074. top: o,
  58075. width: i,
  58076. height: e
  58077. };
  58078. }
  58079. function U9(t) {
  58080. const { data: I } = this, {
  58081. left: g,
  58082. width: C,
  58083. height: i,
  58084. l: e,
  58085. t: A,
  58086. scroll: s
  58087. } = t, l = I.freezeTotalWidth();
  58088. let n = g - l;
  58089. return l > e && (n -= s.x), {
  58090. left: n,
  58091. top: A,
  58092. width: C,
  58093. height: i
  58094. };
  58095. }
  58096. function E9(t) {
  58097. const { data: I } = this, {
  58098. top: g,
  58099. width: C,
  58100. height: i,
  58101. l: e,
  58102. t: A,
  58103. scroll: s
  58104. } = t, l = I.freezeTotalHeight();
  58105. let n = g - l;
  58106. return l > A && (n -= s.y), {
  58107. left: e,
  58108. top: n,
  58109. width: C,
  58110. height: i
  58111. };
  58112. }
  58113. function g9(t) {
  58114. const { br: I } = this;
  58115. I.setAreaOffset(O9.call(this, t));
  58116. }
  58117. function Nug(t) {
  58118. const { tl: I } = this;
  58119. I.setAreaOffset(t);
  58120. }
  58121. function oig(t) {
  58122. const { t: I } = this;
  58123. I.setAreaOffset(U9.call(this, t));
  58124. }
  58125. function cig(t) {
  58126. const { l: I } = this;
  58127. I.setAreaOffset(E9.call(this, t));
  58128. }
  58129. function dig(t) {
  58130. const { l: I } = this;
  58131. I.setClipboardOffset(E9.call(this, t));
  58132. }
  58133. function I9(t) {
  58134. const { br: I } = this;
  58135. I.setClipboardOffset(O9.call(this, t));
  58136. }
  58137. function Vug(t) {
  58138. const { tl: I } = this;
  58139. I.setClipboardOffset(t);
  58140. }
  58141. function rig(t) {
  58142. const { t: I } = this;
  58143. I.setClipboardOffset(U9.call(this, t));
  58144. }
  58145. function Jq(t) {
  58146. g9.call(this, t), Nug.call(this, t), oig.call(this, t), cig.call(this, t);
  58147. }
  58148. function Lq(t) {
  58149. I9.call(this, t), Vug.call(this, t), rig.call(this, t), dig.call(this, t);
  58150. }
  58151. class Mug {
  58152. constructor(I) {
  58153. this.inputChange = () => {
  58154. }, this.data = I, this.br = new tN(!0), this.t = new tN(), this.l = new tN(), this.tl = new tN(), this.br.inputChange = (g) => {
  58155. this.inputChange(g);
  58156. }, this.br.el.show(), this.offset = null, this.areaOffset = null, this.indexes = null, this.range = null, this.arange = null, this.el = yg("div", `${Lg}-selectors`).children(
  58157. this.tl.el,
  58158. this.t.el,
  58159. this.l.el,
  58160. this.br.el
  58161. ).hide(), this.lastri = -1, this.lastci = -1, $D += 1;
  58162. }
  58163. resetData(I) {
  58164. this.data = I, this.range = I.selector.range, this.resetAreaOffset();
  58165. }
  58166. hide() {
  58167. this.el.hide();
  58168. }
  58169. resetOffset() {
  58170. const {
  58171. data: I,
  58172. tl: g,
  58173. t: C,
  58174. l: i,
  58175. br: e
  58176. } = this, A = I.freezeTotalHeight(), s = I.freezeTotalWidth();
  58177. A > 0 || s > 0 ? (g.setOffset({ width: s, height: A }), C.setOffset({ left: s, height: A }), i.setOffset({ top: A, width: s }), e.setOffset({ left: s, top: A })) : (g.hide(), C.hide(), i.hide(), e.setOffset({ left: 0, top: 0 }));
  58178. }
  58179. resetAreaOffset() {
  58180. const I = this.data.getSelectedRect(), g = this.data.getClipboardRect();
  58181. Jq.call(this, I), Lq.call(this, g), this.resetOffset();
  58182. }
  58183. resetBRTAreaOffset() {
  58184. const I = this.data.getSelectedRect(), g = this.data.getClipboardRect();
  58185. g9.call(this, I), oig.call(this, I), I9.call(this, g), rig.call(this, g), this.resetOffset();
  58186. }
  58187. resetBRLAreaOffset() {
  58188. const I = this.data.getSelectedRect(), g = this.data.getClipboardRect();
  58189. g9.call(this, I), cig.call(this, I), I9.call(this, g), dig.call(this, g), this.resetOffset();
  58190. }
  58191. set(I, g, C = !0) {
  58192. const { data: i } = this, e = i.calSelectedRangeByStart(I, g), { sri: A, sci: s } = e;
  58193. if (C) {
  58194. let [l, n] = [I, g];
  58195. I < 0 && (l = 0), g < 0 && (n = 0), i.selector.setIndexes(l, n), this.indexes = [l, n];
  58196. }
  58197. this.moveIndexes = [A, s], this.range = e, this.resetAreaOffset(), this.el.show();
  58198. }
  58199. setEnd(I, g, C = !0) {
  58200. const { data: i, lastri: e, lastci: A } = this;
  58201. if (C) {
  58202. if (I === e && g === A) return;
  58203. this.lastri = I, this.lastci = g;
  58204. }
  58205. this.range = i.calSelectedRangeByEnd(I, g), Jq.call(this, this.data.getSelectedRect());
  58206. }
  58207. reset() {
  58208. const { eri: I, eci: g } = this.data.selector.range;
  58209. this.setEnd(I, g);
  58210. }
  58211. showAutofill(I, g) {
  58212. if (I === -1 && g === -1) return;
  58213. const {
  58214. sri: C,
  58215. sci: i,
  58216. eri: e,
  58217. eci: A
  58218. } = this.range, [s, l] = [I, g], n = C - I, a = i - g, d = e - I, o = A - g;
  58219. if (a > 0)
  58220. this.arange = new lt(C, l, e, i - 1);
  58221. else if (n > 0)
  58222. this.arange = new lt(s, i, C - 1, A);
  58223. else if (o < 0)
  58224. this.arange = new lt(C, A + 1, e, l);
  58225. else if (d < 0)
  58226. this.arange = new lt(e + 1, i, s, A);
  58227. else {
  58228. this.arange = null;
  58229. return;
  58230. }
  58231. if (this.arange !== null) {
  58232. const c = this.data.getRect(this.arange);
  58233. c.width += 2, c.height += 2;
  58234. const {
  58235. br: r,
  58236. l: h,
  58237. t: b,
  58238. tl: u
  58239. } = this;
  58240. r.showAutofill(O9.call(this, c)), h.showAutofill(E9.call(this, c)), b.showAutofill(U9.call(this, c)), u.showAutofill(c);
  58241. }
  58242. }
  58243. hideAutofill() {
  58244. ["br", "l", "t", "tl"].forEach((I) => {
  58245. this[I].hideAutofill();
  58246. });
  58247. }
  58248. showClipboard() {
  58249. const I = this.data.getClipboardRect();
  58250. Lq.call(this, I), ["br", "l", "t", "tl"].forEach((g) => {
  58251. this[g].showClipboard();
  58252. });
  58253. }
  58254. hideClipboard() {
  58255. ["br", "l", "t", "tl"].forEach((I) => {
  58256. this[I].hideClipboard();
  58257. });
  58258. }
  58259. }
  58260. function Rug(t) {
  58261. t.preventDefault(), t.stopPropagation();
  58262. const { filterItems: I } = this;
  58263. I.length <= 0 || (this.itemIndex >= 0 && I[this.itemIndex].toggle(), this.itemIndex -= 1, this.itemIndex < 0 && (this.itemIndex = I.length - 1), I[this.itemIndex].toggle());
  58264. }
  58265. function fug(t) {
  58266. t.stopPropagation();
  58267. const { filterItems: I } = this;
  58268. I.length <= 0 || (this.itemIndex >= 0 && I[this.itemIndex].toggle(), this.itemIndex += 1, this.itemIndex > I.length - 1 && (this.itemIndex = 0), I[this.itemIndex].toggle());
  58269. }
  58270. function vq(t) {
  58271. t.preventDefault();
  58272. const { filterItems: I } = this;
  58273. I.length <= 0 || (t.stopPropagation(), this.itemIndex < 0 && (this.itemIndex = 0), I[this.itemIndex].el.click(), this.hide());
  58274. }
  58275. function Hug(t) {
  58276. const { keyCode: I } = t;
  58277. switch (t.ctrlKey && t.stopPropagation(), I) {
  58278. case 37:
  58279. t.stopPropagation();
  58280. break;
  58281. case 38:
  58282. Rug.call(this, t);
  58283. break;
  58284. case 39:
  58285. t.stopPropagation();
  58286. break;
  58287. case 40:
  58288. fug.call(this, t);
  58289. break;
  58290. case 13:
  58291. vq.call(this, t);
  58292. break;
  58293. case 9:
  58294. vq.call(this, t);
  58295. break;
  58296. default:
  58297. t.stopPropagation();
  58298. break;
  58299. }
  58300. }
  58301. class hig {
  58302. constructor(I, g, C = "200px") {
  58303. this.filterItems = [], this.items = I, this.el = yg("div", `${Lg}-suggest`).css("width", C).hide(), this.itemClick = g, this.itemIndex = -1;
  58304. }
  58305. setOffset(I) {
  58306. this.el.cssRemoveKeys("top", "bottom").offset(I);
  58307. }
  58308. hide() {
  58309. const { el: I } = this;
  58310. this.filterItems = [], this.itemIndex = -1, I.hide(), X0(this.el.parent());
  58311. }
  58312. setItems(I) {
  58313. this.items = I;
  58314. }
  58315. search(I) {
  58316. let { items: g } = this;
  58317. if (/^\s*$/.test(I) || (g = g.filter((i) => (i.key || i).startsWith(I.toUpperCase()))), g = g.map((i) => {
  58318. let { title: e } = i;
  58319. e ? typeof e == "function" && (e = e()) : e = i;
  58320. const A = yg("div", `${Lg}-item`).child(e).on("click.stop", () => {
  58321. this.itemClick(i), this.hide();
  58322. });
  58323. return i.label && A.child(yg("div", "label").html(i.label)), A;
  58324. }), this.filterItems = g, g.length <= 0)
  58325. return;
  58326. const { el: C } = this;
  58327. C.html("").children(...g).show(), ZG(C.parent(), () => {
  58328. this.hide();
  58329. });
  58330. }
  58331. bindInputEvents(I) {
  58332. I.on("keydown", (g) => Hug.call(this, g));
  58333. }
  58334. }
  58335. class pi extends hd {
  58336. constructor(I) {
  58337. super("div", `${Lg}-icon`), this.iconNameEl = yg("div", `${Lg}-icon-img ${I}`), this.child(this.iconNameEl);
  58338. }
  58339. setName(I) {
  58340. this.iconNameEl.className(`${Lg}-icon-img ${I}`);
  58341. }
  58342. }
  58343. function Tq(t, I) {
  58344. t.setMonth(t.getMonth() + I);
  58345. }
  58346. function Xug(t, I) {
  58347. const g = new Date(t);
  58348. return g.setDate(I - t.getDay() + 1), g;
  58349. }
  58350. function Sug(t, I, g) {
  58351. const C = new Date(t, I, 1, 23, 59, 59), i = [[], [], [], [], [], []];
  58352. for (let e = 0; e < 6; e += 1)
  58353. for (let A = 0; A < 7; A += 1) {
  58354. const s = e * 7 + A, l = Xug(C, s), n = l.getMonth() !== I, a = l.getMonth() === g.getMonth() && l.getDate() === g.getDate();
  58355. i[e][A] = { d: l, disabled: n, active: a };
  58356. }
  58357. return i;
  58358. }
  58359. class Dug {
  58360. constructor(I) {
  58361. this.value = I, this.cvalue = new Date(I), this.headerLeftEl = yg("div", "calendar-header-left"), this.bodyEl = yg("tbody", ""), this.buildAll(), this.el = yg("div", "x-spreadsheet-calendar").children(
  58362. yg("div", "calendar-header").children(
  58363. this.headerLeftEl,
  58364. yg("div", "calendar-header-right").children(
  58365. yg("a", "calendar-prev").on("click.stop", () => this.prev()).child(new pi("chevron-left")),
  58366. yg("a", "calendar-next").on("click.stop", () => this.next()).child(new pi("chevron-right"))
  58367. )
  58368. ),
  58369. yg("table", "calendar-body").children(
  58370. yg("thead", "").child(
  58371. yg("tr", "").children(
  58372. ...bt("calendar.weeks").map((g) => yg("th", "cell").child(g))
  58373. )
  58374. ),
  58375. this.bodyEl
  58376. )
  58377. ), this.selectChange = () => {
  58378. };
  58379. }
  58380. setValue(I) {
  58381. this.value = I, this.cvalue = new Date(I), this.buildAll();
  58382. }
  58383. prev() {
  58384. const { value: I } = this;
  58385. Tq(I, -1), this.buildAll();
  58386. }
  58387. next() {
  58388. const { value: I } = this;
  58389. Tq(I, 1), this.buildAll();
  58390. }
  58391. buildAll() {
  58392. this.buildHeaderLeft(), this.buildBody();
  58393. }
  58394. buildHeaderLeft() {
  58395. const { value: I } = this;
  58396. this.headerLeftEl.html(`${bt("calendar.months")[I.getMonth()]} ${I.getFullYear()}`);
  58397. }
  58398. buildBody() {
  58399. const { value: I, cvalue: g, bodyEl: C } = this, e = Sug(I.getFullYear(), I.getMonth(), g).map((A) => {
  58400. const s = A.map((l) => {
  58401. let n = "cell";
  58402. return l.disabled && (n += " disabled"), l.active && (n += " active"), yg("td", "").child(
  58403. yg("div", n).on("click.stop", () => {
  58404. this.selectChange(l.d);
  58405. }).child(l.d.getDate().toString())
  58406. );
  58407. });
  58408. return yg("tr", "").children(...s);
  58409. });
  58410. C.html("").children(...e);
  58411. }
  58412. }
  58413. class Kug {
  58414. constructor() {
  58415. this.calendar = new Dug(/* @__PURE__ */ new Date()), this.el = yg("div", `${Lg}-datepicker`).child(
  58416. this.calendar.el
  58417. ).hide();
  58418. }
  58419. setValue(I) {
  58420. const { calendar: g } = this;
  58421. return typeof I == "string" ? /^\d{4}-\d{1,2}-\d{1,2}$/.test(I) && g.setValue(new Date(I.replace(new RegExp("-", "g"), "/"))) : I instanceof Date && g.setValue(I), this;
  58422. }
  58423. change(I) {
  58424. this.calendar.selectChange = (g) => {
  58425. I(g), this.hide();
  58426. };
  58427. }
  58428. show() {
  58429. this.el.show();
  58430. }
  58431. hide() {
  58432. this.el.hide();
  58433. }
  58434. }
  58435. function YV() {
  58436. const { inputText: t } = this;
  58437. if (!/^\s*$/.test(t)) {
  58438. const {
  58439. textlineEl: I,
  58440. textEl: g,
  58441. areaOffset: C
  58442. } = this, i = t.split(`
  58443. `), e = Math.max(...i.map((d) => d.length)), s = I.offset().width / t.length, l = (e + 1) * s + 5, n = this.viewFn().width - C.left - s;
  58444. let a = i.length;
  58445. if (l > C.width) {
  58446. let d = l;
  58447. l > n && (d = n, a += parseInt(l / n, 10), a += l % n > 0 ? 1 : 0), g.css("width", `${d}px`);
  58448. }
  58449. a *= this.rowHeight, a > C.height && g.css("height", `${a}px`);
  58450. }
  58451. }
  58452. function Fug({ target: t }, I) {
  58453. const { value: g, selectionEnd: C } = t, i = `${g.slice(0, C)}${I}${g.slice(C)}`;
  58454. t.value = i, t.setSelectionRange(C + 1, C + 1), this.inputText = i, this.textlineEl.html(i), YV.call(this);
  58455. }
  58456. function kug(t) {
  58457. const { keyCode: I, altKey: g } = t;
  58458. I !== 13 && I !== 9 && t.stopPropagation(), I === 13 && g && (Fug.call(this, t, `
  58459. `), t.stopPropagation()), I === 13 && !g && t.preventDefault();
  58460. }
  58461. function zug(t) {
  58462. const I = t.target.value, { suggest: g, textlineEl: C, validator: i } = this, { cell: e } = this;
  58463. if (e !== null)
  58464. if ("editable" in e && e.editable === !0 || e.editable === void 0) {
  58465. if (this.inputText = I, i)
  58466. i.type === "list" ? g.search(I) : g.hide();
  58467. else {
  58468. const A = I.lastIndexOf("=");
  58469. A !== -1 ? g.search(I.substring(A + 1)) : g.hide();
  58470. }
  58471. C.html(I), YV.call(this), this.change("input", I);
  58472. } else
  58473. t.target.value = e.text;
  58474. else {
  58475. if (this.inputText = I, i)
  58476. i.type === "list" ? g.search(I) : g.hide();
  58477. else {
  58478. const A = I.lastIndexOf("=");
  58479. A !== -1 ? g.search(I.substring(A + 1)) : g.hide();
  58480. }
  58481. C.html(I), YV.call(this), this.change("input", I);
  58482. }
  58483. }
  58484. function Jug(t) {
  58485. const { el: I } = this.textEl;
  58486. setTimeout(() => {
  58487. I.focus(), I.setSelectionRange(t, t);
  58488. }, 0);
  58489. }
  58490. function big(t, I) {
  58491. const { textEl: g, textlineEl: C } = this;
  58492. g.el.blur(), g.val(t), C.html(t), Jug.call(this, I);
  58493. }
  58494. function Lug(t) {
  58495. const { inputText: I, validator: g } = this;
  58496. let C = 0;
  58497. if (g && g.type === "list")
  58498. this.inputText = t, C = this.inputText.length;
  58499. else {
  58500. const i = I.lastIndexOf("="), e = I.substring(0, i + 1);
  58501. let A = I.substring(i + 1);
  58502. A.indexOf(")") !== -1 ? A = A.substring(A.indexOf(")")) : A = "", this.inputText = `${e + t.key}(`, C = this.inputText.length, this.inputText += `)${A}`;
  58503. }
  58504. big.call(this, this.inputText, C);
  58505. }
  58506. function vug() {
  58507. this.suggest.setItems(this.formulas);
  58508. }
  58509. function Tug(t) {
  58510. let I = t.getMonth() + 1, g = t.getDate();
  58511. return I < 10 && (I = `0${I}`), g < 10 && (g = `0${g}`), `${t.getFullYear()}-${I}-${g}`;
  58512. }
  58513. class xug {
  58514. constructor(I, g, C) {
  58515. this.viewFn = g, this.rowHeight = C, this.formulas = I, this.suggest = new hig(I, (i) => {
  58516. Lug.call(this, i);
  58517. }), this.datepicker = new Kug(), this.datepicker.change((i) => {
  58518. this.setText(Tug(i)), this.clear();
  58519. }), this.areaEl = yg("div", `${Lg}-editor-area`).children(
  58520. this.textEl = yg("textarea", "").on("input", (i) => zug.call(this, i)).on("paste.stop", () => {
  58521. }).on("keydown", (i) => kug.call(this, i)),
  58522. this.textlineEl = yg("div", "textline"),
  58523. this.suggest.el,
  58524. this.datepicker.el
  58525. ).on("mousemove.stop", () => {
  58526. }).on("mousedown.stop", () => {
  58527. }), this.el = yg("div", `${Lg}-editor`).child(this.areaEl).hide(), this.suggest.bindInputEvents(this.textEl), this.areaOffset = null, this.freeze = { w: 0, h: 0 }, this.cell = null, this.inputText = "", this.change = () => {
  58528. };
  58529. }
  58530. setFreezeLengths(I, g) {
  58531. this.freeze.w = I, this.freeze.h = g;
  58532. }
  58533. clear() {
  58534. this.inputText !== "" && this.change("finished", this.inputText), this.cell = null, this.areaOffset = null, this.inputText = "", this.el.hide(), this.textEl.val(""), this.textlineEl.html(""), vug.call(this), this.datepicker.hide();
  58535. }
  58536. setOffset(I, g = "top") {
  58537. const {
  58538. textEl: C,
  58539. areaEl: i,
  58540. suggest: e,
  58541. freeze: A,
  58542. el: s
  58543. } = this;
  58544. if (I) {
  58545. this.areaOffset = I;
  58546. const {
  58547. left: l,
  58548. top: n,
  58549. width: a,
  58550. height: d,
  58551. l: o,
  58552. t: c
  58553. } = I, r = { left: 0, top: 0 };
  58554. A.w > o && A.h > c || (A.w < o && A.h < c ? (r.left = A.w, r.top = A.h) : A.w > o ? r.top = A.h : A.h > c && (r.left = A.w)), s.offset(r), i.offset({ left: l - r.left - 0.8, top: n - r.top - 0.8 }), C.offset({ width: a - 9 + 0.8, height: d - 3 + 0.8 });
  58555. const h = { left: 0 };
  58556. h[g] = d, e.setOffset(h), e.hide();
  58557. }
  58558. }
  58559. setCell(I, g) {
  58560. const { el: C, datepicker: i, suggest: e } = this;
  58561. C.show(), this.cell = I;
  58562. const A = I && I.text || "";
  58563. if (this.setText(A), this.validator = g, g) {
  58564. const { type: s } = g;
  58565. s === "date" && (i.show(), /^\s*$/.test(A) || i.setValue(A)), s === "list" && (e.setItems(g.values()), e.search(""));
  58566. }
  58567. }
  58568. setText(I) {
  58569. this.inputText = I, big.call(this, I, I.length), YV.call(this);
  58570. }
  58571. }
  58572. class ad extends hd {
  58573. // type: primary
  58574. constructor(I, g = "") {
  58575. super("div", `${Lg}-button ${g}`), this.child(bt(`button.${I}`));
  58576. }
  58577. }
  58578. function NV() {
  58579. return window.devicePixelRatio || 1;
  58580. }
  58581. function P9() {
  58582. return NV() - 0.5;
  58583. }
  58584. function FI(t) {
  58585. return parseInt(t * NV(), 10);
  58586. }
  58587. function Tr(t) {
  58588. const I = FI(t);
  58589. return I > 0 ? I - 0.5 : 0.5;
  58590. }
  58591. class jug {
  58592. constructor(I, g, C, i, e = 0) {
  58593. this.x = I, this.y = g, this.width = C, this.height = i, this.padding = e, this.bgcolor = "#ffffff", this.borderTop = null, this.borderRight = null, this.borderBottom = null, this.borderLeft = null;
  58594. }
  58595. setBorders({
  58596. top: I,
  58597. bottom: g,
  58598. left: C,
  58599. right: i
  58600. }) {
  58601. I && (this.borderTop = I), i && (this.borderRight = i), g && (this.borderBottom = g), C && (this.borderLeft = C);
  58602. }
  58603. innerWidth() {
  58604. return this.width - this.padding * 2 - 2;
  58605. }
  58606. innerHeight() {
  58607. return this.height - this.padding * 2 - 2;
  58608. }
  58609. textx(I) {
  58610. const { width: g, padding: C } = this;
  58611. let { x: i } = this;
  58612. return I === "left" ? i += C : I === "center" ? i += g / 2 : I === "right" && (i += g - C), i;
  58613. }
  58614. texty(I, g) {
  58615. const { height: C, padding: i } = this;
  58616. let { y: e } = this;
  58617. return I === "top" ? e += i : I === "middle" ? e += C / 2 - g / 2 : I === "bottom" && (e += C - i - g), e;
  58618. }
  58619. topxys() {
  58620. const { x: I, y: g, width: C } = this;
  58621. return [[I, g], [I + C, g]];
  58622. }
  58623. rightxys() {
  58624. const {
  58625. x: I,
  58626. y: g,
  58627. width: C,
  58628. height: i
  58629. } = this;
  58630. return [[I + C, g], [I + C, g + i]];
  58631. }
  58632. bottomxys() {
  58633. const {
  58634. x: I,
  58635. y: g,
  58636. width: C,
  58637. height: i
  58638. } = this;
  58639. return [[I, g + i], [I + C, g + i]];
  58640. }
  58641. leftxys() {
  58642. const {
  58643. x: I,
  58644. y: g,
  58645. height: C
  58646. } = this;
  58647. return [[I, g], [I, g + C]];
  58648. }
  58649. }
  58650. function xq(t, I, g, C, i, e, A) {
  58651. const s = { x: 0, y: 0 };
  58652. t === "underline" ? i === "bottom" ? s.y = 0 : i === "top" ? s.y = -(e + 2) : s.y = -e / 2 : t === "strike" && (i === "bottom" ? s.y = e / 2 : i === "top" && (s.y = -(e / 2 + 2))), C === "center" ? s.x = A / 2 : C === "right" && (s.x = A), this.line(
  58653. [I - s.x, g - s.y],
  58654. [I - s.x + A, g - s.y]
  58655. );
  58656. }
  58657. class uig {
  58658. constructor(I, g, C) {
  58659. this.el = I, this.ctx = I.getContext("2d"), this.resize(g, C), this.ctx.scale(NV(), NV());
  58660. }
  58661. resize(I, g) {
  58662. this.el.style.width = `${I}px`, this.el.style.height = `${g}px`, this.el.width = FI(I), this.el.height = FI(g);
  58663. }
  58664. clear() {
  58665. const { width: I, height: g } = this.el;
  58666. return this.ctx.clearRect(0, 0, I, g), this;
  58667. }
  58668. attr(I) {
  58669. return Object.assign(this.ctx, I), this;
  58670. }
  58671. save() {
  58672. return this.ctx.save(), this.ctx.beginPath(), this;
  58673. }
  58674. restore() {
  58675. return this.ctx.restore(), this;
  58676. }
  58677. beginPath() {
  58678. return this.ctx.beginPath(), this;
  58679. }
  58680. translate(I, g) {
  58681. return this.ctx.translate(FI(I), FI(g)), this;
  58682. }
  58683. scale(I, g) {
  58684. return this.ctx.scale(I, g), this;
  58685. }
  58686. clearRect(I, g, C, i) {
  58687. return this.ctx.clearRect(I, g, C, i), this;
  58688. }
  58689. fillRect(I, g, C, i) {
  58690. return this.ctx.fillRect(FI(I) - 0.5, FI(g) - 0.5, FI(C), FI(i)), this;
  58691. }
  58692. fillText(I, g, C) {
  58693. return this.ctx.fillText(I, FI(g), FI(C)), this;
  58694. }
  58695. /*
  58696. txt: render text
  58697. box: DrawBox
  58698. attr: {
  58699. align: left | center | right
  58700. valign: top | middle | bottom
  58701. color: '#333333',
  58702. strike: false,
  58703. font: {
  58704. name: 'Arial',
  58705. size: 14,
  58706. bold: false,
  58707. italic: false,
  58708. }
  58709. }
  58710. textWrap: text wrapping
  58711. */
  58712. text(I, g, C = {}, i = !0) {
  58713. const { ctx: e } = this, {
  58714. align: A,
  58715. valign: s,
  58716. font: l,
  58717. color: n,
  58718. strike: a,
  58719. underline: d
  58720. } = C, o = g.textx(A);
  58721. e.save(), e.beginPath(), this.attr({
  58722. textAlign: A,
  58723. textBaseline: s,
  58724. font: `${l.italic ? "italic" : ""} ${l.bold ? "bold" : ""} ${FI(l.size)}px ${l.name}`,
  58725. fillStyle: n,
  58726. strokeStyle: n
  58727. });
  58728. const c = `${I}`.split(`
  58729. `), r = g.innerWidth(), h = [];
  58730. c.forEach((m) => {
  58731. const Z = e.measureText(m).width;
  58732. if (i && Z > FI(r)) {
  58733. let p = { w: 0, len: 0, start: 0 };
  58734. for (let Y = 0; Y < m.length; Y += 1)
  58735. p.w >= FI(r) && (h.push(m.substr(p.start, p.len)), p = { w: 0, len: 0, start: Y }), p.len += 1, p.w += e.measureText(m[Y]).width + 1;
  58736. p.len > 0 && h.push(m.substr(p.start, p.len));
  58737. } else
  58738. h.push(m);
  58739. });
  58740. const b = (h.length - 1) * (l.size + 2);
  58741. let u = g.texty(s, b);
  58742. return h.forEach((m) => {
  58743. const Z = e.measureText(m).width;
  58744. this.fillText(m, o, u), a && xq.call(this, "strike", o, u, A, s, l.size, Z), d && xq.call(this, "underline", o, u, A, s, l.size, Z), u += l.size + 2;
  58745. }), e.restore(), this;
  58746. }
  58747. border(I, g) {
  58748. const { ctx: C } = this;
  58749. return C.lineWidth = P9, C.strokeStyle = g, I === "medium" ? C.lineWidth = FI(2) - 0.5 : I === "thick" ? C.lineWidth = FI(3) : I === "dashed" ? C.setLineDash([FI(3), FI(2)]) : I === "dotted" ? C.setLineDash([FI(1), FI(1)]) : I === "double" && C.setLineDash([FI(2), 0]), this;
  58750. }
  58751. line(...I) {
  58752. const { ctx: g } = this;
  58753. if (I.length > 1) {
  58754. g.beginPath();
  58755. const [C, i] = I[0];
  58756. g.moveTo(Tr(C), Tr(i));
  58757. for (let e = 1; e < I.length; e += 1) {
  58758. const [A, s] = I[e];
  58759. g.lineTo(Tr(A), Tr(s));
  58760. }
  58761. g.stroke();
  58762. }
  58763. return this;
  58764. }
  58765. strokeBorders(I) {
  58766. const { ctx: g } = this;
  58767. g.save();
  58768. const {
  58769. borderTop: C,
  58770. borderRight: i,
  58771. borderBottom: e,
  58772. borderLeft: A
  58773. } = I;
  58774. C && (this.border(...C), this.line(...I.topxys())), i && (this.border(...i), this.line(...I.rightxys())), e && (this.border(...e), this.line(...I.bottomxys())), A && (this.border(...A), this.line(...I.leftxys())), g.restore();
  58775. }
  58776. dropdown(I) {
  58777. const { ctx: g } = this, {
  58778. x: C,
  58779. y: i,
  58780. width: e,
  58781. height: A
  58782. } = I, s = C + e - 15, l = i + A - 15;
  58783. g.save(), g.beginPath(), g.moveTo(FI(s), FI(l)), g.lineTo(FI(s + 8), FI(l)), g.lineTo(FI(s + 4), FI(l + 6)), g.closePath(), g.fillStyle = "rgba(0, 0, 0, .45)", g.fill(), g.restore();
  58784. }
  58785. error(I) {
  58786. const { ctx: g } = this, { x: C, y: i, width: e } = I, A = C + e - 1;
  58787. g.save(), g.beginPath(), g.moveTo(FI(A - 8), FI(i - 1)), g.lineTo(FI(A), FI(i - 1)), g.lineTo(FI(A), FI(i + 8)), g.closePath(), g.fillStyle = "rgba(255, 0, 0, .65)", g.fill(), g.restore();
  58788. }
  58789. frozen(I) {
  58790. const { ctx: g } = this, { x: C, y: i, width: e } = I, A = C + e - 1;
  58791. g.save(), g.beginPath(), g.moveTo(FI(A - 8), FI(i - 1)), g.lineTo(FI(A), FI(i - 1)), g.lineTo(FI(A), FI(i + 8)), g.closePath(), g.fillStyle = "rgba(0, 255, 0, .85)", g.fill(), g.restore();
  58792. }
  58793. rect(I, g) {
  58794. const { ctx: C } = this, {
  58795. x: i,
  58796. y: e,
  58797. width: A,
  58798. height: s,
  58799. bgcolor: l
  58800. } = I;
  58801. C.save(), C.beginPath(), C.fillStyle = l || "#fff", C.rect(Tr(i + 1), Tr(e + 1), FI(A - 2), FI(s - 2)), C.clip(), C.fill(), g(), C.restore();
  58802. }
  58803. }
  58804. const jq = [
  58805. { key: "Arial", title: "Arial" },
  58806. { key: "Helvetica", title: "Helvetica" },
  58807. { key: "Source Sans Pro", title: "Source Sans Pro" },
  58808. { key: "Comic Sans MS", title: "Comic Sans MS" },
  58809. { key: "Courier New", title: "Courier New" },
  58810. { key: "Verdana", title: "Verdana" },
  58811. { key: "Lato", title: "Lato" }
  58812. ], C9 = [
  58813. { pt: 7.5, px: 10 },
  58814. { pt: 8, px: 11 },
  58815. { pt: 9, px: 12 },
  58816. { pt: 10, px: 13 },
  58817. { pt: 10.5, px: 14 },
  58818. { pt: 11, px: 15 },
  58819. { pt: 12, px: 16 },
  58820. { pt: 14, px: 18.7 },
  58821. { pt: 15, px: 20 },
  58822. { pt: 16, px: 21.3 },
  58823. { pt: 18, px: 24 },
  58824. { pt: 22, px: 29.3 },
  58825. { pt: 24, px: 32 },
  58826. { pt: 26, px: 34.7 },
  58827. { pt: 36, px: 48 },
  58828. { pt: 42, px: 56 }
  58829. // { pt: 54, px: 71.7 },
  58830. // { pt: 63, px: 83.7 },
  58831. // { pt: 72, px: 95.6 },
  58832. ];
  58833. function Qug(t) {
  58834. for (let I = 0; I < C9.length; I += 1) {
  58835. const g = C9[I];
  58836. if (g.pt === t)
  58837. return g.px;
  58838. }
  58839. return t;
  58840. }
  58841. const Oug = (t) => {
  58842. const I = [], g = [];
  58843. let C = [], i = 0, e = "", A = 1, s = "";
  58844. for (let l = 0; l < t.length; l += 1) {
  58845. const n = t.charAt(l);
  58846. if (n !== " ") {
  58847. if (n >= "a" && n <= "z")
  58848. C.push(n.toUpperCase());
  58849. else if (n >= "0" && n <= "9" || n >= "A" && n <= "Z" || n === ".")
  58850. C.push(n);
  58851. else if (n === '"') {
  58852. for (l += 1; t.charAt(l) !== '"'; )
  58853. C.push(t.charAt(l)), l += 1;
  58854. g.push(`"${C.join("")}`), C = [];
  58855. } else if (n === "-" && /[+\-*/,(]/.test(s))
  58856. C.push(n);
  58857. else {
  58858. if (n !== "(" && C.length > 0 && g.push(C.join("")), n === ")") {
  58859. let a = I.pop();
  58860. if (i === 2)
  58861. try {
  58862. const [d, o] = Ua(g.pop()), [c, r] = Ua(g.pop());
  58863. let h = 0;
  58864. for (let b = c; b <= d; b += 1)
  58865. for (let u = r; u <= o; u += 1)
  58866. g.push(El(b, u)), h += 1;
  58867. g.push([a, h]);
  58868. } catch {
  58869. }
  58870. else if (i === 1 || i === 3)
  58871. i === 3 && g.push(e), g.push([a, A]), A = 1;
  58872. else
  58873. for (; a !== "(" && (g.push(a), !(I.length <= 0)); )
  58874. a = I.pop();
  58875. i = 0;
  58876. } else if (n === "=" || n === ">" || n === "<") {
  58877. const a = t.charAt(l + 1);
  58878. e = n, (a === "=" || a === "-") && (e += a, l += 1), i = 3;
  58879. } else if (n === ":")
  58880. i = 2;
  58881. else if (n === ",")
  58882. i === 3 && g.push(e), i = 1, A += 1;
  58883. else if (n === "(" && C.length > 0)
  58884. I.push(C.join(""));
  58885. else {
  58886. if (I.length > 0 && (n === "+" || n === "-")) {
  58887. let a = I[I.length - 1];
  58888. if (a !== "(" && g.push(I.pop()), a === "*" || a === "/")
  58889. for (; I.length > 0 && (a = I[I.length - 1], a !== "("); )
  58890. g.push(I.pop());
  58891. } else if (I.length > 0) {
  58892. const a = I[I.length - 1];
  58893. (a === "*" || a === "/") && g.push(I.pop());
  58894. }
  58895. I.push(n);
  58896. }
  58897. C = [];
  58898. }
  58899. s = n;
  58900. }
  58901. }
  58902. for (C.length > 0 && g.push(C.join("")); I.length > 0; )
  58903. g.push(I.pop());
  58904. return g;
  58905. }, Uug = (t, I) => {
  58906. const [g] = t;
  58907. let C = t;
  58908. if (g === '"')
  58909. return t.substring(1);
  58910. let i = 1;
  58911. if (g === "-" && (C = t.substring(1), i = -1), C[0] >= "0" && C[0] <= "9")
  58912. return i * Number(C);
  58913. const [e, A] = Ua(C);
  58914. return i * I(e, A);
  58915. }, Eug = (t, I, g, C) => {
  58916. const i = [];
  58917. for (let e = 0; e < t.length; e += 1) {
  58918. const A = t[e], s = A[0];
  58919. if (A === "+") {
  58920. const l = i.pop();
  58921. i.push(Po("+", i.pop(), l));
  58922. } else if (A === "-")
  58923. if (i.length === 1) {
  58924. const l = i.pop();
  58925. i.push(Po("*", l, -1));
  58926. } else {
  58927. const l = i.pop();
  58928. i.push(Po("-", i.pop(), l));
  58929. }
  58930. else if (A === "*")
  58931. i.push(Po("*", i.pop(), i.pop()));
  58932. else if (A === "/") {
  58933. const l = i.pop();
  58934. i.push(Po("/", i.pop(), l));
  58935. } else if (s === "=" || s === ">" || s === "<") {
  58936. let l = i.pop();
  58937. Number.isNaN(l) || (l = Number(l));
  58938. let n = i.pop();
  58939. Number.isNaN(n) || (n = Number(n));
  58940. let a = !1;
  58941. s === "=" ? a = n === l : A === ">" ? a = n > l : A === ">=" ? a = n >= l : A === "<" ? a = n < l : A === "<=" && (a = n <= l), i.push(a);
  58942. } else if (Array.isArray(A)) {
  58943. const [l, n] = A, a = [];
  58944. for (let d = 0; d < n; d += 1)
  58945. a.push(i.pop());
  58946. i.push(I[l].render(a.reverse()));
  58947. } else {
  58948. if (C.includes(A))
  58949. return 0;
  58950. (s >= "a" && s <= "z" || s >= "A" && s <= "Z") && C.push(A), i.push(Uug(A, g)), C.pop();
  58951. }
  58952. }
  58953. return i[0];
  58954. }, mig = (t, I, g, C = []) => {
  58955. if (t[0] === "=") {
  58956. const i = Oug(t.substring(1));
  58957. return i.length <= 0 ? t : Eug(
  58958. i,
  58959. I,
  58960. (e, A) => mig(g(e, A), I, g, C),
  58961. C
  58962. );
  58963. }
  58964. return t;
  58965. }, Pug = {
  58966. render: mig
  58967. }, _9 = [
  58968. {
  58969. key: "SUM",
  58970. title: $I("formula.sum"),
  58971. render: (t) => t.reduce((I, g) => Po("+", I, g), 0)
  58972. },
  58973. {
  58974. key: "AVERAGE",
  58975. title: $I("formula.average"),
  58976. render: (t) => t.reduce((I, g) => Number(I) + Number(g), 0) / t.length
  58977. },
  58978. {
  58979. key: "MAX",
  58980. title: $I("formula.max"),
  58981. render: (t) => Math.max(...t.map((I) => Number(I)))
  58982. },
  58983. {
  58984. key: "MIN",
  58985. title: $I("formula.min"),
  58986. render: (t) => Math.min(...t.map((I) => Number(I)))
  58987. },
  58988. {
  58989. key: "IF",
  58990. title: $I("formula._if"),
  58991. render: ([t, I, g]) => t ? I : g
  58992. },
  58993. {
  58994. key: "AND",
  58995. title: $I("formula.and"),
  58996. render: (t) => t.every((I) => I)
  58997. },
  58998. {
  58999. key: "OR",
  59000. title: $I("formula.or"),
  59001. render: (t) => t.some((I) => I)
  59002. },
  59003. {
  59004. key: "CONCAT",
  59005. title: $I("formula.concat"),
  59006. render: (t) => t.join("")
  59007. }
  59008. /* support: 1 + A1 + B2 * 3
  59009. {
  59010. key: 'DIVIDE',
  59011. title: tf('formula.divide'),
  59012. render: ary => ary.reduce((a, b) => Number(a) / Number(b)),
  59013. },
  59014. {
  59015. key: 'PRODUCT',
  59016. title: tf('formula.product'),
  59017. render: ary => ary.reduce((a, b) => Number(a) * Number(b),1),
  59018. },
  59019. {
  59020. key: 'SUBTRACT',
  59021. title: tf('formula.subtract'),
  59022. render: ary => ary.reduce((a, b) => Number(a) - Number(b)),
  59023. },
  59024. */
  59025. ], _ug = _9, Zig = {};
  59026. _9.forEach((t) => {
  59027. Zig[t.key] = t;
  59028. });
  59029. const xr = (t) => t, iN = (t) => {
  59030. if (/^(-?\d*.?\d*)$/.test(t)) {
  59031. const I = Number(t).toFixed(2).toString(), [g, ...C] = I.split("\\.");
  59032. return [g.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,"), ...C];
  59033. }
  59034. return t;
  59035. }, dm = [
  59036. {
  59037. key: "normal",
  59038. title: $I("format.normal"),
  59039. type: "string",
  59040. render: xr
  59041. },
  59042. {
  59043. key: "text",
  59044. title: $I("format.text"),
  59045. type: "string",
  59046. render: xr
  59047. },
  59048. {
  59049. key: "number",
  59050. title: $I("format.number"),
  59051. type: "number",
  59052. label: "1,000.12",
  59053. render: iN
  59054. },
  59055. {
  59056. key: "percent",
  59057. title: $I("format.percent"),
  59058. type: "number",
  59059. label: "10.12%",
  59060. render: (t) => `${t}%`
  59061. },
  59062. {
  59063. key: "rmb",
  59064. title: $I("format.rmb"),
  59065. type: "number",
  59066. label: "¥10.00",
  59067. render: (t) => `¥${iN(t)}`
  59068. },
  59069. {
  59070. key: "usd",
  59071. title: $I("format.usd"),
  59072. type: "number",
  59073. label: "$10.00",
  59074. render: (t) => `$${iN(t)}`
  59075. },
  59076. {
  59077. key: "eur",
  59078. title: $I("format.eur"),
  59079. type: "number",
  59080. label: "€10.00",
  59081. render: (t) => `€${iN(t)}`
  59082. },
  59083. {
  59084. key: "date",
  59085. title: $I("format.date"),
  59086. type: "date",
  59087. label: "26/09/2008",
  59088. render: xr
  59089. },
  59090. {
  59091. key: "time",
  59092. title: $I("format.time"),
  59093. type: "date",
  59094. label: "15:59:00",
  59095. render: xr
  59096. },
  59097. {
  59098. key: "datetime",
  59099. title: $I("format.datetime"),
  59100. type: "date",
  59101. label: "26/09/2008 15:59:00",
  59102. render: xr
  59103. },
  59104. {
  59105. key: "duration",
  59106. title: $I("format.duration"),
  59107. type: "date",
  59108. label: "24:01:00",
  59109. render: xr
  59110. }
  59111. ], Gig = {};
  59112. dm.forEach((t) => {
  59113. Gig[t.key] = t;
  59114. });
  59115. const qug = 5, $ug = { fillStyle: "#f4f5f8" }, gmg = {
  59116. fillStyle: "#fff",
  59117. lineWidth: P9,
  59118. strokeStyle: "#e6e6e6"
  59119. };
  59120. function Img() {
  59121. return {
  59122. textAlign: "center",
  59123. textBaseline: "middle",
  59124. font: `500 ${FI(12)}px Source Sans Pro`,
  59125. fillStyle: "#585757",
  59126. lineWidth: P9(),
  59127. strokeStyle: "#e6e6e6"
  59128. };
  59129. }
  59130. function wig(t, I, g, C = 0) {
  59131. const {
  59132. left: i,
  59133. top: e,
  59134. width: A,
  59135. height: s
  59136. } = t.cellRect(I, g);
  59137. return new jug(i, e + C, A, s, qug);
  59138. }
  59139. function VV(t, I, g, C, i = 0) {
  59140. const { sortedRowMap: e, rows: A, cols: s } = I;
  59141. if (A.isHide(g) || s.isHide(C)) return;
  59142. let l = g;
  59143. e.has(g) && (l = e.get(g));
  59144. const n = I.getCell(l, C);
  59145. if (n === null) return;
  59146. let a = !1;
  59147. "editable" in n && n.editable === !1 && (a = !0);
  59148. const d = I.getCellStyleOrDefault(l, C), o = wig(I, g, C, i);
  59149. o.bgcolor = d.bgcolor, d.border !== void 0 && (o.setBorders(d.border), t.strokeBorders(o)), t.rect(o, () => {
  59150. let c = "";
  59151. I.settings.evalPaused ? c = n.text || "" : c = Pug.render(n.text || "", Zig, (b, u) => I.getCellTextOrDefault(u, b)), d.format && (c = Gig[d.format].render(c));
  59152. const r = Object.assign({}, d.font);
  59153. r.size = Qug(r.size), t.text(c, o, {
  59154. align: d.align,
  59155. valign: d.valign,
  59156. font: r,
  59157. color: d.color,
  59158. strike: d.strike,
  59159. underline: d.underline
  59160. }, d.textwrap), I.validations.getError(g, C) && t.error(o), a && t.frozen(o);
  59161. });
  59162. }
  59163. function Cmg(t) {
  59164. const { data: I, draw: g } = this;
  59165. if (t) {
  59166. const { autoFilter: C } = I;
  59167. if (!C.active()) return;
  59168. const i = C.hrange();
  59169. t.intersects(i) && i.each((e, A) => {
  59170. const s = wig(I, e, A);
  59171. g.dropdown(s);
  59172. });
  59173. }
  59174. }
  59175. function eN(t, I, g, C, i) {
  59176. const { draw: e, data: A } = this;
  59177. e.save(), e.translate(I, g).translate(C, i);
  59178. const { exceptRowSet: s } = A, l = (d) => {
  59179. const o = s.has(d);
  59180. if (o) {
  59181. const c = A.rows.getHeight(d);
  59182. e.translate(0, -c);
  59183. }
  59184. return !o;
  59185. }, n = A.exceptRowTotalHeight(t.sri, t.eri);
  59186. e.save(), e.translate(0, -n), t.each((d, o) => {
  59187. VV(e, A, d, o);
  59188. }, (d) => l(d)), e.restore();
  59189. const a = /* @__PURE__ */ new Set();
  59190. e.save(), e.translate(0, -n), A.eachMergesInView(t, ({ sri: d, sci: o, eri: c }) => {
  59191. if (!s.has(d))
  59192. VV(e, A, d, o);
  59193. else if (!a.has(d)) {
  59194. a.add(d);
  59195. const r = A.rows.sumHeight(d, c + 1);
  59196. e.translate(0, -r);
  59197. }
  59198. }), e.restore(), Cmg.call(this, t), e.restore();
  59199. }
  59200. function Qq(t, I, g, C) {
  59201. const { draw: i } = this;
  59202. i.save(), i.attr({ fillStyle: "rgba(75, 137, 255, 0.08)" }).fillRect(t, I, g, C), i.restore();
  59203. }
  59204. function AN(t, I, g, C, i, e) {
  59205. const { draw: A, data: s } = this, l = I.h, n = I.w, a = e + C, d = i + g;
  59206. A.save(), A.attr($ug), (t === "all" || t === "left") && A.fillRect(0, a, g, l), (t === "all" || t === "top") && A.fillRect(d, 0, n, C);
  59207. const {
  59208. sri: o,
  59209. sci: c,
  59210. eri: r,
  59211. eci: h
  59212. } = s.selector.range;
  59213. A.attr(Img()), (t === "all" || t === "left") && (s.rowEach(I.sri, I.eri, (b, u, m) => {
  59214. const Z = a + u, p = b;
  59215. A.line([0, Z], [g, Z]), o <= p && p < r + 1 && Qq.call(this, 0, Z, g, m), A.fillText(p + 1, g / 2, Z + m / 2), b > 0 && s.rows.isHide(b - 1) && (A.save(), A.attr({ strokeStyle: "#c6c6c6" }), A.line([5, Z + 5], [g - 5, Z + 5]), A.restore());
  59216. }), A.line([0, l + a], [g, l + a]), A.line([g, a], [g, l + a])), (t === "all" || t === "top") && (s.colEach(I.sci, I.eci, (b, u, m) => {
  59217. const Z = d + u, p = b;
  59218. A.line([Z, 0], [Z, C]), c <= p && p < h + 1 && Qq.call(this, Z, 0, m, C), A.fillText(eig(p), Z + m / 2, C / 2), b > 0 && s.cols.isHide(b - 1) && (A.save(), A.attr({ strokeStyle: "#c6c6c6" }), A.line([Z + 5, 5], [Z + 5, C - 5]), A.restore());
  59219. }), A.line([n + d, 0], [n + d, C]), A.line([0, C], [n + d, C])), A.restore();
  59220. }
  59221. function tmg(t, I) {
  59222. const { draw: g } = this;
  59223. g.save(), g.attr({ fillStyle: "#f4f5f8" }).fillRect(0, 0, t, I), g.restore();
  59224. }
  59225. function sN({
  59226. sri: t,
  59227. sci: I,
  59228. eri: g,
  59229. eci: C,
  59230. w: i,
  59231. h: e
  59232. }, A, s, l, n) {
  59233. const { draw: a, data: d } = this, { settings: o } = d;
  59234. if (a.save(), a.attr(gmg).translate(A + l, s + n), !o.showGrid) {
  59235. a.restore();
  59236. return;
  59237. }
  59238. d.rowEach(t, g, (c, r, h) => {
  59239. c !== t && a.line([0, r], [i, r]), c === g && a.line([0, r + h], [i, r + h]);
  59240. }), d.colEach(I, C, (c, r, h) => {
  59241. c !== I && a.line([r, 0], [r, e]), c === C && a.line([r + h, 0], [r + h, e]);
  59242. }), a.restore();
  59243. }
  59244. function img(t, I, g, C) {
  59245. const { draw: i, data: e } = this, A = e.viewWidth() - t, s = e.viewHeight() - I;
  59246. i.save().translate(t, I).attr({ strokeStyle: "rgba(75, 137, 255, .6)" }), i.line([0, C], [A, C]), i.line([g, 0], [g, s]), i.restore();
  59247. }
  59248. class emg {
  59249. constructor(I, g) {
  59250. this.el = I, this.draw = new uig(I, g.viewWidth(), g.viewHeight()), this.data = g;
  59251. }
  59252. resetData(I) {
  59253. this.data = I, this.render();
  59254. }
  59255. render() {
  59256. const { data: I } = this, { rows: g, cols: C } = I, i = C.indexWidth, e = g.height;
  59257. this.draw.resize(I.viewWidth(), I.viewHeight()), this.clear();
  59258. const A = I.viewRange(), s = I.freezeTotalWidth(), l = I.freezeTotalHeight(), { x: n, y: a } = I.scroll;
  59259. sN.call(this, A, i, e, s, l), eN.call(this, A, i, e, -n, -a), AN.call(this, "all", A, i, e, s, l), tmg.call(this, i, e);
  59260. const [d, o] = I.freeze;
  59261. if (d > 0 || o > 0) {
  59262. if (d > 0) {
  59263. const r = A.clone();
  59264. r.sri = 0, r.eri = d - 1, r.h = l, sN.call(this, r, i, e, s, 0), eN.call(this, r, i, e, -n, 0), AN.call(this, "top", r, i, e, s, 0);
  59265. }
  59266. if (o > 0) {
  59267. const r = A.clone();
  59268. r.sci = 0, r.eci = o - 1, r.w = s, sN.call(this, r, i, e, 0, l), AN.call(this, "left", r, i, e, 0, l), eN.call(this, r, i, e, 0, -a);
  59269. }
  59270. const c = I.freezeViewRange();
  59271. sN.call(this, c, i, e, 0, 0), AN.call(this, "all", c, i, e, 0, 0), eN.call(this, c, i, e, 0, 0), img.call(this, i, e, s, l);
  59272. }
  59273. }
  59274. clear() {
  59275. this.draw.clear();
  59276. }
  59277. }
  59278. const qN = [
  59279. ["A3", 11.69, 16.54],
  59280. ["A4", 8.27, 11.69],
  59281. ["A5", 5.83, 8.27],
  59282. ["B4", 9.84, 13.9],
  59283. ["B5", 6.93, 9.84]
  59284. ], t9 = ["landscape", "portrait"];
  59285. function MV(t) {
  59286. return parseInt(96 * t, 10);
  59287. }
  59288. function Oq(t) {
  59289. t === "cancel" ? this.el.hide() : this.toPrint();
  59290. }
  59291. function Amg(t) {
  59292. const { paper: I } = this, { value: g } = t.target, C = qN[g];
  59293. I.w = MV(C[1]), I.h = MV(C[2]), this.preview();
  59294. }
  59295. function smg(t) {
  59296. const { paper: I } = this, { value: g } = t.target, C = t9[g];
  59297. I.orientation = C, this.preview();
  59298. }
  59299. let lmg = class {
  59300. constructor(I) {
  59301. this.paper = {
  59302. w: MV(qN[0][1]),
  59303. h: MV(qN[0][2]),
  59304. padding: 50,
  59305. orientation: t9[0],
  59306. get width() {
  59307. return this.orientation === "landscape" ? this.h : this.w;
  59308. },
  59309. get height() {
  59310. return this.orientation === "landscape" ? this.w : this.h;
  59311. }
  59312. }, this.data = I, this.el = yg("div", `${Lg}-print`).children(
  59313. yg("div", `${Lg}-print-bar`).children(
  59314. yg("div", "-title").child("Print settings"),
  59315. yg("div", "-right").children(
  59316. yg("div", `${Lg}-buttons`).children(
  59317. new ad("cancel").on("click", Oq.bind(this, "cancel")),
  59318. new ad("next", "primary").on("click", Oq.bind(this, "next"))
  59319. )
  59320. )
  59321. ),
  59322. yg("div", `${Lg}-print-content`).children(
  59323. this.contentEl = yg("div", "-content"),
  59324. yg("div", "-sider").child(
  59325. yg("form", "").children(
  59326. yg("fieldset", "").children(
  59327. yg("label", "").child(`${bt("print.size")}`),
  59328. yg("select", "").children(
  59329. ...qN.map((g, C) => yg("option", "").attr("value", C).child(`${g[0]} ( ${g[1]}''x${g[2]}'' )`))
  59330. ).on("change", Amg.bind(this))
  59331. ),
  59332. yg("fieldset", "").children(
  59333. yg("label", "").child(`${bt("print.orientation")}`),
  59334. yg("select", "").children(
  59335. ...t9.map((g, C) => yg("option", "").attr("value", C).child(`${bt("print.orientations")[C]}`))
  59336. ).on("change", smg.bind(this))
  59337. )
  59338. )
  59339. )
  59340. )
  59341. ).hide();
  59342. }
  59343. resetData(I) {
  59344. this.data = I;
  59345. }
  59346. preview() {
  59347. const { data: I, paper: g } = this, { width: C, height: i, padding: e } = g, A = C - e * 2, s = i - e * 2, l = I.contentRange(), n = parseInt(l.h / s, 10) + 1, a = A / l.w;
  59348. let d = e;
  59349. const o = e;
  59350. a > 1 && (d += (A - l.w) / 2);
  59351. let c = 0, r = 0;
  59352. this.contentEl.html(""), this.canvases = [];
  59353. const h = {
  59354. sri: 0,
  59355. sci: 0,
  59356. eri: 0,
  59357. eci: 0
  59358. };
  59359. for (let b = 0; b < n; b += 1) {
  59360. let u = 0, m = 0;
  59361. const Z = yg("div", `${Lg}-canvas-card`), p = yg("canvas", `${Lg}-canvas`);
  59362. this.canvases.push(p.el);
  59363. const Y = new uig(p.el, C, i);
  59364. for (Y.save(), Y.translate(d, o), a < 1 && Y.scale(a, a); c <= l.eri; c += 1) {
  59365. const X = I.rows.getHeight(c);
  59366. if (u += X, u < s)
  59367. for (let H = 0; H <= l.eci; H += 1)
  59368. VV(Y, I, c, H, r), h.eci = H;
  59369. else {
  59370. m = -(u - X);
  59371. break;
  59372. }
  59373. }
  59374. h.eri = c, Y.restore(), Y.save(), Y.translate(d, o), a < 1 && Y.scale(a, a);
  59375. const R = r;
  59376. I.eachMergesInView(h, ({ sri: X, sci: H }) => {
  59377. VV(Y, I, X, H, R);
  59378. }), Y.restore(), h.sri = h.eri, h.sci = h.eci, r += m, this.contentEl.child(yg("div", `${Lg}-canvas-card-wraper`).child(Z.child(p)));
  59379. }
  59380. this.el.show();
  59381. }
  59382. toPrint() {
  59383. this.el.hide();
  59384. const { paper: I } = this, g = yg("iframe", "").hide(), { el: C } = g;
  59385. window.document.body.appendChild(C);
  59386. const { contentWindow: i } = C, e = i.document, A = document.createElement("style");
  59387. A.innerHTML = `
  59388. @page { size: ${I.width}px ${I.height}px; };
  59389. canvas {
  59390. page-break-before: auto;
  59391. page-break-after: always;
  59392. image-rendering: pixelated;
  59393. };
  59394. `, e.head.appendChild(A), this.canvases.forEach((s) => {
  59395. const l = s.cloneNode(!1);
  59396. l.getContext("2d").drawImage(s, 0, 0), e.body.appendChild(l);
  59397. }), i.print();
  59398. }
  59399. };
  59400. const nmg = [
  59401. { key: "copy", title: $I("contextmenu.copy"), label: "Ctrl+C" },
  59402. { key: "cut", title: $I("contextmenu.cut"), label: "Ctrl+X" },
  59403. { key: "paste", title: $I("contextmenu.paste"), label: "Ctrl+V" },
  59404. { key: "paste-value", title: $I("contextmenu.pasteValue"), label: "Ctrl+Shift+V" },
  59405. { key: "paste-format", title: $I("contextmenu.pasteFormat"), label: "Ctrl+Alt+V" },
  59406. { key: "divider" },
  59407. { key: "insert-row", title: $I("contextmenu.insertRow") },
  59408. { key: "insert-column", title: $I("contextmenu.insertColumn") },
  59409. { key: "divider" },
  59410. { key: "delete-row", title: $I("contextmenu.deleteRow") },
  59411. { key: "delete-column", title: $I("contextmenu.deleteColumn") },
  59412. { key: "delete-cell-text", title: $I("contextmenu.deleteCellText") },
  59413. { key: "hide", title: $I("contextmenu.hide") },
  59414. { key: "divider" },
  59415. { key: "validation", title: $I("contextmenu.validation") },
  59416. { key: "divider" },
  59417. { key: "cell-printable", title: $I("contextmenu.cellprintable") },
  59418. { key: "cell-non-printable", title: $I("contextmenu.cellnonprintable") },
  59419. { key: "divider" },
  59420. { key: "cell-editable", title: $I("contextmenu.celleditable") },
  59421. { key: "cell-non-editable", title: $I("contextmenu.cellnoneditable") }
  59422. ];
  59423. function amg(t) {
  59424. return t.key === "divider" ? yg("div", `${Lg}-item divider`) : yg("div", `${Lg}-item`).on("click", () => {
  59425. this.itemClick(t.key), this.hide();
  59426. }).children(
  59427. t.title(),
  59428. yg("div", "label").child(t.label || "")
  59429. );
  59430. }
  59431. function omg() {
  59432. return nmg.map((t) => amg.call(this, t));
  59433. }
  59434. let cmg = class {
  59435. constructor(I, g = !1) {
  59436. this.menuItems = omg.call(this), this.el = yg("div", `${Lg}-contextmenu`).children(...this.menuItems).hide(), this.viewFn = I, this.itemClick = () => {
  59437. }, this.isHide = g, this.setMode("range");
  59438. }
  59439. // row-col: the whole rows or the whole cols
  59440. // range: select range
  59441. setMode(I) {
  59442. const g = this.menuItems[12];
  59443. I === "row-col" ? g.show() : g.hide();
  59444. }
  59445. hide() {
  59446. const { el: I } = this;
  59447. I.hide(), X0(I);
  59448. }
  59449. setPosition(I, g) {
  59450. if (this.isHide) return;
  59451. const { el: C } = this, { width: i } = C.show().offset(), e = this.viewFn(), A = e.height / 2;
  59452. let s = I;
  59453. e.width - I <= i && (s -= i), C.css("left", `${s}px`), g > A ? C.css("bottom", `${e.height - g}px`).css("max-height", `${g}px`).css("top", "auto") : C.css("top", `${g}px`).css("max-height", `${e.height - g}px`).css("bottom", "auto"), ZG(C);
  59454. }
  59455. };
  59456. function dmg(t, I) {
  59457. if (I.classList.contains("active"))
  59458. return;
  59459. const {
  59460. left: g,
  59461. top: C,
  59462. width: i,
  59463. height: e
  59464. } = I.getBoundingClientRect(), A = yg("div", `${Lg}-tooltip`).html(t).show();
  59465. document.body.appendChild(A.el);
  59466. const s = A.box();
  59467. A.css("left", `${g + i / 2 - s.width / 2}px`).css("top", `${C + e + 2}px`), $i(I, "mouseleave", () => {
  59468. document.body.contains(A.el) && document.body.removeChild(A.el);
  59469. }), $i(I, "click", () => {
  59470. document.body.contains(A.el) && document.body.removeChild(A.el);
  59471. });
  59472. }
  59473. class q9 {
  59474. // tooltip
  59475. // tag: the subclass type
  59476. // shortcut: shortcut key
  59477. constructor(I, g, C) {
  59478. this.tip = bt(`toolbar.${I.replace(/-[a-z]/g, (i) => i[1].toUpperCase())}`), g && (this.tip += ` (${g})`), this.tag = I, this.shortcut = g, this.value = C, this.el = this.element(), this.change = () => {
  59479. };
  59480. }
  59481. element() {
  59482. const { tip: I } = this;
  59483. return yg("div", `${Lg}-toolbar-btn`).on("mouseenter", (g) => {
  59484. dmg(I, g.target);
  59485. }).attr("data-tooltip", I);
  59486. }
  59487. setState() {
  59488. }
  59489. }
  59490. class Js extends q9 {
  59491. dropdown() {
  59492. }
  59493. getValue(I) {
  59494. return I;
  59495. }
  59496. element() {
  59497. const { tag: I } = this;
  59498. return this.dd = this.dropdown(), this.dd.change = (g) => this.change(I, this.getValue(g)), super.element().child(
  59499. this.dd
  59500. );
  59501. }
  59502. setState(I) {
  59503. I && (this.value = I, this.dd.setTitle(I));
  59504. }
  59505. }
  59506. class Ls extends hd {
  59507. constructor(I, g, C, i, ...e) {
  59508. super("div", `${Lg}-dropdown ${i}`), this.title = I, this.change = () => {
  59509. }, this.headerClick = () => {
  59510. }, typeof I == "string" ? this.title = yg("div", `${Lg}-dropdown-title`).child(I) : C && this.title.addClass("arrow-left"), this.contentEl = yg("div", `${Lg}-dropdown-content`).css("width", g).hide(), this.setContentChildren(...e), this.headerEl = yg("div", `${Lg}-dropdown-header`), this.headerEl.on("click", () => {
  59511. this.contentEl.css("display") !== "block" ? this.show() : this.hide();
  59512. }).children(
  59513. this.title,
  59514. C ? yg("div", `${Lg}-icon arrow-right`).child(
  59515. yg("div", `${Lg}-icon-img arrow-down`)
  59516. ) : ""
  59517. ), this.children(this.headerEl, this.contentEl);
  59518. }
  59519. setContentChildren(...I) {
  59520. this.contentEl.html(""), I.length > 0 && this.contentEl.children(...I);
  59521. }
  59522. setTitle(I) {
  59523. this.title.html(I), this.hide();
  59524. }
  59525. show() {
  59526. const { contentEl: I } = this;
  59527. I.show(), this.parent().active(), ZG(this.parent(), () => {
  59528. this.hide();
  59529. });
  59530. }
  59531. hide() {
  59532. this.parent().active(!1), this.contentEl.hide(), X0(this.parent());
  59533. }
  59534. }
  59535. function rmg(t) {
  59536. return yg("div", `${Lg}-item`).child(new pi(t));
  59537. }
  59538. class pig extends Ls {
  59539. constructor(I, g) {
  59540. const C = new pi(`align-${g}`), i = I.map((e) => rmg(`align-${e}`).on("click", () => {
  59541. this.setTitle(e), this.change(e);
  59542. }));
  59543. super(C, "auto", !0, "bottom-left", ...i);
  59544. }
  59545. setTitle(I) {
  59546. this.title.setName(`align-${I}`), this.hide();
  59547. }
  59548. }
  59549. class hmg extends Js {
  59550. constructor(I) {
  59551. super("align", "", I);
  59552. }
  59553. dropdown() {
  59554. const { value: I } = this;
  59555. return new pig(["left", "center", "right"], I);
  59556. }
  59557. }
  59558. class bmg extends Js {
  59559. constructor(I) {
  59560. super("valign", "", I);
  59561. }
  59562. dropdown() {
  59563. const { value: I } = this;
  59564. return new pig(["top", "middle", "bottom"], I);
  59565. }
  59566. }
  59567. class en extends q9 {
  59568. element() {
  59569. const { tag: I } = this;
  59570. return super.element().child(new pi(I)).on("click", () => this.click());
  59571. }
  59572. click() {
  59573. this.change(this.tag, this.toggle());
  59574. }
  59575. setState(I) {
  59576. this.el.active(I);
  59577. }
  59578. toggle() {
  59579. return this.el.toggle();
  59580. }
  59581. active() {
  59582. return this.el.hasClass("active");
  59583. }
  59584. }
  59585. class umg extends en {
  59586. constructor() {
  59587. super("autofilter");
  59588. }
  59589. setState() {
  59590. }
  59591. }
  59592. class mmg extends en {
  59593. constructor() {
  59594. super("font-bold", "Ctrl+B");
  59595. }
  59596. }
  59597. class Zmg extends en {
  59598. constructor() {
  59599. super("font-italic", "Ctrl+I");
  59600. }
  59601. }
  59602. class Gmg extends en {
  59603. constructor() {
  59604. super("strike", "Ctrl+U");
  59605. }
  59606. }
  59607. class wmg extends en {
  59608. constructor() {
  59609. super("underline", "Ctrl+U");
  59610. }
  59611. }
  59612. const pmg = ["#ffffff", "#000100", "#e7e5e6", "#445569", "#5b9cd6", "#ed7d31", "#a5a5a5", "#ffc001", "#4371c6", "#71ae47"], Bmg = [
  59613. ["#f2f2f2", "#7f7f7f", "#d0cecf", "#d5dce4", "#deeaf6", "#fce5d5", "#ededed", "#fff2cd", "#d9e2f3", "#e3efd9"],
  59614. ["#d8d8d8", "#595959", "#afabac", "#adb8ca", "#bdd7ee", "#f7ccac", "#dbdbdb", "#ffe59a", "#b3c6e7", "#c5e0b3"],
  59615. ["#bfbfbf", "#3f3f3f", "#756f6f", "#8596b0", "#9cc2e6", "#f4b184", "#c9c9c9", "#fed964", "#8eaada", "#a7d08c"],
  59616. ["#a5a5a5", "#262626", "#3a3839", "#333f4f", "#2e75b5", "#c45a10", "#7b7b7b", "#bf8e01", "#2f5596", "#538136"],
  59617. ["#7f7f7f", "#0c0c0c", "#171516", "#222a35", "#1f4e7a", "#843c0a", "#525252", "#7e6000", "#203864", "#365624"]
  59618. ], Wmg = ["#c00000", "#fe0000", "#fdc101", "#ffff01", "#93d051", "#00b04e", "#01b0f1", "#0170c1", "#012060", "#7030a0"];
  59619. function JX(t) {
  59620. return yg("td", "").child(
  59621. yg("div", `${Lg}-color-palette-cell`).on("click.stop", () => this.change(t)).css("background-color", t)
  59622. );
  59623. }
  59624. class ymg {
  59625. constructor() {
  59626. this.el = yg("div", `${Lg}-color-palette`), this.change = () => {
  59627. };
  59628. const I = yg("table", "").children(
  59629. yg("tbody", "").children(
  59630. yg("tr", `${Lg}-theme-color-placeholders`).children(
  59631. ...pmg.map((g) => JX.call(this, g))
  59632. ),
  59633. ...Bmg.map((g) => yg("tr", `${Lg}-theme-colors`).children(
  59634. ...g.map((C) => JX.call(this, C))
  59635. )),
  59636. yg("tr", `${Lg}-standard-colors`).children(
  59637. ...Wmg.map((g) => JX.call(this, g))
  59638. )
  59639. )
  59640. );
  59641. this.el.child(I);
  59642. }
  59643. }
  59644. class $9 extends Ls {
  59645. constructor(I, g) {
  59646. const C = new pi(I).css("height", "16px").css("border-bottom", `3px solid ${g}`), i = new ymg();
  59647. i.change = (e) => {
  59648. this.setTitle(e), this.change(e);
  59649. }, super(C, "auto", !1, "bottom-left", i.el);
  59650. }
  59651. setTitle(I) {
  59652. this.title.css("border-color", I), this.hide();
  59653. }
  59654. }
  59655. const Ymg = [
  59656. ["thin", '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="1" style="user-select: none;"><line x1="0" y1="0.5" x2="50" y2="0.5" stroke-width="1" stroke="black" style="user-select: none;"></line></svg>'],
  59657. ["medium", '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="2" style="user-select: none;"><line x1="0" y1="1.0" x2="50" y2="1.0" stroke-width="2" stroke="black" style="user-select: none;"></line></svg>'],
  59658. ["thick", '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="3" style="user-select: none;"><line x1="0" y1="1.5" x2="50" y2="1.5" stroke-width="3" stroke="black" style="user-select: none;"></line></svg>'],
  59659. ["dashed", '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="1" style="user-select: none;"><line x1="0" y1="0.5" x2="50" y2="0.5" stroke-width="1" stroke="black" stroke-dasharray="2" style="user-select: none;"></line></svg>'],
  59660. ["dotted", '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="1" style="user-select: none;"><line x1="0" y1="0.5" x2="50" y2="0.5" stroke-width="1" stroke="black" stroke-dasharray="1" style="user-select: none;"></line></svg>']
  59661. // ['double', '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="3" style="user-select: none;"><line x1="0" y1="0.5" x2="50" y2="0.5" stroke-width="1" stroke="black" style="user-select: none;"></line><line x1="0" y1="2.5" x2="50" y2="2.5" stroke-width="1" stroke="black" style="user-select: none;"></line></svg>'],
  59662. ];
  59663. class Nmg extends Ls {
  59664. constructor(I) {
  59665. const g = new pi("line-type");
  59666. let C = 0;
  59667. const i = Ymg.map((e, A) => yg("div", `${Lg}-item state ${I === e[0] ? "checked" : ""}`).on("click", () => {
  59668. i[C].toggle("checked"), i[A].toggle("checked"), C = A, this.hide(), this.change(e);
  59669. }).child(
  59670. yg("div", `${Lg}-line-type`).html(e[1])
  59671. ));
  59672. super(g, "auto", !1, "bottom-left", ...i);
  59673. }
  59674. }
  59675. function Uq(...t) {
  59676. return yg("table", "").child(
  59677. yg("tbody", "").children(...t)
  59678. );
  59679. }
  59680. function Eq(t) {
  59681. return yg("td", "").child(
  59682. yg("div", `${Lg}-border-palette-cell`).child(
  59683. new pi(`border-${t}`)
  59684. ).on("click", () => {
  59685. this.mode = t;
  59686. const { mode: I, style: g, color: C } = this;
  59687. this.change({ mode: I, style: g, color: C });
  59688. })
  59689. );
  59690. }
  59691. class Vmg {
  59692. constructor() {
  59693. this.color = "#000", this.style = "thin", this.mode = "all", this.change = () => {
  59694. }, this.ddColor = new $9("line-color", this.color), this.ddColor.change = (g) => {
  59695. this.color = g;
  59696. }, this.ddType = new Nmg(this.style), this.ddType.change = ([g]) => {
  59697. this.style = g;
  59698. }, this.el = yg("div", `${Lg}-border-palette`);
  59699. const I = Uq(
  59700. yg("tr", "").children(
  59701. yg("td", `${Lg}-border-palette-left`).child(
  59702. Uq(
  59703. yg("tr", "").children(
  59704. ...["all", "inside", "horizontal", "vertical", "outside"].map((g) => Eq.call(this, g))
  59705. ),
  59706. yg("tr", "").children(
  59707. ...["left", "top", "right", "bottom", "none"].map((g) => Eq.call(this, g))
  59708. )
  59709. )
  59710. ),
  59711. yg("td", `${Lg}-border-palette-right`).children(
  59712. yg("div", `${Lg}-toolbar-btn`).child(this.ddColor.el),
  59713. yg("div", `${Lg}-toolbar-btn`).child(this.ddType.el)
  59714. )
  59715. )
  59716. );
  59717. this.el.child(I);
  59718. }
  59719. }
  59720. class Mmg extends Ls {
  59721. constructor() {
  59722. const I = new pi("border-all"), g = new Vmg();
  59723. g.change = (C) => {
  59724. this.change(C), this.hide();
  59725. }, super(I, "auto", !1, "bottom-left", g.el);
  59726. }
  59727. }
  59728. class Rmg extends Js {
  59729. constructor() {
  59730. super("border");
  59731. }
  59732. dropdown() {
  59733. return new Mmg();
  59734. }
  59735. }
  59736. class hM extends q9 {
  59737. element() {
  59738. return super.element().child(new pi(this.tag)).on("click", () => this.change(this.tag));
  59739. }
  59740. setState(I) {
  59741. this.el.disabled(I);
  59742. }
  59743. }
  59744. class fmg extends hM {
  59745. constructor() {
  59746. super("clearformat");
  59747. }
  59748. }
  59749. class Hmg extends en {
  59750. constructor() {
  59751. super("paintformat");
  59752. }
  59753. setState() {
  59754. }
  59755. }
  59756. class Xmg extends Js {
  59757. constructor(I) {
  59758. super("color", void 0, I);
  59759. }
  59760. dropdown() {
  59761. const { tag: I, value: g } = this;
  59762. return new $9(I, g);
  59763. }
  59764. }
  59765. class Smg extends Js {
  59766. constructor(I) {
  59767. super("bgcolor", void 0, I);
  59768. }
  59769. dropdown() {
  59770. const { tag: I, value: g } = this;
  59771. return new $9(I, g);
  59772. }
  59773. }
  59774. class Dmg extends Ls {
  59775. constructor() {
  59776. const I = C9.map((g) => yg("div", `${Lg}-item`).on("click", () => {
  59777. this.setTitle(`${g.pt}`), this.change(g);
  59778. }).child(`${g.pt}`));
  59779. super("10", "60px", !0, "bottom-left", ...I);
  59780. }
  59781. }
  59782. let Kmg = class extends Js {
  59783. constructor() {
  59784. super("font-size");
  59785. }
  59786. getValue(I) {
  59787. return I.pt;
  59788. }
  59789. dropdown() {
  59790. return new Dmg();
  59791. }
  59792. };
  59793. class Fmg extends Ls {
  59794. constructor() {
  59795. const I = jq.map((g) => yg("div", `${Lg}-item`).on("click", () => {
  59796. this.setTitle(g.title), this.change(g);
  59797. }).child(g.title));
  59798. super(jq[0].title, "160px", !0, "bottom-left", ...I);
  59799. }
  59800. }
  59801. class kmg extends Js {
  59802. constructor() {
  59803. super("font-name");
  59804. }
  59805. getValue(I) {
  59806. return I.key;
  59807. }
  59808. dropdown() {
  59809. return new Fmg();
  59810. }
  59811. }
  59812. class zmg extends Ls {
  59813. constructor() {
  59814. let I = dm.slice(0);
  59815. I.splice(2, 0, { key: "divider" }), I.splice(8, 0, { key: "divider" }), I = I.map((g) => {
  59816. const C = yg("div", `${Lg}-item`);
  59817. return g.key === "divider" ? C.addClass("divider") : (C.child(g.title()).on("click", () => {
  59818. this.setTitle(g.title()), this.change(g);
  59819. }), g.label && C.child(yg("div", "label").html(g.label))), C;
  59820. }), super("Normal", "220px", !0, "bottom-left", ...I);
  59821. }
  59822. setTitle(I) {
  59823. for (let g = 0; g < dm.length; g += 1)
  59824. dm[g].key === I && this.title.html(dm[g].title());
  59825. this.hide();
  59826. }
  59827. }
  59828. let Jmg = class extends Js {
  59829. constructor() {
  59830. super("format");
  59831. }
  59832. getValue(I) {
  59833. return I.key;
  59834. }
  59835. dropdown() {
  59836. return new zmg();
  59837. }
  59838. };
  59839. class Lmg extends Ls {
  59840. constructor() {
  59841. const I = _9.map((g) => yg("div", `${Lg}-item`).on("click", () => {
  59842. this.hide(), this.change(g);
  59843. }).child(g.key));
  59844. super(new pi("formula"), "180px", !0, "bottom-left", ...I);
  59845. }
  59846. }
  59847. class vmg extends Js {
  59848. constructor() {
  59849. super("formula");
  59850. }
  59851. getValue(I) {
  59852. return I.key;
  59853. }
  59854. dropdown() {
  59855. return new Lmg();
  59856. }
  59857. }
  59858. class Tmg extends en {
  59859. constructor() {
  59860. super("freeze");
  59861. }
  59862. }
  59863. class xmg extends en {
  59864. constructor() {
  59865. super("merge");
  59866. }
  59867. setState(I, g) {
  59868. this.el.active(I).disabled(g);
  59869. }
  59870. }
  59871. class jmg extends hM {
  59872. constructor() {
  59873. super("redo", "Ctrl+Y");
  59874. }
  59875. }
  59876. class Qmg extends hM {
  59877. constructor() {
  59878. super("undo", "Ctrl+Z");
  59879. }
  59880. }
  59881. class Omg extends hM {
  59882. constructor() {
  59883. super("print", "Ctrl+P");
  59884. }
  59885. }
  59886. class Umg extends en {
  59887. constructor() {
  59888. super("textwrap");
  59889. }
  59890. }
  59891. let Emg = class extends Ls {
  59892. constructor() {
  59893. const I = new pi("ellipsis"), g = yg("div", `${Lg}-toolbar-more`);
  59894. super(I, "auto", !1, "bottom-right", g), this.moreBtns = g, this.contentEl.css("max-width", "420px");
  59895. }
  59896. };
  59897. class Pmg extends Js {
  59898. constructor() {
  59899. super("more"), this.el.hide();
  59900. }
  59901. dropdown() {
  59902. return new Emg();
  59903. }
  59904. show() {
  59905. this.el.show();
  59906. }
  59907. hide() {
  59908. this.el.hide();
  59909. }
  59910. }
  59911. function jr() {
  59912. return yg("div", `${Lg}-toolbar-divider`);
  59913. }
  59914. function _mg() {
  59915. this.btns2 = [], this.items.forEach((t) => {
  59916. if (Array.isArray(t))
  59917. t.forEach(({ el: I }) => {
  59918. const g = I.box(), { marginLeft: C, marginRight: i } = I.computedStyle();
  59919. this.btns2.push([I, g.width + parseInt(C, 10) + parseInt(i, 10)]);
  59920. });
  59921. else {
  59922. const I = t.box(), { marginLeft: g, marginRight: C } = t.computedStyle();
  59923. this.btns2.push([t, I.width + parseInt(g, 10) + parseInt(C, 10)]);
  59924. }
  59925. });
  59926. }
  59927. function Pq() {
  59928. const {
  59929. el: t,
  59930. btns: I,
  59931. moreEl: g,
  59932. btns2: C
  59933. } = this, { moreBtns: i, contentEl: e } = g.dd;
  59934. t.css("width", `${this.widthFn() - 60}px`);
  59935. const A = t.box();
  59936. let s = 160, l = 12;
  59937. const n = [], a = [];
  59938. C.forEach(([d, o], c) => {
  59939. s += o, c === C.length - 1 || s < A.width ? n.push(d) : (l += o, a.push(d));
  59940. }), I.html("").children(...n), i.html("").children(...a), e.css("width", `${l}px`), a.length > 0 ? g.show() : g.hide();
  59941. }
  59942. class qmg {
  59943. constructor(I, g, C = !1) {
  59944. this.data = I, this.change = () => {
  59945. }, this.widthFn = g, this.isHide = C;
  59946. const i = I.defaultStyle();
  59947. this.items = [
  59948. [
  59949. this.undoEl = new Qmg(),
  59950. this.redoEl = new jmg(),
  59951. new Omg(),
  59952. this.paintformatEl = new Hmg(),
  59953. this.clearformatEl = new fmg()
  59954. ],
  59955. jr(),
  59956. [
  59957. this.formatEl = new Jmg()
  59958. ],
  59959. jr(),
  59960. [
  59961. this.fontEl = new kmg(),
  59962. this.fontSizeEl = new Kmg()
  59963. ],
  59964. jr(),
  59965. [
  59966. this.boldEl = new mmg(),
  59967. this.italicEl = new Zmg(),
  59968. this.underlineEl = new wmg(),
  59969. this.strikeEl = new Gmg(),
  59970. this.textColorEl = new Xmg(i.color)
  59971. ],
  59972. jr(),
  59973. [
  59974. this.fillColorEl = new Smg(i.bgcolor),
  59975. this.borderEl = new Rmg(),
  59976. this.mergeEl = new xmg()
  59977. ],
  59978. jr(),
  59979. [
  59980. this.alignEl = new hmg(i.align),
  59981. this.valignEl = new bmg(i.valign),
  59982. this.textwrapEl = new Umg()
  59983. ],
  59984. jr(),
  59985. [
  59986. this.freezeEl = new Tmg(),
  59987. this.autofilterEl = new umg(),
  59988. this.formulaEl = new vmg(),
  59989. this.moreEl = new Pmg()
  59990. ]
  59991. ], this.el = yg("div", `${Lg}-toolbar`), this.btns = yg("div", `${Lg}-toolbar-btns`), this.items.forEach((e) => {
  59992. Array.isArray(e) ? e.forEach((A) => {
  59993. this.btns.child(A.el), A.change = (...s) => {
  59994. this.change(...s);
  59995. };
  59996. }) : this.btns.child(e.el);
  59997. }), this.el.child(this.btns), C ? this.el.hide() : (this.reset(), setTimeout(() => {
  59998. _mg.call(this), Pq.call(this);
  59999. }, 0), $i(window, "resize", () => {
  60000. Pq.call(this);
  60001. }));
  60002. }
  60003. paintformatActive() {
  60004. return this.paintformatEl.active();
  60005. }
  60006. paintformatToggle() {
  60007. this.paintformatEl.toggle();
  60008. }
  60009. trigger(I) {
  60010. this[`${I}El`].click();
  60011. }
  60012. resetData(I) {
  60013. this.data = I, this.reset();
  60014. }
  60015. reset() {
  60016. if (this.isHide) return;
  60017. const { data: I } = this, g = I.getSelectedCellStyle();
  60018. this.undoEl.setState(!I.canUndo()), this.redoEl.setState(!I.canRedo()), this.mergeEl.setState(I.canUnmerge(), !I.selector.multiple()), this.autofilterEl.setState(!I.canAutofilter());
  60019. const { font: C, format: i } = g;
  60020. this.formatEl.setState(i), this.fontEl.setState(C.name), this.fontSizeEl.setState(C.size), this.boldEl.setState(C.bold), this.italicEl.setState(C.italic), this.underlineEl.setState(g.underline), this.strikeEl.setState(g.strike), this.textColorEl.setState(g.color), this.fillColorEl.setState(g.bgcolor), this.alignEl.setState(g.align), this.valignEl.setState(g.valign), this.textwrapEl.setState(g.textwrap), this.freezeEl.setState(I.freezeIsActive());
  60021. }
  60022. }
  60023. class $mg {
  60024. constructor(I, g, C = "600px") {
  60025. this.title = I, this.el = yg("div", `${Lg}-modal`).css("width", C).children(
  60026. yg("div", `${Lg}-modal-header`).children(
  60027. new pi("close").on("click.stop", () => this.hide()),
  60028. this.title
  60029. ),
  60030. yg("div", `${Lg}-modal-content`).children(...g)
  60031. ).hide();
  60032. }
  60033. show() {
  60034. this.dimmer = yg("div", `${Lg}-dimmer active`), document.body.appendChild(this.dimmer.el);
  60035. const { width: I, height: g } = this.el.show().box(), { clientHeight: C, clientWidth: i } = document.documentElement;
  60036. this.el.offset({
  60037. left: (i - I) / 2,
  60038. top: (C - g) / 3
  60039. }), window.xkeydownEsc = (e) => {
  60040. e.keyCode === 27 && this.hide();
  60041. }, $i(window, "keydown", window.xkeydownEsc);
  60042. }
  60043. hide() {
  60044. this.el.hide(), document.body.removeChild(this.dimmer.el), yV(window, "keydown", window.xkeydownEsc), delete window.xkeydownEsc;
  60045. }
  60046. }
  60047. class eh {
  60048. constructor(I, g) {
  60049. this.vchange = () => {
  60050. }, this.el = yg("div", `${Lg}-form-input`), this.input = yg("input", "").css("width", I).on("input", (C) => this.vchange(C)).attr("placeholder", g), this.el.child(this.input);
  60051. }
  60052. focus() {
  60053. setTimeout(() => {
  60054. this.input.el.focus();
  60055. }, 10);
  60056. }
  60057. hint(I) {
  60058. this.input.attr("placeholder", I);
  60059. }
  60060. val(I) {
  60061. return this.input.val(I);
  60062. }
  60063. }
  60064. class LX {
  60065. constructor(I, g, C, i = (A) => A, e = () => {
  60066. }) {
  60067. this.key = I, this.getTitle = i, this.vchange = () => {
  60068. }, this.el = yg("div", `${Lg}-form-select`), this.suggest = new hig(g.map((A) => ({ key: A, title: this.getTitle(A) })), (A) => {
  60069. this.itemClick(A.key), e(A.key), this.vchange(A.key);
  60070. }, C, this.el), this.el.children(
  60071. this.itemEl = yg("div", "input-text").html(this.getTitle(I)),
  60072. this.suggest.el
  60073. ).on("click", () => this.show());
  60074. }
  60075. show() {
  60076. this.suggest.search("");
  60077. }
  60078. itemClick(I) {
  60079. this.key = I, this.itemEl.html(this.getTitle(I));
  60080. }
  60081. val(I) {
  60082. return I !== void 0 ? (this.key = I, this.itemEl.html(this.getTitle(I)), this) : this.key;
  60083. }
  60084. }
  60085. const gZg = {
  60086. number: /(^\d+$)|(^\d+(\.\d{0,4})?$)/,
  60087. date: /^\d{4}-\d{1,2}-\d{1,2}$/
  60088. };
  60089. class qn {
  60090. constructor(I, g, C, i) {
  60091. this.label = "", this.rule = g, C && (this.label = yg("label", "label").css("width", `${i}px`).html(C)), this.tip = yg("div", "tip").child("tip").hide(), this.input = I, this.input.vchange = () => this.validate(), this.el = yg("div", `${Lg}-form-field`).children(this.label, I.el, this.tip);
  60092. }
  60093. isShow() {
  60094. return this.el.css("display") !== "none";
  60095. }
  60096. show() {
  60097. this.el.show();
  60098. }
  60099. hide() {
  60100. return this.el.hide(), this;
  60101. }
  60102. val(I) {
  60103. return this.input.val(I);
  60104. }
  60105. hint(I) {
  60106. this.input.hint(I);
  60107. }
  60108. validate() {
  60109. const {
  60110. input: I,
  60111. rule: g,
  60112. tip: C,
  60113. el: i
  60114. } = this, e = I.val();
  60115. return g.required && /^\s*$/.test(e) ? (C.html(bt("validation.required")), i.addClass("error"), !1) : (g.type || g.pattern) && !(g.pattern || gZg[g.type]).test(e) ? (C.html(bt("validation.notMatch")), i.addClass("error"), !1) : (i.removeClass("error"), !0);
  60116. }
  60117. }
  60118. const _q = 100;
  60119. class IZg extends $mg {
  60120. constructor() {
  60121. const I = new qn(
  60122. new LX(
  60123. "cell",
  60124. ["cell"],
  60125. // cell|row|column
  60126. "100%",
  60127. (n) => bt(`dataValidation.modeType.${n}`)
  60128. ),
  60129. { required: !0 },
  60130. `${bt("dataValidation.range")}:`,
  60131. _q
  60132. ), g = new qn(
  60133. new eh("120px", "E3 or E3:F12"),
  60134. { required: !0, pattern: /^([A-Z]{1,2}[1-9]\d*)(:[A-Z]{1,2}[1-9]\d*)?$/ }
  60135. ), C = new qn(
  60136. new LX(
  60137. "list",
  60138. ["list", "number", "date", "phone", "email"],
  60139. "100%",
  60140. (n) => bt(`dataValidation.type.${n}`),
  60141. (n) => this.criteriaSelected(n)
  60142. ),
  60143. { required: !0 },
  60144. `${bt("dataValidation.criteria")}:`,
  60145. _q
  60146. ), i = new qn(
  60147. new LX(
  60148. "be",
  60149. ["be", "nbe", "eq", "neq", "lt", "lte", "gt", "gte"],
  60150. "160px",
  60151. (n) => bt(`dataValidation.operator.${n}`),
  60152. (n) => this.criteriaOperatorSelected(n)
  60153. ),
  60154. { required: !0 }
  60155. ).hide(), e = new qn(
  60156. new eh("70px", "10"),
  60157. { required: !0 }
  60158. ).hide(), A = new qn(
  60159. new eh("70px", "100"),
  60160. { required: !0, type: "number" }
  60161. ).hide(), s = new qn(
  60162. new eh("120px", "a,b,c"),
  60163. { required: !0 }
  60164. ), l = new qn(
  60165. new eh("70px", "10"),
  60166. { required: !0, type: "number" }
  60167. ).hide();
  60168. super(bt("contextmenu.validation"), [
  60169. yg("div", `${Lg}-form-fields`).children(
  60170. I.el,
  60171. g.el
  60172. ),
  60173. yg("div", `${Lg}-form-fields`).children(
  60174. C.el,
  60175. i.el,
  60176. e.el,
  60177. A.el,
  60178. l.el,
  60179. s.el
  60180. ),
  60181. yg("div", `${Lg}-buttons`).children(
  60182. new ad("cancel").on("click", () => this.btnClick("cancel")),
  60183. new ad("remove").on("click", () => this.btnClick("remove")),
  60184. new ad("save", "primary").on("click", () => this.btnClick("save"))
  60185. )
  60186. ]), this.mf = I, this.rf = g, this.cf = C, this.of = i, this.minvf = e, this.maxvf = A, this.vf = l, this.svf = s, this.change = () => {
  60187. };
  60188. }
  60189. showVf(I) {
  60190. const g = I === "date" ? "2018-11-12" : "10", { vf: C } = this;
  60191. C.input.hint(g), C.show();
  60192. }
  60193. criteriaSelected(I) {
  60194. const {
  60195. of: g,
  60196. minvf: C,
  60197. maxvf: i,
  60198. vf: e,
  60199. svf: A
  60200. } = this;
  60201. I === "date" || I === "number" ? (g.show(), C.rule.type = I, i.rule.type = I, I === "date" ? (C.hint("2018-11-12"), i.hint("2019-11-12")) : (C.hint("10"), i.hint("100")), C.show(), i.show(), e.hide(), A.hide()) : (I === "list" ? A.show() : A.hide(), e.hide(), g.hide(), C.hide(), i.hide());
  60202. }
  60203. criteriaOperatorSelected(I) {
  60204. if (!I) return;
  60205. const {
  60206. minvf: g,
  60207. maxvf: C,
  60208. vf: i
  60209. } = this;
  60210. if (I === "be" || I === "nbe")
  60211. g.show(), C.show(), i.hide();
  60212. else {
  60213. const e = this.cf.val();
  60214. i.rule.type = e, e === "date" ? i.hint("2018-11-12") : i.hint("10"), i.show(), g.hide(), C.hide();
  60215. }
  60216. }
  60217. btnClick(I) {
  60218. if (I === "cancel")
  60219. this.hide();
  60220. else if (I === "remove")
  60221. this.change("remove"), this.hide();
  60222. else if (I === "save") {
  60223. const g = ["mf", "rf", "cf", "of", "svf", "vf", "minvf", "maxvf"];
  60224. for (let l = 0; l < g.length; l += 1) {
  60225. const n = this[g[l]];
  60226. if (n.isShow() && !n.validate())
  60227. return;
  60228. }
  60229. const C = this.mf.val(), i = this.rf.val(), e = this.cf.val(), A = this.of.val();
  60230. let s = this.svf.val();
  60231. (e === "number" || e === "date") && (A === "be" || A === "nbe" ? s = [this.minvf.val(), this.maxvf.val()] : s = this.vf.val()), this.change(
  60232. "save",
  60233. C,
  60234. i,
  60235. {
  60236. type: e,
  60237. operator: A,
  60238. required: !1,
  60239. value: s
  60240. }
  60241. ), this.hide();
  60242. }
  60243. }
  60244. // validation: { mode, ref, validator }
  60245. setValue(I) {
  60246. if (I) {
  60247. const {
  60248. mf: g,
  60249. rf: C,
  60250. cf: i,
  60251. of: e,
  60252. svf: A,
  60253. vf: s,
  60254. minvf: l,
  60255. maxvf: n
  60256. } = this, {
  60257. mode: a,
  60258. ref: d,
  60259. validator: o
  60260. } = I, {
  60261. type: c,
  60262. operator: r,
  60263. value: h
  60264. } = o || { type: "list" };
  60265. g.val(a || "cell"), C.val(d), i.val(c), e.val(r), Array.isArray(h) ? (l.val(h[0]), n.val(h[1])) : (A.val(h || ""), s.val(h || "")), this.criteriaSelected(c), this.criteriaOperatorSelected(r);
  60266. }
  60267. this.show();
  60268. }
  60269. }
  60270. function Big(t) {
  60271. return yg("div", `${Lg}-item ${t}`);
  60272. }
  60273. function qq(t) {
  60274. return Big("state").child(bt(`sort.${t}`)).on("click.stop", () => this.itemClick(t));
  60275. }
  60276. function CZg(t) {
  60277. const { filterbEl: I, filterValues: g } = this;
  60278. I.html(""), Object.keys(t).forEach((i, e) => {
  60279. const A = t[i], s = g.includes(i) ? "checked" : "";
  60280. I.child(yg("div", `${Lg}-item state ${s}`).on("click.stop", () => this.filterClick(e, i)).children(i === "" ? bt("filter.empty") : i, yg("div", "label").html(`(${A})`)));
  60281. });
  60282. }
  60283. function $q() {
  60284. const { filterhEl: t, filterValues: I, values: g } = this;
  60285. t.html(`${I.length} / ${g.length}`), t.checked(I.length === g.length);
  60286. }
  60287. class tZg {
  60288. constructor() {
  60289. this.filterbEl = yg("div", `${Lg}-body`), this.filterhEl = yg("div", `${Lg}-header state`).on("click.stop", () => this.filterClick(0, "all")), this.el = yg("div", `${Lg}-sort-filter`).children(
  60290. this.sortAscEl = qq.call(this, "asc"),
  60291. this.sortDescEl = qq.call(this, "desc"),
  60292. Big("divider"),
  60293. yg("div", `${Lg}-filter`).children(
  60294. this.filterhEl,
  60295. this.filterbEl
  60296. ),
  60297. yg("div", `${Lg}-buttons`).children(
  60298. new ad("cancel").on("click", () => this.btnClick("cancel")),
  60299. new ad("ok", "primary").on("click", () => this.btnClick("ok"))
  60300. )
  60301. ).hide(), this.ci = null, this.sortDesc = null, this.values = null, this.filterValues = [];
  60302. }
  60303. btnClick(I) {
  60304. if (I === "ok") {
  60305. const { ci: g, sort: C, filterValues: i } = this;
  60306. this.ok && this.ok(g, C, "in", i);
  60307. }
  60308. this.hide();
  60309. }
  60310. itemClick(I) {
  60311. this.sort = I;
  60312. const { sortAscEl: g, sortDescEl: C } = this;
  60313. g.checked(I === "asc"), C.checked(I === "desc");
  60314. }
  60315. filterClick(I, g) {
  60316. const { filterbEl: C, filterValues: i, values: e } = this, A = C.children();
  60317. g === "all" ? A.length === i.length ? (this.filterValues = [], A.forEach((s) => yg(s).checked(!1))) : (this.filterValues = Array.from(e), A.forEach((s) => yg(s).checked(!0))) : yg(A[I]).toggle("checked") ? i.push(g) : i.splice(i.findIndex((l) => l === g), 1), $q.call(this);
  60318. }
  60319. // v: autoFilter
  60320. // items: {value: cnt}
  60321. // sort { ci, order }
  60322. set(I, g, C, i) {
  60323. this.ci = I;
  60324. const { sortAscEl: e, sortDescEl: A } = this;
  60325. i !== null ? (this.sort = i.order, e.checked(i.asc()), A.checked(i.desc())) : (this.sortDesc = null, e.checked(!1), A.checked(!1)), this.values = Object.keys(g), this.filterValues = C ? Array.from(C.value) : Object.keys(g), CZg.call(this, g, C), $q.call(this);
  60326. }
  60327. setOffset(I) {
  60328. this.el.offset(I).show();
  60329. let g = 1;
  60330. ZG(this.el, () => {
  60331. g <= 0 && this.hide(), g -= 1;
  60332. });
  60333. }
  60334. show() {
  60335. this.el.show();
  60336. }
  60337. hide() {
  60338. this.el.hide(), X0(this.el);
  60339. }
  60340. }
  60341. function Wig(t, I) {
  60342. const g = yg("div", `${Lg}-toast`), C = yg("div", `${Lg}-dimmer active`), i = () => {
  60343. document.body.removeChild(g.el), document.body.removeChild(C.el);
  60344. };
  60345. g.children(
  60346. yg("div", `${Lg}-toast-header`).children(
  60347. new pi("close").on("click.stop", () => i()),
  60348. t
  60349. ),
  60350. yg("div", `${Lg}-toast-content`).html(I)
  60351. ), document.body.appendChild(g.el), document.body.appendChild(C.el);
  60352. const { width: e, height: A } = g.box(), { clientHeight: s, clientWidth: l } = document.documentElement;
  60353. g.offset({
  60354. left: (l - e) / 2,
  60355. top: (s - A) / 3
  60356. });
  60357. }
  60358. function vX(t, I) {
  60359. let g;
  60360. return (...C) => {
  60361. const i = this, e = C;
  60362. g || (g = setTimeout(() => {
  60363. g = null, t.apply(i, e);
  60364. }, I));
  60365. };
  60366. }
  60367. function iZg() {
  60368. const {
  60369. data: t,
  60370. verticalScrollbar: I,
  60371. horizontalScrollbar: g
  60372. } = this, {
  60373. l: C,
  60374. t: i,
  60375. left: e,
  60376. top: A,
  60377. width: s,
  60378. height: l
  60379. } = t.getSelectedRect(), n = this.getTableOffset();
  60380. if (Math.abs(e) + s > n.width)
  60381. g.move({ left: C + s - n.width });
  60382. else {
  60383. const a = t.freezeTotalWidth();
  60384. e < a && g.move({ left: C - 1 - a });
  60385. }
  60386. if (Math.abs(A) + l > n.height)
  60387. I.move({ top: i + l - n.height - 1 });
  60388. else {
  60389. const a = t.freezeTotalHeight();
  60390. A < a && I.move({ top: i - 1 - a });
  60391. }
  60392. }
  60393. function od(t, I, g, C = !0, i = !1) {
  60394. if (I === -1 && g === -1) return;
  60395. const {
  60396. table: e,
  60397. selector: A,
  60398. toolbar: s,
  60399. data: l,
  60400. contextMenu: n
  60401. } = this;
  60402. n.setMode(I === -1 || g === -1 ? "row-col" : "range");
  60403. const a = l.getCell(I, g);
  60404. t ? (A.setEnd(I, g, i), this.trigger("cells-selected", a, A.range)) : (A.set(I, g, C), this.trigger("cell-selected", a, I, g)), s.reset(), e.render();
  60405. }
  60406. function cs(t, I) {
  60407. const {
  60408. selector: g,
  60409. data: C
  60410. } = this, { rows: i, cols: e } = C;
  60411. let [A, s] = g.indexes;
  60412. const { eri: l, eci: n } = g.range;
  60413. t && ([A, s] = g.moveIndexes), I === "left" ? s > 0 && (s -= 1) : I === "right" ? (n !== s && (s = n), s < e.len - 1 && (s += 1)) : I === "up" ? A > 0 && (A -= 1) : I === "down" ? (l !== A && (A = l), A < i.len - 1 && (A += 1)) : I === "row-first" ? s = 0 : I === "row-last" ? s = e.len - 1 : I === "col-first" ? A = 0 : I === "col-last" && (A = i.len - 1), t && (g.moveIndexes = [A, s]), od.call(this, t, A, s), iZg.call(this);
  60414. }
  60415. function eZg(t) {
  60416. if (t.buttons !== 0 || t.target.className === `${Lg}-resizer-hover`) return;
  60417. const { offsetX: I, offsetY: g } = t, {
  60418. rowResizer: C,
  60419. colResizer: i,
  60420. tableEl: e,
  60421. data: A
  60422. } = this, { rows: s, cols: l } = A;
  60423. if (I > l.indexWidth && g > s.height) {
  60424. C.hide(), i.hide();
  60425. return;
  60426. }
  60427. const n = e.box(), a = A.getCellRectByXY(t.offsetX, t.offsetY);
  60428. a.ri >= 0 && a.ci === -1 ? (a.width = l.indexWidth, C.show(a, {
  60429. width: n.width
  60430. }), s.isHide(a.ri - 1) ? C.showUnhide(a.ri) : C.hideUnhide()) : C.hide(), a.ri === -1 && a.ci >= 0 ? (a.height = s.height, i.show(a, {
  60431. height: n.height
  60432. }), l.isHide(a.ci - 1) ? i.showUnhide(a.ci) : i.hideUnhide()) : i.hide();
  60433. }
  60434. function AZg(t) {
  60435. const { verticalScrollbar: I, horizontalScrollbar: g, data: C } = this, { top: i } = I.scroll(), { left: e } = g.scroll(), { rows: A, cols: s } = C, { deltaY: l, deltaX: n } = t, a = (b, u) => {
  60436. let m = b, Z = 0;
  60437. do
  60438. Z = u(m), m += 1;
  60439. while (Z <= 0);
  60440. return Z;
  60441. }, d = (b) => {
  60442. if (b > 0) {
  60443. const u = C.scroll.ri + 1;
  60444. if (u < A.len) {
  60445. const m = a(u, (Z) => A.getHeight(Z));
  60446. I.move({ top: i + m - 1 });
  60447. }
  60448. } else {
  60449. const u = C.scroll.ri - 1;
  60450. if (u >= 0) {
  60451. const m = a(u, (Z) => A.getHeight(Z));
  60452. I.move({ top: u === 0 ? 0 : i - m });
  60453. }
  60454. }
  60455. }, o = (b) => {
  60456. if (b > 0) {
  60457. const u = C.scroll.ci + 1;
  60458. if (u < s.len) {
  60459. const m = a(u, (Z) => s.getWidth(Z));
  60460. g.move({ left: e + m - 1 });
  60461. }
  60462. } else {
  60463. const u = C.scroll.ci - 1;
  60464. if (u >= 0) {
  60465. const m = a(u, (Z) => s.getWidth(Z));
  60466. g.move({ left: u === 0 ? 0 : e - m });
  60467. }
  60468. }
  60469. }, c = Math.abs(l), r = Math.abs(n), h = Math.max(c, r);
  60470. /Firefox/i.test(window.navigator.userAgent) && vX(d(t.detail), 50), h === r && vX(o(n), 50), h === c && vX(d(l), 50);
  60471. }
  60472. function sZg(t, I) {
  60473. const { verticalScrollbar: g, horizontalScrollbar: C } = this, { top: i } = g.scroll(), { left: e } = C.scroll();
  60474. t === "left" || t === "right" ? C.move({ left: e - I }) : (t === "up" || t === "down") && g.move({ top: i - I });
  60475. }
  60476. function g1() {
  60477. const { data: t, verticalScrollbar: I } = this, { height: g } = this.getTableOffset(), C = t.exceptRowTotalHeight(0, -1);
  60478. I.set(g, t.rows.totalHeight() - C);
  60479. }
  60480. function I1() {
  60481. const { data: t, horizontalScrollbar: I } = this, { width: g } = this.getTableOffset();
  60482. t && I.set(g, t.cols.totalWidth());
  60483. }
  60484. function lZg() {
  60485. const {
  60486. selector: t,
  60487. data: I,
  60488. editor: g
  60489. } = this, [C, i] = I.freeze;
  60490. if (C > 0 || i > 0) {
  60491. const e = I.freezeTotalWidth(), A = I.freezeTotalHeight();
  60492. g.setFreezeLengths(e, A);
  60493. }
  60494. t.resetAreaOffset();
  60495. }
  60496. function qi() {
  60497. const {
  60498. tableEl: t,
  60499. overlayerEl: I,
  60500. overlayerCEl: g,
  60501. table: C,
  60502. toolbar: i,
  60503. selector: e,
  60504. el: A
  60505. } = this, s = this.getTableOffset(), l = this.getRect();
  60506. t.attr(l), I.offset(l), g.offset(s), A.css("width", `${l.width}px`), g1.call(this), I1.call(this), lZg.call(this), C.render(), i.reset(), e.reset();
  60507. }
  60508. function GG() {
  60509. const { data: t, selector: I } = this;
  60510. t.clearClipboard(), I.hideClipboard();
  60511. }
  60512. function i9() {
  60513. const { data: t, selector: I } = this;
  60514. t.copy(), t.copyToSystemClipboard(), I.showClipboard();
  60515. }
  60516. function g$() {
  60517. const { data: t, selector: I } = this;
  60518. t.cut(), I.showClipboard();
  60519. }
  60520. function rm(t, I) {
  60521. const { data: g } = this;
  60522. if (g.settings.mode !== "read") {
  60523. if (g.paste(t, (C) => Wig("Tip", C)))
  60524. qi.call(this);
  60525. else if (I) {
  60526. const C = I.clipboardData.getData("text/plain");
  60527. this.data.pasteFromText(C), qi.call(this);
  60528. }
  60529. }
  60530. }
  60531. function nZg() {
  60532. this.data.hideRowsOrCols(), qi.call(this);
  60533. }
  60534. function I$(t, I) {
  60535. this.data.unhideRowsOrCols(t, I), qi.call(this);
  60536. }
  60537. function aZg() {
  60538. const { data: t } = this;
  60539. t.autofilter(), qi.call(this);
  60540. }
  60541. function oZg() {
  60542. const { toolbar: t } = this;
  60543. t.paintformatActive() && (rm.call(this, "format"), GG.call(this), t.paintformatToggle());
  60544. }
  60545. function C$(t) {
  60546. const {
  60547. selector: I,
  60548. data: g,
  60549. table: C,
  60550. sortFilter: i
  60551. } = this, { offsetX: e, offsetY: A } = t, s = t.target.className === `${Lg}-selector-corner`, l = g.getCellRectByXY(e, A), {
  60552. left: n,
  60553. top: a,
  60554. width: d,
  60555. height: o
  60556. } = l;
  60557. let { ri: c, ci: r } = l;
  60558. const { autoFilter: h } = g;
  60559. if (h.includes(c, r) && n + d - 20 < e && a + o - 20 < A) {
  60560. const b = h.items(r, (u, m) => g.rows.getCell(u, m));
  60561. i.hide(), i.set(r, b, h.getFilter(r), h.getSort(r)), i.setOffset({ left: n, top: a + o + 2 });
  60562. return;
  60563. }
  60564. t.shiftKey || (s ? I.showAutofill(c, r) : od.call(this, !1, c, r), aig(window, (b) => {
  60565. ({ ri: c, ci: r } = g.getCellRectByXY(b.offsetX, b.offsetY)), s ? I.showAutofill(c, r) : b.buttons === 1 && !b.shiftKey && od.call(this, !0, c, r, !0, !0);
  60566. }, () => {
  60567. s && I.arange && g.settings.mode !== "read" && g.autofill(I.arange, "all", (b) => Wig("Tip", b)) && C.render(), I.hideAutofill(), oZg.call(this);
  60568. })), !s && t.buttons === 1 && t.shiftKey && od.call(this, !0, c, r);
  60569. }
  60570. function wG() {
  60571. const { editor: t, data: I } = this, g = I.getSelectedRect(), C = this.getTableOffset();
  60572. let i = "top";
  60573. g.top > C.height / 2 && (i = "bottom"), t.setOffset(g, i);
  60574. }
  60575. function hm() {
  60576. const { editor: t, data: I } = this;
  60577. I.settings.mode !== "read" && (wG.call(this), t.setCell(I.getSelectedCell(), I.getSelectedValidator()), GG.call(this));
  60578. }
  60579. function cZg(t) {
  60580. const { data: I, table: g, selector: C } = this;
  60581. I.scrolly(t, () => {
  60582. C.resetBRLAreaOffset(), wG.call(this), g.render();
  60583. });
  60584. }
  60585. function dZg(t) {
  60586. const { data: I, table: g, selector: C } = this;
  60587. I.scrollx(t, () => {
  60588. C.resetBRTAreaOffset(), wG.call(this), g.render();
  60589. });
  60590. }
  60591. function rZg(t, I) {
  60592. const { ri: g } = t, { table: C, selector: i, data: e } = this;
  60593. e.rows.setHeight(g, I), C.render(), i.resetAreaOffset(), g1.call(this), wG.call(this);
  60594. }
  60595. function hZg(t, I) {
  60596. const { ci: g } = t, { table: C, selector: i, data: e } = this;
  60597. e.cols.setWidth(g, I), C.render(), i.resetAreaOffset(), I1.call(this), wG.call(this);
  60598. }
  60599. function TX(t, I = "finished") {
  60600. const { data: g, table: C } = this;
  60601. if (g.settings.mode === "read") return;
  60602. g.setSelectedCellText(t, I);
  60603. const { ri: i, ci: e } = g.selector;
  60604. I === "finished" ? C.render() : this.trigger("cell-edited", t, i, e);
  60605. }
  60606. function $N(t) {
  60607. const { data: I } = this;
  60608. I.settings.mode !== "read" && (t === "insert-row" ? I.insert("row") : t === "delete-row" ? I.delete("row") : t === "insert-column" ? I.insert("column") : t === "delete-column" ? I.delete("column") : t === "delete-cell" ? I.deleteCell() : t === "delete-cell-format" ? I.deleteCell("format") : t === "delete-cell-text" ? I.deleteCell("text") : t === "cell-printable" ? I.setSelectedCellAttr("printable", !0) : t === "cell-non-printable" ? I.setSelectedCellAttr("printable", !1) : t === "cell-editable" ? I.setSelectedCellAttr("editable", !0) : t === "cell-non-editable" && I.setSelectedCellAttr("editable", !1), GG.call(this), qi.call(this));
  60609. }
  60610. function bZg(t, I) {
  60611. const { data: g } = this;
  60612. if (t === "undo")
  60613. this.undo();
  60614. else if (t === "redo")
  60615. this.redo();
  60616. else if (t === "print")
  60617. this.print.preview();
  60618. else if (t === "paintformat")
  60619. I === !0 ? i9.call(this) : GG.call(this);
  60620. else if (t === "clearformat")
  60621. $N.call(this, "delete-cell-format");
  60622. else if (t !== "link") {
  60623. if (t !== "chart") if (t === "autofilter")
  60624. aZg.call(this);
  60625. else if (t === "freeze")
  60626. if (I) {
  60627. const { ri: C, ci: i } = g.selector;
  60628. this.freeze(C, i);
  60629. } else
  60630. this.freeze(0, 0);
  60631. else
  60632. g.setSelectedCellAttr(t, I), t === "formula" && !g.selector.multiple() && hm.call(this), qi.call(this);
  60633. }
  60634. }
  60635. function uZg(t, I, g, C) {
  60636. this.data.setAutoFilter(t, I, g, C), qi.call(this);
  60637. }
  60638. function mZg() {
  60639. const {
  60640. selector: t,
  60641. overlayerEl: I,
  60642. rowResizer: g,
  60643. colResizer: C,
  60644. verticalScrollbar: i,
  60645. horizontalScrollbar: e,
  60646. editor: A,
  60647. contextMenu: s,
  60648. toolbar: l,
  60649. modalValidation: n,
  60650. sortFilter: a
  60651. } = this;
  60652. I.on("mousemove", (d) => {
  60653. eZg.call(this, d);
  60654. }).on("mousedown", (d) => {
  60655. A.clear(), s.hide(), d.buttons === 2 ? (this.data.xyInSelectedRect(d.offsetX, d.offsetY) || C$.call(this, d), s.setPosition(d.offsetX, d.offsetY), d.stopPropagation()) : d.detail === 2 ? hm.call(this) : C$.call(this, d);
  60656. }).on("mousewheel.stop", (d) => {
  60657. AZg.call(this, d);
  60658. }).on("mouseout", (d) => {
  60659. const { offsetX: o, offsetY: c } = d;
  60660. c <= 0 && C.hide(), o <= 0 && g.hide();
  60661. }), t.inputChange = (d) => {
  60662. TX.call(this, d, "input"), hm.call(this);
  60663. }, yug(I.el, {
  60664. move: (d, o) => {
  60665. sZg.call(this, d, o);
  60666. }
  60667. }), l.change = (d, o) => bZg.call(this, d, o), a.ok = (d, o, c, r) => uZg.call(this, d, o, c, r), g.finishedFn = (d, o) => {
  60668. rZg.call(this, d, o);
  60669. }, C.finishedFn = (d, o) => {
  60670. hZg.call(this, d, o);
  60671. }, g.unhideFn = (d) => {
  60672. I$.call(this, "row", d);
  60673. }, C.unhideFn = (d) => {
  60674. I$.call(this, "col", d);
  60675. }, i.moveFn = (d, o) => {
  60676. cZg.call(this, d, o);
  60677. }, e.moveFn = (d, o) => {
  60678. dZg.call(this, d, o);
  60679. }, A.change = (d, o) => {
  60680. TX.call(this, o, d);
  60681. }, n.change = (d, ...o) => {
  60682. d === "save" ? this.data.addValidation(...o) : this.data.removeValidation();
  60683. }, s.itemClick = (d) => {
  60684. d === "validation" ? n.setValue(this.data.getSelectedValidation()) : d === "copy" ? i9.call(this) : d === "cut" ? g$.call(this) : d === "paste" ? rm.call(this, "all") : d === "paste-value" ? rm.call(this, "text") : d === "paste-format" ? rm.call(this, "format") : d === "hide" ? nZg.call(this) : $N.call(this, d);
  60685. }, $i(window, "resize", () => {
  60686. this.reload();
  60687. }), $i(window, "click", (d) => {
  60688. this.focusing = I.contains(d.target);
  60689. }), $i(window, "paste", (d) => {
  60690. this.focusing && (rm.call(this, "all", d), d.preventDefault());
  60691. }), $i(window, "keydown", (d) => {
  60692. if (!this.focusing) return;
  60693. const o = d.keyCode || d.which, {
  60694. key: c,
  60695. ctrlKey: r,
  60696. shiftKey: h,
  60697. metaKey: b
  60698. } = d;
  60699. if (r || b)
  60700. switch (o) {
  60701. case 90:
  60702. this.undo(), d.preventDefault();
  60703. break;
  60704. case 89:
  60705. this.redo(), d.preventDefault();
  60706. break;
  60707. case 67:
  60708. i9.call(this), d.preventDefault();
  60709. break;
  60710. case 88:
  60711. g$.call(this), d.preventDefault();
  60712. break;
  60713. case 85:
  60714. l.trigger("underline"), d.preventDefault();
  60715. break;
  60716. case 86:
  60717. break;
  60718. case 37:
  60719. cs.call(this, h, "row-first"), d.preventDefault();
  60720. break;
  60721. case 38:
  60722. cs.call(this, h, "col-first"), d.preventDefault();
  60723. break;
  60724. case 39:
  60725. cs.call(this, h, "row-last"), d.preventDefault();
  60726. break;
  60727. case 40:
  60728. cs.call(this, h, "col-last"), d.preventDefault();
  60729. break;
  60730. case 32:
  60731. od.call(this, !1, -1, this.data.selector.ci, !1), d.preventDefault();
  60732. break;
  60733. case 66:
  60734. l.trigger("bold");
  60735. break;
  60736. case 73:
  60737. l.trigger("italic");
  60738. break;
  60739. }
  60740. else {
  60741. switch (o) {
  60742. case 32:
  60743. h && od.call(this, !1, this.data.selector.ri, -1, !1);
  60744. break;
  60745. case 27:
  60746. s.hide(), GG.call(this);
  60747. break;
  60748. case 37:
  60749. cs.call(this, h, "left"), d.preventDefault();
  60750. break;
  60751. case 38:
  60752. cs.call(this, h, "up"), d.preventDefault();
  60753. break;
  60754. case 39:
  60755. cs.call(this, h, "right"), d.preventDefault();
  60756. break;
  60757. case 40:
  60758. cs.call(this, h, "down"), d.preventDefault();
  60759. break;
  60760. case 9:
  60761. A.clear(), cs.call(this, !1, h ? "left" : "right"), d.preventDefault();
  60762. break;
  60763. case 13:
  60764. A.clear(), cs.call(this, !1, h ? "up" : "down"), d.preventDefault();
  60765. break;
  60766. case 8:
  60767. $N.call(this, "delete-cell-text"), d.preventDefault();
  60768. break;
  60769. }
  60770. c === "Delete" ? ($N.call(this, "delete-cell-text"), d.preventDefault()) : o >= 65 && o <= 90 || o >= 48 && o <= 57 || o >= 96 && o <= 105 || d.key === "=" ? (TX.call(this, d.key, "input"), hm.call(this)) : o === 113 && hm.call(this);
  60771. }
  60772. });
  60773. }
  60774. class ZZg {
  60775. constructor(I, g) {
  60776. this.eventMap = Yug();
  60777. const { view: C, showToolbar: i, showContextmenu: e } = g.settings;
  60778. this.el = yg("div", `${Lg}-sheet`), this.toolbar = new qmg(g, C.width, !i), this.print = new lmg(g), I.children(this.toolbar.el, this.el, this.print.el), this.data = g, this.tableEl = yg("canvas", `${Lg}-table`), this.rowResizer = new kq(!1, g.rows.height), this.colResizer = new kq(!0, g.cols.minWidth), this.verticalScrollbar = new zq(!0), this.horizontalScrollbar = new zq(!1), this.editor = new xug(
  60779. _ug,
  60780. () => this.getTableOffset(),
  60781. g.rows.height
  60782. ), this.modalValidation = new IZg(), this.contextMenu = new cmg(() => this.getRect(), !e), this.selector = new Mug(g), this.overlayerCEl = yg("div", `${Lg}-overlayer-content`).children(
  60783. this.editor.el,
  60784. this.selector.el
  60785. ), this.overlayerEl = yg("div", `${Lg}-overlayer`).child(this.overlayerCEl), this.sortFilter = new tZg(), this.el.children(
  60786. this.tableEl,
  60787. this.overlayerEl.el,
  60788. this.rowResizer.el,
  60789. this.colResizer.el,
  60790. this.verticalScrollbar.el,
  60791. this.horizontalScrollbar.el,
  60792. this.contextMenu.el,
  60793. this.modalValidation.el,
  60794. this.sortFilter.el
  60795. ), this.table = new emg(this.tableEl.el, g), mZg.call(this), qi.call(this), od.call(this, !1, 0, 0);
  60796. }
  60797. on(I, g) {
  60798. return this.eventMap.on(I, g), this;
  60799. }
  60800. trigger(I, ...g) {
  60801. const { eventMap: C } = this;
  60802. C.fire(I, g);
  60803. }
  60804. resetData(I) {
  60805. this.editor.clear(), this.data = I, g1.call(this), I1.call(this), this.toolbar.resetData(I), this.print.resetData(I), this.selector.resetData(I), this.table.resetData(I);
  60806. }
  60807. loadData(I) {
  60808. return this.data.setData(I), qi.call(this), this;
  60809. }
  60810. // freeze rows or cols
  60811. freeze(I, g) {
  60812. const { data: C } = this;
  60813. return C.setFreeze(I, g), qi.call(this), this;
  60814. }
  60815. undo() {
  60816. this.data.undo(), qi.call(this);
  60817. }
  60818. redo() {
  60819. this.data.redo(), qi.call(this);
  60820. }
  60821. reload() {
  60822. return qi.call(this), this;
  60823. }
  60824. getRect() {
  60825. const { data: I } = this;
  60826. return { width: I.viewWidth(), height: I.viewHeight() };
  60827. }
  60828. getTableOffset() {
  60829. const { rows: I, cols: g } = this.data, { width: C, height: i } = this.getRect();
  60830. return {
  60831. width: C - g.indexWidth,
  60832. height: i - I.height,
  60833. left: g.indexWidth,
  60834. top: I.height
  60835. };
  60836. }
  60837. }
  60838. class GZg extends Ls {
  60839. constructor(I) {
  60840. const g = new pi("ellipsis");
  60841. super(g, "auto", !1, "top-left"), this.contentClick = I;
  60842. }
  60843. reset(I) {
  60844. const g = I.map((C, i) => yg("div", `${Lg}-item`).css("width", "150px").css("font-weight", "normal").on("click", () => {
  60845. this.contentClick(i), this.hide();
  60846. }).child(C));
  60847. this.setContentChildren(...g);
  60848. }
  60849. setTitle() {
  60850. }
  60851. }
  60852. const wZg = [
  60853. { key: "delete", title: $I("contextmenu.deleteSheet") }
  60854. ];
  60855. function pZg(t) {
  60856. return yg("div", `${Lg}-item`).child(t.title()).on("click", () => {
  60857. this.itemClick(t.key), this.hide();
  60858. });
  60859. }
  60860. function BZg() {
  60861. return wZg.map((t) => pZg.call(this, t));
  60862. }
  60863. class WZg {
  60864. constructor() {
  60865. this.el = yg("div", `${Lg}-contextmenu`).css("width", "160px").children(...BZg.call(this)).hide(), this.itemClick = () => {
  60866. };
  60867. }
  60868. hide() {
  60869. const { el: I } = this;
  60870. I.hide(), X0(I);
  60871. }
  60872. setOffset(I) {
  60873. const { el: g } = this;
  60874. g.offset(I), g.show(), ZG(g);
  60875. }
  60876. }
  60877. class yZg {
  60878. constructor(I = () => {
  60879. }, g = () => {
  60880. }, C = () => {
  60881. }, i = () => {
  60882. }) {
  60883. this.swapFunc = g, this.updateFunc = i, this.dataNames = [], this.activeEl = null, this.deleteEl = null, this.items = [], this.moreEl = new GZg((e) => {
  60884. this.clickSwap2(this.items[e]);
  60885. }), this.contextMenu = new WZg(), this.contextMenu.itemClick = C, this.el = yg("div", `${Lg}-bottombar`).children(
  60886. this.contextMenu.el,
  60887. this.menuEl = yg("ul", `${Lg}-menu`).child(
  60888. yg("li", "").children(
  60889. new pi("add").on("click", () => {
  60890. I();
  60891. }),
  60892. yg("span", "").child(this.moreEl)
  60893. )
  60894. )
  60895. );
  60896. }
  60897. addItem(I, g) {
  60898. this.dataNames.push(I);
  60899. const C = yg("li", g ? "active" : "").child(I);
  60900. C.on("click", () => {
  60901. this.clickSwap2(C);
  60902. }).on("contextmenu", (i) => {
  60903. const { offsetLeft: e, offsetHeight: A } = i.target;
  60904. this.contextMenu.setOffset({ left: e, bottom: A + 1 }), this.deleteEl = C;
  60905. }).on("dblclick", () => {
  60906. const i = C.html(), e = new eh("auto", "");
  60907. e.val(i), e.input.on("blur", ({ target: A }) => {
  60908. const { value: s } = A, l = this.dataNames.findIndex((n) => n === i);
  60909. this.renameItem(l, s);
  60910. }), C.html("").child(e.el), e.focus();
  60911. }), g && this.clickSwap(C), this.items.push(C), this.menuEl.child(C), this.moreEl.reset(this.dataNames);
  60912. }
  60913. renameItem(I, g) {
  60914. this.dataNames.splice(I, 1, g), this.moreEl.reset(this.dataNames), this.items[I].html("").child(g), this.updateFunc(I, g);
  60915. }
  60916. clear() {
  60917. this.items.forEach((I) => {
  60918. this.menuEl.removeChild(I.el);
  60919. }), this.items = [], this.dataNames = [], this.moreEl.reset(this.dataNames);
  60920. }
  60921. deleteItem() {
  60922. const { activeEl: I, deleteEl: g } = this;
  60923. if (this.items.length > 1) {
  60924. const C = this.items.findIndex((i) => i === g);
  60925. if (this.items.splice(C, 1), this.dataNames.splice(C, 1), this.menuEl.removeChild(g.el), this.moreEl.reset(this.dataNames), I === g) {
  60926. const [i] = this.items;
  60927. return this.activeEl = i, this.activeEl.toggle(), [C, 0];
  60928. }
  60929. return [C, -1];
  60930. }
  60931. return [-1];
  60932. }
  60933. clickSwap2(I) {
  60934. const g = this.items.findIndex((C) => C === I);
  60935. this.clickSwap(I), this.activeEl.toggle(), this.swapFunc(g);
  60936. }
  60937. clickSwap(I) {
  60938. this.activeEl !== null && this.activeEl.toggle(), this.activeEl = I;
  60939. }
  60940. }
  60941. class e9 {
  60942. constructor(I, g = {}) {
  60943. let C = I;
  60944. this.options = { showBottomBar: !0, ...g }, this.sheetIndex = 1, this.datas = [], typeof I == "string" && (C = document.querySelector(I)), this.bottombar = this.options.showBottomBar ? new yZg(() => {
  60945. const e = this.addSheet();
  60946. this.sheet.resetData(e);
  60947. }, (e) => {
  60948. const A = this.datas[e];
  60949. this.sheet.resetData(A);
  60950. }, () => {
  60951. this.deleteSheet();
  60952. }, (e, A) => {
  60953. this.datas[e].name = A;
  60954. }) : null, this.data = this.addSheet();
  60955. const i = yg("div", `${Lg}`).on("contextmenu", (e) => e.preventDefault());
  60956. C.appendChild(i.el), this.sheet = new ZZg(i, this.data), this.bottombar !== null && i.child(this.bottombar.el);
  60957. }
  60958. addSheet(I, g = !0) {
  60959. const C = I || `sheet${this.sheetIndex}`, i = new Wug(C, this.options);
  60960. return i.change = (...e) => {
  60961. this.sheet.trigger("change", ...e);
  60962. }, this.datas.push(i), this.bottombar !== null && this.bottombar.addItem(C, g), this.sheetIndex += 1, i;
  60963. }
  60964. deleteSheet() {
  60965. if (this.bottombar === null) return;
  60966. const [I, g] = this.bottombar.deleteItem();
  60967. I >= 0 && (this.datas.splice(I, 1), g >= 0 && this.sheet.resetData(this.datas[g]));
  60968. }
  60969. loadData(I) {
  60970. const g = Array.isArray(I) ? I : [I];
  60971. if (this.bottombar !== null && this.bottombar.clear(), this.datas = [], g.length > 0)
  60972. for (let C = 0; C < g.length; C += 1) {
  60973. const i = g[C], e = this.addSheet(i.name, C === 0);
  60974. e.setData(i), C === 0 && this.sheet.resetData(e);
  60975. }
  60976. return this;
  60977. }
  60978. getData() {
  60979. return this.datas.map((I) => I.getData());
  60980. }
  60981. cellText(I, g, C, i = 0) {
  60982. return this.datas[i].setCellText(I, g, C, "finished"), this;
  60983. }
  60984. cell(I, g, C = 0) {
  60985. return this.datas[C].getCell(I, g);
  60986. }
  60987. cellStyle(I, g, C = 0) {
  60988. return this.datas[C].getCellStyle(I, g);
  60989. }
  60990. reRender() {
  60991. return this.sheet.table.render(), this;
  60992. }
  60993. on(I, g) {
  60994. return this.sheet.on(I, g), this;
  60995. }
  60996. validate() {
  60997. const { validations: I } = this.data;
  60998. return I.errors.size <= 0;
  60999. }
  61000. change(I) {
  61001. return this.sheet.on("change", I), this;
  61002. }
  61003. static locale(I, g) {
  61004. lig(I, g);
  61005. }
  61006. }
  61007. const YZg = (t, I = {}) => new e9(t, I);
  61008. window && (window.x_spreadsheet = YZg, window.x_spreadsheet.locale = (t, I) => lig(t, I));
  61009. const t$ = [
  61010. "000000",
  61011. "FFFFFF",
  61012. "FF0000",
  61013. "00FF00",
  61014. "0000FF",
  61015. "FFFF00",
  61016. "FF00FF",
  61017. "00FFFF",
  61018. "000000",
  61019. "FFFFFF",
  61020. "FF0000",
  61021. "00FF00",
  61022. "0000FF",
  61023. "FFFF00",
  61024. "FF00FF",
  61025. "00FFFF",
  61026. "800000",
  61027. "008000",
  61028. "000080",
  61029. "808000",
  61030. "800080",
  61031. "008080",
  61032. "C0C0C0",
  61033. "808080",
  61034. "9999FF",
  61035. "993366",
  61036. "FFFFCC",
  61037. "CCFFFF",
  61038. "660066",
  61039. "FF8080",
  61040. "0066CC",
  61041. "CCCCFF",
  61042. "000080",
  61043. "FF00FF",
  61044. "FFFF00",
  61045. "00FFFF",
  61046. "800080",
  61047. "800000",
  61048. "008080",
  61049. "0000FF",
  61050. "00CCFF",
  61051. "CCFFFF",
  61052. "CCFFCC",
  61053. "FFFF99",
  61054. "99CCFF",
  61055. "FF99CC",
  61056. "CC99FF",
  61057. "FFCC99",
  61058. "3366FF",
  61059. "33CCCC",
  61060. "99CC00",
  61061. "FFCC00",
  61062. "FF9900",
  61063. "FF6600",
  61064. "666699",
  61065. "969696",
  61066. "003366",
  61067. "339966",
  61068. "003300",
  61069. "333300",
  61070. "993300",
  61071. "993366",
  61072. "333399",
  61073. "333333",
  61074. "b7e0ff",
  61075. "00CCFF"
  61076. ];
  61077. function RV(t) {
  61078. "@babel/helpers - typeof";
  61079. return RV = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(I) {
  61080. return typeof I;
  61081. } : function(I) {
  61082. return I && typeof Symbol == "function" && I.constructor === Symbol && I !== Symbol.prototype ? "symbol" : typeof I;
  61083. }, RV(t);
  61084. }
  61085. var NZg = /^\s+/, VZg = /\s+$/;
  61086. function lI(t, I) {
  61087. if (t = t || "", I = I || {}, t instanceof lI)
  61088. return t;
  61089. if (!(this instanceof lI))
  61090. return new lI(t, I);
  61091. var g = MZg(t);
  61092. this._originalInput = t, this._r = g.r, this._g = g.g, this._b = g.b, this._a = g.a, this._roundA = Math.round(100 * this._a) / 100, this._format = I.format || g.format, this._gradientType = I.gradientType, this._r < 1 && (this._r = Math.round(this._r)), this._g < 1 && (this._g = Math.round(this._g)), this._b < 1 && (this._b = Math.round(this._b)), this._ok = g.ok;
  61093. }
  61094. lI.prototype = {
  61095. isDark: function() {
  61096. return this.getBrightness() < 128;
  61097. },
  61098. isLight: function() {
  61099. return !this.isDark();
  61100. },
  61101. isValid: function() {
  61102. return this._ok;
  61103. },
  61104. getOriginalInput: function() {
  61105. return this._originalInput;
  61106. },
  61107. getFormat: function() {
  61108. return this._format;
  61109. },
  61110. getAlpha: function() {
  61111. return this._a;
  61112. },
  61113. getBrightness: function() {
  61114. var I = this.toRgb();
  61115. return (I.r * 299 + I.g * 587 + I.b * 114) / 1e3;
  61116. },
  61117. getLuminance: function() {
  61118. var I = this.toRgb(), g, C, i, e, A, s;
  61119. return g = I.r / 255, C = I.g / 255, i = I.b / 255, g <= 0.03928 ? e = g / 12.92 : e = Math.pow((g + 0.055) / 1.055, 2.4), C <= 0.03928 ? A = C / 12.92 : A = Math.pow((C + 0.055) / 1.055, 2.4), i <= 0.03928 ? s = i / 12.92 : s = Math.pow((i + 0.055) / 1.055, 2.4), 0.2126 * e + 0.7152 * A + 0.0722 * s;
  61120. },
  61121. setAlpha: function(I) {
  61122. return this._a = yig(I), this._roundA = Math.round(100 * this._a) / 100, this;
  61123. },
  61124. toHsv: function() {
  61125. var I = e$(this._r, this._g, this._b);
  61126. return {
  61127. h: I.h * 360,
  61128. s: I.s,
  61129. v: I.v,
  61130. a: this._a
  61131. };
  61132. },
  61133. toHsvString: function() {
  61134. var I = e$(this._r, this._g, this._b), g = Math.round(I.h * 360), C = Math.round(I.s * 100), i = Math.round(I.v * 100);
  61135. return this._a == 1 ? "hsv(" + g + ", " + C + "%, " + i + "%)" : "hsva(" + g + ", " + C + "%, " + i + "%, " + this._roundA + ")";
  61136. },
  61137. toHsl: function() {
  61138. var I = i$(this._r, this._g, this._b);
  61139. return {
  61140. h: I.h * 360,
  61141. s: I.s,
  61142. l: I.l,
  61143. a: this._a
  61144. };
  61145. },
  61146. toHslString: function() {
  61147. var I = i$(this._r, this._g, this._b), g = Math.round(I.h * 360), C = Math.round(I.s * 100), i = Math.round(I.l * 100);
  61148. return this._a == 1 ? "hsl(" + g + ", " + C + "%, " + i + "%)" : "hsla(" + g + ", " + C + "%, " + i + "%, " + this._roundA + ")";
  61149. },
  61150. toHex: function(I) {
  61151. return A$(this._r, this._g, this._b, I);
  61152. },
  61153. toHexString: function(I) {
  61154. return "#" + this.toHex(I);
  61155. },
  61156. toHex8: function(I) {
  61157. return XZg(this._r, this._g, this._b, this._a, I);
  61158. },
  61159. toHex8String: function(I) {
  61160. return "#" + this.toHex8(I);
  61161. },
  61162. toRgb: function() {
  61163. return {
  61164. r: Math.round(this._r),
  61165. g: Math.round(this._g),
  61166. b: Math.round(this._b),
  61167. a: this._a
  61168. };
  61169. },
  61170. toRgbString: function() {
  61171. return this._a == 1 ? "rgb(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ")" : "rgba(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ", " + this._roundA + ")";
  61172. },
  61173. toPercentageRgb: function() {
  61174. return {
  61175. r: Math.round(LC(this._r, 255) * 100) + "%",
  61176. g: Math.round(LC(this._g, 255) * 100) + "%",
  61177. b: Math.round(LC(this._b, 255) * 100) + "%",
  61178. a: this._a
  61179. };
  61180. },
  61181. toPercentageRgbString: function() {
  61182. return this._a == 1 ? "rgb(" + Math.round(LC(this._r, 255) * 100) + "%, " + Math.round(LC(this._g, 255) * 100) + "%, " + Math.round(LC(this._b, 255) * 100) + "%)" : "rgba(" + Math.round(LC(this._r, 255) * 100) + "%, " + Math.round(LC(this._g, 255) * 100) + "%, " + Math.round(LC(this._b, 255) * 100) + "%, " + this._roundA + ")";
  61183. },
  61184. toName: function() {
  61185. return this._a === 0 ? "transparent" : this._a < 1 ? !1 : jZg[A$(this._r, this._g, this._b, !0)] || !1;
  61186. },
  61187. toFilter: function(I) {
  61188. var g = "#" + s$(this._r, this._g, this._b, this._a), C = g, i = this._gradientType ? "GradientType = 1, " : "";
  61189. if (I) {
  61190. var e = lI(I);
  61191. C = "#" + s$(e._r, e._g, e._b, e._a);
  61192. }
  61193. return "progid:DXImageTransform.Microsoft.gradient(" + i + "startColorstr=" + g + ",endColorstr=" + C + ")";
  61194. },
  61195. toString: function(I) {
  61196. var g = !!I;
  61197. I = I || this._format;
  61198. var C = !1, i = this._a < 1 && this._a >= 0, e = !g && i && (I === "hex" || I === "hex6" || I === "hex3" || I === "hex4" || I === "hex8" || I === "name");
  61199. return e ? I === "name" && this._a === 0 ? this.toName() : this.toRgbString() : (I === "rgb" && (C = this.toRgbString()), I === "prgb" && (C = this.toPercentageRgbString()), (I === "hex" || I === "hex6") && (C = this.toHexString()), I === "hex3" && (C = this.toHexString(!0)), I === "hex4" && (C = this.toHex8String(!0)), I === "hex8" && (C = this.toHex8String()), I === "name" && (C = this.toName()), I === "hsl" && (C = this.toHslString()), I === "hsv" && (C = this.toHsvString()), C || this.toHexString());
  61200. },
  61201. clone: function() {
  61202. return lI(this.toString());
  61203. },
  61204. _applyModification: function(I, g) {
  61205. var C = I.apply(null, [this].concat([].slice.call(g)));
  61206. return this._r = C._r, this._g = C._g, this._b = C._b, this.setAlpha(C._a), this;
  61207. },
  61208. lighten: function() {
  61209. return this._applyModification(FZg, arguments);
  61210. },
  61211. brighten: function() {
  61212. return this._applyModification(kZg, arguments);
  61213. },
  61214. darken: function() {
  61215. return this._applyModification(zZg, arguments);
  61216. },
  61217. desaturate: function() {
  61218. return this._applyModification(SZg, arguments);
  61219. },
  61220. saturate: function() {
  61221. return this._applyModification(DZg, arguments);
  61222. },
  61223. greyscale: function() {
  61224. return this._applyModification(KZg, arguments);
  61225. },
  61226. spin: function() {
  61227. return this._applyModification(JZg, arguments);
  61228. },
  61229. _applyCombination: function(I, g) {
  61230. return I.apply(null, [this].concat([].slice.call(g)));
  61231. },
  61232. analogous: function() {
  61233. return this._applyCombination(TZg, arguments);
  61234. },
  61235. complement: function() {
  61236. return this._applyCombination(LZg, arguments);
  61237. },
  61238. monochromatic: function() {
  61239. return this._applyCombination(xZg, arguments);
  61240. },
  61241. splitcomplement: function() {
  61242. return this._applyCombination(vZg, arguments);
  61243. },
  61244. // Disabled until https://github.com/bgrins/TinyColor/issues/254
  61245. // polyad: function (number) {
  61246. // return this._applyCombination(polyad, [number]);
  61247. // },
  61248. triad: function() {
  61249. return this._applyCombination(l$, [3]);
  61250. },
  61251. tetrad: function() {
  61252. return this._applyCombination(l$, [4]);
  61253. }
  61254. };
  61255. lI.fromRatio = function(t, I) {
  61256. if (RV(t) == "object") {
  61257. var g = {};
  61258. for (var C in t)
  61259. t.hasOwnProperty(C) && (C === "a" ? g[C] = t[C] : g[C] = bm(t[C]));
  61260. t = g;
  61261. }
  61262. return lI(t, I);
  61263. };
  61264. function MZg(t) {
  61265. var I = {
  61266. r: 0,
  61267. g: 0,
  61268. b: 0
  61269. }, g = 1, C = null, i = null, e = null, A = !1, s = !1;
  61270. return typeof t == "string" && (t = EZg(t)), RV(t) == "object" && (cl(t.r) && cl(t.g) && cl(t.b) ? (I = RZg(t.r, t.g, t.b), A = !0, s = String(t.r).substr(-1) === "%" ? "prgb" : "rgb") : cl(t.h) && cl(t.s) && cl(t.v) ? (C = bm(t.s), i = bm(t.v), I = HZg(t.h, C, i), A = !0, s = "hsv") : cl(t.h) && cl(t.s) && cl(t.l) && (C = bm(t.s), e = bm(t.l), I = fZg(t.h, C, e), A = !0, s = "hsl"), t.hasOwnProperty("a") && (g = t.a)), g = yig(g), {
  61271. ok: A,
  61272. format: t.format || s,
  61273. r: Math.min(255, Math.max(I.r, 0)),
  61274. g: Math.min(255, Math.max(I.g, 0)),
  61275. b: Math.min(255, Math.max(I.b, 0)),
  61276. a: g
  61277. };
  61278. }
  61279. function RZg(t, I, g) {
  61280. return {
  61281. r: LC(t, 255) * 255,
  61282. g: LC(I, 255) * 255,
  61283. b: LC(g, 255) * 255
  61284. };
  61285. }
  61286. function i$(t, I, g) {
  61287. t = LC(t, 255), I = LC(I, 255), g = LC(g, 255);
  61288. var C = Math.max(t, I, g), i = Math.min(t, I, g), e, A, s = (C + i) / 2;
  61289. if (C == i)
  61290. e = A = 0;
  61291. else {
  61292. var l = C - i;
  61293. switch (A = s > 0.5 ? l / (2 - C - i) : l / (C + i), C) {
  61294. case t:
  61295. e = (I - g) / l + (I < g ? 6 : 0);
  61296. break;
  61297. case I:
  61298. e = (g - t) / l + 2;
  61299. break;
  61300. case g:
  61301. e = (t - I) / l + 4;
  61302. break;
  61303. }
  61304. e /= 6;
  61305. }
  61306. return {
  61307. h: e,
  61308. s: A,
  61309. l: s
  61310. };
  61311. }
  61312. function fZg(t, I, g) {
  61313. var C, i, e;
  61314. t = LC(t, 360), I = LC(I, 100), g = LC(g, 100);
  61315. function A(n, a, d) {
  61316. return d < 0 && (d += 1), d > 1 && (d -= 1), d < 1 / 6 ? n + (a - n) * 6 * d : d < 1 / 2 ? a : d < 2 / 3 ? n + (a - n) * (2 / 3 - d) * 6 : n;
  61317. }
  61318. if (I === 0)
  61319. C = i = e = g;
  61320. else {
  61321. var s = g < 0.5 ? g * (1 + I) : g + I - g * I, l = 2 * g - s;
  61322. C = A(l, s, t + 1 / 3), i = A(l, s, t), e = A(l, s, t - 1 / 3);
  61323. }
  61324. return {
  61325. r: C * 255,
  61326. g: i * 255,
  61327. b: e * 255
  61328. };
  61329. }
  61330. function e$(t, I, g) {
  61331. t = LC(t, 255), I = LC(I, 255), g = LC(g, 255);
  61332. var C = Math.max(t, I, g), i = Math.min(t, I, g), e, A, s = C, l = C - i;
  61333. if (A = C === 0 ? 0 : l / C, C == i)
  61334. e = 0;
  61335. else {
  61336. switch (C) {
  61337. case t:
  61338. e = (I - g) / l + (I < g ? 6 : 0);
  61339. break;
  61340. case I:
  61341. e = (g - t) / l + 2;
  61342. break;
  61343. case g:
  61344. e = (t - I) / l + 4;
  61345. break;
  61346. }
  61347. e /= 6;
  61348. }
  61349. return {
  61350. h: e,
  61351. s: A,
  61352. v: s
  61353. };
  61354. }
  61355. function HZg(t, I, g) {
  61356. t = LC(t, 360) * 6, I = LC(I, 100), g = LC(g, 100);
  61357. var C = Math.floor(t), i = t - C, e = g * (1 - I), A = g * (1 - i * I), s = g * (1 - (1 - i) * I), l = C % 6, n = [g, A, e, e, s, g][l], a = [s, g, g, A, e, e][l], d = [e, e, s, g, g, A][l];
  61358. return {
  61359. r: n * 255,
  61360. g: a * 255,
  61361. b: d * 255
  61362. };
  61363. }
  61364. function A$(t, I, g, C) {
  61365. var i = [FA(Math.round(t).toString(16)), FA(Math.round(I).toString(16)), FA(Math.round(g).toString(16))];
  61366. return C && i[0].charAt(0) == i[0].charAt(1) && i[1].charAt(0) == i[1].charAt(1) && i[2].charAt(0) == i[2].charAt(1) ? i[0].charAt(0) + i[1].charAt(0) + i[2].charAt(0) : i.join("");
  61367. }
  61368. function XZg(t, I, g, C, i) {
  61369. var e = [FA(Math.round(t).toString(16)), FA(Math.round(I).toString(16)), FA(Math.round(g).toString(16)), FA(Yig(C))];
  61370. return i && e[0].charAt(0) == e[0].charAt(1) && e[1].charAt(0) == e[1].charAt(1) && e[2].charAt(0) == e[2].charAt(1) && e[3].charAt(0) == e[3].charAt(1) ? e[0].charAt(0) + e[1].charAt(0) + e[2].charAt(0) + e[3].charAt(0) : e.join("");
  61371. }
  61372. function s$(t, I, g, C) {
  61373. var i = [FA(Yig(C)), FA(Math.round(t).toString(16)), FA(Math.round(I).toString(16)), FA(Math.round(g).toString(16))];
  61374. return i.join("");
  61375. }
  61376. lI.equals = function(t, I) {
  61377. return !t || !I ? !1 : lI(t).toRgbString() == lI(I).toRgbString();
  61378. };
  61379. lI.random = function() {
  61380. return lI.fromRatio({
  61381. r: Math.random(),
  61382. g: Math.random(),
  61383. b: Math.random()
  61384. });
  61385. };
  61386. function SZg(t, I) {
  61387. I = I === 0 ? 0 : I || 10;
  61388. var g = lI(t).toHsl();
  61389. return g.s -= I / 100, g.s = bM(g.s), lI(g);
  61390. }
  61391. function DZg(t, I) {
  61392. I = I === 0 ? 0 : I || 10;
  61393. var g = lI(t).toHsl();
  61394. return g.s += I / 100, g.s = bM(g.s), lI(g);
  61395. }
  61396. function KZg(t) {
  61397. return lI(t).desaturate(100);
  61398. }
  61399. function FZg(t, I) {
  61400. I = I === 0 ? 0 : I || 10;
  61401. var g = lI(t).toHsl();
  61402. return g.l += I / 100, g.l = bM(g.l), lI(g);
  61403. }
  61404. function kZg(t, I) {
  61405. I = I === 0 ? 0 : I || 10;
  61406. var g = lI(t).toRgb();
  61407. return g.r = Math.max(0, Math.min(255, g.r - Math.round(255 * -(I / 100)))), g.g = Math.max(0, Math.min(255, g.g - Math.round(255 * -(I / 100)))), g.b = Math.max(0, Math.min(255, g.b - Math.round(255 * -(I / 100)))), lI(g);
  61408. }
  61409. function zZg(t, I) {
  61410. I = I === 0 ? 0 : I || 10;
  61411. var g = lI(t).toHsl();
  61412. return g.l -= I / 100, g.l = bM(g.l), lI(g);
  61413. }
  61414. function JZg(t, I) {
  61415. var g = lI(t).toHsl(), C = (g.h + I) % 360;
  61416. return g.h = C < 0 ? 360 + C : C, lI(g);
  61417. }
  61418. function LZg(t) {
  61419. var I = lI(t).toHsl();
  61420. return I.h = (I.h + 180) % 360, lI(I);
  61421. }
  61422. function l$(t, I) {
  61423. if (isNaN(I) || I <= 0)
  61424. throw new Error("Argument to polyad must be a positive number");
  61425. for (var g = lI(t).toHsl(), C = [lI(t)], i = 360 / I, e = 1; e < I; e++)
  61426. C.push(lI({
  61427. h: (g.h + e * i) % 360,
  61428. s: g.s,
  61429. l: g.l
  61430. }));
  61431. return C;
  61432. }
  61433. function vZg(t) {
  61434. var I = lI(t).toHsl(), g = I.h;
  61435. return [lI(t), lI({
  61436. h: (g + 72) % 360,
  61437. s: I.s,
  61438. l: I.l
  61439. }), lI({
  61440. h: (g + 216) % 360,
  61441. s: I.s,
  61442. l: I.l
  61443. })];
  61444. }
  61445. function TZg(t, I, g) {
  61446. I = I || 6, g = g || 30;
  61447. var C = lI(t).toHsl(), i = 360 / g, e = [lI(t)];
  61448. for (C.h = (C.h - (i * I >> 1) + 720) % 360; --I; )
  61449. C.h = (C.h + i) % 360, e.push(lI(C));
  61450. return e;
  61451. }
  61452. function xZg(t, I) {
  61453. I = I || 6;
  61454. for (var g = lI(t).toHsv(), C = g.h, i = g.s, e = g.v, A = [], s = 1 / I; I--; )
  61455. A.push(lI({
  61456. h: C,
  61457. s: i,
  61458. v: e
  61459. })), e = (e + s) % 1;
  61460. return A;
  61461. }
  61462. lI.mix = function(t, I, g) {
  61463. g = g === 0 ? 0 : g || 50;
  61464. var C = lI(t).toRgb(), i = lI(I).toRgb(), e = g / 100, A = {
  61465. r: (i.r - C.r) * e + C.r,
  61466. g: (i.g - C.g) * e + C.g,
  61467. b: (i.b - C.b) * e + C.b,
  61468. a: (i.a - C.a) * e + C.a
  61469. };
  61470. return lI(A);
  61471. };
  61472. lI.readability = function(t, I) {
  61473. var g = lI(t), C = lI(I);
  61474. return (Math.max(g.getLuminance(), C.getLuminance()) + 0.05) / (Math.min(g.getLuminance(), C.getLuminance()) + 0.05);
  61475. };
  61476. lI.isReadable = function(t, I, g) {
  61477. var C = lI.readability(t, I), i, e;
  61478. switch (e = !1, i = PZg(g), i.level + i.size) {
  61479. case "AAsmall":
  61480. case "AAAlarge":
  61481. e = C >= 4.5;
  61482. break;
  61483. case "AAlarge":
  61484. e = C >= 3;
  61485. break;
  61486. case "AAAsmall":
  61487. e = C >= 7;
  61488. break;
  61489. }
  61490. return e;
  61491. };
  61492. lI.mostReadable = function(t, I, g) {
  61493. var C = null, i = 0, e, A, s, l;
  61494. g = g || {}, A = g.includeFallbackColors, s = g.level, l = g.size;
  61495. for (var n = 0; n < I.length; n++)
  61496. e = lI.readability(t, I[n]), e > i && (i = e, C = lI(I[n]));
  61497. return lI.isReadable(t, C, {
  61498. level: s,
  61499. size: l
  61500. }) || !A ? C : (g.includeFallbackColors = !1, lI.mostReadable(t, ["#fff", "#000"], g));
  61501. };
  61502. var A9 = lI.names = {
  61503. aliceblue: "f0f8ff",
  61504. antiquewhite: "faebd7",
  61505. aqua: "0ff",
  61506. aquamarine: "7fffd4",
  61507. azure: "f0ffff",
  61508. beige: "f5f5dc",
  61509. bisque: "ffe4c4",
  61510. black: "000",
  61511. blanchedalmond: "ffebcd",
  61512. blue: "00f",
  61513. blueviolet: "8a2be2",
  61514. brown: "a52a2a",
  61515. burlywood: "deb887",
  61516. burntsienna: "ea7e5d",
  61517. cadetblue: "5f9ea0",
  61518. chartreuse: "7fff00",
  61519. chocolate: "d2691e",
  61520. coral: "ff7f50",
  61521. cornflowerblue: "6495ed",
  61522. cornsilk: "fff8dc",
  61523. crimson: "dc143c",
  61524. cyan: "0ff",
  61525. darkblue: "00008b",
  61526. darkcyan: "008b8b",
  61527. darkgoldenrod: "b8860b",
  61528. darkgray: "a9a9a9",
  61529. darkgreen: "006400",
  61530. darkgrey: "a9a9a9",
  61531. darkkhaki: "bdb76b",
  61532. darkmagenta: "8b008b",
  61533. darkolivegreen: "556b2f",
  61534. darkorange: "ff8c00",
  61535. darkorchid: "9932cc",
  61536. darkred: "8b0000",
  61537. darksalmon: "e9967a",
  61538. darkseagreen: "8fbc8f",
  61539. darkslateblue: "483d8b",
  61540. darkslategray: "2f4f4f",
  61541. darkslategrey: "2f4f4f",
  61542. darkturquoise: "00ced1",
  61543. darkviolet: "9400d3",
  61544. deeppink: "ff1493",
  61545. deepskyblue: "00bfff",
  61546. dimgray: "696969",
  61547. dimgrey: "696969",
  61548. dodgerblue: "1e90ff",
  61549. firebrick: "b22222",
  61550. floralwhite: "fffaf0",
  61551. forestgreen: "228b22",
  61552. fuchsia: "f0f",
  61553. gainsboro: "dcdcdc",
  61554. ghostwhite: "f8f8ff",
  61555. gold: "ffd700",
  61556. goldenrod: "daa520",
  61557. gray: "808080",
  61558. green: "008000",
  61559. greenyellow: "adff2f",
  61560. grey: "808080",
  61561. honeydew: "f0fff0",
  61562. hotpink: "ff69b4",
  61563. indianred: "cd5c5c",
  61564. indigo: "4b0082",
  61565. ivory: "fffff0",
  61566. khaki: "f0e68c",
  61567. lavender: "e6e6fa",
  61568. lavenderblush: "fff0f5",
  61569. lawngreen: "7cfc00",
  61570. lemonchiffon: "fffacd",
  61571. lightblue: "add8e6",
  61572. lightcoral: "f08080",
  61573. lightcyan: "e0ffff",
  61574. lightgoldenrodyellow: "fafad2",
  61575. lightgray: "d3d3d3",
  61576. lightgreen: "90ee90",
  61577. lightgrey: "d3d3d3",
  61578. lightpink: "ffb6c1",
  61579. lightsalmon: "ffa07a",
  61580. lightseagreen: "20b2aa",
  61581. lightskyblue: "87cefa",
  61582. lightslategray: "789",
  61583. lightslategrey: "789",
  61584. lightsteelblue: "b0c4de",
  61585. lightyellow: "ffffe0",
  61586. lime: "0f0",
  61587. limegreen: "32cd32",
  61588. linen: "faf0e6",
  61589. magenta: "f0f",
  61590. maroon: "800000",
  61591. mediumaquamarine: "66cdaa",
  61592. mediumblue: "0000cd",
  61593. mediumorchid: "ba55d3",
  61594. mediumpurple: "9370db",
  61595. mediumseagreen: "3cb371",
  61596. mediumslateblue: "7b68ee",
  61597. mediumspringgreen: "00fa9a",
  61598. mediumturquoise: "48d1cc",
  61599. mediumvioletred: "c71585",
  61600. midnightblue: "191970",
  61601. mintcream: "f5fffa",
  61602. mistyrose: "ffe4e1",
  61603. moccasin: "ffe4b5",
  61604. navajowhite: "ffdead",
  61605. navy: "000080",
  61606. oldlace: "fdf5e6",
  61607. olive: "808000",
  61608. olivedrab: "6b8e23",
  61609. orange: "ffa500",
  61610. orangered: "ff4500",
  61611. orchid: "da70d6",
  61612. palegoldenrod: "eee8aa",
  61613. palegreen: "98fb98",
  61614. paleturquoise: "afeeee",
  61615. palevioletred: "db7093",
  61616. papayawhip: "ffefd5",
  61617. peachpuff: "ffdab9",
  61618. peru: "cd853f",
  61619. pink: "ffc0cb",
  61620. plum: "dda0dd",
  61621. powderblue: "b0e0e6",
  61622. purple: "800080",
  61623. rebeccapurple: "663399",
  61624. red: "f00",
  61625. rosybrown: "bc8f8f",
  61626. royalblue: "4169e1",
  61627. saddlebrown: "8b4513",
  61628. salmon: "fa8072",
  61629. sandybrown: "f4a460",
  61630. seagreen: "2e8b57",
  61631. seashell: "fff5ee",
  61632. sienna: "a0522d",
  61633. silver: "c0c0c0",
  61634. skyblue: "87ceeb",
  61635. slateblue: "6a5acd",
  61636. slategray: "708090",
  61637. slategrey: "708090",
  61638. snow: "fffafa",
  61639. springgreen: "00ff7f",
  61640. steelblue: "4682b4",
  61641. tan: "d2b48c",
  61642. teal: "008080",
  61643. thistle: "d8bfd8",
  61644. tomato: "ff6347",
  61645. turquoise: "40e0d0",
  61646. violet: "ee82ee",
  61647. wheat: "f5deb3",
  61648. white: "fff",
  61649. whitesmoke: "f5f5f5",
  61650. yellow: "ff0",
  61651. yellowgreen: "9acd32"
  61652. }, jZg = lI.hexNames = QZg(A9);
  61653. function QZg(t) {
  61654. var I = {};
  61655. for (var g in t)
  61656. t.hasOwnProperty(g) && (I[t[g]] = g);
  61657. return I;
  61658. }
  61659. function yig(t) {
  61660. return t = parseFloat(t), (isNaN(t) || t < 0 || t > 1) && (t = 1), t;
  61661. }
  61662. function LC(t, I) {
  61663. OZg(t) && (t = "100%");
  61664. var g = UZg(t);
  61665. return t = Math.min(I, Math.max(0, parseFloat(t))), g && (t = parseInt(t * I, 10) / 100), Math.abs(t - I) < 1e-6 ? 1 : t % I / parseFloat(I);
  61666. }
  61667. function bM(t) {
  61668. return Math.min(1, Math.max(0, t));
  61669. }
  61670. function le(t) {
  61671. return parseInt(t, 16);
  61672. }
  61673. function OZg(t) {
  61674. return typeof t == "string" && t.indexOf(".") != -1 && parseFloat(t) === 1;
  61675. }
  61676. function UZg(t) {
  61677. return typeof t == "string" && t.indexOf("%") != -1;
  61678. }
  61679. function FA(t) {
  61680. return t.length == 1 ? "0" + t : "" + t;
  61681. }
  61682. function bm(t) {
  61683. return t <= 1 && (t = t * 100 + "%"), t;
  61684. }
  61685. function Yig(t) {
  61686. return Math.round(parseFloat(t) * 255).toString(16);
  61687. }
  61688. function n$(t) {
  61689. return le(t) / 255;
  61690. }
  61691. var ZA = function() {
  61692. var t = "[-\\+]?\\d+%?", I = "[-\\+]?\\d*\\.\\d+%?", g = "(?:" + I + ")|(?:" + t + ")", C = "[\\s|\\(]+(" + g + ")[,|\\s]+(" + g + ")[,|\\s]+(" + g + ")\\s*\\)?", i = "[\\s|\\(]+(" + g + ")[,|\\s]+(" + g + ")[,|\\s]+(" + g + ")[,|\\s]+(" + g + ")\\s*\\)?";
  61693. return {
  61694. CSS_UNIT: new RegExp(g),
  61695. rgb: new RegExp("rgb" + C),
  61696. rgba: new RegExp("rgba" + i),
  61697. hsl: new RegExp("hsl" + C),
  61698. hsla: new RegExp("hsla" + i),
  61699. hsv: new RegExp("hsv" + C),
  61700. hsva: new RegExp("hsva" + i),
  61701. hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
  61702. hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
  61703. hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
  61704. hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
  61705. };
  61706. }();
  61707. function cl(t) {
  61708. return !!ZA.CSS_UNIT.exec(t);
  61709. }
  61710. function EZg(t) {
  61711. t = t.replace(NZg, "").replace(VZg, "").toLowerCase();
  61712. var I = !1;
  61713. if (A9[t])
  61714. t = A9[t], I = !0;
  61715. else if (t == "transparent")
  61716. return {
  61717. r: 0,
  61718. g: 0,
  61719. b: 0,
  61720. a: 0,
  61721. format: "name"
  61722. };
  61723. var g;
  61724. return (g = ZA.rgb.exec(t)) ? {
  61725. r: g[1],
  61726. g: g[2],
  61727. b: g[3]
  61728. } : (g = ZA.rgba.exec(t)) ? {
  61729. r: g[1],
  61730. g: g[2],
  61731. b: g[3],
  61732. a: g[4]
  61733. } : (g = ZA.hsl.exec(t)) ? {
  61734. h: g[1],
  61735. s: g[2],
  61736. l: g[3]
  61737. } : (g = ZA.hsla.exec(t)) ? {
  61738. h: g[1],
  61739. s: g[2],
  61740. l: g[3],
  61741. a: g[4]
  61742. } : (g = ZA.hsv.exec(t)) ? {
  61743. h: g[1],
  61744. s: g[2],
  61745. v: g[3]
  61746. } : (g = ZA.hsva.exec(t)) ? {
  61747. h: g[1],
  61748. s: g[2],
  61749. v: g[3],
  61750. a: g[4]
  61751. } : (g = ZA.hex8.exec(t)) ? {
  61752. r: le(g[1]),
  61753. g: le(g[2]),
  61754. b: le(g[3]),
  61755. a: n$(g[4]),
  61756. format: I ? "name" : "hex8"
  61757. } : (g = ZA.hex6.exec(t)) ? {
  61758. r: le(g[1]),
  61759. g: le(g[2]),
  61760. b: le(g[3]),
  61761. format: I ? "name" : "hex"
  61762. } : (g = ZA.hex4.exec(t)) ? {
  61763. r: le(g[1] + "" + g[1]),
  61764. g: le(g[2] + "" + g[2]),
  61765. b: le(g[3] + "" + g[3]),
  61766. a: n$(g[4] + "" + g[4]),
  61767. format: I ? "name" : "hex8"
  61768. } : (g = ZA.hex3.exec(t)) ? {
  61769. r: le(g[1] + "" + g[1]),
  61770. g: le(g[2] + "" + g[2]),
  61771. b: le(g[3] + "" + g[3]),
  61772. format: I ? "name" : "hex"
  61773. } : !1;
  61774. }
  61775. function PZg(t) {
  61776. var I, g;
  61777. return t = t || {
  61778. level: "AA",
  61779. size: "small"
  61780. }, I = (t.level || "AA").toUpperCase(), g = (t.size || "small").toLowerCase(), I !== "AA" && I !== "AAA" && (I = "AA"), g !== "small" && g !== "large" && (g = "small"), {
  61781. level: I,
  61782. size: g
  61783. };
  61784. }
  61785. const _Zg = {
  61786. __name: "Table",
  61787. props: {
  61788. workbook: Object
  61789. },
  61790. setup(t) {
  61791. const I = t, g = wi(null), C = wi([]), i = wi(null), e = DA(() => I.workbook.worksheets ? I.workbook.worksheets.filter((Z) => Z._rows.length) : []), A = () => {
  61792. g.value = new e9(i.value, {
  61793. view: {
  61794. height: () => document.documentElement.clientHeight - 120,
  61795. width: () => document.documentElement.clientWidth - 40
  61796. },
  61797. mode: "read",
  61798. // 只读模式
  61799. showToolbar: !1,
  61800. showGrid: !0,
  61801. showContextmenu: !1,
  61802. // 禁用右键菜单提高性能
  61803. multipleSheets: !0,
  61804. rpx: 1,
  61805. // 减少渲染计算
  61806. row: {
  61807. len: 100,
  61808. // 限制初始行数
  61809. height: 25,
  61810. // 固定行高
  61811. autoHeight: !0
  61812. },
  61813. col: {
  61814. len: 26,
  61815. // 限制初始列数
  61816. width: 50,
  61817. // 固定列宽
  61818. indexWidth: 60,
  61819. // 行索引宽度
  61820. minWidth: 30,
  61821. // 最小列宽
  61822. autoWidth: !0
  61823. // 自动调整列宽
  61824. },
  61825. style: {
  61826. // 确保默认样式正确
  61827. bgcolor: "#ffffff",
  61828. color: "#333333",
  61829. align: "left",
  61830. valign: "middle",
  61831. textwrap: !1,
  61832. strike: !1,
  61833. underline: !1,
  61834. italic: !1,
  61835. bold: !1,
  61836. fontSize: 12
  61837. }
  61838. }).loadData({}), m();
  61839. }, s = () => {
  61840. if (g.value) {
  61841. i.value.classList.add("loading");
  61842. try {
  61843. const Z = l();
  61844. g.value && (i.value.innerHTML = ""), g.value = new e9(i.value, {
  61845. view: {
  61846. height: () => document.documentElement.clientHeight - 120,
  61847. width: () => document.documentElement.clientWidth - 40
  61848. },
  61849. mode: "read",
  61850. showToolbar: !1,
  61851. showGrid: !0,
  61852. showContextmenu: !1,
  61853. multipleSheets: !0,
  61854. rpx: 1,
  61855. row: {
  61856. len: 100,
  61857. height: 25,
  61858. autoHeight: !0
  61859. },
  61860. col: {
  61861. len: 26,
  61862. width: 50,
  61863. indexWidth: 60,
  61864. minWidth: 30,
  61865. autoWidth: !0
  61866. }
  61867. }).loadData(Z);
  61868. } finally {
  61869. i.value.classList.remove("loading");
  61870. }
  61871. }
  61872. }, l = () => {
  61873. let Z = [];
  61874. return e.value.forEach((p) => {
  61875. const Y = p.id, R = {
  61876. name: p._name,
  61877. freeze: "A1",
  61878. styles: [
  61879. {
  61880. bgcolor: "#ffffff",
  61881. color: "#000000",
  61882. align: "left",
  61883. valign: "middle",
  61884. fontSize: 12
  61885. }
  61886. ],
  61887. merges: [],
  61888. rows: {},
  61889. cols: {}
  61890. };
  61891. try {
  61892. n(p, R), a(p, R, /* @__PURE__ */ new Map()), r(p, R), Z.push(R);
  61893. } catch {
  61894. Z[Y] = {
  61895. name: p._name || "Sheet1",
  61896. rows: {},
  61897. cols: {}
  61898. };
  61899. }
  61900. }), Z;
  61901. }, n = (Z, p) => {
  61902. Z._merges && Object.values(Z._merges).forEach((Y) => {
  61903. const { top: R, left: X, bottom: H, right: S } = Y;
  61904. p.merges.push(
  61905. `${h(X - 1)}${R}:${h(
  61906. S - 1
  61907. )}${H}`
  61908. );
  61909. });
  61910. }, a = (Z, p, Y) => {
  61911. const R = Math.min(Z.rowCount || 50, 100);
  61912. for (let X = 0; X < R; X++) {
  61913. const H = Z.getRow(X + 1);
  61914. let S = 25;
  61915. if (p.rows[X] = {
  61916. cells: {},
  61917. height: S
  61918. }, !H || !H.cellCount)
  61919. continue;
  61920. const z = Math.min(Z.columnCount || 26, 100);
  61921. for (let v = 0; v < z; v++)
  61922. try {
  61923. const K = H.getCell(v + 1);
  61924. if (!K || K.type === "null" && !K.style) {
  61925. p.rows[X].cells[v] = {
  61926. text: "",
  61927. style: 0
  61928. };
  61929. continue;
  61930. }
  61931. const { text: V, height: N } = d(K), B = o(K, Y, p.styles);
  61932. S = Math.max(S, N);
  61933. const G = Object.values(Z._merges || {}).find(
  61934. (w) => w.top === H.number && w.left === v + 1
  61935. );
  61936. G ? p.rows[X].cells[v] = {
  61937. text: V,
  61938. style: B,
  61939. merge: [
  61940. G.bottom - G.top,
  61941. G.right - G.left
  61942. ]
  61943. } : p.rows[X].cells[v] = {
  61944. text: V,
  61945. style: B
  61946. };
  61947. } catch {
  61948. p.rows[X].cells[v] = {
  61949. text: "",
  61950. style: 0
  61951. };
  61952. }
  61953. p.rows[X].height = S;
  61954. }
  61955. }, d = (Z) => {
  61956. let p = "";
  61957. try {
  61958. if (!Z || Z.value === null || Z.value === void 0)
  61959. p = "";
  61960. else if (Z.type === "date" || Z.numFmt && (Z.numFmt.includes("yy") || Z.numFmt.includes("mm") || Z.numFmt.includes("dd") || Z.numFmt.includes("h") || Z.numFmt.includes("m:s")))
  61961. try {
  61962. let S;
  61963. if (Z.value instanceof Date)
  61964. S = Z.value;
  61965. else if (typeof Z.value == "number") {
  61966. const z = new Date(1899, 11, 30);
  61967. S = new Date(
  61968. z.getTime() + Z.value * 24 * 60 * 60 * 1e3
  61969. );
  61970. } else
  61971. S = new Date(Z.value);
  61972. if (isNaN(S.getTime()))
  61973. p = String(Z.text || Z.value || "");
  61974. else {
  61975. const z = S.getFullYear(), v = (S.getMonth() + 1).toString().padStart(2, "0"), K = S.getDate().toString().padStart(2, "0");
  61976. if (Z.numFmt && (Z.numFmt.includes("h") || Z.numFmt.includes("s"))) {
  61977. const V = S.getHours().toString().padStart(2, "0"), N = S.getMinutes().toString().padStart(2, "0"), B = S.getSeconds().toString().padStart(2, "0");
  61978. p = `${z}/${v}/${K} ${V}:${N}:${B}`;
  61979. } else
  61980. p = `${z}/${v}/${K}`;
  61981. }
  61982. } catch {
  61983. p = String(Z.text || Z.value || "");
  61984. }
  61985. else if (typeof Z.value == "object" && Z.value !== null)
  61986. Z.value.hyperlink ? p = "[链接]" : Z.value.image ? p = "[图片]" : Z.value.richText ? p = Z.value.richText.map((S) => String((S == null ? void 0 : S.text) || "")).join("") : p = String(Z.text || "");
  61987. else if (Z.formula)
  61988. if (Z.numFmt && (Z.numFmt.includes("yy") || Z.numFmt.includes("mm") || Z.numFmt.includes("dd")))
  61989. try {
  61990. const S = new Date(1899, 11, 30), z = new Date(
  61991. S.getTime() + Z.result * 24 * 60 * 60 * 1e3
  61992. );
  61993. if (isNaN(z.getTime()))
  61994. p = String(Z.result || Z.value || "");
  61995. else {
  61996. const v = z.getFullYear(), K = (z.getMonth() + 1).toString().padStart(2, "0"), V = z.getDate().toString().padStart(2, "0");
  61997. p = `${v}-${K}-${V}`;
  61998. }
  61999. } catch {
  62000. p = String(Z.result || Z.value || "");
  62001. }
  62002. else
  62003. p = Z.result !== void 0 && Z.result !== null ? String(Z.result) : String(Z.value || "");
  62004. else
  62005. p = Z.text !== void 0 && Z.text !== null ? String(Z.text) : Z.value !== void 0 && Z.value !== null ? String(Z.value) : "";
  62006. } catch {
  62007. p = "[格式错误]";
  62008. }
  62009. const Y = ((p || "").match(/\n/g) || []).length + 1, R = [...p || ""], X = Math.ceil(R.length / 40), H = Math.max(Y, X) * 20;
  62010. return { text: p, height: H };
  62011. }, o = (Z, p, Y) => {
  62012. var S, z, v, K, V;
  62013. const R = {
  62014. bgcolor: "#ffffff",
  62015. color: "#000000",
  62016. align: ((S = Z.alignment) == null ? void 0 : S.horizontal) || "left",
  62017. valign: ((z = Z.alignment) == null ? void 0 : z.vertical) || "middle",
  62018. fontSize: ((v = Z.font) == null ? void 0 : v.size) || 12,
  62019. textwrap: !0,
  62020. bold: (K = Z.font) == null ? void 0 : K.bold,
  62021. italic: (V = Z.font) == null ? void 0 : V.italic,
  62022. underline: !1,
  62023. strike: !1
  62024. };
  62025. if (Z.fill && Z.fill.type === "pattern") {
  62026. const N = Z.fill.fgColor || {};
  62027. if (typeof N.indexed == "number") {
  62028. const B = t$[N.indexed];
  62029. B && (R.bgcolor = `#${B}`);
  62030. } else if (typeof N.theme == "number") {
  62031. const B = {
  62032. 0: 1,
  62033. // 浅色1
  62034. 1: 0,
  62035. // 深色1
  62036. 2: 3,
  62037. // 浅色2
  62038. 3: 2,
  62039. // 深色2
  62040. 4: 4,
  62041. // 强调色1
  62042. 5: 5,
  62043. // 强调色2
  62044. 6: 6,
  62045. // 强调色3
  62046. 7: 7,
  62047. // 强调色4
  62048. 8: 8,
  62049. // 强调色5
  62050. 9: 9
  62051. // 强调色6
  62052. }, G = B[N.theme] !== void 0 ? B[N.theme] : N.theme;
  62053. if (C.value[G]) {
  62054. let w = `#${C.value[G]}`;
  62055. typeof N.tint == "number" && N.tint !== 0 && (w = c(w, N.tint)), R.bgcolor = w;
  62056. }
  62057. } else if (N.rgb)
  62058. R.bgcolor = `#${N.rgb.substring(N.rgb.length - 6)}`;
  62059. else if (N.argb) {
  62060. const B = u(N.argb);
  62061. B && (R.bgcolor = B);
  62062. }
  62063. }
  62064. if (Z.font && Z.font.color) {
  62065. const N = Z.font.color;
  62066. if (typeof N.indexed == "number") {
  62067. const B = t$[N.indexed];
  62068. B && (R.color = `#${B}`);
  62069. } else if (typeof N.theme == "number") {
  62070. const B = {
  62071. 0: 1,
  62072. // 浅色1
  62073. 1: 0,
  62074. // 深色1
  62075. 2: 3,
  62076. // 浅色2
  62077. 3: 2,
  62078. // 深色2
  62079. 4: 4,
  62080. // 强调色1
  62081. 5: 5,
  62082. // 强调色2
  62083. 6: 6,
  62084. // 强调色3
  62085. 7: 7,
  62086. // 强调色4
  62087. 8: 8,
  62088. // 强调色5
  62089. 9: 9
  62090. // 强调色6
  62091. }, G = B[N.theme] !== void 0 ? B[N.theme] : N.theme;
  62092. if (C.value[G]) {
  62093. let w = `#${C.value[G]}`;
  62094. typeof N.tint == "number" && N.tint !== 0 && (w = c(w, N.tint)), R.color = w;
  62095. }
  62096. } else if (N.rgb)
  62097. R.color = `#${N.rgb.substring(N.rgb.length - 6)}`;
  62098. else if (N.argb) {
  62099. const B = u(N.argb);
  62100. B && (R.color = B);
  62101. }
  62102. }
  62103. const X = JSON.stringify(R);
  62104. if (p.has(X))
  62105. return p.get(X);
  62106. Y.push(R);
  62107. const H = Y.length - 1;
  62108. return p.set(X, H), H;
  62109. }, c = (Z, p) => {
  62110. try {
  62111. const R = lI(Z).toRgb(), X = (v, K) => {
  62112. let V;
  62113. return K < 0 ? V = v * (1 + K) : V = v + (255 - v) * K, Math.max(0, Math.min(255, Math.round(V)));
  62114. }, H = X(R.r, p), S = X(R.g, p), z = X(R.b, p);
  62115. return lI({ r: H, g: S, b: z }).toHexString();
  62116. } catch {
  62117. return Z;
  62118. }
  62119. }, r = (Z, p) => {
  62120. const Y = Math.min(Z.columnCount || 26, 50), R = /* @__PURE__ */ new Map(), X = /* @__PURE__ */ new Set();
  62121. Z._merges && Object.values(Z._merges).forEach((H) => {
  62122. for (let S = H.left; S <= H.right; S++)
  62123. X.add(S - 1);
  62124. }), Z.eachRow((H) => {
  62125. var S, z, v;
  62126. for (let K = 0; K < Y; K++)
  62127. try {
  62128. const V = H.getCell(K + 1);
  62129. if (!V) continue;
  62130. let N = "";
  62131. try {
  62132. V.text !== void 0 && V.text !== null ? N = String(V.text) : V.value !== void 0 && V.value !== null && (typeof V.value == "object" ? N = (S = V.value) != null && S.richText ? V.value.richText.map((B) => String((B == null ? void 0 : B.text) || "")).join("") : (z = V.value) != null && z.hyperlink ? "[链接]" : (v = V.value) != null && v.image ? "[图片]" : "" : N = String(V.value));
  62133. } catch {
  62134. N = "";
  62135. }
  62136. if (N)
  62137. if (Object.values(Z._merges || {}).some(
  62138. (G) => H.number >= G.top && H.number <= G.bottom && K + 1 >= G.left && K + 1 <= G.right
  62139. )) {
  62140. const G = Object.values(Z._merges || {}).find(
  62141. (w) => H.number >= w.top && H.number <= w.bottom && K + 1 >= w.left && K + 1 <= w.right
  62142. );
  62143. if (G && K + 1 === G.left) {
  62144. const w = G.right - G.left + 1, W = [...N].reduce((f, D) => f + (/[\u4e00-\u9fa5]/.test(D) ? 2 : 1), 0), y = Math.ceil(W / w);
  62145. R.set(
  62146. K,
  62147. Math.max(R.get(K) || 0, y)
  62148. );
  62149. }
  62150. } else {
  62151. const G = [...N].reduce((w, W) => w + (/[\u4e00-\u9fa5]/.test(W) ? 2 : 1), 0);
  62152. R.set(
  62153. K,
  62154. Math.max(R.get(K) || 0, G)
  62155. );
  62156. }
  62157. } catch {
  62158. }
  62159. });
  62160. for (let H = 0; H < Y; H++) {
  62161. const S = R.get(H);
  62162. if (S) {
  62163. const z = Math.min(Math.max(S * 8 + 10, 50), 300);
  62164. p.cols[H] = { width: z };
  62165. }
  62166. }
  62167. }, h = (Z) => {
  62168. let p, Y = "";
  62169. for (; Z >= 0; )
  62170. p = Z % 26, Y = String.fromCharCode(p + 65) + Y, Z = (Z - p) / 26 - 1;
  62171. return Y;
  62172. }, b = () => {
  62173. var p;
  62174. const Z = (p = I.workbook._themes) == null ? void 0 : p.theme1;
  62175. if (!Z) {
  62176. C.value = [
  62177. "FFFFFF",
  62178. // 白色 - 浅色1
  62179. "000000",
  62180. // 黑色 - 深色1
  62181. "EEECE1",
  62182. // 浅灰 - 浅色2
  62183. "1F497D",
  62184. // 深灰 - 深色2
  62185. "4F81BD",
  62186. // 蓝色 - 强调色1
  62187. "C0504D",
  62188. // 红色 - 强调色2
  62189. "9BBB59",
  62190. // 绿色 - 强调色3
  62191. "8064A2",
  62192. // 紫色 - 强调色4
  62193. "4BACC6",
  62194. // 青色 - 强调色5
  62195. "F79646"
  62196. // 橙色 - 强调色6
  62197. ];
  62198. return;
  62199. }
  62200. try {
  62201. const X = new DOMParser().parseFromString(Z, "text/xml").getElementsByTagName("a:clrScheme")[0];
  62202. if (!X)
  62203. throw new Error("找不到颜色方案元素");
  62204. C.value = [];
  62205. const H = Array.from(X.children);
  62206. for (const S of H) {
  62207. let z = null;
  62208. const v = S.getElementsByTagName("a:srgbClr")[0], K = S.getElementsByTagName("a:sysClr")[0];
  62209. v ? z = v.getAttribute("val") : K && (z = K.getAttribute("lastClr") || K.getAttribute("val")), C.value.push(z || "FFFFFF");
  62210. }
  62211. } catch (Y) {
  62212. console.error("解析主题颜色出错:", Y), C.value = [
  62213. "FFFFFF",
  62214. // 白色 - 浅色1
  62215. "000000",
  62216. // 黑色 - 深色1
  62217. "EEECE1",
  62218. // 浅灰 - 浅色2
  62219. "1F497D",
  62220. // 深灰 - 深色2
  62221. "4F81BD",
  62222. // 蓝色 - 强调色1
  62223. "C0504D",
  62224. // 红色 - 强调色2
  62225. "9BBB59",
  62226. // 绿色 - 强调色3
  62227. "8064A2",
  62228. // 紫色 - 强调色4
  62229. "4BACC6",
  62230. // 青色 - 强调色5
  62231. "F79646"
  62232. // 橙色 - 强调色6
  62233. ];
  62234. }
  62235. }, u = (Z) => !Z || Z.length < 8 ? null : `#${Z.substring(2)}`, m = () => {
  62236. b(), s();
  62237. };
  62238. return tG(() => {
  62239. A();
  62240. }), b$(
  62241. () => I.workbook,
  62242. () => {
  62243. m();
  62244. }
  62245. ), (Z, p) => (Ug(), Pg("div", null, [
  62246. tC("div", {
  62247. ref_key: "spreadsheetRef",
  62248. ref: i,
  62249. class: "spreadsheet-container",
  62250. id: "spreadsheet"
  62251. }, null, 512)
  62252. ]));
  62253. }
  62254. };
  62255. async function qZg(t, I) {
  62256. const g = await new $bg.Workbook().xlsx.load(t), C = iG(_Zg, { workbook: g });
  62257. return C.mount(I), {
  62258. $el: I,
  62259. $destroy() {
  62260. C.unmount();
  62261. }
  62262. };
  62263. }
  62264. const a$ = (t) => ({
  62265. $el: t,
  62266. $destroy() {
  62267. }
  62268. }), $Zg = [
  62269. // 使用docxjs支持,目前效果最好的渲染器
  62270. {
  62271. accepts: ["docx"],
  62272. handler: async (t, I) => {
  62273. const g = {
  62274. ...o9,
  62275. debug: !0,
  62276. experimental: !0
  62277. };
  62278. return await Fog(t, I, null, g), a$(I);
  62279. }
  62280. },
  62281. // 使用pptx2html,已通过默认值更替
  62282. {
  62283. accepts: ["pptx"],
  62284. handler: async (t, I) => Pbg(t, I)
  62285. },
  62286. // 使用sheetjs + handsontable,无样式
  62287. {
  62288. accepts: ["xlsx"],
  62289. handler: async (t, I) => qZg(t, I)
  62290. },
  62291. // 使用pdfjs,渲染pdf,效果最好
  62292. {
  62293. accepts: ["pdf"],
  62294. handler: async (t, I) => Kdg(t, I)
  62295. },
  62296. // 图片过滤器
  62297. {
  62298. accepts: ["gif", "jpg", "jpeg", "bmp", "tiff", "tif", "png", "svg"],
  62299. handler: async (t, I) => Ldg(t, I)
  62300. },
  62301. // 纯文本预览
  62302. {
  62303. accepts: [
  62304. "txt",
  62305. "json",
  62306. "js",
  62307. "css",
  62308. "java",
  62309. "py",
  62310. "html",
  62311. "jsx",
  62312. "ts",
  62313. "tsx",
  62314. "xml",
  62315. "md",
  62316. "log"
  62317. ],
  62318. handler: async (t, I) => jdg(t, I)
  62319. },
  62320. // 错误处理
  62321. {
  62322. accepts: ["error"],
  62323. handler: async (t, I, g) => (I.innerHTML = `<div style="text-align: center margin-top: 80px">不支持.${g}格式的在线预览,请下载后预览或转换为支持的格式</div>
  62324. <div style="text-align: center">支持docx, xlsx, pptx, pdf, 以及纯文本格式和各种图片格式的在线预览</div>`, a$(I))
  62325. }
  62326. ], o$ = $Zg.reduce((t, { accepts: I, handler: g }) => (I.forEach((C) => t[C] = g), t), {});
  62327. async function MGg(t) {
  62328. return new Promise((I, g) => {
  62329. const C = new FileReader();
  62330. C.onload = (i) => I(i.target.result), C.onerror = (i) => g(i), C.readAsArrayBuffer(t);
  62331. });
  62332. }
  62333. async function Nig(t) {
  62334. return new Promise((I, g) => {
  62335. const C = new FileReader();
  62336. C.onload = (i) => I(i.target.result), C.onerror = (i) => g(i), C.readAsDataURL(new Blob([t]));
  62337. });
  62338. }
  62339. async function gGg(t) {
  62340. return new Promise((I, g) => {
  62341. const C = new FileReader();
  62342. C.onload = (i) => I(i.target.result), C.onerror = (i) => g(i), C.readAsText(new Blob([t]), "utf-8");
  62343. });
  62344. }
  62345. function RGg(t) {
  62346. const I = t.lastIndexOf(".");
  62347. return t.substr(I + 1);
  62348. }
  62349. async function IGg(t, I, g) {
  62350. const C = o$[I];
  62351. return C ? C(t, g) : o$.error(t, g, I);
  62352. }
  62353. const CGg = "data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1623827680993'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='6860'%20width='128'%20height='128'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3cdefs%3e%3cstyle%20type='text/css'%3e%3c/style%3e%3c/defs%3e%3cpath%20d='M971.232%2041.216l0.768%200.768a32%2032%200%200%201%200%2044.96L88.512%20982.496a31.808%2031.808%200%200%201-41.952%202.944l-3.808-3.424a32%2032%200%200%201%200-44.96l169.12-171.36c-58.08-49.28-112.256-114.4-162.592-195.36l-7.84-12.8a65.664%2065.664%200%200%201%200-67.84c130.176-215.392%20286.656-323.104%20469.44-323.104%2081.312%200%20157.6%2021.312%20228.8%2064l186.56-189.088a31.808%2031.808%200%200%201%2044.992-0.32zM828.576%20297.28c51.584%2047.04%20100.16%20106.72%20145.728%20179.104l8.096%2013.024c12.8%2020.96%2012.8%2047.488%200%2068.448-131.68%20215.2-288.864%20322.784-471.52%20322.784-73.152%200-142.08-17.248-206.784-51.712l47.84-48.48a369.888%20369.888%200%200%200%20158.944%2035.296c158.144%200%20296.192-94.528%20417.088-292.096l-7.68-12.352c-43.424-69.056-89.088-124.96-137.024-168.128l45.312-45.888z%20m-317.696-65.792c-158.112%200-295.392%2094.496-414.848%20292.16l7.424%2012.064c48.32%2077.76%2099.552%20138.88%20153.856%20183.904l91.008-92.256a195.776%20195.776%200%200%201-29.504-103.744c0-107.552%2086.016-194.752%20192.128-194.752%2037.6%200%2072.704%2010.976%20102.336%2029.92l79.424-80.544a373.76%20373.76%200%200%200-181.824-46.72z%20m174.656%20210.784c11.264%2024.768%2017.504%2052.32%2017.504%2081.344%200%20107.552-85.984%20194.752-192.096%20194.752a189.248%20189.248%200%200%201-80.256-17.76l50.08-50.784c9.696%202.368%2019.776%203.616%2030.176%203.616%2070.72%200%20128.064-58.112%20128.064-129.824a131.84%20131.84%200%200%200-3.552-30.56l50.08-50.784z%20m-174.592-48.48c-70.72%200-128.096%2058.112-128.096%20129.824%200%2020.064%204.48%2039.04%2012.48%2056l170.88-173.152a126.144%20126.144%200%200%200-55.264-12.672z'%20fill='%23bfbfbf'%20p-id='6861'%3e%3c/path%3e%3c/svg%3e", tGg = { class: "view-other" }, iGg = ["src"], eGg = { class: "size-item" }, AGg = {
  62354. __name: "index",
  62355. props: {
  62356. file: {
  62357. type: Object,
  62358. default: () => ({})
  62359. }
  62360. },
  62361. setup(t) {
  62362. const I = t, g = DA(() => {
  62363. const C = Number(I.file.size);
  62364. if (!Number.isFinite(C) || !C) return "0KB";
  62365. const i = 1024, e = 1048576, A = Math.abs(C), s = C < 0 ? "-" : "";
  62366. return A >= e ? `${s}${Math.floor(A / e * 100) / 100} GB` : A >= i ? `${s}${Math.floor(A / i * 100) / 100} MB` : `${s}${A} KB`;
  62367. });
  62368. return (C, i) => {
  62369. const e = lag("big");
  62370. return Ug(), Pg("div", tGg, [
  62371. tC("img", {
  62372. class: "view-off-icon",
  62373. src: Dg(CGg),
  62374. alt: ""
  62375. }, null, 8, iGg),
  62376. tC("p", null, [
  62377. nag(um(t.file.name) + "." + um(t.file.type), 1),
  62378. tC("span", eGg, um(g.value), 1)
  62379. ]),
  62380. tC("p", null, [
  62381. aag(e, null, {
  62382. default: oag(() => i[0] || (i[0] = [
  62383. tC("strong", null, "该类型文件不支持在线预览,请下载后查看。", -1)
  62384. ])),
  62385. _: 1
  62386. })
  62387. ])
  62388. ]);
  62389. };
  62390. }
  62391. }, sGg = /* @__PURE__ */ V0(AGg, [["__scopeId", "data-v-d007bf31"]]), lGg = { class: "container" }, nGg = { class: "modal-height" }, aGg = { class: "file-box" }, oGg = { class: "view-wrapper" }, cGg = {
  62392. key: 0,
  62393. class: "preview-wrapper",
  62394. ref: "wrapper"
  62395. }, dGg = {
  62396. class: "preview-inner",
  62397. ref: "preview-inner"
  62398. }, rGg = {
  62399. class: "preview-mark",
  62400. ref: "bg-mark",
  62401. id: "bg-mark"
  62402. }, hGg = { class: "loading-container" }, bGg = {
  62403. key: 0,
  62404. class: "viewfile-image"
  62405. }, uGg = ["src", "alt"], mGg = ["src"], ZGg = {
  62406. __name: "index",
  62407. props: {
  62408. file: {
  62409. type: Object,
  62410. default: () => ({})
  62411. }
  62412. },
  62413. setup(t) {
  62414. const I = t, g = wi(!1), C = wi(null), i = wi(""), e = wi(!1), A = wi(0), s = DA(() => {
  62415. const u = (I.file.type || "").toLowerCase();
  62416. return Object.values({
  62417. doc: ["docx"],
  62418. xlsx: ["xlsx"],
  62419. pdf: ["pdf"],
  62420. ppt: ["pptx"],
  62421. image: ["gif", "jpg", "jpeg", "bmp", "tiff", "tif", "png", "svg"],
  62422. text: [
  62423. "txt",
  62424. "json",
  62425. "js",
  62426. "css",
  62427. "java",
  62428. "py",
  62429. "html",
  62430. "jsx",
  62431. "ts",
  62432. "tsx",
  62433. "xml",
  62434. "md",
  62435. "log"
  62436. ]
  62437. }).flat().includes(u);
  62438. }), l = DA(() => {
  62439. const u = (I.file.type || "").toLowerCase();
  62440. return ["gif", "jpg", "jpeg", "bmp", "tiff", "tif", "png", "svg"].includes(u);
  62441. }), n = DA(() => {
  62442. const u = String(i.value || "");
  62443. return u ? [u] : [];
  62444. }), a = DA(() => ({
  62445. visible: e.value,
  62446. open: d,
  62447. close: o,
  62448. next: c,
  62449. prev: r
  62450. }));
  62451. function d(u = 0) {
  62452. n.value.length && (A.value = Math.max(0, Math.min(n.value.length - 1, Number(u) || 0)), e.value = !0);
  62453. }
  62454. function o() {
  62455. e.value = !1;
  62456. }
  62457. function c() {
  62458. const u = n.value;
  62459. u.length <= 1 || (A.value = (A.value + 1) % u.length);
  62460. }
  62461. function r() {
  62462. const u = n.value;
  62463. u.length <= 1 || (A.value = (A.value - 1 + u.length) % u.length);
  62464. }
  62465. function h(u) {
  62466. e.value && (u.key === "Escape" && o(), u.key === "ArrowRight" && c(), u.key === "ArrowLeft" && r());
  62467. }
  62468. tG(() => {
  62469. window.addEventListener("keydown", h);
  62470. }), s9(() => {
  62471. window.removeEventListener("keydown", h);
  62472. });
  62473. const b = (u, m) => {
  62474. if (!C.value)
  62475. return Promise.reject(new Error("Output element not found"));
  62476. C.value.innerHTML = "";
  62477. const Z = document.createElement("div"), p = C.value.appendChild(Z);
  62478. return new Promise(
  62479. (Y, R) => IGg(u, m, p).then(Y).catch(R)
  62480. );
  62481. };
  62482. return b$(
  62483. () => I.file,
  62484. (u) => {
  62485. if (u && u.type)
  62486. try {
  62487. g.value = !0, cag(() => {
  62488. if (l.value) {
  62489. i.value = "", e.value = !1, A.value = 0, C.value && (C.value.innerHTML = ""), Nig(u.fileBuffer).then((m) => {
  62490. i.value = String(m || "");
  62491. }).finally(() => {
  62492. g.value = !1;
  62493. });
  62494. return;
  62495. }
  62496. i.value = "", e.value = !1, A.value = 0, b(u.fileBuffer, u.type).finally(() => {
  62497. g.value = !1;
  62498. });
  62499. });
  62500. } catch (m) {
  62501. console.warn(m);
  62502. }
  62503. },
  62504. { immediate: !0, deep: !0 }
  62505. ), (u, m) => (Ug(), Pg("div", lGg, [
  62506. tC("div", nGg, [
  62507. tC("div", aGg, [
  62508. SY(tC("p", { class: "file-name" }, um(t.file.filename), 513), [
  62509. [DY, !g.value]
  62510. ]),
  62511. tC("div", oGg, [
  62512. s.value ? (Ug(), Pg("div", cGg, [
  62513. tC("div", dGg, [
  62514. tC("div", rGg, null, 512),
  62515. SY(tC("div", hGg, m[1] || (m[1] = [
  62516. tC("div", { class: "loading-spinner" }, [
  62517. tC("svg", {
  62518. viewBox: "0 0 50 50",
  62519. class: "circular"
  62520. }, [
  62521. tC("circle", {
  62522. cx: "25",
  62523. cy: "25",
  62524. r: "20",
  62525. fill: "none",
  62526. class: "path"
  62527. })
  62528. ])
  62529. ], -1)
  62530. ]), 512), [
  62531. [DY, g.value]
  62532. ]),
  62533. l.value ? SY((Ug(), Pg("div", bGg, [
  62534. d$(u.$slots, "image", {
  62535. src: i.value,
  62536. srcList: n.value,
  62537. index: A.value,
  62538. file: t.file,
  62539. preview: a.value
  62540. }, () => [
  62541. tC("img", {
  62542. class: "viewfile-image-inner",
  62543. src: i.value,
  62544. alt: t.file.filename || "",
  62545. onClick: m[0] || (m[0] = (Z) => d(0))
  62546. }, null, 8, uGg)
  62547. ], !0),
  62548. e.value ? (Ug(), Pg("div", {
  62549. key: 0,
  62550. class: "viewfile-image-preview",
  62551. onClick: ah(o, ["self"])
  62552. }, [
  62553. tC("button", {
  62554. class: "viewfile-image-preview-close",
  62555. type: "button",
  62556. onClick: o
  62557. }, "×"),
  62558. n.value.length > 1 ? (Ug(), Pg("button", {
  62559. key: 0,
  62560. class: "viewfile-image-preview-prev",
  62561. type: "button",
  62562. onClick: ah(r, ["stop"])
  62563. }, " ‹ ")) : Yt("", !0),
  62564. tC("img", {
  62565. class: "viewfile-image-preview-img",
  62566. src: n.value[A.value],
  62567. alt: ""
  62568. }, null, 8, mGg),
  62569. n.value.length > 1 ? (Ug(), Pg("button", {
  62570. key: 1,
  62571. class: "viewfile-image-preview-next",
  62572. type: "button",
  62573. onClick: ah(c, ["stop"])
  62574. }, " › ")) : Yt("", !0)
  62575. ])) : Yt("", !0)
  62576. ], 512)), [
  62577. [DY, !g.value]
  62578. ]) : SY((Ug(), Pg("div", {
  62579. key: 1,
  62580. class: "output",
  62581. ref_key: "output",
  62582. ref: C
  62583. }, null, 512)), [
  62584. [DY, !g.value]
  62585. ])
  62586. ], 512)
  62587. ], 512)) : t.file.type && !s.value ? (Ug(), h$(sGg, {
  62588. key: 1,
  62589. file: t.file
  62590. }, null, 8, ["file"])) : Yt("", !0)
  62591. ])
  62592. ])
  62593. ])
  62594. ]));
  62595. }
  62596. }, GGg = /* @__PURE__ */ V0(ZGg, [["__scopeId", "data-v-3eb932b1"]]), fGg = {
  62597. install(t) {
  62598. t.component("ViewFile", GGg);
  62599. }
  62600. };
  62601. export {
  62602. GGg as ViewFile,
  62603. fGg as default,
  62604. RGg as getExtend,
  62605. MGg as readBuffer,
  62606. Nig as readDataURL,
  62607. gGg as readText,
  62608. IGg as render
  62609. };