bundle.js 1.6 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647
  1. var __extends = (this && this.__extends) || (function () {
  2. var extendStatics = Object.setPrototypeOf ||
  3. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  4. function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
  5. return function (d, b) {
  6. extendStatics(d, b);
  7. function __() { this.constructor = d; }
  8. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  9. };
  10. })();
  11. (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
  12. "use strict";
  13. Object.defineProperty(exports, "__esModule", { value: true });
  14. var Global_1 = require("./Global");
  15. var MVCObjectPool_1 = require("./frameworks/mvc/MVCObjectPool");
  16. var Debuger_1 = require("./frameworks/Debuger");
  17. var EventUtils_1 = require("./frameworks/events/EventUtils");
  18. var ComEventVO_1 = require("./frameworks/events/ComEventVO");
  19. var RecConfigs_1 = require("./configs/gameConfigs/RecConfigs");
  20. var TimesTamper_1 = require("./frameworks/TimesTamper");
  21. var PathConfig_1 = require("./configs/gameConfigs/PathConfig");
  22. var TimerService_1 = require("./frameworks/TimerService");
  23. var GlobalWaiting_1 = require("./GlobalWaiting");
  24. var BaseView_1 = require("./frameworks/mvc/BaseView");
  25. var ObjectPool_1 = require("./frameworks/mvc/ObjectPool");
  26. var GameLayerManager_1 = require("./managers/GameLayerManager");
  27. var UiManager_1 = require("./managers/UiManager");
  28. var ResourceManager_1 = require("./managers/ResourceManager");
  29. var ResDataManager_1 = require("./managers/ResDataManager");
  30. var SoundssManager_1 = require("./managers/SoundssManager");
  31. var BinderManager_1 = require("./managers/BinderManager");
  32. var PlatformTool_1 = require("./platform/PlatformTool");
  33. var LoginProxy_1 = require("./gamemodule/loading/proxys/LoginProxy");
  34. var UserInfoProxy_1 = require("./gamemodule/userinfo/UserInfoProxy");
  35. var MainProxy_1 = require("./gamemodule/main/proxys/MainProxy");
  36. var GameProxy_1 = require("./gamemodule/main/proxys/GameProxy");
  37. var SkinProxy_1 = require("./gamemodule/skins/proxys/SkinProxy");
  38. /*
  39. * name;
  40. */
  41. var GameContents = /** @class */ (function (_super) {
  42. __extends(GameContents, _super);
  43. function GameContents() {
  44. return _super.call(this) || this;
  45. }
  46. /**
  47. * 初始化游戏
  48. */
  49. GameContents.prototype.initGame = function () {
  50. RecConfigs_1.default.getInstance().init();
  51. EventUtils_1.EventUtils.init();
  52. TimerService_1.default.getInastance().init();
  53. GameLayerManager_1.GameLayerManager.getInstance().initlayer();
  54. UiManager_1.UiManager.getInstance().init();
  55. ResourceManager_1.default.getInstance().init();
  56. ResDataManager_1.default.getInastance().init();
  57. SoundssManager_1.default.getInstance().init();
  58. BinderManager_1.BinderManager.binderAll();
  59. TimesTamper_1.TimesTamper.getInstance().init();
  60. PlatformTool_1.default.getInstance().init();
  61. this.initPoolObject();
  62. this.initProxy();
  63. this.initmapView();
  64. this.beginLoadHandler();
  65. };
  66. /**
  67. * 初始化对象池
  68. */
  69. GameContents.prototype.initPoolObject = function () {
  70. ObjectPool_1.default.register(ComEventVO_1.default.poolkey, ComEventVO_1.default);
  71. };
  72. /**
  73. * 初始化模块代理类
  74. */
  75. GameContents.prototype.initProxy = function () {
  76. var mvcpool = MVCObjectPool_1.default.getInstance();
  77. mvcpool.addProxy(LoginProxy_1.default);
  78. mvcpool.addProxy(UserInfoProxy_1.default);
  79. mvcpool.addProxy(MainProxy_1.default);
  80. mvcpool.addProxy(GameProxy_1.default);
  81. mvcpool.addProxy(SkinProxy_1.default);
  82. };
  83. GameContents.prototype.initmapView = function () {
  84. var mvcpool = MVCObjectPool_1.default.getInstance();
  85. // mvcpool.mapView( MapViewType.DailyrewardView,DailyrewardView );
  86. };
  87. GameContents.prototype.beginLoadHandler = function () {
  88. var patharr = [];
  89. patharr.push({ url: PathConfig_1.PathConfig.getResConfig(), type: Laya.Loader.JSON });
  90. patharr.push({ url: PathConfig_1.PathConfig.getGameVersion(), type: Laya.Loader.JSON });
  91. ResourceManager_1.default.getInstance().Loaders(patharr, this, this.recloadComplete);
  92. };
  93. GameContents.prototype.recloadComplete = function () {
  94. var gameversion = ResDataManager_1.default.instance.getResByurl(PathConfig_1.PathConfig.getGameVersion(), false);
  95. if (gameversion) {
  96. Global_1.Global.gameVersion = gameversion.version;
  97. }
  98. else {
  99. Global_1.Global.gameVersion = "1.0.0";
  100. }
  101. Debuger_1.default.log("gameVersion:" + Global_1.Global.gameVersion);
  102. var configres = ResDataManager_1.default.instance.getResByurl(PathConfig_1.PathConfig.getResConfig(), false);
  103. RecConfigs_1.default.instance.initRec(configres);
  104. ResourceManager_1.default.instance.loadGroup("loading", this, this.onPreLoaded, this.onPreprogress);
  105. };
  106. GameContents.prototype.onPreprogress = function (value) {
  107. };
  108. GameContents.prototype.onPreLoaded = function () {
  109. ResDataManager_1.default.instance.adduiPackage("loading", true, false);
  110. var globalwaiturl = fairygui.UIPackage.getItemURL("loading", "globalWaiting");
  111. BaseView_1.default.viewbgUrl = fairygui.UIPackage.getItemURL("loading", "img_black");
  112. fairygui.UIObjectFactory.setPackageItemExtension(globalwaiturl, GlobalWaiting_1.default);
  113. fairygui.UIConfig.globalModalWaiting = globalwaiturl;
  114. fairygui.UIConfig.windowModalWaiting = globalwaiturl;
  115. // CPAUtils.init();
  116. this.startLogin();
  117. };
  118. GameContents.prototype.startLogin = function () {
  119. MVCObjectPool_1.default.getInstance().getProxy(LoginProxy_1.default).startLogin();
  120. };
  121. return GameContents;
  122. }(Laya.EventDispatcher));
  123. exports.GameContents = GameContents;
  124. },{"./Global":2,"./GlobalWaiting":3,"./configs/gameConfigs/PathConfig":10,"./configs/gameConfigs/RecConfigs":11,"./frameworks/Debuger":12,"./frameworks/TimerService":13,"./frameworks/TimesTamper":14,"./frameworks/events/ComEventVO":15,"./frameworks/events/EventUtils":16,"./frameworks/mvc/BaseView":20,"./frameworks/mvc/MVCObjectPool":22,"./frameworks/mvc/ObjectPool":23,"./gamemodule/loading/proxys/LoginProxy":34,"./gamemodule/main/proxys/GameProxy":39,"./gamemodule/main/proxys/MainProxy":40,"./gamemodule/skins/proxys/SkinProxy":51,"./gamemodule/userinfo/UserInfoProxy":53,"./managers/BinderManager":58,"./managers/GameLayerManager":61,"./managers/ResDataManager":62,"./managers/ResourceManager":63,"./managers/SoundssManager":65,"./managers/UiManager":66,"./platform/PlatformTool":67}],2:[function(require,module,exports){
  125. "use strict";
  126. Object.defineProperty(exports, "__esModule", { value: true });
  127. var Global;
  128. (function (Global) {
  129. Global.httpurl = "";
  130. Global.resourcehtttp = "";
  131. Global.cdnurl = "https://wxgame.51yoyoyo.com/";
  132. /**
  133. * 资源后缀版本号
  134. */
  135. Global.versions = ""; //"?v=1.0.7";
  136. Global.initWidth = 720;
  137. Global.initHeight = 1280;
  138. /**
  139. * 资源版本号
  140. */
  141. Global.resconfigVersion = "";
  142. /**
  143. * 当前平台
  144. */
  145. Global.nowplatfrom = "";
  146. /**
  147. * 当前游戏appid
  148. */
  149. Global.appid = "wx46f4626932e5f48b";
  150. /**
  151. * 游戏版本号
  152. */
  153. Global.gameVersion = "1.0.0";
  154. /**
  155. * 是否调试版本
  156. */
  157. Global.isdebug = false;
  158. Global.AppKeyID = 0;
  159. Global.MemberID = 0;
  160. function curHeight() {
  161. return Laya.stage.height;
  162. }
  163. Global.curHeight = curHeight;
  164. function curWidth() {
  165. return Laya.stage.width;
  166. }
  167. Global.curWidth = curWidth;
  168. function setVars() {
  169. Global.stage = Laya.stage;
  170. Global.sethttpurl();
  171. }
  172. Global.setVars = setVars;
  173. function getUrl(url) {
  174. if (url.indexOf("wxlocal") == -1) {
  175. return Global.resourcehtttp + url + Global.versions;
  176. }
  177. return url;
  178. }
  179. Global.getUrl = getUrl;
  180. function sethttpurl() {
  181. if (Global.isdebug) {
  182. Global.httpurl = "https://wxgamedev.51yoyoyo.com/";
  183. }
  184. else {
  185. Global.httpurl = "https://minport.51yoyoyo.com/";
  186. }
  187. }
  188. Global.sethttpurl = sethttpurl;
  189. })(Global = exports.Global || (exports.Global = {}));
  190. },{}],3:[function(require,module,exports){
  191. "use strict";
  192. Object.defineProperty(exports, "__esModule", { value: true });
  193. var GlobalWaiting = /** @class */ (function (_super) {
  194. __extends(GlobalWaiting, _super);
  195. function GlobalWaiting() {
  196. var _this = _super.call(this) || this;
  197. _this._isforcehide = false;
  198. _this._lastTime = 0;
  199. return _this;
  200. }
  201. GlobalWaiting.prototype.constructFromXML = function (xml) {
  202. this.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  203. _super.prototype.constructFromXML.call(this, xml);
  204. this.img_0 = this.getChild("img_0").asImage;
  205. this.img_0.visible = false;
  206. this.on(Laya.Event.DISPLAY, this, this.onAddedToStage);
  207. this.on(Laya.Event.UNDISPLAY, this, this.onRemoveFromStage);
  208. };
  209. GlobalWaiting.prototype.onAddedToStage = function () {
  210. this._lastTime = Laya.Browser.now();
  211. Laya.timer.frameLoop(1, this, this.onTimer);
  212. };
  213. GlobalWaiting.prototype.onTimer = function () {
  214. if (this.img_0) {
  215. var nowtime = Laya.Browser.now();
  216. var distime = nowtime - this._lastTime;
  217. if (distime / 1000 >= 0) {
  218. if (!this._isforcehide) {
  219. this.img_0.visible = true;
  220. }
  221. var i = this.img_0.rotation;
  222. i += 10;
  223. if (i > 360)
  224. i = i % 360;
  225. this.img_0.rotation = i;
  226. }
  227. else {
  228. this.img_0.visible = false;
  229. }
  230. }
  231. };
  232. GlobalWaiting.prototype.hideimg = function () {
  233. this._isforcehide = true;
  234. if (this.img_0) {
  235. this.img_0.visible = false;
  236. }
  237. };
  238. GlobalWaiting.prototype.onRemoveFromStage = function () {
  239. Laya.timer.clear(this, this.onTimer);
  240. };
  241. return GlobalWaiting;
  242. }(fairygui.GComponent));
  243. exports.default = GlobalWaiting;
  244. },{}],4:[function(require,module,exports){
  245. "use strict";
  246. Object.defineProperty(exports, "__esModule", { value: true });
  247. var Global_1 = require("./Global");
  248. var Stage = Laya.Stage;
  249. var PathConfig_1 = require("./configs/gameConfigs/PathConfig");
  250. var GameContents_1 = require("./GameContents");
  251. var Sdk_1 = require("./platform/wxminigame/WXSDK/Sdk");
  252. var Main = /** @class */ (function () {
  253. function Main() {
  254. //根据IDE设置初始化引擎
  255. // Laya.init(Global.initWidth, Global.initHeight, Laya["WebGL"]);
  256. Laya3D.init(Global_1.Global.initWidth, Global_1.Global.initHeight);
  257. Laya.stage.scaleMode = Stage.SCALE_FIXED_WIDTH;
  258. Laya.stage.alignH = Stage.ALIGN_CENTER;
  259. Laya.stage.alignV = Stage.ALIGN_TOP;
  260. Laya.stage.screenMode = Stage.SCREEN_VERTICAL;
  261. Laya.stage.bgColor = "#54B9F6";
  262. // Laya.Stat.show();
  263. Laya.alertGlobalError = true;
  264. window['Config3D'] && (window['Config3D']["_default"]["_defaultPhysicsMemory"] = 128);
  265. if (Laya.Browser.onWeiXin) {
  266. Sdk_1.WxApi.WxInit();
  267. Sdk_1.WxApi.CheckWXUpdate();
  268. }
  269. Laya.stage.on("resize", this, this.onResize);
  270. }
  271. Main.prototype.onResize = function () {
  272. Laya.stage.off("resize", this, this.onResize);
  273. Global_1.Global.setVars();
  274. PathConfig_1.PathConfig.init();
  275. fairygui.UIConfig.packageFileExtension = "bin";
  276. fairygui.UIConfig.textureLinearSampling = true;
  277. fairygui.UIConfig.defaultFont = "黑体";
  278. fairygui.UIConfig.versions = Global_1.Global.versions;
  279. var gameContent = new GameContents_1.GameContents();
  280. gameContent.initGame();
  281. };
  282. return Main;
  283. }());
  284. //激活启动类
  285. new Main();
  286. },{"./GameContents":1,"./Global":2,"./configs/gameConfigs/PathConfig":10,"./platform/wxminigame/WXSDK/Sdk":75}],5:[function(require,module,exports){
  287. "use strict";
  288. Object.defineProperty(exports, "__esModule", { value: true });
  289. //------------------------------------------------------------------------------
  290. //工具生成,请勿修改。
  291. //配置文件名称:build.xlsx。
  292. //------------------------------------------------------------------------------
  293. var BuildCFG = /** @class */ (function () {
  294. function BuildCFG() {
  295. }
  296. BuildCFG.initCfg = function (str) {
  297. var i = 0;
  298. var arr = str.split("\n");
  299. var i = 0;
  300. for (i = 0; i < arr.length; i++) {
  301. var singleStr = arr[i];
  302. var singleArr = singleStr.split("&");
  303. if (BuildCFG.dict[singleArr[0]])
  304. continue;
  305. var item = new BuildCFG();
  306. item.name = singleArr[0];
  307. item.buffx = Number(singleArr[1]);
  308. item.buffy = Number(singleArr[2]);
  309. item.buffz = Number(singleArr[3]);
  310. item.time = Number(singleArr[4]);
  311. BuildCFG.dict[item.name] = item;
  312. BuildCFG.vec.push(item);
  313. }
  314. };
  315. BuildCFG.dict = {};
  316. BuildCFG.vec = [];
  317. return BuildCFG;
  318. }());
  319. exports.default = BuildCFG;
  320. },{}],6:[function(require,module,exports){
  321. "use strict";
  322. Object.defineProperty(exports, "__esModule", { value: true });
  323. //------------------------------------------------------------------------------
  324. //工具生成,请勿修改。
  325. //配置文件名称:game.xlsx。
  326. //------------------------------------------------------------------------------
  327. var GameCFG = /** @class */ (function () {
  328. function GameCFG() {
  329. }
  330. GameCFG.initCfg = function (str) {
  331. var i = 0;
  332. var arr = str.split("\n");
  333. var i = 0;
  334. for (i = 0; i < arr.length; i++) {
  335. var singleStr = arr[i];
  336. var singleArr = singleStr.split("&");
  337. if (GameCFG.dict[singleArr[0]])
  338. continue;
  339. var item = new GameCFG();
  340. item.id = Number(singleArr[0]);
  341. item.value = singleArr[1];
  342. GameCFG.dict[item.id] = item;
  343. GameCFG.vec.push(item);
  344. }
  345. };
  346. GameCFG.dict = {};
  347. GameCFG.vec = [];
  348. return GameCFG;
  349. }());
  350. exports.default = GameCFG;
  351. },{}],7:[function(require,module,exports){
  352. "use strict";
  353. Object.defineProperty(exports, "__esModule", { value: true });
  354. //------------------------------------------------------------------------------
  355. //工具生成,请勿修改。
  356. //配置文件名称:level.xlsx。
  357. //------------------------------------------------------------------------------
  358. var LevelCFG = /** @class */ (function () {
  359. function LevelCFG() {
  360. }
  361. LevelCFG.initCfg = function (str) {
  362. var i = 0;
  363. var arr = str.split("\n");
  364. var i = 0;
  365. for (i = 0; i < arr.length; i++) {
  366. var singleStr = arr[i];
  367. var singleArr = singleStr.split("&");
  368. if (LevelCFG.dict[singleArr[0]])
  369. continue;
  370. var item = new LevelCFG();
  371. item.id = Number(singleArr[0]);
  372. item.road = singleArr[1];
  373. item.roleinitpos = JSON.parse(singleArr[2]);
  374. item.npc = JSON.parse(singleArr[3]);
  375. item.firstScenepos = singleArr[4];
  376. item.winGold = Number(singleArr[5]);
  377. item.failGod = singleArr[6];
  378. LevelCFG.dict[item.id] = item;
  379. LevelCFG.vec.push(item);
  380. }
  381. };
  382. LevelCFG.dict = {};
  383. LevelCFG.vec = [];
  384. return LevelCFG;
  385. }());
  386. exports.default = LevelCFG;
  387. },{}],8:[function(require,module,exports){
  388. "use strict";
  389. Object.defineProperty(exports, "__esModule", { value: true });
  390. //------------------------------------------------------------------------------
  391. //工具生成,请勿修改。
  392. //配置文件名称:npc.xlsx。
  393. //------------------------------------------------------------------------------
  394. var NpcCFG = /** @class */ (function () {
  395. function NpcCFG() {
  396. }
  397. NpcCFG.initCfg = function (str) {
  398. var i = 0;
  399. var arr = str.split("\n");
  400. var i = 0;
  401. for (i = 0; i < arr.length; i++) {
  402. var singleStr = arr[i];
  403. var singleArr = singleStr.split("&");
  404. if (NpcCFG.dict[singleArr[0]])
  405. continue;
  406. var item = new NpcCFG();
  407. item.id = Number(singleArr[0]);
  408. item.name = singleArr[1];
  409. item.speed = Number(singleArr[2]);
  410. item.frontjump = JSON.parse(singleArr[3]);
  411. item.leftjump = JSON.parse(singleArr[4]);
  412. item.rightjump = JSON.parse(singleArr[5]);
  413. item.upclimb = Number(singleArr[6]);
  414. item.slideclimb = JSON.parse(singleArr[7]);
  415. item.jump_left = Number(singleArr[8]);
  416. item.jump_right = Number(singleArr[9]);
  417. item.start_ahead = Number(singleArr[10]);
  418. item.distance = Number(singleArr[11]);
  419. NpcCFG.dict[item.id] = item;
  420. NpcCFG.vec.push(item);
  421. }
  422. };
  423. NpcCFG.dict = {};
  424. NpcCFG.vec = [];
  425. return NpcCFG;
  426. }());
  427. exports.default = NpcCFG;
  428. },{}],9:[function(require,module,exports){
  429. "use strict";
  430. Object.defineProperty(exports, "__esModule", { value: true });
  431. //------------------------------------------------------------------------------
  432. //工具生成,请勿修改。
  433. //配置文件名称:role.xlsx。
  434. //------------------------------------------------------------------------------
  435. var RoleCFG = /** @class */ (function () {
  436. function RoleCFG() {
  437. }
  438. RoleCFG.initCfg = function (str) {
  439. var i = 0;
  440. var arr = str.split("\n");
  441. var i = 0;
  442. for (i = 0; i < arr.length; i++) {
  443. var singleStr = arr[i];
  444. var singleArr = singleStr.split("&");
  445. if (RoleCFG.dict[singleArr[0]])
  446. continue;
  447. var item = new RoleCFG();
  448. item.id = Number(singleArr[0]);
  449. item.name = singleArr[1];
  450. item.speed = Number(singleArr[2]);
  451. item.frontjump = JSON.parse(singleArr[3]);
  452. item.leftjump = JSON.parse(singleArr[4]);
  453. item.rightjump = JSON.parse(singleArr[5]);
  454. item.upclimb = Number(singleArr[6]);
  455. item.slideclimb = JSON.parse(singleArr[7]);
  456. item.getState = Number(singleArr[8]);
  457. item.need = Number(singleArr[9]);
  458. item.icon = singleArr[10];
  459. RoleCFG.dict[item.id] = item;
  460. RoleCFG.vec.push(item);
  461. }
  462. };
  463. RoleCFG.dict = {};
  464. RoleCFG.vec = [];
  465. return RoleCFG;
  466. }());
  467. exports.default = RoleCFG;
  468. },{}],10:[function(require,module,exports){
  469. "use strict";
  470. Object.defineProperty(exports, "__esModule", { value: true });
  471. var Global_1 = require("../../Global");
  472. /*
  473. * name;
  474. */
  475. var PathConfig;
  476. (function (PathConfig) {
  477. PathConfig.res = "res/";
  478. PathConfig.wxlocal = "wxlocal/";
  479. PathConfig.configs = "configs/";
  480. PathConfig.ui = "ui/";
  481. PathConfig.sounds = "sound/";
  482. PathConfig.versionrandom = "";
  483. PathConfig.icon = "icon/";
  484. PathConfig.scene = "scenes/";
  485. function init() {
  486. PathConfig.versionrandom = "?v=" + Math.random();
  487. }
  488. PathConfig.init = init;
  489. function getsound(id) {
  490. return Global_1.Global.getUrl(PathConfig.wxlocal + PathConfig.sounds + id + ".mp3");
  491. }
  492. PathConfig.getsound = getsound;
  493. function getResConfig() {
  494. return Global_1.Global.getUrl(PathConfig.wxlocal + PathConfig.configs + "resConfig.json");
  495. }
  496. PathConfig.getResConfig = getResConfig;
  497. function getConfig(configname) {
  498. return Global_1.Global.getUrl(PathConfig.wxlocal + PathConfig.configs + configname + ".bin");
  499. }
  500. PathConfig.getConfig = getConfig;
  501. function get3Dscene(name) {
  502. return Global_1.Global.getUrl(PathConfig.res + PathConfig.scene + "Conventional/" + name + ".ls");
  503. }
  504. PathConfig.get3Dscene = get3Dscene;
  505. function get3DModel(name) {
  506. return Global_1.Global.getUrl(PathConfig.res + PathConfig.scene + "Conventional/" + name + ".lh");
  507. }
  508. PathConfig.get3DModel = get3DModel;
  509. function get3DRoleModel(name) {
  510. return Global_1.Global.getUrl(PathConfig.res + "role/Conventional/" + name + ".lh");
  511. }
  512. PathConfig.get3DRoleModel = get3DRoleModel;
  513. function getroleicon(id) {
  514. return Global_1.Global.getUrl(PathConfig.res + PathConfig.icon + "roleicon/" + id + ".png");
  515. }
  516. PathConfig.getroleicon = getroleicon;
  517. function getVerisonurl() {
  518. if (Global_1.Global.isdebug) {
  519. return Global_1.Global.getUrl(PathConfig.res + "version.json") + PathConfig.versionrandom;
  520. }
  521. return Global_1.Global.getUrl(PathConfig.res + "version" + Global_1.Global.resconfigVersion + ".json");
  522. }
  523. PathConfig.getVerisonurl = getVerisonurl;
  524. function getGameVersion() {
  525. return Global_1.Global.getUrl("gameversion.json");
  526. }
  527. PathConfig.getGameVersion = getGameVersion;
  528. })(PathConfig = exports.PathConfig || (exports.PathConfig = {}));
  529. },{"../../Global":2}],11:[function(require,module,exports){
  530. "use strict";
  531. Object.defineProperty(exports, "__esModule", { value: true });
  532. var PathConfig_1 = require("./PathConfig");
  533. var Global_1 = require("../../Global");
  534. /*
  535. * name;
  536. */
  537. var RecConfigs = /** @class */ (function (_super) {
  538. __extends(RecConfigs, _super);
  539. function RecConfigs() {
  540. return _super.call(this) || this;
  541. }
  542. RecConfigs.getInstance = function () {
  543. if (null == this.instance) {
  544. this.instance = new RecConfigs();
  545. }
  546. return this.instance;
  547. };
  548. RecConfigs.prototype.init = function () {
  549. this.groupdict = {};
  550. };
  551. RecConfigs.prototype.initRec = function (dict) {
  552. if (dict != null && !RecConfigs.ishasinit) {
  553. RecConfigs.ishasinit = true;
  554. var groupsArr = dict.groups;
  555. var resourcesArr = dict.resources;
  556. var resourcesDict = {};
  557. for (var item in resourcesArr) {
  558. var child = resourcesArr[item];
  559. switch (child.type) {
  560. case "bin":
  561. child.type = Laya.Loader.BUFFER;
  562. break;
  563. case "ls":
  564. child.type = Laya.Scene;
  565. break;
  566. case "lh":
  567. child.type = Laya.Sprite3D;
  568. break;
  569. case "lm":
  570. child.type = Laya.MeshSprite3D;
  571. break;
  572. }
  573. resourcesDict[child.name] = child;
  574. }
  575. for (var grouptype in groupsArr) {
  576. var groupchild = groupsArr[grouptype];
  577. var arr = groupchild.keys.split(",");
  578. var childArr = [];
  579. var chidstr;
  580. for (chidstr in arr) {
  581. var strChild = arr[chidstr];
  582. if (strChild != "") {
  583. var urls = resourcesDict[strChild].url;
  584. urls = urls.replace("res/", PathConfig_1.PathConfig.res);
  585. childArr.push({ url: Global_1.Global.getUrl(urls), type: resourcesDict[strChild].type });
  586. }
  587. }
  588. this.groupdict[groupchild.name] = childArr;
  589. }
  590. Laya.loader.clearRes(PathConfig_1.PathConfig.getResConfig());
  591. }
  592. };
  593. /**
  594. * 是否已经初始化
  595. */
  596. RecConfigs.ishasinit = false;
  597. return RecConfigs;
  598. }(Laya.EventDispatcher));
  599. exports.default = RecConfigs;
  600. },{"../../Global":2,"./PathConfig":10}],12:[function(require,module,exports){
  601. "use strict";
  602. Object.defineProperty(exports, "__esModule", { value: true });
  603. /*
  604. * name;
  605. */
  606. var Debuger = /** @class */ (function () {
  607. function Debuger() {
  608. }
  609. Debuger.log = function (msg) {
  610. var optionalParams = [];
  611. for (var _i = 1; _i < arguments.length; _i++) {
  612. optionalParams[_i - 1] = arguments[_i];
  613. }
  614. // if (Debuger.isprint&& Global.isdebug ) {
  615. // if(optionalParams&&optionalParams.length>0){
  616. // console.log(msg,optionalParams);
  617. // }else{
  618. // console.log(msg);
  619. // }
  620. // }
  621. if (Debuger.isprint) {
  622. if (optionalParams && optionalParams.length > 0) {
  623. console.log(msg, optionalParams);
  624. }
  625. else {
  626. console.log(msg);
  627. }
  628. }
  629. };
  630. Debuger.error = function (msg) {
  631. var optionalParams = [];
  632. for (var _i = 1; _i < arguments.length; _i++) {
  633. optionalParams[_i - 1] = arguments[_i];
  634. }
  635. if (Debuger.isprint) {
  636. console.error(msg, optionalParams);
  637. }
  638. };
  639. /**
  640. * 是否打印
  641. */
  642. Debuger.isprint = true;
  643. return Debuger;
  644. }());
  645. exports.default = Debuger;
  646. },{}],13:[function(require,module,exports){
  647. "use strict";
  648. Object.defineProperty(exports, "__esModule", { value: true });
  649. /*
  650. * name;
  651. */
  652. var TimerService = /** @class */ (function (_super) {
  653. __extends(TimerService, _super);
  654. function TimerService() {
  655. var _this = _super.call(this) || this;
  656. _this._timeScale = 1;
  657. _this._unscalableList = [];
  658. return _this;
  659. }
  660. TimerService.getInastance = function () {
  661. if (null == this.instance) {
  662. this.instance = new TimerService();
  663. }
  664. return this.instance;
  665. };
  666. TimerService.prototype.init = function () {
  667. Laya.timer.frameLoop(1, this, this.onTimer);
  668. };
  669. TimerService.prototype.initEvent = function () {
  670. };
  671. TimerService.prototype.stop = function () {
  672. Laya.timer.clear(this, this.onTimer);
  673. };
  674. TimerService.prototype.recover = function () {
  675. this.stop();
  676. Laya.timer.frameLoop(1, this, this.onTimer);
  677. };
  678. TimerService.prototype.onTimer = function () {
  679. var i = 0;
  680. for (i = 0; i < this._unscalableList.length; i++) {
  681. this._unscalableList[i].update(Laya.timer.delta * this._timeScale);
  682. }
  683. };
  684. TimerService.prototype.hasUpdataTarget = function (updateTarget) {
  685. var index;
  686. index = this._unscalableList.indexOf(updateTarget);
  687. if (index != -1) {
  688. return true;
  689. }
  690. return false;
  691. };
  692. TimerService.prototype.addUpdateTarget = function (updateTarget) {
  693. var index;
  694. index = this._unscalableList.indexOf(updateTarget);
  695. if (index == -1) {
  696. this._unscalableList.push(updateTarget);
  697. }
  698. };
  699. TimerService.prototype.removeUpdateTarget = function (updateTarget) {
  700. var index = this._unscalableList.indexOf(updateTarget);
  701. if (index != -1) {
  702. this._unscalableList.splice(index, 1);
  703. }
  704. };
  705. Object.defineProperty(TimerService.prototype, "timeScale", {
  706. get: function () {
  707. return this._timeScale;
  708. },
  709. /**
  710. * @private
  711. */
  712. set: function (value) {
  713. if (value < 0 || isNaN(value)) {
  714. value = 1;
  715. }
  716. this._timeScale = value;
  717. },
  718. enumerable: true,
  719. configurable: true
  720. });
  721. return TimerService;
  722. }(Laya.EventDispatcher));
  723. exports.default = TimerService;
  724. },{}],14:[function(require,module,exports){
  725. "use strict";
  726. Object.defineProperty(exports, "__esModule", { value: true });
  727. var UserCacheType_1 = require("../gamemodule/userinfo/events/UserCacheType");
  728. var CacheManager_1 = require("../managers/CacheManager");
  729. var TongjiHttps_1 = require("./net/TongjiHttps");
  730. var TimesTamper = /** @class */ (function () {
  731. function TimesTamper() {
  732. this.lastgameTime = 0;
  733. /**
  734. * 同步服务器时间(秒)
  735. */
  736. this._serverTime = 0;
  737. this.iscan = false;
  738. this._onlinedistime = 0;
  739. this._time = 0;
  740. this._onlinetime = 0;
  741. }
  742. TimesTamper.getInstance = function () {
  743. if (!this.instance) {
  744. this.instance = new TimesTamper();
  745. }
  746. return this.instance;
  747. };
  748. TimesTamper.prototype.init = function () {
  749. this.lastgameTime = CacheManager_1.default.getInstance().getnum(UserCacheType_1.default.lasttime);
  750. Laya.timer.frameLoop(1, this, this.update);
  751. };
  752. TimesTamper.prototype.updateServiceTime = function (serverTime) {
  753. this._serverTime = Number(serverTime);
  754. this.iscan = true;
  755. this._onlinedistime = this._serverTime;
  756. CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.lasttime, this._serverTime.toString());
  757. };
  758. TimesTamper.prototype.update = function () {
  759. if (this.iscan) {
  760. this._time += Laya.timer.delta;
  761. this._onlinetime += Laya.timer.delta;
  762. this._serverTime += Laya.timer.delta / 1000;
  763. if (this._time >= 30000) {
  764. this._time = 0;
  765. CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.lasttime, this._serverTime.toString());
  766. }
  767. if (this._onlinetime >= 90000) {
  768. this._onlinetime = 0;
  769. this.sendonlineTongji();
  770. }
  771. }
  772. };
  773. TimesTamper.prototype.sendonlineTongji = function () {
  774. var distime = this.serverTime - this._onlinedistime;
  775. if (distime > 0) {
  776. this._onlinedistime = this.serverTime;
  777. TongjiHttps_1.default.getInstance().tongjiData("Online", "", distime);
  778. }
  779. };
  780. Object.defineProperty(TimesTamper.prototype, "serverTime", {
  781. /**
  782. * 服务器时间 ( 秒 )
  783. * @return
  784. *
  785. */
  786. get: function () {
  787. return this._serverTime;
  788. },
  789. enumerable: true,
  790. configurable: true
  791. });
  792. return TimesTamper;
  793. }());
  794. exports.TimesTamper = TimesTamper;
  795. },{"../gamemodule/userinfo/events/UserCacheType":55,"../managers/CacheManager":59,"./net/TongjiHttps":28}],15:[function(require,module,exports){
  796. "use strict";
  797. Object.defineProperty(exports, "__esModule", { value: true });
  798. var ObjectPool_1 = require("../mvc/ObjectPool");
  799. var ComEventVO = /** @class */ (function () {
  800. function ComEventVO() {
  801. }
  802. ComEventVO.prototype.clear = function () {
  803. this.target = null;
  804. this.type = null;
  805. this.thisObject = null;
  806. this.listener = null;
  807. ObjectPool_1.default.clearObj(ComEventVO.poolkey, this);
  808. };
  809. ComEventVO.poolkey = "ComEventVO";
  810. return ComEventVO;
  811. }());
  812. exports.default = ComEventVO;
  813. },{"../mvc/ObjectPool":23}],16:[function(require,module,exports){
  814. "use strict";
  815. Object.defineProperty(exports, "__esModule", { value: true });
  816. var LEvent_1 = require("./LEvent");
  817. var LListener_1 = require("./LListener");
  818. /*
  819. * name;
  820. */
  821. var EventUtils;
  822. (function (EventUtils) {
  823. function init() {
  824. LListener_1.default.getInstance();
  825. }
  826. EventUtils.init = init;
  827. //新建事件
  828. function Event(type, obj, bubbles, cancelable) {
  829. if (obj === void 0) { obj = null; }
  830. if (bubbles === void 0) { bubbles = false; }
  831. if (cancelable === void 0) { cancelable = false; }
  832. return new LEvent_1.default(type, obj, bubbles, cancelable);
  833. }
  834. EventUtils.Event = Event;
  835. //派发事件
  836. function dispatchEvent(type, obj, bubbles, cancelable) {
  837. if (obj === void 0) { obj = null; }
  838. if (bubbles === void 0) { bubbles = false; }
  839. if (cancelable === void 0) { cancelable = false; }
  840. LListener_1.default._instance.dispatchEvent(type, obj);
  841. }
  842. EventUtils.dispatchEvent = dispatchEvent;
  843. //监听事件
  844. function addEventListener(type, thisObject, listener, useCapture, priority) {
  845. if (useCapture === void 0) { useCapture = false; }
  846. if (priority === void 0) { priority = 0; }
  847. LListener_1.default._instance.addEventListener(type, listener, thisObject, useCapture, priority);
  848. }
  849. EventUtils.addEventListener = addEventListener;
  850. function hasEventListener(type) {
  851. return LListener_1.default._instance.hasEventListener(type);
  852. }
  853. EventUtils.hasEventListener = hasEventListener;
  854. function removeEventListener(type, thisObject, listener, useCapture, priority) {
  855. if (useCapture === void 0) { useCapture = false; }
  856. if (priority === void 0) { priority = 0; }
  857. LListener_1.default._instance.removeEventListener(type, listener, thisObject);
  858. }
  859. EventUtils.removeEventListener = removeEventListener;
  860. })(EventUtils = exports.EventUtils || (exports.EventUtils = {}));
  861. },{"./LEvent":17,"./LListener":18}],17:[function(require,module,exports){
  862. "use strict";
  863. Object.defineProperty(exports, "__esModule", { value: true });
  864. var LEvent = /** @class */ (function (_super) {
  865. __extends(LEvent, _super);
  866. function LEvent(type, obj, bubbles, cancelable) {
  867. if (obj === void 0) { obj = null; }
  868. if (bubbles === void 0) { bubbles = false; }
  869. if (cancelable === void 0) { cancelable = false; }
  870. var _this = _super.call(this) || this;
  871. _this.CLASS_NAME = "LEvent";
  872. if (obj) {
  873. _this._obj = obj;
  874. }
  875. return _this;
  876. }
  877. LEvent.prototype.clone = function (obj) {
  878. return new LEvent(this.type, obj ? obj : this._obj);
  879. };
  880. LEvent.prototype.toString = function () {
  881. console.log(this.CLASS_NAME, "type", "bubbles", "cancelable");
  882. };
  883. Object.defineProperty(LEvent.prototype, "param", {
  884. /**
  885. * 传参获取
  886. * @returns {any}
  887. */
  888. get: function () {
  889. return this._obj;
  890. },
  891. enumerable: true,
  892. configurable: true
  893. });
  894. return LEvent;
  895. }(Laya.Event));
  896. exports.default = LEvent;
  897. },{}],18:[function(require,module,exports){
  898. "use strict";
  899. Object.defineProperty(exports, "__esModule", { value: true });
  900. /**
  901. * 全局侦听类及消息处理
  902. */
  903. var LListener = /** @class */ (function (_super) {
  904. __extends(LListener, _super);
  905. function LListener() {
  906. var _this = _super.call(this) || this;
  907. _this.isInit = false;
  908. if (_this.isInit) {
  909. }
  910. if (_this._dispatcher == null) {
  911. _this._dispatcher = new Laya.EventDispatcher();
  912. _this.isInit = true;
  913. }
  914. return _this;
  915. }
  916. LListener.getInstance = function () {
  917. if (this._instance == null)
  918. this._instance = new LListener();
  919. return this._instance;
  920. };
  921. LListener.prototype.addEventListener = function (type, listener, thisObject, useCapture, priority) {
  922. if (useCapture === void 0) { useCapture = false; }
  923. if (priority === void 0) { priority = 0; }
  924. this._dispatcher.on(type, thisObject, listener);
  925. };
  926. LListener.prototype.removeEventListener = function (type, listener, thisObject, useCapture) {
  927. if (useCapture === void 0) { useCapture = false; }
  928. this._dispatcher.off(type, thisObject, listener);
  929. };
  930. LListener.prototype.hasEventListener = function (type) {
  931. return this._dispatcher.hasListener(type);
  932. };
  933. LListener.prototype.dispatchEvent = function (type, data) {
  934. return this._dispatcher.event(type, data);
  935. };
  936. return LListener;
  937. }(Laya.EventDispatcher));
  938. exports.default = LListener;
  939. },{}],19:[function(require,module,exports){
  940. "use strict";
  941. Object.defineProperty(exports, "__esModule", { value: true });
  942. var MVCObjectPool_1 = require("./MVCObjectPool");
  943. var EventUtils_1 = require("../events/EventUtils");
  944. var Singleton_1 = require("./Singleton");
  945. var GameSocket_1 = require("../net/GameSocket");
  946. var RoleVO_1 = require("../../gamemodule/userinfo/vo/RoleVO");
  947. /*
  948. * name;
  949. */
  950. var BaseProxys = /** @class */ (function (_super) {
  951. __extends(BaseProxys, _super);
  952. function BaseProxys() {
  953. var _this = _super.call(this) || this;
  954. _this._objectPool = MVCObjectPool_1.default.getInstance();
  955. _this.initProxy();
  956. return _this;
  957. }
  958. BaseProxys.prototype.initProxy = function () {
  959. };
  960. /**
  961. * 注册全局侦听事件
  962. *
  963. */
  964. BaseProxys.prototype.addDataEvent = function (type, callbackobj, callbackHandler) {
  965. EventUtils_1.EventUtils.addEventListener(type, callbackobj, callbackHandler);
  966. };
  967. /**
  968. * 抛出全局事件
  969. */
  970. BaseProxys.prototype.dispacheDataEvent = function (type, data) {
  971. if (data === void 0) { data = null; }
  972. EventUtils_1.EventUtils.dispatchEvent(type, data);
  973. };
  974. /**
  975. * 移除全局侦听事件
  976. */
  977. BaseProxys.prototype.removeDataEvent = function (type, callbackobj, callbackHandler) {
  978. EventUtils_1.EventUtils.removeEventListener(type, callbackobj, callbackHandler);
  979. };
  980. BaseProxys.prototype.getProxy = function (ref) {
  981. return this._objectPool.getProxy(ref);
  982. };
  983. BaseProxys.prototype.sendMessage = function (act, data, isShowWait) {
  984. if (data === void 0) { data = null; }
  985. if (isShowWait === void 0) { isShowWait = true; }
  986. GameSocket_1.default.getInstance().sendMessage(act, data, isShowWait);
  987. };
  988. Object.defineProperty(BaseProxys.prototype, "roleVO", {
  989. get: function () {
  990. if (!this._roleVo) {
  991. this._roleVo = RoleVO_1.default.getInstance();
  992. }
  993. return this._roleVo;
  994. },
  995. enumerable: true,
  996. configurable: true
  997. });
  998. return BaseProxys;
  999. }(Singleton_1.default));
  1000. exports.default = BaseProxys;
  1001. },{"../../gamemodule/userinfo/vo/RoleVO":57,"../events/EventUtils":16,"../net/GameSocket":27,"./MVCObjectPool":22,"./Singleton":24}],20:[function(require,module,exports){
  1002. "use strict";
  1003. Object.defineProperty(exports, "__esModule", { value: true });
  1004. var ResDataManager_1 = require("../../managers/ResDataManager");
  1005. var ResourceManager_1 = require("../../managers/ResourceManager");
  1006. var EventUtils_1 = require("../events/EventUtils");
  1007. var MVCObjectPool_1 = require("./MVCObjectPool");
  1008. var WindowAnmoType_1 = require("./WindowAnmoType");
  1009. var UiManager_1 = require("../../managers/UiManager");
  1010. var ComEventVO_1 = require("../events/ComEventVO");
  1011. var ObjectPool_1 = require("./ObjectPool");
  1012. /*
  1013. * name;
  1014. */
  1015. var BaseView = /** @class */ (function (_super) {
  1016. __extends(BaseView, _super);
  1017. /**
  1018. * 界面初始化
  1019. * @param pkgName 包名
  1020. * @param resName 界面名
  1021. * @param isAddpackage 是否添加包
  1022. * @param windowAnmoType 界面打开动画类型
  1023. * @param clickBgIsColse 黑色背景 0:无背景 1:背景无关闭事件 2:背景有关闭事件
  1024. * @param iscache 是否添加到缓存池(如是为true,则加入进缓存池定时根据是否引用清理。 若是为false,则不清理当前缓存,如若清理,请手动清理 )
  1025. */
  1026. function BaseView(pkgName, resName, isAddpackage, windowAnmoType, clickBgIsColse, iscache) {
  1027. if (pkgName === void 0) { pkgName = ""; }
  1028. if (resName === void 0) { resName = ""; }
  1029. if (isAddpackage === void 0) { isAddpackage = false; }
  1030. if (windowAnmoType === void 0) { windowAnmoType = WindowAnmoType_1.default.WindowAnmoType_none; }
  1031. if (clickBgIsColse === void 0) { clickBgIsColse = 0; }
  1032. if (iscache === void 0) { iscache = true; }
  1033. var _this = _super.call(this) || this;
  1034. _this.isguideing = false;
  1035. _this._pkgName = "";
  1036. _this._resName = "";
  1037. _this._iscache = true;
  1038. _this._WindowAnmoType = WindowAnmoType_1.default.WindowAnmoType_none;
  1039. _this._clickBgIsColse = 0;
  1040. /**
  1041. * 事件容器
  1042. */
  1043. _this._eventdict = {};
  1044. /**
  1045. * 全局事件容器
  1046. */
  1047. _this._globalEventdict = {};
  1048. _this._iscache = iscache;
  1049. _this._pkgName = pkgName;
  1050. _this._resName = resName;
  1051. _this._isAddpackage = isAddpackage;
  1052. _this._WindowAnmoType = windowAnmoType;
  1053. _this._clickBgIsColse = clickBgIsColse;
  1054. _this.showModalWait();
  1055. return _this;
  1056. }
  1057. BaseView.prototype.setclickBgIsColse = function () {
  1058. if (this.isShowing && this._clickBgIsColse > 0 && this.contentPane) {
  1059. if (!this._clickBg && BaseView.viewbgUrl != "") {
  1060. this._clickBg = new fairygui.GLoader();
  1061. this._clickBg.touchable = true;
  1062. this._clickBg.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  1063. this._clickBg.url = BaseView.viewbgUrl;
  1064. this._clickBg.fill = fairygui.LoaderFillType.ScaleFree;
  1065. this._clickBg.alpha = 0;
  1066. this.contentPane.addChildAt(this._clickBg, 0);
  1067. }
  1068. }
  1069. };
  1070. /**
  1071. * 加载ui
  1072. * @param groupName 组名
  1073. * @param target 作用域
  1074. * @param onLoadedHandler 加载完成回调函数
  1075. */
  1076. BaseView.prototype.loadUi = function (groupName, target, onLoadedHandler) {
  1077. this._loadTarget = target;
  1078. this._onLoadedHandler = onLoadedHandler;
  1079. ResourceManager_1.default.getInstance().loadGroup(groupName, this, this.loadsucceed);
  1080. };
  1081. /**
  1082. * 加载资源数组
  1083. * @param urls 资源数组
  1084. * @param target 作用域
  1085. * @param onLoadedHandler 加载完成回调函数
  1086. */
  1087. BaseView.prototype.loadUibyArr = function (urls, target, onLoadedHandler) {
  1088. // this.showModalWait();
  1089. this._loadTarget = target;
  1090. this._onLoadedHandler = onLoadedHandler;
  1091. ResourceManager_1.default.getInstance().Loaders(urls, this, this.loadsucceed);
  1092. };
  1093. BaseView.prototype.loadsucceed = function () {
  1094. if (this._loadTarget && this._onLoadedHandler) {
  1095. this._onLoadedHandler.call(this._loadTarget);
  1096. }
  1097. };
  1098. BaseView.prototype.removeEffectPackage = function (packageName) {
  1099. ResDataManager_1.default.instance.removePackage(packageName, true);
  1100. };
  1101. BaseView.prototype.getpanelController = function (name) {
  1102. if (this.item_panel) {
  1103. return this.item_panel.getController(name);
  1104. }
  1105. return null;
  1106. };
  1107. BaseView.prototype.getpanelTransition = function (name) {
  1108. if (this.item_panel) {
  1109. return this.item_panel.getTransition(name);
  1110. }
  1111. return null;
  1112. };
  1113. BaseView.prototype.getChildformContentPanel = function (name) {
  1114. if (this.contentPane) {
  1115. return this.contentPane.getChild(name);
  1116. }
  1117. return null;
  1118. };
  1119. /*界面初始化*/
  1120. BaseView.prototype.onInit = function () {
  1121. _super.prototype.onInit.call(this);
  1122. if (this._pkgName != "" && this._resName != "") {
  1123. this.parseUi(this._pkgName, this._resName, this._isAddpackage, this._WindowAnmoType, this._clickBgIsColse, this._iscache);
  1124. }
  1125. };
  1126. //解析ui
  1127. BaseView.prototype.parseUi = function (pkgname, resname, isaddpackage, windowAnmoType, clickBgIsColse, iscache) {
  1128. if (windowAnmoType === void 0) { windowAnmoType = WindowAnmoType_1.default.WindowAnmoType_none; }
  1129. if (clickBgIsColse === void 0) { clickBgIsColse = 0; }
  1130. if (iscache === void 0) { iscache = true; }
  1131. this._pkgName = pkgname;
  1132. this._resName = resname;
  1133. this._WindowAnmoType = windowAnmoType;
  1134. this._clickBgIsColse = clickBgIsColse;
  1135. ResDataManager_1.default.instance.adduiPackage(pkgname, isaddpackage, iscache);
  1136. this.contentPane = fairygui.UIPackage.createObject(pkgname, resname).asCom;
  1137. for (var str in this.contentPane._children) {
  1138. var item = this.contentPane._children[str];
  1139. if (item.name == "item_panel") {
  1140. var itempanel = item;
  1141. if (itempanel) {
  1142. for (var str1 in itempanel._children) {
  1143. var itempanelItem = itempanel._children[str1];
  1144. this[itempanelItem.name] = itempanelItem;
  1145. }
  1146. }
  1147. // this[item.name] = item;
  1148. this.item_panel = item;
  1149. }
  1150. else {
  1151. this[item.name] = item;
  1152. }
  1153. }
  1154. this.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  1155. this.contentPane.setPivot(0.5, 0.5);
  1156. this.setPivot(0.5, 0.5);
  1157. this.setclickBgIsColse();
  1158. this.initView();
  1159. this.initEvent();
  1160. this.do1ShowAnimation();
  1161. };
  1162. BaseView.prototype.initView = function () {
  1163. };
  1164. BaseView.prototype.initEvent = function () {
  1165. };
  1166. BaseView.prototype.do1ShowAnimation = function () {
  1167. switch (this._WindowAnmoType) {
  1168. case WindowAnmoType_1.default.WindowAnmoType_none:
  1169. this.windowanmoend();
  1170. break;
  1171. case WindowAnmoType_1.default.WindowAnmoType_addmoveToMiddle:
  1172. this.contentPane.x = fairygui.GRoot.inst.width;
  1173. Laya.Tween.to(this.contentPane, { x: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
  1174. break;
  1175. case WindowAnmoType_1.default.WindowAnmoType_addmoveFromBottom:
  1176. this.contentPane.y = fairygui.GRoot.inst.height;
  1177. Laya.Tween.to(this.contentPane, { y: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
  1178. break;
  1179. case WindowAnmoType_1.default.WindowAnmoType_addscaleMinToMax:
  1180. this.contentPane.scaleX = this.contentPane.scaleY = 0.01;
  1181. Laya.Tween.to(this.contentPane, { scaleX: 1, scaleY: 1 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
  1182. break;
  1183. }
  1184. };
  1185. BaseView.prototype.windowanmoend = function () {
  1186. Laya.timer.callLater(this, this.onShowView);
  1187. };
  1188. BaseView.prototype.onShowView = function () {
  1189. this.closeModalWait();
  1190. this.showClickBg();
  1191. };
  1192. BaseView.prototype.showClickBg = function () {
  1193. if (this._clickBg) {
  1194. this._clickBg.alpha = 0.55;
  1195. if (this._clickBgIsColse == 2 && !this.hasClickListener()) {
  1196. this._clickBg.onClick(this, this.closebgClick);
  1197. }
  1198. }
  1199. };
  1200. BaseView.prototype.closebgClick = function () {
  1201. UiManager_1.UiManager.instance.close(this.viewKey, true);
  1202. };
  1203. /**
  1204. * 界面关闭事件
  1205. */
  1206. BaseView.prototype.onCloseView = function (windowAnmoType) {
  1207. if (windowAnmoType === void 0) { windowAnmoType = ""; }
  1208. if (this._clickBg) {
  1209. this._clickBg.visible = false;
  1210. }
  1211. if (windowAnmoType == "") {
  1212. switch (this._WindowAnmoType) {
  1213. case WindowAnmoType_1.default.WindowAnmoType_none:
  1214. this.destory();
  1215. break;
  1216. case WindowAnmoType_1.default.WindowAnmoType_addmoveToMiddle:
  1217. Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  1218. break;
  1219. case WindowAnmoType_1.default.WindowAnmoType_addmoveFromBottom:
  1220. Laya.Tween.to(this, { y: fairygui.GRoot.inst.height }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  1221. break;
  1222. case WindowAnmoType_1.default.WindowAnmoType_addscaleMinToMax:
  1223. Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  1224. break;
  1225. }
  1226. }
  1227. else {
  1228. switch (windowAnmoType) {
  1229. case WindowAnmoType_1.default.WindowAnmoType_none:
  1230. this.destory();
  1231. break;
  1232. case WindowAnmoType_1.default.WindowAnmoType_removescaleMaxToMin:
  1233. Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  1234. break;
  1235. case WindowAnmoType_1.default.WindowAnmoType_removemoveToRight:
  1236. Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  1237. break;
  1238. }
  1239. }
  1240. };
  1241. BaseView.prototype.getComById = function (id) {
  1242. return this.contentPane.getChild(id).asCom;
  1243. };
  1244. BaseView.prototype.getControllerByBame = function (id) {
  1245. return this.contentPane.getController(id);
  1246. };
  1247. BaseView.prototype.getTransitionByName = function (id) {
  1248. return this.contentPane.getTransition(id);
  1249. };
  1250. /*获取管理数据模块*/
  1251. BaseView.prototype.getProxy = function (d) {
  1252. return MVCObjectPool_1.default.getInstance().getProxy(d);
  1253. };
  1254. BaseView.prototype.dispacheDataEvent = function (type, data) {
  1255. if (data === void 0) { data = null; }
  1256. EventUtils_1.EventUtils.dispatchEvent(type, data);
  1257. };
  1258. /**
  1259. * 注册全局事件
  1260. * @param type
  1261. * @param thisObject
  1262. * @param listener
  1263. */
  1264. BaseView.prototype.addDataEvent = function (type, thisObject, listener) {
  1265. if (!this._globalEventdict.hasOwnProperty(type)) {
  1266. var vo = ObjectPool_1.default.getObj(ComEventVO_1.default.poolkey);
  1267. this._globalEventdict[type] = vo;
  1268. vo.type = type;
  1269. vo.thisObject = thisObject;
  1270. vo.listener = listener;
  1271. EventUtils_1.EventUtils.addEventListener(type, thisObject, listener);
  1272. }
  1273. };
  1274. /**
  1275. * 移除全局事件
  1276. * @param type
  1277. * @param thisObject
  1278. * @param listener
  1279. */
  1280. BaseView.prototype.removeDataEvent = function (type, thisObject, listener) {
  1281. if (this._globalEventdict[type]) {
  1282. var vo = this._globalEventdict[type];
  1283. EventUtils_1.EventUtils.removeEventListener(type, thisObject, listener);
  1284. vo.clear();
  1285. delete this._globalEventdict[type];
  1286. }
  1287. };
  1288. /**
  1289. * 注册组件事件,调用此方法,界面关闭会自动移除
  1290. * @param type 时间类型
  1291. * @param callbackobj 作用域
  1292. * @param callbackHandler 事件回调
  1293. */
  1294. BaseView.prototype.addListener = function (target, type, thisObject, listener, args) {
  1295. if (args === void 0) { args = null; }
  1296. if (target) {
  1297. if (target.name == null || target.name == "") {
  1298. throw "baseview addListener target.name is null";
  1299. }
  1300. var vo = ObjectPool_1.default.getObj(ComEventVO_1.default.poolkey);
  1301. vo.target = target;
  1302. vo.type = type;
  1303. vo.thisObject = thisObject;
  1304. vo.listener = listener;
  1305. if (!this._eventdict.hasOwnProperty(target.name)) {
  1306. this._eventdict[target.name] = [];
  1307. }
  1308. var bo = this.hasListener(target, type);
  1309. if (!bo) {
  1310. target.on(type, thisObject, listener, args);
  1311. this._eventdict[target.name].push(vo);
  1312. }
  1313. }
  1314. };
  1315. BaseView.prototype.hasListener = function (target, type) {
  1316. var eventArr;
  1317. eventArr = this._eventdict[target.name];
  1318. var childvo;
  1319. for (var s in eventArr) {
  1320. childvo = eventArr[s];
  1321. if (childvo && childvo.type == type) {
  1322. return true;
  1323. }
  1324. }
  1325. return false;
  1326. };
  1327. /**
  1328. * 移除组件事件
  1329. * @param type 时间类型
  1330. * @param callbackobj 作用域
  1331. * @param callbackHandler 事件回调
  1332. */
  1333. BaseView.prototype.removesListener = function (target, type, thisObject, listener) {
  1334. if (target && this._eventdict[target.name]) {
  1335. var arr = this._eventdict[target.name];
  1336. var i = 0;
  1337. var nums = arr.length;
  1338. var vo;
  1339. for (i; i < nums; i++) {
  1340. vo = arr[i];
  1341. if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) {
  1342. target.off(type, thisObject, listener);
  1343. vo.clear();
  1344. arr.splice(i, 1);
  1345. break;
  1346. }
  1347. }
  1348. }
  1349. };
  1350. /**
  1351. * 移除所有全局事件
  1352. */
  1353. BaseView.prototype.removeAllGlobalEvent = function () {
  1354. if (this._globalEventdict) {
  1355. var s;
  1356. var dict = this._globalEventdict;
  1357. for (s in dict) {
  1358. var vo = dict[s];
  1359. if (vo) {
  1360. this.removeDataEvent(vo.type, vo.thisObject, vo.listener);
  1361. }
  1362. }
  1363. }
  1364. this._globalEventdict = {};
  1365. };
  1366. /**
  1367. * 移除所有组件事件
  1368. */
  1369. BaseView.prototype.removeAllComEvent = function () {
  1370. if (this._eventdict) {
  1371. var s;
  1372. var dict = this._eventdict;
  1373. var arr;
  1374. var i;
  1375. var nums = 0;
  1376. var vo;
  1377. for (s in dict) {
  1378. arr = dict[s];
  1379. if (arr && arr.length > 0) {
  1380. i = 0;
  1381. nums = arr.length;
  1382. for (i = nums - 1; i >= 0; i--) {
  1383. vo = arr[i];
  1384. if (vo) {
  1385. if (vo.target) {
  1386. vo.target.off(vo.type, vo.thisObject, vo.listener);
  1387. }
  1388. vo.clear();
  1389. }
  1390. arr.splice(i, 1);
  1391. }
  1392. }
  1393. delete this._eventdict[s];
  1394. }
  1395. }
  1396. this._eventdict = {};
  1397. };
  1398. BaseView.prototype.clearEvent = function () {
  1399. };
  1400. /* 销毁*/
  1401. BaseView.prototype.destory = function () {
  1402. this.clearEvent();
  1403. this.closeModalWait();
  1404. this.removeAllGlobalEvent();
  1405. this.removeAllComEvent();
  1406. this._loadTarget = null;
  1407. this._onLoadedHandler = null;
  1408. Laya.Tween.clearTween(this);
  1409. ResDataManager_1.default.instance.removePackage(this._pkgName, false);
  1410. this._pkgName = null;
  1411. this._resName = null;
  1412. if (this._clickBg) {
  1413. this._clickBg.offClick(this, this.closebgClick);
  1414. this._clickBg.dispose();
  1415. this._clickBg = null;
  1416. }
  1417. this.viewKey = null;
  1418. this.dispose();
  1419. };
  1420. BaseView.viewbgUrl = "";
  1421. return BaseView;
  1422. }(fairygui.Window));
  1423. exports.default = BaseView;
  1424. },{"../../managers/ResDataManager":62,"../../managers/ResourceManager":63,"../../managers/UiManager":66,"../events/ComEventVO":15,"../events/EventUtils":16,"./MVCObjectPool":22,"./ObjectPool":23,"./WindowAnmoType":25}],21:[function(require,module,exports){
  1425. "use strict";
  1426. Object.defineProperty(exports, "__esModule", { value: true });
  1427. var EventUtils_1 = require("../events/EventUtils");
  1428. var MVCObjectPool_1 = require("./MVCObjectPool");
  1429. var ComEventVO_1 = require("../events/ComEventVO");
  1430. var ObjectPool_1 = require("./ObjectPool");
  1431. var ChildBaseView = /** @class */ (function (_super) {
  1432. __extends(ChildBaseView, _super);
  1433. function ChildBaseView() {
  1434. var _this = _super.call(this) || this;
  1435. _this.isguideing = false;
  1436. /**
  1437. * 事件容器
  1438. */
  1439. _this._eventdict = {};
  1440. /**
  1441. * 全局事件容器
  1442. */
  1443. _this._globalEventdict = {};
  1444. return _this;
  1445. }
  1446. ChildBaseView.prototype.constructFromXML = function (xml) {
  1447. _super.prototype.constructFromXML.call(this, xml);
  1448. for (var str in this._children) {
  1449. var item = this._children[str];
  1450. this[item.name] = item;
  1451. }
  1452. this.onInit();
  1453. };
  1454. ChildBaseView.prototype.onInit = function () {
  1455. };
  1456. /*获取管理数据模块*/
  1457. ChildBaseView.prototype.getProxy = function (d) {
  1458. return MVCObjectPool_1.default.getInstance().getProxy(d);
  1459. };
  1460. ChildBaseView.prototype.dispacheDataEvent = function (type, data) {
  1461. if (data === void 0) { data = null; }
  1462. EventUtils_1.EventUtils.dispatchEvent(type, data);
  1463. };
  1464. ChildBaseView.prototype.hasDataEvent = function (type) {
  1465. return EventUtils_1.EventUtils.hasEventListener(type);
  1466. };
  1467. /**
  1468. * 注册全局事件
  1469. * @param type
  1470. * @param thisObject
  1471. * @param listener
  1472. */
  1473. ChildBaseView.prototype.addDataEvent = function (type, thisObject, listener) {
  1474. if (!this._globalEventdict.hasOwnProperty(type)) {
  1475. var vo = ObjectPool_1.default.getObj(ComEventVO_1.default.poolkey);
  1476. this._globalEventdict[type] = vo;
  1477. vo.type = type;
  1478. vo.thisObject = thisObject;
  1479. vo.listener = listener;
  1480. EventUtils_1.EventUtils.addEventListener(type, thisObject, listener);
  1481. }
  1482. };
  1483. /**
  1484. * 移除全局事件
  1485. * @param type
  1486. * @param thisObject
  1487. * @param listener
  1488. */
  1489. ChildBaseView.prototype.removeDataEvent = function (type, thisObject, listener) {
  1490. if (this._globalEventdict[type]) {
  1491. var vo = this._globalEventdict[type];
  1492. EventUtils_1.EventUtils.removeEventListener(type, thisObject, listener);
  1493. vo.clear();
  1494. delete this._globalEventdict[type];
  1495. }
  1496. };
  1497. /**
  1498. * 注册组件事件,调用此方法,界面关闭会自动移除
  1499. * @param type 时间类型
  1500. * @param callbackobj 作用域
  1501. * @param callbackHandler 事件回调
  1502. */
  1503. ChildBaseView.prototype.addListener = function (target, type, thisObject, listener, args) {
  1504. if (args === void 0) { args = null; }
  1505. if (target) {
  1506. if (target.name == null || target.name == "") {
  1507. throw "childbaseview addListener target.name is null";
  1508. }
  1509. var vo = ObjectPool_1.default.getObj(ComEventVO_1.default.poolkey);
  1510. vo.target = target;
  1511. vo.type = type;
  1512. vo.thisObject = thisObject;
  1513. vo.listener = listener;
  1514. if (!this._eventdict.hasOwnProperty(target.name)) {
  1515. this._eventdict[target.name] = [];
  1516. }
  1517. var bo = this.hasListener(target, type);
  1518. if (!bo) {
  1519. target.on(type, thisObject, listener, args);
  1520. this._eventdict[target.name].push(vo);
  1521. }
  1522. }
  1523. };
  1524. ChildBaseView.prototype.hasListener = function (target, type) {
  1525. var eventArr;
  1526. eventArr = this._eventdict[target.name];
  1527. var childvo;
  1528. for (var s in eventArr) {
  1529. childvo = eventArr[s];
  1530. if (childvo && childvo.type == type) {
  1531. return true;
  1532. }
  1533. }
  1534. return false;
  1535. };
  1536. /**
  1537. * 移除组件事件
  1538. * @param type 时间类型
  1539. * @param callbackobj 作用域
  1540. * @param callbackHandler 事件回调
  1541. */
  1542. ChildBaseView.prototype.removesListener = function (target, type, thisObject, listener) {
  1543. if (target && this._eventdict[target.name]) {
  1544. var arr = this._eventdict[target.name];
  1545. var i = 0;
  1546. var nums = arr.length;
  1547. var vo;
  1548. for (i; i < nums; i++) {
  1549. vo = arr[i];
  1550. if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) {
  1551. target.off(type, thisObject, listener);
  1552. vo.clear();
  1553. arr.splice(i, 1);
  1554. break;
  1555. }
  1556. }
  1557. }
  1558. };
  1559. /**
  1560. * 移除所有全局事件
  1561. */
  1562. ChildBaseView.prototype.removeAllGlobalEvent = function () {
  1563. if (this._globalEventdict) {
  1564. var s;
  1565. var dict = this._globalEventdict;
  1566. for (s in dict) {
  1567. var vo = dict[s];
  1568. if (vo) {
  1569. this.removeDataEvent(vo.type, vo.thisObject, vo.listener);
  1570. }
  1571. }
  1572. }
  1573. this._globalEventdict = {};
  1574. };
  1575. /**
  1576. * 移除所有组件事件
  1577. */
  1578. ChildBaseView.prototype.removeAllComEvent = function () {
  1579. if (this._eventdict) {
  1580. var s;
  1581. var dict = this._eventdict;
  1582. var arr;
  1583. var i;
  1584. var nums = 0;
  1585. var vo;
  1586. for (s in dict) {
  1587. arr = dict[s];
  1588. if (arr && arr.length > 0) {
  1589. i = 0;
  1590. nums = arr.length;
  1591. for (i = nums - 1; i >= 0; i--) {
  1592. vo = arr[i];
  1593. if (vo) {
  1594. if (vo.target) {
  1595. vo.target.off(vo.type, vo.thisObject, vo.listener);
  1596. }
  1597. vo.clear();
  1598. }
  1599. arr.splice(i, 1);
  1600. }
  1601. }
  1602. delete this._eventdict[s];
  1603. }
  1604. }
  1605. this._eventdict = {};
  1606. };
  1607. ChildBaseView.prototype.dispose = function () {
  1608. this.removeAllGlobalEvent();
  1609. this.removeAllComEvent();
  1610. _super.prototype.dispose.call(this);
  1611. };
  1612. return ChildBaseView;
  1613. }(fairygui.GComponent));
  1614. exports.default = ChildBaseView;
  1615. },{"../events/ComEventVO":15,"../events/EventUtils":16,"./MVCObjectPool":22,"./ObjectPool":23}],22:[function(require,module,exports){
  1616. "use strict";
  1617. Object.defineProperty(exports, "__esModule", { value: true });
  1618. var Singleton_1 = require("./Singleton");
  1619. /*
  1620. * name;
  1621. */
  1622. var MVCObjectPool = /** @class */ (function (_super) {
  1623. __extends(MVCObjectPool, _super);
  1624. function MVCObjectPool() {
  1625. return _super.call(this) || this;
  1626. }
  1627. MVCObjectPool.getInstance = function () {
  1628. if (this._instance == null) {
  1629. this._instance = new MVCObjectPool();
  1630. }
  1631. return this._instance;
  1632. };
  1633. MVCObjectPool.prototype.addProxy = function (ref) {
  1634. Singleton_1.default.create(ref);
  1635. };
  1636. MVCObjectPool.prototype.getProxy = function (ref) {
  1637. return Singleton_1.default.getInstance(ref);
  1638. };
  1639. MVCObjectPool.prototype.removeProxy = function (ref) {
  1640. Singleton_1.default.remove(ref);
  1641. };
  1642. MVCObjectPool.prototype.mapView = function (viewkey, ref) {
  1643. if (!MVCObjectPool._mapviewDict[viewkey]) {
  1644. MVCObjectPool._mapviewDict[viewkey] = ref;
  1645. ref.key = viewkey;
  1646. }
  1647. };
  1648. MVCObjectPool.getView = function (viewkey) {
  1649. if (!MVCObjectPool._mapviewDict[viewkey]) {
  1650. throw "err0 未绑定的viewkey:" + viewkey;
  1651. }
  1652. return MVCObjectPool._mapviewDict[viewkey];
  1653. };
  1654. MVCObjectPool._mapviewDict = {};
  1655. return MVCObjectPool;
  1656. }(Laya.EventDispatcher));
  1657. exports.default = MVCObjectPool;
  1658. },{"./Singleton":24}],23:[function(require,module,exports){
  1659. "use strict";
  1660. Object.defineProperty(exports, "__esModule", { value: true });
  1661. /*
  1662. * 对象池类
  1663. */
  1664. var ObjectPool = /** @class */ (function (_super) {
  1665. __extends(ObjectPool, _super);
  1666. function ObjectPool() {
  1667. return _super.call(this) || this;
  1668. }
  1669. ObjectPool.register = function (key, classarg) {
  1670. ObjectPool._classargDict[key] = classarg;
  1671. ObjectPool._content[key] = [];
  1672. };
  1673. ObjectPool.getObj = function (key) {
  1674. var args = [];
  1675. for (var _i = 1; _i < arguments.length; _i++) {
  1676. args[_i - 1] = arguments[_i];
  1677. }
  1678. if (ObjectPool._content[key]) {
  1679. var arr = ObjectPool._content[key];
  1680. if (arr.length == 0) {
  1681. var calssobj = ObjectPool._classargDict[key];
  1682. var vo = new calssobj();
  1683. return vo;
  1684. }
  1685. return ObjectPool._content[key].shift();
  1686. }
  1687. else {
  1688. console.log("此key值对应的类未被注册");
  1689. return null;
  1690. }
  1691. };
  1692. ObjectPool.getObjByfgui = function (url) {
  1693. if (!ObjectPool._content[url]) {
  1694. ObjectPool._content[url] = [];
  1695. }
  1696. var arr = ObjectPool._content[url];
  1697. if (arr.length == 0) {
  1698. var vo = fairygui.UIPackage.createObjectFromURL(url);
  1699. return vo;
  1700. }
  1701. return ObjectPool._content[url].shift();
  1702. };
  1703. ObjectPool.clearObj = function (key, obj) {
  1704. if (ObjectPool._content[key]) {
  1705. var index = ObjectPool._content[key].indexOf(obj);
  1706. if (index == -1) {
  1707. ObjectPool._content[key].push(obj);
  1708. }
  1709. }
  1710. };
  1711. ObjectPool._classargDict = {};
  1712. ObjectPool._content = {};
  1713. return ObjectPool;
  1714. }(Laya.EventDispatcher));
  1715. exports.default = ObjectPool;
  1716. },{}],24:[function(require,module,exports){
  1717. "use strict";
  1718. Object.defineProperty(exports, "__esModule", { value: true });
  1719. /*
  1720. * name;
  1721. */
  1722. var Singleton = /** @class */ (function (_super) {
  1723. __extends(Singleton, _super);
  1724. function Singleton() {
  1725. return _super.call(this) || this;
  1726. }
  1727. /**
  1728. * 获取单例类,若不存在则返回空
  1729. * @param ref 继承自Singleton的类
  1730. * @return *
  1731. */
  1732. Singleton.getInstance = function (ref) {
  1733. if (ref.key == null) {
  1734. throw new Error("getinstance erro");
  1735. }
  1736. return this._dict[ref.key];
  1737. };
  1738. /**
  1739. * 获取单例类,若不存在则创建
  1740. * @param ref 继承自Singleton的类
  1741. * @return *
  1742. */
  1743. Singleton.getInstanceOrCreate = function (ref) {
  1744. if (ref.key == null) {
  1745. throw new Error("getInstanceOrCreate erro");
  1746. }
  1747. this.create(ref);
  1748. return this._dict[ref.key];
  1749. };
  1750. /**
  1751. * 创建单例类
  1752. * @param ref 继承自Singleton的类
  1753. * @return void
  1754. */
  1755. Singleton.create = function (ref) {
  1756. if (ref.key == null) {
  1757. throw new Error("create erro");
  1758. }
  1759. if (this._dict[ref.key] == null) {
  1760. this._dict[ref.key] = new ref();
  1761. }
  1762. return this._dict[ref.key];
  1763. };
  1764. /**
  1765. * 删除单例类
  1766. * @param ref 继承自Singleton的类
  1767. * @return void
  1768. */
  1769. Singleton.remove = function (ref) {
  1770. var key = ref.key;
  1771. if (this._dict[key] != null) {
  1772. this._dict[key].destory();
  1773. }
  1774. };
  1775. /**
  1776. * 销毁方法
  1777. */
  1778. Singleton.prototype.destory = function () {
  1779. };
  1780. Singleton._dict = {};
  1781. return Singleton;
  1782. }(Laya.EventDispatcher));
  1783. exports.default = Singleton;
  1784. },{}],25:[function(require,module,exports){
  1785. "use strict";
  1786. Object.defineProperty(exports, "__esModule", { value: true });
  1787. /**
  1788. * 继承baseView界面的打开关闭动效类型
  1789. */
  1790. var WindowAnmoType = /** @class */ (function () {
  1791. function WindowAnmoType() {
  1792. }
  1793. /**
  1794. * 没有动效
  1795. */
  1796. WindowAnmoType.WindowAnmoType_none = "WindowAnmoType_none";
  1797. /**
  1798. * 从右边移动到中央
  1799. */
  1800. WindowAnmoType.WindowAnmoType_addmoveToMiddle = "WindowAnmoType_addmoveToMiddle";
  1801. /**
  1802. * 从最右边移出
  1803. */
  1804. WindowAnmoType.WindowAnmoType_removemoveToRight = "WindowAnmoType_removemoveToRight";
  1805. /**
  1806. * 从底部向上移动
  1807. */
  1808. WindowAnmoType.WindowAnmoType_addmoveFromBottom = "WindowAnmoType_addmoveFromBottom";
  1809. /**
  1810. * 从上向底部移动
  1811. */
  1812. WindowAnmoType.WindowAnmoType_addmoveFromup = "WindowAnmoType_addmoveFromup";
  1813. /**
  1814. * 从小变大
  1815. */
  1816. WindowAnmoType.WindowAnmoType_addscaleMinToMax = "WindowAnmoType_addscaleMinToMax";
  1817. /**
  1818. * 从大变小移出
  1819. */
  1820. WindowAnmoType.WindowAnmoType_removescaleMaxToMin = "WindowAnmoType_removescaleMaxToMin";
  1821. return WindowAnmoType;
  1822. }());
  1823. exports.default = WindowAnmoType;
  1824. },{}],26:[function(require,module,exports){
  1825. "use strict";
  1826. Object.defineProperty(exports, "__esModule", { value: true });
  1827. var Debuger_1 = require("../Debuger");
  1828. var Global_1 = require("../../Global");
  1829. /*
  1830. * name;
  1831. */
  1832. var GameHttps = /** @class */ (function (_super) {
  1833. __extends(GameHttps, _super);
  1834. function GameHttps() {
  1835. var _this = _super.call(this) || this;
  1836. _this._isrequesting = false;
  1837. _this.init();
  1838. return _this;
  1839. }
  1840. GameHttps.getInstance = function () {
  1841. if (null == this._instance) {
  1842. this._instance = new GameHttps();
  1843. }
  1844. return this._instance;
  1845. };
  1846. GameHttps.prototype.init = function () {
  1847. this._callbackList = [];
  1848. this.hr = new Laya.HttpRequest();
  1849. // if(this.hr.http)
  1850. // {
  1851. // this.hr.http.timeout = 5000;//设置超时时间;
  1852. // }
  1853. this.hr.on(Laya.Event.PROGRESS, this, this.onHttpRequestProgress);
  1854. this.hr.on(Laya.Event.COMPLETE, this, this.onHttpRequestComplete);
  1855. this.hr.on(Laya.Event.ERROR, this, this.onHttpRequestError);
  1856. };
  1857. GameHttps.prototype.sendPost = function (act, data, callback, callbackobj, isShowWait) {
  1858. if (isShowWait === void 0) { isShowWait = false; }
  1859. var itemdata = {};
  1860. itemdata.act = act;
  1861. itemdata.data = data;
  1862. itemdata.callback = callback;
  1863. itemdata.callbackobj = callbackobj;
  1864. itemdata.isShowWait = isShowWait;
  1865. itemdata.sendtype = "post";
  1866. itemdata.httpurl = Global_1.Global.httpurl;
  1867. this._callbackList.push(itemdata);
  1868. this.sendByPost(act, data, callback, callbackobj, isShowWait);
  1869. };
  1870. GameHttps.prototype.sendbyHttpurl = function (url, act, data, callback, callbackobj, isShowWait) {
  1871. if (isShowWait === void 0) { isShowWait = false; }
  1872. var itemdata = {};
  1873. itemdata.act = act;
  1874. itemdata.data = data;
  1875. itemdata.callback = callback;
  1876. itemdata.callbackobj = callbackobj;
  1877. itemdata.isShowWait = isShowWait;
  1878. itemdata.sendtype = "get";
  1879. itemdata.httpurl = url;
  1880. this._callbackList.push(itemdata);
  1881. this.sendbyget(act, data, callback, callbackobj, isShowWait);
  1882. };
  1883. GameHttps.prototype.sendByPost = function (act, data, callbackobj, callback, isShowWait) {
  1884. if (isShowWait === void 0) { isShowWait = false; }
  1885. if (this._isrequesting) {
  1886. return;
  1887. }
  1888. this._isrequesting = true;
  1889. if (isShowWait) {
  1890. fairygui.GRoot.inst.showModalWait();
  1891. }
  1892. Debuger_1.default.log("http:" + Global_1.Global.httpurl + act, data);
  1893. this.hr.send(Global_1.Global.httpurl + act, data, "post", "json", ["Content-Type", "application/json"]);
  1894. };
  1895. GameHttps.prototype.sendGet = function (act, data, callbackobj, callback, isShowWait) {
  1896. if (act === void 0) { act = null; }
  1897. if (data === void 0) { data = null; }
  1898. if (callbackobj === void 0) { callbackobj = null; }
  1899. if (callback === void 0) { callback = null; }
  1900. if (isShowWait === void 0) { isShowWait = true; }
  1901. var itemdata = {};
  1902. itemdata.act = act;
  1903. itemdata.data = data;
  1904. itemdata.callback = callback;
  1905. itemdata.callbackobj = callbackobj;
  1906. itemdata.isShowWait = isShowWait;
  1907. itemdata.sendtype = "get";
  1908. itemdata.httpurl = Global_1.Global.httpurl;
  1909. this._callbackList.push(itemdata);
  1910. this.sendbyget(act, data, callback, callbackobj, isShowWait);
  1911. };
  1912. GameHttps.prototype.sendbyget = function (act, data, callback, callbackobj, isShowWait) {
  1913. if (act === void 0) { act = null; }
  1914. if (data === void 0) { data = null; }
  1915. if (callback === void 0) { callback = null; }
  1916. if (callbackobj === void 0) { callbackobj = null; }
  1917. if (isShowWait === void 0) { isShowWait = false; }
  1918. if (this._isrequesting) {
  1919. return;
  1920. }
  1921. if (isShowWait) {
  1922. fairygui.GRoot.inst.showModalWait();
  1923. }
  1924. var itemData = this._callbackList[0];
  1925. var sendurl = "";
  1926. if (data) {
  1927. data.ACTION = act;
  1928. sendurl = itemData.httpurl + "request?json=" + JSON.stringify(data);
  1929. }
  1930. else {
  1931. sendurl = itemData.httpurl;
  1932. }
  1933. Debuger_1.default.log("GameHttp:send:", sendurl);
  1934. this.hr.send(sendurl, null, "get", "text");
  1935. };
  1936. GameHttps.prototype.onHttpRequestError = function (e) {
  1937. Debuger_1.default.log("********onHttpRequestError********");
  1938. if (e) {
  1939. Debuger_1.default.log(e);
  1940. }
  1941. fairygui.GRoot.inst.closeModalWait();
  1942. this._isrequesting = false;
  1943. };
  1944. GameHttps.prototype.onHttpRequestProgress = function (e) {
  1945. };
  1946. GameHttps.prototype.onHttpRequestComplete = function (e) {
  1947. fairygui.GRoot.inst.closeModalWait();
  1948. Debuger_1.default.log("httpReceive:", this.hr.data);
  1949. this._isrequesting = false;
  1950. if (this._callbackList.length > 0) {
  1951. var itemData = this._callbackList.shift();
  1952. this.checkMessage();
  1953. var callback = itemData.callback;
  1954. var callbackobj = itemData.callbackobj;
  1955. var data = JSON.parse(this.hr.data);
  1956. if (this.hr.data != "") {
  1957. if (data.hasOwnProperty("ACTIONCOM")) {
  1958. if (data.ACTIONCOM == 0) //succeed
  1959. {
  1960. if (callback && callbackobj) {
  1961. callback.call(callbackobj, data.JSDATA);
  1962. }
  1963. }
  1964. else //faild
  1965. {
  1966. }
  1967. }
  1968. }
  1969. }
  1970. };
  1971. GameHttps.prototype.checkMessage = function () {
  1972. if (this._callbackList.length > 0) {
  1973. var nextItemData = this._callbackList[0];
  1974. if (nextItemData.sendtype == "post") {
  1975. this.sendByPost(nextItemData.act, nextItemData.data, nextItemData.callback, nextItemData.callbackobj, nextItemData.isShowWait);
  1976. }
  1977. else {
  1978. this.sendbyget(nextItemData.act, nextItemData.data, nextItemData.callback, nextItemData.callbackobj, nextItemData.isShowWait);
  1979. }
  1980. }
  1981. };
  1982. return GameHttps;
  1983. }(Laya.EventDispatcher));
  1984. exports.default = GameHttps;
  1985. },{"../../Global":2,"../Debuger":12}],27:[function(require,module,exports){
  1986. "use strict";
  1987. Object.defineProperty(exports, "__esModule", { value: true });
  1988. var EventUtils_1 = require("../events/EventUtils");
  1989. var Debuger_1 = require("../Debuger");
  1990. var SocketNofify_1 = require("../notification/SocketNofify");
  1991. var GameSocket = /** @class */ (function () {
  1992. function GameSocket() {
  1993. /**
  1994. * 1:自动断线,2:主动断线
  1995. */
  1996. this._offlinestate = 0;
  1997. /**
  1998. * 断线重连次数
  1999. */
  2000. this._connetNums = 0;
  2001. /**
  2002. * socket连接中
  2003. */
  2004. this._socketconneting = false;
  2005. }
  2006. GameSocket.getInstance = function () {
  2007. if (this._instance == null) {
  2008. this._instance = new GameSocket();
  2009. }
  2010. return this._instance;
  2011. };
  2012. //连接服务器
  2013. GameSocket.prototype.connectServer = function (gameHost) {
  2014. this._socketconneting = true;
  2015. this.removeSocket();
  2016. if (!this.sock || !this.sock.connected) {
  2017. this.openwaitpanel();
  2018. if (!this.sock) {
  2019. this.sock = new Laya.Socket();
  2020. this.sock.on(Laya.Event.OPEN, this, this.onSocketOpen);
  2021. this.sock.on(Laya.Event.MESSAGE, this, this.onReceiveMessage);
  2022. this.sock.on(Laya.Event.CLOSE, this, this.onSocketClose);
  2023. this.sock.on(Laya.Event.ERROR, this, this.ioErro);
  2024. }
  2025. Debuger_1.default.log("开始连接socket:" + gameHost);
  2026. this.sock.connectByUrl(gameHost);
  2027. }
  2028. };
  2029. GameSocket.prototype.isConnect = function () {
  2030. if (this.sock && this.sock.connected) {
  2031. return true;
  2032. }
  2033. return false;
  2034. };
  2035. GameSocket.prototype.ioErro = function (e) {
  2036. if (e === void 0) { e = null; }
  2037. Debuger_1.default.log("gamesocketIOErrorEvent:" + e.type);
  2038. this._socketconneting = false;
  2039. this._connetNums++;
  2040. this.closewaitpanel();
  2041. this.removeSocket();
  2042. this._offlinestate = 1;
  2043. };
  2044. GameSocket.prototype.removeSocket = function () {
  2045. this._socketconneting = false;
  2046. if (this.sock) {
  2047. this.sock.off(Laya.Event.OPEN, this, this.onSocketOpen);
  2048. this.sock.off(Laya.Event.MESSAGE, this, this.onReceiveMessage);
  2049. this.sock.off(Laya.Event.CLOSE, this, this.onSocketClose);
  2050. this.sock.off(Laya.Event.ERROR, this, this.ioErro);
  2051. this.sock.cleanSocket();
  2052. this.sock.close();
  2053. this.sock = null;
  2054. }
  2055. };
  2056. /**
  2057. * 手动关闭游戏socket
  2058. */
  2059. GameSocket.prototype.colseSocket = function (offlinestate) {
  2060. if (offlinestate === void 0) { offlinestate = 1; }
  2061. if (this.isConnect()) {
  2062. this.closewaitpanel();
  2063. this.removeSocket();
  2064. if (offlinestate != -1) {
  2065. this._offlinestate = offlinestate;
  2066. }
  2067. EventUtils_1.EventUtils.dispatchEvent(SocketNofify_1.default.SOCKET_CLOSE);
  2068. }
  2069. };
  2070. GameSocket.prototype.onSocketClose = function (e) {
  2071. if (e === void 0) { e = null; }
  2072. this._socketconneting = false;
  2073. Debuger_1.default.log("socket 关闭");
  2074. this.closewaitpanel();
  2075. this._offlinestate = 1;
  2076. EventUtils_1.EventUtils.dispatchEvent(SocketNofify_1.default.SOCKET_CLOSE);
  2077. };
  2078. GameSocket.prototype.closewaitpanel = function () {
  2079. fairygui.GRoot.inst.closeModalWait();
  2080. };
  2081. GameSocket.prototype.openwaitpanel = function () {
  2082. fairygui.GRoot.inst.showModalWait();
  2083. };
  2084. //连接成功返回
  2085. GameSocket.prototype.onSocketOpen = function (event) {
  2086. if (event === void 0) { event = null; }
  2087. this._connetNums = 0;
  2088. this.closewaitpanel();
  2089. Debuger_1.default.log("socket 连接成功");
  2090. this._offlinestate = 0;
  2091. EventUtils_1.EventUtils.dispatchEvent(SocketNofify_1.default.SOCKET_CONNECT_SUCCEED, null, false);
  2092. };
  2093. //向服务端发送消息
  2094. GameSocket.prototype.sendMessage = function (act, data, isShowWait) {
  2095. if (isShowWait === void 0) { isShowWait = true; }
  2096. if (this.sock && this.sock.connected) {
  2097. if (isShowWait) {
  2098. this.openwaitpanel();
  2099. }
  2100. if (!data) {
  2101. data = {};
  2102. }
  2103. data.ACTION = act;
  2104. this.sock.send(JSON.stringify(data));
  2105. Debuger_1.default.log("socket send:" + JSON.stringify(data));
  2106. }
  2107. else {
  2108. Debuger_1.default.log("当前socket未连接");
  2109. }
  2110. };
  2111. //消息返回后,会广播出去
  2112. //Global.addEventListener("你发送的cmd名称",监听方法,this)
  2113. GameSocket.prototype.onReceiveMessage = function (msg) {
  2114. if (msg === void 0) { msg = null; }
  2115. var socketdata = JSON.parse(msg);
  2116. Debuger_1.default.log("socket receive:", socketdata);
  2117. };
  2118. return GameSocket;
  2119. }());
  2120. exports.default = GameSocket;
  2121. },{"../Debuger":12,"../events/EventUtils":16,"../notification/SocketNofify":30}],28:[function(require,module,exports){
  2122. "use strict";
  2123. Object.defineProperty(exports, "__esModule", { value: true });
  2124. var Debuger_1 = require("../Debuger");
  2125. var Global_1 = require("../../Global");
  2126. var PlatfromType_1 = require("../../platform/PlatfromType");
  2127. var PlatformEvent_1 = require("../../platform/events/PlatformEvent");
  2128. /*
  2129. * name;
  2130. */
  2131. var TongjiHttps = /** @class */ (function (_super) {
  2132. __extends(TongjiHttps, _super);
  2133. function TongjiHttps() {
  2134. var _this = _super.call(this) || this;
  2135. _this._iscanSend = true;
  2136. _this.init();
  2137. return _this;
  2138. }
  2139. TongjiHttps.getInstance = function () {
  2140. if (null == this._instance) {
  2141. this._instance = new TongjiHttps();
  2142. }
  2143. return this._instance;
  2144. };
  2145. TongjiHttps.prototype.init = function () {
  2146. this.hr = new Laya.HttpRequest();
  2147. };
  2148. TongjiHttps.prototype.send = function (act, data) {
  2149. if (data === void 0) { data = null; }
  2150. if (this._iscanSend) {
  2151. this.sendbyget(act, data);
  2152. }
  2153. };
  2154. TongjiHttps.prototype.tongjiData = function (TID2, TID3, Num, Total, Datas) {
  2155. if (TID3 === void 0) { TID3 = ""; }
  2156. if (Num === void 0) { Num = 0; }
  2157. if (Total === void 0) { Total = 0; }
  2158. if (Datas === void 0) { Datas = ""; }
  2159. switch (Global_1.Global.nowplatfrom) {
  2160. case PlatfromType_1.default.wx:
  2161. this.sendTongjiData(PlatformEvent_1.default.message_9891002, TID2, TID3, Num, Total, Datas);
  2162. break;
  2163. }
  2164. };
  2165. TongjiHttps.prototype.sendTongjiData = function (act, TID2, TID3, Num, Total, Datas) {
  2166. if (Num === void 0) { Num = 0; }
  2167. var itemd = {};
  2168. itemd.TID2 = TID2;
  2169. itemd.TID3 = TID3;
  2170. itemd.Num = Math.floor(Num);
  2171. itemd.Total = Total;
  2172. itemd.Datas = Datas;
  2173. itemd.MEMBERID = Global_1.Global.MemberID;
  2174. itemd.AppKeyID = Global_1.Global.AppKeyID;
  2175. this.sendbyget(act, itemd);
  2176. };
  2177. TongjiHttps.prototype.sendbyget = function (act, data) {
  2178. if (data === void 0) { data = null; }
  2179. if (data) {
  2180. var sendurl = "";
  2181. data.ACTION = act;
  2182. sendurl = Global_1.Global.httpurl + "request?json=" + JSON.stringify(data);
  2183. Debuger_1.default.log("***sendtongji***:", sendurl);
  2184. this.hr.send(sendurl, null, "get", "text");
  2185. }
  2186. };
  2187. return TongjiHttps;
  2188. }(Laya.EventDispatcher));
  2189. exports.default = TongjiHttps;
  2190. },{"../../Global":2,"../../platform/PlatfromType":68,"../../platform/events/PlatformEvent":69,"../Debuger":12}],29:[function(require,module,exports){
  2191. "use strict";
  2192. Object.defineProperty(exports, "__esModule", { value: true });
  2193. /**
  2194. *
  2195. * @author
  2196. *
  2197. */
  2198. var LayerNotify;
  2199. (function (LayerNotify) {
  2200. /**
  2201. * 背景层
  2202. */
  2203. LayerNotify.LAYER_BACKGROUND = "LAYER_BACKGROUND";
  2204. /**
  2205. * ui层
  2206. */
  2207. LayerNotify.LAYER_UILAYER = "LAYER_UILAYER";
  2208. /**
  2209. * ui层上层
  2210. */
  2211. LayerNotify.LAYER_UPUILAYER = "LAYER_UPUILAYER";
  2212. /**
  2213. * tips层
  2214. */
  2215. LayerNotify.LAYER_TIPSLAYER = "LAYER_TIPSLAYER";
  2216. /**
  2217. * 新手引导层
  2218. */
  2219. LayerNotify.LAYER_GUIDELAYER = "LAYER_GUIDELAYER";
  2220. })(LayerNotify = exports.LayerNotify || (exports.LayerNotify = {}));
  2221. },{}],30:[function(require,module,exports){
  2222. "use strict";
  2223. Object.defineProperty(exports, "__esModule", { value: true });
  2224. var SocketNofify = /** @class */ (function () {
  2225. function SocketNofify() {
  2226. }
  2227. /**
  2228. * socket连接成功
  2229. */
  2230. SocketNofify.SOCKET_CONNECT_SUCCEED = "SOCKET_CONNECT_SUCCEED";
  2231. /**
  2232. * socket关闭
  2233. */
  2234. SocketNofify.SOCKET_CLOSE = "SOCKET_CLOSE";
  2235. /**
  2236. * 游戏重新连接
  2237. */
  2238. SocketNofify.Game_againConnetSocket = "Game_againConnetSocket";
  2239. return SocketNofify;
  2240. }());
  2241. exports.default = SocketNofify;
  2242. },{}],31:[function(require,module,exports){
  2243. "use strict";
  2244. Object.defineProperty(exports, "__esModule", { value: true });
  2245. /*
  2246. * name;
  2247. */
  2248. var BaseVO = /** @class */ (function (_super) {
  2249. __extends(BaseVO, _super);
  2250. function BaseVO() {
  2251. return _super.call(this) || this;
  2252. }
  2253. BaseVO.prototype.setInfo = function (data) {
  2254. if (data) {
  2255. for (var s in data) {
  2256. var itemd = this[s];
  2257. if (itemd != null) {
  2258. this[s] = data[s];
  2259. }
  2260. // else
  2261. // {
  2262. // Debuger.log( "VO:未定义属性-" + s );
  2263. // }
  2264. }
  2265. }
  2266. };
  2267. BaseVO.prototype.dispatchEvent = function (type, data) {
  2268. this.event(type, data);
  2269. };
  2270. return BaseVO;
  2271. }(Laya.EventDispatcher));
  2272. exports.BaseVO = BaseVO;
  2273. },{}],32:[function(require,module,exports){
  2274. "use strict";
  2275. Object.defineProperty(exports, "__esModule", { value: true });
  2276. var ObjectPool_1 = require("../mvc/ObjectPool");
  2277. /*
  2278. * name;
  2279. */
  2280. var CacheVO = /** @class */ (function (_super) {
  2281. __extends(CacheVO, _super);
  2282. function CacheVO() {
  2283. var _this = _super !== null && _super.apply(this, arguments) || this;
  2284. /**
  2285. * 引用次数
  2286. */
  2287. _this.ref = 0;
  2288. /**
  2289. * 最后一次被引用的时间
  2290. */
  2291. _this.time = 0;
  2292. /**
  2293. * 包名
  2294. */
  2295. _this.packageName = "";
  2296. return _this;
  2297. }
  2298. CacheVO.prototype.clear = function () {
  2299. this.ref = 0;
  2300. this.time = 0;
  2301. this.packageName = "";
  2302. ObjectPool_1.default.clearObj(CacheVO.poolkey, this);
  2303. };
  2304. CacheVO.poolkey = "CacheVO";
  2305. return CacheVO;
  2306. }(Laya.EventDispatcher));
  2307. exports.default = CacheVO;
  2308. },{"../mvc/ObjectPool":23}],33:[function(require,module,exports){
  2309. "use strict";
  2310. Object.defineProperty(exports, "__esModule", { value: true });
  2311. var JoystickModule = /** @class */ (function (_super) {
  2312. __extends(JoystickModule, _super);
  2313. function JoystickModule(clickpanel) {
  2314. var _this = _super.call(this) || this;
  2315. _this.dis = 0;
  2316. _this.degree = 0;
  2317. _this.angle = 0;
  2318. _this.offx = 0;
  2319. _this._iscanCBack = false;
  2320. _this._iacanCallback = false;
  2321. _this._clickpanel = clickpanel;
  2322. _this._button = new Laya.Point();
  2323. _this.touchId = -1;
  2324. _this.radius = 400;
  2325. _this._curPos = new Laya.Point();
  2326. _this._clickpanel.on(Laya.Event.MOUSE_DOWN, _this, _this.onTouchDown);
  2327. return _this;
  2328. }
  2329. JoystickModule.prototype.setEventCallback = function (callobj, downCallback, movecallback, upcallback) {
  2330. this._callobj = callobj;
  2331. this._downCallback = downCallback;
  2332. this._movecallback = movecallback;
  2333. this._updatecallback = upcallback;
  2334. };
  2335. JoystickModule.prototype.Trigger = function (evt) {
  2336. this.onTouchDown(evt);
  2337. };
  2338. JoystickModule.prototype.onTouchDown = function (evt) {
  2339. if (this.touchId == -1) { //First touch
  2340. this.touchId = evt.touchId;
  2341. this.offx = 0;
  2342. this._iscanCBack = false;
  2343. fairygui.GRoot.inst.globalToLocal(Laya.stage.mouseX, Laya.stage.mouseY, this._curPos);
  2344. var bx = this._curPos.x;
  2345. var by = this._curPos.y;
  2346. this._lastStageX = bx;
  2347. this._lastStageY = by;
  2348. this._startStageX = bx;
  2349. this._startStageY = by;
  2350. this._button.x = bx;
  2351. this._button.y = by;
  2352. if (this._callobj && this._downCallback) {
  2353. this._downCallback.call(this._callobj);
  2354. }
  2355. this._clickpanel.on(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove);
  2356. this._clickpanel.on(Laya.Event.MOUSE_UP, this, this.OnTouchUp);
  2357. this._clickpanel.on(Laya.Event.MOUSE_OUT, this, this.OnTouchUp);
  2358. }
  2359. };
  2360. JoystickModule.prototype.OnTouchUp = function (evt) {
  2361. if (evt === void 0) { evt = null; }
  2362. if (this.touchId != -1 && evt.touchId == this.touchId) {
  2363. this.touchup();
  2364. if (this._callobj && this._updatecallback) {
  2365. this._updatecallback.call(this._callobj);
  2366. }
  2367. }
  2368. };
  2369. JoystickModule.prototype.touchup = function () {
  2370. this._iscanCBack = false;
  2371. this.touchId = -1;
  2372. this._clickpanel.off(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove);
  2373. this._clickpanel.off(Laya.Event.MOUSE_UP, this, this.OnTouchUp);
  2374. this._clickpanel.off(Laya.Event.MOUSE_OUT, this, this.OnTouchUp);
  2375. this._iacanCallback = false;
  2376. this.degree = 0;
  2377. };
  2378. JoystickModule.prototype.OnTouchMove = function (evt) {
  2379. if (this.touchId != -1 && evt.touchId == this.touchId) {
  2380. var bx = Laya.stage.mouseX;
  2381. var by = Laya.stage.mouseY;
  2382. var moveX = bx - this._lastStageX;
  2383. var moveY = by - this._lastStageY;
  2384. this._lastStageX = bx;
  2385. this._lastStageY = by;
  2386. var buttonX = this._button.x + moveX;
  2387. var buttonY = this._button.y + moveY;
  2388. var offsetX = buttonX - this._startStageX;
  2389. var offsetY = buttonY - this._startStageY;
  2390. var disX = 0;
  2391. if (moveX >= 2 || moveX <= -2) {
  2392. this._iscanCBack = true;
  2393. }
  2394. else {
  2395. this._iscanCBack = false;
  2396. }
  2397. this.offx = moveX;
  2398. if (offsetX == 0 && offsetY == 0) {
  2399. return;
  2400. }
  2401. if (offsetX > 0) {
  2402. if (offsetX > this.radius) {
  2403. disX = this.radius;
  2404. this.angle = 90;
  2405. }
  2406. else {
  2407. disX = this.radius - offsetX;
  2408. this.angle = 90 - disX / this.radius * 90;
  2409. }
  2410. }
  2411. else if (offsetX == 0) {
  2412. this.angle = 0;
  2413. }
  2414. else {
  2415. if (-offsetX > this.radius) {
  2416. disX = this.radius;
  2417. this.angle = -90;
  2418. }
  2419. else {
  2420. disX = this.radius + offsetX;
  2421. this.angle = -(90 - disX / this.radius * 90);
  2422. }
  2423. }
  2424. var rad = Math.atan2(offsetY, offsetX);
  2425. this.degree = rad;
  2426. var maxX = this.radius * Math.cos(rad);
  2427. var maxY = this.radius * Math.sin(rad);
  2428. if (Math.abs(offsetX) > Math.abs(maxX))
  2429. offsetX = maxX;
  2430. if (Math.abs(offsetY) > Math.abs(maxY))
  2431. offsetY = maxY;
  2432. buttonX = this._startStageX + offsetX;
  2433. buttonY = this._startStageY + offsetY;
  2434. if (buttonX < 0)
  2435. buttonX = 0;
  2436. if (buttonY > fairygui.GRoot.inst.height)
  2437. buttonY = fairygui.GRoot.inst.height;
  2438. this._button.x = buttonX;
  2439. this._button.y = buttonY;
  2440. this.dis = Math.sqrt(offsetX * offsetX + offsetY * offsetY);
  2441. this._iacanCallback = true;
  2442. if (this._iscanCBack && this._callobj && this._movecallback && this._iacanCallback) {
  2443. this._movecallback.call(this._callobj, this.offx);
  2444. }
  2445. }
  2446. };
  2447. JoystickModule.prototype.dispose = function () {
  2448. this._clickpanel.off(Laya.Event.MOUSE_DOWN, this, this.onTouchDown);
  2449. };
  2450. // private _center:fairygui.GImage;
  2451. JoystickModule.JoystickMoving = "JoystickMoving";
  2452. JoystickModule.JoystickUp = "JoystickUp";
  2453. return JoystickModule;
  2454. }(Laya.EventDispatcher));
  2455. exports.JoystickModule = JoystickModule;
  2456. },{}],34:[function(require,module,exports){
  2457. "use strict";
  2458. Object.defineProperty(exports, "__esModule", { value: true });
  2459. var UiManager_1 = require("../../../managers/UiManager");
  2460. var LoadingView_1 = require("../view/LoadingView");
  2461. var Debuger_1 = require("../../../frameworks/Debuger");
  2462. var PathConfig_1 = require("../../../configs/gameConfigs/PathConfig");
  2463. var ResourceManager_1 = require("../../../managers/ResourceManager");
  2464. var ResDataManager_1 = require("../../../managers/ResDataManager");
  2465. var UserInfoProxy_1 = require("../../userinfo/UserInfoProxy");
  2466. var PlatformEvent_1 = require("../../../platform/events/PlatformEvent");
  2467. var BaseProxys_1 = require("../../../frameworks/mvc/BaseProxys");
  2468. var MainProxy_1 = require("../../main/proxys/MainProxy");
  2469. var RoleCFG_1 = require("../../../configs/dataConfigs/RoleCFG");
  2470. var LevelCFG_1 = require("../../../configs/dataConfigs/LevelCFG");
  2471. var BuildCFG_1 = require("../../../configs/dataConfigs/BuildCFG");
  2472. var NpcCFG_1 = require("../../../configs/dataConfigs/NpcCFG");
  2473. var GameCFG_1 = require("../../../configs/dataConfigs/GameCFG");
  2474. var SkinProxy_1 = require("../../skins/proxys/SkinProxy");
  2475. var Sdk_1 = require("../../../platform/wxminigame/WXSDK/Sdk");
  2476. var YQSdk_1 = require("../../../platform/wxminigame/WXSDK/YQSdk");
  2477. var PlayerAccount_1 = require("../../../platform/wxminigame/WXSDK/PlayerAccount");
  2478. var NetworkManager_1 = require("../../../platform/wxminigame/NetworkManager");
  2479. var Global_1 = require("../../../Global");
  2480. var LoginProxy = /** @class */ (function (_super) {
  2481. __extends(LoginProxy, _super);
  2482. function LoginProxy() {
  2483. return _super.call(this) || this;
  2484. }
  2485. LoginProxy.prototype.initProxy = function () {
  2486. this.addDataEvent(PlatformEvent_1.default.PlatformEvent_loginSucceed, this, this.loginsucceed);
  2487. };
  2488. LoginProxy.prototype.startLogin = function () {
  2489. UiManager_1.UiManager.instance.add(LoadingView_1.default);
  2490. this.loginprogress(0);
  2491. if (Laya.Browser.onWeiXin) {
  2492. this.LoginYQ();
  2493. }
  2494. else {
  2495. // this.loginsucceed();
  2496. this.LoginLocalSever();
  2497. }
  2498. // PlatformTool.getInstance().login( );
  2499. };
  2500. LoginProxy.prototype.LoginYQ = function () {
  2501. var _this = this;
  2502. Sdk_1.WxApi.recordAldEvent("开始微信登录");
  2503. Sdk_1.WxApi.WXLogin(function (res) {
  2504. if (res != "error") {
  2505. Sdk_1.WxApi.recordAldEvent("微信登录成功");
  2506. console.log("hplogin:" + "querychannel->" + Sdk_1.WxApi.querychannel + " referrerInfoappId->" + Sdk_1.WxApi.referrerInfoappId);
  2507. YQSdk_1.YQSdk.login(res.code, Sdk_1.WxApi.querychannel, Sdk_1.WxApi.referrerInfoappId, function () {
  2508. Laya.Browser.window.wx.onHide(function () {
  2509. YQSdk_1.YQSdk.exposure();
  2510. });
  2511. _this.LoginLocal();
  2512. });
  2513. }
  2514. else {
  2515. Sdk_1.WxApi.recordAldEvent("微信登录失败");
  2516. _this.LoginYQ();
  2517. }
  2518. });
  2519. };
  2520. LoginProxy.prototype.LoginLocal = function () {
  2521. var _this = this;
  2522. Sdk_1.WxApi.recordAldEvent("开始登录");
  2523. Sdk_1.WxApi.WXLogin(function (res) {
  2524. if (res != "error") {
  2525. Sdk_1.WxApi.recordAldEvent("微信登录成功2");
  2526. _this.LoginLocalSever(res);
  2527. }
  2528. else {
  2529. Sdk_1.WxApi.recordAldEvent("微信登录失败");
  2530. _this.LoginLocal();
  2531. }
  2532. });
  2533. };
  2534. LoginProxy.prototype.LoginLocalSever = function (res) {
  2535. if (res === void 0) { res = null; }
  2536. Sdk_1.WxApi.recordAldEvent("开始本地登录");
  2537. if (res) {
  2538. new PlayerAccount_1.PlayerAccount(res.code, "", "", 0, "", "", "", "", Sdk_1.WxApi.shareOpenId, Sdk_1.WxApi.shareOpenId, Global_1.Global.gameVersion);
  2539. }
  2540. NetworkManager_1.NetworkManager.Instance.login(null, Laya.Handler.create(this, this.OnLoginLocalComplete), Laya.Handler.create(this, this.OnLoginError));
  2541. //this.LoadSbp();
  2542. };
  2543. LoginProxy.prototype.OnLoginLocalComplete = function () {
  2544. Sdk_1.WxApi.recordAldEvent("本地服务器登录完成...");
  2545. Sdk_1.WxApi.aldSendOpenid(PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid);
  2546. this.loginsucceed();
  2547. };
  2548. LoginProxy.prototype.OnLoginError = function (e) {
  2549. console.log(e);
  2550. };
  2551. LoginProxy.prototype.loginprogress = function (value) {
  2552. var loadingview = UiManager_1.UiManager.instance.getView(LoadingView_1.default);
  2553. if (loadingview) {
  2554. loadingview.showWord(value);
  2555. }
  2556. };
  2557. LoginProxy.prototype.loginsucceed = function () {
  2558. Debuger_1.default.log("登录成功");
  2559. // this.loadconfig();
  2560. if (Laya.Browser.onWeiXin) {
  2561. this.parseConfig1();
  2562. this.initData();
  2563. this.enterMain();
  2564. }
  2565. else {
  2566. this.loadconfig();
  2567. // this.parseConfig1( );
  2568. // this.initData();
  2569. // this.enterMain();
  2570. }
  2571. };
  2572. /**
  2573. * 解析配置数据
  2574. */
  2575. LoginProxy.prototype.parseConfig1 = function () {
  2576. var byteData = PlayerAccount_1.PlayerAccount.CurrentAccount.nowConfig.gameConfig[0].config;
  2577. Debuger_1.default.log("配置表数据:", byteData);
  2578. if (byteData && byteData != "") {
  2579. var arr = byteData.split("%file%");
  2580. var i;
  2581. var nums = arr.length;
  2582. for (i = 0; i < nums; i++) {
  2583. var itemarr = arr[i].split("%cfg%");
  2584. var cla = LoginProxy.configClass[itemarr[0]];
  2585. if (cla) {
  2586. cla.initCfg(itemarr[1]);
  2587. }
  2588. else {
  2589. Debuger_1.default.log("没有注册此类" + itemarr[0]);
  2590. }
  2591. }
  2592. return true;
  2593. }
  2594. return false;
  2595. };
  2596. LoginProxy.prototype.loadconfig = function () {
  2597. var pathArr = [];
  2598. pathArr.push({ url: PathConfig_1.PathConfig.getConfig("gameConfig"), type: Laya.Loader.TEXT });
  2599. ResourceManager_1.default.getInstance().Loaders(pathArr, this, this.configComplete, this.loginprogress, false);
  2600. };
  2601. LoginProxy.prototype.configComplete = function () {
  2602. this.parseConfig();
  2603. this.initData();
  2604. this.enterMain();
  2605. };
  2606. /**
  2607. * 初始化游戏数据
  2608. */
  2609. LoginProxy.prototype.initData = function () {
  2610. this.getProxy(UserInfoProxy_1.default).init();
  2611. this.getProxy(SkinProxy_1.default).init();
  2612. };
  2613. LoginProxy.prototype.enterMain = function () {
  2614. console.log("当前配置表总关卡:", LevelCFG_1.default.vec.length);
  2615. this.getProxy(MainProxy_1.default).enterMain();
  2616. };
  2617. /**
  2618. * 解析配置数据
  2619. */
  2620. LoginProxy.prototype.parseConfig = function () {
  2621. var byteData = ResDataManager_1.default.getInastance().getResByurl(PathConfig_1.PathConfig.getConfig("gameConfig"));
  2622. if (byteData && byteData != "") {
  2623. var arr = byteData.split("%file%");
  2624. var i;
  2625. var nums = arr.length;
  2626. for (i = 0; i < nums; i++) {
  2627. var itemarr = arr[i].split("%cfg%");
  2628. var cla = LoginProxy.configClass[itemarr[0]];
  2629. if (cla) {
  2630. cla.initCfg(itemarr[1]);
  2631. }
  2632. else {
  2633. Debuger_1.default.log("没有注册此类" + itemarr[0]);
  2634. }
  2635. }
  2636. return true;
  2637. }
  2638. return false;
  2639. };
  2640. LoginProxy.key = "LoginProxy";
  2641. LoginProxy.configClass = {
  2642. RoleCFG: RoleCFG_1.default,
  2643. LevelCFG: LevelCFG_1.default,
  2644. BuildCFG: BuildCFG_1.default,
  2645. NpcCFG: NpcCFG_1.default,
  2646. GameCFG: GameCFG_1.default
  2647. };
  2648. return LoginProxy;
  2649. }(BaseProxys_1.default));
  2650. exports.default = LoginProxy;
  2651. },{"../../../Global":2,"../../../configs/dataConfigs/BuildCFG":5,"../../../configs/dataConfigs/GameCFG":6,"../../../configs/dataConfigs/LevelCFG":7,"../../../configs/dataConfigs/NpcCFG":8,"../../../configs/dataConfigs/RoleCFG":9,"../../../configs/gameConfigs/PathConfig":10,"../../../frameworks/Debuger":12,"../../../frameworks/mvc/BaseProxys":19,"../../../managers/ResDataManager":62,"../../../managers/ResourceManager":63,"../../../managers/UiManager":66,"../../../platform/events/PlatformEvent":69,"../../../platform/wxminigame/NetworkManager":71,"../../../platform/wxminigame/WXSDK/PlayerAccount":74,"../../../platform/wxminigame/WXSDK/Sdk":75,"../../../platform/wxminigame/WXSDK/YQSdk":77,"../../main/proxys/MainProxy":40,"../../skins/proxys/SkinProxy":51,"../../userinfo/UserInfoProxy":53,"../view/LoadingView":35}],35:[function(require,module,exports){
  2652. "use strict";
  2653. Object.defineProperty(exports, "__esModule", { value: true });
  2654. var BaseView_1 = require("../../../frameworks/mvc/BaseView");
  2655. var LoadingView = /** @class */ (function (_super) {
  2656. __extends(LoadingView, _super);
  2657. function LoadingView() {
  2658. return _super.call(this, "loading", "loading") || this;
  2659. }
  2660. LoadingView.prototype.onInit = function () {
  2661. _super.prototype.onInit.call(this);
  2662. };
  2663. LoadingView.prototype.initView = function () {
  2664. };
  2665. LoadingView.prototype.initEvent = function () {
  2666. };
  2667. LoadingView.prototype.showWord = function (value) {
  2668. this.pro_bar.value = value;
  2669. };
  2670. LoadingView.prototype.clearEvent = function () {
  2671. };
  2672. LoadingView.prototype.destory = function () {
  2673. this.clearEvent();
  2674. _super.prototype.destory.call(this);
  2675. };
  2676. LoadingView.key = "LoadingView";
  2677. return LoadingView;
  2678. }(BaseView_1.default));
  2679. exports.default = LoadingView;
  2680. },{"../../../frameworks/mvc/BaseView":20}],36:[function(require,module,exports){
  2681. "use strict";
  2682. Object.defineProperty(exports, "__esModule", { value: true });
  2683. var WordTipsView_1 = require("./WordTipsView");
  2684. var GameLayerManager_1 = require("../../../managers/GameLayerManager");
  2685. var LayerNotify_1 = require("../../../frameworks/notification/LayerNotify");
  2686. var EventUtils_1 = require("../../../frameworks/events/EventUtils");
  2687. var GameEvent_1 = require("../../userinfo/events/GameEvent");
  2688. /*
  2689. * name;
  2690. */
  2691. var WordTipsUtils = /** @class */ (function () {
  2692. function WordTipsUtils() {
  2693. }
  2694. WordTipsUtils.getInstance = function () {
  2695. if (!this._instance) {
  2696. this._instance = new WordTipsUtils();
  2697. }
  2698. return this._instance;
  2699. };
  2700. WordTipsUtils.prototype.initEvent = function () {
  2701. WordTipsUtils.isEvent = true;
  2702. EventUtils_1.EventUtils.addEventListener(GameEvent_1.default.removeselect, this, this.addwordList);
  2703. };
  2704. WordTipsUtils.prototype.showWordTips = function (word) {
  2705. if (!WordTipsUtils.isEvent) {
  2706. WordTipsUtils.getInstance().initEvent();
  2707. }
  2708. if (WordTipsUtils.showWordList.length > 0) {
  2709. var lastword = WordTipsUtils.showWordList[WordTipsUtils.showWordList.length - 1].nowword;
  2710. // if( lastword == word )
  2711. // {
  2712. // return;
  2713. // }
  2714. }
  2715. if (WordTipsUtils.wordList.length > 0) {
  2716. var item = WordTipsUtils.wordList.shift();
  2717. GameLayerManager_1.GameLayerManager.getInstance().addtoLayer(item, LayerNotify_1.LayerNotify.LAYER_TIPSLAYER);
  2718. WordTipsUtils.showWordList.push(item);
  2719. item.showWord(word);
  2720. }
  2721. else {
  2722. if (WordTipsUtils.showWordList.length < 10) {
  2723. var item1 = new WordTipsView_1.WordTipsView();
  2724. GameLayerManager_1.GameLayerManager.getInstance().addtoLayer(item1, LayerNotify_1.LayerNotify.LAYER_TIPSLAYER);
  2725. WordTipsUtils.showWordList.push(item1);
  2726. item1.showWord(word);
  2727. }
  2728. else {
  2729. var item1 = WordTipsUtils.showWordList.shift();
  2730. item1.showWord(word);
  2731. WordTipsUtils.showWordList.push(item1);
  2732. }
  2733. }
  2734. };
  2735. WordTipsUtils.prototype.addwordList = function (item) {
  2736. if (item) {
  2737. item.removeFromParent();
  2738. var index = WordTipsUtils.showWordList.indexOf(item);
  2739. if (index != -1) {
  2740. WordTipsUtils.showWordList.splice(index, 1);
  2741. }
  2742. GameLayerManager_1.GameLayerManager.getInstance().removeformLayer(LayerNotify_1.LayerNotify.LAYER_TIPSLAYER);
  2743. WordTipsUtils.wordList.push(item);
  2744. }
  2745. };
  2746. WordTipsUtils.wordList = [];
  2747. WordTipsUtils.showWordList = [];
  2748. WordTipsUtils.maxNum = 10;
  2749. WordTipsUtils.isEvent = false;
  2750. return WordTipsUtils;
  2751. }());
  2752. exports.WordTipsUtils = WordTipsUtils;
  2753. },{"../../../frameworks/events/EventUtils":16,"../../../frameworks/notification/LayerNotify":29,"../../../managers/GameLayerManager":61,"../../userinfo/events/GameEvent":54,"./WordTipsView":37}],37:[function(require,module,exports){
  2754. "use strict";
  2755. Object.defineProperty(exports, "__esModule", { value: true });
  2756. var BaseView_1 = require("../../../frameworks/mvc/BaseView");
  2757. var EventUtils_1 = require("../../../frameworks/events/EventUtils");
  2758. var GameEvent_1 = require("../../userinfo/events/GameEvent");
  2759. /*
  2760. * name;
  2761. */
  2762. var WordTipsView = /** @class */ (function (_super) {
  2763. __extends(WordTipsView, _super);
  2764. function WordTipsView() {
  2765. var _this = _super.call(this, "loading", "wordTips") || this;
  2766. _this.nowword = "";
  2767. return _this;
  2768. }
  2769. WordTipsView.prototype.onInit = function () {
  2770. _super.prototype.onInit.call(this);
  2771. this.t1 = this.getpanelTransition("t1");
  2772. };
  2773. WordTipsView.prototype.showWord = function (word) {
  2774. this.nowword = word;
  2775. this.text_word.text = word;
  2776. this.t1.play(Laya.Handler.create(this, this.playEndCallback), 1);
  2777. };
  2778. WordTipsView.prototype.playEndCallback = function () {
  2779. EventUtils_1.EventUtils.dispatchEvent(GameEvent_1.default.removeselect, this);
  2780. };
  2781. WordTipsView.key = "WordTipsView";
  2782. return WordTipsView;
  2783. }(BaseView_1.default));
  2784. exports.WordTipsView = WordTipsView;
  2785. },{"../../../frameworks/events/EventUtils":16,"../../../frameworks/mvc/BaseView":20,"../../userinfo/events/GameEvent":54}],38:[function(require,module,exports){
  2786. "use strict";
  2787. Object.defineProperty(exports, "__esModule", { value: true });
  2788. var JoystickModule_1 = require("../joystick/JoystickModule");
  2789. var EventUtils_1 = require("../../frameworks/events/EventUtils");
  2790. var GameEvent_1 = require("../userinfo/events/GameEvent");
  2791. var Scene3DManager_1 = require("../../managers/Scene3DManager");
  2792. var Scene3dObject_1 = require("../scene3ds/Scene3dObject");
  2793. var TimerService_1 = require("../../frameworks/TimerService");
  2794. var GameCFG_1 = require("../../configs/dataConfigs/GameCFG");
  2795. var SoundssManager_1 = require("../../managers/SoundssManager");
  2796. var Sdk_1 = require("../../platform/wxminigame/WXSDK/Sdk");
  2797. var GameStateManager = /** @class */ (function () {
  2798. function GameStateManager() {
  2799. /**
  2800. * 0:未开始,1:游戏中,2:暂停中
  2801. */
  2802. this.nowGameState = 0;
  2803. this._zhuanxiangbeishu = 0;
  2804. this._huadongSpeedX = 0;
  2805. this._huadongClimbSpeedX = 0;
  2806. this.endGamePlayerArr = [];
  2807. this._isneedShunyiX = false;
  2808. this._nowTime = 0;
  2809. this._lastAngle = 0;
  2810. this._time = 0;
  2811. this.nowMingCi = 0;
  2812. this._nums = 0;
  2813. this._all = 0;
  2814. }
  2815. GameStateManager.getInstance = function () {
  2816. if (!this._instance) {
  2817. this._instance = new GameStateManager();
  2818. }
  2819. return this._instance;
  2820. };
  2821. GameStateManager.prototype.init = function () {
  2822. this._huadongSpeedX = Number(GameCFG_1.default.dict[4].value);
  2823. this._huadongClimbSpeedX = Number(GameCFG_1.default.dict[5].value);
  2824. if (GameCFG_1.default.dict[7]) {
  2825. this._zhuanxiangbeishu = Number(GameCFG_1.default.dict[7].value);
  2826. }
  2827. else {
  2828. this._zhuanxiangbeishu = 2;
  2829. }
  2830. this.initEvent();
  2831. };
  2832. GameStateManager.prototype.initEvent = function () {
  2833. EventUtils_1.EventUtils.addEventListener(GameEvent_1.default.endGame, this, this.endGame);
  2834. EventUtils_1.EventUtils.addEventListener(GameEvent_1.default.npcendGame, this, this.npcendGameHandler);
  2835. };
  2836. GameStateManager.prototype.npcendGameHandler = function (str) {
  2837. this.endGamePlayerArr.push(str);
  2838. };
  2839. GameStateManager.prototype.setClickPanel = function (panel) {
  2840. this._joystickModule = new JoystickModule_1.JoystickModule(panel);
  2841. this._joystickModule.setEventCallback(this, this.ondownfun, this.onmovefun, this.onupfun);
  2842. };
  2843. GameStateManager.prototype.ondownfun = function () {
  2844. this._lastAngle = 0;
  2845. this._nowTime = Laya.Browser.now() / 1000;
  2846. };
  2847. GameStateManager.prototype.onmovefun = function (offsetX) {
  2848. if (this.nowGameState == 1) {
  2849. var disAngle = this._joystickModule.angle - this._lastAngle;
  2850. this._lastAngle = this._joystickModule.angle;
  2851. if (Scene3dObject_1.default.iscarmanpc) {
  2852. Scene3dObject_1.default.npcscriptDict["npc_0"].joyStickCHange(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, disAngle * this._zhuanxiangbeishu);
  2853. }
  2854. else {
  2855. Scene3DManager_1.default.getInstance().mainRoleScript.joyStickCHange(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, offsetX > 0 ? this._huadongClimbSpeedX : -this._huadongClimbSpeedX, disAngle * this._zhuanxiangbeishu);
  2856. }
  2857. }
  2858. };
  2859. GameStateManager.prototype.onupfun = function () {
  2860. if (Scene3dObject_1.default.iscarmanpc) {
  2861. Scene3dObject_1.default.npcscriptDict["npc_0"].joyStickCHange(0, 0);
  2862. }
  2863. else {
  2864. if (this.nowGameState == 1) {
  2865. Scene3DManager_1.default.getInstance().mainRoleScript.joyStickCHange(0, 0, 0);
  2866. // if( Laya.Browser.now()/1000 - this._nowTime < 0.2 )
  2867. // {
  2868. // if( this._joystickModule.offx > 4 )
  2869. // {
  2870. // Scene3DManager.getInstance().mainRoleScript.xshunyi( 1 );
  2871. // }
  2872. // else if( this._joystickModule.offx < -4 )
  2873. // {
  2874. // Scene3DManager.getInstance().mainRoleScript.xshunyi( -1 );
  2875. // }
  2876. // }
  2877. }
  2878. }
  2879. };
  2880. GameStateManager.prototype.update = function (dt) {
  2881. if (this.nowGameState == 1) {
  2882. this._time = 0;
  2883. var npcdict = Scene3dObject_1.default.npcscriptDict;
  2884. this._nums = 0;
  2885. this._all = 0;
  2886. var s;
  2887. var npcsp;
  2888. for (s in npcdict) {
  2889. npcsp = npcdict[s];
  2890. if (npcsp.getNowstate() == 1) {
  2891. if (Scene3dObject_1.default.mainRole.transform.position.z < npcsp.getPostion().z) {
  2892. this._nums++;
  2893. }
  2894. this._all++;
  2895. }
  2896. }
  2897. this.nowMingCi = this.endGamePlayerArr.length + ((this._all + 1) - this._nums);
  2898. Scene3dObject_1.default.txt_mingci.text = "第" + this.nowMingCi + "名";
  2899. }
  2900. };
  2901. GameStateManager.prototype.startGame = function () {
  2902. this.nowMingCi = 0;
  2903. this.endGamePlayerArr.length = 0;
  2904. this.nowGameState = 1;
  2905. TimerService_1.default.instance.addUpdateTarget(this);
  2906. this.update(500);
  2907. EventUtils_1.EventUtils.dispatchEvent(GameEvent_1.default.startGame);
  2908. SoundssManager_1.default.getInstance().playbgSound("bgm");
  2909. Sdk_1.WxApi.recordAldEvent("主界面点击开始游戏...");
  2910. };
  2911. GameStateManager.prototype.stopGame = function () {
  2912. this.nowGameState = 2;
  2913. this.onupfun();
  2914. };
  2915. GameStateManager.prototype.endGame = function () {
  2916. this.nowGameState = 0;
  2917. TimerService_1.default.instance.removeUpdateTarget(this);
  2918. var npcdict = Scene3dObject_1.default.npcscriptDict;
  2919. if (npcdict) {
  2920. for (var s in npcdict) {
  2921. npcdict[s].stop();
  2922. }
  2923. }
  2924. this.onupfun();
  2925. SoundssManager_1.default.getInstance().stopbgSound();
  2926. };
  2927. return GameStateManager;
  2928. }());
  2929. exports.default = GameStateManager;
  2930. },{"../../configs/dataConfigs/GameCFG":6,"../../frameworks/TimerService":13,"../../frameworks/events/EventUtils":16,"../../managers/Scene3DManager":64,"../../managers/SoundssManager":65,"../../platform/wxminigame/WXSDK/Sdk":75,"../joystick/JoystickModule":33,"../scene3ds/Scene3dObject":48,"../userinfo/events/GameEvent":54}],39:[function(require,module,exports){
  2931. "use strict";
  2932. Object.defineProperty(exports, "__esModule", { value: true });
  2933. var BaseProxys_1 = require("../../../frameworks/mvc/BaseProxys");
  2934. var GameEvent_1 = require("../../userinfo/events/GameEvent");
  2935. var UiManager_1 = require("../../../managers/UiManager");
  2936. var GameResultView_1 = require("../../result/GameResultView");
  2937. var GameStateManager_1 = require("../GameStateManager");
  2938. var GameUtils_1 = require("../../../utils/GameUtils");
  2939. var Scene3DManager_1 = require("../../../managers/Scene3DManager");
  2940. var Scene3dObject_1 = require("../../scene3ds/Scene3dObject");
  2941. var Sdk_1 = require("../../../platform/wxminigame/WXSDK/Sdk");
  2942. var GameProxy = /** @class */ (function (_super) {
  2943. __extends(GameProxy, _super);
  2944. function GameProxy() {
  2945. return _super.call(this) || this;
  2946. }
  2947. GameProxy.prototype.initProxy = function () {
  2948. this.addDataEvent(GameEvent_1.default.endGame, this, this.endgameHandler);
  2949. };
  2950. GameProxy.prototype.endgameHandler = function () {
  2951. Laya.timer.once(1000, this, this.startEndView);
  2952. };
  2953. GameProxy.prototype.startEndView = function () {
  2954. var nowmingcvi = GameStateManager_1.default.getInstance().nowMingCi;
  2955. var getGold = 0;
  2956. if (GameStateManager_1.default.getInstance().endGamePlayerArr.length == 0) {
  2957. getGold = this.roleVO.levelcfg.winGold;
  2958. Sdk_1.WxApi.recordAldEvent("打开结算界面(游戏胜利)");
  2959. }
  2960. else {
  2961. var arr = GameUtils_1.GameUtils.cutstrtoArr(this.roleVO.levelcfg.failGod);
  2962. getGold = GameUtils_1.GameUtils.randRangeint(Number(arr[0]), Number(arr[1]));
  2963. Sdk_1.WxApi.recordAldEvent("打开结算界面(游戏失败)");
  2964. }
  2965. UiManager_1.UiManager.instance.add(GameResultView_1.default, getGold);
  2966. };
  2967. GameProxy.prototype.returnmainview = function () {
  2968. Scene3dObject_1.default.getInstance().closeengamlizi();
  2969. UiManager_1.UiManager.instance.close(GameResultView_1.default);
  2970. this.dispacheDataEvent(GameEvent_1.default.returnMainView);
  2971. Scene3DManager_1.default.getInstance().showScene();
  2972. };
  2973. GameProxy.prototype.startGame = function () {
  2974. GameStateManager_1.default.getInstance().startGame();
  2975. };
  2976. GameProxy.key = "GameProxy";
  2977. return GameProxy;
  2978. }(BaseProxys_1.default));
  2979. exports.default = GameProxy;
  2980. },{"../../../frameworks/mvc/BaseProxys":19,"../../../managers/Scene3DManager":64,"../../../managers/UiManager":66,"../../../platform/wxminigame/WXSDK/Sdk":75,"../../../utils/GameUtils":87,"../../result/GameResultView":45,"../../scene3ds/Scene3dObject":48,"../../userinfo/events/GameEvent":54,"../GameStateManager":38}],40:[function(require,module,exports){
  2981. "use strict";
  2982. Object.defineProperty(exports, "__esModule", { value: true });
  2983. var BaseProxys_1 = require("../../../frameworks/mvc/BaseProxys");
  2984. var ResourceManager_1 = require("../../../managers/ResourceManager");
  2985. var LoadingView_1 = require("../../loading/view/LoadingView");
  2986. var UiManager_1 = require("../../../managers/UiManager");
  2987. var ResDataManager_1 = require("../../../managers/ResDataManager");
  2988. var MainView_1 = require("../view/MainView");
  2989. var Scene3DManager_1 = require("../../../managers/Scene3DManager");
  2990. var PathConfig_1 = require("../../../configs/gameConfigs/PathConfig");
  2991. var GameStateManager_1 = require("../GameStateManager");
  2992. var WXGamePlatform_1 = require("../../../platform/wxminigame/WXGamePlatform");
  2993. var NpcCFG_1 = require("../../../configs/dataConfigs/NpcCFG");
  2994. var YQSdk_1 = require("../../../platform/wxminigame/WXSDK/YQSdk");
  2995. var MainProxy = /** @class */ (function (_super) {
  2996. __extends(MainProxy, _super);
  2997. function MainProxy() {
  2998. var _this = _super.call(this) || this;
  2999. _this._loadjd = 0;
  3000. _this._alljd = 0;
  3001. return _this;
  3002. }
  3003. MainProxy.prototype.initProxy = function () {
  3004. };
  3005. MainProxy.prototype.enterMain = function () {
  3006. this._loadjd = 0;
  3007. this._alljd = 20;
  3008. WXGamePlatform_1.default.getInstance().loadSubpackage("subpackage", this, this.sub1complete, this.loadprogress, null);
  3009. };
  3010. MainProxy.prototype.sub1complete = function () {
  3011. this._loadjd = 20;
  3012. this._alljd = 30;
  3013. WXGamePlatform_1.default.getInstance().loadSubpackage("subpackage1", this, this.subcomplete, this.loadprogress, null);
  3014. };
  3015. MainProxy.prototype.subcomplete = function () {
  3016. this._loadjd = 50;
  3017. this._alljd = 40;
  3018. var pathArr = [];
  3019. var urlArr = [];
  3020. urlArr.push(PathConfig_1.PathConfig.get3DModel("startPlane"));
  3021. urlArr.push(PathConfig_1.PathConfig.get3DModel("endPlane"));
  3022. urlArr.push(PathConfig_1.PathConfig.get3DModel("jiasulizi"));
  3023. urlArr.push(PathConfig_1.PathConfig.get3DModel("tanse_bai"));
  3024. urlArr.push(PathConfig_1.PathConfig.get3DModel("tanse_huang"));
  3025. urlArr.push(PathConfig_1.PathConfig.get3DModel("win_xian"));
  3026. urlArr.push(PathConfig_1.PathConfig.get3DModel("yanhua"));
  3027. urlArr.push(PathConfig_1.PathConfig.get3DModel("DirectionalLight"));
  3028. // urlArr.push( PathConfig.get3DModel( "distantview" ) );
  3029. urlArr.push(PathConfig_1.PathConfig.get3DRoleModel(this.roleVO.roleCfg.name));
  3030. var arr = this.roleVO.levelmapArr;
  3031. var i = 0;
  3032. for (i = 0; i < arr.length; i++) {
  3033. if (urlArr.indexOf(PathConfig_1.PathConfig.get3DModel(arr[i])) == -1) {
  3034. urlArr.push(PathConfig_1.PathConfig.get3DModel(arr[i]));
  3035. }
  3036. }
  3037. var npcArr = this.roleVO.levelcfg.npc;
  3038. for (i = 0; i < npcArr.length; i++) {
  3039. if (urlArr.indexOf(PathConfig_1.PathConfig.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) {
  3040. urlArr.push(PathConfig_1.PathConfig.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name));
  3041. }
  3042. }
  3043. for (i = 0; i < urlArr.length; i++) {
  3044. pathArr.push({ url: urlArr[i] });
  3045. }
  3046. ResourceManager_1.default.getInstance().loader3DArr(pathArr, this, this.load3Dcomplete, this.loadprogress);
  3047. };
  3048. MainProxy.prototype.load3Dcomplete = function () {
  3049. this._loadjd = 90;
  3050. this._alljd = 10;
  3051. ResourceManager_1.default.getInstance().loadGroup("main", this, this.loadcomplete, this.loadprogress, false);
  3052. };
  3053. MainProxy.prototype.loadprogress = function (value) {
  3054. var loadingview = UiManager_1.UiManager.instance.getView(LoadingView_1.default);
  3055. if (loadingview) {
  3056. value = this._loadjd + Math.ceil(value / 100 * this._alljd);
  3057. loadingview.showWord(value);
  3058. }
  3059. };
  3060. MainProxy.prototype.loadcomplete = function () {
  3061. fairygui.UIConfig.buttonSound = "ui://lecxynh2iz9y26";
  3062. GameStateManager_1.default.getInstance().init();
  3063. ResDataManager_1.default.getInastance().adduiPackage("main");
  3064. UiManager_1.UiManager.instance.close(LoadingView_1.default);
  3065. UiManager_1.UiManager.instance.add(MainView_1.default);
  3066. Scene3DManager_1.default.getInstance().initGame();
  3067. // SoundssManager.getInstance().playbgSound( "gamebg" );
  3068. // CacheManager.getInstance().clearAll();
  3069. YQSdk_1.YQSdk.pullAdPosition();
  3070. };
  3071. MainProxy.prototype.ceshi = function () {
  3072. };
  3073. MainProxy.key = "MainProxy";
  3074. return MainProxy;
  3075. }(BaseProxys_1.default));
  3076. exports.default = MainProxy;
  3077. },{"../../../configs/dataConfigs/NpcCFG":8,"../../../configs/gameConfigs/PathConfig":10,"../../../frameworks/mvc/BaseProxys":19,"../../../managers/ResDataManager":62,"../../../managers/ResourceManager":63,"../../../managers/Scene3DManager":64,"../../../managers/UiManager":66,"../../../platform/wxminigame/WXGamePlatform":72,"../../../platform/wxminigame/WXSDK/YQSdk":77,"../../loading/view/LoadingView":35,"../GameStateManager":38,"../view/MainView":41}],41:[function(require,module,exports){
  3078. "use strict";
  3079. Object.defineProperty(exports, "__esModule", { value: true });
  3080. var BaseView_1 = require("../../../frameworks/mvc/BaseView");
  3081. var GameStateManager_1 = require("../GameStateManager");
  3082. var GameEvent_1 = require("../../userinfo/events/GameEvent");
  3083. var Scene3dObject_1 = require("../../scene3ds/Scene3dObject");
  3084. var UserInfoProxy_1 = require("../../userinfo/UserInfoProxy");
  3085. var UserInfoEvent_1 = require("../../userinfo/events/UserInfoEvent");
  3086. var SkinProxy_1 = require("../../skins/proxys/SkinProxy");
  3087. var GameProxy_1 = require("../proxys/GameProxy");
  3088. var UiManager_1 = require("../../../managers/UiManager");
  3089. var ChoutiPanView_1 = require("../../../platform/wxminigame/WXSDK/cpa/ChoutiPanView");
  3090. var TuijianView_1 = require("../../../platform/wxminigame/WXSDK/cpa/TuijianView");
  3091. var MainView = /** @class */ (function (_super) {
  3092. __extends(MainView, _super);
  3093. function MainView() {
  3094. return _super.call(this, "main", "mainview") || this;
  3095. }
  3096. MainView.prototype.onInit = function () {
  3097. _super.prototype.onInit.call(this);
  3098. };
  3099. MainView.prototype.initView = function () {
  3100. this._userinfoProxy = this.getProxy(UserInfoProxy_1.default);
  3101. Scene3dObject_1.default.pro_jindu = this.pro_dis;
  3102. Scene3dObject_1.default.txt_mingci = this.txt_mingci;
  3103. this.c_state = this.getControllerByBame("c_state");
  3104. GameStateManager_1.default.getInstance().setClickPanel(this.load_clickpanel);
  3105. this.returnmainHandler();
  3106. this.updateUserDataHandler();
  3107. };
  3108. MainView.prototype.initEvent = function () {
  3109. this.addListener(this.load_start, Laya.Event.CLICK, this, this.btnclick);
  3110. this.addListener(this.btn_skin, Laya.Event.CLICK, this, this.skinclick);
  3111. this.addListener(this.btn_more, Laya.Event.CLICK, this, this.moreclick);
  3112. this.addListener(this.btn_tuijian, Laya.Event.CLICK, this, this.tuijianclick);
  3113. this.addDataEvent(GameEvent_1.default.returnMainView, this, this.returnmainHandler);
  3114. this.addDataEvent(UserInfoEvent_1.default.UserInfoEvent_updateUserData, this, this.updateUserDataHandler);
  3115. };
  3116. MainView.prototype.tuijianclick = function () {
  3117. UiManager_1.UiManager.instance.add(TuijianView_1.default);
  3118. };
  3119. MainView.prototype.skinclick = function () {
  3120. this.getProxy(SkinProxy_1.default).openview();
  3121. };
  3122. MainView.prototype.moreclick = function () {
  3123. UiManager_1.UiManager.instance.add(ChoutiPanView_1.default);
  3124. };
  3125. MainView.prototype.updateUserDataHandler = function () {
  3126. this.txt_gold.text = this._userinfoProxy.roleVO.Gold.toString();
  3127. };
  3128. MainView.prototype.returnmainHandler = function () {
  3129. var rolevo = this._userinfoProxy.roleVO;
  3130. if (rolevo.nowlevel <= 2) {
  3131. this.c_state.selectedIndex = 0;
  3132. }
  3133. else {
  3134. this.c_state.selectedIndex = 1;
  3135. }
  3136. };
  3137. MainView.prototype.btnclick = function () {
  3138. this.c_state.selectedIndex = 2;
  3139. this.txt_lv.text = this._userinfoProxy.roleVO.getNowServerLevel().toString();
  3140. this.getProxy(GameProxy_1.default).startGame();
  3141. };
  3142. MainView.key = "MainView";
  3143. return MainView;
  3144. }(BaseView_1.default));
  3145. exports.default = MainView;
  3146. },{"../../../frameworks/mvc/BaseView":20,"../../../managers/UiManager":66,"../../../platform/wxminigame/WXSDK/cpa/ChoutiPanView":79,"../../../platform/wxminigame/WXSDK/cpa/TuijianView":84,"../../scene3ds/Scene3dObject":48,"../../skins/proxys/SkinProxy":51,"../../userinfo/UserInfoProxy":53,"../../userinfo/events/GameEvent":54,"../../userinfo/events/UserInfoEvent":56,"../GameStateManager":38,"../proxys/GameProxy":39}],42:[function(require,module,exports){
  3147. "use strict";
  3148. Object.defineProperty(exports, "__esModule", { value: true });
  3149. var Scene3dObject_1 = require("../scene3ds/Scene3dObject");
  3150. var GameUtils_1 = require("../../utils/GameUtils");
  3151. var GameCFG_1 = require("../../configs/dataConfigs/GameCFG");
  3152. var CamerasScript = /** @class */ (function (_super) {
  3153. __extends(CamerasScript, _super);
  3154. function CamerasScript() {
  3155. var _this = _super.call(this) || this;
  3156. _this.iscanfollow = false;
  3157. _this._upvec = new Laya.Vector3(0, 1, 0);
  3158. _this._index = 0;
  3159. _this._slerpValue = 8;
  3160. _this._lookatVec = new Laya.Vector3;
  3161. return _this;
  3162. }
  3163. CamerasScript.prototype.onAwake = function () {
  3164. //获取脚本所属对象
  3165. this.camera = this.owner;
  3166. this._toVec = new Laya.Vector3();
  3167. this.camera.fieldOfView = 90;
  3168. };
  3169. CamerasScript.prototype.initPos = function (vec) {
  3170. var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[1].value);
  3171. this._disVector = new Laya.Vector3(Number(valueArr[0]), Number(valueArr[1]), Number(valueArr[2]));
  3172. Laya.Vector3.add(vec, this._disVector, this._toVec);
  3173. this.camera.transform.position = this._toVec;
  3174. this.camera.transform.position.x = vec.x;
  3175. // this.camera.transform.lookAt( vec,new Laya.Vector3( 0,1,0 ) );
  3176. };
  3177. CamerasScript.prototype.onStart = function () {
  3178. this._transform = this.camera.transform;
  3179. //旋转摄像机角度
  3180. this._transform.rotate(new Laya.Vector3(0, 0, 0), true, false);
  3181. // this.camera.clearColor = null;
  3182. };
  3183. CamerasScript.prototype.onUpdate = function () {
  3184. if (this.iscanfollow) {
  3185. if (Scene3dObject_1.default.iscarmanpc) {
  3186. if (Scene3dObject_1.default.npcDict["npc_0"]) {
  3187. Laya.Vector3.add(Scene3dObject_1.default.npcDict["npc_0"].transform.position, this._disVector, this._toVec);
  3188. this._transform.position = this._toVec;
  3189. this._transform.position.x = Scene3dObject_1.default.npcDict["npc_0"].transform.position.x;
  3190. this._transform.lookAt(Scene3dObject_1.default.npcDict["npc_0"].transform.position, this._upvec);
  3191. }
  3192. }
  3193. else {
  3194. if (Scene3dObject_1.default.mainRole) {
  3195. Laya.Vector3.add(Scene3dObject_1.default.mainRole.transform.position, this._disVector, this._toVec);
  3196. // this._toVec.x = Scene3dObject.mainRole.transform.position.x;
  3197. // this._transform.position = this._toVec;
  3198. // this._transform.lookAt( Scene3dObject.mainRole.transform.position,this._upvec );
  3199. Laya.Vector3.lerp(this._transform.position, this._toVec, 16 / 1000 * this._slerpValue, this._toVec);
  3200. // this._toVec.z = Scene3dObject.mainRole.transform.position.z+this._disVector.z;
  3201. // this._toVec.y = Scene3dObject.mainRole.transform.position.y + this._disVector.y;
  3202. this._transform.position = this._toVec;
  3203. this._lookatVec.x = this._toVec.x;
  3204. this._lookatVec.y = Scene3dObject_1.default.mainRole.transform.position.y;
  3205. this._lookatVec.z = Scene3dObject_1.default.mainRole.transform.position.z;
  3206. this._transform.lookAt(this._lookatVec, this._upvec);
  3207. }
  3208. }
  3209. }
  3210. };
  3211. CamerasScript.prototype.MyRotateAround = function (targetPos, speed) {
  3212. this.iscanfollow = false;
  3213. this._transform.translate(speed, false);
  3214. this._transform.lookAt(targetPos, this._upvec);
  3215. };
  3216. return CamerasScript;
  3217. }(Laya.Script3D));
  3218. exports.default = CamerasScript;
  3219. },{"../../configs/dataConfigs/GameCFG":6,"../../utils/GameUtils":87,"../scene3ds/Scene3dObject":48}],43:[function(require,module,exports){
  3220. "use strict";
  3221. Object.defineProperty(exports, "__esModule", { value: true });
  3222. var Debuger_1 = require("../../frameworks/Debuger");
  3223. var TimerService_1 = require("../../frameworks/TimerService");
  3224. var Scene3dObject_1 = require("../scene3ds/Scene3dObject");
  3225. var RoleActions_1 = require("../scene3ds/RoleActions");
  3226. var MVCObjectPool_1 = require("../../frameworks/mvc/MVCObjectPool");
  3227. var UserInfoProxy_1 = require("../userinfo/UserInfoProxy");
  3228. var BuildCFG_1 = require("../../configs/dataConfigs/BuildCFG");
  3229. var CamerasScript_1 = require("./CamerasScript");
  3230. var EventUtils_1 = require("../../frameworks/events/EventUtils");
  3231. var GameEvent_1 = require("../userinfo/events/GameEvent");
  3232. var GameUtils_1 = require("../../utils/GameUtils");
  3233. var GameStateManager_1 = require("../main/GameStateManager");
  3234. var SoundssManager_1 = require("../../managers/SoundssManager");
  3235. var WXGamePlatform_1 = require("../../platform/wxminigame/WXGamePlatform");
  3236. var MainRAoleScript = /** @class */ (function (_super) {
  3237. __extends(MainRAoleScript, _super);
  3238. function MainRAoleScript() {
  3239. var _this = _super.call(this) || this;
  3240. /**
  3241. * RoleAction
  3242. */
  3243. _this._nowState = "";
  3244. _this.resouseName = "";
  3245. _this._isColling = false;
  3246. _this._nowCollTargetName = "";
  3247. _this._normalizeVec = new Laya.Vector3;
  3248. _this._nowbuildname = "";
  3249. _this._nowscenename = "";
  3250. /**
  3251. * 0:未锁,1:锁左边,2:锁右边
  3252. */
  3253. _this._lockxstate = 0;
  3254. _this._lockbyBuildname = "";
  3255. /**
  3256. * 0:未被锁,1:锁定左边,2:锁定右边,
  3257. */
  3258. _this._lockstate = 0;
  3259. _this._shangpaVec = new Laya.Vector3;
  3260. _this._lastState = "";
  3261. _this._moveTime = 0;
  3262. _this._isActionNums = false;
  3263. _this._isneedactionnum = 0;
  3264. _this._needactiontime = 0;
  3265. /**
  3266. * 加速buffvec
  3267. */
  3268. _this._lastjiasuState = "";
  3269. _this._jiasubuffTime = 0;
  3270. _this.iscanzhendong = false;
  3271. _this.zhendongtime = 0;
  3272. _this._isShuangbeijiasu = false;
  3273. _this._beishuVec = new Laya.Vector3(1, 1, 1);
  3274. _this._moveVec = new Laya.Vector3;
  3275. _this.isPengzhuang = false;
  3276. _this.jumpSpeed = new Laya.Vector3;
  3277. _this.jumpHight = 0;
  3278. _this._disy = 0;
  3279. _this.g = 10; //重力加速度
  3280. _this._ending = false;
  3281. _this._endAnmoSpeed = new Laya.Vector3();
  3282. _this._endanmotime = 1;
  3283. _this._endAnmoSpeed1 = new Laya.Vector3;
  3284. _this._changeMoveX = 0;
  3285. _this.isforceJump = false;
  3286. _this.quaternion = new Laya.Quaternion;
  3287. return _this;
  3288. }
  3289. MainRAoleScript.prototype.onAwake = function () {
  3290. this._animator = this.owner.getComponent(Laya.Animator);
  3291. Scene3dObject_1.default.setAnimator(this._animator);
  3292. this._speedMoveV3 = new Laya.Vector3(0, 0, 0);
  3293. var sp = this.owner;
  3294. this._transform = sp.transform;
  3295. this._roleVO = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default).roleVO;
  3296. sp.getComponent(Laya.Rigidbody3D).ccdMotionThreshold = 0.001;
  3297. this._lefttrail = sp.getChildByName("lefttrail");
  3298. this._righttrail = sp.getChildByName("righttrail");
  3299. };
  3300. MainRAoleScript.prototype.onEnable = function () {
  3301. };
  3302. MainRAoleScript.prototype.onStart = function () {
  3303. };
  3304. MainRAoleScript.prototype.startRun = function () {
  3305. // this.pzdict = {};
  3306. // this.pzarr = [];
  3307. this._beishuVec.x = 1;
  3308. this._beishuVec.y = 1;
  3309. this._beishuVec.z = 1;
  3310. this._jiasubuffTime = 0;
  3311. this._isShuangbeijiasu = false;
  3312. this._lastjiasuState = "";
  3313. this._ending = false;
  3314. this._changeMoveX = 0;
  3315. this._initPosVec = this._transform.position.clone();
  3316. this._nowbuildname = "";
  3317. this._nowscenename = "";
  3318. this.nowState = RoleActions_1.default.run;
  3319. this._speedMoveV3.x = 0;
  3320. this._speedMoveV3.y = 0;
  3321. this._speedMoveV3.z = -this._roleVO.movespeed;
  3322. Debuger_1.default.log("开始跑");
  3323. this._iscanMove = true;
  3324. TimerService_1.default.instance.addUpdateTarget(this);
  3325. };
  3326. // private pzdict:any = {};
  3327. // private pzarr:Array<any> = [];
  3328. /**
  3329. * 开始碰撞时执行
  3330. */
  3331. MainRAoleScript.prototype.onCollisionEnter = function (collision) {
  3332. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  3333. var contactPoint = collision.contacts[0];
  3334. this.jisuanCollision(contactPoint.normal, collision.other.owner, contactPoint.positionOnB);
  3335. }
  3336. };
  3337. MainRAoleScript.prototype.setnowSelectVec = function (pos) {
  3338. this._nowselectVec = pos;
  3339. };
  3340. MainRAoleScript.prototype.jisuanCollision = function (normal, target, collpoint) {
  3341. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) {
  3342. return;
  3343. }
  3344. this._nowCollTargetName = target.name;
  3345. var n = new Laya.Vector3;
  3346. Laya.Vector3.normalize(normal, this._normalizeVec);
  3347. Debuger_1.default.log("开始碰撞", this._normalizeVec, target.name);
  3348. if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 ||
  3349. this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  3350. {
  3351. if (this._nowCollTargetName.indexOf("build") != -1) {
  3352. this._nowbuildname = this._nowCollTargetName;
  3353. this._nowscenename = target.parent.parent.name;
  3354. }
  3355. if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  3356. this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  3357. }
  3358. else {
  3359. this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName);
  3360. }
  3361. if (this._normalizeVec.z == -1) //上爬
  3362. {
  3363. if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.2)) {
  3364. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  3365. this.nowState = RoleActions_1.default.run;
  3366. }
  3367. else {
  3368. this.nowState = RoleActions_1.default.Climb;
  3369. this._shangpaVec = this._nowselectVec.clone();
  3370. // this.pzdict[this._nowCollTargetName] = RoleActions.Climb;
  3371. // this.pzarr.push( this._nowCollTargetName );
  3372. }
  3373. }
  3374. else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) {
  3375. this.nowState = RoleActions_1.default.run;
  3376. }
  3377. else if (this._normalizeVec.x == -1) {
  3378. if (this.nowState == RoleActions_1.default.run) {
  3379. this._lockxstate = 1;
  3380. }
  3381. else if (this.nowState == RoleActions_1.default.Climb) {
  3382. this._lockxstate = 1;
  3383. }
  3384. else {
  3385. this.nowState = RoleActions_1.default.left_climb;
  3386. }
  3387. }
  3388. else if (this._normalizeVec.x == 1) {
  3389. if (this.nowState == RoleActions_1.default.run) {
  3390. this._lockxstate = 2;
  3391. }
  3392. else if (this.nowState == RoleActions_1.default.Climb) {
  3393. this._lockxstate = 2;
  3394. }
  3395. else {
  3396. this.nowState = RoleActions_1.default.right_climb;
  3397. }
  3398. }
  3399. else {
  3400. if (this._normalizeVec.z != 1) {
  3401. this.nowState = RoleActions_1.default.lockclimb;
  3402. this._shangpaVec = this._nowselectVec.clone();
  3403. }
  3404. }
  3405. }
  3406. else if (this._nowCollTargetName.indexOf("panel_jump") != -1) //加速板跳跃
  3407. {
  3408. this.nowState = RoleActions_1.default.jiasuJump;
  3409. // this.setJump( this.nowState );
  3410. }
  3411. else if (this._nowCollTargetName.indexOf("panel_downslip") != -1) {
  3412. this.nowState = RoleActions_1.default.downSlide;
  3413. // this.setJump( this.nowState );
  3414. }
  3415. else if (this._nowCollTargetName.indexOf("box_Board") != -1 && this.nowState != RoleActions_1.default.downSlide) {
  3416. if (this._normalizeVec.z == -1) //上爬
  3417. {
  3418. this.nowState = RoleActions_1.default.Climb;
  3419. this._shangpaVec = this._nowselectVec.clone();
  3420. }
  3421. }
  3422. else if (this._nowCollTargetName.indexOf("box_sidejump") != -1) {
  3423. this.nowState = RoleActions_1.default.slidejiasu;
  3424. // this.setJump( this.nowState );
  3425. }
  3426. else if (this._nowCollTargetName.indexOf("box_Surmount") != -1) {
  3427. this.nowState = RoleActions_1.default.surmount;
  3428. // this.setJump( this.nowState );
  3429. }
  3430. else if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  3431. this.nowState = RoleActions_1.default.Climb;
  3432. this._shangpaVec = this._nowselectVec.clone();
  3433. }
  3434. };
  3435. /**
  3436. * 持续碰撞时执行
  3437. */
  3438. MainRAoleScript.prototype.onCollisionStay = function (collision) {
  3439. // Debuger.log( "碰撞中" );
  3440. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  3441. this._isColling = true;
  3442. var contactPoint = collision.contacts[0];
  3443. var target = collision.other.owner;
  3444. var targetname = target.name;
  3445. if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1) {
  3446. this._nowCollTargetName = targetname;
  3447. }
  3448. if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 ||
  3449. this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  3450. {
  3451. if (this._nowCollTargetName.indexOf("build") != -1) {
  3452. this._nowbuildname = this._nowCollTargetName;
  3453. this._nowscenename = target.parent.parent.name;
  3454. }
  3455. if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  3456. this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  3457. }
  3458. else {
  3459. this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName);
  3460. }
  3461. }
  3462. }
  3463. };
  3464. /**
  3465. * 结束碰撞时执行
  3466. */
  3467. MainRAoleScript.prototype.onCollisionExit = function (collision) {
  3468. this._isColling = false;
  3469. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  3470. var contactPoint = collision.contacts[0];
  3471. this.checkendColl(contactPoint.normal, collision.other.owner);
  3472. }
  3473. };
  3474. MainRAoleScript.prototype.checkendColl = function (normal, target) {
  3475. Debuger_1.default.log("结束碰撞", target.name);
  3476. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) {
  3477. return;
  3478. }
  3479. if (this.isforceJump) {
  3480. this.isforceJump = false;
  3481. return;
  3482. }
  3483. if (this._lockxstate) {
  3484. this._lockxstate = 0;
  3485. return;
  3486. }
  3487. if (this._nowCollTargetName != target.name) {
  3488. return;
  3489. }
  3490. if (target.name.indexOf("panel_jump") != -1) {
  3491. return;
  3492. }
  3493. Debuger_1.default.log("计算碰撞完成状态");
  3494. switch (this.nowState) {
  3495. case RoleActions_1.default.Climb:
  3496. case RoleActions_1.default.lockclimb:
  3497. if (this._nowCollTargetName.indexOf("box_Board") != -1) {
  3498. this.setJumpState(this._changeMoveX);
  3499. }
  3500. else {
  3501. // var istoTop:boolean = Scene3dObject.checkisClimbTop( target.parent.parent.name,target.name,this._transform.position );
  3502. // if( istoTop )
  3503. // {
  3504. // Debuger.log( "播放爬楼完成动作" );
  3505. // this.nowState = RoleActions.playPalouAction;
  3506. // this.playAnmo("");
  3507. // }
  3508. // else
  3509. // {
  3510. // if( this._changeMoveX > 0 )
  3511. // {
  3512. // this.nowState = RoleActions.right_jump;
  3513. // // this.setJump( this.nowState );
  3514. // }
  3515. // else if( this._changeMoveX < 0 )
  3516. // {
  3517. // this.nowState = RoleActions.left_jump;
  3518. // // this.setJump( this.nowState );
  3519. // }
  3520. // }
  3521. if (this._changeMoveX > 0) {
  3522. this.nowState = RoleActions_1.default.right_jump;
  3523. // this.setJump( this.nowState );
  3524. }
  3525. else if (this._changeMoveX < 0) {
  3526. this.nowState = RoleActions_1.default.left_jump;
  3527. // this.setJump( this.nowState );
  3528. }
  3529. }
  3530. break;
  3531. case RoleActions_1.default.right_climb:
  3532. case RoleActions_1.default.left_climb:
  3533. this.setJumpState(this._changeMoveX);
  3534. break;
  3535. case RoleActions_1.default.run:
  3536. this.setJumpState(this._changeMoveX);
  3537. break;
  3538. case RoleActions_1.default.xshunyi:
  3539. this.setJumpState(this._speedMoveV3.x);
  3540. break;
  3541. }
  3542. };
  3543. MainRAoleScript.prototype.setJumpState = function (value) {
  3544. if (value > 0) {
  3545. this.nowState = RoleActions_1.default.right_jump;
  3546. // this.setJump( this.nowState );
  3547. }
  3548. else if (value < 0) {
  3549. this.nowState = RoleActions_1.default.left_jump;
  3550. // this.setJump( this.nowState );
  3551. }
  3552. else {
  3553. this.nowState = RoleActions_1.default.jump;
  3554. // this.setJump( this.nowState );
  3555. }
  3556. };
  3557. MainRAoleScript.prototype.playAnmo = function (actinName) {
  3558. this._isActionNums = true;
  3559. this._isneedactionnum = 1;
  3560. this.setAction(RoleActions_1.default.climbend);
  3561. };
  3562. MainRAoleScript.prototype.actionCompelte = function () {
  3563. this.nowState = RoleActions_1.default.run;
  3564. };
  3565. Object.defineProperty(MainRAoleScript.prototype, "nowState", {
  3566. get: function () {
  3567. return this._nowState;
  3568. },
  3569. set: function (value) {
  3570. if (this._nowState != value || this._lastState == RoleActions_1.default.jiasuJump || this._nowState == RoleActions_1.default.jiasuJump) {
  3571. this._lastState = this._nowState;
  3572. this._nowState = value;
  3573. this._moveTime = 0;
  3574. this.iscanzhendong = false;
  3575. this.changtrailState(true);
  3576. switch (this._nowState) {
  3577. case RoleActions_1.default.stand:
  3578. this._isActionNums = false;
  3579. this.setAction(RoleActions_1.default.stand);
  3580. break;
  3581. case RoleActions_1.default.run:
  3582. if (this._lastState == RoleActions_1.default.jump || this._lastState == RoleActions_1.default.left_jump || this._lastState == RoleActions_1.default.right_jump) {
  3583. this._isActionNums = true;
  3584. this._isneedactionnum = 1;
  3585. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  3586. if (sort < 50) {
  3587. this.setAction(RoleActions_1.default.luodi1);
  3588. }
  3589. else {
  3590. this.setAction(RoleActions_1.default.luodi2);
  3591. }
  3592. }
  3593. else {
  3594. this._isActionNums = false;
  3595. this.setAction(RoleActions_1.default.run);
  3596. }
  3597. break;
  3598. case RoleActions_1.default.jump:
  3599. this.setAction(RoleActions_1.default.jump);
  3600. Scene3dObject_1.default.getInstance().setliziPlaytanse("tanse_bai", this._transform.position);
  3601. this._isActionNums = true;
  3602. this._isneedactionnum = 1;
  3603. this.jumpSpeed.x = this._roleVO.frontjump.x;
  3604. this.jumpSpeed.y = this._roleVO.frontjump.y;
  3605. this.jumpSpeed.z = this._roleVO.frontjump.z;
  3606. SoundssManager_1.default.getInstance().playGameSound("jump");
  3607. WXGamePlatform_1.default.getInstance().vibrateShort();
  3608. break;
  3609. case RoleActions_1.default.left_jump:
  3610. Scene3dObject_1.default.getInstance().setliziPlaytanse("tanse_bai", this._transform.position);
  3611. this.jumpSpeed.x = this._roleVO.leftjump.x;
  3612. this.jumpSpeed.y = this._roleVO.leftjump.y;
  3613. this.jumpSpeed.z = this._roleVO.leftjump.z;
  3614. this._isActionNums = true;
  3615. this._isneedactionnum = 1;
  3616. this.setAction(RoleActions_1.default.leftjump);
  3617. SoundssManager_1.default.getInstance().playGameSound("jump");
  3618. WXGamePlatform_1.default.getInstance().vibrateShort();
  3619. break;
  3620. case RoleActions_1.default.right_jump:
  3621. Scene3dObject_1.default.getInstance().setliziPlaytanse("tanse_bai", this._transform.position);
  3622. this.jumpSpeed.x = this._roleVO.rightjump.x;
  3623. this.jumpSpeed.y = this._roleVO.rightjump.y;
  3624. this.jumpSpeed.z = this._roleVO.rightjump.z;
  3625. this._isActionNums = true;
  3626. this._isneedactionnum = 1;
  3627. this.setAction(RoleActions_1.default.rightjump);
  3628. SoundssManager_1.default.getInstance().playGameSound("jump");
  3629. WXGamePlatform_1.default.getInstance().vibrateShort();
  3630. break;
  3631. case RoleActions_1.default.jiasuJump:
  3632. var buildcfg = BuildCFG_1.default.dict["panel_jump"];
  3633. if (this._jiasubuffTime > 0) {
  3634. this._beishuVec.x = 1;
  3635. this._beishuVec.y = 1;
  3636. this._beishuVec.z = buildcfg.buffz * buildcfg.buffz;
  3637. this._isShuangbeijiasu = true;
  3638. }
  3639. else {
  3640. this._beishuVec.x = 1;
  3641. this._beishuVec.y = 1;
  3642. this._beishuVec.z = buildcfg.buffz;
  3643. }
  3644. this._jiasubuffTime = buildcfg.time;
  3645. this.jumpSpeed.x = buildcfg.buffx * this._beishuVec.x;
  3646. this.jumpSpeed.y = buildcfg.buffy;
  3647. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._beishuVec.z;
  3648. this._isActionNums = true;
  3649. this._isneedactionnum = 1;
  3650. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  3651. if (sort < 50) {
  3652. this.setAction(RoleActions_1.default.datiao1);
  3653. }
  3654. else {
  3655. this.setAction(RoleActions_1.default.datiao2);
  3656. }
  3657. SoundssManager_1.default.getInstance().playGameSound("jump");
  3658. Laya.timer.clear(this, this.playspeedSound);
  3659. Laya.timer.once(200, this, this.playspeedSound);
  3660. WXGamePlatform_1.default.getInstance().vibrateShort();
  3661. break;
  3662. case RoleActions_1.default.downSlide:
  3663. var buildcfg = BuildCFG_1.default.dict["panel_downslip"];
  3664. if (this._jiasubuffTime > 0) {
  3665. this._beishuVec.x = 1;
  3666. this._beishuVec.y = 1;
  3667. this._beishuVec.z = buildcfg.buffz * buildcfg.buffz;
  3668. this._isShuangbeijiasu = true;
  3669. }
  3670. else {
  3671. this._beishuVec.x = 1;
  3672. this._beishuVec.y = 1;
  3673. this._beishuVec.z = buildcfg.buffz;
  3674. }
  3675. this._jiasubuffTime = buildcfg.time;
  3676. this.jumpSpeed.x = buildcfg.buffx * this._beishuVec.x;
  3677. this.jumpSpeed.y = buildcfg.buffy * this._beishuVec.y;
  3678. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._beishuVec.z;
  3679. this._isActionNums = true;
  3680. this._isneedactionnum = 1;
  3681. this.setAction(RoleActions_1.default.huachan);
  3682. this.playspeedSound();
  3683. WXGamePlatform_1.default.getInstance().vibrateShort();
  3684. break;
  3685. case RoleActions_1.default.slidejiasu:
  3686. var buildcfg = BuildCFG_1.default.dict["box_sidejump"];
  3687. if (this._jiasubuffTime > 0) {
  3688. this._beishuVec.x = 1;
  3689. this._beishuVec.y = 1;
  3690. this._beishuVec.z = buildcfg.buffz * buildcfg.buffz;
  3691. this._isShuangbeijiasu = true;
  3692. }
  3693. else {
  3694. this._beishuVec.x = 1;
  3695. this._beishuVec.y = 1;
  3696. this._beishuVec.z = buildcfg.buffz;
  3697. }
  3698. this._jiasubuffTime = buildcfg.time;
  3699. this.jumpSpeed.x = buildcfg.buffx * this._beishuVec.x;
  3700. this.jumpSpeed.y = buildcfg.buffy * this._beishuVec.y;
  3701. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._beishuVec.z;
  3702. this._isActionNums = false;
  3703. this.playspeedSound();
  3704. WXGamePlatform_1.default.getInstance().vibrateShort();
  3705. // this.setAction( RoleActions. );
  3706. break;
  3707. case RoleActions_1.default.surmount:
  3708. var buildcfg = BuildCFG_1.default.dict["box_Surmount"];
  3709. if (this._jiasubuffTime > 0) {
  3710. this._beishuVec.x = 1;
  3711. this._beishuVec.y = 1;
  3712. this._beishuVec.z = buildcfg.buffz * buildcfg.buffz;
  3713. this._isShuangbeijiasu = true;
  3714. }
  3715. else {
  3716. this._beishuVec.x = 1;
  3717. this._beishuVec.y = 1;
  3718. this._beishuVec.z = buildcfg.buffz;
  3719. }
  3720. this._jiasubuffTime = buildcfg.time;
  3721. this.jumpSpeed.x = buildcfg.buffx * this._beishuVec.x;
  3722. this.jumpSpeed.y = (buildcfg.buffy + 0.5) * this._beishuVec.y;
  3723. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._beishuVec.z;
  3724. this._isActionNums = true;
  3725. this._isneedactionnum = 1;
  3726. this.setAction(RoleActions_1.default.kualan);
  3727. break;
  3728. case RoleActions_1.default.Climb:
  3729. case RoleActions_1.default.lockclimb:
  3730. this.jumpSpeed.x = 0;
  3731. this.jumpSpeed.y = this._roleVO.upclimb;
  3732. this.jumpSpeed.z = 0;
  3733. this._isActionNums = false;
  3734. this.setAction(RoleActions_1.default.paqiang);
  3735. WXGamePlatform_1.default.getInstance().vibrateShort();
  3736. this.iscanzhendong = true;
  3737. this.zhendongtime = 0;
  3738. this.changtrailState(false);
  3739. break;
  3740. case RoleActions_1.default.left_climb:
  3741. this.jumpSpeed.x = 0;
  3742. this.jumpSpeed.y = this._roleVO.slideclimb.y;
  3743. this.jumpSpeed.z = this._roleVO.slideclimb.z;
  3744. this._isActionNums = false;
  3745. this.setAction(RoleActions_1.default.paoqiangleft);
  3746. this.changtrailState(false);
  3747. break;
  3748. case RoleActions_1.default.right_climb:
  3749. this.jumpSpeed.x = 0;
  3750. this.jumpSpeed.y = this._roleVO.slideclimb.y;
  3751. this.jumpSpeed.z = this._roleVO.slideclimb.z;
  3752. this._isActionNums = false;
  3753. this.setAction(RoleActions_1.default.paoqiangright);
  3754. this.changtrailState(false);
  3755. break;
  3756. case RoleActions_1.default.playPalouAction:
  3757. this._isActionNums = true;
  3758. this._isneedactionnum = 0;
  3759. this._needactiontime = 0.3;
  3760. this._moveTime = 0;
  3761. this.setAction(RoleActions_1.default.climbend);
  3762. break;
  3763. }
  3764. }
  3765. },
  3766. enumerable: true,
  3767. configurable: true
  3768. });
  3769. MainRAoleScript.prototype.playspeedSound = function () {
  3770. SoundssManager_1.default.getInstance().playGameSound("speed");
  3771. };
  3772. MainRAoleScript.prototype.changtrailState = function (bo) {
  3773. if (this._lefttrail && this._righttrail && this._lefttrail.active != bo) {
  3774. this._lefttrail.active = bo;
  3775. this._righttrail.active = bo;
  3776. }
  3777. };
  3778. MainRAoleScript.prototype.update = function (dt) {
  3779. dt = 16;
  3780. if (this._iscanMove) {
  3781. var distime = dt / 1000;
  3782. this._moveTime += distime;
  3783. switch (this.nowState) {
  3784. case RoleActions_1.default.run: //跑动
  3785. this._moveVec.y = 0;
  3786. this._moveVec.z = distime * (this._speedMoveV3.z * this._beishuVec.z);
  3787. if (this._lockxstate == 0) {
  3788. this._moveVec.x = this._changeMoveX * distime;
  3789. }
  3790. else if (this._lockxstate == 1) {
  3791. if (this._changeMoveX < 0) {
  3792. this._moveVec.x = 0;
  3793. }
  3794. else {
  3795. this._moveVec.x = this._changeMoveX * distime;
  3796. }
  3797. }
  3798. else if (this._lockxstate == 2) {
  3799. if (this._changeMoveX > 0) {
  3800. this._moveVec.x = 0;
  3801. }
  3802. else {
  3803. this._moveVec.x = this._changeMoveX * distime;
  3804. }
  3805. }
  3806. this._transform.translate(this._moveVec, false);
  3807. break;
  3808. case RoleActions_1.default.Climb: //爬升
  3809. this._moveVec.z = 0;
  3810. this._moveVec.y = distime * this.jumpSpeed.y;
  3811. if (this._lockxstate == 1) {
  3812. if (this._changeMoveX < 0) {
  3813. this._moveVec.x = 0;
  3814. }
  3815. else {
  3816. this._moveVec.x = this._changeMoveX * distime;
  3817. }
  3818. }
  3819. else if (this._lockstate == 2) {
  3820. if (this._changeMoveX > 0) {
  3821. this._moveVec.x = 0;
  3822. }
  3823. else {
  3824. this._moveVec.x = this._changeMoveX * distime;
  3825. }
  3826. }
  3827. else {
  3828. this._moveVec.x = this._changeMoveX * distime;
  3829. }
  3830. this._transform.translate(this._moveVec, false);
  3831. if (this._shangpaVec) {
  3832. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  3833. this.nowState = RoleActions_1.default.playPalouAction;
  3834. }
  3835. }
  3836. else if (this._nowselectVec) {
  3837. if (this._transform.position.y + 1 > this._nowselectVec.y) {
  3838. this.nowState = RoleActions_1.default.playPalouAction;
  3839. }
  3840. }
  3841. break;
  3842. case RoleActions_1.default.lockclimb:
  3843. this._moveVec.z = 0;
  3844. this._moveVec.y = distime * this.jumpSpeed.y;
  3845. this._moveVec.x = 0;
  3846. this._transform.translate(this._moveVec, false);
  3847. if (this._shangpaVec) {
  3848. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  3849. this.nowState = RoleActions_1.default.playPalouAction;
  3850. }
  3851. }
  3852. else if (this._transform.position.y + 1 > this._nowselectVec.y) {
  3853. this.nowState = RoleActions_1.default.playPalouAction;
  3854. Debuger_1.default.log("爬墙动作结束播放");
  3855. }
  3856. break;
  3857. case RoleActions_1.default.jump: //跳跃
  3858. case RoleActions_1.default.left_jump:
  3859. case RoleActions_1.default.right_jump:
  3860. this._disy = this.jumpSpeed.y - this.g * distime;
  3861. this.jumpSpeed.y = this._disy;
  3862. this._moveVec.x = this.jumpSpeed.x * distime;
  3863. this._moveVec.y = this._disy * distime;
  3864. this._moveVec.z = this.jumpSpeed.z * distime;
  3865. this._transform.translate(this._moveVec, false);
  3866. break;
  3867. case RoleActions_1.default.jiasuJump:
  3868. this._disy = this.jumpSpeed.y - this.g * distime;
  3869. this.jumpSpeed.y = this._disy;
  3870. this._moveVec.x = this.jumpSpeed.x * distime;
  3871. this._moveVec.y = this._disy * distime;
  3872. this._moveVec.z = this.jumpSpeed.z * distime;
  3873. this._transform.translate(this._moveVec, false);
  3874. break;
  3875. case RoleActions_1.default.left_climb:
  3876. case RoleActions_1.default.right_climb:
  3877. this._moveVec.z = distime * this.jumpSpeed.y;
  3878. this._moveVec.y = this.jumpSpeed.y * distime;
  3879. this._moveVec.x = 0;
  3880. this._transform.translate(this._moveVec, false);
  3881. break;
  3882. case RoleActions_1.default.xshunyi:
  3883. this._moveVec.z = distime * this._speedMoveV3.z;
  3884. this._moveVec.x = this._speedMoveV3.x * distime;
  3885. this._transform.translate(this._moveVec, false);
  3886. if (this._moveTime > 0.1) {
  3887. this.nowState = RoleActions_1.default.run;
  3888. }
  3889. break;
  3890. case RoleActions_1.default.downSlide:
  3891. this._moveVec.y = this.jumpSpeed.x;
  3892. this._moveVec.x = this.jumpSpeed.y;
  3893. this._moveVec.z = this.jumpSpeed.z * distime;
  3894. this._transform.translate(this._moveVec, false);
  3895. break;
  3896. case RoleActions_1.default.slidejiasu:
  3897. this._moveVec.y = 0;
  3898. this._moveVec.x = 0;
  3899. this._moveVec.z = this.jumpSpeed.z * distime;
  3900. this._transform.translate(this._moveVec, false);
  3901. if (this._jiasubuffTime <= 0 && this._lastState == RoleActions_1.default.left_climb || this._lastState == RoleActions_1.default.right_climb) {
  3902. this.nowState = this._lastState;
  3903. }
  3904. else {
  3905. this.nowState = RoleActions_1.default.jump;
  3906. // this.setJump( this.nowState );
  3907. }
  3908. break;
  3909. case RoleActions_1.default.surmount:
  3910. this._disy = this.jumpSpeed.y - this.g * distime;
  3911. this.jumpSpeed.y = this._disy;
  3912. this._moveVec.x = this.jumpSpeed.x * distime;
  3913. this._moveVec.y = this._disy * distime;
  3914. this._moveVec.z = this.jumpSpeed.z * distime;
  3915. this._transform.translate(this._moveVec, false);
  3916. break;
  3917. case RoleActions_1.default.playPalouAction:
  3918. if (this._nowselectVec) {
  3919. if (this._transform.position.y < this._nowselectVec.y) {
  3920. this._moveVec.x = 0;
  3921. this._moveVec.y = (1 / 0.3) * distime;
  3922. this._moveVec.z = 0;
  3923. this._transform.translate(this._moveVec, false);
  3924. }
  3925. }
  3926. break;
  3927. }
  3928. if (this._nowselectVec && (this.nowState == RoleActions_1.default.run || this.nowState == RoleActions_1.default.downSlide) && !this._isColling) {
  3929. if (this._transform.position.z <= this._nowselectVec.z) {
  3930. if (this._changeMoveX > 0) {
  3931. this.nowState = RoleActions_1.default.right_jump;
  3932. }
  3933. else if (this._changeMoveX < 0) {
  3934. this.nowState = RoleActions_1.default.left_jump;
  3935. }
  3936. else {
  3937. this.nowState = RoleActions_1.default.jump;
  3938. }
  3939. }
  3940. }
  3941. if (this._transform.position.y < Scene3dObject_1.default.diePosY) //角色死亡
  3942. {
  3943. if (this._nowscenename == "" || this._nowbuildname == "") {
  3944. this._transform.position = this._initPosVec.clone();
  3945. }
  3946. else {
  3947. this._transform.position = Scene3dObject_1.default.getPosVecbyScene(this._nowscenename, this._nowbuildname).clone();
  3948. }
  3949. this.nowState = RoleActions_1.default.run;
  3950. }
  3951. if (this._transform.position.z < Scene3dObject_1.default.gamewinPosZ) {
  3952. this.wingame();
  3953. }
  3954. else {
  3955. Scene3dObject_1.default.pro_jindu.value = this._transform.position.z / Scene3dObject_1.default.gamewinPosZ * 100;
  3956. }
  3957. if (this._isActionNums) {
  3958. if (this._isneedactionnum > 0) {
  3959. if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) {
  3960. switch (this._nowActionName) {
  3961. case RoleActions_1.default.jump:
  3962. case RoleActions_1.default.leftjump:
  3963. case RoleActions_1.default.rightjump:
  3964. case RoleActions_1.default.datiao1:
  3965. case RoleActions_1.default.datiao2:
  3966. case RoleActions_1.default.kualan:
  3967. this._isActionNums = false;
  3968. this.setAction(RoleActions_1.default.kongzhong);
  3969. break;
  3970. case RoleActions_1.default.huachan:
  3971. case RoleActions_1.default.climbend:
  3972. this._isActionNums = false;
  3973. this.setAction(RoleActions_1.default.run);
  3974. this.nowState = RoleActions_1.default.run;
  3975. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  3976. break;
  3977. case RoleActions_1.default.luodi1:
  3978. case RoleActions_1.default.luodi2:
  3979. this._isActionNums = false;
  3980. this.setAction(RoleActions_1.default.run);
  3981. break;
  3982. case RoleActions_1.default.huachan:
  3983. this.nowState = RoleActions_1.default.run;
  3984. break;
  3985. }
  3986. }
  3987. }
  3988. else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) {
  3989. switch (this._nowActionName) {
  3990. case RoleActions_1.default.jump:
  3991. case RoleActions_1.default.leftjump:
  3992. case RoleActions_1.default.rightjump:
  3993. case RoleActions_1.default.datiao1:
  3994. case RoleActions_1.default.datiao2:
  3995. this._isActionNums = false;
  3996. this.setAction(RoleActions_1.default.kongzhong);
  3997. this._changeMoveX = 0;
  3998. break;
  3999. case RoleActions_1.default.kualan:
  4000. this._isActionNums = false;
  4001. this.setAction(RoleActions_1.default.kongzhong);
  4002. break;
  4003. case RoleActions_1.default.huachan:
  4004. case RoleActions_1.default.climbend:
  4005. this._isActionNums = false;
  4006. this.setAction(RoleActions_1.default.run);
  4007. this.nowState = RoleActions_1.default.run;
  4008. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  4009. break;
  4010. }
  4011. }
  4012. }
  4013. if (this._jiasubuffTime > 0) {
  4014. this._jiasubuffTime -= distime;
  4015. Scene3dObject_1.default.getInstance().jiadulizi("jiasulizi", this._transform.position);
  4016. if (this._isShuangbeijiasu) {
  4017. Scene3dObject_1.default.getInstance().jiadulizi1("jiasulizi", this._transform.position);
  4018. }
  4019. }
  4020. else {
  4021. this._beishuVec.x = 1;
  4022. this._beishuVec.y = 1;
  4023. this._beishuVec.z = 1;
  4024. this._isShuangbeijiasu = false;
  4025. Scene3dObject_1.default.getInstance().closeJiasulizi();
  4026. Scene3dObject_1.default.getInstance().closeJiasulizi1();
  4027. }
  4028. if (this.iscanzhendong) {
  4029. this.zhendongtime += distime;
  4030. if (this.zhendongtime >= 0.5) {
  4031. this.zhendongtime = 0;
  4032. WXGamePlatform_1.default.getInstance().vibrateShort();
  4033. }
  4034. }
  4035. }
  4036. else {
  4037. if (this._ending) {
  4038. var distime = dt / 1000;
  4039. this._moveTime += distime;
  4040. if (this._moveTime >= this._endanmotime) {
  4041. this.endGame();
  4042. }
  4043. else {
  4044. this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime;
  4045. this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime;
  4046. this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime;
  4047. Scene3dObject_1.default.carma.getComponent(CamerasScript_1.default).MyRotateAround(this._transform.position, this._endAnmoSpeed1);
  4048. }
  4049. }
  4050. }
  4051. };
  4052. MainRAoleScript.prototype.endGame = function () {
  4053. this._ending = false;
  4054. TimerService_1.default.instance.removeUpdateTarget(this);
  4055. };
  4056. MainRAoleScript.prototype.wingame = function () {
  4057. SoundssManager_1.default.getInstance().playGameSound("complete");
  4058. EventUtils_1.EventUtils.dispatchEvent(GameEvent_1.default.endGame);
  4059. var carmaTrans = Scene3dObject_1.default.carma.transform;
  4060. this._endAnmoSpeed.z = (this._transform.position.z - 2 - carmaTrans.position.z) / this._endanmotime;
  4061. this._endAnmoSpeed.y = (this._transform.position.y - carmaTrans.position.y) / this._endanmotime;
  4062. this._endAnmoSpeed.x = (this._transform.position.x + 3 - carmaTrans.position.x) / this._endanmotime;
  4063. this._moveTime = 0;
  4064. this._iscanMove = false;
  4065. this._ending = true;
  4066. this.setAction(RoleActions_1.default.kongzhong);
  4067. Scene3dObject_1.default.getInstance().liziendgame("yanhua", this._transform.position, GameStateManager_1.default.getInstance().endGamePlayerArr.length == 0 ? true : false);
  4068. };
  4069. MainRAoleScript.prototype.joyStickCHange = function (value, value1, angle) {
  4070. if (this.nowState == RoleActions_1.default.run) {
  4071. this._changeMoveX = value;
  4072. }
  4073. else if (this.nowState == RoleActions_1.default.Climb || RoleActions_1.default.left_climb || RoleActions_1.default.right_climb) {
  4074. this._changeMoveX = value1;
  4075. }
  4076. if (this.nowState == RoleActions_1.default.left_climb && this._changeMoveX > 0) //强制跳跃
  4077. {
  4078. this.isforceJump = true;
  4079. this.nowState = RoleActions_1.default.right_jump;
  4080. }
  4081. else if (this.nowState == RoleActions_1.default.right_climb && this._changeMoveX < 0) {
  4082. this.isforceJump = true;
  4083. this.nowState = RoleActions_1.default.left_jump;
  4084. }
  4085. if (this.nowState == RoleActions_1.default.jump ||
  4086. this.nowState == RoleActions_1.default.left_jump ||
  4087. this.nowState == RoleActions_1.default.right_jump ||
  4088. this.nowState == RoleActions_1.default.jiasuJump) {
  4089. angle = -angle * Math.PI / 180;
  4090. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion);
  4091. var jumpz = this.jumpSpeed.z;
  4092. Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed);
  4093. this.jumpSpeed.z = jumpz;
  4094. }
  4095. };
  4096. MainRAoleScript.prototype.xshunyi = function (state) {
  4097. if (this.nowState == RoleActions_1.default.run) {
  4098. this._moveTime = 0;
  4099. this._speedMoveV3.x = state * 20;
  4100. this.nowState = RoleActions_1.default.xshunyi;
  4101. }
  4102. };
  4103. MainRAoleScript.prototype.setAction = function (actionName) {
  4104. this._nowActionName = actionName;
  4105. if (this._animator) {
  4106. if (this._nowActionName == RoleActions_1.default.climbend || this._nowActionName == RoleActions_1.default.luodi1 || this._nowActionName == RoleActions_1.default.luodi2) {
  4107. this._animator.speed = 1.5;
  4108. }
  4109. else {
  4110. this._animator.speed = 1;
  4111. }
  4112. this._animator.play(actionName, 0, 0);
  4113. }
  4114. // if( actionName == RoleActions.stand )
  4115. // {
  4116. // this._animator.play(actionName);
  4117. // }
  4118. // else
  4119. // {
  4120. // // this._animator.crossFade(actionName, 0.02, 0);
  4121. // this._animator.play(actionName);
  4122. // }
  4123. };
  4124. MainRAoleScript.prototype.ceshitiaoyue = function () {
  4125. this.nowState = RoleActions_1.default.jump;
  4126. };
  4127. MainRAoleScript.prototype.onUpdate = function () {
  4128. };
  4129. MainRAoleScript.prototype.onLateUpdate = function () {
  4130. };
  4131. MainRAoleScript.prototype.dispose = function () {
  4132. TimerService_1.default.instance.removeUpdateTarget(this);
  4133. };
  4134. MainRAoleScript.prototype.destroy = function () {
  4135. TimerService_1.default.instance.removeUpdateTarget(this);
  4136. _super.prototype.destroy.call(this);
  4137. };
  4138. return MainRAoleScript;
  4139. }(Laya.Script3D));
  4140. exports.default = MainRAoleScript;
  4141. },{"../../configs/dataConfigs/BuildCFG":5,"../../frameworks/Debuger":12,"../../frameworks/TimerService":13,"../../frameworks/events/EventUtils":16,"../../frameworks/mvc/MVCObjectPool":22,"../../managers/SoundssManager":65,"../../platform/wxminigame/WXGamePlatform":72,"../../utils/GameUtils":87,"../main/GameStateManager":38,"../scene3ds/RoleActions":46,"../scene3ds/Scene3dObject":48,"../userinfo/UserInfoProxy":53,"../userinfo/events/GameEvent":54,"./CamerasScript":42}],44:[function(require,module,exports){
  4142. "use strict";
  4143. Object.defineProperty(exports, "__esModule", { value: true });
  4144. var TimerService_1 = require("../../frameworks/TimerService");
  4145. var Scene3dObject_1 = require("../scene3ds/Scene3dObject");
  4146. var RoleActions_1 = require("../scene3ds/RoleActions");
  4147. var BuildCFG_1 = require("../../configs/dataConfigs/BuildCFG");
  4148. var CamerasScript_1 = require("./CamerasScript");
  4149. var EventUtils_1 = require("../../frameworks/events/EventUtils");
  4150. var GameEvent_1 = require("../userinfo/events/GameEvent");
  4151. var GameUtils_1 = require("../../utils/GameUtils");
  4152. var NpcScript = /** @class */ (function (_super) {
  4153. __extends(NpcScript, _super);
  4154. function NpcScript() {
  4155. var _this = _super.call(this) || this;
  4156. /**
  4157. * RoleAction
  4158. */
  4159. _this._nowState = "";
  4160. _this.resouseName = "";
  4161. _this._shangpaVec = new Laya.Vector3;
  4162. /**
  4163. * 状态,0:等待状态,1:开始状态,2:完成状态
  4164. */
  4165. _this._nowRoleState = 0;
  4166. _this.movespeed = 0;
  4167. _this.frontjump = new Laya.Vector3;
  4168. _this.leftjump = new Laya.Vector3;
  4169. _this.rightjump = new Laya.Vector3;
  4170. _this.upclimb = 0;
  4171. _this.slideclimb = new Laya.Vector3;
  4172. _this._isColling = false;
  4173. _this._nowCollTargetName = "";
  4174. _this._normalizeVec = new Laya.Vector3;
  4175. _this._nowbuildname = "";
  4176. _this._nowscenename = "";
  4177. /**
  4178. * 0:未锁,1:锁左边,2:锁右边
  4179. */
  4180. _this._lockxstate = 0;
  4181. _this._lockbyBuildname = "";
  4182. /**
  4183. * 0:未被锁,1:锁定左边,2:锁定右边,
  4184. */
  4185. _this._lockstate = 0;
  4186. _this._lastState = "";
  4187. _this._moveTime = 0;
  4188. _this._chixuTime = 0;
  4189. _this._isActionNums = false;
  4190. _this._isneedactionnum = 0;
  4191. _this._needactiontime = 0;
  4192. _this._moveVec = new Laya.Vector3;
  4193. _this.isPengzhuang = false;
  4194. _this.jumpSpeed = new Laya.Vector3;
  4195. _this.jumpHight = 0;
  4196. _this._disy = 0;
  4197. _this.g = 10; //重力加速度
  4198. _this._checktime = 0;
  4199. _this._ending = false;
  4200. _this._endAnmoSpeed = new Laya.Vector3();
  4201. _this._endanmotime = 1;
  4202. _this._endAnmoSpeed1 = new Laya.Vector3;
  4203. _this._changeMoveX = 0;
  4204. _this.isforceJump = false;
  4205. _this.quaternion = new Laya.Quaternion;
  4206. return _this;
  4207. }
  4208. NpcScript.prototype.onAwake = function () {
  4209. this._animator = this.owner.getComponent(Laya.Animator);
  4210. Scene3dObject_1.default.setAnimator(this._animator);
  4211. };
  4212. NpcScript.prototype.onStart = function () {
  4213. this._speedMoveV3 = new Laya.Vector3(0, 0, 0);
  4214. this._transform = this.owner.transform;
  4215. var sp = this.owner;
  4216. sp.getChildByName("lefttrail").active = false;
  4217. sp.getChildByName("righttrail").active = false;
  4218. };
  4219. NpcScript.prototype.startRun = function () {
  4220. this._checktime = 500;
  4221. this._nowRoleState = 1;
  4222. this._ending = false;
  4223. this._changeMoveX = 0;
  4224. this._initPosVec = this._transform.position.clone();
  4225. this._nowbuildname = "";
  4226. this._nowscenename = "";
  4227. this._nowState = RoleActions_1.default.stand;
  4228. this.nowState = RoleActions_1.default.run;
  4229. this._speedMoveV3.x = 0;
  4230. this._speedMoveV3.y = 0;
  4231. this._speedMoveV3.z = -this.movespeed;
  4232. this._iscanMove = true;
  4233. TimerService_1.default.instance.addUpdateTarget(this);
  4234. };
  4235. NpcScript.prototype.setnpcCFG = function (cfg) {
  4236. this._nowNpcCfg = cfg;
  4237. this.movespeed = this._nowNpcCfg.speed;
  4238. this.frontjump.x = Number(this._nowNpcCfg.frontjump.x);
  4239. this.frontjump.y = Number(this._nowNpcCfg.frontjump.y);
  4240. this.frontjump.z = Number(this._nowNpcCfg.frontjump.z);
  4241. this.leftjump.x = Number(this._nowNpcCfg.leftjump.x);
  4242. this.leftjump.y = Number(this._nowNpcCfg.leftjump.y);
  4243. this.leftjump.z = Number(this._nowNpcCfg.leftjump.z);
  4244. this.rightjump.x = Number(this._nowNpcCfg.rightjump.x);
  4245. this.rightjump.y = Number(this._nowNpcCfg.rightjump.y);
  4246. this.rightjump.z = Number(this._nowNpcCfg.rightjump.z);
  4247. this.upclimb = Number(this._nowNpcCfg.upclimb);
  4248. this.slideclimb.x = Number(this._nowNpcCfg.slideclimb.x);
  4249. this.slideclimb.y = Number(this._nowNpcCfg.slideclimb.y);
  4250. this.slideclimb.z = Number(this._nowNpcCfg.slideclimb.z);
  4251. };
  4252. /**
  4253. * 开始碰撞时执行
  4254. */
  4255. NpcScript.prototype.onCollisionEnter = function (collision) {
  4256. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  4257. var contactPoint = collision.contacts[0];
  4258. this.jisuanCollision(contactPoint.normal, collision.other.owner);
  4259. }
  4260. };
  4261. NpcScript.prototype.setnowSelectVec = function (pos) {
  4262. this._nowselectVec = pos;
  4263. };
  4264. NpcScript.prototype.jisuanCollision = function (normal, target) {
  4265. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) {
  4266. return;
  4267. }
  4268. this._nowCollTargetName = target.name;
  4269. var n = new Laya.Vector3;
  4270. Laya.Vector3.normalize(normal, this._normalizeVec);
  4271. if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 ||
  4272. this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  4273. {
  4274. if (this._nowCollTargetName.indexOf("build") != -1) {
  4275. this._nowbuildname = this._nowCollTargetName;
  4276. this._nowscenename = target.parent.parent.name;
  4277. }
  4278. if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  4279. this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  4280. }
  4281. else {
  4282. this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName);
  4283. }
  4284. if (this._normalizeVec.z == -1) //上爬
  4285. {
  4286. if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.1)) {
  4287. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  4288. this.nowState = RoleActions_1.default.run;
  4289. }
  4290. else {
  4291. this.nowState = RoleActions_1.default.Climb;
  4292. this._shangpaVec = this._nowselectVec.clone();
  4293. }
  4294. }
  4295. else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) {
  4296. this.nowState = RoleActions_1.default.run;
  4297. }
  4298. else if (this._normalizeVec.x == -1) {
  4299. if (this.nowState == RoleActions_1.default.run) {
  4300. this._lockxstate = 1;
  4301. }
  4302. else if (this.nowState == RoleActions_1.default.Climb) {
  4303. this._lockxstate = 1;
  4304. }
  4305. else {
  4306. this.nowState = RoleActions_1.default.left_climb;
  4307. }
  4308. }
  4309. else if (this._normalizeVec.x == 1) {
  4310. if (this.nowState == RoleActions_1.default.run) {
  4311. this._lockxstate = 2;
  4312. }
  4313. else if (this.nowState == RoleActions_1.default.Climb) {
  4314. this._lockxstate = 2;
  4315. }
  4316. else {
  4317. this.nowState = RoleActions_1.default.right_climb;
  4318. }
  4319. }
  4320. else {
  4321. if (this._normalizeVec.z != 1) {
  4322. this.nowState = RoleActions_1.default.lockclimb;
  4323. this._shangpaVec = this._nowselectVec.clone();
  4324. }
  4325. }
  4326. }
  4327. else if (this._nowCollTargetName.indexOf("panel_jump") != -1) //加速板跳跃
  4328. {
  4329. this.nowState = RoleActions_1.default.jiasuJump;
  4330. // this.setJump( this.nowState );
  4331. }
  4332. else if (this._nowCollTargetName.indexOf("panel_downslip") != -1) {
  4333. this.nowState = RoleActions_1.default.downSlide;
  4334. // this.setJump( this.nowState );
  4335. }
  4336. else if (this._nowCollTargetName.indexOf("box_Board") != -1 && this.nowState != RoleActions_1.default.downSlide) {
  4337. if (this._normalizeVec.z == -1) //上爬
  4338. {
  4339. this.nowState = RoleActions_1.default.Climb;
  4340. this._shangpaVec = this._nowselectVec.clone();
  4341. }
  4342. }
  4343. else if (this._nowCollTargetName.indexOf("box_sidejump") != -1) {
  4344. this.nowState = RoleActions_1.default.slidejiasu;
  4345. // this.setJump( this.nowState );
  4346. }
  4347. else if (this._nowCollTargetName.indexOf("box_Surmount") != -1) {
  4348. this.nowState = RoleActions_1.default.surmount;
  4349. // this.setJump( this.nowState );
  4350. }
  4351. else if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  4352. this.nowState = RoleActions_1.default.Climb;
  4353. this._shangpaVec = this._nowselectVec.clone();
  4354. }
  4355. };
  4356. /**
  4357. * 持续碰撞时执行
  4358. */
  4359. NpcScript.prototype.onCollisionStay = function (collision) {
  4360. // Debuger.log( "碰撞中" );
  4361. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  4362. this._isColling = true;
  4363. var contactPoint = collision.contacts[0];
  4364. var target = collision.other.owner;
  4365. var targetname = target.name;
  4366. if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1 && targetname.indexOf("role") == -1) {
  4367. this._nowCollTargetName = targetname;
  4368. }
  4369. if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 ||
  4370. this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  4371. {
  4372. if (this._nowCollTargetName.indexOf("build") != -1) {
  4373. this._nowbuildname = this._nowCollTargetName;
  4374. this._nowscenename = target.parent.parent.name;
  4375. }
  4376. if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  4377. this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  4378. }
  4379. else {
  4380. this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName);
  4381. }
  4382. }
  4383. }
  4384. };
  4385. /**
  4386. * 结束碰撞时执行
  4387. */
  4388. NpcScript.prototype.onCollisionExit = function (collision) {
  4389. this._isColling = false;
  4390. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  4391. var contactPoint = collision.contacts[0];
  4392. this.checkendColl(contactPoint.normal, collision.other.owner);
  4393. }
  4394. };
  4395. NpcScript.prototype.checkendColl = function (normal, target) {
  4396. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) {
  4397. return;
  4398. }
  4399. if (this.isforceJump) {
  4400. this.isforceJump = false;
  4401. return;
  4402. }
  4403. if (this._lockxstate) {
  4404. this._lockxstate = 0;
  4405. return;
  4406. }
  4407. if (this._nowCollTargetName != target.name) {
  4408. return;
  4409. }
  4410. if (target.name.indexOf("panel_jump") != -1) {
  4411. return;
  4412. }
  4413. switch (this.nowState) {
  4414. case RoleActions_1.default.Climb:
  4415. case RoleActions_1.default.lockclimb:
  4416. if (this._nowCollTargetName.indexOf("box_Board") != -1) {
  4417. this.setJumpState(this._changeMoveX);
  4418. }
  4419. else {
  4420. // var istoTop:boolean = Scene3dObject.checkisClimbTop( target.parent.parent.name,target.name,this._transform.position );
  4421. // if( istoTop )
  4422. // {
  4423. // Debuger.log( "播放爬楼完成动作" );
  4424. // this.nowState = RoleActions.playPalouAction;
  4425. // this.playAnmo("");
  4426. // }
  4427. // else
  4428. // {
  4429. // if( this._changeMoveX > 0 )
  4430. // {
  4431. // this.nowState = RoleActions.right_jump;
  4432. // // this.setJump( this.nowState );
  4433. // }
  4434. // else if( this._changeMoveX < 0 )
  4435. // {
  4436. // this.nowState = RoleActions.left_jump;
  4437. // // this.setJump( this.nowState );
  4438. // }
  4439. // }
  4440. if (this._changeMoveX > 0) {
  4441. this.nowState = RoleActions_1.default.right_jump;
  4442. // this.setJump( this.nowState );
  4443. }
  4444. else if (this._changeMoveX < 0) {
  4445. this.nowState = RoleActions_1.default.left_jump;
  4446. // this.setJump( this.nowState );
  4447. }
  4448. }
  4449. break;
  4450. case RoleActions_1.default.right_climb:
  4451. case RoleActions_1.default.left_climb:
  4452. this.setJumpState(this._changeMoveX);
  4453. break;
  4454. case RoleActions_1.default.run:
  4455. this.setJumpState(this._changeMoveX);
  4456. break;
  4457. case RoleActions_1.default.xshunyi:
  4458. this.setJumpState(this._speedMoveV3.x);
  4459. break;
  4460. }
  4461. };
  4462. NpcScript.prototype.setJumpState = function (value, isquanzhong) {
  4463. if (isquanzhong === void 0) { isquanzhong = false; }
  4464. if (value > 0) {
  4465. this.nowState = RoleActions_1.default.right_jump;
  4466. }
  4467. else if (value < 0) {
  4468. this.nowState = RoleActions_1.default.left_jump;
  4469. }
  4470. else {
  4471. if (isquanzhong) {
  4472. if (this._nowCollTargetName.indexOf("build") != -1) {
  4473. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  4474. var allvalue = 0;
  4475. var sort;
  4476. var selectdir = "";
  4477. if (this._nowCollTargetName.indexOf("leftright") != -1) {
  4478. allvalue = this._nowNpcCfg.jump_left + this._nowNpcCfg.jump_right;
  4479. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  4480. if (sort <= this._nowNpcCfg.jump_left) {
  4481. selectdir = "left";
  4482. }
  4483. else {
  4484. selectdir = "right";
  4485. }
  4486. }
  4487. else if (this._nowCollTargetName.indexOf("frontright") != -1) {
  4488. allvalue = this._nowNpcCfg.start_ahead + this._nowNpcCfg.jump_right;
  4489. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  4490. if (sort <= this._nowNpcCfg.start_ahead) {
  4491. selectdir = "front";
  4492. }
  4493. else {
  4494. selectdir = "right";
  4495. }
  4496. }
  4497. else if (this._nowCollTargetName.indexOf("frontleft") != -1) {
  4498. allvalue = this._nowNpcCfg.start_ahead + this._nowNpcCfg.jump_left;
  4499. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  4500. if (sort <= this._nowNpcCfg.start_ahead) {
  4501. selectdir = "front";
  4502. }
  4503. else {
  4504. selectdir = "left";
  4505. }
  4506. }
  4507. else if (this._nowCollTargetName.indexOf("right") != -1) {
  4508. selectdir = "right";
  4509. }
  4510. else if (this._nowCollTargetName.indexOf("left") != -1) {
  4511. selectdir = "left";
  4512. }
  4513. else if (this._nowCollTargetName.indexOf("front") != -1) {
  4514. selectdir = "front";
  4515. }
  4516. else {
  4517. allvalue = this._nowNpcCfg.start_ahead + this._nowNpcCfg.jump_left + this._nowNpcCfg.jump_right;
  4518. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  4519. if (sort <= this._nowNpcCfg.start_ahead) {
  4520. selectdir = "front";
  4521. }
  4522. else if (sort <= this._nowNpcCfg.start_ahead + this._nowNpcCfg.jump_left) {
  4523. selectdir = "left";
  4524. }
  4525. else {
  4526. selectdir = "right";
  4527. }
  4528. }
  4529. switch (selectdir) {
  4530. case "left":
  4531. this.nowState = RoleActions_1.default.left_jump;
  4532. break;
  4533. case "right":
  4534. this.nowState = RoleActions_1.default.right_jump;
  4535. break;
  4536. case "front":
  4537. this.nowState = RoleActions_1.default.jump;
  4538. break;
  4539. default:
  4540. this.nowState = RoleActions_1.default.jump;
  4541. break;
  4542. }
  4543. }
  4544. else {
  4545. this.nowState = RoleActions_1.default.jump;
  4546. }
  4547. }
  4548. else {
  4549. this.nowState = RoleActions_1.default.jump;
  4550. }
  4551. }
  4552. };
  4553. NpcScript.prototype.playAnmo = function (actinName) {
  4554. this._isActionNums = true;
  4555. this._isneedactionnum = 1;
  4556. this.setAction(RoleActions_1.default.climbend);
  4557. };
  4558. NpcScript.prototype.actionCompelte = function () {
  4559. this.nowState = RoleActions_1.default.run;
  4560. };
  4561. Object.defineProperty(NpcScript.prototype, "nowState", {
  4562. get: function () {
  4563. return this._nowState;
  4564. },
  4565. set: function (value) {
  4566. if (this._nowRoleState == 1) {
  4567. if (this._nowState != value || this._lastState == RoleActions_1.default.jiasuJump || this._lastState == RoleActions_1.default.right_jump) {
  4568. this._lastState = this._nowState;
  4569. this._nowState = value;
  4570. this._moveTime = 0;
  4571. switch (this._nowState) {
  4572. case RoleActions_1.default.stand:
  4573. this._isActionNums = false;
  4574. this.setAction(RoleActions_1.default.stand);
  4575. break;
  4576. case RoleActions_1.default.run:
  4577. if (this._lastState == RoleActions_1.default.jump || this._lastState == RoleActions_1.default.left_jump || this._lastState == RoleActions_1.default.right_jump) {
  4578. this._isActionNums = true;
  4579. this._isneedactionnum = 1;
  4580. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  4581. if (sort < 50) {
  4582. this.setAction(RoleActions_1.default.luodi1);
  4583. }
  4584. else {
  4585. this.setAction(RoleActions_1.default.luodi2);
  4586. }
  4587. }
  4588. else {
  4589. this._isActionNums = false;
  4590. this.setAction(RoleActions_1.default.run);
  4591. }
  4592. break;
  4593. case RoleActions_1.default.jump:
  4594. this.setAction(RoleActions_1.default.jump);
  4595. this._isActionNums = true;
  4596. this._isneedactionnum = 1;
  4597. this.jumpSpeed.x = this.frontjump.x;
  4598. this.jumpSpeed.y = this.frontjump.y;
  4599. this.jumpSpeed.z = this.frontjump.z;
  4600. break;
  4601. case RoleActions_1.default.left_jump:
  4602. this.jumpSpeed.x = this.leftjump.x;
  4603. this.jumpSpeed.y = this.leftjump.y;
  4604. this.jumpSpeed.z = this.leftjump.z;
  4605. this._isActionNums = true;
  4606. this._isneedactionnum = 1;
  4607. this.setAction(RoleActions_1.default.leftjump);
  4608. break;
  4609. case RoleActions_1.default.right_jump:
  4610. this.jumpSpeed.x = this.rightjump.x;
  4611. this.jumpSpeed.y = this.rightjump.y;
  4612. this.jumpSpeed.z = this.rightjump.z;
  4613. this._isActionNums = true;
  4614. this._isneedactionnum = 1;
  4615. this.setAction(RoleActions_1.default.rightjump);
  4616. break;
  4617. case RoleActions_1.default.jiasuJump:
  4618. var buildcfg = BuildCFG_1.default.dict["panel_jump"];
  4619. this.jumpSpeed.x = buildcfg.buffx;
  4620. this.jumpSpeed.y = buildcfg.buffy;
  4621. if (this._lastState == RoleActions_1.default.jiasuJump) {
  4622. this.jumpSpeed.z = this.jumpSpeed.z * buildcfg.buffz;
  4623. }
  4624. else {
  4625. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
  4626. }
  4627. this._isActionNums = true;
  4628. this._isneedactionnum = 1;
  4629. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  4630. if (sort < 50) {
  4631. this.setAction(RoleActions_1.default.datiao1);
  4632. }
  4633. else {
  4634. this.setAction(RoleActions_1.default.datiao2);
  4635. }
  4636. break;
  4637. case RoleActions_1.default.downSlide:
  4638. var buildcfg = BuildCFG_1.default.dict["panel_downslip"];
  4639. this.jumpSpeed.x = buildcfg.buffx;
  4640. this.jumpSpeed.y = buildcfg.buffy;
  4641. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
  4642. this._chixuTime = buildcfg.time;
  4643. this._isActionNums = true;
  4644. this._isneedactionnum = 1;
  4645. this.setAction(RoleActions_1.default.huachan);
  4646. break;
  4647. // case RoleActions.slidejiasu:
  4648. // var buildcfg:BuildCFG = BuildCFG.dict[ "box_sidejump" ];
  4649. // this.jumpSpeed.x = buildcfg.buffx;
  4650. // this.jumpSpeed.y = buildcfg.buffy;
  4651. // this.jumpSpeed.z = this._speedMoveV3.z*buildcfg.buffz;
  4652. // this._chixuTime = buildcfg.time;
  4653. // this._isActionNums = false;
  4654. // // this.setAction( RoleActions. );
  4655. // break;
  4656. case RoleActions_1.default.surmount:
  4657. var buildcfg = BuildCFG_1.default.dict["box_Surmount"];
  4658. this.jumpSpeed.x = buildcfg.buffx;
  4659. this.jumpSpeed.y = buildcfg.buffy + 0.5;
  4660. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
  4661. this._chixuTime = buildcfg.time;
  4662. this._isActionNums = true;
  4663. this._isneedactionnum = 1;
  4664. this.setAction(RoleActions_1.default.kualan);
  4665. break;
  4666. case RoleActions_1.default.Climb:
  4667. case RoleActions_1.default.lockclimb:
  4668. this.jumpSpeed.x = 0;
  4669. this.jumpSpeed.y = this.upclimb;
  4670. this.jumpSpeed.z = 0;
  4671. this._isActionNums = false;
  4672. this.setAction(RoleActions_1.default.paqiang);
  4673. break;
  4674. case RoleActions_1.default.left_climb:
  4675. this.jumpSpeed.x = 0;
  4676. this.jumpSpeed.y = this.slideclimb.y;
  4677. this.jumpSpeed.z = this.slideclimb.z;
  4678. this._isActionNums = false;
  4679. this.setAction(RoleActions_1.default.paoqiangleft);
  4680. break;
  4681. case RoleActions_1.default.right_climb:
  4682. this.jumpSpeed.x = 0;
  4683. this.jumpSpeed.y = this.slideclimb.y;
  4684. this.jumpSpeed.z = this.slideclimb.z;
  4685. this._isActionNums = false;
  4686. this.setAction(RoleActions_1.default.paoqiangright);
  4687. break;
  4688. case RoleActions_1.default.playPalouAction:
  4689. this._isActionNums = true;
  4690. this._isneedactionnum = 0;
  4691. this._needactiontime = 0.3;
  4692. this._moveTime = 0;
  4693. this.setAction(RoleActions_1.default.climbend);
  4694. break;
  4695. }
  4696. }
  4697. }
  4698. },
  4699. enumerable: true,
  4700. configurable: true
  4701. });
  4702. NpcScript.prototype.update = function (dt) {
  4703. if (this._nowRoleState == 1) {
  4704. dt = 16;
  4705. this._checktime += dt;
  4706. if (Scene3dObject_1.default.iscarmanpc) {
  4707. }
  4708. else {
  4709. if (this._checktime >= 500) {
  4710. this._checktime = 0;
  4711. if (this._nowNpcCfg && Scene3dObject_1.default.mainRole) {
  4712. if (this._transform.position.z + this._nowNpcCfg.distance < Scene3dObject_1.default.mainRole.transform.position.z) {
  4713. this._iscanMove = false;
  4714. }
  4715. else {
  4716. this._iscanMove = true;
  4717. }
  4718. }
  4719. }
  4720. }
  4721. if (this._iscanMove) {
  4722. var distime = dt / 1000;
  4723. this._moveTime += distime;
  4724. switch (this.nowState) {
  4725. case RoleActions_1.default.run: //跑动
  4726. this._moveVec.y = 0;
  4727. this._moveVec.z = distime * this._speedMoveV3.z;
  4728. if (this._lockxstate == 0) {
  4729. this._moveVec.x = this._changeMoveX * distime;
  4730. }
  4731. else if (this._lockxstate == 1) {
  4732. if (this._changeMoveX < 0) {
  4733. this._moveVec.x = 0;
  4734. }
  4735. else {
  4736. this._moveVec.x = this._changeMoveX * distime;
  4737. }
  4738. }
  4739. else if (this._lockxstate == 2) {
  4740. if (this._changeMoveX > 0) {
  4741. this._moveVec.x = 0;
  4742. }
  4743. else {
  4744. this._moveVec.x = this._changeMoveX * distime;
  4745. }
  4746. }
  4747. this._transform.translate(this._moveVec, false);
  4748. break;
  4749. case RoleActions_1.default.Climb: //爬升
  4750. this._moveVec.z = 0;
  4751. this._moveVec.y = distime * this.jumpSpeed.y;
  4752. if (this._lockxstate == 1) {
  4753. if (this._changeMoveX < 0) {
  4754. this._moveVec.x = 0;
  4755. }
  4756. else {
  4757. this._moveVec.x = this._changeMoveX * distime;
  4758. }
  4759. }
  4760. else if (this._lockstate == 2) {
  4761. if (this._changeMoveX > 0) {
  4762. this._moveVec.x = 0;
  4763. }
  4764. else {
  4765. this._moveVec.x = this._changeMoveX * distime;
  4766. }
  4767. }
  4768. else {
  4769. this._moveVec.x = this._changeMoveX * distime;
  4770. }
  4771. this._transform.translate(this._moveVec, false);
  4772. if (this._shangpaVec) {
  4773. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  4774. this.nowState = RoleActions_1.default.playPalouAction;
  4775. }
  4776. }
  4777. else if (this._nowselectVec) {
  4778. if (this._transform.position.y + 1 > this._nowselectVec.y) {
  4779. this.nowState = RoleActions_1.default.playPalouAction;
  4780. }
  4781. }
  4782. break;
  4783. case RoleActions_1.default.lockclimb:
  4784. this._moveVec.z = 0;
  4785. this._moveVec.y = distime * this.jumpSpeed.y;
  4786. this._moveVec.x = 0;
  4787. this._transform.translate(this._moveVec, false);
  4788. if (this._shangpaVec) {
  4789. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  4790. this.nowState = RoleActions_1.default.playPalouAction;
  4791. }
  4792. }
  4793. else if (this._transform.position.y + 1 > this._nowselectVec.y) {
  4794. this.nowState = RoleActions_1.default.playPalouAction;
  4795. }
  4796. break;
  4797. case RoleActions_1.default.jump: //跳跃
  4798. case RoleActions_1.default.left_jump:
  4799. case RoleActions_1.default.right_jump:
  4800. this._disy = this.jumpSpeed.y - this.g * distime;
  4801. this.jumpSpeed.y = this._disy;
  4802. this._moveVec.x = this.jumpSpeed.x * distime;
  4803. this._moveVec.y = this._disy * distime;
  4804. this._moveVec.z = this.jumpSpeed.z * distime;
  4805. this._transform.translate(this._moveVec, false);
  4806. break;
  4807. case RoleActions_1.default.jiasuJump:
  4808. this._disy = this.jumpSpeed.y - this.g * distime;
  4809. this.jumpSpeed.y = this._disy;
  4810. this._moveVec.x = this.jumpSpeed.x * distime;
  4811. this._moveVec.y = this._disy * distime;
  4812. this._moveVec.z = this.jumpSpeed.z * distime;
  4813. this._transform.translate(this._moveVec, false);
  4814. break;
  4815. case RoleActions_1.default.left_climb:
  4816. case RoleActions_1.default.right_climb:
  4817. this._moveVec.z = distime * this.jumpSpeed.y;
  4818. this._moveVec.y = this.jumpSpeed.y * distime;
  4819. this._moveVec.x = 0;
  4820. this._transform.translate(this._moveVec, false);
  4821. break;
  4822. case RoleActions_1.default.xshunyi:
  4823. this._moveVec.z = distime * this._speedMoveV3.z;
  4824. this._moveVec.x = this._speedMoveV3.x * distime;
  4825. this._transform.translate(this._moveVec, false);
  4826. if (this._moveTime > 0.1) {
  4827. this.nowState = RoleActions_1.default.run;
  4828. }
  4829. break;
  4830. case RoleActions_1.default.downSlide:
  4831. this._moveVec.y = this.jumpSpeed.x;
  4832. this._moveVec.x = this.jumpSpeed.y;
  4833. this._moveVec.z = this.jumpSpeed.z * distime;
  4834. this._transform.translate(this._moveVec, false);
  4835. if (this._moveTime > this._chixuTime) {
  4836. this.nowState = RoleActions_1.default.run;
  4837. }
  4838. break;
  4839. case RoleActions_1.default.slidejiasu:
  4840. this._moveVec.y = 0;
  4841. this._moveVec.x = 0;
  4842. this._moveVec.z = this.jumpSpeed.z * distime;
  4843. this._transform.translate(this._moveVec, false);
  4844. if (this._moveTime > this._chixuTime && this._lastState == RoleActions_1.default.left_climb || this._lastState == RoleActions_1.default.right_climb) {
  4845. this.nowState = this._lastState;
  4846. }
  4847. else {
  4848. this.nowState = RoleActions_1.default.jump;
  4849. // this.setJump( this.nowState );
  4850. }
  4851. break;
  4852. case RoleActions_1.default.surmount:
  4853. this._disy = this.jumpSpeed.y - this.g * distime;
  4854. this.jumpSpeed.y = this._disy;
  4855. this._moveVec.x = this.jumpSpeed.x * distime;
  4856. this._moveVec.y = this._disy * distime;
  4857. this._moveVec.z = this.jumpSpeed.z * distime;
  4858. this._transform.translate(this._moveVec, false);
  4859. break;
  4860. case RoleActions_1.default.playPalouAction:
  4861. if (this._nowselectVec) {
  4862. if (this._transform.position.y < this._nowselectVec.y) {
  4863. this._moveVec.x = 0;
  4864. this._moveVec.y = (1 / 0.3) * distime;
  4865. this._moveVec.z = 0;
  4866. this._transform.translate(this._moveVec, false);
  4867. }
  4868. }
  4869. break;
  4870. }
  4871. if (this._nowselectVec && (this.nowState == RoleActions_1.default.run || this.nowState == RoleActions_1.default.downSlide) && !this._isColling) {
  4872. if (this._transform.position.z <= this._nowselectVec.z) {
  4873. if (this._changeMoveX > 0) {
  4874. this.nowState = RoleActions_1.default.right_jump;
  4875. }
  4876. else if (this._changeMoveX < 0) {
  4877. this.nowState = RoleActions_1.default.left_jump;
  4878. }
  4879. else {
  4880. this.nowState = RoleActions_1.default.jump;
  4881. }
  4882. }
  4883. }
  4884. if (this._transform.position.y < Scene3dObject_1.default.diePosY) //角色死亡
  4885. {
  4886. if (this._nowscenename == "" || this._nowbuildname == "") {
  4887. this._transform.position = this._initPosVec.clone();
  4888. }
  4889. else {
  4890. this._transform.position = Scene3dObject_1.default.getPosVecbyScene(this._nowscenename, this._nowbuildname).clone();
  4891. }
  4892. this.nowState = RoleActions_1.default.run;
  4893. }
  4894. if (this._transform.position.z < Scene3dObject_1.default.gamewinPosZ) {
  4895. this.wingame();
  4896. }
  4897. if (this._isActionNums) {
  4898. //如果当前播放state已经播放完了一次
  4899. if (this._isneedactionnum > 0) {
  4900. if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) {
  4901. switch (this._nowActionName) {
  4902. case RoleActions_1.default.jump:
  4903. case RoleActions_1.default.leftjump:
  4904. case RoleActions_1.default.rightjump:
  4905. case RoleActions_1.default.datiao1:
  4906. case RoleActions_1.default.datiao2:
  4907. case RoleActions_1.default.kualan:
  4908. this._isActionNums = false;
  4909. this.setAction(RoleActions_1.default.kongzhong);
  4910. break;
  4911. case RoleActions_1.default.huachan:
  4912. case RoleActions_1.default.climbend:
  4913. this._isActionNums = false;
  4914. this.setAction(RoleActions_1.default.run);
  4915. this.nowState = RoleActions_1.default.run;
  4916. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  4917. break;
  4918. case RoleActions_1.default.luodi1:
  4919. case RoleActions_1.default.luodi2:
  4920. this._isActionNums = false;
  4921. this.setAction(RoleActions_1.default.run);
  4922. break;
  4923. }
  4924. }
  4925. }
  4926. else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) {
  4927. switch (this._nowActionName) {
  4928. case RoleActions_1.default.jump:
  4929. case RoleActions_1.default.leftjump:
  4930. case RoleActions_1.default.rightjump:
  4931. case RoleActions_1.default.datiao1:
  4932. case RoleActions_1.default.datiao2:
  4933. case RoleActions_1.default.kualan:
  4934. this._isActionNums = false;
  4935. this.setAction(RoleActions_1.default.kongzhong);
  4936. break;
  4937. case RoleActions_1.default.huachan:
  4938. case RoleActions_1.default.climbend:
  4939. this._isActionNums = false;
  4940. this.setAction(RoleActions_1.default.run);
  4941. this.nowState = RoleActions_1.default.run;
  4942. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  4943. break;
  4944. }
  4945. }
  4946. }
  4947. }
  4948. else {
  4949. if (this._ending) {
  4950. var distime = dt / 1000;
  4951. this._moveTime += distime;
  4952. if (this._moveTime >= this._endanmotime) {
  4953. this.endGame();
  4954. }
  4955. else {
  4956. this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime;
  4957. this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime;
  4958. this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime;
  4959. Scene3dObject_1.default.carma.getComponent(CamerasScript_1.default).MyRotateAround(this._transform.position, this._endAnmoSpeed1);
  4960. }
  4961. }
  4962. }
  4963. }
  4964. };
  4965. NpcScript.prototype.endGame = function () {
  4966. this._ending = false;
  4967. TimerService_1.default.instance.removeUpdateTarget(this);
  4968. EventUtils_1.EventUtils.dispatchEvent(GameEvent_1.default.endGame);
  4969. };
  4970. NpcScript.prototype.wingame = function () {
  4971. TimerService_1.default.instance.removeUpdateTarget(this);
  4972. this._nowRoleState = 2;
  4973. this.setAction(RoleActions_1.default.kongzhong);
  4974. EventUtils_1.EventUtils.dispatchEvent(GameEvent_1.default.npcendGame, this.owner.name);
  4975. };
  4976. NpcScript.prototype.joyStickCHange = function (value, angle) {
  4977. if (this.nowState == RoleActions_1.default.run || this.nowState == RoleActions_1.default.Climb || RoleActions_1.default.left_climb || RoleActions_1.default.right_climb) {
  4978. this._changeMoveX = value;
  4979. }
  4980. if (this.nowState == RoleActions_1.default.left_climb && this._changeMoveX > 0) //强制跳跃
  4981. {
  4982. this.isforceJump = true;
  4983. this.nowState = RoleActions_1.default.right_jump;
  4984. }
  4985. else if (this.nowState == RoleActions_1.default.right_climb && this._changeMoveX < 0) {
  4986. this.isforceJump = true;
  4987. this.nowState = RoleActions_1.default.left_jump;
  4988. }
  4989. if (this.nowState == RoleActions_1.default.jump ||
  4990. this.nowState == RoleActions_1.default.left_jump ||
  4991. this.nowState == RoleActions_1.default.right_jump ||
  4992. this.nowState == RoleActions_1.default.jiasuJump)
  4993. angle = -angle * Math.PI / 180;
  4994. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion);
  4995. Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed);
  4996. };
  4997. NpcScript.prototype.xshunyi = function (state) {
  4998. if (this.nowState == RoleActions_1.default.run) {
  4999. this._moveTime = 0;
  5000. this._speedMoveV3.x = state * 30;
  5001. this.nowState = RoleActions_1.default.xshunyi;
  5002. }
  5003. };
  5004. NpcScript.prototype.setAction = function (actionName) {
  5005. this._nowActionName = actionName;
  5006. if (this._animator) {
  5007. if (this._nowActionName == RoleActions_1.default.climbend) {
  5008. this._animator.speed = 1.5;
  5009. }
  5010. else {
  5011. this._animator.speed = 1;
  5012. }
  5013. this._animator.play(actionName, 0, 0);
  5014. }
  5015. };
  5016. NpcScript.prototype.ceshitiaoyue = function () {
  5017. this.nowState = RoleActions_1.default.jump;
  5018. };
  5019. NpcScript.prototype.onUpdate = function () {
  5020. };
  5021. NpcScript.prototype.onLateUpdate = function () {
  5022. };
  5023. NpcScript.prototype.getPostion = function () {
  5024. return this._transform.position;
  5025. };
  5026. NpcScript.prototype.getNowstate = function () {
  5027. return this._nowRoleState;
  5028. };
  5029. NpcScript.prototype.stop = function () {
  5030. TimerService_1.default.instance.removeUpdateTarget(this);
  5031. };
  5032. NpcScript.prototype.destroy = function () {
  5033. TimerService_1.default.instance.removeUpdateTarget(this);
  5034. _super.prototype.destroy.call(this);
  5035. };
  5036. return NpcScript;
  5037. }(Laya.Script3D));
  5038. exports.default = NpcScript;
  5039. },{"../../configs/dataConfigs/BuildCFG":5,"../../frameworks/TimerService":13,"../../frameworks/events/EventUtils":16,"../../utils/GameUtils":87,"../scene3ds/RoleActions":46,"../scene3ds/Scene3dObject":48,"../userinfo/events/GameEvent":54,"./CamerasScript":42}],45:[function(require,module,exports){
  5040. "use strict";
  5041. Object.defineProperty(exports, "__esModule", { value: true });
  5042. var BaseView_1 = require("../../frameworks/mvc/BaseView");
  5043. var WindowAnmoType_1 = require("../../frameworks/mvc/WindowAnmoType");
  5044. var GameStateManager_1 = require("../main/GameStateManager");
  5045. var WordTipsUtils_1 = require("../loading/view/WordTipsUtils");
  5046. var UserInfoProxy_1 = require("../userinfo/UserInfoProxy");
  5047. var GameProxy_1 = require("../main/proxys/GameProxy");
  5048. var PlayerAccount_1 = require("../../platform/wxminigame/WXSDK/PlayerAccount");
  5049. var Debuger_1 = require("../../frameworks/Debuger");
  5050. var NetworkManager_1 = require("../../platform/wxminigame/NetworkManager");
  5051. var UiManager_1 = require("../../managers/UiManager");
  5052. var ChoutiPanView_1 = require("../../platform/wxminigame/WXSDK/cpa/ChoutiPanView");
  5053. var GameResultView = /** @class */ (function (_super) {
  5054. __extends(GameResultView, _super);
  5055. function GameResultView(gold) {
  5056. var _this = _super.call(this, "main", "gameresult", false, WindowAnmoType_1.default.WindowAnmoType_none, 1) || this;
  5057. _this.getgold = 0;
  5058. _this.getgold = gold;
  5059. return _this;
  5060. }
  5061. GameResultView.prototype.initView = function () {
  5062. this._gameProxy = this.getProxy(GameProxy_1.default);
  5063. this.c_state = this.getControllerByBame("c_state");
  5064. this.txt_gold.text = this.getgold.toString();
  5065. if (GameStateManager_1.default.getInstance().endGamePlayerArr.length == 0) {
  5066. this.c_state.selectedIndex = 0;
  5067. }
  5068. else {
  5069. this.c_state.selectedIndex = 1;
  5070. }
  5071. };
  5072. GameResultView.prototype.initEvent = function () {
  5073. this.addListener(this.btn_0, Laya.Event.CLICK, this, this.btn0click);
  5074. this.addListener(this.btn_1, Laya.Event.CLICK, this, this.btn1click);
  5075. };
  5076. GameResultView.prototype.btn0click = function () {
  5077. if (this.c_state.selectedIndex == 0) {
  5078. WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("暂未开放");
  5079. }
  5080. else {
  5081. this.getProxy(UserInfoProxy_1.default).changeGold(this.getgold);
  5082. this._gameProxy.returnmainview();
  5083. }
  5084. };
  5085. GameResultView.prototype.btn1click = function () {
  5086. var _this = this;
  5087. if (this.c_state.selectedIndex == 0) {
  5088. this.getProxy(UserInfoProxy_1.default).changeGold(this.getgold);
  5089. this.getProxy(UserInfoProxy_1.default).addLevel();
  5090. this._gameProxy.returnmainview();
  5091. }
  5092. else {
  5093. this.getProxy(UserInfoProxy_1.default).changeGold(this.getgold);
  5094. this._gameProxy.returnmainview();
  5095. }
  5096. var wins = GameStateManager_1.default.getInstance().endGamePlayerArr.length == 0 ? 1 : 0;
  5097. var userid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetUser(PlayerAccount_1.AccountUser.user_id);
  5098. var agrs = [{ "t": PlayerAccount_1.PlayerAccount.CurrentAccount.ServerTime.toString() }, { "play_id": userid }, { "money": "0" }, { "win": wins.toString() }];
  5099. Debuger_1.default.log("上传:", agrs);
  5100. NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.end, agrs, new Laya.Handler(this, function (_data) {
  5101. _this.getProxy(UserInfoProxy_1.default).sendGoldSync();
  5102. }), new Laya.Handler(this, function (_data) {
  5103. console.log("游戏结果err");
  5104. }));
  5105. };
  5106. GameResultView.prototype.destory = function () {
  5107. _super.prototype.destory.call(this);
  5108. UiManager_1.UiManager.instance.add(ChoutiPanView_1.default);
  5109. };
  5110. GameResultView.key = "GameResultView";
  5111. return GameResultView;
  5112. }(BaseView_1.default));
  5113. exports.default = GameResultView;
  5114. },{"../../frameworks/Debuger":12,"../../frameworks/mvc/BaseView":20,"../../frameworks/mvc/WindowAnmoType":25,"../../managers/UiManager":66,"../../platform/wxminigame/NetworkManager":71,"../../platform/wxminigame/WXSDK/PlayerAccount":74,"../../platform/wxminigame/WXSDK/cpa/ChoutiPanView":79,"../loading/view/WordTipsUtils":36,"../main/GameStateManager":38,"../main/proxys/GameProxy":39,"../userinfo/UserInfoProxy":53}],46:[function(require,module,exports){
  5115. "use strict";
  5116. Object.defineProperty(exports, "__esModule", { value: true });
  5117. var RoleActions = /** @class */ (function () {
  5118. function RoleActions() {
  5119. }
  5120. RoleActions.stand = "stand";
  5121. RoleActions.kongzhong = "kongzhong";
  5122. RoleActions.luodi1 = "luodi1";
  5123. RoleActions.luodi2 = "luodi2";
  5124. RoleActions.datiao1 = "datiao1";
  5125. RoleActions.datiao2 = "datiao2";
  5126. RoleActions.huachan = "huachan";
  5127. RoleActions.kualan = "kualan";
  5128. RoleActions.cefan1 = "cefan1";
  5129. RoleActions.cefan2 = "cefan2";
  5130. RoleActions.paoqiangleft = "paoqiangleft";
  5131. RoleActions.rightjump = "rightjump";
  5132. RoleActions.paoqiangright = "paoqiangright";
  5133. RoleActions.leftjump = "leftjump";
  5134. RoleActions.paqiang = "paqiang";
  5135. RoleActions.climbend = "climbend";
  5136. /**
  5137. * 跑动
  5138. */
  5139. RoleActions.run = "run";
  5140. /**
  5141. * 跳跃
  5142. */
  5143. RoleActions.jump = "jump";
  5144. /**
  5145. * 爬升
  5146. */
  5147. RoleActions.Climb = "Climb";
  5148. /**
  5149. * 自由落体
  5150. */
  5151. RoleActions.Freefalling = "Freefalling";
  5152. RoleActions.left_climb = "left_climb";
  5153. RoleActions.right_climb = "right_climb";
  5154. RoleActions.right_jump = "right_jump";
  5155. RoleActions.left_jump = "left_jump";
  5156. RoleActions.playPalouAction = "playPalouAction";
  5157. /**
  5158. * 加速板跳跃
  5159. */
  5160. RoleActions.jiasuJump = "jiasuJump";
  5161. /**
  5162. * x方向瞬移
  5163. */
  5164. RoleActions.xshunyi = "xshunyi";
  5165. /**
  5166. * 下滑位移
  5167. */
  5168. RoleActions.downSlide = "downSlide";
  5169. /**
  5170. * 侧面加速
  5171. */
  5172. RoleActions.slidejiasu = "slidejiasu";
  5173. /**
  5174. * 翻越
  5175. */
  5176. RoleActions.surmount = "surmount";
  5177. /**
  5178. * 锁定爬升
  5179. */
  5180. RoleActions.lockclimb = "lockclimb";
  5181. return RoleActions;
  5182. }());
  5183. exports.default = RoleActions;
  5184. },{}],47:[function(require,module,exports){
  5185. "use strict";
  5186. Object.defineProperty(exports, "__esModule", { value: true });
  5187. var PathConfig_1 = require("../../configs/gameConfigs/PathConfig");
  5188. var RolesPool = /** @class */ (function () {
  5189. function RolesPool() {
  5190. }
  5191. RolesPool.addRoleByName = function (resouceName, clas, parent) {
  5192. var skinnedmesh;
  5193. var arr = RolesPool.roledict[resouceName];
  5194. if (arr && arr.length > 0) {
  5195. skinnedmesh = arr.shift();
  5196. skinnedmesh.active = true;
  5197. parent.addChild(skinnedmesh);
  5198. }
  5199. else {
  5200. var sp = Laya.Loader.getRes(PathConfig_1.PathConfig.get3DRoleModel(resouceName));
  5201. skinnedmesh = Laya.Sprite3D.instantiate(sp, parent, false, new Laya.Vector3(0, 0, 0));
  5202. }
  5203. if (clas) {
  5204. var cla = skinnedmesh.addComponent(clas);
  5205. cla.resouseName = resouceName;
  5206. }
  5207. var _out = new Laya.Quaternion;
  5208. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), 180 * Math.PI / 180, _out);
  5209. skinnedmesh.transform.rotation = _out;
  5210. return skinnedmesh;
  5211. };
  5212. RolesPool.removeRole = function (sp, resouceName, cla) {
  5213. if (!RolesPool.roledict[resouceName]) {
  5214. RolesPool.roledict[resouceName] = [];
  5215. }
  5216. if (cla) {
  5217. cla.destroy();
  5218. }
  5219. sp.active = false;
  5220. sp.removeSelf();
  5221. RolesPool.roledict[resouceName].push(sp);
  5222. };
  5223. RolesPool.roledict = {};
  5224. return RolesPool;
  5225. }());
  5226. exports.default = RolesPool;
  5227. },{"../../configs/gameConfigs/PathConfig":10}],48:[function(require,module,exports){
  5228. "use strict";
  5229. Object.defineProperty(exports, "__esModule", { value: true });
  5230. var PathConfig_1 = require("../../configs/gameConfigs/PathConfig");
  5231. var GameUtils_1 = require("../../utils/GameUtils");
  5232. var Scene3dObject = /** @class */ (function () {
  5233. function Scene3dObject() {
  5234. this._outQUaternion4 = new Laya.Quaternion;
  5235. this._outQUaternion = new Laya.Quaternion;
  5236. }
  5237. Scene3dObject.getInstance = function () {
  5238. if (!this._instance) {
  5239. this._instance = new Scene3dObject;
  5240. }
  5241. return this._instance;
  5242. };
  5243. Scene3dObject.getPosVecbyScene = function (sceneName, buildname) {
  5244. if (Scene3dObject.patternDict[sceneName]) {
  5245. return Scene3dObject.patternDict[sceneName][buildname];
  5246. }
  5247. return null;
  5248. };
  5249. /**
  5250. * 判断是否爬到顶端
  5251. */
  5252. Scene3dObject.checkisClimbTop = function (sceneName, buildname, pos) {
  5253. var vec = Scene3dObject.getPosVecbyScene(sceneName, buildname);
  5254. if (vec && Math.abs(vec.y - pos.y) < 1.5) {
  5255. return true;
  5256. }
  5257. return false;
  5258. };
  5259. /**
  5260. * @param animator
  5261. * @param animatorDict
  5262. */
  5263. Scene3dObject.setAnimator = function (animator) {
  5264. var chiddict;
  5265. for (var s in Scene3dObject.actionDict) {
  5266. if (!animator.getControllerLayer().getAnimatorState(s)) {
  5267. chiddict = Scene3dObject.actionDict[s];
  5268. //创建一个动画动作状态
  5269. var state1 = new Laya.AnimatorState();
  5270. //设置动作状态的名称
  5271. state1.name = s;
  5272. //设置动作状态播放的起始时间(起始时间与结束时间的设置为0-1的百分比数值) 要截取的时间点 / 动画的总时长
  5273. state1.clipStart = chiddict.s / Scene3dObject.actionnums;
  5274. //设置动作状态播放的结束时间
  5275. state1.clipEnd = chiddict.e / Scene3dObject.actionnums;
  5276. //得到默认动画赋值给Clip(getDefaultState默认动画为Unity中animation的数组顺序0下标的动画)
  5277. state1.clip = animator.getDefaultState().clip;
  5278. //动画播放是否循环
  5279. state1.clip.islooping = chiddict.islooping;
  5280. //添加动画状态到动画组件里
  5281. animator.addState(state1);
  5282. }
  5283. }
  5284. };
  5285. Scene3dObject.prototype.initlizi = function () {
  5286. var lizi = Scene3dObject.getlizibyName("jiasulizi");
  5287. lizi.particleSystem.play();
  5288. lizi.active = false;
  5289. var lizi = Scene3dObject.getlizibyName("tanse_bai");
  5290. lizi.particleSystem.play();
  5291. lizi.active = false;
  5292. var lizi = Scene3dObject.getlizibyName("tanse_huang");
  5293. lizi.particleSystem.play();
  5294. lizi.active = false;
  5295. // var lizi:Laya.ShuriKenParticle3D = Scene3dObject.getlizibyName( "win_xian" );
  5296. // lizi.particleSystem.play();
  5297. // lizi.active = false;
  5298. // var lizi:Laya.ShuriKenParticle3D = Scene3dObject.getlizibyName( "yanhua" );
  5299. // lizi.particleSystem.play();
  5300. // lizi.active = false;
  5301. };
  5302. Scene3dObject.prototype.setliziPlaytanse = function (name, pos) {
  5303. var closetime = 0;
  5304. Laya.timer.clear(this, this.liziend);
  5305. this.liziendtanse();
  5306. if (name == "tanse_bai") {
  5307. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  5308. if (sort > 50) {
  5309. name = "tanse_huang";
  5310. }
  5311. }
  5312. closetime = 500;
  5313. this._tanselizi = Scene3dObject.getlizibyName(name);
  5314. this._tanselizi.transform.position = pos;
  5315. this._tanselizi.particleSystem.play();
  5316. if (closetime != 0) {
  5317. Laya.timer.once(closetime, this, this.liziendtanse);
  5318. }
  5319. };
  5320. Scene3dObject.prototype.liziendtanse = function () {
  5321. if (this._tanselizi) {
  5322. this._tanselizi.particleSystem.stop();
  5323. this._tanselizi.active = false;
  5324. }
  5325. };
  5326. Scene3dObject.prototype.jiadulizi1 = function (name, pos) {
  5327. if (!this._engamelizi4 || (this._engamelizi4 && !this._engamelizi4.active)) {
  5328. this._engamelizi4 = Scene3dObject.getlizibyName("jiasulizi");
  5329. this._engamelizi4.particleSystem.looping = true;
  5330. this._engamelizi4.transform.scale = new Laya.Vector3(20, 20, 20);
  5331. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion4);
  5332. this._engamelizi4.transform.rotation = this._outQUaternion4;
  5333. this._engamelizi4.particleSystem.play();
  5334. }
  5335. var lzpos = pos.clone();
  5336. lzpos.y += 5;
  5337. lzpos.z -= 10;
  5338. this._engamelizi4.transform.position = lzpos;
  5339. };
  5340. Scene3dObject.prototype.closeJiasulizi1 = function () {
  5341. if (this._engamelizi4 && this._engamelizi4.active) {
  5342. this._engamelizi4.active = false;
  5343. }
  5344. };
  5345. Scene3dObject.prototype.jiadulizi = function (name, pos) {
  5346. if (!this._engamelizi3 || (this._engamelizi3 && !this._engamelizi3.active)) {
  5347. this._engamelizi3 = Scene3dObject.getlizibyName("jiasulizi");
  5348. this._engamelizi3.particleSystem.looping = true;
  5349. this._engamelizi3.transform.scale = new Laya.Vector3(20, 20, 20);
  5350. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion);
  5351. this._engamelizi3.transform.rotation = this._outQUaternion;
  5352. this._engamelizi3.particleSystem.play();
  5353. }
  5354. var lzpos = pos.clone();
  5355. lzpos.y += 5;
  5356. this._engamelizi3.transform.position = lzpos;
  5357. };
  5358. Scene3dObject.prototype.closeJiasulizi = function () {
  5359. if (this._engamelizi3 && this._engamelizi3.active) {
  5360. this._engamelizi3.active = false;
  5361. }
  5362. };
  5363. Scene3dObject.prototype.liziendgame = function (name, pos, iswin) {
  5364. this._engamelizi1 = Scene3dObject.getlizibyName("yanhua");
  5365. this._engamelizi1.transform.position = pos;
  5366. this._engamelizi1.particleSystem.play();
  5367. if (iswin) {
  5368. this._engamelizi2 = Scene3dObject.getlizibyName("win_xian");
  5369. this._engamelizi2.transform.position = pos;
  5370. this._engamelizi2.particleSystem.play();
  5371. }
  5372. };
  5373. Scene3dObject.prototype.closeengamlizi = function () {
  5374. if (this._engamelizi1) {
  5375. this._engamelizi1.particleSystem.stop();
  5376. this._engamelizi1.active = false;
  5377. }
  5378. if (this._engamelizi2) {
  5379. this._engamelizi2.particleSystem.stop();
  5380. this._engamelizi2.active = false;
  5381. }
  5382. };
  5383. // public setliziPlay( name:string,pos:Laya.Vector3 ):void
  5384. // {
  5385. // var closetime:number = 0;
  5386. // Laya.timer.clear( this,this.liziend );
  5387. // switch( name )
  5388. // {
  5389. // case "tanse_bai":
  5390. // if( name == "tanse_bai" )
  5391. // {
  5392. // var sort:number = GameUtils.randRangeint( 0,100 );
  5393. // if( sort > 50 )
  5394. // {
  5395. // name = "tanse_huang";
  5396. // }
  5397. // }
  5398. // closetime = 500;
  5399. // break;
  5400. // case "jiasulizi":
  5401. // break;
  5402. // case "win_xian":
  5403. // closetime = 0;
  5404. // break;
  5405. // case "yanhua":
  5406. // closetime = 0;
  5407. // break;
  5408. // }
  5409. // var lizi:Laya.ShuriKenParticle3D = Scene3dObject.getlizibyName( name );
  5410. // lizi.transform.position = pos;
  5411. // lizi.particleSystem.play();
  5412. // if( closetime != 0 )
  5413. // {
  5414. // Laya.timer.once( closetime,this,this.liziend,[lizi] );
  5415. // }
  5416. // }
  5417. Scene3dObject.prototype.liziend = function (lizi) {
  5418. if (lizi) {
  5419. lizi.particleSystem.stop();
  5420. lizi.active = false;
  5421. }
  5422. };
  5423. Scene3dObject.getlizibyName = function (name) {
  5424. var lizisp;
  5425. if (Scene3dObject.liziDict[name]) {
  5426. lizisp = Scene3dObject.liziDict[name];
  5427. }
  5428. else {
  5429. lizisp = Laya.Sprite3D.instantiate(Laya.Loader.getRes(PathConfig_1.PathConfig.get3DModel(name)));
  5430. Scene3dObject.liziDict[name] = lizisp;
  5431. Scene3dObject.scene3D.addChild(lizisp);
  5432. }
  5433. lizisp.active = true;
  5434. return lizisp;
  5435. };
  5436. Scene3dObject.nowmapDict = {};
  5437. Scene3dObject.diePosY = 0;
  5438. Scene3dObject.gamewinPosZ = 0;
  5439. Scene3dObject.patternDict = {};
  5440. Scene3dObject.npcDict = {};
  5441. Scene3dObject.npcscriptDict = {};
  5442. Scene3dObject.npcnum = 0;
  5443. Scene3dObject.iscarmanpc = false;
  5444. Scene3dObject.liziDict = {};
  5445. Scene3dObject.actionnums = 575;
  5446. Scene3dObject.actionDict = {
  5447. "climbend": { s: 550, e: 575, islooping: false },
  5448. "stand": { s: 0, e: 80, islooping: true },
  5449. "run": { s: 90, e: 106, islooping: true },
  5450. "jump": { s: 110, e: 132, islooping: true },
  5451. "kongzhong": { s: 132, e: 145, islooping: true },
  5452. "luodi1": { s: 145, e: 160, islooping: true },
  5453. "luodi2": { s: 170, e: 202, islooping: true },
  5454. "datiao1": { s: 210, e: 235, islooping: true },
  5455. "datiao2": { s: 240, e: 273, islooping: true },
  5456. "huachan": { s: 280, e: 310, islooping: true },
  5457. "kualan": { s: 310, e: 346, islooping: true },
  5458. "cefan1": { s: 350, e: 391, islooping: true },
  5459. "cefan2": { s: 400, e: 434, islooping: true },
  5460. "paoqiangleft": { s: 440, islooping: true, e: 456 },
  5461. "rightjump": { s: 460, e: 477, islooping: true },
  5462. "paoqiangright": { s: 480, e: 496, islooping: true },
  5463. "leftjump": { s: 500, e: 517, islooping: true },
  5464. "paqiang": { s: 520, e: 542, islooping: true }
  5465. };
  5466. return Scene3dObject;
  5467. }());
  5468. exports.default = Scene3dObject;
  5469. },{"../../configs/gameConfigs/PathConfig":10,"../../utils/GameUtils":87}],49:[function(require,module,exports){
  5470. "use strict";
  5471. Object.defineProperty(exports, "__esModule", { value: true });
  5472. var SkinProxy_1 = require("./proxys/SkinProxy");
  5473. var MVCObjectPool_1 = require("../../frameworks/mvc/MVCObjectPool");
  5474. var WordTipsUtils_1 = require("../loading/view/WordTipsUtils");
  5475. var PathConfig_1 = require("../../configs/gameConfigs/PathConfig");
  5476. var PifuItem = /** @class */ (function (_super) {
  5477. __extends(PifuItem, _super);
  5478. function PifuItem() {
  5479. return _super.call(this) || this;
  5480. }
  5481. PifuItem.prototype.constructFromXML = function (xml) {
  5482. _super.prototype.constructFromXML.call(this, xml);
  5483. for (var str in this._children) {
  5484. var item = this._children[str];
  5485. this[item.name] = item;
  5486. }
  5487. this.onInit();
  5488. };
  5489. PifuItem.prototype.onInit = function () {
  5490. this.initView();
  5491. this.initEvent();
  5492. };
  5493. PifuItem.prototype.initView = function () {
  5494. this._skinProxy = MVCObjectPool_1.default.getInstance().getProxy(SkinProxy_1.default);
  5495. this.c_state = this.getController("c_state");
  5496. };
  5497. PifuItem.prototype.initEvent = function () {
  5498. this.on(Laya.Event.CLICK, this, this.btnclick);
  5499. };
  5500. PifuItem.prototype.btnclick = function () {
  5501. if (this.pifuvo) {
  5502. switch (this.c_state.selectedIndex) {
  5503. case 0:
  5504. break;
  5505. case 1: //拥有
  5506. this._skinProxy.getSkin(this.pifuvo);
  5507. break;
  5508. case 2: //活动获取
  5509. WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("暂未开放");
  5510. break;
  5511. case 3: //看视频获取
  5512. WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("暂未开放");
  5513. break;
  5514. case 4: //金币购买
  5515. this._skinProxy.getSkin(this.pifuvo);
  5516. break;
  5517. }
  5518. }
  5519. };
  5520. PifuItem.prototype.showData = function (vo) {
  5521. this.pifuvo = vo;
  5522. if (this.pifuvo) {
  5523. this.load_icon.icon = PathConfig_1.PathConfig.getroleicon(this.pifuvo.roleCFG.icon);
  5524. if (this._skinProxy.roleVO.roleid == this.pifuvo.roleCFG.id) {
  5525. this.c_state.selectedIndex = 0;
  5526. }
  5527. else if (this.pifuvo.state == 1) {
  5528. this.c_state.selectedIndex = 1;
  5529. }
  5530. else {
  5531. switch (this.pifuvo.roleCFG.getState) {
  5532. case 1:
  5533. this.c_state.selectedIndex = 3;
  5534. this.txt_need.text = this.pifuvo.hasnum + "/" + this.pifuvo.roleCFG.need;
  5535. break;
  5536. case 2:
  5537. this.c_state.selectedIndex = 4;
  5538. this.txt_need.text = this.pifuvo.roleCFG.need.toString();
  5539. break;
  5540. case 3:
  5541. this.c_state.selectedIndex = 2;
  5542. break;
  5543. }
  5544. }
  5545. }
  5546. };
  5547. PifuItem.prototype.dispose = function () {
  5548. this.off(Laya.Event.CLICK, this, this.btnclick);
  5549. _super.prototype.dispose.call(this);
  5550. };
  5551. return PifuItem;
  5552. }(fairygui.GButton));
  5553. exports.default = PifuItem;
  5554. },{"../../configs/gameConfigs/PathConfig":10,"../../frameworks/mvc/MVCObjectPool":22,"../loading/view/WordTipsUtils":36,"./proxys/SkinProxy":51}],50:[function(require,module,exports){
  5555. "use strict";
  5556. Object.defineProperty(exports, "__esModule", { value: true });
  5557. var BaseView_1 = require("../../frameworks/mvc/BaseView");
  5558. var WindowAnmoType_1 = require("../../frameworks/mvc/WindowAnmoType");
  5559. var SkinProxy_1 = require("./proxys/SkinProxy");
  5560. var GameEvent_1 = require("../userinfo/events/GameEvent");
  5561. var UserInfoEvent_1 = require("../userinfo/events/UserInfoEvent");
  5562. var ResourceManager_1 = require("../../managers/ResourceManager");
  5563. var PathConfig_1 = require("../../configs/gameConfigs/PathConfig");
  5564. var RoleActions_1 = require("../scene3ds/RoleActions");
  5565. var UiManager_1 = require("../../managers/UiManager");
  5566. var RolesPool_1 = require("../scene3ds/RolesPool");
  5567. var MainRoleScript_1 = require("../modelScripts/MainRoleScript");
  5568. var SkinView = /** @class */ (function (_super) {
  5569. __extends(SkinView, _super);
  5570. function SkinView() {
  5571. var _this = _super.call(this, "main", "skinview", false, WindowAnmoType_1.default.WindowAnmoType_none, 0) || this;
  5572. _this._isdestorys = false;
  5573. _this._out = new Laya.Quaternion;
  5574. return _this;
  5575. }
  5576. SkinView.prototype.initView = function () {
  5577. this._isdestorys = false;
  5578. this.c_title = this.getControllerByBame("c_title");
  5579. this._skinProxy = this.getProxy(SkinProxy_1.default);
  5580. this.list_0.setVirtual();
  5581. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemlistrender, null, false);
  5582. this.c_title.selectedIndex = 0;
  5583. this.onchange();
  5584. //添加3D场景
  5585. this._ui3DScene = this.displayObject.addChildAt(new Laya.Scene3D(), 0);
  5586. //添加照相机
  5587. this._uicarma3D = (this._ui3DScene.addChild(new Laya.Camera(0, 0.1, 80)));
  5588. // this._uicarma3D.clearColor = null;
  5589. this._uicarma3D.viewport = new Laya.Viewport(this.x, this.y, this.width, this.height);
  5590. this._uicarma3D.transform.translate(new Laya.Vector3(0, 1.2, 5), false);
  5591. // //添加方向光
  5592. // this._uilight = Scene3dObject.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
  5593. // this._uilight.color = new Laya.Vector3(0.6,0.6,0.6);
  5594. // this._uilight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
  5595. this.updateroleHandler();
  5596. };
  5597. SkinView.prototype.initEvent = function () {
  5598. this.addListener(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
  5599. this.addListener(this.c_title, fairygui.Events.STATE_CHANGED, this, this.onchange);
  5600. this.addDataEvent(GameEvent_1.default.updateSKinView, this, this.onchange);
  5601. this.addDataEvent(UserInfoEvent_1.default.userinfoEvent_updateroleid, this, this.updateroleHandler);
  5602. };
  5603. SkinView.prototype.updateroleHandler = function () {
  5604. var roleVO = this._skinProxy.roleVO;
  5605. this.removeRole();
  5606. var pathArr = [];
  5607. pathArr.push({ url: PathConfig_1.PathConfig.get3DRoleModel(roleVO.roleCfg.name) });
  5608. ResourceManager_1.default.getInstance().loader3DArr(pathArr, this, this.loadcomplete, null, true, roleVO.roleCfg.name);
  5609. };
  5610. SkinView.prototype.loadcomplete = function (resousename) {
  5611. var roleVO = this._skinProxy.roleVO;
  5612. if (!this._isdestorys && this._ui3DScene && resousename == roleVO.roleCfg.name) {
  5613. this._rolemo = RolesPool_1.default.addRoleByName(resousename, MainRoleScript_1.default, this._ui3DScene);
  5614. this._rolemo.transform.position = new Laya.Vector3(0, 2, 0);
  5615. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), -135 * 180 / Math.PI, this._out);
  5616. this._rolemo.transform.rotation = this._out;
  5617. this._rolemo.getComponent(MainRoleScript_1.default).setAction(RoleActions_1.default.stand);
  5618. }
  5619. };
  5620. SkinView.prototype.removeRole = function () {
  5621. if (this._rolemo) {
  5622. var script = this._rolemo.getComponent(MainRoleScript_1.default);
  5623. RolesPool_1.default.removeRole(this._rolemo, script.resouseName, script);
  5624. this._rolemo = null;
  5625. }
  5626. };
  5627. SkinView.prototype.onchange = function () {
  5628. if (this.c_title.selectedIndex == 0) {
  5629. this.list_0.numItems = this._skinProxy.pifuArr.length;
  5630. }
  5631. else {
  5632. this.list_0.numItems = 0;
  5633. }
  5634. };
  5635. SkinView.prototype.itemlistrender = function (index, item) {
  5636. if (this.c_title.selectedIndex == 0) {
  5637. if (index < this._skinProxy.pifuArr.length) {
  5638. item.showData(this._skinProxy.pifuArr[index]);
  5639. }
  5640. }
  5641. };
  5642. SkinView.prototype.onclosefun = function () {
  5643. UiManager_1.UiManager.instance.close(SkinView);
  5644. };
  5645. SkinView.prototype.destory = function () {
  5646. this._isdestorys = true;
  5647. this.removeRole();
  5648. if (this._uicarma3D) {
  5649. this._uicarma3D.destroy();
  5650. this._uicarma3D = null;
  5651. }
  5652. if (this._ui3DScene) {
  5653. this._ui3DScene.destroy();
  5654. this._ui3DScene = null;
  5655. }
  5656. _super.prototype.destory.call(this);
  5657. };
  5658. SkinView.key = "SkinView";
  5659. return SkinView;
  5660. }(BaseView_1.default));
  5661. exports.default = SkinView;
  5662. },{"../../configs/gameConfigs/PathConfig":10,"../../frameworks/mvc/BaseView":20,"../../frameworks/mvc/WindowAnmoType":25,"../../managers/ResourceManager":63,"../../managers/UiManager":66,"../modelScripts/MainRoleScript":43,"../scene3ds/RoleActions":46,"../scene3ds/RolesPool":47,"../userinfo/events/GameEvent":54,"../userinfo/events/UserInfoEvent":56,"./proxys/SkinProxy":51}],51:[function(require,module,exports){
  5663. "use strict";
  5664. Object.defineProperty(exports, "__esModule", { value: true });
  5665. var BaseProxys_1 = require("../../../frameworks/mvc/BaseProxys");
  5666. var CacheManager_1 = require("../../../managers/CacheManager");
  5667. var UserCacheType_1 = require("../../userinfo/events/UserCacheType");
  5668. var PiFuVO_1 = require("../vo/PiFuVO");
  5669. var RoleCFG_1 = require("../../../configs/dataConfigs/RoleCFG");
  5670. var UiManager_1 = require("../../../managers/UiManager");
  5671. var SkinView_1 = require("../SkinView");
  5672. var WordTipsUtils_1 = require("../../loading/view/WordTipsUtils");
  5673. var GameEvent_1 = require("../../userinfo/events/GameEvent");
  5674. var UserInfoProxy_1 = require("../../userinfo/UserInfoProxy");
  5675. var SkinProxy = /** @class */ (function (_super) {
  5676. __extends(SkinProxy, _super);
  5677. function SkinProxy() {
  5678. return _super.call(this) || this;
  5679. }
  5680. SkinProxy.prototype.initProxy = function () {
  5681. };
  5682. SkinProxy.prototype.init = function () {
  5683. this.cachedata = CacheManager_1.default.getInstance().getCacheObj(UserCacheType_1.default.skin);
  5684. var pifuData;
  5685. if (!this.cachedata.hasOwnProperty("pifu")) {
  5686. this.cachedata["pifu"] = {};
  5687. }
  5688. pifuData = this.cachedata["pifu"];
  5689. this.pifuArr = [];
  5690. this.pifuDict = {};
  5691. var i = 0;
  5692. var nums = RoleCFG_1.default.vec.length;
  5693. for (i = 0; i < nums; i++) {
  5694. var pifuvo = new PiFuVO_1.default;
  5695. var cfg = RoleCFG_1.default.vec[i];
  5696. pifuvo.roleCFG = cfg;
  5697. var d = pifuData[cfg.id];
  5698. if (d) {
  5699. pifuvo.state = Number(d.state);
  5700. pifuvo.hasnum = Number(d.hasnum);
  5701. }
  5702. else {
  5703. pifuvo.state = 0;
  5704. pifuvo.hasnum = 0;
  5705. }
  5706. if (cfg.getState == 0) {
  5707. pifuvo.state = 1;
  5708. }
  5709. this.pifuArr.push(pifuvo);
  5710. this.pifuDict[pifuvo.roleCFG.id] = pifuvo;
  5711. }
  5712. };
  5713. SkinProxy.prototype.openview = function () {
  5714. UiManager_1.UiManager.instance.add(SkinView_1.default);
  5715. };
  5716. SkinProxy.prototype.getSkin = function (pifu) {
  5717. if (pifu.state == 1) {
  5718. this.roleVO.roleid = pifu.roleCFG.id;
  5719. this.dispacheDataEvent(GameEvent_1.default.updateSKinView);
  5720. }
  5721. else {
  5722. switch (pifu.roleCFG.getState) {
  5723. case 1: //视频获取
  5724. break;
  5725. case 2: //金币购买
  5726. if (this.roleVO.Gold >= pifu.roleCFG.need) {
  5727. this.roleVO.roleid = pifu.roleCFG.id;
  5728. this.roleVO.Gold -= pifu.roleCFG.need;
  5729. pifu.state = 1;
  5730. this.addskinCache(pifu.roleCFG.id, pifu.state, pifu.hasnum);
  5731. this.dispacheDataEvent(GameEvent_1.default.updateSKinView);
  5732. WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("购买成功");
  5733. this.getProxy(UserInfoProxy_1.default).sendGoldSync();
  5734. }
  5735. else {
  5736. WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("金币不足");
  5737. }
  5738. break;
  5739. case 3: //活动获取
  5740. break;
  5741. }
  5742. }
  5743. };
  5744. SkinProxy.prototype.addskinCache = function (id, state, hasnum) {
  5745. this.cachedata["pifu"][id] = {};
  5746. this.cachedata["pifu"][id]["state"] = state;
  5747. this.cachedata["pifu"][id]["hasnum"] = hasnum;
  5748. CacheManager_1.default.getInstance().addCacheObj(UserCacheType_1.default.skin, this.cachedata);
  5749. };
  5750. SkinProxy.key = "SkinProxy";
  5751. return SkinProxy;
  5752. }(BaseProxys_1.default));
  5753. exports.default = SkinProxy;
  5754. },{"../../../configs/dataConfigs/RoleCFG":9,"../../../frameworks/mvc/BaseProxys":19,"../../../managers/CacheManager":59,"../../../managers/UiManager":66,"../../loading/view/WordTipsUtils":36,"../../userinfo/UserInfoProxy":53,"../../userinfo/events/GameEvent":54,"../../userinfo/events/UserCacheType":55,"../SkinView":50,"../vo/PiFuVO":52}],52:[function(require,module,exports){
  5755. "use strict";
  5756. Object.defineProperty(exports, "__esModule", { value: true });
  5757. var PiFuVO = /** @class */ (function () {
  5758. function PiFuVO() {
  5759. /**
  5760. * 0:未拥有,1:已经拥有
  5761. */
  5762. this.state = 0;
  5763. this.hasnum = 0;
  5764. }
  5765. return PiFuVO;
  5766. }());
  5767. exports.default = PiFuVO;
  5768. },{}],53:[function(require,module,exports){
  5769. "use strict";
  5770. Object.defineProperty(exports, "__esModule", { value: true });
  5771. var PlatformEvent_1 = require("../../platform/events/PlatformEvent");
  5772. var BaseProxys_1 = require("../../frameworks/mvc/BaseProxys");
  5773. var PlayerAccount_1 = require("../../platform/wxminigame/WXSDK/PlayerAccount");
  5774. var Debuger_1 = require("../../frameworks/Debuger");
  5775. var NetworkManager_1 = require("../../platform/wxminigame/NetworkManager");
  5776. var UserInfoProxy = /** @class */ (function (_super) {
  5777. __extends(UserInfoProxy, _super);
  5778. function UserInfoProxy() {
  5779. var _this = _super.call(this) || this;
  5780. _this.hastilitime = 0;
  5781. _this.isenterMainGame = false;
  5782. return _this;
  5783. }
  5784. UserInfoProxy.prototype.initProxy = function () {
  5785. this.addDataEvent(PlatformEvent_1.default.PlatformEvent_onAudioInterruptionEnd, this, this.audioInterruptionEnd);
  5786. };
  5787. UserInfoProxy.prototype.audioInterruptionEnd = function () {
  5788. if (this.isenterMainGame) {
  5789. // SoundssManager.getInstance().playbgSound( "gamebg" );
  5790. }
  5791. };
  5792. UserInfoProxy.prototype.init = function () {
  5793. this.roleVO.init();
  5794. };
  5795. UserInfoProxy.prototype.addLevel = function () {
  5796. this.roleVO.addLevel();
  5797. };
  5798. UserInfoProxy.prototype.changeGold = function (value) {
  5799. this.roleVO.Gold += value;
  5800. };
  5801. UserInfoProxy.prototype.sendGoldSync = function () {
  5802. var agrs = [{ "t": PlayerAccount_1.PlayerAccount.CurrentAccount.ServerTime.toString() }, { "vmoney": this.roleVO.Gold.toString() }];
  5803. Debuger_1.default.log("金币同步:", agrs);
  5804. NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.usersync, agrs, new Laya.Handler(this, function (_data) {
  5805. }), new Laya.Handler(this, function (_data) {
  5806. console.log("游戏结果err");
  5807. }));
  5808. };
  5809. UserInfoProxy.key = "UserInfoProxy";
  5810. return UserInfoProxy;
  5811. }(BaseProxys_1.default));
  5812. exports.default = UserInfoProxy;
  5813. },{"../../frameworks/Debuger":12,"../../frameworks/mvc/BaseProxys":19,"../../platform/events/PlatformEvent":69,"../../platform/wxminigame/NetworkManager":71,"../../platform/wxminigame/WXSDK/PlayerAccount":74}],54:[function(require,module,exports){
  5814. "use strict";
  5815. Object.defineProperty(exports, "__esModule", { value: true });
  5816. var GameEvent = /** @class */ (function () {
  5817. function GameEvent() {
  5818. }
  5819. GameEvent.removeselect = "GameEvent_removeselect";
  5820. /**
  5821. * 开始游戏
  5822. */
  5823. GameEvent.startGame = "GameEvent_startGame";
  5824. /**
  5825. * 结束游戏
  5826. */
  5827. GameEvent.endGame = "GameEvent_endGame";
  5828. GameEvent.npcendGame = "GameEvent_npcendGame";
  5829. /**
  5830. * 暂停游戏
  5831. */
  5832. GameEvent.stopGame = "GameEvent_stopGame";
  5833. /**
  5834. * 通关成功
  5835. */
  5836. GameEvent.winGame = "GameEvent_winGame";
  5837. /**
  5838. * 通关失败
  5839. */
  5840. GameEvent.failGame = "GameEvent_failGame";
  5841. GameEvent.jumpgame = "GameEvent_jumpgame";
  5842. /**
  5843. * 回到主界面
  5844. */
  5845. GameEvent.returnMainView = "returnMainView";
  5846. GameEvent.updateSKinView = "GameEvent_updateSKinView";
  5847. return GameEvent;
  5848. }());
  5849. exports.default = GameEvent;
  5850. },{}],55:[function(require,module,exports){
  5851. "use strict";
  5852. Object.defineProperty(exports, "__esModule", { value: true });
  5853. var UserCacheType = /** @class */ (function () {
  5854. function UserCacheType() {
  5855. }
  5856. /******************************************************** */
  5857. UserCacheType.lastDay = "lastDay";
  5858. UserCacheType.nowdayShare = "dayshare";
  5859. UserCacheType.nowdayVideo = "dayvideo";
  5860. /**
  5861. * 记录上次离开时间
  5862. */
  5863. UserCacheType.lasttime = "lasttime";
  5864. UserCacheType.caplastflushtime = "captime";
  5865. UserCacheType.capstorageappids = "capappids";
  5866. UserCacheType.hasgetappids = "hasgetappids";
  5867. /**
  5868. * 角色信息
  5869. */
  5870. UserCacheType.roleData = "roleData";
  5871. /********************************************************************** */
  5872. UserCacheType.gold = "gold";
  5873. UserCacheType.roleid = "roleid";
  5874. UserCacheType.levelid = "levelid";
  5875. /**
  5876. * 皮肤
  5877. */
  5878. UserCacheType.skin = "skin";
  5879. return UserCacheType;
  5880. }());
  5881. exports.default = UserCacheType;
  5882. },{}],56:[function(require,module,exports){
  5883. "use strict";
  5884. Object.defineProperty(exports, "__esModule", { value: true });
  5885. var UserInfoEvent = /** @class */ (function () {
  5886. function UserInfoEvent() {
  5887. }
  5888. UserInfoEvent.UserInfoEvent_updateUserData = "UserInfoEvent_updateUserData";
  5889. UserInfoEvent.userinfoEvent_updateroleid = "userinfoEvent_updateroleid";
  5890. UserInfoEvent.userinfoEvent_levelid = "userinfoEvent_levelid";
  5891. return UserInfoEvent;
  5892. }());
  5893. exports.default = UserInfoEvent;
  5894. },{}],57:[function(require,module,exports){
  5895. "use strict";
  5896. Object.defineProperty(exports, "__esModule", { value: true });
  5897. var BaseVO_1 = require("../../../frameworks/vo/BaseVO");
  5898. var EventUtils_1 = require("../../../frameworks/events/EventUtils");
  5899. var UserInfoEvent_1 = require("../events/UserInfoEvent");
  5900. var CacheManager_1 = require("../../../managers/CacheManager");
  5901. var UserCacheType_1 = require("../events/UserCacheType");
  5902. var RoleCFG_1 = require("../../../configs/dataConfigs/RoleCFG");
  5903. var LevelCFG_1 = require("../../../configs/dataConfigs/LevelCFG");
  5904. var GameUtils_1 = require("../../../utils/GameUtils");
  5905. var PlayerAccount_1 = require("../../../platform/wxminigame/WXSDK/PlayerAccount");
  5906. var RoleVO = /** @class */ (function (_super) {
  5907. __extends(RoleVO, _super);
  5908. function RoleVO() {
  5909. var _this = _super.call(this) || this;
  5910. /**
  5911. * 金币
  5912. */
  5913. _this._Gold = 0;
  5914. _this._roleid = 0;
  5915. _this._leveid = 0;
  5916. _this._serverLevel = 0;
  5917. _this.movespeed = 0;
  5918. _this.frontjump = new Laya.Vector3;
  5919. _this.leftjump = new Laya.Vector3;
  5920. _this.rightjump = new Laya.Vector3;
  5921. _this.upclimb = 0;
  5922. _this.slideclimb = new Laya.Vector3;
  5923. return _this;
  5924. }
  5925. RoleVO.getInstance = function () {
  5926. if (!RoleVO._instance) {
  5927. RoleVO._instance = new RoleVO;
  5928. }
  5929. return RoleVO._instance;
  5930. };
  5931. RoleVO.prototype.init = function () {
  5932. var cachemanager = CacheManager_1.default.getInstance();
  5933. var nowGold = Number(PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetUser(PlayerAccount_1.AccountUser.vmoney));
  5934. this.Gold = nowGold; //cachemanager.getnum( UserCacheType.gold );
  5935. this._roleid = cachemanager.getnum(UserCacheType_1.default.roleid);
  5936. if (this.roleid == 0) {
  5937. this.roleid = 1;
  5938. }
  5939. else {
  5940. this.setRoleCFG();
  5941. }
  5942. // this._leveid = cachemanager.getnum( UserCacheType.levelid );
  5943. this._serverLevel = Number(PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetUser(PlayerAccount_1.AccountUser.stage));
  5944. // this._serverLevel = 9;
  5945. this.updateLevel();
  5946. };
  5947. Object.defineProperty(RoleVO.prototype, "nowlevel", {
  5948. get: function () {
  5949. return this._leveid;
  5950. },
  5951. enumerable: true,
  5952. configurable: true
  5953. });
  5954. RoleVO.prototype.getNowServerLevel = function () {
  5955. return this._serverLevel + 1;
  5956. };
  5957. RoleVO.prototype.addLevel = function () {
  5958. this._serverLevel++;
  5959. this.updateLevel();
  5960. };
  5961. RoleVO.prototype.updateLevel = function () {
  5962. var lv = this._serverLevel + 1;
  5963. var allnums = LevelCFG_1.default.vec.length;
  5964. if (lv > allnums) {
  5965. var value = (lv - allnums) % (allnums - 2);
  5966. if (value == 0) {
  5967. this._leveid = allnums;
  5968. }
  5969. else {
  5970. this._leveid = value + 2;
  5971. }
  5972. }
  5973. else {
  5974. this._leveid = lv;
  5975. }
  5976. this.levelcfg = LevelCFG_1.default.dict[this._leveid];
  5977. this.levelmapArr = GameUtils_1.GameUtils.cutstrtoArr(this.levelcfg.road);
  5978. EventUtils_1.EventUtils.dispatchEvent(UserInfoEvent_1.default.userinfoEvent_updateroleid);
  5979. };
  5980. RoleVO.prototype.setRoleCFG = function () {
  5981. this.roleCfg = RoleCFG_1.default.dict[this._roleid];
  5982. this.movespeed = this.roleCfg.speed;
  5983. this.frontjump.x = Number(this.roleCfg.frontjump.x);
  5984. this.frontjump.y = Number(this.roleCfg.frontjump.y);
  5985. this.frontjump.z = Number(this.roleCfg.frontjump.z);
  5986. this.leftjump.x = Number(this.roleCfg.leftjump.x);
  5987. this.leftjump.y = Number(this.roleCfg.leftjump.y);
  5988. this.leftjump.z = Number(this.roleCfg.leftjump.z);
  5989. this.rightjump.x = Number(this.roleCfg.rightjump.x);
  5990. this.rightjump.y = Number(this.roleCfg.rightjump.y);
  5991. this.rightjump.z = Number(this.roleCfg.rightjump.z);
  5992. this.upclimb = Number(this.roleCfg.upclimb);
  5993. this.slideclimb.x = Number(this.roleCfg.slideclimb.x);
  5994. this.slideclimb.y = Number(this.roleCfg.slideclimb.y);
  5995. this.slideclimb.z = Number(this.roleCfg.slideclimb.z);
  5996. };
  5997. Object.defineProperty(RoleVO.prototype, "roleid", {
  5998. get: function () {
  5999. return this._roleid;
  6000. },
  6001. // public set leveid( value:number )
  6002. // {
  6003. // if( this._leveid != value )
  6004. // {
  6005. // this._leveid = value;
  6006. // this.levelcfg = LevelCFG.dict[ this._leveid ];
  6007. // this.levelmapArr = GameUtils.cutstrtoArr(this.levelcfg.road);
  6008. // CacheManager.getInstance().addstr( UserCacheType.levelid,this._leveid.toString() );
  6009. // EventUtils.dispatchEvent( UserInfoEvent.userinfoEvent_updateroleid );
  6010. // }
  6011. // }
  6012. // public get leveid():number
  6013. // {
  6014. // return this._leveid;
  6015. // }
  6016. set: function (value) {
  6017. if (this._roleid != value) {
  6018. this._roleid = value;
  6019. this.setRoleCFG();
  6020. CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.roleid, this._roleid.toString());
  6021. EventUtils_1.EventUtils.dispatchEvent(UserInfoEvent_1.default.userinfoEvent_updateroleid);
  6022. }
  6023. },
  6024. enumerable: true,
  6025. configurable: true
  6026. });
  6027. Object.defineProperty(RoleVO.prototype, "Gold", {
  6028. get: function () {
  6029. return this._Gold;
  6030. },
  6031. set: function (value) {
  6032. if (this._Gold != value) {
  6033. this._Gold = value;
  6034. CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.gold, this._Gold.toString());
  6035. EventUtils_1.EventUtils.dispatchEvent(UserInfoEvent_1.default.UserInfoEvent_updateUserData);
  6036. }
  6037. },
  6038. enumerable: true,
  6039. configurable: true
  6040. });
  6041. return RoleVO;
  6042. }(BaseVO_1.BaseVO));
  6043. exports.default = RoleVO;
  6044. },{"../../../configs/dataConfigs/LevelCFG":7,"../../../configs/dataConfigs/RoleCFG":9,"../../../frameworks/events/EventUtils":16,"../../../frameworks/vo/BaseVO":31,"../../../managers/CacheManager":59,"../../../platform/wxminigame/WXSDK/PlayerAccount":74,"../../../utils/GameUtils":87,"../events/UserCacheType":55,"../events/UserInfoEvent":56}],58:[function(require,module,exports){
  6045. "use strict";
  6046. Object.defineProperty(exports, "__esModule", { value: true });
  6047. var ResourceManager_1 = require("./ResourceManager");
  6048. var PifuItem_1 = require("../gamemodule/skins/PifuItem");
  6049. var CpaDownsView_1 = require("../platform/wxminigame/WXSDK/cpa/CpaDownsView");
  6050. var CpaItem_1 = require("../platform/wxminigame/WXSDK/cpa/item/CpaItem");
  6051. var BaoKuanGameView_1 = require("../platform/wxminigame/WXSDK/cpa/BaoKuanGameView");
  6052. var ShiwantuijianView_1 = require("../platform/wxminigame/WXSDK/cpa/ShiwantuijianView");
  6053. /*
  6054. * name;
  6055. */
  6056. var BinderManager = /** @class */ (function (_super) {
  6057. __extends(BinderManager, _super);
  6058. function BinderManager() {
  6059. return _super.call(this) || this;
  6060. }
  6061. /**
  6062. * 数据绑定
  6063. */
  6064. BinderManager.binderAll = function () {
  6065. this.binderFairygui();
  6066. this.binderGComponent();
  6067. };
  6068. /**
  6069. * ui框架的绑定
  6070. */
  6071. BinderManager.binderFairygui = function () {
  6072. fairygui.UIConfig.gameLoaderManager = ResourceManager_1.default.getInstance();
  6073. //特效绑定( url 绑定组名,只有公共特效需要绑定 ) "ui://fqpgxr1kl6mw0":"effect1"
  6074. fairygui.UIConfig.gameEffectDict = {};
  6075. };
  6076. /**
  6077. * 组件绑定
  6078. */
  6079. BinderManager.binderGComponent = function () {
  6080. //main
  6081. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2pwlk1a", PifuItem_1.default);
  6082. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c527", CpaDownsView_1.default);
  6083. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c528", CpaItem_1.default);
  6084. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c529", BaoKuanGameView_1.default);
  6085. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52a", CpaItem_1.default);
  6086. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52b", ShiwantuijianView_1.default);
  6087. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52c", CpaItem_1.default);
  6088. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc21", CpaItem_1.default);
  6089. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc22", CpaItem_1.default);
  6090. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52e", CpaItem_1.default);
  6091. };
  6092. return BinderManager;
  6093. }(Laya.EventDispatcher));
  6094. exports.BinderManager = BinderManager;
  6095. },{"../gamemodule/skins/PifuItem":49,"../platform/wxminigame/WXSDK/cpa/BaoKuanGameView":78,"../platform/wxminigame/WXSDK/cpa/CpaDownsView":80,"../platform/wxminigame/WXSDK/cpa/ShiwantuijianView":83,"../platform/wxminigame/WXSDK/cpa/item/CpaItem":85,"./ResourceManager":63}],59:[function(require,module,exports){
  6096. "use strict";
  6097. Object.defineProperty(exports, "__esModule", { value: true });
  6098. var Global_1 = require("../Global");
  6099. var PlatfromType_1 = require("../platform/PlatfromType");
  6100. /*
  6101. * 本地数据缓存管理器
  6102. */
  6103. var CacheManager = /** @class */ (function (_super) {
  6104. __extends(CacheManager, _super);
  6105. function CacheManager() {
  6106. return _super.call(this) || this;
  6107. }
  6108. CacheManager.getInstance = function () {
  6109. if (!this.instance) {
  6110. this.instance = new CacheManager();
  6111. }
  6112. return this.instance;
  6113. };
  6114. CacheManager.prototype.init = function () {
  6115. };
  6116. /**
  6117. * 添加本地缓存数据 object
  6118. * @param key
  6119. * @param value
  6120. */
  6121. CacheManager.prototype.addObj = function (key, value) {
  6122. this.addCacheObj(key, value);
  6123. };
  6124. /**
  6125. * 获取本地缓存数据 object
  6126. * @param key
  6127. */
  6128. CacheManager.prototype.getObj = function (key) {
  6129. return this.getCacheObj(key);
  6130. };
  6131. /**
  6132. * 添加本地缓存数据 string
  6133. * @param key
  6134. * @param value
  6135. */
  6136. CacheManager.prototype.addstr = function (key, value) {
  6137. this.addCacheStr(key, value);
  6138. };
  6139. CacheManager.prototype.addnum = function (key, value) {
  6140. this.addCacheStr(key, value.toString());
  6141. };
  6142. /**
  6143. * 获取本地缓存数据 string
  6144. * @param key
  6145. */
  6146. CacheManager.prototype.getstr = function (key) {
  6147. return this.getCachestr(key);
  6148. };
  6149. /**
  6150. * 获取本地缓存数据 number
  6151. * @param key
  6152. */
  6153. CacheManager.prototype.getnum = function (key) {
  6154. return Number(this.getCachestr(key));
  6155. };
  6156. /**
  6157. * 清理指定本地缓存数据
  6158. * @param key
  6159. */
  6160. CacheManager.prototype.removeCache = function (key) {
  6161. this.removeselectCache(key);
  6162. };
  6163. /**
  6164. * 清理所有本地缓存数据
  6165. */
  6166. CacheManager.prototype.clearAll = function () {
  6167. this.clearAllCache();
  6168. };
  6169. CacheManager.prototype.addCacheObj = function (key, value) {
  6170. switch (Global_1.Global.nowplatfrom) {
  6171. case PlatfromType_1.default.wx:
  6172. this.setStorageSyncWX(key, value);
  6173. break;
  6174. default:
  6175. Laya.LocalStorage.setJSON(key, value);
  6176. break;
  6177. }
  6178. };
  6179. CacheManager.prototype.getCacheObj = function (key) {
  6180. var obj;
  6181. switch (Global_1.Global.nowplatfrom) {
  6182. case PlatfromType_1.default.wx:
  6183. obj = this.getStorageSyncWX(key);
  6184. break;
  6185. default:
  6186. obj = Laya.LocalStorage.getJSON(key);
  6187. break;
  6188. }
  6189. if (!obj) {
  6190. obj = {};
  6191. }
  6192. return obj;
  6193. };
  6194. CacheManager.prototype.addCacheStr = function (key, value) {
  6195. switch (Global_1.Global.nowplatfrom) {
  6196. case PlatfromType_1.default.wx:
  6197. this.setStorageSyncWX(key, value);
  6198. break;
  6199. default:
  6200. Laya.LocalStorage.setItem(key, value);
  6201. break;
  6202. }
  6203. };
  6204. CacheManager.prototype.getCachestr = function (key) {
  6205. var str = "0";
  6206. switch (Global_1.Global.nowplatfrom) {
  6207. case PlatfromType_1.default.wx:
  6208. str = this.getStorageSyncWX(key);
  6209. break;
  6210. default:
  6211. str = Laya.LocalStorage.getItem(key);
  6212. break;
  6213. }
  6214. if (str == null || str == "") {
  6215. str = "0";
  6216. }
  6217. return str;
  6218. };
  6219. CacheManager.prototype.removeselectCache = function (key) {
  6220. switch (Global_1.Global.nowplatfrom) {
  6221. case PlatfromType_1.default.wx:
  6222. this.removeStorageWX(key);
  6223. break;
  6224. default:
  6225. Laya.LocalStorage.removeItem(key);
  6226. break;
  6227. }
  6228. };
  6229. CacheManager.prototype.clearAllCache = function () {
  6230. switch (Global_1.Global.nowplatfrom) {
  6231. case PlatfromType_1.default.wx:
  6232. this.clearStorageWX();
  6233. break;
  6234. default:
  6235. Laya.LocalStorage.clear();
  6236. break;
  6237. }
  6238. };
  6239. /**
  6240. * 本地存储
  6241. * @param key
  6242. * @param data
  6243. */
  6244. CacheManager.prototype.setStorageSyncWX = function (key, data) {
  6245. var wx = Laya.Browser.window.wx;
  6246. if (wx) {
  6247. wx.setStorageSync(key, data);
  6248. }
  6249. };
  6250. /**
  6251. * 获取本地存储
  6252. * @param key
  6253. */
  6254. CacheManager.prototype.getStorageSyncWX = function (key) {
  6255. var wx = Laya.Browser.window.wx;
  6256. if (wx) {
  6257. return wx.getStorageSync(key);
  6258. }
  6259. return null;
  6260. };
  6261. /**
  6262. * 从本地缓存中移除指定 key
  6263. * @param key
  6264. */
  6265. CacheManager.prototype.removeStorageWX = function (key) {
  6266. if (Laya.Browser.window.wx) {
  6267. Laya.Browser.window.wx.removeStorage(key);
  6268. }
  6269. };
  6270. /**
  6271. * 清理存储数据
  6272. */
  6273. CacheManager.prototype.clearStorageWX = function () {
  6274. if (Laya.Browser.window.wx) {
  6275. Laya.Browser.window.wx.clearStorageSync();
  6276. }
  6277. };
  6278. return CacheManager;
  6279. }(Laya.EventDispatcher));
  6280. exports.default = CacheManager;
  6281. },{"../Global":2,"../platform/PlatfromType":68}],60:[function(require,module,exports){
  6282. "use strict";
  6283. Object.defineProperty(exports, "__esModule", { value: true });
  6284. var CacheManager_1 = require("./CacheManager");
  6285. var TimeUtils_1 = require("../utils/TimeUtils");
  6286. var UserCacheType_1 = require("../gamemodule/userinfo/events/UserCacheType");
  6287. var TimesTamper_1 = require("../frameworks/TimesTamper");
  6288. var DayManager = /** @class */ (function () {
  6289. function DayManager() {
  6290. }
  6291. DayManager.getInstance = function () {
  6292. if (!this._instance) {
  6293. this._instance = new DayManager();
  6294. }
  6295. return this._instance;
  6296. };
  6297. DayManager.prototype.init = function () {
  6298. var lastday = CacheManager_1.default.getInstance().getstr(UserCacheType_1.default.lastDay);
  6299. var nowday = TimeUtils_1.TimeUtils.formatYearMonthDate1(TimesTamper_1.TimesTamper.getInstance().serverTime);
  6300. if (lastday != nowday) {
  6301. CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.lastDay, nowday);
  6302. DayManager.isNewDay = true;
  6303. }
  6304. else {
  6305. DayManager.isNewDay = false;
  6306. }
  6307. };
  6308. return DayManager;
  6309. }());
  6310. exports.default = DayManager;
  6311. },{"../frameworks/TimesTamper":14,"../gamemodule/userinfo/events/UserCacheType":55,"../utils/TimeUtils":88,"./CacheManager":59}],61:[function(require,module,exports){
  6312. "use strict";
  6313. Object.defineProperty(exports, "__esModule", { value: true });
  6314. var Global_1 = require("../Global");
  6315. var LayerNotify_1 = require("../frameworks/notification/LayerNotify");
  6316. /*
  6317. * name;
  6318. */
  6319. var GameLayerManager = /** @class */ (function (_super) {
  6320. __extends(GameLayerManager, _super);
  6321. function GameLayerManager() {
  6322. var _this = _super.call(this) || this;
  6323. /**
  6324. * 背景层( 或者3D场景层 )
  6325. */
  6326. _this.background = new fairygui.GComponent();
  6327. /**
  6328. * ui层
  6329. */
  6330. _this.uiLayer = new fairygui.GComponent();
  6331. /**
  6332. * 最定层
  6333. */
  6334. _this.topLayer = new fairygui.GComponent();
  6335. _this._uilayerZorder = 0;
  6336. _this._upuilayerZorder = 200;
  6337. _this._tipslayerZorder = 1000;
  6338. _this._guidelayerZorder = 600;
  6339. return _this;
  6340. }
  6341. GameLayerManager.getInstance = function () {
  6342. if (!this._instance) {
  6343. this._instance = new GameLayerManager();
  6344. }
  6345. return this._instance;
  6346. };
  6347. //初始化层级
  6348. GameLayerManager.prototype.initlayer = function () {
  6349. Global_1.Global.stage.addChild(fairygui.GRoot.inst.displayObject);
  6350. fairygui.GRoot.inst.addChild(this.background);
  6351. fairygui.GRoot.inst.addChild(this.uiLayer);
  6352. fairygui.GRoot.inst.addChild(this.topLayer);
  6353. };
  6354. GameLayerManager.prototype.addtoLayer = function (itemview, layer) {
  6355. if (layer == LayerNotify_1.LayerNotify.LAYER_BACKGROUND) {
  6356. GameLayerManager.getInstance().background.addChild(itemview);
  6357. }
  6358. else if (layer == LayerNotify_1.LayerNotify.LAYER_UILAYER) {
  6359. this._uilayerZorder++;
  6360. GameLayerManager.getInstance().uiLayer.addChild(itemview);
  6361. itemview.sortingOrder = this._uilayerZorder;
  6362. }
  6363. else if (layer == LayerNotify_1.LayerNotify.LAYER_UPUILAYER) {
  6364. this._upuilayerZorder++;
  6365. GameLayerManager.getInstance().uiLayer.addChild(itemview);
  6366. itemview.sortingOrder = this._upuilayerZorder;
  6367. }
  6368. else if (layer == LayerNotify_1.LayerNotify.LAYER_TIPSLAYER) {
  6369. // GameLayerManager.getInstance().tipsLayer.addChild(itemview);
  6370. this._tipslayerZorder++;
  6371. GameLayerManager.getInstance().uiLayer.addChild(itemview);
  6372. itemview.sortingOrder = this._tipslayerZorder;
  6373. }
  6374. else if (layer == LayerNotify_1.LayerNotify.LAYER_GUIDELAYER) {
  6375. this._guidelayerZorder++;
  6376. GameLayerManager.getInstance().uiLayer.addChild(itemview);
  6377. itemview.sortingOrder = this._guidelayerZorder;
  6378. }
  6379. };
  6380. GameLayerManager.prototype.removeformLayer = function (layer) {
  6381. switch (layer) {
  6382. case LayerNotify_1.LayerNotify.LAYER_UILAYER:
  6383. this._uilayerZorder--;
  6384. if (this._uilayerZorder < 0) {
  6385. this._uilayerZorder = 0;
  6386. }
  6387. break;
  6388. case LayerNotify_1.LayerNotify.LAYER_UPUILAYER:
  6389. this._upuilayerZorder--;
  6390. if (this._upuilayerZorder < 200) {
  6391. this._upuilayerZorder = 200;
  6392. }
  6393. break;
  6394. case LayerNotify_1.LayerNotify.LAYER_TIPSLAYER:
  6395. this._tipslayerZorder--;
  6396. if (this._tipslayerZorder < 1000) {
  6397. this._tipslayerZorder = 1000;
  6398. }
  6399. break;
  6400. case LayerNotify_1.LayerNotify.LAYER_GUIDELAYER:
  6401. this._tipslayerZorder--;
  6402. if (this._tipslayerZorder < 600) {
  6403. this._tipslayerZorder = 600;
  6404. }
  6405. break;
  6406. }
  6407. };
  6408. return GameLayerManager;
  6409. }(Laya.EventDispatcher));
  6410. exports.GameLayerManager = GameLayerManager;
  6411. },{"../Global":2,"../frameworks/notification/LayerNotify":29}],62:[function(require,module,exports){
  6412. "use strict";
  6413. Object.defineProperty(exports, "__esModule", { value: true });
  6414. var ResourceManager_1 = require("./ResourceManager");
  6415. var Debuger_1 = require("../frameworks/Debuger");
  6416. var CacheVO_1 = require("../frameworks/vo/CacheVO");
  6417. var ObjectPool_1 = require("../frameworks/mvc/ObjectPool");
  6418. var PathConfig_1 = require("../configs/gameConfigs/PathConfig");
  6419. var TimerService_1 = require("../frameworks/TimerService");
  6420. /*
  6421. * 资源管理器;
  6422. */
  6423. var ResDataManager = /** @class */ (function () {
  6424. function ResDataManager() {
  6425. /**
  6426. * 超过X分钟未被引用的资源,清理掉
  6427. */
  6428. this._clearTime = 60000;
  6429. this._disUpdateTime = 30000;
  6430. this._time = 0;
  6431. }
  6432. ResDataManager.getInastance = function () {
  6433. if (null == this.instance) {
  6434. this.instance = new ResDataManager();
  6435. }
  6436. return this.instance;
  6437. };
  6438. ResDataManager.prototype.init = function () {
  6439. ObjectPool_1.default.register(CacheVO_1.default.poolkey, CacheVO_1.default);
  6440. this._resourceurlPool = {};
  6441. this._pkgPool = {};
  6442. this.nocacheDict = { "loading": true, "main": true, "uicomponent": true };
  6443. TimerService_1.default.getInastance().addUpdateTarget(this);
  6444. };
  6445. ResDataManager.prototype.update = function (dt) {
  6446. this._time += dt;
  6447. if (this._time > this._disUpdateTime) //1分钟检查一次
  6448. {
  6449. if (ResourceManager_1.default.instance.running) //如果当前在加载中,延时1秒检测
  6450. {
  6451. this._time -= 1000;
  6452. return;
  6453. }
  6454. this.updateGroupPool();
  6455. this._time = 0;
  6456. }
  6457. };
  6458. ResDataManager.prototype.updateGroupPool = function () {
  6459. var nowTime = Laya.Browser.now();
  6460. var s;
  6461. if (this._pkgPool) {
  6462. var vo;
  6463. for (s in this._pkgPool) {
  6464. vo = this._pkgPool[s];
  6465. if (vo.ref <= 0 && (nowTime - vo.time) > this._clearTime) {
  6466. this.removePackage(vo.packageName, true);
  6467. this.clearCacheVO(vo.packageName);
  6468. }
  6469. }
  6470. }
  6471. //清理图片缓存
  6472. if (this._resourceurlPool) {
  6473. var resourceurlPool = this._resourceurlPool;
  6474. for (s in resourceurlPool) {
  6475. if (resourceurlPool[s] <= 0) {
  6476. this.clearResByUrl(s, true);
  6477. }
  6478. }
  6479. }
  6480. };
  6481. ResDataManager.prototype.addCacheVO = function (pkgname, isCache) {
  6482. if (isCache && !this.nocacheDict.hasOwnProperty(pkgname)) {
  6483. var vo;
  6484. if (!this._pkgPool.hasOwnProperty(pkgname)) {
  6485. vo = ObjectPool_1.default.getObj(CacheVO_1.default.poolkey);
  6486. vo.packageName = pkgname;
  6487. this._pkgPool[pkgname] = vo;
  6488. }
  6489. else {
  6490. vo = this._pkgPool[pkgname];
  6491. }
  6492. vo.ref++;
  6493. vo.time = Laya.Browser.now();
  6494. }
  6495. };
  6496. ResDataManager.prototype.clearCacheVO = function (pkgName) {
  6497. if (this._pkgPool[pkgName]) {
  6498. var vo = this._pkgPool[pkgName];
  6499. vo.clear();
  6500. delete this._pkgPool[pkgName];
  6501. }
  6502. };
  6503. /**
  6504. * 添加ui包
  6505. * @param pkgname 包名
  6506. * @param isaddpackage 是否创建uipackage
  6507. * @param isCache 是否添加到组缓存中( 如果添加,则参与定时清理的逻辑,常驻资源请勿设置为ture )
  6508. */
  6509. ResDataManager.prototype.adduiPackage = function (pkgname, isaddpackage, isCache) {
  6510. if (isaddpackage === void 0) { isaddpackage = true; }
  6511. if (isCache === void 0) { isCache = true; }
  6512. if (isaddpackage) {
  6513. if (pkgname == "main") {
  6514. fairygui.UIPackage.addPackage(PathConfig_1.PathConfig.res + PathConfig_1.PathConfig.ui + pkgname, pkgname);
  6515. }
  6516. else {
  6517. fairygui.UIPackage.addPackage(PathConfig_1.PathConfig.wxlocal + PathConfig_1.PathConfig.ui + pkgname, pkgname);
  6518. }
  6519. }
  6520. this.addCacheVO(pkgname, isCache);
  6521. };
  6522. /**
  6523. * 添加包
  6524. * @param path 路径( 事例:res/ui/ )
  6525. * @param pkgname 包名
  6526. * @param isaddpackage 是否添加
  6527. * @param isCache 是否缓存
  6528. */
  6529. ResDataManager.prototype.addPackage = function (path, pkgname, isaddpackage, isCache) {
  6530. if (isaddpackage === void 0) { isaddpackage = true; }
  6531. if (isCache === void 0) { isCache = true; }
  6532. if (isaddpackage) {
  6533. fairygui.UIPackage.addPackage(path + pkgname, pkgname);
  6534. }
  6535. this.addCacheVO(pkgname, isCache);
  6536. };
  6537. /**
  6538. * 移除包
  6539. * @param pkgname 包名
  6540. * @param isclear 是否强制清除( 如果为false则等待定时器判断清理,如果为true则强制清除 )
  6541. */
  6542. ResDataManager.prototype.removePackage = function (pkgname, isclear) {
  6543. if (isclear === void 0) { isclear = false; }
  6544. if (pkgname == "" || pkgname == null) {
  6545. return;
  6546. }
  6547. if (isclear) {
  6548. Debuger_1.default.log("清理包资源缓存:" + pkgname);
  6549. fairygui.UIPackage.removePackage(pkgname);
  6550. if (this._pkgPool.hasOwnProperty(pkgname)) {
  6551. delete this._pkgPool[pkgname];
  6552. }
  6553. }
  6554. else {
  6555. if (this._pkgPool.hasOwnProperty(pkgname)) {
  6556. var vo = this._pkgPool[pkgname];
  6557. if (vo) {
  6558. vo.ref--;
  6559. }
  6560. }
  6561. }
  6562. };
  6563. ResDataManager.prototype.addeffectPackage = function (pkgname, isCache) {
  6564. if (isCache === void 0) { isCache = true; }
  6565. // Debuger.log("addeffectPackage:" + pkgname);
  6566. // fairygui.UIPackage.addPackage(PathConfig.res + PathConfig.effects + pkgname,pkgname);
  6567. // this.addCacheVO( pkgname,isCache );
  6568. };
  6569. ResDataManager.prototype.removeeffectpackage = function (pkgname, isclear) {
  6570. if (isclear === void 0) { isclear = false; }
  6571. Debuger_1.default.log("removeeffectpackage:" + pkgname);
  6572. ResDataManager.getInastance().removePackage(pkgname, isclear);
  6573. };
  6574. /**
  6575. * 获取已经加载过的数据
  6576. * @param url 资源url
  6577. * @param isCache 是否存储在缓存池中,默认为true
  6578. */
  6579. ResDataManager.prototype.getResByurl = function (url, isCache) {
  6580. if (isCache === void 0) { isCache = true; }
  6581. if (isCache) {
  6582. if (this._resourceurlPool[url] == null) {
  6583. this._resourceurlPool[url] = 0;
  6584. }
  6585. this._resourceurlPool[url]++;
  6586. }
  6587. return Laya.loader.getRes(url);
  6588. };
  6589. /**
  6590. * 清理资源缓存(url)
  6591. * @param url 要清理的资源url
  6592. * @param isClear 对于缓存池中的数据,当引用为0时,是否直接强制清除( 如果为false,则等待缓存定时刷新时候再去判断 )
  6593. */
  6594. ResDataManager.prototype.clearResByUrl = function (url, isClear) {
  6595. if (isClear === void 0) { isClear = false; }
  6596. if (this._resourceurlPool.hasOwnProperty(url)) {
  6597. if (isClear) {
  6598. Debuger_1.default.log("clearResByUrl:" + url);
  6599. Laya.loader.clearRes(url);
  6600. delete this._resourceurlPool[url];
  6601. }
  6602. else {
  6603. this._resourceurlPool[url]--;
  6604. }
  6605. }
  6606. else {
  6607. Laya.loader.clearRes(url);
  6608. }
  6609. };
  6610. /**
  6611. * 清理资源缓存(Array)
  6612. * @param urls 资源数组
  6613. * @param packageName 包名
  6614. */
  6615. ResDataManager.prototype.clearResByArrUrls = function (urls, packageName) {
  6616. if (packageName === void 0) { packageName = ""; }
  6617. if (packageName != "") {
  6618. fairygui.UIPackage.removePackage(packageName);
  6619. }
  6620. for (var s in urls) {
  6621. this.clearResByUrl(urls[s].url, true);
  6622. }
  6623. };
  6624. return ResDataManager;
  6625. }());
  6626. exports.default = ResDataManager;
  6627. },{"../configs/gameConfigs/PathConfig":10,"../frameworks/Debuger":12,"../frameworks/TimerService":13,"../frameworks/mvc/ObjectPool":23,"../frameworks/vo/CacheVO":32,"./ResourceManager":63}],63:[function(require,module,exports){
  6628. "use strict";
  6629. Object.defineProperty(exports, "__esModule", { value: true });
  6630. /*
  6631. * name;
  6632. */
  6633. var Handler = Laya.Handler;
  6634. var Debuger_1 = require("../frameworks/Debuger");
  6635. var EventUtils_1 = require("../frameworks/events/EventUtils");
  6636. var RecConfigs_1 = require("../configs/gameConfigs/RecConfigs");
  6637. var ResourceManager = /** @class */ (function (_super) {
  6638. __extends(ResourceManager, _super);
  6639. function ResourceManager() {
  6640. var _this = _super.call(this) || this;
  6641. _this._groupIndex = 0;
  6642. _this.running = false;
  6643. /**
  6644. * 要加载的总数量
  6645. */
  6646. _this._loadNum = 0;
  6647. /**
  6648. * 已经加载的数量
  6649. */
  6650. _this._loadedNum = 0;
  6651. _this._preloadNum = 0;
  6652. _this._cut = 0;
  6653. _this._nowLoadArr = null;
  6654. return _this;
  6655. }
  6656. ResourceManager.getInstance = function () {
  6657. if (this.instance == null) {
  6658. this.instance = new ResourceManager();
  6659. }
  6660. return this.instance;
  6661. };
  6662. ResourceManager.prototype.init = function () {
  6663. this._configs = new Array();
  6664. this._groups = {};
  6665. Laya.loader.retryNum = 4;
  6666. Laya.loader.on(Laya.Event.ERROR, this, this.onError);
  6667. Laya.loader.on("errorsMsg", this, this.errorsMsghandler);
  6668. Laya.loader.on("gameerrorsMsg", this, this.gameerrorsMsghandler);
  6669. };
  6670. ResourceManager.prototype.onLoadConfigComplete = function () {
  6671. if (this._onConfigCompleteTarget != null && this._onConfigComplete != null) {
  6672. this._onConfigComplete.call(this._onConfigCompleteTarget);
  6673. }
  6674. };
  6675. ResourceManager.prototype.errorsMsghandler = function (msg) {
  6676. Debuger_1.default.log("errorsMsghandler", msg);
  6677. EventUtils_1.EventUtils.dispatchEvent("loadfailEvent", msg);
  6678. };
  6679. ResourceManager.prototype.gameerrorsMsghandler = function (msg) {
  6680. EventUtils_1.EventUtils.dispatchEvent("gameserrosEvent", msg);
  6681. };
  6682. /**
  6683. * 加载资源组
  6684. * @param groupName 组名
  6685. * @param onResourceLoadTarget 作用域
  6686. * @param ResourceLoadComplete 完成事件
  6687. * @param onResourceProgress 加载进度事件
  6688. * @param isShow 是否显示加载状态
  6689. */
  6690. ResourceManager.prototype.loadGroup = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  6691. if (onResourceProgress === void 0) { onResourceProgress = null; }
  6692. if (isShow === void 0) { isShow = true; }
  6693. if (args === void 0) { args = null; }
  6694. // Debuger.log(groupName);
  6695. var data = {};
  6696. data.complete = ResourceLoadComplete;
  6697. data.completeTarget = onResourceLoadTarget;
  6698. data.progress = onResourceProgress;
  6699. data.urls = RecConfigs_1.default.getInstance().groupdict[groupName];
  6700. data.isShow = isShow;
  6701. data.args = args;
  6702. data.type = "group";
  6703. data.resouseType = "2D";
  6704. this._configs.push(data);
  6705. this.loadStart();
  6706. };
  6707. /**
  6708. * 加载单个资源
  6709. * @param url 资源url
  6710. * @param type 资源类型
  6711. * @param onResourceLoadTarget 作用域
  6712. * @param ResourceLoadComplete 完成事件
  6713. * @param onResourceProgress 加载进度事件
  6714. * @param isShow 是否显示加载状态
  6715. */
  6716. ResourceManager.prototype.Loader = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  6717. if (onResourceProgress === void 0) { onResourceProgress = null; }
  6718. if (isShow === void 0) { isShow = true; }
  6719. if (args === void 0) { args = null; }
  6720. var data = {};
  6721. data.complete = ResourceLoadComplete;
  6722. data.completeTarget = onResourceLoadTarget;
  6723. data.progress = onResourceProgress;
  6724. data.urls = [{ url: url, type: type }];
  6725. data.isShow = isShow;
  6726. data.args = args;
  6727. data.type = "single";
  6728. data.resouseType = "2D";
  6729. this._configs.push(data);
  6730. this.loadStart();
  6731. };
  6732. /**
  6733. * 加载数组资源
  6734. * @param urls
  6735. * @param onResourceLoadTarget
  6736. * @param ResourceLoadComplete
  6737. * @param onResourceProgress
  6738. * @param isShow
  6739. */
  6740. ResourceManager.prototype.Loaders = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  6741. if (onResourceProgress === void 0) { onResourceProgress = null; }
  6742. if (isShow === void 0) { isShow = true; }
  6743. if (args === void 0) { args = null; }
  6744. var data = {};
  6745. data.complete = ResourceLoadComplete;
  6746. data.completeTarget = onResourceLoadTarget;
  6747. data.progress = onResourceProgress;
  6748. data.urls = urls;
  6749. data.isShow = isShow;
  6750. data.type = "arr";
  6751. data.args = args;
  6752. data.resouseType = "2D";
  6753. this._configs.push(data);
  6754. this.loadStart();
  6755. };
  6756. /**
  6757. * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 )
  6758. * @param urls
  6759. * @param onResourceLoadTarget
  6760. * @param ResourceLoadComplete
  6761. * @param onResourceProgress
  6762. * @param isShow
  6763. */
  6764. ResourceManager.prototype.loaderArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, cut) {
  6765. if (onResourceProgress === void 0) { onResourceProgress = null; }
  6766. if (cut === void 0) { cut = 3; }
  6767. var data = {};
  6768. data.complete = ResourceLoadComplete;
  6769. data.completeTarget = onResourceLoadTarget;
  6770. data.progress = onResourceProgress;
  6771. data.urls = urls;
  6772. data.isShow = false;
  6773. data.type = "loaderArr";
  6774. data.cut = cut;
  6775. data.resouseType = "2D";
  6776. this._configs.push(data);
  6777. this.startLoad1();
  6778. };
  6779. ResourceManager.prototype.startLoad1 = function () {
  6780. if (!this.running && this._configs.length > 0) {
  6781. this._nowLoadData = this._configs.shift();
  6782. this._nowLoadArr = this._nowLoadData.urls.concat().reverse();
  6783. this._loadNum = this._nowLoadArr.length;
  6784. this._loadedNum = 0;
  6785. this._preloadNum = this._loadedNum;
  6786. this._cut = Number(this._nowLoadData.cut);
  6787. this.loadStart1();
  6788. }
  6789. };
  6790. ResourceManager.prototype.loadStart1 = function () {
  6791. if (this.running) {
  6792. return;
  6793. }
  6794. if (this._nowLoadArr && this._nowLoadArr.length > 0) {
  6795. this.running = true;
  6796. var needArr;
  6797. if (this._nowLoadArr.length > this._cut) {
  6798. needArr = this._nowLoadArr.splice(0, this._cut);
  6799. }
  6800. else {
  6801. needArr = this._nowLoadArr.splice(0);
  6802. }
  6803. this._cut = needArr.length;
  6804. this._preloadNum = this._loadedNum;
  6805. this.onLoadingArr(0);
  6806. var resouseType = this._nowLoadData.resouseType;
  6807. if (resouseType == "2D" || resouseType == null) {
  6808. Laya.loader.load(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false));
  6809. }
  6810. else {
  6811. Laya.loader.create(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false));
  6812. }
  6813. }
  6814. else {
  6815. this._nowLoadData = null;
  6816. this.startLoad1();
  6817. }
  6818. };
  6819. ResourceManager.prototype.onLoadingArr = function (value) {
  6820. this._loadedNum = this._preloadNum + value * this._cut;
  6821. if (this._nowLoadData) {
  6822. var allvalue = Math.ceil((this._loadedNum / this._loadNum) * 100);
  6823. if (this._nowLoadData.progress != null) {
  6824. this._nowLoadData.progress.call(this._nowLoadData.completeTarget, allvalue, Math.floor(value * 100));
  6825. }
  6826. }
  6827. };
  6828. ResourceManager.prototype.onLoadCompleteArr = function () {
  6829. this.onLoadingArr(1);
  6830. this._loadedNum = this._preloadNum + this._cut;
  6831. this.running = false;
  6832. if (this._loadedNum == this._loadNum) {
  6833. if (this._nowLoadData && this._nowLoadData.complete) {
  6834. this._nowLoadData.complete.call(this._nowLoadData.completeTarget);
  6835. }
  6836. }
  6837. Laya.timer.callLater(this, this.loadStart1);
  6838. // this.loadStart1();
  6839. };
  6840. ResourceManager.prototype.loadStart = function () {
  6841. if (this.running || this._configs.length == 0) {
  6842. return;
  6843. }
  6844. this.running = true;
  6845. this._nowLoadData = this._configs[0];
  6846. var arr = this._nowLoadData.urls;
  6847. var isShow = this._nowLoadData.isShow;
  6848. if (isShow) {
  6849. fairygui.GRoot.inst.showModalWait();
  6850. }
  6851. var resouseType = this._nowLoadData.resouseType;
  6852. if (arr != null) {
  6853. if (resouseType == "2D" || resouseType == null) {
  6854. Laya.loader.load(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false));
  6855. }
  6856. else {
  6857. Laya.loader.create(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false));
  6858. }
  6859. }
  6860. };
  6861. // 加载进度侦听器
  6862. ResourceManager.prototype.onLoading = function (progress) {
  6863. if (this._nowLoadData) {
  6864. progress = Math.ceil(Number(progress * 100));
  6865. if (this._nowLoadData.progress != null) {
  6866. this._nowLoadData.progress.call(this._nowLoadData.completeTarget, progress);
  6867. }
  6868. }
  6869. };
  6870. ResourceManager.prototype.onLoadComplete = function (args) {
  6871. if (args === void 0) { args = null; }
  6872. fairygui.GRoot.inst.closeModalWait();
  6873. if (this._nowLoadData && this._nowLoadData.complete) {
  6874. if (this._nowLoadData.args) {
  6875. this._nowLoadData.complete.call(this._nowLoadData.completeTarget, this._nowLoadData.args);
  6876. }
  6877. else {
  6878. this._nowLoadData.complete.call(this._nowLoadData.completeTarget);
  6879. }
  6880. }
  6881. this.running = false;
  6882. this._nowLoadData = null;
  6883. this._configs.shift();
  6884. this.loadStart();
  6885. };
  6886. ResourceManager.prototype.onError = function (err) {
  6887. fairygui.GRoot.inst.closeModalWait();
  6888. Debuger_1.default.log("加载失败: " + err);
  6889. };
  6890. /**
  6891. * 加载3D单个资源
  6892. * @param url 资源url
  6893. * @param type 资源类型
  6894. * @param onResourceLoadTarget 作用域
  6895. * @param ResourceLoadComplete 完成事件
  6896. * @param onResourceProgress 加载进度事件
  6897. * @param isShow 是否显示加载状态
  6898. */
  6899. ResourceManager.prototype.Loader3D = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow) {
  6900. if (onResourceProgress === void 0) { onResourceProgress = null; }
  6901. if (isShow === void 0) { isShow = true; }
  6902. var data = {};
  6903. data.complete = ResourceLoadComplete;
  6904. data.completeTarget = onResourceLoadTarget;
  6905. data.progress = onResourceProgress;
  6906. data.urls = [{ url: url, type: type }];
  6907. data.isShow = isShow;
  6908. data.type = "single";
  6909. data.resouseType = "3D";
  6910. this._configs.push(data);
  6911. this.loadStart();
  6912. };
  6913. /**
  6914. * 加载3D资源组
  6915. * @param groupName 组名
  6916. * @param onResourceLoadTarget 作用域
  6917. * @param ResourceLoadComplete 完成事件
  6918. * @param onResourceProgress 加载进度事件
  6919. * @param isShow 是否显示加载状态
  6920. */
  6921. ResourceManager.prototype.loadGroup3D = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  6922. if (onResourceProgress === void 0) { onResourceProgress = null; }
  6923. if (isShow === void 0) { isShow = true; }
  6924. if (args === void 0) { args = null; }
  6925. Debuger_1.default.log(groupName);
  6926. var data = {};
  6927. data.complete = ResourceLoadComplete;
  6928. data.completeTarget = onResourceLoadTarget;
  6929. data.progress = onResourceProgress;
  6930. data.urls = RecConfigs_1.default.getInstance().groupdict[groupName];
  6931. data.isShow = isShow;
  6932. data.args = args;
  6933. data.type = "group";
  6934. data.resouseType = "3D";
  6935. this._configs.push(data);
  6936. this.loadStart();
  6937. };
  6938. /**
  6939. * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 )
  6940. * @param urls
  6941. * @param onResourceLoadTarget
  6942. * @param ResourceLoadComplete
  6943. * @param onResourceProgress
  6944. * @param isShow
  6945. */
  6946. ResourceManager.prototype.loader3DArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isshow, args) {
  6947. if (onResourceProgress === void 0) { onResourceProgress = null; }
  6948. if (isshow === void 0) { isshow = false; }
  6949. if (args === void 0) { args = null; }
  6950. var data = {};
  6951. data.complete = ResourceLoadComplete;
  6952. data.completeTarget = onResourceLoadTarget;
  6953. data.progress = onResourceProgress;
  6954. data.urls = urls;
  6955. data.isShow = isshow;
  6956. data.args = args;
  6957. data.type = "loaderArr";
  6958. data.resouseType = "3D";
  6959. this._configs.push(data);
  6960. this.loadStart();
  6961. };
  6962. /**
  6963. * 加载特效
  6964. * @param groupName
  6965. * @param onResourceLoadTarget
  6966. * @param ResourceLoadComplete
  6967. * @param args
  6968. */
  6969. ResourceManager.prototype.loadEffect = function (groupName, onResourceLoadTarget, ResourceLoadComplete, args) {
  6970. if (args === void 0) { args = null; }
  6971. var urls = RecConfigs_1.default.getInstance().groupdict[groupName];
  6972. if (urls && urls.length > 0) {
  6973. Laya.loader.load(urls, Handler.create(onResourceLoadTarget, ResourceLoadComplete, [args]));
  6974. }
  6975. };
  6976. return ResourceManager;
  6977. }(Laya.EventDispatcher));
  6978. exports.default = ResourceManager;
  6979. },{"../configs/gameConfigs/RecConfigs":11,"../frameworks/Debuger":12,"../frameworks/events/EventUtils":16}],64:[function(require,module,exports){
  6980. "use strict";
  6981. Object.defineProperty(exports, "__esModule", { value: true });
  6982. var GameLayerManager_1 = require("./GameLayerManager");
  6983. var PathConfig_1 = require("../configs/gameConfigs/PathConfig");
  6984. var CamerasScript_1 = require("../gamemodule/modelScripts/CamerasScript");
  6985. var Scene3dObject_1 = require("../gamemodule/scene3ds/Scene3dObject");
  6986. var MainRoleScript_1 = require("../gamemodule/modelScripts/MainRoleScript");
  6987. var EventUtils_1 = require("../frameworks/events/EventUtils");
  6988. var GameEvent_1 = require("../gamemodule/userinfo/events/GameEvent");
  6989. var Debuger_1 = require("../frameworks/Debuger");
  6990. var UserInfoProxy_1 = require("../gamemodule/userinfo/UserInfoProxy");
  6991. var MVCObjectPool_1 = require("../frameworks/mvc/MVCObjectPool");
  6992. var GameUtils_1 = require("../utils/GameUtils");
  6993. var NpcCFG_1 = require("../configs/dataConfigs/NpcCFG");
  6994. var NpcScript_1 = require("../gamemodule/modelScripts/NpcScript");
  6995. var ResourceManager_1 = require("./ResourceManager");
  6996. var GameCFG_1 = require("../configs/dataConfigs/GameCFG");
  6997. var RoleActions_1 = require("../gamemodule/scene3ds/RoleActions");
  6998. var UserInfoEvent_1 = require("../gamemodule/userinfo/events/UserInfoEvent");
  6999. var RolesPool_1 = require("../gamemodule/scene3ds/RolesPool");
  7000. var Scene3DManager = /** @class */ (function () {
  7001. function Scene3DManager() {
  7002. this._initPosY = 1;
  7003. }
  7004. Scene3DManager.getInstance = function () {
  7005. if (!this._instance) {
  7006. this._instance = new Scene3DManager();
  7007. }
  7008. return this._instance;
  7009. };
  7010. Scene3DManager.prototype.initGame = function () {
  7011. var backgroundParent = GameLayerManager_1.GameLayerManager.getInstance().background.displayObject;
  7012. var scenebg = fairygui.UIPackage.createObject("main", "sky");
  7013. backgroundParent.addChild(scenebg.displayObject);
  7014. scenebg.setScale(2.5, 2.5);
  7015. scenebg.y = -200;
  7016. var scenebg1 = fairygui.UIPackage.createObject("main", "sky_down");
  7017. backgroundParent.addChild(scenebg1.displayObject);
  7018. scenebg1.setScale(2.5, 2.5);
  7019. scenebg1.y = scenebg.y + 740;
  7020. //添加3D场景
  7021. Scene3dObject_1.default.scene3D = backgroundParent.addChild(new Laya.Scene3D());
  7022. Scene3dObject_1.default.scene3D.physicsSimulation.continuousCollisionDetection = true;
  7023. //添加照相机
  7024. Scene3dObject_1.default.carma = (Scene3dObject_1.default.scene3D.addChild(new Laya.Camera(0, 0.1, 70)));
  7025. this.cameraScript = Scene3dObject_1.default.carma.addComponent(CamerasScript_1.default);
  7026. Scene3dObject_1.default.carma.clearFlag = Laya.BaseCamera.CLEARFLAG_DEPTHONLY;
  7027. //添加方向光
  7028. var directionLight = Laya.Loader.getRes(PathConfig_1.PathConfig.get3DModel("DirectionalLight")); //Scene3dObject.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
  7029. Scene3dObject_1.default.scene3D.addChild(directionLight);
  7030. // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
  7031. // var directionLight: Laya.DirectionLight = Scene3dObject.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
  7032. // directionLight.color = new Laya.Vector3(1,1,1);
  7033. // directionLight.intensity = 0.5;
  7034. // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
  7035. Scene3dObject_1.default.startPlane = Laya.Loader.getRes(PathConfig_1.PathConfig.get3DModel("startPlane"));
  7036. Scene3dObject_1.default.scene3D.addChild(Scene3dObject_1.default.startPlane);
  7037. Scene3dObject_1.default.endPlane = Laya.Loader.getRes(PathConfig_1.PathConfig.get3DModel("endPlane"));
  7038. Scene3dObject_1.default.scene3D.addChild(Scene3dObject_1.default.endPlane);
  7039. // Scene3dObject.bgsprite3d = Laya.Loader.getRes(PathConfig.get3DModel("distantview"));
  7040. // Scene3dObject.scene3D.addChild(Scene3dObject.bgsprite3d);
  7041. //雾化代码
  7042. Scene3dObject_1.default.scene3D.enableFog = true;
  7043. //设置雾化的颜色
  7044. var fogArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[2].value);
  7045. if (GameCFG_1.default.dict[8]) {
  7046. var wucolor = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[8].value);
  7047. Scene3dObject_1.default.scene3D.fogColor = new Laya.Vector3(Number(wucolor[0]), Number(wucolor[1]), Number(wucolor[2]));
  7048. }
  7049. else {
  7050. Scene3dObject_1.default.scene3D.fogColor = new Laya.Vector3(0, 0, 0.6);
  7051. }
  7052. //设置雾化的起始位置,相对于相机的距离
  7053. var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[3].value);
  7054. Scene3dObject_1.default.scene3D.fogStart = Number(valueArr[0]);
  7055. //设置雾化最浓处的距离。
  7056. Scene3dObject_1.default.scene3D.fogRange = Number(valueArr[1]);
  7057. this.showScene();
  7058. this.initEvent();
  7059. };
  7060. Scene3DManager.prototype.initLizi = function () {
  7061. };
  7062. Scene3DManager.prototype.showScene = function () {
  7063. var pathArr = [];
  7064. var urlArr = [];
  7065. this.cameraScript.iscanfollow = true;
  7066. var roleVO = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default).roleVO;
  7067. var arr = roleVO.levelmapArr;
  7068. var i = 0;
  7069. for (i = 0; i < arr.length; i++) {
  7070. if (urlArr.indexOf(PathConfig_1.PathConfig.get3DModel(arr[i])) == -1) {
  7071. urlArr.push(PathConfig_1.PathConfig.get3DModel(arr[i]));
  7072. }
  7073. }
  7074. var npcArr = roleVO.levelcfg.npc;
  7075. for (i = 0; i < npcArr.length; i++) {
  7076. if (urlArr.indexOf(PathConfig_1.PathConfig.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) {
  7077. urlArr.push(PathConfig_1.PathConfig.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name));
  7078. }
  7079. }
  7080. for (i = 0; i < urlArr.length; i++) {
  7081. pathArr.push({ url: urlArr[i] });
  7082. }
  7083. ResourceManager_1.default.getInstance().loader3DArr(pathArr, this, this.load3Dcomplete, null, true);
  7084. };
  7085. Scene3DManager.prototype.load3Dcomplete = function () {
  7086. this.updateMap();
  7087. this.createMainRole();
  7088. this.createNpc();
  7089. };
  7090. Scene3DManager.prototype.initEvent = function () {
  7091. EventUtils_1.EventUtils.addEventListener(GameEvent_1.default.startGame, this, this.startGameHandler);
  7092. EventUtils_1.EventUtils.addEventListener(GameEvent_1.default.jumpgame, this, this.jumphandler);
  7093. EventUtils_1.EventUtils.addEventListener(UserInfoEvent_1.default.userinfoEvent_updateroleid, this, this.updateroleModelHandler);
  7094. };
  7095. Scene3DManager.prototype.updateroleModelHandler = function () {
  7096. var userinfoProxy = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default);
  7097. var rolevo = userinfoProxy.roleVO;
  7098. var pathArr = [];
  7099. pathArr.push({ url: PathConfig_1.PathConfig.get3DRoleModel(rolevo.roleCfg.name) });
  7100. ResourceManager_1.default.getInstance().loader3DArr(pathArr, this, this.loadrolecomplete, null, true, PathConfig_1.PathConfig.get3DModel(rolevo.roleCfg.name));
  7101. };
  7102. Scene3DManager.prototype.loadrolecomplete = function (url) {
  7103. var userinfoProxy = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default);
  7104. var rolevo = userinfoProxy.roleVO;
  7105. if (PathConfig_1.PathConfig.get3DModel(rolevo.roleCfg.name) == url) {
  7106. this.createMainRole();
  7107. }
  7108. };
  7109. Scene3DManager.prototype.jumphandler = function () {
  7110. this.mainRoleScript.ceshitiaoyue();
  7111. };
  7112. Scene3DManager.prototype.startGameHandler = function () {
  7113. this.mainRoleScript.startRun();
  7114. var npcdict = Scene3dObject_1.default.npcscriptDict;
  7115. for (var s in npcdict) {
  7116. var npcscript = npcdict[s];
  7117. npcscript.startRun();
  7118. }
  7119. };
  7120. Scene3DManager.prototype.removeNowRole = function () {
  7121. if (Scene3dObject_1.default.mainRole && this.mainRoleScript) {
  7122. RolesPool_1.default.removeRole(Scene3dObject_1.default.mainRole, this.mainRoleScript.resouseName, this.mainRoleScript);
  7123. this.mainRoleScript = null;
  7124. Scene3dObject_1.default.mainRole = null;
  7125. }
  7126. };
  7127. //创建主角
  7128. Scene3DManager.prototype.createMainRole = function () {
  7129. var userinfoProxy = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default);
  7130. var rolevo = userinfoProxy.roleVO;
  7131. var iscreate = false;
  7132. if (!Scene3dObject_1.default.mainRole) {
  7133. iscreate = true;
  7134. }
  7135. else if (Scene3dObject_1.default.mainRole.name != "role_" + rolevo.roleCfg.name) {
  7136. iscreate = true;
  7137. this.removeNowRole();
  7138. }
  7139. if (iscreate) {
  7140. // var sp:Laya.Sprite3D = Laya.Loader.getRes(PathConfig.get3DRoleModel(rolevo.roleCfg.name)) as Laya.Sprite3D;
  7141. // Scene3dObject.mainRole = Laya.Sprite3D.instantiate(sp, Scene3dObject.scene3D, false,new Laya.Vector3( 0,0,0 )) as Laya.Sprite3D;
  7142. Scene3dObject_1.default.mainRole = RolesPool_1.default.addRoleByName(rolevo.roleCfg.name, MainRoleScript_1.default, Scene3dObject_1.default.scene3D);
  7143. Scene3dObject_1.default.mainRole.name = "role_" + rolevo.roleCfg.name;
  7144. this.mainRoleScript = Scene3dObject_1.default.mainRole.getComponent(MainRoleScript_1.default);
  7145. // this.mainRoleScript.resouseName = rolevo.roleCfg.name;
  7146. // if( )
  7147. // this.mainRoleScript = Scene3dObject.mainRole.addComponent( MainRAoleScript );
  7148. }
  7149. var info = rolevo.levelcfg.roleinitpos;
  7150. var chidarr = GameUtils_1.GameUtils.cutstrtoArr(info.offsetPos);
  7151. var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2]));
  7152. var posVec = new Laya.Vector3;
  7153. var selectVec;
  7154. if (info.initbuild == "startPlane") {
  7155. posVec.x = Scene3dObject_1.default.startPlane.transform.position.x + offsetPos.x;
  7156. posVec.y = Scene3dObject_1.default.startPlane.transform.position.y + offsetPos.y;
  7157. posVec.z = Scene3dObject_1.default.startPlane.transform.position.z + offsetPos.z;
  7158. selectVec = Scene3dObject_1.default.startPlane.getChildByName("child_pos").transform.position;
  7159. }
  7160. else {
  7161. var childpos = Scene3dObject_1.default.getPosVecbyScene(rolevo.levelmapArr[0], info.initbuild);
  7162. posVec.x = childpos.x + offsetPos.x;
  7163. posVec.y = childpos.y + offsetPos.y;
  7164. posVec.z = childpos.z + offsetPos.z;
  7165. selectVec = childpos;
  7166. }
  7167. Scene3dObject_1.default.mainRole.transform.position = posVec;
  7168. this.cameraScript.initPos(Scene3dObject_1.default.mainRole.transform.position);
  7169. this.mainRoleScript.setnowSelectVec(selectVec);
  7170. this.mainRoleScript.nowState = RoleActions_1.default.stand;
  7171. this.mainRoleScript.setAction(RoleActions_1.default.stand);
  7172. };
  7173. Scene3DManager.prototype.removeAllNpc = function () {
  7174. var npcdict = Scene3dObject_1.default.npcDict;
  7175. var s;
  7176. for (s in npcdict) {
  7177. var sp = npcdict[s];
  7178. var npcscript = Scene3dObject_1.default.npcscriptDict[s];
  7179. var resousename = npcscript.resouseName;
  7180. RolesPool_1.default.removeRole(sp, resousename, npcscript);
  7181. delete Scene3dObject_1.default.npcscriptDict[s];
  7182. delete npcdict[s];
  7183. }
  7184. };
  7185. //创建npc
  7186. Scene3DManager.prototype.createNpc = function () {
  7187. this.removeAllNpc();
  7188. var userinfoProxy = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default);
  7189. var rolevo = userinfoProxy.roleVO;
  7190. var arr = rolevo.levelcfg.npc;
  7191. var childdict;
  7192. var index = 0;
  7193. Scene3dObject_1.default.npcnum = arr.length;
  7194. for (var s in arr) {
  7195. childdict = arr[s];
  7196. var selectVec = null;
  7197. var npccfg = NpcCFG_1.default.dict[childdict.id];
  7198. var sp = Laya.Loader.getRes(PathConfig_1.PathConfig.get3DRoleModel(npccfg.name));
  7199. var chidarr = GameUtils_1.GameUtils.cutstrtoArr(childdict.offsetPos);
  7200. var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2]));
  7201. var posVec = new Laya.Vector3;
  7202. if (childdict.scene == "startPlane") {
  7203. posVec.x = Scene3dObject_1.default.startPlane.transform.position.x + offsetPos.x;
  7204. posVec.y = Scene3dObject_1.default.startPlane.transform.position.y + 1 + offsetPos.y;
  7205. posVec.z = Scene3dObject_1.default.startPlane.transform.position.z + offsetPos.z;
  7206. selectVec = Scene3dObject_1.default.startPlane.getChildByName("child_pos").transform.position;
  7207. }
  7208. else {
  7209. var childpos = Scene3dObject_1.default.getPosVecbyScene(childdict.scene, childdict.initbuild);
  7210. posVec.x = childpos.x + offsetPos.x;
  7211. posVec.y = childpos.y + offsetPos.y;
  7212. posVec.z = childpos.z + offsetPos.z;
  7213. selectVec = childpos;
  7214. }
  7215. var npcsp = RolesPool_1.default.addRoleByName(npccfg.name, NpcScript_1.default, Scene3dObject_1.default.scene3D);
  7216. npcsp.name = "npc_" + index;
  7217. npcsp.transform.position = posVec;
  7218. var npcscript = npcsp.getComponent(NpcScript_1.default);
  7219. npcscript.setnowSelectVec(selectVec);
  7220. npcscript.setnpcCFG(npccfg);
  7221. Scene3dObject_1.default.npcDict[npcsp.name] = npcsp;
  7222. Scene3dObject_1.default.npcscriptDict[npcsp.name] = npcscript;
  7223. npcscript.setAction(RoleActions_1.default.stand);
  7224. index++;
  7225. }
  7226. };
  7227. Scene3DManager.prototype.updateMap = function () {
  7228. var userinfoProxy = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default);
  7229. var rolevo = userinfoProxy.roleVO;
  7230. var nowlevelcfg = rolevo.levelcfg;
  7231. var mapArr = rolevo.levelmapArr;
  7232. var mapSprite3D;
  7233. var mapname;
  7234. var _lastmapSprite3D;
  7235. for (var s in Scene3dObject_1.default.nowmapDict) {
  7236. Scene3dObject_1.default.nowmapDict[s].active = false;
  7237. }
  7238. for (var i = 0; i < mapArr.length; i++) {
  7239. mapname = mapArr[i];
  7240. if (Scene3dObject_1.default.nowmapDict[mapname]) {
  7241. mapSprite3D = Scene3dObject_1.default.nowmapDict[mapname];
  7242. mapSprite3D.active = true;
  7243. }
  7244. else {
  7245. var sp = Laya.Loader.getRes(PathConfig_1.PathConfig.get3DModel(mapname));
  7246. mapSprite3D = Laya.Sprite3D.instantiate(sp, Scene3dObject_1.default.scene3D, false, null);
  7247. Scene3dObject_1.default.nowmapDict[mapname] = mapSprite3D;
  7248. }
  7249. if (i == 0) {
  7250. var arr = GameUtils_1.GameUtils.cutstrtoArr(nowlevelcfg.firstScenepos);
  7251. mapSprite3D.transform.position = new Laya.Vector3(Number(arr[0]), Number(arr[1]), Number(arr[2]));
  7252. }
  7253. else {
  7254. var endPos = _lastmapSprite3D.getChildByName("END").transform.position.clone();
  7255. endPos.x = 0;
  7256. endPos.y = 0;
  7257. mapSprite3D.transform.position = endPos;
  7258. }
  7259. this.addPatternChildPos(mapSprite3D);
  7260. _lastmapSprite3D = mapSprite3D;
  7261. var endPos1 = mapSprite3D.getChildByName("END").transform.position.clone();
  7262. endPos1.z += Number(GameCFG_1.default.dict[6].value);
  7263. Scene3dObject_1.default.endPlane.transform.position = endPos1;
  7264. Scene3dObject_1.default.gamewinPosZ = endPos1.z;
  7265. Scene3dObject_1.default.gamewinPosZ -= 2;
  7266. // Scene3dObject.bgsprite3d.transform.position = new Laya.Vector3( 0,-20,-40 );
  7267. }
  7268. };
  7269. Scene3DManager.prototype.addPatternChildPos = function (mapSprite3D) {
  7270. if (Scene3dObject_1.default.patternDict[mapSprite3D.name]) {
  7271. delete Scene3dObject_1.default.patternDict[mapSprite3D.name];
  7272. }
  7273. Debuger_1.default.log("绑定MapPatternPos");
  7274. var BlocksSprite = mapSprite3D.getChildByName("Blocks");
  7275. var chiddict = {};
  7276. var chidsp;
  7277. var buildSp;
  7278. var index = 0;
  7279. while (BlocksSprite.getChildByName("build_all_" + index)) {
  7280. buildSp = BlocksSprite.getChildByName("build_all_" + index);
  7281. chidsp = buildSp.getChildByName("child_pos");
  7282. chiddict["build_all_" + index] = chidsp.transform.position;
  7283. if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) {
  7284. Scene3dObject_1.default.diePosY = buildSp.transform.position.y;
  7285. }
  7286. index++;
  7287. }
  7288. index = 0;
  7289. while (BlocksSprite.getChildByName("build_front_" + index)) {
  7290. buildSp = BlocksSprite.getChildByName("build_front_" + index);
  7291. chidsp = buildSp.getChildByName("child_pos");
  7292. chiddict["build_front_" + index] = chidsp.transform.position;
  7293. if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) {
  7294. Scene3dObject_1.default.diePosY = buildSp.transform.position.y;
  7295. }
  7296. index++;
  7297. }
  7298. index = 0;
  7299. while (BlocksSprite.getChildByName("build_left_" + index)) {
  7300. buildSp = BlocksSprite.getChildByName("build_left_" + index);
  7301. chidsp = buildSp.getChildByName("child_pos");
  7302. chiddict["build_left_" + index] = chidsp.transform.position;
  7303. if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) {
  7304. Scene3dObject_1.default.diePosY = buildSp.transform.position.y;
  7305. }
  7306. index++;
  7307. }
  7308. index = 0;
  7309. while (BlocksSprite.getChildByName("build_right_" + index)) {
  7310. buildSp = BlocksSprite.getChildByName("build_right_" + index);
  7311. chidsp = buildSp.getChildByName("child_pos");
  7312. chiddict["build_right_" + index] = chidsp.transform.position;
  7313. if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) {
  7314. Scene3dObject_1.default.diePosY = buildSp.transform.position.y;
  7315. }
  7316. index++;
  7317. }
  7318. index = 0;
  7319. while (BlocksSprite.getChildByName("build_frontleft_" + index)) {
  7320. buildSp = BlocksSprite.getChildByName("build_frontleft_" + index);
  7321. chidsp = buildSp.getChildByName("child_pos");
  7322. chiddict["build_frontleft_" + index] = chidsp.transform.position;
  7323. if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) {
  7324. Scene3dObject_1.default.diePosY = buildSp.transform.position.y;
  7325. }
  7326. index++;
  7327. }
  7328. index = 0;
  7329. while (BlocksSprite.getChildByName("build_frontright_" + index)) {
  7330. buildSp = BlocksSprite.getChildByName("build_frontright_" + index);
  7331. chidsp = buildSp.getChildByName("child_pos");
  7332. chiddict["build_frontright_" + index] = chidsp.transform.position;
  7333. if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) {
  7334. Scene3dObject_1.default.diePosY = buildSp.transform.position.y;
  7335. }
  7336. index++;
  7337. }
  7338. index = 0;
  7339. while (BlocksSprite.getChildByName("build_leftright_" + index)) {
  7340. buildSp = BlocksSprite.getChildByName("build_leftright_" + index);
  7341. chidsp = buildSp.getChildByName("child_pos");
  7342. chiddict["build_leftright_" + index] = chidsp.transform.position;
  7343. if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) {
  7344. Scene3dObject_1.default.diePosY = buildSp.transform.position.y;
  7345. }
  7346. index++;
  7347. }
  7348. index = 0;
  7349. var Props = mapSprite3D.getChildByName("Props");
  7350. while (Props.getChildByName("Scaffolding_" + index)) {
  7351. chidsp = Props.getChildByName("Scaffolding_" + index).getChildByName("child_pos");
  7352. chiddict["Scaffolding_" + index] = chidsp.transform.position;
  7353. index++;
  7354. }
  7355. index = 0;
  7356. while (Props.getChildByName("grilling_" + index)) {
  7357. chidsp = Props.getChildByName("grilling_" + index).getChildByName("child_pos");
  7358. chiddict["grilling_" + index] = chidsp.transform.position;
  7359. index++;
  7360. }
  7361. Scene3dObject_1.default.patternDict[mapSprite3D.name] = chiddict;
  7362. };
  7363. return Scene3DManager;
  7364. }());
  7365. exports.default = Scene3DManager;
  7366. },{"../configs/dataConfigs/GameCFG":6,"../configs/dataConfigs/NpcCFG":8,"../configs/gameConfigs/PathConfig":10,"../frameworks/Debuger":12,"../frameworks/events/EventUtils":16,"../frameworks/mvc/MVCObjectPool":22,"../gamemodule/modelScripts/CamerasScript":42,"../gamemodule/modelScripts/MainRoleScript":43,"../gamemodule/modelScripts/NpcScript":44,"../gamemodule/scene3ds/RoleActions":46,"../gamemodule/scene3ds/RolesPool":47,"../gamemodule/scene3ds/Scene3dObject":48,"../gamemodule/userinfo/UserInfoProxy":53,"../gamemodule/userinfo/events/GameEvent":54,"../gamemodule/userinfo/events/UserInfoEvent":56,"../utils/GameUtils":87,"./GameLayerManager":61,"./ResourceManager":63}],65:[function(require,module,exports){
  7367. "use strict";
  7368. Object.defineProperty(exports, "__esModule", { value: true });
  7369. var PathConfig_1 = require("../configs/gameConfigs/PathConfig");
  7370. var Debuger_1 = require("../frameworks/Debuger");
  7371. /*
  7372. * name;
  7373. */
  7374. var SoundssManager = /** @class */ (function (_super) {
  7375. __extends(SoundssManager, _super);
  7376. function SoundssManager() {
  7377. var _this = _super.call(this) || this;
  7378. _this._isbgOpen = true;
  7379. _this._gamesoundOpen = true;
  7380. _this._isAllOpen = true;
  7381. _this._nowBgName = "";
  7382. _this._isPlaybging = false;
  7383. /**
  7384. * 声音开关引用索引
  7385. */
  7386. _this._soundIndex = 0;
  7387. return _this;
  7388. }
  7389. SoundssManager.getInstance = function () {
  7390. if (!this._instance) {
  7391. this._instance = new SoundssManager();
  7392. }
  7393. return this._instance;
  7394. };
  7395. SoundssManager.prototype.init = function () {
  7396. Laya.SoundManager.autoReleaseSound = false;
  7397. Laya.SoundManager.autoStopMusic = true;
  7398. };
  7399. Object.defineProperty(SoundssManager.prototype, "gamesoundOpen", {
  7400. /**
  7401. * 音效是否开启
  7402. */
  7403. get: function () {
  7404. return this._gamesoundOpen;
  7405. },
  7406. set: function (value) {
  7407. this._gamesoundOpen = value;
  7408. Laya.SoundManager.soundMuted = !value;
  7409. if (value == true) {
  7410. fairygui.UIConfig.buttonSoundVolumeScale = 1;
  7411. }
  7412. else {
  7413. fairygui.UIConfig.buttonSoundVolumeScale = 0;
  7414. }
  7415. },
  7416. enumerable: true,
  7417. configurable: true
  7418. });
  7419. Object.defineProperty(SoundssManager.prototype, "isbgOpen", {
  7420. /**
  7421. * 背景音乐是否开启
  7422. */
  7423. get: function () {
  7424. return this._isbgOpen;
  7425. },
  7426. set: function (value) {
  7427. this._isbgOpen = value;
  7428. Laya.SoundManager.musicMuted = !value;
  7429. },
  7430. enumerable: true,
  7431. configurable: true
  7432. });
  7433. Object.defineProperty(SoundssManager.prototype, "isAllOpen", {
  7434. /**
  7435. * 所有音乐是否开启
  7436. */
  7437. get: function () {
  7438. return this._isAllOpen;
  7439. },
  7440. set: function (value) {
  7441. if (value) {
  7442. this._soundIndex--;
  7443. if (this._soundIndex < 0) {
  7444. this._soundIndex = 0;
  7445. }
  7446. if (!this._isPlaybging && this._soundIndex == 0) {
  7447. this._isAllOpen = true;
  7448. this.setGameVolume(1);
  7449. this.playbgSound(this._nowBgName);
  7450. fairygui.UIConfig.buttonSoundVolumeScale = 1;
  7451. }
  7452. else {
  7453. this._isAllOpen = false;
  7454. }
  7455. }
  7456. else {
  7457. this._isAllOpen = false;
  7458. if (this._soundIndex < 0) {
  7459. this._soundIndex = 0;
  7460. }
  7461. this._soundIndex++;
  7462. if (this._isPlaybging) {
  7463. this.stopbgSound();
  7464. }
  7465. this.setGameVolume(0);
  7466. fairygui.UIConfig.buttonSoundVolumeScale = 0;
  7467. }
  7468. },
  7469. enumerable: true,
  7470. configurable: true
  7471. });
  7472. Object.defineProperty(SoundssManager.prototype, "bgSoundVolume", {
  7473. get: function () {
  7474. return Laya.SoundManager.musicVolume;
  7475. },
  7476. /**
  7477. * 设置背景音乐音量
  7478. * @param value 音量范围从 0(静音)至 1(最大音量)。
  7479. */
  7480. set: function (value) {
  7481. Laya.SoundManager.setMusicVolume(value);
  7482. },
  7483. enumerable: true,
  7484. configurable: true
  7485. });
  7486. Object.defineProperty(SoundssManager.prototype, "soundVolume", {
  7487. get: function () {
  7488. return Laya.SoundManager.soundVolume;
  7489. },
  7490. /**
  7491. * 设置背景音乐音量
  7492. * @param value 音量范围从 0(静音)至 1(最大音量)。
  7493. */
  7494. set: function (value) {
  7495. Laya.SoundManager.setSoundVolume(value);
  7496. },
  7497. enumerable: true,
  7498. configurable: true
  7499. });
  7500. /**
  7501. * 设置所有声音音量
  7502. * @param value 音量范围从 0(静音)至 1(最大音量)。
  7503. */
  7504. SoundssManager.prototype.setGameVolume = function (value) {
  7505. this.bgSoundVolume = value;
  7506. this.soundVolume = value;
  7507. };
  7508. /**
  7509. * 播放背景音乐
  7510. * @param soundName 声音名
  7511. */
  7512. SoundssManager.prototype.playbgSound = function (soundName) {
  7513. this._nowBgName = soundName;
  7514. if (this._isAllOpen && this._nowBgName != "" && this._soundIndex <= 0 && !this._isPlaybging) {
  7515. this._isPlaybging = true;
  7516. Debuger_1.default.log("playbgSound", PathConfig_1.PathConfig.getsound(this._nowBgName));
  7517. Laya.SoundManager.playMusic(PathConfig_1.PathConfig.getsound(this._nowBgName));
  7518. this.bgSoundVolume = 0.4;
  7519. }
  7520. };
  7521. /**
  7522. * 停止背景音乐
  7523. */
  7524. SoundssManager.prototype.stopbgSound = function () {
  7525. this._isPlaybging = false;
  7526. Laya.SoundManager.stopMusic();
  7527. };
  7528. /**
  7529. * 播放音效
  7530. * @param soundName 音效名
  7531. * @param loop 播放次数
  7532. */
  7533. SoundssManager.prototype.playGameSound = function (soundName, loop) {
  7534. if (loop === void 0) { loop = 1; }
  7535. if (this._isAllOpen && soundName != "" && Laya.SoundManager.soundVolume != 0) {
  7536. Laya.SoundManager.playSound(PathConfig_1.PathConfig.getsound(soundName), loop);
  7537. }
  7538. };
  7539. /**
  7540. * 停止播放音效
  7541. */
  7542. SoundssManager.prototype.stopGameSound = function () {
  7543. Laya.SoundManager.stopAllSound();
  7544. };
  7545. /**
  7546. * 停止所有声音
  7547. */
  7548. SoundssManager.prototype.stopAll = function () {
  7549. this.stopGameSound();
  7550. this.stopbgSound();
  7551. };
  7552. return SoundssManager;
  7553. }(Laya.EventDispatcher));
  7554. exports.default = SoundssManager;
  7555. },{"../configs/gameConfigs/PathConfig":10,"../frameworks/Debuger":12}],66:[function(require,module,exports){
  7556. "use strict";
  7557. Object.defineProperty(exports, "__esModule", { value: true });
  7558. var LayerNotify_1 = require("../frameworks/notification/LayerNotify");
  7559. var GameLayerManager_1 = require("./GameLayerManager");
  7560. /**
  7561. *
  7562. * @author
  7563. *
  7564. */
  7565. var UiManager = /** @class */ (function (_super) {
  7566. __extends(UiManager, _super);
  7567. function UiManager() {
  7568. return _super.call(this) || this;
  7569. }
  7570. UiManager.getInstance = function () {
  7571. if (!this.instance) {
  7572. this.instance = new UiManager();
  7573. }
  7574. return this.instance;
  7575. };
  7576. UiManager.prototype.init = function () {
  7577. this._views = {};
  7578. this.initEvent();
  7579. };
  7580. UiManager.prototype.initEvent = function () {
  7581. };
  7582. /**
  7583. * view 视图对象类
  7584. * data 绑定数据 ( data 如果不为空,代表构造函数传参 )
  7585. * layer 层级
  7586. */
  7587. UiManager.prototype.add = function (view, data, layer) {
  7588. if (data === void 0) { data = null; }
  7589. if (layer === void 0) { layer = LayerNotify_1.LayerNotify.LAYER_UILAYER; }
  7590. if (view.key == null) {
  7591. throw new Error("view have no key");
  7592. }
  7593. var type = view.key;
  7594. if (this._views[type]) {
  7595. var itemview = this._views[type];
  7596. return itemview;
  7597. }
  7598. var d;
  7599. if (data != null) {
  7600. d = new view(data);
  7601. }
  7602. else {
  7603. d = new view();
  7604. }
  7605. d.viewKey = view;
  7606. d.gameLayer = layer;
  7607. GameLayerManager_1.GameLayerManager.getInstance().addtoLayer(d, layer);
  7608. this._views[type] = d;
  7609. return d;
  7610. };
  7611. /**
  7612. * 关闭界面
  7613. * @param view 界面
  7614. * @param isbgclose 是否是点击背景关闭的状态
  7615. * @param isplayAnmo 是否播放关闭动画( 主要用于强制关闭 )
  7616. */
  7617. UiManager.prototype.close = function (view, isbgclose, isplayAnmo) {
  7618. if (isbgclose === void 0) { isbgclose = false; }
  7619. if (isplayAnmo === void 0) { isplayAnmo = true; }
  7620. var type = view.key;
  7621. var item = this._views[type];
  7622. if (!item) {
  7623. return;
  7624. }
  7625. GameLayerManager_1.GameLayerManager.getInstance().removeformLayer(item.gameLayer);
  7626. if (isplayAnmo) {
  7627. item.onCloseView();
  7628. }
  7629. else {
  7630. item.destory();
  7631. }
  7632. delete this._views[type];
  7633. };
  7634. UiManager.prototype.onresize = function (w, h) {
  7635. if (this._views != null) {
  7636. var itemview;
  7637. for (var item in this._views) {
  7638. itemview = this._views[item];
  7639. itemview.setSize(w, h);
  7640. }
  7641. }
  7642. };
  7643. UiManager.prototype.getView = function (view) {
  7644. var type = view.key;
  7645. return this._views[type];
  7646. };
  7647. return UiManager;
  7648. }(Laya.EventDispatcher));
  7649. exports.UiManager = UiManager;
  7650. },{"../frameworks/notification/LayerNotify":29,"./GameLayerManager":61}],67:[function(require,module,exports){
  7651. "use strict";
  7652. Object.defineProperty(exports, "__esModule", { value: true });
  7653. var WXGamePlatform_1 = require("./wxminigame/WXGamePlatform");
  7654. var PlatfromType_1 = require("./PlatfromType");
  7655. var PlatformEvent_1 = require("./events/PlatformEvent");
  7656. var Global_1 = require("../Global");
  7657. var Debuger_1 = require("../frameworks/Debuger");
  7658. var EventUtils_1 = require("../frameworks/events/EventUtils");
  7659. var TimesTamper_1 = require("../frameworks/TimesTamper");
  7660. var DayManager_1 = require("../managers/DayManager");
  7661. var SoundssManager_1 = require("../managers/SoundssManager");
  7662. /*
  7663. * name;
  7664. */
  7665. var PlatformTool = /** @class */ (function () {
  7666. function PlatformTool() {
  7667. this._isenable = false;
  7668. }
  7669. PlatformTool.getInstance = function () {
  7670. if (!this._instance) {
  7671. this._instance = new PlatformTool();
  7672. }
  7673. return this._instance;
  7674. };
  7675. /**
  7676. * 初始化平台
  7677. */
  7678. PlatformTool.prototype.initPlatfrom = function () {
  7679. if (Laya.Browser.window.tt) {
  7680. Global_1.Global.nowplatfrom = PlatfromType_1.default.tt;
  7681. }
  7682. else if (Laya.Browser.window.wx) //微信小游戏
  7683. {
  7684. Global_1.Global.nowplatfrom = PlatfromType_1.default.wx;
  7685. }
  7686. else {
  7687. Global_1.Global.nowplatfrom = PlatfromType_1.default.pc;
  7688. }
  7689. };
  7690. PlatformTool.prototype.init = function () {
  7691. this.initPlatfrom();
  7692. Debuger_1.default.log(Global_1.Global.nowplatfrom + "平台初始化");
  7693. // switch( Global.nowplatfrom )
  7694. // {
  7695. // case PlatfromType.wx:
  7696. // WXGamePlatform.getInstance().init();
  7697. // break;
  7698. // case PlatfromType.qq:
  7699. // break;
  7700. // default:
  7701. // break;
  7702. // }
  7703. // this.onShow( this,this.showcallback );
  7704. // this.onHide(this,this.hidecallback);
  7705. };
  7706. PlatformTool.prototype.initData = function () {
  7707. DayManager_1.default.getInstance().init();
  7708. switch (Global_1.Global.nowplatfrom) {
  7709. case PlatfromType_1.default.wx:
  7710. WXGamePlatform_1.default.getInstance().initData();
  7711. break;
  7712. default:
  7713. break;
  7714. }
  7715. };
  7716. /**
  7717. * 合违规判断 true:合规,false:违规
  7718. */
  7719. PlatformTool.checkEnable = function () {
  7720. if (PlatformTool.islegal == 1) {
  7721. return true;
  7722. }
  7723. return false;
  7724. };
  7725. PlatformTool.prototype.login = function (callobj, succeedcallback, progressCallback, failcallback) {
  7726. if (callobj === void 0) { callobj = null; }
  7727. if (succeedcallback === void 0) { succeedcallback = null; }
  7728. if (progressCallback === void 0) { progressCallback = null; }
  7729. if (failcallback === void 0) { failcallback = null; }
  7730. fairygui.GRoot.inst.showModalWait();
  7731. this._logincallobj = callobj;
  7732. this._loginsucceedcallback = succeedcallback;
  7733. switch (Global_1.Global.nowplatfrom) {
  7734. case PlatfromType_1.default.wx:
  7735. WXGamePlatform_1.default.getInstance().createUserAndLogin(this, this.loginSucceed, this.loginprogressCallback, this.loginfailcallback);
  7736. break;
  7737. default:
  7738. this.loginSucceed(null);
  7739. break;
  7740. }
  7741. };
  7742. PlatformTool.prototype.loginprogressCallback = function (value) {
  7743. };
  7744. PlatformTool.prototype.loginSucceed = function (data) {
  7745. fairygui.GRoot.inst.closeModalWait();
  7746. // Debuger.log( "loginSucceed",data );
  7747. // switch( Global.nowplatfrom )
  7748. // {
  7749. // case PlatfromType.wx:
  7750. // var nowtime:number = data.NowTime;
  7751. // TimesTamper.getInstance().updateServiceTime(nowtime);
  7752. // PlatformTool.islegal = Number(data.Version);
  7753. // var Member:any = data.Member;
  7754. // var AppInfo:any = data.AppInfo;
  7755. // var Client2:any = AppInfo.Client2;
  7756. // Global.AppKeyID = Member.AppKeyID;
  7757. // Global.MemberID = Member.MemberID;
  7758. // WXGamePlatform.VideoTime = Number(Client2.VideoTime);
  7759. // WXGamePlatform.VideoNum = Number(Client2.VideoNum);
  7760. // WXGamePlatform.ShareTime = Number(Client2.ShareTime);
  7761. // WXGamePlatform.jiliweitime = Number( Client2.ShareTime );
  7762. // WXGamePlatform.SharetoVideo = Number( Client2.SharetoVideo );
  7763. // WXGamePlatform.VideotoShare = Number( Client2.VideotoShare );
  7764. // WXGamePlatform.getInstance().initShareDian( Client2.Share );
  7765. // EventUtils.dispatchEvent( CPAEvent.CPAEvent_initCPAData,data );
  7766. // break;
  7767. // default:
  7768. // TimesTamper.getInstance().updateServiceTime(Laya.Browser.now()/1000);
  7769. // var datas:any = JSON.parse('{"ACTION":9891001,"ACTIONCOM":0,"JSDATA":{"AppInfo":{"Client":[{"ID":"1","IsShow":true,"Param1":"30","Param2":""},{"ID":"2","IsShow":true,"Param1":"30","Param2":""},{"ID":"3","IsShow":true,"Param1":"30","Param2":""},{"ID":"4","IsShow":true,"Param1":"30","Param2":""},{"ID":"5","IsShow":true,"Param1":"30","Param2":""},{"ID":"6","IsShow":true,"Param1":"30","Param2":""},{"ID":"7","IsShow":true,"Param1":"30","Param2":""},{"ID":"8","IsShow":true,"Param1":"30","Param2":""}],"Client2":{"VideoTime":10,"VideoNum":"10","ShareTime":4,"Share":[{"key":"fuhuo","img":"bingduweiji/fuhuofx.png","tile":"来帮助我消灭病毒吧!"}],"jiliweitime":"600","VideotoShare":"1","SharetoVideo":"1"},"ReNum":100,"ReTime":259200},"Member":{"AppKeyID":3,"MemberID":100001,"UserName":""},"NowTime":1572251558,"Version":""}}');
  7770. // EventUtils.dispatchEvent( CPAEvent.CPAEvent_initCPAData,datas.JSDATA );
  7771. // break;
  7772. // }
  7773. // this.initData();
  7774. if (this._logincallobj && this._loginsucceedcallback) {
  7775. this._loginsucceedcallback.call(this._logincallobj);
  7776. }
  7777. else {
  7778. EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_loginSucceed);
  7779. }
  7780. };
  7781. PlatformTool.prototype.loginfailcallback = function () {
  7782. };
  7783. PlatformTool.prototype.onShow = function (callobj, succeedcallback, failCallback) {
  7784. if (callobj === void 0) { callobj = null; }
  7785. if (succeedcallback === void 0) { succeedcallback = null; }
  7786. if (failCallback === void 0) { failCallback = null; }
  7787. switch (Global_1.Global.nowplatfrom) {
  7788. case PlatfromType_1.default.wx:
  7789. WXGamePlatform_1.default.getInstance().onShow(callobj, succeedcallback, failCallback);
  7790. break;
  7791. case PlatfromType_1.default.qq:
  7792. break;
  7793. }
  7794. };
  7795. PlatformTool.prototype.showcallback = function () {
  7796. Laya.timer.clear(this, this.againplaybgSound);
  7797. Laya.timer.once(500, this, this.againplaybgSound);
  7798. EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_onshow);
  7799. EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_getfocus);
  7800. var fromscene = PlatformTool.fromscene();
  7801. if (fromscene == 1089 || fromscene == 1131) {
  7802. EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_fromscorfk);
  7803. }
  7804. };
  7805. PlatformTool.prototype.againplaybgSound = function () {
  7806. EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_onAudioInterruptionEnd);
  7807. };
  7808. PlatformTool.prototype.onHide = function (callobj, succeedcallback) {
  7809. if (callobj === void 0) { callobj = null; }
  7810. if (succeedcallback === void 0) { succeedcallback = null; }
  7811. switch (Global_1.Global.nowplatfrom) {
  7812. case PlatfromType_1.default.wx:
  7813. WXGamePlatform_1.default.getInstance().onHide(callobj, succeedcallback);
  7814. break;
  7815. case PlatfromType_1.default.qq:
  7816. break;
  7817. }
  7818. };
  7819. PlatformTool.prototype.hidecallback = function () {
  7820. TimesTamper_1.TimesTamper.getInstance().sendonlineTongji();
  7821. SoundssManager_1.default.getInstance().stopAll();
  7822. EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_onhide);
  7823. EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_losefocus);
  7824. };
  7825. Object.defineProperty(PlatformTool.prototype, "isshow", {
  7826. /**
  7827. * 当前游戏是否在显示中
  7828. */
  7829. get: function () {
  7830. var bo = true;
  7831. switch (Global_1.Global.nowplatfrom) {
  7832. case PlatfromType_1.default.wx:
  7833. if (WXGamePlatform_1.default.isShowing) {
  7834. bo = true;
  7835. }
  7836. bo = false;
  7837. break;
  7838. }
  7839. return bo;
  7840. },
  7841. enumerable: true,
  7842. configurable: true
  7843. });
  7844. /**
  7845. * 分包加载
  7846. */
  7847. PlatformTool.prototype.loadSubpackage = function (typename, callobj, callback, callprogress, failcallback) {
  7848. if (failcallback === void 0) { failcallback = null; }
  7849. switch (Global_1.Global.nowplatfrom) {
  7850. case PlatfromType_1.default.wx:
  7851. WXGamePlatform_1.default.getInstance().loadSubpackage(typename, callobj, callback, callprogress, failcallback);
  7852. break;
  7853. default:
  7854. if (callobj && callback) {
  7855. callback.call(callobj);
  7856. }
  7857. break;
  7858. }
  7859. };
  7860. /**
  7861. * 获取是否已经授权
  7862. * @param callobj
  7863. * @param callback
  7864. */
  7865. PlatformTool.prototype.isaccredit = function (callobj, accreditCallback) {
  7866. switch (Global_1.Global.nowplatfrom) {
  7867. case PlatfromType_1.default.wx:
  7868. WXGamePlatform_1.default.getInstance().getaccredit(callobj, accreditCallback);
  7869. break;
  7870. case PlatfromType_1.default.qq:
  7871. WXGamePlatform_1.default.getInstance().getaccredit(callobj, accreditCallback);
  7872. break;
  7873. default:
  7874. if (accreditCallback && callobj) {
  7875. accreditCallback.call(callobj, true);
  7876. }
  7877. break;
  7878. }
  7879. };
  7880. /**
  7881. * 拿角色信息授权
  7882. */
  7883. PlatformTool.prototype.createaccredit = function (callobj, callback, failcallback) {
  7884. switch (Global_1.Global.nowplatfrom) {
  7885. case PlatfromType_1.default.wx:
  7886. WXGamePlatform_1.default.getInstance().createUserInfoButton(callobj, callback, failcallback);
  7887. break;
  7888. }
  7889. };
  7890. PlatformTool.prototype.closeuserinfoButton = function () {
  7891. switch (Global_1.Global.nowplatfrom) {
  7892. case PlatfromType_1.default.wx:
  7893. WXGamePlatform_1.default.getInstance().closeuserinfobUtton();
  7894. break;
  7895. }
  7896. };
  7897. /**
  7898. * 退出游戏
  7899. */
  7900. PlatformTool.prototype.exitGame = function () {
  7901. switch (Global_1.Global.nowplatfrom) {
  7902. case PlatfromType_1.default.wx:
  7903. WXGamePlatform_1.default.getInstance().exitGame();
  7904. break;
  7905. }
  7906. };
  7907. /**
  7908. * 打开客服对话框
  7909. */
  7910. PlatformTool.prototype.openCustomerService = function () {
  7911. switch (Global_1.Global.nowplatfrom) {
  7912. case PlatfromType_1.default.wx:
  7913. WXGamePlatform_1.default.getInstance().openCustomerService();
  7914. break;
  7915. }
  7916. };
  7917. /**
  7918. * 短震动
  7919. */
  7920. PlatformTool.prototype.vibrateShort = function () {
  7921. switch (Global_1.Global.nowplatfrom) {
  7922. case PlatfromType_1.default.wx:
  7923. WXGamePlatform_1.default.getInstance().vibrateShort();
  7924. break;
  7925. default:
  7926. break;
  7927. }
  7928. };
  7929. PlatformTool.isCanVideo = function () {
  7930. var bo = false;
  7931. if (PlatformTool.checkEnable()) {
  7932. bo = true;
  7933. }
  7934. else {
  7935. switch (Global_1.Global.nowplatfrom) {
  7936. case PlatfromType_1.default.wx:
  7937. bo = WXGamePlatform_1.default.getInstance().isCanVideo();
  7938. break;
  7939. default:
  7940. bo = true;
  7941. break;
  7942. }
  7943. }
  7944. return bo;
  7945. };
  7946. PlatformTool.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) {
  7947. if (callobj === void 0) { callobj = null; }
  7948. if (succeedCallback === void 0) { succeedCallback = null; }
  7949. if (failCallback === void 0) { failCallback = null; }
  7950. switch (Global_1.Global.nowplatfrom) {
  7951. case PlatfromType_1.default.wx:
  7952. WXGamePlatform_1.default.getInstance().startShareApp(key, callobj, succeedCallback, failCallback);
  7953. break;
  7954. default:
  7955. if (callobj && succeedCallback) {
  7956. succeedCallback.call(callobj);
  7957. }
  7958. break;
  7959. }
  7960. };
  7961. PlatformTool.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) {
  7962. if (callobj === void 0) { callobj = null; }
  7963. if (succeedcallback === void 0) { succeedcallback = null; }
  7964. if (failCallback === void 0) { failCallback = null; }
  7965. if (istongjiNum === void 0) { istongjiNum = true; }
  7966. switch (Global_1.Global.nowplatfrom) {
  7967. case PlatfromType_1.default.wx:
  7968. // WordTipsUtils.getInstance().showWordTips("暂未开放");
  7969. WXGamePlatform_1.default.getInstance().playVideo(key, callobj, succeedcallback, failCallback, istongjiNum);
  7970. break;
  7971. default:
  7972. if (callobj && succeedcallback) {
  7973. succeedcallback.call(callobj);
  7974. }
  7975. break;
  7976. }
  7977. };
  7978. PlatformTool.prototype.createBanner = function (bannertype, style) {
  7979. if (style === void 0) { style = { x: 0, y: 0, scale: 1 }; }
  7980. switch (Global_1.Global.nowplatfrom) {
  7981. case PlatfromType_1.default.wx:
  7982. WXGamePlatform_1.default.getInstance().createBanner(bannertype, style);
  7983. break;
  7984. default:
  7985. break;
  7986. }
  7987. };
  7988. PlatformTool.prototype.hideBanner = function (bannertype) {
  7989. switch (Global_1.Global.nowplatfrom) {
  7990. case PlatfromType_1.default.wx:
  7991. WXGamePlatform_1.default.getInstance().hideBanner(bannertype);
  7992. break;
  7993. default:
  7994. break;
  7995. }
  7996. };
  7997. /**
  7998. * 数据上传(用于排行榜数据显示)
  7999. * @param param1 上报数据1
  8000. * @param param2 上报数据2
  8001. */
  8002. PlatformTool.prototype.storeToCloud = function (param1, param2) {
  8003. switch (Global_1.Global.nowplatfrom) {
  8004. case PlatfromType_1.default.wx:
  8005. WXGamePlatform_1.default.getInstance().storeToCloud(param1, param2);
  8006. break;
  8007. default:
  8008. break;
  8009. }
  8010. };
  8011. /**
  8012. * 打开好友排行榜
  8013. */
  8014. PlatformTool.prototype.openFriendRank = function (type, viewType, rect, parent, data) {
  8015. if (parent === void 0) { parent = null; }
  8016. if (data === void 0) { data = null; }
  8017. switch (Global_1.Global.nowplatfrom) {
  8018. case PlatfromType_1.default.wx:
  8019. WXGamePlatform_1.default.getInstance().openFriendRank(type, viewType, rect, parent, data);
  8020. break;
  8021. default:
  8022. break;
  8023. }
  8024. };
  8025. /**
  8026. * 排行榜打开状态时候,切换显示类型
  8027. * @param type
  8028. */
  8029. PlatformTool.prototype.changeFriendRank = function (type) {
  8030. switch (Global_1.Global.nowplatfrom) {
  8031. case PlatfromType_1.default.wx:
  8032. WXGamePlatform_1.default.getInstance().changeFriendRank(type);
  8033. break;
  8034. default:
  8035. break;
  8036. }
  8037. };
  8038. /**
  8039. * 排行榜上一页
  8040. */
  8041. PlatformTool.prototype.prePageRank = function () {
  8042. switch (Global_1.Global.nowplatfrom) {
  8043. case PlatfromType_1.default.wx:
  8044. WXGamePlatform_1.default.getInstance().prePageRank();
  8045. break;
  8046. default:
  8047. break;
  8048. }
  8049. };
  8050. /**
  8051. * 排行榜下一页
  8052. */
  8053. PlatformTool.prototype.nextPageRank = function () {
  8054. switch (Global_1.Global.nowplatfrom) {
  8055. case PlatfromType_1.default.wx:
  8056. WXGamePlatform_1.default.getInstance().nextPageRank();
  8057. break;
  8058. default:
  8059. break;
  8060. }
  8061. };
  8062. /**
  8063. * 关闭好友排行榜
  8064. */
  8065. PlatformTool.prototype.closeFriendRank = function (viewType) {
  8066. switch (Global_1.Global.nowplatfrom) {
  8067. case PlatfromType_1.default.wx:
  8068. WXGamePlatform_1.default.getInstance().closeFriendRank(viewType);
  8069. break;
  8070. default:
  8071. break;
  8072. }
  8073. };
  8074. PlatformTool.prototype.lockVideoLeftTime = function () {
  8075. var time = 0;
  8076. switch (Global_1.Global.nowplatfrom) {
  8077. case PlatfromType_1.default.wx:
  8078. time = WXGamePlatform_1.default.getInstance().lockVideoLeftTime();
  8079. break;
  8080. default:
  8081. break;
  8082. }
  8083. return time;
  8084. };
  8085. PlatformTool.dayVideoNums = function () {
  8086. var time = 0;
  8087. switch (Global_1.Global.nowplatfrom) {
  8088. case PlatfromType_1.default.wx:
  8089. time = WXGamePlatform_1.default.dayVideoNum;
  8090. break;
  8091. default:
  8092. break;
  8093. }
  8094. return time;
  8095. };
  8096. /**
  8097. * 1089:添加到我的小程序,1131:添加到浮窗
  8098. */
  8099. PlatformTool.fromscene = function () {
  8100. var scene = 0;
  8101. switch (Global_1.Global.nowplatfrom) {
  8102. case PlatfromType_1.default.wx:
  8103. scene = WXGamePlatform_1.default.fromscene;
  8104. break;
  8105. default:
  8106. break;
  8107. }
  8108. return scene;
  8109. };
  8110. PlatformTool.createGameClubButton = function (style, icon) {
  8111. if (icon === void 0) { icon = "green"; }
  8112. switch (Global_1.Global.nowplatfrom) {
  8113. case PlatfromType_1.default.wx:
  8114. WXGamePlatform_1.default.getInstance().createGameClubButton(style, icon);
  8115. break;
  8116. default:
  8117. break;
  8118. }
  8119. };
  8120. /**
  8121. * 是否合规
  8122. */
  8123. PlatformTool.islegal = 0;
  8124. return PlatformTool;
  8125. }());
  8126. exports.default = PlatformTool;
  8127. },{"../Global":2,"../frameworks/Debuger":12,"../frameworks/TimesTamper":14,"../frameworks/events/EventUtils":16,"../managers/DayManager":60,"../managers/SoundssManager":65,"./PlatfromType":68,"./events/PlatformEvent":69,"./wxminigame/WXGamePlatform":72}],68:[function(require,module,exports){
  8128. "use strict";
  8129. Object.defineProperty(exports, "__esModule", { value: true });
  8130. var PlatfromType = /** @class */ (function () {
  8131. function PlatfromType() {
  8132. }
  8133. /**
  8134. * 电脑
  8135. */
  8136. PlatfromType.pc = "pc";
  8137. /**
  8138. * 微信小游戏
  8139. */
  8140. PlatfromType.wx = "wx";
  8141. /**
  8142. * qq小游戏
  8143. */
  8144. PlatfromType.qq = "qq";
  8145. /**
  8146. * 抖音
  8147. */
  8148. PlatfromType.tt = "tt";
  8149. return PlatfromType;
  8150. }());
  8151. exports.default = PlatfromType;
  8152. },{}],69:[function(require,module,exports){
  8153. "use strict";
  8154. Object.defineProperty(exports, "__esModule", { value: true });
  8155. var PlatformEvent = /** @class */ (function () {
  8156. function PlatformEvent() {
  8157. }
  8158. /**
  8159. * 登录
  8160. */
  8161. PlatformEvent.message_9891001 = "9891001";
  8162. /**
  8163. * 广告点击
  8164. */
  8165. PlatformEvent.message_9891102 = "9891102";
  8166. /**
  8167. * 点击确定跳转到外部游戏
  8168. */
  8169. PlatformEvent.message_9891103 = "9891103";
  8170. /**
  8171. * 用户打点
  8172. */
  8173. PlatformEvent.message_9891002 = "9891002";
  8174. /**
  8175. * 获取后台数据
  8176. */
  8177. PlatformEvent.message_9891101 = "9891101";
  8178. PlatformEvent.PlatformEvent_loginSucceed = "PlatformEvent_loginSucceed";
  8179. /**
  8180. * 游戏从后台恢复显示事件
  8181. */
  8182. PlatformEvent.PlatformEvent_onshow = "PlatformEvent_onshow";
  8183. /**
  8184. * 游戏进入后台事件
  8185. */
  8186. PlatformEvent.PlatformEvent_onhide = "PlatformEvent_onhide";
  8187. PlatformEvent.PlatformEvent_onAudioInterruptionEnd = "PlatformEvent_onAudioInterruptionEnd";
  8188. PlatformEvent.PlatformEvent_losefocus = "PlatformEvent_losefocus";
  8189. PlatformEvent.PlatformEvent_getfocus = "PlatformEvent_getfocus";
  8190. PlatformEvent.PlatformEvent_updateVideoNums = "PlatformEvent_updateVideoNums";
  8191. /**
  8192. * 从收藏或者浮窗进入游戏
  8193. */
  8194. PlatformEvent.PlatformEvent_fromscorfk = "PlatformEvent_fromscorfk";
  8195. return PlatformEvent;
  8196. }());
  8197. exports.default = PlatformEvent;
  8198. },{}],70:[function(require,module,exports){
  8199. "use strict";
  8200. Object.defineProperty(exports, "__esModule", { value: true });
  8201. var RankType;
  8202. (function (RankType) {
  8203. /**
  8204. * 打开好友排行榜
  8205. */
  8206. RankType.openfriendrank = "openfriendrank";
  8207. /**
  8208. * 关闭好友排行榜
  8209. */
  8210. RankType.closefriendrank = "closefriendrank";
  8211. /**
  8212. * 下一页
  8213. */
  8214. RankType.nextpage = "nextpage";
  8215. /**
  8216. * 上一页
  8217. */
  8218. RankType.prepage = "prepage";
  8219. /**
  8220. * 超越好友(显示后一名)
  8221. */
  8222. RankType.chaoyue = "chaoyue";
  8223. /**
  8224. * 超越好友(显示前后一名)
  8225. */
  8226. RankType.chaoyue1 = "chaoyue1";
  8227. })(RankType = exports.RankType || (exports.RankType = {}));
  8228. },{}],71:[function(require,module,exports){
  8229. "use strict";
  8230. Object.defineProperty(exports, "__esModule", { value: true });
  8231. var Event = Laya.Event;
  8232. var HttpRequest = Laya.HttpRequest;
  8233. var PlayerAccount_1 = require("./WXSDK/PlayerAccount");
  8234. var ShareUtil_1 = require("./WXSDK/ShareUtil");
  8235. var Sdk_1 = require("./WXSDK/Sdk");
  8236. var TimesTamper_1 = require("../../frameworks/TimesTamper");
  8237. var Debuger_1 = require("../../frameworks/Debuger");
  8238. var Global_1 = require("../../Global");
  8239. // const PROTOCOL_URL:string = "https://pipelineapi.xwxgame.com/";
  8240. var PROTOCOL_URL = "https://parkourraceapi.xwxgame.com/";
  8241. var PROTOCOLS = /** @class */ (function () {
  8242. function PROTOCOLS() {
  8243. }
  8244. PROTOCOLS.Login = "user/login"; // not token
  8245. PROTOCOLS.game = "game/start";
  8246. PROTOCOLS.end = "game/play";
  8247. PROTOCOLS.Sign = "sign/sign";
  8248. // public static EquipHero = "theme/equipHero";
  8249. // public static BuyHero = "theme/buyHero";
  8250. // public static EquipHat = "theme/equipHat";
  8251. // public static BuyHat = "theme/buyHat";
  8252. // public static BuyDance = "theme/buyDance";
  8253. // public static EquipDance = "theme/equipDance";
  8254. PROTOCOLS.Buy = "theme/buy";
  8255. PROTOCOLS.Equip = "theme/equip";
  8256. PROTOCOLS.share = "fission/share";
  8257. PROTOCOLS.vd = "fission/vd";
  8258. PROTOCOLS.revival = "game/revival";
  8259. PROTOCOLS.fission = "theme/fission";
  8260. PROTOCOLS.themefission = "theme/fission";
  8261. PROTOCOLS.treasure = "treasure/click";
  8262. PROTOCOLS.Config = "config/table";
  8263. PROTOCOLS.Lottery = "lottery/lottery";
  8264. PROTOCOLS.GetAchieve = "achievement/getRewards";
  8265. PROTOCOLS.usersync = "user/sync";
  8266. return PROTOCOLS;
  8267. }());
  8268. exports.PROTOCOLS = PROTOCOLS;
  8269. ;
  8270. var NetworkManager = /** @class */ (function () {
  8271. function NetworkManager() {
  8272. NetworkManager.instance = this;
  8273. }
  8274. Object.defineProperty(NetworkManager, "Instance", {
  8275. get: function () {
  8276. if (NetworkManager.instance) {
  8277. return NetworkManager.instance;
  8278. }
  8279. else {
  8280. return new NetworkManager();
  8281. }
  8282. },
  8283. enumerable: true,
  8284. configurable: true
  8285. });
  8286. //#region 登入
  8287. /******************************* login *****************************/
  8288. NetworkManager.prototype.login = function (progresscb, completecb, errorcb) {
  8289. var userInfor = PlayerAccount_1.PlayerAccount.CurrentAccount;
  8290. var ver = Global_1.Global.gameVersion;
  8291. var args = "code=" + userInfor.Code + "&nickname=" + userInfor.NickName + "&avatar=" + userInfor.Avatar + "&gender=" + userInfor.Gender + "&country=" + userInfor.Country + "&province=" + userInfor.Province + "&city=" + userInfor.City + "& device=" + userInfor.Device + "$&share_id=" + userInfor.ShareId + "&scene=" + userInfor.Scene + "&v=" + ver;
  8292. var httpRequest = new HttpRequest();
  8293. httpRequest.once(Event.PROGRESS, this, this.onHttpRequestProgress, [progresscb, httpRequest]);
  8294. httpRequest.once(Event.COMPLETE, this, this.onLoginRequestComplete, [completecb, httpRequest]);
  8295. httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]);
  8296. httpRequest.send(PROTOCOL_URL + PROTOCOLS.Login, args, "post", "text");
  8297. };
  8298. NetworkManager.prototype.onHttpRequestProgress = function (progresscb, httpRequest) {
  8299. if (progresscb) {
  8300. console.log("HttpRequestProgress:...");
  8301. progresscb.run();
  8302. }
  8303. };
  8304. NetworkManager.prototype.onLoginRequestComplete = function (completecb, httpRequest) {
  8305. //console.log("登录数据:", httpRequest.data);
  8306. var data = JSON.parse(httpRequest.data);
  8307. if (data["code"] != "0") {
  8308. console.log("登录异常错误!错误信息:", httpRequest.data);
  8309. Sdk_1.WxApi.recordAldEvent("登录异常错误!错误信息:= " + data["code"], "httpRequest.dat");
  8310. //completecb.runWith(data);
  8311. return;
  8312. }
  8313. PlayerAccount_1.PlayerAccount.ServerTime = data["t"];
  8314. TimesTamper_1.TimesTamper.getInstance().updateServiceTime(Number(data["t"]));
  8315. Sdk_1.WxApi.recordAldEvent("登录正式成功");
  8316. PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, completecb);
  8317. ShareUtil_1.ShareUtil.ShareMessage();
  8318. };
  8319. NetworkManager.prototype.onHttpRequestError = function (errorcb, httpRequest) {
  8320. if (errorcb != null) {
  8321. errorcb.runWith(httpRequest);
  8322. }
  8323. Sdk_1.WxApi.recordAldEvent("Error! Http request error.. ", "httpRequest.dat");
  8324. Sdk_1.WxApi.ShowLoading("连接网络失败...");
  8325. Laya.timer.once(8000, this, function () { Sdk_1.WxApi.HideLoading(); });
  8326. console.log("Error! Http request error..." + httpRequest.data);
  8327. };
  8328. //#endregion
  8329. /*
  8330. * 通用Http Post协议发送
  8331. * protocol 对应“PROTOCOLS”字典中协议名称
  8332. * hasToken 是否使用token,目前只有login协议不需要token,其他都需要token,所以此处自动组合
  8333. * param 参数列表,key是字段名,val是值,值需要先转string
  8334. * completecb 协议发送成功回调函数
  8335. * errorcb 协议发送失败回调函数
  8336. * return 返回值为void
  8337. */
  8338. NetworkManager.prototype.HttpPostRequest = function (protocol, param, completecb, errorcb, hasToken) {
  8339. if (hasToken === void 0) { hasToken = true; }
  8340. var args = "";
  8341. var url = PROTOCOL_URL + protocol;
  8342. // chechk add token
  8343. var account = PlayerAccount_1.PlayerAccount.CurrentAccount;
  8344. var accountdata = account.CurAccountData;
  8345. if (hasToken == true) {
  8346. args = "token=" + accountdata.m_token + "&";
  8347. }
  8348. Sdk_1.WxApi.ShowLoading("连接网络中...");
  8349. if (protocol == PROTOCOLS.game || protocol == PROTOCOLS.end || protocol == PROTOCOLS.fission || protocol == PROTOCOLS.vd ||
  8350. protocol == PROTOCOLS.themefission || protocol == PROTOCOLS.Lottery || protocol == PROTOCOLS.usersync) {
  8351. var str = "abcdefghijkimnopqrstuvwxyz0123456789";
  8352. var code = "{";
  8353. var mask = "";
  8354. for (var i = 0; i < 4; i++) {
  8355. mask += str[Math.floor(Math.random() * 100) % str.length];
  8356. }
  8357. for (var i = 0; i < param.length; i++) {
  8358. for (var key in param[i]) {
  8359. code += "\"" + key + "\":\"" + param[i][key] + "\"";
  8360. }
  8361. if (i < param.length - 1) {
  8362. code += ",";
  8363. }
  8364. else {
  8365. code += "}";
  8366. }
  8367. }
  8368. args += "_r=" + mask + this.base64Encode(code);
  8369. }
  8370. else {
  8371. if (param != null) {
  8372. for (var i = 0; i < param.length; i++) {
  8373. for (var key in param[i]) {
  8374. var val = param[i][key];
  8375. args += key + "=" + val;
  8376. if (i < param.length - 1) {
  8377. args += "&";
  8378. }
  8379. }
  8380. }
  8381. }
  8382. }
  8383. var httpRequest = new HttpRequest();
  8384. httpRequest.once(Event.COMPLETE, this, this.onHttpRequestComplete, [completecb, errorcb, httpRequest]);
  8385. httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]);
  8386. httpRequest.send(url, args, "post", "text");
  8387. };
  8388. NetworkManager.prototype.onHttpRequestComplete = function (succeedcb, failurecb, httpRequest) {
  8389. Sdk_1.WxApi.HideLoading();
  8390. var data = JSON.parse(httpRequest.data);
  8391. if (data["code"] == 0) {
  8392. PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, null);
  8393. //EventManager.Trigger(EventType.RefreshMonery);
  8394. if (succeedcb != null) {
  8395. //console.log("上传成功回调方法 " + httpRequest.data);
  8396. succeedcb.runWith(data);
  8397. Debuger_1.default.log("receive:", data);
  8398. }
  8399. }
  8400. else {
  8401. if (failurecb != null) {
  8402. failurecb.runWith(data);
  8403. }
  8404. console.log("Error! Http request complete error, code: " + data["code"] + " message: " + data["message"]);
  8405. }
  8406. };
  8407. NetworkManager.prototype.base64Encode = function (str) {
  8408. var c1, c2, c3;
  8409. var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  8410. var i = 0, len = str.length, string = '';
  8411. while (i < len) {
  8412. c1 = str.charCodeAt(i++) & 0xff;
  8413. if (i == len) {
  8414. string += base64EncodeChars.charAt(c1 >> 2);
  8415. string += base64EncodeChars.charAt((c1 & 0x3) << 4);
  8416. string += "==";
  8417. break;
  8418. }
  8419. c2 = str.charCodeAt(i++);
  8420. if (i == len) {
  8421. string += base64EncodeChars.charAt(c1 >> 2);
  8422. string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  8423. string += base64EncodeChars.charAt((c2 & 0xF) << 2);
  8424. string += "=";
  8425. break;
  8426. }
  8427. c3 = str.charCodeAt(i++);
  8428. string += base64EncodeChars.charAt(c1 >> 2);
  8429. string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  8430. string += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
  8431. string += base64EncodeChars.charAt(c3 & 0x3F);
  8432. }
  8433. return string;
  8434. };
  8435. return NetworkManager;
  8436. }());
  8437. exports.NetworkManager = NetworkManager;
  8438. },{"../../Global":2,"../../frameworks/Debuger":12,"../../frameworks/TimesTamper":14,"./WXSDK/PlayerAccount":74,"./WXSDK/Sdk":75,"./WXSDK/ShareUtil":76}],72:[function(require,module,exports){
  8439. "use strict";
  8440. Object.defineProperty(exports, "__esModule", { value: true });
  8441. var TongjiHttps_1 = require("../../frameworks/net/TongjiHttps");
  8442. var Debuger_1 = require("../../frameworks/Debuger");
  8443. var GameUtils_1 = require("../../utils/GameUtils");
  8444. var GameHttps_1 = require("../../frameworks/net/GameHttps");
  8445. var PlatformEvent_1 = require("../events/PlatformEvent");
  8446. var Global_1 = require("../../Global");
  8447. var DayManager_1 = require("../../managers/DayManager");
  8448. var CacheManager_1 = require("../../managers/CacheManager");
  8449. var UserCacheType_1 = require("../../gamemodule/userinfo/events/UserCacheType");
  8450. var WordTipsUtils_1 = require("../../gamemodule/loading/view/WordTipsUtils");
  8451. var EventUtils_1 = require("../../frameworks/events/EventUtils");
  8452. var SoundssManager_1 = require("../../managers/SoundssManager");
  8453. var RankType_1 = require("../types/RankType");
  8454. /*
  8455. * name;
  8456. */
  8457. var WXGamePlatform = /** @class */ (function () {
  8458. function WXGamePlatform() {
  8459. this.isShareing = false;
  8460. this.bannerRunTime = 0;
  8461. this._bannerTypeList = [];
  8462. this._screenwidth = 0;
  8463. this.bannerheight = 0;
  8464. this.bannerwidth = 0;
  8465. this.isonResize = false;
  8466. /**
  8467. * 排行榜打开类型存储
  8468. */
  8469. this._openrankDict = {};
  8470. }
  8471. WXGamePlatform.getInstance = function () {
  8472. if (!this._instance) {
  8473. this._instance = new WXGamePlatform();
  8474. }
  8475. return this._instance;
  8476. };
  8477. WXGamePlatform.prototype.init = function () {
  8478. this.showShareMenu({ withShareTicket: true });
  8479. this.onAudioInterruptionBegin();
  8480. this.onAudioInterruptionEnd();
  8481. };
  8482. WXGamePlatform.prototype.initShareDian = function (data) {
  8483. if (data && data.length > 0) {
  8484. var itemd;
  8485. for (var s in data) {
  8486. itemd = data[s];
  8487. WXGamePlatform.ShareDict[itemd.key] = itemd;
  8488. }
  8489. var firstd = data[0];
  8490. this.onShareAppMessage(firstd.tile, Global_1.Global.cdnurl + firstd.img);
  8491. }
  8492. };
  8493. WXGamePlatform.prototype.initData = function () {
  8494. if (DayManager_1.default.isNewDay) {
  8495. WXGamePlatform.dayShareNum = 0;
  8496. WXGamePlatform.dayVideoNum = 0;
  8497. this.updateDayShareInfo();
  8498. this.updateDayVideoInfo();
  8499. }
  8500. else {
  8501. WXGamePlatform.dayShareNum = CacheManager_1.default.getInstance().getnum(UserCacheType_1.default.nowdayShare);
  8502. WXGamePlatform.dayVideoNum = CacheManager_1.default.getInstance().getnum(UserCacheType_1.default.nowdayVideo);
  8503. }
  8504. Debuger_1.default.log("initDayShareNum", WXGamePlatform.dayShareNum, WXGamePlatform.dayVideoNum);
  8505. };
  8506. /**
  8507. * 存储当天分享的信息
  8508. */
  8509. WXGamePlatform.prototype.updateDayShareInfo = function () {
  8510. CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.nowdayShare, WXGamePlatform.dayShareNum.toString());
  8511. Debuger_1.default.log("updateDayShareInfo", WXGamePlatform.dayShareNum);
  8512. };
  8513. WXGamePlatform.prototype.updateDayVideoInfo = function () {
  8514. CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.nowdayVideo, WXGamePlatform.dayVideoNum.toString());
  8515. Debuger_1.default.log("updateDayVideoInfo", WXGamePlatform.dayVideoNum);
  8516. };
  8517. WXGamePlatform.prototype.createUserAndLogin = function (callobj, succeedcallback, progressCallback, failcallback) {
  8518. if (progressCallback === void 0) { progressCallback = null; }
  8519. if (failcallback === void 0) { failcallback = null; }
  8520. WXGamePlatform.loginCallobj = callobj;
  8521. WXGamePlatform.loginsucceedcallback = succeedcallback;
  8522. WXGamePlatform.loginprogressCallback = progressCallback;
  8523. var wx = Laya.Browser.window.wx;
  8524. if (wx) {
  8525. var login_info = WXGamePlatform.getInstance().getLaunchOptionsSync();
  8526. if (login_info) {
  8527. Debuger_1.default.log("getLaunchOptionsSync:", login_info);
  8528. var query = login_info.query;
  8529. if (query && query.ChanID) {
  8530. WXGamePlatform.QuDaoID = query.ChanID;
  8531. Debuger_1.default.log('来源⼴告的广告id是' + WXGamePlatform.QuDaoID);
  8532. }
  8533. var referrerInfo = login_info.referrerInfo;
  8534. if (WXGamePlatform.QuDaoID == "" && referrerInfo && referrerInfo.appId) {
  8535. WXGamePlatform.QuDaoID = referrerInfo.appId;
  8536. Debuger_1.default.log('来源微信小游戏的appid是' + WXGamePlatform.QuDaoID);
  8537. }
  8538. if (login_info.scene) {
  8539. WXGamePlatform.fromscene = Number(login_info.scene);
  8540. }
  8541. }
  8542. var systemres = wx.getSystemInfoSync();
  8543. var version = systemres.SDKVersion;
  8544. if (wx.getUpdateManager) {
  8545. var updateManager = wx.getUpdateManager();
  8546. updateManager.onCheckForUpdate(function (res) {
  8547. // 请求完新版本信息的回调
  8548. Debuger_1.default.log("是否有新版本需要更新:" + res.hasUpdate);
  8549. if (res.hasUpdate == true) {
  8550. updateManager.onUpdateReady(function () {
  8551. Laya.Browser.window.wx.showModal({
  8552. title: '更新提示',
  8553. content: '新版本已经准备好,是否重启应用?',
  8554. success: function (res) {
  8555. if (res.confirm) {
  8556. // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
  8557. updateManager.applyUpdate();
  8558. }
  8559. else {
  8560. WXGamePlatform.getInstance().exitGame();
  8561. }
  8562. }
  8563. });
  8564. });
  8565. updateManager.onUpdateFailed(function () {
  8566. // 新版本下载失败
  8567. WXGamePlatform.getInstance().exitGame();
  8568. });
  8569. }
  8570. else {
  8571. // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback )
  8572. // {
  8573. // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 );
  8574. // }
  8575. var wxplatform = WXGamePlatform.getInstance();
  8576. wxplatform.login(callobj, succeedcallback, failcallback);
  8577. }
  8578. });
  8579. }
  8580. else {
  8581. // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback )
  8582. // {
  8583. // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 );
  8584. // }
  8585. var wxplatform = WXGamePlatform.getInstance();
  8586. wxplatform.login(callobj, succeedcallback, failcallback);
  8587. }
  8588. }
  8589. };
  8590. WXGamePlatform.prototype.createUserInfoButton = function (callobj, callback, failcallback) {
  8591. this.userinfocallobj = callobj;
  8592. this.userinfosuccallback = callback;
  8593. this.userinfofailcallback = failcallback;
  8594. var wx = Laya.Browser.window.wx;
  8595. var res = wx.getSystemInfoSync();
  8596. if (res) {
  8597. Debuger_1.default.log("getSystemInfoSync", res);
  8598. var posx = (res.windowWidth - 151) / 2;
  8599. var posy = res.windowHeight - 172 - 40;
  8600. WXGamePlatform.getInstance().userinfobutton = wx.createUserInfoButton({
  8601. type: 'image',
  8602. image: 'wxlocal/login.png',
  8603. style: {
  8604. left: posx,
  8605. top: posy,
  8606. width: 151,
  8607. height: 72
  8608. }
  8609. });
  8610. WXGamePlatform.getInstance().userinfobutton.onTap(WXGamePlatform.getInstance().userinfoButtonClick);
  8611. }
  8612. };
  8613. /**
  8614. * 判断是否已经授权
  8615. */
  8616. WXGamePlatform.prototype.getaccredit = function (callobj, accreditCallback) {
  8617. if (WXGamePlatform.accreditstate == 0) {
  8618. var wx = Laya.Browser.window.wx;
  8619. if (wx) {
  8620. wx.getSetting({
  8621. success: function (res) {
  8622. var itemd = res.authSetting;
  8623. if (itemd.hasOwnProperty("scope.userInfo") && itemd["scope.userInfo"] == true) //已经授权过
  8624. {
  8625. if (accreditCallback && callobj) {
  8626. accreditCallback.call(callobj, true);
  8627. }
  8628. }
  8629. else {
  8630. if (accreditCallback && callobj) {
  8631. accreditCallback.call(callobj, false);
  8632. }
  8633. }
  8634. }
  8635. });
  8636. }
  8637. else {
  8638. if (accreditCallback && callobj) {
  8639. accreditCallback.call(callobj, true);
  8640. }
  8641. }
  8642. }
  8643. else {
  8644. if (accreditCallback && callobj) {
  8645. accreditCallback.call(callobj, true);
  8646. }
  8647. }
  8648. };
  8649. WXGamePlatform.prototype.userinfoButtonClick = function (res) {
  8650. var wxplatform = WXGamePlatform.getInstance();
  8651. Debuger_1.default.log("userinfoButtonClick", res);
  8652. if (res) {
  8653. var errMsg = res.errMsg;
  8654. if (errMsg == "getUserInfo:ok") {
  8655. Debuger_1.default.log("同意授权");
  8656. WXGamePlatform.accreditstate = 1;
  8657. wxplatform.closeuserinfobUtton();
  8658. wxplatform.getUserInfo(false, wxplatform.userinfocallobj, wxplatform.userinfosuccallback, wxplatform.userinfofailcallback);
  8659. }
  8660. else {
  8661. Debuger_1.default.log("点击拒绝授权");
  8662. if (wxplatform.userinfocallobj && wxplatform.userinfofailcallback) {
  8663. wxplatform.userinfofailcallback.call(wxplatform.userinfocallobj);
  8664. }
  8665. }
  8666. }
  8667. };
  8668. WXGamePlatform.prototype.closeuserinfobUtton = function () {
  8669. var wxplatform = WXGamePlatform.getInstance();
  8670. if (wxplatform.userinfobutton) {
  8671. wxplatform.userinfobutton.offTap(wxplatform.userinfoButtonClick);
  8672. wxplatform.userinfobutton.destroy();
  8673. wxplatform.userinfobutton = null;
  8674. }
  8675. };
  8676. WXGamePlatform.prototype.getUserInfo = function (islogin, callobj, callback, failcallback) {
  8677. fairygui.GRoot.inst.showModalWait();
  8678. var wxplatform = WXGamePlatform.getInstance();
  8679. var wx = Laya.Browser.window.wx;
  8680. if (wx) {
  8681. wx.getUserInfo({
  8682. success: function (res) {
  8683. var userInfo = res.userInfo;
  8684. WXGamePlatform.nickName = userInfo.nickName;
  8685. if (islogin) {
  8686. wxplatform.login(callobj, callback, failcallback);
  8687. }
  8688. else {
  8689. if (callobj && callback) {
  8690. callback.call(callobj, WXGamePlatform.nickName);
  8691. }
  8692. }
  8693. }
  8694. });
  8695. }
  8696. };
  8697. /**
  8698. * 登录
  8699. * @param callobj
  8700. * @param succeedcallback
  8701. * @param failCallback
  8702. */
  8703. WXGamePlatform.prototype.login = function (callobj, callback, failcallback) {
  8704. var wxplatform = WXGamePlatform.getInstance();
  8705. if (Laya.Browser.window.wx) {
  8706. Laya.Browser.window.wx.login({
  8707. success: function (res) {
  8708. Debuger_1.default.log("wx.login:", res);
  8709. WXGamePlatform.code = res.code;
  8710. var itemd = {};
  8711. if (WXGamePlatform.QuDaoID != "") {
  8712. itemd.ChanID = WXGamePlatform.QuDaoID;
  8713. }
  8714. itemd.Code = WXGamePlatform.code;
  8715. itemd.AppID = Global_1.Global.appid;
  8716. itemd.Version = Global_1.Global.gameVersion;
  8717. GameHttps_1.default.getInstance().sendGet(PlatformEvent_1.default.message_9891001, itemd, wxplatform, wxplatform.loginSucceedCallback);
  8718. },
  8719. fail: function (res) {
  8720. Debuger_1.default.log("微信登录失败,重新登录吧");
  8721. wxplatform.login(callobj, callback, failcallback);
  8722. }
  8723. });
  8724. }
  8725. };
  8726. WXGamePlatform.prototype.loginSucceedCallback = function (data) {
  8727. if (WXGamePlatform.loginCallobj && WXGamePlatform.loginsucceedcallback) {
  8728. WXGamePlatform.loginsucceedcallback.call(WXGamePlatform.loginCallobj, data);
  8729. }
  8730. };
  8731. WXGamePlatform.prototype.loadSubpackage = function (name, subcallobj, subcallback, updatecallback, subfailcallback) {
  8732. if (Laya.Browser.window.wx) {
  8733. this._subcallobj = subcallobj;
  8734. this._subcallback = subcallback;
  8735. this._updatecallback = updatecallback;
  8736. this._subfailcallback = subfailcallback;
  8737. var wx = Laya.Browser.window.wx;
  8738. if (wx.loadSubpackage) {
  8739. var loadTask = wx.loadSubpackage({
  8740. name: name,
  8741. success: function (res) {
  8742. // 分包加载成功后通过 success 回调
  8743. Debuger_1.default.log("分包加载成功");
  8744. var wxgamePlatform = WXGamePlatform.getInstance();
  8745. if (wxgamePlatform._subcallback && wxgamePlatform._subcallobj) {
  8746. wxgamePlatform._subcallback.call(wxgamePlatform._subcallobj);
  8747. }
  8748. },
  8749. fail: function (res) {
  8750. // 分包加载失败通过 fail 回调
  8751. var wxgamePlatform = WXGamePlatform.getInstance();
  8752. if (wxgamePlatform._subfailcallback && wxgamePlatform._subcallobj) {
  8753. wxgamePlatform._subfailcallback.call(wxgamePlatform._subcallobj);
  8754. }
  8755. }
  8756. });
  8757. if (loadTask.onProgressUpdate) {
  8758. loadTask.onProgressUpdate(function (res) {
  8759. var wxgamePlatform = WXGamePlatform.getInstance();
  8760. if (wxgamePlatform._updatecallback && wxgamePlatform._subcallobj) {
  8761. wxgamePlatform._updatecallback.call(wxgamePlatform._subcallobj, res.progress);
  8762. }
  8763. Debuger_1.default.log('下载进度', res.progress);
  8764. Debuger_1.default.log('已经下载的数据长度', res.totalBytesWritten);
  8765. Debuger_1.default.log('预期需要下载的数据总长度', res.totalBytesExpectedToWrite);
  8766. });
  8767. }
  8768. }
  8769. else {
  8770. if (subcallobj && subcallback) {
  8771. subcallback.call(subcallobj);
  8772. }
  8773. }
  8774. }
  8775. else {
  8776. if (subcallobj && subcallback) {
  8777. subcallback.call(subcallobj);
  8778. }
  8779. }
  8780. };
  8781. /**
  8782. * 获取转发详细信息
  8783. * @param obj
  8784. * @param callobj
  8785. * @param succeedcallback
  8786. * @param failCallback
  8787. */
  8788. WXGamePlatform.prototype.getShareInfo = function (obj, callobj, succeedcallback, failCallback) {
  8789. if (failCallback === void 0) { failCallback = null; }
  8790. if (Laya.Browser.window.wx) {
  8791. Debuger_1.default.log("shareTicket:", obj.shareTicket);
  8792. Laya.Browser.window.wx.getShareInfo({
  8793. shareTicket: obj.shareTicket,
  8794. success: function (res) {
  8795. Debuger_1.default.log("成功:", res);
  8796. succeedcallback.call(callobj, res);
  8797. }
  8798. });
  8799. }
  8800. };
  8801. /**
  8802. * 监听用户点击右上角菜单的“转发”按钮时触发的事件
  8803. * @param title
  8804. * @param imageUrl
  8805. */
  8806. WXGamePlatform.prototype.onShareAppMessage = function (title, imageUrl) {
  8807. if (Laya.Browser.window.wx) {
  8808. Laya.Browser.window.wx.onShareAppMessage(function () {
  8809. return {
  8810. title: title,
  8811. imageUrl: imageUrl
  8812. };
  8813. });
  8814. }
  8815. };
  8816. /**
  8817. * 主动拉起转发,进入选择通讯录界面。
  8818. * @param title
  8819. * @param imageUrl
  8820. */
  8821. WXGamePlatform.prototype.shareAppMessage = function (d) {
  8822. if (Laya.Browser.window.wx) {
  8823. Laya.Browser.window.wx.shareAppMessage(d);
  8824. }
  8825. };
  8826. /**
  8827. * 显示当前页面的转发按钮
  8828. * @param obj
  8829. */
  8830. WXGamePlatform.prototype.showShareMenu = function (obj) {
  8831. if (obj === void 0) { obj = null; }
  8832. if (Laya.Browser.window.wx) {
  8833. Laya.Browser.window.wx.showShareMenu(obj);
  8834. }
  8835. };
  8836. /**
  8837. * 更新转发属性
  8838. * @param obj
  8839. */
  8840. WXGamePlatform.prototype.updateShareMenu = function (obj) {
  8841. if (obj === void 0) { obj = null; }
  8842. if (Laya.Browser.window.wx) {
  8843. Laya.Browser.window.wx.updateShareMenu(obj);
  8844. }
  8845. };
  8846. /**
  8847. * 显示当前页面的转发按钮
  8848. */
  8849. WXGamePlatform.prototype.showMenu = function () {
  8850. if (Laya.Browser.window.wx) {
  8851. Laya.Browser.window.wx.showShareMenu();
  8852. }
  8853. };
  8854. /**
  8855. * 本地存储
  8856. * @param key
  8857. * @param data
  8858. */
  8859. WXGamePlatform.prototype.setStorageSync = function (key, data) {
  8860. var wx = Laya.Browser.window.wx;
  8861. if (wx) {
  8862. wx.setStorageSync(key, data);
  8863. }
  8864. };
  8865. /**
  8866. * 获取本地存储
  8867. * @param key
  8868. */
  8869. WXGamePlatform.prototype.getStorageSync = function (key) {
  8870. var wx = Laya.Browser.window.wx;
  8871. if (wx) {
  8872. return wx.getStorageSync(key);
  8873. }
  8874. return null;
  8875. };
  8876. WXGamePlatform.prototype.setUserCloudStorage = function (obj, callobj, succeedcallback, failCallback) {
  8877. if (callobj === void 0) { callobj = null; }
  8878. if (succeedcallback === void 0) { succeedcallback = null; }
  8879. if (failCallback === void 0) { failCallback = null; }
  8880. var wx = Laya.Browser.window.wx;
  8881. if (wx && wx.setUserCloudStorage) {
  8882. Debuger_1.default.log("setUserCloudStorage", obj);
  8883. wx.setUserCloudStorage({
  8884. KVDataList: obj,
  8885. success: function (res) {
  8886. if (succeedcallback) {
  8887. succeedcallback.call(callobj, res);
  8888. }
  8889. Debuger_1.default.log("setUserCloudStorage", "上传成功");
  8890. },
  8891. fail: function (res) {
  8892. if (failCallback) {
  8893. failCallback.call(callobj);
  8894. }
  8895. Debuger_1.default.log("setUserCloudStorage", "上传失败");
  8896. }
  8897. });
  8898. }
  8899. };
  8900. /**
  8901. * 显示消息提示框
  8902. * @param word
  8903. */
  8904. WXGamePlatform.prototype.toast = function (word) {
  8905. if (Laya.Browser.window.wx) {
  8906. Laya.Browser.window.wx.showToast({ title: word });
  8907. }
  8908. };
  8909. /**
  8910. * 向开放数据域发送消息
  8911. * @param obj
  8912. */
  8913. WXGamePlatform.prototype.postMessage = function (str, data) {
  8914. if (data === void 0) { data = null; }
  8915. var wx = Laya.Browser.window.wx;
  8916. if (wx) {
  8917. Debuger_1.default.log("postMessage:", str);
  8918. var context = wx.getOpenDataContext();
  8919. context.postMessage({ action: str, data: data });
  8920. }
  8921. };
  8922. /**
  8923. * 创建一个 InnerAudioContext 实例
  8924. */
  8925. WXGamePlatform.prototype.createInnerAudioContext = function () {
  8926. if (Laya.Browser.window.wx) {
  8927. return Laya.Browser.window.wx.createInnerAudioContext();
  8928. }
  8929. return null;
  8930. };
  8931. /**
  8932. * 获取系统信息
  8933. */
  8934. WXGamePlatform.prototype.getSystemInfoSync = function () {
  8935. if (Laya.Browser.window.wx) {
  8936. return Laya.Browser.window.wx.getSystemInfoSync();
  8937. }
  8938. return null;
  8939. };
  8940. /**
  8941. * 预览图片,调用之后会在新打开的页面中全屏预览传入的图片,预览的过程中用户可以进行保存图片、发送给朋友等操作
  8942. * @param obj
  8943. */
  8944. WXGamePlatform.prototype.previewImage = function (obj) {
  8945. if (Laya.Browser.window.wx) {
  8946. Laya.Browser.window.wx.previewImage(obj);
  8947. }
  8948. };
  8949. /**
  8950. * 监听小游戏隐藏到后台事件。锁屏、按 HOME 键退到桌面、显示在聊天顶部等操作会触发此事件。
  8951. * @param callobj
  8952. * @param succeedcallback
  8953. */
  8954. WXGamePlatform.prototype.onHide = function (callobj, succeedcallback) {
  8955. if (Laya.Browser.window.wx) {
  8956. Laya.Browser.window.wx.onHide(function (res) {
  8957. WXGamePlatform.isShowing = false;
  8958. if (succeedcallback && callobj) {
  8959. succeedcallback.call(callobj, res);
  8960. }
  8961. });
  8962. }
  8963. };
  8964. /**
  8965. * 返回小程序启动参数
  8966. * @param callobj
  8967. * @param succeedcallback
  8968. */
  8969. WXGamePlatform.prototype.getLaunchOptionsSync = function () {
  8970. if (Laya.Browser.window.wx) {
  8971. return Laya.Browser.window.wx.getLaunchOptionsSync();
  8972. }
  8973. return null;
  8974. };
  8975. /**
  8976. * 隐藏消息提示框
  8977. * @param obj
  8978. */
  8979. WXGamePlatform.prototype.hideToast = function (obj) {
  8980. if (Laya.Browser.window.wx) {
  8981. Laya.Browser.window.wx.hideToast(obj);
  8982. }
  8983. };
  8984. /**
  8985. * 显示模态对话框
  8986. * @param obj
  8987. */
  8988. WXGamePlatform.prototype.showModal = function (obj) {
  8989. if (Laya.Browser.window.wx) {
  8990. Laya.Browser.window.wx.showModal(obj);
  8991. }
  8992. };
  8993. /**
  8994. * 清理存储数据
  8995. */
  8996. WXGamePlatform.prototype.clearStorage = function () {
  8997. if (Laya.Browser.window.wx) {
  8998. Laya.Browser.window.wx.clearStorageSync();
  8999. }
  9000. };
  9001. /**
  9002. * 使手机发生较短时间的振动(15 ms)
  9003. * @param obj
  9004. */
  9005. WXGamePlatform.prototype.vibrateShort = function () {
  9006. if (Laya.Browser.window.wx) {
  9007. Laya.Browser.window.wx.vibrateShort();
  9008. }
  9009. };
  9010. /**
  9011. * 从本地缓存中移除指定 key
  9012. * @param key
  9013. */
  9014. WXGamePlatform.prototype.removeStorage = function (key) {
  9015. if (Laya.Browser.window.wx) {
  9016. Laya.Browser.window.wx.removeStorage(key);
  9017. }
  9018. };
  9019. WXGamePlatform.prototype.onAudioInterruptionBegin = function () {
  9020. if (Laya.Browser.window.wx) {
  9021. Laya.Browser.window.wx.onAudioInterruptionBegin(function () {
  9022. // SoundssManager.getInstance().playbgSound("bgm");
  9023. Debuger_1.default.log("onAudioInterruptionBegin");
  9024. SoundssManager_1.default.getInstance().stopAll();
  9025. });
  9026. }
  9027. };
  9028. WXGamePlatform.prototype.onAudioInterruptionEnd = function () {
  9029. if (Laya.Browser.window.wx) {
  9030. Laya.Browser.window.wx.onAudioInterruptionEnd(function () {
  9031. Debuger_1.default.log("onAudioInterruptionEnd");
  9032. var wxgameplatform = WXGamePlatform.getInstance();
  9033. Laya.timer.clear(wxgameplatform, wxgameplatform.onAudioEndCallback);
  9034. Laya.timer.once(500, wxgameplatform, wxgameplatform.onAudioEndCallback);
  9035. });
  9036. }
  9037. };
  9038. WXGamePlatform.prototype.onAudioEndCallback = function () {
  9039. EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_onAudioInterruptionEnd);
  9040. };
  9041. /**
  9042. * 退出游戏
  9043. */
  9044. WXGamePlatform.prototype.exitGame = function () {
  9045. var wx = Laya.Browser.window.wx;
  9046. if (wx) {
  9047. wx.exitMiniProgram();
  9048. }
  9049. };
  9050. /**
  9051. * 打开客服对话框
  9052. */
  9053. WXGamePlatform.prototype.openCustomerService = function () {
  9054. var wx = Laya.Browser.window.wx;
  9055. if (wx) {
  9056. var version = wx.getSystemInfoSync().SDKVersion;
  9057. if (GameUtils_1.GameUtils.compareVersion(version, '2.0.3') >= 0 && wx.openCustomerServiceConversation) {
  9058. wx.openCustomerServiceConversation({
  9059. showMessageCard: true,
  9060. sendMessageImg: "https://resource.51yoyoyo.com/res/wxsendmessageimg/smi.jpg"
  9061. });
  9062. }
  9063. else {
  9064. // AlertUtils.showWordTips("当前微信版本不支持");
  9065. }
  9066. }
  9067. };
  9068. /**
  9069. * 监听内存不足告警
  9070. */
  9071. WXGamePlatform.prototype.onMemoryWarning = function () {
  9072. var wx = Laya.Browser.window.wx;
  9073. if (wx && wx.onMemoryWarning) {
  9074. wx.onMemoryWarning(function () {
  9075. Debuger_1.default.log('onMemoryWarningReceive'); //收到警告,强制清理不必要的资源
  9076. });
  9077. }
  9078. };
  9079. WXGamePlatform.prototype.onError = function () {
  9080. var wx = Laya.Browser.window.wx;
  9081. if (wx && wx.onError) {
  9082. wx.onError(function (res) {
  9083. console.log("*****onError", res);
  9084. });
  9085. }
  9086. };
  9087. /**
  9088. * 开始分享
  9089. */
  9090. WXGamePlatform.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) {
  9091. if (callobj === void 0) { callobj = null; }
  9092. if (succeedCallback === void 0) { succeedCallback = null; }
  9093. if (failCallback === void 0) { failCallback = null; }
  9094. WXGamePlatform.nowShareindex = 0;
  9095. if (WXGamePlatform.ShareDict[key]) {
  9096. TongjiHttps_1.default.getInstance().tongjiData("share", key, 1);
  9097. this.shareApp(WXGamePlatform.ShareDict[key], callobj, succeedCallback, failCallback);
  9098. }
  9099. };
  9100. WXGamePlatform.prototype.shareApp = function (info, callobj, success, failCallback) {
  9101. this.nowshareObj = callobj;
  9102. this.nowshareinfo = info;
  9103. this.nowsharesucceedfun = success;
  9104. this.nowsharefailfun = failCallback;
  9105. this.startShareTime = Laya.Browser.now();
  9106. this.isShareing = true;
  9107. WXGamePlatform.callbackfailstate = 0;
  9108. this.shareAppMessage({
  9109. title: info.tile, imageUrl: Global_1.Global.cdnurl + info.img, query: "",
  9110. success: function (res) {
  9111. },
  9112. fail: function (res) {
  9113. WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("您取消了分享");
  9114. if (failCallback && callobj) {
  9115. failCallback.call(callobj);
  9116. }
  9117. },
  9118. cancel: function (res) {
  9119. WXGamePlatform.callbackfailstate = 1;
  9120. }
  9121. });
  9122. };
  9123. /**
  9124. * 监听小游戏回到前台的事件
  9125. * @param callobj
  9126. * @param succeedcallback
  9127. * @param failCallback
  9128. */
  9129. WXGamePlatform.prototype.onShow = function (callobj, succeedcallback, failCallback) {
  9130. if (callobj === void 0) { callobj = null; }
  9131. if (succeedcallback === void 0) { succeedcallback = null; }
  9132. if (failCallback === void 0) { failCallback = null; }
  9133. this.showobj = callobj;
  9134. this.showCallback = succeedcallback;
  9135. var wx = Laya.Browser.window.wx;
  9136. if (wx) {
  9137. wx.onShow(function (res) {
  9138. WXGamePlatform.isShowing = true;
  9139. Debuger_1.default.log("onShow", res);
  9140. if (res && res.scene) {
  9141. WXGamePlatform.fromscene = Number(res.scene);
  9142. }
  9143. Laya.timer.frameOnce(1, WXGamePlatform.getInstance(), WXGamePlatform.getInstance().onShowSucceed);
  9144. });
  9145. }
  9146. };
  9147. WXGamePlatform.prototype.onShowSucceed = function () {
  9148. var wxgameplatform = WXGamePlatform.getInstance();
  9149. if (wxgameplatform.showobj && wxgameplatform.showCallback) {
  9150. wxgameplatform.showCallback.call(wxgameplatform.showobj);
  9151. }
  9152. if (wxgameplatform.isShareing) //如果是分享状态
  9153. {
  9154. wxgameplatform.isShareing = false;
  9155. var isShareSucceed = false;
  9156. if (WXGamePlatform.callbackfailstate == 0) {
  9157. var nowTime = Laya.Browser.now();
  9158. var disTime = (nowTime - wxgameplatform.startShareTime) / 1000;
  9159. if (disTime >= WXGamePlatform.ShareTime || WXGamePlatform.nowShareindex >= 3) {
  9160. isShareSucceed = true;
  9161. }
  9162. }
  9163. WXGamePlatform.callbackfailstate = 0;
  9164. if (isShareSucceed) {
  9165. if (wxgameplatform.nowshareinfo) {
  9166. TongjiHttps_1.default.getInstance().tongjiData("shareend", wxgameplatform.nowshareinfo.key, 1);
  9167. }
  9168. WXGamePlatform.dayShareNum++;
  9169. wxgameplatform.updateDayShareInfo();
  9170. if (wxgameplatform.nowshareObj && wxgameplatform.nowsharesucceedfun) {
  9171. wxgameplatform.nowsharesucceedfun.call(wxgameplatform.nowshareObj);
  9172. }
  9173. }
  9174. else {
  9175. WXGamePlatform.nowShareindex++;
  9176. wxgameplatform.showModal({
  9177. title: "提示", content: "请每次分享到不同群,是否重新分享?", showCancel: true, cancelText: '取消', confirmText: '确定',
  9178. success: function (res) {
  9179. var wxplatform = WXGamePlatform.getInstance();
  9180. if (res.confirm) {
  9181. WXGamePlatform.getInstance().shareApp(wxplatform.nowshareinfo, wxplatform.nowshareObj, wxplatform.nowsharesucceedfun, wxplatform.nowsharefailfun);
  9182. }
  9183. else {
  9184. if (wxplatform.nowsharefailfun && wxplatform.nowshareObj) {
  9185. wxplatform.nowsharefailfun.call(wxplatform.nowshareObj);
  9186. }
  9187. }
  9188. },
  9189. fail: function () {
  9190. },
  9191. complete: function () {
  9192. }
  9193. });
  9194. }
  9195. }
  9196. };
  9197. /**
  9198. * 看视频领奖励
  9199. * @param callobj
  9200. * @param succeedcallback
  9201. */
  9202. WXGamePlatform.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) {
  9203. var _this = this;
  9204. if (callobj === void 0) { callobj = null; }
  9205. if (succeedcallback === void 0) { succeedcallback = null; }
  9206. if (failCallback === void 0) { failCallback = null; }
  9207. if (istongjiNum === void 0) { istongjiNum = true; }
  9208. var wx = Laya.Browser.window.wx;
  9209. if (wx && wx.createRewardedVideoAd) {
  9210. if (!WXGamePlatform.videoplaying) {
  9211. var time = this.lockVideoLeftTime();
  9212. if (time > 0) {
  9213. WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("广告尚未准备好,请" + time + "秒后再试");
  9214. return;
  9215. }
  9216. EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_losefocus);
  9217. WXGamePlatform.istongjiVideoNum = istongjiNum;
  9218. this.nowvideokey = key;
  9219. TongjiHttps_1.default.getInstance().tongjiData("Video", key, 1);
  9220. WXGamePlatform.videoplaying = true;
  9221. this.videocallobj = callobj;
  9222. this.videosucceedCallback = succeedcallback;
  9223. this.videofailCallback = failCallback;
  9224. this.videoAd = wx.createRewardedVideoAd({
  9225. adUnitId: 'adunit-de007388d8f86f71'
  9226. });
  9227. this.videoAd.onClose(this.closeAD);
  9228. this.videoAd.onError(this.onerro);
  9229. this.videoAd.load().then(function () { return _this.videoAd.show(); }).catch(function (err) { console.log(err.errMsg), WXGamePlatform.getInstance().failVideo(); });
  9230. }
  9231. }
  9232. };
  9233. WXGamePlatform.prototype.lockVideoLeftTime = function () {
  9234. var time = (Laya.Browser.now() - WXGamePlatform.lastVideoTime) / 1000;
  9235. time = WXGamePlatform.VideoTime - time;
  9236. return Math.ceil(time);
  9237. };
  9238. WXGamePlatform.prototype.onerro = function (res) {
  9239. var wxgamePlatform = WXGamePlatform.getInstance();
  9240. WXGamePlatform.videoplaying = false;
  9241. wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
  9242. wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
  9243. EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_getfocus);
  9244. };
  9245. // 关闭广告
  9246. WXGamePlatform.prototype.closeAD = function (status) {
  9247. WXGamePlatform.lastVideoTime = Laya.Browser.now();
  9248. var wxgamePlatform = WXGamePlatform.getInstance();
  9249. if (status && status.isEnded || status == undefined) {
  9250. if (WXGamePlatform.istongjiVideoNum) {
  9251. WXGamePlatform.dayVideoNum++;
  9252. wxgamePlatform.updateDayVideoInfo();
  9253. EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_updateVideoNums);
  9254. }
  9255. TongjiHttps_1.default.getInstance().tongjiData("Videoend", wxgamePlatform.nowvideokey, 1);
  9256. if (wxgamePlatform.videocallobj && wxgamePlatform.videosucceedCallback) {
  9257. wxgamePlatform.videosucceedCallback.call(wxgamePlatform.videocallobj);
  9258. }
  9259. }
  9260. else {
  9261. WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("未观看完整视频,无法获得奖励");
  9262. if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) {
  9263. wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj);
  9264. }
  9265. }
  9266. WXGamePlatform.videoplaying = false;
  9267. wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
  9268. wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
  9269. EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_getfocus);
  9270. };
  9271. // 广告失败
  9272. WXGamePlatform.prototype.failVideo = function () {
  9273. WXGamePlatform.lastVideoTime = Laya.Browser.now();
  9274. WXGamePlatform.videoplaying = false;
  9275. WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("广告加载失败,试试别的方式吧~");
  9276. var wxgamePlatform = WXGamePlatform.getInstance();
  9277. wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
  9278. wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
  9279. if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) {
  9280. wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj);
  9281. }
  9282. EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_getfocus);
  9283. };
  9284. WXGamePlatform.prototype.isCanVideo = function () {
  9285. if (WXGamePlatform.dayVideoNum < WXGamePlatform.VideoNum) {
  9286. if (WXGamePlatform.dayVideoNum == 0) {
  9287. return true;
  9288. }
  9289. var videobs = Math.floor(WXGamePlatform.dayVideoNum / WXGamePlatform.VideotoShare);
  9290. var sharebs = Math.floor(WXGamePlatform.dayShareNum / WXGamePlatform.SharetoVideo);
  9291. if (videobs > sharebs) {
  9292. return false;
  9293. }
  9294. else if (videobs < sharebs) {
  9295. return true;
  9296. }
  9297. else {
  9298. var videoyushu = WXGamePlatform.dayVideoNum % WXGamePlatform.VideotoShare;
  9299. if (videoyushu != 0) {
  9300. return true;
  9301. }
  9302. var shareyushu = WXGamePlatform.dayShareNum % WXGamePlatform.SharetoVideo;
  9303. if (shareyushu != 0) {
  9304. return false;
  9305. }
  9306. return true;
  9307. }
  9308. }
  9309. return false;
  9310. };
  9311. WXGamePlatform.prototype.createBanner = function (bannertype, style) {
  9312. if (bannertype === void 0) { bannertype = ""; }
  9313. if (Laya.Browser.window.wx) {
  9314. if (bannertype != "") {
  9315. var bo = false;
  9316. for (var i = 0; i < this._bannerTypeList.length; i++) {
  9317. if (bannertype == this._bannerTypeList[i].type) {
  9318. this._bannerTypeList[i].style = style;
  9319. var arr = this._bannerTypeList.splice(i, 1);
  9320. this._bannerTypeList.push(arr[0]);
  9321. bo = true;
  9322. break;
  9323. }
  9324. }
  9325. if (!bo) {
  9326. this._bannerTypeList.push({ type: bannertype, style: style });
  9327. }
  9328. }
  9329. else {
  9330. if (this._bannerTypeList.length == 0) {
  9331. return;
  9332. }
  9333. else {
  9334. var item = this._bannerTypeList[this._bannerTypeList.length - 1];
  9335. style = item.style;
  9336. }
  9337. }
  9338. if (this.bannerAd) {
  9339. var now = Laya.Browser.now();
  9340. //超过3分钟刷新
  9341. if (now - this.bannerRunTime > 60000 * 3) {
  9342. Debuger_1.default.log("先移除banner,再添加");
  9343. this.bannerAd.offError(this.bannerError);
  9344. this.bannerAd.offResize(this.bannerResize);
  9345. this.bannerAd.destory();
  9346. this.createNewBanner(style);
  9347. }
  9348. else {
  9349. this.showBanner(style);
  9350. }
  9351. }
  9352. else {
  9353. this.createNewBanner(style);
  9354. }
  9355. }
  9356. };
  9357. WXGamePlatform.prototype.createNewBanner = function (style) {
  9358. var wx = Laya.Browser.window.wx;
  9359. if (wx && wx.createBannerAd) {
  9360. this.nowStype = style;
  9361. this.bannerRunTime = Laya.Browser.now();
  9362. var info = this.getSystemInfoSync();
  9363. this._screenwidth = info.screenWidth;
  9364. var scale = 1;
  9365. if (style.hasOwnProperty("scale")) {
  9366. scale = style.scale;
  9367. }
  9368. this.bannerAd = wx.createBannerAd({
  9369. adUnitId: 'adunit-6ec2688adfaf5a34',
  9370. adIntervals: 30,
  9371. style: {
  9372. left: 0,
  9373. top: info.screenHeight - 105,
  9374. width: info.screenWidth * scale
  9375. }
  9376. });
  9377. if (this.bannerAd) {
  9378. this.bannerAd.onError(this.bannerError);
  9379. this.showBanner(style);
  9380. }
  9381. }
  9382. };
  9383. WXGamePlatform.prototype.bannerResize = function (res) {
  9384. Debuger_1.default.log("bannerResize", res);
  9385. var self = WXGamePlatform.getInstance();
  9386. self.bannerAd.offResize(self.bannerResize);
  9387. self.isonResize = false;
  9388. var nowstype = self.nowStype;
  9389. if (!nowstype) {
  9390. return;
  9391. }
  9392. var info = self.getSystemInfoSync();
  9393. var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight;
  9394. var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth;
  9395. self.bannerwidth = res.width;
  9396. self.bannerheight = res.height;
  9397. if (nowstype.hasOwnProperty("x") && nowstype.x != 0) {
  9398. self.bannerAd.style.left = nowstype.x * percentageW;
  9399. }
  9400. else {
  9401. self.bannerAd.style.left = (info.windowWidth - res.width) * 0.5;
  9402. }
  9403. if (nowstype.hasOwnProperty("y") && nowstype.y != 0) {
  9404. self.bannerAd.style.top = nowstype.y * percentageH;
  9405. }
  9406. else {
  9407. self.bannerAd.style.top = (info.windowHeight - res.height) - 15;
  9408. }
  9409. };
  9410. WXGamePlatform.prototype.bannerError = function (err) {
  9411. Debuger_1.default.log(err);
  9412. };
  9413. WXGamePlatform.prototype.showBanner = function (style) {
  9414. if (this.bannerAd) {
  9415. this.nowStype = style;
  9416. var info = this.getSystemInfoSync();
  9417. Debuger_1.default.log("getSystemInfoSync:", info);
  9418. var nowstype = this.nowStype;
  9419. var scale = 1;
  9420. if (nowstype.hasOwnProperty("scale")) {
  9421. scale = nowstype.scale;
  9422. }
  9423. var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight;
  9424. var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth;
  9425. if (nowstype.hasOwnProperty("x") && nowstype.x != 0) {
  9426. this.bannerAd.style.left = nowstype.x * percentageW;
  9427. }
  9428. else {
  9429. this.bannerAd.style.left = (info.windowWidth - this.bannerwidth) * 0.5;
  9430. }
  9431. if (nowstype.hasOwnProperty("y") && nowstype.y != 0) {
  9432. this.bannerAd.style.top = nowstype.y * percentageH;
  9433. }
  9434. else {
  9435. this.bannerAd.style.top = (info.windowHeight - this.bannerheight) - 15;
  9436. }
  9437. this.bannerAd.style.width = info.screenWidth * scale;
  9438. if (!this.isonResize) {
  9439. this.isonResize = true;
  9440. this.bannerAd.onResize(this.bannerResize);
  9441. }
  9442. this.bannerAd.show();
  9443. }
  9444. };
  9445. WXGamePlatform.prototype.hideBanner = function (type) {
  9446. if (type === void 0) { type = ""; }
  9447. if (this.bannerAd) {
  9448. this.bannerAd.hide();
  9449. }
  9450. if (type != "") {
  9451. for (var i = 0; i < this._bannerTypeList.length; i++) {
  9452. if (type == this._bannerTypeList[i].type) {
  9453. this._bannerTypeList.splice(i, 1);
  9454. break;
  9455. }
  9456. }
  9457. if (this._bannerTypeList.length > 0) {
  9458. var item = this._bannerTypeList[this._bannerTypeList.length - 1];
  9459. this.createBanner(item.type, item.style);
  9460. }
  9461. }
  9462. };
  9463. // private _wxOpenDataViewer:WXOpenDataViewer;
  9464. /**
  9465. * 打开好友排行榜
  9466. */
  9467. WXGamePlatform.prototype.openFriendRank = function (type, viewType, rect, parent, data) {
  9468. if (parent === void 0) { parent = null; }
  9469. if (data === void 0) { data = null; }
  9470. this.closeziyuStage();
  9471. this._openrankDict[viewType] = { type: type, viewType: viewType, rect: rect, parent: parent, data: data };
  9472. this.initziyuStage(rect, parent);
  9473. this.postMessage(type, data);
  9474. };
  9475. /**
  9476. * 排行榜打开状态时候,切换显示类型
  9477. * @param type
  9478. */
  9479. WXGamePlatform.prototype.changeFriendRank = function (type) {
  9480. this.postMessage(type);
  9481. };
  9482. /**
  9483. * 排行榜上一页
  9484. */
  9485. WXGamePlatform.prototype.prePageRank = function () {
  9486. this.postMessage(RankType_1.RankType.prepage);
  9487. };
  9488. /**
  9489. * 排行榜下一页
  9490. */
  9491. WXGamePlatform.prototype.nextPageRank = function () {
  9492. this.postMessage(RankType_1.RankType.nextpage);
  9493. };
  9494. /**
  9495. * 关闭好友排行榜
  9496. */
  9497. WXGamePlatform.prototype.closeFriendRank = function (viewType) {
  9498. this.postMessage(RankType_1.RankType.closefriendrank);
  9499. this.closeziyuStage();
  9500. if (this._openrankDict[viewType]) {
  9501. delete this._openrankDict[viewType];
  9502. }
  9503. for (var s in this._openrankDict) {
  9504. var itemd = this._openrankDict[s];
  9505. this.openFriendRank(itemd.type, itemd.viewType, itemd.rect, itemd.parent, itemd.data);
  9506. break;
  9507. }
  9508. };
  9509. /**
  9510. * 初始化子域
  9511. * @param rect
  9512. * @param parent
  9513. */
  9514. WXGamePlatform.prototype.initziyuStage = function (rect, parent) {
  9515. // if( !this._wxOpenDataViewer )
  9516. // {
  9517. // this._wxOpenDataViewer = new WXOpenDataViewer();
  9518. // if( parent )
  9519. // {
  9520. // parent.addChild( this._wxOpenDataViewer );
  9521. // }
  9522. // else
  9523. // {
  9524. // GameLayerManager.getInstance().topLayer.displayObject.addChild( this._wxOpenDataViewer );
  9525. // }
  9526. // }
  9527. // this._wxOpenDataViewer.x = rect.x;
  9528. // this._wxOpenDataViewer.y = rect.y;
  9529. // this._wxOpenDataViewer.width = rect.width;
  9530. // this._wxOpenDataViewer.height = rect.height;
  9531. };
  9532. /**
  9533. * 销毁子域
  9534. */
  9535. WXGamePlatform.prototype.closeziyuStage = function () {
  9536. // if( this._wxOpenDataViewer )
  9537. // {
  9538. // this._wxOpenDataViewer.destroy();
  9539. // this._wxOpenDataViewer.removeSelf();
  9540. // this._wxOpenDataViewer = null;
  9541. // }
  9542. };
  9543. /**
  9544. * 数据上传(用于排行榜数据显示)
  9545. * @param param1 上报数据
  9546. * @param param2 上报数据
  9547. */
  9548. WXGamePlatform.prototype.storeToCloud = function (param1, param2) {
  9549. var cacheMager = CacheManager_1.default.getInstance();
  9550. var score1 = cacheMager.getnum("param1");
  9551. // var score2:number = cacheMager.getnum( "param2" );
  9552. param1 = Math.floor(param1);
  9553. param2 = Math.floor(param2);
  9554. var result1 = param1;
  9555. var result2 = param2;
  9556. if (result1 < score1) {
  9557. result1 = score1;
  9558. }
  9559. else {
  9560. cacheMager.addstr("param1", result1.toString());
  9561. }
  9562. var arr = [];
  9563. arr.push({ key: "param1", value: result1.toString() });
  9564. arr.push({ key: "param2", value: result2 + "" });
  9565. Debuger_1.default.log("storeToCloud", arr);
  9566. this.setUserCloudStorage(arr);
  9567. };
  9568. WXGamePlatform.prototype.createGameClubButton = function (style, icon) {
  9569. if (icon === void 0) { icon = "green"; }
  9570. var wx = Laya.Browser.window.wx;
  9571. if (wx && style) {
  9572. style.width = 40;
  9573. style.height = 40;
  9574. WXGamePlatform.gameclubButton = wx.createGameClubButton({
  9575. icon: icon,
  9576. style: style
  9577. });
  9578. if (WXGamePlatform.gameclubButton) {
  9579. WXGamePlatform.gameclubButton.show();
  9580. }
  9581. }
  9582. };
  9583. WXGamePlatform.QuDaoID = ""; //微信广告ID
  9584. WXGamePlatform.isShowing = true;
  9585. /**
  9586. * 授权状态 0:未判断,1:已授权
  9587. */
  9588. WXGamePlatform.accreditstate = 0;
  9589. /**
  9590. * 当天分享次数
  9591. */
  9592. WXGamePlatform.dayShareNum = 0;
  9593. /**
  9594. * 当天看视频次数
  9595. */
  9596. WXGamePlatform.dayVideoNum = 0;
  9597. /**
  9598. * 判断分享是否成功时间间隔
  9599. */
  9600. WXGamePlatform.ShareTime = 0;
  9601. /**
  9602. * 每日最大看视频次数(成功累加一次)
  9603. */
  9604. WXGamePlatform.VideoNum = 0;
  9605. /**
  9606. * 看视频冷却时间
  9607. */
  9608. WXGamePlatform.VideoTime = 0;
  9609. /**
  9610. * 8好位cpa可弹出时间间隔(秒)
  9611. */
  9612. WXGamePlatform.jiliweitime = 100;
  9613. /**
  9614. * 分享几次切换到视频
  9615. */
  9616. WXGamePlatform.SharetoVideo = 1;
  9617. /**
  9618. * 视频几次切换到分享
  9619. */
  9620. WXGamePlatform.VideotoShare = 1;
  9621. /**
  9622. * 分享数据容器
  9623. */
  9624. WXGamePlatform.ShareDict = {};
  9625. /**
  9626. * 用户来源id
  9627. */
  9628. WXGamePlatform.fromscene = 0;
  9629. WXGamePlatform.nowShareindex = 0;
  9630. WXGamePlatform.callbackfailstate = 0;
  9631. WXGamePlatform.lastVideoTime = 0;
  9632. /**
  9633. * 视频是否在播放中
  9634. */
  9635. WXGamePlatform.videoplaying = false;
  9636. WXGamePlatform.istongjiVideoNum = true;
  9637. return WXGamePlatform;
  9638. }());
  9639. exports.default = WXGamePlatform;
  9640. },{"../../Global":2,"../../frameworks/Debuger":12,"../../frameworks/events/EventUtils":16,"../../frameworks/net/GameHttps":26,"../../frameworks/net/TongjiHttps":28,"../../gamemodule/loading/view/WordTipsUtils":36,"../../gamemodule/userinfo/events/UserCacheType":55,"../../managers/CacheManager":59,"../../managers/DayManager":60,"../../managers/SoundssManager":65,"../../utils/GameUtils":87,"../events/PlatformEvent":69,"../types/RankType":70}],73:[function(require,module,exports){
  9641. "use strict";
  9642. Object.defineProperty(exports, "__esModule", { value: true });
  9643. var Sdk_1 = require("./Sdk");
  9644. var YQSdk_1 = require("./YQSdk");
  9645. var ShareUtil_1 = require("./ShareUtil");
  9646. var PlayerAccount_1 = require("./PlayerAccount");
  9647. var WxGameItem = /** @class */ (function () {
  9648. function WxGameItem() {
  9649. this.appNameHidden = false;
  9650. this.color = "C93B3BFF";
  9651. this.size = 100;
  9652. this.borderWidth = 50;
  9653. this.borderColor = "A1A0A0FF";
  9654. }
  9655. return WxGameItem;
  9656. }());
  9657. exports.WxGameItem = WxGameItem;
  9658. var GuangGao = /** @class */ (function () {
  9659. function GuangGao() {
  9660. }
  9661. Object.defineProperty(GuangGao, "hasbanner", {
  9662. get: function () {
  9663. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.banner) {
  9664. return true;
  9665. }
  9666. else {
  9667. return false;
  9668. }
  9669. },
  9670. enumerable: true,
  9671. configurable: true
  9672. });
  9673. Object.defineProperty(GuangGao, "hasvideo", {
  9674. get: function () {
  9675. if (Laya.Browser.onWeiXin && PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video) {
  9676. var videonum = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetGlobe;
  9677. return true;
  9678. }
  9679. else {
  9680. return false;
  9681. }
  9682. },
  9683. enumerable: true,
  9684. configurable: true
  9685. });
  9686. //预先加载视屏广告
  9687. GuangGao.InitVideo = function () {
  9688. var _this = this;
  9689. if (!Laya.Browser.onWeiXin || !PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video)
  9690. return;
  9691. console.log(this.bannerAdUnitId);
  9692. //vedio
  9693. this.fsaasfafssfa = Laya.Browser.window.wx.createRewardedVideoAd({ adUnitId: this.videlAdUnitId });
  9694. this.fsaasfafssfa.onLoad(function () {
  9695. console.log('激励视频 广告加载成功');
  9696. _this.asfasfsaffsa = true;
  9697. });
  9698. this.fsaasfafssfa.onError(function (err) {
  9699. console.log("激励视屏加载失败:" + err);
  9700. _this.asfasfsaffsa = false;
  9701. });
  9702. this.afsfsaafsfsa = true;
  9703. };
  9704. //看视频
  9705. GuangGao.ShowVideo = function (callback) {
  9706. var _this = this;
  9707. if (this.hasvideo) {
  9708. if (this.asfasfsaffsa) {
  9709. YQSdk_1.YQSdk.statistics1("video");
  9710. console.log("showVideoAd:" + this.asfasfsaffsa);
  9711. this.SetVideoCallBack(callback);
  9712. this.fsaasfafssfa.show().catch(function (err) {
  9713. _this.fsaasfafssfa.load().then(function () {
  9714. _this.SetVideoCallBack(callback);
  9715. _this.fsaasfafssfa.show();
  9716. });
  9717. });
  9718. }
  9719. else {
  9720. ShareUtil_1.ShareUtil.shareImage("视频没有分享", callback, "1");
  9721. }
  9722. }
  9723. else {
  9724. callback(false);
  9725. ShareUtil_1.ShareUtil.shareImage("视频没有分享", callback, "1");
  9726. }
  9727. };
  9728. GuangGao.SetVideoCallBack = function (callback) {
  9729. var _this = this;
  9730. this.fsaasfafssfa.offClose();
  9731. this.fsaasfafssfa.onClose(function (res) {
  9732. console.log("激励视频关闭:" + res.isEnded);
  9733. if (res && res.isEnded || res === undefined) {
  9734. callback && callback(true);
  9735. }
  9736. else {
  9737. callback && callback(false);
  9738. }
  9739. _this.fsaasfafssfa.offClose();
  9740. });
  9741. };
  9742. //打开banner
  9743. GuangGao.OpenBanner = function (gap, callVack, iswait) {
  9744. var _this = this;
  9745. if (gap === void 0) { gap = 0; }
  9746. if (callVack === void 0) { callVack = null; }
  9747. if (iswait === void 0) { iswait = false; }
  9748. if (!this.hasbanner) {
  9749. callVack(null);
  9750. return;
  9751. }
  9752. if (!Laya.Browser.onWeiXin) {
  9753. callVack(null);
  9754. return;
  9755. }
  9756. this.canshowbanner = true;
  9757. var idd = this.bannerAdUnitId;
  9758. console.log("adUnitId:" + idd);
  9759. var newBanner = Laya.Browser.window.wx.createBannerAd({
  9760. adUnitId: idd,
  9761. style: {
  9762. left: 0,
  9763. top: 0,
  9764. width: 460
  9765. }
  9766. });
  9767. newBanner.onError(function (err) {
  9768. console.log(err);
  9769. callVack(null);
  9770. });
  9771. newBanner.onLoad(function () {
  9772. if (_this.curbanner)
  9773. _this.curbanner.destroy();
  9774. _this.curbanner = newBanner;
  9775. var hight = _this.GetRealHight(gap);
  9776. if (callVack != null) {
  9777. callVack(hight);
  9778. }
  9779. if (_this.canshowbanner && !iswait) {
  9780. _this.curbanner.show();
  9781. }
  9782. else {
  9783. _this.curbanner.hide();
  9784. }
  9785. });
  9786. };
  9787. GuangGao.GetRealHight = function (gap) {
  9788. if (this.curbanner) {
  9789. var info = Laya.Browser.window.wx.getSystemInfoSync();
  9790. this.curbanner.style.width = info.windowWidth;
  9791. this.curbanner.style.top = info.windowHeight - this.curbanner.style.realHeight - gap;
  9792. return Laya.stage.height / info.windowHeight * this.curbanner.style.realHeight;
  9793. }
  9794. };
  9795. //clear
  9796. GuangGao.Clear = function () {
  9797. Laya.timer.clearAll(this);
  9798. Laya.Tween.clearAll(this);
  9799. this.canshowbanner = false;
  9800. if (this.curbanner)
  9801. this.curbanner.hide();
  9802. YQSdk_1.YQSdk.HideBannerImage();
  9803. // if (!Laya.Browser.onWeiXin) return;
  9804. // if (this.curbanner) this.curbanner.hide();
  9805. };
  9806. GuangGao.hidebanner = function () {
  9807. if (!Laya.Browser.onWeiXin)
  9808. return;
  9809. if (this.curbanner)
  9810. this.curbanner.hide();
  9811. YQSdk_1.YQSdk.HideBannerImage();
  9812. };
  9813. GuangGao.showbanner = function () {
  9814. if (!Laya.Browser.onWeiXin)
  9815. return;
  9816. if (this.curbanner)
  9817. this.curbanner.show();
  9818. };
  9819. Object.defineProperty(GuangGao, "cancheat", {
  9820. get: function () {
  9821. if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.cheat) {
  9822. console.log("cheat:false-> CurAccountData.cheat != 1");
  9823. return false;
  9824. }
  9825. var checkscence = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.checkscence;
  9826. if (checkscence == false) {
  9827. console.log("cheat:true-> " + Sdk_1.WxApi.sceneValue);
  9828. return true;
  9829. }
  9830. if (Sdk_1.WxApi.sceneValue == "1037" || Sdk_1.WxApi.sceneValue == "1058" || Sdk_1.WxApi.sceneValue == "1067" || Sdk_1.WxApi.sceneValue == "1095") {
  9831. console.log("cheat:true-> " + Sdk_1.WxApi.sceneValue);
  9832. return true;
  9833. }
  9834. console.log("cheat:false-> " + Sdk_1.WxApi.sceneValue);
  9835. return false;
  9836. },
  9837. enumerable: true,
  9838. configurable: true
  9839. });
  9840. GuangGao.SetPosBanner = function (btn, complete) {
  9841. var _this = this;
  9842. if (Laya.Browser.onPC) {
  9843. complete(false);
  9844. return;
  9845. }
  9846. var info = Laya.Browser.window.wx.getSystemInfoSync();
  9847. //console.log(info);
  9848. //console.log(btn);
  9849. //console.log(btn.y,Laya.stage.height,info.windowHeight);
  9850. var reshight = btn.y * info.windowHeight / Laya.stage.height;
  9851. //console.log("reshight",reshight);
  9852. var idd = this.bannerAdUnitId;
  9853. console.log("adUnitId:" + idd);
  9854. if (this.curbanner)
  9855. this.curbanner.destroy();
  9856. var newBanner = Laya.Browser.window.wx.createBannerAd({
  9857. adUnitId: idd,
  9858. style: {
  9859. left: 0,
  9860. top: 0,
  9861. width: 720
  9862. }
  9863. });
  9864. newBanner.onError(function (err) {
  9865. console.log(err);
  9866. complete(false);
  9867. });
  9868. newBanner.onLoad(function () {
  9869. _this.curbanner = newBanner;
  9870. _this.curbanner.style.top = reshight;
  9871. //console.log("top",this.asgagassga.style.top);
  9872. if (_this.curbanner) {
  9873. console.log("banner show");
  9874. _this.curbanner.show();
  9875. Laya.timer.once(2300, _this, function () {
  9876. _this.curbanner.style.top = info.windowHeight - GuangGao.bannerhigt;
  9877. complete(true);
  9878. });
  9879. }
  9880. });
  9881. newBanner.onResize(function (res) {
  9882. GuangGao.bannerhigt = res.height;
  9883. _this.curbanner.style.width = info.windowWidth;
  9884. _this.curbanner.style.top = reshight;
  9885. });
  9886. };
  9887. //按钮误导
  9888. GuangGao.CheatBanner = function (btn, complete, gap) {
  9889. var _this = this;
  9890. if (complete === void 0) { complete = null; }
  9891. if (gap === void 0) { gap = 0; }
  9892. if (!GuangGao.cancheat) {
  9893. console.log("ignorecheat");
  9894. GuangGao.OpenBanner(0, function (height) {
  9895. if (height == null) {
  9896. YQSdk_1.YQSdk.ShowBannerImag(function (hh) {
  9897. var end = Laya.stage.height - hh - btn.height;
  9898. btn.y = end;
  9899. });
  9900. }
  9901. });
  9902. }
  9903. else {
  9904. btn.y = Laya.stage.height - btn.height - 100;
  9905. GuangGao.OpenBanner(gap, function (height) {
  9906. // var random = Math.random();
  9907. if (height == null) {
  9908. YQSdk_1.YQSdk.ShowBannerImag(function (hh) {
  9909. var end = Laya.stage.height - hh - btn.height;
  9910. btn.y = end;
  9911. console.log(btn.y);
  9912. });
  9913. }
  9914. else {
  9915. console.log("cheatstart", "bottom:100");
  9916. btn.mouseEnabled = false;
  9917. var end = Laya.stage.height - height - btn.height - 20;
  9918. console.log("y:" + end);
  9919. Laya.timer.once(PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.cheattime * 1000, _this, function () {
  9920. btn.mouseEnabled = true;
  9921. _this.showbanner();
  9922. Laya.Tween.to(btn, { y: end }, 500, null, Laya.Handler.create(_this, function () {
  9923. if (complete != null) {
  9924. complete();
  9925. }
  9926. }));
  9927. });
  9928. }
  9929. }, true);
  9930. }
  9931. };
  9932. GuangGao.videlAdUnitId = "adunit-a9203b2080cbb5dd";
  9933. GuangGao.bannerAdUnitId = "adunit-41998ab40c864a45";
  9934. GuangGao.afsfsaafsfsa = false;
  9935. //视屏广告是否加载成功
  9936. GuangGao.asfasfsaffsa = false;
  9937. GuangGao.canshowbanner = true;
  9938. // static get CanCreatWxBannerRe():boolean
  9939. // {
  9940. // if(!Main.WX)return false;
  9941. // if(!Account.Instance.curplayerData.WxRe)return false;
  9942. // let info = Laya.Browser.window.wx.getSystemInfoSync();
  9943. // if(!this.cpVersionGreaterOrEqual(info.SDKVersion,"2.7.5"))return false;
  9944. // return true;
  9945. // }
  9946. // static get CanCreatWxGameRe():boolean
  9947. // {
  9948. // if(!Main.WX)return false;
  9949. // if(!Account.Instance.curplayerData.WxRe)return false;
  9950. // let info = Laya.Browser.window.wx.getSystemInfoSync();
  9951. // if(!this.cpVersionGreaterOrEqual(info.SDKVersion,"2.8.3"))return false;
  9952. // return true;
  9953. // }
  9954. // static wxrebannerid = "PBgAA_2ABDZFRyYw";
  9955. // static wxbanner:any;
  9956. // static ShowXWBanner()
  9957. // {
  9958. // if (!Main.WX) return;
  9959. // var idd = this.wxrebannerid;
  9960. // let newBanner = Laya.Browser.window.wx.createGameBanner({
  9961. // adUnitId: idd,
  9962. // style:
  9963. // {
  9964. // left: 0,
  9965. // top: 0,
  9966. // }
  9967. // });
  9968. // newBanner.onError(err => {
  9969. // console.log(err);
  9970. // });
  9971. // newBanner.onLoad(() =>
  9972. // {
  9973. // if (this.wxbanner) this.wxbanner.destroy();
  9974. // this.wxbanner = newBanner;
  9975. // this.wxbanner.show();
  9976. // });
  9977. // }
  9978. // static wxregameid = "PBgAA_2ABDZKVIlM";
  9979. // static wxgame:any;
  9980. // static ShowXWGame()
  9981. // {
  9982. // if (!Main.WX || !this.CanCreatWxGameRe) return;
  9983. // var idd = this.wxregameid;
  9984. // let info = Laya.Browser.window.wx.getSystemInfoSync();
  9985. // var game1 = new WxGameItem();
  9986. // game1.top = info.windowHeight * 0.3;
  9987. // game1.left = info.windowWidth - 80;
  9988. // var games = [game1];
  9989. // let newGame = Laya.Browser.window.wx.createGameIcon({
  9990. // adUnitId: idd,
  9991. // count: 1,
  9992. // style: games
  9993. // },game1);
  9994. // newGame.onError(err => {
  9995. // console.log(err);
  9996. // });
  9997. // newGame.onLoad(() =>
  9998. // {
  9999. // if (this.wxgame) this.wxgame.destroy();
  10000. // this.wxgame = newGame;
  10001. // this.wxgame.show();
  10002. // });
  10003. // }
  10004. GuangGao.bannerhigt = 0;
  10005. return GuangGao;
  10006. }());
  10007. exports.default = GuangGao;
  10008. },{"./PlayerAccount":74,"./Sdk":75,"./ShareUtil":76,"./YQSdk":77}],74:[function(require,module,exports){
  10009. "use strict";
  10010. Object.defineProperty(exports, "__esModule", { value: true });
  10011. var Sdk_1 = require("../WXSDK/Sdk");
  10012. var GameUtils_1 = require("../../../utils/GameUtils");
  10013. var NetworkManager_1 = require("../NetworkManager");
  10014. var requiretype;
  10015. (function (requiretype) {
  10016. requiretype[requiretype["\u7CFB\u7EDF\u8D60\u9001"] = 1] = "\u7CFB\u7EDF\u8D60\u9001";
  10017. requiretype[requiretype["\u91D1\u5E01\u8D2D\u4E70"] = 2] = "\u91D1\u5E01\u8D2D\u4E70";
  10018. requiretype[requiretype["\u89C2\u770B\u89C6\u9891"] = 3] = "\u89C2\u770B\u89C6\u9891";
  10019. requiretype[requiretype["\u5206\u4EAB"] = 4] = "\u5206\u4EAB";
  10020. requiretype[requiretype["\u7B7E\u5230"] = 5] = "\u7B7E\u5230";
  10021. requiretype[requiretype["\u6D3B\u52A8"] = 6] = "\u6D3B\u52A8";
  10022. requiretype[requiretype["\u901A\u8FC7\u5173\u5361"] = 7] = "\u901A\u8FC7\u5173\u5361";
  10023. requiretype[requiretype["\u7D2F\u8BA1\u767B\u9646"] = 8] = "\u7D2F\u8BA1\u767B\u9646";
  10024. requiretype[requiretype["\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230"] = 9] = "\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230";
  10025. requiretype[requiretype["\u7816\u77F3\u8D2D\u4E70"] = 10] = "\u7816\u77F3\u8D2D\u4E70";
  10026. })(requiretype = exports.requiretype || (exports.requiretype = {}));
  10027. var AccountConfig;
  10028. (function (AccountConfig) {
  10029. AccountConfig[AccountConfig["crop"] = 0] = "crop";
  10030. AccountConfig[AccountConfig["things"] = 1] = "things";
  10031. AccountConfig[AccountConfig["land"] = 2] = "land";
  10032. AccountConfig[AccountConfig["global"] = 3] = "global";
  10033. AccountConfig[AccountConfig["entity"] = 4] = "entity";
  10034. AccountConfig[AccountConfig["sign"] = 5] = "sign";
  10035. AccountConfig[AccountConfig["rewards"] = 6] = "rewards";
  10036. AccountConfig[AccountConfig["achievement"] = 7] = "achievement";
  10037. AccountConfig[AccountConfig["invite"] = 8] = "invite";
  10038. AccountConfig[AccountConfig["mission"] = 9] = "mission";
  10039. AccountConfig[AccountConfig["treasure_click"] = 10] = "treasure_click";
  10040. AccountConfig[AccountConfig["theme"] = 11] = "theme";
  10041. AccountConfig[AccountConfig["lottery"] = 12] = "lottery";
  10042. })(AccountConfig = exports.AccountConfig || (exports.AccountConfig = {}));
  10043. var AccountUser;
  10044. (function (AccountUser) {
  10045. AccountUser[AccountUser["money"] = 0] = "money";
  10046. AccountUser[AccountUser["diamond"] = 1] = "diamond";
  10047. AccountUser[AccountUser["user_id"] = 2] = "user_id";
  10048. AccountUser[AccountUser["game_times"] = 3] = "game_times";
  10049. AccountUser[AccountUser["get_themes"] = 4] = "get_themes";
  10050. AccountUser[AccountUser["video_times"] = 5] = "video_times";
  10051. AccountUser[AccountUser["equip_themes"] = 6] = "equip_themes";
  10052. AccountUser[AccountUser["last_action_time"] = 7] = "last_action_time";
  10053. AccountUser[AccountUser["last_favorite_time"] = 8] = "last_favorite_time";
  10054. AccountUser[AccountUser["progress_themes"] = 9] = "progress_themes";
  10055. AccountUser[AccountUser["revival"] = 10] = "revival";
  10056. AccountUser[AccountUser["stage"] = 11] = "stage";
  10057. AccountUser[AccountUser["vmoney"] = 12] = "vmoney";
  10058. })(AccountUser = exports.AccountUser || (exports.AccountUser = {}));
  10059. var heroAttr;
  10060. (function (heroAttr) {
  10061. heroAttr[heroAttr["id"] = 0] = "id";
  10062. heroAttr[heroAttr["name"] = 1] = "name";
  10063. heroAttr[heroAttr["quality"] = 2] = "quality";
  10064. heroAttr[heroAttr["icon"] = 3] = "icon";
  10065. heroAttr[heroAttr["prefab"] = 4] = "prefab";
  10066. heroAttr[heroAttr["require_num"] = 5] = "require_num";
  10067. heroAttr[heroAttr["require_type"] = 6] = "require_type";
  10068. })(heroAttr = exports.heroAttr || (exports.heroAttr = {}));
  10069. var signdata;
  10070. (function (signdata) {
  10071. signdata[signdata["sign_days"] = 0] = "sign_days";
  10072. signdata[signdata["sign_time"] = 1] = "sign_time";
  10073. })(signdata = exports.signdata || (exports.signdata = {}));
  10074. var entity;
  10075. (function (entity) {
  10076. entity[entity["id"] = 0] = "id";
  10077. entity[entity["name"] = 1] = "name";
  10078. entity[entity["entity_id"] = 2] = "entity_id";
  10079. entity[entity["icon"] = 3] = "icon";
  10080. })(entity = exports.entity || (exports.entity = {}));
  10081. var skinattr;
  10082. (function (skinattr) {
  10083. skinattr[skinattr["effectValue_1"] = 0] = "effectValue_1";
  10084. skinattr[skinattr["effectValue_2"] = 1] = "effectValue_2";
  10085. skinattr[skinattr["effectValue_3"] = 2] = "effectValue_3";
  10086. skinattr[skinattr["effectValue_4"] = 3] = "effectValue_4";
  10087. })(skinattr = exports.skinattr || (exports.skinattr = {}));
  10088. var AccountData = /** @class */ (function () {
  10089. function AccountData(_token, _config, _appSetting, _user, _userbase, _useInvite, _user_stage, _user_sign, _user_achievement, _lottery, _use_land_task, _user_video) {
  10090. if (_useInvite === void 0) { _useInvite = null; }
  10091. if (_user_stage === void 0) { _user_stage = null; }
  10092. this.openid = "";
  10093. this.userId = "";
  10094. this.roadconfig = {};
  10095. this.m_RewardDic = {};
  10096. this.m_EntityDic = {};
  10097. this.m_AchievementDic = {};
  10098. this.m_token = _token;
  10099. this.m_app_setting = _appSetting;
  10100. this.m_user = _user;
  10101. this.m_user_base = _userbase;
  10102. this.m_sign = _user_sign;
  10103. this.m_task = _user_achievement;
  10104. this.lottery = _lottery;
  10105. this.m_use_land_task = _use_land_task;
  10106. this.m_user_video = _user_video;
  10107. this.userId = this.m_user["user_id"];
  10108. this.openid = this.m_user_base["openid"];
  10109. console.log("user_id:" + this.userId);
  10110. //console.log("open_id:"+this.openid);
  10111. }
  10112. Object.defineProperty(AccountData.prototype, "lotterytime", {
  10113. // public m_skinDic:Dictionary<number,SkinData> = new Dictionary();
  10114. get: function () {
  10115. return Number(this.lottery["day_video_times"]);
  10116. },
  10117. enumerable: true,
  10118. configurable: true
  10119. });
  10120. Object.defineProperty(AccountData.prototype, "share", {
  10121. get: function () {
  10122. return this.m_app_setting["share"] == "1";
  10123. },
  10124. enumerable: true,
  10125. configurable: true
  10126. });
  10127. Object.defineProperty(AccountData.prototype, "sharecontent", {
  10128. get: function () {
  10129. return this.m_app_setting["sharecontent"];
  10130. },
  10131. enumerable: true,
  10132. configurable: true
  10133. });
  10134. Object.defineProperty(AccountData.prototype, "ShareImage", {
  10135. get: function () {
  10136. return this.m_app_setting["ShareImage"];
  10137. },
  10138. enumerable: true,
  10139. configurable: true
  10140. });
  10141. Object.defineProperty(AccountData.prototype, "cheattime", {
  10142. get: function () {
  10143. return Number(this.m_app_setting["cheattime"]);
  10144. },
  10145. enumerable: true,
  10146. configurable: true
  10147. });
  10148. Object.defineProperty(AccountData.prototype, "banner", {
  10149. get: function () {
  10150. return this.m_app_setting["banner"] == "1";
  10151. },
  10152. enumerable: true,
  10153. configurable: true
  10154. });
  10155. Object.defineProperty(AccountData.prototype, "video", {
  10156. get: function () {
  10157. return this.m_app_setting["video"] == "1";
  10158. },
  10159. enumerable: true,
  10160. configurable: true
  10161. });
  10162. Object.defineProperty(AccountData.prototype, "BtnCanMove", {
  10163. get: function () {
  10164. return this.m_app_setting["BtnCanMove"] == "1";
  10165. },
  10166. enumerable: true,
  10167. configurable: true
  10168. });
  10169. Object.defineProperty(AccountData.prototype, "checkscence", {
  10170. get: function () {
  10171. return this.m_app_setting["checkscence"] == "1";
  10172. },
  10173. enumerable: true,
  10174. configurable: true
  10175. });
  10176. Object.defineProperty(AccountData.prototype, "banner_dis", {
  10177. get: function () {
  10178. return Number(this.m_app_setting["banner_dis"]);
  10179. },
  10180. enumerable: true,
  10181. configurable: true
  10182. });
  10183. Object.defineProperty(AccountData.prototype, "bannerMoveTime", {
  10184. get: function () {
  10185. return Number(this.m_app_setting["bannerMoveTime"]);
  10186. },
  10187. enumerable: true,
  10188. configurable: true
  10189. });
  10190. Object.defineProperty(AccountData.prototype, "createBannerTimes", {
  10191. get: function () {
  10192. return Number(this.m_app_setting["createBannerTimes"]);
  10193. },
  10194. enumerable: true,
  10195. configurable: true
  10196. });
  10197. Object.defineProperty(AccountData.prototype, "bannerMoveProp", {
  10198. get: function () {
  10199. return Number(this.m_app_setting["bannerMoveProp"]);
  10200. },
  10201. enumerable: true,
  10202. configurable: true
  10203. });
  10204. Object.defineProperty(AccountData.prototype, "isShareThenVideo", {
  10205. get: function () {
  10206. return this.m_app_setting["isShareThenVideo"] == "1";
  10207. },
  10208. enumerable: true,
  10209. configurable: true
  10210. });
  10211. Object.defineProperty(AccountData.prototype, "isShowHuiTui", {
  10212. get: function () {
  10213. return this.m_app_setting["isShowHuiTui"] == "1";
  10214. },
  10215. enumerable: true,
  10216. configurable: true
  10217. });
  10218. Object.defineProperty(AccountData.prototype, "start_sprint", {
  10219. get: function () {
  10220. return Number(this.m_app_setting["start_sprint"]);
  10221. },
  10222. enumerable: true,
  10223. configurable: true
  10224. });
  10225. Object.defineProperty(AccountData.prototype, "IsVideoModel", {
  10226. get: function () {
  10227. return this.m_app_setting["IsVideoModel"] == "1";
  10228. },
  10229. enumerable: true,
  10230. configurable: true
  10231. });
  10232. Object.defineProperty(AccountData.prototype, "videoModelNum", {
  10233. get: function () {
  10234. return Number(this.m_app_setting["videoModelNum"]);
  10235. },
  10236. enumerable: true,
  10237. configurable: true
  10238. });
  10239. Object.defineProperty(AccountData.prototype, "VideoModelTitle", {
  10240. get: function () {
  10241. return this.m_app_setting["VideoModelTitle"];
  10242. },
  10243. enumerable: true,
  10244. configurable: true
  10245. });
  10246. Object.defineProperty(AccountData.prototype, "failcount", {
  10247. get: function () {
  10248. return Number(this.m_app_setting["failcount"]);
  10249. },
  10250. enumerable: true,
  10251. configurable: true
  10252. });
  10253. Object.defineProperty(AccountData.prototype, "spminspeed", {
  10254. get: function () {
  10255. return Number(this.m_app_setting["spminspeed"]);
  10256. },
  10257. enumerable: true,
  10258. configurable: true
  10259. });
  10260. Object.defineProperty(AccountData.prototype, "bgm", {
  10261. get: function () {
  10262. return this.m_app_setting["bgm"] == "1";
  10263. },
  10264. enumerable: true,
  10265. configurable: true
  10266. });
  10267. Object.defineProperty(AccountData.prototype, "camerahight", {
  10268. get: function () {
  10269. return Number(this.m_app_setting["camerahight"]);
  10270. },
  10271. enumerable: true,
  10272. configurable: true
  10273. });
  10274. Object.defineProperty(AccountData.prototype, "ctnfilename", {
  10275. get: function () {
  10276. return this.m_app_setting["ctnfilename"];
  10277. },
  10278. enumerable: true,
  10279. configurable: true
  10280. });
  10281. Object.defineProperty(AccountData.prototype, "cheat", {
  10282. get: function () {
  10283. return this.m_app_setting["cheat"] == "1";
  10284. },
  10285. enumerable: true,
  10286. configurable: true
  10287. });
  10288. Object.defineProperty(AccountData.prototype, "shakestage", {
  10289. get: function () {
  10290. return this.m_app_setting["shakestage"] && this.m_app_setting["shakestage"] == "1";
  10291. },
  10292. enumerable: true,
  10293. configurable: true
  10294. });
  10295. Object.defineProperty(AccountData.prototype, "stageconfigcdn", {
  10296. get: function () {
  10297. return this.m_app_setting["stageconfigcdn"] == "1";
  10298. },
  10299. enumerable: true,
  10300. configurable: true
  10301. });
  10302. Object.defineProperty(AccountData.prototype, "playerspeed", {
  10303. get: function () {
  10304. return Number(this.m_app_setting["playerspeed"]);
  10305. },
  10306. enumerable: true,
  10307. configurable: true
  10308. });
  10309. Object.defineProperty(AccountData.prototype, "videlAdUnitId", {
  10310. get: function () {
  10311. return this.m_app_setting["videlAdUnitId"];
  10312. },
  10313. enumerable: true,
  10314. configurable: true
  10315. });
  10316. Object.defineProperty(AccountData.prototype, "bannerAdUnitId", {
  10317. get: function () {
  10318. return this.m_app_setting["bannerAdUnitId"];
  10319. },
  10320. enumerable: true,
  10321. configurable: true
  10322. });
  10323. Object.defineProperty(AccountData.prototype, "tri", {
  10324. get: function () {
  10325. return this.m_app_setting["tri"] == "1";
  10326. },
  10327. enumerable: true,
  10328. configurable: true
  10329. });
  10330. Object.defineProperty(AccountData.prototype, "recommend", {
  10331. get: function () {
  10332. return this.m_app_setting["recommend"] == "1";
  10333. },
  10334. enumerable: true,
  10335. configurable: true
  10336. });
  10337. Object.defineProperty(AccountData.prototype, "recommendflg", {
  10338. get: function () {
  10339. return this.m_app_setting["recommendflg"];
  10340. },
  10341. enumerable: true,
  10342. configurable: true
  10343. });
  10344. Object.defineProperty(AccountData.prototype, "egg", {
  10345. get: function () {
  10346. return this.m_app_setting["egg"] == "1";
  10347. },
  10348. enumerable: true,
  10349. configurable: true
  10350. });
  10351. Object.defineProperty(AccountData.prototype, "eggrate", {
  10352. get: function () {
  10353. return Number(this.m_app_setting["eggrate"]);
  10354. },
  10355. enumerable: true,
  10356. configurable: true
  10357. });
  10358. Object.defineProperty(AccountData.prototype, "UseId", {
  10359. get: function () {
  10360. return this.userId;
  10361. },
  10362. enumerable: true,
  10363. configurable: true
  10364. });
  10365. AccountData.prototype.GetConfig = function (_type) {
  10366. var type = AccountConfig[_type];
  10367. return this.m_configs[type];
  10368. };
  10369. AccountData.prototype.GetUser = function (_type) {
  10370. var type = AccountUser[_type];
  10371. return this.m_user[type];
  10372. };
  10373. Object.defineProperty(AccountData.prototype, "GetVideoTotal", {
  10374. get: function () {
  10375. return Number(this.m_user_video["total"]);
  10376. },
  10377. enumerable: true,
  10378. configurable: true
  10379. });
  10380. AccountData.prototype.GetSign = function (_datatype) {
  10381. var type = signdata[_datatype];
  10382. return this.m_sign[type];
  10383. };
  10384. AccountData.prototype.GetRewardConfig = function (_rewardid) {
  10385. var reward = this.m_RewardDic[_rewardid];
  10386. return reward;
  10387. };
  10388. AccountData.prototype.GetEntity = function (_id, attr) {
  10389. if (!this.m_EntityDic[_id])
  10390. return null;
  10391. return this.m_EntityDic[_id][entity[attr]];
  10392. };
  10393. AccountData.prototype.GetRewardDic = function () {
  10394. var config = this.GetConfig(AccountConfig.rewards);
  10395. for (var key in config) {
  10396. this.m_RewardDic[config[key].id] = config[key];
  10397. }
  10398. };
  10399. AccountData.prototype.GetEntityDic = function () {
  10400. var config = this.GetConfig(AccountConfig.entity);
  10401. for (var key in config) {
  10402. this.m_EntityDic[config[key].entity_id] = config[key];
  10403. }
  10404. };
  10405. AccountData.prototype.GetThemeById = function (_id) {
  10406. var data = this.GetConfig(AccountConfig.theme);
  10407. if (data) {
  10408. for (var index = 0; index < data.length; index++) {
  10409. var element = data[index];
  10410. if (element.id == _id) {
  10411. return element;
  10412. }
  10413. }
  10414. }
  10415. };
  10416. AccountData.prototype.GetSkinAttr = function (_id) {
  10417. var config = this.GetConfig(AccountConfig.theme);
  10418. for (var i = 0; i < config.length; i++) {
  10419. if (config[i].id == _id) {
  10420. return config[i];
  10421. }
  10422. }
  10423. };
  10424. AccountData.prototype.GetAchievementData = function () {
  10425. var data = this.GetConfig(AccountConfig.achievement);
  10426. var dic = {};
  10427. for (var key1 in data) {
  10428. var type1 = data[key1].type;
  10429. //var obj = {};
  10430. if (dic[type1]) {
  10431. continue;
  10432. }
  10433. var array = [];
  10434. for (var key2 in data) {
  10435. var type2 = data[key2].type;
  10436. if (type1 == type2) {
  10437. array.push(data[key2]);
  10438. }
  10439. }
  10440. dic[type1] = array;
  10441. }
  10442. this.m_AchievementDic = dic;
  10443. };
  10444. AccountData.prototype.HasTheme = function (_id) {
  10445. var has = false;
  10446. var getthemes = this.GetUser(AccountUser.get_themes);
  10447. for (var i = 0; i < getthemes.length; i++) {
  10448. if (getthemes[i] == _id) {
  10449. has = true;
  10450. }
  10451. }
  10452. return has;
  10453. };
  10454. AccountData.prototype.GetSkinDic = function (_config) {
  10455. };
  10456. AccountData.prototype.GetHeroProgress = function (_id) {
  10457. var config = this.m_user["progress_heroes"];
  10458. var progress = config[_id] ? config[_id] : 0;
  10459. return progress;
  10460. };
  10461. AccountData.prototype.GetHatProgress = function (_id) {
  10462. var config = this.m_user["progress_hats"];
  10463. var progress = config[_id] ? config[_id] : 0;
  10464. return progress;
  10465. };
  10466. AccountData.prototype.GetCbProgress = function (_id) {
  10467. var config = this.m_user["progress_dances"];
  10468. var progress = config[_id] ? config[_id] : 0;
  10469. return progress;
  10470. };
  10471. AccountData.prototype.HasMotor = function (_id) {
  10472. var data = this.GetUser(AccountUser.get_themes);
  10473. for (var i = 0; i < data.length; i++) {
  10474. var hd = data[i];
  10475. if (_id == hd) {
  10476. return true;
  10477. }
  10478. }
  10479. return false;
  10480. };
  10481. //获取皮肤的进度
  10482. AccountData.prototype.GetMotorProgress = function (_id) {
  10483. var config = this.m_user["progress_themes"];
  10484. var progress = config[_id] ? config[_id] : 0;
  10485. return progress;
  10486. };
  10487. AccountData.prototype.GetSeverConfig = function (_config) {
  10488. this.m_configs = _config;
  10489. this.GetSkinDic(this.m_configs);
  10490. this.GetRewardDic();
  10491. this.GetEntityDic();
  10492. // this.GetAchievementData();
  10493. var _globe = _config["global"];
  10494. for (var index = 0; index < _globe.length; index++) {
  10495. var element = _globe[index];
  10496. if (element.key == "tilirec") {
  10497. PlayerAccount.CurrentAccount.tilirec = Number(element.value);
  10498. return;
  10499. }
  10500. }
  10501. };
  10502. AccountData.prototype.UpdateSkinDic = function () {
  10503. this.GetSkinDic(this.m_configs);
  10504. };
  10505. AccountData.prototype.GetGlobe = function (_key) {
  10506. var globe = this.GetConfig(AccountConfig.global);
  10507. for (var key in globe) {
  10508. var obj = globe[key];
  10509. var kkk = obj["key"];
  10510. if (kkk == _key) {
  10511. var value = obj["value"];
  10512. return value;
  10513. }
  10514. }
  10515. return null;
  10516. };
  10517. return AccountData;
  10518. }());
  10519. exports.AccountData = AccountData;
  10520. var PlayerAccount = /** @class */ (function () {
  10521. function PlayerAccount(_code, _nickname, _avatar, _gender, _country, _province, _city, _device, _shareid, _scence, _ver) {
  10522. this.IsTest = false;
  10523. this.localTime = Laya.timer.currTimer;
  10524. this.Code = _code;
  10525. this.NickName = _nickname;
  10526. this.Avatar = _avatar;
  10527. this.Gender = _gender;
  10528. this.Country = _country;
  10529. this.Province = _province;
  10530. this.City = _city;
  10531. this.Device = _device;
  10532. this.ShareId = _shareid;
  10533. this.Scene = _scence;
  10534. this.ver = _ver;
  10535. this.IsTest = false;
  10536. PlayerAccount.instance = this;
  10537. }
  10538. Object.defineProperty(PlayerAccount, "CurrentAccount", {
  10539. get: function () {
  10540. if (PlayerAccount.instance == null) {
  10541. console.log("生成本地测试账号...");
  10542. return PlayerAccount.TestAccount;
  10543. }
  10544. return PlayerAccount.instance;
  10545. },
  10546. enumerable: true,
  10547. configurable: true
  10548. });
  10549. Object.defineProperty(PlayerAccount, "TestAccount", {
  10550. get: function () {
  10551. var code = Laya.LocalStorage.getItem("localcode");
  10552. if (!code) {
  10553. var time = new Date().getTime().toString();
  10554. var random = GameUtils_1.GameUtils.randRangeint(10000, 99999).toString();
  10555. code = "xj_" + time + random;
  10556. Laya.LocalStorage.setItem("localcode", code);
  10557. console.log(time, random);
  10558. console.log("新用户", code);
  10559. }
  10560. else {
  10561. console.log("老用户", code);
  10562. }
  10563. var curaccount = new PlayerAccount(code, null, null, null, null, null, null, null, null, null, null);
  10564. curaccount.IsTest = true;
  10565. return curaccount;
  10566. },
  10567. enumerable: true,
  10568. configurable: true
  10569. });
  10570. PlayerAccount.prototype.SetAccountData = function (data, completecb) {
  10571. var _this = this;
  10572. var token = data["token"];
  10573. var configs = data["configs"];
  10574. var app_setting = data["app_setting"];
  10575. var user = data["user"];
  10576. var user_base = data["user_base"];
  10577. var user_sign = data["user_sign"];
  10578. var user_achievement = data["user_achievement"];
  10579. var user_lottery = data["user_lottery"];
  10580. var user_land_task = data["user_land_task"];
  10581. var user_video = data["user_video"];
  10582. if (this.CurAccountData == null) {
  10583. Sdk_1.WxApi.recordAldEvent("开始获取config数据");
  10584. this.CurAccountData = new AccountData(token, configs, app_setting, user, user_base, null, null, user_sign, user_achievement, user_lottery, user_land_task, user_video);
  10585. this.CheckLocalConfig(data.table_version, function (_config) {
  10586. _this.CurAccountData.GetSeverConfig(_config);
  10587. _this.nowConfig = _config;
  10588. if (completecb != null) {
  10589. completecb.runWith(data);
  10590. }
  10591. });
  10592. }
  10593. else {
  10594. if (configs) {
  10595. this.CurAccountData.m_configs = configs;
  10596. }
  10597. if (app_setting) {
  10598. this.CurAccountData.m_app_setting = app_setting;
  10599. }
  10600. if (user) {
  10601. this.CurAccountData.m_user = user;
  10602. }
  10603. if (user_base) {
  10604. this.CurAccountData.m_user_base = user_base;
  10605. }
  10606. if (user_sign) {
  10607. this.CurAccountData.m_sign = user_sign;
  10608. }
  10609. if (user_achievement) {
  10610. this.CurAccountData.m_task = user_achievement;
  10611. }
  10612. if (user_lottery) {
  10613. this.CurAccountData.lottery = user_lottery;
  10614. }
  10615. if (user_land_task) {
  10616. this.CurAccountData.m_use_land_task = user_land_task;
  10617. }
  10618. if (user_video) {
  10619. this.CurAccountData.m_user_video = user_video;
  10620. }
  10621. }
  10622. };
  10623. PlayerAccount.prototype.CheckLocalConfig = function (_ver, cb) {
  10624. var curconfig = Laya.LocalStorage.getJSON(PlayerAccount.localcofigkey);
  10625. if (curconfig) {
  10626. //Laya.LocalStorage.removeItem(PlayerAccount.localcofigkey);
  10627. if (curconfig.ver == _ver) {
  10628. console.log("sever配置是最新的...", _ver);
  10629. Sdk_1.WxApi.recordAldEvent("config接口获取成功");
  10630. cb(curconfig);
  10631. }
  10632. else {
  10633. NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) {
  10634. data.configs.ver = _ver;
  10635. Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs);
  10636. console.log("sever配置更新完成...", _ver);
  10637. Sdk_1.WxApi.recordAldEvent("config接口获取成功");
  10638. cb(data.configs);
  10639. }), Laya.Handler.create(this, function (data) {
  10640. console.log("配置获取失败" + data);
  10641. Sdk_1.WxApi.recordAldEvent("config接口获取失败");
  10642. }));
  10643. }
  10644. }
  10645. else {
  10646. NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) {
  10647. data.configs.ver = _ver;
  10648. Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs);
  10649. console.log("sever保存配置完成...", _ver);
  10650. Sdk_1.WxApi.recordAldEvent("config接口获取成功");
  10651. cb(data.configs);
  10652. }), Laya.Handler.create(this, function (data) {
  10653. console.log("配置获取失败" + data);
  10654. Sdk_1.WxApi.recordAldEvent("config接口获取失败");
  10655. }));
  10656. }
  10657. };
  10658. Object.defineProperty(PlayerAccount.prototype, "ServerTime", {
  10659. get: function () {
  10660. var time = Laya.timer.currTimer;
  10661. var stime = PlayerAccount.ServerTime + Math.ceil((time - this.localTime) / 1000);
  10662. return stime;
  10663. },
  10664. enumerable: true,
  10665. configurable: true
  10666. });
  10667. PlayerAccount.localcofigkey = "mconfig";
  10668. return PlayerAccount;
  10669. }());
  10670. exports.PlayerAccount = PlayerAccount;
  10671. },{"../../../utils/GameUtils":87,"../NetworkManager":71,"../WXSDK/Sdk":75}],75:[function(require,module,exports){
  10672. "use strict";
  10673. Object.defineProperty(exports, "__esModule", { value: true });
  10674. var systemtype;
  10675. (function (systemtype) {
  10676. systemtype[systemtype["ios"] = 0] = "ios";
  10677. systemtype[systemtype["android"] = 1] = "android";
  10678. systemtype[systemtype["other"] = 2] = "other";
  10679. })(systemtype = exports.systemtype || (exports.systemtype = {}));
  10680. var WxApi = /** @class */ (function () {
  10681. function WxApi() {
  10682. }
  10683. WxApi.recordAldEvent = function (key, value) {
  10684. if (value === void 0) { value = ""; }
  10685. if (Laya.Browser.window && Laya.Browser.window.wx) {
  10686. Laya.Browser.window.wx.aldSendEvent(key, { key: value });
  10687. }
  10688. console.log("事件: ", key);
  10689. };
  10690. WxApi.WXLogin = function (cb) {
  10691. var that = this;
  10692. Laya.Browser.window.wx.login({
  10693. success: function (res) {
  10694. if (res.code) {
  10695. console.log("code:", res.code);
  10696. cb(res);
  10697. }
  10698. else {
  10699. console.log('获取用户登录态失败!' + res.errMsg);
  10700. }
  10701. },
  10702. fail: function (res) { console.log("wx.login: failed, res=" + res); }
  10703. });
  10704. };
  10705. WxApi.WxInit = function () {
  10706. var _this = this;
  10707. if (!Laya.Browser.onWeiXin)
  10708. return;
  10709. Laya.Browser.window.wx.showShareMenu({
  10710. withShareTicket: true
  10711. });
  10712. Laya.Browser.window.wx.onShow(function (option) {
  10713. console.log(option);
  10714. _this.shareOpenId = option.query.userId;
  10715. _this.querychannel = option.query.channel;
  10716. if (option.referrerInfo) {
  10717. _this.referrerInfoappId = option.referrerInfo.appId;
  10718. console.log("onShow appId is:", option.referrerInfo.appId);
  10719. }
  10720. _this.sceneValue = option.scene;
  10721. var scene = Laya.LocalStorage.getItem("scene");
  10722. if (scene) {
  10723. _this.sceneValue = scene;
  10724. console.log("读取配置场景值:" + scene);
  10725. }
  10726. else {
  10727. console.log("第一次拉取场景值:" + _this.sceneValue);
  10728. Laya.LocalStorage.setItem("scene", _this.sceneValue);
  10729. }
  10730. });
  10731. };
  10732. WxApi.ShowLoading = function (title) {
  10733. if (title === void 0) { title = "加载中..."; }
  10734. if (this.isShowing)
  10735. return;
  10736. this.isShowing = true;
  10737. (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.showLoading({ title: title, mask: true });
  10738. };
  10739. WxApi.HideLoading = function () {
  10740. this.isShowing = false;
  10741. (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.hideLoading();
  10742. };
  10743. WxApi.aldSendOpenid = function (_openid) {
  10744. if (Laya.Browser.onMiniGame) {
  10745. console.log("aldSendOpenid", _openid);
  10746. Laya.Browser.window.wx.aldSendOpenid(_openid);
  10747. }
  10748. };
  10749. //检测更新
  10750. WxApi.CheckWXUpdate = function () {
  10751. var updateManager = Laya.Browser.window.wx.getUpdateManager();
  10752. updateManager.onCheckForUpdate(function (res) {
  10753. console.log("最新版本:" + res.hasUpdate);
  10754. });
  10755. updateManager.onUpdateReady(function () {
  10756. Laya.Browser.window.wx.showModal({
  10757. showCancel: false,
  10758. title: '更新提示',
  10759. content: '新版本已经准备好,是否重启应用?',
  10760. success: function (res) {
  10761. updateManager.applyUpdate();
  10762. },
  10763. fail: function (res) {
  10764. updateManager.applyUpdate();
  10765. }
  10766. });
  10767. });
  10768. };
  10769. WxApi.levelStart = function (stageId, stageName, userId) {
  10770. console.log("开始记录关卡:" + stageId);
  10771. if (Laya.Browser.window && Laya.Browser.window.wx) {
  10772. Laya.Browser.window.wx.aldStage.onStart({
  10773. stageId: stageId,
  10774. stageName: stageName,
  10775. userId: userId //用户ID 可选
  10776. });
  10777. if (WxApi.newaccount) {
  10778. Laya.Browser.window.wx.aldStage.onStart({
  10779. stageId: "新用户:" + stageId,
  10780. stageName: stageName,
  10781. userId: userId //用户ID 可选
  10782. });
  10783. }
  10784. }
  10785. };
  10786. WxApi.levelRunning = function (stageId, stageName, userId, userevive) {
  10787. console.log("记录关卡中:" + stageId);
  10788. if (Laya.Browser.window && Laya.Browser.window.wx) {
  10789. Laya.Browser.window.wx.aldStage.onRunning({
  10790. stageId: stageId,
  10791. stageName: stageName,
  10792. userId: userId,
  10793. event: "revive",
  10794. params: {
  10795. itemName: "使用复活",
  10796. itemCount: 1,
  10797. desc: userevive //使用道具描述
  10798. }
  10799. });
  10800. if (WxApi.newaccount) {
  10801. Laya.Browser.window.wx.aldStage.onRunning({
  10802. stageId: "新用户:" + stageId,
  10803. stageName: stageName,
  10804. userId: userId,
  10805. event: "revive",
  10806. params: {
  10807. itemName: "使用复活",
  10808. itemCount: 1,
  10809. desc: userevive //使用道具描述
  10810. }
  10811. });
  10812. }
  10813. }
  10814. };
  10815. WxApi.levelSuccess = function (stageId, stageName, userId) {
  10816. console.log("记录关卡:完成" + stageId);
  10817. if (Laya.Browser.window && Laya.Browser.window.wx) {
  10818. Laya.Browser.window.wx.aldStage.onEnd({
  10819. stageId: stageId,
  10820. stageName: stageName,
  10821. userId: userId,
  10822. event: "complete",
  10823. params: {
  10824. desc: "关卡完成" //描述
  10825. }
  10826. });
  10827. if (WxApi.newaccount) {
  10828. Laya.Browser.window.wx.aldStage.onEnd({
  10829. stageId: "新用户:" + stageId,
  10830. stageName: stageName,
  10831. userId: userId,
  10832. event: "complete",
  10833. params: {
  10834. desc: "关卡完成" //描述
  10835. }
  10836. });
  10837. }
  10838. }
  10839. };
  10840. WxApi.levelFail = function (stageId, stageName, userId, score, carname) {
  10841. console.log("记录关卡:失败" + stageId);
  10842. if (Laya.Browser.window && Laya.Browser.window.wx) {
  10843. Laya.Browser.window.wx.aldStage.onEnd({
  10844. stageId: stageId,
  10845. stageName: stageName,
  10846. userId: userId,
  10847. event: "fail",
  10848. params: {
  10849. desc: "失败",
  10850. score: score,
  10851. car: carname //描述
  10852. }
  10853. });
  10854. if (WxApi.newaccount) {
  10855. Laya.Browser.window.wx.aldStage.onEnd({
  10856. stageId: "新用户:" + stageId,
  10857. stageName: stageName,
  10858. userId: userId,
  10859. event: "fail",
  10860. params: {
  10861. desc: "失败",
  10862. score: score,
  10863. car: carname //描述
  10864. }
  10865. });
  10866. }
  10867. }
  10868. };
  10869. WxApi.shake = function () {
  10870. Laya.Browser.window.wx.vibrateShort({});
  10871. };
  10872. WxApi.shakeLong = function () {
  10873. Laya.Browser.window.wx.vibrateLong({});
  10874. };
  10875. WxApi.Shake = function (_short) {
  10876. if (_short === void 0) { _short = true; }
  10877. if (Laya.Browser.onWeiXin && WxApi.CanShake) {
  10878. if (_short) {
  10879. this.shake();
  10880. }
  10881. else {
  10882. this.shakeLong();
  10883. }
  10884. }
  10885. if (!_short) {
  10886. this.stageShake();
  10887. }
  10888. };
  10889. WxApi.stageShake = function (callBack, speed) {
  10890. if (callBack === void 0) { callBack = null; }
  10891. if (speed === void 0) { speed = 32; }
  10892. if (this.isShake || !this.canshakestage)
  10893. return;
  10894. this.isShake = true;
  10895. var point = new Laya.Vector2(Laya.stage.x, Laya.stage.y);
  10896. Laya.stage.timerLoop(speed, this, this.shakeObject, [point, callBack]);
  10897. };
  10898. WxApi.shakeObject = function (_point, _callBack) {
  10899. var count = (this.num++) % 4;
  10900. this.offsetArr[this.num % 2] = count < 2 ? 0 : this.offset;
  10901. Laya.stage.x = this.offsetArr[0] + _point.x;
  10902. Laya.stage.y = this.offsetArr[1] + _point.y;
  10903. if (this.num > (this.times * 4 + 1)) {
  10904. Laya.stage.clearTimer(this, this.shakeObject);
  10905. Laya.stage.pos(0, 0);
  10906. this.num = 0;
  10907. this.isShake = false;
  10908. if (_callBack != null) {
  10909. _callBack();
  10910. }
  10911. }
  10912. };
  10913. WxApi.ShowTxt = function (text) {
  10914. if (Laya.Browser.onWeiXin) {
  10915. Laya.Browser.window.wx.showToast({ title: text });
  10916. }
  10917. else {
  10918. console.log(text);
  10919. }
  10920. };
  10921. Object.defineProperty(WxApi, "SystemFrom", {
  10922. get: function () {
  10923. if (!Laya.Browser.onWeiXin)
  10924. return systemtype.other;
  10925. var info = Laya.Browser.window.wx.getSystemInfoSync();
  10926. var system = info.system;
  10927. var IOS = system.indexOf("iOS") != -1;
  10928. var Android = system.indexOf("Android") != -1;
  10929. if (IOS) {
  10930. return systemtype.ios;
  10931. }
  10932. else if (Android) {
  10933. return systemtype.android;
  10934. }
  10935. else {
  10936. return systemtype.other;
  10937. }
  10938. },
  10939. enumerable: true,
  10940. configurable: true
  10941. });
  10942. Object.defineProperty(WxApi, "IsLongScreenSystem", {
  10943. get: function () {
  10944. if (!Laya.Browser.onWeiXin)
  10945. return false;
  10946. var systemInfo = Laya.Browser.window.wx.getSystemInfoSync();
  10947. var platformModel = "ipx";
  10948. if (systemInfo != null) {
  10949. var model = systemInfo.model;
  10950. platformModel = systemInfo.brand + "_" + model + "_" + systemInfo.system + "_wx" + systemInfo.version + "_SDKVer" + systemInfo.SDKVersion;
  10951. console.log("platformModel:" + platformModel);
  10952. return !(model.indexOf("X") < 0) ||
  10953. ((model.indexOf("oppo") >= 0 || model.indexOf("OPPO") >= 0) && (model.indexOf("R15") >= 0 || model.indexOf("r15") >= 0)) ||
  10954. systemInfo.statusBarHeight > 20 ||
  10955. (model.indexOf("Note") >= 0 && (model.indexOf("7") >= 0 || model.indexOf("8") >= 0)) ||
  10956. ((model.indexOf("iPhone") >= 0) && (model.indexOf("11") >= 0));
  10957. }
  10958. },
  10959. enumerable: true,
  10960. configurable: true
  10961. });
  10962. WxApi.writeStage = function (stage) {
  10963. var kvDataList = new Array();
  10964. var date = new Date().getTime();
  10965. var myValue = JSON.stringify({
  10966. "wxgame": {
  10967. "stage": stage,
  10968. "update_time": date.toString(),
  10969. }
  10970. });
  10971. kvDataList.push({ key: "stage", value: myValue });
  10972. if (Laya.Browser.window.wx) {
  10973. Laya.Browser.window.wx.setUserCloudStorage({
  10974. KVDataList: kvDataList,
  10975. success: function (r) {
  10976. console.log("上传分数成功");
  10977. }
  10978. });
  10979. }
  10980. };
  10981. WxApi.cpVersionGreaterOrEqual = function (v1, v2) {
  10982. console.log("[LOG]\u57FA\u7840\u5E93\u7248\u672C\u53F7 curVer:" + v1 + " targVer:" + v2);
  10983. var v1Arr = v1.split(".");
  10984. var v2Arr = v2.split(".");
  10985. var len = v1Arr.length;
  10986. if (v2Arr.length < len) {
  10987. len = v2Arr.length;
  10988. }
  10989. for (var i = 0; i < len; i++) {
  10990. var ver1 = Number(v1Arr[i]);
  10991. var ver2 = Number(v2Arr[i]);
  10992. if (ver1 > ver2) {
  10993. return true;
  10994. }
  10995. else if (ver1 < ver2) {
  10996. return false;
  10997. }
  10998. }
  10999. return v1Arr.length >= v2Arr.length;
  11000. };
  11001. WxApi.newaccount = false;
  11002. WxApi.sceneValue = "";
  11003. WxApi.shareOpenId = "";
  11004. WxApi.querychannel = "";
  11005. WxApi.referrerInfoappId = "";
  11006. //显示加载信息
  11007. WxApi.isShowing = false;
  11008. WxApi.CanShake = true;
  11009. WxApi.times = 1.3;
  11010. WxApi.num = 0;
  11011. WxApi.offsetArr = [0, 0];
  11012. WxApi.offset = 14;
  11013. WxApi.canshakestage = false;
  11014. return WxApi;
  11015. }());
  11016. exports.WxApi = WxApi;
  11017. },{}],76:[function(require,module,exports){
  11018. "use strict";
  11019. Object.defineProperty(exports, "__esModule", { value: true });
  11020. var Sdk_1 = require("./Sdk");
  11021. var GameUtils_1 = require("../../../utils/GameUtils");
  11022. var PlayerAccount_1 = require("./PlayerAccount");
  11023. /*
  11024. * name;
  11025. */
  11026. var ShareUtil = /** @class */ (function () {
  11027. function ShareUtil() {
  11028. }
  11029. ShareUtil.prototype.beginShare = function (callBack) {
  11030. ShareUtil.beginShareTime = new Date().getTime();
  11031. console.log("分享点击时间=" + ShareUtil.beginShareTime);
  11032. ShareUtil.isSharing = true;
  11033. ShareUtil.callback = callBack;
  11034. };
  11035. ShareUtil.prototype.onRegister = function () {
  11036. if (Laya.Browser.window.wx == null) {
  11037. return;
  11038. }
  11039. Laya.Browser.window.wx.onShow(function (option) {
  11040. console.log("onshow share start");
  11041. if (ShareUtil.isSharing) {
  11042. ShareUtil.isSharing = false;
  11043. var time = new Date().getTime();
  11044. console.log("分享回到游戏时间" + time);
  11045. var wait = (time - ShareUtil.beginShareTime) / 1000;
  11046. console.log("分享停留时间为:" + wait);
  11047. var shareSuccess = false;
  11048. var realSuccess = false;
  11049. if (wait < 3) {
  11050. Laya.Browser.window.wx.showToast({ title: "请重试一次" });
  11051. ShareUtil.callback(false);
  11052. }
  11053. else {
  11054. var random = Math.random();
  11055. if (random <= 0.3) {
  11056. var message = ["你已分享过该群", "请重新换个群分享!", "请分享到30人大群中!"];
  11057. var curmes = message[GameUtils_1.GameUtils.randRangeint(0, 2)];
  11058. Laya.Browser.window.wx.showToast({ title: curmes });
  11059. ShareUtil.callback(false);
  11060. }
  11061. else {
  11062. Laya.Browser.window.wx.showToast({ title: "分享成功!" });
  11063. ShareUtil.callback(true);
  11064. }
  11065. }
  11066. // if(wait >= 2)
  11067. // {
  11068. // if(wait < 4)
  11069. // {
  11070. // shareSuccess = (Math.random() > 0.5)?false:true;
  11071. // }
  11072. // else
  11073. // {
  11074. // shareSuccess = true;
  11075. // }
  11076. // }
  11077. // else{
  11078. // shareSuccess = false;
  11079. // }
  11080. // if(shareSuccess == false)
  11081. // {
  11082. // Laya.Browser.window.wx.showToast( {title:"请重试一次"} );
  11083. // ShareUtil.callback(false);
  11084. // }
  11085. // else{
  11086. // Laya.Browser.window.wx.showToast( {title:"分享成功"} );
  11087. // ShareUtil.callback(true);
  11088. // }
  11089. }
  11090. });
  11091. };
  11092. ShareUtil.ShareMessage = function () {
  11093. if (!Laya.Browser.onWeiXin)
  11094. return;
  11095. var t = PlayerAccount_1.PlayerAccount.CurrentAccount.ServerTime;
  11096. var _title = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.sharecontent;
  11097. _title = (_title == "" || !_title) ? "你能跟得上我的速度吗!?" : _title;
  11098. var _image = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.ShareImage;
  11099. _image = (_image == "" || !_image) ? "bg/share1.png" : _image;
  11100. console.log("ShareMessage");
  11101. Laya.Browser.window.wx.onShareAppMessage(function () { return ({
  11102. title: _title,
  11103. imageUrl: _image,
  11104. query: "shareid=" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.UseId + "_" + t + "_" + Math.floor(9999 * Math.random()).toString()
  11105. }); });
  11106. };
  11107. ShareUtil.shareImage = function (channel, callback, shareType) {
  11108. if (callback === void 0) { callback = null; }
  11109. if (Laya.Browser.window.wx == null) {
  11110. return;
  11111. }
  11112. if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.share) {
  11113. Sdk_1.WxApi.ShowTxt("暂未开放");
  11114. return;
  11115. }
  11116. var t = PlayerAccount_1.PlayerAccount.CurrentAccount.ServerTime;
  11117. var _title = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.sharecontent;
  11118. _title = (_title == "" || !_title) ? "你能跟得上我的速度吗!?" : _title;
  11119. var _image = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.ShareImage;
  11120. _image = (_image == "" || !_image) ? "bg/share1.png" : _image;
  11121. if (Sdk_1.WxApi.sceneValue == "1037" || Sdk_1.WxApi.sceneValue == "1058" || Sdk_1.WxApi.sceneValue == "1067" || Sdk_1.WxApi.sceneValue == "1095") {
  11122. _title = "2020全新工资走势,你跟上节奏了吗?";
  11123. _image = "bg/share2.png";
  11124. }
  11125. Laya.Browser.window.wx.aldShareAppMessage({
  11126. title: _title,
  11127. imageUrl: _image,
  11128. query: "userId=" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.UseId + "_" + shareType + "_" + t + "_" + Math.floor(9999 * Math.random()).toString() // + "&shareTitle=" + _title,
  11129. });
  11130. if (callback) {
  11131. ShareUtil.Instance.beginShare(callback);
  11132. }
  11133. };
  11134. ShareUtil.Instance = new ShareUtil();
  11135. ShareUtil.shareSuccessTime = 0;
  11136. ShareUtil.isSharing = false;
  11137. return ShareUtil;
  11138. }());
  11139. exports.ShareUtil = ShareUtil;
  11140. },{"../../../utils/GameUtils":87,"./PlayerAccount":74,"./Sdk":75}],77:[function(require,module,exports){
  11141. "use strict";
  11142. Object.defineProperty(exports, "__esModule", { value: true });
  11143. var GuangGao_1 = require("./GuangGao");
  11144. var Dictionary_1 = require("../../../utils/Dictionary");
  11145. var PlayerAccount_1 = require("./PlayerAccount");
  11146. var Sdk_1 = require("./Sdk");
  11147. var GameUtils_1 = require("../../../utils/GameUtils");
  11148. var RecommendView_1 = require("./cpa/RecommendView");
  11149. var YQSdk = /** @class */ (function () {
  11150. function YQSdk() {
  11151. }
  11152. YQSdk.postbj = function (url, args, callback, header) {
  11153. if (header === void 0) { header = null; }
  11154. var httpRequest = new Laya.HttpRequest();
  11155. if (callback) {
  11156. httpRequest.once(Laya.Event.PROGRESS, this, function () { callback.progress && callback.progress(httpRequest); });
  11157. httpRequest.once(Laya.Event.ERROR, this, function () { callback.error && callback.error(httpRequest); });
  11158. httpRequest.once(Laya.Event.COMPLETE, this, function () { callback.complete && callback.complete(httpRequest); });
  11159. }
  11160. if (header) {
  11161. httpRequest.send(url, args, "post", "json", ["Content-Type", "application/json"]);
  11162. }
  11163. else {
  11164. httpRequest.send(url, args, "post", "json");
  11165. }
  11166. };
  11167. //登录
  11168. YQSdk.login = function (code, _channel, _appid, cb) {
  11169. if (cb === void 0) { cb = null; }
  11170. var url1 = "https://api.yz061.com/auth?";
  11171. var url;
  11172. var channel = _channel;
  11173. var appid = _appid;
  11174. if (!channel)
  11175. channel = "own";
  11176. var args1 = {
  11177. flg: this.flg,
  11178. code: code,
  11179. channel: channel
  11180. };
  11181. if (appid) {
  11182. url = url1 + "flg=" + args1.flg + "&code=" + args1.code + "&channel=" + args1.channel + "&appid=" + appid;
  11183. }
  11184. else {
  11185. url = url1 + "flg=" + args1.flg + "&code=" + args1.code + "&channel=" + args1.channel;
  11186. }
  11187. this.postbj(url, null, {
  11188. complete: function (request) {
  11189. if (cb != null)
  11190. cb();
  11191. console.log("HP_login complete" + JSON.stringify(request.data));
  11192. },
  11193. progress: function (request) {
  11194. console.log("HP_login progress:" + JSON.stringify(request.data));
  11195. },
  11196. error: function (request) {
  11197. console.log("HP_login error:" + JSON.stringify(request.data));
  11198. }
  11199. });
  11200. console.log("登录参数:" + url);
  11201. };
  11202. //获取广告(含分享)素材接口
  11203. YQSdk.pullAdPosition = function (cb) {
  11204. if (cb === void 0) { cb = null; }
  11205. //ad position
  11206. this.postbj("https://api.yz061.com/game/" + this.flg, null, {
  11207. complete: function (request) {
  11208. if (request.data.status == 1) {
  11209. console.log("allPosition :", request.data);
  11210. YQSdk.adPosition = request.data.result;
  11211. YQSdk.GetAdInfo();
  11212. YQSdk.getad = true;
  11213. if (cb)
  11214. cb();
  11215. }
  11216. else {
  11217. console.log("allPositionfailed:", request.data);
  11218. }
  11219. },
  11220. error: function (request) {
  11221. console.log("allPosition failed:", request.data);
  11222. }
  11223. });
  11224. };
  11225. YQSdk.GetAdInfo = function () {
  11226. var _this = this;
  11227. for (var index = 0; index < this.adPosition.length; index++) {
  11228. switch (this.adPosition[index].location_flg) {
  11229. case "C":
  11230. this.adPositionDic.add("C", this.adPosition[index]);
  11231. this.getAddetail(this.adPosition[index].url, function (data) {
  11232. YQSdk.cainixihuan = data;
  11233. _this.getc = true;
  11234. });
  11235. break;
  11236. case "C2":
  11237. this.adPositionDic.add("C2", this.adPosition[index]);
  11238. this.getAddetail(this.adPosition[index].url, function (data) {
  11239. //this.fuhuocainixihuan = data;
  11240. });
  11241. break;
  11242. case "B":
  11243. this.adPositionDic.add("B", this.adPosition[index]);
  11244. this.getAddetail(this.adPosition[index].url, function (data) {
  11245. YQSdk.baokuanyouxi1 = data;
  11246. _this.getb = true;
  11247. //console.log(this.baokuanyouxi1);
  11248. });
  11249. break;
  11250. case "banner":
  11251. this.adPositionDic.add("banner", this.adPosition[index]);
  11252. this.getAddetail(this.adPosition[index].url, function (data) {
  11253. YQSdk.banner_data = data;
  11254. _this.getbanner = true;
  11255. });
  11256. break;
  11257. case "GDYX":
  11258. this.adPositionDic.add("GDYX", this.adPosition[index]);
  11259. this.getAddetail(this.adPosition[index].url, function (data) {
  11260. YQSdk.gdyy = data;
  11261. _this.getgdyx = true;
  11262. });
  11263. break;
  11264. case "JS":
  11265. this.adPositionDic.add("JS", this.adPosition[index]);
  11266. this.getAddetail(this.adPosition[index].url, function (data) {
  11267. YQSdk.js = data;
  11268. _this.getjs = true;
  11269. });
  11270. break;
  11271. case "TC":
  11272. this.adPositionDic.add("TC", this.adPosition[index]);
  11273. this.getAddetail(this.adPosition[index].url, function (data) {
  11274. YQSdk.tc = data;
  11275. _this.gettc = true;
  11276. });
  11277. break;
  11278. }
  11279. }
  11280. };
  11281. Object.defineProperty(YQSdk, "CheckGetDataComplete", {
  11282. get: function () {
  11283. var complete = false;
  11284. if (this.getc && this.getgdyx && this.getb && this.getjs && this.getbanner) {
  11285. complete = true;
  11286. }
  11287. return complete;
  11288. },
  11289. enumerable: true,
  11290. configurable: true
  11291. });
  11292. //获取广告详细信息接口
  11293. YQSdk.getAddetail = function (url, callback) {
  11294. var _this = this;
  11295. var uid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid;
  11296. this.postbj(url + "&uid=" + uid, null, {
  11297. complete: function (request) {
  11298. if (request.data.status == 1) {
  11299. //console.log("pullAdPosition :", request.data);
  11300. callback(request.data.result);
  11301. if (_this.CheckGetDataComplete) {
  11302. new RecommendView_1.Recommend();
  11303. }
  11304. }
  11305. else {
  11306. console.log("pullAdPositionfailed:", request.data);
  11307. }
  11308. },
  11309. error: function (request) {
  11310. console.log("pullAdPosition failed:", request.data);
  11311. }
  11312. });
  11313. };
  11314. YQSdk.GetShare = function (_cb) {
  11315. if (_cb === void 0) { _cb = null; }
  11316. var url1 = "https://api.yz061.com/matter/share?id=281&gflg= " + this.flg + " &lflg=F";
  11317. var uid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid;
  11318. var url = url1 + "&uid=" + uid;
  11319. this.postbj(url, null, {
  11320. complete: function (request) {
  11321. if (_cb != null)
  11322. _cb(JSON.stringify(request.data));
  11323. var data = request.data;
  11324. YQSdk.shares = data.result;
  11325. },
  11326. progress: function (request) {
  11327. //console.log("GetShare progress:" + JSON.stringify(request.data));
  11328. },
  11329. error: function (request) {
  11330. //console.log("GetShare error:" + JSON.stringify(request.data));
  11331. }
  11332. });
  11333. };
  11334. //广告点击上报接口
  11335. YQSdk.reportad = function (ad_id, location_id, issuccess) {
  11336. if (issuccess === void 0) { issuccess = false; }
  11337. var url = "https://api.yz061.com/reportad?";
  11338. var curuid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid;
  11339. var channel = Sdk_1.WxApi.querychannel;
  11340. if (!channel)
  11341. channel = "own";
  11342. var rgs1 = {
  11343. gflg: this.flg,
  11344. uid: curuid,
  11345. ad_id: ad_id,
  11346. location_id: location_id,
  11347. channel: channel
  11348. };
  11349. if (issuccess) {
  11350. var rgs = url + "gflg=" + rgs1.gflg + "&uid=" + rgs1.uid + "&ad_id=" + rgs1.ad_id + "&location_id=" + rgs1.location_id + "&channel=" + rgs1.channel + "&status=cb";
  11351. }
  11352. else {
  11353. var rgs = url + "gflg=" + rgs1.gflg + "&uid=" + rgs1.uid + "&ad_id=" + rgs1.ad_id + "&location_id=" + rgs1.location_id + "&channel=" + rgs1.channel;
  11354. }
  11355. console.log("上报的参数" + rgs);
  11356. this.postbj(rgs, null, {
  11357. complete: function (request) {
  11358. if (request.data.status == 1) {
  11359. console.log("上报成功 :", request.data);
  11360. }
  11361. else {
  11362. console.log("上报失败:", request.data);
  11363. }
  11364. },
  11365. error: function (request) {
  11366. console.log("错误消息:", request.data);
  11367. }
  11368. });
  11369. };
  11370. YQSdk.statistics1 = function (loc, _shareid) {
  11371. if (_shareid === void 0) { _shareid = ""; }
  11372. var url = "https://api.yz061.com/stat?";
  11373. var curuid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid;
  11374. var channel = Sdk_1.WxApi.querychannel;
  11375. if (!channel)
  11376. channel = "own";
  11377. var sid = _shareid;
  11378. if (!sid)
  11379. sid = "";
  11380. var r = {
  11381. flg: this.flg,
  11382. uid: curuid,
  11383. channel: channel,
  11384. loc: loc,
  11385. sid: sid
  11386. };
  11387. var args = url + "&flg=" + r.flg + "&uid=" + r.uid + "&channel=" + r.channel + "&loc=" + r.loc + "&sid=" + r.sid;
  11388. this.postbj(args, null, {
  11389. complete: function (request) {
  11390. if (request.data.status == 1) {
  11391. console.log("统计完成 :", request.data);
  11392. }
  11393. else {
  11394. console.log("统计失败:", request.data);
  11395. }
  11396. },
  11397. error: function (request) {
  11398. console.log("错误消息:", request.data);
  11399. }
  11400. });
  11401. };
  11402. YQSdk.exposure = function () {
  11403. var d = this.exposureData();
  11404. if (d.length == 0)
  11405. return;
  11406. var url = "https://api.yz061.com/exposure";
  11407. var channel = Sdk_1.WxApi.querychannel;
  11408. if (!channel)
  11409. channel = "own";
  11410. var r = {
  11411. data: d,
  11412. gflg: this.flg,
  11413. channel: channel
  11414. };
  11415. var args = JSON.stringify(r);
  11416. this.postbj(url, args, {
  11417. complete: function (request) {
  11418. if (request.data.status == 1) {
  11419. console.log("曝光成功 :", request.data);
  11420. }
  11421. else {
  11422. console.log("曝光失败:", request.data);
  11423. }
  11424. },
  11425. error: function (request) {
  11426. console.log("错误消息:", request);
  11427. }
  11428. }, true);
  11429. this.CleraData();
  11430. };
  11431. YQSdk.exposureData = function () {
  11432. var data = [];
  11433. for (var i = 0; i < RecommendView_1.Recommend.cainixihuanData.length; i++) {
  11434. if (!RecommendView_1.Recommend.recommendDic["C"] || !RecommendView_1.Recommend.recommendDic["C"].location_id == undefined)
  11435. continue;
  11436. var c = { ad_id: RecommendView_1.Recommend.cainixihuanData[i].ad_id.toString(), location_id: RecommendView_1.Recommend.recommendDic["C"].location_id.toString(), num: RecommendView_1.Recommend.cainixihuanData[i].shownum.toString() };
  11437. if (RecommendView_1.Recommend.cainixihuanData[i].shownum != 0) {
  11438. data.push(c);
  11439. }
  11440. }
  11441. for (var i = 0; i < RecommendView_1.Recommend.jiesuanData.length; i++) {
  11442. if (!RecommendView_1.Recommend.recommendDic["JS"] || !RecommendView_1.Recommend.recommendDic["JS"].location_id == undefined)
  11443. continue;
  11444. var c2 = { ad_id: RecommendView_1.Recommend.jiesuanData[i].ad_id.toString(), location_id: RecommendView_1.Recommend.recommendDic["FH"].location_id.toString(), num: RecommendView_1.Recommend.jiesuanData[i].shownum.toString() };
  11445. if (RecommendView_1.Recommend.jiesuanData[i].shownum != 0) {
  11446. data.push(c2);
  11447. }
  11448. }
  11449. for (var i = 0; i < RecommendView_1.Recommend.gdyxData.length; i++) {
  11450. if (!RecommendView_1.Recommend.recommendDic["GDYX"] || !RecommendView_1.Recommend.recommendDic["GDYX"].location_id == undefined)
  11451. continue;
  11452. var s = { ad_id: RecommendView_1.Recommend.gdyxData[i].ad_id.toString(), location_id: RecommendView_1.Recommend.recommendDic["GDYX"].location_id.toString(), num: RecommendView_1.Recommend.gdyxData[i].shownum.toString() };
  11453. if (RecommendView_1.Recommend.gdyxData[i].shownum != 0) {
  11454. data.push(s);
  11455. }
  11456. }
  11457. for (var i = 0; i < RecommendView_1.Recommend.baokuanyouxiData.length; i++) {
  11458. if (!RecommendView_1.Recommend.recommendDic["B"] || !RecommendView_1.Recommend.recommendDic["B"].location_id == undefined)
  11459. continue;
  11460. var s = { ad_id: RecommendView_1.Recommend.baokuanyouxiData[i].ad_id.toString(), location_id: RecommendView_1.Recommend.recommendDic["B"].location_id.toString(), num: RecommendView_1.Recommend.baokuanyouxiData[i].shownum.toString() };
  11461. if (RecommendView_1.Recommend.baokuanyouxiData[i].shownum != 0) {
  11462. data.push(s);
  11463. }
  11464. }
  11465. return data;
  11466. };
  11467. YQSdk.CleraData = function () {
  11468. var data = [];
  11469. for (var i = 0; i < RecommendView_1.Recommend.cainixihuanData.length; i++) {
  11470. if (!RecommendView_1.Recommend.recommendDic["C"] || !RecommendView_1.Recommend.recommendDic["C"].location_id == undefined)
  11471. continue;
  11472. RecommendView_1.Recommend.cainixihuanData[i].shownum = 0;
  11473. }
  11474. for (var i = 0; i < RecommendView_1.Recommend.jiesuanData.length; i++) {
  11475. if (!RecommendView_1.Recommend.recommendDic["JS"] || !RecommendView_1.Recommend.recommendDic["JS"].location_id == undefined)
  11476. continue;
  11477. RecommendView_1.Recommend.cainixihuanData[i].shownum = 0;
  11478. }
  11479. for (var i = 0; i < RecommendView_1.Recommend.gdyxData.length; i++) {
  11480. if (!RecommendView_1.Recommend.recommendDic["GDYX"] || !RecommendView_1.Recommend.recommendDic["GDYX"].location_id == undefined)
  11481. continue;
  11482. var s = { ad_id: RecommendView_1.Recommend.gdyxData[i].ad_id.toString(), location_id: RecommendView_1.Recommend.recommendDic["GDYX"].location_id.toString(), num: RecommendView_1.Recommend.gdyxData[i].shownum.toString() };
  11483. RecommendView_1.Recommend.cainixihuanData[i].shownum = 0;
  11484. }
  11485. for (var i = 0; i < RecommendView_1.Recommend.baokuanyouxiData.length; i++) {
  11486. if (!RecommendView_1.Recommend.recommendDic["B"] || !RecommendView_1.Recommend.recommendDic["B"].location_id == undefined)
  11487. continue;
  11488. var s = { ad_id: RecommendView_1.Recommend.baokuanyouxiData[i].ad_id.toString(), location_id: RecommendView_1.Recommend.recommendDic["B"].location_id.toString(), num: RecommendView_1.Recommend.baokuanyouxiData[i].shownum.toString() };
  11489. RecommendView_1.Recommend.baokuanyouxiData[i].shownum = 0;
  11490. }
  11491. };
  11492. YQSdk.prototype.showOpenHander = function () {
  11493. };
  11494. YQSdk.ShowBannerImag = function (callback) {
  11495. var _this = this;
  11496. if (callback === void 0) { callback = null; }
  11497. //960*334
  11498. console.log("ShowBannerImag");
  11499. if (!this.banner_data)
  11500. return;
  11501. if (this.bannerImag) {
  11502. this.bannerindex += 1;
  11503. if (this.bannerindex >= this.banner_data.length)
  11504. this.bannerindex = 0;
  11505. this.bannerImag.skin = this.banner_data[this.bannerindex].ad_img;
  11506. this.appId = this.banner_data[this.bannerindex].ad_appid;
  11507. this.path = this.banner_data[this.bannerindex].ad_path;
  11508. this.ad_id = this.banner_data[this.bannerindex].ad_id;
  11509. // this.bannerImag.visible=true;
  11510. }
  11511. else {
  11512. this.bannerImag = new Laya.Image();
  11513. console.log("new Laya.Image");
  11514. this.bannerImag.visible = false;
  11515. Laya.stage.addChild(this.bannerImag);
  11516. this.bannerImag.skin = this.banner_data[this.bannerindex].ad_img;
  11517. this.height = Laya.stage.width / 960 * 334;
  11518. this.bannerImag.width = Laya.stage.width;
  11519. this.bannerImag.height = this.height;
  11520. console.log(" this.bannerImag.height:" + this.bannerImag.height);
  11521. this.bannerImag.x = 0;
  11522. this.bannerImag.y = Laya.stage.height - this.height;
  11523. this.bannerImag.zOrder = 2;
  11524. this.bannerImag.on(Laya.Event.CLICK, this, function () {
  11525. var adPosition = YQSdk.adPositionDic.getValue("banner");
  11526. var location_id = adPosition.location_id;
  11527. Laya.Browser.onWeiXin && Laya.Browser.window.wx.navigateToMiniProgram({
  11528. "appId": _this.appId, "path": _this.path,
  11529. success: function (res) {
  11530. console.log("上报操作成功!" + res);
  11531. YQSdk.reportad(_this.ad_id, location_id, true);
  11532. },
  11533. fail: function (res) {
  11534. YQSdk.reportad(_this.ad_id, location_id);
  11535. console.log("上报操作失败" + res);
  11536. }
  11537. });
  11538. });
  11539. }
  11540. this.appId = this.banner_data[this.bannerindex].ad_appid;
  11541. this.path = this.banner_data[this.bannerindex].ad_path;
  11542. this.ad_id = this.banner_data[this.bannerindex].ad_id;
  11543. this.Add_BannerData(this.ad_id.toString());
  11544. Laya.timer.once(500, this, function () {
  11545. if (_this.bannerImag) {
  11546. _this.bannerImag.visible = true;
  11547. if (callback != null) {
  11548. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.banner && GuangGao_1.default.cancheat) {
  11549. callback(_this.height);
  11550. }
  11551. else {
  11552. callback(300);
  11553. }
  11554. }
  11555. }
  11556. else {
  11557. callback(300);
  11558. }
  11559. });
  11560. Laya.timer.clear(this, this.BannerLoop);
  11561. var looprate = GameUtils_1.GameUtils.randRangeint(7, 10) * 1000;
  11562. Laya.timer.loop(looprate, this, this.BannerLoop);
  11563. };
  11564. YQSdk.BannerLoop = function () {
  11565. if (this.bannerImag) {
  11566. this.bannerindex += 1;
  11567. if (this.bannerindex >= this.banner_data.length)
  11568. this.bannerindex = 0;
  11569. this.bannerImag.skin = this.banner_data[this.bannerindex].ad_img;
  11570. this.appId = this.banner_data[this.bannerindex].ad_appid;
  11571. this.path = this.banner_data[this.bannerindex].ad_path;
  11572. this.ad_id = this.banner_data[this.bannerindex].ad_id;
  11573. }
  11574. };
  11575. YQSdk.HideBannerImage = function () {
  11576. if (this.bannerImag && this.bannerImag.visible) {
  11577. this.bannerImag.visible = false;
  11578. }
  11579. };
  11580. YQSdk.Add_BannerData = function (ad_id) {
  11581. for (var index = 0; index < this.banner_data.length; index++) {
  11582. var element = this.banner_data[index];
  11583. if (element.ad_id == ad_id) {
  11584. element.num = (Number(element.num) + 1).toString();
  11585. return;
  11586. }
  11587. }
  11588. var d = { ad_id: ad_id, location_id: this.adPositionDic["banner"].location_id.toString(), num: "1" };
  11589. this.banner_data.push(d);
  11590. };
  11591. YQSdk.flg = "sgpyp";
  11592. YQSdk.getad = false;
  11593. YQSdk.getc = false;
  11594. YQSdk.getgdyx = false;
  11595. YQSdk.getbanner = false;
  11596. YQSdk.getjs = false;
  11597. YQSdk.getb = false;
  11598. YQSdk.gettc = false;
  11599. YQSdk.adPositionDic = new Dictionary_1.default();
  11600. YQSdk.bannerindex = 0;
  11601. YQSdk.height = 0;
  11602. return YQSdk;
  11603. }());
  11604. exports.YQSdk = YQSdk;
  11605. },{"../../../utils/Dictionary":86,"../../../utils/GameUtils":87,"./GuangGao":73,"./PlayerAccount":74,"./Sdk":75,"./cpa/RecommendView":82}],78:[function(require,module,exports){
  11606. "use strict";
  11607. Object.defineProperty(exports, "__esModule", { value: true });
  11608. var ChildBaseView_1 = require("../../../../frameworks/mvc/ChildBaseView");
  11609. var CpaEvent_1 = require("./CpaEvent");
  11610. var PlayerAccount_1 = require("../PlayerAccount");
  11611. var RecommendView_1 = require("./RecommendView");
  11612. var TimerService_1 = require("../../../../frameworks/TimerService");
  11613. var BaoKuanGameView = /** @class */ (function (_super) {
  11614. __extends(BaoKuanGameView, _super);
  11615. function BaoKuanGameView() {
  11616. var _this = _super.call(this) || this;
  11617. _this._time = 0;
  11618. _this.key = 0;
  11619. _this._istart = false;
  11620. return _this;
  11621. }
  11622. BaoKuanGameView.prototype.onInit = function () {
  11623. this.initView();
  11624. this.initEvent();
  11625. };
  11626. BaoKuanGameView.prototype.initView = function () {
  11627. this.c_state = this.getController("c_state");
  11628. this.t0 = this.getTransition("t0");
  11629. this.c_state.selectedIndex = 0;
  11630. };
  11631. BaoKuanGameView.prototype.initEvent = function () {
  11632. this.addDataEvent(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler);
  11633. };
  11634. BaoKuanGameView.prototype.yqhomedataHandler = function () {
  11635. this.RefreshBKYX();
  11636. TimerService_1.default.instance.addUpdateTarget(this);
  11637. };
  11638. BaoKuanGameView.prototype.update = function (dt) {
  11639. if (this._istart) {
  11640. this._time += dt;
  11641. if (this._time >= 5000) {
  11642. this._time = 0;
  11643. this.RefreshBKYX(true);
  11644. }
  11645. }
  11646. };
  11647. BaoKuanGameView.prototype.RefreshBKYX = function (isanmo) {
  11648. if (isanmo === void 0) { isanmo = false; }
  11649. if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.recommend)
  11650. return;
  11651. this.c_state.selectedIndex = 1;
  11652. var datas = RecommendView_1.Recommend.gdyxData;
  11653. var item;
  11654. for (var i = 0; i < 4; i++) {
  11655. if (this.key + i >= datas.length - 1) {
  11656. this.key = 0;
  11657. }
  11658. var curdata = datas[this.key + i];
  11659. item = this["item_" + i];
  11660. item.showData(curdata);
  11661. if (curdata == null)
  11662. continue;
  11663. curdata.shownum++;
  11664. }
  11665. this.key += 4;
  11666. if (this.key >= datas.length - 1) {
  11667. this.key = 0;
  11668. }
  11669. this._istart = true;
  11670. if (isanmo) {
  11671. this.t0.play(null, 1);
  11672. }
  11673. };
  11674. return BaoKuanGameView;
  11675. }(ChildBaseView_1.default));
  11676. exports.default = BaoKuanGameView;
  11677. },{"../../../../frameworks/TimerService":13,"../../../../frameworks/mvc/ChildBaseView":21,"../PlayerAccount":74,"./CpaEvent":81,"./RecommendView":82}],79:[function(require,module,exports){
  11678. "use strict";
  11679. Object.defineProperty(exports, "__esModule", { value: true });
  11680. var BaseView_1 = require("../../../../frameworks/mvc/BaseView");
  11681. var RecommendView_1 = require("./RecommendView");
  11682. var UiManager_1 = require("../../../../managers/UiManager");
  11683. var TimerService_1 = require("../../../../frameworks/TimerService");
  11684. var ChoutiPanView = /** @class */ (function (_super) {
  11685. __extends(ChoutiPanView, _super);
  11686. function ChoutiPanView() {
  11687. var _this = _super.call(this, "main", "choutipanView") || this;
  11688. _this._iscanmove = false;
  11689. _this._movetime = 0;
  11690. _this._flushtime = 0;
  11691. _this.dir = true;
  11692. _this._nowvalue = 0;
  11693. return _this;
  11694. }
  11695. ChoutiPanView.prototype.initView = function () {
  11696. this.list_0.setVirtual();
  11697. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
  11698. this.list_1.setVirtual();
  11699. this.list_1.itemRenderer = Laya.Handler.create(this, this.itemrenderlist1, null, false);
  11700. this._nowList0 = RecommendView_1.Recommend.gdyxData;
  11701. this._nowList1 = RecommendView_1.Recommend.gdyxData;
  11702. this.list_0.numItems = this._nowList0.length;
  11703. this.list_1.numItems = this._nowList1.length;
  11704. this._isStart = true;
  11705. this._iscanmove = true;
  11706. TimerService_1.default.instance.addUpdateTarget(this);
  11707. };
  11708. ChoutiPanView.prototype.initEvent = function () {
  11709. this.addListener(this.btn_return, Laya.Event.CLICK, this, this.onclosefun);
  11710. this.addListener(this.btn_jixugame, Laya.Event.CLICK, this, this.onclosefun);
  11711. this.addListener(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick);
  11712. this.addListener(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick);
  11713. this.addListener(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick);
  11714. };
  11715. ChoutiPanView.prototype.itemrenderlist = function (index, item) {
  11716. if (index < this._nowList0.length) {
  11717. item.showData(this._nowList0[index]);
  11718. }
  11719. };
  11720. ChoutiPanView.prototype.itemrenderlist1 = function (index, item) {
  11721. if (index < this._nowList1.length) {
  11722. item.showData(this._nowList1[index]);
  11723. }
  11724. };
  11725. ChoutiPanView.prototype.downclick = function () {
  11726. this._isdown = true;
  11727. this._iscanmove = false;
  11728. Laya.timer.clear(this, this.timeoutCallback);
  11729. };
  11730. ChoutiPanView.prototype.timeoutCallback = function () {
  11731. this._iscanmove = true;
  11732. };
  11733. ChoutiPanView.prototype.upclick = function () {
  11734. if (this._isdown) {
  11735. this._isdown = false;
  11736. this._nowvalue = this.list_0.scrollPane.percX;
  11737. Laya.timer.once(2000, this, this.timeoutCallback);
  11738. }
  11739. };
  11740. ChoutiPanView.prototype.update = function (dt) {
  11741. if (this._isStart) {
  11742. if (this.list_0.scrollPane && this._nowList0 && this._iscanmove) {
  11743. if (this.dir) {
  11744. this._nowvalue += 0.001;
  11745. if (this._nowvalue >= 1) {
  11746. this._nowvalue = 1;
  11747. this.dir = false;
  11748. }
  11749. }
  11750. else {
  11751. this._nowvalue -= 0.001;
  11752. if (this._nowvalue <= 0) {
  11753. this._nowvalue = 0;
  11754. this.dir = true;
  11755. }
  11756. }
  11757. this.list_0.scrollPane.setPercX(this._nowvalue);
  11758. }
  11759. }
  11760. };
  11761. ChoutiPanView.prototype.onclosefun = function () {
  11762. UiManager_1.UiManager.instance.close(ChoutiPanView);
  11763. };
  11764. ChoutiPanView.prototype.destory = function () {
  11765. TimerService_1.default.instance.removeUpdateTarget(this);
  11766. _super.prototype.destory.call(this);
  11767. };
  11768. ChoutiPanView.key = "ChoutiPanView";
  11769. return ChoutiPanView;
  11770. }(BaseView_1.default));
  11771. exports.default = ChoutiPanView;
  11772. },{"../../../../frameworks/TimerService":13,"../../../../frameworks/mvc/BaseView":20,"../../../../managers/UiManager":66,"./RecommendView":82}],80:[function(require,module,exports){
  11773. "use strict";
  11774. Object.defineProperty(exports, "__esModule", { value: true });
  11775. var ChildBaseView_1 = require("../../../../frameworks/mvc/ChildBaseView");
  11776. var CpaEvent_1 = require("./CpaEvent");
  11777. var RecommendView_1 = require("./RecommendView");
  11778. var TimerService_1 = require("../../../../frameworks/TimerService");
  11779. var CpaDownsView = /** @class */ (function (_super) {
  11780. __extends(CpaDownsView, _super);
  11781. function CpaDownsView() {
  11782. var _this = _super.call(this) || this;
  11783. _this._iscanmove = false;
  11784. _this._movetime = 0;
  11785. _this._flushtime = 0;
  11786. _this.dir = true;
  11787. _this._nowvalue = 0;
  11788. return _this;
  11789. }
  11790. CpaDownsView.prototype.onInit = function () {
  11791. this.c_state = this.getController("c_state");
  11792. this.c_state.selectedIndex = 0;
  11793. this.initView();
  11794. this.initEvent();
  11795. };
  11796. CpaDownsView.prototype.initView = function () {
  11797. this.list_0.setVirtual();
  11798. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
  11799. this._isStart = false;
  11800. };
  11801. CpaDownsView.prototype.initEvent = function () {
  11802. this.addDataEvent(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler);
  11803. this.addListener(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick);
  11804. this.addListener(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick);
  11805. this.addListener(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick);
  11806. };
  11807. CpaDownsView.prototype.downclick = function () {
  11808. this._isdown = true;
  11809. this._iscanmove = false;
  11810. Laya.timer.clear(this, this.timeoutCallback);
  11811. };
  11812. CpaDownsView.prototype.timeoutCallback = function () {
  11813. this._iscanmove = true;
  11814. };
  11815. CpaDownsView.prototype.upclick = function () {
  11816. if (this._isdown) {
  11817. this._isdown = false;
  11818. this._nowvalue = this.list_0.scrollPane.percX;
  11819. Laya.timer.once(2000, this, this.timeoutCallback);
  11820. }
  11821. };
  11822. CpaDownsView.prototype.update = function (dt) {
  11823. if (this._isStart) {
  11824. if (this.list_0.scrollPane && this._nowList && this._iscanmove) {
  11825. if (this.dir) {
  11826. this._nowvalue += 0.001;
  11827. if (this._nowvalue >= 1) {
  11828. this._nowvalue = 1;
  11829. this.dir = false;
  11830. }
  11831. }
  11832. else {
  11833. this._nowvalue -= 0.001;
  11834. if (this._nowvalue <= 0) {
  11835. this._nowvalue = 0;
  11836. this.dir = true;
  11837. }
  11838. }
  11839. this.list_0.scrollPane.setPercX(this._nowvalue);
  11840. }
  11841. }
  11842. };
  11843. CpaDownsView.prototype.itemrenderlist = function (index, item) {
  11844. if (index < this._nowList.length) {
  11845. item.showData(this._nowList[index]);
  11846. }
  11847. };
  11848. CpaDownsView.prototype.yqhomedataHandler = function () {
  11849. this.c_state.selectedIndex = 1;
  11850. this._nowList = RecommendView_1.Recommend.cainixihuanData;
  11851. this.list_0.numItems = this._nowList.length;
  11852. for (var i = 0; i < this._nowList.length; i++) {
  11853. this._nowList[i].shownum++;
  11854. }
  11855. this._isStart = true;
  11856. this._iscanmove = true;
  11857. TimerService_1.default.instance.addUpdateTarget(this);
  11858. };
  11859. CpaDownsView.prototype.dispose = function () {
  11860. TimerService_1.default.getInastance().removeUpdateTarget(this);
  11861. _super.prototype.dispose.call(this);
  11862. };
  11863. return CpaDownsView;
  11864. }(ChildBaseView_1.default));
  11865. exports.default = CpaDownsView;
  11866. },{"../../../../frameworks/TimerService":13,"../../../../frameworks/mvc/ChildBaseView":21,"./CpaEvent":81,"./RecommendView":82}],81:[function(require,module,exports){
  11867. "use strict";
  11868. Object.defineProperty(exports, "__esModule", { value: true });
  11869. var CpaEvent = /** @class */ (function () {
  11870. function CpaEvent() {
  11871. }
  11872. CpaEvent.YQHomeData = "CpaEvent_YQHomeData";
  11873. return CpaEvent;
  11874. }());
  11875. exports.default = CpaEvent;
  11876. },{}],82:[function(require,module,exports){
  11877. "use strict";
  11878. Object.defineProperty(exports, "__esModule", { value: true });
  11879. var YQSdk_1 = require("../YQSdk");
  11880. var EventUtils_1 = require("../../../../frameworks/events/EventUtils");
  11881. var CpaEvent_1 = require("./CpaEvent");
  11882. var recommendPan = /** @class */ (function () {
  11883. function recommendPan(data) {
  11884. this.game_flg = data["game_flg"];
  11885. this.game_id = data["game_id"];
  11886. this.game_name = data["game_name"];
  11887. this.id = data["id"];
  11888. this.location_flg = data["location_flg"];
  11889. this.location_id = data["location_id"];
  11890. this.location_name = data["location_name"];
  11891. this.matter_type = data["matter_type"];
  11892. }
  11893. return recommendPan;
  11894. }());
  11895. exports.recommendPan = recommendPan;
  11896. var Recommend = /** @class */ (function () {
  11897. function Recommend() {
  11898. Recommend.InitData();
  11899. }
  11900. Recommend.InitData = function () {
  11901. Recommend.cainixihuanData = Recommend.GetCaiNiXiaHuanDatas();
  11902. Recommend.jiesuanData = Recommend.GetJIeSuanDatas();
  11903. Recommend.gdyxData = Recommend.GetGDYXDatas();
  11904. Recommend.baokuanyouxiData = Recommend.GetBaoKuanYouXiDatas();
  11905. Recommend.moreData = Recommend.GetMoreDatas();
  11906. for (var key in YQSdk_1.YQSdk.adPosition) {
  11907. Recommend.recommendDic[YQSdk_1.YQSdk.adPosition[key].location_flg] = new recommendPan(YQSdk_1.YQSdk.adPosition[key]);
  11908. }
  11909. YQSdk_1.YQSdk.GetShare();
  11910. Recommend.getdata = true;
  11911. EventUtils_1.EventUtils.dispatchEvent(CpaEvent_1.default.YQHomeData);
  11912. };
  11913. Recommend.GetCaiNiXiaHuanDatas = function () {
  11914. var items = [];
  11915. if (!YQSdk_1.YQSdk.cainixihuan)
  11916. return items;
  11917. for (var i = 0; i < YQSdk_1.YQSdk.cainixihuan.length; i++) {
  11918. items.push(new RecommendItem(YQSdk_1.YQSdk.cainixihuan[i]));
  11919. items[i].shownum++;
  11920. }
  11921. return items;
  11922. };
  11923. Recommend.GetMoreDatas = function () {
  11924. var items = [];
  11925. if (!YQSdk_1.YQSdk.tc)
  11926. return items;
  11927. for (var i = 0; i < YQSdk_1.YQSdk.tc.length; i++) {
  11928. items.push(new RecommendItem(YQSdk_1.YQSdk.tc[i]));
  11929. items[i].shownum++;
  11930. }
  11931. return items;
  11932. };
  11933. Recommend.GetBaoKuanYouXiDatas = function () {
  11934. var items = [];
  11935. if (!YQSdk_1.YQSdk.baokuanyouxi1)
  11936. return items;
  11937. for (var i = 0; i < YQSdk_1.YQSdk.baokuanyouxi1.length; i++) {
  11938. items.push(new RecommendItem(YQSdk_1.YQSdk.baokuanyouxi1[i]));
  11939. items[i].shownum++;
  11940. }
  11941. return items;
  11942. };
  11943. Recommend.GetJIeSuanDatas = function () {
  11944. var items = [];
  11945. if (!YQSdk_1.YQSdk.js)
  11946. return items;
  11947. for (var i = 0; i < YQSdk_1.YQSdk.js.length; i++) {
  11948. items.push(new RecommendItem(YQSdk_1.YQSdk.js[i]));
  11949. items[i].shownum++;
  11950. }
  11951. return items;
  11952. };
  11953. Recommend.GetGDYXDatas = function () {
  11954. var items = [];
  11955. if (!YQSdk_1.YQSdk.gdyy)
  11956. return items;
  11957. for (var i = 0; i < YQSdk_1.YQSdk.gdyy.length; i++) {
  11958. items.push(new RecommendItem(YQSdk_1.YQSdk.gdyy[i]));
  11959. items[i].shownum++;
  11960. }
  11961. return items;
  11962. };
  11963. Recommend.getdata = false;
  11964. Recommend.recommendDic = {};
  11965. Recommend.cainixihuanData = [];
  11966. Recommend.baokuanyouxiData = [];
  11967. Recommend.gdyxData = [];
  11968. Recommend.jiesuanData = [];
  11969. Recommend.moreData = [];
  11970. return Recommend;
  11971. }());
  11972. exports.Recommend = Recommend;
  11973. var RecommendItem = /** @class */ (function () {
  11974. function RecommendItem(Data) {
  11975. this.shownum = 0;
  11976. this.ad_appid = Data["ad_appid"];
  11977. this.ad_count = Data["ad_count"];
  11978. this.ad_device = Data["ad_device"];
  11979. this.ad_dot = Data["ad_dot"];
  11980. this.ad_id = Data["ad_id"];
  11981. this.ad_img = Data["ad_img"];
  11982. this.ad_name = Data["ad_name"];
  11983. this.ad_path = Data["ad_path"];
  11984. }
  11985. return RecommendItem;
  11986. }());
  11987. exports.RecommendItem = RecommendItem;
  11988. var RecommendView = /** @class */ (function () {
  11989. function RecommendView() {
  11990. }
  11991. return RecommendView;
  11992. }());
  11993. exports.default = RecommendView;
  11994. },{"../../../../frameworks/events/EventUtils":16,"../YQSdk":77,"./CpaEvent":81}],83:[function(require,module,exports){
  11995. "use strict";
  11996. Object.defineProperty(exports, "__esModule", { value: true });
  11997. var ChildBaseView_1 = require("../../../../frameworks/mvc/ChildBaseView");
  11998. var RecommendView_1 = require("./RecommendView");
  11999. var TimerService_1 = require("../../../../frameworks/TimerService");
  12000. var ShiwantuijianView = /** @class */ (function (_super) {
  12001. __extends(ShiwantuijianView, _super);
  12002. function ShiwantuijianView() {
  12003. var _this = _super.call(this) || this;
  12004. _this._iscanmove = false;
  12005. _this._movetime = 0;
  12006. _this._flushtime = 0;
  12007. _this.dir = true;
  12008. _this._nowvalue = 0;
  12009. return _this;
  12010. }
  12011. ShiwantuijianView.prototype.onInit = function () {
  12012. this.initView();
  12013. this.initEvent();
  12014. };
  12015. ShiwantuijianView.prototype.initView = function () {
  12016. this.list_0.setVirtual();
  12017. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
  12018. this._nowlist = RecommendView_1.Recommend.jiesuanData;
  12019. if (this._nowlist.length > 0) {
  12020. this.list_0.numItems = this._nowlist.length;
  12021. this.visible = true;
  12022. for (var i = 0; i < this._nowlist.length; i++) {
  12023. this._nowlist[i].shownum++;
  12024. }
  12025. this._isStart = true;
  12026. this._iscanmove = true;
  12027. TimerService_1.default.instance.addUpdateTarget(this);
  12028. }
  12029. else {
  12030. this.visible = false;
  12031. }
  12032. };
  12033. ShiwantuijianView.prototype.initEvent = function () {
  12034. this.addListener(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick);
  12035. this.addListener(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick);
  12036. this.addListener(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick);
  12037. };
  12038. ShiwantuijianView.prototype.downclick = function () {
  12039. this._isdown = true;
  12040. this._iscanmove = false;
  12041. Laya.timer.clear(this, this.timeoutCallback);
  12042. };
  12043. ShiwantuijianView.prototype.timeoutCallback = function () {
  12044. this._iscanmove = true;
  12045. };
  12046. ShiwantuijianView.prototype.upclick = function () {
  12047. if (this._isdown) {
  12048. this._isdown = false;
  12049. this._nowvalue = this.list_0.scrollPane.percY;
  12050. Laya.timer.once(2000, this, this.timeoutCallback);
  12051. }
  12052. };
  12053. ShiwantuijianView.prototype.itemrenderlist = function (index, item) {
  12054. if (index < this._nowlist.length) {
  12055. item.showData(this._nowlist[index], true);
  12056. }
  12057. };
  12058. ShiwantuijianView.prototype.update = function (dt) {
  12059. if (this._isStart) {
  12060. if (this.list_0.scrollPane && this._nowlist && this._nowlist.length > 0 && this._iscanmove) {
  12061. if (this.dir) {
  12062. this._nowvalue += 0.001;
  12063. if (this._nowvalue >= 1) {
  12064. this._nowvalue = 1;
  12065. this.dir = false;
  12066. }
  12067. }
  12068. else {
  12069. this._nowvalue -= 0.001;
  12070. if (this._nowvalue <= 0) {
  12071. this._nowvalue = 0;
  12072. this.dir = true;
  12073. }
  12074. }
  12075. this.list_0.scrollPane.setPercY(this._nowvalue);
  12076. }
  12077. }
  12078. };
  12079. ShiwantuijianView.prototype.dispose = function () {
  12080. this._iscanmove = false;
  12081. TimerService_1.default.instance.removeUpdateTarget(this);
  12082. _super.prototype.dispose.call(this);
  12083. };
  12084. return ShiwantuijianView;
  12085. }(ChildBaseView_1.default));
  12086. exports.default = ShiwantuijianView;
  12087. },{"../../../../frameworks/TimerService":13,"../../../../frameworks/mvc/ChildBaseView":21,"./RecommendView":82}],84:[function(require,module,exports){
  12088. "use strict";
  12089. Object.defineProperty(exports, "__esModule", { value: true });
  12090. var BaseView_1 = require("../../../../frameworks/mvc/BaseView");
  12091. var RecommendView_1 = require("./RecommendView");
  12092. var UiManager_1 = require("../../../../managers/UiManager");
  12093. var TuijianView = /** @class */ (function (_super) {
  12094. __extends(TuijianView, _super);
  12095. function TuijianView() {
  12096. return _super.call(this, "main", "tuijianView") || this;
  12097. }
  12098. TuijianView.prototype.initView = function () {
  12099. this.list_0.setVirtual();
  12100. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
  12101. this._nowlist = RecommendView_1.Recommend.gdyxData;
  12102. this.list_0.numItems = this._nowlist.length;
  12103. };
  12104. TuijianView.prototype.initEvent = function () {
  12105. this.addListener(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
  12106. };
  12107. TuijianView.prototype.itemrenderlist = function (index, item) {
  12108. if (index < this._nowlist.length) {
  12109. item.showData(this._nowlist[index]);
  12110. }
  12111. };
  12112. TuijianView.prototype.onclosefun = function () {
  12113. UiManager_1.UiManager.instance.close(TuijianView);
  12114. };
  12115. TuijianView.key = "TuijianView";
  12116. return TuijianView;
  12117. }(BaseView_1.default));
  12118. exports.default = TuijianView;
  12119. },{"../../../../frameworks/mvc/BaseView":20,"../../../../managers/UiManager":66,"./RecommendView":82}],85:[function(require,module,exports){
  12120. "use strict";
  12121. Object.defineProperty(exports, "__esModule", { value: true });
  12122. var ChildBaseView_1 = require("../../../../../frameworks/mvc/ChildBaseView");
  12123. var RecommendView_1 = require("../RecommendView");
  12124. var Sdk_1 = require("../../Sdk");
  12125. var YQSdk_1 = require("../../YQSdk");
  12126. var GameUtils_1 = require("../../../../../utils/GameUtils");
  12127. var UiManager_1 = require("../../../../../managers/UiManager");
  12128. var ChoutiPanView_1 = require("../ChoutiPanView");
  12129. var CpaItem = /** @class */ (function (_super) {
  12130. __extends(CpaItem, _super);
  12131. function CpaItem() {
  12132. var _this = _super.call(this) || this;
  12133. _this.ispenchoutipan = false;
  12134. return _this;
  12135. }
  12136. CpaItem.prototype.onInit = function () {
  12137. this.name = "capItem";
  12138. this.addListener(this, Laya.Event.CLICK, this, this.onbtnclick);
  12139. };
  12140. CpaItem.prototype.onbtnclick = function () {
  12141. var _this = this;
  12142. if (this._vo) {
  12143. var data = this._vo;
  12144. var appid = data.ad_appid;
  12145. var path = data.ad_path;
  12146. var param = { "appId": appid.toString(), "path": path.toString() };
  12147. if (Laya.Browser.onWeiXin) {
  12148. Sdk_1.WxApi.recordAldEvent("点击跳转到游戏" + data.ad_name, "1");
  12149. Laya.Browser.window.wx.navigateToMiniProgram({
  12150. appId: appid.toString(),
  12151. path: path.toString(),
  12152. success: function (res) {
  12153. Sdk_1.WxApi.recordAldEvent("跳转到游戏成功", "1");
  12154. var location_id = RecommendView_1.Recommend.recommendDic["C"].location_id;
  12155. YQSdk_1.YQSdk.reportad(data.ad_id, location_id, true);
  12156. },
  12157. fail: function (res) {
  12158. Sdk_1.WxApi.recordAldEvent("跳转到游戏失败", "1");
  12159. var location_id = RecommendView_1.Recommend.recommendDic["C"].location_id;
  12160. YQSdk_1.YQSdk.reportad(data.ad_id, location_id, false);
  12161. if (_this.ispenchoutipan) {
  12162. UiManager_1.UiManager.instance.add(ChoutiPanView_1.default);
  12163. }
  12164. // if(WindowManager.Instance.curOpenedView.name == "HomeWindow")this.OnOpenCtView(true);
  12165. }
  12166. });
  12167. }
  12168. }
  12169. };
  12170. CpaItem.prototype.showData = function (data, isopenchoutipan) {
  12171. if (isopenchoutipan === void 0) { isopenchoutipan = false; }
  12172. this.ispenchoutipan = isopenchoutipan;
  12173. this._vo = data;
  12174. if (data) {
  12175. this.load_icon.url = data.ad_img;
  12176. if (this.txt_word) {
  12177. this.txt_word.text = data.ad_name;
  12178. }
  12179. if (this.img_tip) {
  12180. this.img_tip.visible = data.ad_dot == 1 ? true : false;
  12181. }
  12182. if (this.txt_word1) {
  12183. this.txt_word1.text = GameUtils_1.GameUtils.randRangeint(235470, 1561430).toString() + "人玩";
  12184. }
  12185. }
  12186. };
  12187. return CpaItem;
  12188. }(ChildBaseView_1.default));
  12189. exports.default = CpaItem;
  12190. },{"../../../../../frameworks/mvc/ChildBaseView":21,"../../../../../managers/UiManager":66,"../../../../../utils/GameUtils":87,"../../Sdk":75,"../../YQSdk":77,"../ChoutiPanView":79,"../RecommendView":82}],86:[function(require,module,exports){
  12191. "use strict";
  12192. Object.defineProperty(exports, "__esModule", { value: true });
  12193. var Dictionary = /** @class */ (function () {
  12194. function Dictionary() {
  12195. this.keys = new Array();
  12196. this.values = new Array();
  12197. }
  12198. Object.defineProperty(Dictionary.prototype, "count", {
  12199. get: function () {
  12200. return this.keys.length;
  12201. },
  12202. enumerable: true,
  12203. configurable: true
  12204. });
  12205. Dictionary.prototype.add = function (key, value) {
  12206. var index = this.keys.indexOf(key);
  12207. if (index == -1) {
  12208. this.keys.push(key);
  12209. this.values.push(value);
  12210. }
  12211. else {
  12212. this.values[index] = value;
  12213. }
  12214. };
  12215. Dictionary.prototype.remove = function (key) {
  12216. var index = this.keys.indexOf(key);
  12217. if (index != -1) {
  12218. this.keys.splice(index, 1);
  12219. this.values.splice(index, 1);
  12220. }
  12221. };
  12222. Dictionary.prototype.getValue = function (key) {
  12223. var index = this.keys.indexOf(key);
  12224. if (index != -1) {
  12225. return this.values[index];
  12226. }
  12227. return null;
  12228. };
  12229. Dictionary.prototype.containKey = function (key) {
  12230. var index = this.keys.indexOf(key);
  12231. if (index != -1) {
  12232. return true;
  12233. }
  12234. return false;
  12235. };
  12236. Dictionary.prototype.containValue = function (value) {
  12237. var index = this.values.indexOf(value);
  12238. if (index != -1) {
  12239. return true;
  12240. }
  12241. return false;
  12242. };
  12243. Dictionary.prototype.clear = function () {
  12244. this.keys.length = 0;
  12245. this.values.length = 0;
  12246. };
  12247. return Dictionary;
  12248. }());
  12249. exports.default = Dictionary;
  12250. },{}],87:[function(require,module,exports){
  12251. "use strict";
  12252. Object.defineProperty(exports, "__esModule", { value: true });
  12253. /*
  12254. * 公共接口
  12255. */
  12256. var GameUtils;
  12257. (function (GameUtils) {
  12258. /**
  12259. * 随机函数(返回整型)
  12260. */
  12261. function randRangeint(min, max) {
  12262. var value = Math.floor(Math.random() * (max - min + 1)) + min;
  12263. if (value > max) {
  12264. value = max;
  12265. }
  12266. return value;
  12267. }
  12268. GameUtils.randRangeint = randRangeint;
  12269. /**
  12270. * 随机函数( 不取整 )
  12271. */
  12272. function randRangefloat(min, max) {
  12273. var value = Math.random() * (max - min + 1) + min;
  12274. if (value > max) {
  12275. value = max;
  12276. }
  12277. return value;
  12278. }
  12279. GameUtils.randRangefloat = randRangefloat;
  12280. function getTexbyPkgAndName(pkgname, texname) {
  12281. var uipackage = fairygui.UIPackage.getByName(pkgname);
  12282. if (uipackage) {
  12283. return uipackage.getItemAssetByName(texname);
  12284. }
  12285. return null;
  12286. }
  12287. GameUtils.getTexbyPkgAndName = getTexbyPkgAndName;
  12288. /**
  12289. * 切割分号变成Point对象
  12290. * @param str
  12291. */
  12292. function cutfenhaoPoint(str) {
  12293. var arr = str.split(";");
  12294. return new Laya.Point(Number(arr[0]), Number(arr[1]));
  12295. }
  12296. GameUtils.cutfenhaoPoint = cutfenhaoPoint;
  12297. /**
  12298. * 切割分号变成数据(number)
  12299. */
  12300. function cutfenhaotoArrnum(str) {
  12301. var numArr = [];
  12302. if (str == "") {
  12303. return numArr;
  12304. }
  12305. var arr = str.split(";");
  12306. var i = 0;
  12307. for (i; i < arr.length; i++) {
  12308. numArr.push(Number(arr[i]));
  12309. }
  12310. return numArr;
  12311. }
  12312. GameUtils.cutfenhaotoArrnum = cutfenhaotoArrnum;
  12313. /**
  12314. * 切割分号变成数据(string)
  12315. */
  12316. function cutfenhaotoArrstr(str) {
  12317. return str.split(";");
  12318. }
  12319. GameUtils.cutfenhaotoArrstr = cutfenhaotoArrstr;
  12320. /**
  12321. * 切割分号变成数据( { key:1,value:1 } )
  12322. */
  12323. function cutfenhaotoObj(str) {
  12324. var obj = {};
  12325. var arr = str.split(";");
  12326. obj.key = arr[0];
  12327. obj.value = arr[1];
  12328. return obj;
  12329. }
  12330. GameUtils.cutfenhaotoObj = cutfenhaotoObj;
  12331. /**切割str*/
  12332. function cutstrtoArr(str) {
  12333. var arr = str.split("|");
  12334. return arr;
  12335. }
  12336. GameUtils.cutstrtoArr = cutstrtoArr;
  12337. /**切割str( 1:1|1:1 ) to Array<{ key:1,value:1 }> */
  12338. function cutstrtoArr1(str) {
  12339. var reslutArr = [];
  12340. var arr = str.split("|");
  12341. var i = 0;
  12342. for (i = 0; i < arr.length; i++) {
  12343. var itemarr = arr[i].split(";");
  12344. reslutArr.push({ key: itemarr[0], value: itemarr[1] });
  12345. }
  12346. return reslutArr;
  12347. }
  12348. GameUtils.cutstrtoArr1 = cutstrtoArr1;
  12349. function cutstrtoObj(str) {
  12350. var resultobj = {};
  12351. var arr = str.split("|");
  12352. var i = 0;
  12353. for (i = 0; i < arr.length; i++) {
  12354. var itemarr = arr[i].split(";");
  12355. resultobj[itemarr[0]] = itemarr[1];
  12356. }
  12357. return resultobj;
  12358. }
  12359. GameUtils.cutstrtoObj = cutstrtoObj;
  12360. function compareVersion(v1, v2) {
  12361. v1 = v1.split('.');
  12362. v2 = v2.split('.');
  12363. var len = Math.max(v1.length, v2.length);
  12364. while (v1.length < len) {
  12365. v1.push('0');
  12366. }
  12367. while (v2.length < len) {
  12368. v2.push('0');
  12369. }
  12370. for (var i = 0; i < len; i++) {
  12371. var num1 = parseInt(v1[i]);
  12372. var num2 = parseInt(v2[i]);
  12373. if (num1 > num2) {
  12374. return 1;
  12375. }
  12376. else if (num1 < num2) {
  12377. return -1;
  12378. }
  12379. }
  12380. return 0;
  12381. }
  12382. GameUtils.compareVersion = compareVersion;
  12383. })(GameUtils = exports.GameUtils || (exports.GameUtils = {}));
  12384. },{}],88:[function(require,module,exports){
  12385. "use strict";
  12386. Object.defineProperty(exports, "__esModule", { value: true });
  12387. var TimeUtils;
  12388. (function (TimeUtils) {
  12389. /**
  12390. * 月/日 小时:分钟
  12391. * @param value
  12392. */
  12393. function formatData(value) {
  12394. var str = "";
  12395. var date = new Date(value * 1000);
  12396. str = this.getTwo(date.getMonth() + 1) + "/" + this.getTwo(date.getDate()) + " " + this.getTwo(date.getHours()) + ":" + this.getTwo(date.getMinutes());
  12397. return str;
  12398. }
  12399. TimeUtils.formatData = formatData;
  12400. /**
  12401. * 月/日
  12402. * @param value
  12403. */
  12404. function formatData1(value) {
  12405. var str = "";
  12406. var date = new Date(value * 1000);
  12407. str = (date.getMonth() + 1) + "月" + date.getDate() + "日";
  12408. return str;
  12409. }
  12410. TimeUtils.formatData1 = formatData1;
  12411. /**
  12412. * 年月日
  12413. * @param value
  12414. */
  12415. function formatYearMonthDate(value) {
  12416. var str = "";
  12417. var date = new Date(value * 1000);
  12418. str = date.getFullYear() + "." + (date.getMonth() + 1) + "." + date.getDate();
  12419. return str;
  12420. }
  12421. TimeUtils.formatYearMonthDate = formatYearMonthDate;
  12422. /**
  12423. * 年-月-日
  12424. * @param value
  12425. */
  12426. function formatYearMonthDate1(value) {
  12427. var str = "";
  12428. var date = new Date(value * 1000);
  12429. var month = (date.getMonth() + 1) >= 10 ? (date.getMonth() + 1).toString() : "0" + (date.getMonth() + 1);
  12430. var dates = date.getDate() >= 10 ? date.getDate().toString() : "0" + date.getDate();
  12431. str = date.getFullYear() + "-" + month + "-" + dates;
  12432. return str;
  12433. }
  12434. TimeUtils.formatYearMonthDate1 = formatYearMonthDate1;
  12435. function LXandJXTimeType(value) {
  12436. var str = "";
  12437. if (value < 0) {
  12438. str = "0秒";
  12439. }
  12440. else if (value < 60) {
  12441. str = Math.floor(value) + "秒";
  12442. }
  12443. else if (value < 60 * 60) {
  12444. str = Math.floor(value / 60) + "分钟";
  12445. }
  12446. else {
  12447. var hour;
  12448. hour = Math.floor(value / 60 / 60);
  12449. str = hour + "小时";
  12450. str += Math.floor((value - hour * 60 * 60) / 60) + "分钟";
  12451. }
  12452. return str;
  12453. }
  12454. TimeUtils.LXandJXTimeType = LXandJXTimeType;
  12455. /**
  12456. * 格式化时间
  12457. * @param time 秒
  12458. * @return 返回24:59:59
  12459. */
  12460. function formatTime(time) {
  12461. var str = "";
  12462. var hours = Math.floor(time / 3600);
  12463. if (hours > 0) {
  12464. str += hours >= 10 ? (hours + ":") : ("0" + hours + ":");
  12465. }
  12466. var minutes = Math.floor((time % 3600) / 60);
  12467. str += minutes >= 10 ? (minutes + ":") : ("0" + minutes + ":");
  12468. var second = Math.floor(time % 60);
  12469. str += second >= 10 ? (second + "") : ("0" + second);
  12470. return str;
  12471. }
  12472. TimeUtils.formatTime = formatTime;
  12473. /**
  12474. * 格式化时间
  12475. * @param time 秒
  12476. * @return 返回24小时59分59秒
  12477. */
  12478. function formatTime1(time) {
  12479. var str = "";
  12480. var hours = Math.floor(time / 3600);
  12481. if (hours > 0) {
  12482. str += hours + "小时";
  12483. }
  12484. var minutes = Math.floor((time % 3600) / 60);
  12485. str += minutes + "分钟";
  12486. var second = Math.floor(time % 60);
  12487. str += second + "秒";
  12488. return str;
  12489. }
  12490. TimeUtils.formatTime1 = formatTime1;
  12491. /**
  12492. * 格式化时间
  12493. * @param time 秒
  12494. * @return 返回1小时24分10秒
  12495. */
  12496. function formatTime5(time) {
  12497. var str = "";
  12498. var hours = Math.floor(time / 3600);
  12499. if (hours > 0) {
  12500. str += hours + "小时";
  12501. }
  12502. var minutes = Math.floor((time % 3600) / 60);
  12503. if (minutes > 0) {
  12504. str += minutes + "分";
  12505. }
  12506. var second = Math.floor(time % 60);
  12507. str += second + "秒";
  12508. return str;
  12509. }
  12510. TimeUtils.formatTime5 = formatTime5;
  12511. /**
  12512. * 格式化时间
  12513. * @param time 秒
  12514. * @return 返回1天24小时59分59秒
  12515. */
  12516. function formatTime2(time) {
  12517. var str = "";
  12518. var day = Math.floor(time / 86400);
  12519. if (day > 0) {
  12520. str += day + "天";
  12521. }
  12522. var hours = Math.floor(time / 3600);
  12523. if (hours > 0) {
  12524. str += hours + "小时";
  12525. }
  12526. var minutes = Math.floor((time % 3600) / 60);
  12527. if (minutes > 0) {
  12528. str += minutes + "分钟";
  12529. }
  12530. var second = Math.ceil(time % 60);
  12531. str += second + "秒";
  12532. return str;
  12533. }
  12534. TimeUtils.formatTime2 = formatTime2;
  12535. /**
  12536. * 格式化时间
  12537. * @param time 秒
  12538. * @return 返回1天24小时( 只保留两个 )
  12539. */
  12540. function formatTime6(time) {
  12541. var str = "";
  12542. var index = 0;
  12543. var day = Math.floor(time / 86400);
  12544. if (day > 0) {
  12545. str += day + "天";
  12546. index++;
  12547. }
  12548. var hours = Math.floor((time % 86400) / 3600);
  12549. if (hours > 0) {
  12550. str += hours + "小时";
  12551. index++;
  12552. }
  12553. if (index < 2) {
  12554. var minutes = Math.floor((time % 3600) / 60);
  12555. if (minutes > 0) {
  12556. str += minutes + "分";
  12557. index++;
  12558. }
  12559. }
  12560. if (index < 2) {
  12561. var second = Math.ceil(time % 60);
  12562. str += second + "秒";
  12563. }
  12564. return str;
  12565. }
  12566. TimeUtils.formatTime6 = formatTime6;
  12567. /**
  12568. * 格式化时间
  12569. * @param time 秒
  12570. * @return 返回1天24小时59分
  12571. */
  12572. function formatTime3(time) {
  12573. var str = "";
  12574. var day = Math.floor(time / 86400);
  12575. str += day + "天";
  12576. var hours = Math.floor(time % 86400 / 3600);
  12577. str += hours + "小时";
  12578. var minutes = Math.floor((time % 86400 % 3600) / 60);
  12579. str += minutes + "分";
  12580. return str;
  12581. }
  12582. TimeUtils.formatTime3 = formatTime3;
  12583. /**
  12584. * 格式化时间
  12585. * @param time 秒
  12586. * @return 返回1天24小时59分
  12587. */
  12588. function formatTime4(time) {
  12589. var str = "";
  12590. if (time > 86400) {
  12591. var day = Math.floor(time / 86400);
  12592. str += day + "天";
  12593. }
  12594. if (time > 3600) {
  12595. var hours = Math.floor(time % 86400 / 3600);
  12596. str += hours + "小时";
  12597. }
  12598. if (time > 60) {
  12599. var minutes = Math.floor((time % 86400 % 3600) / 60);
  12600. str += minutes + "分钟";
  12601. }
  12602. return str;
  12603. }
  12604. TimeUtils.formatTime4 = formatTime4;
  12605. /**
  12606. * 格式化时间
  12607. * @param time 秒
  12608. * @return 返回1天24小时59分
  12609. */
  12610. function formatTime4Arr(time) {
  12611. var arrTime = [];
  12612. var str = "";
  12613. // if (time >= 86400) {
  12614. // var day: number = Math.floor(time / 86400);
  12615. // arrTime.unshift(String(day));
  12616. // }
  12617. if (time >= 3600) {
  12618. var hours = Math.floor(time % 86400 / 3600);
  12619. arrTime.unshift(String(hours));
  12620. }
  12621. if (time >= 60) {
  12622. var minutes = Math.floor((time % 86400 % 3600) / 60);
  12623. arrTime.unshift(String(minutes));
  12624. }
  12625. return arrTime;
  12626. }
  12627. TimeUtils.formatTime4Arr = formatTime4Arr;
  12628. function getTwo(value) {
  12629. var str = String(value);
  12630. if (str.length < 2) {
  12631. str = "0" + str;
  12632. }
  12633. return str;
  12634. }
  12635. TimeUtils.getTwo = getTwo;
  12636. /**
  12637. * 日期转时间戳
  12638. * @param str 2018-1-1
  12639. */
  12640. function datetoTime(str) {
  12641. return Date.parse(str) / 1000;
  12642. }
  12643. TimeUtils.datetoTime = datetoTime;
  12644. })(TimeUtils = exports.TimeUtils || (exports.TimeUtils = {}));
  12645. },{}]},{},[4])
  12646. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkQ6L0xheWFBaXJJREUyLjEuMS4xL3Jlc291cmNlcy9hcHAvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInNyYy9HYW1lQ29udGVudHMudHMiLCJzcmMvR2xvYmFsLnRzIiwic3JjL0dsb2JhbFdhaXRpbmcudHMiLCJzcmMvTWFpbi50cyIsInNyYy9jb25maWdzL2RhdGFDb25maWdzL0J1aWxkQ0ZHLnRzIiwic3JjL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvR2FtZUNGRy50cyIsInNyYy9jb25maWdzL2RhdGFDb25maWdzL0xldmVsQ0ZHLnRzIiwic3JjL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvTnBjQ0ZHLnRzIiwic3JjL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvUm9sZUNGRy50cyIsInNyYy9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWcudHMiLCJzcmMvY29uZmlncy9nYW1lQ29uZmlncy9SZWNDb25maWdzLnRzIiwic3JjL2ZyYW1ld29ya3MvRGVidWdlci50cyIsInNyYy9mcmFtZXdvcmtzL1RpbWVyU2VydmljZS50cyIsInNyYy9mcmFtZXdvcmtzL1RpbWVzVGFtcGVyLnRzIiwic3JjL2ZyYW1ld29ya3MvZXZlbnRzL0NvbUV2ZW50Vk8udHMiLCJzcmMvZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlscy50cyIsInNyYy9mcmFtZXdvcmtzL2V2ZW50cy9MRXZlbnQudHMiLCJzcmMvZnJhbWV3b3Jrcy9ldmVudHMvTExpc3RlbmVyLnRzIiwic3JjL2ZyYW1ld29ya3MvbXZjL0Jhc2VQcm94eXMudHMiLCJzcmMvZnJhbWV3b3Jrcy9tdmMvQmFzZVZpZXcudHMiLCJzcmMvZnJhbWV3b3Jrcy9tdmMvQ2hpbGRCYXNlVmlldy50cyIsInNyYy9mcmFtZXdvcmtzL212Yy9NVkNPYmplY3RQb29sLnRzIiwic3JjL2ZyYW1ld29ya3MvbXZjL09iamVjdFBvb2wudHMiLCJzcmMvZnJhbWV3b3Jrcy9tdmMvU2luZ2xldG9uLnRzIiwic3JjL2ZyYW1ld29ya3MvbXZjL1dpbmRvd0FubW9UeXBlLnRzIiwic3JjL2ZyYW1ld29ya3MvbmV0L0dhbWVIdHRwcy50cyIsInNyYy9mcmFtZXdvcmtzL25ldC9HYW1lU29ja2V0LnRzIiwic3JjL2ZyYW1ld29ya3MvbmV0L1RvbmdqaUh0dHBzLnRzIiwic3JjL2ZyYW1ld29ya3Mvbm90aWZpY2F0aW9uL0xheWVyTm90aWZ5LnRzIiwic3JjL2ZyYW1ld29ya3Mvbm90aWZpY2F0aW9uL1NvY2tldE5vZmlmeS50cyIsInNyYy9mcmFtZXdvcmtzL3ZvL0Jhc2VWTy50cyIsInNyYy9mcmFtZXdvcmtzL3ZvL0NhY2hlVk8udHMiLCJzcmMvZ2FtZW1vZHVsZS9qb3lzdGljay9Kb3lzdGlja01vZHVsZS50cyIsInNyYy9nYW1lbW9kdWxlL2xvYWRpbmcvcHJveHlzL0xvZ2luUHJveHkudHMiLCJzcmMvZ2FtZW1vZHVsZS9sb2FkaW5nL3ZpZXcvTG9hZGluZ1ZpZXcudHMiLCJzcmMvZ2FtZW1vZHVsZS9sb2FkaW5nL3ZpZXcvV29yZFRpcHNVdGlscy50cyIsInNyYy9nYW1lbW9kdWxlL2xvYWRpbmcvdmlldy9Xb3JkVGlwc1ZpZXcudHMiLCJzcmMvZ2FtZW1vZHVsZS9tYWluL0dhbWVTdGF0ZU1hbmFnZXIudHMiLCJzcmMvZ2FtZW1vZHVsZS9tYWluL3Byb3h5cy9HYW1lUHJveHkudHMiLCJzcmMvZ2FtZW1vZHVsZS9tYWluL3Byb3h5cy9NYWluUHJveHkudHMiLCJzcmMvZ2FtZW1vZHVsZS9tYWluL3ZpZXcvTWFpblZpZXcudHMiLCJzcmMvZ2FtZW1vZHVsZS9tb2RlbFNjcmlwdHMvQ2FtZXJhc1NjcmlwdC50cyIsInNyYy9nYW1lbW9kdWxlL21vZGVsU2NyaXB0cy9NYWluUm9sZVNjcmlwdC50cyIsInNyYy9nYW1lbW9kdWxlL21vZGVsU2NyaXB0cy9OcGNTY3JpcHQudHMiLCJzcmMvZ2FtZW1vZHVsZS9yZXN1bHQvR2FtZVJlc3VsdFZpZXcudHMiLCJzcmMvZ2FtZW1vZHVsZS9zY2VuZTNkcy9Sb2xlQWN0aW9ucy50cyIsInNyYy9nYW1lbW9kdWxlL3NjZW5lM2RzL1JvbGVzUG9vbC50cyIsInNyYy9nYW1lbW9kdWxlL3NjZW5lM2RzL1NjZW5lM2RPYmplY3QudHMiLCJzcmMvZ2FtZW1vZHVsZS9za2lucy9QaWZ1SXRlbS50cyIsInNyYy9nYW1lbW9kdWxlL3NraW5zL1NraW5WaWV3LnRzIiwic3JjL2dhbWVtb2R1bGUvc2tpbnMvcHJveHlzL1NraW5Qcm94eS50cyIsInNyYy9nYW1lbW9kdWxlL3NraW5zL3ZvL1BpRnVWTy50cyIsInNyYy9nYW1lbW9kdWxlL3VzZXJpbmZvL1VzZXJJbmZvUHJveHkudHMiLCJzcmMvZ2FtZW1vZHVsZS91c2VyaW5mby9ldmVudHMvR2FtZUV2ZW50LnRzIiwic3JjL2dhbWVtb2R1bGUvdXNlcmluZm8vZXZlbnRzL1VzZXJDYWNoZVR5cGUudHMiLCJzcmMvZ2FtZW1vZHVsZS91c2VyaW5mby9ldmVudHMvVXNlckluZm9FdmVudC50cyIsInNyYy9nYW1lbW9kdWxlL3VzZXJpbmZvL3ZvL1JvbGVWTy50cyIsInNyYy9tYW5hZ2Vycy9CaW5kZXJNYW5hZ2VyLnRzIiwic3JjL21hbmFnZXJzL0NhY2hlTWFuYWdlci50cyIsInNyYy9tYW5hZ2Vycy9EYXlNYW5hZ2VyLnRzIiwic3JjL21hbmFnZXJzL0dhbWVMYXllck1hbmFnZXIudHMiLCJzcmMvbWFuYWdlcnMvUmVzRGF0YU1hbmFnZXIudHMiLCJzcmMvbWFuYWdlcnMvUmVzb3VyY2VNYW5hZ2VyLnRzIiwic3JjL21hbmFnZXJzL1NjZW5lM0RNYW5hZ2VyLnRzIiwic3JjL21hbmFnZXJzL1NvdW5kc3NNYW5hZ2VyLnRzIiwic3JjL21hbmFnZXJzL1VpTWFuYWdlci50cyIsInNyYy9wbGF0Zm9ybS9QbGF0Zm9ybVRvb2wudHMiLCJzcmMvcGxhdGZvcm0vUGxhdGZyb21UeXBlLnRzIiwic3JjL3BsYXRmb3JtL2V2ZW50cy9QbGF0Zm9ybUV2ZW50LnRzIiwic3JjL3BsYXRmb3JtL3R5cGVzL1JhbmtUeXBlLnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvTmV0d29ya01hbmFnZXIudHMiLCJzcmMvcGxhdGZvcm0vd3htaW5pZ2FtZS9XWEdhbWVQbGF0Zm9ybS50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL0d1YW5nR2FvLnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvUGxheWVyQWNjb3VudC50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL1Nkay50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL1NoYXJlVXRpbC50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL1lRU2RrLnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL0Jhb0t1YW5HYW1lVmlldy50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9DaG91dGlQYW5WaWV3LnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL0NwYURvd25zVmlldy50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9DcGFFdmVudC50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9SZWNvbW1lbmRWaWV3LnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL1NoaXdhbnR1aWppYW5WaWV3LnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL1R1aWppYW5WaWV3LnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL2l0ZW0vQ3BhSXRlbS50cyIsInNyYy91dGlscy9EaWN0aW9uYXJ5LnRzIiwic3JjL3V0aWxzL0dhbWVVdGlscy50cyIsInNyYy91dGlscy9UaW1lVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVkEsbUNBQWtDO0FBQ2xDLGdFQUEyRDtBQUMzRCxn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Q0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUV6RCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUV2RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUV6RCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBRSxDQUFDO1FBRWpELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcs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LElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBQyxPQUFPLENBQUM7d0JBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7d0JBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBQyxPQUFPLENBQUM7d0JBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFFLE9BQU8sQ0FBQzt3QkFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDaEQsTUFBTTtvQkFDVixLQUFLLHFCQUFXLENBQUMsU0FBUzt3QkFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFDLE9BQU8sQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzt3QkFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO3dCQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFDLE9BQU8sQ0FBQzt3QkFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUUsT0FBTyxDQUFDO3dCQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FB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QyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDMUMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDeEMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDeEMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDeEMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsY0FBYyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxTQUFTLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUU7UUFDN0MsV0FBVyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDMUMsZUFBZSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdB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dEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBRXRELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUNwRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBRXBELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBRXRELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFFLENBQUM7UUFFOUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3hELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUN4RCxJQUFJLENB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bEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBRmUsb0JBQVUsYUFFekIsQ0FBQTtBQUNMLENBQUMsRUF6UWEsU0FBUyxHQUFULGlCQUFTLEtBQVQsaUJBQVMsUUF5UXRCIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxufSkoKTtcclxuKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsImltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuL0dsb2JhbFwiO1xyXG5pbXBvcnQgTVZDT2JqZWN0UG9vbCBmcm9tIFwiLi9mcmFtZXdvcmtzL212Yy9NVkNPYmplY3RQb29sXCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuL2ZyYW1ld29ya3MvRGVidWdlclwiO1xyXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4vZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5cclxuaW1wb3J0IENvbUV2ZW50Vk8gZnJvbSBcIi4vZnJhbWV3b3Jrcy9ldmVudHMvQ29tRXZlbnRWT1wiO1xyXG5pbXBvcnQgUmVjQ29uZmlncyBmcm9tIFwiLi9jb25maWdzL2dhbWVDb25maWdzL1JlY0NvbmZpZ3NcIjtcclxuaW1wb3J0IHsgVGltZXNUYW1wZXIgfSBmcm9tIFwiLi9mcmFtZXdvcmtzL1RpbWVzVGFtcGVyXCI7XHJcbmltcG9ydCB7IFBhdGhDb25maWcgfSBmcm9tIFwiLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IFRpbWVyU2VydmljZSBmcm9tIFwiLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgR2xvYmFsV2FpdGluZyBmcm9tIFwiLi9HbG9iYWxXYWl0aW5nXCI7XHJcbmltcG9ydCBCYXNlVmlldyBmcm9tIFwiLi9mcmFtZXdvcmtzL212Yy9CYXNlVmlld1wiO1xyXG5pbXBvcnQgT2JqZWN0UG9vbCBmcm9tIFwiLi9mcmFtZXdvcmtzL212Yy9PYmplY3RQb29sXCI7XHJcbmltcG9ydCB7IEdhbWVMYXllck1hbmFnZXIgfSBmcm9tIFwiLi9tYW5hZ2Vycy9HYW1lTGF5ZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFVpTWFuYWdlciB9IGZyb20gXCIuL21hbmFnZXJzL1VpTWFuYWdlclwiO1xyXG5pbXBvcnQgUmVzb3VyY2VNYW5hZ2VyIGZyb20gXCIuL21hbmFnZXJzL1Jlc291cmNlTWFuYWdlclwiO1xyXG5pbXBvcnQgUmVzRGF0YU1hbmFnZXIgZnJvbSBcIi4vbWFuYWdlcnMvUmVzRGF0YU1hbmFnZXJcIjtcclxuaW1wb3J0IFNvdW5kc3NNYW5hZ2VyIGZyb20gXCIuL21hbmFnZXJzL1NvdW5kc3NNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEJpbmRlck1hbmFnZXIgfSBmcm9tIFwiLi9tYW5hZ2Vycy9CaW5kZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCBQbGF0Zm9ybVRvb2wgZnJvbSBcIi4vcGxhdGZvcm0vUGxhdGZvcm1Ub29sXCI7XHJcbmltcG9ydCBMb2dpblByb3h5IGZyb20gXCIuL2dhbWVtb2R1bGUvbG9hZGluZy9wcm94eXMvTG9naW5Qcm94eVwiO1xyXG5pbXBvcnQgVXNlckluZm9Qcm94eSBmcm9tIFwiLi9nYW1lbW9kdWxlL3VzZXJpbmZvL1VzZXJJbmZvUHJveHlcIjtcclxuaW1wb3J0IE1haW5Qcm94eSBmcm9tIFwiLi9nYW1lbW9kdWxlL21haW4vcHJveHlzL01haW5Qcm94eVwiO1xyXG5pbXBvcnQgR2FtZVByb3h5IGZyb20gXCIuL2dhbWVtb2R1bGUvbWFpbi9wcm94eXMvR2FtZVByb3h5XCI7XHJcbmltcG9ydCBTa2luUHJveHkgZnJvbSBcIi4vZ2FtZW1vZHVsZS9za2lucy9wcm94eXMvU2tpblByb3h5XCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBHYW1lQ29udGVudHMgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+WMlua4uOaIj1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgUmVjQ29uZmlncy5nZXRJbnN0YW5jZSgpLmluaXQoKTtcclxuICAgICAgICBFdmVudFV0aWxzLmluaXQoKTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuZ2V0SW5hc3RhbmNlKCkuaW5pdCgpO1xyXG4gICAgICAgIEdhbWVMYXllck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pbml0bGF5ZXIoKTtcclxuICAgICAgICBVaU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pbml0KCk7XHJcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuaW5pdCgpO1xyXG4gICAgICAgIFJlc0RhdGFNYW5hZ2VyLmdldEluYXN0YW5jZSgpLmluaXQoKTtcclxuICAgICAgICBTb3VuZHNzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmluaXQoKTtcclxuICAgICAgICBCaW5kZXJNYW5hZ2VyLmJpbmRlckFsbCgpO1xyXG4gICAgICAgIFRpbWVzVGFtcGVyLmdldEluc3RhbmNlKCkuaW5pdCgpO1xyXG4gICAgICAgIFBsYXRmb3JtVG9vbC5nZXRJbnN0YW5jZSgpLmluaXQoKTtcclxuICAgICAgICB0aGlzLmluaXRQb29sT2JqZWN0KCk7XHJcbiAgICAgICAgdGhpcy5pbml0UHJveHkoKTtcclxuICAgICAgICB0aGlzLmluaXRtYXBWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5iZWdpbkxvYWRIYW5kbGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliJ3lp4vljJblr7nosaHmsaBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpbml0UG9vbE9iamVjdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBPYmplY3RQb29sLnJlZ2lzdGVyKCBDb21FdmVudFZPLnBvb2xrZXksQ29tRXZlbnRWTyApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5qih5Z2X5Luj55CG57G7XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdFByb3h5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBtdmNwb29sOk1WQ09iamVjdFBvb2wgPSBNVkNPYmplY3RQb29sLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgbXZjcG9vbC5hZGRQcm94eSggTG9naW5Qcm94eSApO1xyXG4gICAgICAgIG12Y3Bvb2wuYWRkUHJveHkoIFVzZXJJbmZvUHJveHkgKTtcclxuICAgICAgICBtdmNwb29sLmFkZFByb3h5KCBNYWluUHJveHkgKTtcclxuICAgICAgICBtdmNwb29sLmFkZFByb3h5KCBHYW1lUHJveHkgKTtcclxuICAgICAgICBtdmNwb29sLmFkZFByb3h5KCBTa2luUHJveHkgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRtYXBWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBtdmNwb29sOk1WQ09iamVjdFBvb2wgPSBNVkNPYmplY3RQb29sLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgLy8gbXZjcG9vbC5tYXBWaWV3KCBNYXBWaWV3VHlwZS5EYWlseXJld2FyZFZpZXcsRGFpbHlyZXdhcmRWaWV3ICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBiZWdpbkxvYWRIYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBwYXRoYXJyOkFycmF5PGFueT4gPSBbXTtcclxuICAgICAgICBwYXRoYXJyLnB1c2goIHsgdXJsOlBhdGhDb25maWcuZ2V0UmVzQ29uZmlnKCksIHR5cGU6IExheWEuTG9hZGVyLkpTT04gfSApO1xyXG4gICAgICAgIHBhdGhhcnIucHVzaCggeyB1cmw6UGF0aENvbmZpZy5nZXRHYW1lVmVyc2lvbigpLCB0eXBlOiBMYXlhLkxvYWRlci5KU09OIH0gKTtcclxuICAgICAgICBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5Mb2FkZXJzKCBwYXRoYXJyLHRoaXMsdGhpcy5yZWNsb2FkQ29tcGxldGUgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlY2xvYWRDb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2FtZXZlcnNpb246YW55ID0gUmVzRGF0YU1hbmFnZXIuaW5zdGFuY2UuZ2V0UmVzQnl1cmwoIFBhdGhDb25maWcuZ2V0R2FtZVZlcnNpb24oKSxmYWxzZSApO1xyXG4gICAgICAgIGlmKCBnYW1ldmVyc2lvbiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHbG9iYWwuZ2FtZVZlcnNpb24gPSBnYW1ldmVyc2lvbi52ZXJzaW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHbG9iYWwuZ2FtZVZlcnNpb24gPSBcIjEuMC4wXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIERlYnVnZXIubG9nKCBcImdhbWVWZXJzaW9uOlwiICsgR2xvYmFsLmdhbWVWZXJzaW9uICk7XHJcbiAgICAgICAgdmFyIGNvbmZpZ3JlczphbnkgPSBSZXNEYXRhTWFuYWdlci5pbnN0YW5jZS5nZXRSZXNCeXVybCggUGF0aENvbmZpZy5nZXRSZXNDb25maWcoKSxmYWxzZSApO1xyXG4gICAgICAgIFJlY0NvbmZpZ3MuaW5zdGFuY2UuaW5pdFJlYyggY29uZmlncmVzICk7XHJcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmluc3RhbmNlLmxvYWRHcm91cChcImxvYWRpbmdcIix0aGlzLHRoaXMub25QcmVMb2FkZWQsdGhpcy5vblByZXByb2dyZXNzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblByZXByb2dyZXNzKHZhbHVlOm51bWJlcik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25QcmVMb2FkZWQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgUmVzRGF0YU1hbmFnZXIuaW5zdGFuY2UuYWRkdWlQYWNrYWdlKCBcImxvYWRpbmdcIix0cnVlLGZhbHNlICk7XHJcbiAgICAgICAgdmFyIGdsb2JhbHdhaXR1cmw6c3RyaW5nID0gZmFpcnlndWkuVUlQYWNrYWdlLmdldEl0ZW1VUkwoXCJsb2FkaW5nXCIsXCJnbG9iYWxXYWl0aW5nXCIpO1xyXG4gICAgICAgIEJhc2VWaWV3LnZpZXdiZ1VybCA9IGZhaXJ5Z3VpLlVJUGFja2FnZS5nZXRJdGVtVVJMKFwibG9hZGluZ1wiLFwiaW1nX2JsYWNrXCIpO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihnbG9iYWx3YWl0dXJsLCBHbG9iYWxXYWl0aW5nKTtcclxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5nbG9iYWxNb2RhbFdhaXRpbmcgPSBnbG9iYWx3YWl0dXJsO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLndpbmRvd01vZGFsV2FpdGluZyA9IGdsb2JhbHdhaXR1cmw7XHJcbiAgICAgICAgLy8gQ1BBVXRpbHMuaW5pdCgpO1xyXG4gICAgICAgIHRoaXMuc3RhcnRMb2dpbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGFydExvZ2luKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIChNVkNPYmplY3RQb29sLmdldEluc3RhbmNlKCkuZ2V0UHJveHkoIExvZ2luUHJveHkgKSBhcyBMb2dpblByb3h5KS5zdGFydExvZ2luKCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgRGVidWdlciBmcm9tIFwiLi9mcmFtZXdvcmtzL0RlYnVnZXJcIjtcclxuXHJcbmV4cG9ydCBtb2R1bGUgR2xvYmFsIHtcclxuICAgIGV4cG9ydCB2YXIgc3RhZ2U6IExheWEuU3RhZ2U7XHJcbiAgICBleHBvcnQgdmFyIGh0dHB1cmwgPSBcIlwiO1xyXG4gICAgZXhwb3J0IHZhciByZXNvdXJjZWh0dHRwOnN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgZXhwb3J0IGNvbnN0IGNkbnVybDpzdHJpbmcgPSBcImh0dHBzOi8vd3hnYW1lLjUxeW95b3lvLmNvbS9cIjtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDotYTmupDlkI7nvIDniYjmnKzlj7dcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHZhciB2ZXJzaW9uczpzdHJpbmcgPSBcIlwiOy8vXCI/dj0xLjAuN1wiO1xyXG5cclxuICAgIGV4cG9ydCB2YXIgaW5pdFdpZHRoOm51bWJlciA9IDcyMDsgXHJcblxyXG4gICAgZXhwb3J0IHZhciBpbml0SGVpZ2h0Om51bWJlciA9IDEyODA7IFxyXG4gICAgLyoqXHJcbiAgICAgKiDotYTmupDniYjmnKzlj7dcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHZhciByZXNjb25maWdWZXJzaW9uOnN0cmluZyA9IFwiXCI7XHJcbiAgICAvKipcclxuICAgICAqIOW9k+WJjeW5s+WPsFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdmFyIG5vd3BsYXRmcm9tOnN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvZPliY3muLjmiI9hcHBpZFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdmFyIGFwcGlkOnN0cmluZyA9IFwid3g0NmY0NjI2OTMyZTVmNDhiXCI7IFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5ri45oiP54mI5pys5Y+3XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB2YXIgZ2FtZVZlcnNpb246c3RyaW5nID0gXCIxLjAuMFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm6LCD6K+V54mI5pysXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBjb25zdCBpc2RlYnVnOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBleHBvcnQgdmFyIEFwcEtleUlEOm51bWJlciA9IDA7XHJcbiAgICBleHBvcnQgdmFyIE1lbWJlcklEOm51bWJlciA9IDA7XHJcblxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXJIZWlnaHQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTGF5YS5zdGFnZS5oZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1cldpZHRoKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIExheWEuc3RhZ2Uud2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHNldFZhcnMoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgR2xvYmFsLnN0YWdlID0gTGF5YS5zdGFnZTtcclxuICAgICAgICBHbG9iYWwuc2V0aHR0cHVybCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRVcmwoIHVybDpzdHJpbmcgKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICBpZih1cmwuaW5kZXhPZihcInd4bG9jYWxcIik9PS0xKVxyXG4gICAgICAgIHsgXHJcbiAgICAgICAgICAgIHJldHVybiBHbG9iYWwucmVzb3VyY2VodHR0cCArIHVybCArIEdsb2JhbC52ZXJzaW9ucztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVybDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2V0aHR0cHVybCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggR2xvYmFsLmlzZGVidWcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLmh0dHB1cmwgPSBcImh0dHBzOi8vd3hnYW1lZGV2LjUxeW95b3lvLmNvbS9cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLmh0dHB1cmwgPSBcImh0dHBzOi8vbWlucG9ydC41MXlveW95by5jb20vXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdsb2JhbFdhaXRpbmcgZXh0ZW5kcyBmYWlyeWd1aS5HQ29tcG9uZW50XHJcbntcclxuICAgIGltZ18wOmZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgIHByaXZhdGUgX2lzZm9yY2VoaWRlOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0RnJvbVhNTCh4bWw6YW55KTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKGZhaXJ5Z3VpLkdSb290Lmluc3Qud2lkdGgsZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQpO1xyXG4gICAgICAgIHN1cGVyLmNvbnN0cnVjdEZyb21YTUwoeG1sKTtcclxuICAgICAgICB0aGlzLmltZ18wID0gdGhpcy5nZXRDaGlsZChcImltZ18wXCIpLmFzSW1hZ2U7XHJcbiAgICAgICAgdGhpcy5pbWdfMC52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vbihMYXlhLkV2ZW50LkRJU1BMQVksdGhpcyx0aGlzLm9uQWRkZWRUb1N0YWdlKTtcclxuICAgICAgICB0aGlzLm9uKCBMYXlhLkV2ZW50LlVORElTUExBWSx0aGlzLHRoaXMub25SZW1vdmVGcm9tU3RhZ2UpOyAgICAgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2xhc3RUaW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIG9uQWRkZWRUb1N0YWdlKCk6dm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbGFzdFRpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgTGF5YS50aW1lci5mcmFtZUxvb3AoMSwgdGhpcywgdGhpcy5vblRpbWVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uVGltZXIoKTp2b2lkIHtcclxuICAgICAgICBpZih0aGlzLmltZ18wKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIG5vd3RpbWU6bnVtYmVyID0gTGF5YS5Ccm93c2VyLm5vdygpO1xyXG4gICAgICAgICAgICB2YXIgZGlzdGltZTpudW1iZXIgPSBub3d0aW1lLXRoaXMuX2xhc3RUaW1lO1xyXG4gICAgICAgICAgICBpZiggZGlzdGltZSAvMTAwMCA+PSAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoICF0aGlzLl9pc2ZvcmNlaGlkZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWdfMC52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBpOm51bWJlciA9IHRoaXMuaW1nXzAucm90YXRpb247XHJcbiAgICAgICAgICAgICAgICBpICs9IDEwO1xyXG4gICAgICAgICAgICAgICAgaWYoaSA+IDM2MClcclxuICAgICAgICAgICAgICAgICAgICBpID0gaSAlIDM2MDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW1nXzAucm90YXRpb24gPSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbWdfMC52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhpZGVpbWcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNmb3JjZWhpZGUgPSB0cnVlO1xyXG4gICAgICAgIGlmKCB0aGlzLmltZ18wIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaW1nXzAudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJpdmF0ZSBvblJlbW92ZUZyb21TdGFnZSgpOnZvaWQge1xyXG4gICAgICAgIExheWEudGltZXIuY2xlYXIodGhpcywgdGhpcy5vblRpbWVyKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuL0dsb2JhbFwiO1xyXG5pbXBvcnQgU3RhZ2UgPSBMYXlhLlN0YWdlO1xyXG5pbXBvcnQgeyBQYXRoQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlncy9nYW1lQ29uZmlncy9QYXRoQ29uZmlnXCI7XHJcbmltcG9ydCB7IEdhbWVDb250ZW50cyB9IGZyb20gXCIuL0dhbWVDb250ZW50c1wiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvU2RrXCI7XHJcbmNsYXNzIE1haW4ge1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0Ly/moLnmja5JREXorr7nva7liJ3lp4vljJblvJXmk45cdFx0XHJcbiAgICAgICAgLy8gTGF5YS5pbml0KEdsb2JhbC5pbml0V2lkdGgsIEdsb2JhbC5pbml0SGVpZ2h0LCBMYXlhW1wiV2ViR0xcIl0pO1xyXG4gICAgICAgIExheWEzRC5pbml0KEdsb2JhbC5pbml0V2lkdGgsIEdsb2JhbC5pbml0SGVpZ2h0KTtcclxuXHRcdExheWEuc3RhZ2Uuc2NhbGVNb2RlID0gU3RhZ2UuU0NBTEVfRklYRURfV0lEVEg7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hbGlnbkggPSBTdGFnZS5BTElHTl9DRU5URVI7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hbGlnblYgPSBTdGFnZS5BTElHTl9UT1A7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5zY3JlZW5Nb2RlID0gU3RhZ2UuU0NSRUVOX1ZFUlRJQ0FMO1xyXG5cdFx0TGF5YS5zdGFnZS5iZ0NvbG9yID0gXCIjNTRCOUY2XCI7XHJcbiAgICAgICAgLy8gTGF5YS5TdGF0LnNob3coKTtcclxuICAgICAgICBMYXlhLmFsZXJ0R2xvYmFsRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIHdpbmRvd1snQ29uZmlnM0QnXSAmJiAod2luZG93WydDb25maWczRCddW1wiX2RlZmF1bHRcIl1bXCJfZGVmYXVsdFBoeXNpY3NNZW1vcnlcIl0gPSAxMjgpO1xyXG4gICAgICAgIGlmKExheWEuQnJvd3Nlci5vbldlaVhpbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFd4QXBpLld4SW5pdCgpO1xyXG4gICAgICAgICAgICBXeEFwaS5DaGVja1dYVXBkYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuc3RhZ2Uub24oXCJyZXNpemVcIiwgdGhpcywgdGhpcy5vblJlc2l6ZSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIG9uUmVzaXplKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEuc3RhZ2Uub2ZmKFwicmVzaXplXCIsIHRoaXMsIHRoaXMub25SZXNpemUpO1xyXG4gICAgICAgIEdsb2JhbC5zZXRWYXJzKCk7IFxyXG4gICAgICAgIFBhdGhDb25maWcuaW5pdCgpOyAgXHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcucGFja2FnZUZpbGVFeHRlbnNpb24gPSBcImJpblwiO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLnRleHR1cmVMaW5lYXJTYW1wbGluZyA9IHRydWU7XHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcuZGVmYXVsdEZvbnQgPSBcIum7keS9k1wiO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLnZlcnNpb25zPUdsb2JhbC52ZXJzaW9ucztcclxuICAgICAgICB2YXIgZ2FtZUNvbnRlbnQ6R2FtZUNvbnRlbnRzID0gbmV3IEdhbWVDb250ZW50cygpO1xyXG4gICAgICAgIGdhbWVDb250ZW50LmluaXRHYW1lKCk7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcbn1cclxuLy/mv4DmtLvlkK/liqjnsbtcclxubmV3IE1haW4oKTtcclxuIiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8v5bel5YW355Sf5oiQ77yM6K+35Yu/5L+u5pS544CCXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mmJ1aWxkLnhsc3jjgIJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdWlsZENGR1xue1xuXHRwdWJsaWMgbmFtZTpzdHJpbmc7Ly/lu7rnrZHlkI1cblx0cHVibGljIGJ1ZmZ4Om51bWJlcjsvL2J1ZmZ4XG5cdHB1YmxpYyBidWZmeTpudW1iZXI7Ly9idWZmeVxuXHRwdWJsaWMgYnVmZno6bnVtYmVyOy8vYnVmZnpcblx0cHVibGljIHRpbWU6bnVtYmVyOy8v5oyB57ut5pe26Ze0KOenkilcblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xuXHRwdWJsaWMgc3RhdGljIHZlYzpBcnJheTxCdWlsZENGRz4gPSBbXTtcblx0cHVibGljIHN0YXRpYyBpbml0Q2ZnKHN0cjpzdHJpbmcpOnZvaWRcblx0e1xuXHRcdHZhciBpOm51bWJlcj0wO1xuXHRcdHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdChcIlxcblwiKTtcblx0XHR2YXIgaTpudW1iZXI9MDtcblx0XHRmb3IoaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0dmFyIHNpbmdsZVN0cjpzdHJpbmcgPSBhcnJbaV07XG5cdFx0XHR2YXIgc2luZ2xlQXJyOkFycmF5PHN0cmluZz4gPSBzaW5nbGVTdHIuc3BsaXQoXCImXCIpO1xuXHRcdFx0aWYoQnVpbGRDRkcuZGljdFtzaW5nbGVBcnJbMF1dKWNvbnRpbnVlO1xuXHRcdFx0dmFyIGl0ZW06QnVpbGRDRkc9IG5ldyBCdWlsZENGRygpO1xuXHRcdFx0aXRlbS5uYW1lPXNpbmdsZUFyclswXTtcblx0XHRcdGl0ZW0uYnVmZng9IE51bWJlcihzaW5nbGVBcnJbMV0pO1xuXHRcdFx0aXRlbS5idWZmeT0gTnVtYmVyKHNpbmdsZUFyclsyXSk7XG5cdFx0XHRpdGVtLmJ1ZmZ6PSBOdW1iZXIoc2luZ2xlQXJyWzNdKTtcblx0XHRcdGl0ZW0udGltZT0gTnVtYmVyKHNpbmdsZUFycls0XSk7XG5cdFx0XHRCdWlsZENGRy5kaWN0W2l0ZW0ubmFtZV09aXRlbTtcblx0XHRcdEJ1aWxkQ0ZHLnZlYy5wdXNoKGl0ZW0pO1xuXHRcdH1cblx0fVxuXG59IiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8v5bel5YW355Sf5oiQ77yM6K+35Yu/5L+u5pS544CCXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mmdhbWUueGxzeOOAglxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVDRkdcbntcblx0cHVibGljIGlkOm51bWJlcjsvL2lkXG5cdHB1YmxpYyB2YWx1ZTpzdHJpbmc7Ly/lrZfmrrXlgLxcblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xuXHRwdWJsaWMgc3RhdGljIHZlYzpBcnJheTxHYW1lQ0ZHPiA9IFtdO1xuXHRwdWJsaWMgc3RhdGljIGluaXRDZmcoc3RyOnN0cmluZyk6dm9pZFxuXHR7XG5cdFx0dmFyIGk6bnVtYmVyPTA7XG5cdFx0dmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiXFxuXCIpO1xuXHRcdHZhciBpOm51bWJlcj0wO1xuXHRcdGZvcihpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHR2YXIgc2luZ2xlU3RyOnN0cmluZyA9IGFycltpXTtcblx0XHRcdHZhciBzaW5nbGVBcnI6QXJyYXk8c3RyaW5nPiA9IHNpbmdsZVN0ci5zcGxpdChcIiZcIik7XG5cdFx0XHRpZihHYW1lQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcblx0XHRcdHZhciBpdGVtOkdhbWVDRkc9IG5ldyBHYW1lQ0ZHKCk7XG5cdFx0XHRpdGVtLmlkPSBOdW1iZXIoc2luZ2xlQXJyWzBdKTtcblx0XHRcdGl0ZW0udmFsdWU9c2luZ2xlQXJyWzFdO1xuXHRcdFx0R2FtZUNGRy5kaWN0W2l0ZW0uaWRdPWl0ZW07XG5cdFx0XHRHYW1lQ0ZHLnZlYy5wdXNoKGl0ZW0pO1xuXHRcdH1cblx0fVxuXG59IiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8v5bel5YW355Sf5oiQ77yM6K+35Yu/5L+u5pS544CCXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mmxldmVsLnhsc3jjgIJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMZXZlbENGR1xue1xuXHRwdWJsaWMgaWQ6bnVtYmVyOy8v5YWz5Y2hXG5cdHB1YmxpYyByb2FkOnN0cmluZzsvL+WFs+WNoeaooeWei1xuXHRwdWJsaWMgcm9sZWluaXRwb3M6YW55Oy8v546p5a626KeS6Imy5Yid5aeL56uZ5L2NXG5cdHB1YmxpYyBucGM6YW55Oy8vbnBjXG5cdHB1YmxpYyBmaXJzdFNjZW5lcG9zOnN0cmluZzsvL+WIneWni+esrOS4gOS4quWcuuaZr+aooeWei+eahOS9jee9rlxuXHRwdWJsaWMgd2luR29sZDpudW1iZXI7Ly/pgJrlhbPmiJDlip/ojrflvpfph5HluIFcblx0cHVibGljIGZhaWxHb2Q6c3RyaW5nOy8v6YCa5YWz5aSx6LSl6I635b6X6YeR5biBXG5cdHB1YmxpYyBzdGF0aWMgZGljdDphbnkgPSB7fTtcblx0cHVibGljIHN0YXRpYyB2ZWM6QXJyYXk8TGV2ZWxDRkc+ID0gW107XG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXG5cdHtcblx0XHR2YXIgaTpudW1iZXI9MDtcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XG5cdFx0dmFyIGk6bnVtYmVyPTA7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcblx0XHRcdGlmKExldmVsQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcblx0XHRcdHZhciBpdGVtOkxldmVsQ0ZHPSBuZXcgTGV2ZWxDRkcoKTtcblx0XHRcdGl0ZW0uaWQ9IE51bWJlcihzaW5nbGVBcnJbMF0pO1xuXHRcdFx0aXRlbS5yb2FkPXNpbmdsZUFyclsxXTtcblx0XHRcdGl0ZW0ucm9sZWluaXRwb3M9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzJdKTtcblx0XHRcdGl0ZW0ubnBjPSBKU09OLnBhcnNlKHNpbmdsZUFyclszXSk7XG5cdFx0XHRpdGVtLmZpcnN0U2NlbmVwb3M9c2luZ2xlQXJyWzRdO1xuXHRcdFx0aXRlbS53aW5Hb2xkPSBOdW1iZXIoc2luZ2xlQXJyWzVdKTtcblx0XHRcdGl0ZW0uZmFpbEdvZD1zaW5nbGVBcnJbNl07XG5cdFx0XHRMZXZlbENGRy5kaWN0W2l0ZW0uaWRdPWl0ZW07XG5cdFx0XHRMZXZlbENGRy52ZWMucHVzaChpdGVtKTtcblx0XHR9XG5cdH1cblxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxuLy/phY3nva7mlofku7blkI3np7DvvJpucGMueGxzeOOAglxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5wY0NGR1xue1xuXHRwdWJsaWMgaWQ6bnVtYmVyOy8v6KeS6ImyaWRcblx0cHVibGljIG5hbWU6c3RyaW5nOy8v6KeS6Imy6LWE5rqQ5ZCNXG5cdHB1YmxpYyBzcGVlZDpudW1iZXI7Ly/op5LoibLliY3ov5vnp7vliqjpgJ/luqYo57GzL+enkilcblx0cHVibGljIGZyb250anVtcDphbnk7Ly/liY3ot7PliqDpgJ/luqZcblx0cHVibGljIGxlZnRqdW1wOmFueTsvL+W3pui3s+WKoOmAn+W6plxuXHRwdWJsaWMgcmlnaHRqdW1wOmFueTsvL+WPs+i3s+WKoOmAn+W6plxuXHRwdWJsaWMgdXBjbGltYjpudW1iZXI7Ly/niKzljYfpgJ/luqZcblx0cHVibGljIHNsaWRlY2xpbWI6YW55Oy8v5pac552A54is5qW86YCf5bqmXG5cdHB1YmxpYyBqdW1wX2xlZnQ6bnVtYmVyOy8v5ZCR5bem6Lez6LeD5p2D6YeNXG5cdHB1YmxpYyBqdW1wX3JpZ2h0Om51bWJlcjsvL+WQkeWPs+i3s+adg+mHjVxuXHRwdWJsaWMgc3RhcnRfYWhlYWQ6bnVtYmVyOy8v55u06Lez5p2D6YeNXG5cdHB1YmxpYyBkaXN0YW5jZTpudW1iZXI7Ly9ucGPotoXov4fnjqnlrrbot53nprvlgZzmraJcblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xuXHRwdWJsaWMgc3RhdGljIHZlYzpBcnJheTxOcGNDRkc+ID0gW107XG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXG5cdHtcblx0XHR2YXIgaTpudW1iZXI9MDtcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XG5cdFx0dmFyIGk6bnVtYmVyPTA7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcblx0XHRcdGlmKE5wY0NGRy5kaWN0W3NpbmdsZUFyclswXV0pY29udGludWU7XG5cdFx0XHR2YXIgaXRlbTpOcGNDRkc9IG5ldyBOcGNDRkcoKTtcblx0XHRcdGl0ZW0uaWQ9IE51bWJlcihzaW5nbGVBcnJbMF0pO1xuXHRcdFx0aXRlbS5uYW1lPXNpbmdsZUFyclsxXTtcblx0XHRcdGl0ZW0uc3BlZWQ9IE51bWJlcihzaW5nbGVBcnJbMl0pO1xuXHRcdFx0aXRlbS5mcm9udGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzNdKTtcblx0XHRcdGl0ZW0ubGVmdGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzRdKTtcblx0XHRcdGl0ZW0ucmlnaHRqdW1wPSBKU09OLnBhcnNlKHNpbmdsZUFycls1XSk7XG5cdFx0XHRpdGVtLnVwY2xpbWI9IE51bWJlcihzaW5nbGVBcnJbNl0pO1xuXHRcdFx0aXRlbS5zbGlkZWNsaW1iPSBKU09OLnBhcnNlKHNpbmdsZUFycls3XSk7XG5cdFx0XHRpdGVtLmp1bXBfbGVmdD0gTnVtYmVyKHNpbmdsZUFycls4XSk7XG5cdFx0XHRpdGVtLmp1bXBfcmlnaHQ9IE51bWJlcihzaW5nbGVBcnJbOV0pO1xuXHRcdFx0aXRlbS5zdGFydF9haGVhZD0gTnVtYmVyKHNpbmdsZUFyclsxMF0pO1xuXHRcdFx0aXRlbS5kaXN0YW5jZT0gTnVtYmVyKHNpbmdsZUFyclsxMV0pO1xuXHRcdFx0TnBjQ0ZHLmRpY3RbaXRlbS5pZF09aXRlbTtcblx0XHRcdE5wY0NGRy52ZWMucHVzaChpdGVtKTtcblx0XHR9XG5cdH1cblxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxuLy/phY3nva7mlofku7blkI3np7DvvJpyb2xlLnhsc3jjgIJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb2xlQ0ZHXG57XG5cdHB1YmxpYyBpZDpudW1iZXI7Ly/op5LoibJpZFxuXHRwdWJsaWMgbmFtZTpzdHJpbmc7Ly/op5LoibLotYTmupDlkI1cblx0cHVibGljIHNwZWVkOm51bWJlcjsvL+inkuiJsuWJjei/m+enu+WKqOmAn+W6pijnsbMv56eSKVxuXHRwdWJsaWMgZnJvbnRqdW1wOmFueTsvL+WJjei3s+WKoOmAn+W6plxuXHRwdWJsaWMgbGVmdGp1bXA6YW55Oy8v5bem6Lez5Yqg6YCf5bqmXG5cdHB1YmxpYyByaWdodGp1bXA6YW55Oy8v5Y+z6Lez5Yqg6YCf5bqmXG5cdHB1YmxpYyB1cGNsaW1iOm51bWJlcjsvL+eIrOWNh+mAn+W6plxuXHRwdWJsaWMgc2xpZGVjbGltYjphbnk7Ly/mlpznnYDniKzmpbzpgJ/luqZcblx0cHVibGljIGdldFN0YXRlOm51bWJlcjsvL+iOt+WPluinkuiJsuaWueW8j1xuXHRwdWJsaWMgbmVlZDpudW1iZXI7Ly/ojrflj5bop5LoibLoirHotLlcblx0cHVibGljIGljb246c3RyaW5nOy8v5Zu+5qCHaWNvblxuXHRwdWJsaWMgc3RhdGljIGRpY3Q6YW55ID0ge307XG5cdHB1YmxpYyBzdGF0aWMgdmVjOkFycmF5PFJvbGVDRkc+ID0gW107XG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXG5cdHtcblx0XHR2YXIgaTpudW1iZXI9MDtcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XG5cdFx0dmFyIGk6bnVtYmVyPTA7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcblx0XHRcdGlmKFJvbGVDRkcuZGljdFtzaW5nbGVBcnJbMF1dKWNvbnRpbnVlO1xuXHRcdFx0dmFyIGl0ZW06Um9sZUNGRz0gbmV3IFJvbGVDRkcoKTtcblx0XHRcdGl0ZW0uaWQ9IE51bWJlcihzaW5nbGVBcnJbMF0pO1xuXHRcdFx0aXRlbS5uYW1lPXNpbmdsZUFyclsxXTtcblx0XHRcdGl0ZW0uc3BlZWQ9IE51bWJlcihzaW5nbGVBcnJbMl0pO1xuXHRcdFx0aXRlbS5mcm9udGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzNdKTtcblx0XHRcdGl0ZW0ubGVmdGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzRdKTtcblx0XHRcdGl0ZW0ucmlnaHRqdW1wPSBKU09OLnBhcnNlKHNpbmdsZUFycls1XSk7XG5cdFx0XHRpdGVtLnVwY2xpbWI9IE51bWJlcihzaW5nbGVBcnJbNl0pO1xuXHRcdFx0aXRlbS5zbGlkZWNsaW1iPSBKU09OLnBhcnNlKHNpbmdsZUFycls3XSk7XG5cdFx0XHRpdGVtLmdldFN0YXRlPSBOdW1iZXIoc2luZ2xlQXJyWzhdKTtcblx0XHRcdGl0ZW0ubmVlZD0gTnVtYmVyKHNpbmdsZUFycls5XSk7XG5cdFx0XHRpdGVtLmljb249c2luZ2xlQXJyWzEwXTtcblx0XHRcdFJvbGVDRkcuZGljdFtpdGVtLmlkXT1pdGVtO1xuXHRcdFx0Um9sZUNGRy52ZWMucHVzaChpdGVtKTtcblx0XHR9XG5cdH1cblxufSIsImltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi8uLi9HbG9iYWxcIjtcclxuaW1wb3J0IFJlY0NvbmZpZ3MgZnJvbSBcIi4vUmVjQ29uZmlnc1wiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgbW9kdWxlIFBhdGhDb25maWdcclxue1xyXG4gICAgZXhwb3J0IHZhciByZXM6IHN0cmluZyA9IFwicmVzL1wiO1xyXG4gICAgZXhwb3J0IHZhciB3eGxvY2FsOnN0cmluZyA9IFwid3hsb2NhbC9cIjtcclxuICAgIGV4cG9ydCB2YXIgY29uZmlnczpzdHJpbmcgPSBcImNvbmZpZ3MvXCI7XHJcbiAgICBleHBvcnQgdmFyIHVpOnN0cmluZyA9IFwidWkvXCI7XHJcbiAgICBleHBvcnQgdmFyIHNvdW5kczpzdHJpbmcgPSBcInNvdW5kL1wiO1xyXG4gICAgZXhwb3J0IHZhciB2ZXJzaW9ucmFuZG9tOnN0cmluZyA9IFwiXCI7XHJcbiAgICBleHBvcnQgdmFyIGljb246c3RyaW5nID0gXCJpY29uL1wiO1xyXG4gICAgZXhwb3J0IHZhciBzY2VuZTpzdHJpbmcgPSBcInNjZW5lcy9cIlxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFBhdGhDb25maWcudmVyc2lvbnJhbmRvbSA9IFwiP3Y9XCIgKyBNYXRoLnJhbmRvbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRzb3VuZCggaWQ6c3RyaW5nICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIFBhdGhDb25maWcud3hsb2NhbCArIFBhdGhDb25maWcuc291bmRzICsgaWQgK1wiLm1wM1wiICk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFJlc0NvbmZpZygpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBQYXRoQ29uZmlnLnd4bG9jYWwgKyBQYXRoQ29uZmlnLmNvbmZpZ3MgK1wicmVzQ29uZmlnLmpzb25cIiApO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWcoIGNvbmZpZ25hbWU6c3RyaW5nICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIFBhdGhDb25maWcud3hsb2NhbCArIFBhdGhDb25maWcuY29uZmlncyArIGNvbmZpZ25hbWUgK1wiLmJpblwiICk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldDNEc2NlbmUoIG5hbWU6YW55ICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIFBhdGhDb25maWcucmVzICsgUGF0aENvbmZpZy5zY2VuZSArIFwiQ29udmVudGlvbmFsL1wiICsgbmFtZSArIFwiLmxzXCIgKTtcclxuICAgIH0gXHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldDNETW9kZWwoIG5hbWU6YW55ICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIFBhdGhDb25maWcucmVzICsgUGF0aENvbmZpZy5zY2VuZSArIFwiQ29udmVudGlvbmFsL1wiICsgbmFtZSArIFwiLmxoXCIgKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0M0RSb2xlTW9kZWwoIG5hbWU6YW55ICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIFBhdGhDb25maWcucmVzICsgXCJyb2xlL0NvbnZlbnRpb25hbC9cIiArIG5hbWUgKyBcIi5saFwiICk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldHJvbGVpY29uKCBpZDpzdHJpbmcgKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggUGF0aENvbmZpZy5yZXMgKyBQYXRoQ29uZmlnLmljb24gKyBcInJvbGVpY29uL1wiICsgaWQgKyBcIi5wbmdcIiApO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRWZXJpc29udXJsKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIEdsb2JhbC5pc2RlYnVnIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBQYXRoQ29uZmlnLnJlcyArIFwidmVyc2lvbi5qc29uXCIgKSArIFBhdGhDb25maWcudmVyc2lvbnJhbmRvbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIFBhdGhDb25maWcucmVzICsgXCJ2ZXJzaW9uXCIgKyBHbG9iYWwucmVzY29uZmlnVmVyc2lvbiArIFwiLmpzb25cIiApO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRHYW1lVmVyc2lvbigpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBcImdhbWV2ZXJzaW9uLmpzb25cIiApO1xyXG4gICAgfVxyXG5cclxuICBcclxufSAiLCJpbXBvcnQgeyBQYXRoQ29uZmlnIH0gZnJvbSBcIi4vUGF0aENvbmZpZ1wiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vLi4vR2xvYmFsXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlY0NvbmZpZ3MgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlOlJlY0NvbmZpZ3M7XHJcblxyXG4gICAgcHVibGljIGdyb3VwZGljdDphbnk7XHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuW3sue7j+WIneWni+WMllxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzaGFzaW5pdDpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOlJlY0NvbmZpZ3NcclxuICAgIHtcclxuICAgICAgICBpZiggbnVsbCA9PSB0aGlzLmluc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgUmVjQ29uZmlncygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcclxuICAgIH1cclxuICAgIGNvbnN0cnVjdG9yKClcclxuICAgIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZ3JvdXBkaWN0ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRSZWMoIGRpY3Q6YW55ICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgaWYoIGRpY3QgIT0gbnVsbCAmJiAhUmVjQ29uZmlncy5pc2hhc2luaXQgKVxyXG4gICAgICAge1xyXG4gICAgICAgICAgICBSZWNDb25maWdzLmlzaGFzaW5pdCA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhciBncm91cHNBcnI6QXJyYXk8YW55PiA9IGRpY3QuZ3JvdXBzO1xyXG4gICAgICAgICAgICB2YXIgcmVzb3VyY2VzQXJyOkFycmF5PGFueT4gPSBkaWN0LnJlc291cmNlcztcclxuICAgICAgICAgICAgdmFyIHJlc291cmNlc0RpY3Q6YW55ID0ge307XHJcbiAgICAgICAgICAgIGZvciggdmFyIGl0ZW0gaW4gcmVzb3VyY2VzQXJyIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkOmFueSA9IHJlc291cmNlc0FycltpdGVtXTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCggY2hpbGQudHlwZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImJpblwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50eXBlID0gTGF5YS5Mb2FkZXIuQlVGRkVSO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50eXBlID0gTGF5YS5TY2VuZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGhcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHlwZSA9IExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxtXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnR5cGUgPSBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc291cmNlc0RpY3RbY2hpbGQubmFtZV0gPSBjaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IoIHZhciBncm91cHR5cGUgaW4gZ3JvdXBzQXJyIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGdyb3VwY2hpbGQ6YW55ID0gZ3JvdXBzQXJyW2dyb3VwdHlwZV07XHJcbiAgICAgICAgICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBncm91cGNoaWxkLmtleXMuc3BsaXQoIFwiLFwiICk7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNoaWRzdHI7XHJcbiAgICAgICAgICAgICAgICBmb3IoIGNoaWRzdHIgaW4gYXJyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyQ2hpbGQ6c3RyaW5nID0gYXJyW2NoaWRzdHJdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCBzdHJDaGlsZCAhPSBcIlwiIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmxzOnN0cmluZyA9IHJlc291cmNlc0RpY3Rbc3RyQ2hpbGRdLnVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJscyA9IHVybHMucmVwbGFjZShcInJlcy9cIixQYXRoQ29uZmlnLnJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQXJyLnB1c2goIHsgdXJsOkdsb2JhbC5nZXRVcmwodXJscyksIHR5cGU6cmVzb3VyY2VzRGljdFtzdHJDaGlsZF0udHlwZSB9ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cGRpY3RbZ3JvdXBjaGlsZC5uYW1lXSA9IGNoaWxkQXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIExheWEubG9hZGVyLmNsZWFyUmVzKFBhdGhDb25maWcuZ2V0UmVzQ29uZmlnKCkpO1xyXG4gICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZWJ1Z2VyIHtcclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5omT5Y2wXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNwcmludDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBsb2cobXNnOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIC8vIGlmIChEZWJ1Z2VyLmlzcHJpbnQmJiBHbG9iYWwuaXNkZWJ1ZyApIHtcclxuICAgICAgICAvLyAgICAgaWYob3B0aW9uYWxQYXJhbXMmJm9wdGlvbmFsUGFyYW1zLmxlbmd0aD4wKXtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKG1zZyxvcHRpb25hbFBhcmFtcyk7XHJcbiAgICAgICAgLy8gICAgIH1lbHNle1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc29sZS5sb2cobXNnKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBpZiAoRGVidWdlci5pc3ByaW50KSB7XHJcbiAgICAgICAgICAgIGlmKG9wdGlvbmFsUGFyYW1zJiZvcHRpb25hbFBhcmFtcy5sZW5ndGg+MCl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhtc2csb3B0aW9uYWxQYXJhbXMpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBlcnJvcihtc2c6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKERlYnVnZXIuaXNwcmludCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKG1zZywgb3B0aW9uYWxQYXJhbXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5pbXBvcnQgU29ja2V0Tm9maWZ5IGZyb20gXCIuL25vdGlmaWNhdGlvbi9Tb2NrZXROb2ZpZnlcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXJTZXJ2aWNlIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZTpUaW1lclNlcnZpY2U7XHJcbiAgICBwcml2YXRlIF90aW1lU2NhbGU6bnVtYmVyID0gMTtcclxuXHJcbiAgICBwcml2YXRlIF91bnNjYWxhYmxlTGlzdDpBcnJheTxJVGltZXI+ID0gW107XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbmFzdGFuY2UoKTpUaW1lclNlcnZpY2VcclxuICAgIHtcclxuICAgICAgICBpZiggbnVsbCA9PSB0aGlzLmluc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgVGltZXJTZXJ2aWNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEudGltZXIuZnJhbWVMb29wKCAxLCB0aGlzLCB0aGlzLm9uVGltZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdG9wKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsIHRoaXMub25UaW1lciApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWNvdmVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICAgIExheWEudGltZXIuZnJhbWVMb29wKCAxLCB0aGlzLCB0aGlzLm9uVGltZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uVGltZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcclxuICAgICAgICBmb3IoaT0wOyBpPHRoaXMuX3Vuc2NhbGFibGVMaXN0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdW5zY2FsYWJsZUxpc3RbaV0udXBkYXRlKExheWEudGltZXIuZGVsdGEgKiB0aGlzLl90aW1lU2NhbGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFzVXBkYXRhVGFyZ2V0KCB1cGRhdGVUYXJnZXQ6SVRpbWVyICk6Qm9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleDpudW1iZXI7XHJcbiAgICAgICAgaW5kZXggPSB0aGlzLl91bnNjYWxhYmxlTGlzdC5pbmRleE9mKHVwZGF0ZVRhcmdldCk7XHJcbiAgICAgICAgaWYoIGluZGV4ICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFVwZGF0ZVRhcmdldCh1cGRhdGVUYXJnZXQ6SVRpbWVyKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGluZGV4Om51bWJlcjtcclxuICAgICAgICBpbmRleCA9IHRoaXMuX3Vuc2NhbGFibGVMaXN0LmluZGV4T2YodXBkYXRlVGFyZ2V0KTtcclxuICAgICAgICBpZihpbmRleD09LTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl91bnNjYWxhYmxlTGlzdC5wdXNoKHVwZGF0ZVRhcmdldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVVcGRhdGVUYXJnZXQodXBkYXRlVGFyZ2V0OklUaW1lcik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleDpudW1iZXIgPSB0aGlzLl91bnNjYWxhYmxlTGlzdC5pbmRleE9mKHVwZGF0ZVRhcmdldCk7XHJcbiAgICAgICAgaWYoaW5kZXghPS0xKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdW5zY2FsYWJsZUxpc3Quc3BsaWNlKGluZGV4LDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRpbWVTY2FsZSgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lU2NhbGU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgdGltZVNjYWxlKHZhbHVlOm51bWJlcilcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPCAwIHx8IGlzTmFOKHZhbHVlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fdGltZVNjYWxlID0gdmFsdWU7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgVXNlckNhY2hlVHlwZSBmcm9tIFwiLi4vZ2FtZW1vZHVsZS91c2VyaW5mby9ldmVudHMvVXNlckNhY2hlVHlwZVwiO1xyXG5pbXBvcnQgQ2FjaGVNYW5hZ2VyIGZyb20gXCIuLi9tYW5hZ2Vycy9DYWNoZU1hbmFnZXJcIjtcclxuaW1wb3J0IFRvbmdqaUh0dHBzIGZyb20gXCIuL25ldC9Ub25namlIdHRwc1wiO1xyXG5pbXBvcnQgUGxhdGZvcm1Ub29sIGZyb20gXCIuLi9wbGF0Zm9ybS9QbGF0Zm9ybVRvb2xcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaW1lc1RhbXBlciBpbXBsZW1lbnRzIElUaW1lclxyXG57XHJcblx0cHVibGljIGxhc3RnYW1lVGltZTpudW1iZXIgPSAwO1xyXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcigpIFxyXG5cdHtcclxuXHJcblx0fVxyXG5cclxuXHRzdGF0aWMgaW5zdGFuY2U6IFRpbWVzVGFtcGVyO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IFRpbWVzVGFtcGVyIHtcclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBUaW1lc1RhbXBlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcblx0cHVibGljIGluaXQoICk6dm9pZFxyXG5cdHtcclxuXHRcdHRoaXMubGFzdGdhbWVUaW1lID0gQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0bnVtKCBVc2VyQ2FjaGVUeXBlLmxhc3R0aW1lICk7XHJcblx0XHRMYXlhLnRpbWVyLmZyYW1lTG9vcCgxLCB0aGlzLCB0aGlzLnVwZGF0ZSApO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICog5ZCM5q2l5pyN5Yqh5Zmo5pe26Ze0KOenkilcclxuXHQgKi9cclxuXHRwcml2YXRlIF9zZXJ2ZXJUaW1lOiBudW1iZXIgPSAwO1xyXG5cclxuXHRwcml2YXRlIGlzY2FuOmJvb2xlYW4gPSBmYWxzZTtcclxuXHRwcml2YXRlIF9vbmxpbmVkaXN0aW1lOm51bWJlciA9IDA7XHJcblx0XHJcblx0cHVibGljIHVwZGF0ZVNlcnZpY2VUaW1lKHNlcnZlclRpbWU6IG51bWJlcik6IHZvaWQge1xyXG5cdFx0dGhpcy5fc2VydmVyVGltZSA9IE51bWJlcihzZXJ2ZXJUaW1lKTtcclxuXHRcdHRoaXMuaXNjYW4gPSB0cnVlO1xyXG5cdFx0dGhpcy5fb25saW5lZGlzdGltZSA9IHRoaXMuX3NlcnZlclRpbWU7XHJcblx0XHRDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRzdHIoIFVzZXJDYWNoZVR5cGUubGFzdHRpbWUsdGhpcy5fc2VydmVyVGltZS50b1N0cmluZygpICk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIF90aW1lOm51bWJlciA9IDA7XHJcblx0cHJpdmF0ZSBfb25saW5ldGltZTpudW1iZXIgPSAwO1xyXG5cdHB1YmxpYyB1cGRhdGUoKTogdm9pZCBcclxuXHR7XHJcblx0XHRpZiggdGhpcy5pc2NhbiApXHJcblx0XHR7XHJcblx0XHRcdHRoaXMuX3RpbWUgKz0gTGF5YS50aW1lci5kZWx0YTtcclxuXHRcdFx0dGhpcy5fb25saW5ldGltZSArPSBMYXlhLnRpbWVyLmRlbHRhO1xyXG5cdFx0XHR0aGlzLl9zZXJ2ZXJUaW1lICs9IExheWEudGltZXIuZGVsdGEgLyAxMDAwO1xyXG5cdFx0XHRpZiggdGhpcy5fdGltZSA+PSAzMDAwMCApXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0aGlzLl90aW1lID0gMDtcclxuXHRcdFx0XHRDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRzdHIoIFVzZXJDYWNoZVR5cGUubGFzdHRpbWUsdGhpcy5fc2VydmVyVGltZS50b1N0cmluZygpICk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoIHRoaXMuX29ubGluZXRpbWUgPj0gOTAwMDAgKVxyXG5cdFx0XHR7XHJcblx0XHRcdFx0dGhpcy5fb25saW5ldGltZSA9IDA7XHJcblx0XHRcdFx0dGhpcy5zZW5kb25saW5lVG9uZ2ppKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBzZW5kb25saW5lVG9uZ2ppKCk6dm9pZFxyXG5cdHtcclxuXHRcdHZhciBkaXN0aW1lOm51bWJlciA9IHRoaXMuc2VydmVyVGltZSAtIHRoaXMuX29ubGluZWRpc3RpbWU7XHJcblx0XHRpZiggZGlzdGltZSA+IDAgKVxyXG5cdFx0e1xyXG5cdFx0XHR0aGlzLl9vbmxpbmVkaXN0aW1lID0gdGhpcy5zZXJ2ZXJUaW1lO1xyXG5cdFx0XHRUb25namlIdHRwcy5nZXRJbnN0YW5jZSgpLnRvbmdqaURhdGEoIFwiT25saW5lXCIsXCJcIixkaXN0aW1lICk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiDmnI3liqHlmajml7bpl7QgKCDnp5IgKSBcclxuXHQgKiBAcmV0dXJuIFxyXG5cdCAqIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXQgc2VydmVyVGltZSgpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3NlcnZlclRpbWU7XHJcblx0fVxyXG5cclxufSIsImltcG9ydCBPYmplY3RQb29sIGZyb20gXCIuLi9tdmMvT2JqZWN0UG9vbFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29tRXZlbnRWT1xyXG57XHJcbiAgICBzdGF0aWMgcG9vbGtleTpzdHJpbmcgPSBcIkNvbUV2ZW50Vk9cIjtcclxuXHJcbiAgICB0YXJnZXQ6YW55O1xyXG4gICAgdHlwZTpzdHJpbmc7XHJcbiAgICB0aGlzT2JqZWN0OmFueTtcclxuICAgIGxpc3RlbmVyOkZ1bmN0aW9uO1xyXG5cclxuICAgIHB1YmxpYyBjbGVhcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy50eXBlPW51bGw7XHJcbiAgICAgICAgdGhpcy50aGlzT2JqZWN0PW51bGw7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcj1udWxsO1xyXG4gICAgICAgIE9iamVjdFBvb2wuY2xlYXJPYmooIENvbUV2ZW50Vk8ucG9vbGtleSx0aGlzICk7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IExFdmVudCBmcm9tIFwiLi9MRXZlbnRcIjtcclxuaW1wb3J0IExMaXN0ZW5lciBmcm9tIFwiLi9MTGlzdGVuZXJcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IG1vZHVsZSBFdmVudFV0aWxzXHJcbntcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExMaXN0ZW5lci5nZXRJbnN0YW5jZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5paw5bu65LqL5Lu2XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gRXZlbnQodHlwZTogc3RyaW5nLCBvYmo6IE9iamVjdCA9IG51bGwsIGJ1YmJsZXM6IGJvb2xlYW4gPSBmYWxzZSwgY2FuY2VsYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogTGF5YS5FdmVudCB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBMRXZlbnQodHlwZSwgb2JqLCBidWJibGVzLCBjYW5jZWxhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICAvL+a0vuWPkeS6i+S7tlxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQodHlwZTogc3RyaW5nLCBvYmo6IE9iamVjdCA9IG51bGwsIGJ1YmJsZXM6IGJvb2xlYW4gPSBmYWxzZSwgY2FuY2VsYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgTExpc3RlbmVyLl9pbnN0YW5jZS5kaXNwYXRjaEV2ZW50KHR5cGUsIG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgLy/nm5HlkKzkuovku7ZcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sIHVzZUNhcHR1cmU6IGJvb2xlYW4gPSBmYWxzZSwgcHJpb3JpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcclxuICAgICAgICBMTGlzdGVuZXIuX2luc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXNPYmplY3QsIHVzZUNhcHR1cmUsIHByaW9yaXR5KTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaGFzRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gTExpc3RlbmVyLl9pbnN0YW5jZS5oYXNFdmVudExpc3RlbmVyKHR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sIHVzZUNhcHR1cmU6IGJvb2xlYW4gPSBmYWxzZSwgcHJpb3JpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcclxuICAgICAgICBMTGlzdGVuZXIuX2luc3RhbmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXNPYmplY3QpO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTEV2ZW50IGV4dGVuZHMgTGF5YS5FdmVudFxyXG57XHJcbiAgICBwdWJsaWMgQ0xBU1NfTkFNRTpzdHJpbmcgPSBcIkxFdmVudFwiO1xyXG4gICAgcHJpdmF0ZSBfb2JqOmFueTtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOnN0cmluZywgb2JqOmFueSA9IG51bGwsIGJ1YmJsZXM6Ym9vbGVhbiA9IGZhbHNlLCBjYW5jZWxhYmxlOmJvb2xlYW4gPSBmYWxzZSl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBpZihvYmope1xyXG4gICAgICAgICAgICB0aGlzLl9vYmogPSBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9uZShvYmo/Ok9iamVjdCk6TEV2ZW50e1xyXG4gICAgICAgIHJldHVybiBuZXcgTEV2ZW50KHRoaXMudHlwZSwgb2JqP29iajp0aGlzLl9vYmopO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOnZvaWR7XHJcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5DTEFTU19OQU1FLCBcInR5cGVcIiwgXCJidWJibGVzXCIsIFwiY2FuY2VsYWJsZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOS8oOWPguiOt+WPllxyXG4gICAgICogQHJldHVybnMge2FueX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwYXJhbSgpOmFueXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb2JqO1xyXG4gICAgfVxyXG5cclxufSIsIi8qKlxyXG4gKiDlhajlsYDkvqblkKznsbvlj4rmtojmga/lpITnkIZcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExMaXN0ZW5lciBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIHB1YmxpYyBzdGF0aWMgX2luc3RhbmNlOkxMaXN0ZW5lcjtcclxuICAgIHByaXZhdGUgX2Rpc3BhdGNoZXI6TGF5YS5FdmVudERpc3BhdGNoZXI7XHJcbiAgICBwcml2YXRlIGlzSW5pdDpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIGlmKHRoaXMuaXNJbml0KXsgICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMuX2Rpc3BhdGNoZXIgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoZXIgPSBuZXcgTGF5YS5FdmVudERpc3BhdGNoZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luaXQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6TExpc3RlbmVye1xyXG4gICAgICAgIGlmKHRoaXMuX2luc3RhbmNlPT1udWxsKVxyXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBMTGlzdGVuZXIoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXIodHlwZTpzdHJpbmcsbGlzdGVuZXI6RnVuY3Rpb24sdGhpc09iamVjdDphbnksdXNlQ2FwdHVyZTpib29sZWFuPWZhbHNlLHByaW9yaXR5Om51bWJlcj0wKTp2b2lke1xyXG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoZXIub24oIHR5cGUsdGhpc09iamVjdCwgbGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6c3RyaW5nLGxpc3RlbmVyOkZ1bmN0aW9uLHRoaXNPYmplY3Q6YW55LHVzZUNhcHR1cmU6Ym9vbGVhbj1mYWxzZSk6dm9pZHtcclxuICAgICAgICB0aGlzLl9kaXNwYXRjaGVyLm9mZiggdHlwZSx0aGlzT2JqZWN0LCBsaXN0ZW5lciApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYXNFdmVudExpc3RlbmVyKHR5cGU6c3RyaW5nKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoZXIuaGFzTGlzdGVuZXIodHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc3BhdGNoRXZlbnQodHlwZTpzdHJpbmcsZGF0YT86IGFueSk6Ym9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoZXIuZXZlbnQodHlwZSxkYXRhKTtcclxuICAgIH1cclxufSIsImltcG9ydCBNVkNPYmplY3RQb29sIGZyb20gXCIuL01WQ09iamVjdFBvb2xcIjtcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gXCIuLi9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5pbXBvcnQgU2luZ2xldG9uIGZyb20gXCIuL1NpbmdsZXRvblwiO1xyXG5pbXBvcnQgR2FtZVNvY2tldCBmcm9tIFwiLi4vbmV0L0dhbWVTb2NrZXRcIjtcclxuaW1wb3J0IFJvbGVWTyBmcm9tIFwiLi4vLi4vZ2FtZW1vZHVsZS91c2VyaW5mby92by9Sb2xlVk9cIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZVByb3h5cyBleHRlbmRzIFNpbmdsZXRvblxyXG57XHJcbiAgICBwcml2YXRlIF9vYmplY3RQb29sOiBNVkNPYmplY3RQb29sO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX29iamVjdFBvb2wgPSBNVkNPYmplY3RQb29sLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgdGhpcy5pbml0UHJveHkoKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBpbml0UHJveHkoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIOazqOWGjOWFqOWxgOS+puWQrOS6i+S7tlxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhZGREYXRhRXZlbnQoIHR5cGU6c3RyaW5nLCBjYWxsYmFja29iajphbnksIGNhbGxiYWNrSGFuZGxlcjpGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBFdmVudFV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2tvYmosIGNhbGxiYWNrSGFuZGxlciApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIOaKm+WHuuWFqOWxgOS6i+S7tiBcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGRpc3BhY2hlRGF0YUV2ZW50KHR5cGU6c3RyaW5nLCBkYXRhOmFueSA9IG51bGwpOnZvaWRcclxuXHR7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCB0eXBlLCBkYXRhICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTlhajlsYDkvqblkKzkuovku7ZcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHJlbW92ZURhdGFFdmVudCh0eXBlOnN0cmluZyxjYWxsYmFja29iajphbnksIGNhbGxiYWNrSGFuZGxlcjpGdW5jdGlvbik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEV2ZW50VXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFja29iaiwgY2FsbGJhY2tIYW5kbGVyICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldFByb3h5KHJlZjphbnkpOmFueVxyXG5cdHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb2JqZWN0UG9vbC5nZXRQcm94eShyZWYpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZW5kTWVzc2FnZSggYWN0OnN0cmluZyxkYXRhOmFueSA9IG51bGwsaXNTaG93V2FpdDpib29sZWFuID0gdHJ1ZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBHYW1lU29ja2V0LmdldEluc3RhbmNlKCkuc2VuZE1lc3NhZ2UoYWN0LCBkYXRhLCBpc1Nob3dXYWl0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9yb2xlVm86Um9sZVZPO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgcm9sZVZPKCk6Um9sZVZPXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9yb2xlVm8pe1xyXG4gICAgICAgICAgICB0aGlzLl9yb2xlVm8gPSBSb2xlVk8uZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvbGVWbztcclxuICAgIH1cclxufSIsImltcG9ydCBSZXNEYXRhTWFuYWdlciBmcm9tIFwiLi4vLi4vbWFuYWdlcnMvUmVzRGF0YU1hbmFnZXJcIjtcclxuaW1wb3J0IFJlc291cmNlTWFuYWdlciBmcm9tIFwiLi4vLi4vbWFuYWdlcnMvUmVzb3VyY2VNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vZXZlbnRzL0V2ZW50VXRpbHNcIjtcclxuaW1wb3J0IE1WQ09iamVjdFBvb2wgZnJvbSBcIi4vTVZDT2JqZWN0UG9vbFwiO1xyXG5pbXBvcnQgV2luZG93QW5tb1R5cGUgZnJvbSBcIi4vV2luZG93QW5tb1R5cGVcIjtcclxuaW1wb3J0IHsgVWlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL21hbmFnZXJzL1VpTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vLi4vR2xvYmFsXCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi9EZWJ1Z2VyXCI7XHJcbmltcG9ydCBDb21FdmVudFZPIGZyb20gXCIuLi9ldmVudHMvQ29tRXZlbnRWT1wiO1xyXG5pbXBvcnQgT2JqZWN0UG9vbCBmcm9tIFwiLi9PYmplY3RQb29sXCI7XHJcbmltcG9ydCBHbG9iYWxXYWl0aW5nIGZyb20gXCIuLi8uLi9HbG9iYWxXYWl0aW5nXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VWaWV3IGV4dGVuZHMgZmFpcnlndWkuV2luZG93IHtcclxuICAgIHN0YXRpYyB2aWV3YmdVcmw6c3RyaW5nID0gXCJcIjtcclxuICAgIGlzZ3VpZGVpbmc6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHByaXZhdGUgX3BrZ05hbWU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9yZXNOYW1lOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBfaXNBZGRwYWNrYWdlOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfaXNjYWNoZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9XaW5kb3dBbm1vVHlwZTpzdHJpbmcgPSBXaW5kb3dBbm1vVHlwZS5XaW5kb3dBbm1vVHlwZV9ub25lO1xyXG5cclxuICAgIGl0ZW1fcGFuZWw6IGZhaXJ5Z3VpLkdDb21wb25lbnQ7XHJcbiAgICBpdGVtX2JnOiBmYWlyeWd1aS5HQ29tcG9uZW50O1xyXG4gICAgcHJpdmF0ZSBfY2xpY2tCZzogZmFpcnlndWkuR0xvYWRlcjtcclxuXHJcbiAgICBwcml2YXRlIF9jbGlja0JnSXNDb2xzZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgdmlld0tleTogYW55O1xyXG4gICAgcHVibGljIGdhbWVMYXllcjpzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkuovku7blrrnlmahcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZXZlbnRkaWN0OmFueSA9IHt9O1xyXG4gICAgLyoqXHJcbiAgICAgKiDlhajlsYDkuovku7blrrnlmahcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZ2xvYmFsRXZlbnRkaWN0OmFueSA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog55WM6Z2i5Yid5aeL5YyWXHJcbiAgICAgKiBAcGFyYW0gcGtnTmFtZSDljIXlkI1cclxuICAgICAqIEBwYXJhbSByZXNOYW1lIOeVjOmdouWQjVxyXG4gICAgICogQHBhcmFtIGlzQWRkcGFja2FnZSDmmK/lkKbmt7vliqDljIUgXHJcbiAgICAgKiBAcGFyYW0gd2luZG93QW5tb1R5cGUg55WM6Z2i5omT5byA5Yqo55S757G75Z6LXHJcbiAgICAgKiBAcGFyYW0gY2xpY2tCZ0lzQ29sc2Ug6buR6Imy6IOM5pmvIDA65peg6IOM5pmvIDE66IOM5pmv5peg5YWz6Zet5LqL5Lu2IDI66IOM5pmv5pyJ5YWz6Zet5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gaXNjYWNoZSDmmK/lkKbmt7vliqDliLDnvJPlrZjmsaDvvIjlpoLmmK/kuLp0cnVlLOWImeWKoOWFpei/m+e8k+WtmOaxoOWumuaXtuagueaNruaYr+WQpuW8leeUqOa4heeQhuOAgiDoi6XmmK/kuLpmYWxzZe+8jOWImeS4jea4heeQhuW9k+WJjee8k+WtmO+8jOWmguiLpea4heeQhu+8jOivt+aJi+WKqOa4heeQhiDvvIlcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocGtnTmFtZTogc3RyaW5nID0gXCJcIiwgcmVzTmFtZTogc3RyaW5nID0gXCJcIiwgaXNBZGRwYWNrYWdlOiBib29sZWFuID0gZmFsc2UsIFxyXG4gICAgICAgICAgICAgICAgd2luZG93QW5tb1R5cGU6c3RyaW5nPVdpbmRvd0FubW9UeXBlLldpbmRvd0FubW9UeXBlX25vbmUsIGNsaWNrQmdJc0NvbHNlOm51bWJlcj0wLCBpc2NhY2hlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5faXNjYWNoZSA9IGlzY2FjaGU7XHJcbiAgICAgICAgdGhpcy5fcGtnTmFtZSA9IHBrZ05hbWU7XHJcbiAgICAgICAgdGhpcy5fcmVzTmFtZSA9IHJlc05hbWU7XHJcbiAgICAgICAgdGhpcy5faXNBZGRwYWNrYWdlID0gaXNBZGRwYWNrYWdlO1xyXG4gICAgICAgIHRoaXMuX1dpbmRvd0FubW9UeXBlID0gd2luZG93QW5tb1R5cGU7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tCZ0lzQ29sc2UgPSBjbGlja0JnSXNDb2xzZTtcclxuICAgICAgICB0aGlzLnNob3dNb2RhbFdhaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0Y2xpY2tCZ0lzQ29sc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93aW5nICYmIHRoaXMuX2NsaWNrQmdJc0NvbHNlID4gMCAmJiB0aGlzLmNvbnRlbnRQYW5lKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fY2xpY2tCZyAmJiBCYXNlVmlldy52aWV3YmdVcmwgIT0gXCJcIiApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcgPSBuZXcgZmFpcnlndWkuR0xvYWRlcigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy50b3VjaGFibGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5zZXRTaXplKGZhaXJ5Z3VpLkdSb290Lmluc3Qud2lkdGgsIGZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcudXJsID0gQmFzZVZpZXcudmlld2JnVXJsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5maWxsID0gZmFpcnlndWkuTG9hZGVyRmlsbFR5cGUuU2NhbGVGcmVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5hbHBoYSA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLmFkZENoaWxkQXQodGhpcy5fY2xpY2tCZywgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbG9hZFRhcmdldDphbnk7XHJcbiAgICBwcml2YXRlIF9vbkxvYWRlZEhhbmRsZXI6RnVuY3Rpb247XHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vXVpXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOe7hOWQjVxyXG4gICAgICogQHBhcmFtIHRhcmdldCAgICDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBvbkxvYWRlZEhhbmRsZXIg5Yqg6L295a6M5oiQ5Zue6LCD5Ye95pWwXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBsb2FkVWkoZ3JvdXBOYW1lOiBzdHJpbmcsIHRhcmdldDogYW55LCBvbkxvYWRlZEhhbmRsZXI6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbG9hZFRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICB0aGlzLl9vbkxvYWRlZEhhbmRsZXIgPSBvbkxvYWRlZEhhbmRsZXI7XHJcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZEdyb3VwKGdyb3VwTmFtZSwgdGhpcywgdGhpcy5sb2Fkc3VjY2VlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3otYTmupDmlbDnu4RcclxuICAgICAqIEBwYXJhbSB1cmxzIOi1hOa6kOaVsOe7hFxyXG4gICAgICogQHBhcmFtIHRhcmdldCDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBvbkxvYWRlZEhhbmRsZXIg5Yqg6L295a6M5oiQ5Zue6LCD5Ye95pWwXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBsb2FkVWlieUFycih1cmxzOiBBcnJheTxhbnk+LCB0YXJnZXQ6IGFueSwgb25Mb2FkZWRIYW5kbGVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIC8vIHRoaXMuc2hvd01vZGFsV2FpdCgpO1xyXG4gICAgICAgIHRoaXMuX2xvYWRUYXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGhpcy5fb25Mb2FkZWRIYW5kbGVyID0gb25Mb2FkZWRIYW5kbGVyO1xyXG4gICAgICAgIFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLkxvYWRlcnModXJscywgdGhpcywgdGhpcy5sb2Fkc3VjY2VlZCk7ICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZHN1Y2NlZWQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2xvYWRUYXJnZXQgJiYgdGhpcy5fb25Mb2FkZWRIYW5kbGVyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX29uTG9hZGVkSGFuZGxlci5jYWxsKCB0aGlzLl9sb2FkVGFyZ2V0ICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZW1vdmVFZmZlY3RQYWNrYWdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBSZXNEYXRhTWFuYWdlci5pbnN0YW5jZS5yZW1vdmVQYWNrYWdlKHBhY2thZ2VOYW1lLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0cGFuZWxDb250cm9sbGVyKG5hbWU6IHN0cmluZyk6IGZhaXJ5Z3VpLkNvbnRyb2xsZXIge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1fcGFuZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbV9wYW5lbC5nZXRDb250cm9sbGVyKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0cGFuZWxUcmFuc2l0aW9uKG5hbWU6IHN0cmluZyk6IGZhaXJ5Z3VpLlRyYW5zaXRpb24ge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1fcGFuZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbV9wYW5lbC5nZXRUcmFuc2l0aW9uKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Q2hpbGRmb3JtQ29udGVudFBhbmVsKCBuYW1lOnN0cmluZyApOmZhaXJ5Z3VpLkdPYmplY3RcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLmNvbnRlbnRQYW5lKXtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFBhbmUuZ2V0Q2hpbGQobmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8q55WM6Z2i5Yid5aeL5YyWKi9cclxuICAgIHByb3RlY3RlZCBvbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIub25Jbml0KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BrZ05hbWUgIT0gXCJcIiAmJiB0aGlzLl9yZXNOYW1lICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJzZVVpKHRoaXMuX3BrZ05hbWUsIHRoaXMuX3Jlc05hbWUsIHRoaXMuX2lzQWRkcGFja2FnZSx0aGlzLl9XaW5kb3dBbm1vVHlwZSx0aGlzLl9jbGlja0JnSXNDb2xzZSwgdGhpcy5faXNjYWNoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8v6Kej5p6QdWlcclxuICAgIHByb3RlY3RlZCBwYXJzZVVpKHBrZ25hbWU6IHN0cmluZywgcmVzbmFtZTogc3RyaW5nLCBpc2FkZHBhY2thZ2U6IGJvb2xlYW4sd2luZG93QW5tb1R5cGU6c3RyaW5nPVdpbmRvd0FubW9UeXBlLldpbmRvd0FubW9UeXBlX25vbmUsIGNsaWNrQmdJc0NvbHNlOm51bWJlcj0wLCBpc2NhY2hlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3BrZ05hbWUgPSBwa2duYW1lO1xyXG4gICAgICAgIHRoaXMuX3Jlc05hbWUgPSByZXNuYW1lO1xyXG4gICAgICAgIHRoaXMuX1dpbmRvd0FubW9UeXBlID0gd2luZG93QW5tb1R5cGU7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tCZ0lzQ29sc2UgPSBjbGlja0JnSXNDb2xzZTtcclxuICAgICAgICBSZXNEYXRhTWFuYWdlci5pbnN0YW5jZS5hZGR1aVBhY2thZ2UocGtnbmFtZSwgaXNhZGRwYWNrYWdlLCBpc2NhY2hlKTtcclxuICAgICAgICB0aGlzLmNvbnRlbnRQYW5lID0gZmFpcnlndWkuVUlQYWNrYWdlLmNyZWF0ZU9iamVjdChwa2duYW1lLCByZXNuYW1lKS5hc0NvbTtcclxuICAgICAgICBmb3IgKHZhciBzdHIgaW4gdGhpcy5jb250ZW50UGFuZS5fY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW06IGZhaXJ5Z3VpLkdPYmplY3QgPSB0aGlzLmNvbnRlbnRQYW5lLl9jaGlsZHJlbltzdHJdO1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5uYW1lID09IFwiaXRlbV9wYW5lbFwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbXBhbmVsOiBmYWlyeWd1aS5HQ29tcG9uZW50ID0gaXRlbSBhcyBmYWlyeWd1aS5HQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1wYW5lbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0cjEgaW4gaXRlbXBhbmVsLl9jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbXBhbmVsSXRlbTogZmFpcnlndWkuR09iamVjdCA9IGl0ZW1wYW5lbC5fY2hpbGRyZW5bc3RyMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbaXRlbXBhbmVsSXRlbS5uYW1lXSA9IGl0ZW1wYW5lbEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdGhpc1tpdGVtLm5hbWVdID0gaXRlbTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9wYW5lbCA9IGl0ZW0gYXMgZmFpcnlndWkuR0NvbXBvbmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXNbaXRlbS5uYW1lXSA9IGl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKGZhaXJ5Z3VpLkdSb290Lmluc3Qud2lkdGgsIGZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLnNldFBpdm90KDAuNSwwLjUpO1xyXG4gICAgICAgIHRoaXMuc2V0UGl2b3QoMC41LCAwLjUpO1xyXG4gICAgICAgIHRoaXMuc2V0Y2xpY2tCZ0lzQ29sc2UoKTtcclxuICAgICAgICB0aGlzLmluaXRWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcclxuICAgICAgICB0aGlzLmRvMVNob3dBbmltYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkbzFTaG93QW5pbWF0aW9uKCk6dm9pZCBcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIHRoaXMuX1dpbmRvd0FubW9UeXBlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgV2luZG93QW5tb1R5cGUuV2luZG93QW5tb1R5cGVfbm9uZTpcclxuICAgICAgICAgICAgICAgIHRoaXMud2luZG93YW5tb2VuZCgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBXaW5kb3dBbm1vVHlwZS5XaW5kb3dBbm1vVHlwZV9hZGRtb3ZlVG9NaWRkbGU6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLnggPSBmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoO1xyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLmNvbnRlbnRQYW5lLCB7IHg6MCB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLndpbmRvd2FubW9lbmQpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgV2luZG93QW5tb1R5cGUuV2luZG93QW5tb1R5cGVfYWRkbW92ZUZyb21Cb3R0b206XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLnkgPSBmYWlyeWd1aS5HUm9vdC5pbnN0LmhlaWdodDtcclxuICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcy5jb250ZW50UGFuZSwgeyB5OjAgfSwzMDAsIGxheWEudXRpbHMuRWFzZS5xdWFkSW5PdXQsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy53aW5kb3dhbm1vZW5kKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFdpbmRvd0FubW9UeXBlLldpbmRvd0FubW9UeXBlX2FkZHNjYWxlTWluVG9NYXg6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLnNjYWxlWCA9IHRoaXMuY29udGVudFBhbmUuc2NhbGVZID0gMC4wMTtcclxuICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcy5jb250ZW50UGFuZSwgeyBzY2FsZVg6MSxzY2FsZVk6MSB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLndpbmRvd2FubW9lbmQpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd2luZG93YW5tb2VuZCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBMYXlhLnRpbWVyLmNhbGxMYXRlciggdGhpcyx0aGlzLm9uU2hvd1ZpZXcgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25TaG93VmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICAgICAgdGhpcy5zaG93Q2xpY2tCZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2hvd0NsaWNrQmcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2NsaWNrQmcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5hbHBoYSA9IDAuNTU7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9jbGlja0JnSXNDb2xzZT09MiAmJiAhdGhpcy5oYXNDbGlja0xpc3RlbmVyKCkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnLm9uQ2xpY2sodGhpcywgdGhpcy5jbG9zZWJnQ2xpY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjbG9zZWJnQ2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVWlNYW5hZ2VyLmluc3RhbmNlLmNsb3NlKCB0aGlzLnZpZXdLZXksdHJ1ZSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55WM6Z2i5YWz6Zet5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNsb3NlVmlldyggd2luZG93QW5tb1R5cGU6c3RyaW5nID0gXCJcIiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fY2xpY2tCZyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9jbGlja0JnLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHdpbmRvd0FubW9UeXBlID09IFwiXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3dpdGNoKCB0aGlzLl9XaW5kb3dBbm1vVHlwZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgV2luZG93QW5tb1R5cGUuV2luZG93QW5tb1R5cGVfbm9uZTpcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVzdG9yeSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBXaW5kb3dBbm1vVHlwZS5XaW5kb3dBbm1vVHlwZV9hZGRtb3ZlVG9NaWRkbGU6XHJcbiAgICAgICAgICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMsIHsgeDpmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBXaW5kb3dBbm1vVHlwZS5XaW5kb3dBbm1vVHlwZV9hZGRtb3ZlRnJvbUJvdHRvbTpcclxuICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcywgeyB5OmZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0IH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBXaW5kb3dBbm1vVHlwZS5XaW5kb3dBbm1vVHlwZV9hZGRzY2FsZU1pblRvTWF4OlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHNjYWxlWDowLjAxLHNjYWxlWTowLjAxIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzd2l0Y2goIHdpbmRvd0FubW9UeXBlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBXaW5kb3dBbm1vVHlwZS5XaW5kb3dBbm1vVHlwZV9ub25lOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdG9yeSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFdpbmRvd0FubW9UeXBlLldpbmRvd0FubW9UeXBlX3JlbW92ZXNjYWxlTWF4VG9NaW46XHJcbiAgICAgICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHNjYWxlWDowLjAxLHNjYWxlWTowLjAxIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFdpbmRvd0FubW9UeXBlLldpbmRvd0FubW9UeXBlX3JlbW92ZW1vdmVUb1JpZ2h0OlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHg6ZmFpcnlndWkuR1Jvb3QuaW5zdC53aWR0aCB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLmRlc3RvcnkpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRDb21CeUlkKGlkOiBzdHJpbmcpOiBmYWlyeWd1aS5HQ29tcG9uZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZS5nZXRDaGlsZChpZCkuYXNDb207XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldENvbnRyb2xsZXJCeUJhbWUoaWQ6IHN0cmluZyk6IGZhaXJ5Z3VpLkNvbnRyb2xsZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRQYW5lLmdldENvbnRyb2xsZXIoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRUcmFuc2l0aW9uQnlOYW1lKGlkOiBzdHJpbmcpOiBmYWlyeWd1aS5UcmFuc2l0aW9uIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZS5nZXRUcmFuc2l0aW9uKGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKuiOt+WPlueuoeeQhuaVsOaNruaooeWdlyovXHJcbiAgICBwdWJsaWMgZ2V0UHJveHkoZDogYW55KTogYW55IHtcclxuICAgICAgICByZXR1cm4gTVZDT2JqZWN0UG9vbC5nZXRJbnN0YW5jZSgpLmdldFByb3h5KGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkaXNwYWNoZURhdGFFdmVudCh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQodHlwZSwgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDms6jlhozlhajlsYDkuovku7ZcclxuICAgICAqIEBwYXJhbSB0eXBlIFxyXG4gICAgICogQHBhcmFtIHRoaXNPYmplY3QgXHJcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhZGREYXRhRXZlbnQodHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIGlmKCAhdGhpcy5fZ2xvYmFsRXZlbnRkaWN0Lmhhc093blByb3BlcnR5KCB0eXBlICkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdm86Q29tRXZlbnRWTyA9IE9iamVjdFBvb2wuZ2V0T2JqKCBDb21FdmVudFZPLnBvb2xrZXkgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dsb2JhbEV2ZW50ZGljdFt0eXBlXSA9IHZvO1xyXG4gICAgICAgICAgICAgICAgdm8udHlwZSA9IHR5cGU7XHJcbiAgICAgICAgICAgICAgICB2by50aGlzT2JqZWN0ID0gdGhpc09iamVjdDtcclxuICAgICAgICAgICAgICAgIHZvLmxpc3RlbmVyID0gbGlzdGVuZXI7XHJcbiAgICAgICAgICAgICAgICBFdmVudFV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgdGhpc09iamVjdCxsaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOenu+mZpOWFqOWxgOS6i+S7tlxyXG4gICAgICogQHBhcmFtIHR5cGUgXHJcbiAgICAgKiBAcGFyYW0gdGhpc09iamVjdCBcclxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciBcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHJlbW92ZURhdGFFdmVudCh0eXBlOiBzdHJpbmcsIHRoaXNPYmplY3Q6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2dsb2JhbEV2ZW50ZGljdFt0eXBlXSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdm86Q29tRXZlbnRWTyA9IHRoaXMuX2dsb2JhbEV2ZW50ZGljdFt0eXBlXTtcclxuICAgICAgICAgICAgRXZlbnRVdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNPYmplY3QsIGxpc3RlbmVyKTtcclxuICAgICAgICAgICAgdm8uY2xlYXIoKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2dsb2JhbEV2ZW50ZGljdFt0eXBlXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDms6jlhoznu4Tku7bkuovku7bvvIzosIPnlKjmraTmlrnms5XvvIznlYzpnaLlhbPpl63kvJroh6rliqjnp7vpmaRcclxuICAgICAqIEBwYXJhbSB0eXBlIOaXtumXtOexu+Wei1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrb2JqIOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciDkuovku7blm57osINcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGFkZExpc3RlbmVyKCB0YXJnZXQ6YW55LCB0eXBlOiBzdHJpbmcsIHRoaXNPYmplY3Q6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uLGFyZ3M6YW55PW51bGwpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0YXJnZXQubmFtZSA9PSBudWxsIHx8IHRhcmdldC5uYW1lID09IFwiXCIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBcImJhc2V2aWV3IGFkZExpc3RlbmVyIHRhcmdldC5uYW1lIGlzIG51bGxcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdm86Q29tRXZlbnRWTyA9IE9iamVjdFBvb2wuZ2V0T2JqKCBDb21FdmVudFZPLnBvb2xrZXkgKTtcclxuICAgICAgICAgICAgdm8udGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgICAgICB2by50eXBlID0gdHlwZTtcclxuICAgICAgICAgICAgdm8udGhpc09iamVjdCA9IHRoaXNPYmplY3Q7XHJcbiAgICAgICAgICAgIHZvLmxpc3RlbmVyID0gbGlzdGVuZXI7XHJcbiAgICAgICAgICAgIGlmKCAhdGhpcy5fZXZlbnRkaWN0Lmhhc093blByb3BlcnR5KCB0YXJnZXQubmFtZSApIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRkaWN0W3RhcmdldC5uYW1lXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBibzpib29sZWFuID0gdGhpcy5oYXNMaXN0ZW5lciggdGFyZ2V0LHR5cGUgKTtcclxuICAgICAgICAgICAgaWYoICFibyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5vbiggdHlwZSx0aGlzT2JqZWN0LGxpc3RlbmVyLGFyZ3MgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50ZGljdFt0YXJnZXQubmFtZV0ucHVzaCggdm8gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaGFzTGlzdGVuZXIoIHRhcmdldDphbnksdHlwZTogc3RyaW5nICk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHZhciBldmVudEFycjpBcnJheTxDb21FdmVudFZPPjtcclxuICAgICAgICBldmVudEFyciA9IHRoaXMuX2V2ZW50ZGljdFt0YXJnZXQubmFtZV07XHJcbiAgICAgICAgdmFyIGNoaWxkdm86Q29tRXZlbnRWTztcclxuICAgICAgICBmb3IoIHZhciBzIGluIGV2ZW50QXJyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWxkdm8gPSBldmVudEFycltzXTtcclxuICAgICAgICAgICAgaWYoIGNoaWxkdm8gJiYgY2hpbGR2by50eXBlID09IHR5cGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTnu4Tku7bkuovku7ZcclxuICAgICAqIEBwYXJhbSB0eXBlIOaXtumXtOexu+Wei1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrb2JqIOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciDkuovku7blm57osIMgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVzTGlzdGVuZXIoIHRhcmdldDphbnksIHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRhcmdldCAmJiB0aGlzLl9ldmVudGRpY3RbdGFyZ2V0Lm5hbWVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8Q29tRXZlbnRWTz4gPSB0aGlzLl9ldmVudGRpY3RbdGFyZ2V0Lm5hbWVdO1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI9MDtcclxuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIHZvOkNvbUV2ZW50Vk87XHJcbiAgICAgICAgICAgIGZvcihpO2k8bnVtcztpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZvID0gYXJyW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvICYmIHZvLnR5cGU9PXR5cGUgJiYgdm8udGhpc09iamVjdCA9PSB0aGlzT2JqZWN0ICYmIHZvLmxpc3RlbmVyID09IGxpc3RlbmVyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQub2ZmKCB0eXBlLHRoaXNPYmplY3QsbGlzdGVuZXIgKTtcclxuICAgICAgICAgICAgICAgICAgICB2by5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoIGksMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ5YWo5bGA5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVBbGxHbG9iYWxFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fZ2xvYmFsRXZlbnRkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzO1xyXG4gICAgICAgICAgICB2YXIgZGljdDphbnkgPSB0aGlzLl9nbG9iYWxFdmVudGRpY3Q7XHJcbiAgICAgICAgICAgIGZvciggcyBpbiBkaWN0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZvOkNvbUV2ZW50Vk8gPSBkaWN0W3NdO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZURhdGFFdmVudCggdm8udHlwZSx2by50aGlzT2JqZWN0LHZvLmxpc3RlbmVyICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZ2xvYmFsRXZlbnRkaWN0PXt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ57uE5Lu25LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVBbGxDb21FdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLl9ldmVudGRpY3QpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcztcclxuICAgICAgICAgICAgdmFyIGRpY3Q6YW55ID0gdGhpcy5fZXZlbnRkaWN0O1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PENvbUV2ZW50Vk8+O1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciBudW1zOm51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21FdmVudFZPO1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gZGljdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFyciA9IGRpY3Rbc107XHJcbiAgICAgICAgICAgICAgICBpZiggYXJyICYmIGFyci5sZW5ndGggPiAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpPTA7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtcyA9IGFyci5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKCBpPW51bXMtMTtpPj0wO2ktLSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2byA9IGFycltpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHZvIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHZvLnRhcmdldCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm8udGFyZ2V0Lm9mZiggdm8udHlwZSx2by50aGlzT2JqZWN0LHZvLmxpc3RlbmVyICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2by5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoIGksMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudGRpY3Rbc107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZXZlbnRkaWN0ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNsZWFyRXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qIOmUgOavgSovXHJcbiAgICBwdWJsaWMgZGVzdG9yeSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNsZWFyRXZlbnQoKTtcclxuICAgICAgICB0aGlzLmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxHbG9iYWxFdmVudCgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsQ29tRXZlbnQoKTtcclxuICAgICAgICB0aGlzLl9sb2FkVGFyZ2V0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9vbkxvYWRlZEhhbmRsZXIgPSBudWxsO1xyXG4gICAgICAgIExheWEuVHdlZW4uY2xlYXJUd2VlbiggdGhpcyApO1xyXG4gICAgICAgIFJlc0RhdGFNYW5hZ2VyLmluc3RhbmNlLnJlbW92ZVBhY2thZ2UodGhpcy5fcGtnTmFtZSwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuX3BrZ05hbWUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3Jlc05hbWUgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9jbGlja0JnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcub2ZmQ2xpY2sodGhpcywgdGhpcy5jbG9zZWJnQ2xpY2spO1xyXG4gICAgICAgICAgICB0aGlzLl9jbGlja0JnLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tCZyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmlld0tleSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4uL2V2ZW50cy9FdmVudFV0aWxzXCI7XHJcbmltcG9ydCBNVkNPYmplY3RQb29sIGZyb20gXCIuL01WQ09iamVjdFBvb2xcIjtcclxuaW1wb3J0IENvbUV2ZW50Vk8gZnJvbSBcIi4uL2V2ZW50cy9Db21FdmVudFZPXCI7XHJcbmltcG9ydCBPYmplY3RQb29sIGZyb20gXCIuL09iamVjdFBvb2xcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoaWxkQmFzZVZpZXcgZXh0ZW5kcyBmYWlyeWd1aS5HQ29tcG9uZW50IFxyXG57XHJcbiAgICBpc2d1aWRlaW5nOmJvb2xlYW49ZmFsc2U7XHJcbiAgICAvKipcclxuICAgICAqIOS6i+S7tuWuueWZqFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9ldmVudGRpY3Q6YW55ID0ge307XHJcbiAgICAvKipcclxuICAgICAqIOWFqOWxgOS6i+S7tuWuueWZqFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9nbG9iYWxFdmVudGRpY3Q6YW55ID0ge307XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdEZyb21YTUwoeG1sOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5jb25zdHJ1Y3RGcm9tWE1MKHhtbCk7XHJcbiAgICAgICAgZm9yICh2YXIgc3RyIGluIHRoaXMuX2NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtOiBmYWlyeWd1aS5HT2JqZWN0ID0gdGhpcy5fY2hpbGRyZW5bc3RyXTtcclxuICAgICAgICAgICAgdGhpc1tpdGVtLm5hbWVdID0gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vbkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6IHZvaWQge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKuiOt+WPlueuoeeQhuaVsOaNruaooeWdlyovXHJcbiAgICBwdWJsaWMgZ2V0UHJveHkoZDogYW55KTogYW55IHtcclxuICAgICAgICByZXR1cm4gTVZDT2JqZWN0UG9vbC5nZXRJbnN0YW5jZSgpLmdldFByb3h5KGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkaXNwYWNoZURhdGFFdmVudCh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQodHlwZSwgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGhhc0RhdGFFdmVudCh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gRXZlbnRVdGlscy5oYXNFdmVudExpc3RlbmVyKHR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5rOo5YaM5YWo5bGA5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdHlwZSBcclxuICAgICAqIEBwYXJhbSB0aGlzT2JqZWN0IFxyXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgYWRkRGF0YUV2ZW50KHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICBpZiggIXRoaXMuX2dsb2JhbEV2ZW50ZGljdC5oYXNPd25Qcm9wZXJ0eSggdHlwZSApIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21FdmVudFZPID0gT2JqZWN0UG9vbC5nZXRPYmooIENvbUV2ZW50Vk8ucG9vbGtleSApO1xyXG4gICAgICAgICAgICB0aGlzLl9nbG9iYWxFdmVudGRpY3RbdHlwZV0gPSB2bztcclxuICAgICAgICAgICAgdm8udHlwZSA9IHR5cGU7XHJcbiAgICAgICAgICAgIHZvLnRoaXNPYmplY3QgPSB0aGlzT2JqZWN0O1xyXG4gICAgICAgICAgICB2by5saXN0ZW5lciA9IGxpc3RlbmVyO1xyXG4gICAgICAgICAgICBFdmVudFV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodHlwZSx0aGlzT2JqZWN0LGxpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTlhajlsYDkuovku7ZcclxuICAgICAqIEBwYXJhbSB0eXBlIFxyXG4gICAgICogQHBhcmFtIHRoaXNPYmplY3QgXHJcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVEYXRhRXZlbnQodHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIGlmKCB0aGlzLl9nbG9iYWxFdmVudGRpY3RbdHlwZV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZvOkNvbUV2ZW50Vk8gPSB0aGlzLl9nbG9iYWxFdmVudGRpY3RbdHlwZV07XHJcbiAgICAgICAgICAgIEV2ZW50VXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzT2JqZWN0LCBsaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHZvLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9nbG9iYWxFdmVudGRpY3RbdHlwZV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5rOo5YaM57uE5Lu25LqL5Lu277yM6LCD55So5q2k5pa55rOV77yM55WM6Z2i5YWz6Zet5Lya6Ieq5Yqo56e76ZmkXHJcbiAgICAgKiBAcGFyYW0gdHlwZSDml7bpl7TnsbvlnotcclxuICAgICAqIEBwYXJhbSBjYWxsYmFja29iaiDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBjYWxsYmFja0hhbmRsZXIg5LqL5Lu25Zue6LCDXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhZGRMaXN0ZW5lciggdGFyZ2V0OmFueSwgdHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbixhcmdzOmFueT1udWxsKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRhcmdldCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGFyZ2V0Lm5hbWUgPT0gbnVsbCB8fCB0YXJnZXQubmFtZSA9PSBcIlwiIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgXCJjaGlsZGJhc2V2aWV3IGFkZExpc3RlbmVyIHRhcmdldC5uYW1lIGlzIG51bGxcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdm86Q29tRXZlbnRWTyA9IE9iamVjdFBvb2wuZ2V0T2JqKCBDb21FdmVudFZPLnBvb2xrZXkgKTtcclxuICAgICAgICAgICAgdm8udGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgICAgICB2by50eXBlID0gdHlwZTtcclxuICAgICAgICAgICAgdm8udGhpc09iamVjdCA9IHRoaXNPYmplY3Q7XHJcbiAgICAgICAgICAgIHZvLmxpc3RlbmVyID0gbGlzdGVuZXI7XHJcbiAgICAgICAgICAgIGlmKCAhdGhpcy5fZXZlbnRkaWN0Lmhhc093blByb3BlcnR5KCB0YXJnZXQubmFtZSApIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRkaWN0W3RhcmdldC5uYW1lXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBibzpib29sZWFuID0gdGhpcy5oYXNMaXN0ZW5lciggdGFyZ2V0LHR5cGUgKTtcclxuICAgICAgICAgICAgaWYoICFibyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5vbiggdHlwZSx0aGlzT2JqZWN0LGxpc3RlbmVyLGFyZ3MgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50ZGljdFt0YXJnZXQubmFtZV0ucHVzaCggdm8gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaGFzTGlzdGVuZXIoIHRhcmdldDphbnksdHlwZTogc3RyaW5nICk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHZhciBldmVudEFycjpBcnJheTxDb21FdmVudFZPPjtcclxuICAgICAgICBldmVudEFyciA9IHRoaXMuX2V2ZW50ZGljdFt0YXJnZXQubmFtZV07XHJcbiAgICAgICAgdmFyIGNoaWxkdm86Q29tRXZlbnRWTztcclxuICAgICAgICBmb3IoIHZhciBzIGluIGV2ZW50QXJyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWxkdm8gPSBldmVudEFycltzXTtcclxuICAgICAgICAgICAgaWYoIGNoaWxkdm8gJiYgY2hpbGR2by50eXBlID09IHR5cGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTnu4Tku7bkuovku7ZcclxuICAgICAqIEBwYXJhbSB0eXBlIOaXtumXtOexu+Wei1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrb2JqIOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciDkuovku7blm57osIMgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVzTGlzdGVuZXIoIHRhcmdldDphbnksIHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRhcmdldCAmJiB0aGlzLl9ldmVudGRpY3RbdGFyZ2V0Lm5hbWVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8Q29tRXZlbnRWTz4gPSB0aGlzLl9ldmVudGRpY3RbdGFyZ2V0Lm5hbWVdO1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI9MDtcclxuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIHZvOkNvbUV2ZW50Vk87XHJcbiAgICAgICAgICAgIGZvcihpO2k8bnVtcztpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZvID0gYXJyW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvICYmIHZvLnR5cGU9PXR5cGUgJiYgdm8udGhpc09iamVjdCA9PSB0aGlzT2JqZWN0ICYmIHZvLmxpc3RlbmVyID09IGxpc3RlbmVyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQub2ZmKCB0eXBlLHRoaXNPYmplY3QsbGlzdGVuZXIgKTtcclxuICAgICAgICAgICAgICAgICAgICB2by5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoIGksMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ5YWo5bGA5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVBbGxHbG9iYWxFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fZ2xvYmFsRXZlbnRkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzO1xyXG4gICAgICAgICAgICB2YXIgZGljdDphbnkgPSB0aGlzLl9nbG9iYWxFdmVudGRpY3Q7XHJcbiAgICAgICAgICAgIGZvciggcyBpbiBkaWN0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZvOkNvbUV2ZW50Vk8gPSBkaWN0W3NdO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZURhdGFFdmVudCggdm8udHlwZSx2by50aGlzT2JqZWN0LHZvLmxpc3RlbmVyICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZ2xvYmFsRXZlbnRkaWN0PXt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ57uE5Lu25LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVBbGxDb21FdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLl9ldmVudGRpY3QpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcztcclxuICAgICAgICAgICAgdmFyIGRpY3Q6YW55ID0gdGhpcy5fZXZlbnRkaWN0O1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PENvbUV2ZW50Vk8+O1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciBudW1zOm51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21FdmVudFZPO1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gZGljdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFyciA9IGRpY3Rbc107XHJcbiAgICAgICAgICAgICAgICBpZiggYXJyICYmIGFyci5sZW5ndGggPiAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpPTA7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtcyA9IGFyci5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKCBpPW51bXMtMTtpPj0wO2ktLSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2byA9IGFycltpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHZvIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHZvLnRhcmdldCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm8udGFyZ2V0Lm9mZiggdm8udHlwZSx2by50aGlzT2JqZWN0LHZvLmxpc3RlbmVyICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2by5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoIGksMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudGRpY3Rbc107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZXZlbnRkaWN0ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxHbG9iYWxFdmVudCgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsQ29tRXZlbnQoKTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gXCIuL1NpbmdsZXRvblwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNVkNPYmplY3RQb29sIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOk1WQ09iamVjdFBvb2w7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX21hcHZpZXdEaWN0OmFueT17fTtcclxuXHJcblx0cHVibGljIGNvbnN0cnVjdG9yKCkgXHJcblx0e1xyXG4gICAgXHRzdXBlcigpO1xyXG5cdH1cclxuXHRcclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTVZDT2JqZWN0UG9vbFxyXG5cdHtcclxuICAgICAgICBpZih0aGlzLl9pbnN0YW5jZSA9PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgTVZDT2JqZWN0UG9vbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBhZGRQcm94eShyZWY6YW55KTp2b2lkXHJcblx0e1xyXG4gICAgICAgIFNpbmdsZXRvbi5jcmVhdGUocmVmKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIGdldFByb3h5KHJlZjphbnkpOmFueVxyXG5cdHtcclxuICAgICAgICByZXR1cm4gU2luZ2xldG9uLmdldEluc3RhbmNlKHJlZik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyByZW1vdmVQcm94eShyZWY6YW55KTp2b2lkXHJcblx0e1xyXG4gICAgICAgIFNpbmdsZXRvbi5yZW1vdmUocmVmKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbWFwVmlldyggdmlld2tleTpzdHJpbmcscmVmOmFueSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggIU1WQ09iamVjdFBvb2wuX21hcHZpZXdEaWN0W3ZpZXdrZXldIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIE1WQ09iamVjdFBvb2wuX21hcHZpZXdEaWN0W3ZpZXdrZXldID0gcmVmO1xyXG4gICAgICAgICAgICByZWYua2V5ID0gdmlld2tleTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWaWV3KCB2aWV3a2V5OnN0cmluZyApOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhTVZDT2JqZWN0UG9vbC5fbWFwdmlld0RpY3Rbdmlld2tleV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgXCJlcnIwIOacque7keWumueahHZpZXdrZXk6XCIgKyB2aWV3a2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTVZDT2JqZWN0UG9vbC5fbWFwdmlld0RpY3Rbdmlld2tleV07XHJcbiAgICB9XHJcbn0iLCIvKlxyXG4qIOWvueixoeaxoOexu1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPYmplY3RQb29sIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2NsYXNzYXJnRGljdDphbnkgPSB7fTtcclxuICAgIHByaXZhdGUgc3RhdGljIF9jb250ZW50OmFueT17fTtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyKCBrZXk6c3RyaW5nLCBjbGFzc2FyZzphbnkgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgT2JqZWN0UG9vbC5fY2xhc3NhcmdEaWN0W2tleV0gPSBjbGFzc2FyZztcclxuICAgICAgICBPYmplY3RQb29sLl9jb250ZW50W2tleV0gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldE9iaigga2V5OnN0cmluZywuLi5hcmdzOmFueVtdICk6YW55XHJcbiAgICB7XHJcbiAgICAgICAgaWYoIE9iamVjdFBvb2wuX2NvbnRlbnRba2V5XSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSBPYmplY3RQb29sLl9jb250ZW50W2tleV07XHJcbiAgICAgICAgICAgIGlmKCBhcnIubGVuZ3RoID09MCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBjYWxzc29iajphbnkgPSBPYmplY3RQb29sLl9jbGFzc2FyZ0RpY3Rba2V5XTtcclxuICAgICAgICAgICAgICAgIHZhciB2bzphbnkgPSBuZXcgY2Fsc3NvYmooKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0UG9vbC5fY29udGVudFtrZXldLnNoaWZ0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCBcIuatpGtleeWAvOWvueW6lOeahOexu+acquiiq+azqOWGjFwiICk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldE9iakJ5Zmd1aSggdXJsOnN0cmluZyApOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhT2JqZWN0UG9vbC5fY29udGVudFt1cmxdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIE9iamVjdFBvb2wuX2NvbnRlbnRbdXJsXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSBPYmplY3RQb29sLl9jb250ZW50W3VybF07XHJcbiAgICAgICAgaWYoIGFyci5sZW5ndGggPT0wIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2bzphbnkgPSBmYWlyeWd1aS5VSVBhY2thZ2UuY3JlYXRlT2JqZWN0RnJvbVVSTCggdXJsICk7XHJcbiAgICAgICAgICAgIHJldHVybiB2bztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdFBvb2wuX2NvbnRlbnRbdXJsXS5zaGlmdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJPYmooIGtleTpzdHJpbmcsIG9iajphbnkgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIE9iamVjdFBvb2wuX2NvbnRlbnRba2V5XSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gT2JqZWN0UG9vbC5fY29udGVudFtrZXldLmluZGV4T2YoIG9iaiApO1xyXG4gICAgICAgICAgICBpZihpbmRleCA9PSAtMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0UG9vbC5fY29udGVudFtrZXldLnB1c2goIG9iaiApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaW5nbGV0b24gZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBfZGljdDphbnkgPSB7fTtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAgLyoqXHJcbiAgICAgKiDojrflj5bljZXkvovnsbvvvIzoi6XkuI3lrZjlnKjliJnov5Tlm57nqbpcclxuICAgICAqIEBwYXJhbVx0cmVmIOe7p+aJv+iHqlNpbmdsZXRvbueahOexu1xyXG4gICAgICogQHJldHVyblx0KlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKHJlZjphbnkpOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCByZWYua2V5ID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ2V0aW5zdGFuY2UgZXJyb1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpY3RbcmVmLmtleV07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5Y2V5L6L57G777yM6Iul5LiN5a2Y5Zyo5YiZ5Yib5bu6XHJcbiAgICAgKiBAcGFyYW1cdHJlZlx0XHTnu6fmib/oh6pTaW5nbGV0b27nmoTnsbtcclxuICAgICAqIEByZXR1cm5cdCpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZU9yQ3JlYXRlKHJlZjphbnkpOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCByZWYua2V5ID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ2V0SW5zdGFuY2VPckNyZWF0ZSBlcnJvXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNyZWF0ZShyZWYpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kaWN0W3JlZi5rZXldO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgKiDliJvlu7rljZXkvovnsbtcclxuICAgKiBAcGFyYW1cdHJlZlx0XHTnu6fmib/oh6pTaW5nbGV0b27nmoTnsbtcclxuICAgKiBAcmV0dXJuXHR2b2lkXHJcbiAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShyZWY6YW55KTphbnlcclxuICAgIHtcclxuICAgICAgICBpZiggcmVmLmtleSA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNyZWF0ZSBlcnJvXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLl9kaWN0W3JlZi5rZXldID09IG51bGwpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZGljdFtyZWYua2V5XSA9IG5ldyByZWYoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpY3RbcmVmLmtleV07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICAgICAqIOWIoOmZpOWNleS+i+exu1xyXG4gICAgICAgICAqIEBwYXJhbVx0cmVmXHRcdOe7p+aJv+iHqlNpbmdsZXRvbueahOexu1xyXG4gICAgICAgICAqIEByZXR1cm5cdHZvaWRcclxuICAgICAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlKHJlZjphbnkpOnZvaWRcclxuXHR7XHJcbiAgICAgICAgdmFyIGtleTpzdHJpbmcgPSByZWYua2V5O1xyXG4gICAgICAgIGlmKHRoaXMuX2RpY3Rba2V5XSAhPSBudWxsKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RpY3Rba2V5XS5kZXN0b3J5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICog6ZSA5q+B5pa55rOVXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcbn0iLCIvKipcclxuICog57un5om/YmFzZVZpZXfnlYzpnaLnmoTmiZPlvIDlhbPpl63liqjmlYjnsbvlnotcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdpbmRvd0FubW9UeXBlIFxyXG57ICAgXHJcbiAgICAvKipcclxuICAgICAqIOayoeacieWKqOaViFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgV2luZG93QW5tb1R5cGVfbm9uZTpzdHJpbmcgPSBcIldpbmRvd0FubW9UeXBlX25vbmVcIjtcclxuICAgIC8qKlxyXG4gICAgICog5LuO5Y+z6L6556e75Yqo5Yiw5Lit5aSuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBXaW5kb3dBbm1vVHlwZV9hZGRtb3ZlVG9NaWRkbGU6c3RyaW5nPVwiV2luZG93QW5tb1R5cGVfYWRkbW92ZVRvTWlkZGxlXCI7XHJcbiAgICAvKipcclxuICAgICAqIOS7juacgOWPs+i+ueenu+WHulxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgV2luZG93QW5tb1R5cGVfcmVtb3ZlbW92ZVRvUmlnaHQ6c3RyaW5nID0gXCJXaW5kb3dBbm1vVHlwZV9yZW1vdmVtb3ZlVG9SaWdodFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5bqV6YOo5ZCR5LiK56e75YqoXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBXaW5kb3dBbm1vVHlwZV9hZGRtb3ZlRnJvbUJvdHRvbTpzdHJpbmc9XCJXaW5kb3dBbm1vVHlwZV9hZGRtb3ZlRnJvbUJvdHRvbVwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiDku47kuIrlkJHlupXpg6jnp7vliqhcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFdpbmRvd0FubW9UeXBlX2FkZG1vdmVGcm9tdXA6c3RyaW5nPVwiV2luZG93QW5tb1R5cGVfYWRkbW92ZUZyb211cFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5bCP5Y+Y5aSnXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBXaW5kb3dBbm1vVHlwZV9hZGRzY2FsZU1pblRvTWF4OnN0cmluZyA9IFwiV2luZG93QW5tb1R5cGVfYWRkc2NhbGVNaW5Ub01heFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5aSn5Y+Y5bCP56e75Ye6XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBXaW5kb3dBbm1vVHlwZV9yZW1vdmVzY2FsZU1heFRvTWluOnN0cmluZyA9IFwiV2luZG93QW5tb1R5cGVfcmVtb3Zlc2NhbGVNYXhUb01pblwiO1xyXG5cclxuICAgIFxyXG59IiwiaW1wb3J0IERlYnVnZXIgZnJvbSBcIi4uL0RlYnVnZXJcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uLy4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4uL2V2ZW50cy9FdmVudFV0aWxzXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVIdHRwcyBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTpHYW1lSHR0cHM7XHJcbiAgICBwcml2YXRlIGhyOkxheWEuSHR0cFJlcXVlc3Q7XHJcbiAgICBwcml2YXRlIF9jYWxsYmFja0xpc3Q6QXJyYXk8YW55PjtcclxuICAgIHByaXZhdGUgX2lzcmVxdWVzdGluZzpib29sZWFuID0gZmFsc2U7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOkdhbWVIdHRwc1xyXG4gICAge1xyXG4gICAgICAgIGlmKCBudWxsID09IHRoaXMuX2luc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IEdhbWVIdHRwcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy5ociA9IG5ldyBMYXlhLkh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgLy8gaWYodGhpcy5oci5odHRwKVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5oci5odHRwLnRpbWVvdXQgPSA1MDAwOy8v6K6+572u6LaF5pe25pe26Ze077ybXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIHRoaXMuaHIub24oIExheWEuRXZlbnQuUFJPR1JFU1MsdGhpcyx0aGlzLm9uSHR0cFJlcXVlc3RQcm9ncmVzcyApO1xyXG4gICAgICAgIHRoaXMuaHIub24oTGF5YS5FdmVudC5DT01QTEVURSwgdGhpcywgdGhpcy5vbkh0dHBSZXF1ZXN0Q29tcGxldGUpO1xyXG4gICAgICAgIHRoaXMuaHIub24oTGF5YS5FdmVudC5FUlJPUiwgdGhpcywgdGhpcy5vbkh0dHBSZXF1ZXN0RXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZW5kUG9zdChhY3Q6c3RyaW5nLCBkYXRhOmFueSxjYWxsYmFjazpGdW5jdGlvbiwgY2FsbGJhY2tvYmo6YW55LGlzU2hvd1dhaXQ6Ym9vbGVhbiA9IGZhbHNlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtZGF0YTphbnkgPSB7fTtcclxuICAgICAgICBpdGVtZGF0YS5hY3QgPSBhY3Q7XHJcbiAgICAgICAgaXRlbWRhdGEuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgaXRlbWRhdGEuY2FsbGJhY2sgPSBjYWxsYmFjaztcclxuICAgICAgICBpdGVtZGF0YS5jYWxsYmFja29iaiA9IGNhbGxiYWNrb2JqO1xyXG4gICAgICAgIGl0ZW1kYXRhLmlzU2hvd1dhaXQgPSBpc1Nob3dXYWl0O1xyXG4gICAgICAgIGl0ZW1kYXRhLnNlbmR0eXBlID0gXCJwb3N0XCI7XHJcbiAgICAgICAgaXRlbWRhdGEuaHR0cHVybCA9IEdsb2JhbC5odHRwdXJsO1xyXG4gICAgICAgIHRoaXMuX2NhbGxiYWNrTGlzdC5wdXNoKCBpdGVtZGF0YSApO1xyXG4gICAgICAgIHRoaXMuc2VuZEJ5UG9zdCggYWN0LGRhdGEsY2FsbGJhY2ssY2FsbGJhY2tvYmosaXNTaG93V2FpdCApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZW5kYnlIdHRwdXJsKCB1cmw6c3RyaW5nLGFjdDpzdHJpbmcsIGRhdGE6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLCBjYWxsYmFja29iajphbnksaXNTaG93V2FpdDpib29sZWFuID0gZmFsc2UgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGl0ZW1kYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGl0ZW1kYXRhLmFjdCA9IGFjdDtcclxuICAgICAgICBpdGVtZGF0YS5kYXRhID0gZGF0YTtcclxuICAgICAgICBpdGVtZGF0YS5jYWxsYmFjayA9IGNhbGxiYWNrO1xyXG4gICAgICAgIGl0ZW1kYXRhLmNhbGxiYWNrb2JqID0gY2FsbGJhY2tvYmo7XHJcbiAgICAgICAgaXRlbWRhdGEuaXNTaG93V2FpdCA9IGlzU2hvd1dhaXQ7XHJcbiAgICAgICAgaXRlbWRhdGEuc2VuZHR5cGUgPSBcImdldFwiO1xyXG4gICAgICAgIGl0ZW1kYXRhLmh0dHB1cmwgPSB1cmw7XHJcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tMaXN0LnB1c2goIGl0ZW1kYXRhICk7XHJcbiAgICAgICAgdGhpcy5zZW5kYnlnZXQoIGFjdCxkYXRhLGNhbGxiYWNrLGNhbGxiYWNrb2JqLGlzU2hvd1dhaXQgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbmRCeVBvc3QoYWN0OnN0cmluZywgZGF0YTphbnksY2FsbGJhY2tvYmo6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLGlzU2hvd1dhaXQ6Ym9vbGVhbiA9IGZhbHNlKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzcmVxdWVzdGluZyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzcmVxdWVzdGluZyA9IHRydWU7XHJcbiAgICAgICAgaWYoIGlzU2hvd1dhaXQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5zaG93TW9kYWxXYWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIERlYnVnZXIubG9nKCBcImh0dHA6XCIrIEdsb2JhbC5odHRwdXJsICsgYWN0LGRhdGEgKTtcclxuICAgICAgICB0aGlzLmhyLnNlbmQoR2xvYmFsLmh0dHB1cmwgKyBhY3QsZGF0YSxcInBvc3RcIixcImpzb25cIixbXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCJdKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VuZEdldChhY3Q6YW55PW51bGwsIGRhdGE6YW55PW51bGwsY2FsbGJhY2tvYmo6YW55PW51bGwsY2FsbGJhY2s6RnVuY3Rpb249bnVsbCxpc1Nob3dXYWl0OmJvb2xlYW4gPSB0cnVlKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGl0ZW1kYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGl0ZW1kYXRhLmFjdCA9IGFjdDtcclxuICAgICAgICBpdGVtZGF0YS5kYXRhID0gZGF0YTtcclxuICAgICAgICBpdGVtZGF0YS5jYWxsYmFjayA9IGNhbGxiYWNrO1xyXG4gICAgICAgIGl0ZW1kYXRhLmNhbGxiYWNrb2JqID0gY2FsbGJhY2tvYmo7XHJcbiAgICAgICAgaXRlbWRhdGEuaXNTaG93V2FpdCA9IGlzU2hvd1dhaXQ7XHJcbiAgICAgICAgaXRlbWRhdGEuc2VuZHR5cGUgPSBcImdldFwiO1xyXG4gICAgICAgIGl0ZW1kYXRhLmh0dHB1cmwgPSBHbG9iYWwuaHR0cHVybDtcclxuICAgICAgICB0aGlzLl9jYWxsYmFja0xpc3QucHVzaCggaXRlbWRhdGEgKTtcclxuICAgICAgICB0aGlzLnNlbmRieWdldCggYWN0LGRhdGEsY2FsbGJhY2ssY2FsbGJhY2tvYmosaXNTaG93V2FpdCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2VuZGJ5Z2V0KGFjdDphbnk9bnVsbCwgZGF0YTphbnk9bnVsbCxjYWxsYmFjazpGdW5jdGlvbj1udWxsLCBjYWxsYmFja29iajphbnk9bnVsbCxpc1Nob3dXYWl0OmJvb2xlYW4gPSBmYWxzZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5faXNyZXF1ZXN0aW5nIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIGlzU2hvd1dhaXQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5zaG93TW9kYWxXYWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpdGVtRGF0YTphbnkgPSB0aGlzLl9jYWxsYmFja0xpc3RbMF07XHJcbiAgICAgICAgdmFyIHNlbmR1cmw6c3RyaW5nID0gXCJcIjtcclxuICAgICAgICBpZiggZGF0YSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhLkFDVElPTiA9IGFjdDtcclxuICAgICAgICAgICAgc2VuZHVybCA9IGl0ZW1EYXRhLmh0dHB1cmwgKyBcInJlcXVlc3Q/anNvbj1cIiArIEpTT04uc3RyaW5naWZ5KCBkYXRhICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNlbmR1cmwgPSBpdGVtRGF0YS5odHRwdXJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCJHYW1lSHR0cDpzZW5kOlwiLCBzZW5kdXJsICk7XHJcbiAgICAgICAgdGhpcy5oci5zZW5kKHNlbmR1cmwsbnVsbCxcImdldFwiLFwidGV4dFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RFcnJvcihlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCIqKioqKioqKm9uSHR0cFJlcXVlc3RFcnJvcioqKioqKioqXCIgKTtcclxuICAgICAgICBpZihlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRGVidWdlci5sb2coIGUgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5jbG9zZU1vZGFsV2FpdCgpO1xyXG4gICAgICAgIHRoaXMuX2lzcmVxdWVzdGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25IdHRwUmVxdWVzdFByb2dyZXNzKGU6IGFueSk6IHZvaWQge1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25IdHRwUmVxdWVzdENvbXBsZXRlKGU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuY2xvc2VNb2RhbFdhaXQoKTtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyhcImh0dHBSZWNlaXZlOlwiLHRoaXMuaHIuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5faXNyZXF1ZXN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYoIHRoaXMuX2NhbGxiYWNrTGlzdC5sZW5ndGggPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtRGF0YTphbnkgPSB0aGlzLl9jYWxsYmFja0xpc3Quc2hpZnQoKTtcclxuICAgICAgICAgICAgdGhpcy5jaGVja01lc3NhZ2UoKTtcclxuICAgICAgICAgICAgdmFyIGNhbGxiYWNrOkZ1bmN0aW9uID0gaXRlbURhdGEuY2FsbGJhY2s7XHJcbiAgICAgICAgICAgIHZhciBjYWxsYmFja29iajphbnkgPSBpdGVtRGF0YS5jYWxsYmFja29iajtcclxuICAgICAgICAgICAgdmFyIGRhdGE6YW55ID0gSlNPTi5wYXJzZSggdGhpcy5oci5kYXRhICk7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLmhyLmRhdGEgIT0gXCJcIiApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCBkYXRhLmhhc093blByb3BlcnR5KCBcIkFDVElPTkNPTVwiICkgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCBkYXRhLkFDVElPTkNPTT09MCApLy9zdWNjZWVkXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FsbGJhY2sgJiYgY2FsbGJhY2tvYmogKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKCBjYWxsYmFja29iaixkYXRhLkpTREFUQSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UvL2ZhaWxkXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja01lc3NhZ2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2NhbGxiYWNrTGlzdC5sZW5ndGggPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBuZXh0SXRlbURhdGE6YW55ID0gdGhpcy5fY2FsbGJhY2tMaXN0WzBdO1xyXG4gICAgICAgICAgICBpZiggbmV4dEl0ZW1EYXRhLnNlbmR0eXBlID09IFwicG9zdFwiIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQnlQb3N0KCBuZXh0SXRlbURhdGEuYWN0LG5leHRJdGVtRGF0YS5kYXRhLG5leHRJdGVtRGF0YS5jYWxsYmFjayxuZXh0SXRlbURhdGEuY2FsbGJhY2tvYmosbmV4dEl0ZW1EYXRhLmlzU2hvd1dhaXQgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VuZGJ5Z2V0KCBuZXh0SXRlbURhdGEuYWN0LG5leHRJdGVtRGF0YS5kYXRhLG5leHRJdGVtRGF0YS5jYWxsYmFjayxuZXh0SXRlbURhdGEuY2FsbGJhY2tvYmosbmV4dEl0ZW1EYXRhLmlzU2hvd1dhaXQgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vZXZlbnRzL0V2ZW50VXRpbHNcIjtcclxuaW1wb3J0IERlYnVnZXIgZnJvbSBcIi4uL0RlYnVnZXJcIjtcclxuaW1wb3J0IFRvbmdqaUh0dHBzIGZyb20gXCIuL1RvbmdqaUh0dHBzXCI7XHJcbmltcG9ydCBTb2NrZXROb2ZpZnkgZnJvbSBcIi4uL25vdGlmaWNhdGlvbi9Tb2NrZXROb2ZpZnlcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVTb2NrZXRcclxue1xyXG4gICAgcHJpdmF0ZSBzb2NrOiBMYXlhLlNvY2tldDtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IEdhbWVTb2NrZXQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAxOuiHquWKqOaWree6v++8jDLvvJrkuLvliqjmlq3nur9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfb2ZmbGluZXN0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmlq3nur/ph43ov57mrKHmlbBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfY29ubmV0TnVtczpudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogc29ja2V06L+e5o6l5LitXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3NvY2tldGNvbm5ldGluZzpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBHYW1lU29ja2V0IHtcclxuICAgICAgICBpZiAodGhpcy5faW5zdGFuY2UgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBHYW1lU29ja2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvL+i/nuaOpeacjeWKoeWZqFxyXG4gICAgcHVibGljIGNvbm5lY3RTZXJ2ZXIoZ2FtZUhvc3Q6c3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fc29ja2V0Y29ubmV0aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlbW92ZVNvY2tldCgpO1xyXG4gICAgICAgIGlmICghdGhpcy5zb2NrIHx8ICF0aGlzLnNvY2suY29ubmVjdGVkKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMub3BlbndhaXRwYW5lbCgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc29jaykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrID0gbmV3IExheWEuU29ja2V0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2sub24oTGF5YS5FdmVudC5PUEVOLCB0aGlzLCB0aGlzLm9uU29ja2V0T3Blbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2sub24oTGF5YS5FdmVudC5NRVNTQUdFLCB0aGlzLCB0aGlzLm9uUmVjZWl2ZU1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrLm9uKExheWEuRXZlbnQuQ0xPU0UsIHRoaXMsIHRoaXMub25Tb2NrZXRDbG9zZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2sub24oTGF5YS5FdmVudC5FUlJPUiwgdGhpcywgdGhpcy5pb0Vycm8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIERlYnVnZXIubG9nKFwi5byA5aeL6L+e5o6lc29ja2V0OlwiICsgZ2FtZUhvc3QpO1xyXG4gICAgICAgICAgICB0aGlzLnNvY2suY29ubmVjdEJ5VXJsKGdhbWVIb3N0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzQ29ubmVjdCgpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5zb2NrICYmIHRoaXMuc29jay5jb25uZWN0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlvRXJybyhlOiBhbnkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgRGVidWdlci5sb2coXCJnYW1lc29ja2V0SU9FcnJvckV2ZW50OlwiICsgZS50eXBlKTtcclxuICAgICAgICB0aGlzLl9zb2NrZXRjb25uZXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9jb25uZXROdW1zKys7XHJcbiAgICAgICAgdGhpcy5jbG9zZXdhaXRwYW5lbCgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlU29ja2V0KCk7XHJcbiAgICAgICAgdGhpcy5fb2ZmbGluZXN0YXRlPTE7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW1vdmVTb2NrZXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fc29ja2V0Y29ubmV0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYodGhpcy5zb2NrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zb2NrLm9mZihMYXlhLkV2ZW50Lk9QRU4sIHRoaXMsIHRoaXMub25Tb2NrZXRPcGVuKTtcclxuICAgICAgICAgICAgdGhpcy5zb2NrLm9mZihMYXlhLkV2ZW50Lk1FU1NBR0UsIHRoaXMsIHRoaXMub25SZWNlaXZlTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc29jay5vZmYoTGF5YS5FdmVudC5DTE9TRSwgdGhpcywgdGhpcy5vblNvY2tldENsb3NlKTtcclxuICAgICAgICAgICAgdGhpcy5zb2NrLm9mZihMYXlhLkV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLmlvRXJybyk7XHJcbiAgICAgICAgICAgIHRoaXMuc29jay5jbGVhblNvY2tldCgpO1xyXG4gICAgICAgICAgICB0aGlzLnNvY2suY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5zb2NrID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmiYvliqjlhbPpl63muLjmiI9zb2NrZXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbHNlU29ja2V0KCBvZmZsaW5lc3RhdGU6bnVtYmVyID0gMSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5pc0Nvbm5lY3QoKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3Nld2FpdHBhbmVsKCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU29ja2V0KCk7XHJcbiAgICAgICAgICAgIGlmKCBvZmZsaW5lc3RhdGUgIT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZsaW5lc3RhdGU9IG9mZmxpbmVzdGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIFNvY2tldE5vZmlmeS5TT0NLRVRfQ0xPU0UgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblNvY2tldENsb3NlKGU6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zb2NrZXRjb25uZXRpbmcgPSBmYWxzZTtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCJzb2NrZXQg5YWz6ZetXCIgKTtcclxuICAgICAgICB0aGlzLmNsb3Nld2FpdHBhbmVsKCk7XHJcbiAgICAgICAgdGhpcy5fb2ZmbGluZXN0YXRlPTE7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBTb2NrZXROb2ZpZnkuU09DS0VUX0NMT1NFICk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgY2xvc2V3YWl0cGFuZWwoKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvcGVud2FpdHBhbmVsKCk6IHZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5zaG93TW9kYWxXYWl0KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8v6L+e5o6l5oiQ5Yqf6L+U5ZueXHJcbiAgICBwcml2YXRlIG9uU29ja2V0T3BlbihldmVudDogYW55ID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2Nvbm5ldE51bXMgPSAwO1xyXG4gICAgICAgIHRoaXMuY2xvc2V3YWl0cGFuZWwoKTtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCJzb2NrZXQg6L+e5o6l5oiQ5YqfXCIgKTtcclxuICAgICAgICB0aGlzLl9vZmZsaW5lc3RhdGUgPSAwO1xyXG4gICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudChTb2NrZXROb2ZpZnkuU09DS0VUX0NPTk5FQ1RfU1VDQ0VFRCwgbnVsbCwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5ZCR5pyN5Yqh56uv5Y+R6YCB5raI5oGvXHJcbiAgICBwdWJsaWMgc2VuZE1lc3NhZ2UoYWN0OiBzdHJpbmcsIGRhdGE6IGFueSwgaXNTaG93V2FpdDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBpZiggdGhpcy5zb2NrICYmIHRoaXMuc29jay5jb25uZWN0ZWQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIGlzU2hvd1dhaXQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW53YWl0cGFuZWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggIWRhdGEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkYXRhPXt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRhdGEuQUNUSU9OID0gYWN0O1xyXG4gICAgICAgICAgICB0aGlzLnNvY2suc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgICAgIERlYnVnZXIubG9nKFwic29ja2V0IHNlbmQ6XCIgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIERlYnVnZXIubG9nKFwi5b2T5YmNc29ja2V05pyq6L+e5o6lXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL+a2iOaBr+i/lOWbnuWQju+8jOS8muW5v+aSreWHuuWOu1xyXG4gICAgLy9HbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIuS9oOWPkemAgeeahGNtZOWQjeensFwiLOebkeWQrOaWueazlSx0aGlzKVxyXG4gICAgcHJpdmF0ZSBvblJlY2VpdmVNZXNzYWdlKG1zZzogYW55ID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHZhciBzb2NrZXRkYXRhOiBhbnkgPSBKU09OLnBhcnNlKG1zZyk7XHJcbiAgICAgICAgRGVidWdlci5sb2coIFwic29ja2V0IHJlY2VpdmU6XCIsIHNvY2tldGRhdGEgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi8uLi9HbG9iYWxcIjtcclxuaW1wb3J0IFBsYXRmcm9tVHlwZSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vUGxhdGZyb21UeXBlXCI7XHJcbmltcG9ydCBQbGF0Zm9ybUV2ZW50IGZyb20gXCIuLi8uLi9wbGF0Zm9ybS9ldmVudHMvUGxhdGZvcm1FdmVudFwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb25namlIdHRwcyBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTpUb25namlIdHRwcztcclxuICAgIHByaXZhdGUgaHI6TGF5YS5IdHRwUmVxdWVzdDtcclxuICAgIHByaXZhdGUgX2lzY2FuU2VuZDpib29sZWFuPXRydWU7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOlRvbmdqaUh0dHBzXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIG51bGwgPT0gdGhpcy5faW5zdGFuY2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgVG9uZ2ppSHR0cHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaHIgPSBuZXcgTGF5YS5IdHRwUmVxdWVzdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZW5kKCBhY3Q6c3RyaW5nLGRhdGE6YW55PW51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzY2FuU2VuZCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRieWdldChhY3QsIGRhdGEgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRvbmdqaURhdGEoIFRJRDI6c3RyaW5nLFRJRDM6c3RyaW5nID0gXCJcIixOdW06bnVtYmVyID0gMCxUb3RhbDpudW1iZXI9MCxEYXRhczpzdHJpbmcgPSBcIlwiICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kVG9uZ2ppRGF0YShQbGF0Zm9ybUV2ZW50Lm1lc3NhZ2VfOTg5MTAwMixUSUQyLFRJRDMsTnVtLFRvdGFsLERhdGFzICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbmRUb25namlEYXRhKCBhY3Q6c3RyaW5nLFRJRDI6c3RyaW5nLFRJRDM6c3RyaW5nLCBOdW06bnVtYmVyID0gMCxUb3RhbDpudW1iZXIsRGF0YXM6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtZDphbnkgPSB7fTtcclxuICAgICAgICBpdGVtZC5USUQyID0gVElEMjtcclxuICAgICAgICBpdGVtZC5USUQzID0gVElEMztcclxuICAgICAgICBpdGVtZC5OdW0gPSBNYXRoLmZsb29yKE51bSk7XHJcbiAgICAgICAgaXRlbWQuVG90YWwgPSBUb3RhbDtcclxuICAgICAgICBpdGVtZC5EYXRhcyA9IERhdGFzO1xyXG4gICAgICAgIGl0ZW1kLk1FTUJFUklEID0gR2xvYmFsLk1lbWJlcklEO1xyXG4gICAgICAgIGl0ZW1kLkFwcEtleUlEID0gR2xvYmFsLkFwcEtleUlEO1xyXG4gICAgICAgIHRoaXMuc2VuZGJ5Z2V0KGFjdCxpdGVtZCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2VuZGJ5Z2V0KGFjdDpzdHJpbmcsZGF0YTphbnk9bnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggZGF0YSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc2VuZHVybDpzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgICBkYXRhLkFDVElPTiA9IGFjdDtcclxuICAgICAgICAgICAgc2VuZHVybCA9IEdsb2JhbC5odHRwdXJsICsgXCJyZXF1ZXN0P2pzb249XCIgKyBKU09OLnN0cmluZ2lmeSggZGF0YSApO1xyXG4gICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCIqKipzZW5kdG9uZ2ppKioqOlwiLCBzZW5kdXJsICk7XHJcbiAgICAgICAgICAgIHRoaXMuaHIuc2VuZChzZW5kdXJsLG51bGwsXCJnZXRcIixcInRleHRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqXHJcbiAqIEBhdXRob3IgXHJcbiAqXHJcbiAqL1xyXG5leHBvcnQgbW9kdWxlIExheWVyTm90aWZ5IHtcclxuICAgIC8qKlxyXG4gICAgICog6IOM5pmv5bGCXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB2YXIgTEFZRVJfQkFDS0dST1VORDogc3RyaW5nID0gXCJMQVlFUl9CQUNLR1JPVU5EXCI7XHJcbiAgICAvKipcclxuICAgICAqIHVp5bGCXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB2YXIgTEFZRVJfVUlMQVlFUjogc3RyaW5nID0gXCJMQVlFUl9VSUxBWUVSXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB1aeWxguS4iuWxglxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdmFyIExBWUVSX1VQVUlMQVlFUjogc3RyaW5nID0gXCJMQVlFUl9VUFVJTEFZRVJcIjtcclxuICAgIC8qKlxyXG4gICAgICogdGlwc+WxglxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdmFyIExBWUVSX1RJUFNMQVlFUjogc3RyaW5nID0gXCJMQVlFUl9USVBTTEFZRVJcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaWsOaJi+W8leWvvOWxglxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdmFyIExBWUVSX0dVSURFTEFZRVI6c3RyaW5nID0gXCJMQVlFUl9HVUlERUxBWUVSXCI7XHJcblxyXG59XHJcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvY2tldE5vZmlmeVxyXG57ICAgXHJcbiAgICAvKipcclxuICAgICAqIHNvY2tldOi/nuaOpeaIkOWKn1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgU09DS0VUX0NPTk5FQ1RfU1VDQ0VFRDpzdHJpbmcgPSBcIlNPQ0tFVF9DT05ORUNUX1NVQ0NFRURcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIHNvY2tldOWFs+mXrVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgU09DS0VUX0NMT1NFOnN0cmluZyA9IFwiU09DS0VUX0NMT1NFXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuLjmiI/ph43mlrDov57mjqVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIEdhbWVfYWdhaW5Db25uZXRTb2NrZXQ6c3RyaW5nID0gXCJHYW1lX2FnYWluQ29ubmV0U29ja2V0XCI7XHJcbn0iLCJpbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vRGVidWdlclwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgQmFzZVZPIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRJbmZvKCBkYXRhOmFueSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggZGF0YSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IoIHZhciBzIGluIGRhdGEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbWQ6YW55ID0gdGhpc1tzXTtcclxuICAgICAgICAgICAgICAgIGlmKCBpdGVtZCAhPSBudWxsICkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tzXSA9IGRhdGFbc107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgRGVidWdlci5sb2coIFwiVk865pyq5a6a5LmJ5bGe5oCnLVwiICsgcyApO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNwYXRjaEV2ZW50KHR5cGU6IHN0cmluZywgZGF0YT86IGFueSk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZXZlbnQodHlwZSwgZGF0YSk7XHJcbiAgICB9XHJcbiAgICBcclxufSIsImltcG9ydCBPYmplY3RQb29sIGZyb20gXCIuLi9tdmMvT2JqZWN0UG9vbFwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYWNoZVZPIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxueyAgIFxyXG4gICAgc3RhdGljIHBvb2xrZXk6c3RyaW5nID0gXCJDYWNoZVZPXCI7XHJcbiAgICAvKipcclxuICAgICAqIOW8leeUqOasoeaVsFxyXG4gICAgICovXHJcbiAgICByZWY6bnVtYmVyID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOacgOWQjuS4gOasoeiiq+W8leeUqOeahOaXtumXtFxyXG4gICAgICovXHJcbiAgICB0aW1lOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDljIXlkI1cclxuICAgICAqL1xyXG4gICAgcGFja2FnZU5hbWU6c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBwdWJsaWMgY2xlYXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZWYgPSAwO1xyXG4gICAgICAgIHRoaXMudGltZSA9IDA7XHJcbiAgICAgICAgdGhpcy5wYWNrYWdlTmFtZSA9IFwiXCI7XHJcbiAgICAgICAgT2JqZWN0UG9vbC5jbGVhck9iaiggQ2FjaGVWTy5wb29sa2V5LHRoaXMgKTtcclxuICAgIH1cclxufSIsIlxyXG5leHBvcnQgY2xhc3MgSm95c3RpY2tNb2R1bGUgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlciB7XHJcbiAgICBwcml2YXRlIF9Jbml0WDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfSW5pdFk6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX3N0YXJ0U3RhZ2VYOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9zdGFydFN0YWdlWTogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfbGFzdFN0YWdlWDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfbGFzdFN0YWdlWTogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfYnV0dG9uOkxheWEuUG9pbnQ7XHJcbiAgICBwcml2YXRlIHRvdWNoSWQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX2N1clBvczogTGF5YS5Qb2ludDtcclxuICAgIC8vIHByaXZhdGUgX2NlbnRlcjpmYWlyeWd1aS5HSW1hZ2U7XHJcbiAgICBcclxuICAgIHB1YmxpYyBzdGF0aWMgSm95c3RpY2tNb3Zpbmc6IHN0cmluZyA9IFwiSm95c3RpY2tNb3ZpbmdcIjtcclxuICAgIHB1YmxpYyBzdGF0aWMgSm95c3RpY2tVcDogc3RyaW5nID0gXCJKb3lzdGlja1VwXCI7XHJcblxyXG4gICAgcHVibGljIHJhZGl1czogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfY2xpY2twYW5lbDpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgcHVibGljIGRpczpudW1iZXIgPSAwOyBcclxuICAgIHB1YmxpYyBkZWdyZWU6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBhbmdsZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBvZmZ4Om51bWJlciA9IDA7XHJcblxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihjbGlja3BhbmVsOmZhaXJ5Z3VpLkdMb2FkZXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrcGFuZWwgPSBjbGlja3BhbmVsO1xyXG4gICAgICAgIHRoaXMuX2J1dHRvbiA9IG5ldyBMYXlhLlBvaW50KCk7XHJcbiAgICAgICAgdGhpcy50b3VjaElkID0gLTE7XHJcbiAgICAgICAgdGhpcy5yYWRpdXMgPSA0MDA7XHJcbiAgICAgICAgdGhpcy5fY3VyUG9zID0gbmV3IExheWEuUG9pbnQoKTtcclxuICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9uKExheWEuRXZlbnQuTU9VU0VfRE9XTix0aGlzLCB0aGlzLm9uVG91Y2hEb3duKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfY2FsbG9iajphbnk7XHJcbiAgICBwcml2YXRlIF9tb3ZlY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwcml2YXRlIF91cGRhdGVjYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHByaXZhdGUgX2Rvd25DYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBzZXRFdmVudENhbGxiYWNrKCBjYWxsb2JqOmFueSxkb3duQ2FsbGJhY2ssbW92ZWNhbGxiYWNrOkZ1bmN0aW9uLHVwY2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fY2FsbG9iaiA9IGNhbGxvYmo7XHJcbiAgICAgICAgdGhpcy5fZG93bkNhbGxiYWNrID0gZG93bkNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuX21vdmVjYWxsYmFjayA9IG1vdmVjYWxsYmFjaztcclxuICAgICAgICB0aGlzLl91cGRhdGVjYWxsYmFjayA9IHVwY2FsbGJhY2s7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFRyaWdnZXIoZXZ0OiBMYXlhLkV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vblRvdWNoRG93bihldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2lzY2FuQ0JhY2s6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBvblRvdWNoRG93bihldnQ6IExheWEuRXZlbnQpIHtcclxuICAgICAgICBpZih0aGlzLnRvdWNoSWQgPT0gLTEpIHsvL0ZpcnN0IHRvdWNoXHJcbiAgICAgICAgICAgIHRoaXMudG91Y2hJZCA9IGV2dC50b3VjaElkO1xyXG4gICAgICAgICAgICB0aGlzLm9mZnggPSAwO1xyXG4gICAgICAgICAgICB0aGlzLl9pc2NhbkNCYWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuZ2xvYmFsVG9Mb2NhbChMYXlhLnN0YWdlLm1vdXNlWCwgTGF5YS5zdGFnZS5tb3VzZVksdGhpcy5fY3VyUG9zKTtcclxuICAgICAgICAgICAgdmFyIGJ4OiBudW1iZXIgPSB0aGlzLl9jdXJQb3MueDtcclxuICAgICAgICAgICAgdmFyIGJ5OiBudW1iZXIgPSB0aGlzLl9jdXJQb3MueTtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdFN0YWdlWCA9IGJ4O1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0U3RhZ2VZID0gYnk7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U3RhZ2VYID0gYng7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U3RhZ2VZID0gYnk7XHJcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbi54ID0gYng7XHJcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbi55ID0gYnk7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9jYWxsb2JqICYmIHRoaXMuX2Rvd25DYWxsYmFjayApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Rvd25DYWxsYmFjay5jYWxsKCB0aGlzLl9jYWxsb2JqICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vbihMYXlhLkV2ZW50Lk1PVVNFX01PVkUsdGhpcyx0aGlzLk9uVG91Y2hNb3ZlKTtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vbihMYXlhLkV2ZW50Lk1PVVNFX1VQLHRoaXMsdGhpcy5PblRvdWNoVXApO1xyXG4gICAgICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9uKCBMYXlhLkV2ZW50Lk1PVVNFX09VVCx0aGlzLHRoaXMuT25Ub3VjaFVwICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgT25Ub3VjaFVwKGV2dDpMYXlhLkV2ZW50PW51bGwpOiB2b2lkIHtcclxuICAgICAgICBpZih0aGlzLnRvdWNoSWQgIT0gLTEgJiYgZXZ0LnRvdWNoSWQgPT0gdGhpcy50b3VjaElkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG91Y2h1cCgpO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fY2FsbG9iaiAmJiB0aGlzLl91cGRhdGVjYWxsYmFjayApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWNhbGxiYWNrLmNhbGwoIHRoaXMuX2NhbGxvYmogKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pYWNhbkNhbGxiYWNrOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyB0b3VjaHVwKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzY2FuQ0JhY2sgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRvdWNoSWQgPSAtMTtcclxuICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9mZihMYXlhLkV2ZW50Lk1PVVNFX01PVkUsdGhpcyx0aGlzLk9uVG91Y2hNb3ZlKTtcclxuICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9mZihMYXlhLkV2ZW50Lk1PVVNFX1VQLHRoaXMsdGhpcy5PblRvdWNoVXApO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrcGFuZWwub2ZmKCBMYXlhLkV2ZW50Lk1PVVNFX09VVCx0aGlzLHRoaXMuT25Ub3VjaFVwICk7XHJcbiAgICAgICAgdGhpcy5faWFjYW5DYWxsYmFjayA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZGVncmVlID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIE9uVG91Y2hNb3ZlKGV2dDogTGF5YS5FdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmKHRoaXMudG91Y2hJZCAhPSAtMSAmJiBldnQudG91Y2hJZCA9PSB0aGlzLnRvdWNoSWQpIHtcclxuICAgICAgICAgICAgdmFyIGJ4OiBudW1iZXIgPSBMYXlhLnN0YWdlLm1vdXNlWDtcclxuICAgICAgICAgICAgdmFyIGJ5OiBudW1iZXIgPSBMYXlhLnN0YWdlLm1vdXNlWTtcclxuICAgICAgICAgICAgdmFyIG1vdmVYOiBudW1iZXIgPSBieCAtIHRoaXMuX2xhc3RTdGFnZVg7XHJcbiAgICAgICAgICAgIHZhciBtb3ZlWTogbnVtYmVyID0gYnkgLSB0aGlzLl9sYXN0U3RhZ2VZO1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0U3RhZ2VYID0gYng7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTdGFnZVkgPSBieTtcclxuICAgICAgICAgICAgdmFyIGJ1dHRvblg6IG51bWJlciA9IHRoaXMuX2J1dHRvbi54ICsgbW92ZVg7XHJcbiAgICAgICAgICAgIHZhciBidXR0b25ZOiBudW1iZXIgPSB0aGlzLl9idXR0b24ueSArIG1vdmVZO1xyXG5cclxuICAgICAgICAgICAgdmFyIG9mZnNldFg6IG51bWJlciA9IGJ1dHRvblggLSB0aGlzLl9zdGFydFN0YWdlWDtcclxuICAgICAgICAgICAgdmFyIG9mZnNldFk6IG51bWJlciA9IGJ1dHRvblkgLSB0aGlzLl9zdGFydFN0YWdlWTtcclxuICAgICAgICAgICAgdmFyIGRpc1g6bnVtYmVyID0gMDtcclxuICAgICAgICAgICAgaWYoIG1vdmVYID49IDIgfHwgbW92ZVggPD0gLTIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc2NhbkNCYWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzY2FuQ0JhY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm9mZnggPSBtb3ZlWDtcclxuICAgICAgICAgICAgaWYoIG9mZnNldFggPT0gMCAmJiBvZmZzZXRZID09IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIG9mZnNldFggPiAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIG9mZnNldFggPiB0aGlzLnJhZGl1cyApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzWCA9IHRoaXMucmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5nbGUgPSA5MDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNYID0gdGhpcy5yYWRpdXMgLSBvZmZzZXRYO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5nbGUgPSA5MCAtIGRpc1gvdGhpcy5yYWRpdXMgKiA5MDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKCBvZmZzZXRYID09IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFuZ2xlID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCAtb2Zmc2V0WCA+IHRoaXMucmFkaXVzIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNYID0gdGhpcy5yYWRpdXM7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmdsZSA9IC05MDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNYID0gdGhpcy5yYWRpdXMgKyBvZmZzZXRYO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5nbGUgPSAtKDkwLWRpc1gvdGhpcy5yYWRpdXMgKiA5MCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHJhZDogbnVtYmVyID0gTWF0aC5hdGFuMihvZmZzZXRZLG9mZnNldFgpO1xyXG4gICAgICAgICAgICB0aGlzLmRlZ3JlZSA9IHJhZDtcclxuICAgICAgICAgICAgdmFyIG1heFg6IG51bWJlciA9IHRoaXMucmFkaXVzICogTWF0aC5jb3MocmFkKTtcclxuICAgICAgICAgICAgdmFyIG1heFk6IG51bWJlciA9IHRoaXMucmFkaXVzICogTWF0aC5zaW4ocmFkKTtcclxuICAgICAgICAgICAgaWYoTWF0aC5hYnMob2Zmc2V0WCkgPiBNYXRoLmFicyhtYXhYKSlcclxuICAgICAgICAgICAgICAgIG9mZnNldFggPSBtYXhYO1xyXG4gICAgICAgICAgICBpZihNYXRoLmFicyhvZmZzZXRZKSA+IE1hdGguYWJzKG1heFkpKVxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0WSA9IG1heFk7XHJcbiAgICAgICAgICAgIGJ1dHRvblggPSB0aGlzLl9zdGFydFN0YWdlWCArIG9mZnNldFg7XHJcbiAgICAgICAgICAgIGJ1dHRvblkgPSB0aGlzLl9zdGFydFN0YWdlWSArIG9mZnNldFk7XHJcbiAgICAgICAgICAgIGlmKGJ1dHRvblggPCAwKVxyXG4gICAgICAgICAgICAgICAgYnV0dG9uWCA9IDA7XHJcbiAgICAgICAgICAgIGlmKGJ1dHRvblkgPiBmYWlyeWd1aS5HUm9vdC5pbnN0LmhlaWdodClcclxuICAgICAgICAgICAgICAgIGJ1dHRvblkgPSBmYWlyeWd1aS5HUm9vdC5pbnN0LmhlaWdodDtcclxuICAgICAgICAgICAgdGhpcy5fYnV0dG9uLnggPSBidXR0b25YO1xyXG4gICAgICAgICAgICB0aGlzLl9idXR0b24ueSA9IGJ1dHRvblk7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzID0gTWF0aC5zcXJ0KCBvZmZzZXRYKm9mZnNldFggKyBvZmZzZXRZKm9mZnNldFkgKTtcclxuICAgICAgICAgICAgdGhpcy5faWFjYW5DYWxsYmFjayA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9pc2NhbkNCYWNrICYmIHRoaXMuX2NhbGxvYmogJiYgdGhpcy5fbW92ZWNhbGxiYWNrICYmIHRoaXMuX2lhY2FuQ2FsbGJhY2sgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlY2FsbGJhY2suY2FsbCggdGhpcy5fY2FsbG9iaix0aGlzLm9mZnggKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzcG9zZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9mZihMYXlhLkV2ZW50Lk1PVVNFX0RPV04sdGhpcywgdGhpcy5vblRvdWNoRG93bik7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgVWlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uLy4uL21hbmFnZXJzL1VpTWFuYWdlclwiO1xyXG5pbXBvcnQgTG9hZGluZ1ZpZXcgZnJvbSBcIi4uL3ZpZXcvTG9hZGluZ1ZpZXdcIjtcclxuaW1wb3J0IFBsYXRmb3JtVG9vbCBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vUGxhdGZvcm1Ub29sXCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi8uLi8uLi9mcmFtZXdvcmtzL0RlYnVnZXJcIjtcclxuaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IFJlc291cmNlTWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvUmVzb3VyY2VNYW5hZ2VyXCI7XHJcbmltcG9ydCBSZXNEYXRhTWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvUmVzRGF0YU1hbmFnZXJcIjtcclxuaW1wb3J0IFVzZXJJbmZvUHJveHkgZnJvbSBcIi4uLy4uL3VzZXJpbmZvL1VzZXJJbmZvUHJveHlcIjtcclxuaW1wb3J0IFBsYXRmb3JtRXZlbnQgZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL2V2ZW50cy9QbGF0Zm9ybUV2ZW50XCI7XHJcbmltcG9ydCBCYXNlUHJveHlzIGZyb20gXCIuLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9CYXNlUHJveHlzXCI7XHJcbmltcG9ydCBNYWluUHJveHkgZnJvbSBcIi4uLy4uL21haW4vcHJveHlzL01haW5Qcm94eVwiO1xyXG5pbXBvcnQgUm9sZUNGRyBmcm9tIFwiLi4vLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCBMZXZlbENGRyBmcm9tIFwiLi4vLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9MZXZlbENGR1wiO1xyXG5pbXBvcnQgQnVpbGRDRkcgZnJvbSBcIi4uLy4uLy4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvQnVpbGRDRkdcIjtcclxuaW1wb3J0IE5wY0NGRyBmcm9tIFwiLi4vLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9OcGNDRkdcIjtcclxuaW1wb3J0IEdhbWVDRkcgZnJvbSBcIi4uLy4uLy4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvR2FtZUNGR1wiO1xyXG5pbXBvcnQgU2tpblByb3h5IGZyb20gXCIuLi8uLi9za2lucy9wcm94eXMvU2tpblByb3h5XCI7XHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvU2RrXCI7XHJcbmltcG9ydCB7IFlRU2RrIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvWVFTZGtcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi8uLi8uLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgTmV0d29ya01hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBNYWluQ29uZmlnIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvTWFpbkNvbmZpZ1wiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vLi4vLi4vR2xvYmFsXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dpblByb3h5IGV4dGVuZHMgQmFzZVByb3h5cyBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkxvZ2luUHJveHlcIjtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuICAgIFxyXG4gICAgcHJvdGVjdGVkIGluaXRQcm94eSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggUGxhdGZvcm1FdmVudC5QbGF0Zm9ybUV2ZW50X2xvZ2luU3VjY2VlZCx0aGlzLHRoaXMubG9naW5zdWNjZWVkICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXJ0TG9naW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVWlNYW5hZ2VyLmluc3RhbmNlLmFkZCggTG9hZGluZ1ZpZXcgKTtcclxuICAgICAgICB0aGlzLmxvZ2lucHJvZ3Jlc3MoMCk7XHJcbiAgICAgICAgaWYoTGF5YS5Ccm93c2VyLm9uV2VpWGluKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5Mb2dpbllRKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMubG9naW5zdWNjZWVkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuTG9naW5Mb2NhbFNldmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFBsYXRmb3JtVG9vbC5nZXRJbnN0YW5jZSgpLmxvZ2luKCApO1xyXG4gICAgfVxyXG4gICAgTG9naW5ZUSgpXHJcbiAgICB7XHJcbiAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLlvIDlp4vlvq7kv6HnmbvlvZVcIik7XHJcbiAgICAgICAgV3hBcGkuV1hMb2dpbigocmVzKSA9PiBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBcImVycm9yXCIpIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5b6u5L+h55m75b2V5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaHBsb2dpbjpcIiArIFwicXVlcnljaGFubmVsLT5cIisgV3hBcGkucXVlcnljaGFubmVsICsgXCIgcmVmZXJyZXJJbmZvYXBwSWQtPlwiICsgV3hBcGkucmVmZXJyZXJJbmZvYXBwSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIFlRU2RrLmxvZ2luKHJlcy5jb2RlLFd4QXBpLnF1ZXJ5Y2hhbm5lbCxXeEFwaS5yZWZlcnJlckluZm9hcHBJZCwoKT0+XHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uSGlkZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUVNkay5leHBvc3VyZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Mb2dpbkxvY2FsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5b6u5L+h55m75b2V5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuTG9naW5ZUSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBMb2dpbkxvY2FsKClcclxuICAgIHtcclxuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuW8gOWni+eZu+W9lVwiKTtcclxuICAgICAgICBXeEFwaS5XWExvZ2luKChyZXMpID0+IFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHJlcyAhPSBcImVycm9yXCIpIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuW+ruS/oeeZu+W9leaIkOWKnzJcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkxvZ2luTG9jYWxTZXZlcihyZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5b6u5L+h55m75b2V5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Mb2dpbkxvY2FsKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBMb2dpbkxvY2FsU2V2ZXIocmVzID0gbnVsbCkgXHJcbiAgICB7XHJcbiAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLlvIDlp4vmnKzlnLDnmbvlvZVcIik7XHJcbiAgICAgICAgaWYocmVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmV3IFBsYXllckFjY291bnQocmVzLmNvZGUsIFwiXCIsIFwiXCIsIDAsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFd4QXBpLnNoYXJlT3BlbklkLCBXeEFwaS5zaGFyZU9wZW5JZCxHbG9iYWwuZ2FtZVZlcnNpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBOZXR3b3JrTWFuYWdlci5JbnN0YW5jZS5sb2dpbihudWxsLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuT25Mb2dpbkxvY2FsQ29tcGxldGUpLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuT25Mb2dpbkVycm9yKSk7XHJcbiAgICAgICAgLy90aGlzLkxvYWRTYnAoKTtcclxuICAgIH1cclxuXHJcbiAgICBPbkxvZ2luTG9jYWxDb21wbGV0ZSgpIFxyXG4gICAge1xyXG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5pys5Zyw5pyN5Yqh5Zmo55m75b2V5a6M5oiQLi4uXCIpO1xyXG4gICAgICAgIFd4QXBpLmFsZFNlbmRPcGVuaWQoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5vcGVuaWQpO1xyXG4gICAgICAgIHRoaXMubG9naW5zdWNjZWVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgT25Mb2dpbkVycm9yKGUpXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2dpbnByb2dyZXNzKCB2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxvYWRpbmd2aWV3OkxvYWRpbmdWaWV3ID0gVWlNYW5hZ2VyLmluc3RhbmNlLmdldFZpZXcoIExvYWRpbmdWaWV3ICk7XHJcbiAgICAgICAgaWYoIGxvYWRpbmd2aWV3IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxvYWRpbmd2aWV3LnNob3dXb3JkKCB2YWx1ZSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvZ2luc3VjY2VlZCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCLnmbvlvZXmiJDlip9cIiApO1xyXG4gICAgICAgIC8vIHRoaXMubG9hZGNvbmZpZygpO1xyXG4gICAgICAgIGlmKExheWEuQnJvd3Nlci5vbldlaVhpbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyc2VDb25maWcxKCApO1xyXG4gICAgICAgICAgICB0aGlzLmluaXREYXRhKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW50ZXJNYWluKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGNvbmZpZygpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnBhcnNlQ29uZmlnMSggKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5pbml0RGF0YSgpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmVudGVyTWFpbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOino+aekOmFjee9ruaVsOaNrlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBhcnNlQ29uZmlnMSgpOmJvb2xlYW4gXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJ5dGVEYXRhOmFueSA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQubm93Q29uZmlnLmdhbWVDb25maWdbMF0uY29uZmlnO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcIumFjee9ruihqOaVsOaNru+8mlwiLGJ5dGVEYXRhICk7XHJcbiAgICAgICAgaWYoIGJ5dGVEYXRhICYmIGJ5dGVEYXRhICE9IFwiXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gYnl0ZURhdGEuc3BsaXQoXCIlZmlsZSVcIik7XHJcbiAgICAgICAgICAgIHZhciBpOm51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgZm9yKCBpPTA7aTxudW1zO2krKyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtYXJyOkFycmF5PHN0cmluZz4gPSBhcnJbaV0uc3BsaXQoXCIlY2ZnJVwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBjbGE6IGFueSA9IExvZ2luUHJveHkuY29uZmlnQ2xhc3NbaXRlbWFyclswXV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY2xhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhLmluaXRDZmcoaXRlbWFyclsxXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyhcIuayoeacieazqOWGjOatpOexu1wiICsgaXRlbWFyclswXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWRjb25maWcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIHBhdGhBcnIucHVzaCggeyB1cmw6UGF0aENvbmZpZy5nZXRDb25maWcoXCJnYW1lQ29uZmlnXCIpLCB0eXBlOiBMYXlhLkxvYWRlci5URVhUIH0gKTtcclxuICAgICAgICBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5Mb2FkZXJzKHBhdGhBcnIsdGhpcyx0aGlzLmNvbmZpZ0NvbXBsZXRlLHRoaXMubG9naW5wcm9ncmVzcyxmYWxzZSApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29uZmlnQ29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wYXJzZUNvbmZpZygpO1xyXG4gICAgICAgIHRoaXMuaW5pdERhdGEoKTtcclxuICAgICAgICB0aGlzLmVudGVyTWFpbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5ri45oiP5pWw5o2uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdERhdGEoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgKCB0aGlzLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICkgYXMgVXNlckluZm9Qcm94eSApLmluaXQoKTtcclxuICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIFNraW5Qcm94eSApIGFzIFNraW5Qcm94eSApLmluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVudGVyTWFpbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBjb25zb2xlLmxvZyggXCLlvZPliY3phY3nva7ooajmgLvlhbPljaHvvJpcIixMZXZlbENGRy52ZWMubGVuZ3RoICk7XHJcbiAgICAgICAgKCB0aGlzLmdldFByb3h5KCBNYWluUHJveHkgKSBhcyBNYWluUHJveHkgKS5lbnRlck1haW4oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOino+aekOmFjee9ruaVsOaNrlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBhcnNlQ29uZmlnKCk6Ym9vbGVhbiBcclxuICAgIHtcclxuICAgICAgICB2YXIgYnl0ZURhdGE6c3RyaW5nID0gUmVzRGF0YU1hbmFnZXIuZ2V0SW5hc3RhbmNlKCkuZ2V0UmVzQnl1cmwoUGF0aENvbmZpZy5nZXRDb25maWcoXCJnYW1lQ29uZmlnXCIpKTtcclxuICAgICAgICBpZiggYnl0ZURhdGEgJiYgYnl0ZURhdGEgIT0gXCJcIiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBieXRlRGF0YS5zcGxpdChcIiVmaWxlJVwiKTtcclxuICAgICAgICAgICAgdmFyIGk6bnVtYmVyO1xyXG4gICAgICAgICAgICB2YXIgbnVtczpudW1iZXIgPSBhcnIubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IoIGk9MDtpPG51bXM7aSsrIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1hcnI6QXJyYXk8c3RyaW5nPiA9IGFycltpXS5zcGxpdChcIiVjZmclXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNsYTogYW55ID0gTG9naW5Qcm94eS5jb25maWdDbGFzc1tpdGVtYXJyWzBdXTtcclxuICAgICAgICAgICAgICAgIGlmIChjbGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbGEuaW5pdENmZyhpdGVtYXJyWzFdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKFwi5rKh5pyJ5rOo5YaM5q2k57G7XCIgKyBpdGVtYXJyWzBdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY29uZmlnQ2xhc3M6YW55ID1cclxuICAgIHtcclxuICAgICAgICBSb2xlQ0ZHOlJvbGVDRkcsXHJcbiAgICAgICAgTGV2ZWxDRkc6TGV2ZWxDRkcsXHJcbiAgICAgICAgQnVpbGRDRkc6QnVpbGRDRkcsXHJcbiAgICAgICAgTnBjQ0ZHOk5wY0NGRyxcclxuICAgICAgICBHYW1lQ0ZHOkdhbWVDRkdcclxuICAgIH1cclxufSIsImltcG9ydCBCYXNlVmlldyBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9tdmMvQmFzZVZpZXdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvYWRpbmdWaWV3IGV4dGVuZHMgQmFzZVZpZXdcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkxvYWRpbmdWaWV3XCI7XHJcbiAgICBwcm9fYmFyOmZhaXJ5Z3VpLkdQcm9ncmVzc0JhcjtcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKFwibG9hZGluZ1wiLFwibG9hZGluZ1wiKTsgXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzdXBlci5vbkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93V29yZCggdmFsdWU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucHJvX2Jhci52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjbGVhckV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNsZWFyRXZlbnQoKTtcclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBXb3JkVGlwc1ZpZXcgfSBmcm9tIFwiLi9Xb3JkVGlwc1ZpZXdcIjtcclxuaW1wb3J0IHsgR2FtZUxheWVyTWFuYWdlciB9IGZyb20gXCIuLi8uLi8uLi9tYW5hZ2Vycy9HYW1lTGF5ZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IExheWVyTm90aWZ5IH0gZnJvbSBcIi4uLy4uLy4uL2ZyYW1ld29ya3Mvbm90aWZpY2F0aW9uL0xheWVyTm90aWZ5XCI7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5pbXBvcnQgR2FtZUV2ZW50IGZyb20gXCIuLi8uLi91c2VyaW5mby9ldmVudHMvR2FtZUV2ZW50XCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBXb3JkVGlwc1V0aWxzXHJcbntcclxuICAgIHN0YXRpYyB3b3JkTGlzdDpBcnJheTxXb3JkVGlwc1ZpZXc+ID0gW107XHJcbiAgICBzdGF0aWMgc2hvd1dvcmRMaXN0OkFycmF5PFdvcmRUaXBzVmlldz4gPSBbXTtcclxuICAgIHN0YXRpYyBtYXhOdW06bnVtYmVyID0gMTA7XHJcbiAgICBzdGF0aWMgaXNFdmVudDpib29sZWFuID0gZmFsc2U7XHJcbiAgICBcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6V29yZFRpcHNVdGlscztcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6V29yZFRpcHNVdGlsc1xyXG4gICAge1xyXG4gICAgICAgIGlmKCAhdGhpcy5faW5zdGFuY2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgV29yZFRpcHNVdGlscygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBXb3JkVGlwc1V0aWxzLmlzRXZlbnQgPSB0cnVlO1xyXG4gICAgICAgIEV2ZW50VXRpbHMuYWRkRXZlbnRMaXN0ZW5lciggR2FtZUV2ZW50LnJlbW92ZXNlbGVjdCx0aGlzLHRoaXMuYWRkd29yZExpc3QgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd1dvcmRUaXBzKCB3b3JkOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggIVdvcmRUaXBzVXRpbHMuaXNFdmVudCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBXb3JkVGlwc1V0aWxzLmdldEluc3RhbmNlKCkuaW5pdEV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5sZW5ndGggPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBsYXN0d29yZDpzdHJpbmcgPSBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdFtXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5sZW5ndGgtMV0ubm93d29yZDtcclxuICAgICAgICAgICAgLy8gaWYoIGxhc3R3b3JkID09IHdvcmQgKVxyXG4gICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIFdvcmRUaXBzVXRpbHMud29yZExpc3QubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaXRlbTpXb3JkVGlwc1ZpZXcgPSBXb3JkVGlwc1V0aWxzLndvcmRMaXN0LnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIEdhbWVMYXllck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGR0b0xheWVyKCBpdGVtLExheWVyTm90aWZ5LkxBWUVSX1RJUFNMQVlFUiApO1xyXG4gICAgICAgICAgICBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICBpdGVtLnNob3dXb3JkKCB3b3JkICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5sZW5ndGggPCAxMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtMTpXb3JkVGlwc1ZpZXcgPSBuZXcgV29yZFRpcHNWaWV3KCk7XHJcbiAgICAgICAgICAgICAgICBHYW1lTGF5ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkdG9MYXllciggaXRlbTEsTGF5ZXJOb3RpZnkuTEFZRVJfVElQU0xBWUVSICk7XHJcbiAgICAgICAgICAgICAgICBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5wdXNoKGl0ZW0xKTtcclxuICAgICAgICAgICAgICAgIGl0ZW0xLnNob3dXb3JkKCB3b3JkICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbTE6V29yZFRpcHNWaWV3ID0gV29yZFRpcHNVdGlscy5zaG93V29yZExpc3Quc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgIGl0ZW0xLnNob3dXb3JkKCB3b3JkICk7XHJcbiAgICAgICAgICAgICAgICBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5wdXNoKGl0ZW0xKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBhZGR3b3JkTGlzdCggaXRlbTpXb3JkVGlwc1ZpZXcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGl0ZW0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5yZW1vdmVGcm9tUGFyZW50KCk7XHJcbiAgICAgICAgICAgIHZhciBpbmRleDpudW1iZXIgPSBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5pbmRleE9mKCBpdGVtICk7XHJcbiAgICAgICAgICAgIGlmKCBpbmRleCAhPSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFdvcmRUaXBzVXRpbHMuc2hvd1dvcmRMaXN0LnNwbGljZSggaW5kZXgsMSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEdhbWVMYXllck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVmb3JtTGF5ZXIoTGF5ZXJOb3RpZnkuTEFZRVJfVElQU0xBWUVSICk7XHJcbiAgICAgICAgICAgIFdvcmRUaXBzVXRpbHMud29yZExpc3QucHVzaCggaXRlbSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuIiwiaW1wb3J0IEJhc2VWaWV3IGZyb20gXCIuLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9CYXNlVmlld1wiO1xyXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4uLy4uLy4uL2ZyYW1ld29ya3MvZXZlbnRzL0V2ZW50VXRpbHNcIjtcclxuaW1wb3J0IEdhbWVFdmVudCBmcm9tIFwiLi4vLi4vdXNlcmluZm8vZXZlbnRzL0dhbWVFdmVudFwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgV29yZFRpcHNWaWV3IGV4dGVuZHMgQmFzZVZpZXdcclxue1xyXG4gICAgcHVibGljIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJXb3JkVGlwc1ZpZXdcIjtcclxuICAgIHRleHRfd29yZDpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgdDE6ZmFpcnlndWkuVHJhbnNpdGlvbjtcclxuICAgIHB1YmxpYyBub3d3b3JkOnN0cmluZyA9IFwiXCI7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCBcImxvYWRpbmdcIixcIndvcmRUaXBzXCIgKTtcclxuICAgIH0gICBcclxuXHJcbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN1cGVyLm9uSW5pdCgpO1xyXG4gICAgICAgIHRoaXMudDEgPSB0aGlzLmdldHBhbmVsVHJhbnNpdGlvbihcInQxXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93V29yZCggd29yZDpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ub3d3b3JkID0gd29yZDtcclxuICAgICAgICB0aGlzLnRleHRfd29yZC50ZXh0ID0gd29yZDtcclxuICAgICAgICB0aGlzLnQxLnBsYXkoIExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsIHRoaXMucGxheUVuZENhbGxiYWNrICksMSApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGxheUVuZENhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggR2FtZUV2ZW50LnJlbW92ZXNlbGVjdCx0aGlzICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBKb3lzdGlja01vZHVsZSB9IGZyb20gXCIuLi9qb3lzdGljay9Kb3lzdGlja01vZHVsZVwiO1xyXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvZXZlbnRzL0V2ZW50VXRpbHNcIjtcclxuaW1wb3J0IEdhbWVFdmVudCBmcm9tIFwiLi4vdXNlcmluZm8vZXZlbnRzL0dhbWVFdmVudFwiO1xyXG5pbXBvcnQgU2NlbmUzRE1hbmFnZXIgZnJvbSBcIi4uLy4uL21hbmFnZXJzL1NjZW5lM0RNYW5hZ2VyXCI7XHJcbmltcG9ydCBTY2VuZTNkT2JqZWN0IGZyb20gXCIuLi9zY2VuZTNkcy9TY2VuZTNkT2JqZWN0XCI7XHJcbmltcG9ydCBOcGNTY3JpcHQgZnJvbSBcIi4uL21vZGVsU2NyaXB0cy9OcGNTY3JpcHRcIjtcclxuaW1wb3J0IERlYnVnZXIgZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvRGVidWdlclwiO1xyXG5pbXBvcnQgVGltZXJTZXJ2aWNlIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgR2FtZUNGRyBmcm9tIFwiLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9HYW1lQ0ZHXCI7XHJcbmltcG9ydCBTb3VuZHNzTWFuYWdlciBmcm9tIFwiLi4vLi4vbWFuYWdlcnMvU291bmRzc01hbmFnZXJcIjtcclxuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9XWFNESy9TZGtcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVTdGF0ZU1hbmFnZXIgaW1wbGVtZW50cyBJVGltZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOkdhbWVTdGF0ZU1hbmFnZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBfam95c3RpY2tNb2R1bGU6Sm95c3RpY2tNb2R1bGU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAwOuacquW8gOWni++8jDHvvJrmuLjmiI/kuK3vvIwy77ya5pqC5YGc5LitXHJcbiAgICAgKi9cclxuICAgIG5vd0dhbWVTdGF0ZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX3podWFueGlhbmdiZWlzaHU6bnVtYmVyID0gMDtcclxuXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOkdhbWVTdGF0ZU1hbmFnZXJcclxuICAgIHtcclxuICAgICAgICBpZiggIXRoaXMuX2luc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IEdhbWVTdGF0ZU1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfSAgIFxyXG5cclxuICAgIHByaXZhdGUgX2h1YWRvbmdTcGVlZFg6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2h1YWRvbmdDbGltYlNwZWVkWDpudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBlbmRHYW1lUGxheWVyQXJyOkFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgaW5pdCggKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faHVhZG9uZ1NwZWVkWCA9IE51bWJlcihHYW1lQ0ZHLmRpY3RbNF0udmFsdWUpO1xyXG4gICAgICAgIHRoaXMuX2h1YWRvbmdDbGltYlNwZWVkWCA9IE51bWJlcihHYW1lQ0ZHLmRpY3RbNV0udmFsdWUpO1xyXG4gICAgICAgIGlmKCBHYW1lQ0ZHLmRpY3RbN10gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5femh1YW54aWFuZ2JlaXNodSA9IE51bWJlciggR2FtZUNGRy5kaWN0WzddLnZhbHVlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3podWFueGlhbmdiZWlzaHUgPSAyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEV2ZW50VXRpbHMuYWRkRXZlbnRMaXN0ZW5lciggR2FtZUV2ZW50LmVuZEdhbWUsdGhpcyx0aGlzLmVuZEdhbWUgKTtcclxuICAgICAgICBFdmVudFV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoIEdhbWVFdmVudC5ucGNlbmRHYW1lLHRoaXMsdGhpcy5ucGNlbmRHYW1lSGFuZGxlciApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbnBjZW5kR2FtZUhhbmRsZXIoIHN0cjpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5lbmRHYW1lUGxheWVyQXJyLnB1c2goIHN0ciApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRDbGlja1BhbmVsKCBwYW5lbDpmYWlyeWd1aS5HTG9hZGVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2pveXN0aWNrTW9kdWxlID0gbmV3IEpveXN0aWNrTW9kdWxlKHBhbmVsKTtcclxuICAgICAgICB0aGlzLl9qb3lzdGlja01vZHVsZS5zZXRFdmVudENhbGxiYWNrKCB0aGlzLHRoaXMub25kb3duZnVuLHRoaXMub25tb3ZlZnVuLHRoaXMub251cGZ1biApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2lzbmVlZFNodW55aVg6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfbm93VGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBvbmRvd25mdW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbGFzdEFuZ2xlID0gMDtcclxuICAgICAgICB0aGlzLl9ub3dUaW1lID0gTGF5YS5Ccm93c2VyLm5vdygpLzEwMDA7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9sYXN0QW5nbGU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgb25tb3ZlZnVuKCBvZmZzZXRYOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5ub3dHYW1lU3RhdGUgPT0gMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZGlzQW5nbGU6bnVtYmVyID0gdGhpcy5fam95c3RpY2tNb2R1bGUuYW5nbGUgLSB0aGlzLl9sYXN0QW5nbGU7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RBbmdsZSA9IHRoaXMuX2pveXN0aWNrTW9kdWxlLmFuZ2xlO1xyXG4gICAgICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5pc2Nhcm1hbnBjIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgKFNjZW5lM2RPYmplY3QubnBjc2NyaXB0RGljdFtcIm5wY18wXCJdIGFzIE5wY1NjcmlwdCkuam95U3RpY2tDSGFuZ2Uob2Zmc2V0WCA+IDAgPyB0aGlzLl9odWFkb25nU3BlZWRYOi10aGlzLl9odWFkb25nU3BlZWRYLGRpc0FuZ2xlKnRoaXMuX3podWFueGlhbmdiZWlzaHUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgU2NlbmUzRE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5tYWluUm9sZVNjcmlwdC5qb3lTdGlja0NIYW5nZSggb2Zmc2V0WCA+IDAgPyB0aGlzLl9odWFkb25nU3BlZWRYOi10aGlzLl9odWFkb25nU3BlZWRYLG9mZnNldFggPiAwID8gdGhpcy5faHVhZG9uZ0NsaW1iU3BlZWRYOi10aGlzLl9odWFkb25nQ2xpbWJTcGVlZFgsZGlzQW5nbGUqdGhpcy5femh1YW54aWFuZ2JlaXNodSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb251cGZ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5pc2Nhcm1hbnBjIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIChTY2VuZTNkT2JqZWN0Lm5wY3NjcmlwdERpY3RbXCJucGNfMFwiXSBhcyBOcGNTY3JpcHQpLmpveVN0aWNrQ0hhbmdlKDAsMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLm5vd0dhbWVTdGF0ZSA9PSAxIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgU2NlbmUzRE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5tYWluUm9sZVNjcmlwdC5qb3lTdGlja0NIYW5nZSggMCwwLDAgKTtcclxuICAgICAgICAgICAgICAgIC8vIGlmKCBMYXlhLkJyb3dzZXIubm93KCkvMTAwMCAtIHRoaXMuX25vd1RpbWUgPCAwLjIgKVxyXG4gICAgICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGlmKCB0aGlzLl9qb3lzdGlja01vZHVsZS5vZmZ4ID4gNCApXHJcbiAgICAgICAgICAgICAgICAvLyAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBTY2VuZTNETWFuYWdlci5nZXRJbnN0YW5jZSgpLm1haW5Sb2xlU2NyaXB0LnhzaHVueWkoIDEgKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgZWxzZSBpZiggdGhpcy5fam95c3RpY2tNb2R1bGUub2ZmeCA8IC00IClcclxuICAgICAgICAgICAgICAgIC8vICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIFNjZW5lM0RNYW5hZ2VyLmdldEluc3RhbmNlKCkubWFpblJvbGVTY3JpcHQueHNodW55aSggLTEgKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICB9ICAgXHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIG5vd01pbmdDaTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfbnVtczpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfYWxsOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMubm93R2FtZVN0YXRlID09IDEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSA9IDA7XHJcbiAgICAgICAgICAgIHZhciBucGNkaWN0OmFueSA9IFNjZW5lM2RPYmplY3QubnBjc2NyaXB0RGljdDtcclxuICAgICAgICAgICAgdGhpcy5fbnVtcyA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuX2FsbCA9IDA7XHJcbiAgICAgICAgICAgIHZhciBzO1xyXG4gICAgICAgICAgICB2YXIgbnBjc3A6TnBjU2NyaXB0O1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gbnBjZGljdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5wY3NwID0gbnBjZGljdFtzXTtcclxuICAgICAgICAgICAgICAgIGlmKCBucGNzcC5nZXROb3dzdGF0ZSgpID09IDEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi56IDwgbnBjc3AuZ2V0UG9zdGlvbigpLnogKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbnVtcysrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbGwgKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5ub3dNaW5nQ2kgPSB0aGlzLmVuZEdhbWVQbGF5ZXJBcnIubGVuZ3RoICsgKCggdGhpcy5fYWxsICsgMSApIC0gdGhpcy5fbnVtcyk7XHJcbiAgICAgICAgICAgIFNjZW5lM2RPYmplY3QudHh0X21pbmdjaS50ZXh0ID0gXCLnrKxcIiArIHRoaXMubm93TWluZ0NpICsgXCLlkI1cIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXJ0R2FtZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5vd01pbmdDaSA9IDA7XHJcbiAgICAgICAgdGhpcy5lbmRHYW1lUGxheWVyQXJyLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5ub3dHYW1lU3RhdGUgPSAxO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5pbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZSggNTAwICk7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBHYW1lRXZlbnQuc3RhcnRHYW1lICk7XHJcbiAgICAgICAgU291bmRzc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wbGF5YmdTb3VuZChcImJnbVwiKTtcclxuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuS4u+eVjOmdoueCueWHu+W8gOWni+a4uOaIjy4uLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RvcEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ub3dHYW1lU3RhdGUgPSAyO1xyXG4gICAgICAgIHRoaXMub251cGZ1bigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlbmRHYW1lKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubm93R2FtZVN0YXRlID0gMDtcclxuICAgICAgICBUaW1lclNlcnZpY2UuaW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgdmFyIG5wY2RpY3Q6YW55ID0gU2NlbmUzZE9iamVjdC5ucGNzY3JpcHREaWN0O1xyXG4gICAgICAgIGlmKCBucGNkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciggdmFyIHMgaW4gbnBjZGljdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIChucGNkaWN0W3NdIGFzIE5wY1NjcmlwdCkuc3RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub251cGZ1bigpO1xyXG4gICAgICAgIFNvdW5kc3NNYW5hZ2VyLmdldEluc3RhbmNlKCkuc3RvcGJnU291bmQoKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCYXNlUHJveHlzIGZyb20gXCIuLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9CYXNlUHJveHlzXCI7XHJcbmltcG9ydCBHYW1lRXZlbnQgZnJvbSBcIi4uLy4uL3VzZXJpbmZvL2V2ZW50cy9HYW1lRXZlbnRcIjtcclxuaW1wb3J0IHsgVWlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uLy4uL21hbmFnZXJzL1VpTWFuYWdlclwiO1xyXG5pbXBvcnQgR2FtZVJlc3VsdFZpZXcgZnJvbSBcIi4uLy4uL3Jlc3VsdC9HYW1lUmVzdWx0Vmlld1wiO1xyXG5pbXBvcnQgR2FtZVN0YXRlTWFuYWdlciBmcm9tIFwiLi4vR2FtZVN0YXRlTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCBTY2VuZTNETWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvU2NlbmUzRE1hbmFnZXJcIjtcclxuaW1wb3J0IFNjZW5lM2RPYmplY3QgZnJvbSBcIi4uLy4uL3NjZW5lM2RzL1NjZW5lM2RPYmplY3RcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCwgQWNjb3VudFVzZXIgfSBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IFBST1RPQ09MUywgTmV0d29ya01hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvU2RrXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lUHJveHkgZXh0ZW5kcyBCYXNlUHJveHlzIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiR2FtZVByb3h5XCI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFByb3h5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWRkRGF0YUV2ZW50KCBHYW1lRXZlbnQuZW5kR2FtZSx0aGlzLHRoaXMuZW5kZ2FtZUhhbmRsZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVuZGdhbWVIYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEudGltZXIub25jZSggMTAwMCx0aGlzLHRoaXMuc3RhcnRFbmRWaWV3ICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGFydEVuZFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5vd21pbmdjdmk6bnVtYmVyID0gR2FtZVN0YXRlTWFuYWdlci5nZXRJbnN0YW5jZSgpLm5vd01pbmdDaTtcclxuICAgICAgICB2YXIgZ2V0R29sZDpudW1iZXIgPSAwO1xyXG4gICAgICAgIGlmKCBHYW1lU3RhdGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZW5kR2FtZVBsYXllckFyci5sZW5ndGggPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnZXRHb2xkID0gdGhpcy5yb2xlVk8ubGV2ZWxjZmcud2luR29sZDtcclxuICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLmiZPlvIDnu5PnrpfnlYzpnaIo5ri45oiP6IOc5YipKVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKCB0aGlzLnJvbGVWTy5sZXZlbGNmZy5mYWlsR29kICk7XHJcbiAgICAgICAgICAgIGdldEdvbGQgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCBOdW1iZXIoYXJyWzBdKSxOdW1iZXIoYXJyWzFdKSApO1xyXG4gICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuaJk+W8gOe7k+eul+eVjOmdoijmuLjmiI/lpLHotKUpXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBVaU1hbmFnZXIuaW5zdGFuY2UuYWRkKCBHYW1lUmVzdWx0VmlldyxnZXRHb2xkICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJldHVybm1haW52aWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3QuZ2V0SW5zdGFuY2UoKS5jbG9zZWVuZ2FtbGl6aSgpO1xyXG4gICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5jbG9zZSggR2FtZVJlc3VsdFZpZXcgKTtcclxuICAgICAgICB0aGlzLmRpc3BhY2hlRGF0YUV2ZW50KCBHYW1lRXZlbnQucmV0dXJuTWFpblZpZXcgKTtcclxuICAgICAgICBTY2VuZTNETWFuYWdlci5nZXRJbnN0YW5jZSgpLnNob3dTY2VuZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGFydEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgR2FtZVN0YXRlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnN0YXJ0R2FtZSgpO1xyXG4gICAgfVxyXG4gICBcclxufSIsImltcG9ydCBCYXNlUHJveHlzIGZyb20gXCIuLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9CYXNlUHJveHlzXCI7XHJcbmltcG9ydCBSZXNvdXJjZU1hbmFnZXIgZnJvbSBcIi4uLy4uLy4uL21hbmFnZXJzL1Jlc291cmNlTWFuYWdlclwiO1xyXG5pbXBvcnQgTG9hZGluZ1ZpZXcgZnJvbSBcIi4uLy4uL2xvYWRpbmcvdmlldy9Mb2FkaW5nVmlld1wiO1xyXG5pbXBvcnQgeyBVaU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvVWlNYW5hZ2VyXCI7XHJcbmltcG9ydCBSZXNEYXRhTWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvUmVzRGF0YU1hbmFnZXJcIjtcclxuaW1wb3J0IE1haW5WaWV3IGZyb20gXCIuLi92aWV3L01haW5WaWV3XCI7XHJcbmltcG9ydCBTY2VuZTNETWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvU2NlbmUzRE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IEdhbWVTdGF0ZU1hbmFnZXIgZnJvbSBcIi4uL0dhbWVTdGF0ZU1hbmFnZXJcIjtcclxuaW1wb3J0IFJvbGVWTyBmcm9tIFwiLi4vLi4vdXNlcmluZm8vdm8vUm9sZVZPXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IFdYR2FtZVBsYXRmb3JtIGZyb20gXCIuLi8uLi8uLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYR2FtZVBsYXRmb3JtXCI7XHJcbmltcG9ydCBSb2xlQ0ZHIGZyb20gXCIuLi8uLi8uLi9jb25maWdzL2RhdGFDb25maWdzL1JvbGVDRkdcIjtcclxuaW1wb3J0IE5wY0NGRyBmcm9tIFwiLi4vLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9OcGNDRkdcIjtcclxuaW1wb3J0IENhY2hlTWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvQ2FjaGVNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBQUk9UT0NPTFMgfSBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBZUVNkayB9IGZyb20gXCIuLi8uLi8uLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL1lRU2RrXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWluUHJveHkgZXh0ZW5kcyBCYXNlUHJveHlzIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiTWFpblByb3h5XCI7XHJcbiAgICBcclxuICAgIHByaXZhdGUgX2xvYWRqZDpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfYWxsamQ6bnVtYmVyID0gMDtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuICAgIFxyXG4gICAgcHJvdGVjdGVkIGluaXRQcm94eSgpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVudGVyTWFpbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9sb2FkamQgPSAwO1xyXG4gICAgICAgIHRoaXMuX2FsbGpkID0gMjA7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5sb2FkU3VicGFja2FnZSggXCJzdWJwYWNrYWdlXCIsdGhpcyx0aGlzLnN1YjFjb21wbGV0ZSx0aGlzLmxvYWRwcm9ncmVzcyxudWxsICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdWIxY29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbG9hZGpkID0gMjA7XHJcbiAgICAgICAgdGhpcy5fYWxsamQgPSAzMDtcclxuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmxvYWRTdWJwYWNrYWdlKCBcInN1YnBhY2thZ2UxXCIsdGhpcyx0aGlzLnN1YmNvbXBsZXRlLHRoaXMubG9hZHByb2dyZXNzLG51bGwgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN1YmNvbXBsZXRlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2xvYWRqZCA9IDUwO1xyXG4gICAgICAgIHRoaXMuX2FsbGpkID0gNDA7XHJcbiAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIHZhciB1cmxBcnI6QXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgICAgIHVybEFyci5wdXNoKCBQYXRoQ29uZmlnLmdldDNETW9kZWwoIFwic3RhcnRQbGFuZVwiICkgKTtcclxuICAgICAgICB1cmxBcnIucHVzaCggUGF0aENvbmZpZy5nZXQzRE1vZGVsKCBcImVuZFBsYW5lXCIgKSApO1xyXG4gICAgICAgIHVybEFyci5wdXNoKCBQYXRoQ29uZmlnLmdldDNETW9kZWwoIFwiamlhc3VsaXppXCIgKSApO1xyXG4gICAgICAgIHVybEFyci5wdXNoKCBQYXRoQ29uZmlnLmdldDNETW9kZWwoIFwidGFuc2VfYmFpXCIgKSApO1xyXG4gICAgICAgIHVybEFyci5wdXNoKCBQYXRoQ29uZmlnLmdldDNETW9kZWwoIFwidGFuc2VfaHVhbmdcIiApICk7XHJcbiAgICAgICAgdXJsQXJyLnB1c2goIFBhdGhDb25maWcuZ2V0M0RNb2RlbCggXCJ3aW5feGlhblwiICkgKTtcclxuICAgICAgICB1cmxBcnIucHVzaCggUGF0aENvbmZpZy5nZXQzRE1vZGVsKCBcInlhbmh1YVwiICkgKTtcclxuICAgICAgICB1cmxBcnIucHVzaCggUGF0aENvbmZpZy5nZXQzRE1vZGVsKCBcIkRpcmVjdGlvbmFsTGlnaHRcIiApICk7XHJcbiAgICAgICAgLy8gdXJsQXJyLnB1c2goIFBhdGhDb25maWcuZ2V0M0RNb2RlbCggXCJkaXN0YW50dmlld1wiICkgKTtcclxuICAgICAgICB1cmxBcnIucHVzaCggUGF0aENvbmZpZy5nZXQzRFJvbGVNb2RlbCggdGhpcy5yb2xlVk8ucm9sZUNmZy5uYW1lICkgKTtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSB0aGlzLnJvbGVWTy5sZXZlbG1hcEFycjtcclxuICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IGFyci5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB1cmxBcnIuaW5kZXhPZiggUGF0aENvbmZpZy5nZXQzRE1vZGVsKCBhcnJbaV0gKSApID09IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdXJsQXJyLnB1c2goIFBhdGhDb25maWcuZ2V0M0RNb2RlbCggYXJyW2ldICkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBucGNBcnI6QXJyYXk8YW55PiA9IHRoaXMucm9sZVZPLmxldmVsY2ZnLm5wYztcclxuICAgICAgICBmb3IoIGkgPSAwO2kgPCBucGNBcnIubGVuZ3RoO2krKyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdXJsQXJyLmluZGV4T2YoIFBhdGhDb25maWcuZ2V0M0RSb2xlTW9kZWwoIE5wY0NGRy5kaWN0WyBucGNBcnJbaV0uaWQgXS5uYW1lICkgKSA9PSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHVybEFyci5wdXNoKCBQYXRoQ29uZmlnLmdldDNEUm9sZU1vZGVsKCBOcGNDRkcuZGljdFsgbnBjQXJyW2ldLmlkIF0ubmFtZSApICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yKCBpID0gMDtpIDwgdXJsQXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGF0aEFyci5wdXNoKCB7IHVybDp1cmxBcnJbaV0gfSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkZXIzREFyciggcGF0aEFycix0aGlzLHRoaXMubG9hZDNEY29tcGxldGUsdGhpcy5sb2FkcHJvZ3Jlc3MgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWQzRGNvbXBsZXRlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2xvYWRqZCA9IDkwO1xyXG4gICAgICAgIHRoaXMuX2FsbGpkID0gMTA7XHJcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZEdyb3VwKCBcIm1haW5cIix0aGlzLHRoaXMubG9hZGNvbXBsZXRlLHRoaXMubG9hZHByb2dyZXNzLGZhbHNlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkcHJvZ3Jlc3MoIHZhbHVlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbG9hZGluZ3ZpZXc6TG9hZGluZ1ZpZXcgPSBVaU1hbmFnZXIuaW5zdGFuY2UuZ2V0VmlldyggTG9hZGluZ1ZpZXcgKTtcclxuICAgICAgICBpZiggbG9hZGluZ3ZpZXcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9sb2FkamQgKyBNYXRoLmNlaWwoIHZhbHVlLzEwMCp0aGlzLl9hbGxqZCApO1xyXG4gICAgICAgICAgICBsb2FkaW5ndmlldy5zaG93V29yZCggdmFsdWUgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkY29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcuYnV0dG9uU291bmQgPSBcInVpOi8vbGVjeHluaDJpejl5MjZcIjtcclxuICAgICAgICBHYW1lU3RhdGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuaW5pdCgpO1xyXG4gICAgICAgIFJlc0RhdGFNYW5hZ2VyLmdldEluYXN0YW5jZSgpLmFkZHVpUGFja2FnZSggXCJtYWluXCIgKTtcclxuICAgICAgICBVaU1hbmFnZXIuaW5zdGFuY2UuY2xvc2UoIExvYWRpbmdWaWV3ICk7XHJcbiAgICAgICAgVWlNYW5hZ2VyLmluc3RhbmNlLmFkZCggTWFpblZpZXcgKTtcclxuICAgICAgICBTY2VuZTNETWFuYWdlci5nZXRJbnN0YW5jZSgpLmluaXRHYW1lKCk7XHJcbiAgICAgICAgLy8gU291bmRzc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wbGF5YmdTb3VuZCggXCJnYW1lYmdcIiApO1xyXG4gICAgICAgIC8vIENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNsZWFyQWxsKCk7XHJcbiAgICAgICAgWVFTZGsucHVsbEFkUG9zaXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNlc2hpKCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxufSIsImltcG9ydCBCYXNlVmlldyBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9tdmMvQmFzZVZpZXdcIjtcclxuaW1wb3J0IEdhbWVTdGF0ZU1hbmFnZXIgZnJvbSBcIi4uL0dhbWVTdGF0ZU1hbmFnZXJcIjtcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gXCIuLi8uLi8uLi9mcmFtZXdvcmtzL2V2ZW50cy9FdmVudFV0aWxzXCI7XHJcbmltcG9ydCBHYW1lRXZlbnQgZnJvbSBcIi4uLy4uL3VzZXJpbmZvL2V2ZW50cy9HYW1lRXZlbnRcIjtcclxuaW1wb3J0IFNjZW5lM2RPYmplY3QgZnJvbSBcIi4uLy4uL3NjZW5lM2RzL1NjZW5lM2RPYmplY3RcIjtcclxuaW1wb3J0IFVzZXJJbmZvUHJveHkgZnJvbSBcIi4uLy4uL3VzZXJpbmZvL1VzZXJJbmZvUHJveHlcIjtcclxuaW1wb3J0IFJvbGVWTyBmcm9tIFwiLi4vLi4vdXNlcmluZm8vdm8vUm9sZVZPXCI7XHJcbmltcG9ydCBVc2VySW5mb0V2ZW50IGZyb20gXCIuLi8uLi91c2VyaW5mby9ldmVudHMvVXNlckluZm9FdmVudFwiO1xyXG5pbXBvcnQgU2tpblByb3h5IGZyb20gXCIuLi8uLi9za2lucy9wcm94eXMvU2tpblByb3h5XCI7XHJcbmltcG9ydCBHYW1lUHJveHkgZnJvbSBcIi4uL3Byb3h5cy9HYW1lUHJveHlcIjtcclxuaW1wb3J0IHsgV29yZFRpcHNVdGlscyB9IGZyb20gXCIuLi8uLi9sb2FkaW5nL3ZpZXcvV29yZFRpcHNVdGlsc1wiO1xyXG5pbXBvcnQgeyBVaU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvVWlNYW5hZ2VyXCI7XHJcbmltcG9ydCBDaG91dGlQYW5WaWV3IGZyb20gXCIuLi8uLi8uLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9DaG91dGlQYW5WaWV3XCI7XHJcbmltcG9ydCBUdWlqaWFuVmlldyBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9XWFNESy9jcGEvVHVpamlhblZpZXdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1haW5WaWV3IGV4dGVuZHMgQmFzZVZpZXdcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIk1haW5WaWV3XCI7XHJcblxyXG4gICAgY19zdGF0ZTpmYWlyeWd1aS5Db250cm9sbGVyO1xyXG4gICAgbG9hZF9jbGlja3BhbmVsOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICBsb2FkX3N0YXJ0OmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICB0eHRfbHY6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIHByb19kaXM6ZmFpcnlndWkuR1Byb2dyZXNzQmFyO1xyXG4gICAgdHh0X21pbmdjaTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgdHh0X2dvbGQ6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIGJ0bl9za2luOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBidG5fbW9yZTpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgYnRuX3R1aWppYW46ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIHByaXZhdGUgX3VzZXJpbmZvUHJveHk6VXNlckluZm9Qcm94eTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlcihcIm1haW5cIixcIm1haW52aWV3XCIpOyBcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN1cGVyLm9uSW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0VmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl91c2VyaW5mb1Byb3h5ID0gdGhpcy5nZXRQcm94eSggVXNlckluZm9Qcm94eSApO1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3QucHJvX2ppbmR1ID0gdGhpcy5wcm9fZGlzO1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3QudHh0X21pbmdjaSA9IHRoaXMudHh0X21pbmdjaTtcclxuICAgICAgICB0aGlzLmNfc3RhdGUgPSB0aGlzLmdldENvbnRyb2xsZXJCeUJhbWUoIFwiY19zdGF0ZVwiICk7XHJcbiAgICAgICAgR2FtZVN0YXRlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnNldENsaWNrUGFuZWwoIHRoaXMubG9hZF9jbGlja3BhbmVsICk7XHJcbiAgICAgICAgdGhpcy5yZXR1cm5tYWluSGFuZGxlcigpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVXNlckRhdGFIYW5kbGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmxvYWRfc3RhcnQsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuYnRuY2xpY2sgKTtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmJ0bl9za2luLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLnNraW5jbGljayApO1xyXG4gICAgICAgIHRoaXMuYWRkTGlzdGVuZXIoIHRoaXMuYnRuX21vcmUsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMubW9yZWNsaWNrICk7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5idG5fdHVpamlhbixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy50dWlqaWFuY2xpY2sgKTtcclxuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggR2FtZUV2ZW50LnJldHVybk1haW5WaWV3LHRoaXMsdGhpcy5yZXR1cm5tYWluSGFuZGxlciApO1xyXG4gICAgICAgIHRoaXMuYWRkRGF0YUV2ZW50KCBVc2VySW5mb0V2ZW50LlVzZXJJbmZvRXZlbnRfdXBkYXRlVXNlckRhdGEsdGhpcyx0aGlzLnVwZGF0ZVVzZXJEYXRhSGFuZGxlciApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdHVpamlhbmNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5hZGQoIFR1aWppYW5WaWV3ICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBza2luY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgKCB0aGlzLmdldFByb3h5KCBTa2luUHJveHkgKSBhcyBTa2luUHJveHkgKS5vcGVudmlldygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbW9yZWNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZVVzZXJEYXRhSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnR4dF9nb2xkLnRleHQgPSB0aGlzLl91c2VyaW5mb1Byb3h5LnJvbGVWTy5Hb2xkLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXR1cm5tYWluSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgcm9sZXZvOlJvbGVWTyA9IHRoaXMuX3VzZXJpbmZvUHJveHkucm9sZVZPO1xyXG4gICAgICAgIGlmKCByb2xldm8ubm93bGV2ZWwgPD0gMiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidG5jbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDI7XHJcbiAgICAgICAgdGhpcy50eHRfbHYudGV4dCA9IHRoaXMuX3VzZXJpbmZvUHJveHkucm9sZVZPLmdldE5vd1NlcnZlckxldmVsKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIEdhbWVQcm94eSApIGFzIEdhbWVQcm94eSApLnN0YXJ0R2FtZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxufSIsImltcG9ydCBTY2VuZTNETWFuYWdlciBmcm9tIFwiLi4vLi4vbWFuYWdlcnMvU2NlbmUzRE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi8uLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IFJlc0RhdGFNYW5hZ2VyIGZyb20gXCIuLi8uLi9tYW5hZ2Vycy9SZXNEYXRhTWFuYWdlclwiO1xyXG5pbXBvcnQgU2NlbmUzZE9iamVjdCBmcm9tIFwiLi4vc2NlbmUzZHMvU2NlbmUzZE9iamVjdFwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi8uLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IEdhbWVDRkcgZnJvbSBcIi4uLy4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvR2FtZUNGR1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FtZXJhc1NjcmlwdCBleHRlbmRzIExheWEuU2NyaXB0M0Rcclxue1xyXG4gICAgcHJvdGVjdGVkIGNhbWVyYTogTGF5YS5DYW1lcmE7XHJcbiAgICBwcml2YXRlIF90cmFuc2Zvcm06TGF5YS5UcmFuc2Zvcm0zRDtcclxuICAgIHByaXZhdGUgX2Rpc1ZlY3RvcjpMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIF90b1ZlYzpMYXlhLlZlY3RvcjM7XHJcbiAgICBwdWJsaWMgaXNjYW5mb2xsb3c6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Bd2FrZSgpOnZvaWR7XHJcbiAgICAgICAgLy/ojrflj5bohJrmnKzmiYDlsZ7lr7nosaFcclxuICAgICAgICB0aGlzLmNhbWVyYSA9IHRoaXMub3duZXIgYXMgTGF5YS5DYW1lcmE7XHJcbiAgICAgICAgdGhpcy5fdG9WZWMgPSBuZXcgTGF5YS5WZWN0b3IzKCk7XHJcbiAgICAgICAgdGhpcy5jYW1lcmEuZmllbGRPZlZpZXcgPSA5MDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdFBvcyggdmVjOkxheWEuVmVjdG9yMyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgdmFsdWVBcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FyciggR2FtZUNGRy5kaWN0WzFdLnZhbHVlICk7XHJcbiAgICAgICAgdGhpcy5fZGlzVmVjdG9yID0gbmV3IExheWEuVmVjdG9yMyhOdW1iZXIoIHZhbHVlQXJyWzBdICksTnVtYmVyKCB2YWx1ZUFyclsxXSApLE51bWJlciggdmFsdWVBcnJbMl0gKSk7XHJcbiAgICAgICAgTGF5YS5WZWN0b3IzLmFkZCh2ZWMgLHRoaXMuX2Rpc1ZlY3Rvcix0aGlzLl90b1ZlYyApO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX3RvVmVjO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLnRyYW5zZm9ybS5wb3NpdGlvbi54ID0gdmVjLng7XHJcbiAgICAgICAgLy8gdGhpcy5jYW1lcmEudHJhbnNmb3JtLmxvb2tBdCggdmVjLG5ldyBMYXlhLlZlY3RvcjMoIDAsMSwwICkgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TdGFydCgpOnZvaWR7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtID0gdGhpcy5jYW1lcmEudHJhbnNmb3JtO1xyXG4gICAgICAgIC8v5peL6L2s5pGE5YOP5py66KeS5bqmXHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnJvdGF0ZShuZXcgTGF5YS5WZWN0b3IzKCAwLCAwLCAwKSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgIC8vIHRoaXMuY2FtZXJhLmNsZWFyQ29sb3IgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3VwdmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoIDAsMSwwICk7XHJcbiAgICBwcml2YXRlIF9pbmRleDpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfc2xlcnBWYWx1ZTpudW1iZXIgPSA4O1xyXG4gICAgcHJpdmF0ZSBfbG9va2F0VmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwdWJsaWMgb25VcGRhdGUoKTogdm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLmlzY2FuZm9sbG93IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBTY2VuZTNkT2JqZWN0LmlzY2FybWFucGMgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5ucGNEaWN0W1wibnBjXzBcIl0gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIExheWEuVmVjdG9yMy5hZGQoIFNjZW5lM2RPYmplY3QubnBjRGljdFtcIm5wY18wXCJdLnRyYW5zZm9ybS5wb3NpdGlvbix0aGlzLl9kaXNWZWN0b3IsdGhpcy5fdG9WZWMgKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl90b1ZlYztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCA9IFNjZW5lM2RPYmplY3QubnBjRGljdFtcIm5wY18wXCJdLnRyYW5zZm9ybS5wb3NpdGlvbi54O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ubG9va0F0KCBTY2VuZTNkT2JqZWN0Lm5wY0RpY3RbXCJucGNfMFwiXS50cmFuc2Zvcm0ucG9zaXRpb24sdGhpcy5fdXB2ZWMgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBMYXlhLlZlY3RvcjMuYWRkKCBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbix0aGlzLl9kaXNWZWN0b3IsdGhpcy5fdG9WZWMgKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90b1ZlYy54ID0gU2NlbmUzZE9iamVjdC5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24ueDtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl90b1ZlYztcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90cmFuc2Zvcm0ubG9va0F0KCBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbix0aGlzLl91cHZlYyApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBMYXlhLlZlY3RvcjMubGVycCggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLHRoaXMuX3RvVmVjLDE2LzEwMDAgKiB0aGlzLl9zbGVycFZhbHVlLHRoaXMuX3RvVmVjICk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdG9WZWMueiA9IFNjZW5lM2RPYmplY3QubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLnordGhpcy5fZGlzVmVjdG9yLno7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdG9WZWMueSA9IFNjZW5lM2RPYmplY3QubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLnkgKyB0aGlzLl9kaXNWZWN0b3IueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl90b1ZlYztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb29rYXRWZWMueCA9IHRoaXMuX3RvVmVjLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9va2F0VmVjLnkgPSBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvb2thdFZlYy56ID0gU2NlbmUzZE9iamVjdC5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24uejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ubG9va0F0KCB0aGlzLl9sb29rYXRWZWMsdGhpcy5fdXB2ZWMgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTXlSb3RhdGVBcm91bmQodGFyZ2V0UG9zOkxheWEuVmVjdG9yMywgc3BlZWQ6TGF5YS5WZWN0b3IzICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaXNjYW5mb2xsb3cgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKCBzcGVlZCxmYWxzZSApO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybS5sb29rQXQoIHRhcmdldFBvcyx0aGlzLl91cHZlYyApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IERlYnVnZXIgZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvRGVidWdlclwiO1xyXG5pbXBvcnQgVGltZXJTZXJ2aWNlIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgU2NlbmUzZE9iamVjdCBmcm9tIFwiLi4vc2NlbmUzZHMvU2NlbmUzZE9iamVjdFwiO1xyXG5pbXBvcnQgUm9sZUFjdGlvbnMgZnJvbSBcIi4uL3NjZW5lM2RzL1JvbGVBY3Rpb25zXCI7XHJcbmltcG9ydCBSb2xlVk8gZnJvbSBcIi4uL3VzZXJpbmZvL3ZvL1JvbGVWT1wiO1xyXG5pbXBvcnQgTVZDT2JqZWN0UG9vbCBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9tdmMvTVZDT2JqZWN0UG9vbFwiO1xyXG5pbXBvcnQgVXNlckluZm9Qcm94eSBmcm9tIFwiLi4vdXNlcmluZm8vVXNlckluZm9Qcm94eVwiO1xyXG5pbXBvcnQgQnVpbGRDRkcgZnJvbSBcIi4uLy4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvQnVpbGRDRkdcIjtcclxuaW1wb3J0IHsgV29yZFRpcHNVdGlscyB9IGZyb20gXCIuLi9sb2FkaW5nL3ZpZXcvV29yZFRpcHNVdGlsc1wiO1xyXG5pbXBvcnQgQ2FtZXJhc1NjcmlwdCBmcm9tIFwiLi9DYW1lcmFzU2NyaXB0XCI7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5pbXBvcnQgR2FtZUV2ZW50IGZyb20gXCIuLi91c2VyaW5mby9ldmVudHMvR2FtZUV2ZW50XCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi8uLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IEdhbWVTdGF0ZU1hbmFnZXIgZnJvbSBcIi4uL21haW4vR2FtZVN0YXRlTWFuYWdlclwiO1xyXG5pbXBvcnQgU291bmRzc01hbmFnZXIgZnJvbSBcIi4uLy4uL21hbmFnZXJzL1NvdW5kc3NNYW5hZ2VyXCI7XHJcbmltcG9ydCBXWEdhbWVQbGF0Zm9ybSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9XWEdhbWVQbGF0Zm9ybVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFpblJBb2xlU2NyaXB0IGV4dGVuZHMgTGF5YS5TY3JpcHQzRCBpbXBsZW1lbnRzIElUaW1lclxyXG57XHJcbiAgICBwcml2YXRlIF90cmFuc2Zvcm06TGF5YS5UcmFuc2Zvcm0zRDtcclxuICAgIHByaXZhdGUgX2lzY2FuTW92ZTpib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfc3BlZWRNb3ZlVjM6TGF5YS5WZWN0b3IzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUm9sZUFjdGlvblxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9ub3dTdGF0ZTpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHByaXZhdGUgX3JvbGVWTzpSb2xlVk87XHJcblxyXG4gICAgcHJpdmF0ZSBfYW5pbWF0b3I6TGF5YS5BbmltYXRvcjtcclxuXHJcbiAgICBwcml2YXRlIF9sZWZ0dHJhaWw6TGF5YS5UcmFpbFNwcml0ZTNEO1xyXG4gICAgcHJpdmF0ZSBfcmlnaHR0cmFpbDpMYXlhLlRyYWlsU3ByaXRlM0Q7XHJcblxyXG4gICAgcmVzb3VzZU5hbWU6c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpXHJcbiAgICB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Bd2FrZSgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fYW5pbWF0b3IgPSAodGhpcy5vd25lciBhcyBMYXlhLlNwcml0ZTNEKS5nZXRDb21wb25lbnQoIExheWEuQW5pbWF0b3IgKTtcclxuICAgICAgICBTY2VuZTNkT2JqZWN0LnNldEFuaW1hdG9yKCB0aGlzLl9hbmltYXRvciApO1xyXG4gICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzID0gbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKTtcclxuICAgICAgICB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IHRoaXMub3duZXIgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSBzcC50cmFuc2Zvcm07XHJcbiAgICAgICAgdGhpcy5fcm9sZVZPID0gKE1WQ09iamVjdFBvb2wuZ2V0SW5zdGFuY2UoKS5nZXRQcm94eSggVXNlckluZm9Qcm94eSApIGFzIFVzZXJJbmZvUHJveHkpLnJvbGVWTztcclxuICAgICAgICAoIHNwLmdldENvbXBvbmVudCggTGF5YS5SaWdpZGJvZHkzRCApIGFzIExheWEuUmlnaWRib2R5M0QgKS5jY2RNb3Rpb25UaHJlc2hvbGQgPSAwLjAwMTtcclxuICAgICAgICB0aGlzLl9sZWZ0dHJhaWwgPSBzcC5nZXRDaGlsZEJ5TmFtZShcImxlZnR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0Q7XHJcbiAgICAgICAgdGhpcy5fcmlnaHR0cmFpbCA9IHNwLmdldENoaWxkQnlOYW1lKFwicmlnaHR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0Q7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRW5hYmxlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN0YXJ0KClcclxuICAgIHtcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pbml0UG9zVmVjOkxheWEuVmVjdG9yMztcclxuICAgIHB1YmxpYyBzdGFydFJ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICAvLyB0aGlzLnB6ZGljdCA9IHt9O1xyXG4gICAgICAgIC8vIHRoaXMucHphcnIgPSBbXTtcclxuICAgICAgICB0aGlzLl9iZWlzaHVWZWMueCA9IDE7XHJcbiAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnkgPSAxO1xyXG4gICAgICAgIHRoaXMuX2JlaXNodVZlYy56ID0gMTtcclxuICAgICAgICB0aGlzLl9qaWFzdWJ1ZmZUaW1lID0gMDtcclxuICAgICAgICB0aGlzLl9pc1NodWFuZ2JlaWppYXN1ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fbGFzdGppYXN1U3RhdGUgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuX2VuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2NoYW5nZU1vdmVYID0gMDtcclxuICAgICAgICB0aGlzLl9pbml0UG9zVmVjID0gdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5fbm93YnVpbGRuYW1lID0gXCJcIjtcclxuICAgICAgICB0aGlzLl9ub3dzY2VuZW5hbWUgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueCA9IDA7XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueSA9IDA7XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueiA9IC10aGlzLl9yb2xlVk8ubW92ZXNwZWVkO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcIuW8gOWni+i3kVwiICk7XHJcbiAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gdHJ1ZTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuaW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICAvLyBwcml2YXRlIHB6ZGljdDphbnkgPSB7fTtcclxuICAgIC8vIHByaXZhdGUgcHphcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgLyoqXHJcbiAgICAgKiDlvIDlp4vnorDmkp7ml7bmiafooYxcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29sbGlzaW9uRW50ZXIoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIHtcclxuICAgICAgICBpZiggY29sbGlzaW9uICYmIGNvbGxpc2lvbi5jb250YWN0cyAmJiBjb2xsaXNpb24uY29udGFjdHMubGVuZ3RoID4gMCAmJiBjb2xsaXNpb24ub3RoZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludDpMYXlhLkNvbnRhY3RQb2ludCA9IGNvbGxpc2lvbi5jb250YWN0c1swXTtcclxuICAgICAgICAgICAgdGhpcy5qaXN1YW5Db2xsaXNpb24oIGNvbnRhY3RQb2ludC5ub3JtYWwsY29sbGlzaW9uLm90aGVyLm93bmVyLGNvbnRhY3RQb2ludC5wb3NpdGlvbk9uQik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2lzQ29sbGluZzpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9ub3dDb2xsVGFyZ2V0TmFtZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBfbm9ybWFsaXplVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBcclxuICAgIHByaXZhdGUgX25vd3NlbGVjdFZlYzpMYXlhLlZlY3RvcjM7XHJcblxyXG4gICAgcHJpdmF0ZSBfbm93YnVpbGRuYW1lOnN0cmluZyA9IFwiXCI7XHJcbiAgICBcclxuICAgIHByaXZhdGUgX25vd3NjZW5lbmFtZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiAwOuacqumUge+8jDHvvJrplIHlt6bovrnvvIwy77ya6ZSB5Y+z6L65XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvY2t4c3RhdGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgc2V0bm93U2VsZWN0VmVjKCBwb3M6TGF5YS5WZWN0b3IzICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IHBvcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9sb2NrYnlCdWlsZG5hbWU6c3RyaW5nID0gXCJcIjtcclxuICAgIC8qKlxyXG4gICAgICogMDrmnKrooqvplIHvvIwx77ya6ZSB5a6a5bem6L6577yMMu+8mumUgeWumuWPs+i+ue+8jFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9sb2Nrc3RhdGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9zaGFuZ3BhVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcblxyXG4gICAgcHJpdmF0ZSBqaXN1YW5Db2xsaXNpb24oIG5vcm1hbDpMYXlhLlZlY3RvcjMsdGFyZ2V0OkxheWEuTm9kZSxjb2xscG9pbnQ6TGF5YS5WZWN0b3IzICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0YXJnZXQubmFtZSA9PSBcIlNsaWRlckJvb3N0XCIgfHwgdGFyZ2V0Lm5hbWUuaW5kZXhPZiggXCJucGNcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgPSB0YXJnZXQubmFtZTtcclxuICAgICAgICB2YXIgbjpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgICAgIExheWEuVmVjdG9yMy5ub3JtYWxpemUobm9ybWFsLHRoaXMuX25vcm1hbGl6ZVZlYyk7XHJcbiAgICAgICAgRGVidWdlci5sb2coIFwi5byA5aeL56Kw5pKeXCIsdGhpcy5fbm9ybWFsaXplVmVjLHRhcmdldC5uYW1lICk7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIHx8IHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiU2NhZmZvbGRpbmdcIiApICE9IC0xIHx8IFxyXG4gICAgICAgICAgICB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEpIC8v56Kw5Yiw5bu6562R77yM5Yik5pat5piv5LiK54is77yM5bem54is6L+Y5piv5Y+z54isXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3didWlsZG5hbWUgPSB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd3NjZW5lbmFtZSA9IHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFNjZW5lM2RPYmplY3QuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQucGFyZW50Lm5hbWUsdGFyZ2V0LnBhcmVudC5uYW1lICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBTY2VuZTNkT2JqZWN0LmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWUsdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgKTtcclxuICAgICAgICAgICAgfSAgIFxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy56ID09IC0xICkgLy/kuIrniKxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3NlbGVjdFZlYyAmJiB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSA+ICh0aGlzLl9ub3dzZWxlY3RWZWMueSAtIDAuMikgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54LHRoaXMuX25vd3NlbGVjdFZlYy55LHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJ1bjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuQ2xpbWI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMucHpkaWN0W3RoaXMuX25vd0NvbGxUYXJnZXROYW1lXSA9IFJvbGVBY3Rpb25zLkNsaW1iO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMucHphcnIucHVzaCggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy55ID09IDEgfHx0aGlzLl9ub3JtYWxpemVWZWMueSA9PSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnggPT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5DbGltYiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmxlZnRfY2xpbWI7ICAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy54ID09IDEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5DbGltYiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2NsaW1iOyAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy56ICE9IDEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5sb2NrY2xpbWI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwicGFuZWxfanVtcFwiICkgIT0gLTEgKSAvL+WKoOmAn+adv+i3s+i3g1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmppYXN1SnVtcDtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKFwicGFuZWxfZG93bnNsaXBcIikgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmRvd25TbGlkZTtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYm94X0JvYXJkXCIgKSAhPSAtMSAmJiB0aGlzLm5vd1N0YXRlICE9IFJvbGVBY3Rpb25zLmRvd25TbGlkZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnogPT0gLTEgKSAvL+S4iueIrFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuQ2xpbWI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaGFuZ3BhVmVjID0gdGhpcy5fbm93c2VsZWN0VmVjLmNsb25lKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJib3hfc2lkZWp1bXBcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5zbGlkZWppYXN1O1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJib3hfU3VybW91bnRcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5zdXJtb3VudDtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuQ2xpbWI7XHJcbiAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOaMgee7reeisOaSnuaXtuaJp+ihjFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgIG9uQ29sbGlzaW9uU3RheShjb2xsaXNpb246TGF5YS5Db2xsaXNpb24pOnZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgLy8gRGVidWdlci5sb2coIFwi56Kw5pKe5LitXCIgKTtcclxuICAgICAgICBpZiggY29sbGlzaW9uICYmIGNvbGxpc2lvbi5jb250YWN0cyAmJiBjb2xsaXNpb24uY29udGFjdHMubGVuZ3RoID4gMCAmJiBjb2xsaXNpb24ub3RoZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faXNDb2xsaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludDpMYXlhLkNvbnRhY3RQb2ludCA9IGNvbGxpc2lvbi5jb250YWN0c1swXTtcclxuICAgICAgICAgICAgdmFyIHRhcmdldCA9IGNvbGxpc2lvbi5vdGhlci5vd25lcjtcclxuICAgICAgICAgICAgdmFyIHRhcmdldG5hbWU6c3RyaW5nID0gdGFyZ2V0Lm5hbWU7XHJcbiAgICAgICAgICAgIGlmKCB0YXJnZXRuYW1lICE9IFwiU2xpZGVyQm9vc3RcIiAmJiB0YXJnZXRuYW1lLmluZGV4T2YoIFwibnBjXCIgKSA9PSAtMSAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZSA9IHRhcmdldG5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIHx8IHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiU2NhZmZvbGRpbmdcIiApICE9IC0xIHx8XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEgKSAvL+eisOWIsOW7uuetke+8jOWIpOaWreaYr+S4iueIrO+8jOW3pueIrOi/mOaYr+WPs+eIrFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd2J1aWxkbmFtZSA9IHRoaXMuX25vd0NvbGxUYXJnZXROYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3NjZW5lbmFtZSA9IHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gU2NlbmUzZE9iamVjdC5nZXRQb3NWZWNieVNjZW5lKCB0YXJnZXQucGFyZW50LnBhcmVudC5wYXJlbnQubmFtZSx0YXJnZXQucGFyZW50Lm5hbWUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBTY2VuZTNkT2JqZWN0LmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWUsdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgKTtcclxuICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDnu5PmnZ/norDmkp7ml7bmiafooYxcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29sbGlzaW9uRXhpdChjb2xsaXNpb246TGF5YS5Db2xsaXNpb24pOnZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNDb2xsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYoIGNvbGxpc2lvbiAmJiBjb2xsaXNpb24uY29udGFjdHMgJiYgY29sbGlzaW9uLmNvbnRhY3RzLmxlbmd0aCA+IDAgJiYgY29sbGlzaW9uLm90aGVyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWN0UG9pbnQ6TGF5YS5Db250YWN0UG9pbnQgPSBjb2xsaXNpb24uY29udGFjdHNbMF07XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tlbmRDb2xsKCBjb250YWN0UG9pbnQubm9ybWFsLGNvbGxpc2lvbi5vdGhlci5vd25lciApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrZW5kQ29sbCggbm9ybWFsOkxheWEuVmVjdG9yMyx0YXJnZXQ6TGF5YS5Ob2RlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcIue7k+adn+eisOaSnlwiLHRhcmdldC5uYW1lICk7XHJcbiAgICAgICAgaWYoIHRhcmdldC5uYW1lID09IFwiU2xpZGVyQm9vc3RcIiB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcIm5wY1wiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5pc2ZvcmNlSnVtcCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmlzZm9yY2VKdW1wID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuX2xvY2t4c3RhdGUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lICE9IHRhcmdldC5uYW1lIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRhcmdldC5uYW1lLmluZGV4T2YoIFwicGFuZWxfanVtcFwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCLorqHnrpfnorDmkp7lrozmiJDnirbmgIFcIiApO1xyXG4gICAgICAgIHN3aXRjaCggdGhpcy5ub3dTdGF0ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLkNsaW1iOlxyXG4gICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxvY2tjbGltYjpcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJveF9Cb2FyZFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SnVtcFN0YXRlKCB0aGlzLl9jaGFuZ2VNb3ZlWCApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhciBpc3RvVG9wOmJvb2xlYW4gPSBTY2VuZTNkT2JqZWN0LmNoZWNraXNDbGltYlRvcCggdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZSx0YXJnZXQubmFtZSx0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiggaXN0b1RvcCApXHJcbiAgICAgICAgICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBEZWJ1Z2VyLmxvZyggXCLmkq3mlL7niKzmpbzlrozmiJDliqjkvZxcIiApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucGxheVBhbG91QWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLnBsYXlBbm1vKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2p1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBlbHNlIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucmlnaHRfanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnJpZ2h0X2NsaW1iOlxyXG4gICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRfY2xpbWI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEp1bXBTdGF0ZSggdGhpcy5fY2hhbmdlTW92ZVggKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucnVuOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRKdW1wU3RhdGUoIHRoaXMuX2NoYW5nZU1vdmVYICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnhzaHVueWk6XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SnVtcFN0YXRlKCB0aGlzLl9zcGVlZE1vdmVWMy54ICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEp1bXBTdGF0ZSggdmFsdWU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB2YWx1ZSA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2p1bXA7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dTdGF0ZSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB2YWx1ZSA8IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmxlZnRfanVtcDtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5qdW1wO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwbGF5QW5tbyggYWN0aW5OYW1lOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmNsaW1iZW5kICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhY3Rpb25Db21wZWx0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucnVuO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfbGFzdFN0YXRlOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9tb3ZlVGltZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX2lzQWN0aW9uTnVtczpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9pc25lZWRhY3Rpb25udW06bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX25lZWRhY3Rpb250aW1lOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDpgJ9idWZmdmVjXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xhc3RqaWFzdVN0YXRlOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9qaWFzdWJ1ZmZUaW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIGlzY2FuemhlbmRvbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSB6aGVuZG9uZ3RpbWU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2lzU2h1YW5nYmVpamlhc3U6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgX2JlaXNodVZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCAxLDEsMSApO1xyXG5cclxuICAgIHB1YmxpYyBzZXQgbm93U3RhdGUoIHZhbHVlOnN0cmluZyApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd1N0YXRlICE9IHZhbHVlIHx8IHRoaXMuX2xhc3RTdGF0ZSA9PSBSb2xlQWN0aW9ucy5qaWFzdUp1bXAgfHwgdGhpcy5fbm93U3RhdGUgPT0gUm9sZUFjdGlvbnMuamlhc3VKdW1wIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTdGF0ZSA9IHRoaXMuX25vd1N0YXRlO1xyXG4gICAgICAgICAgICB0aGlzLl9ub3dTdGF0ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuaXNjYW56aGVuZG9uZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5ndHJhaWxTdGF0ZSggdHJ1ZSApO1xyXG4gICAgICAgICAgICBzd2l0Y2goIHRoaXMuX25vd1N0YXRlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5zdGFuZDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMuc3RhbmQgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5ydW46XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2xhc3RTdGF0ZSA9PSBSb2xlQWN0aW9ucy5qdW1wIHx8IHRoaXMuX2xhc3RTdGF0ZSA9PSBSb2xlQWN0aW9ucy5sZWZ0X2p1bXAgfHx0aGlzLl9sYXN0U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfanVtcCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggc29ydCA8IDUwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmx1b2RpMSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmx1b2RpMiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmp1bXAgKTtcclxuICAgICAgICAgICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmdldEluc3RhbmNlKCkuc2V0bGl6aVBsYXl0YW5zZSggXCJ0YW5zZV9iYWlcIiwgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSB0aGlzLl9yb2xlVk8uZnJvbnRqdW1wLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX3JvbGVWTy5mcm9udGp1bXAueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fcm9sZVZPLmZyb250anVtcC56O1xyXG4gICAgICAgICAgICAgICAgICAgIFNvdW5kc3NNYW5hZ2VyLmdldEluc3RhbmNlKCkucGxheUdhbWVTb3VuZChcImp1bXBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS52aWJyYXRlU2hvcnQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5sZWZ0X2p1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5nZXRJbnN0YW5jZSgpLnNldGxpemlQbGF5dGFuc2UoIFwidGFuc2VfYmFpXCIsIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSB0aGlzLl9yb2xlVk8ubGVmdGp1bXAueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fcm9sZVZPLmxlZnRqdW1wLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3JvbGVWTy5sZWZ0anVtcC56O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMubGVmdGp1bXAgKTtcclxuICAgICAgICAgICAgICAgICAgICBTb3VuZHNzTWFuYWdlci5nZXRJbnN0YW5jZSgpLnBsYXlHYW1lU291bmQoXCJqdW1wXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRfanVtcDpcclxuICAgICAgICAgICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmdldEluc3RhbmNlKCkuc2V0bGl6aVBsYXl0YW5zZSggXCJ0YW5zZV9iYWlcIiwgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IHRoaXMuX3JvbGVWTy5yaWdodGp1bXAueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fcm9sZVZPLnJpZ2h0anVtcC55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9yb2xlVk8ucmlnaHRqdW1wLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5yaWdodGp1bXAgKTtcclxuICAgICAgICAgICAgICAgICAgICBTb3VuZHNzTWFuYWdlci5nZXRJbnN0YW5jZSgpLnBsYXlHYW1lU291bmQoXCJqdW1wXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuamlhc3VKdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGNmZzpCdWlsZENGRyA9IEJ1aWxkQ0ZHLmRpY3RbIFwicGFuZWxfanVtcFwiIF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2ppYXN1YnVmZlRpbWUgPiAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy54ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueiA9IGJ1aWxkY2ZnLmJ1ZmZ6ICogYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzU2h1YW5nYmVpamlhc3UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy55ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnogPSBidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5famlhc3VidWZmVGltZSA9IGJ1aWxkY2ZnLnRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4ICogdGhpcy5fYmVpc2h1VmVjLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6ICogdGhpcy5fYmVpc2h1VmVjLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlciA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsMTAwICk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPCA1MCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMuZGF0aWFvMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMuZGF0aWFvMiApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBTb3VuZHNzTWFuYWdlci5nZXRJbnN0YW5jZSgpLnBsYXlHYW1lU291bmQoXCJqdW1wXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsdGhpcy5wbGF5c3BlZWRTb3VuZCApO1xyXG4gICAgICAgICAgICAgICAgICAgIExheWEudGltZXIub25jZSggMjAwLHRoaXMsdGhpcy5wbGF5c3BlZWRTb3VuZCApO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuZG93blNsaWRlOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGNmZzpCdWlsZENGRyA9IEJ1aWxkQ0ZHLmRpY3RbIFwicGFuZWxfZG93bnNsaXBcIiBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9qaWFzdWJ1ZmZUaW1lID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy55ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnogPSBidWlsZGNmZy5idWZmeiAqIGJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1NodWFuZ2JlaWppYXN1ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnggPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy56ID0gYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ppYXN1YnVmZlRpbWUgPSBidWlsZGNmZy50aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSBidWlsZGNmZy5idWZmeCAqIHRoaXMuX2JlaXNodVZlYy54O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeSAqIHRoaXMuX2JlaXNodVZlYy55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6ICogdGhpcy5fYmVpc2h1VmVjLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5odWFjaGFuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5c3BlZWRTb3VuZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuc2xpZGVqaWFzdTpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcImJveF9zaWRlanVtcFwiIF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2ppYXN1YnVmZlRpbWUgPiAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy54ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueiA9IGJ1aWxkY2ZnLmJ1ZmZ6ICogYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzU2h1YW5nYmVpamlhc3UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy55ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnogPSBidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5famlhc3VidWZmVGltZSA9IGJ1aWxkY2ZnLnRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4ICogdGhpcy5fYmVpc2h1VmVjLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5ICogdGhpcy5fYmVpc2h1VmVjLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZnogKiB0aGlzLl9iZWlzaHVWZWMuejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlzcGVlZFNvdW5kKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS52aWJyYXRlU2hvcnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMuICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuc3VybW91bnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkY2ZnOkJ1aWxkQ0ZHID0gQnVpbGRDRkcuZGljdFsgXCJib3hfU3VybW91bnRcIiBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9qaWFzdWJ1ZmZUaW1lID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy55ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnogPSBidWlsZGNmZy5idWZmeiAqIGJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1NodWFuZ2JlaWppYXN1ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy54ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueiA9IGJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9qaWFzdWJ1ZmZUaW1lID0gYnVpbGRjZmcudGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gYnVpbGRjZmcuYnVmZnggKiB0aGlzLl9iZWlzaHVWZWMueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gKGJ1aWxkY2ZnLmJ1ZmZ5KzAuNSkgKiB0aGlzLl9iZWlzaHVWZWMueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fc3BlZWRNb3ZlVjMueipidWlsZGNmZy5idWZmeiAqIHRoaXMuX2JlaXNodVZlYy56O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMua3VhbGFuICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuQ2xpbWI6XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxvY2tjbGltYjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fcm9sZVZPLnVwY2xpbWI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnBhcWlhbmcgKTtcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLnZpYnJhdGVTaG9ydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNjYW56aGVuZG9uZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy56aGVuZG9uZ3RpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmd0cmFpbFN0YXRlKCBmYWxzZSApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRfY2xpbWI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX3JvbGVWTy5zbGlkZWNsaW1iLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3JvbGVWTy5zbGlkZWNsaW1iLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnBhb3FpYW5nbGVmdCApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmd0cmFpbFN0YXRlKCBmYWxzZSApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnJpZ2h0X2NsaW1iOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9yb2xlVk8uc2xpZGVjbGltYi55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9yb2xlVk8uc2xpZGVjbGltYi56O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5wYW9xaWFuZ3JpZ2h0ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ3RyYWlsU3RhdGUoIGZhbHNlICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucGxheVBhbG91QWN0aW9uOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZWVkYWN0aW9udGltZSA9IDAuMztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmNsaW1iZW5kICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHBsYXlzcGVlZFNvdW5kKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFNvdW5kc3NNYW5hZ2VyLmdldEluc3RhbmNlKCkucGxheUdhbWVTb3VuZChcInNwZWVkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbm93U3RhdGUoKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm93U3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGFuZ3RyYWlsU3RhdGUoIGJvOmJvb2xlYW4gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2xlZnR0cmFpbCAmJiB0aGlzLl9yaWdodHRyYWlsICYmIHRoaXMuX2xlZnR0cmFpbC5hY3RpdmUgIT0gYm8gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbGVmdHRyYWlsLmFjdGl2ZSA9IGJvO1xyXG4gICAgICAgICAgICB0aGlzLl9yaWdodHRyYWlsLmFjdGl2ZSA9IGJvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9tb3ZlVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIGlzUGVuZ3podWFuZzpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGp1bXBTcGVlZDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBqdW1wSGlnaHQ6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2Rpc3k6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBnOm51bWJlcj0xMDsvL+mHjeWKm+WKoOmAn+W6plxyXG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGR0ID0gMTY7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzY2FuTW92ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZGlzdGltZTpudW1iZXIgPSBkdC8xMDAwO1xyXG4gICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSArPSBkaXN0aW1lO1xyXG4gICAgICAgICAgICBzd2l0Y2goIHRoaXMubm93U3RhdGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnJ1bjovL+i3keWKqFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqICh0aGlzLl9zcGVlZE1vdmVWMy56ICogdGhpcy5fYmVpc2h1VmVjLnopO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDEgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAyIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5DbGltYjovL+eIrOWNh1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gZGlzdGltZSAqIHRoaXMuanVtcFNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9sb2Nrc3RhdGUgPT0gMiApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9zaGFuZ3BhVmVjIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSsxID4gdGhpcy5fc2hhbmdwYVZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnBsYXlQYWxvdUFjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9ub3dzZWxlY3RWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5wbGF5UGFsb3VBY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxvY2tjbGltYjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IGRpc3RpbWUgKiB0aGlzLmp1bXBTcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3NoYW5ncGFWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9zaGFuZ3BhVmVjLnkgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucGxheVBhbG91QWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9ub3dzZWxlY3RWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucGxheVBhbG91QWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCLniKzlopnliqjkvZznu5PmnZ/mkq3mlL5cIiApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5qdW1wOi8v6Lez6LeDXHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRfanVtcDpcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRfanVtcDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXN5ID0gdGhpcy5qdW1wU3BlZWQueSAtIHRoaXMuZypkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9kaXN5O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuX2Rpc3kqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSB0aGlzLmp1bXBTcGVlZC56ICpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5qaWFzdUp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLmcqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fZGlzeTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC54ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubGVmdF9jbGltYjpcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRfY2xpbWI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuanVtcFNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5qdW1wU3BlZWQueSpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnhzaHVueWk6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuX3NwZWVkTW92ZVYzLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fc3BlZWRNb3ZlVjMueCpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IDAuMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5kb3duU2xpZGU6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5qdW1wU3BlZWQueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuc2xpZGVqaWFzdTpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5famlhc3VidWZmVGltZSA8PSAwICYmIHRoaXMuX2xhc3RTdGF0ZT09Um9sZUFjdGlvbnMubGVmdF9jbGltYiB8fCB0aGlzLl9sYXN0U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfY2xpbWIgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IHRoaXMuX2xhc3RTdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmp1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dTdGF0ZSApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5zdXJtb3VudDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXN5ID0gdGhpcy5qdW1wU3BlZWQueSAtIHRoaXMuZypkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9kaXN5O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuX2Rpc3kqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSB0aGlzLmp1bXBTcGVlZC56ICpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnBsYXlQYWxvdUFjdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9ub3dzZWxlY3RWZWMpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgPCB0aGlzLl9ub3dzZWxlY3RWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSAoMS8wLjMpKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93c2VsZWN0VmVjICYmICh0aGlzLm5vd1N0YXRlID09IFJvbGVBY3Rpb25zLnJ1biB8fCB0aGlzLm5vd1N0YXRlID09IFJvbGVBY3Rpb25zLmRvd25TbGlkZSApICYmICF0aGlzLl9pc0NvbGxpbmcgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogPD0gdGhpcy5fbm93c2VsZWN0VmVjLnogKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2p1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuanVtcDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55IDwgU2NlbmUzZE9iamVjdC5kaWVQb3NZICkvL+inkuiJsuatu+S6oVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93c2NlbmVuYW1lID09IFwiXCIgfHwgdGhpcy5fbm93YnVpbGRuYW1lID09IFwiXCIgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX2luaXRQb3NWZWMuY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBTY2VuZTNkT2JqZWN0LmdldFBvc1ZlY2J5U2NlbmUoIHRoaXMuX25vd3NjZW5lbmFtZSx0aGlzLl9ub3didWlsZG5hbWUgKS5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJ1bjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogPCBTY2VuZTNkT2JqZWN0LmdhbWV3aW5Qb3NaIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53aW5nYW1lKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBTY2VuZTNkT2JqZWN0LnByb19qaW5kdS52YWx1ZSA9ICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiAvIFNjZW5lM2RPYmplY3QuZ2FtZXdpblBvc1ogKiAxMDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX2lzQWN0aW9uTnVtcyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9pc25lZWRhY3Rpb25udW0gPiAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9hbmltYXRvci5nZXRDdXJyZW50QW5pbWF0b3JQbGF5U3RhdGUoKS5ub3JtYWxpemVkVGltZSA+PSB0aGlzLl9pc25lZWRhY3Rpb25udW0pXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHRoaXMuX25vd0FjdGlvbk5hbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5yaWdodGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmRhdGlhbzE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmRhdGlhbzI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmt1YWxhbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMua29uZ3pob25nICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuaHVhY2hhbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnJ1biApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLngsdGhpcy5fbm93c2VsZWN0VmVjLnksdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5sdW9kaTE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmx1b2RpMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuaHVhY2hhbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbmVlZGFjdGlvbnRpbWUgIT0gMCAmJiB0aGlzLl9tb3ZlVGltZSA+IHRoaXMuX25lZWRhY3Rpb250aW1lIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHRoaXMuX25vd0FjdGlvbk5hbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5qdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnJpZ2h0anVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5kYXRpYW8xOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmRhdGlhbzI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5rb25nemhvbmcgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZU1vdmVYID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMua3VhbGFuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMua29uZ3pob25nICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmh1YWNoYW46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5ydW4gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCx0aGlzLl9ub3dzZWxlY3RWZWMueSx0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX2ppYXN1YnVmZlRpbWUgPiAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5famlhc3VidWZmVGltZSAtPSBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5nZXRJbnN0YW5jZSgpLmppYWR1bGl6aSggXCJqaWFzdWxpemlcIix0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gKTtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9pc1NodWFuZ2JlaWppYXN1IClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmdldEluc3RhbmNlKCkuamlhZHVsaXppMSggXCJqaWFzdWxpemlcIix0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy54ID0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy55ID0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy56ID0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzU2h1YW5nYmVpamlhc3UgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIFNjZW5lM2RPYmplY3QuZ2V0SW5zdGFuY2UoKS5jbG9zZUppYXN1bGl6aSggKTtcclxuICAgICAgICAgICAgICAgIFNjZW5lM2RPYmplY3QuZ2V0SW5zdGFuY2UoKS5jbG9zZUppYXN1bGl6aTEoICk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5pc2NhbnpoZW5kb25nIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy56aGVuZG9uZ3RpbWUrPSBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuemhlbmRvbmd0aW1lID49IDAuNSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy56aGVuZG9uZ3RpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9lbmRpbmcgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGlzdGltZTpudW1iZXIgPSBkdC8xMDAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgKz0gZGlzdGltZTtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+PSB0aGlzLl9lbmRhbm1vdGltZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRHYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5kQW5tb1NwZWVkMS54ID0gdGhpcy5fZW5kQW5tb1NwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueSA9IHRoaXMuX2VuZEFubW9TcGVlZC55ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQxLnogPSB0aGlzLl9lbmRBbm1vU3BlZWQueiAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgKCBTY2VuZTNkT2JqZWN0LmNhcm1hLmdldENvbXBvbmVudCggQ2FtZXJhc1NjcmlwdCApIGFzIENhbWVyYXNTY3JpcHQgKS5NeVJvdGF0ZUFyb3VuZCggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLCB0aGlzLl9lbmRBbm1vU3BlZWQxICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlbmRHYW1lKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2VuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5pbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbmRpbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfZW5kQW5tb1NwZWVkOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoKTtcclxuICAgIHByaXZhdGUgX2VuZGFubW90aW1lOm51bWJlciA9IDE7XHJcbiAgICBwcml2YXRlIF9lbmRBbm1vU3BlZWQxOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIHdpbmdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgU291bmRzc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wbGF5R2FtZVNvdW5kKFwiY29tcGxldGVcIik7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBHYW1lRXZlbnQuZW5kR2FtZSApO1xyXG4gICAgICAgIHZhciBjYXJtYVRyYW5zOkxheWEuVHJhbnNmb3JtM0QgPSBTY2VuZTNkT2JqZWN0LmNhcm1hLnRyYW5zZm9ybTtcclxuICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQueiA9ICh0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiAtIDIgLSBjYXJtYVRyYW5zLnBvc2l0aW9uLnopL3RoaXMuX2VuZGFubW90aW1lO1xyXG4gICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZC55ID0gKHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55IC0gY2FybWFUcmFucy5wb3NpdGlvbi55KS90aGlzLl9lbmRhbm1vdGltZTtcclxuICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQueCA9ICggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnggKyAzIC0gY2FybWFUcmFucy5wb3NpdGlvbi54ICkgLyB0aGlzLl9lbmRhbm1vdGltZTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMua29uZ3pob25nICk7XHJcbiAgICAgICAgU2NlbmUzZE9iamVjdC5nZXRJbnN0YW5jZSgpLmxpemllbmRnYW1lKCBcInlhbmh1YVwiLHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbixHYW1lU3RhdGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZW5kR2FtZVBsYXllckFyci5sZW5ndGggPT0gMD90cnVlOmZhbHNlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY2hhbmdlTW92ZVg6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIGlzZm9yY2VKdW1wOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIHF1YXRlcm5pb246TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjsgXHJcbiAgICBwdWJsaWMgam95U3RpY2tDSGFuZ2UoIHZhbHVlOm51bWJlcix2YWx1ZTE6bnVtYmVyLGFuZ2xlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlTW92ZVggPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5DbGltYiB8fCBSb2xlQWN0aW9ucy5sZWZ0X2NsaW1iIHx8IFJvbGVBY3Rpb25zLnJpZ2h0X2NsaW1iIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZU1vdmVYID0gdmFsdWUxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5sZWZ0X2NsaW1iICYmIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApIC8v5by65Yi26Lez6LeDXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmlzZm9yY2VKdW1wID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2p1bXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfY2xpbWIgJiYgdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmb3JjZUp1bXAgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5qdW1wIHx8XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMubGVmdF9qdW1wIHx8XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfanVtcCB8fFxyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID09IFJvbGVBY3Rpb25zLmppYXN1SnVtcCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhbmdsZSA9IC1hbmdsZSAqIE1hdGguUEkvMTgwO1xyXG4gICAgICAgICAgICBMYXlhLlF1YXRlcm5pb24uY3JlYXRlRnJvbUF4aXNBbmdsZSggbmV3IExheWEuVmVjdG9yMyggMCwxLDAgKSxhbmdsZSx0aGlzLnF1YXRlcm5pb24gKTtcclxuICAgICAgICAgICAgdmFyIGp1bXB6Om51bWJlciA9IHRoaXMuanVtcFNwZWVkLno7XHJcbiAgICAgICAgICAgIExheWEuVmVjdG9yMy50cmFuc2Zvcm1RdWF0KCB0aGlzLmp1bXBTcGVlZCx0aGlzLnF1YXRlcm5pb24sdGhpcy5qdW1wU3BlZWQgKTtcclxuICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IGp1bXB6O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgeHNodW55aSggc3RhdGU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLm5vd1N0YXRlID09IFJvbGVBY3Rpb25zLnJ1biApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzLnggPSBzdGF0ZSAqIDIwO1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMueHNodW55aTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbm93QWN0aW9uTmFtZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgc2V0QWN0aW9uKCBhY3Rpb25OYW1lOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9ub3dBY3Rpb25OYW1lID0gYWN0aW9uTmFtZTtcclxuICAgICAgICBpZiggdGhpcy5fYW5pbWF0b3IgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0FjdGlvbk5hbWUgPT0gUm9sZUFjdGlvbnMuY2xpbWJlbmQgfHwgdGhpcy5fbm93QWN0aW9uTmFtZSA9PSBSb2xlQWN0aW9ucy5sdW9kaTEgfHwgdGhpcy5fbm93QWN0aW9uTmFtZSA9PSBSb2xlQWN0aW9ucy5sdW9kaTIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hbmltYXRvci5zcGVlZCA9IDEuNTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLnNwZWVkID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9hbmltYXRvci5wbGF5KGFjdGlvbk5hbWUsMCwwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYoIGFjdGlvbk5hbWUgPT0gUm9sZUFjdGlvbnMuc3RhbmQgKVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5fYW5pbWF0b3IucGxheShhY3Rpb25OYW1lKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gZWxzZVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgLy8gdGhpcy5fYW5pbWF0b3IuY3Jvc3NGYWRlKGFjdGlvbk5hbWUsIDAuMDIsIDApO1xyXG4gICAgICAgIC8vICAgICB0aGlzLl9hbmltYXRvci5wbGF5KGFjdGlvbk5hbWUpO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2VzaGl0aWFveXVlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5qdW1wO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblVwZGF0ZSgpXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkxhdGVVcGRhdGUoKVxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzcG9zZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBUaW1lclNlcnZpY2UuaW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc3Ryb3koKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLmluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxufSIsImltcG9ydCBUaW1lclNlcnZpY2UgZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCBTY2VuZTNkT2JqZWN0IGZyb20gXCIuLi9zY2VuZTNkcy9TY2VuZTNkT2JqZWN0XCI7XHJcbmltcG9ydCBSb2xlQWN0aW9ucyBmcm9tIFwiLi4vc2NlbmUzZHMvUm9sZUFjdGlvbnNcIjtcclxuaW1wb3J0IFJvbGVWTyBmcm9tIFwiLi4vdXNlcmluZm8vdm8vUm9sZVZPXCI7XHJcbmltcG9ydCBNVkNPYmplY3RQb29sIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL212Yy9NVkNPYmplY3RQb29sXCI7XHJcbmltcG9ydCBVc2VySW5mb1Byb3h5IGZyb20gXCIuLi91c2VyaW5mby9Vc2VySW5mb1Byb3h5XCI7XHJcbmltcG9ydCBCdWlsZENGRyBmcm9tIFwiLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9CdWlsZENGR1wiO1xyXG5pbXBvcnQgeyBXb3JkVGlwc1V0aWxzIH0gZnJvbSBcIi4uL2xvYWRpbmcvdmlldy9Xb3JkVGlwc1V0aWxzXCI7XHJcbmltcG9ydCBDYW1lcmFzU2NyaXB0IGZyb20gXCIuL0NhbWVyYXNTY3JpcHRcIjtcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL2V2ZW50cy9FdmVudFV0aWxzXCI7XHJcbmltcG9ydCBHYW1lRXZlbnQgZnJvbSBcIi4uL3VzZXJpbmZvL2V2ZW50cy9HYW1lRXZlbnRcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgTnBjQ0ZHIGZyb20gXCIuLi8uLi9jb25maWdzL2RhdGFDb25maWdzL05wY0NGR1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTnBjU2NyaXB0IGV4dGVuZHMgTGF5YS5TY3JpcHQzRCBpbXBsZW1lbnRzIElUaW1lclxyXG57XHJcbiAgICBwcml2YXRlIF90cmFuc2Zvcm06TGF5YS5UcmFuc2Zvcm0zRDtcclxuICAgIHByaXZhdGUgX2lzY2FuTW92ZTpib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfc3BlZWRNb3ZlVjM6TGF5YS5WZWN0b3IzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUm9sZUFjdGlvblxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9ub3dTdGF0ZTpzdHJpbmcgPSBcIlwiO1xyXG5cclxuXHJcbiAgICBwcml2YXRlIF9hbmltYXRvcjpMYXlhLkFuaW1hdG9yO1xyXG5cclxuICAgIHJlc291c2VOYW1lOnN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBfc2hhbmdwYVZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKClcclxuICAgIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkF3YWtlKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9hbmltYXRvciA9ICh0aGlzLm93bmVyIGFzIExheWEuU3ByaXRlM0QpLmdldENvbXBvbmVudCggTGF5YS5BbmltYXRvciApO1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3Quc2V0QW5pbWF0b3IoIHRoaXMuX2FuaW1hdG9yICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3RhcnQoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzID0gbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKTtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSAodGhpcy5vd25lciBhcyBMYXlhLlNwcml0ZTNEKS50cmFuc2Zvcm07XHJcbiAgICAgICAgdmFyIHNwOkxheWEuU3ByaXRlM0QgPSB0aGlzLm93bmVyIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgKHNwLmdldENoaWxkQnlOYW1lKFwibGVmdHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRCkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgKHNwLmdldENoaWxkQnlOYW1lKFwicmlnaHR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0QgKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pbml0UG9zVmVjOkxheWEuVmVjdG9yMztcclxuICAgIC8qKlxyXG4gICAgICog54q25oCB77yMMO+8muetieW+heeKtuaAge+8jDHvvJrlvIDlp4vnirbmgIHvvIwy77ya5a6M5oiQ54q25oCBXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX25vd1JvbGVTdGF0ZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBzdGFydFJ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9jaGVja3RpbWUgPSA1MDA7XHJcbiAgICAgICAgdGhpcy5fbm93Um9sZVN0YXRlID0gMTtcclxuICAgICAgICB0aGlzLl9lbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9jaGFuZ2VNb3ZlWCA9IDA7XHJcbiAgICAgICAgdGhpcy5faW5pdFBvc1ZlYyA9IHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi5jbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuX25vd2J1aWxkbmFtZSA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5fbm93c2NlbmVuYW1lID0gXCJcIjtcclxuICAgICAgICB0aGlzLl9ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnN0YW5kO1xyXG4gICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueCA9IDA7XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueSA9IDA7XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueiA9IC10aGlzLm1vdmVzcGVlZDtcclxuICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSB0cnVlO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5pbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9ub3dOcGNDZmc6TnBjQ0ZHO1xyXG5cclxuICAgIG1vdmVzcGVlZDpudW1iZXIgPSAwO1xyXG4gICAgZnJvbnRqdW1wOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBsZWZ0anVtcDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcmlnaHRqdW1wOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICB1cGNsaW1iOm51bWJlciA9IDA7XHJcbiAgICBzbGlkZWNsaW1iOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcblxyXG4gICAgcHVibGljIHNldG5wY0NGRyggY2ZnOk5wY0NGRyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9ub3dOcGNDZmcgPSBjZmc7XHJcbiAgICAgICAgdGhpcy5tb3Zlc3BlZWQgPSB0aGlzLl9ub3dOcGNDZmcuc3BlZWQ7XHJcbiAgICAgICAgdGhpcy5mcm9udGp1bXAueCA9IE51bWJlciggdGhpcy5fbm93TnBjQ2ZnLmZyb250anVtcC54ICk7XHJcbiAgICAgICAgdGhpcy5mcm9udGp1bXAueSA9IE51bWJlciggdGhpcy5fbm93TnBjQ2ZnLmZyb250anVtcC55ICk7XHJcbiAgICAgICAgdGhpcy5mcm9udGp1bXAueiA9IE51bWJlciggdGhpcy5fbm93TnBjQ2ZnLmZyb250anVtcC56ICk7XHJcblxyXG4gICAgICAgIHRoaXMubGVmdGp1bXAueCA9IE51bWJlciggdGhpcy5fbm93TnBjQ2ZnLmxlZnRqdW1wLnggKTtcclxuICAgICAgICB0aGlzLmxlZnRqdW1wLnkgPSBOdW1iZXIoIHRoaXMuX25vd05wY0NmZy5sZWZ0anVtcC55ICk7XHJcbiAgICAgICAgdGhpcy5sZWZ0anVtcC56ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNDZmcubGVmdGp1bXAueiApO1xyXG5cclxuICAgICAgICB0aGlzLnJpZ2h0anVtcC54ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNDZmcucmlnaHRqdW1wLnggKTtcclxuICAgICAgICB0aGlzLnJpZ2h0anVtcC55ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNDZmcucmlnaHRqdW1wLnkgKTtcclxuICAgICAgICB0aGlzLnJpZ2h0anVtcC56ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNDZmcucmlnaHRqdW1wLnogKTtcclxuXHJcbiAgICAgICAgdGhpcy51cGNsaW1iID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNDZmcudXBjbGltYiApO1xyXG5cclxuICAgICAgICB0aGlzLnNsaWRlY2xpbWIueCA9IE51bWJlciggdGhpcy5fbm93TnBjQ2ZnLnNsaWRlY2xpbWIueCApO1xyXG4gICAgICAgIHRoaXMuc2xpZGVjbGltYi55ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNDZmcuc2xpZGVjbGltYi55ICk7XHJcbiAgICAgICAgdGhpcy5zbGlkZWNsaW1iLnogPSBOdW1iZXIoIHRoaXMuX25vd05wY0NmZy5zbGlkZWNsaW1iLnogKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDlvIDlp4vnorDmkp7ml7bmiafooYxcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29sbGlzaW9uRW50ZXIoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIHtcclxuICAgICAgICBpZiggY29sbGlzaW9uICYmIGNvbGxpc2lvbi5jb250YWN0cyAmJiBjb2xsaXNpb24uY29udGFjdHMubGVuZ3RoID4gMCAmJiBjb2xsaXNpb24ub3RoZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludDpMYXlhLkNvbnRhY3RQb2ludCA9IGNvbGxpc2lvbi5jb250YWN0c1swXTtcclxuICAgICAgICAgICAgdGhpcy5qaXN1YW5Db2xsaXNpb24oIGNvbnRhY3RQb2ludC5ub3JtYWwsY29sbGlzaW9uLm90aGVyLm93bmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaXNDb2xsaW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX25vd0NvbGxUYXJnZXROYW1lOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9ub3JtYWxpemVWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfbm93c2VsZWN0VmVjOkxheWEuVmVjdG9yMztcclxuXHJcbiAgICBwcml2YXRlIF9ub3didWlsZG5hbWU6c3RyaW5nID0gXCJcIjtcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfbm93c2NlbmVuYW1lOnN0cmluZyA9IFwiXCI7XHJcbiAgICAvKipcclxuICAgICAqIDA65pyq6ZSB77yMMe+8mumUgeW3pui+ue+8jDLvvJrplIHlj7PovrlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbG9ja3hzdGF0ZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBzZXRub3dTZWxlY3RWZWMoIHBvczpMYXlhLlZlY3RvcjMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gcG9zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2xvY2tieUJ1aWxkbmFtZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiAwOuacquiiq+mUge+8jDHvvJrplIHlrprlt6bovrnvvIwy77ya6ZSB5a6a5Y+z6L6577yMXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvY2tzdGF0ZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBqaXN1YW5Db2xsaXNpb24oIG5vcm1hbDpMYXlhLlZlY3RvcjMsdGFyZ2V0OkxheWEuTm9kZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0Lm5hbWUgPT0gXCJTbGlkZXJCb29zdFwiIHx8IHRhcmdldC5uYW1lLmluZGV4T2YoIFwibnBjXCIgKSAhPSAtMSB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcInJvbGVcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgPSB0YXJnZXQubmFtZTtcclxuICAgICAgICB2YXIgbjpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgICAgIExheWEuVmVjdG9yMy5ub3JtYWxpemUobm9ybWFsLHRoaXMuX25vcm1hbGl6ZVZlYyk7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIHx8IHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiU2NhZmZvbGRpbmdcIiApICE9IC0xIHx8XHJcbiAgICAgICAgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xICkgLy/norDliLDlu7rnrZHvvIzliKTmlq3mmK/kuIrniKzvvIzlt6bniKzov5jmmK/lj7PniKxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJ1aWxkXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd2J1aWxkbmFtZSA9IHRoaXMuX25vd0NvbGxUYXJnZXROYW1lO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93c2NlbmVuYW1lID0gdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gU2NlbmUzZE9iamVjdC5nZXRQb3NWZWNieVNjZW5lKCB0YXJnZXQucGFyZW50LnBhcmVudC5wYXJlbnQubmFtZSx0YXJnZXQucGFyZW50Lm5hbWUgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFNjZW5lM2RPYmplY3QuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZSx0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZSApO1xyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnogPT0gLTEgKSAvL+S4iueIrFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93c2VsZWN0VmVjICYmIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55ID4gKHRoaXMuX25vd3NlbGVjdFZlYy55IC0gMC4xKSAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54LHRoaXMuX25vd3NlbGVjdFZlYy55LHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJ1bjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuQ2xpbWI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy55ID09IDEgfHx0aGlzLl9ub3JtYWxpemVWZWMueSA9PSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnggPT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5DbGltYiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmxlZnRfY2xpbWI7ICAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy54ID09IDEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5DbGltYiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2NsaW1iOyAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy56ICE9IDEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5sb2NrY2xpbWI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwicGFuZWxfanVtcFwiICkgIT0gLTEgKSAvL+WKoOmAn+adv+i3s+i3g1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmppYXN1SnVtcDtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoXCJwYW5lbF9kb3duc2xpcFwiKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuZG93blNsaWRlO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJib3hfQm9hcmRcIiApICE9IC0xICYmIHRoaXMubm93U3RhdGUgIT0gUm9sZUFjdGlvbnMuZG93blNsaWRlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueiA9PSAtMSApIC8v5LiK54isXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5DbGltYjtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJveF9zaWRlanVtcFwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnNsaWRlamlhc3U7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dTdGF0ZSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJveF9TdXJtb3VudFwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnN1cm1vdW50O1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5DbGltYjtcclxuICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog5oyB57ut56Kw5pKe5pe25omn6KGMXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyAgb25Db2xsaXNpb25TdGF5KGNvbGxpc2lvbjpMYXlhLkNvbGxpc2lvbik6dm9pZCBcclxuICAgIHtcclxuICAgICAgICAvLyBEZWJ1Z2VyLmxvZyggXCLnorDmkp7kuK1cIiApO1xyXG4gICAgICAgIGlmKCBjb2xsaXNpb24gJiYgY29sbGlzaW9uLmNvbnRhY3RzICYmIGNvbGxpc2lvbi5jb250YWN0cy5sZW5ndGggPiAwICYmIGNvbGxpc2lvbi5vdGhlciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0NvbGxpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgY29udGFjdFBvaW50OkxheWEuQ29udGFjdFBvaW50ID0gY29sbGlzaW9uLmNvbnRhY3RzWzBdO1xyXG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gY29sbGlzaW9uLm90aGVyLm93bmVyO1xyXG4gICAgICAgICAgICB2YXIgdGFyZ2V0bmFtZTpzdHJpbmcgPSB0YXJnZXQubmFtZTtcclxuICAgICAgICAgICAgaWYoIHRhcmdldG5hbWUgIT0gXCJTbGlkZXJCb29zdFwiICYmIHRhcmdldG5hbWUuaW5kZXhPZiggXCJucGNcIiApID09IC0xICYmIHRhcmdldG5hbWUuaW5kZXhPZiggXCJyb2xlXCIgKSA9PSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lID0gdGFyZ2V0bmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgfHwgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJTY2FmZm9sZGluZ1wiICkgIT0gLTEgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApIC8v56Kw5Yiw5bu6562R77yM5Yik5pat5piv5LiK54is77yM5bem54is6L+Y5piv5Y+z54isXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJ1aWxkXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93YnVpbGRuYW1lID0gdGhpcy5fbm93Q29sbFRhcmdldE5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93c2NlbmVuYW1lID0gdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBTY2VuZTNkT2JqZWN0LmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50LnBhcmVudC5uYW1lLHRhcmdldC5wYXJlbnQubmFtZSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFNjZW5lM2RPYmplY3QuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZSx0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZSApO1xyXG4gICAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog57uT5p2f56Kw5pKe5pe25omn6KGMXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbGxpc2lvbkV4aXQoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzQ29sbGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmKCBjb2xsaXNpb24gJiYgY29sbGlzaW9uLmNvbnRhY3RzICYmIGNvbGxpc2lvbi5jb250YWN0cy5sZW5ndGggPiAwICYmIGNvbGxpc2lvbi5vdGhlciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY29udGFjdFBvaW50OkxheWEuQ29udGFjdFBvaW50ID0gY29sbGlzaW9uLmNvbnRhY3RzWzBdO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrZW5kQ29sbCggY29udGFjdFBvaW50Lm5vcm1hbCxjb2xsaXNpb24ub3RoZXIub3duZXIgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja2VuZENvbGwoIG5vcm1hbDpMYXlhLlZlY3RvcjMsdGFyZ2V0OkxheWEuTm9kZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0Lm5hbWUgPT0gXCJTbGlkZXJCb29zdFwiIHx8IHRhcmdldC5uYW1lLmluZGV4T2YoIFwibnBjXCIgKSAhPSAtMSB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcInJvbGVcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuaXNmb3JjZUp1bXAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pc2ZvcmNlSnVtcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAwO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZSAhPSB0YXJnZXQubmFtZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0YXJnZXQubmFtZS5pbmRleE9mKCBcInBhbmVsX2p1bXBcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoKCB0aGlzLm5vd1N0YXRlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuQ2xpbWI6XHJcbiAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubG9ja2NsaW1iOlxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYm94X0JvYXJkXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRKdW1wU3RhdGUoIHRoaXMuX2NoYW5nZU1vdmVYICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFyIGlzdG9Ub3A6Ym9vbGVhbiA9IFNjZW5lM2RPYmplY3QuY2hlY2tpc0NsaW1iVG9wKCB0YXJnZXQucGFyZW50LnBhcmVudC5uYW1lLHRhcmdldC5uYW1lLHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmKCBpc3RvVG9wIClcclxuICAgICAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIERlYnVnZXIubG9nKCBcIuaSreaUvueIrOalvOWujOaIkOWKqOS9nFwiICk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5wbGF5UGFsb3VBY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMucGxheUFubW8oXCJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucmlnaHRfanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dTdGF0ZSApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGVsc2UgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5sZWZ0X2p1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5yaWdodF9qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5sZWZ0X2p1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dTdGF0ZSApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRfY2xpbWI6XHJcbiAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubGVmdF9jbGltYjpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SnVtcFN0YXRlKCB0aGlzLl9jaGFuZ2VNb3ZlWCApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5ydW46XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEp1bXBTdGF0ZSggdGhpcy5fY2hhbmdlTW92ZVggKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMueHNodW55aTpcclxuICAgICAgICAgICAgdGhpcy5zZXRKdW1wU3RhdGUoIHRoaXMuX3NwZWVkTW92ZVYzLnggKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0SnVtcFN0YXRlKCB2YWx1ZTpudW1iZXIsaXNxdWFuemhvbmc6Ym9vbGVhbiA9IGZhbHNlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB2YWx1ZSA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2p1bXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHZhbHVlIDwgMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggaXNxdWFuemhvbmcgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhbGx2YWx1ZTpudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZGlyOnN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwibGVmdHJpZ2h0XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY0NmZy5qdW1wX2xlZnQgKyB0aGlzLl9ub3dOcGNDZmcuanVtcF9yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsYWxsdmFsdWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjQ2ZnLmp1bXBfbGVmdCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJyaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiZnJvbnRyaWdodFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsdmFsdWUgPSB0aGlzLl9ub3dOcGNDZmcuc3RhcnRfYWhlYWQgKyB0aGlzLl9ub3dOcGNDZmcuanVtcF9yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsYWxsdmFsdWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjQ2ZnLnN0YXJ0X2FoZWFkIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJmcm9udFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJyaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiZnJvbnRsZWZ0XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY0NmZy5zdGFydF9haGVhZCArIHRoaXMuX25vd05wY0NmZy5qdW1wX2xlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLGFsbHZhbHVlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzb3J0IDw9IHRoaXMuX25vd05wY0NmZy5zdGFydF9haGVhZCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwiZnJvbnRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwicmlnaHRcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwicmlnaHRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJsZWZ0XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcImxlZnRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJmcm9udFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJmcm9udFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY0NmZy5zdGFydF9haGVhZCArIHRoaXMuX25vd05wY0NmZy5qdW1wX2xlZnQgKyB0aGlzLl9ub3dOcGNDZmcuanVtcF9yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsYWxsdmFsdWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjQ2ZnLnN0YXJ0X2FoZWFkIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJmcm9udFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjQ2ZnLnN0YXJ0X2FoZWFkICsgdGhpcy5fbm93TnBjQ2ZnLmp1bXBfbGVmdCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJyaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggc2VsZWN0ZGlyIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucmlnaHRfanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmcm9udFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmp1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmp1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuanVtcDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5qdW1wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGxheUFubW8oIGFjdGluTmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5jbGltYmVuZCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWN0aW9uQ29tcGVsdGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJ1bjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9sYXN0U3RhdGU6c3RyaW5nID0gXCJcIjtcclxuICAgIHByaXZhdGUgX21vdmVUaW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9jaGl4dVRpbWU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9pc0FjdGlvbk51bXM6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfaXNuZWVkYWN0aW9ubnVtOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9uZWVkYWN0aW9udGltZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBzZXQgbm93U3RhdGUoIHZhbHVlOnN0cmluZyApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd1JvbGVTdGF0ZSA9PSAxIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dTdGF0ZSAhPSB2YWx1ZSB8fCB0aGlzLl9sYXN0U3RhdGUgPT0gUm9sZUFjdGlvbnMuamlhc3VKdW1wfHx0aGlzLl9sYXN0U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfanVtcCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTdGF0ZSA9IHRoaXMuX25vd1N0YXRlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93U3RhdGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lID0gMDtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5fbm93U3RhdGUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuc3RhbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMuc3RhbmQgKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnJ1bjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2xhc3RTdGF0ZSA9PSBSb2xlQWN0aW9ucy5qdW1wIHx8IHRoaXMuX2xhc3RTdGF0ZSA9PSBSb2xlQWN0aW9ucy5sZWZ0X2p1bXAgfHx0aGlzLl9sYXN0U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfanVtcCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCwxMDAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzb3J0IDwgNTAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5sdW9kaTEgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMubHVvZGkyICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5ydW4gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmp1bXAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IHRoaXMuZnJvbnRqdW1wLng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLmZyb250anVtcC55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5mcm9udGp1bXAuejtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRfanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IHRoaXMubGVmdGp1bXAueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMubGVmdGp1bXAueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMubGVmdGp1bXAuejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmxlZnRqdW1wICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5yaWdodF9qdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gdGhpcy5yaWdodGp1bXAueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMucmlnaHRqdW1wLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLnJpZ2h0anVtcC56O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucmlnaHRqdW1wICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5qaWFzdUp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGNmZzpCdWlsZENGRyA9IEJ1aWxkQ0ZHLmRpY3RbIFwicGFuZWxfanVtcFwiIF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSBidWlsZGNmZy5idWZmeDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbGFzdFN0YXRlID09IFJvbGVBY3Rpb25zLmppYXN1SnVtcCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLmp1bXBTcGVlZC56KmJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCwxMDAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPCA1MCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5kYXRpYW8xICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMuZGF0aWFvMiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5kb3duU2xpZGU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGNmZzpCdWlsZENGRyA9IEJ1aWxkQ0ZHLmRpY3RbIFwicGFuZWxfZG93bnNsaXBcIiBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gYnVpbGRjZmcuYnVmZng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoaXh1VGltZSA9IGJ1aWxkY2ZnLnRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5odWFjaGFuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBSb2xlQWN0aW9ucy5zbGlkZWppYXN1OlxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcImJveF9zaWRlanVtcFwiIF07XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuanVtcFNwZWVkLnggPSBidWlsZGNmZy5idWZmeDtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5O1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fc3BlZWRNb3ZlVjMueipidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5fY2hpeHVUaW1lID0gYnVpbGRjZmcudGltZTtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy4gKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnN1cm1vdW50OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcImJveF9TdXJtb3VudFwiIF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSBidWlsZGNmZy5idWZmeDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5KzAuNTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoaXh1VGltZSA9IGJ1aWxkY2ZnLnRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5rdWFsYW4gKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLkNsaW1iOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubG9ja2NsaW1iOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMudXBjbGltYjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucGFxaWFuZyApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubGVmdF9jbGltYjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLnNsaWRlY2xpbWIueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuc2xpZGVjbGltYi56O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnBhb3FpYW5nbGVmdCApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRfY2xpbWI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5zbGlkZWNsaW1iLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLnNsaWRlY2xpbWIuejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5wYW9xaWFuZ3JpZ2h0ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5wbGF5UGFsb3VBY3Rpb246XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25lZWRhY3Rpb250aW1lID0gMC4zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5jbGltYmVuZCApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbm93U3RhdGUoKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm93U3RhdGU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgX21vdmVWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUgaXNQZW5nemh1YW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUganVtcFNwZWVkOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIGp1bXBIaWdodDpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfZGlzeTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGc6bnVtYmVyPTEwOy8v6YeN5Yqb5Yqg6YCf5bqmXHJcbiAgICBwcml2YXRlIF9jaGVja3RpbWU6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fbm93Um9sZVN0YXRlID09IDEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZHQgPSAxNjtcclxuICAgICAgICAgICAgdGhpcy5fY2hlY2t0aW1lICs9IGR0O1xyXG4gICAgICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5pc2Nhcm1hbnBjIClcclxuICAgICAgICAgICAge1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGVja3RpbWUgPj0gNTAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja3RpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dOcGNDZmcgJiYgU2NlbmUzZE9iamVjdC5tYWluUm9sZSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogKyB0aGlzLl9ub3dOcGNDZmcuZGlzdGFuY2UgPCBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi56IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9pc2Nhbk1vdmUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGlzdGltZTpudW1iZXIgPSBkdC8xMDAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgKz0gZGlzdGltZTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5ub3dTdGF0ZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5ydW46Ly/ot5HliqhcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuX3NwZWVkTW92ZVYzLno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAxIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAyIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuQ2xpbWI6Ly/niKzljYdcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gZGlzdGltZSAqIHRoaXMuanVtcFNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDEgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9sb2Nrc3RhdGUgPT0gMiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3NoYW5ncGFWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX3NoYW5ncGFWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnBsYXlQYWxvdUFjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX25vd3NlbGVjdFZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucGxheVBhbG91QWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubG9ja2NsaW1iOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSBkaXN0aW1lICogdGhpcy5qdW1wU3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9zaGFuZ3BhVmVjIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9zaGFuZ3BhVmVjLnkgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5wbGF5UGFsb3VBY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX25vd3NlbGVjdFZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnBsYXlQYWxvdUFjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuanVtcDovL+i3s+i3g1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubGVmdF9qdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRfanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLmcqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmppYXN1SnVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLmcqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRfY2xpbWI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5yaWdodF9jbGltYjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuanVtcFNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuanVtcFNwZWVkLnkqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMueHNodW55aTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuX3NwZWVkTW92ZVYzLno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX3NwZWVkTW92ZVYzLngqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IDAuMSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmRvd25TbGlkZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5qdW1wU3BlZWQueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IHRoaXMuX2NoaXh1VGltZSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnNsaWRlamlhc3U6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbW92ZVRpbWUgPiB0aGlzLl9jaGl4dVRpbWUgJiYgdGhpcy5fbGFzdFN0YXRlPT1Sb2xlQWN0aW9ucy5sZWZ0X2NsaW1iIHx8IHRoaXMuX2xhc3RTdGF0ZSA9PSBSb2xlQWN0aW9ucy5yaWdodF9jbGltYiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSB0aGlzLl9sYXN0U3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dTdGF0ZSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5zdXJtb3VudDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLmcqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucGxheVBhbG91QWN0aW9uOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9ub3dzZWxlY3RWZWMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSA8IHRoaXMuX25vd3NlbGVjdFZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9ICgxLzAuMykqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3NlbGVjdFZlYyAmJiAodGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gfHwgdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5kb3duU2xpZGUgKSAmJiAhdGhpcy5faXNDb2xsaW5nIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogPD0gdGhpcy5fbm93c2VsZWN0VmVjLnogKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5yaWdodF9qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5sZWZ0X2p1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSA8IFNjZW5lM2RPYmplY3QuZGllUG9zWSApLy/op5LoibLmrbvkuqFcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93c2NlbmVuYW1lID09IFwiXCIgfHwgdGhpcy5fbm93YnVpbGRuYW1lID09IFwiXCIgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gdGhpcy5faW5pdFBvc1ZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBTY2VuZTNkT2JqZWN0LmdldFBvc1ZlY2J5U2NlbmUoIHRoaXMuX25vd3NjZW5lbmFtZSx0aGlzLl9ub3didWlsZG5hbWUgKS5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucnVuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56IDwgU2NlbmUzZE9iamVjdC5nYW1ld2luUG9zWiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aW5nYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5faXNBY3Rpb25OdW1zIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvL+WmguaenOW9k+WJjeaSreaUvnN0YXRl5bey57uP5pKt5pS+5a6M5LqG5LiA5qyhXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5fYW5pbWF0b3IuZ2V0Q3VycmVudEFuaW1hdG9yUGxheVN0YXRlKCkubm9ybWFsaXplZFRpbWUgPj0gdGhpcy5faXNuZWVkYWN0aW9ubnVtKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHRoaXMuX25vd0FjdGlvbk5hbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuZGF0aWFvMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmRhdGlhbzI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5rdWFsYW46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMua29uZ3pob25nICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5odWFjaGFuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54LHRoaXMuX25vd3NlbGVjdFZlYy55LHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5sdW9kaTE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5sdW9kaTI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25lZWRhY3Rpb250aW1lICE9IDAgJiYgdGhpcy5fbW92ZVRpbWUgPiB0aGlzLl9uZWVkYWN0aW9udGltZSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHRoaXMuX25vd0FjdGlvbk5hbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuZGF0aWFvMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmRhdGlhbzI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5rdWFsYW46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMua29uZ3pob25nICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5odWFjaGFuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54LHRoaXMuX25vd3NlbGVjdFZlYy55LHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9lbmRpbmcgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaXN0aW1lOm51bWJlciA9IGR0LzEwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgKz0gZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbW92ZVRpbWUgPj0gdGhpcy5fZW5kYW5tb3RpbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRHYW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueCA9IHRoaXMuX2VuZEFubW9TcGVlZC54ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5kQW5tb1NwZWVkMS55ID0gdGhpcy5fZW5kQW5tb1NwZWVkLnkgKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQxLnogPSB0aGlzLl9lbmRBbm1vU3BlZWQueiAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICggU2NlbmUzZE9iamVjdC5jYXJtYS5nZXRDb21wb25lbnQoIENhbWVyYXNTY3JpcHQgKSBhcyBDYW1lcmFzU2NyaXB0ICkuTXlSb3RhdGVBcm91bmQoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiwgdGhpcy5fZW5kQW5tb1NwZWVkMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVuZEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLmluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggR2FtZUV2ZW50LmVuZEdhbWUgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbmRpbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfZW5kQW5tb1NwZWVkOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoKTtcclxuICAgIHByaXZhdGUgX2VuZGFubW90aW1lOm51bWJlciA9IDE7XHJcbiAgICBwcml2YXRlIF9lbmRBbm1vU3BlZWQxOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIHdpbmdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLmluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHRoaXMuX25vd1JvbGVTdGF0ZSA9IDI7XHJcbiAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmtvbmd6aG9uZyApO1xyXG4gICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggR2FtZUV2ZW50Lm5wY2VuZEdhbWUsdGhpcy5vd25lci5uYW1lICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY2hhbmdlTW92ZVg6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIGlzZm9yY2VKdW1wOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIHF1YXRlcm5pb246TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjsgXHJcbiAgICBwdWJsaWMgam95U3RpY2tDSGFuZ2UoIHZhbHVlOm51bWJlcixhbmdsZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMucnVuIHx8IHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMuQ2xpbWIgfHwgUm9sZUFjdGlvbnMubGVmdF9jbGltYiB8fCBSb2xlQWN0aW9ucy5yaWdodF9jbGltYiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VNb3ZlWCA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5sZWZ0X2NsaW1iICYmIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApIC8v5by65Yi26Lez6LeDXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmlzZm9yY2VKdW1wID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2p1bXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfY2xpbWIgJiYgdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmb3JjZUp1bXAgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5qdW1wIHx8XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMubGVmdF9qdW1wIHx8XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfanVtcCB8fFxyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID09IFJvbGVBY3Rpb25zLmppYXN1SnVtcCApXHJcbiAgICAgICAgICAgIGFuZ2xlID0gLWFuZ2xlICogTWF0aC5QSS8xODA7XHJcbiAgICAgICAgICAgIExheWEuUXVhdGVybmlvbi5jcmVhdGVGcm9tQXhpc0FuZ2xlKCBuZXcgTGF5YS5WZWN0b3IzKCAwLDEsMCApLGFuZ2xlLHRoaXMucXVhdGVybmlvbiApO1xyXG4gICAgICAgICAgICBMYXlhLlZlY3RvcjMudHJhbnNmb3JtUXVhdCggdGhpcy5qdW1wU3BlZWQsdGhpcy5xdWF0ZXJuaW9uLHRoaXMuanVtcFNwZWVkICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHhzaHVueWkoIHN0YXRlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy54ID0gc3RhdGUgKiAzMDtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnhzaHVueWk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX25vd0FjdGlvbk5hbWU6c3RyaW5nO1xyXG4gICAgcHVibGljIHNldEFjdGlvbiggYWN0aW9uTmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbm93QWN0aW9uTmFtZSA9IGFjdGlvbk5hbWU7XHJcbiAgICAgICAgaWYoIHRoaXMuX2FuaW1hdG9yIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dBY3Rpb25OYW1lID09IFJvbGVBY3Rpb25zLmNsaW1iZW5kIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYW5pbWF0b3Iuc3BlZWQgPSAxLjU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hbmltYXRvci5zcGVlZCA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fYW5pbWF0b3IucGxheShhY3Rpb25OYW1lLDAsMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjZXNoaXRpYW95dWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmp1bXA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVXBkYXRlKClcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTGF0ZVVwZGF0ZSgpXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQb3N0aW9uKCk6TGF5YS5WZWN0b3IzXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm93c3RhdGUoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm93Um9sZVN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdG9wKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5pbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzdHJveSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBUaW1lclNlcnZpY2UuaW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJhc2VWaWV3IGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL212Yy9CYXNlVmlld1wiO1xyXG5pbXBvcnQgV2luZG93QW5tb1R5cGUgZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvbXZjL1dpbmRvd0FubW9UeXBlXCI7XHJcbmltcG9ydCBHYW1lU3RhdGVNYW5hZ2VyIGZyb20gXCIuLi9tYWluL0dhbWVTdGF0ZU1hbmFnZXJcIjtcclxuaW1wb3J0IHsgV29yZFRpcHNVdGlscyB9IGZyb20gXCIuLi9sb2FkaW5nL3ZpZXcvV29yZFRpcHNVdGlsc1wiO1xyXG5pbXBvcnQgVXNlckluZm9Qcm94eSBmcm9tIFwiLi4vdXNlcmluZm8vVXNlckluZm9Qcm94eVwiO1xyXG5pbXBvcnQgR2FtZVByb3h5IGZyb20gXCIuLi9tYWluL3Byb3h5cy9HYW1lUHJveHlcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCwgQWNjb3VudFVzZXIgfSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL0RlYnVnZXJcIjtcclxuaW1wb3J0IHsgUFJPVE9DT0xTLCBOZXR3b3JrTWFuYWdlciB9IGZyb20gXCIuLi8uLi9wbGF0Zm9ybS93eG1pbmlnYW1lL05ldHdvcmtNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFVpTWFuYWdlciB9IGZyb20gXCIuLi8uLi9tYW5hZ2Vycy9VaU1hbmFnZXJcIjtcclxuaW1wb3J0IENob3V0aVBhblZpZXcgZnJvbSBcIi4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL0Nob3V0aVBhblZpZXdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVSZXN1bHRWaWV3IGV4dGVuZHMgQmFzZVZpZXcgXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJHYW1lUmVzdWx0Vmlld1wiO1xyXG5cclxuICAgIGNfc3RhdGU6ZmFpcnlndWkuQ29udHJvbGxlcjtcclxuICAgIHR4dF9nb2xkOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICBidG5fMDpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgYnRuXzE6ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIGdldGdvbGQ6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2dhbWVQcm94eTpHYW1lUHJveHk7XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKCBnb2xkOm51bWJlciApIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJnYW1lcmVzdWx0XCIsZmFsc2UsV2luZG93QW5tb1R5cGUuV2luZG93QW5tb1R5cGVfbm9uZSwxICk7IFxyXG4gICAgICAgIHRoaXMuZ2V0Z29sZCA9IGdvbGQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2dhbWVQcm94eSA9IHRoaXMuZ2V0UHJveHkoIEdhbWVQcm94eSApO1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZSA9IHRoaXMuZ2V0Q29udHJvbGxlckJ5QmFtZSggXCJjX3N0YXRlXCIgKTtcclxuICAgICAgICB0aGlzLnR4dF9nb2xkLnRleHQgPSB0aGlzLmdldGdvbGQudG9TdHJpbmcoKTtcclxuICAgICAgICBpZiggR2FtZVN0YXRlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmVuZEdhbWVQbGF5ZXJBcnIubGVuZ3RoID09IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5idG5fMCxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5idG4wY2xpY2sgKTtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmJ0bl8xLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmJ0bjFjbGljayApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnRuMGNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFdvcmRUaXBzVXRpbHMuZ2V0SW5zdGFuY2UoKS5zaG93V29yZFRpcHMoIFwi5pqC5pyq5byA5pS+XCIgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICkgYXMgVXNlckluZm9Qcm94eSApLmNoYW5nZUdvbGQoIHRoaXMuZ2V0Z29sZCApO1xyXG4gICAgICAgICAgICB0aGlzLl9nYW1lUHJveHkucmV0dXJubWFpbnZpZXcoICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnRuMWNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgICggdGhpcy5nZXRQcm94eSggVXNlckluZm9Qcm94eSApIGFzIFVzZXJJbmZvUHJveHkgKS5jaGFuZ2VHb2xkKCB0aGlzLmdldGdvbGQgKTtcclxuICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICkgYXMgVXNlckluZm9Qcm94eSApLmFkZExldmVsKCAgKTtcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVByb3h5LnJldHVybm1haW52aWV3KCApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIFVzZXJJbmZvUHJveHkgKSBhcyBVc2VySW5mb1Byb3h5ICkuY2hhbmdlR29sZCggdGhpcy5nZXRnb2xkICk7XHJcbiAgICAgICAgICAgIHRoaXMuX2dhbWVQcm94eS5yZXR1cm5tYWludmlldyggKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHdpbnM6bnVtYmVyID0gR2FtZVN0YXRlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmVuZEdhbWVQbGF5ZXJBcnIubGVuZ3RoID09IDAgPzE6MDtcclxuICAgICAgICB2YXIgdXNlcmlkOmFueSA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuR2V0VXNlciggQWNjb3VudFVzZXIudXNlcl9pZCApO1xyXG4gICAgICAgIHZhciBhZ3JzID0gW3sgXCJ0XCI6UGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5TZXJ2ZXJUaW1lLnRvU3RyaW5nKCkgfSx7IFwicGxheV9pZFwiOnVzZXJpZCB9LHtcIm1vbmV5XCI6XCIwXCJ9LHsgXCJ3aW5cIjogd2lucy50b1N0cmluZygpIH1dO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcIuS4iuS8oO+8mlwiLGFncnMgKTtcclxuICAgICAgICBOZXR3b3JrTWFuYWdlci5JbnN0YW5jZS5IdHRwUG9zdFJlcXVlc3QoUFJPVE9DT0xTLmVuZCwgYWdycywgbmV3IExheWEuSGFuZGxlcih0aGlzLCAoX2RhdGEpID0+IHtcclxuICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICkgYXMgVXNlckluZm9Qcm94eSApLnNlbmRHb2xkU3luYygpO1xyXG4gICAgICAgIH0pLCBuZXcgTGF5YS5IYW5kbGVyKHRoaXMsIChfZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIua4uOaIj+e7k+aenGVyclwiKTtcclxuICAgICAgICB9KSlcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICAgICAgVWlNYW5hZ2VyLmluc3RhbmNlLmFkZCggQ2hvdXRpUGFuVmlldyApO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZUFjdGlvbnNcclxue1xyXG5cclxuICAgIHN0YXRpYyBzdGFuZDpzdHJpbmcgPSBcInN0YW5kXCI7XHJcbiAgICBzdGF0aWMga29uZ3pob25nOnN0cmluZyA9IFwia29uZ3pob25nXCI7XHJcbiAgICBzdGF0aWMgbHVvZGkxOnN0cmluZyA9IFwibHVvZGkxXCI7XHJcbiAgICBzdGF0aWMgbHVvZGkyOnN0cmluZyA9IFwibHVvZGkyXCI7XHJcbiAgICBzdGF0aWMgZGF0aWFvMTpzdHJpbmcgPSBcImRhdGlhbzFcIjtcclxuICAgIHN0YXRpYyBkYXRpYW8yOnN0cmluZyA9IFwiZGF0aWFvMlwiO1xyXG4gICAgc3RhdGljIGh1YWNoYW46c3RyaW5nID0gXCJodWFjaGFuXCI7XHJcbiAgICBzdGF0aWMga3VhbGFuOnN0cmluZyA9IFwia3VhbGFuXCI7XHJcbiAgICBzdGF0aWMgY2VmYW4xOnN0cmluZyA9IFwiY2VmYW4xXCI7XHJcbiAgICBzdGF0aWMgY2VmYW4yOnN0cmluZyA9IFwiY2VmYW4yXCI7XHJcbiAgICBzdGF0aWMgcGFvcWlhbmdsZWZ0OnN0cmluZyA9IFwicGFvcWlhbmdsZWZ0XCI7XHJcbiAgICBzdGF0aWMgcmlnaHRqdW1wOnN0cmluZyA9IFwicmlnaHRqdW1wXCI7XHJcbiAgICBzdGF0aWMgcGFvcWlhbmdyaWdodDpzdHJpbmcgPSBcInBhb3FpYW5ncmlnaHRcIjtcclxuICAgIHN0YXRpYyBsZWZ0anVtcDpzdHJpbmcgPSBcImxlZnRqdW1wXCI7XHJcbiAgICBzdGF0aWMgcGFxaWFuZzpzdHJpbmcgPSBcInBhcWlhbmdcIjtcclxuICAgIHN0YXRpYyBjbGltYmVuZDpzdHJpbmcgPSBcImNsaW1iZW5kXCI7XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOi3keWKqFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcnVuOnN0cmluZyA9IFwicnVuXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDot7Pot4NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGp1bXA6c3RyaW5nID0gXCJqdW1wXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDniKzljYdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIENsaW1iOnN0cmluZyA9IFwiQ2xpbWJcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOiHqueUseiQveS9k1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgRnJlZWZhbGxpbmc6c3RyaW5nID0gXCJGcmVlZmFsbGluZ1wiO1xyXG5cclxuICAgIHN0YXRpYyBsZWZ0X2NsaW1iOnN0cmluZyA9IFwibGVmdF9jbGltYlwiO1xyXG5cclxuICAgIHN0YXRpYyByaWdodF9jbGltYjpzdHJpbmcgPSBcInJpZ2h0X2NsaW1iXCI7XHJcblxyXG4gICAgc3RhdGljIHJpZ2h0X2p1bXA6c3RyaW5nID0gXCJyaWdodF9qdW1wXCI7XHJcbiAgICBzdGF0aWMgbGVmdF9qdW1wOnN0cmluZyA9IFwibGVmdF9qdW1wXCI7XHJcblxyXG4gICAgc3RhdGljIHBsYXlQYWxvdUFjdGlvbjpzdHJpbmcgPSBcInBsYXlQYWxvdUFjdGlvblwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6YCf5p2/6Lez6LeDXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBqaWFzdUp1bXA6c3RyaW5nID0gXCJqaWFzdUp1bXBcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIHjmlrnlkJHnnqznp7tcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHhzaHVueWk6c3RyaW5nID0gXCJ4c2h1bnlpXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkuIvmu5HkvY3np7tcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGRvd25TbGlkZTpzdHJpbmcgPSBcImRvd25TbGlkZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5L6n6Z2i5Yqg6YCfXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzbGlkZWppYXN1OnN0cmluZyA9IFwic2xpZGVqaWFzdVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog57+76LaKXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzdXJtb3VudDpzdHJpbmcgPSBcInN1cm1vdW50XCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDplIHlrprniKzljYdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGxvY2tjbGltYjpzdHJpbmcgPSBcImxvY2tjbGltYlwiO1xyXG59IiwiaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi8uLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IFNjZW5lM2RPYmplY3QgZnJvbSBcIi4vU2NlbmUzZE9iamVjdFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZXNQb29sXHJcbntcclxuICAgIHN0YXRpYyByb2xlZGljdDphbnkgPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZFJvbGVCeU5hbWUoIHJlc291Y2VOYW1lOnN0cmluZyxjbGFzOmFueSxwYXJlbnQ6YW55ICk6TGF5YS5TcHJpdGUzRFxyXG4gICAge1xyXG4gICAgICAgIHZhciBza2lubmVkbWVzaDpMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8TGF5YS5TcHJpdGUzRD4gPSBSb2xlc1Bvb2wucm9sZWRpY3RbcmVzb3VjZU5hbWVdO1xyXG4gICAgICAgIGlmKCBhcnIgJiYgYXJyLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc2tpbm5lZG1lc2ggPSBhcnIuc2hpZnQoKTtcclxuICAgICAgICAgICAgc2tpbm5lZG1lc2guYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgcGFyZW50LmFkZENoaWxkKCBza2lubmVkbWVzaCApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IExheWEuTG9hZGVyLmdldFJlcyhQYXRoQ29uZmlnLmdldDNEUm9sZU1vZGVsKHJlc291Y2VOYW1lKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgc2tpbm5lZG1lc2ggPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKHNwLHBhcmVudCwgZmFsc2UsbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoY2xhcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjbGE6YW55ID0gc2tpbm5lZG1lc2guYWRkQ29tcG9uZW50KCBjbGFzICk7XHJcbiAgICAgICAgICAgIGNsYS5yZXNvdXNlTmFtZSA9IHJlc291Y2VOYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgX291dDpMYXlhLlF1YXRlcm5pb24gPSBuZXcgTGF5YS5RdWF0ZXJuaW9uO1xyXG4gICAgICAgIExheWEuUXVhdGVybmlvbi5jcmVhdGVGcm9tQXhpc0FuZ2xlKCBuZXcgTGF5YS5WZWN0b3IzKCAwLDEsMCApLDE4MCpNYXRoLlBJLzE4MCxfb3V0ICk7XHJcbiAgICAgICAgc2tpbm5lZG1lc2gudHJhbnNmb3JtLnJvdGF0aW9uID0gX291dDtcclxuICAgICAgICByZXR1cm4gc2tpbm5lZG1lc2g7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmVSb2xlKCBzcDpMYXlhLlNwcml0ZTNELHJlc291Y2VOYW1lOnN0cmluZyxjbGE6TGF5YS5TY3JpcHQzRCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggIVJvbGVzUG9vbC5yb2xlZGljdFtyZXNvdWNlTmFtZV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgUm9sZXNQb29sLnJvbGVkaWN0W3Jlc291Y2VOYW1lXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihjbGEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjbGEuZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzcC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICBzcC5yZW1vdmVTZWxmKCk7XHJcbiAgICAgICAgUm9sZXNQb29sLnJvbGVkaWN0W3Jlc291Y2VOYW1lXS5wdXNoKCBzcCApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi8uLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NlbmUzZE9iamVjdFxyXG57XHJcbiAgICBzdGF0aWMgc2NlbmUzRDpMYXlhLlNjZW5lM0Q7XHJcbiAgICBzdGF0aWMgc3RhcnRQbGFuZTpMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgIHN0YXRpYyBjYXJtYTpMYXlhLkNhbWVyYTtcclxuICAgIHN0YXRpYyBtYWluUm9sZTpMYXlhLlNwcml0ZTNEO1xyXG4gICAgc3RhdGljIG5vd21hcERpY3Q6YW55ID0ge307XHJcbiAgICBzdGF0aWMgZGllUG9zWTpudW1iZXIgPSAwO1xyXG4gICAgc3RhdGljIGVuZFBsYW5lOkxheWEuTWVzaFNwcml0ZTNEO1xyXG5cclxuICAgIHN0YXRpYyBnYW1ld2luUG9zWjpudW1iZXIgPSAwO1xyXG5cclxuICAgIHN0YXRpYyBwYXR0ZXJuRGljdDphbnkgPSB7fTtcclxuXHJcbiAgICBzdGF0aWMgbnBjRGljdDphbnkgPSB7fTtcclxuICAgIHN0YXRpYyBucGNzY3JpcHREaWN0OmFueSA9IHt9O1xyXG4gICAgc3RhdGljIG5wY251bTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHN0YXRpYyBpc2Nhcm1hbnBjOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBzdGF0aWMgcHJvX2ppbmR1OmZhaXJ5Z3VpLkdQcm9ncmVzc0JhcjtcclxuXHJcbiAgICBzdGF0aWMgdHh0X21pbmdjaTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG5cclxuICAgIHN0YXRpYyBsaXppRGljdDphbnkgPSB7fTtcclxuXHJcbiAgICAvLyBzdGF0aWMgYmdzcHJpdGUzZDpMYXlhLk1lc2hTcHJpdGUzRDtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6U2NlbmUzZE9iamVjdDtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6U2NlbmUzZE9iamVjdFxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhdGhpcy5faW5zdGFuY2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgU2NlbmUzZE9iamVjdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRQb3NWZWNieVNjZW5lKCBzY2VuZU5hbWU6c3RyaW5nLGJ1aWxkbmFtZTpzdHJpbmcgKTpMYXlhLlZlY3RvcjNcclxuICAgIHtcclxuICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5wYXR0ZXJuRGljdFsgc2NlbmVOYW1lIF0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIFNjZW5lM2RPYmplY3QucGF0dGVybkRpY3RbIHNjZW5lTmFtZSBdW2J1aWxkbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yik5pat5piv5ZCm54is5Yiw6aG256uvXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjaGVja2lzQ2xpbWJUb3AoIHNjZW5lTmFtZTpzdHJpbmcsYnVpbGRuYW1lOnN0cmluZywgcG9zOkxheWEuVmVjdG9yMyApOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICB2YXIgdmVjOkxheWEuVmVjdG9yMyA9IFNjZW5lM2RPYmplY3QuZ2V0UG9zVmVjYnlTY2VuZSggc2NlbmVOYW1lLGJ1aWxkbmFtZSApO1xyXG4gICAgICAgIGlmKCB2ZWMgJiYgTWF0aC5hYnModmVjLnkgLSBwb3MueSkgPCAxLjUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYWN0aW9ubnVtczpudW1iZXIgPSA1NzU7XHJcblxyXG4gICAgc3RhdGljIGFjdGlvbkRpY3Q6YW55ID0geyBcclxuICAgICAgICBcImNsaW1iZW5kXCI6eyBzOjU1MCxlOjU3NSxpc2xvb3Bpbmc6ZmFsc2UgfSxcclxuICAgICAgICBcInN0YW5kXCI6eyBzOjAsZTo4MCxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwicnVuXCI6eyBzOjkwLGU6MTA2LGlzbG9vcGluZzp0cnVlIH0sXHJcbiAgICAgICAgXCJqdW1wXCI6eyBzOjExMCxlOjEzMixpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwia29uZ3pob25nXCI6eyBzOjEzMixlOjE0NSxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwibHVvZGkxXCI6eyBzOjE0NSxlOjE2MCxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwibHVvZGkyXCI6eyBzOjE3MCxlOjIwMixpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwiZGF0aWFvMVwiOnsgczoyMTAsZToyMzUsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcImRhdGlhbzJcIjp7IHM6MjQwLGU6MjczLGlzbG9vcGluZzp0cnVlIH0sXHJcbiAgICAgICAgXCJodWFjaGFuXCI6eyBzOjI4MCxlOjMxMCxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwia3VhbGFuXCI6eyBzOjMxMCxlOjM0Nixpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwiY2VmYW4xXCI6eyBzOjM1MCxlOjM5MSxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwiY2VmYW4yXCI6eyBzOjQwMCxlOjQzNCxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwicGFvcWlhbmdsZWZ0XCI6eyBzOjQ0MCxpc2xvb3Bpbmc6dHJ1ZSxlOjQ1NiB9LFxyXG4gICAgICAgIFwicmlnaHRqdW1wXCI6eyBzOjQ2MCxlOjQ3Nyxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwicGFvcWlhbmdyaWdodFwiOnsgczo0ODAsZTo0OTYsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcImxlZnRqdW1wXCI6eyBzOjUwMCxlOjUxNyxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwicGFxaWFuZ1wiOnsgczo1MjAsZTo1NDIsaXNsb29waW5nOnRydWUgfVxyXG4gICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBhbmltYXRvciBcclxuICAgICAqIEBwYXJhbSBhbmltYXRvckRpY3QgXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzZXRBbmltYXRvciggYW5pbWF0b3I6TGF5YS5BbmltYXRvciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgY2hpZGRpY3Q6YW55O1xyXG4gICAgICAgIGZvciggdmFyIHMgaW4gU2NlbmUzZE9iamVjdC5hY3Rpb25EaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCAhYW5pbWF0b3IuZ2V0Q29udHJvbGxlckxheWVyKCApLmdldEFuaW1hdG9yU3RhdGUoIHMgKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNoaWRkaWN0ID0gU2NlbmUzZE9iamVjdC5hY3Rpb25EaWN0W3NdO1xyXG4gICAgICAgICAgICAgICAgLy/liJvlu7rkuIDkuKrliqjnlLvliqjkvZznirbmgIFcclxuICAgICAgICAgICAgICAgIHZhciBzdGF0ZTEgPSBuZXcgTGF5YS5BbmltYXRvclN0YXRlKCk7XHJcbiAgICAgICAgICAgICAgICAvL+iuvue9ruWKqOS9nOeKtuaAgeeahOWQjeensFxyXG4gICAgICAgICAgICAgICAgc3RhdGUxLm5hbWUgPSBzO1xyXG4gICAgICAgICAgICAgICAgLy/orr7nva7liqjkvZznirbmgIHmkq3mlL7nmoTotbflp4vml7bpl7TvvIjotbflp4vml7bpl7TkuI7nu5PmnZ/ml7bpl7TnmoTorr7nva7kuLowLTHnmoTnmb7liIbmr5TmlbDlgLzvvIkgIOimgeaIquWPlueahOaXtumXtOeCuSAvIOWKqOeUu+eahOaAu+aXtumVv1xyXG4gICAgICAgICAgICAgICAgc3RhdGUxLmNsaXBTdGFydCA9IGNoaWRkaWN0LnMvU2NlbmUzZE9iamVjdC5hY3Rpb25udW1zO1xyXG4gICAgICAgICAgICAgICAgLy/orr7nva7liqjkvZznirbmgIHmkq3mlL7nmoTnu5PmnZ/ml7bpl7RcclxuICAgICAgICAgICAgICAgIHN0YXRlMS5jbGlwRW5kID0gY2hpZGRpY3QuZS9TY2VuZTNkT2JqZWN0LmFjdGlvbm51bXM7XHJcbiAgICAgICAgICAgICAgICAvL+W+l+WIsOm7mOiupOWKqOeUu+i1i+WAvOe7mUNsaXDvvIhnZXREZWZhdWx0U3RhdGXpu5jorqTliqjnlLvkuLpVbml0eeS4rWFuaW1hdGlvbueahOaVsOe7hOmhuuW6jzDkuIvmoIfnmoTliqjnlLvvvIlcclxuICAgICAgICAgICAgICAgIHN0YXRlMS5jbGlwID0gYW5pbWF0b3IuZ2V0RGVmYXVsdFN0YXRlKCkuY2xpcDtcclxuICAgICAgICAgICAgICAgIC8v5Yqo55S75pKt5pS+5piv5ZCm5b6q546vXHJcbiAgICAgICAgICAgICAgICBzdGF0ZTEuY2xpcC5pc2xvb3BpbmcgPSBjaGlkZGljdC5pc2xvb3Bpbmc7XHJcbiAgICAgICAgICAgICAgICAvL+a3u+WKoOWKqOeUu+eKtuaAgeWIsOWKqOeUu+e7hOS7tumHjFxyXG4gICAgICAgICAgICAgICAgYW5pbWF0b3IuYWRkU3RhdGUoc3RhdGUxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdGxpemkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxpemk6TGF5YS5TaHVyaUtlblBhcnRpY2xlM0QgPSBTY2VuZTNkT2JqZWN0LmdldGxpemlieU5hbWUoIFwiamlhc3VsaXppXCIgKTtcclxuICAgICAgICBsaXppLnBhcnRpY2xlU3lzdGVtLnBsYXkoKTtcclxuICAgICAgICBsaXppLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBsaXppOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEID0gU2NlbmUzZE9iamVjdC5nZXRsaXppYnlOYW1lKCBcInRhbnNlX2JhaVwiICk7XHJcbiAgICAgICAgbGl6aS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgbGl6aS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB2YXIgbGl6aTpMYXlhLlNodXJpS2VuUGFydGljbGUzRCA9IFNjZW5lM2RPYmplY3QuZ2V0bGl6aWJ5TmFtZSggXCJ0YW5zZV9odWFuZ1wiICk7XHJcbiAgICAgICAgbGl6aS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgbGl6aS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAvLyB2YXIgbGl6aTpMYXlhLlNodXJpS2VuUGFydGljbGUzRCA9IFNjZW5lM2RPYmplY3QuZ2V0bGl6aWJ5TmFtZSggXCJ3aW5feGlhblwiICk7XHJcbiAgICAgICAgLy8gbGl6aS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgLy8gbGl6aS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAvLyB2YXIgbGl6aTpMYXlhLlNodXJpS2VuUGFydGljbGUzRCA9IFNjZW5lM2RPYmplY3QuZ2V0bGl6aWJ5TmFtZSggXCJ5YW5odWFcIiApO1xyXG4gICAgICAgIC8vIGxpemkucGFydGljbGVTeXN0ZW0ucGxheSgpO1xyXG4gICAgICAgIC8vIGxpemkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGFuc2VsaXppOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEO1xyXG4gICAgcHVibGljIHNldGxpemlQbGF5dGFuc2UoIG5hbWU6c3RyaW5nLHBvczpMYXlhLlZlY3RvcjMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNsb3NldGltZTpudW1iZXIgPSAwO1xyXG4gICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsdGhpcy5saXppZW5kICk7XHJcbiAgICAgICAgdGhpcy5saXppZW5kdGFuc2UoKTtcclxuICAgICAgICBpZiggbmFtZSA9PSBcInRhbnNlX2JhaVwiIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzb3J0Om51bWJlciA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsMTAwICk7XHJcbiAgICAgICAgICAgIGlmKCBzb3J0ID4gNTAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCJ0YW5zZV9odWFuZ1wiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNsb3NldGltZSA9IDUwMDtcclxuICAgICAgICB0aGlzLl90YW5zZWxpemkgPSBTY2VuZTNkT2JqZWN0LmdldGxpemlieU5hbWUoIG5hbWUgKTtcclxuICAgICAgICB0aGlzLl90YW5zZWxpemkudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zO1xyXG4gICAgICAgIHRoaXMuX3RhbnNlbGl6aS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgaWYoIGNsb3NldGltZSAhPSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSggY2xvc2V0aW1lLHRoaXMsdGhpcy5saXppZW5kdGFuc2UgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsaXppZW5kdGFuc2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX3RhbnNlbGl6aSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl90YW5zZWxpemkucGFydGljbGVTeXN0ZW0uc3RvcCgpO1xyXG4gICAgICAgICAgICB0aGlzLl90YW5zZWxpemkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2VuZ2FtZWxpemk0OkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEO1xyXG4gICAgcHJpdmF0ZSBfb3V0UVVhdGVybmlvbjQ6TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjtcclxuICAgIHB1YmxpYyBqaWFkdWxpemkxKG5hbWU6c3RyaW5nLHBvczpMYXlhLlZlY3RvcjMpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggIXRoaXMuX2VuZ2FtZWxpemk0IHx8ICh0aGlzLl9lbmdhbWVsaXppNCAmJiAhdGhpcy5fZW5nYW1lbGl6aTQuYWN0aXZlICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQgPSBTY2VuZTNkT2JqZWN0LmdldGxpemlieU5hbWUoIFwiamlhc3VsaXppXCIgKTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQucGFydGljbGVTeXN0ZW0ubG9vcGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemk0LnRyYW5zZm9ybS5zY2FsZSA9IG5ldyBMYXlhLlZlY3RvcjMoIDIwLDIwLDIwICk7XHJcbiAgICAgICAgICAgIExheWEuUXVhdGVybmlvbi5jcmVhdGVGcm9tQXhpc0FuZ2xlKCBuZXcgTGF5YS5WZWN0b3IzKCAxLDAsMCApLC01MCx0aGlzLl9vdXRRVWF0ZXJuaW9uNCApO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppNC50cmFuc2Zvcm0ucm90YXRpb24gPSB0aGlzLl9vdXRRVWF0ZXJuaW9uNDtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQucGFydGljbGVTeXN0ZW0ucGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbHpwb3M6TGF5YS5WZWN0b3IzID0gcG9zLmNsb25lKCk7XHJcbiAgICAgICAgbHpwb3MueSArPSA1O1xyXG4gICAgICAgIGx6cG9zLnogLT0gMTA7XHJcbiAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQudHJhbnNmb3JtLnBvc2l0aW9uID0gbHpwb3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsb3NlSmlhc3VsaXppMSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fZW5nYW1lbGl6aTQgJiYgdGhpcy5fZW5nYW1lbGl6aTQuYWN0aXZlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemk0LmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbmdhbWVsaXppMzpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgIHByaXZhdGUgX291dFFVYXRlcm5pb246TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjtcclxuICAgIHB1YmxpYyBqaWFkdWxpemkobmFtZTpzdHJpbmcscG9zOkxheWEuVmVjdG9yMyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhdGhpcy5fZW5nYW1lbGl6aTMgfHwgKHRoaXMuX2VuZ2FtZWxpemkzICYmICF0aGlzLl9lbmdhbWVsaXppMy5hY3RpdmUgKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMyA9IFNjZW5lM2RPYmplY3QuZ2V0bGl6aWJ5TmFtZSggXCJqaWFzdWxpemlcIiApO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMy5wYXJ0aWNsZVN5c3RlbS5sb29waW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMudHJhbnNmb3JtLnNjYWxlID0gbmV3IExheWEuVmVjdG9yMyggMjAsMjAsMjAgKTtcclxuICAgICAgICAgICAgTGF5YS5RdWF0ZXJuaW9uLmNyZWF0ZUZyb21BeGlzQW5nbGUoIG5ldyBMYXlhLlZlY3RvcjMoIDEsMCwwICksLTUwLHRoaXMuX291dFFVYXRlcm5pb24gKTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMudHJhbnNmb3JtLnJvdGF0aW9uID0gdGhpcy5fb3V0UVVhdGVybmlvbjtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMucGFydGljbGVTeXN0ZW0ucGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbHpwb3M6TGF5YS5WZWN0b3IzID0gcG9zLmNsb25lKCk7XHJcbiAgICAgICAgbHpwb3MueSArPSA1O1xyXG4gICAgICAgIHRoaXMuX2VuZ2FtZWxpemkzLnRyYW5zZm9ybS5wb3NpdGlvbiA9IGx6cG9zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZUppYXN1bGl6aSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fZW5nYW1lbGl6aTMgJiYgdGhpcy5fZW5nYW1lbGl6aTMuYWN0aXZlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkzLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbmdhbWVsaXppMTpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgIHByaXZhdGUgX2VuZ2FtZWxpemkyOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEO1xyXG4gICAgcHVibGljIGxpemllbmRnYW1lKG5hbWU6c3RyaW5nLHBvczpMYXlhLlZlY3RvcjMsaXN3aW46Ym9vbGVhbik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2VuZ2FtZWxpemkxID0gU2NlbmUzZE9iamVjdC5nZXRsaXppYnlOYW1lKCBcInlhbmh1YVwiICk7XHJcbiAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTEudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zO1xyXG4gICAgICAgIHRoaXMuX2VuZ2FtZWxpemkxLnBhcnRpY2xlU3lzdGVtLnBsYXkoKTtcclxuICAgICAgICBpZihpc3dpbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkyID0gU2NlbmUzZE9iamVjdC5nZXRsaXppYnlOYW1lKCBcIndpbl94aWFuXCIgKTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTIudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMi5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZWVuZ2FtbGl6aSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLl9lbmdhbWVsaXppMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkxLnBhcnRpY2xlU3lzdGVtLnN0b3AoKTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTEuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMuX2VuZ2FtZWxpemkyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTIucGFydGljbGVTeXN0ZW0uc3RvcCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMi5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHNldGxpemlQbGF5KCBuYW1lOnN0cmluZyxwb3M6TGF5YS5WZWN0b3IzICk6dm9pZFxyXG4gICAgLy8ge1xyXG4gICAgLy8gICAgIHZhciBjbG9zZXRpbWU6bnVtYmVyID0gMDtcclxuICAgIC8vICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMubGl6aWVuZCApO1xyXG4gICAgLy8gICAgIHN3aXRjaCggbmFtZSApXHJcbiAgICAvLyAgICAge1xyXG4gICAgLy8gICAgICAgICBjYXNlIFwidGFuc2VfYmFpXCI6XHJcbiAgICAvLyAgICAgICAgICAgICBpZiggbmFtZSA9PSBcInRhbnNlX2JhaVwiIClcclxuICAgIC8vICAgICAgICAgICAgIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmKCBzb3J0ID4gNTAgKVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IFwidGFuc2VfaHVhbmdcIjtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICBjbG9zZXRpbWUgPSA1MDA7XHJcbiAgICAvLyAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICBjYXNlIFwiamlhc3VsaXppXCI6XHJcbiAgICAvLyAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICBjYXNlIFwid2luX3hpYW5cIjpcclxuICAgIC8vICAgICAgICAgICAgIGNsb3NldGltZSA9IDA7XHJcbiAgICAvLyAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICBjYXNlIFwieWFuaHVhXCI6XHJcbiAgICAvLyAgICAgICAgICAgICBjbG9zZXRpbWUgPSAwO1xyXG4gICAgLy8gICAgICAgICBicmVhaztcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgdmFyIGxpemk6TGF5YS5TaHVyaUtlblBhcnRpY2xlM0QgPSBTY2VuZTNkT2JqZWN0LmdldGxpemlieU5hbWUoIG5hbWUgKTtcclxuICAgIC8vICAgICBsaXppLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHBvcztcclxuICAgIC8vICAgICBsaXppLnBhcnRpY2xlU3lzdGVtLnBsYXkoKTtcclxuICAgIC8vICAgICBpZiggY2xvc2V0aW1lICE9IDAgKVxyXG4gICAgLy8gICAgIHtcclxuICAgIC8vICAgICAgICAgTGF5YS50aW1lci5vbmNlKCBjbG9zZXRpbWUsdGhpcyx0aGlzLmxpemllbmQsW2xpemldICk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHByaXZhdGUgbGl6aWVuZChsaXppOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGxpemkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGl6aS5wYXJ0aWNsZVN5c3RlbS5zdG9wKCk7XHJcbiAgICAgICAgICAgIGxpemkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRsaXppYnlOYW1lKCBuYW1lOnN0cmluZyApOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxpemlzcDpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5saXppRGljdFtuYW1lXSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsaXppc3AgPSBTY2VuZTNkT2JqZWN0LmxpemlEaWN0W25hbWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsaXppc3AgPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKExheWEuTG9hZGVyLmdldFJlcyhQYXRoQ29uZmlnLmdldDNETW9kZWwobmFtZSkpKSBhcyBMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5saXppRGljdFtuYW1lXSA9IGxpemlzcDtcclxuICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5zY2VuZTNELmFkZENoaWxkKCBsaXppc3AgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGl6aXNwLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGxpemlzcDtcclxuICAgIH1cclxufSIsImltcG9ydCBDaGlsZEJhc2VWaWV3IGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL212Yy9DaGlsZEJhc2VWaWV3XCI7XHJcbmltcG9ydCBQaUZ1Vk8gZnJvbSBcIi4vdm8vUGlGdVZPXCI7XHJcbmltcG9ydCBTa2luUHJveHkgZnJvbSBcIi4vcHJveHlzL1NraW5Qcm94eVwiO1xyXG5pbXBvcnQgTVZDT2JqZWN0UG9vbCBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9tdmMvTVZDT2JqZWN0UG9vbFwiO1xyXG5pbXBvcnQgeyBXb3JkVGlwc1V0aWxzIH0gZnJvbSBcIi4uL2xvYWRpbmcvdmlldy9Xb3JkVGlwc1V0aWxzXCI7XHJcbmltcG9ydCB7IFBhdGhDb25maWcgfSBmcm9tIFwiLi4vLi4vY29uZmlncy9nYW1lQ29uZmlncy9QYXRoQ29uZmlnXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQaWZ1SXRlbSBleHRlbmRzIGZhaXJ5Z3VpLkdCdXR0b24gXHJcbntcclxuICAgIGxvYWRfaWNvbjpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgY19zdGF0ZTpmYWlyeWd1aS5Db250cm9sbGVyO1xyXG4gICAgdHh0X25lZWQ6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIHBpZnV2bzpQaUZ1Vk87XHJcbiAgICBidG5fMDpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgcHJpdmF0ZSBfc2tpblByb3h5OlNraW5Qcm94eTtcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCk7IFxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RGcm9tWE1MKHhtbDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuY29uc3RydWN0RnJvbVhNTCh4bWwpO1xyXG4gICAgICAgIGZvciAodmFyIHN0ciBpbiB0aGlzLl9jaGlsZHJlbikge1xyXG4gICAgICAgICAgICB2YXIgaXRlbTogZmFpcnlndWkuR09iamVjdCA9IHRoaXMuX2NoaWxkcmVuW3N0cl07XHJcbiAgICAgICAgICAgIHRoaXNbaXRlbS5uYW1lXSA9IGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25Jbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmluaXRWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3NraW5Qcm94eSA9IE1WQ09iamVjdFBvb2wuZ2V0SW5zdGFuY2UoKS5nZXRQcm94eSggU2tpblByb3h5ICk7XHJcbiAgICAgICAgdGhpcy5jX3N0YXRlID0gdGhpcy5nZXRDb250cm9sbGVyKCBcImNfc3RhdGVcIiApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMub24oIExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmJ0bmNsaWNrICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidG5jbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5waWZ1dm8gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3dpdGNoKCB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOiAvL+aLpeaciVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NraW5Qcm94eS5nZXRTa2luKCB0aGlzLnBpZnV2byApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6Ly/mtLvliqjojrflj5ZcclxuICAgICAgICAgICAgICAgICAgICBXb3JkVGlwc1V0aWxzLmdldEluc3RhbmNlKCkuc2hvd1dvcmRUaXBzKFwi5pqC5pyq5byA5pS+XCIpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6Ly/nnIvop4bpopHojrflj5ZcclxuICAgICAgICAgICAgICAgICAgICBXb3JkVGlwc1V0aWxzLmdldEluc3RhbmNlKCkuc2hvd1dvcmRUaXBzKFwi5pqC5pyq5byA5pS+XCIpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6Ly/ph5HluIHotK3kubBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9za2luUHJveHkuZ2V0U2tpbiggdGhpcy5waWZ1dm8gKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93RGF0YSggdm86UGlGdVZPICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucGlmdXZvID0gdm87XHJcbiAgICAgICAgaWYoIHRoaXMucGlmdXZvIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZF9pY29uLmljb24gPSBQYXRoQ29uZmlnLmdldHJvbGVpY29uKCB0aGlzLnBpZnV2by5yb2xlQ0ZHLmljb24gKTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX3NraW5Qcm94eS5yb2xlVk8ucm9sZWlkID09IHRoaXMucGlmdXZvLnJvbGVDRkcuaWQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5waWZ1dm8uc3RhdGUgPT0gMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5waWZ1dm8ucm9sZUNGRy5nZXRTdGF0ZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHh0X25lZWQudGV4dCA9IHRoaXMucGlmdXZvLmhhc251bSArIFwiL1wiICsgdGhpcy5waWZ1dm8ucm9sZUNGRy5uZWVkO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSA0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR4dF9uZWVkLnRleHQgPSB0aGlzLnBpZnV2by5yb2xlQ0ZHLm5lZWQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzcG9zZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm9mZiggTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuYnRuY2xpY2sgKTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgICBcclxufSIsImltcG9ydCBCYXNlVmlldyBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9tdmMvQmFzZVZpZXdcIjtcclxuaW1wb3J0IFdpbmRvd0FubW9UeXBlIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL212Yy9XaW5kb3dBbm1vVHlwZVwiO1xyXG5pbXBvcnQgU2tpblByb3h5IGZyb20gXCIuL3Byb3h5cy9Ta2luUHJveHlcIjtcclxuaW1wb3J0IFBpZnVJdGVtIGZyb20gXCIuL1BpZnVJdGVtXCI7XHJcbmltcG9ydCBHYW1lRXZlbnQgZnJvbSBcIi4uL3VzZXJpbmZvL2V2ZW50cy9HYW1lRXZlbnRcIjtcclxuaW1wb3J0IFVzZXJJbmZvRXZlbnQgZnJvbSBcIi4uL3VzZXJpbmZvL2V2ZW50cy9Vc2VySW5mb0V2ZW50XCI7XHJcbmltcG9ydCBSb2xlVk8gZnJvbSBcIi4uL3VzZXJpbmZvL3ZvL1JvbGVWT1wiO1xyXG5pbXBvcnQgUmVzb3VyY2VNYW5hZ2VyIGZyb20gXCIuLi8uLi9tYW5hZ2Vycy9SZXNvdXJjZU1hbmFnZXJcIjtcclxuaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi8uLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IFNjZW5lM2RPYmplY3QgZnJvbSBcIi4uL3NjZW5lM2RzL1NjZW5lM2RPYmplY3RcIjtcclxuaW1wb3J0IFJvbGVBY3Rpb25zIGZyb20gXCIuLi9zY2VuZTNkcy9Sb2xlQWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBVaU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vbWFuYWdlcnMvVWlNYW5hZ2VyXCI7XHJcbmltcG9ydCBSb2xlc1Bvb2wgZnJvbSBcIi4uL3NjZW5lM2RzL1JvbGVzUG9vbFwiO1xyXG5pbXBvcnQgTWFpblJBb2xlU2NyaXB0IGZyb20gXCIuLi9tb2RlbFNjcmlwdHMvTWFpblJvbGVTY3JpcHRcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNraW5WaWV3IGV4dGVuZHMgQmFzZVZpZXcgXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJTa2luVmlld1wiO1xyXG4gICAgY190aXRsZTpmYWlyeWd1aS5Db250cm9sbGVyO1xyXG4gICAgbGlzdF8wOmZhaXJ5Z3VpLkdMaXN0O1xyXG4gICAgYnRuX2Nsb3NlOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBwcml2YXRlIF91aTNEU2NlbmU6TGF5YS5TY2VuZTNEO1xyXG4gICAgcHJpdmF0ZSBfdWljYXJtYTNEOkxheWEuQ2FtZXJhO1xyXG4gICAgLy8gcHJpdmF0ZSBfdWlsaWdodDpMYXlhLkRpcmVjdGlvbkxpZ2h0O1xyXG4gICAgcHJpdmF0ZSBfc2tpblByb3h5OlNraW5Qcm94eTtcclxuICAgIHByaXZhdGUgX3JvbGVtbzpMYXlhLlNwcml0ZTNEO1xyXG4gICAgcHJpdmF0ZSBfaXNkZXN0b3J5czpib29sZWFuID0gZmFsc2U7XHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJza2ludmlld1wiLGZhbHNlLFdpbmRvd0FubW9UeXBlLldpbmRvd0FubW9UeXBlX25vbmUsMCApOyBcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNkZXN0b3J5cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY190aXRsZSA9IHRoaXMuZ2V0Q29udHJvbGxlckJ5QmFtZSggXCJjX3RpdGxlXCIgKTtcclxuICAgICAgICB0aGlzLl9za2luUHJveHkgPSB0aGlzLmdldFByb3h5KCBTa2luUHJveHkgKTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5zZXRWaXJ0dWFsKCk7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuaXRlbVJlbmRlcmVyID0gTGF5YS5IYW5kbGVyLmNyZWF0ZSggdGhpcyx0aGlzLml0ZW1saXN0cmVuZGVyLG51bGwsZmFsc2UgKTtcclxuICAgICAgICB0aGlzLmNfdGl0bGUuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgdGhpcy5vbmNoYW5nZSgpO1xyXG4gICAgICAgIC8v5re75YqgM0TlnLrmma9cclxuICAgICAgICB0aGlzLl91aTNEU2NlbmUgPSB0aGlzLmRpc3BsYXlPYmplY3QuYWRkQ2hpbGRBdChuZXcgTGF5YS5TY2VuZTNEKCksMCkgYXMgTGF5YS5TY2VuZTNEO1xyXG4gICAgICAgIC8v5re75Yqg54Wn55u45py6XHJcbiAgICAgICAgdGhpcy5fdWljYXJtYTNEID0gKHRoaXMuX3VpM0RTY2VuZS5hZGRDaGlsZChuZXcgTGF5YS5DYW1lcmEoMCwgMC4xLCA4MCkpKSBhcyBMYXlhLkNhbWVyYTtcclxuICAgICAgICAvLyB0aGlzLl91aWNhcm1hM0QuY2xlYXJDb2xvciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdWljYXJtYTNELnZpZXdwb3J0ID0gbmV3IExheWEuVmlld3BvcnQodGhpcy54LHRoaXMueSx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLl91aWNhcm1hM0QudHJhbnNmb3JtLnRyYW5zbGF0ZShuZXcgTGF5YS5WZWN0b3IzKDAsMS4yLDUpLGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gLy/mt7vliqDmlrnlkJHlhYlcclxuICAgICAgICAvLyB0aGlzLl91aWxpZ2h0ID0gU2NlbmUzZE9iamVjdC5zY2VuZTNELmFkZENoaWxkKG5ldyBMYXlhLkRpcmVjdGlvbkxpZ2h0KCkpIGFzIExheWEuRGlyZWN0aW9uTGlnaHQ7XHJcbiAgICAgICAgLy8gdGhpcy5fdWlsaWdodC5jb2xvciA9IG5ldyBMYXlhLlZlY3RvcjMoMC42LDAuNiwwLjYpO1xyXG4gICAgICAgIC8vIHRoaXMuX3VpbGlnaHQudHJhbnNmb3JtLndvcmxkTWF0cml4LnNldEZvcndhcmQobmV3IExheWEuVmVjdG9yMygxLCAtMSwgMCkpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZXJvbGVIYW5kbGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmJ0bl9jbG9zZSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5vbmNsb3NlZnVuICk7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5jX3RpdGxlLGZhaXJ5Z3VpLkV2ZW50cy5TVEFURV9DSEFOR0VELHRoaXMsdGhpcy5vbmNoYW5nZSApO1xyXG4gICAgICAgIHRoaXMuYWRkRGF0YUV2ZW50KCBHYW1lRXZlbnQudXBkYXRlU0tpblZpZXcsdGhpcyx0aGlzLm9uY2hhbmdlICk7XHJcbiAgICAgICAgdGhpcy5hZGREYXRhRXZlbnQoIFVzZXJJbmZvRXZlbnQudXNlcmluZm9FdmVudF91cGRhdGVyb2xlaWQsdGhpcyx0aGlzLnVwZGF0ZXJvbGVIYW5kbGVyICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVyb2xlSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgcm9sZVZPOlJvbGVWTyA9IHRoaXMuX3NraW5Qcm94eS5yb2xlVk87XHJcbiAgICAgICAgdGhpcy5yZW1vdmVSb2xlKCk7XHJcbiAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIHBhdGhBcnIucHVzaCggeyB1cmw6UGF0aENvbmZpZy5nZXQzRFJvbGVNb2RlbCggcm9sZVZPLnJvbGVDZmcubmFtZSApfSApO1xyXG4gICAgICAgIFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRlcjNEQXJyKCBwYXRoQXJyLHRoaXMsdGhpcy5sb2FkY29tcGxldGUsbnVsbCx0cnVlLHJvbGVWTy5yb2xlQ2ZnLm5hbWUgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9vdXQ6TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjtcclxuICAgIHByaXZhdGUgbG9hZGNvbXBsZXRlKCByZXNvdXNlbmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHJvbGVWTzpSb2xlVk8gPSB0aGlzLl9za2luUHJveHkucm9sZVZPO1xyXG4gICAgICAgIGlmKCAhdGhpcy5faXNkZXN0b3J5cyAmJiB0aGlzLl91aTNEU2NlbmUgJiYgcmVzb3VzZW5hbWUgPT0gcm9sZVZPLnJvbGVDZmcubmFtZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9yb2xlbW8gPSBSb2xlc1Bvb2wuYWRkUm9sZUJ5TmFtZSggcmVzb3VzZW5hbWUsTWFpblJBb2xlU2NyaXB0LHRoaXMuX3VpM0RTY2VuZSApO1xyXG4gICAgICAgICAgICB0aGlzLl9yb2xlbW8udHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggMCwyLDAgKTtcclxuICAgICAgICAgICAgTGF5YS5RdWF0ZXJuaW9uLmNyZWF0ZUZyb21BeGlzQW5nbGUoIG5ldyBMYXlhLlZlY3RvcjMoIDAsMSwwICksLTEzNSoxODAvTWF0aC5QSSx0aGlzLl9vdXQgKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9sZW1vLnRyYW5zZm9ybS5yb3RhdGlvbiA9IHRoaXMuX291dDtcclxuICAgICAgICAgICAgKCB0aGlzLl9yb2xlbW8uZ2V0Q29tcG9uZW50KCBNYWluUkFvbGVTY3JpcHQgKSBhcyBNYWluUkFvbGVTY3JpcHQgKS5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnN0YW5kICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVtb3ZlUm9sZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fcm9sZW1vIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzY3JpcHQ6TWFpblJBb2xlU2NyaXB0ID0gdGhpcy5fcm9sZW1vLmdldENvbXBvbmVudCggTWFpblJBb2xlU2NyaXB0ICkgYXMgTWFpblJBb2xlU2NyaXB0O1xyXG4gICAgICAgICAgICBSb2xlc1Bvb2wucmVtb3ZlUm9sZSggdGhpcy5fcm9sZW1vLHNjcmlwdC5yZXNvdXNlTmFtZSxzY3JpcHQgKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9sZW1vID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbmNoYW5nZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5jX3RpdGxlLnNlbGVjdGVkSW5kZXggPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IHRoaXMuX3NraW5Qcm94eS5waWZ1QXJyLmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5saXN0XzAubnVtSXRlbXMgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGl0ZW1saXN0cmVuZGVyKCBpbmRleDpudW1iZXIsaXRlbTpQaWZ1SXRlbSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5jX3RpdGxlLnNlbGVjdGVkSW5kZXggPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggaW5kZXggPCB0aGlzLl9za2luUHJveHkucGlmdUFyci5sZW5ndGggKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9za2luUHJveHkucGlmdUFycltpbmRleF0gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uY2xvc2VmdW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVWlNYW5hZ2VyLmluc3RhbmNlLmNsb3NlKCBTa2luVmlldyApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZXN0b3J5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzZGVzdG9yeXMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlUm9sZSgpO1xyXG4gICAgICAgIGlmKCB0aGlzLl91aWNhcm1hM0QgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdWljYXJtYTNELmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgdGhpcy5fdWljYXJtYTNEID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuX3VpM0RTY2VuZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl91aTNEU2NlbmUuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl91aTNEU2NlbmUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IEJhc2VQcm94eXMgZnJvbSBcIi4uLy4uLy4uL2ZyYW1ld29ya3MvbXZjL0Jhc2VQcm94eXNcIjtcclxuaW1wb3J0IENhY2hlTWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvQ2FjaGVNYW5hZ2VyXCI7XHJcbmltcG9ydCBVc2VyQ2FjaGVUeXBlIGZyb20gXCIuLi8uLi91c2VyaW5mby9ldmVudHMvVXNlckNhY2hlVHlwZVwiO1xyXG5pbXBvcnQgUGlGdVZPIGZyb20gXCIuLi92by9QaUZ1Vk9cIjtcclxuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uLy4uLy4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvUm9sZUNGR1wiO1xyXG5pbXBvcnQgeyBVaU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvVWlNYW5hZ2VyXCI7XHJcbmltcG9ydCBTa2luVmlldyBmcm9tIFwiLi4vU2tpblZpZXdcIjtcclxuaW1wb3J0IHsgV29yZFRpcHNVdGlscyB9IGZyb20gXCIuLi8uLi9sb2FkaW5nL3ZpZXcvV29yZFRpcHNVdGlsc1wiO1xyXG5pbXBvcnQgR2FtZUV2ZW50IGZyb20gXCIuLi8uLi91c2VyaW5mby9ldmVudHMvR2FtZUV2ZW50XCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBQUk9UT0NPTFMgfSBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgVXNlckluZm9Qcm94eSBmcm9tIFwiLi4vLi4vdXNlcmluZm8vVXNlckluZm9Qcm94eVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2tpblByb3h5IGV4dGVuZHMgQmFzZVByb3h5cyBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIlNraW5Qcm94eVwiO1xyXG4gICAgXHJcbiAgICBjYWNoZWRhdGE6YW55O1xyXG4gICAgcGlmdUFycjpBcnJheTxQaUZ1Vk8+O1xyXG4gICAgcGlmdURpY3Q6YW55O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCk7IFxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0UHJveHkoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY2FjaGVkYXRhID0gQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q2FjaGVPYmooIFVzZXJDYWNoZVR5cGUuc2tpbiApO1xyXG4gICAgICAgIHZhciBwaWZ1RGF0YTphbnk7XHJcbiAgICAgICAgaWYoICF0aGlzLmNhY2hlZGF0YS5oYXNPd25Qcm9wZXJ0eSggXCJwaWZ1XCIgKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlZGF0YVtcInBpZnVcIl0gPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGlmdURhdGEgPSB0aGlzLmNhY2hlZGF0YVtcInBpZnVcIl07XHJcbiAgICAgICAgdGhpcy5waWZ1QXJyID0gW107XHJcbiAgICAgICAgdGhpcy5waWZ1RGljdCA9IHt9O1xyXG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gUm9sZUNGRy52ZWMubGVuZ3RoO1xyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IG51bXM7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwaWZ1dm86UGlGdVZPID0gbmV3IFBpRnVWTztcclxuICAgICAgICAgICAgdmFyIGNmZzpSb2xlQ0ZHID0gUm9sZUNGRy52ZWNbaV07XHJcbiAgICAgICAgICAgIHBpZnV2by5yb2xlQ0ZHID0gY2ZnO1xyXG4gICAgICAgICAgICB2YXIgZDphbnkgPSBwaWZ1RGF0YVsgY2ZnLmlkIF07XHJcbiAgICAgICAgICAgIGlmKCBkIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGlmdXZvLnN0YXRlID0gTnVtYmVyKCBkLnN0YXRlICk7XHJcbiAgICAgICAgICAgICAgICBwaWZ1dm8uaGFzbnVtID0gTnVtYmVyKCBkLmhhc251bSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGlmdXZvLnN0YXRlID0gMDtcclxuICAgICAgICAgICAgICAgIHBpZnV2by5oYXNudW0gPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCBjZmcuZ2V0U3RhdGUgPT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBpZnV2by5zdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5waWZ1QXJyLnB1c2goIHBpZnV2byApO1xyXG4gICAgICAgICAgICB0aGlzLnBpZnVEaWN0WyBwaWZ1dm8ucm9sZUNGRy5pZCBdID0gcGlmdXZvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9wZW52aWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5hZGQoIFNraW5WaWV3ICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNraW4oIHBpZnU6UGlGdVZPICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBwaWZ1LnN0YXRlID09IDEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yb2xlVk8ucm9sZWlkID0gcGlmdS5yb2xlQ0ZHLmlkO1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BhY2hlRGF0YUV2ZW50KCBHYW1lRXZlbnQudXBkYXRlU0tpblZpZXcgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3dpdGNoKCBwaWZ1LnJvbGVDRkcuZ2V0U3RhdGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6Ly/op4bpopHojrflj5ZcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOi8v6YeR5biB6LSt5LmwXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMucm9sZVZPLkdvbGQgPj0gcGlmdS5yb2xlQ0ZHLm5lZWQgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb2xlVk8ucm9sZWlkID0gcGlmdS5yb2xlQ0ZHLmlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvbGVWTy5Hb2xkIC09IHBpZnUucm9sZUNGRy5uZWVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwaWZ1LnN0YXRlID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRza2luQ2FjaGUocGlmdS5yb2xlQ0ZHLmlkLHBpZnUuc3RhdGUscGlmdS5oYXNudW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhY2hlRGF0YUV2ZW50KCBHYW1lRXZlbnQudXBkYXRlU0tpblZpZXcgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgV29yZFRpcHNVdGlscy5nZXRJbnN0YW5jZSgpLnNob3dXb3JkVGlwcyggXCLotK3kubDmiJDlip9cIiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIFVzZXJJbmZvUHJveHkgKSBhcyBVc2VySW5mb1Byb3h5ICkuc2VuZEdvbGRTeW5jKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFdvcmRUaXBzVXRpbHMuZ2V0SW5zdGFuY2UoKS5zaG93V29yZFRpcHMoXCLph5HluIHkuI3otrNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6Ly/mtLvliqjojrflj5ZcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkc2tpbkNhY2hlKCBpZDphbnksc3RhdGU6bnVtYmVyLGhhc251bTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jYWNoZWRhdGFbXCJwaWZ1XCJdW2lkXSA9IHt9O1xyXG4gICAgICAgIHRoaXMuY2FjaGVkYXRhW1wicGlmdVwiXVtpZF1bXCJzdGF0ZVwiXSA9IHN0YXRlO1xyXG4gICAgICAgIHRoaXMuY2FjaGVkYXRhW1wicGlmdVwiXVtpZF1bXCJoYXNudW1cIl0gPSBoYXNudW07XHJcbiAgICAgICAgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkQ2FjaGVPYmooIFVzZXJDYWNoZVR5cGUuc2tpbix0aGlzLmNhY2hlZGF0YSApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uLy4uLy4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvUm9sZUNGR1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGlGdVZPXHJcbntcclxuICAgIHJvbGVDRkc6Um9sZUNGRztcclxuICAgIC8qKlxyXG4gICAgICogMDrmnKrmi6XmnInvvIwx77ya5bey57uP5oul5pyJXHJcbiAgICAgKi9cclxuICAgIHN0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgaGFzbnVtOm51bWJlciA9IDA7XHJcbiAgICBcclxufSIsImltcG9ydCBUaW1lclNlcnZpY2UgZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFRpbWVzVGFtcGVyIH0gZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvVGltZXNUYW1wZXJcIjtcclxuaW1wb3J0IHsgV29yZFRpcHNVdGlscyB9IGZyb20gXCIuLi9sb2FkaW5nL3ZpZXcvV29yZFRpcHNVdGlsc1wiO1xyXG5pbXBvcnQgUGxhdGZvcm1FdmVudCBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vZXZlbnRzL1BsYXRmb3JtRXZlbnRcIjtcclxuaW1wb3J0IEJhc2VQcm94eXMgZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvbXZjL0Jhc2VQcm94eXNcIjtcclxuaW1wb3J0IEdhbWVFdmVudCBmcm9tIFwiLi9ldmVudHMvR2FtZUV2ZW50XCI7XHJcbmltcG9ydCBMZXZlbENGRyBmcm9tIFwiLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9MZXZlbENGR1wiO1xyXG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBQUk9UT0NPTFMgfSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9OZXR3b3JrTWFuYWdlclwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJJbmZvUHJveHkgZXh0ZW5kcyBCYXNlUHJveHlzXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJVc2VySW5mb1Byb3h5XCI7XHJcblxyXG4gICAgcHVibGljIHVzZXJkYXRhOmFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS9k+WKm+acgOWkp+S4iumZkFxyXG4gICAgICovXHJcbiAgICB0aWxpTWF4Om51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICog5L2T5Yqb5oGi5aSN5pe26Ze06Ze06ZqUKOavq+enkilcclxuICAgICAqL1xyXG4gICAgdGlsaWh1aWZ1RGlzVGltZTpudW1iZXI7XHJcblxyXG4gICAgaGFzdGlsaXRpbWU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBpc2VudGVyTWFpbkdhbWU6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XHJcbiAgICBcclxuICAgIHByb3RlY3RlZCBpbml0UHJveHkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGREYXRhRXZlbnQoIFBsYXRmb3JtRXZlbnQuUGxhdGZvcm1FdmVudF9vbkF1ZGlvSW50ZXJydXB0aW9uRW5kLHRoaXMsdGhpcy5hdWRpb0ludGVycnVwdGlvbkVuZCApO1xyXG4gICAgfSAgIFxyXG5cclxuICAgIHByaXZhdGUgYXVkaW9JbnRlcnJ1cHRpb25FbmQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuaXNlbnRlck1haW5HYW1lIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIFNvdW5kc3NNYW5hZ2VyLmdldEluc3RhbmNlKCkucGxheWJnU291bmQoIFwiZ2FtZWJnXCIgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yb2xlVk8uaW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRMZXZlbCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJvbGVWTy5hZGRMZXZlbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjaGFuZ2VHb2xkKCB2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yb2xlVk8uR29sZCArPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VuZEdvbGRTeW5jKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBhZ3JzID0gW3sgXCJ0XCI6UGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5TZXJ2ZXJUaW1lLnRvU3RyaW5nKCkgfSx7XCJ2bW9uZXlcIjp0aGlzLnJvbGVWTy5Hb2xkLnRvU3RyaW5nKCl9XTtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCLph5HluIHlkIzmraXvvJpcIixhZ3JzICk7XHJcbiAgICAgICAgTmV0d29ya01hbmFnZXIuSW5zdGFuY2UuSHR0cFBvc3RSZXF1ZXN0KFBST1RPQ09MUy51c2Vyc3luYywgYWdycywgbmV3IExheWEuSGFuZGxlcih0aGlzLCAoX2RhdGEpID0+IHtcclxuICAgICAgICB9KSwgbmV3IExheWEuSGFuZGxlcih0aGlzLCAoX2RhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmuLjmiI/nu5PmnpxlcnJcIik7XHJcbiAgICAgICAgfSkpXHJcbiAgICB9XHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lRXZlbnRcclxue1xyXG4gICAgc3RhdGljIHJlbW92ZXNlbGVjdDpzdHJpbmcgPSBcIkdhbWVFdmVudF9yZW1vdmVzZWxlY3RcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOW8gOWni+a4uOaIj1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc3RhcnRHYW1lOnN0cmluZyA9IFwiR2FtZUV2ZW50X3N0YXJ0R2FtZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog57uT5p2f5ri45oiPXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBlbmRHYW1lOnN0cmluZyA9IFwiR2FtZUV2ZW50X2VuZEdhbWVcIjtcclxuXHJcbiAgICBzdGF0aWMgbnBjZW5kR2FtZTpzdHJpbmcgPSBcIkdhbWVFdmVudF9ucGNlbmRHYW1lXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmmoLlgZzmuLjmiI9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHN0b3BHYW1lOnN0cmluZyA9IFwiR2FtZUV2ZW50X3N0b3BHYW1lXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgJrlhbPmiJDlip9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHdpbkdhbWU6c3RyaW5nID0gXCJHYW1lRXZlbnRfd2luR2FtZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YCa5YWz5aSx6LSlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmYWlsR2FtZTpzdHJpbmcgPSBcIkdhbWVFdmVudF9mYWlsR2FtZVwiO1xyXG5cclxuICAgIHN0YXRpYyBqdW1wZ2FtZTpzdHJpbmcgPSBcIkdhbWVFdmVudF9qdW1wZ2FtZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Zue5Yiw5Li755WM6Z2iXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZXR1cm5NYWluVmlldzpzdHJpbmcgPSBcInJldHVybk1haW5WaWV3XCI7XHJcblxyXG4gICAgc3RhdGljIHVwZGF0ZVNLaW5WaWV3OnN0cmluZyA9IFwiR2FtZUV2ZW50X3VwZGF0ZVNLaW5WaWV3XCI7XHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyQ2FjaGVUeXBlXHJcbnsgICBcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHN0YXRpYyBsYXN0RGF5OnN0cmluZyA9IFwibGFzdERheVwiO1xyXG5cclxuICAgIHN0YXRpYyBub3dkYXlTaGFyZTpzdHJpbmcgPSBcImRheXNoYXJlXCI7XHJcblxyXG4gICAgc3RhdGljIG5vd2RheVZpZGVvOnN0cmluZyA9IFwiZGF5dmlkZW9cIjtcclxuICAgIC8qKlxyXG4gICAgICog6K6w5b2V5LiK5qyh56a75byA5pe26Ze0XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBsYXN0dGltZTpzdHJpbmcgPSBcImxhc3R0aW1lXCI7XHJcblxyXG4gICAgXHJcbiAgICBzdGF0aWMgY2FwbGFzdGZsdXNodGltZTpzdHJpbmcgPSBcImNhcHRpbWVcIjtcclxuICAgIHN0YXRpYyBjYXBzdG9yYWdlYXBwaWRzOnN0cmluZyA9IFwiY2FwYXBwaWRzXCI7XHJcbiAgICBzdGF0aWMgaGFzZ2V0YXBwaWRzOnN0cmluZyA9IFwiaGFzZ2V0YXBwaWRzXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDop5LoibLkv6Hmga9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJvbGVEYXRhOnN0cmluZyA9IFwicm9sZURhdGFcIjtcclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgc3RhdGljIGdvbGQ6c3RyaW5nID0gXCJnb2xkXCI7XHJcbiAgICBzdGF0aWMgcm9sZWlkOnN0cmluZyA9IFwicm9sZWlkXCI7XHJcbiAgICBzdGF0aWMgbGV2ZWxpZDpzdHJpbmcgPSBcImxldmVsaWRcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOearuiCpFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2tpbjpzdHJpbmcgPSBcInNraW5cIjtcclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJJbmZvRXZlbnQgXHJcbntcclxuICAgIHN0YXRpYyBVc2VySW5mb0V2ZW50X3VwZGF0ZVVzZXJEYXRhOnN0cmluZyA9IFwiVXNlckluZm9FdmVudF91cGRhdGVVc2VyRGF0YVwiO1xyXG5cclxuICAgIHN0YXRpYyB1c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZDpzdHJpbmcgPSBcInVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkXCI7XHJcblxyXG4gICAgc3RhdGljIHVzZXJpbmZvRXZlbnRfbGV2ZWxpZDpzdHJpbmcgPSBcInVzZXJpbmZvRXZlbnRfbGV2ZWxpZFwiO1xyXG59IiwiaW1wb3J0IHsgQmFzZVZPIH0gZnJvbSBcIi4uLy4uLy4uL2ZyYW1ld29ya3Mvdm8vQmFzZVZPXCI7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5pbXBvcnQgVXNlckluZm9FdmVudCBmcm9tIFwiLi4vZXZlbnRzL1VzZXJJbmZvRXZlbnRcIjtcclxuaW1wb3J0IENhY2hlTWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvQ2FjaGVNYW5hZ2VyXCI7XHJcbmltcG9ydCBVc2VyQ2FjaGVUeXBlIGZyb20gXCIuLi9ldmVudHMvVXNlckNhY2hlVHlwZVwiO1xyXG5pbXBvcnQgUm9sZUNGRyBmcm9tIFwiLi4vLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCBMZXZlbENGRyBmcm9tIFwiLi4vLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9MZXZlbENGR1wiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb2xlVk8gZXh0ZW5kcyBCYXNlVk8gXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTpSb2xlVk87XHJcbiAgICAvKipcclxuICAgICAqIOmHkeW4gVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9Hb2xkOm51bWJlcj0wO1xyXG5cclxuICAgIHByaXZhdGUgX3JvbGVpZDpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHJvbGVDZmc6Um9sZUNGRztcclxuXHJcbiAgICBwcml2YXRlIF9sZXZlaWQ6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBsZXZlbGNmZzpMZXZlbENGRztcclxuICAgIHB1YmxpYyBsZXZlbG1hcEFycjpBcnJheTxzdHJpbmc+O1xyXG5cclxuICAgIHByaXZhdGUgX3NlcnZlckxldmVsOm51bWJlciA9IDA7XHJcbiAgICBcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoKTsgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBSb2xlVk8ge1xyXG4gICAgICAgIGlmICghUm9sZVZPLl9pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBSb2xlVk8uX2luc3RhbmNlID0gbmV3IFJvbGVWTztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFJvbGVWTy5faW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNhY2hlbWFuYWdlcjpDYWNoZU1hbmFnZXIgPSBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICB2YXIgbm93R29sZDpudW1iZXIgPSBOdW1iZXIoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5HZXRVc2VyKEFjY291bnRVc2VyLnZtb25leSkpO1xyXG4gICAgICAgIHRoaXMuR29sZCA9IG5vd0dvbGQ7Ly9jYWNoZW1hbmFnZXIuZ2V0bnVtKCBVc2VyQ2FjaGVUeXBlLmdvbGQgKTtcclxuICAgICAgICB0aGlzLl9yb2xlaWQgPSBjYWNoZW1hbmFnZXIuZ2V0bnVtKCBVc2VyQ2FjaGVUeXBlLnJvbGVpZCApO1xyXG4gICAgICAgIGlmKCB0aGlzLnJvbGVpZCA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucm9sZWlkID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRSb2xlQ0ZHKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuX2xldmVpZCA9IGNhY2hlbWFuYWdlci5nZXRudW0oIFVzZXJDYWNoZVR5cGUubGV2ZWxpZCApO1xyXG4gICAgICAgIHRoaXMuX3NlcnZlckxldmVsID0gTnVtYmVyKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuR2V0VXNlcihBY2NvdW50VXNlci5zdGFnZSkpO1xyXG4gICAgICAgIC8vIHRoaXMuX3NlcnZlckxldmVsID0gOTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUxldmVsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBub3dsZXZlbCgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sZXZlaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE5vd1NlcnZlckxldmVsKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcnZlckxldmVsKzE7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkTGV2ZWwoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fc2VydmVyTGV2ZWwrKztcclxuICAgICAgICB0aGlzLnVwZGF0ZUxldmVsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVMZXZlbCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbHYgPSB0aGlzLl9zZXJ2ZXJMZXZlbCsxO1xyXG4gICAgICAgIHZhciBhbGxudW1zOm51bWJlciA9IExldmVsQ0ZHLnZlYy5sZW5ndGg7XHJcbiAgICAgICAgaWYoIGx2ID4gYWxsbnVtcyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdmFsdWU6bnVtYmVyID0gKGx2LWFsbG51bXMpJSggYWxsbnVtcy0yICk7XHJcbiAgICAgICAgICAgIGlmKCAgdmFsdWUgPT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xldmVpZCA9IGFsbG51bXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sZXZlaWQgPSB2YWx1ZSArIDI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbGV2ZWlkID0gbHY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGV2ZWxjZmcgPSBMZXZlbENGRy5kaWN0WyB0aGlzLl9sZXZlaWQgXTtcclxuICAgICAgICB0aGlzLmxldmVsbWFwQXJyID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKHRoaXMubGV2ZWxjZmcucm9hZCk7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBVc2VySW5mb0V2ZW50LnVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkICk7XHJcbiAgICB9XHJcblxyXG4gICAgbW92ZXNwZWVkOm51bWJlciA9IDA7XHJcbiAgICBmcm9udGp1bXA6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIGxlZnRqdW1wOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICByaWdodGp1bXA6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHVwY2xpbWI6bnVtYmVyID0gMDtcclxuICAgIHNsaWRlY2xpbWI6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUgc2V0Um9sZUNGRygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJvbGVDZmcgPSBSb2xlQ0ZHLmRpY3RbIHRoaXMuX3JvbGVpZCBdO1xyXG4gICAgICAgIHRoaXMubW92ZXNwZWVkID0gdGhpcy5yb2xlQ2ZnLnNwZWVkO1xyXG4gICAgICAgIHRoaXMuZnJvbnRqdW1wLnggPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5mcm9udGp1bXAueCApO1xyXG4gICAgICAgIHRoaXMuZnJvbnRqdW1wLnkgPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5mcm9udGp1bXAueSApO1xyXG4gICAgICAgIHRoaXMuZnJvbnRqdW1wLnogPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5mcm9udGp1bXAueiApO1xyXG5cclxuICAgICAgICB0aGlzLmxlZnRqdW1wLnggPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5sZWZ0anVtcC54ICk7XHJcbiAgICAgICAgdGhpcy5sZWZ0anVtcC55ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcubGVmdGp1bXAueSApO1xyXG4gICAgICAgIHRoaXMubGVmdGp1bXAueiA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLmxlZnRqdW1wLnogKTtcclxuXHJcbiAgICAgICAgdGhpcy5yaWdodGp1bXAueCA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnJpZ2h0anVtcC54ICk7XHJcbiAgICAgICAgdGhpcy5yaWdodGp1bXAueSA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnJpZ2h0anVtcC55ICk7XHJcbiAgICAgICAgdGhpcy5yaWdodGp1bXAueiA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnJpZ2h0anVtcC56ICk7XHJcblxyXG4gICAgICAgIHRoaXMudXBjbGltYiA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnVwY2xpbWIgKTtcclxuXHJcbiAgICAgICAgdGhpcy5zbGlkZWNsaW1iLnggPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5zbGlkZWNsaW1iLnggKTtcclxuICAgICAgICB0aGlzLnNsaWRlY2xpbWIueSA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnNsaWRlY2xpbWIueSApO1xyXG4gICAgICAgIHRoaXMuc2xpZGVjbGltYi56ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuc2xpZGVjbGltYi56ICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHNldCBsZXZlaWQoIHZhbHVlOm51bWJlciApXHJcbiAgICAvLyB7XHJcbiAgICAvLyAgICAgaWYoIHRoaXMuX2xldmVpZCAhPSB2YWx1ZSApXHJcbiAgICAvLyAgICAge1xyXG4gICAgLy8gICAgICAgICB0aGlzLl9sZXZlaWQgPSB2YWx1ZTtcclxuICAgIC8vICAgICAgICAgdGhpcy5sZXZlbGNmZyA9IExldmVsQ0ZHLmRpY3RbIHRoaXMuX2xldmVpZCBdO1xyXG4gICAgLy8gICAgICAgICB0aGlzLmxldmVsbWFwQXJyID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKHRoaXMubGV2ZWxjZmcucm9hZCk7XHJcbiAgICAvLyAgICAgICAgIENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZHN0ciggVXNlckNhY2hlVHlwZS5sZXZlbGlkLHRoaXMuX2xldmVpZC50b1N0cmluZygpICk7XHJcbiAgICAvLyAgICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggVXNlckluZm9FdmVudC51c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZCApO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgZ2V0IGxldmVpZCgpOm51bWJlclxyXG4gICAgLy8ge1xyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9sZXZlaWQ7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljIHNldCByb2xlaWQoIHZhbHVlOm51bWJlciApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX3JvbGVpZCAhPSB2YWx1ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9yb2xlaWQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZXRSb2xlQ0ZHKCk7XHJcbiAgICAgICAgICAgIENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZHN0ciggVXNlckNhY2hlVHlwZS5yb2xlaWQsdGhpcy5fcm9sZWlkLnRvU3RyaW5nKCkgKTtcclxuICAgICAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBVc2VySW5mb0V2ZW50LnVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcm9sZWlkKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvbGVpZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IEdvbGQoIHZhbHVlOm51bWJlciApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX0dvbGQgIT0gdmFsdWUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fR29sZCA9IHZhbHVlO1xyXG4gICAgICAgICAgICBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRzdHIoIFVzZXJDYWNoZVR5cGUuZ29sZCx0aGlzLl9Hb2xkLnRvU3RyaW5nKCkgKTtcclxuICAgICAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBVc2VySW5mb0V2ZW50LlVzZXJJbmZvRXZlbnRfdXBkYXRlVXNlckRhdGEgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBHb2xkKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX0dvbGQ7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IFJlc291cmNlTWFuYWdlciBmcm9tIFwiLi9SZXNvdXJjZU1hbmFnZXJcIjtcclxuaW1wb3J0IFJlc0RhdGFNYW5hZ2VyIGZyb20gXCIuL1Jlc0RhdGFNYW5hZ2VyXCI7XHJcbmltcG9ydCBQaWZ1SXRlbSBmcm9tIFwiLi4vZ2FtZW1vZHVsZS9za2lucy9QaWZ1SXRlbVwiO1xyXG5pbXBvcnQgQ3BhRG93bnNWaWV3IGZyb20gXCIuLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9DcGFEb3duc1ZpZXdcIjtcclxuaW1wb3J0IENwYUl0ZW0gZnJvbSBcIi4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL2l0ZW0vQ3BhSXRlbVwiO1xyXG5pbXBvcnQgQmFvS3VhbkdhbWVWaWV3IGZyb20gXCIuLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9CYW9LdWFuR2FtZVZpZXdcIjtcclxuaW1wb3J0IFNoaXdhbnR1aWppYW5WaWV3IGZyb20gXCIuLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9TaGl3YW50dWlqaWFuVmlld1wiO1xyXG5cclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIEJpbmRlck1hbmFnZXIgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pWw5o2u57uR5a6aXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYmluZGVyQWxsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYmluZGVyRmFpcnlndWkoKTtcclxuICAgICAgICB0aGlzLmJpbmRlckdDb21wb25lbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHVp5qGG5p6255qE57uR5a6aXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYmluZGVyRmFpcnlndWkoKTogdm9pZCB7XHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcuZ2FtZUxvYWRlck1hbmFnZXIgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICAvL+eJueaViOe7keWumiggdXJsIOe7keWumue7hOWQje+8jOWPquacieWFrOWFseeJueaViOmcgOimgee7keWumiApIFwidWk6Ly9mcXBneHIxa2w2bXcwXCI6XCJlZmZlY3QxXCJcclxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5nYW1lRWZmZWN0RGljdCA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog57uE5Lu257uR5a6aXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYmluZGVyR0NvbXBvbmVudCgpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIC8vbWFpblxyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJwd2xrMWFcIiwgUGlmdUl0ZW0pO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MjdcIiwgQ3BhRG93bnNWaWV3KTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyazhjNTI4XCIsIENwYUl0ZW0pO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MjlcIiwgQmFvS3VhbkdhbWVWaWV3KTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyazhjNTJhXCIsIENwYUl0ZW0pO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MmJcIiwgU2hpd2FudHVpamlhblZpZXcpO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MmNcIiwgQ3BhSXRlbSk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMmVrc2MyMVwiLCBDcGFJdGVtKTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyZWtzYzIyXCIsIENwYUl0ZW0pO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MmVcIiwgQ3BhSXRlbSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgUGxhdGZvcm1Ub29sIGZyb20gXCIuLi9wbGF0Zm9ybS9QbGF0Zm9ybVRvb2xcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgUGxhdGZyb21UeXBlIGZyb20gXCIuLi9wbGF0Zm9ybS9QbGF0ZnJvbVR5cGVcIjtcclxuXHJcbi8qXHJcbiog5pys5Zyw5pWw5o2u57yT5a2Y566h55CG5ZmoXHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhY2hlTWFuYWdlciBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2U6IENhY2hlTWFuYWdlcjtcclxuXHJcbiAgICBwdWJsaWMgZ2FtZURhdGE6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogQ2FjaGVNYW5hZ2VyIHtcclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBDYWNoZU1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75Yqg5pys5Zyw57yT5a2Y5pWw5o2uIG9iamVjdFxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZE9iaihrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRDYWNoZU9iaihrZXksIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluacrOWcsOe8k+WtmOaVsOaNriBvYmplY3RcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRPYmooa2V5OiBzdHJpbmcpOiBhbnkgXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVPYmooa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa3u+WKoOacrOWcsOe8k+WtmOaVsOaNriBzdHJpbmdcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRzdHIoa2V5OiBzdHJpbmcsIHZhbHVlOnN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWRkQ2FjaGVTdHIoa2V5LCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZG51bSgga2V5OnN0cmluZyx2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRDYWNoZVN0cihrZXksIHZhbHVlLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5pys5Zyw57yT5a2Y5pWw5o2uIHN0cmluZ1xyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldHN0cihrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVzdHIoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluacrOWcsOe8k+WtmOaVsOaNriBudW1iZXJcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRudW0oIGtleTpzdHJpbmcgKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMuZ2V0Q2FjaGVzdHIoa2V5KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIbmjIflrprmnKzlnLDnvJPlrZjmlbDmja5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVDYWNoZShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVtb3Zlc2VsZWN0Q2FjaGUoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa4heeQhuaJgOacieacrOWcsOe8k+WtmOaVsOaNrlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhckFsbENhY2hlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZENhY2hlT2JqKGtleSwgdmFsdWUpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdG9yYWdlU3luY1dYKGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEpTT04oa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2FjaGVPYmooa2V5OiBzdHJpbmcpOiBhbnkgXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG9iajphbnk7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBvYmogPSB0aGlzLmdldFN0b3JhZ2VTeW5jV1goa2V5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBvYmogPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRKU09OKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggIW9iaiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvYmogPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkQ2FjaGVTdHIoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdG9yYWdlU3luY1dYKGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2FjaGVzdHIoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiMFwiO1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICBzdHIgPSB0aGlzLmdldFN0b3JhZ2VTeW5jV1goa2V5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHN0ciA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdHIgPT0gbnVsbCB8fCBzdHIgPT0gXCJcIikgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdHIgPSBcIjBcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3Zlc2VsZWN0Q2FjaGUoa2V5OiBzdHJpbmcpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVTdG9yYWdlV1goa2V5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIGNsZWFyQWxsQ2FjaGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU3RvcmFnZVdYKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2UuY2xlYXIoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pys5Zyw5a2Y5YKoXHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTdG9yYWdlU3luY1dYKGtleTpzdHJpbmcsIGRhdGE6YW55KSBcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eC5zZXRTdG9yYWdlU3luYyhrZXksIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmnKzlnLDlrZjlgqhcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdG9yYWdlU3luY1dYKGtleTpzdHJpbmcpOmFueSBcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gd3guZ2V0U3RvcmFnZVN5bmMoa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDku47mnKzlnLDnvJPlrZjkuK3np7vpmaTmjIflrpoga2V5XHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlU3RvcmFnZVdYKGtleTpzdHJpbmcpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnJlbW92ZVN0b3JhZ2Uoa2V5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIblrZjlgqjmlbDmja5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFyU3RvcmFnZVdYKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guY2xlYXJTdG9yYWdlU3luYygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCBDYWNoZU1hbmFnZXIgZnJvbSBcIi4vQ2FjaGVNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFRpbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9UaW1lVXRpbHNcIjtcclxuaW1wb3J0IFVzZXJDYWNoZVR5cGUgZnJvbSBcIi4uL2dhbWVtb2R1bGUvdXNlcmluZm8vZXZlbnRzL1VzZXJDYWNoZVR5cGVcIjtcclxuaW1wb3J0IHsgVGltZXNUYW1wZXIgfSBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9UaW1lc1RhbXBlclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF5TWFuYWdlcntcclxuICAgIHB1YmxpYyBzdGF0aWMgaXNOZXdEYXk6Ym9vbGVhbjtcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOkRheU1hbmFnZXI7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOkRheU1hbmFnZXJcclxuICAgIHtcclxuICAgICAgICBpZiggIXRoaXMuX2luc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IERheU1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBsYXN0ZGF5OnN0cmluZyA9IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldHN0ciggVXNlckNhY2hlVHlwZS5sYXN0RGF5IClcclxuICAgICAgICB2YXIgbm93ZGF5OnN0cmluZyA9IFRpbWVVdGlscy5mb3JtYXRZZWFyTW9udGhEYXRlMSggVGltZXNUYW1wZXIuZ2V0SW5zdGFuY2UoKS5zZXJ2ZXJUaW1lICk7XHJcbiAgICAgICAgaWYoIGxhc3RkYXkgIT0gbm93ZGF5IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZHN0ciggVXNlckNhY2hlVHlwZS5sYXN0RGF5LG5vd2RheSApO1xyXG4gICAgICAgICAgICBEYXlNYW5hZ2VyLmlzTmV3RGF5ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRGF5TWFuYWdlci5pc05ld0RheSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHsgTGF5ZXJOb3RpZnkgfSBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9ub3RpZmljYXRpb24vTGF5ZXJOb3RpZnlcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIEdhbWVMYXllck1hbmFnZXIgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6R2FtZUxheWVyTWFuYWdlcjtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDog4zmma/lsYIoIOaIluiAhTNE5Zy65pmv5bGCIClcclxuICAgICAqL1xyXG4gICAgcHVibGljIGJhY2tncm91bmQ6ZmFpcnlndWkuR0NvbXBvbmVudCA9IG5ldyBmYWlyeWd1aS5HQ29tcG9uZW50KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB1aeWxglxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVpTGF5ZXI6ZmFpcnlndWkuR0NvbXBvbmVudCA9IG5ldyBmYWlyeWd1aS5HQ29tcG9uZW50KCk7XHJcbiAgICBcclxuICAgICAvKipcclxuICAgICAgKiDmnIDlrprlsYJcclxuICAgICAgKi9cclxuICAgIHB1YmxpYyB0b3BMYXllcjpmYWlyeWd1aS5HQ29tcG9uZW50ID0gbmV3IGZhaXJ5Z3VpLkdDb21wb25lbnQoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOkdhbWVMYXllck1hbmFnZXJcclxuICAgIHtcclxuICAgICAgICBpZiggIXRoaXMuX2luc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IEdhbWVMYXllck1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5Yid5aeL5YyW5bGC57qnXHJcblx0cHVibGljIGluaXRsYXllcigpOnZvaWRcclxuXHR7XHJcblx0XHRHbG9iYWwuc3RhZ2UuYWRkQ2hpbGQoIGZhaXJ5Z3VpLkdSb290Lmluc3QuZGlzcGxheU9iamVjdCApO1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuYWRkQ2hpbGQoIHRoaXMuYmFja2dyb3VuZCApO1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuYWRkQ2hpbGQoIHRoaXMudWlMYXllciApO1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuYWRkQ2hpbGQoIHRoaXMudG9wTGF5ZXIgKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfdWlsYXllclpvcmRlcjpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfdXB1aWxheWVyWm9yZGVyOm51bWJlciA9IDIwMDtcclxuICAgIHByaXZhdGUgX3RpcHNsYXllclpvcmRlcjpudW1iZXIgPSAxMDAwO1xyXG4gICAgcHJpdmF0ZSBfZ3VpZGVsYXllclpvcmRlcjpudW1iZXIgPSA2MDA7XHJcblxyXG4gICAgcHVibGljIGFkZHRvTGF5ZXIoIGl0ZW12aWV3OmZhaXJ5Z3VpLkdPYmplY3QsbGF5ZXI6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKGxheWVyID09IExheWVyTm90aWZ5LkxBWUVSX0JBQ0tHUk9VTkQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2FtZUxheWVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmJhY2tncm91bmQuYWRkQ2hpbGQoIGl0ZW12aWV3ICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYobGF5ZXIgPT0gTGF5ZXJOb3RpZnkuTEFZRVJfVUlMQVlFUilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VpbGF5ZXJab3JkZXIrKztcclxuICAgICAgICAgICAgR2FtZUxheWVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnVpTGF5ZXIuYWRkQ2hpbGQoaXRlbXZpZXcpO1xyXG4gICAgICAgICAgICBpdGVtdmlldy5zb3J0aW5nT3JkZXIgPSB0aGlzLl91aWxheWVyWm9yZGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCBsYXllciA9PSBMYXllck5vdGlmeS5MQVlFUl9VUFVJTEFZRVIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdXB1aWxheWVyWm9yZGVyKys7XHJcbiAgICAgICAgICAgIEdhbWVMYXllck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS51aUxheWVyLmFkZENoaWxkKCBpdGVtdmlldyApO1xyXG4gICAgICAgICAgICBpdGVtdmlldy5zb3J0aW5nT3JkZXIgID0gdGhpcy5fdXB1aWxheWVyWm9yZGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKGxheWVyID09IExheWVyTm90aWZ5LkxBWUVSX1RJUFNMQVlFUilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIEdhbWVMYXllck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS50aXBzTGF5ZXIuYWRkQ2hpbGQoaXRlbXZpZXcpO1xyXG4gICAgICAgICAgICB0aGlzLl90aXBzbGF5ZXJab3JkZXIrKztcclxuICAgICAgICAgICAgR2FtZUxheWVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnVpTGF5ZXIuYWRkQ2hpbGQoIGl0ZW12aWV3ICk7XHJcbiAgICAgICAgICAgIGl0ZW12aWV3LnNvcnRpbmdPcmRlciAgPSB0aGlzLl90aXBzbGF5ZXJab3JkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIGxheWVyID09IExheWVyTm90aWZ5LkxBWUVSX0dVSURFTEFZRVIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZ3VpZGVsYXllclpvcmRlcisrO1xyXG4gICAgICAgICAgICBHYW1lTGF5ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkudWlMYXllci5hZGRDaGlsZChpdGVtdmlldyk7XHJcbiAgICAgICAgICAgIGl0ZW12aWV3LnNvcnRpbmdPcmRlciAgPSB0aGlzLl9ndWlkZWxheWVyWm9yZGVyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlZm9ybUxheWVyKCBsYXllcjpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBsYXllciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIExheWVyTm90aWZ5LkxBWUVSX1VJTEFZRVI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91aWxheWVyWm9yZGVyLS07XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdWlsYXllclpvcmRlciA8IDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VpbGF5ZXJab3JkZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBMYXllck5vdGlmeS5MQVlFUl9VUFVJTEFZRVI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cHVpbGF5ZXJab3JkZXItLTtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl91cHVpbGF5ZXJab3JkZXIgPCAyMDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwdWlsYXllclpvcmRlciA9IDIwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTGF5ZXJOb3RpZnkuTEFZRVJfVElQU0xBWUVSOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyLS07XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdGlwc2xheWVyWm9yZGVyIDwgMTAwMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyID0gMTAwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTGF5ZXJOb3RpZnkuTEFZRVJfR1VJREVMQVlFUjpcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpcHNsYXllclpvcmRlci0tO1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RpcHNsYXllclpvcmRlciA8IDYwMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyID0gNjAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgUmVzb3VyY2VNYW5hZ2VyIGZyb20gXCIuL1Jlc291cmNlTWFuYWdlclwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCBDYWNoZVZPIGZyb20gXCIuLi9mcmFtZXdvcmtzL3ZvL0NhY2hlVk9cIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgT2JqZWN0UG9vbCBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9tdmMvT2JqZWN0UG9vbFwiO1xyXG5pbXBvcnQgeyBQYXRoQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZ3MvZ2FtZUNvbmZpZ3MvUGF0aENvbmZpZ1wiO1xyXG5pbXBvcnQgVGltZXJTZXJ2aWNlIGZyb20gXCIuLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5cclxuLypcclxuKiDotYTmupDnrqHnkIblmag7XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc0RhdGFNYW5hZ2VyIGltcGxlbWVudHMgSVRpbWVyXHJcbntcclxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2U6UmVzRGF0YU1hbmFnZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB1cmzotYTmupDmsaBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfcmVzb3VyY2V1cmxQb29sOmFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWMhei1hOa6kOaxoFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9wa2dQb29sOmFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS4jee8k+WtmOeahOWMheaVsOaNru+8iCDpooTpmLLnlYzpnaLkuIrnmoTnirbmgIHorr7nva7plJnor68g77yJXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbm9jYWNoZURpY3Q6YW55O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog6LaF6L+HWOWIhumSn+acquiiq+W8leeUqOeahOi1hOa6kO+8jOa4heeQhuaOiVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9jbGVhclRpbWU6bnVtYmVyID0gNjAwMDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfZGlzVXBkYXRlVGltZTpudW1iZXIgPSAzMDAwMDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5hc3RhbmNlKCk6UmVzRGF0YU1hbmFnZXJcclxuICAgIHtcclxuICAgICAgICBpZiggbnVsbCA9PSB0aGlzLmluc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgUmVzRGF0YU1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgT2JqZWN0UG9vbC5yZWdpc3RlciggQ2FjaGVWTy5wb29sa2V5LENhY2hlVk8gKTtcclxuICAgICAgICB0aGlzLl9yZXNvdXJjZXVybFBvb2wgPSB7fTtcclxuICAgICAgICB0aGlzLl9wa2dQb29sID0ge307XHJcbiAgICAgICAgdGhpcy5ub2NhY2hlRGljdCA9IHsgXCJsb2FkaW5nXCI6dHJ1ZSxcIm1haW5cIjp0cnVlLFwidWljb21wb25lbnRcIjp0cnVlfTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuZ2V0SW5hc3RhbmNlKCkuYWRkVXBkYXRlVGFyZ2V0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3RpbWU6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl90aW1lICs9IGR0O1xyXG4gICAgICAgIGlmKCB0aGlzLl90aW1lID4gdGhpcy5fZGlzVXBkYXRlVGltZSApIC8vMeWIhumSn+ajgOafpeS4gOasoVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIFJlc291cmNlTWFuYWdlci5pbnN0YW5jZS5ydW5uaW5nICkgLy/lpoLmnpzlvZPliY3lnKjliqDovb3kuK3vvIzlu7bml7Yx56eS5qOA5rWLXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpbWUtPTEwMDA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVHcm91cFBvb2woKTtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlR3JvdXBQb29sKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBub3dUaW1lOm51bWJlciA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICB2YXIgcztcclxuICAgICAgICBpZiggdGhpcy5fcGtnUG9vbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdm86Q2FjaGVWTztcclxuICAgICAgICAgICAgZm9yKCBzIGluIHRoaXMuX3BrZ1Bvb2wgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2byA9IHRoaXMuX3BrZ1Bvb2xbc107XHJcbiAgICAgICAgICAgICAgICBpZiggdm8ucmVmIDw9IDAgJiYgKG5vd1RpbWUgLSB2by50aW1lKSA+IHRoaXMuX2NsZWFyVGltZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVQYWNrYWdlKCB2by5wYWNrYWdlTmFtZSx0cnVlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckNhY2hlVk8oIHZvLnBhY2thZ2VOYW1lICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy/muIXnkIblm77niYfnvJPlrZhcclxuICAgICAgICBpZiggdGhpcy5fcmVzb3VyY2V1cmxQb29sIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciByZXNvdXJjZXVybFBvb2w6YW55ID0gdGhpcy5fcmVzb3VyY2V1cmxQb29sO1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gcmVzb3VyY2V1cmxQb29sIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHJlc291cmNldXJsUG9vbFtzXSA8PSAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyUmVzQnlVcmwoIHMsdHJ1ZSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkQ2FjaGVWTyggcGtnbmFtZTpzdHJpbmcsaXNDYWNoZTpib29sZWFuICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpc0NhY2hlICYmICF0aGlzLm5vY2FjaGVEaWN0Lmhhc093blByb3BlcnR5KCBwa2duYW1lICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZvOkNhY2hlVk87XHJcbiAgICAgICAgICAgIGlmKCAhdGhpcy5fcGtnUG9vbC5oYXNPd25Qcm9wZXJ0eSggcGtnbmFtZSApIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm8gPSBPYmplY3RQb29sLmdldE9iaiggQ2FjaGVWTy5wb29sa2V5ICk7XHJcbiAgICAgICAgICAgICAgICB2by5wYWNrYWdlTmFtZSA9IHBrZ25hbWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wa2dQb29sWyBwa2duYW1lIF0gPSB2bztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZvID0gdGhpcy5fcGtnUG9vbFtwa2duYW1lXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2by5yZWYrKztcclxuICAgICAgICAgICAgdm8udGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbGVhckNhY2hlVk8oIHBrZ05hbWU6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9wa2dQb29sWyBwa2dOYW1lIF0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZvOkNhY2hlVk8gPSB0aGlzLl9wa2dQb29sWyBwa2dOYW1lIF07XHJcbiAgICAgICAgICAgIHZvLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wa2dQb29sWyBwa2dOYW1lIF07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa3u+WKoHVp5YyFXHJcbiAgICAgKiBAcGFyYW0gcGtnbmFtZSDljIXlkI1cclxuICAgICAqIEBwYXJhbSBpc2FkZHBhY2thZ2Ug5piv5ZCm5Yib5bu6dWlwYWNrYWdlXHJcbiAgICAgKiBAcGFyYW0gaXNDYWNoZSDmmK/lkKbmt7vliqDliLDnu4TnvJPlrZjkuK3vvIgg5aaC5p6c5re75Yqg77yM5YiZ5Y+C5LiO5a6a5pe25riF55CG55qE6YC76L6RLOW4uOmpu+i1hOa6kOivt+WLv+iuvue9ruS4unR1cmUg77yJXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGR1aVBhY2thZ2UocGtnbmFtZTpzdHJpbmcsaXNhZGRwYWNrYWdlOmJvb2xlYW4gPSB0cnVlLGlzQ2FjaGU6Ym9vbGVhbiA9IHRydWUpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaXNhZGRwYWNrYWdlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBwa2duYW1lID09IFwibWFpblwiIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZmFpcnlndWkuVUlQYWNrYWdlLmFkZFBhY2thZ2UoUGF0aENvbmZpZy5yZXMgKyBQYXRoQ29uZmlnLnVpICsgcGtnbmFtZSxwa2duYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5hZGRQYWNrYWdlKFBhdGhDb25maWcud3hsb2NhbCArIFBhdGhDb25maWcudWkgKyBwa2duYW1lLHBrZ25hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZENhY2hlVk8oIHBrZ25hbWUsaXNDYWNoZSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75Yqg5YyFXHJcbiAgICAgKiBAcGFyYW0gcGF0aCDot6/lvoTvvIgg5LqL5L6L77yacmVzL3VpLyDvvIlcclxuICAgICAqIEBwYXJhbSBwa2duYW1lIOWMheWQjVxyXG4gICAgICogQHBhcmFtIGlzYWRkcGFja2FnZSDmmK/lkKbmt7vliqAgXHJcbiAgICAgKiBAcGFyYW0gaXNDYWNoZSDmmK/lkKbnvJPlrZhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFBhY2thZ2UocGF0aDpzdHJpbmcscGtnbmFtZTpzdHJpbmcsaXNhZGRwYWNrYWdlOmJvb2xlYW4gPSB0cnVlLGlzQ2FjaGU6Ym9vbGVhbiA9IHRydWUpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaXNhZGRwYWNrYWdlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5hZGRQYWNrYWdlKHBhdGggKyBwa2duYW1lLHBrZ25hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZENhY2hlVk8oIHBrZ25hbWUsaXNDYWNoZSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5YyFXHJcbiAgICAgKiBAcGFyYW0gcGtnbmFtZSDljIXlkI1cclxuICAgICAqIEBwYXJhbSBpc2NsZWFyIOaYr+WQpuW8uuWItua4hemZpO+8iCDlpoLmnpzkuLpmYWxzZeWImeetieW+heWumuaXtuWZqOWIpOaWrea4heeQhu+8jOWmguaenOS4unRydWXliJnlvLrliLbmuIXpmaQg77yJXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVQYWNrYWdlKHBrZ25hbWU6c3RyaW5nLGlzY2xlYXI6Ym9vbGVhbiA9IGZhbHNlKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHBrZ25hbWUgPT0gXCJcIiB8fCBwa2duYW1lID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggaXNjbGVhciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCLmuIXnkIbljIXotYTmupDnvJPlrZjvvJpcIiArIHBrZ25hbWUgKTtcclxuICAgICAgICAgICAgZmFpcnlndWkuVUlQYWNrYWdlLnJlbW92ZVBhY2thZ2UoIHBrZ25hbWUgKTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX3BrZ1Bvb2wuaGFzT3duUHJvcGVydHkoIHBrZ25hbWUgKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wa2dQb29sW3BrZ25hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9wa2dQb29sLmhhc093blByb3BlcnR5KCBwa2duYW1lICkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdm86Q2FjaGVWTyA9IHRoaXMuX3BrZ1Bvb2xbIHBrZ25hbWUgXTtcclxuICAgICAgICAgICAgICAgIGlmKCB2byApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm8ucmVmLS07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZGVmZmVjdFBhY2thZ2UoIHBrZ25hbWU6c3RyaW5nLGlzQ2FjaGU6Ym9vbGVhbiA9IHRydWUgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gRGVidWdlci5sb2coXCJhZGRlZmZlY3RQYWNrYWdlOlwiICsgcGtnbmFtZSk7XHJcbiAgICAgICAgLy8gZmFpcnlndWkuVUlQYWNrYWdlLmFkZFBhY2thZ2UoUGF0aENvbmZpZy5yZXMgKyBQYXRoQ29uZmlnLmVmZmVjdHMgKyBwa2duYW1lLHBrZ25hbWUpO1xyXG4gICAgICAgIC8vIHRoaXMuYWRkQ2FjaGVWTyggcGtnbmFtZSxpc0NhY2hlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZWVmZmVjdHBhY2thZ2UoIHBrZ25hbWU6c3RyaW5nLGlzY2xlYXI6Ym9vbGVhbiA9IGZhbHNlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERlYnVnZXIubG9nKFwicmVtb3ZlZWZmZWN0cGFja2FnZTpcIiArIHBrZ25hbWUpO1xyXG4gICAgICAgIFJlc0RhdGFNYW5hZ2VyLmdldEluYXN0YW5jZSgpLnJlbW92ZVBhY2thZ2UoIHBrZ25hbWUsaXNjbGVhciApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5bey57uP5Yqg6L296L+H55qE5pWw5o2uXHJcbiAgICAgKiBAcGFyYW0gdXJsIOi1hOa6kHVybFxyXG4gICAgICogQHBhcmFtIGlzQ2FjaGUg5piv5ZCm5a2Y5YKo5Zyo57yT5a2Y5rGg5Lit77yM6buY6K6k5Li6dHJ1ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmVzQnl1cmwoIHVybDpzdHJpbmcsaXNDYWNoZTpib29sZWFuID0gdHJ1ZSApOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpc0NhY2hlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuX3Jlc291cmNldXJsUG9vbFt1cmxdID09IG51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc291cmNldXJsUG9vbFt1cmxdID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9yZXNvdXJjZXVybFBvb2xbdXJsXSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTGF5YS5sb2FkZXIuZ2V0UmVzKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIbotYTmupDnvJPlrZgodXJsKVxyXG4gICAgICogQHBhcmFtIHVybCDopoHmuIXnkIbnmoTotYTmupB1cmxcclxuICAgICAqIEBwYXJhbSBpc0NsZWFyIOWvueS6jue8k+WtmOaxoOS4reeahOaVsOaNru+8jOW9k+W8leeUqOS4ujDml7bvvIzmmK/lkKbnm7TmjqXlvLrliLbmuIXpmaTvvIgg5aaC5p6c5Li6ZmFsc2Us5YiZ562J5b6F57yT5a2Y5a6a5pe25Yi35paw5pe25YCZ5YaN5Y675Yik5patIO+8iVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJSZXNCeVVybCggdXJsOnN0cmluZyxpc0NsZWFyOmJvb2xlYW4gPSBmYWxzZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLl9yZXNvdXJjZXVybFBvb2wuaGFzT3duUHJvcGVydHkodXJsKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBpc0NsZWFyIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgRGVidWdlci5sb2coIFwiY2xlYXJSZXNCeVVybDpcIiArIHVybCApO1xyXG4gICAgICAgICAgICAgICAgTGF5YS5sb2FkZXIuY2xlYXJSZXModXJsKTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9yZXNvdXJjZXVybFBvb2xbdXJsXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc291cmNldXJsUG9vbFt1cmxdLS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5sb2FkZXIuY2xlYXJSZXModXJsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5riF55CG6LWE5rqQ57yT5a2YKEFycmF5KVxyXG4gICAgICogQHBhcmFtIHVybHMg6LWE5rqQ5pWw57uEXHJcbiAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUg5YyF5ZCNXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhclJlc0J5QXJyVXJscyggdXJsczpBcnJheTxhbnk+LHBhY2thZ2VOYW1lOnN0cmluZyA9IFwiXCIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHBhY2thZ2VOYW1lICE9IFwiXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZmFpcnlndWkuVUlQYWNrYWdlLnJlbW92ZVBhY2thZ2UoIHBhY2thZ2VOYW1lICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciggdmFyIHMgaW4gdXJscyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyUmVzQnlVcmwoIHVybHNbc10udXJsLHRydWUgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCIvKlxyXG4qIG5hbWU7XHJcbiovXHJcbmltcG9ydCBIYW5kbGVyID0gTGF5YS5IYW5kbGVyO1xyXG5pbXBvcnQgUmVzRGF0YU1hbmFnZXIgZnJvbSBcIi4vUmVzRGF0YU1hbmFnZXJcIjtcclxuaW1wb3J0IERlYnVnZXIgZnJvbSBcIi4uL2ZyYW1ld29ya3MvRGVidWdlclwiO1xyXG5pbXBvcnQgVG9uZ2ppSHR0cHMgZnJvbSBcIi4uL2ZyYW1ld29ya3MvbmV0L1RvbmdqaUh0dHBzXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gXCIuLi9mcmFtZXdvcmtzL2V2ZW50cy9FdmVudFV0aWxzXCI7XHJcbmltcG9ydCBSZWNDb25maWdzIGZyb20gXCIuLi9jb25maWdzL2dhbWVDb25maWdzL1JlY0NvbmZpZ3NcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHJpdmF0ZSBfY29uZmlnczogQXJyYXk8YW55PjtcclxuICAgIHByaXZhdGUgX29uQ29uZmlnQ29tcGxldGU6IEZ1bmN0aW9uO1xyXG4gICAgcHJpdmF0ZSBfb25Db25maWdQcm9ncmVzczogRnVuY3Rpb247IFxyXG4gICAgcHJpdmF0ZSBfb25Db25maWdDb21wbGV0ZVRhcmdldDogYW55O1xyXG4gICAgcHJpdmF0ZSBfZ3JvdXBzOiBhbnk7XHJcbiAgICBwcml2YXRlIF9ncm91cEluZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHJ1bm5pbmc6Qm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfbm93TG9hZERhdGE6YW55O1xyXG4gICAgXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZTpSZXNvdXJjZU1hbmFnZXI7XHJcblx0cHVibGljIGNvbnN0cnVjdG9yKCkgXHJcblx0e1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblx0fVxyXG5cdFxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBSZXNvdXJjZU1hbmFnZXJcclxuXHR7XHJcbiAgICAgICAgaWYodGhpcy5pbnN0YW5jZSA9PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBSZXNvdXJjZU1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdGhpcy5fZ3JvdXBzID0ge307XHJcbiAgICAgICAgTGF5YS5sb2FkZXIucmV0cnlOdW0gPSA0O1xyXG4gICAgICAgIExheWEubG9hZGVyLm9uKExheWEuRXZlbnQuRVJST1IsIHRoaXMsIHRoaXMub25FcnJvcik7XHJcbiAgICAgICAgTGF5YS5sb2FkZXIub24oXCJlcnJvcnNNc2dcIiwgdGhpcywgdGhpcy5lcnJvcnNNc2doYW5kbGVyKTtcclxuICAgICAgICBMYXlhLmxvYWRlci5vbihcImdhbWVlcnJvcnNNc2dcIiwgdGhpcywgdGhpcy5nYW1lZXJyb3JzTXNnaGFuZGxlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxvYWRDb25maWdDb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fb25Db25maWdDb21wbGV0ZVRhcmdldCAhPSBudWxsICYmIHRoaXMuX29uQ29uZmlnQ29tcGxldGUgIT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9vbkNvbmZpZ0NvbXBsZXRlLmNhbGwoIHRoaXMuX29uQ29uZmlnQ29tcGxldGVUYXJnZXQgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlcnJvcnNNc2doYW5kbGVyKCBtc2c6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcImVycm9yc01zZ2hhbmRsZXJcIixtc2cgKTtcclxuICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIFwibG9hZGZhaWxFdmVudFwiLG1zZyApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2FtZWVycm9yc01zZ2hhbmRsZXIoIG1zZzpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBcImdhbWVzZXJyb3NFdmVudFwiLG1zZyApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L296LWE5rqQ57uEXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOe7hOWQjVxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIOWujOaIkOS6i+S7tlxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyAgIOWKoOi9vei/m+W6puS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzU2hvdyAgICAgICAgICAgICAgIOaYr+WQpuaYvuekuuWKoOi9veeKtuaAgVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZEdyb3VwKGdyb3VwTmFtZTpzdHJpbmcsb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLG9uUmVzb3VyY2VQcm9ncmVzczpGdW5jdGlvbiA9IG51bGwsaXNTaG93OkJvb2xlYW4gPSB0cnVlLGFyZ3M6YW55PW51bGwpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gRGVidWdlci5sb2coZ3JvdXBOYW1lKTtcclxuICAgICAgICB2YXIgZGF0YTphbnkgPSB7fTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlID0gUmVzb3VyY2VMb2FkQ29tcGxldGU7XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xyXG4gICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBvblJlc291cmNlUHJvZ3Jlc3M7XHJcbiAgICAgICAgZGF0YS51cmxzID0gUmVjQ29uZmlncy5nZXRJbnN0YW5jZSgpLmdyb3VwZGljdFsgZ3JvdXBOYW1lIF07XHJcbiAgICAgICAgZGF0YS5pc1Nob3cgPSBpc1Nob3c7XHJcbiAgICAgICAgZGF0YS5hcmdzPWFyZ3M7XHJcbiAgICAgICAgZGF0YS50eXBlID0gXCJncm91cFwiO1xyXG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjJEXCI7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9veWNleS4qui1hOa6kFxyXG4gICAgICogQHBhcmFtIHVybCDotYTmupB1cmxcclxuICAgICAqIEBwYXJhbSB0eXBlIOi1hOa6kOexu+Wei1xyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIOWujOaIkOS6i+S7tlxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyDliqDovb3ov5vluqbkuovku7ZcclxuICAgICAqIEBwYXJhbSBpc1Nob3cg5piv5ZCm5pi+56S65Yqg6L2954q25oCBXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBMb2FkZXIoIHVybDphbnksIHR5cGU6c3RyaW5nLG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzU2hvdzpCb29sZWFuID0gdHJ1ZSxhcmdzOmFueT1udWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBkYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlVGFyZ2V0ID0gb25SZXNvdXJjZUxvYWRUYXJnZXQ7XHJcbiAgICAgICAgZGF0YS5wcm9ncmVzcyA9IG9uUmVzb3VyY2VQcm9ncmVzcztcclxuICAgICAgICBkYXRhLnVybHMgPSBbe3VybDp1cmwsdHlwZTp0eXBlfV07XHJcbiAgICAgICAgZGF0YS5pc1Nob3cgPSBpc1Nob3c7XHJcbiAgICAgICAgZGF0YS5hcmdzPWFyZ3M7XHJcbiAgICAgICAgZGF0YS50eXBlID0gXCJzaW5nbGVcIjtcclxuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIyRFwiO1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3MucHVzaCggZGF0YSApO1xyXG4gICAgICAgIHRoaXMubG9hZFN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3mlbDnu4TotYTmupBcclxuICAgICAqIEBwYXJhbSB1cmxzIFxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IFxyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIFxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyBcclxuICAgICAqIEBwYXJhbSBpc1Nob3cgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBMb2FkZXJzKCB1cmxzOkFycmF5PGFueT4sIG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzU2hvdzpCb29sZWFuID0gdHJ1ZSxhcmdzOmFueT1udWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBkYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlVGFyZ2V0ID0gb25SZXNvdXJjZUxvYWRUYXJnZXQ7XHJcbiAgICAgICAgZGF0YS5wcm9ncmVzcyA9IG9uUmVzb3VyY2VQcm9ncmVzcztcclxuICAgICAgICBkYXRhLnVybHMgPSB1cmxzO1xyXG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNTaG93O1xyXG4gICAgICAgIGRhdGEudHlwZSA9IFwiYXJyXCI7XHJcbiAgICAgICAgZGF0YS5hcmdzPWFyZ3M7XHJcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiMkRcIjtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcclxuICAgICAgICB0aGlzLmxvYWRTdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6KaB5Yqg6L2955qE5oC75pWw6YePXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvYWROdW06bnVtYmVyID0gMDtcclxuICAgIC8qKlxyXG4gICAgICog5bey57uP5Yqg6L2955qE5pWw6YePXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvYWRlZE51bTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX3ByZWxvYWROdW06bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9jdXQ6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9ub3dMb2FkQXJyOkFycmF5PGFueT4gPSBudWxsO1xyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3otYTmupDmlbDnu4TvvIzmraTliqDovb3mlrnms5XkvJrljZXkuKrliqDovb3mlbDnu4TlhoXnmoTotYTmupDvvIznlKjkuo7mmL7npLrkuKTkuKrov5vluqbmnaHvvIgg5LiA5Liq5oC76L+b5bqm5p2h77yM5LiA5Liq5Y2V5Liq6LWE5rqQ6L+b5bqm5p2hIO+8iVxyXG4gICAgICogQHBhcmFtIHVybHMgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQgXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIFxyXG4gICAgICogQHBhcmFtIGlzU2hvdyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvYWRlckFycih1cmxzOkFycmF5PGFueT4sIG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGN1dDpudW1iZXIgPSAzKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IHVybHM7XHJcbiAgICAgICAgZGF0YS5pc1Nob3cgPSBmYWxzZTtcclxuICAgICAgICBkYXRhLnR5cGUgPSBcImxvYWRlckFyclwiO1xyXG4gICAgICAgIGRhdGEuY3V0ID0gY3V0O1xyXG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjJEXCI7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XHJcbiAgICAgICAgdGhpcy5zdGFydExvYWQxKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGFydExvYWQxKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhdGhpcy5ydW5uaW5nICYmIHRoaXMuX2NvbmZpZ3MubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YSA9IHRoaXMuX2NvbmZpZ3Muc2hpZnQoKTtcclxuICAgICAgICAgICAgdGhpcy5fbm93TG9hZEFyciA9ICh0aGlzLl9ub3dMb2FkRGF0YS51cmxzIGFzIEFycmF5PGFueT4pLmNvbmNhdCgpLnJldmVyc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fbG9hZE51bSA9IHRoaXMuX25vd0xvYWRBcnIubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLl9sb2FkZWROdW0gPTA7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZWxvYWROdW0gPSB0aGlzLl9sb2FkZWROdW07XHJcbiAgICAgICAgICAgIHRoaXMuX2N1dCA9IE51bWJlcih0aGlzLl9ub3dMb2FkRGF0YS5jdXQpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRTdGFydDEoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkU3RhcnQxKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLnJ1bm5pbmcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5fbm93TG9hZEFyciAmJiB0aGlzLl9ub3dMb2FkQXJyLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIG5lZWRBcnI6QXJyYXk8YW55PjtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0xvYWRBcnIubGVuZ3RoID4gdGhpcy5fY3V0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmVlZEFyciA9IHRoaXMuX25vd0xvYWRBcnIuc3BsaWNlKCAwLHRoaXMuX2N1dCApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmVlZEFyciA9IHRoaXMuX25vd0xvYWRBcnIuc3BsaWNlKCAwICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fY3V0ID0gbmVlZEFyci5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZWxvYWROdW0gPSB0aGlzLl9sb2FkZWROdW07XHJcbiAgICAgICAgICAgIHRoaXMub25Mb2FkaW5nQXJyKCAwICk7XHJcbiAgICAgICAgICAgIHZhciByZXNvdXNlVHlwZTpzdHJpbmcgPSB0aGlzLl9ub3dMb2FkRGF0YS5yZXNvdXNlVHlwZTtcclxuICAgICAgICAgICAgaWYocmVzb3VzZVR5cGUgPT0gXCIyRFwifHxyZXNvdXNlVHlwZT09bnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgTGF5YS5sb2FkZXIubG9hZChuZWVkQXJyLCBIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZENvbXBsZXRlQXJyKSxIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZGluZ0FycixudWxsLCBmYWxzZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgTGF5YS5sb2FkZXIuY3JlYXRlKG5lZWRBcnIsIEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkQ29tcGxldGVBcnIpLEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkaW5nQXJyLG51bGwsIGZhbHNlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbm93TG9hZERhdGEgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0TG9hZDEoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxvYWRpbmdBcnIodmFsdWU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2xvYWRlZE51bSA9IHRoaXMuX3ByZWxvYWROdW0gKyB2YWx1ZSp0aGlzLl9jdXQ7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0xvYWREYXRhIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhbGx2YWx1ZTpudW1iZXIgPSBNYXRoLmNlaWwoKHRoaXMuX2xvYWRlZE51bSAvIHRoaXMuX2xvYWROdW0gKSoxMDApO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93TG9hZERhdGEucHJvZ3Jlc3MgIT0gbnVsbCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhLnByb2dyZXNzLmNhbGwoIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlVGFyZ2V0LGFsbHZhbHVlLE1hdGguZmxvb3IodmFsdWUqMTAwKSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Mb2FkQ29tcGxldGVBcnIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5vbkxvYWRpbmdBcnIoIDEgKTtcclxuICAgICAgICB0aGlzLl9sb2FkZWROdW0gPSB0aGlzLl9wcmVsb2FkTnVtICsgdGhpcy5fY3V0O1xyXG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmKCB0aGlzLl9sb2FkZWROdW0gPT0gdGhpcy5fbG9hZE51bSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93TG9hZERhdGEgJiYgdGhpcy5fbm93TG9hZERhdGEuY29tcGxldGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZS5jYWxsKHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlVGFyZ2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBMYXlhLnRpbWVyLmNhbGxMYXRlciggdGhpcywgdGhpcy5sb2FkU3RhcnQxICk7XHJcbiAgICAgICAgLy8gdGhpcy5sb2FkU3RhcnQxKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkU3RhcnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMucnVubmluZyB8fCB0aGlzLl9jb25maWdzLmxlbmd0aCA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YSA9IHRoaXMuX2NvbmZpZ3NbMF07XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxhbnk+ID0gdGhpcy5fbm93TG9hZERhdGEudXJscztcclxuICAgICAgICB2YXIgaXNTaG93OmJvb2xlYW4gPSB0aGlzLl9ub3dMb2FkRGF0YS5pc1Nob3c7XHJcbiAgICAgICAgaWYoIGlzU2hvdyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LnNob3dNb2RhbFdhaXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJlc291c2VUeXBlOnN0cmluZyA9IHRoaXMuX25vd0xvYWREYXRhLnJlc291c2VUeXBlO1xyXG4gICAgICAgIGlmKCBhcnIgIT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZihyZXNvdXNlVHlwZSA9PSBcIjJEXCJ8fHJlc291c2VUeXBlPT1udWxsKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKGFycixIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZENvbXBsZXRlKSxIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZGluZywgbnVsbCwgZmFsc2UpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIExheWEubG9hZGVyLmNyZWF0ZShhcnIsSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRDb21wbGV0ZSksSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRpbmcsIG51bGwsIGZhbHNlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5Yqg6L296L+b5bqm5L6m5ZCs5ZmoXHJcbiAgICBwcml2YXRlIG9uTG9hZGluZyhwcm9ncmVzczogbnVtYmVyKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fbm93TG9hZERhdGEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJvZ3Jlc3MgPSBNYXRoLmNlaWwoIE51bWJlcihwcm9ncmVzcyAqIDEwMCkgKTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0xvYWREYXRhLnByb2dyZXNzICE9IG51bGwgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YS5wcm9ncmVzcy5jYWxsKCB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZVRhcmdldCxwcm9ncmVzcyApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Mb2FkQ29tcGxldGUoYXJnczphbnk9bnVsbCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuY2xvc2VNb2RhbFdhaXQoKTtcclxuICAgICAgICBpZiggdGhpcy5fbm93TG9hZERhdGEgJiYgdGhpcy5fbm93TG9hZERhdGEuY29tcGxldGUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYodGhpcy5fbm93TG9hZERhdGEuYXJncyl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZS5jYWxsKHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlVGFyZ2V0LHRoaXMuX25vd0xvYWREYXRhLmFyZ3MpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlLmNhbGwodGhpcy5fbm93TG9hZERhdGEuY29tcGxldGVUYXJnZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX25vd0xvYWREYXRhID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnNoaWZ0KCk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRXJyb3IoZXJyOiBTdHJpbmcpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICAgICAgRGVidWdlci5sb2coXCLliqDovb3lpLHotKU6IFwiICsgZXJyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vTNE5Y2V5Liq6LWE5rqQXHJcbiAgICAgKiBAcGFyYW0gdXJsIOi1hOa6kHVybFxyXG4gICAgICogQHBhcmFtIHR5cGUg6LWE5rqQ57G75Z6LXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQg5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUg5a6M5oiQ5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIOWKoOi9vei/m+W6puS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzU2hvdyDmmK/lkKbmmL7npLrliqDovb3nirbmgIFcclxuICAgICAqL1xyXG4gICAgcHVibGljIExvYWRlcjNEKCB1cmw6YW55LCB0eXBlOmFueSxvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sb25SZXNvdXJjZVByb2dyZXNzOkZ1bmN0aW9uID0gbnVsbCxpc1Nob3c6Qm9vbGVhbiA9IHRydWUgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IFt7dXJsOnVybCx0eXBlOnR5cGV9XTtcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGlzU2hvdztcclxuICAgICAgICBkYXRhLnR5cGUgPSBcInNpbmdsZVwiO1xyXG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjNEXCI7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vTNE6LWE5rqQ57uEXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOe7hOWQjVxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIOWujOaIkOS6i+S7tlxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyAgIOWKoOi9vei/m+W6puS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzU2hvdyAgICAgICAgICAgICAgIOaYr+WQpuaYvuekuuWKoOi9veeKtuaAgVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZEdyb3VwM0QoZ3JvdXBOYW1lOnN0cmluZyxvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sb25SZXNvdXJjZVByb2dyZXNzOkZ1bmN0aW9uID0gbnVsbCxpc1Nob3c6Qm9vbGVhbiA9IHRydWUsYXJnczphbnk9bnVsbClcclxuICAgIHtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyhncm91cE5hbWUpO1xyXG4gICAgICAgIHZhciBkYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlVGFyZ2V0ID0gb25SZXNvdXJjZUxvYWRUYXJnZXQ7XHJcbiAgICAgICAgZGF0YS5wcm9ncmVzcyA9IG9uUmVzb3VyY2VQcm9ncmVzcztcclxuICAgICAgICBkYXRhLnVybHMgPSBSZWNDb25maWdzLmdldEluc3RhbmNlKCkuZ3JvdXBkaWN0WyBncm91cE5hbWUgXTtcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGlzU2hvdztcclxuICAgICAgICBkYXRhLmFyZ3M9YXJncztcclxuICAgICAgICBkYXRhLnR5cGUgPSBcImdyb3VwXCI7XHJcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiM0RcIjtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcclxuICAgICAgICB0aGlzLmxvYWRTdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L296LWE5rqQ5pWw57uE77yM5q2k5Yqg6L295pa55rOV5Lya5Y2V5Liq5Yqg6L295pWw57uE5YaF55qE6LWE5rqQ77yM55So5LqO5pi+56S65Lik5Liq6L+b5bqm5p2h77yIIOS4gOS4quaAu+i/m+W6puadoe+8jOS4gOS4quWNleS4qui1hOa6kOi/m+W6puadoSDvvIlcclxuICAgICAqIEBwYXJhbSB1cmxzIFxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IFxyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIFxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyBcclxuICAgICAqIEBwYXJhbSBpc1Nob3cgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2FkZXIzREFycih1cmxzOkFycmF5PGFueT4sIG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzc2hvdzpib29sZWFuID0gZmFsc2UsYXJnczphbnk9bnVsbCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBkYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlVGFyZ2V0ID0gb25SZXNvdXJjZUxvYWRUYXJnZXQ7XHJcbiAgICAgICAgZGF0YS5wcm9ncmVzcyA9IG9uUmVzb3VyY2VQcm9ncmVzcztcclxuICAgICAgICBkYXRhLnVybHMgPSB1cmxzO1xyXG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNzaG93O1xyXG4gICAgICAgIGRhdGEuYXJncz1hcmdzO1xyXG4gICAgICAgIGRhdGEudHlwZSA9IFwibG9hZGVyQXJyXCI7XHJcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiM0RcIjtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcclxuICAgICAgICB0aGlzLmxvYWRTdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L2954m55pWIXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIFxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IFxyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIFxyXG4gICAgICogQHBhcmFtIGFyZ3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2FkRWZmZWN0KCBncm91cE5hbWU6c3RyaW5nLG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixhcmdzOmFueT1udWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB1cmxzOkFycmF5PGFueT4gPSBSZWNDb25maWdzLmdldEluc3RhbmNlKCkuZ3JvdXBkaWN0WyBncm91cE5hbWUgXTtcclxuICAgICAgICBpZiggdXJscyAmJiB1cmxzLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5sb2FkZXIubG9hZCh1cmxzLEhhbmRsZXIuY3JlYXRlKCBvblJlc291cmNlTG9hZFRhcmdldCxSZXNvdXJjZUxvYWRDb21wbGV0ZSxbYXJnc10gKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgR2FtZUxheWVyTWFuYWdlciB9IGZyb20gXCIuL0dhbWVMYXllck1hbmFnZXJcIjtcclxuaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IENhbWVyYXNTY3JpcHQgZnJvbSBcIi4uL2dhbWVtb2R1bGUvbW9kZWxTY3JpcHRzL0NhbWVyYXNTY3JpcHRcIjtcclxuaW1wb3J0IFNjZW5lM2RPYmplY3QgZnJvbSBcIi4uL2dhbWVtb2R1bGUvc2NlbmUzZHMvU2NlbmUzZE9iamVjdFwiO1xyXG5pbXBvcnQgTWFpblJBb2xlU2NyaXB0IGZyb20gXCIuLi9nYW1lbW9kdWxlL21vZGVsU2NyaXB0cy9NYWluUm9sZVNjcmlwdFwiO1xyXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4uL2ZyYW1ld29ya3MvZXZlbnRzL0V2ZW50VXRpbHNcIjtcclxuaW1wb3J0IEdhbWVFdmVudCBmcm9tIFwiLi4vZ2FtZW1vZHVsZS91c2VyaW5mby9ldmVudHMvR2FtZUV2ZW50XCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi9mcmFtZXdvcmtzL0RlYnVnZXJcIjtcclxuaW1wb3J0IExldmVsQ0ZHIGZyb20gXCIuLi9jb25maWdzL2RhdGFDb25maWdzL0xldmVsQ0ZHXCI7XHJcbmltcG9ydCBVc2VySW5mb1Byb3h5IGZyb20gXCIuLi9nYW1lbW9kdWxlL3VzZXJpbmZvL1VzZXJJbmZvUHJveHlcIjtcclxuaW1wb3J0IE1WQ09iamVjdFBvb2wgZnJvbSBcIi4uL2ZyYW1ld29ya3MvbXZjL01WQ09iamVjdFBvb2xcIjtcclxuaW1wb3J0IFJvbGVWTyBmcm9tIFwiLi4vZ2FtZW1vZHVsZS91c2VyaW5mby92by9Sb2xlVk9cIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgTnBjQ0ZHIGZyb20gXCIuLi9jb25maWdzL2RhdGFDb25maWdzL05wY0NGR1wiO1xyXG5pbXBvcnQgTnBjU2NyaXB0IGZyb20gXCIuLi9nYW1lbW9kdWxlL21vZGVsU2NyaXB0cy9OcGNTY3JpcHRcIjtcclxuaW1wb3J0IFJlc291cmNlTWFuYWdlciBmcm9tIFwiLi9SZXNvdXJjZU1hbmFnZXJcIjtcclxuaW1wb3J0IEdhbWVDRkcgZnJvbSBcIi4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvR2FtZUNGR1wiO1xyXG5pbXBvcnQgUm9sZUFjdGlvbnMgZnJvbSBcIi4uL2dhbWVtb2R1bGUvc2NlbmUzZHMvUm9sZUFjdGlvbnNcIjtcclxuaW1wb3J0IFVzZXJJbmZvRXZlbnQgZnJvbSBcIi4uL2dhbWVtb2R1bGUvdXNlcmluZm8vZXZlbnRzL1VzZXJJbmZvRXZlbnRcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgUm9sZXNQb29sIGZyb20gXCIuLi9nYW1lbW9kdWxlL3NjZW5lM2RzL1JvbGVzUG9vbFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NlbmUzRE1hbmFnZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOlNjZW5lM0RNYW5hZ2VyO1xyXG5cclxuICAgIHByaXZhdGUgX2luaXRQb3NZOm51bWJlciA9IDE7XHJcblxyXG4gICAgcHVibGljIGNhbWVyYVNjcmlwdDpDYW1lcmFzU2NyaXB0O1xyXG4gICAgcHVibGljIG1haW5Sb2xlU2NyaXB0Ok1haW5SQW9sZVNjcmlwdDtcclxuXHJcbiAgICBcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6U2NlbmUzRE1hbmFnZXJcclxuICAgIHtcclxuICAgICAgICBpZiggIXRoaXMuX2luc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IFNjZW5lM0RNYW5hZ2VyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJhY2tncm91bmRQYXJlbnQ6TGF5YS5TcHJpdGUgPSBHYW1lTGF5ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuYmFja2dyb3VuZC5kaXNwbGF5T2JqZWN0O1xyXG5cclxuICAgICAgICB2YXIgc2NlbmViZzpmYWlyeWd1aS5HSW1hZ2UgPSBmYWlyeWd1aS5VSVBhY2thZ2UuY3JlYXRlT2JqZWN0KCBcIm1haW5cIixcInNreVwiICkgYXMgZmFpcnlndWkuR0ltYWdlO1xyXG4gICAgICAgIGJhY2tncm91bmRQYXJlbnQuYWRkQ2hpbGQoIHNjZW5lYmcuZGlzcGxheU9iamVjdCApO1xyXG4gICAgICAgIHNjZW5lYmcuc2V0U2NhbGUoIDIuNSwyLjUgKTtcclxuICAgICAgICBzY2VuZWJnLnkgPSAtMjAwO1xyXG4gICAgICAgIHZhciBzY2VuZWJnMTpmYWlyeWd1aS5HSW1hZ2UgPSBmYWlyeWd1aS5VSVBhY2thZ2UuY3JlYXRlT2JqZWN0KCBcIm1haW5cIixcInNreV9kb3duXCIgKSBhcyBmYWlyeWd1aS5HSW1hZ2U7XHJcbiAgICAgICAgYmFja2dyb3VuZFBhcmVudC5hZGRDaGlsZCggc2NlbmViZzEuZGlzcGxheU9iamVjdCApO1xyXG4gICAgICAgIHNjZW5lYmcxLnNldFNjYWxlKCAyLjUsMi41ICk7XHJcbiAgICAgICAgc2NlbmViZzEueSA9IHNjZW5lYmcueSs3NDA7XHJcblxyXG4gICAgICAgIC8v5re75YqgM0TlnLrmma9cclxuICAgICAgICBTY2VuZTNkT2JqZWN0LnNjZW5lM0QgPSBiYWNrZ3JvdW5kUGFyZW50LmFkZENoaWxkKG5ldyBMYXlhLlNjZW5lM0QoKSkgYXMgTGF5YS5TY2VuZTNEO1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3Quc2NlbmUzRC5waHlzaWNzU2ltdWxhdGlvbi5jb250aW51b3VzQ29sbGlzaW9uRGV0ZWN0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy/mt7vliqDnhafnm7jmnLpcclxuICAgICAgICBTY2VuZTNkT2JqZWN0LmNhcm1hID0gKFNjZW5lM2RPYmplY3Quc2NlbmUzRC5hZGRDaGlsZChuZXcgTGF5YS5DYW1lcmEoMCwgMC4xLCA3MCkpKSBhcyBMYXlhLkNhbWVyYTtcclxuICAgICAgICB0aGlzLmNhbWVyYVNjcmlwdCA9IFNjZW5lM2RPYmplY3QuY2FybWEuYWRkQ29tcG9uZW50KCBDYW1lcmFzU2NyaXB0ICk7XHJcblxyXG4gICAgICAgIFNjZW5lM2RPYmplY3QuY2FybWEuY2xlYXJGbGFnID0gTGF5YS5CYXNlQ2FtZXJhLkNMRUFSRkxBR19ERVBUSE9OTFk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy/mt7vliqDmlrnlkJHlhYlcclxuICAgICAgICB2YXIgZGlyZWN0aW9uTGlnaHQ6IExheWEuRGlyZWN0aW9uTGlnaHQgPSBMYXlhLkxvYWRlci5nZXRSZXMoUGF0aENvbmZpZy5nZXQzRE1vZGVsKFwiRGlyZWN0aW9uYWxMaWdodFwiKSkgYXMgTGF5YS5EaXJlY3Rpb25MaWdodDsvL1NjZW5lM2RPYmplY3Quc2NlbmUzRC5hZGRDaGlsZChuZXcgTGF5YS5EaXJlY3Rpb25MaWdodCgpKSBhcyBMYXlhLkRpcmVjdGlvbkxpZ2h0O1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3Quc2NlbmUzRC5hZGRDaGlsZCggZGlyZWN0aW9uTGlnaHQgKTtcclxuICAgICAgICAvLyBkaXJlY3Rpb25MaWdodC50cmFuc2Zvcm0ud29ybGRNYXRyaXguc2V0Rm9yd2FyZChuZXcgTGF5YS5WZWN0b3IzKDEsIC0xLCAwKSk7XHJcblxyXG4gICAgICAgIC8vIHZhciBkaXJlY3Rpb25MaWdodDogTGF5YS5EaXJlY3Rpb25MaWdodCA9IFNjZW5lM2RPYmplY3Quc2NlbmUzRC5hZGRDaGlsZChuZXcgTGF5YS5EaXJlY3Rpb25MaWdodCgpKSBhcyBMYXlhLkRpcmVjdGlvbkxpZ2h0O1xyXG4gICAgICAgIC8vIGRpcmVjdGlvbkxpZ2h0LmNvbG9yID0gbmV3IExheWEuVmVjdG9yMygxLDEsMSk7XHJcbiAgICAgICAgLy8gZGlyZWN0aW9uTGlnaHQuaW50ZW5zaXR5ID0gMC41O1xyXG4gICAgICAgIC8vIGRpcmVjdGlvbkxpZ2h0LnRyYW5zZm9ybS53b3JsZE1hdHJpeC5zZXRGb3J3YXJkKG5ldyBMYXlhLlZlY3RvcjMoMSwgLTEsIDApKTtcclxuXHJcbiAgICAgICAgU2NlbmUzZE9iamVjdC5zdGFydFBsYW5lID0gTGF5YS5Mb2FkZXIuZ2V0UmVzKFBhdGhDb25maWcuZ2V0M0RNb2RlbChcInN0YXJ0UGxhbmVcIikpO1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3Quc2NlbmUzRC5hZGRDaGlsZChTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUpO1xyXG5cclxuICAgICAgICBTY2VuZTNkT2JqZWN0LmVuZFBsYW5lID0gTGF5YS5Mb2FkZXIuZ2V0UmVzKFBhdGhDb25maWcuZ2V0M0RNb2RlbChcImVuZFBsYW5lXCIpKTtcclxuICAgICAgICBTY2VuZTNkT2JqZWN0LnNjZW5lM0QuYWRkQ2hpbGQoU2NlbmUzZE9iamVjdC5lbmRQbGFuZSk7XHJcblxyXG4gICAgICAgIC8vIFNjZW5lM2RPYmplY3QuYmdzcHJpdGUzZCA9IExheWEuTG9hZGVyLmdldFJlcyhQYXRoQ29uZmlnLmdldDNETW9kZWwoXCJkaXN0YW50dmlld1wiKSk7XHJcbiAgICAgICAgLy8gU2NlbmUzZE9iamVjdC5zY2VuZTNELmFkZENoaWxkKFNjZW5lM2RPYmplY3QuYmdzcHJpdGUzZCk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgLy/pm77ljJbku6PnoIFcclxuICAgICAgICBTY2VuZTNkT2JqZWN0LnNjZW5lM0QuZW5hYmxlRm9nID0gdHJ1ZTtcclxuICAgICAgICAvL+iuvue9rumbvuWMlueahOminOiJslxyXG4gICAgICAgIHZhciBmb2dBcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FyciggR2FtZUNGRy5kaWN0WzJdLnZhbHVlICk7XHJcbiAgICAgICAgaWYoIEdhbWVDRkcuZGljdFs4XSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgd3Vjb2xvcjpBcnJheTxzdHJpbmc+ID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKCBHYW1lQ0ZHLmRpY3RbOF0udmFsdWUgKTtcclxuICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5zY2VuZTNELmZvZ0NvbG9yID0gbmV3IExheWEuVmVjdG9yMyhOdW1iZXIod3Vjb2xvclswXSksTnVtYmVyKHd1Y29sb3JbMV0pLE51bWJlcih3dWNvbG9yWzJdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFNjZW5lM2RPYmplY3Quc2NlbmUzRC5mb2dDb2xvciA9IG5ldyBMYXlhLlZlY3RvcjMoMCwwLDAuNik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v6K6+572u6Zu+5YyW55qE6LW35aeL5L2N572u77yM55u45a+55LqO55u45py655qE6Led56a7XHJcbiAgICAgICAgdmFyIHZhbHVlQXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoIEdhbWVDRkcuZGljdFszXS52YWx1ZSApO1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3Quc2NlbmUzRC5mb2dTdGFydCA9IE51bWJlciggdmFsdWVBcnJbMF0gKTtcclxuICAgICAgICAvL+iuvue9rumbvuWMluacgOa1k+WkhOeahOi3neemu+OAglxyXG4gICAgICAgIFNjZW5lM2RPYmplY3Quc2NlbmUzRC5mb2dSYW5nZSA9IE51bWJlciggdmFsdWVBcnJbMV0gKTtcclxuICAgICAgICB0aGlzLnNob3dTY2VuZSgpO1xyXG4gICAgICAgIHRoaXMuaW5pdEV2ZW50KCk7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TGl6aSgpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dTY2VuZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgcGF0aEFycjpBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgdmFyIHVybEFycjpBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICAgICAgdGhpcy5jYW1lcmFTY3JpcHQuaXNjYW5mb2xsb3cgPSB0cnVlO1xyXG4gICAgICAgIHZhciByb2xlVk86Um9sZVZPID0gKCBNVkNPYmplY3RQb29sLmdldEluc3RhbmNlKCkuZ2V0UHJveHkoIFVzZXJJbmZvUHJveHkgKSBhcyBVc2VySW5mb1Byb3h5ICkucm9sZVZPO1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHJvbGVWTy5sZXZlbG1hcEFycjtcclxuICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IGFyci5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB1cmxBcnIuaW5kZXhPZiggUGF0aENvbmZpZy5nZXQzRE1vZGVsKCBhcnJbaV0gKSApID09IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdXJsQXJyLnB1c2goIFBhdGhDb25maWcuZ2V0M0RNb2RlbCggYXJyW2ldICkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBucGNBcnI6QXJyYXk8YW55PiA9IHJvbGVWTy5sZXZlbGNmZy5ucGM7XHJcbiAgICAgICAgZm9yKCBpID0gMDtpIDwgbnBjQXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHVybEFyci5pbmRleE9mKCBQYXRoQ29uZmlnLmdldDNEUm9sZU1vZGVsKCBOcGNDRkcuZGljdFsgbnBjQXJyW2ldLmlkIF0ubmFtZSApICkgPT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB1cmxBcnIucHVzaCggUGF0aENvbmZpZy5nZXQzRFJvbGVNb2RlbCggTnBjQ0ZHLmRpY3RbIG5wY0FycltpXS5pZCBdLm5hbWUgKSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IHVybEFyci5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhdGhBcnIucHVzaCggeyB1cmw6dXJsQXJyW2ldIH0gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZGVyM0RBcnIoIHBhdGhBcnIsdGhpcyx0aGlzLmxvYWQzRGNvbXBsZXRlLG51bGwsdHJ1ZSApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZDNEY29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVNYXAoKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZU1haW5Sb2xlKCApO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlTnBjKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRXZlbnRVdGlscy5hZGRFdmVudExpc3RlbmVyKCBHYW1lRXZlbnQuc3RhcnRHYW1lLHRoaXMsdGhpcy5zdGFydEdhbWVIYW5kbGVyICk7IFxyXG4gICAgICAgIEV2ZW50VXRpbHMuYWRkRXZlbnRMaXN0ZW5lciggR2FtZUV2ZW50Lmp1bXBnYW1lLHRoaXMsdGhpcy5qdW1waGFuZGxlciApO1xyXG4gICAgICAgIEV2ZW50VXRpbHMuYWRkRXZlbnRMaXN0ZW5lciggVXNlckluZm9FdmVudC51c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZCx0aGlzLHRoaXMudXBkYXRlcm9sZU1vZGVsSGFuZGxlciApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlcm9sZU1vZGVsSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgdXNlcmluZm9Qcm94eTpVc2VySW5mb1Byb3h5ID0gTVZDT2JqZWN0UG9vbC5nZXRJbnN0YW5jZSgpLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICk7XHJcbiAgICAgICAgdmFyIHJvbGV2bzpSb2xlVk8gPSB1c2VyaW5mb1Byb3h5LnJvbGVWTztcclxuICAgICAgICB2YXIgcGF0aEFycjpBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgcGF0aEFyci5wdXNoKCB7dXJsOlBhdGhDb25maWcuZ2V0M0RSb2xlTW9kZWwoIHJvbGV2by5yb2xlQ2ZnLm5hbWUgKSB9ICk7XHJcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZGVyM0RBcnIoIHBhdGhBcnIsdGhpcyx0aGlzLmxvYWRyb2xlY29tcGxldGUsbnVsbCx0cnVlLFBhdGhDb25maWcuZ2V0M0RNb2RlbCggcm9sZXZvLnJvbGVDZmcubmFtZSApICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2Fkcm9sZWNvbXBsZXRlKCB1cmw6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB1c2VyaW5mb1Byb3h5OlVzZXJJbmZvUHJveHkgPSBNVkNPYmplY3RQb29sLmdldEluc3RhbmNlKCkuZ2V0UHJveHkoIFVzZXJJbmZvUHJveHkgKTtcclxuICAgICAgICB2YXIgcm9sZXZvOlJvbGVWTyA9IHVzZXJpbmZvUHJveHkucm9sZVZPO1xyXG4gICAgICAgIGlmKCBQYXRoQ29uZmlnLmdldDNETW9kZWwoIHJvbGV2by5yb2xlQ2ZnLm5hbWUgKSA9PSB1cmwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVNYWluUm9sZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGp1bXBoYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubWFpblJvbGVTY3JpcHQuY2VzaGl0aWFveXVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGFydEdhbWVIYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubWFpblJvbGVTY3JpcHQuc3RhcnRSdW4oKTtcclxuICAgICAgICB2YXIgbnBjZGljdDphbnkgPSBTY2VuZTNkT2JqZWN0Lm5wY3NjcmlwdERpY3Q7XHJcbiAgICAgICAgZm9yKCB2YXIgcyBpbiBucGNkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBucGNzY3JpcHQ6TnBjU2NyaXB0ID0gbnBjZGljdFtzXTtcclxuICAgICAgICAgICAgbnBjc2NyaXB0LnN0YXJ0UnVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVtb3ZlTm93Um9sZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5tYWluUm9sZSAmJiB0aGlzLm1haW5Sb2xlU2NyaXB0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFJvbGVzUG9vbC5yZW1vdmVSb2xlKCBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLHRoaXMubWFpblJvbGVTY3JpcHQucmVzb3VzZU5hbWUsdGhpcy5tYWluUm9sZVNjcmlwdCApO1xyXG4gICAgICAgICAgICB0aGlzLm1haW5Sb2xlU2NyaXB0ID0gbnVsbDtcclxuICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5tYWluUm9sZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8v5Yib5bu65Li76KeSXHJcbiAgICBwcml2YXRlIGNyZWF0ZU1haW5Sb2xlKCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgdXNlcmluZm9Qcm94eTpVc2VySW5mb1Byb3h5ID0gTVZDT2JqZWN0UG9vbC5nZXRJbnN0YW5jZSgpLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICk7XHJcbiAgICAgICAgdmFyIHJvbGV2bzpSb2xlVk8gPSB1c2VyaW5mb1Byb3h5LnJvbGVWTztcclxuICAgICAgICB2YXIgaXNjcmVhdGU6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmKCAhU2NlbmUzZE9iamVjdC5tYWluUm9sZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpc2NyZWF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIFNjZW5lM2RPYmplY3QubWFpblJvbGUubmFtZSAhPSBcInJvbGVfXCIgKyByb2xldm8ucm9sZUNmZy5uYW1lIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlzY3JlYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVOb3dSb2xlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCBpc2NyZWF0ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IExheWEuTG9hZGVyLmdldFJlcyhQYXRoQ29uZmlnLmdldDNEUm9sZU1vZGVsKHJvbGV2by5yb2xlQ2ZnLm5hbWUpKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICAvLyBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZShzcCwgU2NlbmUzZE9iamVjdC5zY2VuZTNELCBmYWxzZSxuZXcgTGF5YS5WZWN0b3IzKCAwLDAsMCApKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlID0gUm9sZXNQb29sLmFkZFJvbGVCeU5hbWUoIHJvbGV2by5yb2xlQ2ZnLm5hbWUsTWFpblJBb2xlU2NyaXB0LFNjZW5lM2RPYmplY3Quc2NlbmUzRCApO1xyXG4gICAgICAgICAgICBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLm5hbWUgPSBcInJvbGVfXCIgKyByb2xldm8ucm9sZUNmZy5uYW1lO1xyXG4gICAgICAgICAgICB0aGlzLm1haW5Sb2xlU2NyaXB0ID0gU2NlbmUzZE9iamVjdC5tYWluUm9sZS5nZXRDb21wb25lbnQoIE1haW5SQW9sZVNjcmlwdCApO1xyXG4gICAgICAgICAgICAvLyB0aGlzLm1haW5Sb2xlU2NyaXB0LnJlc291c2VOYW1lID0gcm9sZXZvLnJvbGVDZmcubmFtZTtcclxuICAgICAgICAgICAgLy8gaWYoICApXHJcbiAgICAgICAgICAgIC8vIHRoaXMubWFpblJvbGVTY3JpcHQgPSBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLmFkZENvbXBvbmVudCggTWFpblJBb2xlU2NyaXB0ICk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaW5mbzphbnkgPSByb2xldm8ubGV2ZWxjZmcucm9sZWluaXRwb3M7XHJcbiAgICAgICAgdmFyIGNoaWRhcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FycihpbmZvLm9mZnNldFBvcyk7XHJcbiAgICAgICAgdmFyIG9mZnNldFBvczpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCBOdW1iZXIoIGNoaWRhcnJbMF0pLE51bWJlciggY2hpZGFyclsxXSksTnVtYmVyKCBjaGlkYXJyWzJdKSApO1xyXG4gICAgICAgIHZhciBwb3NWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgICAgICB2YXIgc2VsZWN0VmVjOkxheWEuVmVjdG9yMztcclxuICAgICAgICBpZiggaW5mby5pbml0YnVpbGQgPT0gXCJzdGFydFBsYW5lXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcG9zVmVjLnggPSBTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnggKyBvZmZzZXRQb3MueDtcclxuICAgICAgICAgICAgcG9zVmVjLnkgPSBTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnkgKyBvZmZzZXRQb3MueTtcclxuICAgICAgICAgICAgcG9zVmVjLnogPSBTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnogKyBvZmZzZXRQb3MuejtcclxuICAgICAgICAgICAgc2VsZWN0VmVjID0gKCBTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUuZ2V0Q2hpbGRCeU5hbWUoIFwiY2hpbGRfcG9zXCIgKSBhcyBMYXlhLlNwcml0ZTNEICkudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2hpbGRwb3M6TGF5YS5WZWN0b3IzID0gU2NlbmUzZE9iamVjdC5nZXRQb3NWZWNieVNjZW5lKCByb2xldm8ubGV2ZWxtYXBBcnJbMF0saW5mby5pbml0YnVpbGQgKTtcclxuICAgICAgICAgICAgcG9zVmVjLnggPSBjaGlsZHBvcy54ICsgb2Zmc2V0UG9zLng7XHJcbiAgICAgICAgICAgIHBvc1ZlYy55ID0gY2hpbGRwb3MueSArIG9mZnNldFBvcy55O1xyXG4gICAgICAgICAgICBwb3NWZWMueiA9IGNoaWxkcG9zLnogKyBvZmZzZXRQb3MuejtcclxuICAgICAgICAgICAgc2VsZWN0VmVjID0gY2hpbGRwb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFNjZW5lM2RPYmplY3QubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zVmVjO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhU2NyaXB0LmluaXRQb3MoU2NlbmUzZE9iamVjdC5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24pO1xyXG4gICAgICAgIHRoaXMubWFpblJvbGVTY3JpcHQuc2V0bm93U2VsZWN0VmVjKCBzZWxlY3RWZWMgKTtcclxuICAgICAgICB0aGlzLm1haW5Sb2xlU2NyaXB0Lm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuc3RhbmQ7XHJcbiAgICAgICAgdGhpcy5tYWluUm9sZVNjcmlwdC5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnN0YW5kICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW1vdmVBbGxOcGMoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5wY2RpY3Q6YW55ID0gU2NlbmUzZE9iamVjdC5ucGNEaWN0O1xyXG4gICAgICAgIHZhciBzO1xyXG4gICAgICAgIGZvciggcyBpbiBucGNkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzcDpMYXlhLk1lc2hTcHJpdGUzRCA9IG5wY2RpY3Rbc107XHJcbiAgICAgICAgICAgIHZhciBucGNzY3JpcHQ6TnBjU2NyaXB0ID0gU2NlbmUzZE9iamVjdC5ucGNzY3JpcHREaWN0W3NdO1xyXG4gICAgICAgICAgICB2YXIgcmVzb3VzZW5hbWU6c3RyaW5nID0gbnBjc2NyaXB0LnJlc291c2VOYW1lO1xyXG4gICAgICAgICAgICBSb2xlc1Bvb2wucmVtb3ZlUm9sZSggc3AscmVzb3VzZW5hbWUsbnBjc2NyaXB0KTtcclxuICAgICAgICAgICAgZGVsZXRlIFNjZW5lM2RPYmplY3QubnBjc2NyaXB0RGljdFtzXTtcclxuICAgICAgICAgICAgZGVsZXRlIG5wY2RpY3Rbc107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvL+WIm+W7um5wY1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVOcGMoICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTnBjKCk7XHJcbiAgICAgICAgdmFyIHVzZXJpbmZvUHJveHk6VXNlckluZm9Qcm94eSA9IE1WQ09iamVjdFBvb2wuZ2V0SW5zdGFuY2UoKS5nZXRQcm94eSggVXNlckluZm9Qcm94eSApO1xyXG4gICAgICAgIHZhciByb2xldm86Um9sZVZPID0gdXNlcmluZm9Qcm94eS5yb2xlVk87XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxhbnk+ID0gcm9sZXZvLmxldmVsY2ZnLm5wYztcclxuICAgICAgICB2YXIgY2hpbGRkaWN0OmFueTtcclxuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcclxuICAgICAgICBTY2VuZTNkT2JqZWN0Lm5wY251bSA9IGFyci5sZW5ndGg7XHJcbiAgICAgICAgZm9yKCB2YXIgcyBpbiBhcnIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2hpbGRkaWN0ID0gYXJyW3NdO1xyXG4gICAgICAgICAgICB2YXIgc2VsZWN0VmVjOkxheWEuVmVjdG9yMyA9IG51bGw7XHJcbiAgICAgICAgICAgIHZhciBucGNjZmc6TnBjQ0ZHID0gTnBjQ0ZHLmRpY3RbIGNoaWxkZGljdC5pZCBdO1xyXG4gICAgICAgICAgICB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IExheWEuTG9hZGVyLmdldFJlcyhQYXRoQ29uZmlnLmdldDNEUm9sZU1vZGVsKG5wY2NmZy5uYW1lKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgdmFyIGNoaWRhcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FycihjaGlsZGRpY3Qub2Zmc2V0UG9zKTtcclxuICAgICAgICAgICAgdmFyIG9mZnNldFBvczpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCBOdW1iZXIoIGNoaWRhcnJbMF0pLE51bWJlciggY2hpZGFyclsxXSksTnVtYmVyKCBjaGlkYXJyWzJdKSApO1xyXG4gICAgICAgICAgICB2YXIgcG9zVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICAgICAgICAgIGlmKCBjaGlsZGRpY3Quc2NlbmUgPT0gXCJzdGFydFBsYW5lXCIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueCA9IFNjZW5lM2RPYmplY3Quc3RhcnRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24ueCArIG9mZnNldFBvcy54O1xyXG4gICAgICAgICAgICAgICAgcG9zVmVjLnkgPSBTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnkgKyAxICsgb2Zmc2V0UG9zLnk7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueiA9IFNjZW5lM2RPYmplY3Quc3RhcnRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24ueiArIG9mZnNldFBvcy56O1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0VmVjID0gKCBTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUuZ2V0Q2hpbGRCeU5hbWUoIFwiY2hpbGRfcG9zXCIgKSBhcyBMYXlhLlNwcml0ZTNEICkudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkcG9zOkxheWEuVmVjdG9yMyA9IFNjZW5lM2RPYmplY3QuZ2V0UG9zVmVjYnlTY2VuZShjaGlsZGRpY3Quc2NlbmUgLGNoaWxkZGljdC5pbml0YnVpbGQgKTtcclxuICAgICAgICAgICAgICAgIHBvc1ZlYy54ID0gY2hpbGRwb3MueCArIG9mZnNldFBvcy54O1xyXG4gICAgICAgICAgICAgICAgcG9zVmVjLnkgPSBjaGlsZHBvcy55ICsgb2Zmc2V0UG9zLnk7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueiA9IGNoaWxkcG9zLnogKyBvZmZzZXRQb3MuejtcclxuICAgICAgICAgICAgICAgIHNlbGVjdFZlYyA9IGNoaWxkcG9zO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgbnBjc3A6TGF5YS5TcHJpdGUzRCA9IFJvbGVzUG9vbC5hZGRSb2xlQnlOYW1lKCBucGNjZmcubmFtZSxOcGNTY3JpcHQsU2NlbmUzZE9iamVjdC5zY2VuZTNEICk7XHJcbiAgICAgICAgICAgIG5wY3NwLm5hbWUgPSBcIm5wY19cIiArIGluZGV4O1xyXG4gICAgICAgICAgICBucGNzcC50cmFuc2Zvcm0ucG9zaXRpb24gPSBwb3NWZWM7XHJcbiAgICAgICAgICAgIHZhciBucGNzY3JpcHQ6TnBjU2NyaXB0ID0gbnBjc3AuZ2V0Q29tcG9uZW50KCBOcGNTY3JpcHQgKTtcclxuICAgICAgICAgICAgbnBjc2NyaXB0LnNldG5vd1NlbGVjdFZlYyggc2VsZWN0VmVjICk7XHJcbiAgICAgICAgICAgIG5wY3NjcmlwdC5zZXRucGNDRkcoIG5wY2NmZyApO1xyXG4gICAgICAgICAgICBTY2VuZTNkT2JqZWN0Lm5wY0RpY3RbIG5wY3NwLm5hbWUgXSA9IG5wY3NwO1xyXG4gICAgICAgICAgICBTY2VuZTNkT2JqZWN0Lm5wY3NjcmlwdERpY3RbbnBjc3AubmFtZV0gPSBucGNzY3JpcHQ7XHJcbiAgICAgICAgICAgIG5wY3NjcmlwdC5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnN0YW5kICk7XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVNYXAoICApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgdXNlcmluZm9Qcm94eTpVc2VySW5mb1Byb3h5ID0gTVZDT2JqZWN0UG9vbC5nZXRJbnN0YW5jZSgpLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICk7XHJcbiAgICAgICAgdmFyIHJvbGV2bzpSb2xlVk8gPSB1c2VyaW5mb1Byb3h5LnJvbGVWTztcclxuICAgICAgICB2YXIgbm93bGV2ZWxjZmc6TGV2ZWxDRkcgPSByb2xldm8ubGV2ZWxjZmc7XHJcbiAgICAgICAgdmFyIG1hcEFycjpBcnJheTxzdHJpbmc+ID0gcm9sZXZvLmxldmVsbWFwQXJyO1xyXG4gICAgICAgIHZhciBtYXBTcHJpdGUzRDpMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgIHZhciBtYXBuYW1lOnN0cmluZztcclxuICAgICAgICB2YXIgX2xhc3RtYXBTcHJpdGUzRDpMYXlhLlNwcml0ZTNEO1xyXG5cclxuICAgICAgICBmb3IoIHZhciBzIGluIFNjZW5lM2RPYmplY3Qubm93bWFwRGljdCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAoU2NlbmUzZE9iamVjdC5ub3dtYXBEaWN0W3NdIGFzIExheWEuTWVzaFNwcml0ZTNEKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciggdmFyIGk6bnVtYmVyID0gMDtpIDwgbWFwQXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbWFwbmFtZSA9IG1hcEFycltpXTtcclxuICAgICAgICAgICAgaWYoIFNjZW5lM2RPYmplY3Qubm93bWFwRGljdFsgbWFwbmFtZSBdIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbWFwU3ByaXRlM0QgPSBTY2VuZTNkT2JqZWN0Lm5vd21hcERpY3RbIG1hcG5hbWUgXTtcclxuICAgICAgICAgICAgICAgIG1hcFNwcml0ZTNELmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IExheWEuTG9hZGVyLmdldFJlcyhQYXRoQ29uZmlnLmdldDNETW9kZWwobWFwbmFtZSkpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICBtYXBTcHJpdGUzRCA9IExheWEuU3ByaXRlM0QuaW5zdGFudGlhdGUoc3AsIFNjZW5lM2RPYmplY3Quc2NlbmUzRCwgZmFsc2UsbnVsbCkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgICAgIFNjZW5lM2RPYmplY3Qubm93bWFwRGljdFsgbWFwbmFtZSBdID0gbWFwU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIGkgPT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0Fyciggbm93bGV2ZWxjZmcuZmlyc3RTY2VuZXBvcyApO1xyXG4gICAgICAgICAgICAgICAgbWFwU3ByaXRlM0QudHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggTnVtYmVyKCBhcnJbMF0pLE51bWJlciggYXJyWzFdKSxOdW1iZXIoIGFyclsyXSApICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zOkxheWEuVmVjdG9yMyA9IChfbGFzdG1hcFNwcml0ZTNELmdldENoaWxkQnlOYW1lKCBcIkVORFwiICkgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICBlbmRQb3MueCA9IDA7XHJcbiAgICAgICAgICAgICAgICBlbmRQb3MueSA9IDA7XHJcbiAgICAgICAgICAgICAgICBtYXBTcHJpdGUzRC50cmFuc2Zvcm0ucG9zaXRpb24gPSBlbmRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5hZGRQYXR0ZXJuQ2hpbGRQb3MoIG1hcFNwcml0ZTNEICk7XHJcbiAgICAgICAgICAgIF9sYXN0bWFwU3ByaXRlM0QgPSBtYXBTcHJpdGUzRDtcclxuICAgICAgICAgICAgdmFyIGVuZFBvczE6TGF5YS5WZWN0b3IzID0gKG1hcFNwcml0ZTNELmdldENoaWxkQnlOYW1lKCBcIkVORFwiICkgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgICAgIGVuZFBvczEueiArPSBOdW1iZXIoR2FtZUNGRy5kaWN0WzZdLnZhbHVlKTtcclxuICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5lbmRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24gPSBlbmRQb3MxO1xyXG4gICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmdhbWV3aW5Qb3NaID0gZW5kUG9zMS56O1xyXG4gICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmdhbWV3aW5Qb3NaIC09IDI7XHJcbiAgICAgICAgICAgIC8vIFNjZW5lM2RPYmplY3QuYmdzcHJpdGUzZC50cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCAwLC0yMCwtNDAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRQYXR0ZXJuQ2hpbGRQb3MoIG1hcFNwcml0ZTNEOkxheWEuU3ByaXRlM0QgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIFNjZW5lM2RPYmplY3QucGF0dGVybkRpY3RbIG1hcFNwcml0ZTNELm5hbWUgXSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkZWxldGUgU2NlbmUzZE9iamVjdC5wYXR0ZXJuRGljdFsgbWFwU3ByaXRlM0QubmFtZSBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCLnu5HlrppNYXBQYXR0ZXJuUG9zXCIgKTtcclxuICAgICAgICB2YXIgQmxvY2tzU3ByaXRlOkxheWEuU3ByaXRlM0QgPSBtYXBTcHJpdGUzRC5nZXRDaGlsZEJ5TmFtZSggXCJCbG9ja3NcIiApIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIGNoaWRkaWN0OmFueSA9IHt9O1xyXG4gICAgICAgIHZhciBjaGlkc3A6TGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB2YXIgYnVpbGRTcDpMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2FsbF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9hbGxfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2FsbF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFNjZW5lM2RPYmplY3QuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfZnJvbnRfXCIgKyBpbmRleCApIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1aWxkU3AgPSBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfZnJvbnRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2Zyb250X1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmKCBTY2VuZTNkT2JqZWN0LmRpZVBvc1kgPiBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgd2hpbGUoIEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9sZWZ0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2xlZnRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2xlZnRfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaWYoIFNjZW5lM2RPYmplY3QuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmRpZVBvc1kgPSBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX3JpZ2h0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX3JpZ2h0X1wiICsgaW5kZXggKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZHNwID0gYnVpbGRTcC5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9yaWdodF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFNjZW5lM2RPYmplY3QuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfZnJvbnRsZWZ0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2Zyb250bGVmdF9cIiArIGluZGV4ICkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRzcCA9IGJ1aWxkU3AuZ2V0Q2hpbGRCeU5hbWUoXCJjaGlsZF9wb3NcIikgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZGRpY3RbIFwiYnVpbGRfZnJvbnRsZWZ0X1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmKCBTY2VuZTNkT2JqZWN0LmRpZVBvc1kgPiBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgd2hpbGUoIEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9mcm9udHJpZ2h0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2Zyb250cmlnaHRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2Zyb250cmlnaHRfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaWYoIFNjZW5lM2RPYmplY3QuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmRpZVBvc1kgPSBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2xlZnRyaWdodF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9sZWZ0cmlnaHRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2xlZnRyaWdodF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFNjZW5lM2RPYmplY3QuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXg9MDtcclxuICAgICAgICB2YXIgUHJvcHM6TGF5YS5TcHJpdGUzRCA9IG1hcFNwcml0ZTNELmdldENoaWxkQnlOYW1lKCBcIlByb3BzXCIgKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgIHdoaWxlKCBQcm9wcy5nZXRDaGlsZEJ5TmFtZSggXCJTY2FmZm9sZGluZ19cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2hpZHNwID0gUHJvcHMuZ2V0Q2hpbGRCeU5hbWUoIFwiU2NhZmZvbGRpbmdfXCIgKyBpbmRleCApLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcIlNjYWZmb2xkaW5nX1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4PTA7XHJcbiAgICAgICAgd2hpbGUoIFByb3BzLmdldENoaWxkQnlOYW1lKCBcImdyaWxsaW5nX1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBQcm9wcy5nZXRDaGlsZEJ5TmFtZSggXCJncmlsbGluZ19cIiArIGluZGV4ICkuZ2V0Q2hpbGRCeU5hbWUoXCJjaGlsZF9wb3NcIikgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZGRpY3RbIFwiZ3JpbGxpbmdfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgU2NlbmUzZE9iamVjdC5wYXR0ZXJuRGljdFsgbWFwU3ByaXRlM0QubmFtZSBdID0gY2hpZGRpY3Q7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBQYXRoQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZ3MvZ2FtZUNvbmZpZ3MvUGF0aENvbmZpZ1wiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvdW5kc3NNYW5hZ2VyIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOlNvdW5kc3NNYW5hZ2VyO1xyXG4gICAgcHJpdmF0ZSBfaXNiZ09wZW46Ym9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9nYW1lc291bmRPcGVuOmJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfaXNBbGxPcGVuOmJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfbm93QmdOYW1lOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9pc1BsYXliZ2luZzpib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKipcclxuICAgICAqIOWjsOmfs+W8gOWFs+W8leeUqOe0ouW8lVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9zb3VuZEluZGV4Om51bWJlciA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTpTb3VuZHNzTWFuYWdlclxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhdGhpcy5faW5zdGFuY2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgU291bmRzc01hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLmF1dG9SZWxlYXNlU291bmQgPSBmYWxzZTtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5hdXRvU3RvcE11c2ljID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGdhbWVzb3VuZE9wZW4odmFsdWU6Ym9vbGVhbilcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9nYW1lc291bmRPcGVuID0gdmFsdWU7XHJcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIuc291bmRNdXRlZCA9ICF2YWx1ZTtcclxuICAgICAgICBpZiggdmFsdWUgPT0gdHJ1ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5idXR0b25Tb3VuZFZvbHVtZVNjYWxlID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZmFpcnlndWkuVUlDb25maWcuYnV0dG9uU291bmRWb2x1bWVTY2FsZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6Z+z5pWI5piv5ZCm5byA5ZCvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZ2FtZXNvdW5kT3BlbigpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2FtZXNvdW5kT3BlbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGlzYmdPcGVuKHZhbHVlOmJvb2xlYW4pXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNiZ09wZW4gPSB2YWx1ZTtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5tdXNpY011dGVkID0gIXZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6IOM5pmv6Z+z5LmQ5piv5ZCm5byA5ZCvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaXNiZ09wZW4oKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzYmdPcGVuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgaXNBbGxPcGVuKCB2YWx1ZTpib29sZWFuIClcclxuICAgIHtcclxuICAgICAgICBpZiggdmFsdWUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fc291bmRJbmRleC0tO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fc291bmRJbmRleCA8IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3VuZEluZGV4ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZighdGhpcy5faXNQbGF5YmdpbmcmJnRoaXMuX3NvdW5kSW5kZXg9PTAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0FsbE9wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRHYW1lVm9sdW1lKCAxICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXliZ1NvdW5kKCB0aGlzLl9ub3dCZ05hbWUgKTtcclxuICAgICAgICAgICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmJ1dHRvblNvdW5kVm9sdW1lU2NhbGUgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNBbGxPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faXNBbGxPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9zb3VuZEluZGV4IDwgMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvdW5kSW5kZXggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdW5kSW5kZXgrKztcclxuICAgICAgICAgICAgaWYodGhpcy5faXNQbGF5YmdpbmcpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcGJnU291bmQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNldEdhbWVWb2x1bWUoIDAgKTtcclxuICAgICAgICAgICAgZmFpcnlndWkuVUlDb25maWcuYnV0dG9uU291bmRWb2x1bWVTY2FsZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5omA5pyJ6Z+z5LmQ5piv5ZCm5byA5ZCvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaXNBbGxPcGVuKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0FsbE9wZW47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDorr7nva7og4zmma/pn7PkuZDpn7Pph49cclxuICAgICAqIEBwYXJhbSB2YWx1ZSDpn7Pph4/ojIPlm7Tku44gMO+8iOmdmemfs++8ieiHsyAx77yI5pyA5aSn6Z+z6YeP77yJ44CCXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgYmdTb3VuZFZvbHVtZSggdmFsdWU6bnVtYmVyIClcclxuICAgIHtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5zZXRNdXNpY1ZvbHVtZSggdmFsdWUgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGJnU291bmRWb2x1bWUoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTGF5YS5Tb3VuZE1hbmFnZXIubXVzaWNWb2x1bWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDorr7nva7og4zmma/pn7PkuZDpn7Pph49cclxuICAgICAqIEBwYXJhbSB2YWx1ZSDpn7Pph4/ojIPlm7Tku44gMO+8iOmdmemfs++8ieiHsyAx77yI5pyA5aSn6Z+z6YeP77yJ44CCXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgc291bmRWb2x1bWUoIHZhbHVlOm51bWJlciApXHJcbiAgICB7XHJcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIuc2V0U291bmRWb2x1bWUoIHZhbHVlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzb3VuZFZvbHVtZSgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBMYXlhLlNvdW5kTWFuYWdlci5zb3VuZFZvbHVtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiuvue9ruaJgOacieWjsOmfs+mfs+mHj1xyXG4gICAgICogQHBhcmFtIHZhbHVlIOmfs+mHj+iMg+WbtOS7jiAw77yI6Z2Z6Z+z77yJ6IezIDHvvIjmnIDlpKfpn7Pph4/vvInjgIJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEdhbWVWb2x1bWUodmFsdWU6bnVtYmVyKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5iZ1NvdW5kVm9sdW1lID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5zb3VuZFZvbHVtZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pKt5pS+6IOM5pmv6Z+z5LmQXHJcbiAgICAgKiBAcGFyYW0gc291bmROYW1lIOWjsOmfs+WQjVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGxheWJnU291bmQoIHNvdW5kTmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbm93QmdOYW1lID0gc291bmROYW1lO1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc0FsbE9wZW4gJiYgdGhpcy5fbm93QmdOYW1lICE9IFwiXCIgJiYgdGhpcy5fc291bmRJbmRleDw9IDAgJiYgIXRoaXMuX2lzUGxheWJnaW5nIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzUGxheWJnaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgRGVidWdlci5sb2coIFwicGxheWJnU291bmRcIixQYXRoQ29uZmlnLmdldHNvdW5kKCB0aGlzLl9ub3dCZ05hbWUgKSApO1xyXG4gICAgICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5wbGF5TXVzaWMoIFBhdGhDb25maWcuZ2V0c291bmQoIHRoaXMuX25vd0JnTmFtZSApICk7XHJcbiAgICAgICAgICAgIHRoaXMuYmdTb3VuZFZvbHVtZSA9IDAuNDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlgZzmraLog4zmma/pn7PkuZBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0b3BiZ1NvdW5kKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzUGxheWJnaW5nID0gZmFsc2U7XHJcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIuc3RvcE11c2ljKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmkq3mlL7pn7PmlYhcclxuICAgICAqIEBwYXJhbSBzb3VuZE5hbWUg6Z+z5pWI5ZCNXHJcbiAgICAgKiBAcGFyYW0gbG9vcCDmkq3mlL7mrKHmlbBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBsYXlHYW1lU291bmQoIHNvdW5kTmFtZTpzdHJpbmcsIGxvb3A6bnVtYmVyID0gMSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5faXNBbGxPcGVuICYmIHNvdW5kTmFtZSAhPSBcIlwiICYmIExheWEuU291bmRNYW5hZ2VyLnNvdW5kVm9sdW1lICE9IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIucGxheVNvdW5kKCBQYXRoQ29uZmlnLmdldHNvdW5kKCBzb3VuZE5hbWUgKSxsb29wICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YGc5q2i5pKt5pS+6Z+z5pWIXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdG9wR2FtZVNvdW5kKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLnN0b3BBbGxTb3VuZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YGc5q2i5omA5pyJ5aOw6Z+zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdG9wQWxsKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3RvcEdhbWVTb3VuZCgpO1xyXG4gICAgICAgIHRoaXMuc3RvcGJnU291bmQoKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IExheWVyTm90aWZ5IH0gZnJvbSBcIi4uL2ZyYW1ld29ya3Mvbm90aWZpY2F0aW9uL0xheWVyTm90aWZ5XCI7XHJcbmltcG9ydCB7IEdhbWVMYXllck1hbmFnZXIgfSBmcm9tIFwiLi9HYW1lTGF5ZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCBCYXNlVmlldyBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9tdmMvQmFzZVZpZXdcIjtcclxuaW1wb3J0IERlYnVnZXIgZnJvbSBcIi4uL2ZyYW1ld29ya3MvRGVidWdlclwiO1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBhdXRob3IgXHJcbiAqXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVWlNYW5hZ2VyIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgXHJcbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlOiBVaU1hbmFnZXI7XHJcbiAgICAvKipcclxuICAgICAqIOW3suazqOWGjOeahFVJXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3ZpZXdzOiBhbnk7XHJcblxyXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcigpIFxyXG5cdHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cdH1cclxuXHRcclxuXHRwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6VWlNYW5hZ2VyXHJcblx0e1xyXG5cdCAgICBpZiggIXRoaXMuaW5zdGFuY2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBVaU1hbmFnZXIoKTsgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xyXG5cdH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl92aWV3cyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaW5pdEV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgIH1cclxuXHRcclxuICAgIC8qKlxyXG4gICAgICogIHZpZXcg6KeG5Zu+5a+56LGh57G7XHJcbiAgICAgKiAgZGF0YSDnu5HlrprmlbDmja4g77yIIGRhdGEg5aaC5p6c5LiN5Li656m677yM5Luj6KGo5p6E6YCg5Ye95pWw5Lyg5Y+CIO+8iVxyXG4gICAgICogIGxheWVyIOWxgue6p1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkKCB2aWV3OmFueSxkYXRhOmFueSA9IG51bGwsbGF5ZXI6IHN0cmluZyA9IExheWVyTm90aWZ5LkxBWUVSX1VJTEFZRVIgKTphbnlcclxuXHR7XHJcbiAgICAgICAgaWYoIHZpZXcua2V5ID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmlldyBoYXZlIG5vIGtleVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHR5cGU6IHN0cmluZyA9IHZpZXcua2V5O1xyXG4gICAgICAgIGlmKHRoaXMuX3ZpZXdzW3R5cGVdKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW12aWV3OmZhaXJ5Z3VpLkdDb21wb25lbnQgPSB0aGlzLl92aWV3c1t0eXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW12aWV3O1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZDogYW55O1xyXG4gICAgICAgIGlmKGRhdGEgIT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkID0gbmV3IHZpZXcoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGQgPSBuZXcgdmlldygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkLnZpZXdLZXkgPSB2aWV3O1xyXG4gICAgICAgIGQuZ2FtZUxheWVyID0gbGF5ZXI7XHJcbiAgICAgICAgR2FtZUxheWVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZHRvTGF5ZXIoIGQsbGF5ZXIgKTtcclxuICAgICAgICB0aGlzLl92aWV3c1t0eXBlXSA9IGQ7XHJcbiAgICAgICAgcmV0dXJuIGQ7XHJcblx0fVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOWFs+mXreeVjOmdolxyXG4gICAgICogQHBhcmFtIHZpZXcg55WM6Z2iIFxyXG4gICAgICogQHBhcmFtIGlzYmdjbG9zZSDmmK/lkKbmmK/ngrnlh7vog4zmma/lhbPpl63nmoTnirbmgIEgXHJcbiAgICAgKiBAcGFyYW0gaXNwbGF5QW5tbyDmmK/lkKbmkq3mlL7lhbPpl63liqjnlLvvvIgg5Li76KaB55So5LqO5by65Yi25YWz6ZetIO+8iVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xvc2UoIHZpZXc6IGFueSxpc2JnY2xvc2U6Ym9vbGVhbj1mYWxzZSxpc3BsYXlBbm1vOmJvb2xlYW49dHJ1ZSApOnZvaWRcclxuXHR7XHJcbiAgICAgICAgdmFyIHR5cGU6IHN0cmluZyA9IHZpZXcua2V5O1xyXG4gICAgICAgIHZhciBpdGVtOiBCYXNlVmlldyA9IHRoaXMuX3ZpZXdzW3R5cGVdO1xyXG4gICAgICAgIGlmKCFpdGVtKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgR2FtZUxheWVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZWZvcm1MYXllciggaXRlbS5nYW1lTGF5ZXIgKTtcclxuICAgICAgICBpZihpc3BsYXlBbm1vKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5vbkNsb3NlVmlldygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtLmRlc3RvcnkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX3ZpZXdzW3R5cGVdO1xyXG5cdH1cclxuXHJcbiAgICBwdWJsaWMgb25yZXNpemUoIHc6bnVtYmVyLGg6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl92aWV3cyAhPSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtdmlldzpCYXNlVmlldztcclxuICAgICAgICAgICAgZm9yKCB2YXIgaXRlbSBpbiB0aGlzLl92aWV3cyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGl0ZW12aWV3ID0gdGhpcy5fdmlld3NbaXRlbV07XHJcbiAgICAgICAgICAgICAgICBpdGVtdmlldy5zZXRTaXplKCB3LGggKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHRcclxuICAgIHB1YmxpYyBnZXRWaWV3KCB2aWV3OiBhbnkgKTphbnlcclxuXHR7XHJcbiAgICAgICAgdmFyIHR5cGU6IHN0cmluZyA9IHZpZXcua2V5O1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92aWV3c1t0eXBlXTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IFdYR2FtZVBsYXRmb3JtIGZyb20gXCIuL3d4bWluaWdhbWUvV1hHYW1lUGxhdGZvcm1cIjtcclxuaW1wb3J0IFBsYXRmcm9tVHlwZSBmcm9tIFwiLi9QbGF0ZnJvbVR5cGVcIjtcclxuaW1wb3J0IFBsYXRmb3JtRXZlbnQgZnJvbSBcIi4vZXZlbnRzL1BsYXRmb3JtRXZlbnRcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5pbXBvcnQgeyBUaW1lc1RhbXBlciB9IGZyb20gXCIuLi9mcmFtZXdvcmtzL1RpbWVzVGFtcGVyXCI7XHJcbmltcG9ydCBUb25namlIdHRwcyBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9uZXQvVG9uZ2ppSHR0cHNcIjtcclxuaW1wb3J0IERheU1hbmFnZXIgZnJvbSBcIi4uL21hbmFnZXJzL0RheU1hbmFnZXJcIjtcclxuaW1wb3J0IFNvdW5kc3NNYW5hZ2VyIGZyb20gXCIuLi9tYW5hZ2Vycy9Tb3VuZHNzTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBXb3JkVGlwc1V0aWxzIH0gZnJvbSBcIi4uL2dhbWVtb2R1bGUvbG9hZGluZy92aWV3L1dvcmRUaXBzVXRpbHNcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi8gXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsYXRmb3JtVG9vbFxyXG57XHJcbiAgICBwcml2YXRlIF9pc2VuYWJsZTpib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuWQiOinhFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpc2xlZ2FsOm51bWJlciA9IDA7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFBsYXRmb3JtVG9vbDtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IFBsYXRmb3JtVG9vbCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBQbGF0Zm9ybVRvb2woKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5bmz5Y+wXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0UGxhdGZyb20oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cudHQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLm5vd3BsYXRmcm9tID0gUGxhdGZyb21UeXBlLnR0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChMYXlhLkJyb3dzZXIud2luZG93Lnd4KSAvL+W+ruS/oeWwj+a4uOaIj1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLm5vd3BsYXRmcm9tID0gUGxhdGZyb21UeXBlLnd4O1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLm5vd3BsYXRmcm9tID0gUGxhdGZyb21UeXBlLnBjO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdCgpOnZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pbml0UGxhdGZyb20oKTtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyggR2xvYmFsLm5vd3BsYXRmcm9tICsgXCLlubPlj7DliJ3lp4vljJZcIiApO1xyXG4gICAgICAgIC8vIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5pbml0KCk7XHJcbiAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgIC8vICAgICBjYXNlIFBsYXRmcm9tVHlwZS5xcTpcclxuICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgLy8gICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyB0aGlzLm9uU2hvdyggdGhpcyx0aGlzLnNob3djYWxsYmFjayApO1xyXG4gICAgICAgIC8vIHRoaXMub25IaWRlKHRoaXMsdGhpcy5oaWRlY2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdERhdGEoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRGF5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmluaXQoKTtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuaW5pdERhdGEoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWQiOi/neinhOWIpOaWrSB0cnVl77ya5ZCI6KeE77yMZmFsc2U66L+d6KeEXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tFbmFibGUoKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKFBsYXRmb3JtVG9vbC5pc2xlZ2FsID09IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2xvZ2luY2FsbG9iajphbnk7XHJcbiAgICBwcml2YXRlIF9sb2dpbnN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBsb2dpbiggY2FsbG9iajphbnk9bnVsbCxzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb249bnVsbCxwcm9ncmVzc0NhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbGNhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LnNob3dNb2RhbFdhaXQoKTtcclxuICAgICAgICB0aGlzLl9sb2dpbmNhbGxvYmogPSBjYWxsb2JqO1xyXG4gICAgICAgIHRoaXMuX2xvZ2luc3VjY2VlZGNhbGxiYWNrID0gc3VjY2VlZGNhbGxiYWNrO1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5jcmVhdGVVc2VyQW5kTG9naW4odGhpcyx0aGlzLmxvZ2luU3VjY2VlZCx0aGlzLmxvZ2lucHJvZ3Jlc3NDYWxsYmFjayx0aGlzLmxvZ2luZmFpbGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luU3VjY2VlZChudWxsKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9naW5wcm9ncmVzc0NhbGxiYWNrKCB2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2dpblN1Y2NlZWQoIGRhdGE6YW55ICk6dm9pZFxyXG4gICAgeyBcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICAgICAgLy8gRGVidWdlci5sb2coIFwibG9naW5TdWNjZWVkXCIsZGF0YSApO1xyXG4gICAgICAgIC8vIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgIC8vICAgICAgICAgdmFyIG5vd3RpbWU6bnVtYmVyID0gZGF0YS5Ob3dUaW1lO1xyXG4gICAgICAgIC8vICAgICAgICAgVGltZXNUYW1wZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGVTZXJ2aWNlVGltZShub3d0aW1lKTtcclxuICAgICAgICAvLyAgICAgICAgIFBsYXRmb3JtVG9vbC5pc2xlZ2FsID0gTnVtYmVyKGRhdGEuVmVyc2lvbik7XHJcbiAgICAgICAgLy8gICAgICAgICB2YXIgTWVtYmVyOmFueSA9IGRhdGEuTWVtYmVyO1xyXG4gICAgICAgIC8vICAgICAgICAgdmFyIEFwcEluZm86YW55ID0gZGF0YS5BcHBJbmZvO1xyXG4gICAgICAgIC8vICAgICAgICAgdmFyIENsaWVudDI6YW55ID0gQXBwSW5mby5DbGllbnQyO1xyXG4gICAgICAgIC8vICAgICAgICAgR2xvYmFsLkFwcEtleUlEID0gTWVtYmVyLkFwcEtleUlEO1xyXG4gICAgICAgIC8vICAgICAgICAgR2xvYmFsLk1lbWJlcklEID0gTWVtYmVyLk1lbWJlcklEO1xyXG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uVmlkZW9UaW1lID0gTnVtYmVyKENsaWVudDIuVmlkZW9UaW1lKTtcclxuICAgICAgICAvLyAgICAgICAgIFdYR2FtZVBsYXRmb3JtLlZpZGVvTnVtID0gTnVtYmVyKENsaWVudDIuVmlkZW9OdW0pO1xyXG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uU2hhcmVUaW1lID0gTnVtYmVyKENsaWVudDIuU2hhcmVUaW1lKTtcclxuICAgICAgICAvLyAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmppbGl3ZWl0aW1lID0gTnVtYmVyKCBDbGllbnQyLlNoYXJlVGltZSApO1xyXG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uU2hhcmV0b1ZpZGVvID0gTnVtYmVyKCBDbGllbnQyLlNoYXJldG9WaWRlbyApO1xyXG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uVmlkZW90b1NoYXJlID0gTnVtYmVyKCBDbGllbnQyLlZpZGVvdG9TaGFyZSApO1xyXG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5pbml0U2hhcmVEaWFuKCBDbGllbnQyLlNoYXJlICk7XHJcbiAgICAgICAgLy8gICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIENQQUV2ZW50LkNQQUV2ZW50X2luaXRDUEFEYXRhLGRhdGEgKTtcclxuICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgLy8gICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgLy8gICAgICAgICBUaW1lc1RhbXBlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZVNlcnZpY2VUaW1lKExheWEuQnJvd3Nlci5ub3coKS8xMDAwKTtcclxuICAgICAgICAvLyAgICAgICAgIHZhciBkYXRhczphbnkgPSBKU09OLnBhcnNlKCd7XCJBQ1RJT05cIjo5ODkxMDAxLFwiQUNUSU9OQ09NXCI6MCxcIkpTREFUQVwiOntcIkFwcEluZm9cIjp7XCJDbGllbnRcIjpbe1wiSURcIjpcIjFcIixcIklzU2hvd1wiOnRydWUsXCJQYXJhbTFcIjpcIjMwXCIsXCJQYXJhbTJcIjpcIlwifSx7XCJJRFwiOlwiMlwiLFwiSXNTaG93XCI6dHJ1ZSxcIlBhcmFtMVwiOlwiMzBcIixcIlBhcmFtMlwiOlwiXCJ9LHtcIklEXCI6XCIzXCIsXCJJc1Nob3dcIjp0cnVlLFwiUGFyYW0xXCI6XCIzMFwiLFwiUGFyYW0yXCI6XCJcIn0se1wiSURcIjpcIjRcIixcIklzU2hvd1wiOnRydWUsXCJQYXJhbTFcIjpcIjMwXCIsXCJQYXJhbTJcIjpcIlwifSx7XCJJRFwiOlwiNVwiLFwiSXNTaG93XCI6dHJ1ZSxcIlBhcmFtMVwiOlwiMzBcIixcIlBhcmFtMlwiOlwiXCJ9LHtcIklEXCI6XCI2XCIsXCJJc1Nob3dcIjp0cnVlLFwiUGFyYW0xXCI6XCIzMFwiLFwiUGFyYW0yXCI6XCJcIn0se1wiSURcIjpcIjdcIixcIklzU2hvd1wiOnRydWUsXCJQYXJhbTFcIjpcIjMwXCIsXCJQYXJhbTJcIjpcIlwifSx7XCJJRFwiOlwiOFwiLFwiSXNTaG93XCI6dHJ1ZSxcIlBhcmFtMVwiOlwiMzBcIixcIlBhcmFtMlwiOlwiXCJ9XSxcIkNsaWVudDJcIjp7XCJWaWRlb1RpbWVcIjoxMCxcIlZpZGVvTnVtXCI6XCIxMFwiLFwiU2hhcmVUaW1lXCI6NCxcIlNoYXJlXCI6W3tcImtleVwiOlwiZnVodW9cIixcImltZ1wiOlwiYmluZ2R1d2VpamkvZnVodW9meC5wbmdcIixcInRpbGVcIjpcIuadpeW4ruWKqeaIkea2iOeBreeXheavkuWQp++8gVwifV0sXCJqaWxpd2VpdGltZVwiOlwiNjAwXCIsXCJWaWRlb3RvU2hhcmVcIjpcIjFcIixcIlNoYXJldG9WaWRlb1wiOlwiMVwifSxcIlJlTnVtXCI6MTAwLFwiUmVUaW1lXCI6MjU5MjAwfSxcIk1lbWJlclwiOntcIkFwcEtleUlEXCI6MyxcIk1lbWJlcklEXCI6MTAwMDAxLFwiVXNlck5hbWVcIjpcIlwifSxcIk5vd1RpbWVcIjoxNTcyMjUxNTU4LFwiVmVyc2lvblwiOlwiXCJ9fScpO1xyXG4gICAgICAgIC8vICAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBDUEFFdmVudC5DUEFFdmVudF9pbml0Q1BBRGF0YSxkYXRhcy5KU0RBVEEgKTtcclxuICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIHRoaXMuaW5pdERhdGEoKTtcclxuICAgICAgICBpZiggdGhpcy5fbG9naW5jYWxsb2JqICYmIHRoaXMuX2xvZ2luc3VjY2VlZGNhbGxiYWNrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvZ2luc3VjY2VlZGNhbGxiYWNrLmNhbGwoIHRoaXMuX2xvZ2luY2FsbG9iaiApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIFBsYXRmb3JtRXZlbnQuUGxhdGZvcm1FdmVudF9sb2dpblN1Y2NlZWQgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2dpbmZhaWxjYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU2hvdyhjYWxsb2JqOiBhbnk9bnVsbCwgc3VjY2VlZGNhbGxiYWNrOiBGdW5jdGlvbj1udWxsLCBmYWlsQ2FsbGJhY2s6IEZ1bmN0aW9uID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5vblNob3coY2FsbG9iaiwgc3VjY2VlZGNhbGxiYWNrLCBmYWlsQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUucXE6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNob3djYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMuYWdhaW5wbGF5YmdTb3VuZCApO1xyXG4gICAgICAgIExheWEudGltZXIub25jZSggNTAwLHRoaXMsdGhpcy5hZ2FpbnBsYXliZ1NvdW5kICk7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBQbGF0Zm9ybUV2ZW50LlBsYXRmb3JtRXZlbnRfb25zaG93ICk7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBQbGF0Zm9ybUV2ZW50LlBsYXRmb3JtRXZlbnRfZ2V0Zm9jdXMgKTtcclxuICAgICAgICB2YXIgZnJvbXNjZW5lOm51bWJlciA9IFBsYXRmb3JtVG9vbC5mcm9tc2NlbmUoKTtcclxuICAgICAgICBpZiggZnJvbXNjZW5lID09IDEwODkgfHwgZnJvbXNjZW5lID09IDExMzEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBQbGF0Zm9ybUV2ZW50LlBsYXRmb3JtRXZlbnRfZnJvbXNjb3JmayApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFnYWlucGxheWJnU291bmQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBQbGF0Zm9ybUV2ZW50LlBsYXRmb3JtRXZlbnRfb25BdWRpb0ludGVycnVwdGlvbkVuZCApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkhpZGUoY2FsbG9iajogYW55PW51bGwsIHN1Y2NlZWRjYWxsYmFjazogRnVuY3Rpb249bnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5vbkhpZGUoY2FsbG9iaiwgc3VjY2VlZGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnFxOlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGhpZGVjYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBUaW1lc1RhbXBlci5nZXRJbnN0YW5jZSgpLnNlbmRvbmxpbmVUb25namkoKTtcclxuICAgICAgICBTb3VuZHNzTWFuYWdlci5nZXRJbnN0YW5jZSgpLnN0b3BBbGwoKTtcclxuICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIFBsYXRmb3JtRXZlbnQuUGxhdGZvcm1FdmVudF9vbmhpZGUgKTtcclxuICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIFBsYXRmb3JtRXZlbnQuUGxhdGZvcm1FdmVudF9sb3NlZm9jdXMgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW9k+WJjea4uOaIj+aYr+WQpuWcqOaYvuekuuS4rVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGlzc2hvdygpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICB2YXIgYm86Ym9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uaXNTaG93aW5nIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBibyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBibyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YiG5YyF5Yqg6L29XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2FkU3VicGFja2FnZSggdHlwZW5hbWU6c3RyaW5nLGNhbGxvYmo6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLGNhbGxwcm9ncmVzczpGdW5jdGlvbixmYWlsY2FsbGJhY2s6RnVuY3Rpb249bnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkubG9hZFN1YnBhY2thZ2UoIHR5cGVuYW1lLGNhbGxvYmosY2FsbGJhY2ssY2FsbHByb2dyZXNzLGZhaWxjYWxsYmFjayApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmKCBjYWxsb2JqICYmIGNhbGxiYWNrIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKCBjYWxsb2JqICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluaYr+WQpuW3sue7j+aOiOadg1xyXG4gICAgICogQHBhcmFtIGNhbGxvYmogXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc2FjY3JlZGl0KCBjYWxsb2JqOmFueSxhY2NyZWRpdENhbGxiYWNrOkZ1bmN0aW9uICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5nZXRhY2NyZWRpdCggY2FsbG9iaixhY2NyZWRpdENhbGxiYWNrICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS5xcTpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuZ2V0YWNjcmVkaXQoIGNhbGxvYmosYWNjcmVkaXRDYWxsYmFjayApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmKGFjY3JlZGl0Q2FsbGJhY2smJmNhbGxvYmopXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjcmVkaXRDYWxsYmFjay5jYWxsKCBjYWxsb2JqLHRydWUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5ou/6KeS6Imy5L+h5oGv5o6I5p2DXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVhY2NyZWRpdCggY2FsbG9iajphbnksY2FsbGJhY2s6RnVuY3Rpb24sZmFpbGNhbGxiYWNrOkZ1bmN0aW9uICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5jcmVhdGVVc2VySW5mb0J1dHRvbihjYWxsb2JqLGNhbGxiYWNrLGZhaWxjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xvc2V1c2VyaW5mb0J1dHRvbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuY2xvc2V1c2VyaW5mb2JVdHRvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgIDlh7rmuLjmiI9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGV4aXRHYW1lKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5leGl0R2FtZSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmiZPlvIDlrqLmnI3lr7nor53moYZcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9wZW5DdXN0b21lclNlcnZpY2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLm9wZW5DdXN0b21lclNlcnZpY2UoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55+t6ZyH5YqoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2aWJyYXRlU2hvcnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLnZpYnJhdGVTaG9ydCgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNDYW5WaWRlbygpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICB2YXIgYm86Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmKCBQbGF0Zm9ybVRvb2wuY2hlY2tFbmFibGUoKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBibyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICAgICAgYm8gPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmlzQ2FuVmlkZW8oKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBibyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYm87XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXJ0U2hhcmVBcHAoa2V5OnN0cmluZyxjYWxsb2JqOmFueT1udWxsLHN1Y2NlZWRDYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbiA9IG51bGwpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuc3RhcnRTaGFyZUFwcCgga2V5LGNhbGxvYmosc3VjY2VlZENhbGxiYWNrLGZhaWxDYWxsYmFjayApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmKCBjYWxsb2JqICYmIHN1Y2NlZWRDYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZENhbGxiYWNrLmNhbGwoIGNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwbGF5VmlkZW8oIGtleTpzdHJpbmcsIGNhbGxvYmo6YW55PW51bGwsIHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbj1udWxsLGlzdG9uZ2ppTnVtOmJvb2xlYW4gPSB0cnVlIClcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIC8vIFdvcmRUaXBzVXRpbHMuZ2V0SW5zdGFuY2UoKS5zaG93V29yZFRpcHMoXCLmmoLmnKrlvIDmlL5cIik7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLnBsYXlWaWRlbygga2V5LGNhbGxvYmosc3VjY2VlZGNhbGxiYWNrLGZhaWxDYWxsYmFjayxpc3RvbmdqaU51bSApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmKCBjYWxsb2JqICYmIHN1Y2NlZWRjYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoIGNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjcmVhdGVCYW5uZXIoYmFubmVydHlwZTpzdHJpbmcsc3R5bGU6YW55PXt4OjAseTowLHNjYWxlOjF9KTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUJhbm5lciggYmFubmVydHlwZSxzdHlsZSApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoaWRlQmFubmVyKCBiYW5uZXJ0eXBlOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuaGlkZUJhbm5lciggYmFubmVydHlwZSApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pWw5o2u5LiK5Lyg77yI55So5LqO5o6S6KGM5qac5pWw5o2u5pi+56S677yJXHJcbiAgICAgKiBAcGFyYW0gcGFyYW0xIOS4iuaKpeaVsOaNrjFcclxuICAgICAqIEBwYXJhbSBwYXJhbTIg5LiK5oql5pWw5o2uMlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RvcmVUb0Nsb3VkKHBhcmFtMTpudW1iZXIscGFyYW0yOm51bWJlcik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5zdG9yZVRvQ2xvdWQoIHBhcmFtMSxwYXJhbTIgKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaJk+W8gOWlveWPi+aOkuihjOamnFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3BlbkZyaWVuZFJhbmsoIHR5cGU6c3RyaW5nLHZpZXdUeXBlOnN0cmluZyxyZWN0OkxheWEuUmVjdGFuZ2xlLHBhcmVudDpMYXlhLlNwcml0ZSA9IG51bGwsZGF0YTphbnkgPSBudWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5vcGVuRnJpZW5kUmFuayggdHlwZSx2aWV3VHlwZSxyZWN0LHBhcmVudCxkYXRhICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjpLooYzmppzmiZPlvIDnirbmgIHml7blgJnvvIzliIfmjaLmmL7npLrnsbvlnotcclxuICAgICAqIEBwYXJhbSB0eXBlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2hhbmdlRnJpZW5kUmFuayggdHlwZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmNoYW5nZUZyaWVuZFJhbmsodHlwZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjpLooYzmppzkuIrkuIDpobVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByZVBhZ2VSYW5rKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5wcmVQYWdlUmFuaygpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o6S6KGM5qac5LiL5LiA6aG1XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZXh0UGFnZVJhbmsoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLm5leHRQYWdlUmFuaygpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YWz6Zet5aW95Y+L5o6S6KGM5qacXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbG9zZUZyaWVuZFJhbmsoIHZpZXdUeXBlOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuY2xvc2VGcmllbmRSYW5rKHZpZXdUeXBlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9ja1ZpZGVvTGVmdFRpbWUoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICB2YXIgdGltZTpudW1iZXIgPSAwO1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGltZSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkubG9ja1ZpZGVvTGVmdFRpbWUoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGltZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRheVZpZGVvTnVtcygpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHZhciB0aW1lOm51bWJlciA9IDA7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICB0aW1lID0gV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAxMDg5Oua3u+WKoOWIsOaIkeeahOWwj+eoi+W6j++8jDExMzE65re75Yqg5Yiw5rWu56qXXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbXNjZW5lKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNjZW5lOm51bWJlciA9IDA7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgIHNjZW5lID0gV1hHYW1lUGxhdGZvcm0uZnJvbXNjZW5lO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzY2VuZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUdhbWVDbHViQnV0dG9uKCBzdHlsZTphbnksaWNvbjpzdHJpbmcgPSBcImdyZWVuXCIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdhbWVDbHViQnV0dG9uKCBzdHlsZSxpY29uICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBQbGF0ZnJvbVR5cGVcclxuIHtcclxuICAgIC8qKlxyXG4gICAgICog55S16ISRXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYzpzdHJpbmcgPSBcInBjXCI7XHJcbiAgICAvKipcclxuICAgICAqIOW+ruS/oeWwj+a4uOaIj1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgd3g6c3RyaW5nID0gXCJ3eFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogcXHlsI/muLjmiI9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHFxOnN0cmluZyA9IFwicXFcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaKlumfs1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgdHQ6c3RyaW5nID0gXCJ0dFwiO1xyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGxhdGZvcm1FdmVudCBcclxue1xyXG4gICAgLyoqXHJcbiAgICAgKiDnmbvlvZVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG1lc3NhZ2VfOTg5MTAwMTpzdHJpbmcgPSBcIjk4OTEwMDFcIjtcclxuICAgIC8qKlxyXG4gICAgICog5bm/5ZGK54K55Ye7XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBtZXNzYWdlXzk4OTExMDI6c3RyaW5nID0gXCI5ODkxMTAyXCI7XHJcbiAgICAvKipcclxuICAgICAqIOeCueWHu+ehruWumui3s+i9rOWIsOWklumDqOa4uOaIj1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbWVzc2FnZV85ODkxMTAzOnN0cmluZyA9IFwiOTg5MTEwM1wiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog55So5oi35omT54K5XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBtZXNzYWdlXzk4OTEwMDI6c3RyaW5nID0gXCI5ODkxMDAyXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5blkI7lj7DmlbDmja5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIG1lc3NhZ2VfOTg5MTEwMTpzdHJpbmcgPSBcIjk4OTExMDFcIjtcclxuXHJcbiAgICBzdGF0aWMgUGxhdGZvcm1FdmVudF9sb2dpblN1Y2NlZWQ6c3RyaW5nID0gXCJQbGF0Zm9ybUV2ZW50X2xvZ2luU3VjY2VlZFwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiDmuLjmiI/ku47lkI7lj7DmgaLlpI3mmL7npLrkuovku7ZcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFBsYXRmb3JtRXZlbnRfb25zaG93OnN0cmluZyA9IFwiUGxhdGZvcm1FdmVudF9vbnNob3dcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOa4uOaIj+i/m+WFpeWQjuWPsOS6i+S7tlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgUGxhdGZvcm1FdmVudF9vbmhpZGU6c3RyaW5nID0gXCJQbGF0Zm9ybUV2ZW50X29uaGlkZVwiO1xyXG5cclxuICAgIHN0YXRpYyBQbGF0Zm9ybUV2ZW50X29uQXVkaW9JbnRlcnJ1cHRpb25FbmQ6c3RyaW5nID0gXCJQbGF0Zm9ybUV2ZW50X29uQXVkaW9JbnRlcnJ1cHRpb25FbmRcIjtcclxuXHJcbiAgICBzdGF0aWMgUGxhdGZvcm1FdmVudF9sb3NlZm9jdXM6c3RyaW5nID0gXCJQbGF0Zm9ybUV2ZW50X2xvc2Vmb2N1c1wiO1xyXG4gICAgc3RhdGljIFBsYXRmb3JtRXZlbnRfZ2V0Zm9jdXM6c3RyaW5nID0gXCJQbGF0Zm9ybUV2ZW50X2dldGZvY3VzXCI7XHJcblxyXG4gICAgc3RhdGljIFBsYXRmb3JtRXZlbnRfdXBkYXRlVmlkZW9OdW1zOnN0cmluZyA9IFwiUGxhdGZvcm1FdmVudF91cGRhdGVWaWRlb051bXNcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS7juaUtuiXj+aIluiAhea1rueql+i/m+WFpea4uOaIj1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgUGxhdGZvcm1FdmVudF9mcm9tc2NvcmZrOnN0cmluZyA9IFwiUGxhdGZvcm1FdmVudF9mcm9tc2NvcmZrXCI7XHJcbn0iLCJleHBvcnQgbW9kdWxlIFJhbmtUeXBle1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5omT5byA5aW95Y+L5o6S6KGM5qacXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBjb25zdCBvcGVuZnJpZW5kcmFuazpzdHJpbmcgPSBcIm9wZW5mcmllbmRyYW5rXCI7XHJcbiAgICAvKipcclxuICAgICAqIOWFs+mXreWlveWPi+aOkuihjOamnFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgY29uc3QgY2xvc2VmcmllbmRyYW5rOnN0cmluZyA9IFwiY2xvc2VmcmllbmRyYW5rXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkuIvkuIDpobVcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGNvbnN0IG5leHRwYWdlOnN0cmluZyA9IFwibmV4dHBhZ2VcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS4iuS4gOmhtVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgY29uc3QgcHJlcGFnZTpzdHJpbmcgPSBcInByZXBhZ2VcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOi2hei2iuWlveWPi++8iOaYvuekuuWQjuS4gOWQje+8iVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgY29uc3QgY2hhb3l1ZTpzdHJpbmcgPSBcImNoYW95dWVcIjtcclxuICAgIC8qKlxyXG4gICAgICog6LaF6LaK5aW95Y+L77yI5pi+56S65YmN5ZCO5LiA5ZCN77yJXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBjb25zdCBjaGFveXVlMTpzdHJpbmcgPSBcImNoYW95dWUxXCI7XHJcbn0iLCJpbXBvcnQgU3RhZ2UgPSBMYXlhLlN0YWdlO1xyXG5pbXBvcnQgV2ViR0wgPSBMYXlhLldlYkdMO1xyXG5pbXBvcnQgRXZlbnQgPSBMYXlhLkV2ZW50O1xyXG5pbXBvcnQgSHR0cFJlcXVlc3QgPSBMYXlhLkh0dHBSZXF1ZXN0O1xyXG5pbXBvcnQgVGV4dCA9IExheWEuVGV4dDtcclxuaW1wb3J0IEJyb3dzZXIgPSBMYXlhLkJyb3dzZXI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQgfSBmcm9tIFwiLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IE1haW5Db25maWcgfSBmcm9tIFwiLi9NYWluQ29uZmlnXCI7XHJcbmltcG9ydCB7IFNoYXJlVXRpbCB9IGZyb20gXCIuL1dYU0RLL1NoYXJlVXRpbFwiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuL1dYU0RLL1Nka1wiO1xyXG5pbXBvcnQgeyBUaW1lc1RhbXBlciB9IGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL1RpbWVzVGFtcGVyXCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL0RlYnVnZXJcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uLy4uL0dsb2JhbFwiO1xyXG5cclxuLy8gY29uc3QgUFJPVE9DT0xfVVJMOnN0cmluZyA9IFwiaHR0cHM6Ly9waXBlbGluZWFwaS54d3hnYW1lLmNvbS9cIjtcclxuY29uc3QgUFJPVE9DT0xfVVJMOnN0cmluZyA9IFwiaHR0cHM6Ly9wYXJrb3VycmFjZWFwaS54d3hnYW1lLmNvbS9cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQUk9UT0NPTFMge1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgTG9naW5cdFx0XHRcdD0gXCJ1c2VyL2xvZ2luXCI7XHRcdFx0XHQvLyBub3QgdG9rZW5cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdhbWUgICAgICAgICAgICAgICAgID0gXCJnYW1lL3N0YXJ0XCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGVuZCAgICAgICAgICAgICAgICAgID0gXCJnYW1lL3BsYXlcIjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNpZ24gICAgICAgICAgICAgID0gXCJzaWduL3NpZ25cIjtcclxuXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIEVxdWlwSGVybyAgICAgICAgICAgPSBcInRoZW1lL2VxdWlwSGVyb1wiO1xyXG4gICAgLy8gcHVibGljIHN0YXRpYyBCdXlIZXJvICAgICAgICAgICAgID0gXCJ0aGVtZS9idXlIZXJvXCI7XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIEVxdWlwSGF0ICAgICAgICAgICA9IFwidGhlbWUvZXF1aXBIYXRcIjtcclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgQnV5SGF0ICAgICAgICAgICAgID0gXCJ0aGVtZS9idXlIYXRcIjtcclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgQnV5RGFuY2UgICAgICAgICAgICAgPSBcInRoZW1lL2J1eURhbmNlXCI7XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIEVxdWlwRGFuY2UgICAgICAgICAgID0gXCJ0aGVtZS9lcXVpcERhbmNlXCI7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBCdXk9XCJ0aGVtZS9idXlcIjtcclxuICAgIHB1YmxpYyBzdGF0aWMgRXF1aXA9XCJ0aGVtZS9lcXVpcFwiO1xyXG4gICAgcHVibGljIHN0YXRpYyBzaGFyZSAgICAgICAgICAgICAgICA9IFwiZmlzc2lvbi9zaGFyZVwiO1xyXG4gICAgcHVibGljIHN0YXRpYyB2ZCAgICAgICAgICAgICAgICAgICA9IFwiZmlzc2lvbi92ZFwiO1xyXG4gICAgcHVibGljIHN0YXRpYyByZXZpdmFsICAgICAgICAgICAgICA9IFwiZ2FtZS9yZXZpdmFsXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGZpc3Npb24gICAgICAgICAgID0gXCJ0aGVtZS9maXNzaW9uXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIHRoZW1lZmlzc2lvbiAgICAgICAgICA9XCJ0aGVtZS9maXNzaW9uXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIHRyZWFzdXJlICAgICAgID0gXCJ0cmVhc3VyZS9jbGlja1wiO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlnICAgICAgICAgICAgPSBcImNvbmZpZy90YWJsZVwiO1xyXG4gICAgcHVibGljIHN0YXRpYyBMb3R0ZXJ5PVwibG90dGVyeS9sb3R0ZXJ5XCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIEdldEFjaGlldmU9XCJhY2hpZXZlbWVudC9nZXRSZXdhcmRzXCI7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB1c2Vyc3luYyA9IFwidXNlci9zeW5jXCI7XHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgTmV0d29ya01hbmFnZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6TmV0d29ya01hbmFnZXI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYoTmV0d29ya01hbmFnZXIuaW5zdGFuY2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gTmV0d29ya01hbmFnZXIuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTmV0d29ya01hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoKVxyXG4gICAge1xyXG4gICAgICAgIE5ldHdvcmtNYW5hZ2VyLmluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24g55m75YWlXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBsb2dpbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIHB1YmxpYyBsb2dpbihwcm9ncmVzc2NiOkxheWEuSGFuZGxlciwgY29tcGxldGVjYjpMYXlhLkhhbmRsZXIsIGVycm9yY2I6TGF5YS5IYW5kbGVyKTogdm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB1c2VySW5mb3IgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50O1xyXG4gICAgICAgIHZhciB2ZXIgPSBHbG9iYWwuZ2FtZVZlcnNpb247XHJcblxyXG4gICAgICAgIGxldCBhcmdzOnN0cmluZyA9IGBjb2RlPSR7dXNlckluZm9yLkNvZGV9Jm5pY2tuYW1lPSR7dXNlckluZm9yLk5pY2tOYW1lfSZhdmF0YXI9JHt1c2VySW5mb3IuQXZhdGFyfSZnZW5kZXI9JHt1c2VySW5mb3IuR2VuZGVyfSZjb3VudHJ5PSR7dXNlckluZm9yLkNvdW50cnl9JnByb3ZpbmNlPSR7dXNlckluZm9yLlByb3ZpbmNlfSZjaXR5PSR7dXNlckluZm9yLkNpdHl9JiBkZXZpY2U9JHt1c2VySW5mb3IuRGV2aWNlfSQmc2hhcmVfaWQ9JHt1c2VySW5mb3IuU2hhcmVJZH0mc2NlbmU9JHt1c2VySW5mb3IuU2NlbmV9JnY9JHt2ZXJ9YDtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgaHR0cFJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LlBST0dSRVNTLCB0aGlzLCB0aGlzLm9uSHR0cFJlcXVlc3RQcm9ncmVzcywgW3Byb2dyZXNzY2IsIGh0dHBSZXF1ZXN0XSk7XHJcbiAgICAgICAgaHR0cFJlcXVlc3Qub25jZShFdmVudC5DT01QTEVURSwgdGhpcywgdGhpcy5vbkxvZ2luUmVxdWVzdENvbXBsZXRlLCBbY29tcGxldGVjYiwgaHR0cFJlcXVlc3RdKTtcclxuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLm9uSHR0cFJlcXVlc3RFcnJvciwgW2Vycm9yY2IsIGh0dHBSZXF1ZXN0XSk7XHJcbiAgICAgICAgaHR0cFJlcXVlc3Quc2VuZChQUk9UT0NPTF9VUkwrUFJPVE9DT0xTLkxvZ2luICwgYXJncywgXCJwb3N0XCIsIFwidGV4dFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RQcm9ncmVzcyhwcm9ncmVzc2NiOkxheWEuSGFuZGxlcixodHRwUmVxdWVzdDpIdHRwUmVxdWVzdClcclxuICAgIHtcclxuICAgICAgICBpZihwcm9ncmVzc2NiKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJIdHRwUmVxdWVzdFByb2dyZXNzOi4uLlwiKTtcclxuICAgICAgICAgICAgcHJvZ3Jlc3NjYi5ydW4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxvZ2luUmVxdWVzdENvbXBsZXRlKGNvbXBsZXRlY2I6TGF5YS5IYW5kbGVyLGh0dHBSZXF1ZXN0Okh0dHBSZXF1ZXN0KVxyXG4gICAge1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCLnmbvlvZXmlbDmja7vvJpcIiwgaHR0cFJlcXVlc3QuZGF0YSk7XHJcbiAgICAgICAgbGV0IGRhdGE6IEpTT04gPSBKU09OLnBhcnNlKGh0dHBSZXF1ZXN0LmRhdGEpO1xyXG5cdFx0XHRpZiAoZGF0YVtcImNvZGVcIl0gIT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi55m75b2V5byC5bi46ZSZ6K+v77yB6ZSZ6K+v5L+h5oGv77yaXCIsIGh0dHBSZXF1ZXN0LmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLnmbvlvZXlvILluLjplJnor6/vvIHplJnor6/kv6Hmga/vvJo9IFwiICsgZGF0YVtcImNvZGVcIl0sXCJodHRwUmVxdWVzdC5kYXRcIik7XHJcblx0XHRcdFx0Ly9jb21wbGV0ZWNiLnJ1bldpdGgoZGF0YSk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFBsYXllckFjY291bnQuU2VydmVyVGltZSA9IGRhdGFbXCJ0XCJdO1xyXG4gICAgICAgICAgICBUaW1lc1RhbXBlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZVNlcnZpY2VUaW1lKCBOdW1iZXIoZGF0YVtcInRcIl0pICk7XHJcbiAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi55m75b2V5q2j5byP5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LlNldEFjY291bnREYXRhKGRhdGEsY29tcGxldGVjYik7XHJcbiAgICAgICAgICAgIFNoYXJlVXRpbC5TaGFyZU1lc3NhZ2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RFcnJvcihlcnJvcmNiOkxheWEuSGFuZGxlcixodHRwUmVxdWVzdDpIdHRwUmVxdWVzdClcclxuICAgIHtcclxuICAgICAgICBpZiAoZXJyb3JjYiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGVycm9yY2IucnVuV2l0aChodHRwUmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiRXJyb3IhIEh0dHAgcmVxdWVzdCBlcnJvci4uIFwiICxcImh0dHBSZXF1ZXN0LmRhdFwiKTtcclxuICAgICAgICBXeEFwaS5TaG93TG9hZGluZyhcIui/nuaOpee9kee7nOWksei0pS4uLlwiKTtcclxuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoODAwMCx0aGlzLCgpPT57V3hBcGkuSGlkZUxvYWRpbmcoKTt9KVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IhIEh0dHAgcmVxdWVzdCBlcnJvci4uLlwiICsgaHR0cFJlcXVlc3QuZGF0YSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICAgIFxyXG5cclxuICAgIC8qXHJcbiAgICAqIOmAmueUqEh0dHAgUG9zdOWNj+iuruWPkemAgVxyXG4gICAgKiBwcm90b2NvbCBcdFx05a+55bqU4oCcUFJPVE9DT0xT4oCd5a2X5YW45Lit5Y2P6K6u5ZCN56ewXHJcbiAgICAqIGhhc1Rva2VuXHRcdOaYr+WQpuS9v+eUqHRva2Vu77yM55uu5YmN5Y+q5pyJbG9naW7ljY/orq7kuI3pnIDopoF0b2tlbu+8jOWFtuS7lumDvemcgOimgXRva2Vu77yM5omA5Lul5q2k5aSE6Ieq5Yqo57uE5ZCIXHJcbiAgICAqIHBhcmFtXHRcdFx05Y+C5pWw5YiX6KGo77yMa2V55piv5a2X5q615ZCN77yMdmFs5piv5YC877yM5YC86ZyA6KaB5YWI6L2sc3RyaW5nXHJcbiAgICAqIGNvbXBsZXRlY2JcdOWNj+iuruWPkemAgeaIkOWKn+Wbnuiwg+WHveaVsFxyXG4gICAgKiBlcnJvcmNiXHRcdOWNj+iuruWPkemAgeWksei0peWbnuiwg+WHveaVsFxyXG4gICAgKiByZXR1cm5cdFx06L+U5Zue5YC85Li6dm9pZFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBIdHRwUG9zdFJlcXVlc3QocHJvdG9jb2w6c3RyaW5nLCBwYXJhbTpBcnJheTx7W2tleTpzdHJpbmddOnN0cmluZ30+LCBjb21wbGV0ZWNiOkxheWEuSGFuZGxlciwgZXJyb3JjYjpMYXlhLkhhbmRsZXIsIGhhc1Rva2VuOmJvb2xlYW4gPSB0cnVlKTp2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIGxldCBhcmdzOnN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgbGV0IHVybDpzdHJpbmcgPSBQUk9UT0NPTF9VUkwgKyBwcm90b2NvbDtcclxuICAgICAgICAvLyBjaGVjaGsgYWRkIHRva2VuXHJcbiAgICAgICAgdmFyIGFjY291bnQgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50O1xyXG4gICAgICAgIHZhciBhY2NvdW50ZGF0YSA9IGFjY291bnQuQ3VyQWNjb3VudERhdGE7XHJcbiAgICAgICAgaWYgKGhhc1Rva2VuID09IHRydWUpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYXJncyA9IGB0b2tlbj0ke2FjY291bnRkYXRhLm1fdG9rZW59JmA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBXeEFwaS5TaG93TG9hZGluZyhcIui/nuaOpee9kee7nOS4rS4uLlwiKTtcclxuICAgICAgICBpZiAocHJvdG9jb2wgPT0gUFJPVE9DT0xTLmdhbWUgfHwgcHJvdG9jb2wgPT0gUFJPVE9DT0xTLmVuZCB8fCBwcm90b2NvbCA9PSBQUk9UT0NPTFMuZmlzc2lvbiB8fCBwcm90b2NvbCA9PSBQUk9UT0NPTFMudmR8fFxyXG4gICAgICAgICAgICBwcm90b2NvbD09UFJPVE9DT0xTLnRoZW1lZmlzc2lvbnx8cHJvdG9jb2w9PVBST1RPQ09MUy5Mb3R0ZXJ5IHx8IHByb3RvY29sID09IFBST1RPQ09MUy51c2Vyc3luYylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBzdHIgID0gXCJhYmNkZWZnaGlqa2ltbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIjtcclxuICAgICAgICAgICAgbGV0IGNvZGUgPSBcIntcIjtcclxuICAgICAgICAgICAgbGV0IG1hc2sgPSBcIlwiO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG1hc2sgKz0gc3RyW01hdGguZmxvb3IoIE1hdGgucmFuZG9tKCkgKiAxMDApICUgc3RyLmxlbmd0aF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbS5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHBhcmFtW2ldKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2RlICs9IGBcXFwiJHtrZXl9XFxcIjpcXFwiJHtwYXJhbVtpXVtrZXldfVxcXCJgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGkgPCBwYXJhbS5sZW5ndGggLSAxKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2RlICs9IFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZGUgKz0gXCJ9XCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXJncyArPSBcIl9yPVwiICsgbWFzayArIHRoaXMuYmFzZTY0RW5jb2RlKGNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW0ubGVuZ3RoOyBpKyspIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBwYXJhbVtpXSkgXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsOnN0cmluZyA9IHBhcmFtW2ldW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gYCR7a2V5fT0ke3ZhbH1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHBhcmFtLmxlbmd0aCAtIDEpIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzICs9IFwiJlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBodHRwUmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgIGh0dHBSZXF1ZXN0Lm9uY2UoRXZlbnQuQ09NUExFVEUsIHRoaXMsIHRoaXMub25IdHRwUmVxdWVzdENvbXBsZXRlLCBbY29tcGxldGVjYiwgZXJyb3JjYiwgaHR0cFJlcXVlc3RdKTtcclxuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLm9uSHR0cFJlcXVlc3RFcnJvciwgW2Vycm9yY2IsIGh0dHBSZXF1ZXN0XSk7XHJcbiAgICAgICAgaHR0cFJlcXVlc3Quc2VuZCh1cmwsIGFyZ3MsIFwicG9zdFwiLCBcInRleHRcIik7XHJcbiAgICB9XHJcbiAgICAgICAgXHJcbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RDb21wbGV0ZShzdWNjZWVkY2I6TGF5YS5IYW5kbGVyLCBmYWlsdXJlY2I6TGF5YS5IYW5kbGVyLCBodHRwUmVxdWVzdDpIdHRwUmVxdWVzdCk6dm9pZCBcclxuICAgIHtcclxuICAgICAgICBXeEFwaS5IaWRlTG9hZGluZygpO1xyXG4gICAgICAgIGxldCBkYXRhOiBKU09OID0gSlNPTi5wYXJzZShodHRwUmVxdWVzdC5kYXRhKTtcclxuICAgICAgICBpZiAoZGF0YVtcImNvZGVcIl0gPT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuU2V0QWNjb3VudERhdGEoZGF0YSxudWxsKTtcclxuICAgICAgICAgICAgLy9FdmVudE1hbmFnZXIuVHJpZ2dlcihFdmVudFR5cGUuUmVmcmVzaE1vbmVyeSk7XHJcbiAgICAgICAgICAgIGlmIChzdWNjZWVkY2IgIT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIuS4iuS8oOaIkOWKn+Wbnuiwg+aWueazlSBcIiArIGh0dHBSZXF1ZXN0LmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgc3VjY2VlZGNiLnJ1bldpdGgoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCJyZWNlaXZlOlwiLCBkYXRhICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGZhaWx1cmVjYiAhPSBudWxsKSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZmFpbHVyZWNiLnJ1bldpdGgoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IhIEh0dHAgcmVxdWVzdCBjb21wbGV0ZSBlcnJvciwgY29kZTogXCIgKyBkYXRhW1wiY29kZVwiXSArIFwiIG1lc3NhZ2U6IFwiICsgZGF0YVtcIm1lc3NhZ2VcIl0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJhc2U2NEVuY29kZSAoc3RyKTpzdHJpbmcge1xyXG4gICAgICAgIHZhciBjMSwgYzIsIGMzO1xyXG4gICAgICAgIHZhciBiYXNlNjRFbmNvZGVDaGFycyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO1xyXG4gICAgICAgIHZhciBpID0gMCwgbGVuID0gc3RyLmxlbmd0aCwgc3RyaW5nID0gJyc7XHJcbiAgICAgICAgd2hpbGUgKGkgPCBsZW4pIHtcclxuICAgICAgICAgIGMxID0gc3RyLmNoYXJDb2RlQXQoaSsrKSAmIDB4ZmY7XHJcbiAgICAgICAgICBpZiAoaSA9PSBsZW4pIHtcclxuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdChjMSA+PiAyKTtcclxuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoYzEgJiAweDMpIDw8IDQpO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gXCI9PVwiO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQoaSsrKTtcclxuICAgICAgICAgIGlmIChpID09IGxlbikge1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KGMxID4+IDIpO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KCgoYzEgJiAweDMpIDw8IDQpIHwgKChjMiAmIDB4RjApID4+IDQpKTtcclxuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoYzIgJiAweEYpIDw8IDIpO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gXCI9XCI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYzMgPSBzdHIuY2hhckNvZGVBdChpKyspO1xyXG4gICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdChjMSA+PiAyKTtcclxuICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoKChjMSAmIDB4MykgPDwgNCkgfCAoKGMyICYgMHhGMCkgPj4gNCkpO1xyXG4gICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoKGMyICYgMHhGKSA8PCAyKSB8ICgoYzMgJiAweEMwKSA+PiA2KSk7XHJcbiAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KGMzICYgMHgzRilcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0cmluZztcclxuICAgICAgfVxyXG59IiwiaW1wb3J0IFRvbmdqaUh0dHBzIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL25ldC9Ub25namlIdHRwc1wiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi8uLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IEdhbWVIdHRwcyBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9uZXQvR2FtZUh0dHBzXCI7XHJcbmltcG9ydCBQbGF0Zm9ybUV2ZW50IGZyb20gXCIuLi9ldmVudHMvUGxhdGZvcm1FdmVudFwiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vLi4vR2xvYmFsXCI7XHJcbmltcG9ydCBEYXlNYW5hZ2VyIGZyb20gXCIuLi8uLi9tYW5hZ2Vycy9EYXlNYW5hZ2VyXCI7XHJcbmltcG9ydCBDYWNoZU1hbmFnZXIgZnJvbSBcIi4uLy4uL21hbmFnZXJzL0NhY2hlTWFuYWdlclwiO1xyXG5pbXBvcnQgVXNlckNhY2hlVHlwZSBmcm9tIFwiLi4vLi4vZ2FtZW1vZHVsZS91c2VyaW5mby9ldmVudHMvVXNlckNhY2hlVHlwZVwiO1xyXG5pbXBvcnQgeyBXb3JkVGlwc1V0aWxzIH0gZnJvbSBcIi4uLy4uL2dhbWVtb2R1bGUvbG9hZGluZy92aWV3L1dvcmRUaXBzVXRpbHNcIjtcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL2V2ZW50cy9FdmVudFV0aWxzXCI7XHJcbmltcG9ydCBTb3VuZHNzTWFuYWdlciBmcm9tIFwiLi4vLi4vbWFuYWdlcnMvU291bmRzc01hbmFnZXJcIjtcclxuaW1wb3J0IHsgUmFua1R5cGUgfSBmcm9tIFwiLi4vdHlwZXMvUmFua1R5cGVcIjtcclxuaW1wb3J0IHsgR2FtZUxheWVyTWFuYWdlciB9IGZyb20gXCIuLi8uLi9tYW5hZ2Vycy9HYW1lTGF5ZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCBQbGF0Zm9ybVRvb2wgZnJvbSBcIi4uL1BsYXRmb3JtVG9vbFwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXWEdhbWVQbGF0Zm9ybVxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6V1hHYW1lUGxhdGZvcm07XHJcblxyXG4gICAgc3RhdGljIGNvZGU6c3RyaW5nO1xyXG4gICAgc3RhdGljIG5pY2tOYW1lOnN0cmluZztcclxuICAgIHN0YXRpYyBRdURhb0lEOnN0cmluZyA9IFwiXCI7Ly/lvq7kv6Hlub/lkYpJRFxyXG5cclxuICAgIHN0YXRpYyBpc1Nob3dpbmc6Ym9vbGVhbj10cnVlO1xyXG4gICAgLyoqXHJcbiAgICAgKiDmjojmnYPnirbmgIEgMDrmnKrliKTmlq3vvIwx77ya5bey5o6I5p2DXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhY2NyZWRpdHN0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvZPlpKnliIbkuqvmrKHmlbBcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGRheVNoYXJlTnVtOm51bWJlciA9IDA7XHJcbiAgICAvKipcclxuICAgICAqIOW9k+Wkqeeci+inhumikeasoeaVsFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZGF5VmlkZW9OdW06bnVtYmVyID0gMDtcclxuICAgIC8qKlxyXG4gICAgICog5Yik5pat5YiG5Lqr5piv5ZCm5oiQ5Yqf5pe26Ze06Ze06ZqUXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBTaGFyZVRpbWU6bnVtYmVyID0gMDtcclxuICAgIC8qKlxyXG4gICAgICog5q+P5pel5pyA5aSn55yL6KeG6aKR5qyh5pWw77yI5oiQ5Yqf57Sv5Yqg5LiA5qyh77yJXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBWaWRlb051bTpudW1iZXIgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiDnnIvop4bpopHlhrfljbTml7bpl7RcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFZpZGVvVGltZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogOOWlveS9jWNwYeWPr+W8ueWHuuaXtumXtOmXtOmalCjnp5IpXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBqaWxpd2VpdGltZTpudW1iZXIgPSAxMDA7XHJcbiAgICAvKipcclxuICAgICAqIOWIhuS6q+WHoOasoeWIh+aNouWIsOinhumikVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgU2hhcmV0b1ZpZGVvOm51bWJlciA9IDE7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDop4bpopHlh6DmrKHliIfmjaLliLDliIbkuqtcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFZpZGVvdG9TaGFyZTpudW1iZXIgPSAxO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YiG5Lqr5pWw5o2u5a655ZmoXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBTaGFyZURpY3Q6YW55ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnlKjmiLfmnaXmupBpZFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZnJvbXNjZW5lOm51bWJlciA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOldYR2FtZVBsYXRmb3JtXHJcbiAgICB7XHJcbiAgICAgICAgaWYoICF0aGlzLl9pbnN0YW5jZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBXWEdhbWVQbGF0Zm9ybSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zaG93U2hhcmVNZW51KHt3aXRoU2hhcmVUaWNrZXQ6dHJ1ZX0pO1xyXG4gICAgICAgIHRoaXMub25BdWRpb0ludGVycnVwdGlvbkJlZ2luKCk7XHJcbiAgICAgICAgdGhpcy5vbkF1ZGlvSW50ZXJydXB0aW9uRW5kKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRTaGFyZURpYW4oIGRhdGE6QXJyYXk8YW55PiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW1kOmFueTtcclxuICAgICAgICAgICAgZm9yKCB2YXIgcyBpbiBkYXRhIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaXRlbWQgPSBkYXRhW3NdO1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uU2hhcmVEaWN0W2l0ZW1kLmtleV0gPSBpdGVtZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgZmlyc3RkOmFueSA9IGRhdGFbMF07XHJcbiAgICAgICAgICAgIHRoaXMub25TaGFyZUFwcE1lc3NhZ2UoZmlyc3RkLnRpbGUsR2xvYmFsLmNkbnVybCArIGZpcnN0ZC5pbWcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdERhdGEoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIERheU1hbmFnZXIuaXNOZXdEYXkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW09MDtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW09MDtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXlTaGFyZUluZm8oKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXlWaWRlb0luZm8oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW09Q2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0bnVtKFVzZXJDYWNoZVR5cGUubm93ZGF5U2hhcmUpO1xyXG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bT1DYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRudW0oVXNlckNhY2hlVHlwZS5ub3dkYXlWaWRlbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIERlYnVnZXIubG9nKCBcImluaXREYXlTaGFyZU51bVwiLFdYR2FtZVBsYXRmb3JtLmRheVNoYXJlTnVtLFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlrZjlgqjlvZPlpKnliIbkuqvnmoTkv6Hmga9cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZURheVNoYXJlSW5mbygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRzdHIoIFVzZXJDYWNoZVR5cGUubm93ZGF5U2hhcmUsV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW0udG9TdHJpbmcoKSApO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcInVwZGF0ZURheVNoYXJlSW5mb1wiLFdYR2FtZVBsYXRmb3JtLmRheVNoYXJlTnVtICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZURheVZpZGVvSW5mbygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRzdHIoIFVzZXJDYWNoZVR5cGUubm93ZGF5VmlkZW8sV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW0udG9TdHJpbmcoKSApO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcInVwZGF0ZURheVZpZGVvSW5mb1wiLFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVzZXJpbmZvYnV0dG9uO1xyXG4gICAgc3RhdGljIGxvZ2luQ2FsbG9iajphbnk7XHJcbiAgICBzdGF0aWMgbG9naW5zdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBzdGF0aWMgbG9naW5wcm9ncmVzc0NhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIGNyZWF0ZVVzZXJBbmRMb2dpbiggY2FsbG9iajphbnksc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uLHByb2dyZXNzQ2FsbGJhY2s6RnVuY3Rpb24gPW51bGwsIGZhaWxjYWxsYmFjazpGdW5jdGlvbj1udWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiA9IGNhbGxvYmo7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5zdWNjZWVkY2FsbGJhY2sgPSBzdWNjZWVkY2FsbGJhY2s7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrID0gcHJvZ3Jlc3NDYWxsYmFjaztcclxuICAgICAgICB2YXIgd3g6YW55ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGV0IGxvZ2luX2luZm86YW55ID0gV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5nZXRMYXVuY2hPcHRpb25zU3luYygpO1xyXG4gICAgICAgICAgICBpZihsb2dpbl9pbmZvKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyhcImdldExhdW5jaE9wdGlvbnNTeW5jOlwiLGxvZ2luX2luZm8pO1xyXG4gICAgICAgICAgICAgICAgbGV0IHF1ZXJ5ID1sb2dpbl9pbmZvLnF1ZXJ5O1xyXG4gICAgICAgICAgICAgICAgaWYocXVlcnkgJiYgcXVlcnkuQ2hhbklEKXtcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5RdURhb0lEID0gcXVlcnkuQ2hhbklEO1xyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCfmnaXmupDivLTlkYrnmoTlub/lkYppZOaYrycgKyBXWEdhbWVQbGF0Zm9ybS5RdURhb0lEKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCByZWZlcnJlckluZm8gPSBsb2dpbl9pbmZvLnJlZmVycmVySW5mbztcclxuICAgICAgICAgICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5RdURhb0lEID09IFwiXCIgJiYgcmVmZXJyZXJJbmZvICYmIHJlZmVycmVySW5mby5hcHBJZCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uUXVEYW9JRCA9IHJlZmVycmVySW5mby5hcHBJZDtcclxuICAgICAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZygn5p2l5rqQ5b6u5L+h5bCP5ri45oiP55qEYXBwaWTmmK8nICsgV1hHYW1lUGxhdGZvcm0uUXVEYW9JRCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiggbG9naW5faW5mby5zY2VuZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZnJvbXNjZW5lID0gTnVtYmVyKCBsb2dpbl9pbmZvLnNjZW5lICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHN5c3RlbXJlcyA9IHd4LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gc3lzdGVtcmVzLlNES1ZlcnNpb247XHJcbiAgICAgICAgICAgIGlmICh3eC5nZXRVcGRhdGVNYW5hZ2VyKSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHVwZGF0ZU1hbmFnZXIgPSB3eC5nZXRVcGRhdGVNYW5hZ2VyKCk7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVNYW5hZ2VyLm9uQ2hlY2tGb3JVcGRhdGUoZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOivt+axguWujOaWsOeJiOacrOS/oeaBr+eahOWbnuiwg1xyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKFwi5piv5ZCm5pyJ5paw54mI5pys6ZyA6KaB5pu05pawOlwiK3Jlcy5oYXNVcGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCByZXMuaGFzVXBkYXRlPT10cnVlIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIub25VcGRhdGVSZWFkeShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dNb2RhbCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmm7TmlrDmj5DnpLonLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfmlrDniYjmnKzlt7Lnu4/lh4blpIflpb3vvIzmmK/lkKbph43lkK/lupTnlKjvvJ8nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5jb25maXJtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmlrDnmoTniYjmnKzlt7Lnu4/kuIvovb3lpb3vvIzosIPnlKggYXBwbHlVcGRhdGUg5bqU55So5paw54mI5pys5bm26YeN5ZCvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVNYW5hZ2VyLmFwcGx5VXBkYXRlKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmV4aXRHYW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5vblVwZGF0ZUZhaWxlZChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmlrDniYjmnKzkuIvovb3lpLHotKVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuZXhpdEdhbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmKCBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmogJiYgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrLmNhbGwoIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiwxMCApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eHBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5sb2dpbihjYWxsb2JqLHN1Y2NlZWRjYWxsYmFjayxmYWlsY2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiggV1hHYW1lUGxhdGZvcm0ubG9naW5DYWxsb2JqICYmIFdYR2FtZVBsYXRmb3JtLmxvZ2lucHJvZ3Jlc3NDYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrLmNhbGwoIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiwxMCApO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5sb2dpbihjYWxsb2JqLHN1Y2NlZWRjYWxsYmFjayxmYWlsY2FsbGJhY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVzZXJpbmZvY2FsbG9iajphbnk7XHJcbiAgICB1c2VyaW5mb3N1Y2NhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgdXNlcmluZm9mYWlsY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgY3JlYXRlVXNlckluZm9CdXR0b24oICBjYWxsb2JqOmFueSxjYWxsYmFjazpGdW5jdGlvbixmYWlsY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnVzZXJpbmZvY2FsbG9iaiA9IGNhbGxvYmo7XHJcbiAgICAgICAgdGhpcy51c2VyaW5mb3N1Y2NhbGxiYWNrID0gY2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy51c2VyaW5mb2ZhaWxjYWxsYmFjayA9IGZhaWxjYWxsYmFjaztcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGxldCByZXMgPSB3eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgIGlmKCByZXMgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRGVidWdlci5sb2coIFwiZ2V0U3lzdGVtSW5mb1N5bmNcIixyZXMgKTtcclxuICAgICAgICAgICAgdmFyIHBvc3g6bnVtYmVyID0gKHJlcy53aW5kb3dXaWR0aC0xNTEpLzI7XHJcbiAgICAgICAgICAgIHZhciBwb3N5Om51bWJlciA9IHJlcy53aW5kb3dIZWlnaHQtMTcyIC0gNDA7XHJcbiAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudXNlcmluZm9idXR0b24gPSB3eC5jcmVhdGVVc2VySW5mb0J1dHRvbihcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlJyxcclxuICAgICAgICAgICAgICAgIGltYWdlOid3eGxvY2FsL2xvZ2luLnBuZycsXHJcbiAgICAgICAgICAgICAgICBzdHlsZTpcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBwb3N4LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogcG9zeSxcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTUxLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogNzJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudXNlcmluZm9idXR0b24ub25UYXAoIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudXNlcmluZm9CdXR0b25DbGljayApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIpOaWreaYr+WQpuW3sue7j+aOiOadg1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0YWNjcmVkaXQoIGNhbGxvYmo6YW55LGFjY3JlZGl0Q2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmFjY3JlZGl0c3RhdGUgPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgICAgICB7ICAgXHJcbiAgICAgICAgICAgICAgICB3eC5nZXRTZXR0aW5nKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgKHJlcykgXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbWQgPSByZXMuYXV0aFNldHRpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpdGVtZC5oYXNPd25Qcm9wZXJ0eSggXCJzY29wZS51c2VySW5mb1wiICkgJiYgaXRlbWRbXCJzY29wZS51c2VySW5mb1wiXSA9PSB0cnVlICkgLy/lt7Lnu4/mjojmnYPov4dcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWNjcmVkaXRDYWxsYmFjayYmY2FsbG9iailcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NyZWRpdENhbGxiYWNrLmNhbGwoIGNhbGxvYmosdHJ1ZSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWNjcmVkaXRDYWxsYmFjayYmY2FsbG9iailcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NyZWRpdENhbGxiYWNrLmNhbGwoIGNhbGxvYmosZmFsc2UgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoYWNjcmVkaXRDYWxsYmFjayYmY2FsbG9iailcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBhY2NyZWRpdENhbGxiYWNrLmNhbGwoIGNhbGxvYmosdHJ1ZSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKGFjY3JlZGl0Q2FsbGJhY2smJmNhbGxvYmopXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFjY3JlZGl0Q2FsbGJhY2suY2FsbCggY2FsbG9iaix0cnVlICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVzZXJpbmZvQnV0dG9uQ2xpY2soIHJlczphbnkgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcInVzZXJpbmZvQnV0dG9uQ2xpY2tcIixyZXMgKTtcclxuICAgICAgICBpZiggcmVzIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBlcnJNc2c6c3RyaW5nID0gcmVzLmVyck1zZztcclxuICAgICAgICAgICAgaWYoIGVyck1zZyA9PSBcImdldFVzZXJJbmZvOm9rXCIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCLlkIzmhI/mjojmnYNcIiApO1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uYWNjcmVkaXRzdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLmNsb3NldXNlcmluZm9iVXR0b24oKTtcclxuICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0uZ2V0VXNlckluZm8oIGZhbHNlLHd4cGxhdGZvcm0udXNlcmluZm9jYWxsb2JqLHd4cGxhdGZvcm0udXNlcmluZm9zdWNjYWxsYmFjayx3eHBsYXRmb3JtLnVzZXJpbmZvZmFpbGNhbGxiYWNrICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCLngrnlh7vmi5Lnu53mjojmnYNcIiApO1xyXG4gICAgICAgICAgICAgICAgaWYoIHd4cGxhdGZvcm0udXNlcmluZm9jYWxsb2JqICYmIHd4cGxhdGZvcm0udXNlcmluZm9mYWlsY2FsbGJhY2sgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0udXNlcmluZm9mYWlsY2FsbGJhY2suY2FsbCggd3hwbGF0Zm9ybS51c2VyaW5mb2NhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xvc2V1c2VyaW5mb2JVdHRvbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgaWYod3hwbGF0Zm9ybS51c2VyaW5mb2J1dHRvbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHd4cGxhdGZvcm0udXNlcmluZm9idXR0b24ub2ZmVGFwKHd4cGxhdGZvcm0udXNlcmluZm9CdXR0b25DbGljayk7XHJcbiAgICAgICAgICAgIHd4cGxhdGZvcm0udXNlcmluZm9idXR0b24uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB3eHBsYXRmb3JtLnVzZXJpbmZvYnV0dG9uPW51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRVc2VySW5mbyggaXNsb2dpbjpib29sZWFuLGNhbGxvYmo6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLGZhaWxjYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LnNob3dNb2RhbFdhaXQoKTtcclxuICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3guZ2V0VXNlckluZm8oXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXJJbmZvID0gcmVzLnVzZXJJbmZvO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLm5pY2tOYW1lID0gdXNlckluZm8ubmlja05hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIGlzbG9naW4gKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5sb2dpbihjYWxsb2JqLGNhbGxiYWNrLGZhaWxjYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjYWxsb2JqICYmIGNhbGxiYWNrIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCggY2FsbG9iaixXWEdhbWVQbGF0Zm9ybS5uaWNrTmFtZSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOeZu+W9lVxyXG4gICAgICogQHBhcmFtIGNhbGxvYmogXHJcbiAgICAgKiBAcGFyYW0gc3VjY2VlZGNhbGxiYWNrIFxyXG4gICAgICogQHBhcmFtIGZhaWxDYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvZ2luKCBjYWxsb2JqOmFueSxjYWxsYmFjazpGdW5jdGlvbixmYWlsY2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gubG9naW4oe1xyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKCByZXMgKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyhcInd4LmxvZ2luOlwiLHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uY29kZSA9IHJlcy5jb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtZDphbnkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uUXVEYW9JRCAhPSBcIlwiIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1kLkNoYW5JRCA9IFdYR2FtZVBsYXRmb3JtLlF1RGFvSUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1kLkNvZGUgPSBXWEdhbWVQbGF0Zm9ybS5jb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1kLkFwcElEID0gR2xvYmFsLmFwcGlkO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1kLlZlcnNpb24gPSBHbG9iYWwuZ2FtZVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgR2FtZUh0dHBzLmdldEluc3RhbmNlKCkuc2VuZEdldCggUGxhdGZvcm1FdmVudC5tZXNzYWdlXzk4OTEwMDEsaXRlbWQsd3hwbGF0Zm9ybSx3eHBsYXRmb3JtLmxvZ2luU3VjY2VlZENhbGxiYWNrICk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmFpbDpmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCBcIuW+ruS/oeeZu+W9leWksei0pe+8jOmHjeaWsOeZu+W9leWQp1wiICk7XHJcbiAgICAgICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5sb2dpbiggY2FsbG9iaixjYWxsYmFjayxmYWlsY2FsbGJhY2sgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2dpblN1Y2NlZWRDYWxsYmFjayggZGF0YTphbnkgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiAmJiBXWEdhbWVQbGF0Zm9ybS5sb2dpbnN1Y2NlZWRjYWxsYmFjayApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5sb2dpbnN1Y2NlZWRjYWxsYmFjay5jYWxsKCBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmosZGF0YSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIF9zdWJjYWxsb2JqOmFueTtcclxuICAgIHB1YmxpYyBfc3ViY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgX3VwZGF0ZWNhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIF9zdWJmYWlsY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgbG9hZFN1YnBhY2thZ2UoIG5hbWU6c3RyaW5nLHN1YmNhbGxvYmo6YW55LHN1YmNhbGxiYWNrOkZ1bmN0aW9uLHVwZGF0ZWNhbGxiYWNrOkZ1bmN0aW9uLHN1YmZhaWxjYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9zdWJjYWxsb2JqID0gc3ViY2FsbG9iajtcclxuICAgICAgICAgICAgdGhpcy5fc3ViY2FsbGJhY2sgPSBzdWJjYWxsYmFjaztcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlY2FsbGJhY2sgPSB1cGRhdGVjYWxsYmFjaztcclxuICAgICAgICAgICAgdGhpcy5fc3ViZmFpbGNhbGxiYWNrID0gc3ViZmFpbGNhbGxiYWNrO1xyXG4gICAgICAgICAgICB2YXIgd3g6YW55ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICAgICAgaWYoIHd4LmxvYWRTdWJwYWNrYWdlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9hZFRhc2sgPSB3eC5sb2FkU3VicGFja2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTpuYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDliIbljIXliqDovb3miJDlip/lkI7pgJrov4cgc3VjY2VzcyDlm57osINcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdlci5sb2coXCLliIbljIXliqDovb3miJDlip9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbGJhY2sgJiYgd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24ocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWIhuWMheWKoOi9veWksei0pemAmui/hyBmYWlsIOWbnuiwg1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3hnYW1lUGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggd3hnYW1lUGxhdGZvcm0uX3N1YmZhaWxjYWxsYmFjayAmJiB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbG9iaiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLl9zdWJmYWlsY2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pOyAgXHJcbiAgICAgICAgICAgICAgICBpZihsb2FkVGFzay5vblByb2dyZXNzVXBkYXRlKXtcclxuICAgICAgICAgICAgICAgICAgICBsb2FkVGFzay5vblByb2dyZXNzVXBkYXRlKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB3eGdhbWVQbGF0Zm9ybS5fdXBkYXRlY2FsbGJhY2sgJiYgd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS5fdXBkYXRlY2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmoscmVzLnByb2dyZXNzICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdlci5sb2coJ+S4i+i9vei/m+W6picsIHJlcy5wcm9ncmVzcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCflt7Lnu4/kuIvovb3nmoTmlbDmja7plb/luqYnLCByZXMudG90YWxCeXRlc1dyaXR0ZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZygn6aKE5pyf6ZyA6KaB5LiL6L2955qE5pWw5o2u5oC76ZW/5bqmJywgcmVzLnRvdGFsQnl0ZXNFeHBlY3RlZFRvV3JpdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggc3ViY2FsbG9iaiAmJiBzdWJjYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3ViY2FsbGJhY2suY2FsbCggc3ViY2FsbG9iaiApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBzdWJjYWxsb2JqICYmIHN1YmNhbGxiYWNrIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3ViY2FsbGJhY2suY2FsbCggc3ViY2FsbG9iaiApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W6L2s5Y+R6K+m57uG5L+h5oGvXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICogQHBhcmFtIGNhbGxvYmogXHJcbiAgICAgKiBAcGFyYW0gc3VjY2VlZGNhbGxiYWNrIFxyXG4gICAgICogQHBhcmFtIGZhaWxDYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNoYXJlSW5mbyggb2JqOmFueSxjYWxsb2JqOmFueSwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uLGZhaWxDYWxsYmFjazpGdW5jdGlvbiA9IG51bGwgKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIERlYnVnZXIubG9nKFwic2hhcmVUaWNrZXQ6XCIsb2JqLnNoYXJlVGlja2V0KTtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTaGFyZUluZm8oe1xyXG4gICAgICAgICAgICAgICAgc2hhcmVUaWNrZXQ6b2JqLnNoYXJlVGlja2V0LFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlcylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyhcIuaIkOWKn++8mlwiLHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoIGNhbGxvYmoscmVzICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55uR5ZCs55So5oi354K55Ye75Y+z5LiK6KeS6I+c5Y2V55qE4oCc6L2s5Y+R4oCd5oyJ6ZKu5pe26Kem5Y+R55qE5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdGl0bGUgXHJcbiAgICAgKiBAcGFyYW0gaW1hZ2VVcmwgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblNoYXJlQXBwTWVzc2FnZSggdGl0bGU6c3RyaW5nLGltYWdlVXJsOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uU2hhcmVBcHBNZXNzYWdlKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6dGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VVcmw6aW1hZ2VVcmxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkuLvliqjmi4notbfovazlj5HvvIzov5vlhaXpgInmi6npgJrorq/lvZXnlYzpnaLjgIJcclxuICAgICAqIEBwYXJhbSB0aXRsZSBcclxuICAgICAqIEBwYXJhbSBpbWFnZVVybCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNoYXJlQXBwTWVzc2FnZSggZDphbnkgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaGFyZUFwcE1lc3NhZ2UoZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pi+56S65b2T5YmN6aG16Z2i55qE6L2s5Y+R5oyJ6ZKuXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvd1NoYXJlTWVudSggb2JqOmFueSA9IG51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93U2hhcmVNZW51KG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pu05paw6L2s5Y+R5bGe5oCnXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhcmVNZW51KCBvYmo6YW55ID0gbnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnVwZGF0ZVNoYXJlTWVudShvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYvuekuuW9k+WJjemhtemdoueahOi9rOWPkeaMiemSrlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvd01lbnUoKSBcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dTaGFyZU1lbnUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmnKzlnLDlrZjlgqhcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFN0b3JhZ2VTeW5jKGtleTpzdHJpbmcsIGRhdGE6YW55KSBcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eC5zZXRTdG9yYWdlU3luYyhrZXksIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmnKzlnLDlrZjlgqhcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdG9yYWdlU3luYyhrZXk6c3RyaW5nKTphbnkgXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHd4LmdldFN0b3JhZ2VTeW5jKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRVc2VyQ2xvdWRTdG9yYWdlKG9iaixjYWxsb2JqOmFueT1udWxsLCBzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb249bnVsbCxmYWlsQ2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsKSBcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCAmJiB3eC5zZXRVc2VyQ2xvdWRTdG9yYWdlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIERlYnVnZXIubG9nKCBcInNldFVzZXJDbG91ZFN0b3JhZ2VcIixvYmogKTtcclxuICAgICAgICAgICAgd3guc2V0VXNlckNsb3VkU3RvcmFnZSh7XHJcbiAgICAgICAgICAgICAgICBLVkRhdGFMaXN0OiBvYmosXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoc3VjY2VlZGNhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoIGNhbGxvYmoscmVzICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCBcInNldFVzZXJDbG91ZFN0b3JhZ2VcIixcIuS4iuS8oOaIkOWKn1wiICk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZhaWxDYWxsYmFjaylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxDYWxsYmFjay5jYWxsKCBjYWxsb2JqICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCBcInNldFVzZXJDbG91ZFN0b3JhZ2VcIixcIuS4iuS8oOWksei0pVwiICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYvuekuua2iOaBr+aPkOekuuahhlxyXG4gICAgICogQHBhcmFtIHdvcmQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b2FzdCh3b3JkOnN0cmluZyk6dm9pZCBcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dUb2FzdCh7IHRpdGxlOiB3b3JkIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWQkeW8gOaUvuaVsOaNruWfn+WPkemAgea2iOaBr1xyXG4gICAgICogQHBhcmFtIG9iaiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvc3RNZXNzYWdlKHN0cjpzdHJpbmcsZGF0YTphbnk9bnVsbCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIERlYnVnZXIubG9nKCBcInBvc3RNZXNzYWdlOlwiLHN0ciApO1xyXG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IHd4LmdldE9wZW5EYXRhQ29udGV4dCgpO1xyXG4gICAgICAgICAgICBjb250ZXh0LnBvc3RNZXNzYWdlKHsgYWN0aW9uOiBzdHIsZGF0YTpkYXRhIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIm+W7uuS4gOS4qiBJbm5lckF1ZGlvQ29udGV4dCDlrp7kvotcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZUlubmVyQXVkaW9Db250ZXh0KCk6YW55XHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIExheWEuQnJvd3Nlci53aW5kb3cud3guY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bns7vnu5/kv6Hmga9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFN5c3RlbUluZm9TeW5jKCk6YW55XHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpooTop4jlm77niYfvvIzosIPnlKjkuYvlkI7kvJrlnKjmlrDmiZPlvIDnmoTpobXpnaLkuK3lhajlsY/pooTop4jkvKDlhaXnmoTlm77niYfvvIzpooTop4jnmoTov4fnqIvkuK3nlKjmiLflj6/ku6Xov5vooYzkv53lrZjlm77niYfjgIHlj5HpgIHnu5nmnIvlj4vnrYnmk43kvZxcclxuICAgICAqIEBwYXJhbSBvYmogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwcmV2aWV3SW1hZ2Uob2JqKSBcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnByZXZpZXdJbWFnZShvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOebkeWQrOWwj+a4uOaIj+makOiXj+WIsOWQjuWPsOS6i+S7tuOAgumUgeWxj+OAgeaMiSBIT01FIOmUrumAgOWIsOahjOmdouOAgeaYvuekuuWcqOiBiuWkqemhtumDqOetieaTjeS9nOS8muinpuWPkeatpOS6i+S7tuOAglxyXG4gICAgICogQHBhcmFtIGNhbGxvYmogXHJcbiAgICAgKiBAcGFyYW0gc3VjY2VlZGNhbGxiYWNrIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25IaWRlKGNhbGxvYmo6YW55LCBzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uSGlkZShmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5pc1Nob3dpbmc9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZihzdWNjZWVkY2FsbGJhY2smJmNhbGxvYmopXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoY2FsbG9iaiwgcmVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDov5Tlm57lsI/nqIvluo/lkK/liqjlj4LmlbBcclxuICAgICAqIEBwYXJhbSBjYWxsb2JqIFxyXG4gICAgICogQHBhcmFtIHN1Y2NlZWRjYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldExhdW5jaE9wdGlvbnNTeW5jKCk6YW55XHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0TGF1bmNoT3B0aW9uc1N5bmMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOmakOiXj+a2iOaBr+aPkOekuuahhlxyXG4gICAgICogQHBhcmFtIG9iaiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhpZGVUb2FzdChvYmopOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmhpZGVUb2FzdChvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYvuekuuaooeaAgeWvueivneahhlxyXG4gICAgICogQHBhcmFtIG9iaiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNob3dNb2RhbChvYmopOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dNb2RhbChvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBcclxuXHJcbiAgICAvKipcclxuICAgICAqIOa4heeQhuWtmOWCqOaVsOaNrlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJTdG9yYWdlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guY2xlYXJTdG9yYWdlU3luYygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOS9v+aJi+acuuWPkeeUn+i+g+efreaXtumXtOeahOaMr+WKqO+8iDE1IG1z77yJXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmlicmF0ZVNob3J0KCkgXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC52aWJyYXRlU2hvcnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDku47mnKzlnLDnvJPlrZjkuK3np7vpmaTmjIflrpoga2V5XHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlU3RvcmFnZShrZXk6c3RyaW5nKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5yZW1vdmVTdG9yYWdlKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkF1ZGlvSW50ZXJydXB0aW9uQmVnaW4oKTp2b2lke1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4ICl7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25BdWRpb0ludGVycnVwdGlvbkJlZ2luKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICAvLyBTb3VuZHNzTWFuYWdlci5nZXRJbnN0YW5jZSgpLnBsYXliZ1NvdW5kKFwiYmdtXCIpO1xyXG4gICAgICAgICAgICAgICAgRGVidWdlci5sb2coIFwib25BdWRpb0ludGVycnVwdGlvbkJlZ2luXCIgKTtcclxuICAgICAgICAgICAgICAgIFNvdW5kc3NNYW5hZ2VyLmdldEluc3RhbmNlKCkuc3RvcEFsbCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQXVkaW9JbnRlcnJ1cHRpb25FbmQoKTp2b2lke1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4ICl7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25BdWRpb0ludGVycnVwdGlvbkVuZChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgRGVidWdlci5sb2coXCJvbkF1ZGlvSW50ZXJydXB0aW9uRW5kXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHd4Z2FtZXBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICAgICAgICAgIExheWEudGltZXIuY2xlYXIoIHd4Z2FtZXBsYXRmb3JtLHd4Z2FtZXBsYXRmb3JtLm9uQXVkaW9FbmRDYWxsYmFjayApO1xyXG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKCA1MDAsd3hnYW1lcGxhdGZvcm0sd3hnYW1lcGxhdGZvcm0ub25BdWRpb0VuZENhbGxiYWNrICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25BdWRpb0VuZENhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggUGxhdGZvcm1FdmVudC5QbGF0Zm9ybUV2ZW50X29uQXVkaW9JbnRlcnJ1cHRpb25FbmQgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmAgOWHuua4uOaIj1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXhpdEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3guZXhpdE1pbmlQcm9ncmFtKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5omT5byA5a6i5pyN5a+56K+d5qGGXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvcGVuQ3VzdG9tZXJTZXJ2aWNlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYgKHd4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZlcnNpb24gPSB3eC5nZXRTeXN0ZW1JbmZvU3luYygpLlNES1ZlcnNpb247XHJcbiAgICAgICAgICAgIGlmKCBHYW1lVXRpbHMuY29tcGFyZVZlcnNpb24odmVyc2lvbiwgJzIuMC4zJykgPj0gMCAmJiB3eC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ29udmVyc2F0aW9uIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgd3gub3BlbkN1c3RvbWVyU2VydmljZUNvbnZlcnNhdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2VDYXJkOnRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VJbWc6XCJodHRwczovL3Jlc291cmNlLjUxeW95b3lvLmNvbS9yZXMvd3hzZW5kbWVzc2FnZWltZy9zbWkuanBnXCJcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gQWxlcnRVdGlscy5zaG93V29yZFRpcHMoXCLlvZPliY3lvq7kv6HniYjmnKzkuI3mlK/mjIFcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnm5HlkKzlhoXlrZjkuI3otrPlkYroraZcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uTWVtb3J5V2FybmluZygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCAmJiB3eC5vbk1lbW9yeVdhcm5pbmcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3gub25NZW1vcnlXYXJuaW5nKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCdvbk1lbW9yeVdhcm5pbmdSZWNlaXZlJyk7Ly/mlLbliLDorablkYrvvIzlvLrliLbmuIXnkIbkuI3lv4XopoHnmoTotYTmupBcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRXJyb3IoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggJiYgd3gub25FcnJvciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eC5vbkVycm9yKGZ1bmN0aW9uKCByZXMgKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKipvbkVycm9yXCIscmVzKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG5vd1NoYXJlaW5kZXg6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBub3dzaGFyZU9iajphbnk7XHJcbiAgICBwdWJsaWMgbm93c2hhcmVzdWNjZWVkZnVuOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIG5vd3NoYXJlZmFpbGZ1bjpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBub3dzaGFyZWluZm86YW55O1xyXG4gICAgcHVibGljIHN0YXJ0U2hhcmVUaW1lOm51bWJlcjtcclxuICAgIHB1YmxpYyBpc1NoYXJlaW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHN0YXRpYyBjYWxsYmFja2ZhaWxzdGF0ZTpudW1iZXIgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiDlvIDlp4vliIbkuqtcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXJ0U2hhcmVBcHAoa2V5OnN0cmluZyxjYWxsb2JqOmFueT1udWxsLHN1Y2NlZWRDYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbiA9IG51bGwpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5ub3dTaGFyZWluZGV4PTA7XHJcbiAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLlNoYXJlRGljdFtrZXldIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFRvbmdqaUh0dHBzLmdldEluc3RhbmNlKCkudG9uZ2ppRGF0YSggXCJzaGFyZVwiLGtleSwxICk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hhcmVBcHAoIFdYR2FtZVBsYXRmb3JtLlNoYXJlRGljdFtrZXldLGNhbGxvYmosc3VjY2VlZENhbGxiYWNrLGZhaWxDYWxsYmFjayApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNoYXJlQXBwKGluZm86YW55LGNhbGxvYmo6YW55LCBzdWNjZXNzOiBGdW5jdGlvbixmYWlsQ2FsbGJhY2s6RnVuY3Rpb24pIFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubm93c2hhcmVPYmogPSBjYWxsb2JqO1xyXG4gICAgICAgIHRoaXMubm93c2hhcmVpbmZvID0gaW5mbztcclxuICAgICAgICB0aGlzLm5vd3NoYXJlc3VjY2VlZGZ1biA9IHN1Y2Nlc3M7XHJcbiAgICAgICAgdGhpcy5ub3dzaGFyZWZhaWxmdW4gPSBmYWlsQ2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5zdGFydFNoYXJlVGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICB0aGlzLmlzU2hhcmVpbmcgPSB0cnVlO1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmNhbGxiYWNrZmFpbHN0YXRlID0gMDtcclxuICAgICAgICB0aGlzLnNoYXJlQXBwTWVzc2FnZSh7XHJcbiAgICAgICAgICAgIHRpdGxlOmluZm8udGlsZSxpbWFnZVVybDpHbG9iYWwuY2RudXJsICsgaW5mby5pbWcscXVlcnk6XCJcIixcclxuICAgICAgICAgICAgc3VjY2VzczpmdW5jdGlvbiAocmVzKVxyXG4gICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICB9LCBcclxuICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKHJlcyl7XHJcbiAgICAgICAgICAgICAgICBXb3JkVGlwc1V0aWxzLmdldEluc3RhbmNlKCkuc2hvd1dvcmRUaXBzKFwi5oKo5Y+W5raI5LqG5YiG5LqrXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZhaWxDYWxsYmFjayAmJiBjYWxsb2JqICkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbENhbGxiYWNrLmNhbGwoY2FsbG9iaik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIFxyXG4gICAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmNhbGxiYWNrZmFpbHN0YXRlID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICAgICAgXHJcblxyXG4gICAgcHVibGljIHNob3dvYmo6YW55O1xyXG4gICAgcHVibGljIHNob3dDYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIC8qKlxyXG4gICAgICog55uR5ZCs5bCP5ri45oiP5Zue5Yiw5YmN5Y+w55qE5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gY2FsbG9iaiBcclxuICAgICAqIEBwYXJhbSBzdWNjZWVkY2FsbGJhY2sgXHJcbiAgICAgKiBAcGFyYW0gZmFpbENhbGxiYWNrIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25TaG93KGNhbGxvYmo6YW55PW51bGwsIHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbiA9IG51bGwpIFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2hvd29iaiA9IGNhbGxvYmo7XHJcbiAgICAgICAgdGhpcy5zaG93Q2FsbGJhY2sgPSBzdWNjZWVkY2FsbGJhY2s7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3gub25TaG93KGZ1bmN0aW9uIChyZXMpIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5pc1Nob3dpbmc9dHJ1ZTtcclxuICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCBcIm9uU2hvd1wiLHJlcyApO1xyXG4gICAgICAgICAgICAgICAgaWYoIHJlcyAmJiByZXMuc2NlbmUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmZyb21zY2VuZSA9IE51bWJlciggcmVzLnNjZW5lICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLmZyYW1lT25jZSggMSxXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkub25TaG93U3VjY2VlZCApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU2hvd1N1Y2NlZWQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4Z2FtZXBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICBpZiggd3hnYW1lcGxhdGZvcm0uc2hvd29iaiAmJiB3eGdhbWVwbGF0Zm9ybS5zaG93Q2FsbGJhY2sgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0uc2hvd0NhbGxiYWNrLmNhbGwoIHd4Z2FtZXBsYXRmb3JtLnNob3dvYmogKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHd4Z2FtZXBsYXRmb3JtLmlzU2hhcmVpbmcgKSAvL+WmguaenOaYr+WIhuS6q+eKtuaAgVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0uaXNTaGFyZWluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YXIgaXNTaGFyZVN1Y2NlZWQ6Ym9vbGVhbj1mYWxzZTtcclxuICAgICAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmNhbGxiYWNrZmFpbHN0YXRlPT0wICkgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBub3dUaW1lOm51bWJlciA9TGF5YS5Ccm93c2VyLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRpc1RpbWU6bnVtYmVyID0obm93VGltZSAtIHd4Z2FtZXBsYXRmb3JtLnN0YXJ0U2hhcmVUaW1lKS8xMDAwO1xyXG4gICAgICAgICAgICAgICAgaWYoIGRpc1RpbWU+PVdYR2FtZVBsYXRmb3JtLlNoYXJlVGltZSB8fCBXWEdhbWVQbGF0Zm9ybS5ub3dTaGFyZWluZGV4ID49IDMgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlzU2hhcmVTdWNjZWVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5jYWxsYmFja2ZhaWxzdGF0ZT0wO1xyXG4gICAgICAgICAgICBpZiggaXNTaGFyZVN1Y2NlZWQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggd3hnYW1lcGxhdGZvcm0ubm93c2hhcmVpbmZvIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBUb25namlIdHRwcy5nZXRJbnN0YW5jZSgpLnRvbmdqaURhdGEoIFwic2hhcmVlbmRcIix3eGdhbWVwbGF0Zm9ybS5ub3dzaGFyZWluZm8ua2V5LDEgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmRheVNoYXJlTnVtKys7XHJcbiAgICAgICAgICAgICAgICB3eGdhbWVwbGF0Zm9ybS51cGRhdGVEYXlTaGFyZUluZm8oKTtcclxuICAgICAgICAgICAgICAgIGlmKCB3eGdhbWVwbGF0Zm9ybS5ub3dzaGFyZU9iaiAmJiB3eGdhbWVwbGF0Zm9ybS5ub3dzaGFyZXN1Y2NlZWRmdW4gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHd4Z2FtZXBsYXRmb3JtLm5vd3NoYXJlc3VjY2VlZGZ1bi5jYWxsKCB3eGdhbWVwbGF0Zm9ybS5ub3dzaGFyZU9iaiApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0ubm93U2hhcmVpbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0uc2hvd01vZGFsKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIuaPkOekulwiLCBjb250ZW50OiBcIuivt+avj+asoeWIhuS6q+WIsOS4jeWQjOe+pCzmmK/lkKbph43mlrDliIbkuqvvvJ9cIiwgc2hvd0NhbmNlbDogdHJ1ZSwgY2FuY2VsVGV4dDogJ+WPlua2iCcsIGNvbmZpcm1UZXh0OiAn56Gu5a6aJyxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmNvbmZpcm0pIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLnNoYXJlQXBwKCB3eHBsYXRmb3JtLm5vd3NoYXJlaW5mbyx3eHBsYXRmb3JtLm5vd3NoYXJlT2JqLHd4cGxhdGZvcm0ubm93c2hhcmVzdWNjZWVkZnVuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0ubm93c2hhcmVmYWlsZnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB3eHBsYXRmb3JtLm5vd3NoYXJlZmFpbGZ1biAmJiB3eHBsYXRmb3JtLm5vd3NoYXJlT2JqIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLm5vd3NoYXJlZmFpbGZ1bi5jYWxsKCB3eHBsYXRmb3JtLm5vd3NoYXJlT2JqICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCBcclxuICAgICAgICAgICAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAoKSBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6ZnVuY3Rpb24oKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGxhc3RWaWRlb1RpbWU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgdmlkZW9BZDtcclxuICAgIHB1YmxpYyB2aWRlb2NhbGxvYmo6YW55O1xyXG4gICAgcHVibGljIHZpZGVvc3VjY2VlZENhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHJpdmF0ZSB2aWRlb2ZhaWxDYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBub3d2aWRlb2tleTpzdHJpbmc7XHJcbiAgICAgLyoqXHJcbiAgICAgKiDop4bpopHmmK/lkKblnKjmkq3mlL7kuK1cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHZpZGVvcGxheWluZzpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc3RhdGljIGlzdG9uZ2ppVmlkZW9OdW06Ym9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnnIvop4bpopHpooblpZblirFcclxuICAgICAqIEBwYXJhbSBjYWxsb2JqIFxyXG4gICAgICogQHBhcmFtIHN1Y2NlZWRjYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBsYXlWaWRlbygga2V5OnN0cmluZywgY2FsbG9iajphbnk9bnVsbCwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbENhbGxiYWNrOkZ1bmN0aW9uPW51bGwsaXN0b25namlOdW06Ym9vbGVhbiA9IHRydWUgKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4ICYmIHd4LmNyZWF0ZVJld2FyZGVkVmlkZW9BZCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggIVdYR2FtZVBsYXRmb3JtLnZpZGVvcGxheWluZyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB0aW1lOm51bWJlciA9IHRoaXMubG9ja1ZpZGVvTGVmdFRpbWUoKTtcclxuICAgICAgICAgICAgICAgIGlmKCB0aW1lID4gMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgV29yZFRpcHNVdGlscy5nZXRJbnN0YW5jZSgpLnNob3dXb3JkVGlwcyggXCLlub/lkYrlsJrmnKrlh4blpIflpb3vvIzor7dcIisgdGltZSArXCLnp5LlkI7lho3or5VcIiApO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggUGxhdGZvcm1FdmVudC5QbGF0Zm9ybUV2ZW50X2xvc2Vmb2N1cyApO1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uaXN0b25namlWaWRlb051bSA9IGlzdG9uZ2ppTnVtO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3d2aWRlb2tleSA9IGtleTtcclxuICAgICAgICAgICAgICAgIFRvbmdqaUh0dHBzLmdldEluc3RhbmNlKCkudG9uZ2ppRGF0YSggXCJWaWRlb1wiLGtleSwxICk7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS52aWRlb3BsYXlpbmc9dHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9jYWxsb2JqID0gY2FsbG9iajtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9zdWNjZWVkQ2FsbGJhY2sgPSBzdWNjZWVkY2FsbGJhY2s7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvZmFpbENhbGxiYWNrID0gZmFpbENhbGxiYWNrO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0FkID0gd3guY3JlYXRlUmV3YXJkZWRWaWRlb0FkKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkVW5pdElkOidhZHVuaXQtZGUwMDczODhkOGY4NmY3MSdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0FkLm9uQ2xvc2UodGhpcy5jbG9zZUFEKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9BZC5vbkVycm9yKCB0aGlzLm9uZXJybyApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0FkLmxvYWQoKS50aGVuKCgpID0+IHRoaXMudmlkZW9BZC5zaG93KCkpLmNhdGNoKGVyciA9PiB7IGNvbnNvbGUubG9nKGVyci5lcnJNc2cpLFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuZmFpbFZpZGVvKCkgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9ja1ZpZGVvTGVmdFRpbWUoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICB2YXIgdGltZTpudW1iZXIgPSAoTGF5YS5Ccm93c2VyLm5vdygpLVdYR2FtZVBsYXRmb3JtLmxhc3RWaWRlb1RpbWUpLzEwMDA7IFxyXG4gICAgICAgIHRpbWUgPSBXWEdhbWVQbGF0Zm9ybS5WaWRlb1RpbWUgLSB0aW1lO1xyXG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwodGltZSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgb25lcnJvKHJlcyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0udmlkZW9wbGF5aW5nPWZhbHNlO1xyXG4gICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvQWQub2ZmRXJyb3Iod3hnYW1lUGxhdGZvcm0ub25lcnJvKTsgLy/np7vpmaQg5LiN54S26KKr5aSa5qyh6LCD55SoXHJcbiAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9BZC5vZmZDbG9zZSh3eGdhbWVQbGF0Zm9ybS5jbG9zZUFEKTsgLy/np7vpmaQg5LiN54S26KKr5aSa5qyh6LCD55SoXHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBQbGF0Zm9ybUV2ZW50LlBsYXRmb3JtRXZlbnRfZ2V0Zm9jdXMgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlhbPpl63lub/lkYpcclxuICAgIHB1YmxpYyBjbG9zZUFEKHN0YXR1cyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmxhc3RWaWRlb1RpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgdmFyIHd4Z2FtZVBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICBpZiAoc3RhdHVzICYmIHN0YXR1cy5pc0VuZGVkIHx8IHN0YXR1cyA9PSB1bmRlZmluZWQpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmlzdG9uZ2ppVmlkZW9OdW0gKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bSsrO1xyXG4gICAgICAgICAgICAgICAgd3hnYW1lUGxhdGZvcm0udXBkYXRlRGF5VmlkZW9JbmZvKCk7XHJcbiAgICAgICAgICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIFBsYXRmb3JtRXZlbnQuUGxhdGZvcm1FdmVudF91cGRhdGVWaWRlb051bXMgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBUb25namlIdHRwcy5nZXRJbnN0YW5jZSgpLnRvbmdqaURhdGEoIFwiVmlkZW9lbmRcIix3eGdhbWVQbGF0Zm9ybS5ub3d2aWRlb2tleSwxICk7XHJcbiAgICAgICAgICAgIGlmKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogJiYgd3hnYW1lUGxhdGZvcm0udmlkZW9zdWNjZWVkQ2FsbGJhY2sgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb3N1Y2NlZWRDYWxsYmFjay5jYWxsKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gXHJcbiAgICAgICAgZWxzZSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFdvcmRUaXBzVXRpbHMuZ2V0SW5zdGFuY2UoKS5zaG93V29yZFRpcHMoIFwi5pyq6KeC55yL5a6M5pW06KeG6aKR77yM5peg5rOV6I635b6X5aWW5YqxXCIgKTtcclxuICAgICAgICAgICAgaWYoIHd4Z2FtZVBsYXRmb3JtLnZpZGVvY2FsbG9iaiAmJiB3eGdhbWVQbGF0Zm9ybS52aWRlb2ZhaWxDYWxsYmFjayApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvZmFpbENhbGxiYWNrLmNhbGwoIHd4Z2FtZVBsYXRmb3JtLnZpZGVvY2FsbG9iaiApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLnZpZGVvcGxheWluZz1mYWxzZTtcclxuICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb0FkLm9mZkVycm9yKHd4Z2FtZVBsYXRmb3JtLm9uZXJybyk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxyXG4gICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvQWQub2ZmQ2xvc2Uod3hnYW1lUGxhdGZvcm0uY2xvc2VBRCk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxyXG4gICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggUGxhdGZvcm1FdmVudC5QbGF0Zm9ybUV2ZW50X2dldGZvY3VzICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5bm/5ZGK5aSx6LSlXHJcbiAgICBwdWJsaWMgZmFpbFZpZGVvKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmxhc3RWaWRlb1RpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0udmlkZW9wbGF5aW5nPWZhbHNlO1xyXG4gICAgICAgIFdvcmRUaXBzVXRpbHMuZ2V0SW5zdGFuY2UoKS5zaG93V29yZFRpcHMoIFwi5bm/5ZGK5Yqg6L295aSx6LSlLOivleivleWIq+eahOaWueW8j+WQp35cIiApO1xyXG4gICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9BZC5vZmZFcnJvcih3eGdhbWVQbGF0Zm9ybS5vbmVycm8pOyAvL+enu+mZpCDkuI3nhLbooqvlpJrmrKHosIPnlKhcclxuICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb0FkLm9mZkNsb3NlKHd4Z2FtZVBsYXRmb3JtLmNsb3NlQUQpOyAvL+enu+mZpCDkuI3nhLbooqvlpJrmrKHosIPnlKhcclxuICAgICAgICBpZiggd3hnYW1lUGxhdGZvcm0udmlkZW9jYWxsb2JqICYmIHd4Z2FtZVBsYXRmb3JtLnZpZGVvZmFpbENhbGxiYWNrICkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb2ZhaWxDYWxsYmFjay5jYWxsKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBQbGF0Zm9ybUV2ZW50LlBsYXRmb3JtRXZlbnRfZ2V0Zm9jdXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNDYW5WaWRlbygpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW0gPCBXWEdhbWVQbGF0Zm9ybS5WaWRlb051bSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW0gPT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB2aWRlb2JzOm51bWJlciA9IE1hdGguZmxvb3IoV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW0vV1hHYW1lUGxhdGZvcm0uVmlkZW90b1NoYXJlKTtcclxuICAgICAgICAgICAgdmFyIHNoYXJlYnM6bnVtYmVyID0gTWF0aC5mbG9vcihXWEdhbWVQbGF0Zm9ybS5kYXlTaGFyZU51bS9XWEdhbWVQbGF0Zm9ybS5TaGFyZXRvVmlkZW8pO1xyXG4gICAgICAgICAgICBpZiggdmlkZW9icyA+IHNoYXJlYnMgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdmlkZW9icyA8IHNoYXJlYnMgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB2aWRlb3l1c2h1Om51bWJlciA9IFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtJVdYR2FtZVBsYXRmb3JtLlZpZGVvdG9TaGFyZTtcclxuICAgICAgICAgICAgICAgIGlmKCB2aWRlb3l1c2h1ICE9IDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIHNoYXJleXVzaHU6bnVtYmVyID0gV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW0lV1hHYW1lUGxhdGZvcm0uU2hhcmV0b1ZpZGVvO1xyXG4gICAgICAgICAgICAgICAgaWYoIHNoYXJleXVzaHUgIT0gMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmFubmVyUnVuVGltZTpudW1iZXI9MDtcclxuICAgIHByaXZhdGUgYmFubmVyQWQ7XHJcbiAgICBwdWJsaWMgbm93U3R5cGU6YW55O1xyXG4gICAgcHJpdmF0ZSBfYmFubmVyVHlwZUxpc3Q6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgcHVibGljIGNyZWF0ZUJhbm5lciggYmFubmVydHlwZTpzdHJpbmc9XCJcIixzdHlsZTphbnkpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggYmFubmVydHlwZSAhPSBcIlwiIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJvOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZvciggdmFyIGk6bnVtYmVyID0gMDtpIDwgdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoO2krKyApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIGJhbm5lcnR5cGUgPT0gdGhpcy5fYmFubmVyVHlwZUxpc3RbaV0udHlwZSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYW5uZXJUeXBlTGlzdFtpXS5zdHlsZSA9IHN0eWxlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSB0aGlzLl9iYW5uZXJUeXBlTGlzdC5zcGxpY2UoIGksMSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYW5uZXJUeXBlTGlzdC5wdXNoKCBhcnJbMF0gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiggIWJvIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYW5uZXJUeXBlTGlzdC5wdXNoKCB7IHR5cGU6YmFubmVydHlwZSxzdHlsZTpzdHlsZSB9ICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoPT0wIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW06YW55ID0gdGhpcy5fYmFubmVyVHlwZUxpc3RbdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlID0gaXRlbS5zdHlsZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5iYW5uZXJBZCkgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBub3cgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgICAgICAgICAvL+i2hei/hzPliIbpkp/liLfmlrBcclxuICAgICAgICAgICAgICAgIGlmIChub3cgLSB0aGlzLmJhbm5lclJ1blRpbWUgPiA2MDAwMCAqIDMpIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCBcIuWFiOenu+mZpGJhbm5lcizlho3mt7vliqBcIiApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQub2ZmRXJyb3IodGhpcy5iYW5uZXJFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5vZmZSZXNpemUodGhpcy5iYW5uZXJSZXNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuZGVzdG9yeSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTmV3QmFubmVyKHN0eWxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dCYW5uZXIoc3R5bGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU5ld0Jhbm5lcihzdHlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2NyZWVud2lkdGg6bnVtYmVyID0gMDtcclxuICAgIGJhbm5lcmhlaWdodDpudW1iZXIgPSAwO1xyXG4gICAgYmFubmVyd2lkdGg6bnVtYmVyID0gMDtcclxuICAgIGlzb25SZXNpemU6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlTmV3QmFubmVyKHN0eWxlOiBhbnkpIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCAmJiB3eC5jcmVhdGVCYW5uZXJBZCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0eXBlID0gc3R5bGU7XHJcbiAgICAgICAgICAgIHRoaXMuYmFubmVyUnVuVGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICAgICAgdmFyIGluZm8gPSB0aGlzLmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjcmVlbndpZHRoID0gaW5mby5zY3JlZW5XaWR0aDtcclxuICAgICAgICAgICAgdmFyIHNjYWxlOm51bWJlciA9IDE7XHJcbiAgICAgICAgICAgIGlmKCBzdHlsZS5oYXNPd25Qcm9wZXJ0eShcInNjYWxlXCIpIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2NhbGUgPSBzdHlsZS5zY2FsZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmJhbm5lckFkID0gd3guY3JlYXRlQmFubmVyQWQoe1xyXG4gICAgICAgICAgICAgICAgYWRVbml0SWQ6ICdhZHVuaXQtNmVjMjY4OGFkZmFmNWEzNCcsXHJcbiAgICAgICAgICAgICAgICBhZEludGVydmFsczozMCxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IGluZm8uc2NyZWVuSGVpZ2h0IC0gMTA1LFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpbmZvLnNjcmVlbldpZHRoICogc2NhbGVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJhbm5lckFkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLm9uRXJyb3IodGhpcy5iYW5uZXJFcnJvcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dCYW5uZXIoc3R5bGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmFubmVyUmVzaXplKCByZXMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRGVidWdlci5sb2coIFwiYmFubmVyUmVzaXplXCIscmVzICk7XHJcbiAgICAgICAgdmFyIHNlbGYgPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIHNlbGYuYmFubmVyQWQub2ZmUmVzaXplKHNlbGYuYmFubmVyUmVzaXplKTtcclxuICAgICAgICBzZWxmLmlzb25SZXNpemUgPSBmYWxzZTtcclxuICAgICAgICB2YXIgbm93c3R5cGU6YW55ID0gc2VsZi5ub3dTdHlwZTtcclxuICAgICAgICBpZiggIW5vd3N0eXBlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGluZm8gPSBzZWxmLmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgdmFyIHBlcmNlbnRhZ2VIOm51bWJlciA9IExheWEuQnJvd3Nlci5jbGllbnRIZWlnaHQvTGF5YS5zdGFnZS5kaXNwbGF5SGVpZ2h0O1xyXG4gICAgICAgIHZhciBwZXJjZW50YWdlVzpudW1iZXIgPSBMYXlhLkJyb3dzZXIuY2xpZW50V2lkdGgvTGF5YS5zdGFnZS5kaXNwbGF5V2lkdGg7XHJcbiAgICAgICAgc2VsZi5iYW5uZXJ3aWR0aCA9IHJlcy53aWR0aDtcclxuICAgICAgICBzZWxmLmJhbm5lcmhlaWdodCA9IHJlcy5oZWlnaHQ7XHJcbiAgICAgICAgaWYoIG5vd3N0eXBlLmhhc093blByb3BlcnR5KFwieFwiKSAmJiBub3dzdHlwZS54ICE9IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc2VsZi5iYW5uZXJBZC5zdHlsZS5sZWZ0ID0gbm93c3R5cGUueCAqIHBlcmNlbnRhZ2VXO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzZWxmLmJhbm5lckFkLnN0eWxlLmxlZnQgPSAoaW5mby53aW5kb3dXaWR0aCAtIHJlcy53aWR0aCkgKiAwLjU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCBub3dzdHlwZS5oYXNPd25Qcm9wZXJ0eShcInlcIikgJiYgbm93c3R5cGUueSAhPSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNlbGYuYmFubmVyQWQuc3R5bGUudG9wID0gbm93c3R5cGUueSAqIHBlcmNlbnRhZ2VIO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzZWxmLmJhbm5lckFkLnN0eWxlLnRvcCA9IChpbmZvLndpbmRvd0hlaWdodCAtIHJlcy5oZWlnaHQpIC0gMTU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmFubmVyRXJyb3IoZXJyOmFueSk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERlYnVnZXIubG9nKGVycik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzaG93QmFubmVyKCBzdHlsZSApIHtcclxuICAgICAgICBpZiAodGhpcy5iYW5uZXJBZCkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0eXBlID0gc3R5bGU7XHJcbiAgICAgICAgICAgIHZhciBpbmZvID0gdGhpcy5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCJnZXRTeXN0ZW1JbmZvU3luYzpcIixpbmZvICk7XHJcbiAgICAgICAgICAgIHZhciBub3dzdHlwZTphbnkgPSB0aGlzLm5vd1N0eXBlO1xyXG4gICAgICAgICAgICB2YXIgc2NhbGU6bnVtYmVyID0gMTtcclxuICAgICAgICAgICAgaWYoIG5vd3N0eXBlLmhhc093blByb3BlcnR5KFwic2NhbGVcIikgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzY2FsZSA9IG5vd3N0eXBlLnNjYWxlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBwZXJjZW50YWdlSDpudW1iZXIgPSBMYXlhLkJyb3dzZXIuY2xpZW50SGVpZ2h0L0xheWEuc3RhZ2UuZGlzcGxheUhlaWdodDtcclxuICAgICAgICAgICAgdmFyIHBlcmNlbnRhZ2VXOm51bWJlciA9IExheWEuQnJvd3Nlci5jbGllbnRXaWR0aC9MYXlhLnN0YWdlLmRpc3BsYXlXaWR0aDtcclxuICAgICAgICAgICAgaWYoIG5vd3N0eXBlLmhhc093blByb3BlcnR5KFwieFwiKSAmJiBub3dzdHlwZS54ICE9IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLnN0eWxlLmxlZnQgPSBub3dzdHlwZS54ICogcGVyY2VudGFnZVc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLnN0eWxlLmxlZnQgPSAoaW5mby53aW5kb3dXaWR0aCAtIHRoaXMuYmFubmVyd2lkdGgpICogMC41O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCBub3dzdHlwZS5oYXNPd25Qcm9wZXJ0eShcInlcIikgJiYgbm93c3R5cGUueSAhPSAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5zdHlsZS50b3AgPSBub3dzdHlwZS55ICogcGVyY2VudGFnZUg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLnN0eWxlLnRvcCA9IChpbmZvLndpbmRvd0hlaWdodCAtIHRoaXMuYmFubmVyaGVpZ2h0KSAtIDE1O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuc3R5bGUud2lkdGggPSBpbmZvLnNjcmVlbldpZHRoICogc2NhbGU7XHJcbiAgICAgICAgICAgIGlmKCAhdGhpcy5pc29uUmVzaXplIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc29uUmVzaXplID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQub25SZXNpemUodGhpcy5iYW5uZXJSZXNpemUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGlkZUJhbm5lciggdHlwZTpzdHJpbmcgPSBcIlwiICkge1xyXG4gICAgICAgIGlmICh0aGlzLmJhbm5lckFkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdHlwZSAhPSBcIlwiIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciggdmFyIGk6bnVtYmVyID0gMDtpIDwgdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoO2krKyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0eXBlID09IHRoaXMuX2Jhbm5lclR5cGVMaXN0W2ldLnR5cGUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Jhbm5lclR5cGVMaXN0LnNwbGljZSggaSwxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX2Jhbm5lclR5cGVMaXN0Lmxlbmd0aCA+IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbTphbnkgPSB0aGlzLl9iYW5uZXJUeXBlTGlzdFt0aGlzLl9iYW5uZXJUeXBlTGlzdC5sZW5ndGgtMV07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUJhbm5lciggaXRlbS50eXBlLGl0ZW0uc3R5bGUgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaOkuihjOamnOaJk+W8gOexu+Wei+WtmOWCqFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9vcGVucmFua0RpY3Q6YW55PXt9O1xyXG4gICAgLy8gcHJpdmF0ZSBfd3hPcGVuRGF0YVZpZXdlcjpXWE9wZW5EYXRhVmlld2VyO1xyXG4gICAgLyoqXHJcbiAgICAgKiDmiZPlvIDlpb3lj4vmjpLooYzmppxcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9wZW5GcmllbmRSYW5rKCB0eXBlOnN0cmluZyx2aWV3VHlwZTpzdHJpbmcscmVjdDpMYXlhLlJlY3RhbmdsZSxwYXJlbnQ6TGF5YS5TcHJpdGUgPSBudWxsLGRhdGE6YW55ID0gbnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNsb3Nleml5dVN0YWdlKCk7XHJcbiAgICAgICAgdGhpcy5fb3BlbnJhbmtEaWN0W3ZpZXdUeXBlXSA9IHt0eXBlOnR5cGUsdmlld1R5cGU6dmlld1R5cGUscmVjdDpyZWN0LHBhcmVudDpwYXJlbnQsZGF0YTpkYXRhfTtcclxuICAgICAgICB0aGlzLmluaXR6aXl1U3RhZ2UocmVjdCxwYXJlbnQpO1xyXG4gICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoIHR5cGUsZGF0YSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o6S6KGM5qac5omT5byA54q25oCB5pe25YCZ77yM5YiH5o2i5pi+56S657G75Z6LXHJcbiAgICAgKiBAcGFyYW0gdHlwZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNoYW5nZUZyaWVuZFJhbmsoIHR5cGU6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoIHR5cGUgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaOkuihjOamnOS4iuS4gOmhtVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJlUGFnZVJhbmsoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSggUmFua1R5cGUucHJlcGFnZSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o6S6KGM5qac5LiL5LiA6aG1XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZXh0UGFnZVJhbmsoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSggUmFua1R5cGUubmV4dHBhZ2UgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWFs+mXreWlveWPi+aOkuihjOamnFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xvc2VGcmllbmRSYW5rKCB2aWV3VHlwZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSggUmFua1R5cGUuY2xvc2VmcmllbmRyYW5rICk7XHJcbiAgICAgICAgdGhpcy5jbG9zZXppeXVTdGFnZSgpO1xyXG4gICAgICAgIGlmKCB0aGlzLl9vcGVucmFua0RpY3Rbdmlld1R5cGVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9vcGVucmFua0RpY3Rbdmlld1R5cGVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IoIHZhciBzIGluIHRoaXMuX29wZW5yYW5rRGljdCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaXRlbWQ6YW55ID0gdGhpcy5fb3BlbnJhbmtEaWN0W3NdO1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5GcmllbmRSYW5rKCBpdGVtZC50eXBlLGl0ZW1kLnZpZXdUeXBlLGl0ZW1kLnJlY3QsaXRlbWQucGFyZW50LGl0ZW1kLmRhdGEgKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5a2Q5Z+fXHJcbiAgICAgKiBAcGFyYW0gcmVjdCBcclxuICAgICAqIEBwYXJhbSBwYXJlbnQgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdHppeXVTdGFnZSggcmVjdDpMYXlhLlJlY3RhbmdsZSxwYXJlbnQ6TGF5YS5TcHJpdGUgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gaWYoICF0aGlzLl93eE9wZW5EYXRhVmlld2VyIClcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIgPSBuZXcgV1hPcGVuRGF0YVZpZXdlcigpO1xyXG4gICAgICAgIC8vICAgICBpZiggcGFyZW50IClcclxuICAgICAgICAvLyAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgcGFyZW50LmFkZENoaWxkKCB0aGlzLl93eE9wZW5EYXRhVmlld2VyICk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgICAgZWxzZVxyXG4gICAgICAgIC8vICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICBHYW1lTGF5ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkudG9wTGF5ZXIuZGlzcGxheU9iamVjdC5hZGRDaGlsZCggdGhpcy5fd3hPcGVuRGF0YVZpZXdlciApO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIueCA9IHJlY3QueDtcclxuICAgICAgICAvLyB0aGlzLl93eE9wZW5EYXRhVmlld2VyLnkgPSByZWN0Lnk7XHJcbiAgICAgICAgLy8gdGhpcy5fd3hPcGVuRGF0YVZpZXdlci53aWR0aCA9IHJlY3Qud2lkdGg7XHJcbiAgICAgICAgLy8gdGhpcy5fd3hPcGVuRGF0YVZpZXdlci5oZWlnaHQgPSByZWN0LmhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmUgOavgeWtkOWfn1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNsb3Nleml5dVN0YWdlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIC8vIGlmKCB0aGlzLl93eE9wZW5EYXRhVmlld2VyIClcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIC8vICAgICB0aGlzLl93eE9wZW5EYXRhVmlld2VyLnJlbW92ZVNlbGYoKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5fd3hPcGVuRGF0YVZpZXdlciA9IG51bGw7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pWw5o2u5LiK5Lyg77yI55So5LqO5o6S6KGM5qac5pWw5o2u5pi+56S677yJXHJcbiAgICAgKiBAcGFyYW0gcGFyYW0xIOS4iuaKpeaVsOaNrlxyXG4gICAgICogQHBhcmFtIHBhcmFtMiDkuIrmiqXmlbDmja5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0b3JlVG9DbG91ZChwYXJhbTE6bnVtYmVyLHBhcmFtMjpudW1iZXIpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgY2FjaGVNYWdlcjpDYWNoZU1hbmFnZXIgPSBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICB2YXIgc2NvcmUxOm51bWJlciA9IGNhY2hlTWFnZXIuZ2V0bnVtKCBcInBhcmFtMVwiICk7XHJcbiAgICAgICAgLy8gdmFyIHNjb3JlMjpudW1iZXIgPSBjYWNoZU1hZ2VyLmdldG51bSggXCJwYXJhbTJcIiApO1xyXG4gICAgICAgIHBhcmFtMSA9IE1hdGguZmxvb3IocGFyYW0xKTtcclxuICAgICAgICBwYXJhbTIgPSBNYXRoLmZsb29yKHBhcmFtMik7XHJcbiAgICAgICAgdmFyIHJlc3VsdDE6bnVtYmVyID0gcGFyYW0xO1xyXG4gICAgICAgIHZhciByZXN1bHQyOm51bWJlciA9IHBhcmFtMjtcclxuXHJcbiAgICAgICAgaWYoIHJlc3VsdDEgPCBzY29yZTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmVzdWx0MSA9IHNjb3JlMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FjaGVNYWdlci5hZGRzdHIoIFwicGFyYW0xXCIscmVzdWx0MS50b1N0cmluZygpICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIGFyci5wdXNoKCB7IGtleTpcInBhcmFtMVwiLHZhbHVlOnJlc3VsdDEudG9TdHJpbmcoKSB9ICk7XHJcbiAgICAgICAgYXJyLnB1c2goIHsga2V5OlwicGFyYW0yXCIsdmFsdWU6cmVzdWx0MiArIFwiXCIgfSApO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcInN0b3JlVG9DbG91ZFwiLCBhcnIpO1xyXG4gICAgICAgIHRoaXMuc2V0VXNlckNsb3VkU3RvcmFnZShhcnIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnYW1lY2x1YkJ1dHRvbjphbnk7XHJcbiAgICBwdWJsaWMgY3JlYXRlR2FtZUNsdWJCdXR0b24oIHN0eWxlOmFueSxpY29uOnN0cmluZyA9IFwiZ3JlZW5cIiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3g6YW55ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggJiYgc3R5bGUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3R5bGUud2lkdGggPSA0MDtcclxuICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gNDA7XHJcbiAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdhbWVjbHViQnV0dG9uID0gd3guY3JlYXRlR2FtZUNsdWJCdXR0b24oXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogaWNvbixcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBpZihXWEdhbWVQbGF0Zm9ybS5nYW1lY2x1YkJ1dHRvbilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2FtZWNsdWJCdXR0b24uc2hvdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgfVxyXG59XHJcblxyXG4iLCJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4vU2RrXCI7XG5pbXBvcnQgeyBZUVNkayB9IGZyb20gXCIuL1lRU2RrXCI7XG5pbXBvcnQgeyBTaGFyZVV0aWwgfSBmcm9tIFwiLi9TaGFyZVV0aWxcIjtcbmltcG9ydCB7IFBsYXllckFjY291bnQgfSBmcm9tIFwiLi9QbGF5ZXJBY2NvdW50XCI7XG5cbmV4cG9ydCBjbGFzcyBXeEdhbWVJdGVtXG57XG4gICAgYXBwTmFtZUhpZGRlbjpib29sZWFuID0gZmFsc2U7XG4gICAgY29sb3I6c3RyaW5nID0gXCJDOTNCM0JGRlwiO1xuICAgIHNpemU6bnVtYmVyID0gMTAwO1xuICAgIGJvcmRlcldpZHRoOm51bWJlciA9IDUwO1xuICAgIGJvcmRlckNvbG9yOnN0cmluZyA9IFwiQTFBMEEwRkZcIjtcbiAgICBsZWZ0Om51bWJlcjtcbiAgICB0b3A6bnVtYmVyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHdWFuZ0dhbyBcbntcblxuICAgIHByaXZhdGUgc3RhdGljIGZzYWFzZmFmc3NmYTtcblxuICAgIHByaXZhdGUgc3RhdGljIGN1cmJhbm5lcjtcblxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHZpZGVsQWRVbml0SWQgPSBcImFkdW5pdC1hOTIwM2IyMDgwY2JiNWRkXCI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgYmFubmVyQWRVbml0SWQgPSBcImFkdW5pdC00MTk5OGFiNDBjODY0YTQ1XCI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgYWZzZnNhYWZzZnNhOiBib29sZWFuID0gZmFsc2U7XG4gICAgLy/op4blsY/lub/lkYrmmK/lkKbliqDovb3miJDlip9cbiAgICBwcml2YXRlIHN0YXRpYyBhc2Zhc2ZzYWZmc2E6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHN0YXRpYyBnZXQgaGFzYmFubmVyKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgaWYoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5iYW5uZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBoYXN2aWRlbygpOmJvb2xlYW5cbiAgICB7XG4gICAgICAgIGlmKExheWEuQnJvd3Nlci5vbldlaVhpbiAmJiBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnZpZGVvKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgdmlkZW9udW0gPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkdldEdsb2JlXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8v6aKE5YWI5Yqg6L296KeG5bGP5bm/5ZGKXG4gICAgcHVibGljIHN0YXRpYyBJbml0VmlkZW8oKVxuICAgIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4gfHwgIVBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEudmlkZW8pIHJldHVybjtcblxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmJhbm5lckFkVW5pdElkKTtcblxuICAgICAgICAvL3ZlZGlvXG4gICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jcmVhdGVSZXdhcmRlZFZpZGVvQWQoeyBhZFVuaXRJZDogdGhpcy52aWRlbEFkVW5pdElkIH0pO1xuXG4gICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLm9uTG9hZCgoKSA9PiBcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ+a/gOWKseinhumikSDlub/lkYrliqDovb3miJDlip8nKTtcbiAgICAgICAgICAgIHRoaXMuYXNmYXNmc2FmZnNhID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEub25FcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmv4DlirHop4blsY/liqDovb3lpLHotKU6XCIgKyBlcnIpO1xuICAgICAgICAgICAgdGhpcy5hc2Zhc2ZzYWZmc2EgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZnNmc2FhZnNmc2EgPSB0cnVlO1xuICAgIH1cblxuICAgIC8v55yL6KeG6aKRXG4gICAgcHVibGljIHN0YXRpYyBTaG93VmlkZW8oY2FsbGJhY2s6IEZ1bmN0aW9uKSBcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmhhc3ZpZGVvKSBcbiAgICAgICAge1xuICAgICAgICAgICAgaWYodGhpcy5hc2Zhc2ZzYWZmc2EpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgWVFTZGsuc3RhdGlzdGljczEoXCJ2aWRlb1wiKTtcblxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzaG93VmlkZW9BZDpcIiArIHRoaXMuYXNmYXNmc2FmZnNhKTtcblxuICAgICAgICAgICAgdGhpcy5TZXRWaWRlb0NhbGxCYWNrKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEuc2hvdygpLmNhdGNoKGVyciA9PiBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLmxvYWQoKS50aGVuKCgpID0+IFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNldFZpZGVvQ2FsbEJhY2soY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgU2hhcmVVdGlsLnNoYXJlSW1hZ2UoXCLop4bpopHmsqHmnInliIbkuqtcIiwgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgLCBcIjFcIik7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgXG4gICAgICAgIH0gXG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY2FsbGJhY2soZmFsc2UpO1xuICAgICAgICAgICAgU2hhcmVVdGlsLnNoYXJlSW1hZ2UoXCLop4bpopHmsqHmnInliIbkuqtcIiwgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgLCBcIjFcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBTZXRWaWRlb0NhbGxCYWNrKGNhbGxiYWNrOkZ1bmN0aW9uKVxuICAgIHtcbiAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEub2ZmQ2xvc2UoKTtcbiAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEub25DbG9zZShyZXMgPT4gXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5r+A5Yqx6KeG6aKR5YWz6ZetOlwiK3Jlcy5pc0VuZGVkKTtcbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmlzRW5kZWQgfHwgcmVzID09PSB1bmRlZmluZWQpIHtjYWxsYmFjayAmJiBjYWxsYmFjayh0cnVlKX1cbiAgICAgICAgICAgIGVsc2UgeyBjYWxsYmFjayAmJiBjYWxsYmFjayhmYWxzZSkgfVxuICAgICAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEub2ZmQ2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNhbnNob3diYW5uZXIgPSB0cnVlO1xuICAgIC8v5omT5byAYmFubmVyXG4gICAgcHVibGljIHN0YXRpYyBPcGVuQmFubmVyKGdhcDogbnVtYmVyID0gMCxjYWxsVmFjazogRnVuY3Rpb24gPSBudWxsLCBpc3dhaXQ6IGJvb2xlYW4gPSBmYWxzZSkgXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMuaGFzYmFubmVyKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYWxsVmFjayhudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBcblxuICAgICAgICBpZighTGF5YS5Ccm93c2VyLm9uV2VpWGluKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYWxsVmFjayhudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2Fuc2hvd2Jhbm5lciA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICB2YXIgaWRkID0gdGhpcy5iYW5uZXJBZFVuaXRJZDtcbiAgICAgICAgY29uc29sZS5sb2coXCJhZFVuaXRJZDpcIitpZGQpO1xuICAgICAgICBsZXQgbmV3QmFubmVyID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jcmVhdGVCYW5uZXJBZCh7XG4gICAgICAgICAgICBhZFVuaXRJZDogaWRkLFxuICAgICAgICAgICAgc3R5bGU6IFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIHdpZHRoOiA0NjBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG5ld0Jhbm5lci5vbkVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgICAgY2FsbFZhY2sobnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICBuZXdCYW5uZXIub25Mb2FkKCgpID0+IFxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJiYW5uZXIpIHRoaXMuY3VyYmFubmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyID0gbmV3QmFubmVyO1xuICAgICAgICAgICAgdmFyIGhpZ2h0OiBudW1iZXIgPSB0aGlzLkdldFJlYWxIaWdodChnYXApO1xuXG4gICAgICAgICAgICBpZiAoY2FsbFZhY2sgIT0gbnVsbCkgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FsbFZhY2soaGlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5jYW5zaG93YmFubmVyICYmICFpc3dhaXQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc2hvdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBHZXRSZWFsSGlnaHQoZ2FwKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSBcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGluZm8gPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XG4gICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zdHlsZS53aWR0aCA9IGluZm8ud2luZG93V2lkdGg7XG5cbiAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnN0eWxlLnRvcCA9IGluZm8ud2luZG93SGVpZ2h0IC0gdGhpcy5jdXJiYW5uZXIuc3R5bGUucmVhbEhlaWdodCAtIGdhcDtcbiAgICAgICAgICAgIHJldHVybiBMYXlhLnN0YWdlLmhlaWdodCAvIGluZm8ud2luZG93SGVpZ2h0ICogdGhpcy5jdXJiYW5uZXIuc3R5bGUucmVhbEhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vY2xlYXJcbiAgICBzdGF0aWMgQ2xlYXIoKVxuICAgIHtcbiAgICAgICAgTGF5YS50aW1lci5jbGVhckFsbCh0aGlzKTtcbiAgICAgICAgTGF5YS5Ud2Vlbi5jbGVhckFsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5jYW5zaG93YmFubmVyID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmN1cmJhbm5lcikgdGhpcy5jdXJiYW5uZXIuaGlkZSgpO1xuICAgICAgICBZUVNkay5IaWRlQmFubmVySW1hZ2UoKTtcbiAgICAgICAgLy8gaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcbiAgICAgICAgLy8gaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoaWRlYmFubmVyKCkgXG4gICAge1xuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5jdXJiYW5uZXIpIHRoaXMuY3VyYmFubmVyLmhpZGUoKTtcbiAgICAgICAgWVFTZGsuSGlkZUJhbm5lckltYWdlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2hvd2Jhbm5lcigpIFxuICAgIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5zaG93KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgY2FuY2hlYXQoKTpib29sZWFuXG5cdHtcbiAgICAgICAgaWYoIVBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuY2hlYXQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2hlYXQ6ZmFsc2UtPiBDdXJBY2NvdW50RGF0YS5jaGVhdCAhPSAxXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cdFx0dmFyIGNoZWNrc2NlbmNlID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5jaGVja3NjZW5jZTtcbiAgICAgICAgaWYgKGNoZWNrc2NlbmNlID09IGZhbHNlKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImNoZWF0OnRydWUtPiBcIiArIFd4QXBpLnNjZW5lVmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDM3XCIgfHwgV3hBcGkuc2NlbmVWYWx1ZSA9PSBcIjEwNThcInx8IFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDY3XCIgfHwgV3hBcGkuc2NlbmVWYWx1ZSA9PSBcIjEwOTVcIikgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2hlYXQ6dHJ1ZS0+IFwiICsgV3hBcGkuc2NlbmVWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhcImNoZWF0OmZhbHNlLT4gXCIgKyBXeEFwaS5zY2VuZVZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIHN0YXRpYyBnZXQgQ2FuQ3JlYXRXeEJhbm5lclJlKCk6Ym9vbGVhblxuICAgIC8vIHtcbiAgICAvLyAgICAgaWYoIU1haW4uV1gpcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgICBpZighQWNjb3VudC5JbnN0YW5jZS5jdXJwbGF5ZXJEYXRhLld4UmUpcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgICBsZXQgaW5mbyA9IExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcbiAgICAvLyAgICAgaWYoIXRoaXMuY3BWZXJzaW9uR3JlYXRlck9yRXF1YWwoaW5mby5TREtWZXJzaW9uLFwiMi43LjVcIikpcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyB9XG5cbiAgICAvLyBzdGF0aWMgZ2V0IENhbkNyZWF0V3hHYW1lUmUoKTpib29sZWFuXG4gICAgLy8ge1xuICAgIC8vICAgICBpZighTWFpbi5XWClyZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgIGlmKCFBY2NvdW50Lkluc3RhbmNlLmN1cnBsYXllckRhdGEuV3hSZSlyZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgIGxldCBpbmZvID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xuICAgIC8vICAgICBpZighdGhpcy5jcFZlcnNpb25HcmVhdGVyT3JFcXVhbChpbmZvLlNES1ZlcnNpb24sXCIyLjguM1wiKSlyZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgIC8vIH1cbiAgICBcbiAgICAvLyBzdGF0aWMgd3hyZWJhbm5lcmlkID0gXCJQQmdBQV8yQUJEWkZSeVl3XCI7XG4gICAgLy8gc3RhdGljIHd4YmFubmVyOmFueTtcbiAgICAvLyBzdGF0aWMgU2hvd1hXQmFubmVyKClcbiAgICAvLyB7XG4gICAgLy8gICAgIGlmICghTWFpbi5XWCkgcmV0dXJuO1xuICAgIC8vICAgICB2YXIgaWRkID0gdGhpcy53eHJlYmFubmVyaWQ7XG5cbiAgICAvLyAgICAgbGV0IG5ld0Jhbm5lciA9IExheWEuQnJvd3Nlci53aW5kb3cud3guY3JlYXRlR2FtZUJhbm5lcih7XG4gICAgLy8gICAgICAgICBhZFVuaXRJZDogaWRkLFxuICAgIC8vICAgICAgICAgc3R5bGU6IFxuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgLy8gICAgICAgICAgICAgdG9wOiAwLFxuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9KTtcbiAgICAvLyAgICAgbmV3QmFubmVyLm9uRXJyb3IoZXJyID0+IHtcbiAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgICBuZXdCYW5uZXIub25Mb2FkKCgpID0+IFxuICAgIC8vICAgICB7XG4gICAgLy8gICAgICAgICBpZiAodGhpcy53eGJhbm5lcikgdGhpcy53eGJhbm5lci5kZXN0cm95KCk7XG4gICAgLy8gICAgICAgICB0aGlzLnd4YmFubmVyID0gbmV3QmFubmVyO1xuICAgIC8vICAgICAgICAgdGhpcy53eGJhbm5lci5zaG93KCk7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH1cblxuICAgIC8vIHN0YXRpYyB3eHJlZ2FtZWlkID0gXCJQQmdBQV8yQUJEWktWSWxNXCI7XG4gICAgLy8gc3RhdGljIHd4Z2FtZTphbnk7XG4gICAgLy8gc3RhdGljIFNob3dYV0dhbWUoKVxuICAgIC8vIHtcbiAgICAvLyAgICAgaWYgKCFNYWluLldYIHx8ICF0aGlzLkNhbkNyZWF0V3hHYW1lUmUpIHJldHVybjtcbiAgICAvLyAgICAgdmFyIGlkZCA9IHRoaXMud3hyZWdhbWVpZDtcblxuICAgIC8vICAgICBsZXQgaW5mbyA9IExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcbiAgICAgICAgXG4gICAgLy8gICAgIHZhciBnYW1lMSA9IG5ldyBXeEdhbWVJdGVtKCk7XG4gICAgLy8gICAgIGdhbWUxLnRvcCA9IGluZm8ud2luZG93SGVpZ2h0ICogMC4zO1xuICAgIC8vICAgICBnYW1lMS5sZWZ0ID0gaW5mby53aW5kb3dXaWR0aCAtIDgwO1xuXG4gICAgLy8gICAgIHZhciBnYW1lcyA9IFtnYW1lMV07XG5cbiAgICAvLyAgICAgbGV0IG5ld0dhbWUgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNyZWF0ZUdhbWVJY29uKHtcbiAgICAvLyAgICAgICAgIGFkVW5pdElkOiBpZGQsXG4gICAgLy8gICAgICAgICBjb3VudDogMSxcbiAgICAvLyAgICAgICAgIHN0eWxlOiBnYW1lc1xuICAgIC8vICAgICB9LGdhbWUxKTtcbiAgICAvLyAgICAgbmV3R2FtZS5vbkVycm9yKGVyciA9PiB7XG4gICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgIC8vICAgICB9KTtcbiAgICAvLyAgICAgbmV3R2FtZS5vbkxvYWQoKCkgPT4gXG4gICAgLy8gICAgIHtcbiAgICAvLyAgICAgICAgIGlmICh0aGlzLnd4Z2FtZSkgdGhpcy53eGdhbWUuZGVzdHJveSgpO1xuICAgIC8vICAgICAgICAgdGhpcy53eGdhbWUgPSBuZXdHYW1lO1xuICAgIC8vICAgICAgICAgdGhpcy53eGdhbWUuc2hvdygpO1xuICAgIC8vICAgICB9KTtcbiAgICAvLyB9XG5cbiAgICBzdGF0aWMgYmFubmVyaGlndCA9IDA7XG4gICAgcHVibGljIHN0YXRpYyBTZXRQb3NCYW5uZXIoYnRuOkxheWEuVUlDb21wb25lbnQsY29tcGxldGU6RnVuY3Rpb24pXG4gICAge1xuICAgICAgICBpZihMYXlhLkJyb3dzZXIub25QQylcbiAgICAgICAge1xuICAgICAgICAgICAgY29tcGxldGUoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGluZm8gPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XG4gICAgICAgIC8vY29uc29sZS5sb2coaW5mbyk7XG4gICAgICAgIC8vY29uc29sZS5sb2coYnRuKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhidG4ueSxMYXlhLnN0YWdlLmhlaWdodCxpbmZvLndpbmRvd0hlaWdodCk7XG4gICAgICAgIHZhciByZXNoaWdodCA9IGJ0bi55ICogaW5mby53aW5kb3dIZWlnaHQgLyBMYXlhLnN0YWdlLmhlaWdodDtcblxuICAgICAgICAvL2NvbnNvbGUubG9nKFwicmVzaGlnaHRcIixyZXNoaWdodCk7XG5cbiAgICAgICAgdmFyIGlkZCA9IHRoaXMuYmFubmVyQWRVbml0SWQ7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiYWRVbml0SWQ6XCIraWRkKTtcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5kZXN0cm95KCk7XG4gICAgICAgIGxldCBuZXdCYW5uZXIgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNyZWF0ZUJhbm5lckFkKHtcbiAgICAgICAgICAgIGFkVW5pdElkOiBpZGQsXG4gICAgICAgICAgICBzdHlsZTogXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDcyMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbmV3QmFubmVyLm9uRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICBjb21wbGV0ZShmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgbmV3QmFubmVyLm9uTG9hZCgoKSA9PiBcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIgPSBuZXdCYW5uZXI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnN0eWxlLnRvcCA9IHJlc2hpZ2h0O1xuXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwidG9wXCIsdGhpcy5hc2dhZ2Fzc2dhLnN0eWxlLnRvcCk7XG4gICAgICAgICAgICBpZih0aGlzLmN1cmJhbm5lcilcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImJhbm5lciBzaG93XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnNob3coKTtcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMjMwMCx0aGlzLCgpPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnN0eWxlLnRvcCA9IGluZm8ud2luZG93SGVpZ2h0IC0gR3VhbmdHYW8uYmFubmVyaGlndDtcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG5ld0Jhbm5lci5vblJlc2l6ZSgocmVzKT0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIEd1YW5nR2FvLmJhbm5lcmhpZ3QgPSByZXMuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc3R5bGUud2lkdGggPSBpbmZvLndpbmRvd1dpZHRoO1xuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc3R5bGUudG9wID0gcmVzaGlnaHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8v5oyJ6ZKu6K+v5a+8XG4gICAgc3RhdGljIENoZWF0QmFubmVyKGJ0bjpMYXlhLlVJQ29tcG9uZW50LGNvbXBsZXRlOkZ1bmN0aW9uID0gbnVsbCxnYXAgPSAwKVxuICAgIHtcbiAgICAgICAgaWYoIUd1YW5nR2FvLmNhbmNoZWF0KVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImlnbm9yZWNoZWF0XCIpO1xuICAgICAgICAgICAgR3VhbmdHYW8uT3BlbkJhbm5lcigwLChoZWlnaHQpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoaGVpZ2h0ID09IG51bGwpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBZUVNkay5TaG93QmFubmVySW1hZygoaGgpPT5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZD1MYXlhLnN0YWdlLmhlaWdodC1oaC1idG4uaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnRuLnkgPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBidG4ueSA9IExheWEuc3RhZ2UuaGVpZ2h0LWJ0bi5oZWlnaHQgLSAxMDA7XG4gICAgICAgICAgICBHdWFuZ0dhby5PcGVuQmFubmVyKGdhcCwoaGVpZ2h0KSA9PiBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyB2YXIgcmFuZG9tID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZihoZWlnaHQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFlRU2RrLlNob3dCYW5uZXJJbWFnKChoaCk9PlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5kPUxheWEuc3RhZ2UuaGVpZ2h0LWhoLWJ0bi5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBidG4ueSA9IGVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGJ0bi55KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJjaGVhdHN0YXJ0XCIsXCJib3R0b206MTAwXCIpO1xuICAgICAgICAgICAgICAgICAgICBidG4ubW91c2VFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbmQ9TGF5YS5zdGFnZS5oZWlnaHQtaGVpZ2h0LWJ0bi5oZWlnaHQgLSAyMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ5OlwiICsgZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuY2hlYXR0aW1lKjEwMDAsdGhpcywoKT0+XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ0bi5tb3VzZUVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93YmFubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBMYXlhLlR3ZWVuLnRvKGJ0bix7eTplbmR9LDUwMCxudWxsLExheWEuSGFuZGxlci5jcmVhdGUodGhpcywoKT0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29tcGxldGUgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSx0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcclxuaW1wb3J0IERpY3Rpb25hcnkgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL0RpY3Rpb25hcnlcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlciwgUFJPVE9DT0xTIH0gZnJvbSBcIi4uL05ldHdvcmtNYW5hZ2VyXCI7XHJcblxyXG5cclxuZXhwb3J0IGVudW0gcmVxdWlyZXR5cGUge1xyXG4gICAg57O757uf6LWg6YCBID0gMSwg6YeR5biB6LSt5LmwID0gMiwg6KeC55yL6KeG6aKRID0gMywg5YiG5LqrID0gNCwg562+5YiwID0gNSwg5rS75YqoID0gNiwg6YCa6L+H5YWz5Y2hID0gNywg57Sv6K6h55m76ZmGID0gOCwg6YKA6K+35Lq65pWw6L6+5YiwID0gOSwg56CW55+z6LSt5LmwID0gMTBcclxufVxyXG5cclxuZXhwb3J0IGVudW0gQWNjb3VudENvbmZpZyB7XHJcbiAgICBjcm9wLHRoaW5ncywgbGFuZCwgZ2xvYmFsLCBlbnRpdHksIHNpZ24sIHJld2FyZHMsIGFjaGlldmVtZW50LCBpbnZpdGUsIG1pc3Npb24sIHRyZWFzdXJlX2NsaWNrLCB0aGVtZSwgbG90dGVyeVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBBY2NvdW50VXNlciB7XHJcbiAgICBtb25leSwgZGlhbW9uZCwgdXNlcl9pZCwgZ2FtZV90aW1lcywgZ2V0X3RoZW1lcywgdmlkZW9fdGltZXMsIGVxdWlwX3RoZW1lcywgbGFzdF9hY3Rpb25fdGltZSwgbGFzdF9mYXZvcml0ZV90aW1lLCBwcm9ncmVzc190aGVtZXMsIHJldml2YWwsIHN0YWdlLHZtb25leVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBoZXJvQXR0ciB7XHJcbiAgICBpZCwgbmFtZSwgcXVhbGl0eSwgaWNvbiwgcHJlZmFiLCByZXF1aXJlX251bSwgcmVxdWlyZV90eXBlXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIHNpZ25kYXRhIHtcclxuICAgIHNpZ25fZGF5cywgc2lnbl90aW1lXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIGVudGl0eSB7XHJcbiAgICBpZCwgbmFtZSwgZW50aXR5X2lkLCBpY29uXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIHNraW5hdHRyIHtcclxuICAgIGVmZmVjdFZhbHVlXzEsXHJcbiAgICBlZmZlY3RWYWx1ZV8yLFxyXG4gICAgZWZmZWN0VmFsdWVfMyxcclxuICAgIGVmZmVjdFZhbHVlXzRcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEFjY291bnREYXRhIHtcclxuICAgIGNvbnN0cnVjdG9yKF90b2tlbjogc3RyaW5nLCBfY29uZmlnOiBPYmplY3QsIF9hcHBTZXR0aW5nOiBPYmplY3QsIF91c2VyOiBPYmplY3QsIF91c2VyYmFzZTogT2JqZWN0LCBfdXNlSW52aXRlOiBPYmplY3QgPSBudWxsLCBfdXNlcl9zdGFnZTogT2JqZWN0ID0gbnVsbCwgX3VzZXJfc2lnbiwgX3VzZXJfYWNoaWV2ZW1lbnQsIF9sb3R0ZXJ5LF91c2VfbGFuZF90YXNrLF91c2VyX3ZpZGVvKSB7XHJcbiAgICAgICAgdGhpcy5tX3Rva2VuID0gX3Rva2VuO1xyXG4gICAgICAgIHRoaXMubV9hcHBfc2V0dGluZyA9IF9hcHBTZXR0aW5nO1xyXG4gICAgICAgIHRoaXMubV91c2VyID0gX3VzZXI7XHJcbiAgICAgICAgdGhpcy5tX3VzZXJfYmFzZSA9IF91c2VyYmFzZTtcclxuICAgICAgICB0aGlzLm1fc2lnbiA9IF91c2VyX3NpZ247XHJcbiAgICAgICAgdGhpcy5tX3Rhc2sgPSBfdXNlcl9hY2hpZXZlbWVudDtcclxuICAgICAgICB0aGlzLmxvdHRlcnkgPSBfbG90dGVyeTtcclxuICAgICAgICB0aGlzLm1fdXNlX2xhbmRfdGFzayA9IF91c2VfbGFuZF90YXNrO1xyXG4gICAgICAgIHRoaXMubV91c2VyX3ZpZGVvID0gX3VzZXJfdmlkZW87XHJcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLm1fdXNlcltcInVzZXJfaWRcIl07XHJcbiAgICAgICAgdGhpcy5vcGVuaWQgPSB0aGlzLm1fdXNlcl9iYXNlW1wib3BlbmlkXCJdO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwidXNlcl9pZDpcIiArIHRoaXMudXNlcklkKTtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwib3Blbl9pZDpcIit0aGlzLm9wZW5pZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1fdG9rZW46IHN0cmluZztcclxuICAgIHB1YmxpYyBtX2NvbmZpZ3M6IE9iamVjdDtcclxuICAgIHB1YmxpYyBtX2FwcF9zZXR0aW5nOiBPYmplY3Q7XHJcbiAgICBwdWJsaWMgbV91c2VyOiBPYmplY3Q7XHJcbiAgICBwdWJsaWMgbV91c2VyX2Jhc2U6IE9iamVjdDtcclxuICAgIHB1YmxpYyBtX3NpZ246IE9iamVjdDtcclxuICAgIHB1YmxpYyBtX3Rhc2s6IE9iamVjdDtcclxuICAgIHB1YmxpYyBtX3VzZV9sYW5kX3Rhc2s6YW55O1xyXG4gICAgcHVibGljIG1fdXNlcl92aWRlbzpPYmplY3Q7XHJcbiAgICBwdWJsaWMgb3BlbmlkOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSB1c2VySWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgbG90dGVyeTogYW55O1xyXG4gICAgcHVibGljIHJvYWRjb25maWc6IHsgW2tleTogbnVtYmVyXTogYW55IH0gPSB7fTtcclxuICAgIHB1YmxpYyBtX1Jld2FyZERpYzogT2JqZWN0ID0ge307XHJcbiAgICBwdWJsaWMgbV9FbnRpdHlEaWM6IHsgW2tleTogbnVtYmVyXTogYW55IH0gPSB7fTtcclxuICAgIHB1YmxpYyBtX0FjaGlldmVtZW50RGljOiBPYmplY3QgPSB7fTtcclxuICAgIC8vIHB1YmxpYyBtX3NraW5EaWM6RGljdGlvbmFyeTxudW1iZXIsU2tpbkRhdGE+ID0gbmV3IERpY3Rpb25hcnkoKTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0IGxvdHRlcnl0aW1lKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLmxvdHRlcnlbXCJkYXlfdmlkZW9fdGltZXNcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc2hhcmUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInNoYXJlXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc2hhcmVjb250ZW50KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInNoYXJlY29udGVudFwiXTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgU2hhcmVJbWFnZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJTaGFyZUltYWdlXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjaGVhdHRpbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJjaGVhdHRpbWVcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiYW5uZXIoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lclwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgdmlkZW8oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInZpZGVvXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBCdG5DYW5Nb3ZlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJCdG5DYW5Nb3ZlXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjaGVja3NjZW5jZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiY2hlY2tzY2VuY2VcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGJhbm5lcl9kaXMoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lcl9kaXNcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiYW5uZXJNb3ZlVGltZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiYmFubmVyTW92ZVRpbWVcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjcmVhdGVCYW5uZXJUaW1lcygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiY3JlYXRlQmFubmVyVGltZXNcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiYW5uZXJNb3ZlUHJvcCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiYmFubmVyTW92ZVByb3BcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBpc1NoYXJlVGhlblZpZGVvKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJpc1NoYXJlVGhlblZpZGVvXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBpc1Nob3dIdWlUdWkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImlzU2hvd0h1aVR1aVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgc3RhcnRfc3ByaW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJzdGFydF9zcHJpbnRcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgSXNWaWRlb01vZGVsKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJJc1ZpZGVvTW9kZWxcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHZpZGVvTW9kZWxOdW0oKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcInZpZGVvTW9kZWxOdW1cIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBWaWRlb01vZGVsVGl0bGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiVmlkZW9Nb2RlbFRpdGxlXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBmYWlsY291bnQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImZhaWxjb3VudFwiXSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHNwbWluc3BlZWQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcInNwbWluc3BlZWRcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiZ20oKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImJnbVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGNhbWVyYWhpZ2h0KCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJjYW1lcmFoaWdodFwiXSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGN0bmZpbGVuYW1lKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImN0bmZpbGVuYW1lXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjaGVhdCgpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiY2hlYXRcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHNoYWtlc3RhZ2UoKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInNoYWtlc3RhZ2VcIl0gJiYgdGhpcy5tX2FwcF9zZXR0aW5nW1wic2hha2VzdGFnZVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgc3RhZ2Vjb25maWdjZG4oKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInN0YWdlY29uZmlnY2RuXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBwbGF5ZXJzcGVlZCgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wicGxheWVyc3BlZWRcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCB2aWRlbEFkVW5pdElkKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInZpZGVsQWRVbml0SWRcIl07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGJhbm5lckFkVW5pdElkKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lckFkVW5pdElkXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCB0cmkoKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInRyaVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgcmVjb21tZW5kKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJyZWNvbW1lbmRcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHJlY29tbWVuZGZsZygpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJyZWNvbW1lbmRmbGdcIl07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGVnZygpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiZWdnXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBlZ2dyYXRlKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJlZ2dyYXRlXCJdKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgVXNlSWQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldENvbmZpZyhfdHlwZTogQWNjb3VudENvbmZpZyk6IGFueSB7XHJcbiAgICAgICAgdmFyIHR5cGUgPSBBY2NvdW50Q29uZmlnW190eXBlXTtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2NvbmZpZ3NbdHlwZV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFVzZXIoX3R5cGU6IEFjY291bnRVc2VyKSB7XHJcbiAgICAgICAgdmFyIHR5cGUgPSBBY2NvdW50VXNlcltfdHlwZV07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV91c2VyW3R5cGVdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBHZXRWaWRlb1RvdGFsKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV91c2VyX3ZpZGVvW1widG90YWxcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTaWduKF9kYXRhdHlwZTogc2lnbmRhdGEpIHtcclxuICAgICAgICB2YXIgdHlwZSA9IHNpZ25kYXRhW19kYXRhdHlwZV07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9zaWduW3R5cGVdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRSZXdhcmRDb25maWcoX3Jld2FyZGlkOiBudW1iZXIpOiBhbnkge1xyXG4gICAgICAgIHZhciByZXdhcmQgPSB0aGlzLm1fUmV3YXJkRGljW19yZXdhcmRpZF07XHJcbiAgICAgICAgcmV0dXJuIHJld2FyZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RW50aXR5KF9pZDogc3RyaW5nLCBhdHRyOiBlbnRpdHkpIHtcclxuICAgICAgICBpZighdGhpcy5tX0VudGl0eURpY1tfaWRdKXJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fRW50aXR5RGljW19pZF1bZW50aXR5W2F0dHJdXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEdldFJld2FyZERpYygpIHtcclxuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5HZXRDb25maWcoQWNjb3VudENvbmZpZy5yZXdhcmRzKTtcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29uZmlnKSB7XHJcbiAgICAgICAgICAgIHRoaXMubV9SZXdhcmREaWNbY29uZmlnW2tleV0uaWRdID0gY29uZmlnW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRFbnRpdHlEaWMoKSB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcuZW50aXR5KTtcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29uZmlnKSB7XHJcbiAgICAgICAgICAgIHRoaXMubV9FbnRpdHlEaWNbY29uZmlnW2tleV0uZW50aXR5X2lkXSA9IGNvbmZpZ1trZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBHZXRUaGVtZUJ5SWQoX2lkOiBudW1iZXIpOiBhbnkge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZXRDb25maWcoQWNjb3VudENvbmZpZy50aGVtZSk7XHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRhdGEubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZGF0YVtpbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pZCA9PSBfaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2tpbkF0dHIoX2lkOiBudW1iZXIpICB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcudGhlbWUpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZmlnLmxlbmd0aDsgaSsrKSAge1xyXG4gICAgICAgICAgICBpZiAoY29uZmlnW2ldLmlkID09IF9pZCkgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFjaGlldmVtZW50RGF0YSgpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcuYWNoaWV2ZW1lbnQpO1xyXG4gICAgICAgIHZhciBkaWMgPSB7fTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIga2V5MSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICAgIHZhciB0eXBlMSA9IGRhdGFba2V5MV0udHlwZTtcclxuICAgICAgICAgICAgLy92YXIgb2JqID0ge307XHJcblxyXG4gICAgICAgICAgICBpZiAoZGljW3R5cGUxXSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBhcnJheSA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkyIGluIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZhciB0eXBlMiA9IGRhdGFba2V5Ml0udHlwZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZTEgPT0gdHlwZTIpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRhdGFba2V5Ml0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkaWNbdHlwZTFdID0gYXJyYXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubV9BY2hpZXZlbWVudERpYyA9IGRpYztcclxuICAgIH1cclxuXHJcbiAgICBIYXNUaGVtZShfaWQ6bnVtYmVyKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGhhcyA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBnZXR0aGVtZXMgPSB0aGlzLkdldFVzZXIoQWNjb3VudFVzZXIuZ2V0X3RoZW1lcyk7XHJcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGdldHRoZW1lcy5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoZ2V0dGhlbWVzW2ldID09IF9pZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaGFzID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaGFzO1xyXG4gICAgfVxyXG5cclxuICAgIEdldFNraW5EaWMoX2NvbmZpZzphbnkpXHJcbiAgICB7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEhlcm9Qcm9ncmVzcyhfaWQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMubV91c2VyW1wicHJvZ3Jlc3NfaGVyb2VzXCJdO1xyXG4gICAgICAgIHZhciBwcm9ncmVzcyA9IGNvbmZpZ1tfaWRdID8gY29uZmlnW19pZF0gOiAwO1xyXG4gICAgICAgIHJldHVybiBwcm9ncmVzcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0SGF0UHJvZ3Jlc3MoX2lkOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLm1fdXNlcltcInByb2dyZXNzX2hhdHNcIl07XHJcbiAgICAgICAgdmFyIHByb2dyZXNzID0gY29uZmlnW19pZF0gPyBjb25maWdbX2lkXSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRDYlByb2dyZXNzKF9pZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5tX3VzZXJbXCJwcm9ncmVzc19kYW5jZXNcIl07XHJcbiAgICAgICAgdmFyIHByb2dyZXNzID0gY29uZmlnW19pZF0gPyBjb25maWdbX2lkXSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBIYXNNb3RvcihfaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZXRVc2VyKEFjY291bnRVc2VyLmdldF90aGVtZXMpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgaGQgPSBkYXRhW2ldO1xyXG4gICAgICAgICAgICBpZiAoX2lkID09IGhkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvL+iOt+WPluearuiCpOeahOi/m+W6plxyXG4gICAgcHVibGljIEdldE1vdG9yUHJvZ3Jlc3MoX2lkOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLm1fdXNlcltcInByb2dyZXNzX3RoZW1lc1wiXTtcclxuICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBjb25maWdbX2lkXSA/IGNvbmZpZ1tfaWRdIDogMDtcclxuICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNldmVyQ29uZmlnKF9jb25maWc6IGFueSkge1xyXG4gICAgICAgIHRoaXMubV9jb25maWdzID0gX2NvbmZpZztcclxuICAgICAgICB0aGlzLkdldFNraW5EaWModGhpcy5tX2NvbmZpZ3MpO1xyXG4gICAgICAgIHRoaXMuR2V0UmV3YXJkRGljKCk7XHJcbiAgICAgICAgdGhpcy5HZXRFbnRpdHlEaWMoKTtcclxuICAgICAgICAvLyB0aGlzLkdldEFjaGlldmVtZW50RGF0YSgpO1xyXG4gICAgICAgIGxldCBfZ2xvYmU9X2NvbmZpZ1tcImdsb2JhbFwiXTtcclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgX2dsb2JlLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gX2dsb2JlW2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQua2V5ID09IFwidGlsaXJlY1wiKSB7XHJcbiAgICAgICAgICAgICAgICBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LnRpbGlyZWM9IE51bWJlcihlbGVtZW50LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBVcGRhdGVTa2luRGljKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLkdldFNraW5EaWModGhpcy5tX2NvbmZpZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRHbG9iZShfa2V5OnN0cmluZylcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2xvYmUgPSB0aGlzLkdldENvbmZpZyhBY2NvdW50Q29uZmlnLmdsb2JhbCk7XHJcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gZ2xvYmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgb2JqID0gZ2xvYmVba2V5XTtcclxuICAgICAgICAgICAgdmFyIGtrayA9IG9ialtcImtleVwiXTtcclxuICAgICAgICAgICAgaWYoa2trID09IF9rZXkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9ialtcInZhbHVlXCJdO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUGxheWVyQWNjb3VudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihfY29kZTogc3RyaW5nLCBfbmlja25hbWU6IHN0cmluZywgX2F2YXRhcjogc3RyaW5nLCBfZ2VuZGVyOiBudW1iZXIsIF9jb3VudHJ5OiBzdHJpbmcsIF9wcm92aW5jZTogc3RyaW5nLCBfY2l0eTogc3RyaW5nLCBfZGV2aWNlOiBzdHJpbmcsIF9zaGFyZWlkOiBzdHJpbmcsIF9zY2VuY2U6IHN0cmluZywgX3Zlcjogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5sb2NhbFRpbWUgPSBMYXlhLnRpbWVyLmN1cnJUaW1lcjtcclxuXHJcbiAgICAgICAgdGhpcy5Db2RlID0gX2NvZGU7XHJcbiAgICAgICAgdGhpcy5OaWNrTmFtZSA9IF9uaWNrbmFtZTtcclxuICAgICAgICB0aGlzLkF2YXRhciA9IF9hdmF0YXI7XHJcbiAgICAgICAgdGhpcy5HZW5kZXIgPSBfZ2VuZGVyO1xyXG4gICAgICAgIHRoaXMuQ291bnRyeSA9IF9jb3VudHJ5O1xyXG4gICAgICAgIHRoaXMuUHJvdmluY2UgPSBfcHJvdmluY2U7XHJcbiAgICAgICAgdGhpcy5DaXR5ID0gX2NpdHk7XHJcbiAgICAgICAgdGhpcy5EZXZpY2UgPSBfZGV2aWNlO1xyXG4gICAgICAgIHRoaXMuU2hhcmVJZCA9IF9zaGFyZWlkO1xyXG4gICAgICAgIHRoaXMuU2NlbmUgPSBfc2NlbmNlO1xyXG4gICAgICAgIHRoaXMudmVyID0gX3ZlcjtcclxuICAgICAgICB0aGlzLklzVGVzdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBQbGF5ZXJBY2NvdW50Lmluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogUGxheWVyQWNjb3VudDtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBDdXJyZW50QWNjb3VudCgpIHtcclxuICAgICAgICBpZiAoUGxheWVyQWNjb3VudC5pbnN0YW5jZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi55Sf5oiQ5pys5Zyw5rWL6K+V6LSm5Y+3Li4uXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUGxheWVyQWNjb3VudC5UZXN0QWNjb3VudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFBsYXllckFjY291bnQuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBUZXN0QWNjb3VudCgpIHtcclxuICAgICAgICB2YXIgY29kZSA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJsb2NhbGNvZGVcIik7XHJcbiAgICAgICAgaWYoIWNvZGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIHZhciByYW5kb20gPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KDEwMDAwLDk5OTk5KS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjb2RlID0gXCJ4al9cIiArIHRpbWUgKyByYW5kb207XHJcbiAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJsb2NhbGNvZGVcIixjb2RlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2codGltZSxyYW5kb20pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaWsOeUqOaIt1wiLGNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiAgeeUqOaIt1wiLGNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY3VyYWNjb3VudCA9IG5ldyBQbGF5ZXJBY2NvdW50KGNvZGUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGN1cmFjY291bnQuSXNUZXN0ID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gY3VyYWNjb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ29kZTogc3RyaW5nO1xyXG4gICAgcHVibGljIE5pY2tOYW1lOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgQXZhdGFyOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgR2VuZGVyOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgQ291bnRyeTogc3RyaW5nO1xyXG4gICAgcHVibGljIFByb3ZpbmNlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ2l0eTogc3RyaW5nO1xyXG4gICAgcHVibGljIERldmljZTogc3RyaW5nO1xyXG4gICAgcHVibGljIFNoYXJlSWQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBTY2VuZTogc3RyaW5nO1xyXG4gICAgcHVibGljIHZlcjogc3RyaW5nO1xyXG4gICAgcHVibGljIHN0YXRpYyBTZXJ2ZXJUaW1lOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGxvY2FsVGltZTtcclxuICAgIHN0YXRpYyBsb2NhbGNvZmlna2V5ID0gXCJtY29uZmlnXCI7XHJcblxyXG4gICAgcHVibGljIElzVGVzdCA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBDdXJBY2NvdW50RGF0YTogQWNjb3VudERhdGE7XHJcblxyXG4gICAgcHVibGljIHRpbGlyZWM6bnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBub3dDb25maWc6YW55O1xyXG5cclxuICAgIHB1YmxpYyBTZXRBY2NvdW50RGF0YShkYXRhLGNvbXBsZXRlY2I6TGF5YS5IYW5kbGVyKSB7XHJcbiAgICAgICAgdmFyIHRva2VuID0gZGF0YVtcInRva2VuXCJdO1xyXG4gICAgICAgIHZhciBjb25maWdzID0gZGF0YVtcImNvbmZpZ3NcIl07XHJcbiAgICAgICAgdmFyIGFwcF9zZXR0aW5nID0gZGF0YVtcImFwcF9zZXR0aW5nXCJdO1xyXG4gICAgICAgIHZhciB1c2VyID0gZGF0YVtcInVzZXJcIl07XHJcbiAgICAgICAgdmFyIHVzZXJfYmFzZSA9IGRhdGFbXCJ1c2VyX2Jhc2VcIl07XHJcbiAgICAgICAgdmFyIHVzZXJfc2lnbiA9IGRhdGFbXCJ1c2VyX3NpZ25cIl07XHJcbiAgICAgICAgdmFyIHVzZXJfYWNoaWV2ZW1lbnQgPSBkYXRhW1widXNlcl9hY2hpZXZlbWVudFwiXTtcclxuICAgICAgICB2YXIgdXNlcl9sb3R0ZXJ5ID0gZGF0YVtcInVzZXJfbG90dGVyeVwiXTtcclxuICAgICAgICB2YXIgdXNlcl9sYW5kX3Rhc2sgPSBkYXRhW1widXNlcl9sYW5kX3Rhc2tcIl07XHJcbiAgICAgICAgdmFyIHVzZXJfdmlkZW8gPSBkYXRhW1widXNlcl92aWRlb1wiXTtcclxuICAgICAgICBpZiAodGhpcy5DdXJBY2NvdW50RGF0YSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5byA5aeL6I635Y+WY29uZmln5pWw5o2uXCIpO1xyXG4gICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhID0gbmV3IEFjY291bnREYXRhKHRva2VuLCBjb25maWdzLCBhcHBfc2V0dGluZywgdXNlciwgdXNlcl9iYXNlLCBudWxsLCBudWxsLCB1c2VyX3NpZ24sIHVzZXJfYWNoaWV2ZW1lbnQsIHVzZXJfbG90dGVyeSx1c2VyX2xhbmRfdGFzayx1c2VyX3ZpZGVvKTtcclxuICAgICAgICAgICAgdGhpcy5DaGVja0xvY2FsQ29uZmlnKGRhdGEudGFibGVfdmVyc2lvbiwgKF9jb25maWcpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEuR2V0U2V2ZXJDb25maWcoX2NvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vd0NvbmZpZyA9IF9jb25maWc7XHJcbiAgICAgICAgICAgICAgICBpZihjb21wbGV0ZWNiICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVjYi5ydW5XaXRoKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChjb25maWdzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLm1fY29uZmlncyA9IGNvbmZpZ3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFwcF9zZXR0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLm1fYXBwX3NldHRpbmcgPSBhcHBfc2V0dGluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX3VzZXIgPSB1c2VyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh1c2VyX2Jhc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV91c2VyX2Jhc2UgPSB1c2VyX2Jhc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHVzZXJfc2lnbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX3NpZ24gPSB1c2VyX3NpZ247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHVzZXJfYWNoaWV2ZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV90YXNrID0gdXNlcl9hY2hpZXZlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodXNlcl9sb3R0ZXJ5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLmxvdHRlcnkgPSB1c2VyX2xvdHRlcnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodXNlcl9sYW5kX3Rhc2spXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV91c2VfbGFuZF90YXNrID0gdXNlcl9sYW5kX3Rhc2s7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodXNlcl92aWRlbylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX3VzZXJfdmlkZW8gPSB1c2VyX3ZpZGVvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgQ2hlY2tMb2NhbENvbmZpZyhfdmVyOiBzdHJpbmcsIGNiOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBjdXJjb25maWcgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRKU09OKFBsYXllckFjY291bnQubG9jYWxjb2ZpZ2tleSk7XHJcbiAgICAgICAgaWYgKGN1cmNvbmZpZykge1xyXG4gICAgICAgICAgICAvL0xheWEuTG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oUGxheWVyQWNjb3VudC5sb2NhbGNvZmlna2V5KTtcclxuICAgICAgICAgICAgaWYgKGN1cmNvbmZpZy52ZXIgPT0gX3Zlcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZXZlcumFjee9ruaYr+acgOaWsOeahC4uLlwiLCBfdmVyKTtcclxuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgY2IoY3VyY29uZmlnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyLkluc3RhbmNlLkh0dHBQb3N0UmVxdWVzdChQUk9UT0NPTFMuQ29uZmlnLCBudWxsLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb25maWdzLnZlciA9IF92ZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SlNPTihQbGF5ZXJBY2NvdW50LmxvY2FsY29maWdrZXksIGRhdGEuY29uZmlncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZXZlcumFjee9ruabtOaWsOWujOaIkC4uLlwiLCBfdmVyKTtcclxuICAgICAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcImNvbmZpZ+aOpeWPo+iOt+WPluaIkOWKn1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBjYihkYXRhLmNvbmZpZ3MpO1xyXG4gICAgICAgICAgICAgICAgfSksIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIumFjee9ruiOt+WPluWksei0pVwiICsgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCJjb25maWfmjqXlj6Pojrflj5blpLHotKVcIik7XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyLkluc3RhbmNlLkh0dHBQb3N0UmVxdWVzdChQUk9UT0NPTFMuQ29uZmlnLCBudWxsLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbmZpZ3MudmVyID0gX3ZlcjtcclxuICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEpTT04oUGxheWVyQWNjb3VudC5sb2NhbGNvZmlna2V5LCBkYXRhLmNvbmZpZ3MpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZXZlcuS/neWtmOmFjee9ruWujOaIkC4uLlwiLCBfdmVyKTtcclxuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjYihkYXRhLmNvbmZpZ3MpO1xyXG5cclxuICAgICAgICAgICAgfSksIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6YWN572u6I635Y+W5aSx6LSlXCIgKyBkYXRhKTtcclxuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgU2VydmVyVGltZSgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCB0aW1lID0gTGF5YS50aW1lci5jdXJyVGltZXI7XHJcbiAgICAgICAgbGV0IHN0aW1lID0gUGxheWVyQWNjb3VudC5TZXJ2ZXJUaW1lICsgTWF0aC5jZWlsKCh0aW1lIC0gdGhpcy5sb2NhbFRpbWUpIC8gMTAwMCk7XHJcbiAgICAgICAgcmV0dXJuIHN0aW1lO1xyXG4gICAgfVxyXG59IiwiXG5cblxuXG5leHBvcnQgZW51bSBzeXN0ZW10eXBlIHtcbiAgICBpb3MsIGFuZHJvaWQsIG90aGVyXG59XG5cbmV4cG9ydCBjbGFzcyBXeEFwaVxue1xuICAgIHB1YmxpYyBzdGF0aWMgcmVjb3JkQWxkRXZlbnQoa2V5OnN0cmluZyx2YWx1ZTpzdHJpbmc9XCJcIik6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoTGF5YS5Ccm93c2VyLndpbmRvdyAmJiBMYXlhLkJyb3dzZXIud2luZG93Lnd4KVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFNlbmRFdmVudChrZXkse2tleTp2YWx1ZX0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5LqL5Lu2OiBcIixrZXkpO1xuICAgIH1cbiAgICBzdGF0aWMgbmV3YWNjb3VudCA9IGZhbHNlO1xuICAgIHN0YXRpYyBzY2VuZVZhbHVlID0gXCJcIjtcbiAgICBzdGF0aWMgc2hhcmVPcGVuSWQgPSBcIlwiO1xuICAgIHN0YXRpYyBxdWVyeWNoYW5uZWwgPSBcIlwiO1xuICAgIHN0YXRpYyByZWZlcnJlckluZm9hcHBJZCA9IFwiXCI7XG4gICAgc3RhdGljIFdYTG9naW4oY2I6IEZ1bmN0aW9uKSBcbiAgICB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5sb2dpbih7XG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY29kZTpcIixyZXMuY29kZSk7XG4gICAgICAgICAgICAgICAgICAgIGNiKHJlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6I635Y+W55So5oi355m75b2V5oCB5aSx6LSl77yBJyArIHJlcy5lcnJNc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAocmVzKSB7IGNvbnNvbGUubG9nKFwid3gubG9naW46IGZhaWxlZCwgcmVzPVwiICsgcmVzKTsgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgV3hJbml0KCkgXG4gICAge1xuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xuXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd1NoYXJlTWVudShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoU2hhcmVUaWNrZXQ6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5vblNob3coKG9wdGlvbikgPT4gXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG9wdGlvbik7XG4gICAgICAgICAgICB0aGlzLnNoYXJlT3BlbklkID0gb3B0aW9uLnF1ZXJ5LnVzZXJJZDtcbiAgICAgICAgICAgIHRoaXMucXVlcnljaGFubmVsID0gb3B0aW9uLnF1ZXJ5LmNoYW5uZWw7XG4gICAgICAgICAgICBpZihvcHRpb24ucmVmZXJyZXJJbmZvKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMucmVmZXJyZXJJbmZvYXBwSWQgPSBvcHRpb24ucmVmZXJyZXJJbmZvLmFwcElkO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib25TaG93IGFwcElkIGlzOlwiLCBvcHRpb24ucmVmZXJyZXJJbmZvLmFwcElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2NlbmVWYWx1ZSA9IG9wdGlvbi5zY2VuZTtcbiAgICAgICAgICAgIHZhciBzY2VuZSA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzY2VuZVwiKTtcbiAgICAgICAgICAgIGlmIChzY2VuZSkgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZVZhbHVlID0gc2NlbmU7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLor7vlj5bphY3nva7lnLrmma/lgLw6XCIgKyBzY2VuZSk7XG4gICAgICAgICAgICB9ICBcbiAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuesrOS4gOasoeaLieWPluWcuuaZr+WAvDpcIiArIHRoaXMuc2NlbmVWYWx1ZSk7XG4gICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKFwic2NlbmVcIiwgdGhpcy5zY2VuZVZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvL+aYvuekuuWKoOi9veS/oeaBr1xuICAgIHByaXZhdGUgc3RhdGljIGlzU2hvd2luZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBzdGF0aWMgU2hvd0xvYWRpbmcodGl0bGU6IHN0cmluZyA9IFwi5Yqg6L295LitLi4uXCIpIFxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93aW5nKSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNTaG93aW5nID0gdHJ1ZTtcbiAgICAgICAgKExheWEuQnJvd3Nlci5vbk1pbmlHYW1lKSAmJiBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dMb2FkaW5nKHsgdGl0bGU6IHRpdGxlLCBtYXNrOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgSGlkZUxvYWRpbmcoKSBcbiAgICB7XG4gICAgICAgIHRoaXMuaXNTaG93aW5nID0gZmFsc2U7XG4gICAgICAgIChMYXlhLkJyb3dzZXIub25NaW5pR2FtZSkgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5oaWRlTG9hZGluZygpO1xuICAgIH1cblxuICAgIHN0YXRpYyBhbGRTZW5kT3BlbmlkKF9vcGVuaWQ6c3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoTGF5YS5Ccm93c2VyLm9uTWluaUdhbWUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYWxkU2VuZE9wZW5pZFwiLF9vcGVuaWQpO1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTZW5kT3BlbmlkKF9vcGVuaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8v5qOA5rWL5pu05pawXG4gICAgc3RhdGljIENoZWNrV1hVcGRhdGUoKSBcbiAgICB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZU1hbmFnZXIgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFVwZGF0ZU1hbmFnZXIoKTtcblxuICAgICAgICB1cGRhdGVNYW5hZ2VyLm9uQ2hlY2tGb3JVcGRhdGUoKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmnIDmlrDniYjmnKw6XCIgKyByZXMuaGFzVXBkYXRlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdXBkYXRlTWFuYWdlci5vblVwZGF0ZVJlYWR5KCgpID0+IHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd01vZGFsKHtcbiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+abtOaWsOaPkOekuicsXG4gICAgICAgICAgICAgICAgY29udGVudDogJ+aWsOeJiOacrOW3sue7j+WHhuWkh+Wlve+8jOaYr+WQpumHjeWQr+W6lOeUqO+8nycsXG4gICAgICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5hcHBseVVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZmFpbChyZXM/KSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIuYXBwbHlVcGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGxldmVsU3RhcnQoc3RhZ2VJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLlvIDlp4vorrDlvZXlhbPljaE6XCIgKyBzdGFnZUlkKTtcbiAgICAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eCkge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vblN0YXJ0KFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhZ2VJZDogc3RhZ2VJZCwgICAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZDogdXNlcklkIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmKFd4QXBpLm5ld2FjY291bnQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vblN0YXJ0KFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFnZUlkOiBcIuaWsOeUqOaItzpcIiArIHN0YWdlSWQsICAgICAvL+WFs+WNoUlEIOivpeWtl+auteW/heS8oFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJZDogdXNlcklkIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBsZXZlbFJ1bm5pbmcoc3RhZ2VJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsdXNlcmV2aXZlOnN0cmluZylcbiAgICB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi6K6w5b2V5YWz5Y2h5LitOlwiICsgc3RhZ2VJZCk7XG4gICAgICAgIGlmKExheWEuQnJvd3Nlci53aW5kb3cgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vblJ1bm5pbmcoe1xuICAgICAgICAgICAgICAgIHN0YWdlSWQgICA6IHN0YWdlSWQsICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICBzdGFnZU5hbWUgOiBzdGFnZU5hbWUsICAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgdXNlcklkICAgIDogdXNlcklkLCAvL+eUqOaIt0lEIOWPr+mAiVxuICAgICAgICAgICAgICAgIGV2ZW50ICAgICA6IFwicmV2aXZlXCIsICAvL+S9v+eUqOmBk+WFtyAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxuICAgICAgICAgICAgICAgIHBhcmFtcyAgICA6IHtcbiAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lICA6IFwi5L2/55So5aSN5rS7XCIsLy/kvb/nlKjpgZPlhbflkI3np7Ag6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICBpdGVtQ291bnQgOiAxLCAgIC8v5L2/55So6YGT5YW35pWw6YePICDlj6/pgIlcbiAgICAgICAgICAgICAgICAgIGRlc2MgICAgICA6IHVzZXJldml2ZSAvL+S9v+eUqOmBk+WFt+aPj+i/sFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmKFd4QXBpLm5ld2FjY291bnQpXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uUnVubmluZyh7XG4gICAgICAgICAgICAgICAgICAgIHN0YWdlSWQgICA6XCLmlrDnlKjmiLc6XCIgKyAgc3RhZ2VJZCwgICAvL+WFs+WNoUlEIOivpeWtl+auteW/heS8oFxuICAgICAgICAgICAgICAgICAgICBzdGFnZU5hbWUgOiBzdGFnZU5hbWUsICAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZCAgICA6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQgICAgIDogXCJyZXZpdmVcIiwgIC8v5L2/55So6YGT5YW3ICDlhbPljaHov5vooYzkuK3vvIznlKjmiLfop6blj5HnmoTmk43kvZwgICAg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtTmFtZSAgOiBcIuS9v+eUqOWkjea0u1wiLC8v5L2/55So6YGT5YW35ZCN56ewIOivpeWtl+auteW/heS8oFxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Db3VudCA6IDEsICAgLy/kvb/nlKjpgZPlhbfmlbDph48gIOWPr+mAiVxuICAgICAgICAgICAgICAgICAgICAgIGRlc2MgICAgICA6IHVzZXJldml2ZSAvL+S9v+eUqOmBk+WFt+aPj+i/sFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgbGV2ZWxTdWNjZXNzKHN0YWdlSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCBcbiAgICB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi6K6w5b2V5YWz5Y2hOuWujOaIkFwiICsgc3RhZ2VJZCk7XG4gICAgICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdGFnZUlkOiBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgdXNlcklkOiB1c2VySWQsIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcImNvbXBsZXRlXCIsICAgLy/lhbPljaHlrozmiJAgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOlxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IFwi5YWz5Y2h5a6M5oiQXCIgICAvL+aPj+i/sFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZihXeEFwaS5uZXdhY2NvdW50KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlSWQ6XCLmlrDnlKjmiLc6XCIgKyBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcImNvbXBsZXRlXCIsICAgLy/lhbPljaHlrozmiJAgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IFwi5YWz5Y2h5a6M5oiQXCIgICAvL+aPj+i/sFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGxldmVsRmFpbChzdGFnZUlkOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgc2NvcmU6IHN0cmluZywgY2FybmFtZTogc3RyaW5nKTogdm9pZCBcbiAgICB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi6K6w5b2V5YWz5Y2hOuWksei0pVwiICsgc3RhZ2VJZCk7XG4gICAgICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdGFnZUlkOiBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgdXNlcklkOiB1c2VySWQsIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcImZhaWxcIiwgICAvL+WFs+WNoeWujOaIkCAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6XG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogXCLlpLHotKVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZTogc2NvcmUsLy/mj4/ov7BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXI6IGNhcm5hbWUvL+aPj+i/sFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZihXeEFwaS5uZXdhY2NvdW50KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlSWQ6XCLmlrDnlKjmiLc6XCIgKyBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcImZhaWxcIiwgICAvL+WFs+WNoeWujOaIkCAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogXCLlpLHotKVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmU6IHNjb3JlLC8v5o+P6L+wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcjogY2FybmFtZS8v5o+P6L+wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBDYW5TaGFrZSA9IHRydWU7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBzaGFrZSgpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC52aWJyYXRlU2hvcnQoe30pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHNoYWtlTG9uZygpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC52aWJyYXRlTG9uZyh7fSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBTaGFrZShfc2hvcnQgPSB0cnVlKSBcbiAgICB7XG4gICAgICAgIGlmKExheWEuQnJvd3Nlci5vbldlaVhpbiAmJiBXeEFwaS5DYW5TaGFrZSkgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKF9zaG9ydCkgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFrZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWtlTG9uZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmKCFfc2hvcnQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuc3RhZ2VTaGFrZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIOaYr+WQpumch+WKqOS4rSAqL1xuICAgIHN0YXRpYyBpc1NoYWtlOmJvb2xlYW47XG4gICAgc3RhdGljIHRpbWVzID0gMS4zO1xuICAgIHN0YXRpYyBudW06bnVtYmVyID0gMDtcbiAgICBzdGF0aWMgb2Zmc2V0QXJyID0gWzAsIDBdO1xuICAgIHN0YXRpYyBvZmZzZXQgPSAxNDtcbiAgICBzdGF0aWMgY2Fuc2hha2VzdGFnZSA9IGZhbHNlO1xuXG4gICAgc3RhdGljIHN0YWdlU2hha2UoY2FsbEJhY2s6RnVuY3Rpb24gPSBudWxsLHNwZWVkOm51bWJlciA9IDMyKTp2b2lkXG4gICAge1xuICAgICAgICBpZih0aGlzLmlzU2hha2UgfHwgIXRoaXMuY2Fuc2hha2VzdGFnZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzU2hha2UgPSB0cnVlO1xuXG4gICAgICAgIHZhciBwb2ludDpMYXlhLlZlY3RvcjIgPSBuZXcgTGF5YS5WZWN0b3IyKExheWEuc3RhZ2UueCwgTGF5YS5zdGFnZS55KTtcbiAgICAgICAgTGF5YS5zdGFnZS50aW1lckxvb3Aoc3BlZWQsIHRoaXMsIHRoaXMuc2hha2VPYmplY3QsW3BvaW50LGNhbGxCYWNrXSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNoYWtlT2JqZWN0KF9wb2ludDpMYXlhLlZlY3RvcjIsX2NhbGxCYWNrKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgY291bnQ6bnVtYmVyID0gKHRoaXMubnVtKyspICUgNDtcbiAgICAgICAgdGhpcy5vZmZzZXRBcnJbdGhpcy5udW0gJSAyXSA9IGNvdW50IDwgMiA/IDAgOiB0aGlzLm9mZnNldDtcbiAgICAgICAgTGF5YS5zdGFnZS54ID0gdGhpcy5vZmZzZXRBcnJbMF0gKyBfcG9pbnQueDtcbiAgICAgICAgTGF5YS5zdGFnZS55ID0gdGhpcy5vZmZzZXRBcnJbMV0gKyBfcG9pbnQueTtcblxuICAgICAgICBpZih0aGlzLm51bSA+ICh0aGlzLnRpbWVzICogNCArIDEpKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLnN0YWdlLmNsZWFyVGltZXIodGhpcywgdGhpcy5zaGFrZU9iamVjdCk7XG4gICAgICAgICAgICBMYXlhLnN0YWdlLnBvcygwLDApO1xuICAgICAgICAgICAgdGhpcy5udW0gPSAwO1xuICAgICAgICAgICAgdGhpcy5pc1NoYWtlID0gZmFsc2U7XG4gICAgICAgICAgICBpZihfY2FsbEJhY2sgIT0gbnVsbClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBfY2FsbEJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgU2hvd1R4dCh0ZXh0OiBzdHJpbmcpIFxuICAgIHtcbiAgICAgICAgaWYgKExheWEuQnJvd3Nlci5vbldlaVhpbikgXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd1RvYXN0KHsgdGl0bGU6IHRleHQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBTeXN0ZW1Gcm9tKCk6IHN5c3RlbXR5cGUgXG4gICAge1xuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuIHN5c3RlbXR5cGUub3RoZXI7XG5cbiAgICAgICAgbGV0IGluZm8gPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XG4gICAgICAgIHZhciBzeXN0ZW06IHN0cmluZyA9IGluZm8uc3lzdGVtO1xuICAgICAgICB2YXIgSU9TID0gc3lzdGVtLmluZGV4T2YoXCJpT1NcIikgIT0gLTE7XG4gICAgICAgIHZhciBBbmRyb2lkID0gc3lzdGVtLmluZGV4T2YoXCJBbmRyb2lkXCIpICE9IC0xO1xuXG4gICAgICAgIGlmIChJT1MpIHtcbiAgICAgICAgICAgIHJldHVybiBzeXN0ZW10eXBlLmlvcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBbmRyb2lkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3lzdGVtdHlwZS5hbmRyb2lkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHN5c3RlbXR5cGUub3RoZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IElzTG9uZ1NjcmVlblN5c3RlbSgpOmJvb2xlYW5cbiAgICB7XG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBzeXN0ZW1JbmZvID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xuICAgICAgICBsZXQgcGxhdGZvcm1Nb2RlbCA9IFwiaXB4XCI7XG4gICAgICAgIGlmIChzeXN0ZW1JbmZvICE9IG51bGwpIHtcbiAgICAgICAgdmFyIG1vZGVsID0gc3lzdGVtSW5mby5tb2RlbDtcbiAgICAgICAgcGxhdGZvcm1Nb2RlbCA9IGAke3N5c3RlbUluZm8uYnJhbmR9XyR7bW9kZWx9XyR7c3lzdGVtSW5mby5zeXN0ZW19X3d4JHtzeXN0ZW1JbmZvLnZlcnNpb259X1NES1ZlciR7c3lzdGVtSW5mby5TREtWZXJzaW9ufWA7XG4gICAgICAgIGNvbnNvbGUubG9nKFwicGxhdGZvcm1Nb2RlbDpcIiArIHBsYXRmb3JtTW9kZWwpO1xuICAgICAgICByZXR1cm4gICEobW9kZWwuaW5kZXhPZihcIlhcIikgPCAwKSB8fFxuICAgICAgICAoKG1vZGVsLmluZGV4T2YoXCJvcHBvXCIpID49IDAgfHwgbW9kZWwuaW5kZXhPZihcIk9QUE9cIikgPj0gMCkgJiYgKG1vZGVsLmluZGV4T2YoXCJSMTVcIikgPj0gMCB8fCBtb2RlbC5pbmRleE9mKFwicjE1XCIpID49IDApKSB8fFxuICAgICAgICBzeXN0ZW1JbmZvLnN0YXR1c0JhckhlaWdodCA+IDIwIHx8XG4gICAgICAgIChtb2RlbC5pbmRleE9mKFwiTm90ZVwiKSA+PSAwICYmIChtb2RlbC5pbmRleE9mKFwiN1wiKSA+PSAwIHx8IG1vZGVsLmluZGV4T2YoXCI4XCIpID49IDApKSB8fFxuICAgICAgICAoKG1vZGVsLmluZGV4T2YoXCJpUGhvbmVcIikgPj0gMCkgJiYgKG1vZGVsLmluZGV4T2YoXCIxMVwiKSA+PSAwKSlcbn1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHdyaXRlU3RhZ2Uoc3RhZ2U6IG51bWJlcilcbiAgICB7XG4gICAgICAgIHZhciBrdkRhdGFMaXN0ID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHZhciBteVZhbHVlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgXCJ3eGdhbWVcIjogXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJzdGFnZVwiOiBzdGFnZSxcbiAgICAgICAgICAgICAgICBcInVwZGF0ZV90aW1lXCI6IGRhdGUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAga3ZEYXRhTGlzdC5wdXNoKHtrZXk6XCJzdGFnZVwiLCB2YWx1ZTogbXlWYWx1ZX0pO1xuICAgICAgXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4KVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNldFVzZXJDbG91ZFN0b3JhZ2UoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBLVkRhdGFMaXN0OiBrdkRhdGFMaXN0LFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiByPT5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrkvKDliIbmlbDmiJDlip9cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGNwVmVyc2lvbkdyZWF0ZXJPckVxdWFsKHYxOiBzdHJpbmcsIHYyOiBzdHJpbmcpIFxuICAgIHtcbiAgICAgICAgY29uc29sZS5sb2coYFtMT0dd5Z+656GA5bqT54mI5pys5Y+3IGN1clZlcjoke3YxfSB0YXJnVmVyOiR7djJ9YCk7XG4gICAgICAgIGxldCB2MUFyciA9IHYxLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgbGV0IHYyQXJyID0gdjIuc3BsaXQoXCIuXCIpO1xuICAgICAgICBsZXQgbGVuID0gdjFBcnIubGVuZ3RoO1xuICAgICAgICBpZiAodjJBcnIubGVuZ3RoIDwgbGVuKSB7XG4gICAgICAgICAgICBsZW4gPSB2MkFyci5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgbGV0IHZlcjEgPSBOdW1iZXIodjFBcnJbaV0pO1xuICAgICAgICAgICAgbGV0IHZlcjIgPSBOdW1iZXIodjJBcnJbaV0pO1xuICAgICAgICAgICAgaWYgKHZlcjEgPiB2ZXIyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2ZXIxIDwgdmVyMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjFBcnIubGVuZ3RoID49IHYyQXJyLmxlbmd0aDtcbiAgICB9XG59IiwiaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi9TZGtcIjtcbmltcG9ydCBHdWFuZ0dhbyBmcm9tIFwiLi9HdWFuZ0dhb1wiO1xuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL0dhbWVVdGlsc1wiO1xuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuL1BsYXllckFjY291bnRcIjtcblxuLypcbiogbmFtZTtcbiovXG4gZXhwb3J0IGNsYXNzIFNoYXJlVXRpbFxue1xuICAgIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IFNoYXJlVXRpbCA9IG5ldyBTaGFyZVV0aWwoKTtcbiAgICBcbiAgICBwdWJsaWMgc3RhdGljIHNoYXJlU3VjY2Vzc1RpbWU6bnVtYmVyID0gMDtcbiAgICBwdWJsaWMgc3RhdGljIGJlZ2luU2hhcmVUaW1lOm51bWJlcjtcbiAgICBwdWJsaWMgc3RhdGljICBpc1NoYXJpbmc6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBzdGF0aWMgY2FsbGJhY2s7XG5cbiAgICBwdWJsaWMgYmVnaW5TaGFyZShjYWxsQmFjayk6dm9pZFxuICAgIHtcbiAgICAgICAgICBTaGFyZVV0aWwuYmVnaW5TaGFyZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YiG5Lqr54K55Ye75pe26Ze0PVwiICsgU2hhcmVVdGlsLmJlZ2luU2hhcmVUaW1lKTtcbiAgICAgICAgICBTaGFyZVV0aWwuaXNTaGFyaW5nID0gdHJ1ZTtcbiAgICAgICAgICBTaGFyZVV0aWwuY2FsbGJhY2sgPSBjYWxsQmFjaztcbiAgICB9XG4gICAgcHVibGljIG9uUmVnaXN0ZXIoKTp2b2lkXG4gICAge1xuICAgICAgICAgaWYoTGF5YS5Ccm93c2VyLndpbmRvdy53eCA9PSBudWxsKVxuICAgICAgICAge1xuICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgIH1cbiAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25TaG93KGZ1bmN0aW9uKG9wdGlvbilcbiAgICAgICAgIHtcbiAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm9uc2hvdyBzaGFyZSBzdGFydFwiKTtcbiAgICAgICAgICAgICBpZihTaGFyZVV0aWwuaXNTaGFyaW5nKVxuICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgU2hhcmVVdGlsLmlzU2hhcmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICBsZXQgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YiG5Lqr5Zue5Yiw5ri45oiP5pe26Ze0XCIgKyB0aW1lKTtcbiAgICAgICAgICAgICAgICAgbGV0IHdhaXQgPSAodGltZSAtICBTaGFyZVV0aWwuYmVnaW5TaGFyZVRpbWUpLzEwMDA7XG4gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YiG5Lqr5YGc55WZ5pe26Ze05Li677yaXCIgKyB3YWl0KTtcbiAgICAgICAgICAgICAgICAgbGV0IHNoYXJlU3VjY2Vzczpib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgIGxldCByZWFsU3VjY2Vzczpib29sZWFuID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgaWYod2FpdCA8IDMpXG4gICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93VG9hc3QoIHt0aXRsZTpcIuivt+mHjeivleS4gOasoVwifSApO1xuICAgICAgICAgICAgICAgICAgICBTaGFyZVV0aWwuY2FsbGJhY2soZmFsc2UpO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgdmFyIHJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICAgICAgICAgICAgICAgICBpZihyYW5kb20gPD0gMC4zKVxuICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBbXCLkvaDlt7LliIbkuqvov4for6XnvqRcIixcIuivt+mHjeaWsOaNouS4que+pOWIhuS6q++8gVwiLFwi6K+35YiG5Lqr5YiwMzDkurrlpKfnvqTkuK3vvIFcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VybWVzID0gbWVzc2FnZVtHYW1lVXRpbHMucmFuZFJhbmdlaW50KDAsMildO1xuICAgICAgICAgICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93VG9hc3QoIHt0aXRsZTpjdXJtZXN9ICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBTaGFyZVV0aWwuY2FsbGJhY2soZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93VG9hc3QoIHt0aXRsZTpcIuWIhuS6q+aIkOWKnyFcIn0gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlVXRpbC5jYWxsYmFjayh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gIGlmKHdhaXQgPj0gMilcbiAgICAgICAgICAgICAgICAvLyAge1xuICAgICAgICAgICAgICAgIC8vICAgICBpZih3YWl0IDwgNClcbiAgICAgICAgICAgICAgICAvLyAgICAge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgc2hhcmVTdWNjZXNzID0gKE1hdGgucmFuZG9tKCkgPiAwLjUpP2ZhbHNlOnRydWU7XG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICAgZWxzZVxuICAgICAgICAgICAgICAgIC8vICAgICB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBzaGFyZVN1Y2Nlc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gIH1cbiAgICAgICAgICAgICAgICAvLyAgZWxzZXtcbiAgICAgICAgICAgICAgICAvLyAgICAgc2hhcmVTdWNjZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gIH1cbiAgICAgICAgICAgICAgICAvLyAgaWYoc2hhcmVTdWNjZXNzID09IGZhbHNlKVxuICAgICAgICAgICAgICAgIC8vICB7XG4gICAgICAgICAgICAgICAgLy8gICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dUb2FzdCgge3RpdGxlOlwi6K+36YeN6K+V5LiA5qyhXCJ9ICk7XG4gICAgICAgICAgICAgICAgLy8gICAgICBTaGFyZVV0aWwuY2FsbGJhY2soZmFsc2UpO1xuICAgICAgICAgICAgICAgIC8vICB9XG4gICAgICAgICAgICAgICAgLy8gIGVsc2V7XG4gICAgICAgICAgICAgICAgLy8gICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd1RvYXN0KCB7dGl0bGU6XCLliIbkuqvmiJDlip9cIn0gKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgU2hhcmVVdGlsLmNhbGxiYWNrKHRydWUpO1xuICAgICAgICAgICAgICAgIC8vICB9XG4gICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIFNoYXJlTWVzc2FnZSgpIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcbiAgICAgICAgdmFyIHQ6IG51bWJlciA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuU2VydmVyVGltZTtcbiAgICAgICAgdmFyIF90aXRsZSA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuc2hhcmVjb250ZW50O1xuICAgICAgICBfdGl0bGUgPSAoX3RpdGxlID09IFwiXCIgfHwgIV90aXRsZSkgPyBcIuS9oOiDvei3n+W+l+S4iuaIkeeahOmAn+W6puWQl++8ge+8n1wiIDogX3RpdGxlO1xuICAgICAgICB2YXIgX2ltYWdlID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5TaGFyZUltYWdlO1xuICAgICAgICBfaW1hZ2UgPSAoX2ltYWdlID09IFwiXCIgfHwgIV9pbWFnZSkgPyBcImJnL3NoYXJlMS5wbmdcIiA6IF9pbWFnZTtcbiAgICAgICAgY29uc29sZS5sb2coXCJTaGFyZU1lc3NhZ2VcIik7XG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25TaGFyZUFwcE1lc3NhZ2UoKCkgPT4gKHtcbiAgICAgICAgICAgIHRpdGxlOiBfdGl0bGUsXG4gICAgICAgICAgICBpbWFnZVVybDogX2ltYWdlLFxuICAgICAgICAgICAgcXVlcnk6IFwic2hhcmVpZD1cIiArIFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuVXNlSWQgKyBcIl9cIiArIHQgKyBcIl9cIiArIE1hdGguZmxvb3IoOTk5OSAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKClcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2hhcmVJbWFnZShjaGFubmVsOiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbiA9IG51bGwsIHNoYXJlVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93Lnd4ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuc2hhcmUpIHtcbiAgICAgICAgICAgIFd4QXBpLlNob3dUeHQoXCLmmoLmnKrlvIDmlL5cIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHZhciB0OiBudW1iZXIgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LlNlcnZlclRpbWU7XG4gICAgICAgIHZhciBfdGl0bGUgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnNoYXJlY29udGVudDtcbiAgICAgICAgX3RpdGxlID0gKF90aXRsZSA9PSBcIlwiIHx8ICFfdGl0bGUpID8gXCLkvaDog73ot5/lvpfkuIrmiJHnmoTpgJ/luqblkJfvvIHvvJ9cIiA6IF90aXRsZTtcbiAgICAgICAgdmFyIF9pbWFnZSA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuU2hhcmVJbWFnZTtcbiAgICAgICAgX2ltYWdlID0gKF9pbWFnZSA9PSBcIlwiIHx8ICFfaW1hZ2UpID8gXCJiZy9zaGFyZTEucG5nXCIgOiBfaW1hZ2U7XG4gICAgICAgIGlmIChXeEFwaS5zY2VuZVZhbHVlID09IFwiMTAzN1wiIHx8IFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDU4XCJ8fCBXeEFwaS5zY2VuZVZhbHVlID09IFwiMTA2N1wiIHx8IFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDk1XCIpIFxuICAgICAgICB7XG4gICAgICAgICAgICBfdGl0bGUgPSBcIjIwMjDlhajmlrDlt6XotYTotbDlir/vvIzkvaDot5/kuIroioLlpY/kuoblkJfvvJ9cIjtcbiAgICAgICAgICAgIF9pbWFnZSA9IFwiYmcvc2hhcmUyLnBuZ1wiO1xuICAgICAgICB9XG4gICAgICAgIFxuXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU2hhcmVBcHBNZXNzYWdlKHtcbiAgICAgICAgICAgIHRpdGxlOiBfdGl0bGUsXG4gICAgICAgICAgICBpbWFnZVVybDogX2ltYWdlLFxuICAgICAgICAgICAgcXVlcnk6IFwidXNlcklkPVwiICsgUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5Vc2VJZCArIFwiX1wiICsgc2hhcmVUeXBlICsgXCJfXCIgKyB0ICsgXCJfXCIgKyBNYXRoLmZsb29yKDk5OTkgKiBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygpLy8gKyBcIiZzaGFyZVRpdGxlPVwiICsgX3RpdGxlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBTaGFyZVV0aWwuSW5zdGFuY2UuYmVnaW5TaGFyZShjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IEd1YW5nR2FvIGZyb20gXCIuL0d1YW5nR2FvXCI7XG5pbXBvcnQgRGljdGlvbmFyeSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvRGljdGlvbmFyeVwiO1xuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuL1BsYXllckFjY291bnRcIjtcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4vU2RrXCI7XG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvR2FtZVV0aWxzXCI7XG5pbXBvcnQgeyBSZWNvbW1lbmQgfSBmcm9tIFwiLi9jcGEvUmVjb21tZW5kVmlld1wiO1xuXG5leHBvcnQgY2xhc3MgWVFTZGtcbntcbiAgICBwdWJsaWMgc3RhdGljIGZsZyA9IFwic2dweXBcIjtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0YWQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBzdGF0aWMgY2Fpbml4aWh1YW46IGFueTtcblxuICAgIHB1YmxpYyBzdGF0aWMgYmFva3VhbnlvdXhpMjogYW55O1xuXG4gICAgcHVibGljIHN0YXRpYyBiYW9rdWFueW91eGkxOiBhbnk7XG5cbiAgICBwdWJsaWMgc3RhdGljIHNoYXJlczphbnlbXTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2R5eTphbnk7XG5cbiAgICBwdWJsaWMgc3RhdGljIGpzOmFueTtcbiAgICBwdWJsaWMgc3RhdGljIHRjOmFueTtcbiAgICBcblxuICAgIHB1YmxpYyBzdGF0aWMgYmFubmVyX2RhdGE6IGFueTtcblxuICAgIHB1YmxpYyBzdGF0aWMgcG9zdGJqKHVybDogc3RyaW5nLCBhcmdzOiBhbnksIGNhbGxiYWNrPzogYW55LCBoZWFkZXIgPSBudWxsKSBcbiAgICB7XG4gICAgICAgIGxldCBodHRwUmVxdWVzdDogTGF5YS5IdHRwUmVxdWVzdCA9IG5ldyBMYXlhLkh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIGlmIChjYWxsYmFjaykgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGh0dHBSZXF1ZXN0Lm9uY2UoTGF5YS5FdmVudC5QUk9HUkVTUywgdGhpcywgKCkgPT4geyBjYWxsYmFjay5wcm9ncmVzcyAmJiBjYWxsYmFjay5wcm9ncmVzcyhodHRwUmVxdWVzdCkgfSk7XG4gICAgICAgICAgICBodHRwUmVxdWVzdC5vbmNlKExheWEuRXZlbnQuRVJST1IsIHRoaXMsICgpID0+IHsgY2FsbGJhY2suZXJyb3IgJiYgY2FsbGJhY2suZXJyb3IoaHR0cFJlcXVlc3QpIH0pO1xuICAgICAgICAgICAgaHR0cFJlcXVlc3Qub25jZShMYXlhLkV2ZW50LkNPTVBMRVRFLCB0aGlzLCAoKSA9PiB7IGNhbGxiYWNrLmNvbXBsZXRlICYmIGNhbGxiYWNrLmNvbXBsZXRlKGh0dHBSZXF1ZXN0KSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVhZGVyKSBcbiAgICAgICAge1xuICAgICAgICAgICAgaHR0cFJlcXVlc3Quc2VuZCh1cmwsIGFyZ3MsIFwicG9zdFwiLCBcImpzb25cIiwgW1wiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBcbiAgICAgICAge1xuICAgICAgICAgICAgaHR0cFJlcXVlc3Quc2VuZCh1cmwsIGFyZ3MsIFwicG9zdFwiLCBcImpzb25cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL+eZu+W9lVxuICAgIHB1YmxpYyBzdGF0aWMgbG9naW4oY29kZSxfY2hhbm5lbCxfYXBwaWQsY2I6RnVuY3Rpb24gPSBudWxsKVxuICAgIHtcbiAgICAgICAgbGV0IHVybDEgPSBcImh0dHBzOi8vYXBpLnl6MDYxLmNvbS9hdXRoP1wiO1xuICAgICAgICB2YXIgdXJsO1xuICAgICAgICB2YXIgY2hhbm5lbCA9IF9jaGFubmVsO1xuICAgICAgICB2YXIgYXBwaWQgPSBfYXBwaWQ7XG4gICAgICAgIGlmICghY2hhbm5lbCkgY2hhbm5lbCA9IFwib3duXCI7XG4gICAgICAgIGxldCBhcmdzMSA9IFxuICAgICAgICB7XG4gICAgICAgICAgICBmbGc6IHRoaXMuZmxnLFxuICAgICAgICAgICAgY29kZTogY29kZSxcbiAgICAgICAgICAgIGNoYW5uZWw6IGNoYW5uZWxcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXBwaWQpIFxuICAgICAgICB7XG4gICAgICAgICAgICB1cmwgPSBgJHt1cmwxfWZsZz0ke2FyZ3MxLmZsZ30mY29kZT0ke2FyZ3MxLmNvZGV9JmNoYW5uZWw9JHthcmdzMS5jaGFubmVsfSZhcHBpZD0ke2FwcGlkfWA7XG4gICAgICAgIH0gXG4gICAgICAgIGVsc2UgXG4gICAgICAgIHtcbiAgICAgICAgICAgIHVybCA9IGAke3VybDF9ZmxnPSR7YXJnczEuZmxnfSZjb2RlPSR7YXJnczEuY29kZX0mY2hhbm5lbD0ke2FyZ3MxLmNoYW5uZWx9YDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvc3Riaih1cmwsIG51bGwsIFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAocmVxdWVzdDogTGF5YS5IdHRwUmVxdWVzdCkgPT4gXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZihjYiAhPSBudWxsKWNiKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSFBfbG9naW4gY29tcGxldGVcIitKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmRhdGEpKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3M6IChyZXF1ZXN0OiBMYXlhLkh0dHBSZXF1ZXN0KSA9PiBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSFBfbG9naW4gcHJvZ3Jlc3M6XCIgKyBKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmRhdGEpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiAocmVxdWVzdDogTGF5YS5IdHRwUmVxdWVzdCkgPT4gXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkhQX2xvZ2luIGVycm9yOlwiICsgSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5kYXRhKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc29sZS5sb2coXCLnmbvlvZXlj4LmlbA6XCIgKyB1cmwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYWRQb3NpdGlvbjogYW55O1xuICAgIC8v6I635Y+W5bm/5ZGK77yI5ZCr5YiG5Lqr77yJ57Sg5p2Q5o6l5Y+jXG4gICAgcHVibGljIHN0YXRpYyBwdWxsQWRQb3NpdGlvbihjYjpGdW5jdGlvbiA9IG51bGwpIFxuICAgIHtcbiAgICAgICAgLy9hZCBwb3NpdGlvblxuICAgICAgICB0aGlzLnBvc3RiaihcImh0dHBzOi8vYXBpLnl6MDYxLmNvbS9nYW1lL1wiICsgdGhpcy5mbGcsIG51bGwsIFxuICAgICAgICB7XG4gICAgICAgICAgICBjb21wbGV0ZTogKHJlcXVlc3Q6IExheWEuSHR0cFJlcXVlc3QpID0+IFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmRhdGEuc3RhdHVzID09IDEpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJhbGxQb3NpdGlvbiA6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIFlRU2RrLmFkUG9zaXRpb24gPSByZXF1ZXN0LmRhdGEucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBZUVNkay5HZXRBZEluZm8oKTtcbiAgICAgICAgICAgICAgICAgICAgWVFTZGsuZ2V0YWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZihjYiljYigpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYWxsUG9zaXRpb25mYWlsZWQ6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAocmVxdWVzdDogTGF5YS5IdHRwUmVxdWVzdCkgPT4gXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJhbGxQb3NpdGlvbiBmYWlsZWQ6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZ2V0YyA9IGZhbHNlO1xuICAgIHN0YXRpYyBnZXRnZHl4ID0gZmFsc2U7XG4gICAgc3RhdGljIGdldGJhbm5lciA9IGZhbHNlO1xuICAgIHN0YXRpYyBnZXRqcyA9IGZhbHNlO1xuICAgIHN0YXRpYyBnZXRiID0gZmFsc2U7XG4gICAgc3RhdGljIGdldHRjID0gZmFsc2U7XG4gICAgXG4gICAgcHVibGljIHN0YXRpYyBhZFBvc2l0aW9uRGljOkRpY3Rpb25hcnk8c3RyaW5nLGFueT4gPSBuZXcgRGljdGlvbmFyeSgpO1xuICAgIHByaXZhdGUgc3RhdGljIEdldEFkSW5mbygpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuYWRQb3NpdGlvbi5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5hZFBvc2l0aW9uW2luZGV4XS5sb2NhdGlvbl9mbGcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiQ1wiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkUG9zaXRpb25EaWMuYWRkKFwiQ1wiLCB0aGlzLmFkUG9zaXRpb25baW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBZGRldGFpbCh0aGlzLmFkUG9zaXRpb25baW5kZXhdLnVybCwgKGRhdGEpID0+IFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBZUVNkay5jYWluaXhpaHVhbiA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldGMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkMyXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRQb3NpdGlvbkRpYy5hZGQoXCJDMlwiLCB0aGlzLmFkUG9zaXRpb25baW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBZGRldGFpbCh0aGlzLmFkUG9zaXRpb25baW5kZXhdLnVybCwoZGF0YSk9PlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZnVodW9jYWluaXhpaHVhbiA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkJcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZFBvc2l0aW9uRGljLmFkZChcIkJcIiwgdGhpcy5hZFBvc2l0aW9uW2luZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWRkZXRhaWwodGhpcy5hZFBvc2l0aW9uW2luZGV4XS51cmwsIChkYXRhKSA9PiBcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgWVFTZGsuYmFva3VhbnlvdXhpMSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldGIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmJhb2t1YW55b3V4aTEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJhbm5lclwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkUG9zaXRpb25EaWMuYWRkKFwiYmFubmVyXCIsIHRoaXMuYWRQb3NpdGlvbltpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFkZGV0YWlsKHRoaXMuYWRQb3NpdGlvbltpbmRleF0udXJsLCAoZGF0YSkgPT4gXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFlRU2RrLmJhbm5lcl9kYXRhID0gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0YmFubmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJHRFlYXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRQb3NpdGlvbkRpYy5hZGQoXCJHRFlYXCIsIHRoaXMuYWRQb3NpdGlvbltpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBZGRldGFpbCh0aGlzLmFkUG9zaXRpb25baW5kZXhdLnVybCwgKGRhdGEpID0+IFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlRU2RrLmdkeXkgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Z2R5eCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkpTXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRQb3NpdGlvbkRpYy5hZGQoXCJKU1wiLCB0aGlzLmFkUG9zaXRpb25baW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFkZGV0YWlsKHRoaXMuYWRQb3NpdGlvbltpbmRleF0udXJsLCAoZGF0YSkgPT4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUVNkay5qcyA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0anMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlRDXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRQb3NpdGlvbkRpYy5hZGQoXCJUQ1wiLCB0aGlzLmFkUG9zaXRpb25baW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFkZGV0YWlsKHRoaXMuYWRQb3NpdGlvbltpbmRleF0udXJsLCAoZGF0YSkgPT4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUVNkay50YyA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0dGMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgQ2hlY2tHZXREYXRhQ29tcGxldGUoKTpib29sZWFuXG4gICAge1xuICAgICAgICB2YXIgY29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgaWYodGhpcy5nZXRjICYmIHRoaXMuZ2V0Z2R5eCAmJiB0aGlzLmdldGIgJiYgdGhpcy5nZXRqcyAmJiB0aGlzLmdldGJhbm5lcilcbiAgICAgICAge1xuICAgICAgICAgICAgY29tcGxldGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wbGV0ZTtcbiAgICB9XG5cbiAgICAvL+iOt+WPluW5v+WRiuivpue7huS/oeaBr+aOpeWPo1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWRkZXRhaWwodXJsLCBjYWxsYmFjazogRnVuY3Rpb24pOiBhbnkgXG4gICAge1xuICAgICAgICB2YXIgdWlkID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5vcGVuaWQ7XG4gICAgICAgIHRoaXMucG9zdGJqKHVybCArIFwiJnVpZD1cIiArIHVpZCwgbnVsbCwge1xuICAgICAgICAgICAgY29tcGxldGU6IChyZXF1ZXN0OiBMYXlhLkh0dHBSZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QuZGF0YS5zdGF0dXMgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwicHVsbEFkUG9zaXRpb24gOlwiLCByZXF1ZXN0LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXF1ZXN0LmRhdGEucmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5DaGVja0dldERhdGFDb21wbGV0ZSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlY29tbWVuZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJwdWxsQWRQb3NpdGlvbmZhaWxlZDpcIiwgcmVxdWVzdC5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChyZXF1ZXN0OiBMYXlhLkh0dHBSZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJwdWxsQWRQb3NpdGlvbiBmYWlsZWQ6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgR2V0U2hhcmUoX2NiOkZ1bmN0aW9uID0gbnVsbClcbiAgICB7XG4gICAgICAgIGxldCB1cmwxID0gXCJodHRwczovL2FwaS55ejA2MS5jb20vbWF0dGVyL3NoYXJlP2lkPTI4MSZnZmxnPSBcIisgdGhpcy5mbGcgK1wiICZsZmxnPUZcIjtcbiAgICAgICAgdmFyIHVpZCA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEub3BlbmlkO1xuICAgICAgICB2YXIgdXJsID0gYCR7dXJsMX0mdWlkPSR7dWlkfWA7XG4gICAgICAgIHRoaXMucG9zdGJqKHVybCxudWxsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgY29tcGxldGU6IChyZXF1ZXN0OiBMYXlhLkh0dHBSZXF1ZXN0KSA9PiBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZihfY2IgIT0gbnVsbClfY2IoSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5kYXRhKSk7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSByZXF1ZXN0LmRhdGE7XG4gICAgICAgICAgICAgICAgWVFTZGsuc2hhcmVzID0gZGF0YS5yZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvZ3Jlc3M6IChyZXF1ZXN0OiBMYXlhLkh0dHBSZXF1ZXN0KSA9PiBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiR2V0U2hhcmUgcHJvZ3Jlc3M6XCIgKyBKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmRhdGEpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKHJlcXVlc3Q6IExheWEuSHR0cFJlcXVlc3QpID0+IFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJHZXRTaGFyZSBlcnJvcjpcIiArIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QuZGF0YSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8v5bm/5ZGK54K55Ye75LiK5oql5o6l5Y+jXG4gICAgcHVibGljIHN0YXRpYyByZXBvcnRhZChhZF9pZCwgbG9jYXRpb25faWQsIGlzc3VjY2VzcyA9IGZhbHNlKSBcbiAgICB7XG4gICAgICAgIGxldCB1cmwgPSBcImh0dHBzOi8vYXBpLnl6MDYxLmNvbS9yZXBvcnRhZD9cIjtcbiAgICAgICAgdmFyIGN1cnVpZCA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEub3BlbmlkO1xuICAgICAgICB2YXIgY2hhbm5lbCA9IFd4QXBpLnF1ZXJ5Y2hhbm5lbDtcbiAgICAgICAgaWYgKCFjaGFubmVsKSBjaGFubmVsID0gXCJvd25cIjtcbiAgICAgICAgbGV0IHJnczEgPSBcbiAgICAgICAge1xuICAgICAgICAgICAgZ2ZsZzogdGhpcy5mbGcsXG4gICAgICAgICAgICB1aWQ6IGN1cnVpZCxcbiAgICAgICAgICAgIGFkX2lkOiBhZF9pZCxcbiAgICAgICAgICAgIGxvY2F0aW9uX2lkOiBsb2NhdGlvbl9pZCxcbiAgICAgICAgICAgIGNoYW5uZWw6IGNoYW5uZWxcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNzdWNjZXNzKSBcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJncyA9IGAke3VybH1nZmxnPSR7cmdzMS5nZmxnfSZ1aWQ9JHtyZ3MxLnVpZH0mYWRfaWQ9JHtyZ3MxLmFkX2lkfSZsb2NhdGlvbl9pZD0ke3JnczEubG9jYXRpb25faWR9JmNoYW5uZWw9JHtyZ3MxLmNoYW5uZWx9JnN0YXR1cz1jYmA7XG4gICAgICAgIH0gZWxzZSBcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJncyA9IGAke3VybH1nZmxnPSR7cmdzMS5nZmxnfSZ1aWQ9JHtyZ3MxLnVpZH0mYWRfaWQ9JHtyZ3MxLmFkX2lkfSZsb2NhdGlvbl9pZD0ke3JnczEubG9jYXRpb25faWR9JmNoYW5uZWw9JHtyZ3MxLmNoYW5uZWx9YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuaKpeeahOWPguaVsFwiICsgcmdzKTtcbiAgICAgICAgdGhpcy5wb3N0YmoocmdzLCBudWxsLCBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbXBsZXRlOiAocmVxdWVzdDogTGF5YS5IdHRwUmVxdWVzdCkgPT4gXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QuZGF0YS5zdGF0dXMgPT0gMSkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuaKpeaIkOWKnyA6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrmiqXlpLHotKU6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAocmVxdWVzdDogTGF5YS5IdHRwUmVxdWVzdCkgPT4gXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLplJnor6/mtojmga86XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc3RhdGlzdGljczEobG9jOiBzdHJpbmcsX3NoYXJlaWQ6c3RyaW5nID0gXCJcIikgXG4gICAge1xuICAgICAgICBsZXQgdXJsID0gXCJodHRwczovL2FwaS55ejA2MS5jb20vc3RhdD9cIjtcbiAgICAgICAgdmFyIGN1cnVpZCA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEub3BlbmlkO1xuICAgICAgICB2YXIgY2hhbm5lbCA9IFd4QXBpLnF1ZXJ5Y2hhbm5lbDtcbiAgICAgICAgaWYgKCFjaGFubmVsKSBjaGFubmVsID0gXCJvd25cIjtcbiAgICAgICAgdmFyIHNpZCA9IF9zaGFyZWlkO1xuICAgICAgICBpZiAoIXNpZCkgc2lkID0gXCJcIjtcbiAgICAgICAgbGV0IHIgPSBcbiAgICAgICAge1xuICAgICAgICAgICAgZmxnOiB0aGlzLmZsZyxcbiAgICAgICAgICAgIHVpZDogY3VydWlkLFxuICAgICAgICAgICAgY2hhbm5lbDogY2hhbm5lbCxcbiAgICAgICAgICAgIGxvYzogbG9jLFxuICAgICAgICAgICAgc2lkOiBzaWRcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXJncyA9IGAke3VybH0mZmxnPSR7ci5mbGd9JnVpZD0ke3IudWlkfSZjaGFubmVsPSR7ci5jaGFubmVsfSZsb2M9JHtyLmxvY30mc2lkPSR7ci5zaWR9YDtcbiAgICAgICAgdGhpcy5wb3N0YmooYXJncywgbnVsbCwgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tcGxldGU6IChyZXF1ZXN0OiBMYXlhLkh0dHBSZXF1ZXN0KSA9PiBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmRhdGEuc3RhdHVzID09IDEpIFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIue7n+iuoeWujOaIkCA6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi57uf6K6h5aSx6LSlOlwiLCByZXF1ZXN0LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKHJlcXVlc3Q6IExheWEuSHR0cFJlcXVlc3QpID0+IFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLplJnor6/mtojmga86XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBleHBvc3VyZSgpIHtcblxuICAgICAgICB2YXIgZCA9IHRoaXMuZXhwb3N1cmVEYXRhKCk7XG4gICAgICAgIGlmIChkLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICAgIHZhciB1cmwgPSBcImh0dHBzOi8vYXBpLnl6MDYxLmNvbS9leHBvc3VyZVwiO1xuICAgICAgICB2YXIgY2hhbm5lbCA9IFd4QXBpLnF1ZXJ5Y2hhbm5lbDtcbiAgICAgICAgaWYgKCFjaGFubmVsKSBjaGFubmVsID0gXCJvd25cIjtcbiAgICAgICAgdmFyIHIgPVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IGQsXG4gICAgICAgICAgICAgICAgZ2ZsZzogdGhpcy5mbGcsXG4gICAgICAgICAgICAgICAgY2hhbm5lbDogY2hhbm5lbFxuICAgICAgICAgICAgfVxuICAgICAgICB2YXIgYXJncyA9IEpTT04uc3RyaW5naWZ5KHIpO1xuICAgICAgICB0aGlzLnBvc3Riaih1cmwsIGFyZ3MsIFxuICAgICAgICB7XG4gICAgICAgICAgICBjb21wbGV0ZTogKHJlcXVlc3Q6IExheWEuSHR0cFJlcXVlc3QpID0+IFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmRhdGEuc3RhdHVzID09IDEpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmm53lhYnmiJDlip8gOlwiLCByZXF1ZXN0LmRhdGEpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pud5YWJ5aSx6LSlOlwiLCByZXF1ZXN0LmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKHJlcXVlc3QpID0+IFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6ZSZ6K+v5raI5oGvOlwiLCByZXF1ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuQ2xlcmFEYXRhKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBleHBvc3VyZURhdGEoKVxuICAgIHtcbiAgICAgICAgdmFyIGRhdGEgPSBbXTtcbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YS5sZW5ndGg7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZighUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkNcIl0gfHwgIVJlY29tbWVuZC5yZWNvbW1lbmREaWNbXCJDXCJdLmxvY2F0aW9uX2lkID09IHVuZGVmaW5lZCljb250aW51ZTtcbiAgICAgICAgICAgIHZhciBjID0geyBhZF9pZDogUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YVtpXS5hZF9pZC50b1N0cmluZygpLCBsb2NhdGlvbl9pZDpSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiQ1wiXS5sb2NhdGlvbl9pZC50b1N0cmluZygpLG51bTogUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YVtpXS5zaG93bnVtLnRvU3RyaW5nKCkgfVxuICAgICAgICAgICAgaWYoUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YVtpXS5zaG93bnVtICE9IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YS5wdXNoKGMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IFJlY29tbWVuZC5qaWVzdWFuRGF0YS5sZW5ndGg7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZighUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkpTXCJdIHx8ICFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiSlNcIl0ubG9jYXRpb25faWQgPT0gdW5kZWZpbmVkKWNvbnRpbnVlO1xuICAgICAgICAgICAgdmFyIGMyID0geyBhZF9pZDogUmVjb21tZW5kLmppZXN1YW5EYXRhW2ldLmFkX2lkLnRvU3RyaW5nKCksIGxvY2F0aW9uX2lkOlJlY29tbWVuZC5yZWNvbW1lbmREaWNbXCJGSFwiXS5sb2NhdGlvbl9pZC50b1N0cmluZygpLG51bTogUmVjb21tZW5kLmppZXN1YW5EYXRhW2ldLnNob3dudW0udG9TdHJpbmcoKSB9XG4gICAgICAgICAgICBpZihSZWNvbW1lbmQuamllc3VhbkRhdGFbaV0uc2hvd251bSAhPSAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaChjMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgUmVjb21tZW5kLmdkeXhEYXRhLmxlbmd0aDtpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiR0RZWFwiXSB8fCAhUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkdEWVhcIl0ubG9jYXRpb25faWQgPT0gdW5kZWZpbmVkKWNvbnRpbnVlO1xuICAgICAgICAgICAgdmFyIHMgPSB7IGFkX2lkOiBSZWNvbW1lbmQuZ2R5eERhdGFbaV0uYWRfaWQudG9TdHJpbmcoKSwgbG9jYXRpb25faWQ6UmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkdEWVhcIl0ubG9jYXRpb25faWQudG9TdHJpbmcoKSxudW06IFJlY29tbWVuZC5nZHl4RGF0YVtpXS5zaG93bnVtLnRvU3RyaW5nKCkgfVxuICAgICAgICAgICAgaWYoUmVjb21tZW5kLmdkeXhEYXRhW2ldLnNob3dudW0gIT0gMClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2gocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgUmVjb21tZW5kLmJhb2t1YW55b3V4aURhdGEubGVuZ3RoO2krKylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIVJlY29tbWVuZC5yZWNvbW1lbmREaWNbXCJCXCJdIHx8ICFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiQlwiXS5sb2NhdGlvbl9pZCA9PSB1bmRlZmluZWQpY29udGludWU7XG4gICAgICAgICAgICB2YXIgcyA9IHsgYWRfaWQ6IFJlY29tbWVuZC5iYW9rdWFueW91eGlEYXRhW2ldLmFkX2lkLnRvU3RyaW5nKCksIGxvY2F0aW9uX2lkOlJlY29tbWVuZC5yZWNvbW1lbmREaWNbXCJCXCJdLmxvY2F0aW9uX2lkLnRvU3RyaW5nKCksbnVtOiBSZWNvbW1lbmQuYmFva3VhbnlvdXhpRGF0YVtpXS5zaG93bnVtLnRvU3RyaW5nKCkgfVxuICAgICAgICAgICAgaWYoUmVjb21tZW5kLmJhb2t1YW55b3V4aURhdGFbaV0uc2hvd251bSAhPSAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaChzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBDbGVyYURhdGEoKSB7XG4gICAgICAgIHZhciBkYXRhID0gW107XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IFJlY29tbWVuZC5jYWluaXhpaHVhbkRhdGEubGVuZ3RoO2krKylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIVJlY29tbWVuZC5yZWNvbW1lbmREaWNbXCJDXCJdIHx8ICFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiQ1wiXS5sb2NhdGlvbl9pZCA9PSB1bmRlZmluZWQpY29udGludWU7XG4gICAgICAgICAgICBSZWNvbW1lbmQuY2Fpbml4aWh1YW5EYXRhW2ldLnNob3dudW0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IFJlY29tbWVuZC5qaWVzdWFuRGF0YS5sZW5ndGg7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZighUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkpTXCJdIHx8ICFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiSlNcIl0ubG9jYXRpb25faWQgPT0gdW5kZWZpbmVkKWNvbnRpbnVlO1xuICAgICAgICAgICAgUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YVtpXS5zaG93bnVtID0gMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBSZWNvbW1lbmQuZ2R5eERhdGEubGVuZ3RoO2krKylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIVJlY29tbWVuZC5yZWNvbW1lbmREaWNbXCJHRFlYXCJdIHx8ICFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiR0RZWFwiXS5sb2NhdGlvbl9pZCA9PSB1bmRlZmluZWQpY29udGludWU7XG4gICAgICAgICAgICB2YXIgcyA9IHsgYWRfaWQ6IFJlY29tbWVuZC5nZHl4RGF0YVtpXS5hZF9pZC50b1N0cmluZygpLCBsb2NhdGlvbl9pZDpSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiR0RZWFwiXS5sb2NhdGlvbl9pZC50b1N0cmluZygpLG51bTogUmVjb21tZW5kLmdkeXhEYXRhW2ldLnNob3dudW0udG9TdHJpbmcoKSB9XG4gICAgICAgICAgICBSZWNvbW1lbmQuY2Fpbml4aWh1YW5EYXRhW2ldLnNob3dudW0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IFJlY29tbWVuZC5iYW9rdWFueW91eGlEYXRhLmxlbmd0aDtpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiQlwiXSB8fCAhUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkJcIl0ubG9jYXRpb25faWQgPT0gdW5kZWZpbmVkKWNvbnRpbnVlO1xuICAgICAgICAgICAgdmFyIHMgPSB7IGFkX2lkOiBSZWNvbW1lbmQuYmFva3VhbnlvdXhpRGF0YVtpXS5hZF9pZC50b1N0cmluZygpLCBsb2NhdGlvbl9pZDpSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiQlwiXS5sb2NhdGlvbl9pZC50b1N0cmluZygpLG51bTogUmVjb21tZW5kLmJhb2t1YW55b3V4aURhdGFbaV0uc2hvd251bS50b1N0cmluZygpIH1cbiAgICAgICAgICAgIFJlY29tbWVuZC5iYW9rdWFueW91eGlEYXRhW2ldLnNob3dudW0gPSAwXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGJhbm5lckltYWc6IExheWEuSW1hZ2U7XG4gICAgcHJpdmF0ZSBzdGF0aWMgYmFubmVyaW5kZXggPSAwO1xuICAgIHByaXZhdGUgc3RhdGljIGFwcElkO1xuICAgIHByaXZhdGUgc3RhdGljIHBhdGg7XG4gICAgcHJpdmF0ZSBzdGF0aWMgYWRfaWQ7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBoZWlnaHQ6IG51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBzaG93T3BlbkhhbmRlcigpXG4gICAge1xuXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBTaG93QmFubmVySW1hZyhjYWxsYmFjazogRnVuY3Rpb24gPSBudWxsKSB7XG4gICAgICAgIC8vOTYwKjMzNFxuICAgICAgICBjb25zb2xlLmxvZyhcIlNob3dCYW5uZXJJbWFnXCIpO1xuICAgICAgICBpZiAoIXRoaXMuYmFubmVyX2RhdGEpIHJldHVybjtcbiAgICAgICBcbiAgICAgICAgaWYgKHRoaXMuYmFubmVySW1hZykge1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJpbmRleCArPSAxO1xuICAgICAgICAgICAgaWYgKHRoaXMuYmFubmVyaW5kZXggPj0gdGhpcy5iYW5uZXJfZGF0YS5sZW5ndGgpIHRoaXMuYmFubmVyaW5kZXggPSAwO1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLnNraW4gPSB0aGlzLmJhbm5lcl9kYXRhW3RoaXMuYmFubmVyaW5kZXhdLmFkX2ltZztcbiAgICAgICAgICAgIHRoaXMuYXBwSWQgPSB0aGlzLmJhbm5lcl9kYXRhW3RoaXMuYmFubmVyaW5kZXhdLmFkX2FwcGlkO1xuICAgICAgICAgICAgdGhpcy5wYXRoID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9wYXRoO1xuICAgICAgICAgICAgdGhpcy5hZF9pZCA9IHRoaXMuYmFubmVyX2RhdGFbdGhpcy5iYW5uZXJpbmRleF0uYWRfaWQ7XG4gICAgICAgICAgICAvLyAgdGhpcy5iYW5uZXJJbWFnLnZpc2libGU9dHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYmFubmVySW1hZyA9IG5ldyBMYXlhLkltYWdlKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIm5ldyBMYXlhLkltYWdlXCIpO1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5iYW5uZXJJbWFnKTtcbiAgICAgICAgICAgIHRoaXMuYmFubmVySW1hZy5za2luID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9pbWc7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IExheWEuc3RhZ2Uud2lkdGggLyA5NjAgKiAzMzQ7XG4gICAgICAgICAgICB0aGlzLmJhbm5lckltYWcud2lkdGggPSBMYXlhLnN0YWdlLndpZHRoO1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCIgdGhpcy5iYW5uZXJJbWFnLmhlaWdodDpcIiArIHRoaXMuYmFubmVySW1hZy5oZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLnggPSAwO1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLnkgPSBMYXlhLnN0YWdlLmhlaWdodCAtIHRoaXMuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLnpPcmRlciA9IDI7XG5cbiAgICAgICAgICAgIHRoaXMuYmFubmVySW1hZy5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIGFkUG9zaXRpb24gPSBZUVNkay5hZFBvc2l0aW9uRGljLmdldFZhbHVlKFwiYmFubmVyXCIpO1xuICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbl9pZCA9IGFkUG9zaXRpb24ubG9jYXRpb25faWQ7XG4gICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLm9uV2VpWGluICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gubmF2aWdhdGVUb01pbmlQcm9ncmFtKHtcbiAgICAgICAgICAgICAgICAgICAgXCJhcHBJZFwiOiB0aGlzLmFwcElkLCBcInBhdGhcIjogdGhpcy5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuaKpeaTjeS9nOaIkOWKnyFcIiArIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBZUVNkay5yZXBvcnRhZCh0aGlzLmFkX2lkLCBsb2NhdGlvbl9pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZhaWw6IChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFlRU2RrLnJlcG9ydGFkKHRoaXMuYWRfaWQsIGxvY2F0aW9uX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5oql5pON5L2c5aSx6LSlXCIgKyByZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcElkID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9hcHBpZDtcbiAgICAgICAgdGhpcy5wYXRoID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9wYXRoO1xuICAgICAgICB0aGlzLmFkX2lkID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9pZDtcbiAgICAgICAgdGhpcy5BZGRfQmFubmVyRGF0YSh0aGlzLmFkX2lkLnRvU3RyaW5nKCkpO1xuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoNTAwLCB0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5iYW5uZXJJbWFnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLmJhbm5lciAmJiBHdWFuZ0dhby5jYW5jaGVhdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodGhpcy5oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soMzAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soMzAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgTGF5YS50aW1lci5jbGVhcih0aGlzLHRoaXMuQmFubmVyTG9vcCk7XG4gICAgICAgIHZhciBsb29wcmF0ZSA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoNywxMCkqMTAwMDtcbiAgICAgICAgTGF5YS50aW1lci5sb29wKGxvb3ByYXRlLCB0aGlzLCB0aGlzLkJhbm5lckxvb3ApO1xuICAgIH1cblxuICAgIHN0YXRpYyBCYW5uZXJMb29wKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmJhbm5lckltYWcpIHtcbiAgICAgICAgICAgIHRoaXMuYmFubmVyaW5kZXggKz0gMTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJhbm5lcmluZGV4ID49IHRoaXMuYmFubmVyX2RhdGEubGVuZ3RoKSB0aGlzLmJhbm5lcmluZGV4ID0gMDtcbiAgICAgICAgICAgIHRoaXMuYmFubmVySW1hZy5za2luID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9pbWc7XG4gICAgICAgICAgICB0aGlzLmFwcElkID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9hcHBpZDtcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IHRoaXMuYmFubmVyX2RhdGFbdGhpcy5iYW5uZXJpbmRleF0uYWRfcGF0aDtcbiAgICAgICAgICAgIHRoaXMuYWRfaWQgPSB0aGlzLmJhbm5lcl9kYXRhW3RoaXMuYmFubmVyaW5kZXhdLmFkX2lkO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBzdGF0aWMgSGlkZUJhbm5lckltYWdlKCkge1xuICAgICAgICBpZiAodGhpcy5iYW5uZXJJbWFnICYmIHRoaXMuYmFubmVySW1hZy52aXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmJhbm5lckltYWcudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIEFkZF9CYW5uZXJEYXRhKGFkX2lkOiBzdHJpbmcpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuYmFubmVyX2RhdGEubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMuYmFubmVyX2RhdGFbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuYWRfaWQgPT0gYWRfaWQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50Lm51bSA9IChOdW1iZXIoZWxlbWVudC5udW0pICsgMSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGQgPSB7IGFkX2lkOiBhZF9pZCwgbG9jYXRpb25faWQ6IHRoaXMuYWRQb3NpdGlvbkRpY1tcImJhbm5lclwiXS5sb2NhdGlvbl9pZC50b1N0cmluZygpLCBudW06IFwiMVwiIH07XG4gICAgICAgIHRoaXMuYmFubmVyX2RhdGEucHVzaChkKTtcbiAgICB9XG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgU19kYXRhID0gW107XG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgaW5pdFNfZGF0YSgpIHtcblxuICAgIC8vICAgICBpZiAoIXRoaXMuc2l3YW5ndHVpamlhbikgcmV0dXJuO1xuICAgIC8vICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5zaXdhbmd0dWlqaWFuLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIC8vICAgICAgICAgdmFyIHMgPSB7IGFkX2lkOiB0aGlzLnNpd2FuZ3R1aWppYW5baW5kZXhdLmFkX2lkLnRvU3RyaW5nKCksIGxvY2F0aW9uX2lkOiB0aGlzLmFkUG9zaXRpb25EaWMuZ2V0VmFsdWUoXCJTXCIpLmxvY2F0aW9uX2lkLnRvU3RyaW5nKCksIG51bTogXCIwXCIgfTtcbiAgICAvLyAgICAgICAgIHRoaXMuU19kYXRhLnB1c2gocyk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgLy9jb25zb2xlLmxvZyhcIuWIt+aWsOatu+S6oeaOqOiNkOaVsOaNrjpcIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuU19kYXRhKSlcbiAgICAvLyB9XG5cblxuICAgIC8vIHB1YmxpYyBzdGF0aWMgaXNoYXZlRGF0YSA9IGZhbHNlO1xuICAgIC8vIHByaXZhdGUgc3RhdGljIHRlbXBDb3VudCA9IDA7XG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgSnVuZGdlRGF0ZSgpIHtcbiAgICAvLyAgICAgdGhpcy50ZW1wQ291bnQrKztcbiAgICAvLyAgICAgaWYgKHRoaXMudGVtcENvdW50ID09IDIpIHtcbiAgICAvLyAgICAgICAgIHRoaXMuaXNoYXZlRGF0YSA9IHRydWU7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG59IiwiaW1wb3J0IENoaWxkQmFzZVZpZXcgZnJvbSBcIi4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvbXZjL0NoaWxkQmFzZVZpZXdcIjtcclxuaW1wb3J0IENwYUV2ZW50IGZyb20gXCIuL0NwYUV2ZW50XCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQgfSBmcm9tIFwiLi4vUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBSZWNvbW1lbmQgfSBmcm9tIFwiLi9SZWNvbW1lbmRWaWV3XCI7XHJcbmltcG9ydCBDcGFJdGVtIGZyb20gXCIuL2l0ZW0vQ3BhSXRlbVwiO1xyXG5pbXBvcnQgVGltZXJTZXJ2aWNlIGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFvS3VhbkdhbWVWaWV3IGV4dGVuZHMgQ2hpbGRCYXNlVmlldyBpbXBsZW1lbnRzIElUaW1lclxyXG57XHJcbiAgICBjX3N0YXRlOmZhaXJ5Z3VpLkNvbnRyb2xsZXI7XHJcbiAgICBpdGVtXzA6Q3BhSXRlbTtcclxuICAgIGl0ZW1fMTpDcGFJdGVtO1xyXG4gICAgaXRlbV8yOkNwYUl0ZW07XHJcbiAgICBpdGVtXzM6Q3BhSXRlbTtcclxuICAgIHQwOmZhaXJ5Z3VpLlRyYW5zaXRpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaW5pdFZpZXcoKTtcclxuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jX3N0YXRlID0gdGhpcy5nZXRDb250cm9sbGVyKCBcImNfc3RhdGVcIiApO1xyXG4gICAgICAgIHRoaXMudDAgPSB0aGlzLmdldFRyYW5zaXRpb24oIFwidDBcIiApO1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggQ3BhRXZlbnQuWVFIb21lRGF0YSx0aGlzLHRoaXMueXFob21lZGF0YUhhbmRsZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHlxaG9tZWRhdGFIYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuUmVmcmVzaEJLWVgoKTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuaW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc3RhcnQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSArPSBkdDtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX3RpbWUgPj0gNTAwMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZWZyZXNoQktZWCggdHJ1ZSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGtleSA9IDA7XHJcbiAgICBwcml2YXRlIF9pc3RhcnQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgUmVmcmVzaEJLWVgoIGlzYW5tbzpib29sZWFuID0gZmFsc2UgKSAgXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnJlY29tbWVuZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcclxuICAgICAgICB2YXIgZGF0YXMgPSBSZWNvbW1lbmQuZ2R5eERhdGE7XHJcbiAgICAgICAgdmFyIGl0ZW06Q3BhSXRlbTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMua2V5ICsgaSA+PSBkYXRhcy5sZW5ndGggLSAxKSAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5rZXkgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBjdXJkYXRhID0gZGF0YXNbdGhpcy5rZXkgKyBpXTsgIFxyXG4gICAgICAgICAgICBpdGVtID0gdGhpc1tcIml0ZW1fXCIraV07XHJcbiAgICAgICAgICAgIGl0ZW0uc2hvd0RhdGEoIGN1cmRhdGEgKTtcclxuICAgICAgICAgICAgaWYgKGN1cmRhdGEgPT0gbnVsbCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGN1cmRhdGEuc2hvd251bSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmtleSArPSA0O1xyXG4gICAgICAgIGlmICh0aGlzLmtleSA+PSBkYXRhcy5sZW5ndGggLSAxKSAge1xyXG4gICAgICAgICAgICB0aGlzLmtleSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzdGFydCA9IHRydWU7XHJcbiAgICAgICAgaWYoIGlzYW5tbyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnQwLnBsYXkoIG51bGwsMSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCBCYXNlVmlldyBmcm9tIFwiLi4vLi4vLi4vLi4vZnJhbWV3b3Jrcy9tdmMvQmFzZVZpZXdcIjtcclxuaW1wb3J0IENwYUl0ZW0gZnJvbSBcIi4vaXRlbS9DcGFJdGVtXCI7XHJcbmltcG9ydCB7IFJlY29tbWVuZEl0ZW0sIFJlY29tbWVuZCB9IGZyb20gXCIuL1JlY29tbWVuZFZpZXdcIjtcclxuaW1wb3J0IHsgVWlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uLy4uLy4uL21hbmFnZXJzL1VpTWFuYWdlclwiO1xyXG5pbXBvcnQgVGltZXJTZXJ2aWNlIGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2hvdXRpUGFuVmlldyBleHRlbmRzIEJhc2VWaWV3IGltcGxlbWVudHMgSVRpbWVyXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJDaG91dGlQYW5WaWV3XCI7XHJcbiAgICBidG5fcmV0dXJuOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBsaXN0XzA6ZmFpcnlndWkuR0xpc3Q7XHJcbiAgICBsaXN0XzE6ZmFpcnlndWkuR0xpc3Q7XHJcbiAgICBidG5faml4dWdhbWU6ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIHByaXZhdGUgX25vd0xpc3QwOlJlY29tbWVuZEl0ZW1bXTtcclxuICAgIHByaXZhdGUgX25vd0xpc3QxOlJlY29tbWVuZEl0ZW1bXTtcclxuICAgIHByaXZhdGUgX2lzU3RhcnQ6Ym9vbGVhbjtcclxuICAgIHByaXZhdGUgX2lzY2FubW92ZTpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9pc2Rvd246Ym9vbGVhbjtcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCBcIm1haW5cIixcImNob3V0aXBhblZpZXdcIiApOyBcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8wLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdCxudWxsLGZhbHNlICk7XHJcbiAgICAgICAgdGhpcy5saXN0XzEuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8xLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdDEsbnVsbCxmYWxzZSApO1xyXG5cclxuICAgICAgICB0aGlzLl9ub3dMaXN0MCA9IFJlY29tbWVuZC5nZHl4RGF0YTtcclxuICAgICAgICB0aGlzLl9ub3dMaXN0MSA9IFJlY29tbWVuZC5nZHl4RGF0YTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IHRoaXMuX25vd0xpc3QwLmxlbmd0aDtcclxuICAgICAgICB0aGlzLmxpc3RfMS5udW1JdGVtcyA9IHRoaXMuX25vd0xpc3QxLmxlbmd0aDtcclxuICAgICAgICB0aGlzLl9pc1N0YXJ0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSB0cnVlO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5pbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWRkTGlzdGVuZXIoIHRoaXMuYnRuX3JldHVybixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5vbmNsb3NlZnVuICk7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5idG5faml4dWdhbWUsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25jbG9zZWZ1biApO1xyXG4gICAgICAgIHRoaXMuYWRkTGlzdGVuZXIoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfRE9XTix0aGlzLHRoaXMuZG93bmNsaWNrICk7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9VUCx0aGlzLHRoaXMudXBjbGljayApO1xyXG4gICAgICAgIHRoaXMuYWRkTGlzdGVuZXIoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfT1VULHRoaXMsdGhpcy51cGNsaWNrICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpdGVtcmVuZGVybGlzdCggaW5kZXg6bnVtYmVyLGl0ZW06Q3BhSXRlbSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaW5kZXggPCB0aGlzLl9ub3dMaXN0MC5sZW5ndGggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5zaG93RGF0YSggdGhpcy5fbm93TGlzdDBbaW5kZXhdICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXRlbXJlbmRlcmxpc3QxKCBpbmRleDpudW1iZXIsaXRlbTpDcGFJdGVtICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpbmRleCA8IHRoaXMuX25vd0xpc3QxLmxlbmd0aCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9ub3dMaXN0MVtpbmRleF0gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkb3duY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNkb3duID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSBmYWxzZTtcclxuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMudGltZW91dENhbGxiYWNrICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0aW1lb3V0Q2FsbGJhY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzZG93biApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9pc2Rvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgPSB0aGlzLmxpc3RfMC5zY3JvbGxQYW5lLnBlcmNYO1xyXG4gICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDIwMDAsdGhpcyx0aGlzLnRpbWVvdXRDYWxsYmFjayApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9tb3ZldGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfZmx1c2h0aW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIGRpcjpib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX25vd3ZhbHVlOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzU3RhcnQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUgJiYgdGhpcy5fbm93TGlzdDAgJiYgdGhpcy5faXNjYW5tb3ZlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuZGlyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSArPSAwLjAwMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93dmFsdWUgPj0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlIC09IDAuMDAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA8PSAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUuc2V0UGVyY1goIHRoaXMuX25vd3ZhbHVlICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbmNsb3NlZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5jbG9zZSggQ2hvdXRpUGFuVmlldyApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZXN0b3J5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5pbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICB9XHJcbiAgICBcclxufSIsImltcG9ydCBDaGlsZEJhc2VWaWV3IGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9DaGlsZEJhc2VWaWV3XCI7XHJcbmltcG9ydCBDcGFFdmVudCBmcm9tIFwiLi9DcGFFdmVudFwiO1xyXG5pbXBvcnQgeyBSZWNvbW1lbmQsIFJlY29tbWVuZEl0ZW0gfSBmcm9tIFwiLi9SZWNvbW1lbmRWaWV3XCI7XHJcbmltcG9ydCBDcGFJdGVtIGZyb20gXCIuL2l0ZW0vQ3BhSXRlbVwiO1xyXG5pbXBvcnQgVGltZXJTZXJ2aWNlIGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3BhRG93bnNWaWV3IGV4dGVuZHMgQ2hpbGRCYXNlVmlldyBpbXBsZW1lbnRzIElUaW1lclxyXG57XHJcbiAgICBjX3N0YXRlOmZhaXJ5Z3VpLkNvbnRyb2xsZXI7XHJcbiAgICBsaXN0XzA6ZmFpcnlndWkuR0xpc3Q7XHJcbiAgICBwcml2YXRlIF9ub3dMaXN0OlJlY29tbWVuZEl0ZW1bXTtcclxuICAgIHByaXZhdGUgX2lzU3RhcnQ6Ym9vbGVhbjtcclxuICAgIHByaXZhdGUgX2lzY2FubW92ZTpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9pc2Rvd246Ym9vbGVhbjtcclxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNfc3RhdGUgPSB0aGlzLmdldENvbnRyb2xsZXIoIFwiY19zdGF0ZVwiICk7XHJcbiAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAwO1xyXG4gICAgICAgIHRoaXMuaW5pdFZpZXcoKTtcclxuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8wLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdCxudWxsLGZhbHNlICk7XHJcbiAgICAgICAgdGhpcy5faXNTdGFydCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggQ3BhRXZlbnQuWVFIb21lRGF0YSx0aGlzLHRoaXMueXFob21lZGF0YUhhbmRsZXIgKTtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmxpc3RfMCxMYXlhLkV2ZW50Lk1PVVNFX0RPV04sdGhpcyx0aGlzLmRvd25jbGljayApO1xyXG4gICAgICAgIHRoaXMuYWRkTGlzdGVuZXIoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfVVAsdGhpcyx0aGlzLnVwY2xpY2sgKTtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmxpc3RfMCxMYXlhLkV2ZW50Lk1PVVNFX09VVCx0aGlzLHRoaXMudXBjbGljayApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZG93bmNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzZG93biA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgTGF5YS50aW1lci5jbGVhciggdGhpcyx0aGlzLnRpbWVvdXRDYWxsYmFjayApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdGltZW91dENhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc2Rvd24gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faXNkb3duID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gdGhpcy5saXN0XzAuc2Nyb2xsUGFuZS5wZXJjWDtcclxuICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKCAyMDAwLHRoaXMsdGhpcy50aW1lb3V0Q2FsbGJhY2sgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbW92ZXRpbWU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2ZsdXNodGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBkaXI6Ym9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9ub3d2YWx1ZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc1N0YXJ0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLmxpc3RfMC5zY3JvbGxQYW5lICYmIHRoaXMuX25vd0xpc3QgJiYgdGhpcy5faXNjYW5tb3ZlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuZGlyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSArPSAwLjAwMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93dmFsdWUgPj0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlIC09IDAuMDAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA8PSAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUuc2V0UGVyY1goIHRoaXMuX25vd3ZhbHVlICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpdGVtcmVuZGVybGlzdCggaW5kZXg6bnVtYmVyLGl0ZW06Q3BhSXRlbSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaW5kZXggPCB0aGlzLl9ub3dMaXN0Lmxlbmd0aCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9ub3dMaXN0W2luZGV4XSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHlxaG9tZWRhdGFIYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcclxuICAgICAgICB0aGlzLl9ub3dMaXN0ID0gUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IHRoaXMuX25vd0xpc3QubGVuZ3RoO1xyXG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMuX25vd0xpc3QubGVuZ3RoO2krKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vd0xpc3RbaV0uc2hvd251bSArKztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNTdGFydCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuaW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLmdldEluYXN0YW5jZSgpLnJlbW92ZVVwZGF0ZVRhcmdldCh0aGlzKTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3BhRXZlbnRcclxue1xyXG4gICAgc3RhdGljIFlRSG9tZURhdGE6c3RyaW5nID0gXCJDcGFFdmVudF9ZUUhvbWVEYXRhXCI7XHJcbn0iLCJpbXBvcnQgeyBZUVNkayB9IGZyb20gXCIuLi9ZUVNka1wiO1xyXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvZXZlbnRzL0V2ZW50VXRpbHNcIjtcclxuaW1wb3J0IENwYUV2ZW50IGZyb20gXCIuL0NwYUV2ZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgcmVjb21tZW5kUGFuXHJcbntcclxuICAgIGNvbnN0cnVjdG9yKGRhdGE6T2JqZWN0KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZ2FtZV9mbGcgPSBkYXRhW1wiZ2FtZV9mbGdcIl07XHJcbiAgICAgICAgdGhpcy5nYW1lX2lkID0gZGF0YVtcImdhbWVfaWRcIl07XHJcbiAgICAgICAgdGhpcy5nYW1lX25hbWUgPSBkYXRhW1wiZ2FtZV9uYW1lXCJdO1xyXG4gICAgICAgIHRoaXMuaWQgPSBkYXRhW1wiaWRcIl07XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbl9mbGcgPSBkYXRhW1wibG9jYXRpb25fZmxnXCJdO1xyXG4gICAgICAgIHRoaXMubG9jYXRpb25faWQgPSBkYXRhW1wibG9jYXRpb25faWRcIl07XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbl9uYW1lID0gZGF0YVtcImxvY2F0aW9uX25hbWVcIl07XHJcbiAgICAgICAgdGhpcy5tYXR0ZXJfdHlwZSA9IGRhdGFbXCJtYXR0ZXJfdHlwZVwiXTtcclxuICAgIH1cclxuICAgIGdhbWVfZmxnOnN0cmluZztcclxuICAgIGdhbWVfaWQ6bnVtYmVyO1xyXG4gICAgZ2FtZV9uYW1lOnN0cmluZztcclxuICAgIGlkOnN0cmluZztcclxuICAgIGxvY2F0aW9uX2ZsZzpzdHJpbmc7XHJcbiAgICBsb2NhdGlvbl9pZDpudW1iZXI7XHJcbiAgICBsb2NhdGlvbl9uYW1lOnN0cmluZztcclxuICAgIG1hdHRlcl90eXBlOnN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY29tbWVuZFxyXG57XHJcbiAgICBjb25zdHJ1Y3RvcigpXHJcbiAgICB7XHJcbiAgICAgICAgUmVjb21tZW5kLkluaXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldGRhdGEgPSBmYWxzZTtcclxuICAgIHN0YXRpYyBJbml0RGF0YSgpXHJcbiAgICB7XHJcbiAgICAgICAgUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YSA9IFJlY29tbWVuZC5HZXRDYWlOaVhpYUh1YW5EYXRhcygpO1xyXG4gICAgICAgIFJlY29tbWVuZC5qaWVzdWFuRGF0YSA9IFJlY29tbWVuZC5HZXRKSWVTdWFuRGF0YXMoKTtcclxuICAgICAgICBSZWNvbW1lbmQuZ2R5eERhdGEgPSBSZWNvbW1lbmQuR2V0R0RZWERhdGFzKCk7XHJcbiAgICAgICAgUmVjb21tZW5kLmJhb2t1YW55b3V4aURhdGEgPSBSZWNvbW1lbmQuR2V0QmFvS3VhbllvdVhpRGF0YXMoKTtcclxuICAgICAgICBSZWNvbW1lbmQubW9yZURhdGEgPSBSZWNvbW1lbmQuR2V0TW9yZURhdGFzKCk7XHJcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gWVFTZGsuYWRQb3NpdGlvbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFJlY29tbWVuZC5yZWNvbW1lbmREaWNbWVFTZGsuYWRQb3NpdGlvbltrZXldLmxvY2F0aW9uX2ZsZ10gID0gbmV3IHJlY29tbWVuZFBhbihZUVNkay5hZFBvc2l0aW9uW2tleV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgWVFTZGsuR2V0U2hhcmUoKTtcclxuICAgICAgICBSZWNvbW1lbmQuZ2V0ZGF0YSA9IHRydWU7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBDcGFFdmVudC5ZUUhvbWVEYXRhICk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlY29tbWVuZERpYyA9IHt9O1xyXG4gICAgc3RhdGljIGNhaW5peGlodWFuRGF0YTpSZWNvbW1lbmRJdGVtW10gPSBbXTtcclxuICAgIHN0YXRpYyBiYW9rdWFueW91eGlEYXRhOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG4gICAgc3RhdGljIGdkeXhEYXRhOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG4gICAgc3RhdGljIGppZXN1YW5EYXRhOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG4gICAgc3RhdGljIG1vcmVEYXRhOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG5cclxuICAgIHN0YXRpYyBHZXRDYWlOaVhpYUh1YW5EYXRhcygpOlJlY29tbWVuZEl0ZW1bXVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtczpSZWNvbW1lbmRJdGVtW10gPSBbXTtcclxuICAgICAgICBpZighWVFTZGsuY2Fpbml4aWh1YW4pcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IFlRU2RrLmNhaW5peGlodWFuLmxlbmd0aDtpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSZWNvbW1lbmRJdGVtKFlRU2RrLmNhaW5peGlodWFuW2ldKSk7XHJcbiAgICAgICAgICAgIGl0ZW1zW2ldLnNob3dudW0gKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBHZXRNb3JlRGF0YXMoKTpSZWNvbW1lbmRJdGVtW11cclxuICAgIHtcclxuICAgICAgICB2YXIgaXRlbXM6UmVjb21tZW5kSXRlbVtdID0gW107XHJcbiAgICAgICAgaWYoIVlRU2RrLnRjKXJldHVybiBpdGVtcztcclxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBZUVNkay50Yy5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShZUVNkay50Y1tpXSkpO1xyXG4gICAgICAgICAgICBpdGVtc1tpXS5zaG93bnVtICsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIEdldEJhb0t1YW5Zb3VYaURhdGFzKCk6UmVjb21tZW5kSXRlbVtdXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGl0ZW1zOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIGlmKCFZUVNkay5iYW9rdWFueW91eGkxKXJldHVybiBpdGVtcztcclxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBZUVNkay5iYW9rdWFueW91eGkxLmxlbmd0aDtpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSZWNvbW1lbmRJdGVtKFlRU2RrLmJhb2t1YW55b3V4aTFbaV0pKTtcclxuICAgICAgICAgICAgaXRlbXNbaV0uc2hvd251bSArKztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBHZXRKSWVTdWFuRGF0YXMoKTpSZWNvbW1lbmRJdGVtW11cclxuICAgIHtcclxuICAgICAgICB2YXIgaXRlbXM6UmVjb21tZW5kSXRlbVtdID0gW107XHJcbiAgICAgICAgaWYoIVlRU2RrLmpzKXJldHVybiBpdGVtcztcclxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBZUVNkay5qcy5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShZUVNkay5qc1tpXSkpO1xyXG4gICAgICAgICAgICBpdGVtc1tpXS5zaG93bnVtICsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIEdldEdEWVhEYXRhcygpOlJlY29tbWVuZEl0ZW1bXVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtczpSZWNvbW1lbmRJdGVtW10gPSBbXTtcclxuICAgICAgICBpZighWVFTZGsuZ2R5eSlyZXR1cm4gaXRlbXM7XHJcbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgWVFTZGsuZ2R5eS5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShZUVNkay5nZHl5W2ldKSk7XHJcbiAgICAgICAgICAgIGl0ZW1zW2ldLnNob3dudW0gKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY29tbWVuZEl0ZW1cclxue1xyXG4gICAgY29uc3RydWN0b3IoRGF0YTpPYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZF9hcHBpZCA9IERhdGFbXCJhZF9hcHBpZFwiXTtcclxuICAgICAgICB0aGlzLmFkX2NvdW50ID0gRGF0YVtcImFkX2NvdW50XCJdO1xyXG4gICAgICAgIHRoaXMuYWRfZGV2aWNlID0gRGF0YVtcImFkX2RldmljZVwiXTtcclxuICAgICAgICB0aGlzLmFkX2RvdCA9IERhdGFbXCJhZF9kb3RcIl07XHJcbiAgICAgICAgdGhpcy5hZF9pZCA9IERhdGFbXCJhZF9pZFwiXTtcclxuICAgICAgICB0aGlzLmFkX2ltZyA9IERhdGFbXCJhZF9pbWdcIl07XHJcbiAgICAgICAgdGhpcy5hZF9uYW1lID0gRGF0YVtcImFkX25hbWVcIl07XHJcbiAgICAgICAgdGhpcy5hZF9wYXRoID0gRGF0YVtcImFkX3BhdGhcIl07XHJcbiAgICB9XHJcbiAgICBhZF9hcHBpZDpzdHJpbmc7XHJcbiAgICBhZF9jb3VudDpudW1iZXI7XHJcbiAgICBhZF9kZXZpY2U6bnVtYmVyO1xyXG4gICAgYWRfZG90Om51bWJlcjtcclxuICAgIGFkX2lkOm51bWJlcjtcclxuICAgIGFkX2ltZzpzdHJpbmc7XHJcbiAgICBhZF9uYW1lOnN0cmluZztcclxuICAgIGFkX3BhdGg6c3RyaW5nO1xyXG4gICAgc2hvd251bSA9IDA7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWNvbW1lbmRWaWV3XHJcbntcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSB7IFxyXG4gICAgICAgIFxyXG4gICAgIH1cclxufSIsImltcG9ydCBDaGlsZEJhc2VWaWV3IGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9DaGlsZEJhc2VWaWV3XCI7XHJcbmltcG9ydCB7IFJlY29tbWVuZEl0ZW0sIFJlY29tbWVuZCB9IGZyb20gXCIuL1JlY29tbWVuZFZpZXdcIjtcclxuaW1wb3J0IENwYUl0ZW0gZnJvbSBcIi4vaXRlbS9DcGFJdGVtXCI7XHJcbmltcG9ydCBUaW1lclNlcnZpY2UgZnJvbSBcIi4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL0RlYnVnZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoaXdhbnR1aWppYW5WaWV3IGV4dGVuZHMgQ2hpbGRCYXNlVmlldyBpbXBsZW1lbnRzIElUaW1lclxyXG57XHJcbiAgICBcclxuICAgIGxpc3RfMDpmYWlyeWd1aS5HTGlzdDtcclxuICAgIHByaXZhdGUgX25vd2xpc3Q6UmVjb21tZW5kSXRlbVtdO1xyXG4gICAgcHJpdmF0ZSBfaXNTdGFydDpib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfaXNjYW5tb3ZlOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2lzZG93bjpib29sZWFuO1xyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoKTsgXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmluaXRWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubGlzdF8wLnNldFZpcnR1YWwoKTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5pdGVtUmVuZGVyZXIgPSBMYXlhLkhhbmRsZXIuY3JlYXRlKCB0aGlzLHRoaXMuaXRlbXJlbmRlcmxpc3QsbnVsbCxmYWxzZSApO1xyXG4gICAgICAgIHRoaXMuX25vd2xpc3QgPSBSZWNvbW1lbmQuamllc3VhbkRhdGE7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd2xpc3QubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IHRoaXMuX25vd2xpc3QubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLl9ub3dsaXN0Lmxlbmd0aDtpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd2xpc3RbaV0uc2hvd251bSArKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9pc1N0YXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgVGltZXJTZXJ2aWNlLmluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9ET1dOLHRoaXMsdGhpcy5kb3duY2xpY2sgKTtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmxpc3RfMCxMYXlhLkV2ZW50Lk1PVVNFX1VQLHRoaXMsdGhpcy51cGNsaWNrICk7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9PVVQsdGhpcyx0aGlzLnVwY2xpY2sgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRvd25jbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc2Rvd24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IGZhbHNlO1xyXG4gICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsdGhpcy50aW1lb3V0Q2FsbGJhY2sgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRpbWVvdXRDYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBjbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5faXNkb3duIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzZG93biA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IHRoaXMubGlzdF8wLnNjcm9sbFBhbmUucGVyY1k7XHJcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSggMjAwMCx0aGlzLHRoaXMudGltZW91dENhbGxiYWNrICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXRlbXJlbmRlcmxpc3QoIGluZGV4Om51bWJlcixpdGVtOkNwYUl0ZW0gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGluZGV4IDwgdGhpcy5fbm93bGlzdC5sZW5ndGggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5zaG93RGF0YSggdGhpcy5fbm93bGlzdFtpbmRleF0sdHJ1ZSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9tb3ZldGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfZmx1c2h0aW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIGRpcjpib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX25vd3ZhbHVlOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzU3RhcnQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUgJiYgdGhpcy5fbm93bGlzdCAmJiB0aGlzLl9ub3dsaXN0Lmxlbmd0aCA+IDAgJiYgdGhpcy5faXNjYW5tb3ZlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuZGlyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSArPSAwLjAwMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93dmFsdWUgPj0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlIC09IDAuMDAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA8PSAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUuc2V0UGVyY1koIHRoaXMuX25vd3ZhbHVlICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLmluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIFxyXG59IiwiaW1wb3J0IEJhc2VWaWV3IGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9CYXNlVmlld1wiO1xyXG5pbXBvcnQgQ3BhSXRlbSBmcm9tIFwiLi9pdGVtL0NwYUl0ZW1cIjtcclxuaW1wb3J0IHsgUmVjb21tZW5kSXRlbSwgUmVjb21tZW5kIH0gZnJvbSBcIi4vUmVjb21tZW5kVmlld1wiO1xyXG5pbXBvcnQgeyBVaU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vLi4vbWFuYWdlcnMvVWlNYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUdWlqaWFuVmlldyBleHRlbmRzIEJhc2VWaWV3IFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiVHVpamlhblZpZXdcIjtcclxuICAgIGJ0bl9jbG9zZTpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgbGlzdF8wOmZhaXJ5Z3VpLkdMaXN0O1xyXG4gICAgcHJpdmF0ZSBfbm93bGlzdDpSZWNvbW1lbmRJdGVtW107XHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJ0dWlqaWFuVmlld1wiICk7IFxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8wLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdCxudWxsLGZhbHNlICk7XHJcbiAgICAgICAgdGhpcy5fbm93bGlzdCA9IFJlY29tbWVuZC5nZHl4RGF0YTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IHRoaXMuX25vd2xpc3QubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5idG5fY2xvc2UsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25jbG9zZWZ1biApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXRlbXJlbmRlcmxpc3QoIGluZGV4Om51bWJlcixpdGVtOkNwYUl0ZW0gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGluZGV4IDwgdGhpcy5fbm93bGlzdC5sZW5ndGggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5zaG93RGF0YSggdGhpcy5fbm93bGlzdFtpbmRleF0gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbmNsb3NlZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5jbG9zZSggVHVpamlhblZpZXcgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBDaGlsZEJhc2VWaWV3IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9DaGlsZEJhc2VWaWV3XCI7XHJcbmltcG9ydCB7IFJlY29tbWVuZEl0ZW0sIFJlY29tbWVuZCB9IGZyb20gXCIuLi9SZWNvbW1lbmRWaWV3XCI7XHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uLy4uL1Nka1wiO1xyXG5pbXBvcnQgeyBZUVNkayB9IGZyb20gXCIuLi8uLi9ZUVNka1wiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCB7IFVpTWFuYWdlciB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9tYW5hZ2Vycy9VaU1hbmFnZXJcIjtcclxuaW1wb3J0IENob3V0aVBhblZpZXcgZnJvbSBcIi4uL0Nob3V0aVBhblZpZXdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENwYUl0ZW0gZXh0ZW5kcyBDaGlsZEJhc2VWaWV3IFxyXG57XHJcbiAgICBpbWdfdGlwOmZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgIGxvYWRfaWNvbjpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgdHh0X3dvcmQ6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIHR4dF93b3JkMTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgcHJpdmF0ZSBfdm86UmVjb21tZW5kSXRlbTtcclxuICAgIHByaXZhdGUgaXNwZW5jaG91dGlwYW46Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuICAgIFxyXG4gICAgcHVibGljIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcImNhcEl0ZW1cIjtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLm9uYnRuY2xpY2sgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uYnRuY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX3ZvIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhOlJlY29tbWVuZEl0ZW0gPSB0aGlzLl92bztcclxuICAgICAgICAgICAgdmFyIGFwcGlkID0gZGF0YS5hZF9hcHBpZDtcclxuICAgICAgICAgICAgdmFyIHBhdGggPSBkYXRhLmFkX3BhdGg7XHJcbiAgICAgICAgICAgIGxldCBwYXJhbSA9IHtcImFwcElkXCI6YXBwaWQudG9TdHJpbmcoKSxcInBhdGhcIjpwYXRoLnRvU3RyaW5nKCl9O1xyXG4gICAgICAgICAgICBpZihMYXlhLkJyb3dzZXIub25XZWlYaW4pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi54K55Ye76Lez6L2s5Yiw5ri45oiPXCIgKyBkYXRhLmFkX25hbWUsXCIxXCIpO1xyXG4gICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5uYXZpZ2F0ZVRvTWluaVByb2dyYW0oXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBwSWQ6YXBwaWQudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgICAgICBwYXRoOnBhdGgudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOnJlcz0+XHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIui3s+i9rOWIsOa4uOaIj+aIkOWKn1wiLFwiMVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uX2lkID0gUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkNcIl0ubG9jYXRpb25faWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFlRU2RrLnJlcG9ydGFkKGRhdGEuYWRfaWQsbG9jYXRpb25faWQsdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBmYWlsOnJlcz0+XHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIui3s+i9rOWIsOa4uOaIj+Wksei0pVwiLFwiMVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uX2lkID0gUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkNcIl0ubG9jYXRpb25faWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFlRU2RrLnJlcG9ydGFkKGRhdGEuYWRfaWQsbG9jYXRpb25faWQsZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5pc3BlbmNob3V0aXBhbiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZihXaW5kb3dNYW5hZ2VyLkluc3RhbmNlLmN1ck9wZW5lZFZpZXcubmFtZSA9PSBcIkhvbWVXaW5kb3dcIil0aGlzLk9uT3BlbkN0Vmlldyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd0RhdGEoIGRhdGE6UmVjb21tZW5kSXRlbSxpc29wZW5jaG91dGlwYW46Ym9vbGVhbiA9IGZhbHNlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaXNwZW5jaG91dGlwYW4gPSBpc29wZW5jaG91dGlwYW47XHJcbiAgICAgICAgdGhpcy5fdm8gPSBkYXRhO1xyXG4gICAgICAgIGlmKCBkYXRhIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZF9pY29uLnVybCA9IGRhdGEuYWRfaW1nO1xyXG4gICAgICAgICAgICBpZiggdGhpcy50eHRfd29yZCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHh0X3dvcmQudGV4dCA9IGRhdGEuYWRfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5pbWdfdGlwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbWdfdGlwLnZpc2libGUgPSBkYXRhLmFkX2RvdCA9PSAxP3RydWU6ZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMudHh0X3dvcmQxIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50eHRfd29yZDEudGV4dCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoMjM1NDcwLDE1NjE0MzApLnRvU3RyaW5nKCkgKyBcIuS6uueOqVwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgfVxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+e1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmtleXMgPSBuZXcgQXJyYXk8VEtleT4oKTtcclxuICAgICAgICB0aGlzLnZhbHVlcyA9IG5ldyBBcnJheTxUVmFsdWU+KCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMga2V5czogQXJyYXk8VEtleT47XHJcbiAgICBwdWJsaWMgdmFsdWVzOiBBcnJheTxUVmFsdWU+O1xyXG4gICAgcHVibGljIGdldCBjb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmtleXMubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFkZChrZXk6IFRLZXksIHZhbHVlOiBUVmFsdWUpIHtcclxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmtleXMuaW5kZXhPZihrZXkpO1xyXG4gICAgICAgIGlmIChpbmRleCA9PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmtleXMucHVzaChrZXkpO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5wdXNoKHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZShrZXk6IFRLZXkpIHtcclxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmtleXMuaW5kZXhPZihrZXkpO1xyXG4gICAgICAgIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmtleXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFZhbHVlKGtleTogVEtleSk6IFRWYWx1ZSB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5rZXlzLmluZGV4T2Yoa2V5KTtcclxuICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzW2luZGV4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29udGFpbktleShrZXk6IFRLZXkpIHtcclxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmtleXMuaW5kZXhPZihrZXkpO1xyXG4gICAgICAgIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb250YWluVmFsdWUodmFsdWU6IFRWYWx1ZSkge1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMudmFsdWVzLmluZGV4T2YodmFsdWUpO1xyXG4gICAgICAgIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhcigpIHtcclxuICAgICAgICB0aGlzLmtleXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLnZhbHVlcy5sZW5ndGggPSAwO1xyXG4gICAgfVxyXG5cclxufSIsIlxyXG4vKlxyXG4qIOWFrOWFseaOpeWPo1xyXG4qL1xyXG5leHBvcnQgbW9kdWxlIEdhbWVVdGlscyB7XHJcbiAgICAvKipcclxuICAgICAqIOmaj+acuuWHveaVsCjov5Tlm57mlbTlnospXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByYW5kUmFuZ2VpbnQobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyICB7XHJcbiAgICAgICAgdmFyIHZhbHVlOm51bWJlcj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluO1xyXG4gICAgICAgIGlmKHZhbHVlPm1heCl7XHJcbiAgICAgICAgICAgIHZhbHVlID0gbWF4O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpmo/mnLrlh73mlbAoIOS4jeWPluaVtCApXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByYW5kUmFuZ2VmbG9hdChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIgIHtcclxuICAgICAgICB2YXIgdmFsdWU6bnVtYmVyID0gTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSArIG1pbjtcclxuICAgICAgICBpZih2YWx1ZT5tYXgpe1xyXG4gICAgICAgICAgICB2YWx1ZSA9IG1heDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRUZXhieVBrZ0FuZE5hbWUoIHBrZ25hbWU6c3RyaW5nLHRleG5hbWU6c3RyaW5nICk6TGF5YS5UZXh0dXJlXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHVpcGFja2FnZTpmYWlyeWd1aS5VSVBhY2thZ2UgPSBmYWlyeWd1aS5VSVBhY2thZ2UuZ2V0QnlOYW1lKHBrZ25hbWUpO1xyXG4gICAgICAgIGlmKCB1aXBhY2thZ2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVpcGFja2FnZS5nZXRJdGVtQXNzZXRCeU5hbWUodGV4bmFtZSkgYXMgTGF5YS5UZXh0dXJlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIh+WJsuWIhuWPt+WPmOaIkFBvaW505a+56LGhXHJcbiAgICAgKiBAcGFyYW0gc3RyIFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0ZmVuaGFvUG9pbnQoIHN0cjpzdHJpbmcgKTpMYXlhLlBvaW50XHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiO1wiKTtcclxuICAgICAgICByZXR1cm4gbmV3IExheWEuUG9pbnQoIE51bWJlciggYXJyWzBdICksTnVtYmVyKCBhcnJbMV0gKSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YiH5Ymy5YiG5Y+35Y+Y5oiQ5pWw5o2uKG51bWJlcilcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1dGZlbmhhb3RvQXJybnVtKCBzdHI6c3RyaW5nICk6QXJyYXk8bnVtYmVyPlxyXG4gICAge1xyXG4gICAgICAgIHZhciBudW1BcnI6QXJyYXk8bnVtYmVyPj1bXTtcclxuICAgICAgICBpZiAoc3RyID09IFwiXCIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVtQXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCI7XCIpO1xyXG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yKCBpO2k8YXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbnVtQXJyLnB1c2goIE51bWJlciggYXJyW2ldICkgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bUFycjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIh+WJsuWIhuWPt+WPmOaIkOaVsOaNrihzdHJpbmcpXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRmZW5oYW90b0FycnN0ciggc3RyOnN0cmluZyApOkFycmF5PHN0cmluZz5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gc3RyLnNwbGl0KFwiO1wiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIh+WJsuWIhuWPt+WPmOaIkOaVsOaNriggeyBrZXk6MSx2YWx1ZToxIH0gKVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0ZmVuaGFvdG9PYmooIHN0cjpzdHJpbmcgKTphbnlcclxuICAgIHtcclxuICAgICAgICB2YXIgb2JqOmFueSA9IHt9O1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdCggXCI7XCIgKTtcclxuICAgICAgICBvYmoua2V5ID0gYXJyWzBdO1xyXG4gICAgICAgIG9iai52YWx1ZSA9IGFyclsxXTtcclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKuWIh+WJsnN0ciovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0c3RydG9BcnIoIHN0cjpzdHJpbmcgKTpBcnJheTxzdHJpbmc+XHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KCBcInxcIiApO1xyXG4gICAgICAgIHJldHVybiBhcnI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoq5YiH5Ymyc3RyKCAxOjF8MToxICkgdG8gQXJyYXk8eyBrZXk6MSx2YWx1ZToxIH0+ICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0c3RydG9BcnIxKCBzdHI6c3RyaW5nICk6QXJyYXk8YW55PlxyXG4gICAge1xyXG4gICAgICAgIHZhciByZXNsdXRBcnI6QXJyYXk8YW55Pj1bXTtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoIFwifFwiICk7XHJcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcclxuICAgICAgICBmb3IoIGk9MDtpPGFyci5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtYXJyOkFycmF5PHN0cmluZz4gPSBhcnJbaV0uc3BsaXQoIFwiO1wiICk7XHJcbiAgICAgICAgICAgIHJlc2x1dEFyci5wdXNoKCB7IGtleTppdGVtYXJyWzBdLHZhbHVlOml0ZW1hcnJbMV0gfSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzbHV0QXJyO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRzdHJ0b09iaiggc3RyOnN0cmluZyApOmFueVxyXG4gICAge1xyXG4gICAgICAgIHZhciByZXN1bHRvYmo6YW55ID0ge307XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KCBcInxcIiApO1xyXG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yKCBpPTA7aTxhcnIubGVuZ3RoO2krKyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaXRlbWFycjpBcnJheTxzdHJpbmc+ID0gYXJyW2ldLnNwbGl0KCBcIjtcIiApO1xyXG4gICAgICAgICAgICByZXN1bHRvYmpbaXRlbWFyclswXV0gPSBpdGVtYXJyWzFdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0b2JqO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb21wYXJlVmVyc2lvbih2MSwgdjIpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHYxID0gdjEuc3BsaXQoJy4nKTtcclxuICAgICAgICB2MiA9IHYyLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgY29uc3QgbGVuID0gTWF0aC5tYXgodjEubGVuZ3RoLCB2Mi5sZW5ndGgpO1xyXG4gICAgICAgIHdoaWxlICh2MS5sZW5ndGggPCBsZW4pIHtcclxuICAgICAgICAgICAgdjEucHVzaCgnMCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAodjIubGVuZ3RoIDwgbGVuKSB7XHJcbiAgICAgICAgICAgIHYyLnB1c2goJzAnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBudW0xID0gcGFyc2VJbnQodjFbaV0pO1xyXG4gICAgICAgICAgICBjb25zdCBudW0yID0gcGFyc2VJbnQodjJbaV0pO1xyXG4gICAgICAgICAgICBpZiAobnVtMSA+IG51bTIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG51bTEgPCBudW0yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgbW9kdWxlIFRpbWVVdGlscyB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmnIgv5pelIOWwj+aXtjrliIbpkp9cclxuICAgICAqIEBwYXJhbSB2YWx1ZSBcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGEodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlICogMTAwMCk7XHJcbiAgICAgICAgc3RyID0gdGhpcy5nZXRUd28oZGF0ZS5nZXRNb250aCgpICsgMSkgKyBcIi9cIiArIHRoaXMuZ2V0VHdvKGRhdGUuZ2V0RGF0ZSgpKSArIFwiIFwiICsgdGhpcy5nZXRUd28oZGF0ZS5nZXRIb3VycygpKSArIFwiOlwiICsgdGhpcy5nZXRUd28oZGF0ZS5nZXRNaW51dGVzKCkpO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmnIgv5pelXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRhMSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgKiAxMDAwKTtcclxuICAgICAgICBzdHIgPSAoZGF0ZS5nZXRNb250aCgpICsgMSkgKyBcIuaciFwiICsgZGF0ZS5nZXREYXRlKCkgKyBcIuaXpVwiO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlubTmnIjml6VcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFllYXJNb250aERhdGUodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlICogMTAwMCk7XHJcbiAgICAgICAgc3RyID0gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCIuXCIgKyAoZGF0ZS5nZXRNb250aCgpICsgMSkgKyBcIi5cIiArIGRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlubQt5pyILeaXpVxyXG4gICAgICogQHBhcmFtIHZhbHVlIFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZm9ybWF0WWVhck1vbnRoRGF0ZTEodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlICogMTAwMCk7XHJcbiAgICAgICAgdmFyIG1vbnRoOiBzdHJpbmcgPSAoZGF0ZS5nZXRNb250aCgpICsgMSkgPj0gMTAgPyAoZGF0ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKSA6IFwiMFwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xyXG4gICAgICAgIHZhciBkYXRlczogc3RyaW5nID0gZGF0ZS5nZXREYXRlKCkgPj0gMTAgPyBkYXRlLmdldERhdGUoKS50b1N0cmluZygpIDogXCIwXCIgKyBkYXRlLmdldERhdGUoKTtcclxuICAgICAgICBzdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIi1cIiArIG1vbnRoICsgXCItXCIgKyBkYXRlcztcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gTFhhbmRKWFRpbWVUeXBlKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICBzdHIgPSBcIjDnp5JcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDwgNjApIHtcclxuICAgICAgICAgICAgc3RyID0gTWF0aC5mbG9vcih2YWx1ZSkgKyBcIuenklwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPCA2MCAqIDYwKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IE1hdGguZmxvb3IodmFsdWUgLyA2MCkgKyBcIuWIhumSn1wiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBob3VyOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGhvdXIgPSBNYXRoLmZsb29yKHZhbHVlIC8gNjAgLyA2MCk7XHJcbiAgICAgICAgICAgIHN0ciA9IGhvdXIgKyBcIuWwj+aXtlwiO1xyXG4gICAgICAgICAgICBzdHIgKz0gTWF0aC5mbG9vcigodmFsdWUgLSBob3VyICogNjAgKiA2MCkgLyA2MCkgKyBcIuWIhumSn1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5qC85byP5YyW5pe26Ze0XHJcbiAgICAgKiBAcGFyYW0gdGltZSDnp5JcclxuICAgICAqIEByZXR1cm4g6L+U5ZueMjQ6NTk6NTlcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWUodGltZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XHJcbiAgICAgICAgaWYoIGhvdXJzID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgPj0gMTAgPyAoaG91cnMgKyBcIjpcIikgOiAoXCIwXCIgKyBob3VycyArIFwiOlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSAzNjAwKSAvIDYwKTtcclxuICAgICAgICBzdHIgKz0gbWludXRlcyA+PSAxMCA/IChtaW51dGVzICsgXCI6XCIpIDogKFwiMFwiICsgbWludXRlcyArIFwiOlwiKTtcclxuICAgICAgICB2YXIgc2Vjb25kOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSA2MCk7XHJcbiAgICAgICAgc3RyICs9IHNlY29uZCA+PSAxMCA/IChzZWNvbmQgKyBcIlwiKSA6IChcIjBcIiArIHNlY29uZCk7XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOagvOW8j+WMluaXtumXtFxyXG4gICAgICogQHBhcmFtIHRpbWUg56eSXHJcbiAgICAgKiBAcmV0dXJuIOi/lOWbnjI05bCP5pe2NTnliIY1OeenkiBcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWUxKHRpbWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xyXG4gICAgICAgIGlmKCBob3VycyA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3RyICs9IGhvdXJzICsgXCLlsI/ml7ZcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSAzNjAwKSAvIDYwKTtcclxuICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiG6ZKfXCI7XHJcbiAgICAgICAgdmFyIHNlY29uZDogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgNjApO1xyXG4gICAgICAgIHN0ciArPSBzZWNvbmQgKyBcIuenklwiO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmoLzlvI/ljJbml7bpl7RcclxuICAgICAqIEBwYXJhbSB0aW1lIOenklxyXG4gICAgICogQHJldHVybiDov5Tlm54x5bCP5pe2MjTliIYxMOenklxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZm9ybWF0VGltZTUodGltZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XHJcbiAgICAgICAgaWYoIGhvdXJzID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDM2MDApIC8gNjApO1xyXG4gICAgICAgIGlmKG1pbnV0ZXM+MClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN0ciArPSBtaW51dGVzICsgXCLliIZcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHNlY29uZDogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgNjApO1xyXG4gICAgICAgIHN0ciArPSBzZWNvbmQgKyBcIuenklwiO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmoLzlvI/ljJbml7bpl7RcclxuICAgICAqIEBwYXJhbSB0aW1lIOenklxyXG4gICAgICogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7Y1OeWIhjU556eSXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUaW1lMih0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIGRheTogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gODY0MDApO1xyXG4gICAgICAgIGlmKGRheT4wKXtcclxuICAgICAgICAgICAgc3RyICs9IGRheSArIFwi5aSpXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XHJcbiAgICAgICAgaWYoaG91cnM+MCl7XHJcbiAgICAgICAgICAgIHN0ciArPSBob3VycyArIFwi5bCP5pe2XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgMzYwMCkgLyA2MCk7XHJcbiAgICAgICAgaWYobWludXRlcz4wKXtcclxuICAgICAgICAgICAgc3RyICs9IG1pbnV0ZXMgKyBcIuWIhumSn1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc2Vjb25kOiBudW1iZXIgPSBNYXRoLmNlaWwodGltZSAlIDYwKTtcclxuICAgICAgICBzdHIgKz0gc2Vjb25kICsgXCLnp5JcIjtcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5qC85byP5YyW5pe26Ze0XHJcbiAgICAgKiBAcGFyYW0gdGltZSDnp5JcclxuICAgICAqIEByZXR1cm4g6L+U5ZueMeWkqTI05bCP5pe277yIIOWPquS/neeVmeS4pOS4qiDvvIlcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWU2KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZGF5OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyA4NjQwMCk7XHJcbiAgICAgICAgaWYgKGRheT4wKXtcclxuICAgICAgICAgICAgc3RyICs9IGRheSArIFwi5aSpXCI7XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDg2NDAwKSAvIDM2MDApO1xyXG4gICAgICAgIGlmIChob3Vycz4wKXtcclxuICAgICAgICAgICAgc3RyICs9IGhvdXJzICsgXCLlsI/ml7ZcIjtcclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluZGV4IDwgMilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgMzYwMCkgLyA2MCk7XHJcbiAgICAgICAgICAgIGlmKG1pbnV0ZXM+MCl7XHJcbiAgICAgICAgICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiGXCI7XHJcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpbmRleCA8IDIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc2Vjb25kOiBudW1iZXIgPSBNYXRoLmNlaWwodGltZSAlIDYwKTtcclxuICAgICAgICAgICAgc3RyICs9IHNlY29uZCArIFwi56eSXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAqIOagvOW8j+WMluaXtumXtFxyXG4gKiBAcGFyYW0gdGltZSDnp5JcclxuICogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7Y1OeWIhlxyXG4gKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUaW1lMyh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIGRheTogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gODY0MDApO1xyXG4gICAgICAgIHN0ciArPSBkYXkgKyBcIuWkqVwiO1xyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgODY0MDAgLyAzNjAwKTtcclxuICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xyXG5cclxuICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDg2NDAwICUgMzYwMCkgLyA2MCk7XHJcbiAgICAgICAgc3RyICs9IG1pbnV0ZXMgKyBcIuWIhlwiO1xyXG5cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4qIOagvOW8j+WMluaXtumXtFxyXG4qIEBwYXJhbSB0aW1lIOenklxyXG4qIEByZXR1cm4g6L+U5ZueMeWkqTI05bCP5pe2NTnliIZcclxuKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUaW1lNCh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHRpbWUgPiA4NjQwMCkge1xyXG4gICAgICAgICAgICB2YXIgZGF5OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyA4NjQwMCk7XHJcbiAgICAgICAgICAgIHN0ciArPSBkYXkgKyBcIuWkqVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGltZSA+IDM2MDApIHtcclxuICAgICAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSA4NjQwMCAvIDM2MDApO1xyXG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGltZSA+IDYwKSB7XHJcbiAgICAgICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgODY0MDAgJSAzNjAwKSAvIDYwKTtcclxuICAgICAgICAgICAgc3RyICs9IG1pbnV0ZXMgKyBcIuWIhumSn1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiog5qC85byP5YyW5pe26Ze0XHJcbiogQHBhcmFtIHRpbWUg56eSXHJcbiogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7Y1OeWIhlxyXG4qL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWU0QXJyKHRpbWU6IG51bWJlcik6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgICAgIHZhciBhcnJUaW1lOkFycmF5PHN0cmluZz4gPSBbXTtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIC8vIGlmICh0aW1lID49IDg2NDAwKSB7XHJcbiAgICAgICAgLy8gICAgIHZhciBkYXk6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDg2NDAwKTtcclxuICAgICAgICAvLyAgICAgYXJyVGltZS51bnNoaWZ0KFN0cmluZyhkYXkpKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgaWYgKHRpbWUgPj0gMzYwMCkge1xyXG4gICAgICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAlIDg2NDAwIC8gMzYwMCk7XHJcbiAgICAgICAgICAgIGFyclRpbWUudW5zaGlmdChTdHJpbmcoaG91cnMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRpbWUgPj0gNjApIHtcclxuICAgICAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSA4NjQwMCAlIDM2MDApIC8gNjApO1xyXG4gICAgICAgICAgICBhcnJUaW1lLnVuc2hpZnQoU3RyaW5nKG1pbnV0ZXMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhcnJUaW1lO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0VHdvKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFN0cmluZyh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKHN0ci5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IFwiMFwiICsgc3RyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pel5pyf6L2s5pe26Ze05oizXHJcbiAgICAgKiBAcGFyYW0gc3RyIDIwMTgtMS0xIFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZGF0ZXRvVGltZShzdHI6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIERhdGUucGFyc2Uoc3RyKSAvIDEwMDA7XHJcbiAgICB9XHJcbn0iXX0=