misago.js 410 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888
  1. (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
  2. (function (global){
  3. 'use strict';
  4. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  5. Object.defineProperty(exports, "__esModule", {
  6. value: true
  7. });
  8. exports.Misago = undefined;
  9. var _orderedList = require('../../../../documents/misago/frontend/src/utils/ordered-list');
  10. var _orderedList2 = _interopRequireDefault(_orderedList);
  11. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  12. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  13. var Misago = exports.Misago = function () {
  14. function Misago() {
  15. _classCallCheck(this, Misago);
  16. this._initializers = [];
  17. this._context = {};
  18. }
  19. _createClass(Misago, [{
  20. key: 'addInitializer',
  21. value: function addInitializer(initializer) {
  22. this._initializers.push({
  23. key: initializer.name,
  24. item: initializer.initializer,
  25. after: initializer.after,
  26. before: initializer.before
  27. });
  28. }
  29. }, {
  30. key: 'init',
  31. value: function init(context) {
  32. var _this = this;
  33. this._context = context;
  34. var initOrder = new _orderedList2.default(this._initializers).orderedValues();
  35. initOrder.forEach(function (initializer) {
  36. initializer(_this);
  37. });
  38. }
  39. // context accessors
  40. }, {
  41. key: 'has',
  42. value: function has(key) {
  43. return this._context.hasOwnProperty(key);
  44. }
  45. }, {
  46. key: 'get',
  47. value: function get(key, fallback) {
  48. if (this.has(key)) {
  49. return this._context[key];
  50. } else {
  51. return fallback || undefined;
  52. }
  53. }
  54. }]);
  55. return Misago;
  56. }();
  57. // create singleton
  58. var misago = new Misago();
  59. // expose it globally
  60. global.misago = misago;
  61. // and export it for tests and stuff
  62. exports.default = misago;
  63. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  64. },{"../../../../documents/misago/frontend/src/utils/ordered-list":62}],2:[function(require,module,exports){
  65. 'use strict';
  66. Object.defineProperty(exports, "__esModule", {
  67. value: true
  68. });
  69. exports.default = initializer;
  70. var _index = require('../../../../../documents/misago/frontend/src/index');
  71. var _index2 = _interopRequireDefault(_index);
  72. var _ajax = require('../../../../../documents/misago/frontend/src/services/ajax');
  73. var _ajax2 = _interopRequireDefault(_ajax);
  74. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  75. function initializer() {
  76. _ajax2.default.init(_index2.default.get('CSRF_COOKIE_NAME'));
  77. }
  78. _index2.default.addInitializer({
  79. name: 'ajax',
  80. initializer: initializer
  81. });
  82. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/services/ajax":50}],3:[function(require,module,exports){
  83. 'use strict';
  84. Object.defineProperty(exports, "__esModule", {
  85. value: true
  86. });
  87. exports.default = initializer;
  88. var _reactRedux = require('react-redux');
  89. var _index = require('../../../../../documents/misago/frontend/src/index');
  90. var _index2 = _interopRequireDefault(_index);
  91. var _authMessage = require('../../../../../documents/misago/frontend/src/components/auth-message');
  92. var _authMessage2 = _interopRequireDefault(_authMessage);
  93. var _mountComponent = require('../../../../../documents/misago/frontend/src/utils/mount-component');
  94. var _mountComponent2 = _interopRequireDefault(_mountComponent);
  95. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  96. function initializer() {
  97. (0, _mountComponent2.default)((0, _reactRedux.connect)(_authMessage.select)(_authMessage2.default), 'auth-message-mount');
  98. }
  99. _index2.default.addInitializer({
  100. name: 'component:auth-message',
  101. initializer: initializer,
  102. after: 'store'
  103. });
  104. },{"../../../../../documents/misago/frontend/src/components/auth-message":24,"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/utils/mount-component":61,"react-redux":"react-redux"}],4:[function(require,module,exports){
  105. 'use strict';
  106. Object.defineProperty(exports, "__esModule", {
  107. value: true
  108. });
  109. exports.default = initializer;
  110. var _index = require('../../../../../documents/misago/frontend/src/index');
  111. var _index2 = _interopRequireDefault(_index);
  112. var _auth = require('../../../../../documents/misago/frontend/src/reducers/auth');
  113. var _auth2 = _interopRequireDefault(_auth);
  114. var _store = require('../../../../../documents/misago/frontend/src/services/store');
  115. var _store2 = _interopRequireDefault(_store);
  116. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  117. function initializer(context) {
  118. _store2.default.addReducer('auth', _auth2.default, Object.assign({
  119. 'isAuthenticated': context.get('isAuthenticated'),
  120. 'isAnonymous': !context.get('isAuthenticated'),
  121. 'user': context.get('user')
  122. }, _auth.initialState));
  123. }
  124. _index2.default.addInitializer({
  125. name: 'reducer:auth',
  126. initializer: initializer,
  127. before: 'store'
  128. });
  129. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/reducers/auth":46,"../../../../../documents/misago/frontend/src/services/store":58}],5:[function(require,module,exports){
  130. 'use strict';
  131. Object.defineProperty(exports, "__esModule", {
  132. value: true
  133. });
  134. exports.default = initializer;
  135. var _index = require('../../../../../documents/misago/frontend/src/index');
  136. var _index2 = _interopRequireDefault(_index);
  137. var _auth = require('../../../../../documents/misago/frontend/src/services/auth');
  138. var _auth2 = _interopRequireDefault(_auth);
  139. var _modal = require('../../../../../documents/misago/frontend/src/services/modal');
  140. var _modal2 = _interopRequireDefault(_modal);
  141. var _store = require('../../../../../documents/misago/frontend/src/services/store');
  142. var _store2 = _interopRequireDefault(_store);
  143. var _localStorage = require('../../../../../documents/misago/frontend/src/services/local-storage');
  144. var _localStorage2 = _interopRequireDefault(_localStorage);
  145. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  146. function initializer() {
  147. _auth2.default.init(_store2.default, _localStorage2.default, _modal2.default);
  148. }
  149. _index2.default.addInitializer({
  150. name: 'auth',
  151. initializer: initializer,
  152. after: 'store'
  153. });
  154. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/services/auth":51,"../../../../../documents/misago/frontend/src/services/local-storage":54,"../../../../../documents/misago/frontend/src/services/modal":56,"../../../../../documents/misago/frontend/src/services/store":58}],6:[function(require,module,exports){
  155. 'use strict';
  156. Object.defineProperty(exports, "__esModule", {
  157. value: true
  158. });
  159. exports.default = initializer;
  160. var _index = require('../../../../../documents/misago/frontend/src/index');
  161. var _index2 = _interopRequireDefault(_index);
  162. var _bannedPage = require('../../../../../documents/misago/frontend/src/utils/banned-page');
  163. var _bannedPage2 = _interopRequireDefault(_bannedPage);
  164. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  165. function initializer(context) {
  166. if (context.get('BAN_MESSAGE')) {
  167. (0, _bannedPage2.default)(context.get('BAN_MESSAGE'), false);
  168. }
  169. }
  170. _index2.default.addInitializer({
  171. name: 'component:baned-page',
  172. initializer: initializer,
  173. after: 'store'
  174. });
  175. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/utils/banned-page":60}],7:[function(require,module,exports){
  176. 'use strict';
  177. Object.defineProperty(exports, "__esModule", {
  178. value: true
  179. });
  180. exports.default = initializer;
  181. var _index = require('../../../../../documents/misago/frontend/src/index');
  182. var _index2 = _interopRequireDefault(_index);
  183. var _ajax = require('../../../../../documents/misago/frontend/src/services/ajax');
  184. var _ajax2 = _interopRequireDefault(_ajax);
  185. var _captcha = require('../../../../../documents/misago/frontend/src/services/captcha');
  186. var _captcha2 = _interopRequireDefault(_captcha);
  187. var _include = require('../../../../../documents/misago/frontend/src/services/include');
  188. var _include2 = _interopRequireDefault(_include);
  189. var _snackbar = require('../../../../../documents/misago/frontend/src/services/snackbar');
  190. var _snackbar2 = _interopRequireDefault(_snackbar);
  191. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  192. function initializer(context) {
  193. _captcha2.default.init(context, _ajax2.default, _include2.default, _snackbar2.default);
  194. }
  195. _index2.default.addInitializer({
  196. name: 'captcha',
  197. initializer: initializer
  198. });
  199. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/services/ajax":50,"../../../../../documents/misago/frontend/src/services/captcha":52,"../../../../../documents/misago/frontend/src/services/include":53,"../../../../../documents/misago/frontend/src/services/snackbar":57}],8:[function(require,module,exports){
  200. 'use strict';
  201. Object.defineProperty(exports, "__esModule", {
  202. value: true
  203. });
  204. exports.default = initializer;
  205. var _index = require('../../../../../documents/misago/frontend/src/index');
  206. var _index2 = _interopRequireDefault(_index);
  207. var _include = require('../../../../../documents/misago/frontend/src/services/include');
  208. var _include2 = _interopRequireDefault(_include);
  209. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  210. function initializer(context) {
  211. _include2.default.init(context.get('STATIC_URL'));
  212. }
  213. _index2.default.addInitializer({
  214. name: 'include',
  215. initializer: initializer
  216. });
  217. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/services/include":53}],9:[function(require,module,exports){
  218. 'use strict';
  219. Object.defineProperty(exports, "__esModule", {
  220. value: true
  221. });
  222. exports.default = initializer;
  223. var _index = require('../../../../../documents/misago/frontend/src/index');
  224. var _index2 = _interopRequireDefault(_index);
  225. var _localStorage = require('../../../../../documents/misago/frontend/src/services/local-storage');
  226. var _localStorage2 = _interopRequireDefault(_localStorage);
  227. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  228. function initializer() {
  229. _localStorage2.default.init('misago_');
  230. }
  231. _index2.default.addInitializer({
  232. name: 'local-storage',
  233. initializer: initializer
  234. });
  235. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/services/local-storage":54}],10:[function(require,module,exports){
  236. 'use strict';
  237. Object.defineProperty(exports, "__esModule", {
  238. value: true
  239. });
  240. exports.default = initializer;
  241. var _index = require('../../../../../documents/misago/frontend/src/index');
  242. var _index2 = _interopRequireDefault(_index);
  243. var _mobileNavbarDropdown = require('../../../../../documents/misago/frontend/src/services/mobile-navbar-dropdown');
  244. var _mobileNavbarDropdown2 = _interopRequireDefault(_mobileNavbarDropdown);
  245. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  246. function initializer() {
  247. var element = document.getElementById('mobile-navbar-dropdown-mount');
  248. if (element) {
  249. _mobileNavbarDropdown2.default.init(element);
  250. }
  251. }
  252. _index2.default.addInitializer({
  253. name: 'dropdown',
  254. initializer: initializer,
  255. before: 'store'
  256. });
  257. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/services/mobile-navbar-dropdown":55}],11:[function(require,module,exports){
  258. 'use strict';
  259. Object.defineProperty(exports, "__esModule", {
  260. value: true
  261. });
  262. exports.default = initializer;
  263. var _index = require('../../../../../documents/misago/frontend/src/index');
  264. var _index2 = _interopRequireDefault(_index);
  265. var _modal = require('../../../../../documents/misago/frontend/src/services/modal');
  266. var _modal2 = _interopRequireDefault(_modal);
  267. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  268. function initializer() {
  269. var element = document.getElementById('modal-mount');
  270. if (element) {
  271. _modal2.default.init(element);
  272. }
  273. }
  274. _index2.default.addInitializer({
  275. name: 'modal',
  276. initializer: initializer,
  277. before: 'store'
  278. });
  279. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/services/modal":56}],12:[function(require,module,exports){
  280. 'use strict';
  281. Object.defineProperty(exports, "__esModule", {
  282. value: true
  283. });
  284. exports.default = initializer;
  285. var _moment = require('moment');
  286. var _moment2 = _interopRequireDefault(_moment);
  287. var _index = require('../../../../../documents/misago/frontend/src/index');
  288. var _index2 = _interopRequireDefault(_index);
  289. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  290. function initializer() {
  291. _moment2.default.locale($('html').attr('lang'));
  292. }
  293. _index2.default.addInitializer({
  294. name: 'moment',
  295. initializer: initializer
  296. });
  297. },{"../../../../../documents/misago/frontend/src/index":45,"moment":"moment"}],13:[function(require,module,exports){
  298. 'use strict';
  299. Object.defineProperty(exports, "__esModule", {
  300. value: true
  301. });
  302. exports.default = initializer;
  303. var _index = require('../../../../../documents/misago/frontend/src/index');
  304. var _index2 = _interopRequireDefault(_index);
  305. var _requestActivationLink = require('../../../../../documents/misago/frontend/src/components/request-activation-link');
  306. var _requestActivationLink2 = _interopRequireDefault(_requestActivationLink);
  307. var _mountComponent = require('../../../../../documents/misago/frontend/src/utils/mount-component');
  308. var _mountComponent2 = _interopRequireDefault(_mountComponent);
  309. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  310. function initializer() {
  311. if (document.getElementById('request-activation-link-mount')) {
  312. (0, _mountComponent2.default)(_requestActivationLink2.default, 'request-activation-link-mount', false);
  313. }
  314. }
  315. _index2.default.addInitializer({
  316. name: 'component:request-activation-link',
  317. initializer: initializer,
  318. after: 'store'
  319. });
  320. },{"../../../../../documents/misago/frontend/src/components/request-activation-link":37,"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/utils/mount-component":61}],14:[function(require,module,exports){
  321. 'use strict';
  322. Object.defineProperty(exports, "__esModule", {
  323. value: true
  324. });
  325. exports.default = initializer;
  326. var _index = require('../../../../../documents/misago/frontend/src/index');
  327. var _index2 = _interopRequireDefault(_index);
  328. var _requestPasswordReset = require('../../../../../documents/misago/frontend/src/components/request-password-reset');
  329. var _requestPasswordReset2 = _interopRequireDefault(_requestPasswordReset);
  330. var _mountComponent = require('../../../../../documents/misago/frontend/src/utils/mount-component');
  331. var _mountComponent2 = _interopRequireDefault(_mountComponent);
  332. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  333. function initializer() {
  334. if (document.getElementById('request-password-reset-mount')) {
  335. (0, _mountComponent2.default)(_requestPasswordReset2.default, 'request-password-reset-mount', false);
  336. }
  337. }
  338. _index2.default.addInitializer({
  339. name: 'component:request-password-reset',
  340. initializer: initializer,
  341. after: 'store'
  342. });
  343. },{"../../../../../documents/misago/frontend/src/components/request-password-reset":38,"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/utils/mount-component":61}],15:[function(require,module,exports){
  344. 'use strict';
  345. Object.defineProperty(exports, "__esModule", {
  346. value: true
  347. });
  348. exports.default = initializer;
  349. var _index = require('../../../../../documents/misago/frontend/src/index');
  350. var _index2 = _interopRequireDefault(_index);
  351. var _resetPasswordForm = require('../../../../../documents/misago/frontend/src/components/reset-password-form');
  352. var _resetPasswordForm2 = _interopRequireDefault(_resetPasswordForm);
  353. var _mountComponent = require('../../../../../documents/misago/frontend/src/utils/mount-component');
  354. var _mountComponent2 = _interopRequireDefault(_mountComponent);
  355. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  356. function initializer() {
  357. if (document.getElementById('reset-password-form-mount')) {
  358. (0, _mountComponent2.default)(_resetPasswordForm2.default, 'reset-password-form-mount', false);
  359. }
  360. }
  361. _index2.default.addInitializer({
  362. name: 'component:reset-password-form',
  363. initializer: initializer,
  364. after: 'store'
  365. });
  366. },{"../../../../../documents/misago/frontend/src/components/reset-password-form":39,"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/utils/mount-component":61}],16:[function(require,module,exports){
  367. 'use strict';
  368. Object.defineProperty(exports, "__esModule", {
  369. value: true
  370. });
  371. exports.default = initializer;
  372. var _reactRedux = require('react-redux');
  373. var _index = require('../../../../../documents/misago/frontend/src/index');
  374. var _index2 = _interopRequireDefault(_index);
  375. var _snackbar = require('../../../../../documents/misago/frontend/src/components/snackbar');
  376. var _mountComponent = require('../../../../../documents/misago/frontend/src/utils/mount-component');
  377. var _mountComponent2 = _interopRequireDefault(_mountComponent);
  378. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  379. function initializer() {
  380. (0, _mountComponent2.default)((0, _reactRedux.connect)(_snackbar.select)(_snackbar.Snackbar), 'snackbar-mount');
  381. }
  382. _index2.default.addInitializer({
  383. name: 'component:snackbar',
  384. initializer: initializer,
  385. after: 'snackbar'
  386. });
  387. },{"../../../../../documents/misago/frontend/src/components/snackbar":41,"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/utils/mount-component":61,"react-redux":"react-redux"}],17:[function(require,module,exports){
  388. 'use strict';
  389. Object.defineProperty(exports, "__esModule", {
  390. value: true
  391. });
  392. exports.default = initializer;
  393. var _index = require('../../../../../documents/misago/frontend/src/index');
  394. var _index2 = _interopRequireDefault(_index);
  395. var _snackbar = require('../../../../../documents/misago/frontend/src/reducers/snackbar');
  396. var _snackbar2 = _interopRequireDefault(_snackbar);
  397. var _store = require('../../../../../documents/misago/frontend/src/services/store');
  398. var _store2 = _interopRequireDefault(_store);
  399. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  400. function initializer() {
  401. _store2.default.addReducer('snackbar', _snackbar2.default, _snackbar.initialState);
  402. }
  403. _index2.default.addInitializer({
  404. name: 'reducer:snackbar',
  405. initializer: initializer,
  406. before: 'store'
  407. });
  408. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/reducers/snackbar":47,"../../../../../documents/misago/frontend/src/services/store":58}],18:[function(require,module,exports){
  409. 'use strict';
  410. Object.defineProperty(exports, "__esModule", {
  411. value: true
  412. });
  413. exports.default = initializer;
  414. var _index = require('../../../../../documents/misago/frontend/src/index');
  415. var _index2 = _interopRequireDefault(_index);
  416. var _snackbar = require('../../../../../documents/misago/frontend/src/services/snackbar');
  417. var _snackbar2 = _interopRequireDefault(_snackbar);
  418. var _store = require('../../../../../documents/misago/frontend/src/services/store');
  419. var _store2 = _interopRequireDefault(_store);
  420. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  421. function initializer() {
  422. _snackbar2.default.init(_store2.default);
  423. }
  424. _index2.default.addInitializer({
  425. name: 'snackbar',
  426. initializer: initializer,
  427. after: 'store'
  428. });
  429. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/services/snackbar":57,"../../../../../documents/misago/frontend/src/services/store":58}],19:[function(require,module,exports){
  430. 'use strict';
  431. Object.defineProperty(exports, "__esModule", {
  432. value: true
  433. });
  434. exports.default = initializer;
  435. var _index = require('../../../../../documents/misago/frontend/src/index');
  436. var _index2 = _interopRequireDefault(_index);
  437. var _store = require('../../../../../documents/misago/frontend/src/services/store');
  438. var _store2 = _interopRequireDefault(_store);
  439. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  440. function initializer() {
  441. _store2.default.init();
  442. }
  443. _index2.default.addInitializer({
  444. name: 'store',
  445. initializer: initializer,
  446. before: '_end'
  447. });
  448. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/services/store":58}],20:[function(require,module,exports){
  449. 'use strict';
  450. Object.defineProperty(exports, "__esModule", {
  451. value: true
  452. });
  453. exports.default = initializer;
  454. var _index = require('../../../../../documents/misago/frontend/src/index');
  455. var _index2 = _interopRequireDefault(_index);
  456. var _tick = require('../../../../../documents/misago/frontend/src/reducers/tick');
  457. var _tick2 = _interopRequireDefault(_tick);
  458. var _store = require('../../../../../documents/misago/frontend/src/services/store');
  459. var _store2 = _interopRequireDefault(_store);
  460. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  461. function initializer() {
  462. _store2.default.addReducer('tick', _tick2.default, _tick.initialState);
  463. }
  464. _index2.default.addInitializer({
  465. name: 'reducer:tick',
  466. initializer: initializer,
  467. before: 'store'
  468. });
  469. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/reducers/tick":48,"../../../../../documents/misago/frontend/src/services/store":58}],21:[function(require,module,exports){
  470. 'use strict';
  471. Object.defineProperty(exports, "__esModule", {
  472. value: true
  473. });
  474. exports.default = initializer;
  475. var _index = require('../../../../../documents/misago/frontend/src/index');
  476. var _index2 = _interopRequireDefault(_index);
  477. var _tick = require('../../../../../documents/misago/frontend/src/reducers/tick');
  478. var _store = require('../../../../../documents/misago/frontend/src/services/store');
  479. var _store2 = _interopRequireDefault(_store);
  480. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  481. var TICK_PERIOD = 50 * 1000; //do the tick every 50s
  482. function initializer() {
  483. window.setInterval(function () {
  484. _store2.default.dispatch((0, _tick.doTick)());
  485. }, TICK_PERIOD);
  486. }
  487. _index2.default.addInitializer({
  488. name: 'tick-start',
  489. initializer: initializer,
  490. after: 'store'
  491. });
  492. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/reducers/tick":48,"../../../../../documents/misago/frontend/src/services/store":58}],22:[function(require,module,exports){
  493. 'use strict';
  494. Object.defineProperty(exports, "__esModule", {
  495. value: true
  496. });
  497. exports.default = initializer;
  498. var _reactRedux = require('react-redux');
  499. var _index = require('../../../../../documents/misago/frontend/src/index');
  500. var _index2 = _interopRequireDefault(_index);
  501. var _root = require('../../../../../documents/misago/frontend/src/components/user-menu/root');
  502. var _mountComponent = require('../../../../../documents/misago/frontend/src/utils/mount-component');
  503. var _mountComponent2 = _interopRequireDefault(_mountComponent);
  504. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  505. function initializer() {
  506. (0, _mountComponent2.default)((0, _reactRedux.connect)(_root.select)(_root.UserMenu), 'user-menu-mount');
  507. (0, _mountComponent2.default)((0, _reactRedux.connect)(_root.select)(_root.CompactUserMenu), 'user-menu-compact-mount');
  508. }
  509. _index2.default.addInitializer({
  510. name: 'component:user-menu',
  511. initializer: initializer,
  512. after: 'store'
  513. });
  514. },{"../../../../../documents/misago/frontend/src/components/user-menu/root":43,"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/utils/mount-component":61,"react-redux":"react-redux"}],23:[function(require,module,exports){
  515. 'use strict';
  516. Object.defineProperty(exports, "__esModule", {
  517. value: true
  518. });
  519. exports.default = initializer;
  520. var _index = require('../../../../../documents/misago/frontend/src/index');
  521. var _index2 = _interopRequireDefault(_index);
  522. var _include = require('../../../../../documents/misago/frontend/src/services/include');
  523. var _include2 = _interopRequireDefault(_include);
  524. var _zxcvbn = require('../../../../../documents/misago/frontend/src/services/zxcvbn');
  525. var _zxcvbn2 = _interopRequireDefault(_zxcvbn);
  526. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  527. function initializer() {
  528. _zxcvbn2.default.init(_include2.default);
  529. }
  530. _index2.default.addInitializer({
  531. name: 'zxcvbn',
  532. initializer: initializer
  533. });
  534. },{"../../../../../documents/misago/frontend/src/index":45,"../../../../../documents/misago/frontend/src/services/include":53,"../../../../../documents/misago/frontend/src/services/zxcvbn":59}],24:[function(require,module,exports){
  535. "use strict";
  536. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  537. Object.defineProperty(exports, "__esModule", {
  538. value: true
  539. });
  540. exports.select = select;
  541. var _react = require("react");
  542. var _react2 = _interopRequireDefault(_react);
  543. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  544. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  545. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  546. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  547. var _class = function (_React$Component) {
  548. _inherits(_class, _React$Component);
  549. function _class() {
  550. _classCallCheck(this, _class);
  551. return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
  552. }
  553. _createClass(_class, [{
  554. key: "refresh",
  555. value: function refresh() {
  556. window.location.reload();
  557. }
  558. }, {
  559. key: "getMessage",
  560. value: function getMessage() {
  561. if (this.props.signedIn) {
  562. return interpolate(gettext("You have signed in as %(username)s. Please refresh the page before continuing."), { username: this.props.signedIn.username }, true);
  563. } else if (this.props.signedOut) {
  564. return interpolate(gettext("%(username)s, you have been signed out. Please refresh the page before continuing."), { username: this.props.user.username }, true);
  565. }
  566. }
  567. }, {
  568. key: "getClassName",
  569. value: function getClassName() {
  570. if (this.props.signedIn || this.props.signedOut) {
  571. return "auth-message show";
  572. } else {
  573. return "auth-message";
  574. }
  575. }
  576. }, {
  577. key: "render",
  578. value: function render() {
  579. /* jshint ignore:start */
  580. return _react2.default.createElement(
  581. "div",
  582. { className: this.getClassName() },
  583. _react2.default.createElement(
  584. "div",
  585. { className: "container" },
  586. _react2.default.createElement(
  587. "p",
  588. { className: "lead" },
  589. this.getMessage()
  590. ),
  591. _react2.default.createElement(
  592. "p",
  593. null,
  594. _react2.default.createElement(
  595. "button",
  596. { type: "button", className: "btn btn-default",
  597. onClick: this.refresh },
  598. gettext("Reload page")
  599. ),
  600. " ",
  601. _react2.default.createElement(
  602. "span",
  603. { className: "hidden-xs hidden-sm text-muted" },
  604. gettext("or press F5 key.")
  605. )
  606. )
  607. )
  608. );
  609. /* jshint ignore:end */
  610. }
  611. }]);
  612. return _class;
  613. }(_react2.default.Component);
  614. exports.default = _class;
  615. function select(state) {
  616. return {
  617. user: state.auth.user,
  618. signedIn: state.auth.signedIn,
  619. signedOut: state.auth.signedOut
  620. };
  621. }
  622. },{"react":"react"}],25:[function(require,module,exports){
  623. 'use strict';
  624. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  625. Object.defineProperty(exports, "__esModule", {
  626. value: true
  627. });
  628. var _react = require('react');
  629. var _react2 = _interopRequireDefault(_react);
  630. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  631. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  632. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  633. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  634. var BASE_URL = $('base').attr('href') + 'user-avatar/';
  635. var _class = function (_React$Component) {
  636. _inherits(_class, _React$Component);
  637. function _class() {
  638. _classCallCheck(this, _class);
  639. return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
  640. }
  641. _createClass(_class, [{
  642. key: 'getSrc',
  643. value: function getSrc() {
  644. var size = this.props.size || 100; // jshint ignore:line
  645. var url = BASE_URL;
  646. if (this.props.user && this.props.user.id) {
  647. // just avatar hash, size and user id
  648. url += this.props.user.avatar_hash + '/' + size + '/' + this.props.user.id + '.png';
  649. } else {
  650. // just append avatar size to file to produce no-avatar placeholder
  651. url += size + '.png';
  652. }
  653. return url;
  654. }
  655. }, {
  656. key: 'render',
  657. value: function render() {
  658. /* jshint ignore:start */
  659. return _react2.default.createElement('img', { src: this.getSrc(),
  660. className: this.props.className || 'user-avatar',
  661. title: gettext("User avatar") });
  662. /* jshint ignore:end */
  663. }
  664. }]);
  665. return _class;
  666. }(_react2.default.Component);
  667. exports.default = _class;
  668. },{"react":"react"}],26:[function(require,module,exports){
  669. 'use strict';
  670. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  671. Object.defineProperty(exports, "__esModule", {
  672. value: true
  673. });
  674. var _moment = require('moment');
  675. var _moment2 = _interopRequireDefault(_moment);
  676. var _react = require('react');
  677. var _react2 = _interopRequireDefault(_react);
  678. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  679. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  680. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  681. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  682. var _class = function (_React$Component) {
  683. _inherits(_class, _React$Component);
  684. function _class() {
  685. _classCallCheck(this, _class);
  686. return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
  687. }
  688. _createClass(_class, [{
  689. key: 'getReasonMessage',
  690. value: function getReasonMessage() {
  691. /* jshint ignore:start */
  692. if (this.props.message.html) {
  693. return _react2.default.createElement('div', { className: 'lead',
  694. dangerouslySetInnerHTML: { __html: this.props.message.html } });
  695. } else {
  696. return _react2.default.createElement(
  697. 'p',
  698. { className: 'lead' },
  699. this.props.message.plain
  700. );
  701. }
  702. /* jshint ignore:end */
  703. }
  704. }, {
  705. key: 'getExpirationMessage',
  706. value: function getExpirationMessage() {
  707. if (this.props.expires) {
  708. if (this.props.expires.isAfter((0, _moment2.default)())) {
  709. return interpolate(gettext("This ban expires %(expires_on)s."), { 'expires_on': this.props.expires.fromNow() }, true);
  710. } else {
  711. return gettext("This ban has expired.");
  712. }
  713. } else {
  714. return gettext("This ban is permanent.");
  715. }
  716. }
  717. }, {
  718. key: 'render',
  719. value: function render() {
  720. /* jshint ignore:start */
  721. return _react2.default.createElement(
  722. 'div',
  723. { className: 'page page-error page-error-banned' },
  724. _react2.default.createElement(
  725. 'div',
  726. { className: 'container' },
  727. _react2.default.createElement(
  728. 'div',
  729. { className: 'message-panel' },
  730. _react2.default.createElement(
  731. 'div',
  732. { className: 'message-icon' },
  733. _react2.default.createElement(
  734. 'span',
  735. { className: 'material-icon' },
  736. 'highlight_off'
  737. )
  738. ),
  739. _react2.default.createElement(
  740. 'div',
  741. { className: 'message-body' },
  742. this.getReasonMessage(),
  743. _react2.default.createElement(
  744. 'p',
  745. { className: 'message-footnote' },
  746. this.getExpirationMessage()
  747. )
  748. )
  749. )
  750. )
  751. );
  752. /* jshint ignore:end */
  753. }
  754. }]);
  755. return _class;
  756. }(_react2.default.Component);
  757. exports.default = _class;
  758. },{"moment":"moment","react":"react"}],27:[function(require,module,exports){
  759. 'use strict';
  760. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  761. Object.defineProperty(exports, "__esModule", {
  762. value: true
  763. });
  764. var _react = require('react');
  765. var _react2 = _interopRequireDefault(_react);
  766. var _loader = require('./loader');
  767. var _loader2 = _interopRequireDefault(_loader);
  768. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  769. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  770. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  771. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  772. // jshint ignore:line
  773. var Button = function (_React$Component) {
  774. _inherits(Button, _React$Component);
  775. function Button() {
  776. _classCallCheck(this, Button);
  777. return _possibleConstructorReturn(this, Object.getPrototypeOf(Button).apply(this, arguments));
  778. }
  779. _createClass(Button, [{
  780. key: 'render',
  781. value: function render() {
  782. var className = 'btn ' + this.props.className;
  783. var disabled = this.props.disabled;
  784. if (this.props.loading) {
  785. className += ' btn-loading';
  786. disabled = true;
  787. }
  788. /* jshint ignore:start */
  789. return _react2.default.createElement(
  790. 'button',
  791. { type: this.props.onClick ? 'button' : 'submit',
  792. className: className,
  793. disabled: disabled,
  794. onClick: this.props.onClick },
  795. this.props.children,
  796. this.props.loading ? _react2.default.createElement(_loader2.default, null) : null
  797. );
  798. /* jshint ignore:end */
  799. }
  800. }]);
  801. return Button;
  802. }(_react2.default.Component);
  803. exports.default = Button;
  804. Button.defaultProps = {
  805. className: "btn-default",
  806. type: "submit",
  807. loading: false,
  808. disabled: false,
  809. onClick: null
  810. };
  811. },{"./loader":32,"react":"react"}],28:[function(require,module,exports){
  812. 'use strict';
  813. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  814. Object.defineProperty(exports, "__esModule", {
  815. value: true
  816. });
  817. var _react = require('react');
  818. var _react2 = _interopRequireDefault(_react);
  819. var _avatar = require('../avatar');
  820. var _avatar2 = _interopRequireDefault(_avatar);
  821. var _button = require('../button');
  822. var _button2 = _interopRequireDefault(_button);
  823. var _loader = require('../loader');
  824. var _loader2 = _interopRequireDefault(_loader);
  825. var _ajax = require('../../services/ajax');
  826. var _ajax2 = _interopRequireDefault(_ajax);
  827. var _snackbar = require('../../services/snackbar');
  828. var _snackbar2 = _interopRequireDefault(_snackbar);
  829. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  830. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  831. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  832. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
  833. // jshint ignore:line
  834. // jshint ignore:line
  835. var _class = function (_React$Component) {
  836. _inherits(_class, _React$Component);
  837. function _class(props) {
  838. _classCallCheck(this, _class);
  839. var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
  840. _this.setGravatar = function () {
  841. _this.callApi('gravatar');
  842. };
  843. _this.setGenerated = function () {
  844. _this.callApi('generated');
  845. };
  846. _this.state = {
  847. 'isLoading': false
  848. };
  849. return _this;
  850. }
  851. _createClass(_class, [{
  852. key: 'callApi',
  853. value: function callApi(avatarType) {
  854. var _this2 = this;
  855. if (this.state.isLoading) {
  856. return false;
  857. }
  858. this.setState({
  859. 'isLoading': true
  860. });
  861. _ajax2.default.post(this.props.user.avatar_api_url, {
  862. avatar: avatarType
  863. }).then(function (response) {
  864. _snackbar2.default.success(response.detail);
  865. _this2.props.updateAvatar(response.avatar_hash, response.options);
  866. _this2.setState({
  867. 'isLoading': false
  868. });
  869. }, function (rejection) {
  870. if (rejection.status === 400) {
  871. _snackbar2.default.error(rejection.detail);
  872. } else {
  873. _snackbar2.default.showError(rejection);
  874. }
  875. _this2.setState({
  876. 'isLoading': false
  877. });
  878. });
  879. }
  880. /* jshint ignore:start */
  881. }, {
  882. key: 'getGravatarButton',
  883. /* jshint ignore:end */
  884. value: function getGravatarButton() {
  885. if (this.props.options.gravatar) {
  886. /* jshint ignore:start */
  887. return _react2.default.createElement(
  888. _button2.default,
  889. { onClick: this.setGravatar,
  890. disabled: this.state.isLoading,
  891. className: 'btn-default btn-block' },
  892. gettext("Download my Gravatar")
  893. );
  894. /* jshint ignore:end */
  895. } else {
  896. return null;
  897. }
  898. }
  899. }, {
  900. key: 'getAvatarPreview',
  901. value: function getAvatarPreview() {
  902. if (this.state.isLoading) {
  903. /* jshint ignore:start */
  904. return _react2.default.createElement(
  905. 'div',
  906. { className: 'avatar-preview preview-loading' },
  907. _react2.default.createElement(_avatar2.default, { user: this.props.user, size: '200' }),
  908. _react2.default.createElement(_loader2.default, null)
  909. );
  910. /* jshint ignore:end */
  911. } else {
  912. /* jshint ignore:start */
  913. return _react2.default.createElement(
  914. 'div',
  915. { className: 'avatar-preview' },
  916. _react2.default.createElement(_avatar2.default, { user: this.props.user, size: '200' })
  917. );
  918. /* jshint ignore:end */
  919. }
  920. }
  921. }, {
  922. key: 'render',
  923. value: function render() {
  924. /* jshint ignore:start */
  925. return _react2.default.createElement(
  926. 'div',
  927. { className: 'modal-body modal-avatar-index' },
  928. _react2.default.createElement(
  929. 'div',
  930. { className: 'row' },
  931. _react2.default.createElement(
  932. 'div',
  933. { className: 'col-md-5' },
  934. this.getAvatarPreview()
  935. ),
  936. _react2.default.createElement(
  937. 'div',
  938. { className: 'col-md-7' },
  939. this.getGravatarButton(),
  940. _react2.default.createElement(
  941. _button2.default,
  942. { onClick: this.setGenerated,
  943. disabled: this.state.isLoading,
  944. className: 'btn-default btn-block' },
  945. gettext("Generate my individual avatar")
  946. )
  947. )
  948. )
  949. );
  950. /* jshint ignore:end */
  951. }
  952. }]);
  953. return _class;
  954. }(_react2.default.Component);
  955. exports.default = _class;
  956. },{"../../services/ajax":50,"../../services/snackbar":57,"../avatar":25,"../button":27,"../loader":32,"react":"react"}],29:[function(require,module,exports){
  957. 'use strict';
  958. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  959. Object.defineProperty(exports, "__esModule", {
  960. value: true
  961. });
  962. exports.ChangeAvatarError = undefined;
  963. exports.select = select;
  964. var _react = require('react');
  965. var _react2 = _interopRequireDefault(_react);
  966. var _index = require('./index');
  967. var _index2 = _interopRequireDefault(_index);
  968. var _modalLoader = require('../modal-loader');
  969. var _modalLoader2 = _interopRequireDefault(_modalLoader);
  970. var _index3 = require('../../index');
  971. var _index4 = _interopRequireDefault(_index3);
  972. var _users = require('../../reducers/users');
  973. var _ajax = require('../../services/ajax');
  974. var _ajax2 = _interopRequireDefault(_ajax);
  975. var _store = require('../../services/store');
  976. var _store2 = _interopRequireDefault(_store);
  977. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  978. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  979. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  980. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
  981. // jshint ignore:line
  982. // jshint ignore:line
  983. // jshint ignore:line
  984. var ChangeAvatarError = exports.ChangeAvatarError = function (_React$Component) {
  985. _inherits(ChangeAvatarError, _React$Component);
  986. function ChangeAvatarError() {
  987. _classCallCheck(this, ChangeAvatarError);
  988. return _possibleConstructorReturn(this, Object.getPrototypeOf(ChangeAvatarError).apply(this, arguments));
  989. }
  990. _createClass(ChangeAvatarError, [{
  991. key: 'getErrorReason',
  992. value: function getErrorReason() {
  993. if (this.props.reason) {
  994. /* jshint ignore:start */
  995. return _react2.default.createElement('p', { dangerouslySetInnerHTML: { __html: this.props.reason } });
  996. /* jshint ignore:end */
  997. } else {
  998. return null;
  999. }
  1000. }
  1001. }, {
  1002. key: 'render',
  1003. value: function render() {
  1004. /* jshint ignore:start */
  1005. return _react2.default.createElement(
  1006. 'div',
  1007. { className: 'modal-body' },
  1008. _react2.default.createElement(
  1009. 'div',
  1010. { className: 'message-icon' },
  1011. _react2.default.createElement(
  1012. 'span',
  1013. { className: 'material-icon' },
  1014. 'remove_circle_outline'
  1015. )
  1016. ),
  1017. _react2.default.createElement(
  1018. 'div',
  1019. { className: 'message-body' },
  1020. _react2.default.createElement(
  1021. 'p',
  1022. { className: 'lead' },
  1023. this.props.message
  1024. ),
  1025. this.getErrorReason()
  1026. )
  1027. );
  1028. /* jshint ignore:end */
  1029. }
  1030. }]);
  1031. return ChangeAvatarError;
  1032. }(_react2.default.Component);
  1033. var _class = function (_React$Component2) {
  1034. _inherits(_class, _React$Component2);
  1035. function _class() {
  1036. var _Object$getPrototypeO;
  1037. var _temp, _this2, _ret;
  1038. _classCallCheck(this, _class);
  1039. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  1040. args[_key] = arguments[_key];
  1041. }
  1042. return _ret = (_temp = (_this2 = _possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(_class)).call.apply(_Object$getPrototypeO, [this].concat(args))), _this2), _this2.showError = function (error) {
  1043. _this2.setState({
  1044. error: error
  1045. });
  1046. }, _this2.updateAvatar = function (avatarHash, options) {
  1047. _store2.default.dispatch((0, _users.updateAvatar)(_this2.props.user, avatarHash));
  1048. _this2.setState({
  1049. 'component': _index2.default,
  1050. options: options
  1051. });
  1052. }, _this2.showIndex = function () {
  1053. _this2.setState({
  1054. 'component': _index2.default
  1055. });
  1056. }, _temp), _possibleConstructorReturn(_this2, _ret);
  1057. }
  1058. _createClass(_class, [{
  1059. key: 'componentDidMount',
  1060. value: function componentDidMount() {
  1061. var _this3 = this;
  1062. Promise.all([_ajax2.default.get(_index4.default.get('user').avatar_api_url)]).then(function (resolutions) {
  1063. _this3.setState({
  1064. 'component': _index2.default,
  1065. 'options': resolutions[0]
  1066. });
  1067. }, function (rejection) {
  1068. _this3.showError(rejection);
  1069. });
  1070. }
  1071. /* jshint ignore:start */
  1072. }, {
  1073. key: 'getBody',
  1074. /* jshint ignore:end */
  1075. value: function getBody() {
  1076. if (this.state) {
  1077. if (this.state.error) {
  1078. /* jshint ignore:start */
  1079. return _react2.default.createElement(ChangeAvatarError, { message: this.state.error.detail,
  1080. reason: this.state.error.reason });
  1081. /* jshint ignore:end */
  1082. } else {
  1083. /* jshint ignore:start */
  1084. return _react2.default.createElement(this.state.component, { options: this.state.options,
  1085. user: this.props.user,
  1086. updateAvatar: this.updateAvatar,
  1087. showIndex: this.showIndex });
  1088. /* jshint ignore:end */
  1089. }
  1090. } else {
  1091. /* jshint ignore:start */
  1092. return _react2.default.createElement(_modalLoader2.default, null);
  1093. /* jshint ignore:end */
  1094. }
  1095. }
  1096. }, {
  1097. key: 'getClassName',
  1098. value: function getClassName() {
  1099. if (this.state && this.state.error) {
  1100. return "modal-dialog modal-message modal-change-avatar";
  1101. } else {
  1102. return "modal-dialog modal-change-avatar";
  1103. }
  1104. }
  1105. }, {
  1106. key: 'render',
  1107. value: function render() {
  1108. /* jshint ignore:start */
  1109. return _react2.default.createElement(
  1110. 'div',
  1111. { className: this.getClassName(),
  1112. role: 'document' },
  1113. _react2.default.createElement(
  1114. 'div',
  1115. { className: 'modal-content' },
  1116. _react2.default.createElement(
  1117. 'div',
  1118. { className: 'modal-header' },
  1119. _react2.default.createElement(
  1120. 'button',
  1121. { type: 'button', className: 'close', 'data-dismiss': 'modal',
  1122. 'aria-label': gettext("Close") },
  1123. _react2.default.createElement(
  1124. 'span',
  1125. { 'aria-hidden': 'true' },
  1126. '×'
  1127. )
  1128. ),
  1129. _react2.default.createElement(
  1130. 'h4',
  1131. { className: 'modal-title' },
  1132. gettext("Change your avatar")
  1133. )
  1134. ),
  1135. this.getBody()
  1136. )
  1137. );
  1138. /* jshint ignore:end */
  1139. }
  1140. }]);
  1141. return _class;
  1142. }(_react2.default.Component);
  1143. exports.default = _class;
  1144. function select(state) {
  1145. return {
  1146. 'user': state.auth.user
  1147. };
  1148. }
  1149. },{"../../index":45,"../../reducers/users":49,"../../services/ajax":50,"../../services/store":58,"../modal-loader":33,"./index":28,"react":"react"}],30:[function(require,module,exports){
  1150. 'use strict';
  1151. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  1152. Object.defineProperty(exports, "__esModule", {
  1153. value: true
  1154. });
  1155. var _react = require('react');
  1156. var _react2 = _interopRequireDefault(_react);
  1157. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  1158. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  1159. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  1160. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  1161. var _class = function (_React$Component) {
  1162. _inherits(_class, _React$Component);
  1163. function _class() {
  1164. _classCallCheck(this, _class);
  1165. return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
  1166. }
  1167. _createClass(_class, [{
  1168. key: 'isValidated',
  1169. value: function isValidated() {
  1170. return typeof this.props.validation !== "undefined";
  1171. }
  1172. }, {
  1173. key: 'getClassName',
  1174. value: function getClassName() {
  1175. var className = 'form-group';
  1176. if (this.isValidated()) {
  1177. className += ' has-feedback';
  1178. if (this.props.validation === null) {
  1179. className += ' has-success';
  1180. } else {
  1181. className += ' has-error';
  1182. }
  1183. }
  1184. return className;
  1185. }
  1186. }, {
  1187. key: 'getFeedback',
  1188. value: function getFeedback() {
  1189. var _this2 = this;
  1190. if (this.props.validation) {
  1191. /* jshint ignore:start */
  1192. return _react2.default.createElement(
  1193. 'div',
  1194. { className: 'help-block errors' },
  1195. this.props.validation.map(function (error, i) {
  1196. return _react2.default.createElement(
  1197. 'p',
  1198. { key: _this2.props.for + 'FeedbackItem' + i },
  1199. error
  1200. );
  1201. })
  1202. );
  1203. /* jshint ignore:end */
  1204. } else {
  1205. return null;
  1206. }
  1207. }
  1208. }, {
  1209. key: 'getFeedbackIcon',
  1210. value: function getFeedbackIcon() {
  1211. if (this.isValidated()) {
  1212. /* jshint ignore:start */
  1213. return _react2.default.createElement(
  1214. 'span',
  1215. { className: 'material-icon form-control-feedback',
  1216. 'aria-hidden': 'true', key: this.props.for + 'FeedbackIcon' },
  1217. this.props.validation ? 'clear' : 'check'
  1218. );
  1219. /* jshint ignore:end */
  1220. } else {
  1221. return null;
  1222. }
  1223. }
  1224. }, {
  1225. key: 'getFeedbackDescription',
  1226. value: function getFeedbackDescription() {
  1227. if (this.isValidated()) {
  1228. /* jshint ignore:start */
  1229. return _react2.default.createElement(
  1230. 'span',
  1231. { id: this.props.for + '_status', className: 'sr-only' },
  1232. this.props.validation ? gettext('(error)') : gettext('(success)')
  1233. );
  1234. /* jshint ignore:end */
  1235. } else {
  1236. return null;
  1237. }
  1238. }
  1239. }, {
  1240. key: 'getHelpText',
  1241. value: function getHelpText() {
  1242. if (this.props.helpText) {
  1243. /* jshint ignore:start */
  1244. return _react2.default.createElement(
  1245. 'p',
  1246. { className: 'help-block' },
  1247. this.props.helpText
  1248. );
  1249. /* jshint ignore:end */
  1250. } else {
  1251. return null;
  1252. }
  1253. }
  1254. }, {
  1255. key: 'render',
  1256. value: function render() {
  1257. /* jshint ignore:start */
  1258. return _react2.default.createElement(
  1259. 'div',
  1260. { className: this.getClassName() },
  1261. _react2.default.createElement(
  1262. 'label',
  1263. { className: 'control-label ' + (this.props.labelClass || ''),
  1264. htmlFor: this.props.for || '' },
  1265. this.props.label,
  1266. ':'
  1267. ),
  1268. _react2.default.createElement(
  1269. 'div',
  1270. { className: this.props.controlClass || '' },
  1271. this.props.children,
  1272. this.getFeedbackIcon(),
  1273. this.getFeedbackDescription(),
  1274. this.getFeedback(),
  1275. this.getHelpText(),
  1276. this.props.extra || null
  1277. )
  1278. );
  1279. /* jshint ignore:end */
  1280. }
  1281. }]);
  1282. return _class;
  1283. }(_react2.default.Component);
  1284. exports.default = _class;
  1285. },{"react":"react"}],31:[function(require,module,exports){
  1286. 'use strict';
  1287. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  1288. Object.defineProperty(exports, "__esModule", {
  1289. value: true
  1290. });
  1291. var _react = require('react');
  1292. var _react2 = _interopRequireDefault(_react);
  1293. var _validators = require('../utils/validators');
  1294. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  1295. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  1296. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  1297. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  1298. var validateRequired = (0, _validators.required)();
  1299. var _class = function (_React$Component) {
  1300. _inherits(_class, _React$Component);
  1301. function _class() {
  1302. var _Object$getPrototypeO;
  1303. var _temp, _this, _ret;
  1304. _classCallCheck(this, _class);
  1305. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  1306. args[_key] = arguments[_key];
  1307. }
  1308. return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(_class)).call.apply(_Object$getPrototypeO, [this].concat(args))), _this), _this.bindInput = function (name) {
  1309. return function (event) {
  1310. var newState = {};
  1311. newState[name] = event.target.value;
  1312. var formErrors = _this.state.errors || {};
  1313. formErrors[name] = _this.validateField(name, newState[name]);
  1314. newState.errors = formErrors;
  1315. _this.setState(newState);
  1316. };
  1317. }, _this.handleSubmit = function (event) {
  1318. // we don't reload page on submissions
  1319. event.preventDefault();
  1320. if (_this.state.isLoading) {
  1321. return;
  1322. }
  1323. if (_this.clean()) {
  1324. _this.setState({ 'isLoading': true });
  1325. var promise = _this.send();
  1326. if (promise) {
  1327. promise.then(function (success) {
  1328. _this.setState({ 'isLoading': false });
  1329. _this.handleSuccess(success);
  1330. }, function (rejection) {
  1331. _this.setState({ 'isLoading': false });
  1332. _this.handleError(rejection);
  1333. });
  1334. } else {
  1335. _this.setState({ 'isLoading': false });
  1336. }
  1337. }
  1338. }, _temp), _possibleConstructorReturn(_this, _ret);
  1339. }
  1340. _createClass(_class, [{
  1341. key: 'validate',
  1342. value: function validate() {
  1343. var errors = {};
  1344. var validators = {
  1345. required: this.state.validators.required || this.state.validators,
  1346. optional: this.state.validators.optional || {}
  1347. };
  1348. var validatedFields = [];
  1349. // add required fields to validation
  1350. for (var name in validators.required) {
  1351. if (validators.required.hasOwnProperty(name) && validators.required[name]) {
  1352. validatedFields.push(name);
  1353. }
  1354. }
  1355. // add optional fields to validation
  1356. for (var name in validators.optional) {
  1357. if (validators.optional.hasOwnProperty(name) && validators.optional[name]) {
  1358. validatedFields.push(name);
  1359. }
  1360. }
  1361. // validate fields values
  1362. for (var i in validatedFields) {
  1363. var name = validatedFields[i];
  1364. var fieldErrors = this.validateField(name, this.state[name]);
  1365. if (fieldErrors === null) {
  1366. errors[name] = null;
  1367. } else if (fieldErrors) {
  1368. errors[name] = fieldErrors;
  1369. }
  1370. }
  1371. return errors;
  1372. }
  1373. }, {
  1374. key: 'isValid',
  1375. value: function isValid() {
  1376. var errors = this.validate();
  1377. for (var field in errors) {
  1378. if (errors.hasOwnProperty(field)) {
  1379. if (errors[field] !== null) {
  1380. return false;
  1381. }
  1382. }
  1383. }
  1384. return true;
  1385. }
  1386. }, {
  1387. key: 'validateField',
  1388. value: function validateField(name, value) {
  1389. var errors = [];
  1390. var validators = {
  1391. required: (this.state.validators.required || this.state.validators)[name],
  1392. optional: (this.state.validators.optional || {})[name]
  1393. };
  1394. var requiredError = validateRequired(value) || false;
  1395. if (validators.required) {
  1396. if (requiredError) {
  1397. errors = [requiredError];
  1398. } else {
  1399. for (var i in validators.required) {
  1400. var validationError = validators.required[i](value);
  1401. if (validationError) {
  1402. errors.push(validationError);
  1403. }
  1404. }
  1405. }
  1406. return errors.length ? errors : null;
  1407. } else if (requiredError === false && validators.optional) {
  1408. for (var i in validators.optional) {
  1409. var validationError = validators.optional[i](value);
  1410. if (validationError) {
  1411. errors.push(validationError);
  1412. }
  1413. }
  1414. return errors.length ? errors : null;
  1415. }
  1416. return false; // false === field wasn't validated
  1417. }
  1418. /* jshint ignore:start */
  1419. }, {
  1420. key: 'clean',
  1421. value: function clean() {
  1422. return true;
  1423. }
  1424. }, {
  1425. key: 'send',
  1426. value: function send() {
  1427. return null;
  1428. }
  1429. }, {
  1430. key: 'handleSuccess',
  1431. value: function handleSuccess(success) {
  1432. return;
  1433. }
  1434. }, {
  1435. key: 'handleError',
  1436. /* jshint ignore:end */
  1437. value: function handleError(rejection) {
  1438. return;
  1439. }
  1440. }]);
  1441. return _class;
  1442. }(_react2.default.Component);
  1443. exports.default = _class;
  1444. },{"../utils/validators":63,"react":"react"}],32:[function(require,module,exports){
  1445. "use strict";
  1446. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  1447. Object.defineProperty(exports, "__esModule", {
  1448. value: true
  1449. });
  1450. var _react = require("react");
  1451. var _react2 = _interopRequireDefault(_react);
  1452. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  1453. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  1454. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  1455. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  1456. var _class = function (_React$Component) {
  1457. _inherits(_class, _React$Component);
  1458. function _class() {
  1459. _classCallCheck(this, _class);
  1460. return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
  1461. }
  1462. _createClass(_class, [{
  1463. key: "render",
  1464. value: function render() {
  1465. /* jshint ignore:start */
  1466. return _react2.default.createElement(
  1467. "div",
  1468. { className: "loader" },
  1469. _react2.default.createElement("div", { className: "loader-spinning-wheel" })
  1470. );
  1471. /* jshint ignore:end */
  1472. }
  1473. }]);
  1474. return _class;
  1475. }(_react2.default.Component);
  1476. exports.default = _class;
  1477. },{"react":"react"}],33:[function(require,module,exports){
  1478. 'use strict';
  1479. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  1480. Object.defineProperty(exports, "__esModule", {
  1481. value: true
  1482. });
  1483. var _react = require('react');
  1484. var _react2 = _interopRequireDefault(_react);
  1485. var _loader = require('./loader');
  1486. var _loader2 = _interopRequireDefault(_loader);
  1487. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  1488. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  1489. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  1490. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  1491. // jshint ignore:line
  1492. var _class = function (_React$Component) {
  1493. _inherits(_class, _React$Component);
  1494. function _class() {
  1495. _classCallCheck(this, _class);
  1496. return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments));
  1497. }
  1498. _createClass(_class, [{
  1499. key: 'render',
  1500. value: function render() {
  1501. /* jshint ignore:start */
  1502. return _react2.default.createElement(
  1503. 'div',
  1504. { className: 'modal-body modal-loader' },
  1505. _react2.default.createElement(_loader2.default, null)
  1506. );
  1507. /* jshint ignore:end */
  1508. }
  1509. }]);
  1510. return _class;
  1511. }(_react2.default.Component);
  1512. exports.default = _class;
  1513. },{"./loader":32,"react":"react"}],34:[function(require,module,exports){
  1514. 'use strict';
  1515. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  1516. Object.defineProperty(exports, "__esModule", {
  1517. value: true
  1518. });
  1519. exports.LABELS = exports.STYLES = undefined;
  1520. var _react = require('react');
  1521. var _react2 = _interopRequireDefault(_react);
  1522. var _zxcvbn = require('../services/zxcvbn');
  1523. var _zxcvbn2 = _interopRequireDefault(_zxcvbn);
  1524. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  1525. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  1526. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  1527. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  1528. var STYLES = exports.STYLES = ['progress-bar-danger', 'progress-bar-warning', 'progress-bar-warning', 'progress-bar-primary', 'progress-bar-success'];
  1529. var LABELS = exports.LABELS = [gettext("Entered password is very weak."), gettext("Entered password is weak."), gettext("Entered password is average."), gettext("Entered password is strong."), gettext("Entered password is very strong.")];
  1530. var _class = function (_React$Component) {
  1531. _inherits(_class, _React$Component);
  1532. function _class(props) {
  1533. _classCallCheck(this, _class);
  1534. var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
  1535. _this._score = 0;
  1536. _this._password = null;
  1537. _this._inputs = [];
  1538. return _this;
  1539. }
  1540. _createClass(_class, [{
  1541. key: 'getScore',
  1542. value: function getScore(password, inputs) {
  1543. var _this2 = this;
  1544. var cacheStale = false;
  1545. if (password.trim() !== this._password) {
  1546. cacheStale = true;
  1547. }
  1548. if (inputs.length !== this._inputs.length) {
  1549. cacheStale = true;
  1550. } else {
  1551. inputs.map(function (value, i) {
  1552. if (value.trim() !== _this2._inputs[i]) {
  1553. cacheStale = true;
  1554. }
  1555. });
  1556. }
  1557. if (cacheStale) {
  1558. this._score = _zxcvbn2.default.scorePassword(password, inputs);
  1559. this._password = password.trim();
  1560. this._inputs = inputs.map(function (value) {
  1561. return value.trim();
  1562. });
  1563. }
  1564. return this._score;
  1565. }
  1566. }, {
  1567. key: 'render',
  1568. value: function render() {
  1569. /* jshint ignore:start */
  1570. var score = this.getScore(this.props.password, this.props.inputs);
  1571. return _react2.default.createElement(
  1572. 'div',
  1573. { className: 'help-block password-strength' },
  1574. _react2.default.createElement(
  1575. 'div',
  1576. { className: 'progress' },
  1577. _react2.default.createElement(
  1578. 'div',
  1579. { className: "progress-bar " + STYLES[score],
  1580. style: { width: 20 + 20 * score + '%' },
  1581. role: 'progress-bar',
  1582. 'aria-valuenow': score,
  1583. 'aria-valuemin': '0',
  1584. 'aria-valuemax': '4' },
  1585. _react2.default.createElement(
  1586. 'span',
  1587. { className: 'sr-only' },
  1588. LABELS[score]
  1589. )
  1590. )
  1591. ),
  1592. _react2.default.createElement(
  1593. 'p',
  1594. { className: 'text-small' },
  1595. LABELS[score]
  1596. )
  1597. );
  1598. /* jshint ignore:end */
  1599. }
  1600. }]);
  1601. return _class;
  1602. }(_react2.default.Component);
  1603. exports.default = _class;
  1604. },{"../services/zxcvbn":59,"react":"react"}],35:[function(require,module,exports){
  1605. 'use strict';
  1606. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  1607. Object.defineProperty(exports, "__esModule", {
  1608. value: true
  1609. });
  1610. var _react = require('react');
  1611. var _react2 = _interopRequireDefault(_react);
  1612. var _loader = require('./loader');
  1613. var _loader2 = _interopRequireDefault(_loader);
  1614. var _register = require('./register.js');
  1615. var _register2 = _interopRequireDefault(_register);
  1616. var _captcha = require('../services/captcha');
  1617. var _captcha2 = _interopRequireDefault(_captcha);
  1618. var _modal = require('../services/modal');
  1619. var _modal2 = _interopRequireDefault(_modal);
  1620. var _snackbar = require('../services/snackbar');
  1621. var _snackbar2 = _interopRequireDefault(_snackbar);
  1622. var _zxcvbn = require('../services/zxcvbn');
  1623. var _zxcvbn2 = _interopRequireDefault(_zxcvbn);
  1624. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  1625. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  1626. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  1627. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
  1628. // jshint ignore:line
  1629. // jshint ignore:line
  1630. // jshint ignore:line
  1631. // jshint ignore:line
  1632. // jshint ignore:line
  1633. var _class = function (_React$Component) {
  1634. _inherits(_class, _React$Component);
  1635. function _class(props) {
  1636. _classCallCheck(this, _class);
  1637. var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
  1638. _this.showRegisterModal = function () {
  1639. if (misago.get('SETTINGS').account_activation === 'closed') {
  1640. _snackbar2.default.info(gettext("New registrations are currently disabled."));
  1641. } else if (_this.state.isLoaded) {
  1642. _modal2.default.show(_register2.default);
  1643. } else {
  1644. _this.setState({
  1645. 'isLoading': true
  1646. });
  1647. Promise.all([_captcha2.default.load(), _zxcvbn2.default.load()]).then(function () {
  1648. if (!_this.state.isLoaded) {
  1649. _this.setState({
  1650. 'isLoading': false,
  1651. 'isLoaded': false
  1652. });
  1653. }
  1654. _modal2.default.show(_register2.default);
  1655. });
  1656. }
  1657. };
  1658. _this.state = {
  1659. 'isLoading': false,
  1660. 'isLoaded': false
  1661. };
  1662. return _this;
  1663. }
  1664. /* jshint ignore:start */
  1665. _createClass(_class, [{
  1666. key: 'getClassName',
  1667. /* jshint ignore:end */
  1668. value: function getClassName() {
  1669. return this.props.className + (this.state.isLoading ? ' btn-loading' : '');
  1670. }
  1671. }, {
  1672. key: 'render',
  1673. value: function render() {
  1674. /* jshint ignore:start */
  1675. return _react2.default.createElement(
  1676. 'button',
  1677. { type: 'button', onClick: this.showRegisterModal,
  1678. className: 'btn ' + this.getClassName(),
  1679. disabled: this.state.isLoaded },
  1680. gettext("Register"),
  1681. this.state.isLoading ? _react2.default.createElement(_loader2.default, null) : null
  1682. );
  1683. /* jshint ignore:end */
  1684. }
  1685. }]);
  1686. return _class;
  1687. }(_react2.default.Component);
  1688. exports.default = _class;
  1689. },{"../services/captcha":52,"../services/modal":56,"../services/snackbar":57,"../services/zxcvbn":59,"./loader":32,"./register.js":36,"react":"react"}],36:[function(require,module,exports){
  1690. 'use strict';
  1691. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  1692. Object.defineProperty(exports, "__esModule", {
  1693. value: true
  1694. });
  1695. exports.RegisterComplete = exports.RegisterForm = undefined;
  1696. var _react = require('react');
  1697. var _react2 = _interopRequireDefault(_react);
  1698. var _button = require('./button');
  1699. var _button2 = _interopRequireDefault(_button);
  1700. var _form = require('./form');
  1701. var _form2 = _interopRequireDefault(_form);
  1702. var _formGroup = require('./form-group');
  1703. var _formGroup2 = _interopRequireDefault(_formGroup);
  1704. var _passwordStrength = require('./password-strength');
  1705. var _passwordStrength2 = _interopRequireDefault(_passwordStrength);
  1706. var _index = require('../index');
  1707. var _index2 = _interopRequireDefault(_index);
  1708. var _ajax = require('../services/ajax');
  1709. var _ajax2 = _interopRequireDefault(_ajax);
  1710. var _auth = require('../services/auth');
  1711. var _auth2 = _interopRequireDefault(_auth);
  1712. var _captcha = require('../services/captcha');
  1713. var _captcha2 = _interopRequireDefault(_captcha);
  1714. var _modal = require('../services/modal');
  1715. var _modal2 = _interopRequireDefault(_modal);
  1716. var _snackbar = require('../services/snackbar');
  1717. var _snackbar2 = _interopRequireDefault(_snackbar);
  1718. var _bannedPage = require('../utils/banned-page');
  1719. var _bannedPage2 = _interopRequireDefault(_bannedPage);
  1720. var _validators = require('../utils/validators');
  1721. var validators = _interopRequireWildcard(_validators);
  1722. function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
  1723. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  1724. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  1725. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  1726. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
  1727. // jshint ignore:line
  1728. // jshint ignore:line
  1729. // jshint ignore:line
  1730. var RegisterForm = exports.RegisterForm = function (_Form) {
  1731. _inherits(RegisterForm, _Form);
  1732. function RegisterForm(props) {
  1733. _classCallCheck(this, RegisterForm);
  1734. var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(RegisterForm).call(this, props));
  1735. _this.state = {
  1736. 'isLoading': false,
  1737. 'username': '',
  1738. 'email': '',
  1739. 'password': '',
  1740. 'captcha': '',
  1741. 'validators': {
  1742. 'username': [validators.usernameContent(), validators.usernameMinLength(_index2.default.get('SETTINGS')), validators.usernameMaxLength(_index2.default.get('SETTINGS'))],
  1743. 'email': [validators.email()],
  1744. 'password': [validators.passwordMinLength(_index2.default.get('SETTINGS'))],
  1745. 'captcha': _captcha2.default.validator()
  1746. },
  1747. 'errors': {}
  1748. };
  1749. return _this;
  1750. }
  1751. _createClass(RegisterForm, [{
  1752. key: 'clean',
  1753. value: function clean() {
  1754. if (this.isValid()) {
  1755. return true;
  1756. } else {
  1757. _snackbar2.default.error(gettext("Form contains errors."));
  1758. this.setState({
  1759. 'errors': this.validate()
  1760. });
  1761. return false;
  1762. }
  1763. }
  1764. }, {
  1765. key: 'send',
  1766. value: function send() {
  1767. return _ajax2.default.post(_index2.default.get('USERS_API'), {
  1768. 'username': this.state.username,
  1769. 'email': this.state.email,
  1770. 'password': this.state.password,
  1771. 'captcha': this.state.captcha
  1772. });
  1773. }
  1774. }, {
  1775. key: 'handleSuccess',
  1776. value: function handleSuccess(apiResponse) {
  1777. this.props.callback(apiResponse);
  1778. }
  1779. }, {
  1780. key: 'handleError',
  1781. value: function handleError(rejection) {
  1782. if (rejection.status === 400) {
  1783. this.setState({
  1784. 'errors': Object.assign({}, this.state.errors, rejection)
  1785. });
  1786. _snackbar2.default.error(gettext("Form contains errors."));
  1787. } else if (rejection.status === 403 && rejection.ban) {
  1788. (0, _bannedPage2.default)(rejection.ban);
  1789. _modal2.default.hide();
  1790. } else {
  1791. _snackbar2.default.apiError(rejection);
  1792. }
  1793. }
  1794. }, {
  1795. key: 'getLegalFootNote',
  1796. value: function getLegalFootNote() {
  1797. if (_index2.default.get('TERMS_OF_SERVICE_URL')) {
  1798. /* jshint ignore:start */
  1799. return _react2.default.createElement(
  1800. 'a',
  1801. { href: _index2.default.get('TERMS_OF_SERVICE_URL'),
  1802. target: '_blank' },
  1803. gettext("By registering you agree to site's terms and conditions.")
  1804. );
  1805. /* jshint ignore:end */
  1806. } else {
  1807. return null;
  1808. }
  1809. }
  1810. }, {
  1811. key: 'render',
  1812. value: function render() {
  1813. /* jshint ignore:start */
  1814. return _react2.default.createElement(
  1815. 'div',
  1816. { className: 'modal-dialog modal-register', role: 'document' },
  1817. _react2.default.createElement(
  1818. 'div',
  1819. { className: 'modal-content' },
  1820. _react2.default.createElement(
  1821. 'div',
  1822. { className: 'modal-header' },
  1823. _react2.default.createElement(
  1824. 'button',
  1825. { type: 'button', className: 'close', 'data-dismiss': 'modal',
  1826. 'aria-label': gettext("Close") },
  1827. _react2.default.createElement(
  1828. 'span',
  1829. { 'aria-hidden': 'true' },
  1830. '×'
  1831. )
  1832. ),
  1833. _react2.default.createElement(
  1834. 'h4',
  1835. { className: 'modal-title' },
  1836. gettext("Register")
  1837. )
  1838. ),
  1839. _react2.default.createElement(
  1840. 'form',
  1841. { onSubmit: this.handleSubmit, className: 'form-horizontal' },
  1842. _react2.default.createElement('input', { type: 'type', style: { display: 'none' } }),
  1843. _react2.default.createElement('input', { type: 'password', style: { display: 'none' } }),
  1844. _react2.default.createElement(
  1845. 'div',
  1846. { className: 'modal-body' },
  1847. _react2.default.createElement(
  1848. _formGroup2.default,
  1849. { label: gettext("Username"), 'for': 'id_username',
  1850. labelClass: 'col-sm-4', controlClass: 'col-sm-8',
  1851. validation: this.state.errors.username },
  1852. _react2.default.createElement('input', { type: 'text', id: 'id_username', className: 'form-control',
  1853. 'aria-describedby': 'id_username_status',
  1854. disabled: this.state.isLoading,
  1855. onChange: this.bindInput('username'),
  1856. value: this.state.username })
  1857. ),
  1858. _react2.default.createElement(
  1859. _formGroup2.default,
  1860. { label: gettext("E-mail"), 'for': 'id_email',
  1861. labelClass: 'col-sm-4', controlClass: 'col-sm-8',
  1862. validation: this.state.errors.email },
  1863. _react2.default.createElement('input', { type: 'text', id: 'id_email', className: 'form-control',
  1864. 'aria-describedby': 'id_email_status',
  1865. disabled: this.state.isLoading,
  1866. onChange: this.bindInput('email'),
  1867. value: this.state.email })
  1868. ),
  1869. _react2.default.createElement(
  1870. _formGroup2.default,
  1871. { label: gettext("Password"), 'for': 'id_password',
  1872. labelClass: 'col-sm-4', controlClass: 'col-sm-8',
  1873. validation: this.state.errors.password,
  1874. extra: _react2.default.createElement(_passwordStrength2.default, { password: this.state.password,
  1875. inputs: [this.state.username, this.state.email] }) },
  1876. _react2.default.createElement('input', { type: 'password', id: 'id_password', className: 'form-control',
  1877. 'aria-describedby': 'id_password_status',
  1878. disabled: this.state.isLoading,
  1879. onChange: this.bindInput('password'),
  1880. value: this.state.password })
  1881. ),
  1882. _captcha2.default.component({
  1883. form: this,
  1884. labelClass: "col-sm-4",
  1885. controlClass: "col-sm-8"
  1886. })
  1887. ),
  1888. _react2.default.createElement(
  1889. 'div',
  1890. { className: 'modal-footer' },
  1891. this.getLegalFootNote(),
  1892. _react2.default.createElement(
  1893. _button2.default,
  1894. { className: 'btn-primary', loading: this.state.isLoading },
  1895. gettext("Register account")
  1896. )
  1897. )
  1898. )
  1899. )
  1900. );
  1901. /* jshint ignore:end */
  1902. }
  1903. }]);
  1904. return RegisterForm;
  1905. }(_form2.default);
  1906. var RegisterComplete = exports.RegisterComplete = function (_React$Component) {
  1907. _inherits(RegisterComplete, _React$Component);
  1908. function RegisterComplete() {
  1909. _classCallCheck(this, RegisterComplete);
  1910. return _possibleConstructorReturn(this, Object.getPrototypeOf(RegisterComplete).apply(this, arguments));
  1911. }
  1912. _createClass(RegisterComplete, [{
  1913. key: 'getLead',
  1914. value: function getLead() {
  1915. if (this.props.activation === 'user') {
  1916. return gettext("%(username)s, your account has been created but you need to activate it before you will be able to sign in.");
  1917. } else if (this.props.activation === 'admin') {
  1918. return gettext("%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in.");
  1919. }
  1920. }
  1921. }, {
  1922. key: 'getSubscript',
  1923. value: function getSubscript() {
  1924. if (this.props.activation === 'user') {
  1925. return gettext("We have sent an e-mail to %(email)s with link that you have to click to activate your account.");
  1926. } else if (this.props.activation === 'admin') {
  1927. return gettext("We will send an e-mail to %(email)s when this takes place.");
  1928. }
  1929. }
  1930. }, {
  1931. key: 'render',
  1932. value: function render() {
  1933. /* jshint ignore:start */
  1934. return _react2.default.createElement(
  1935. 'div',
  1936. { className: 'modal-dialog modal-message modal-register',
  1937. role: 'document' },
  1938. _react2.default.createElement(
  1939. 'div',
  1940. { className: 'modal-content' },
  1941. _react2.default.createElement(
  1942. 'div',
  1943. { className: 'modal-header' },
  1944. _react2.default.createElement(
  1945. 'button',
  1946. { type: 'button', className: 'close', 'data-dismiss': 'modal',
  1947. 'aria-label': gettext("Close") },
  1948. _react2.default.createElement(
  1949. 'span',
  1950. { 'aria-hidden': 'true' },
  1951. '×'
  1952. )
  1953. ),
  1954. _react2.default.createElement(
  1955. 'h4',
  1956. { className: 'modal-title' },
  1957. gettext("Registration complete")
  1958. )
  1959. ),
  1960. _react2.default.createElement(
  1961. 'div',
  1962. { className: 'modal-body' },
  1963. _react2.default.createElement(
  1964. 'div',
  1965. { className: 'message-icon' },
  1966. _react2.default.createElement(
  1967. 'span',
  1968. { className: 'material-icon' },
  1969. 'info_outline'
  1970. )
  1971. ),
  1972. _react2.default.createElement(
  1973. 'div',
  1974. { className: 'message-body' },
  1975. _react2.default.createElement(
  1976. 'p',
  1977. { className: 'lead' },
  1978. interpolate(this.getLead(), { 'username': this.props.username }, true)
  1979. ),
  1980. _react2.default.createElement(
  1981. 'p',
  1982. null,
  1983. interpolate(this.getSubscript(), { 'email': this.props.email }, true)
  1984. )
  1985. )
  1986. )
  1987. )
  1988. );
  1989. /* jshint ignore:end */
  1990. }
  1991. }]);
  1992. return RegisterComplete;
  1993. }(_react2.default.Component);
  1994. var _class = function (_React$Component2) {
  1995. _inherits(_class, _React$Component2);
  1996. function _class(props) {
  1997. _classCallCheck(this, _class);
  1998. var _this3 = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
  1999. _this3.completeRegistration = function (apiResponse) {
  2000. if (apiResponse.activation === 'active') {
  2001. _modal2.default.hide();
  2002. _auth2.default.signIn(apiResponse);
  2003. } else {
  2004. _this3.setState({
  2005. 'complete': apiResponse
  2006. });
  2007. }
  2008. };
  2009. _this3.state = {
  2010. 'complete': false
  2011. };
  2012. return _this3;
  2013. }
  2014. /* jshint ignore:start */
  2015. _createClass(_class, [{
  2016. key: 'render',
  2017. /* jshint ignore:end */
  2018. value: function render() {
  2019. /* jshint ignore:start */
  2020. if (this.state.complete) {
  2021. return _react2.default.createElement(RegisterComplete, { activation: this.state.complete.activation,
  2022. username: this.state.complete.username,
  2023. email: this.state.complete.email });
  2024. } else {
  2025. return _react2.default.createElement(RegisterForm, { callback: this.completeRegistration });
  2026. }
  2027. /* jshint ignore:end */
  2028. }
  2029. }]);
  2030. return _class;
  2031. }(_react2.default.Component);
  2032. exports.default = _class;
  2033. },{"../index":45,"../services/ajax":50,"../services/auth":51,"../services/captcha":52,"../services/modal":56,"../services/snackbar":57,"../utils/banned-page":60,"../utils/validators":63,"./button":27,"./form":31,"./form-group":30,"./password-strength":34,"react":"react"}],37:[function(require,module,exports){
  2034. 'use strict';
  2035. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  2036. Object.defineProperty(exports, "__esModule", {
  2037. value: true
  2038. });
  2039. exports.LinkSent = exports.RequestLinkForm = undefined;
  2040. var _react = require('react');
  2041. var _react2 = _interopRequireDefault(_react);
  2042. var _index = require('../index');
  2043. var _index2 = _interopRequireDefault(_index);
  2044. var _button = require('./button');
  2045. var _button2 = _interopRequireDefault(_button);
  2046. var _form = require('./form');
  2047. var _form2 = _interopRequireDefault(_form);
  2048. var _ajax = require('../services/ajax');
  2049. var _ajax2 = _interopRequireDefault(_ajax);
  2050. var _snackbar = require('../services/snackbar');
  2051. var _snackbar2 = _interopRequireDefault(_snackbar);
  2052. var _validators = require('../utils/validators');
  2053. var validators = _interopRequireWildcard(_validators);
  2054. var _bannedPage = require('../utils/banned-page');
  2055. var _bannedPage2 = _interopRequireDefault(_bannedPage);
  2056. function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
  2057. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  2058. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  2059. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  2060. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
  2061. // jshint ignore:line
  2062. var RequestLinkForm = exports.RequestLinkForm = function (_Form) {
  2063. _inherits(RequestLinkForm, _Form);
  2064. function RequestLinkForm(props) {
  2065. _classCallCheck(this, RequestLinkForm);
  2066. var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(RequestLinkForm).call(this, props));
  2067. _this.state = {
  2068. 'isLoading': false,
  2069. 'email': '',
  2070. 'validators': {
  2071. 'email': [validators.email()]
  2072. }
  2073. };
  2074. return _this;
  2075. }
  2076. _createClass(RequestLinkForm, [{
  2077. key: 'clean',
  2078. value: function clean() {
  2079. if (this.isValid()) {
  2080. return true;
  2081. } else {
  2082. _snackbar2.default.error(gettext("Enter a valid email address."));
  2083. return false;
  2084. }
  2085. }
  2086. }, {
  2087. key: 'send',
  2088. value: function send() {
  2089. return _ajax2.default.post(_index2.default.get('SEND_ACTIVATION_API'), {
  2090. 'email': this.state.email
  2091. });
  2092. }
  2093. }, {
  2094. key: 'handleSuccess',
  2095. value: function handleSuccess(apiResponse) {
  2096. this.props.callback(apiResponse);
  2097. }
  2098. }, {
  2099. key: 'handleError',
  2100. value: function handleError(rejection) {
  2101. if (['already_active', 'inactive_admin'].indexOf(rejection.code) > -1) {
  2102. _snackbar2.default.info(rejection.detail);
  2103. } else if (rejection.status === 403 && rejection.ban) {
  2104. (0, _bannedPage2.default)(rejection.ban);
  2105. } else {
  2106. _snackbar2.default.apiError(rejection);
  2107. }
  2108. }
  2109. }, {
  2110. key: 'render',
  2111. value: function render() {
  2112. /* jshint ignore:start */
  2113. return _react2.default.createElement(
  2114. 'div',
  2115. { className: 'well well-form well-form-request-activation-link' },
  2116. _react2.default.createElement(
  2117. 'form',
  2118. { onSubmit: this.handleSubmit },
  2119. _react2.default.createElement(
  2120. 'div',
  2121. { className: 'form-group' },
  2122. _react2.default.createElement(
  2123. 'div',
  2124. { className: 'control-input' },
  2125. _react2.default.createElement('input', { type: 'text', className: 'form-control',
  2126. placeholder: gettext("Your e-mail address"),
  2127. disabled: this.state.isLoading,
  2128. onChange: this.bindInput('email'),
  2129. value: this.state.email })
  2130. )
  2131. ),
  2132. _react2.default.createElement(
  2133. _button2.default,
  2134. { className: 'btn-primary btn-block',
  2135. loading: this.state.isLoading },
  2136. gettext("Send link")
  2137. )
  2138. )
  2139. );
  2140. /* jshint ignore:end */
  2141. }
  2142. }]);
  2143. return RequestLinkForm;
  2144. }(_form2.default);
  2145. var LinkSent = exports.LinkSent = function (_React$Component) {
  2146. _inherits(LinkSent, _React$Component);
  2147. function LinkSent() {
  2148. _classCallCheck(this, LinkSent);
  2149. return _possibleConstructorReturn(this, Object.getPrototypeOf(LinkSent).apply(this, arguments));
  2150. }
  2151. _createClass(LinkSent, [{
  2152. key: 'getMessage',
  2153. value: function getMessage() {
  2154. return interpolate(gettext("Activation link was sent to %(email)s"), {
  2155. email: this.props.user.email
  2156. }, true);
  2157. }
  2158. }, {
  2159. key: 'render',
  2160. value: function render() {
  2161. /* jshint ignore:start */
  2162. return _react2.default.createElement(
  2163. 'div',
  2164. { className: 'well well-form well-form-request-activation-link well-done' },
  2165. _react2.default.createElement(
  2166. 'div',
  2167. { className: 'done-message' },
  2168. _react2.default.createElement(
  2169. 'div',
  2170. { className: 'message-icon' },
  2171. _react2.default.createElement(
  2172. 'span',
  2173. { className: 'material-icon' },
  2174. 'check'
  2175. )
  2176. ),
  2177. _react2.default.createElement(
  2178. 'div',
  2179. { className: 'message-body' },
  2180. _react2.default.createElement(
  2181. 'p',
  2182. null,
  2183. this.getMessage()
  2184. )
  2185. ),
  2186. _react2.default.createElement(
  2187. 'button',
  2188. { type: 'button', className: 'btn btn-primary btn-block',
  2189. onClick: this.props.callback },
  2190. gettext("Request another link")
  2191. )
  2192. )
  2193. );
  2194. /* jshint ignore:end */
  2195. }
  2196. }]);
  2197. return LinkSent;
  2198. }(_react2.default.Component);
  2199. var _class = function (_React$Component2) {
  2200. _inherits(_class, _React$Component2);
  2201. function _class(props) {
  2202. _classCallCheck(this, _class);
  2203. var _this3 = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
  2204. _this3.complete = function (apiResponse) {
  2205. _this3.setState({
  2206. complete: apiResponse
  2207. });
  2208. };
  2209. _this3.reset = function () {
  2210. _this3.setState({
  2211. complete: false
  2212. });
  2213. };
  2214. _this3.state = {
  2215. complete: false
  2216. };
  2217. return _this3;
  2218. }
  2219. /* jshint ignore:start */
  2220. _createClass(_class, [{
  2221. key: 'render',
  2222. /* jshint ignore:end */
  2223. value: function render() {
  2224. /* jshint ignore:start */
  2225. if (this.state.complete) {
  2226. return _react2.default.createElement(LinkSent, { user: this.state.complete, callback: this.reset });
  2227. } else {
  2228. return _react2.default.createElement(RequestLinkForm, { callback: this.complete });
  2229. };
  2230. /* jshint ignore:end */
  2231. }
  2232. }]);
  2233. return _class;
  2234. }(_react2.default.Component);
  2235. exports.default = _class;
  2236. },{"../index":45,"../services/ajax":50,"../services/snackbar":57,"../utils/banned-page":60,"../utils/validators":63,"./button":27,"./form":31,"react":"react"}],38:[function(require,module,exports){
  2237. 'use strict';
  2238. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  2239. Object.defineProperty(exports, "__esModule", {
  2240. value: true
  2241. });
  2242. exports.AccountInactivePage = exports.LinkSent = exports.RequestResetForm = undefined;
  2243. var _react = require('react');
  2244. var _react2 = _interopRequireDefault(_react);
  2245. var _reactDom = require('react-dom');
  2246. var _reactDom2 = _interopRequireDefault(_reactDom);
  2247. var _index = require('../index');
  2248. var _index2 = _interopRequireDefault(_index);
  2249. var _button = require('./button');
  2250. var _button2 = _interopRequireDefault(_button);
  2251. var _form = require('./form');
  2252. var _form2 = _interopRequireDefault(_form);
  2253. var _ajax = require('../services/ajax');
  2254. var _ajax2 = _interopRequireDefault(_ajax);
  2255. var _snackbar = require('../services/snackbar');
  2256. var _snackbar2 = _interopRequireDefault(_snackbar);
  2257. var _validators = require('../utils/validators');
  2258. var validators = _interopRequireWildcard(_validators);
  2259. var _bannedPage = require('../utils/banned-page');
  2260. var _bannedPage2 = _interopRequireDefault(_bannedPage);
  2261. function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
  2262. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  2263. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  2264. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  2265. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
  2266. // jshint ignore:line
  2267. // jshint ignore:line
  2268. var RequestResetForm = exports.RequestResetForm = function (_Form) {
  2269. _inherits(RequestResetForm, _Form);
  2270. function RequestResetForm(props) {
  2271. _classCallCheck(this, RequestResetForm);
  2272. var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(RequestResetForm).call(this, props));
  2273. _this.state = {
  2274. 'isLoading': false,
  2275. 'email': '',
  2276. 'validators': {
  2277. 'email': [validators.email()]
  2278. }
  2279. };
  2280. return _this;
  2281. }
  2282. _createClass(RequestResetForm, [{
  2283. key: 'clean',
  2284. value: function clean() {
  2285. if (this.isValid()) {
  2286. return true;
  2287. } else {
  2288. _snackbar2.default.error(gettext("Enter a valid email address."));
  2289. return false;
  2290. }
  2291. }
  2292. }, {
  2293. key: 'send',
  2294. value: function send() {
  2295. return _ajax2.default.post(_index2.default.get('SEND_PASSWORD_RESET_API'), {
  2296. 'email': this.state.email
  2297. });
  2298. }
  2299. }, {
  2300. key: 'handleSuccess',
  2301. value: function handleSuccess(apiResponse) {
  2302. this.props.callback(apiResponse);
  2303. }
  2304. }, {
  2305. key: 'handleError',
  2306. value: function handleError(rejection) {
  2307. if (['inactive_user', 'inactive_admin'].indexOf(rejection.code) > -1) {
  2308. this.props.showInactivePage(rejection);
  2309. } else if (rejection.status === 403 && rejection.ban) {
  2310. (0, _bannedPage2.default)(rejection.ban);
  2311. } else {
  2312. _snackbar2.default.apiError(rejection);
  2313. }
  2314. }
  2315. }, {
  2316. key: 'render',
  2317. value: function render() {
  2318. /* jshint ignore:start */
  2319. return _react2.default.createElement(
  2320. 'div',
  2321. { className: 'well well-form well-form-request-password-reset' },
  2322. _react2.default.createElement(
  2323. 'form',
  2324. { onSubmit: this.handleSubmit },
  2325. _react2.default.createElement(
  2326. 'div',
  2327. { className: 'form-group' },
  2328. _react2.default.createElement(
  2329. 'div',
  2330. { className: 'control-input' },
  2331. _react2.default.createElement('input', { type: 'text', className: 'form-control',
  2332. placeholder: gettext("Your e-mail address"),
  2333. disabled: this.state.isLoading,
  2334. onChange: this.bindInput('email'),
  2335. value: this.state.email })
  2336. )
  2337. ),
  2338. _react2.default.createElement(
  2339. _button2.default,
  2340. { className: 'btn-primary btn-block',
  2341. loading: this.state.isLoading },
  2342. gettext("Send link")
  2343. )
  2344. )
  2345. );
  2346. /* jshint ignore:end */
  2347. }
  2348. }]);
  2349. return RequestResetForm;
  2350. }(_form2.default);
  2351. var LinkSent = exports.LinkSent = function (_React$Component) {
  2352. _inherits(LinkSent, _React$Component);
  2353. function LinkSent() {
  2354. _classCallCheck(this, LinkSent);
  2355. return _possibleConstructorReturn(this, Object.getPrototypeOf(LinkSent).apply(this, arguments));
  2356. }
  2357. _createClass(LinkSent, [{
  2358. key: 'getMessage',
  2359. value: function getMessage() {
  2360. return interpolate(gettext("Reset password link was sent to %(email)s"), {
  2361. email: this.props.user.email
  2362. }, true);
  2363. }
  2364. }, {
  2365. key: 'render',
  2366. value: function render() {
  2367. /* jshint ignore:start */
  2368. return _react2.default.createElement(
  2369. 'div',
  2370. { className: 'well well-form well-form-request-password-reset well-done' },
  2371. _react2.default.createElement(
  2372. 'div',
  2373. { className: 'done-message' },
  2374. _react2.default.createElement(
  2375. 'div',
  2376. { className: 'message-icon' },
  2377. _react2.default.createElement(
  2378. 'span',
  2379. { className: 'material-icon' },
  2380. 'check'
  2381. )
  2382. ),
  2383. _react2.default.createElement(
  2384. 'div',
  2385. { className: 'message-body' },
  2386. _react2.default.createElement(
  2387. 'p',
  2388. null,
  2389. this.getMessage()
  2390. )
  2391. ),
  2392. _react2.default.createElement(
  2393. 'button',
  2394. { type: 'button', className: 'btn btn-primary btn-block',
  2395. onClick: this.props.callback },
  2396. gettext("Request another link")
  2397. )
  2398. )
  2399. );
  2400. /* jshint ignore:end */
  2401. }
  2402. }]);
  2403. return LinkSent;
  2404. }(_react2.default.Component);
  2405. var AccountInactivePage = exports.AccountInactivePage = function (_React$Component2) {
  2406. _inherits(AccountInactivePage, _React$Component2);
  2407. function AccountInactivePage() {
  2408. _classCallCheck(this, AccountInactivePage);
  2409. return _possibleConstructorReturn(this, Object.getPrototypeOf(AccountInactivePage).apply(this, arguments));
  2410. }
  2411. _createClass(AccountInactivePage, [{
  2412. key: 'getActivateButton',
  2413. value: function getActivateButton() {
  2414. if (this.props.activation === 'inactive_user') {
  2415. /* jshint ignore:start */
  2416. return _react2.default.createElement(
  2417. 'p',
  2418. null,
  2419. _react2.default.createElement(
  2420. 'a',
  2421. { href: _index2.default.get('REQUEST_ACTIVATION_URL') },
  2422. gettext("Activate your account.")
  2423. )
  2424. );
  2425. /* jshint ignore:end */
  2426. } else {
  2427. return null;
  2428. }
  2429. }
  2430. }, {
  2431. key: 'render',
  2432. value: function render() {
  2433. /* jshint ignore:start */
  2434. return _react2.default.createElement(
  2435. 'div',
  2436. { className: 'page page-message page-message-info page-forgotten-password-inactive' },
  2437. _react2.default.createElement(
  2438. 'div',
  2439. { className: 'container' },
  2440. _react2.default.createElement(
  2441. 'div',
  2442. { className: 'message-panel' },
  2443. _react2.default.createElement(
  2444. 'div',
  2445. { className: 'message-icon' },
  2446. _react2.default.createElement(
  2447. 'span',
  2448. { className: 'material-icon' },
  2449. 'info_outline'
  2450. )
  2451. ),
  2452. _react2.default.createElement(
  2453. 'div',
  2454. { className: 'message-body' },
  2455. _react2.default.createElement(
  2456. 'p',
  2457. { className: 'lead' },
  2458. gettext("Your account is inactive.")
  2459. ),
  2460. _react2.default.createElement(
  2461. 'p',
  2462. null,
  2463. this.props.message
  2464. ),
  2465. this.getActivateButton()
  2466. )
  2467. )
  2468. )
  2469. );
  2470. /* jshint ignore:end */
  2471. }
  2472. }]);
  2473. return AccountInactivePage;
  2474. }(_react2.default.Component);
  2475. var _class = function (_React$Component3) {
  2476. _inherits(_class, _React$Component3);
  2477. function _class(props) {
  2478. _classCallCheck(this, _class);
  2479. var _this4 = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
  2480. _this4.complete = function (apiResponse) {
  2481. _this4.setState({
  2482. complete: apiResponse
  2483. });
  2484. };
  2485. _this4.reset = function () {
  2486. _this4.setState({
  2487. complete: false
  2488. });
  2489. };
  2490. _this4.state = {
  2491. complete: false
  2492. };
  2493. return _this4;
  2494. }
  2495. /* jshint ignore:start */
  2496. _createClass(_class, [{
  2497. key: 'showInactivePage',
  2498. value: function showInactivePage(apiResponse) {
  2499. _reactDom2.default.render(_react2.default.createElement(AccountInactivePage, { activation: apiResponse.code,
  2500. message: apiResponse.detail }), document.getElementById('page-mount'));
  2501. }
  2502. /* jshint ignore:end */
  2503. }, {
  2504. key: 'render',
  2505. value: function render() {
  2506. /* jshint ignore:start */
  2507. if (this.state.complete) {
  2508. return _react2.default.createElement(LinkSent, { user: this.state.complete, callback: this.reset });
  2509. } else {
  2510. return _react2.default.createElement(RequestResetForm, { callback: this.complete,
  2511. showInactivePage: this.showInactivePage });
  2512. };
  2513. /* jshint ignore:end */
  2514. }
  2515. }]);
  2516. return _class;
  2517. }(_react2.default.Component);
  2518. exports.default = _class;
  2519. },{"../index":45,"../services/ajax":50,"../services/snackbar":57,"../utils/banned-page":60,"../utils/validators":63,"./button":27,"./form":31,"react":"react","react-dom":"react-dom"}],39:[function(require,module,exports){
  2520. 'use strict';
  2521. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  2522. Object.defineProperty(exports, "__esModule", {
  2523. value: true
  2524. });
  2525. exports.PasswordChangedPage = exports.ResetPasswordForm = undefined;
  2526. var _react = require('react');
  2527. var _react2 = _interopRequireDefault(_react);
  2528. var _reactDom = require('react-dom');
  2529. var _reactDom2 = _interopRequireDefault(_reactDom);
  2530. var _index = require('../index');
  2531. var _index2 = _interopRequireDefault(_index);
  2532. var _button = require('./button');
  2533. var _button2 = _interopRequireDefault(_button);
  2534. var _form = require('./form');
  2535. var _form2 = _interopRequireDefault(_form);
  2536. var _signIn = require('./sign-in.js');
  2537. var _signIn2 = _interopRequireDefault(_signIn);
  2538. var _ajax = require('../services/ajax');
  2539. var _ajax2 = _interopRequireDefault(_ajax);
  2540. var _auth = require('../services/auth');
  2541. var _auth2 = _interopRequireDefault(_auth);
  2542. var _modal = require('../services/modal');
  2543. var _modal2 = _interopRequireDefault(_modal);
  2544. var _snackbar = require('../services/snackbar');
  2545. var _snackbar2 = _interopRequireDefault(_snackbar);
  2546. var _validators = require('../utils/validators');
  2547. var validators = _interopRequireWildcard(_validators);
  2548. var _bannedPage = require('../utils/banned-page');
  2549. var _bannedPage2 = _interopRequireDefault(_bannedPage);
  2550. function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
  2551. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  2552. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  2553. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  2554. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
  2555. // jshint ignore:line
  2556. // jshint ignore:line
  2557. // jshint ignore:line
  2558. var ResetPasswordForm = exports.ResetPasswordForm = function (_Form) {
  2559. _inherits(ResetPasswordForm, _Form);
  2560. function ResetPasswordForm(props) {
  2561. _classCallCheck(this, ResetPasswordForm);
  2562. var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(ResetPasswordForm).call(this, props));
  2563. _this.state = {
  2564. 'isLoading': false,
  2565. 'password': '',
  2566. 'validators': {
  2567. 'password': [validators.passwordMinLength(_index2.default.get('SETTINGS'))]
  2568. }
  2569. };
  2570. return _this;
  2571. }
  2572. _createClass(ResetPasswordForm, [{
  2573. key: 'clean',
  2574. value: function clean() {
  2575. if (this.isValid()) {
  2576. return true;
  2577. } else {
  2578. if (this.state.password.trim().length) {
  2579. _snackbar2.default.error(this.state.errors.password[0]);
  2580. } else {
  2581. _snackbar2.default.error(gettext("Enter new password."));
  2582. }
  2583. return false;
  2584. }
  2585. }
  2586. }, {
  2587. key: 'send',
  2588. value: function send() {
  2589. return _ajax2.default.post(_index2.default.get('CHANGE_PASSWORD_API'), {
  2590. 'password': this.state.password
  2591. });
  2592. }
  2593. }, {
  2594. key: 'handleSuccess',
  2595. value: function handleSuccess(apiResponse) {
  2596. this.props.callback(apiResponse);
  2597. }
  2598. }, {
  2599. key: 'handleError',
  2600. value: function handleError(rejection) {
  2601. if (rejection.status === 403 && rejection.ban) {
  2602. (0, _bannedPage2.default)(rejection.ban);
  2603. } else {
  2604. _snackbar2.default.apiError(rejection);
  2605. }
  2606. }
  2607. }, {
  2608. key: 'render',
  2609. value: function render() {
  2610. /* jshint ignore:start */
  2611. return _react2.default.createElement(
  2612. 'div',
  2613. { className: 'well well-form well-form-reset-password' },
  2614. _react2.default.createElement(
  2615. 'form',
  2616. { onSubmit: this.handleSubmit },
  2617. _react2.default.createElement(
  2618. 'div',
  2619. { className: 'form-group' },
  2620. _react2.default.createElement(
  2621. 'div',
  2622. { className: 'control-input' },
  2623. _react2.default.createElement('input', { type: 'password', className: 'form-control',
  2624. placeholder: gettext("Enter new password"),
  2625. disabled: this.state.isLoading,
  2626. onChange: this.bindInput('password'),
  2627. value: this.state.password })
  2628. )
  2629. ),
  2630. _react2.default.createElement(
  2631. _button2.default,
  2632. { className: 'btn-primary btn-block',
  2633. loading: this.state.isLoading },
  2634. gettext("Change password")
  2635. )
  2636. )
  2637. );
  2638. /* jshint ignore:end */
  2639. }
  2640. }]);
  2641. return ResetPasswordForm;
  2642. }(_form2.default);
  2643. var PasswordChangedPage = exports.PasswordChangedPage = function (_React$Component) {
  2644. _inherits(PasswordChangedPage, _React$Component);
  2645. function PasswordChangedPage() {
  2646. _classCallCheck(this, PasswordChangedPage);
  2647. return _possibleConstructorReturn(this, Object.getPrototypeOf(PasswordChangedPage).apply(this, arguments));
  2648. }
  2649. _createClass(PasswordChangedPage, [{
  2650. key: 'getMessage',
  2651. value: function getMessage() {
  2652. return interpolate(gettext("%(username)s, your password has been changed successfully."), {
  2653. username: this.props.user.username
  2654. }, true);
  2655. }
  2656. }, {
  2657. key: 'showSignIn',
  2658. value: function showSignIn() {
  2659. _modal2.default.show(_signIn2.default);
  2660. }
  2661. }, {
  2662. key: 'render',
  2663. value: function render() {
  2664. /* jshint ignore:start */
  2665. return _react2.default.createElement(
  2666. 'div',
  2667. { className: 'page page-message page-message-success page-forgotten-password-changed' },
  2668. _react2.default.createElement(
  2669. 'div',
  2670. { className: 'container' },
  2671. _react2.default.createElement(
  2672. 'div',
  2673. { className: 'message-panel' },
  2674. _react2.default.createElement(
  2675. 'div',
  2676. { className: 'message-icon' },
  2677. _react2.default.createElement(
  2678. 'span',
  2679. { className: 'material-icon' },
  2680. 'check'
  2681. )
  2682. ),
  2683. _react2.default.createElement(
  2684. 'div',
  2685. { className: 'message-body' },
  2686. _react2.default.createElement(
  2687. 'p',
  2688. { className: 'lead' },
  2689. this.getMessage()
  2690. ),
  2691. _react2.default.createElement(
  2692. 'p',
  2693. null,
  2694. gettext("You will have to sign in using new password before continuing.")
  2695. ),
  2696. _react2.default.createElement(
  2697. 'p',
  2698. null,
  2699. _react2.default.createElement(
  2700. 'button',
  2701. { type: 'button', className: 'btn btn-primary', onClick: this.showSignIn },
  2702. gettext("Sign in")
  2703. )
  2704. )
  2705. )
  2706. )
  2707. )
  2708. );
  2709. /* jshint ignore:end */
  2710. }
  2711. }]);
  2712. return PasswordChangedPage;
  2713. }(_react2.default.Component);
  2714. var _class = function (_React$Component2) {
  2715. _inherits(_class, _React$Component2);
  2716. function _class() {
  2717. var _Object$getPrototypeO;
  2718. var _temp, _this3, _ret;
  2719. _classCallCheck(this, _class);
  2720. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  2721. args[_key] = arguments[_key];
  2722. }
  2723. return _ret = (_temp = (_this3 = _possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(_class)).call.apply(_Object$getPrototypeO, [this].concat(args))), _this3), _this3.complete = function (apiResponse) {
  2724. _auth2.default.softSignOut();
  2725. // nuke "redirect_to" field so we don't end
  2726. // coming back to error page after sign in
  2727. $('#hidden-login-form input[name="redirect_to"]').remove();
  2728. _reactDom2.default.render(_react2.default.createElement(PasswordChangedPage, { user: apiResponse }), document.getElementById('page-mount'));
  2729. }, _temp), _possibleConstructorReturn(_this3, _ret);
  2730. }
  2731. /* jshint ignore:start */
  2732. _createClass(_class, [{
  2733. key: 'render',
  2734. /* jshint ignore:end */
  2735. value: function render() {
  2736. /* jshint ignore:start */
  2737. return _react2.default.createElement(ResetPasswordForm, { callback: this.complete });
  2738. /* jshint ignore:end */
  2739. }
  2740. }]);
  2741. return _class;
  2742. }(_react2.default.Component);
  2743. exports.default = _class;
  2744. },{"../index":45,"../services/ajax":50,"../services/auth":51,"../services/modal":56,"../services/snackbar":57,"../utils/banned-page":60,"../utils/validators":63,"./button":27,"./form":31,"./sign-in.js":40,"react":"react","react-dom":"react-dom"}],40:[function(require,module,exports){
  2745. 'use strict';
  2746. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  2747. Object.defineProperty(exports, "__esModule", {
  2748. value: true
  2749. });
  2750. var _react = require('react');
  2751. var _react2 = _interopRequireDefault(_react);
  2752. var _index = require('../index');
  2753. var _index2 = _interopRequireDefault(_index);
  2754. var _button = require('./button');
  2755. var _button2 = _interopRequireDefault(_button);
  2756. var _form = require('./form');
  2757. var _form2 = _interopRequireDefault(_form);
  2758. var _ajax = require('../services/ajax');
  2759. var _ajax2 = _interopRequireDefault(_ajax);
  2760. var _modal = require('../services/modal');
  2761. var _modal2 = _interopRequireDefault(_modal);
  2762. var _snackbar = require('../services/snackbar');
  2763. var _snackbar2 = _interopRequireDefault(_snackbar);
  2764. var _bannedPage = require('../utils/banned-page');
  2765. var _bannedPage2 = _interopRequireDefault(_bannedPage);
  2766. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  2767. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  2768. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  2769. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
  2770. // jshint ignore:line
  2771. var _class = function (_Form) {
  2772. _inherits(_class, _Form);
  2773. function _class(props) {
  2774. _classCallCheck(this, _class);
  2775. var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, props));
  2776. _this.state = {
  2777. 'isLoading': false,
  2778. 'showActivation': false,
  2779. 'username': '',
  2780. 'password': '',
  2781. 'validators': {
  2782. 'username': [],
  2783. 'password': []
  2784. }
  2785. };
  2786. return _this;
  2787. }
  2788. _createClass(_class, [{
  2789. key: 'clean',
  2790. value: function clean() {
  2791. if (!this.isValid()) {
  2792. _snackbar2.default.error(gettext("Fill out both fields."));
  2793. return false;
  2794. } else {
  2795. return true;
  2796. }
  2797. }
  2798. }, {
  2799. key: 'send',
  2800. value: function send() {
  2801. return _ajax2.default.post(_index2.default.get('AUTH_API'), {
  2802. 'username': this.state.username,
  2803. 'password': this.state.password
  2804. });
  2805. }
  2806. }, {
  2807. key: 'handleSuccess',
  2808. value: function handleSuccess() {
  2809. var form = $('#hidden-login-form');
  2810. form.append('<input type="text" name="username" />');
  2811. form.append('<input type="password" name="password" />');
  2812. // fill out form with user credentials and submit it, this will tell
  2813. // Misago to redirect user back to right page, and will trigger browser's
  2814. // key ring feature
  2815. form.find('input[type="hidden"]').val(_ajax2.default.getCsrfToken());
  2816. form.find('input[name="redirect_to"]').val(window.location.pathname);
  2817. form.find('input[name="username"]').val(this.state.username);
  2818. form.find('input[name="password"]').val(this.state.password);
  2819. form.submit();
  2820. // keep form loading
  2821. this.setState({
  2822. 'isLoading': true
  2823. });
  2824. }
  2825. }, {
  2826. key: 'handleError',
  2827. value: function handleError(rejection) {
  2828. if (rejection.status === 400) {
  2829. if (rejection.code === 'inactive_admin') {
  2830. _snackbar2.default.info(rejection.detail);
  2831. } else if (rejection.code === 'inactive_user') {
  2832. _snackbar2.default.info(rejection.detail);
  2833. this.setState({
  2834. 'showActivation': true
  2835. });
  2836. } else if (rejection.code === 'banned') {
  2837. (0, _bannedPage2.default)(rejection.detail);
  2838. _modal2.default.hide();
  2839. } else {
  2840. _snackbar2.default.error(rejection.detail);
  2841. }
  2842. } else if (rejection.status === 403 && rejection.ban) {
  2843. (0, _bannedPage2.default)(rejection.ban);
  2844. _modal2.default.hide();
  2845. } else {
  2846. _snackbar2.default.apiError(rejection);
  2847. }
  2848. }
  2849. }, {
  2850. key: 'getActivationButton',
  2851. value: function getActivationButton() {
  2852. if (this.state.showActivation) {
  2853. /* jshint ignore:start */
  2854. return _react2.default.createElement(
  2855. 'a',
  2856. { href: _index2.default.get('REQUEST_ACTIVATION_URL'),
  2857. className: 'btn btn-success btn-block' },
  2858. gettext("Activate account")
  2859. );
  2860. /* jshint ignore:end */
  2861. } else {
  2862. return null;
  2863. }
  2864. }
  2865. }, {
  2866. key: 'render',
  2867. value: function render() {
  2868. /* jshint ignore:start */
  2869. return _react2.default.createElement(
  2870. 'div',
  2871. { className: 'modal-dialog modal-sm modal-sign-in',
  2872. role: 'document' },
  2873. _react2.default.createElement(
  2874. 'div',
  2875. { className: 'modal-content' },
  2876. _react2.default.createElement(
  2877. 'div',
  2878. { className: 'modal-header' },
  2879. _react2.default.createElement(
  2880. 'button',
  2881. { type: 'button', className: 'close', 'data-dismiss': 'modal',
  2882. 'aria-label': gettext("Close") },
  2883. _react2.default.createElement(
  2884. 'span',
  2885. { 'aria-hidden': 'true' },
  2886. '×'
  2887. )
  2888. ),
  2889. _react2.default.createElement(
  2890. 'h4',
  2891. { className: 'modal-title' },
  2892. gettext("Sign in")
  2893. )
  2894. ),
  2895. _react2.default.createElement(
  2896. 'form',
  2897. { onSubmit: this.handleSubmit },
  2898. _react2.default.createElement(
  2899. 'div',
  2900. { className: 'modal-body' },
  2901. _react2.default.createElement(
  2902. 'div',
  2903. { className: 'form-group' },
  2904. _react2.default.createElement(
  2905. 'div',
  2906. { className: 'control-input' },
  2907. _react2.default.createElement('input', { id: 'id_username', className: 'form-control', type: 'text',
  2908. disabled: this.state.isLoading,
  2909. placeholder: gettext("Username or e-mail"),
  2910. onChange: this.bindInput('username'),
  2911. value: this.state.username })
  2912. )
  2913. ),
  2914. _react2.default.createElement(
  2915. 'div',
  2916. { className: 'form-group' },
  2917. _react2.default.createElement(
  2918. 'div',
  2919. { className: 'control-input' },
  2920. _react2.default.createElement('input', { id: 'id_password', className: 'form-control', type: 'password',
  2921. disabled: this.state.isLoading,
  2922. placeholder: gettext("Password"),
  2923. onChange: this.bindInput('password'),
  2924. value: this.state.password })
  2925. )
  2926. )
  2927. ),
  2928. _react2.default.createElement(
  2929. 'div',
  2930. { className: 'modal-footer' },
  2931. this.getActivationButton(),
  2932. _react2.default.createElement(
  2933. _button2.default,
  2934. { className: 'btn-primary btn-block',
  2935. loading: this.state.isLoading },
  2936. gettext("Sign in")
  2937. ),
  2938. _react2.default.createElement(
  2939. 'a',
  2940. { href: _index2.default.get('FORGOTTEN_PASSWORD_URL'),
  2941. className: 'btn btn-default btn-block' },
  2942. gettext("Forgot password?")
  2943. )
  2944. )
  2945. )
  2946. )
  2947. );
  2948. /* jshint ignore:end */
  2949. }
  2950. }]);
  2951. return _class;
  2952. }(_form2.default);
  2953. exports.default = _class;
  2954. },{"../index":45,"../services/ajax":50,"../services/modal":56,"../services/snackbar":57,"../utils/banned-page":60,"./button":27,"./form":31,"react":"react"}],41:[function(require,module,exports){
  2955. 'use strict';
  2956. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  2957. Object.defineProperty(exports, "__esModule", {
  2958. value: true
  2959. });
  2960. exports.Snackbar = undefined;
  2961. exports.select = select;
  2962. var _react = require('react');
  2963. var _react2 = _interopRequireDefault(_react);
  2964. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  2965. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  2966. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  2967. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  2968. /* jshint ignore:start */
  2969. var TYPES_CLASSES = {
  2970. 'info': 'alert-info',
  2971. 'success': 'alert-success',
  2972. 'warning': 'alert-warning',
  2973. 'error': 'alert-danger'
  2974. };
  2975. /* jshint ignore:end */
  2976. var Snackbar = exports.Snackbar = function (_React$Component) {
  2977. _inherits(Snackbar, _React$Component);
  2978. function Snackbar() {
  2979. _classCallCheck(this, Snackbar);
  2980. return _possibleConstructorReturn(this, Object.getPrototypeOf(Snackbar).apply(this, arguments));
  2981. }
  2982. _createClass(Snackbar, [{
  2983. key: 'getSnackbarClass',
  2984. value: function getSnackbarClass() {
  2985. var snackbarClass = 'alerts-snackbar';
  2986. if (this.props.isVisible) {
  2987. snackbarClass += ' in';
  2988. } else {
  2989. snackbarClass += ' out';
  2990. }
  2991. return snackbarClass;
  2992. }
  2993. }, {
  2994. key: 'render',
  2995. value: function render() {
  2996. /* jshint ignore:start */
  2997. return _react2.default.createElement(
  2998. 'div',
  2999. { className: this.getSnackbarClass() },
  3000. _react2.default.createElement(
  3001. 'p',
  3002. { className: 'alert ' + TYPES_CLASSES[this.props.type] },
  3003. this.props.message
  3004. )
  3005. );
  3006. /* jshint ignore:end */
  3007. }
  3008. }]);
  3009. return Snackbar;
  3010. }(_react2.default.Component);
  3011. function select(state) {
  3012. return state.snackbar;
  3013. }
  3014. },{"react":"react"}],42:[function(require,module,exports){
  3015. 'use strict';
  3016. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  3017. Object.defineProperty(exports, "__esModule", {
  3018. value: true
  3019. });
  3020. exports.CompactGuestNav = exports.GuestNav = exports.GuestMenu = undefined;
  3021. var _react = require('react');
  3022. var _react2 = _interopRequireDefault(_react);
  3023. var _avatar = require('../avatar');
  3024. var _avatar2 = _interopRequireDefault(_avatar);
  3025. var _registerButton = require('../register-button');
  3026. var _registerButton2 = _interopRequireDefault(_registerButton);
  3027. var _signIn = require('../sign-in.js');
  3028. var _signIn2 = _interopRequireDefault(_signIn);
  3029. var _mobileNavbarDropdown = require('../../services/mobile-navbar-dropdown');
  3030. var _mobileNavbarDropdown2 = _interopRequireDefault(_mobileNavbarDropdown);
  3031. var _modal = require('../../services/modal');
  3032. var _modal2 = _interopRequireDefault(_modal);
  3033. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  3034. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  3035. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  3036. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
  3037. // jshint ignore:line
  3038. var GuestMenu = exports.GuestMenu = function (_React$Component) {
  3039. _inherits(GuestMenu, _React$Component);
  3040. function GuestMenu() {
  3041. _classCallCheck(this, GuestMenu);
  3042. return _possibleConstructorReturn(this, Object.getPrototypeOf(GuestMenu).apply(this, arguments));
  3043. }
  3044. _createClass(GuestMenu, [{
  3045. key: 'showSignInModal',
  3046. value: function showSignInModal() {
  3047. _modal2.default.show(_signIn2.default);
  3048. }
  3049. }, {
  3050. key: 'render',
  3051. value: function render() {
  3052. /* jshint ignore:start */
  3053. return _react2.default.createElement(
  3054. 'ul',
  3055. { className: 'dropdown-menu user-dropdown dropdown-menu-right',
  3056. role: 'menu' },
  3057. _react2.default.createElement(
  3058. 'li',
  3059. { className: 'guest-preview' },
  3060. _react2.default.createElement(
  3061. 'h4',
  3062. null,
  3063. gettext("You are browsing as guest.")
  3064. ),
  3065. _react2.default.createElement(
  3066. 'p',
  3067. null,
  3068. gettext('Sign in or register to start and participate in discussions.')
  3069. ),
  3070. _react2.default.createElement(
  3071. 'div',
  3072. { className: 'row' },
  3073. _react2.default.createElement(
  3074. 'div',
  3075. { className: 'col-xs-6' },
  3076. _react2.default.createElement(
  3077. 'button',
  3078. { type: 'button', className: 'btn btn-default btn-block',
  3079. onClick: this.showSignInModal },
  3080. gettext("Sign in")
  3081. )
  3082. ),
  3083. _react2.default.createElement(
  3084. 'div',
  3085. { className: 'col-xs-6' },
  3086. _react2.default.createElement(
  3087. _registerButton2.default,
  3088. { className: 'btn-primary btn-block' },
  3089. gettext("Register")
  3090. )
  3091. )
  3092. )
  3093. )
  3094. );
  3095. /* jshint ignore:end */
  3096. }
  3097. }]);
  3098. return GuestMenu;
  3099. }(_react2.default.Component);
  3100. var GuestNav = exports.GuestNav = function (_GuestMenu) {
  3101. _inherits(GuestNav, _GuestMenu);
  3102. function GuestNav() {
  3103. _classCallCheck(this, GuestNav);
  3104. return _possibleConstructorReturn(this, Object.getPrototypeOf(GuestNav).apply(this, arguments));
  3105. }
  3106. _createClass(GuestNav, [{
  3107. key: 'render',
  3108. value: function render() {
  3109. /* jshint ignore:start */
  3110. return _react2.default.createElement(
  3111. 'div',
  3112. { className: 'nav nav-guest' },
  3113. _react2.default.createElement(
  3114. 'button',
  3115. { type: 'button', className: 'btn navbar-btn btn-default',
  3116. onClick: this.showSignInModal },
  3117. gettext("Sign in")
  3118. ),
  3119. _react2.default.createElement(
  3120. _registerButton2.default,
  3121. { className: 'navbar-btn btn-primary' },
  3122. gettext("Register")
  3123. )
  3124. );
  3125. /* jshint ignore:end */
  3126. }
  3127. }]);
  3128. return GuestNav;
  3129. }(GuestMenu);
  3130. var CompactGuestNav = exports.CompactGuestNav = function (_React$Component2) {
  3131. _inherits(CompactGuestNav, _React$Component2);
  3132. function CompactGuestNav() {
  3133. _classCallCheck(this, CompactGuestNav);
  3134. return _possibleConstructorReturn(this, Object.getPrototypeOf(CompactGuestNav).apply(this, arguments));
  3135. }
  3136. _createClass(CompactGuestNav, [{
  3137. key: 'showGuestMenu',
  3138. value: function showGuestMenu() {
  3139. _mobileNavbarDropdown2.default.show(GuestMenu);
  3140. }
  3141. }, {
  3142. key: 'render',
  3143. value: function render() {
  3144. /* jshint ignore:start */
  3145. return _react2.default.createElement(
  3146. 'button',
  3147. { type: 'button', onClick: this.showGuestMenu },
  3148. _react2.default.createElement(_avatar2.default, { size: '64' })
  3149. );
  3150. /* jshint ignore:end */
  3151. }
  3152. }]);
  3153. return CompactGuestNav;
  3154. }(_react2.default.Component);
  3155. },{"../../services/mobile-navbar-dropdown":55,"../../services/modal":56,"../avatar":25,"../register-button":35,"../sign-in.js":40,"react":"react"}],43:[function(require,module,exports){
  3156. 'use strict';
  3157. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  3158. Object.defineProperty(exports, "__esModule", {
  3159. value: true
  3160. });
  3161. exports.CompactUserMenu = exports.UserMenu = undefined;
  3162. exports.select = select;
  3163. var _react = require('react');
  3164. var _react2 = _interopRequireDefault(_react);
  3165. var _guestNav = require('./guest-nav');
  3166. var _userNav = require('./user-nav');
  3167. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  3168. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  3169. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  3170. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
  3171. // jshint ignore:line
  3172. var UserMenu = exports.UserMenu = function (_React$Component) {
  3173. _inherits(UserMenu, _React$Component);
  3174. function UserMenu() {
  3175. _classCallCheck(this, UserMenu);
  3176. return _possibleConstructorReturn(this, Object.getPrototypeOf(UserMenu).apply(this, arguments));
  3177. }
  3178. _createClass(UserMenu, [{
  3179. key: 'render',
  3180. value: function render() {
  3181. /* jshint ignore:start */
  3182. if (this.props.isAuthenticated) {
  3183. return _react2.default.createElement(_userNav.UserNav, { user: this.props.user });
  3184. } else {
  3185. return _react2.default.createElement(_guestNav.GuestNav, null);
  3186. }
  3187. /* jshint ignore:end */
  3188. }
  3189. }]);
  3190. return UserMenu;
  3191. }(_react2.default.Component);
  3192. var CompactUserMenu = exports.CompactUserMenu = function (_React$Component2) {
  3193. _inherits(CompactUserMenu, _React$Component2);
  3194. function CompactUserMenu() {
  3195. _classCallCheck(this, CompactUserMenu);
  3196. return _possibleConstructorReturn(this, Object.getPrototypeOf(CompactUserMenu).apply(this, arguments));
  3197. }
  3198. _createClass(CompactUserMenu, [{
  3199. key: 'render',
  3200. value: function render() {
  3201. /* jshint ignore:start */
  3202. if (this.props.isAuthenticated) {
  3203. return _react2.default.createElement(_userNav.CompactUserNav, { user: this.props.user });
  3204. } else {
  3205. return _react2.default.createElement(_guestNav.CompactGuestNav, null);
  3206. }
  3207. /* jshint ignore:end */
  3208. }
  3209. }]);
  3210. return CompactUserMenu;
  3211. }(_react2.default.Component);
  3212. function select(state) {
  3213. return state.auth;
  3214. }
  3215. },{"./guest-nav":42,"./user-nav":44,"react":"react"}],44:[function(require,module,exports){
  3216. 'use strict';
  3217. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  3218. Object.defineProperty(exports, "__esModule", {
  3219. value: true
  3220. });
  3221. exports.CompactUserNav = exports.UserNav = exports.UserMenu = undefined;
  3222. exports.selectUserMenu = selectUserMenu;
  3223. var _react = require('react');
  3224. var _react2 = _interopRequireDefault(_react);
  3225. var _reactRedux = require('react-redux');
  3226. var _avatar = require('../avatar');
  3227. var _avatar2 = _interopRequireDefault(_avatar);
  3228. var _root = require('../change-avatar/root');
  3229. var _root2 = _interopRequireDefault(_root);
  3230. var _index = require('../../index');
  3231. var _index2 = _interopRequireDefault(_index);
  3232. var _mobileNavbarDropdown = require('../../services/mobile-navbar-dropdown');
  3233. var _mobileNavbarDropdown2 = _interopRequireDefault(_mobileNavbarDropdown);
  3234. var _modal = require('../../services/modal');
  3235. var _modal2 = _interopRequireDefault(_modal);
  3236. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  3237. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  3238. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  3239. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // jshint ignore:line
  3240. // jshint ignore:line
  3241. // jshint ignore:line
  3242. var UserMenu = exports.UserMenu = function (_React$Component) {
  3243. _inherits(UserMenu, _React$Component);
  3244. function UserMenu() {
  3245. _classCallCheck(this, UserMenu);
  3246. return _possibleConstructorReturn(this, Object.getPrototypeOf(UserMenu).apply(this, arguments));
  3247. }
  3248. _createClass(UserMenu, [{
  3249. key: 'logout',
  3250. value: function logout() {
  3251. var decision = confirm(gettext("Are you sure you want to sign out?"));
  3252. if (decision) {
  3253. $('#hidden-logout-form').submit();
  3254. }
  3255. }
  3256. }, {
  3257. key: 'changeAvatar',
  3258. value: function changeAvatar() {
  3259. _modal2.default.show((0, _reactRedux.connect)(_root.select)(_root2.default));
  3260. }
  3261. }, {
  3262. key: 'render',
  3263. value: function render() {
  3264. /* jshint ignore:start */
  3265. return _react2.default.createElement(
  3266. 'ul',
  3267. { className: 'dropdown-menu user-dropdown dropdown-menu-right',
  3268. role: 'menu' },
  3269. _react2.default.createElement(
  3270. 'li',
  3271. { className: 'dropdown-header' },
  3272. _react2.default.createElement(
  3273. 'strong',
  3274. null,
  3275. this.props.user.username
  3276. )
  3277. ),
  3278. _react2.default.createElement('li', { className: 'divider' }),
  3279. _react2.default.createElement(
  3280. 'li',
  3281. null,
  3282. _react2.default.createElement(
  3283. 'a',
  3284. { href: this.props.user.absolute_url },
  3285. _react2.default.createElement(
  3286. 'span',
  3287. { className: 'material-icon' },
  3288. 'account_circle'
  3289. ),
  3290. gettext("See your profile")
  3291. )
  3292. ),
  3293. _react2.default.createElement(
  3294. 'li',
  3295. null,
  3296. _react2.default.createElement(
  3297. 'a',
  3298. { href: _index2.default.get('USERCP_URL') },
  3299. _react2.default.createElement(
  3300. 'span',
  3301. { className: 'material-icon' },
  3302. 'done_all'
  3303. ),
  3304. gettext("Change options")
  3305. )
  3306. ),
  3307. _react2.default.createElement(
  3308. 'li',
  3309. null,
  3310. _react2.default.createElement(
  3311. 'button',
  3312. { type: 'button', className: 'btn-link', onClick: this.changeAvatar },
  3313. _react2.default.createElement(
  3314. 'span',
  3315. { className: 'material-icon' },
  3316. 'face'
  3317. ),
  3318. gettext("Change avatar")
  3319. )
  3320. ),
  3321. _react2.default.createElement('li', { className: 'divider' }),
  3322. _react2.default.createElement(
  3323. 'li',
  3324. { className: 'dropdown-footer' },
  3325. _react2.default.createElement(
  3326. 'button',
  3327. { type: 'button', className: 'btn btn-default btn-block',
  3328. onClick: this.logout },
  3329. gettext("Log out")
  3330. )
  3331. )
  3332. );
  3333. /* jshint ignore:end */
  3334. }
  3335. }]);
  3336. return UserMenu;
  3337. }(_react2.default.Component);
  3338. var UserNav = exports.UserNav = function (_React$Component2) {
  3339. _inherits(UserNav, _React$Component2);
  3340. function UserNav() {
  3341. _classCallCheck(this, UserNav);
  3342. return _possibleConstructorReturn(this, Object.getPrototypeOf(UserNav).apply(this, arguments));
  3343. }
  3344. _createClass(UserNav, [{
  3345. key: 'render',
  3346. value: function render() {
  3347. /* jshint ignore:start */
  3348. return _react2.default.createElement(
  3349. 'ul',
  3350. { className: 'ul nav navbar-nav nav-user' },
  3351. _react2.default.createElement(
  3352. 'li',
  3353. { className: 'dropdown' },
  3354. _react2.default.createElement(
  3355. 'a',
  3356. { href: this.props.user.absolute_url, className: 'dropdown-toggle',
  3357. 'data-toggle': 'dropdown', 'aria-haspopup': 'true', 'aria-expanded': 'false',
  3358. role: 'button' },
  3359. _react2.default.createElement(_avatar2.default, { user: this.props.user, size: '64' })
  3360. ),
  3361. _react2.default.createElement(UserMenu, { user: this.props.user })
  3362. )
  3363. );
  3364. /* jshint ignore:end */
  3365. }
  3366. }]);
  3367. return UserNav;
  3368. }(_react2.default.Component);
  3369. function selectUserMenu(state) {
  3370. console.log(state);
  3371. return { user: state.auth.user };
  3372. }
  3373. var CompactUserNav = exports.CompactUserNav = function (_React$Component3) {
  3374. _inherits(CompactUserNav, _React$Component3);
  3375. function CompactUserNav() {
  3376. _classCallCheck(this, CompactUserNav);
  3377. return _possibleConstructorReturn(this, Object.getPrototypeOf(CompactUserNav).apply(this, arguments));
  3378. }
  3379. _createClass(CompactUserNav, [{
  3380. key: 'showUserMenu',
  3381. value: function showUserMenu() {
  3382. _mobileNavbarDropdown2.default.showConnected('user-menu', (0, _reactRedux.connect)(selectUserMenu)(UserMenu));
  3383. }
  3384. }, {
  3385. key: 'render',
  3386. value: function render() {
  3387. /* jshint ignore:start */
  3388. return _react2.default.createElement(
  3389. 'button',
  3390. { type: 'button', onClick: this.showUserMenu },
  3391. _react2.default.createElement(_avatar2.default, { user: this.props.user, size: '64' })
  3392. );
  3393. /* jshint ignore:end */
  3394. }
  3395. }]);
  3396. return CompactUserNav;
  3397. }(_react2.default.Component);
  3398. },{"../../index":45,"../../services/mobile-navbar-dropdown":55,"../../services/modal":56,"../avatar":25,"../change-avatar/root":29,"react":"react","react-redux":"react-redux"}],45:[function(require,module,exports){
  3399. (function (global){
  3400. 'use strict';
  3401. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  3402. Object.defineProperty(exports, "__esModule", {
  3403. value: true
  3404. });
  3405. exports.Misago = undefined;
  3406. var _orderedList = require('./utils/ordered-list');
  3407. var _orderedList2 = _interopRequireDefault(_orderedList);
  3408. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  3409. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  3410. var Misago = exports.Misago = function () {
  3411. function Misago() {
  3412. _classCallCheck(this, Misago);
  3413. this._initializers = [];
  3414. this._context = {};
  3415. }
  3416. _createClass(Misago, [{
  3417. key: 'addInitializer',
  3418. value: function addInitializer(initializer) {
  3419. this._initializers.push({
  3420. key: initializer.name,
  3421. item: initializer.initializer,
  3422. after: initializer.after,
  3423. before: initializer.before
  3424. });
  3425. }
  3426. }, {
  3427. key: 'init',
  3428. value: function init(context) {
  3429. var _this = this;
  3430. this._context = context;
  3431. var initOrder = new _orderedList2.default(this._initializers).orderedValues();
  3432. initOrder.forEach(function (initializer) {
  3433. initializer(_this);
  3434. });
  3435. }
  3436. // context accessors
  3437. }, {
  3438. key: 'has',
  3439. value: function has(key) {
  3440. return this._context.hasOwnProperty(key);
  3441. }
  3442. }, {
  3443. key: 'get',
  3444. value: function get(key, fallback) {
  3445. if (this.has(key)) {
  3446. return this._context[key];
  3447. } else {
  3448. return fallback || undefined;
  3449. }
  3450. }
  3451. }]);
  3452. return Misago;
  3453. }();
  3454. // create singleton
  3455. var misago = new Misago();
  3456. // expose it globally
  3457. global.misago = misago;
  3458. // and export it for tests and stuff
  3459. exports.default = misago;
  3460. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  3461. },{"./utils/ordered-list":62}],46:[function(require,module,exports){
  3462. 'use strict';
  3463. Object.defineProperty(exports, "__esModule", {
  3464. value: true
  3465. });
  3466. exports.SIGN_OUT = exports.SIGN_IN = exports.initialState = undefined;
  3467. exports.signIn = signIn;
  3468. exports.signOut = signOut;
  3469. exports.default = auth;
  3470. var _users = require('./users');
  3471. var initialState = exports.initialState = {
  3472. signedIn: false,
  3473. signedOut: false
  3474. };
  3475. var SIGN_IN = exports.SIGN_IN = 'SIGN_IN';
  3476. var SIGN_OUT = exports.SIGN_OUT = 'SIGN_OUT';
  3477. function signIn(user) {
  3478. return {
  3479. type: SIGN_IN,
  3480. user: user
  3481. };
  3482. }
  3483. function signOut() {
  3484. var soft = arguments.length <= 0 || arguments[0] === undefined ? false : arguments[0];
  3485. return {
  3486. type: SIGN_OUT,
  3487. soft: soft
  3488. };
  3489. }
  3490. function auth() {
  3491. var state = arguments.length <= 0 || arguments[0] === undefined ? initialState : arguments[0];
  3492. var action = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
  3493. switch (action.type) {
  3494. case SIGN_IN:
  3495. return Object.assign({}, state, {
  3496. signedIn: action.user
  3497. });
  3498. case SIGN_OUT:
  3499. return Object.assign({}, state, {
  3500. isAuthenticated: false,
  3501. isAnonymous: true,
  3502. signedOut: !action.soft
  3503. });
  3504. case _users.UPDATE_AVATAR:
  3505. if (state.isAuthenticated && state.user.id === action.userId) {
  3506. var newState = Object.assign({}, state);
  3507. newState.user = Object.assign({}, state.user, {
  3508. 'avatar_hash': action.avatarHash
  3509. });
  3510. return newState;
  3511. }
  3512. return state;
  3513. default:
  3514. return state;
  3515. }
  3516. }
  3517. },{"./users":49}],47:[function(require,module,exports){
  3518. 'use strict';
  3519. Object.defineProperty(exports, "__esModule", {
  3520. value: true
  3521. });
  3522. exports.showSnackbar = showSnackbar;
  3523. exports.hideSnackbar = hideSnackbar;
  3524. exports.default = snackbar;
  3525. var initialState = exports.initialState = {
  3526. type: 'info',
  3527. message: '',
  3528. isVisible: false
  3529. };
  3530. var SHOW_SNACKBAR = exports.SHOW_SNACKBAR = 'SHOW_SNACKBAR';
  3531. var HIDE_SNACKBAR = exports.HIDE_SNACKBAR = 'HIDE_SNACKBAR';
  3532. function showSnackbar(message, type) {
  3533. return {
  3534. type: SHOW_SNACKBAR,
  3535. message: message,
  3536. messageType: type
  3537. };
  3538. }
  3539. function hideSnackbar() {
  3540. return {
  3541. type: HIDE_SNACKBAR
  3542. };
  3543. }
  3544. function snackbar() {
  3545. var state = arguments.length <= 0 || arguments[0] === undefined ? initialState : arguments[0];
  3546. var action = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
  3547. if (action.type === SHOW_SNACKBAR) {
  3548. return {
  3549. type: action.messageType,
  3550. message: action.message,
  3551. isVisible: true
  3552. };
  3553. } else if (action.type === HIDE_SNACKBAR) {
  3554. return Object.assign({}, state, {
  3555. isVisible: false
  3556. });
  3557. } else {
  3558. return state;
  3559. }
  3560. }
  3561. },{}],48:[function(require,module,exports){
  3562. 'use strict';
  3563. Object.defineProperty(exports, "__esModule", {
  3564. value: true
  3565. });
  3566. exports.doTick = doTick;
  3567. exports.default = tick;
  3568. var initialState = exports.initialState = {
  3569. tick: 0
  3570. };
  3571. var TICK = exports.TICK = 'TICK';
  3572. function doTick() {
  3573. return {
  3574. type: TICK
  3575. };
  3576. }
  3577. function tick() {
  3578. var state = arguments.length <= 0 || arguments[0] === undefined ? initialState : arguments[0];
  3579. var action = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
  3580. if (action.type === TICK) {
  3581. return Object.assign({}, state, {
  3582. tick: state.tick + 1
  3583. });
  3584. } else {
  3585. return state;
  3586. }
  3587. }
  3588. },{}],49:[function(require,module,exports){
  3589. 'use strict';
  3590. Object.defineProperty(exports, "__esModule", {
  3591. value: true
  3592. });
  3593. exports.updateAvatar = updateAvatar;
  3594. var UPDATE_AVATAR = exports.UPDATE_AVATAR = 'UPDATE_AVATAR';
  3595. function updateAvatar(user, avatarHash) {
  3596. return {
  3597. type: UPDATE_AVATAR,
  3598. userId: user.id,
  3599. avatarHash: avatarHash
  3600. };
  3601. }
  3602. },{}],50:[function(require,module,exports){
  3603. 'use strict';
  3604. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  3605. Object.defineProperty(exports, "__esModule", {
  3606. value: true
  3607. });
  3608. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  3609. var Ajax = exports.Ajax = function () {
  3610. function Ajax() {
  3611. _classCallCheck(this, Ajax);
  3612. this._cookieName = null;
  3613. this._csrfToken = null;
  3614. }
  3615. _createClass(Ajax, [{
  3616. key: 'init',
  3617. value: function init(cookieName) {
  3618. this._cookieName = cookieName;
  3619. this._csrfToken = this.getCsrfToken();
  3620. }
  3621. }, {
  3622. key: 'getCsrfToken',
  3623. value: function getCsrfToken() {
  3624. if (document.cookie.indexOf(this._cookieName) !== -1) {
  3625. var cookieRegex = new RegExp(this._cookieName + '\=([^;]*)');
  3626. var cookie = document.cookie.match(cookieRegex)[0];
  3627. return cookie ? cookie.split('=')[1] : null;
  3628. } else {
  3629. return null;
  3630. }
  3631. }
  3632. }, {
  3633. key: 'request',
  3634. value: function request(method, url, data) {
  3635. var self = this;
  3636. return new Promise(function (resolve, reject) {
  3637. var xhr = {
  3638. url: url,
  3639. method: method,
  3640. headers: {
  3641. 'X-CSRFToken': self._csrfToken
  3642. },
  3643. data: data || {},
  3644. dataType: 'json',
  3645. success: function success(data) {
  3646. resolve(data);
  3647. },
  3648. error: function error(jqXHR) {
  3649. var rejection = jqXHR.responseJSON || {};
  3650. rejection.status = jqXHR.status;
  3651. rejection.statusText = jqXHR.statusText;
  3652. reject(rejection);
  3653. }
  3654. };
  3655. $.ajax(xhr);
  3656. });
  3657. }
  3658. }, {
  3659. key: 'get',
  3660. value: function get(url) {
  3661. return this.request('GET', url);
  3662. }
  3663. }, {
  3664. key: 'post',
  3665. value: function post(url, data) {
  3666. return this.request('POST', url, data);
  3667. }
  3668. }, {
  3669. key: 'patch',
  3670. value: function patch(url, data) {
  3671. return this.request('PATCH', url, data);
  3672. }
  3673. }, {
  3674. key: 'put',
  3675. value: function put(url, data) {
  3676. return this.request('PUT', url, data);
  3677. }
  3678. }, {
  3679. key: 'delete',
  3680. value: function _delete(url) {
  3681. return this.request('DELETE', url);
  3682. }
  3683. }]);
  3684. return Ajax;
  3685. }();
  3686. exports.default = new Ajax();
  3687. },{}],51:[function(require,module,exports){
  3688. 'use strict';
  3689. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  3690. Object.defineProperty(exports, "__esModule", {
  3691. value: true
  3692. });
  3693. exports.Auth = undefined;
  3694. var _auth = require('../reducers/auth');
  3695. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  3696. // jshint ignore:line
  3697. var Auth = exports.Auth = function () {
  3698. function Auth() {
  3699. _classCallCheck(this, Auth);
  3700. }
  3701. _createClass(Auth, [{
  3702. key: 'init',
  3703. value: function init(store, local, modal) {
  3704. this._store = store;
  3705. this._local = local;
  3706. this._modal = modal;
  3707. // tell other tabs what auth state is because we are most current with it
  3708. this.syncSession();
  3709. // listen for other tabs to tell us that state changed
  3710. this.watchState();
  3711. }
  3712. }, {
  3713. key: 'syncSession',
  3714. value: function syncSession() {
  3715. var state = this._store.getState().auth;
  3716. if (state.isAuthenticated) {
  3717. this._local.set('auth', {
  3718. isAuthenticated: true,
  3719. username: state.user.username
  3720. });
  3721. } else {
  3722. this._local.set('auth', {
  3723. isAuthenticated: false
  3724. });
  3725. }
  3726. }
  3727. }, {
  3728. key: 'watchState',
  3729. value: function watchState() {
  3730. var _this = this;
  3731. this._local.watch('auth', function (newState) {
  3732. if (newState.isAuthenticated) {
  3733. _this._store.dispatch((0, _auth.signIn)({
  3734. username: newState.username
  3735. }));
  3736. } else {
  3737. _this._store.dispatch((0, _auth.signOut)());
  3738. }
  3739. });
  3740. this._modal.hide();
  3741. }
  3742. }, {
  3743. key: 'signIn',
  3744. value: function signIn(user) {
  3745. this._store.dispatch((0, _auth.signIn)(user));
  3746. this._local.set('auth', {
  3747. isAuthenticated: true,
  3748. username: user.username
  3749. });
  3750. this._modal.hide();
  3751. }
  3752. }, {
  3753. key: 'signOut',
  3754. value: function signOut() {
  3755. this._store.dispatch((0, _auth.signOut)());
  3756. this._local.set('auth', {
  3757. isAuthenticated: false
  3758. });
  3759. this._modal.hide();
  3760. }
  3761. }, {
  3762. key: 'softSignOut',
  3763. value: function softSignOut() {
  3764. this._store.dispatch((0, _auth.signOut)(true));
  3765. this._local.set('auth', {
  3766. isAuthenticated: false
  3767. });
  3768. this._modal.hide();
  3769. }
  3770. }]);
  3771. return Auth;
  3772. }();
  3773. exports.default = new Auth();
  3774. },{"../reducers/auth":46}],52:[function(require,module,exports){
  3775. 'use strict';
  3776. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* global grecaptcha */
  3777. // jshint ignore:line
  3778. Object.defineProperty(exports, "__esModule", {
  3779. value: true
  3780. });
  3781. exports.Captcha = exports.ReCaptcha = exports.ReCaptchaComponent = exports.QACaptcha = exports.NoCaptcha = exports.BaseCaptcha = undefined;
  3782. var _react = require('react');
  3783. var _react2 = _interopRequireDefault(_react);
  3784. var _formGroup = require('../components/form-group');
  3785. var _formGroup2 = _interopRequireDefault(_formGroup);
  3786. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  3787. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  3788. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  3789. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  3790. // jshint ignore:line
  3791. var BaseCaptcha = exports.BaseCaptcha = function () {
  3792. function BaseCaptcha() {
  3793. _classCallCheck(this, BaseCaptcha);
  3794. }
  3795. _createClass(BaseCaptcha, [{
  3796. key: 'init',
  3797. value: function init(context, ajax, include, snackbar) {
  3798. this._context = context;
  3799. this._ajax = ajax;
  3800. this._include = include;
  3801. this._snackbar = snackbar;
  3802. }
  3803. }]);
  3804. return BaseCaptcha;
  3805. }();
  3806. var NoCaptcha = exports.NoCaptcha = function (_BaseCaptcha) {
  3807. _inherits(NoCaptcha, _BaseCaptcha);
  3808. function NoCaptcha() {
  3809. _classCallCheck(this, NoCaptcha);
  3810. return _possibleConstructorReturn(this, Object.getPrototypeOf(NoCaptcha).apply(this, arguments));
  3811. }
  3812. _createClass(NoCaptcha, [{
  3813. key: 'load',
  3814. value: function load() {
  3815. return new Promise(function (resolve) {
  3816. // immediately resolve as we don't have anything to validate
  3817. resolve();
  3818. });
  3819. }
  3820. }, {
  3821. key: 'validator',
  3822. value: function validator() {
  3823. return null;
  3824. }
  3825. }, {
  3826. key: 'component',
  3827. value: function component() {
  3828. return null;
  3829. }
  3830. }]);
  3831. return NoCaptcha;
  3832. }(BaseCaptcha);
  3833. var QACaptcha = exports.QACaptcha = function (_BaseCaptcha2) {
  3834. _inherits(QACaptcha, _BaseCaptcha2);
  3835. function QACaptcha() {
  3836. _classCallCheck(this, QACaptcha);
  3837. return _possibleConstructorReturn(this, Object.getPrototypeOf(QACaptcha).apply(this, arguments));
  3838. }
  3839. _createClass(QACaptcha, [{
  3840. key: 'load',
  3841. value: function load() {
  3842. var self = this;
  3843. return new Promise(function (resolve, reject) {
  3844. self._ajax.get(self._context.get('CAPTCHA_API_URL')).then(function (data) {
  3845. self.question = data.question;
  3846. self.helpText = data.help_text;
  3847. resolve();
  3848. }, function () {
  3849. self._snackbar.error(gettext("Failed to load CAPTCHA."));
  3850. reject();
  3851. });
  3852. });
  3853. }
  3854. }, {
  3855. key: 'validator',
  3856. value: function validator() {
  3857. return [];
  3858. }
  3859. /* jshint ignore:start */
  3860. }, {
  3861. key: 'component',
  3862. value: function component(kwargs) {
  3863. return _react2.default.createElement(
  3864. _formGroup2.default,
  3865. { label: this.question, 'for': 'id_captcha',
  3866. labelClass: kwargs.labelClass || "col-sm-4",
  3867. controlClass: kwargs.controlClass || "col-sm-8",
  3868. validation: kwargs.form.state.errors.captcha,
  3869. helpText: this.helpText || null },
  3870. _react2.default.createElement('input', { type: 'text', id: 'id_captcha', className: 'form-control',
  3871. 'aria-describedby': 'id_captcha_status',
  3872. disabled: kwargs.form.state.isLoading,
  3873. onChange: kwargs.form.bindInput('captcha'),
  3874. value: kwargs.form.state.captcha })
  3875. );
  3876. }
  3877. /* jshint ignore:end */
  3878. }]);
  3879. return QACaptcha;
  3880. }(BaseCaptcha);
  3881. var ReCaptchaComponent = exports.ReCaptchaComponent = function (_React$Component) {
  3882. _inherits(ReCaptchaComponent, _React$Component);
  3883. function ReCaptchaComponent() {
  3884. _classCallCheck(this, ReCaptchaComponent);
  3885. return _possibleConstructorReturn(this, Object.getPrototypeOf(ReCaptchaComponent).apply(this, arguments));
  3886. }
  3887. _createClass(ReCaptchaComponent, [{
  3888. key: 'componentDidMount',
  3889. value: function componentDidMount() {
  3890. var _this4 = this;
  3891. grecaptcha.render('recaptcha', {
  3892. 'sitekey': this.props.siteKey,
  3893. 'callback': function callback(response) {
  3894. // fire fakey event to binding
  3895. _this4.props.binding({
  3896. target: {
  3897. value: response
  3898. }
  3899. });
  3900. }
  3901. });
  3902. }
  3903. }, {
  3904. key: 'render',
  3905. value: function render() {
  3906. /* jshint ignore:start */
  3907. return _react2.default.createElement('div', { id: 'recaptcha' });
  3908. /* jshint ignore:end */
  3909. }
  3910. }]);
  3911. return ReCaptchaComponent;
  3912. }(_react2.default.Component);
  3913. var ReCaptcha = exports.ReCaptcha = function (_BaseCaptcha3) {
  3914. _inherits(ReCaptcha, _BaseCaptcha3);
  3915. function ReCaptcha() {
  3916. _classCallCheck(this, ReCaptcha);
  3917. return _possibleConstructorReturn(this, Object.getPrototypeOf(ReCaptcha).apply(this, arguments));
  3918. }
  3919. _createClass(ReCaptcha, [{
  3920. key: 'load',
  3921. value: function load() {
  3922. this._include.include('https://www.google.com/recaptcha/api.js', true);
  3923. return new Promise(function (resolve) {
  3924. var wait = function wait() {
  3925. if (typeof grecaptcha === "undefined") {
  3926. window.setTimeout(function () {
  3927. wait();
  3928. }, 200);
  3929. } else {
  3930. resolve();
  3931. }
  3932. };
  3933. wait();
  3934. });
  3935. }
  3936. }, {
  3937. key: 'validator',
  3938. value: function validator() {
  3939. return [];
  3940. }
  3941. /* jshint ignore:start */
  3942. }, {
  3943. key: 'component',
  3944. value: function component(kwargs) {
  3945. return _react2.default.createElement(
  3946. _formGroup2.default,
  3947. { label: gettext("Captcha"), 'for': 'id_captcha',
  3948. labelClass: kwargs.labelClass || "col-sm-4",
  3949. controlClass: kwargs.controlClass || "col-sm-8",
  3950. validation: kwargs.form.state.errors.captcha,
  3951. helpText: gettext("Please solve the quick test.") },
  3952. _react2.default.createElement(ReCaptchaComponent, { siteKey: this._context.get('SETTINGS').recaptcha_site_key,
  3953. binding: kwargs.form.bindInput('captcha') })
  3954. );
  3955. }
  3956. /* jshint ignore:end */
  3957. }]);
  3958. return ReCaptcha;
  3959. }(BaseCaptcha);
  3960. var Captcha = exports.Captcha = function () {
  3961. function Captcha() {
  3962. _classCallCheck(this, Captcha);
  3963. }
  3964. _createClass(Captcha, [{
  3965. key: 'init',
  3966. value: function init(context, ajax, include, snackbar) {
  3967. switch (context.get('SETTINGS').captcha_type) {
  3968. case 'no':
  3969. this._captcha = new NoCaptcha();
  3970. break;
  3971. case 'qa':
  3972. this._captcha = new QACaptcha();
  3973. break;
  3974. case 're':
  3975. this._captcha = new ReCaptcha();
  3976. break;
  3977. }
  3978. this._captcha.init(context, ajax, include, snackbar);
  3979. }
  3980. // accessors for underlying strategy
  3981. }, {
  3982. key: 'load',
  3983. value: function load() {
  3984. return this._captcha.load();
  3985. }
  3986. }, {
  3987. key: 'validator',
  3988. value: function validator() {
  3989. return this._captcha.validator();
  3990. }
  3991. }, {
  3992. key: 'component',
  3993. value: function component(kwargs) {
  3994. return this._captcha.component(kwargs);
  3995. }
  3996. }]);
  3997. return Captcha;
  3998. }();
  3999. exports.default = new Captcha();
  4000. },{"../components/form-group":30,"react":"react"}],53:[function(require,module,exports){
  4001. 'use strict';
  4002. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  4003. Object.defineProperty(exports, "__esModule", {
  4004. value: true
  4005. });
  4006. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  4007. var Include = exports.Include = function () {
  4008. function Include() {
  4009. _classCallCheck(this, Include);
  4010. }
  4011. _createClass(Include, [{
  4012. key: 'init',
  4013. value: function init(staticUrl) {
  4014. this._staticUrl = staticUrl;
  4015. this._included = [];
  4016. }
  4017. }, {
  4018. key: 'include',
  4019. value: function include(script) {
  4020. var remote = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];
  4021. if (this._included.indexOf(script) === -1) {
  4022. this._included.push(script);
  4023. this._include(script, remote);
  4024. }
  4025. }
  4026. }, {
  4027. key: '_include',
  4028. value: function _include(script, remote) {
  4029. $.ajax({
  4030. url: (!remote ? this._staticUrl : '') + script,
  4031. cache: true,
  4032. dataType: 'script'
  4033. });
  4034. }
  4035. }]);
  4036. return Include;
  4037. }();
  4038. exports.default = new Include();
  4039. },{}],54:[function(require,module,exports){
  4040. 'use strict';
  4041. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  4042. Object.defineProperty(exports, "__esModule", {
  4043. value: true
  4044. });
  4045. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  4046. var storage = window.localStorage;
  4047. var LocalStorage = exports.LocalStorage = function () {
  4048. function LocalStorage() {
  4049. _classCallCheck(this, LocalStorage);
  4050. }
  4051. _createClass(LocalStorage, [{
  4052. key: 'init',
  4053. value: function init(prefix) {
  4054. var _this = this;
  4055. this._prefix = prefix;
  4056. this._watchers = [];
  4057. window.addEventListener('storage', function (e) {
  4058. var newValueJson = JSON.parse(e.newValue);
  4059. _this._watchers.forEach(function (watcher) {
  4060. if (watcher.key === e.key && e.oldValue !== e.newValue) {
  4061. watcher.callback(newValueJson);
  4062. }
  4063. });
  4064. });
  4065. }
  4066. }, {
  4067. key: 'set',
  4068. value: function set(key, value) {
  4069. storage.setItem(this._prefix + key, JSON.stringify(value));
  4070. }
  4071. }, {
  4072. key: 'get',
  4073. value: function get(key) {
  4074. var itemString = storage.getItem(this._prefix + key);
  4075. if (itemString) {
  4076. return JSON.parse(itemString);
  4077. } else {
  4078. return null;
  4079. }
  4080. }
  4081. }, {
  4082. key: 'watch',
  4083. value: function watch(key, callback) {
  4084. this._watchers.push({
  4085. key: this._prefix + key,
  4086. callback: callback
  4087. });
  4088. }
  4089. }]);
  4090. return LocalStorage;
  4091. }();
  4092. exports.default = new LocalStorage();
  4093. },{}],55:[function(require,module,exports){
  4094. 'use strict';
  4095. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  4096. Object.defineProperty(exports, "__esModule", {
  4097. value: true
  4098. });
  4099. exports.MobileNavbarDropdown = undefined;
  4100. var _mountComponent = require('../utils/mount-component');
  4101. var _mountComponent2 = _interopRequireDefault(_mountComponent);
  4102. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  4103. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  4104. var MobileNavbarDropdown = exports.MobileNavbarDropdown = function () {
  4105. function MobileNavbarDropdown() {
  4106. _classCallCheck(this, MobileNavbarDropdown);
  4107. }
  4108. _createClass(MobileNavbarDropdown, [{
  4109. key: 'init',
  4110. value: function init(element) {
  4111. this._element = element;
  4112. this._component = null;
  4113. }
  4114. }, {
  4115. key: 'show',
  4116. value: function show(component) {
  4117. if (this._component === component) {
  4118. this.hide();
  4119. } else {
  4120. this._component = component;
  4121. (0, _mountComponent2.default)(component, this._element.id);
  4122. $(this._element).addClass('open');
  4123. }
  4124. }
  4125. }, {
  4126. key: 'showConnected',
  4127. value: function showConnected(name, component) {
  4128. if (this._component === name) {
  4129. this.hide();
  4130. } else {
  4131. this._component = name;
  4132. (0, _mountComponent2.default)(component, this._element.id, true);
  4133. $(this._element).addClass('open');
  4134. }
  4135. }
  4136. }, {
  4137. key: 'hide',
  4138. value: function hide() {
  4139. $(this._element).removeClass('open');
  4140. this._component = null;
  4141. }
  4142. }]);
  4143. return MobileNavbarDropdown;
  4144. }();
  4145. exports.default = new MobileNavbarDropdown();
  4146. },{"../utils/mount-component":61}],56:[function(require,module,exports){
  4147. 'use strict';
  4148. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  4149. Object.defineProperty(exports, "__esModule", {
  4150. value: true
  4151. });
  4152. exports.Modal = undefined;
  4153. var _reactDom = require('react-dom');
  4154. var _reactDom2 = _interopRequireDefault(_reactDom);
  4155. var _mountComponent = require('../utils/mount-component');
  4156. var _mountComponent2 = _interopRequireDefault(_mountComponent);
  4157. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  4158. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  4159. var Modal = exports.Modal = function () {
  4160. function Modal() {
  4161. _classCallCheck(this, Modal);
  4162. }
  4163. _createClass(Modal, [{
  4164. key: 'init',
  4165. value: function init(element) {
  4166. var _this = this;
  4167. this._element = element;
  4168. this._modal = $(element).modal({ show: false });
  4169. this._modal.on('hidden.bs.modal', function () {
  4170. _reactDom2.default.unmountComponentAtNode(_this._element);
  4171. });
  4172. }
  4173. }, {
  4174. key: 'show',
  4175. value: function show(component) {
  4176. (0, _mountComponent2.default)(component, this._element.id);
  4177. this._modal.modal('show');
  4178. }
  4179. }, {
  4180. key: 'hide',
  4181. value: function hide() {
  4182. this._modal.modal('hide');
  4183. }
  4184. }]);
  4185. return Modal;
  4186. }();
  4187. exports.default = new Modal();
  4188. },{"../utils/mount-component":61,"react-dom":"react-dom"}],57:[function(require,module,exports){
  4189. 'use strict';
  4190. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  4191. Object.defineProperty(exports, "__esModule", {
  4192. value: true
  4193. });
  4194. exports.Snackbar = undefined;
  4195. var _snackbar = require('../reducers/snackbar');
  4196. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  4197. var HIDE_ANIMATION_LENGTH = 300;
  4198. var MESSAGE_SHOW_LENGTH = 5000;
  4199. var Snackbar = exports.Snackbar = function () {
  4200. function Snackbar() {
  4201. _classCallCheck(this, Snackbar);
  4202. }
  4203. _createClass(Snackbar, [{
  4204. key: 'init',
  4205. value: function init(store) {
  4206. this._store = store;
  4207. this._timeout = null;
  4208. }
  4209. }, {
  4210. key: 'alert',
  4211. value: function alert(message, type) {
  4212. var _this = this;
  4213. if (this._timeout) {
  4214. window.clearTimeout(this._timeout);
  4215. this._store.dispatch((0, _snackbar.hideSnackbar)());
  4216. this._timeout = window.setTimeout(function () {
  4217. _this._timeout = null;
  4218. _this.alert(message, type);
  4219. }, HIDE_ANIMATION_LENGTH);
  4220. } else {
  4221. this._store.dispatch((0, _snackbar.showSnackbar)(message, type));
  4222. this._timeout = window.setTimeout(function () {
  4223. _this._store.dispatch((0, _snackbar.hideSnackbar)());
  4224. _this._timeout = null;
  4225. }, MESSAGE_SHOW_LENGTH);
  4226. }
  4227. }
  4228. // shorthands for message types
  4229. }, {
  4230. key: 'info',
  4231. value: function info(message) {
  4232. this.alert(message, 'info');
  4233. }
  4234. }, {
  4235. key: 'success',
  4236. value: function success(message) {
  4237. this.alert(message, 'success');
  4238. }
  4239. }, {
  4240. key: 'warning',
  4241. value: function warning(message) {
  4242. this.alert(message, 'warning');
  4243. }
  4244. }, {
  4245. key: 'error',
  4246. value: function error(message) {
  4247. this.alert(message, 'error');
  4248. }
  4249. // shorthand for api errors
  4250. }, {
  4251. key: 'apiError',
  4252. value: function apiError(rejection) {
  4253. var message = gettext("Unknown error has occured.");
  4254. if (rejection.status === 0) {
  4255. message = gettext("Lost connection with application.");
  4256. }
  4257. if (rejection.status === 400 && rejection.detail) {
  4258. message = rejection.detail;
  4259. }
  4260. if (rejection.status === 403) {
  4261. message = rejection.detail;
  4262. if (message === "Permission denied") {
  4263. message = gettext("You don't have permission to perform this action.");
  4264. }
  4265. }
  4266. if (rejection.status === 404) {
  4267. message = gettext("Action link is invalid.");
  4268. }
  4269. this.error(message);
  4270. }
  4271. }]);
  4272. return Snackbar;
  4273. }();
  4274. exports.default = new Snackbar();
  4275. },{"../reducers/snackbar":47}],58:[function(require,module,exports){
  4276. 'use strict';
  4277. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  4278. Object.defineProperty(exports, "__esModule", {
  4279. value: true
  4280. });
  4281. exports.StoreWrapper = undefined;
  4282. var _redux = require('redux');
  4283. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  4284. var StoreWrapper = exports.StoreWrapper = function () {
  4285. function StoreWrapper() {
  4286. _classCallCheck(this, StoreWrapper);
  4287. this._store = null;
  4288. this._reducers = {};
  4289. this._initialState = {};
  4290. }
  4291. _createClass(StoreWrapper, [{
  4292. key: 'addReducer',
  4293. value: function addReducer(name, reducer, initialState) {
  4294. this._reducers[name] = reducer;
  4295. this._initialState[name] = initialState;
  4296. }
  4297. }, {
  4298. key: 'init',
  4299. value: function init() {
  4300. this._store = (0, _redux.createStore)((0, _redux.combineReducers)(this._reducers), this._initialState);
  4301. }
  4302. }, {
  4303. key: 'getStore',
  4304. value: function getStore() {
  4305. return this._store;
  4306. }
  4307. // Store API
  4308. }, {
  4309. key: 'getState',
  4310. value: function getState() {
  4311. return this._store.getState();
  4312. }
  4313. }, {
  4314. key: 'dispatch',
  4315. value: function dispatch(action) {
  4316. return this._store.dispatch(action);
  4317. }
  4318. }]);
  4319. return StoreWrapper;
  4320. }();
  4321. exports.default = new StoreWrapper();
  4322. },{"redux":"redux"}],59:[function(require,module,exports){
  4323. "use strict";
  4324. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  4325. Object.defineProperty(exports, "__esModule", {
  4326. value: true
  4327. });
  4328. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  4329. /* global zxcvbn */
  4330. var Zxcvbn = exports.Zxcvbn = function () {
  4331. function Zxcvbn() {
  4332. _classCallCheck(this, Zxcvbn);
  4333. }
  4334. _createClass(Zxcvbn, [{
  4335. key: "init",
  4336. value: function init(include) {
  4337. this._include = include;
  4338. }
  4339. }, {
  4340. key: "scorePassword",
  4341. value: function scorePassword(password, inputs) {
  4342. // 0-4 score, the more the stronger password
  4343. return zxcvbn(password, inputs).score;
  4344. }
  4345. }, {
  4346. key: "load",
  4347. value: function load() {
  4348. if (typeof zxcvbn === "undefined") {
  4349. this._include.include('misago/js/zxcvbn.js');
  4350. return this._loadingPromise();
  4351. } else {
  4352. return this._loadedPromise();
  4353. }
  4354. }
  4355. }, {
  4356. key: "_loadingPromise",
  4357. value: function _loadingPromise() {
  4358. return new Promise(function (resolve) {
  4359. var wait = function wait() {
  4360. if (typeof zxcvbn === "undefined") {
  4361. window.setTimeout(function () {
  4362. wait();
  4363. }, 200);
  4364. } else {
  4365. resolve();
  4366. }
  4367. };
  4368. wait();
  4369. });
  4370. }
  4371. }, {
  4372. key: "_loadedPromise",
  4373. value: function _loadedPromise() {
  4374. // we have already loaded zxcvbn.js, resolve away!
  4375. return new Promise(function (resolve) {
  4376. resolve();
  4377. });
  4378. }
  4379. }]);
  4380. return Zxcvbn;
  4381. }();
  4382. exports.default = new Zxcvbn();
  4383. },{}],60:[function(require,module,exports){
  4384. 'use strict';
  4385. Object.defineProperty(exports, "__esModule", {
  4386. value: true
  4387. });
  4388. exports.default = function (ban, changeState) {
  4389. _reactDom2.default.render(
  4390. /* jshint ignore:start */
  4391. _react2.default.createElement(
  4392. _reactRedux.Provider,
  4393. { store: _store2.default.getStore() },
  4394. _react2.default.createElement(RedrawedBannedPage, { message: ban.message,
  4395. expires: ban.expires_on ? (0, _moment2.default)(ban.expires_on) : null })
  4396. ),
  4397. /* jshint ignore:end */
  4398. document.getElementById('page-mount'));
  4399. if (typeof changeState === 'undefined' || changeState) {
  4400. var forumName = _index2.default.get('SETTINGS').forum_name;
  4401. document.title = gettext("You are banned") + ' | ' + forumName;
  4402. window.history.pushState({}, "", _index2.default.get('BANNED_URL'));
  4403. }
  4404. };
  4405. var _moment = require('moment');
  4406. var _moment2 = _interopRequireDefault(_moment);
  4407. var _react = require('react');
  4408. var _react2 = _interopRequireDefault(_react);
  4409. var _reactDom = require('react-dom');
  4410. var _reactDom2 = _interopRequireDefault(_reactDom);
  4411. var _reactRedux = require('react-redux');
  4412. var _bannedPage = require('../components/banned-page');
  4413. var _bannedPage2 = _interopRequireDefault(_bannedPage);
  4414. var _index = require('../index');
  4415. var _index2 = _interopRequireDefault(_index);
  4416. var _store = require('../services/store');
  4417. var _store2 = _interopRequireDefault(_store);
  4418. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  4419. // jshint ignore:line
  4420. /* jshint ignore:start */
  4421. // jshint ignore:line
  4422. // jshint ignore:line
  4423. var select = function select(state) {
  4424. return state.tick;
  4425. }; // jshint ignore:line
  4426. // jshint ignore:line
  4427. var RedrawedBannedPage = (0, _reactRedux.connect)(select)(_bannedPage2.default);
  4428. /* jshint ignore:end */
  4429. },{"../components/banned-page":26,"../index":45,"../services/store":58,"moment":"moment","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],61:[function(require,module,exports){
  4430. 'use strict';
  4431. Object.defineProperty(exports, "__esModule", {
  4432. value: true
  4433. });
  4434. exports.default = function (Component, rootElementId) {
  4435. var connected = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2];
  4436. var rootElement = document.getElementById(rootElementId);
  4437. if (rootElement) {
  4438. if (connected) {
  4439. _reactDom2.default.render(
  4440. /* jshint ignore:start */
  4441. _react2.default.createElement(
  4442. _reactRedux.Provider,
  4443. { store: _store2.default.getStore() },
  4444. _react2.default.createElement(Component, null)
  4445. ),
  4446. /* jshint ignore:end */
  4447. rootElement);
  4448. } else {
  4449. _reactDom2.default.render(
  4450. /* jshint ignore:start */
  4451. _react2.default.createElement(Component, null),
  4452. /* jshint ignore:end */
  4453. rootElement);
  4454. }
  4455. }
  4456. };
  4457. var _react = require('react');
  4458. var _react2 = _interopRequireDefault(_react);
  4459. var _reactDom = require('react-dom');
  4460. var _reactDom2 = _interopRequireDefault(_reactDom);
  4461. var _reactRedux = require('react-redux');
  4462. var _store = require('../services/store');
  4463. var _store2 = _interopRequireDefault(_store);
  4464. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  4465. },{"../services/store":58,"react":"react","react-dom":"react-dom","react-redux":"react-redux"}],62:[function(require,module,exports){
  4466. "use strict";
  4467. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  4468. Object.defineProperty(exports, "__esModule", {
  4469. value: true
  4470. });
  4471. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  4472. var OrderedList = function () {
  4473. function OrderedList(items) {
  4474. _classCallCheck(this, OrderedList);
  4475. this.isOrdered = false;
  4476. this._items = items || [];
  4477. }
  4478. _createClass(OrderedList, [{
  4479. key: "add",
  4480. value: function add(key, item, order) {
  4481. this._items.push({
  4482. key: key,
  4483. item: item,
  4484. after: order ? order.after || null : null,
  4485. before: order ? order.before || null : null
  4486. });
  4487. }
  4488. }, {
  4489. key: "get",
  4490. value: function get(key, value) {
  4491. for (var i = 0; i < this._items.length; i++) {
  4492. if (this._items[i].key === key) {
  4493. return this._items[i].item;
  4494. }
  4495. }
  4496. return value;
  4497. }
  4498. }, {
  4499. key: "has",
  4500. value: function has(key) {
  4501. return this.get(key) !== undefined;
  4502. }
  4503. }, {
  4504. key: "values",
  4505. value: function values() {
  4506. var values = [];
  4507. for (var i = 0; i < this._items.length; i++) {
  4508. values.push(this._items[i].item);
  4509. }
  4510. return values;
  4511. }
  4512. }, {
  4513. key: "order",
  4514. value: function order(values_only) {
  4515. if (!this.isOrdered) {
  4516. this._items = this._order(this._items);
  4517. this.isOrdered = true;
  4518. }
  4519. if (values_only || typeof values_only === 'undefined') {
  4520. return this.values();
  4521. } else {
  4522. return this._items;
  4523. }
  4524. }
  4525. }, {
  4526. key: "orderedValues",
  4527. value: function orderedValues() {
  4528. return this.order(true);
  4529. }
  4530. }, {
  4531. key: "_order",
  4532. value: function _order(unordered) {
  4533. // Index of unordered items
  4534. var index = [];
  4535. unordered.forEach(function (item) {
  4536. index.push(item.key);
  4537. });
  4538. // Ordered items
  4539. var ordered = [];
  4540. var ordering = [];
  4541. // First pass: register items that
  4542. // don't specify their order
  4543. unordered.forEach(function (item) {
  4544. if (!item.after && !item.before) {
  4545. ordered.push(item);
  4546. ordering.push(item.key);
  4547. }
  4548. });
  4549. // Second pass: register items that
  4550. // specify their before to "_end"
  4551. unordered.forEach(function (item) {
  4552. if (item.before === "_end") {
  4553. ordered.push(item);
  4554. ordering.push(item.key);
  4555. }
  4556. });
  4557. // Third pass: keep iterating items
  4558. // until we hit iterations limit or finish
  4559. // ordering list
  4560. function insertItem(item) {
  4561. var insertAt = -1;
  4562. if (ordering.indexOf(item.key) === -1) {
  4563. if (item.after) {
  4564. insertAt = ordering.indexOf(item.after);
  4565. if (insertAt !== -1) {
  4566. insertAt += 1;
  4567. }
  4568. } else if (item.before) {
  4569. insertAt = ordering.indexOf(item.before);
  4570. }
  4571. if (insertAt !== -1) {
  4572. ordered.splice(insertAt, 0, item);
  4573. ordering.splice(insertAt, 0, item.key);
  4574. }
  4575. }
  4576. }
  4577. var iterations = 200;
  4578. while (iterations > 0 && index.length !== ordering.length) {
  4579. iterations -= 1;
  4580. unordered.forEach(insertItem);
  4581. }
  4582. return ordered;
  4583. }
  4584. }]);
  4585. return OrderedList;
  4586. }();
  4587. exports.default = OrderedList;
  4588. },{}],63:[function(require,module,exports){
  4589. 'use strict';
  4590. Object.defineProperty(exports, "__esModule", {
  4591. value: true
  4592. });
  4593. exports.required = required;
  4594. exports.email = email;
  4595. exports.minLength = minLength;
  4596. exports.maxLength = maxLength;
  4597. exports.usernameMinLength = usernameMinLength;
  4598. exports.usernameMaxLength = usernameMaxLength;
  4599. exports.usernameContent = usernameContent;
  4600. exports.passwordMinLength = passwordMinLength;
  4601. var EMAIL = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
  4602. var USERNAME = new RegExp('^[0-9a-z]+$', 'i');
  4603. function required() {
  4604. return function (value) {
  4605. if ($.trim(value).length === 0) {
  4606. return gettext("This field is required.");
  4607. }
  4608. };
  4609. }
  4610. function email(message) {
  4611. return function (value) {
  4612. if (!EMAIL.test(value)) {
  4613. return message || gettext("Enter a valid email address.");
  4614. }
  4615. };
  4616. }
  4617. function minLength(limitValue, message) {
  4618. return function (value) {
  4619. var returnMessage = '';
  4620. var length = $.trim(value).length;
  4621. if (length < limitValue) {
  4622. if (message) {
  4623. returnMessage = message(limitValue, length);
  4624. } else {
  4625. returnMessage = ngettext("Ensure this value has at least %(limit_value)s character (it has %(show_value)s).", "Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).", limitValue);
  4626. }
  4627. return interpolate(returnMessage, {
  4628. limit_value: limitValue,
  4629. show_value: length
  4630. }, true);
  4631. }
  4632. };
  4633. }
  4634. function maxLength(limitValue, message) {
  4635. return function (value) {
  4636. var returnMessage = '';
  4637. var length = $.trim(value).length;
  4638. if (length > limitValue) {
  4639. if (message) {
  4640. returnMessage = message(limitValue, length);
  4641. } else {
  4642. returnMessage = ngettext("Ensure this value has at most %(limit_value)s character (it has %(show_value)s).", "Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).", limitValue);
  4643. }
  4644. return interpolate(returnMessage, {
  4645. limit_value: limitValue,
  4646. show_value: length
  4647. }, true);
  4648. }
  4649. };
  4650. }
  4651. function usernameMinLength(settings) {
  4652. var message = function message(limitValue) {
  4653. return ngettext("Username must be at least %(limit_value)s character long.", "Username must be at least %(limit_value)s characters long.", limitValue);
  4654. };
  4655. return this.minLength(settings.username_length_min, message);
  4656. }
  4657. function usernameMaxLength(settings) {
  4658. var message = function message(limitValue) {
  4659. return ngettext("Username cannot be longer than %(limit_value)s character.", "Username cannot be longer than %(limit_value)s characters.", limitValue);
  4660. };
  4661. return this.maxLength(settings.username_length_max, message);
  4662. }
  4663. function usernameContent() {
  4664. return function (value) {
  4665. if (!USERNAME.test($.trim(value))) {
  4666. return gettext("Username can only contain latin alphabet letters and digits.");
  4667. }
  4668. };
  4669. }
  4670. function passwordMinLength(settings) {
  4671. var message = function message(limitValue) {
  4672. return ngettext("Valid password must be at least %(limit_value)s character long.", "Valid password must be at least %(limit_value)s characters long.", limitValue);
  4673. };
  4674. return this.minLength(settings.password_length_min, message);
  4675. }
  4676. },{}]},{},[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23])
  4677. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvaW5kZXguanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2FqYXguanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2F1dGgtbWVzc2FnZS1jb21wb25lbnQuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2F1dGgtcmVkdWNlci5qcyIsInNyYy9pbml0aWFsaXplcnMvYXV0aC5qcyIsInNyYy9pbml0aWFsaXplcnMvYmFubmVkLXBhZ2UtY29tcG9uZW50LmpzIiwic3JjL2luaXRpYWxpemVycy9jYXRjaGEuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2luY2x1ZGUuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL2xvY2FsLXN0b3JhZ2UuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL21vYmlsZS1uYXZiYXItZHJvcGRvd24uanMiLCJzcmMvaW5pdGlhbGl6ZXJzL21vZGFsLmpzIiwic3JjL2luaXRpYWxpemVycy9tb21lbnQtbG9jYWxlLmpzIiwic3JjL2luaXRpYWxpemVycy9yZXF1ZXN0LWFjdGl2YXRpb24tbGluay1jb21wb25lbnQuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL3JlcXVlc3QtcGFzc3dvcmQtcmVzZXQtY29tcG9uZW50LmpzIiwic3JjL2luaXRpYWxpemVycy9yZXNldC1wYXNzd29yZC1mb3JtLWNvbXBvbmVudC5qcyIsInNyYy9pbml0aWFsaXplcnMvc25hY2tiYXItY29tcG9uZW50LmpzIiwic3JjL2luaXRpYWxpemVycy9zbmFja2Jhci1yZWR1Y2VyLmpzIiwic3JjL2luaXRpYWxpemVycy9zbmFja2Jhci5qcyIsInNyYy9pbml0aWFsaXplcnMvc3RvcmUuanMiLCJzcmMvaW5pdGlhbGl6ZXJzL3RpY2stcmVkdWNlci5qcyIsInNyYy9pbml0aWFsaXplcnMvdGljay1zdGFydC5qcyIsInNyYy9pbml0aWFsaXplcnMvdXNlci1tZW51LWNvbXBvbmVudC5qcyIsInNyYy9pbml0aWFsaXplcnMvenhjdmJuLmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9hdXRoLW1lc3NhZ2UuanMiLCIuLi8uLi8uLi9kb2N1bWVudHMvbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2F2YXRhci5qcyIsIi4uLy4uLy4uL2RvY3VtZW50cy9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvYmFubmVkLXBhZ2UuanMiLCIuLi8uLi8uLi9kb2N1bWVudHMvbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL2J1dHRvbi5qcyIsIi4uLy4uLy4uL2RvY3VtZW50cy9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvY2hhbmdlLWF2YXRhci9pbmRleC5qcyIsIi4uLy4uLy4uL2RvY3VtZW50cy9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvY2hhbmdlLWF2YXRhci9yb290LmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9mb3JtLWdyb3VwLmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9mb3JtLmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9sb2FkZXIuanMiLCIuLi8uLi8uLi9kb2N1bWVudHMvbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL21vZGFsLWxvYWRlci5qcyIsIi4uLy4uLy4uL2RvY3VtZW50cy9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcGFzc3dvcmQtc3RyZW5ndGguanMiLCIuLi8uLi8uLi9kb2N1bWVudHMvbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3JlZ2lzdGVyLWJ1dHRvbi5qcyIsIi4uLy4uLy4uL2RvY3VtZW50cy9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvcmVnaXN0ZXIuanMiLCIuLi8uLi8uLi9kb2N1bWVudHMvbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3JlcXVlc3QtYWN0aXZhdGlvbi1saW5rLmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9yZXF1ZXN0LXBhc3N3b3JkLXJlc2V0LmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9yZXNldC1wYXNzd29yZC1mb3JtLmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9zaWduLWluLmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvY29tcG9uZW50cy9zbmFja2Jhci5qcyIsIi4uLy4uLy4uL2RvY3VtZW50cy9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlci1tZW51L2d1ZXN0LW5hdi5qcyIsIi4uLy4uLy4uL2RvY3VtZW50cy9taXNhZ28vZnJvbnRlbmQvc3JjL2NvbXBvbmVudHMvdXNlci1tZW51L3Jvb3QuanMiLCIuLi8uLi8uLi9kb2N1bWVudHMvbWlzYWdvL2Zyb250ZW5kL3NyYy9jb21wb25lbnRzL3VzZXItbWVudS91c2VyLW5hdi5qcyIsIi4uLy4uLy4uL2RvY3VtZW50cy9taXNhZ28vZnJvbnRlbmQvc3JjL2luZGV4LmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvcmVkdWNlcnMvYXV0aC5qcyIsIi4uLy4uLy4uL2RvY3VtZW50cy9taXNhZ28vZnJvbnRlbmQvc3JjL3JlZHVjZXJzL3NuYWNrYmFyLmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvcmVkdWNlcnMvdGljay5qcyIsIi4uLy4uLy4uL2RvY3VtZW50cy9taXNhZ28vZnJvbnRlbmQvc3JjL3JlZHVjZXJzL3VzZXJzLmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvc2VydmljZXMvYWpheC5qcyIsIi4uLy4uLy4uL2RvY3VtZW50cy9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2F1dGguanMiLCIuLi8uLi8uLi9kb2N1bWVudHMvbWlzYWdvL2Zyb250ZW5kL3NyYy9zZXJ2aWNlcy9jYXB0Y2hhLmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvc2VydmljZXMvaW5jbHVkZS5qcyIsIi4uLy4uLy4uL2RvY3VtZW50cy9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2UuanMiLCIuLi8uLi8uLi9kb2N1bWVudHMvbWlzYWdvL2Zyb250ZW5kL3NyYy9zZXJ2aWNlcy9tb2JpbGUtbmF2YmFyLWRyb3Bkb3duLmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvc2VydmljZXMvbW9kYWwuanMiLCIuLi8uLi8uLi9kb2N1bWVudHMvbWlzYWdvL2Zyb250ZW5kL3NyYy9zZXJ2aWNlcy9zbmFja2Jhci5qcyIsIi4uLy4uLy4uL2RvY3VtZW50cy9taXNhZ28vZnJvbnRlbmQvc3JjL3NlcnZpY2VzL3N0b3JlLmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvc2VydmljZXMvenhjdmJuLmpzIiwiLi4vLi4vLi4vZG9jdW1lbnRzL21pc2Fnby9mcm9udGVuZC9zcmMvdXRpbHMvYmFubmVkLXBhZ2UuanMiLCIuLi8uLi8uLi9kb2N1bWVudHMvbWlzYWdvL2Zyb250ZW5kL3NyYy91dGlscy9tb3VudC1jb21wb25lbnQuanMiLCIuLi8uLi8uLi9kb2N1bWVudHMvbWlzYWdvL2Zyb250ZW5kL3NyYy91dGlscy9vcmRlcmVkLWxpc3QuanMiLCIuLi8uLi8uLi9kb2N1bWVudHMvbWlzYWdvL2Zyb250ZW5kL3NyYy91dGlscy92YWxpZGF0b3JzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDRWEsTUFBTSxXQUFOLE1BQU07QUFDakIsV0FEVyxNQUFNLEdBQ0g7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LENBQUM7R0FDZixDQUFDO0FBQ0YsU0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztDQUM5RDs7QUFFTSxTQUFTLGlCQUFpQixDQUFDLFFBQVEsRUFBRTtBQUMxQyxNQUFJLE9BQU8sR0FBRyxTQUFWLE9BQU8sQ0FBWSxVQUFVLEVBQUU7QUFDakMsV0FBTyxRQUFRLENBQ2IsMkRBQTJELEVBQzNELDREQUE0RCxFQUM1RCxVQUFVLENBQUMsQ0FBQztHQUNmLENBQUM7QUFDRixTQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0NBQzlEOztBQUVNLFNBQVMsZUFBZSxHQUFHO0FBQ2hDLFNBQU8sVUFBUyxLQUFLLEVBQUU7QUFDckIsUUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ2pDLGFBQU8sT0FBTyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7S0FDaEY7R0FDRixDQUFDO0NBQ0g7O0FBRU0sU0FBUyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUU7QUFDMUMsTUFBSSxPQUFPLEdBQUcsU0FBVixPQUFPLENBQVksVUFBVSxFQUFFO0FBQ2pDLFdBQU8sUUFBUSxDQUNiLGlFQUFpRSxFQUNqRSxrRUFBa0UsRUFDbEUsVUFBVSxDQUFDLENBQUM7R0FDZixDQUFDO0FBQ0YsU0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztDQUM5RCIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJpbXBvcnQgT3JkZXJlZExpc3QgZnJvbSAnbWlzYWdvL3V0aWxzL29yZGVyZWQtbGlzdCc7XG5cbmV4cG9ydCBjbGFzcyBNaXNhZ28ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9pbml0aWFsaXplcnMgPSBbXTtcbiAgICB0aGlzLl9jb250ZXh0ID0ge307XG4gIH1cblxuICBhZGRJbml0aWFsaXplcihpbml0aWFsaXplcikge1xuICAgIHRoaXMuX2luaXRpYWxpemVycy5wdXNoKHtcbiAgICAgIGtleTogaW5pdGlhbGl6ZXIubmFtZSxcblxuICAgICAgaXRlbTogaW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZXIsXG5cbiAgICAgIGFmdGVyOiBpbml0aWFsaXplci5hZnRlcixcbiAgICAgIGJlZm9yZTogaW5pdGlhbGl6ZXIuYmVmb3JlXG4gICAgfSk7XG4gIH1cblxuICBpbml0KGNvbnRleHQpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcblxuICAgIHZhciBpbml0T3JkZXIgPSBuZXcgT3JkZXJlZExpc3QodGhpcy5faW5pdGlhbGl6ZXJzKS5vcmRlcmVkVmFsdWVzKCk7XG4gICAgaW5pdE9yZGVyLmZvckVhY2goaW5pdGlhbGl6ZXIgPT4ge1xuICAgICAgaW5pdGlhbGl6ZXIodGhpcyk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBjb250ZXh0IGFjY2Vzc29yc1xuICBoYXMoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQuaGFzT3duUHJvcGVydHkoa2V5KTtcbiAgfVxuXG4gIGdldChrZXksIGZhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb250ZXh0W2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxsYmFjayB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG5cbi8vIGNyZWF0ZSAgc2luZ2xldG9uXG52YXIgbWlzYWdvID0gbmV3IE1pc2FnbygpO1xuXG4vLyBleHBvc2UgaXQgZ2xvYmFsbHlcbmdsb2JhbC5taXNhZ28gPSBtaXNhZ287XG5cbi8vIGFuZCBleHBvcnQgaXQgZm9yIHRlc3RzIGFuZCBzdHVmZlxuZXhwb3J0IGRlZmF1bHQgbWlzYWdvO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgYWpheC5pbml0KG1pc2Fnby5nZXQoJ0NTUkZfQ09PS0lFX05BTUUnKSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdhamF4JyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsImltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgQXV0aE1lc3NhZ2UsIHsgc2VsZWN0IH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXV0aC1tZXNzYWdlJztcbmltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvbW91bnQtY29tcG9uZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIG1vdW50KGNvbm5lY3Qoc2VsZWN0KShBdXRoTWVzc2FnZSksICdhdXRoLW1lc3NhZ2UtbW91bnQnKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDphdXRoLW1lc3NhZ2UnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCByZWR1Y2VyLCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9hdXRoJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcihjb250ZXh0KSB7XG4gIHN0b3JlLmFkZFJlZHVjZXIoJ2F1dGgnLCByZWR1Y2VyLCBPYmplY3QuYXNzaWduKHtcbiAgICAnaXNBdXRoZW50aWNhdGVkJzogY29udGV4dC5nZXQoJ2lzQXV0aGVudGljYXRlZCcpLFxuICAgICdpc0Fub255bW91cyc6ICFjb250ZXh0LmdldCgnaXNBdXRoZW50aWNhdGVkJyksXG5cbiAgICAndXNlcic6IGNvbnRleHQuZ2V0KCd1c2VyJylcbiAgfSwgaW5pdGlhbFN0YXRlKSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdyZWR1Y2VyOmF1dGgnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgYXV0aCBmcm9tICdtaXNhZ28vc2VydmljZXMvYXV0aCc7XG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuaW1wb3J0IHN0b3JhZ2UgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgYXV0aC5pbml0KHN0b3JlLCBzdG9yYWdlLCBtb2RhbCk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdhdXRoJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3N0b3JlJ1xufSk7IiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHNob3dCYW5uZWRQYWdlIGZyb20gJ21pc2Fnby91dGlscy9iYW5uZWQtcGFnZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKGNvbnRleHQpIHtcbiAgaWYgKGNvbnRleHQuZ2V0KCdCQU5fTUVTU0FHRScpKSB7XG4gICAgc2hvd0Jhbm5lZFBhZ2UoY29udGV4dC5nZXQoJ0JBTl9NRVNTQUdFJyksIGZhbHNlKTtcbiAgfVxufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnY29tcG9uZW50OmJhbmVkLXBhZ2UnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBjYXB0Y2hhIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9jYXB0Y2hhJztcbmltcG9ydCBpbmNsdWRlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9pbmNsdWRlJztcbmltcG9ydCBzbmFja2JhciBmcm9tICdtaXNhZ28vc2VydmljZXMvc25hY2tiYXInO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcihjb250ZXh0KSB7XG4gIGNhcHRjaGEuaW5pdChjb250ZXh0LCBhamF4LCBpbmNsdWRlLCBzbmFja2Jhcik7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjYXB0Y2hhJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBpbmNsdWRlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9pbmNsdWRlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoY29udGV4dCkge1xuICBpbmNsdWRlLmluaXQoY29udGV4dC5nZXQoJ1NUQVRJQ19VUkwnKSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdpbmNsdWRlJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBzdG9yYWdlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9sb2NhbC1zdG9yYWdlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIHN0b3JhZ2UuaW5pdCgnbWlzYWdvXycpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnbG9jYWwtc3RvcmFnZScsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplclxufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgZHJvcGRvd24gZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vYmlsZS1uYXZiYXItZHJvcGRvd24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9iaWxlLW5hdmJhci1kcm9wZG93bi1tb3VudCcpO1xuICBpZiAoZWxlbWVudCkge1xuICAgIGRyb3Bkb3duLmluaXQoZWxlbWVudCk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2Ryb3Bkb3duJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBiZWZvcmU6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IG1vZGFsIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9tb2RhbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC1tb3VudCcpO1xuICBpZiAoZWxlbWVudCkge1xuICAgIG1vZGFsLmluaXQoZWxlbWVudCk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ21vZGFsJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBiZWZvcmU6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgbW9tZW50LmxvY2FsZSgkKCdodG1sJykuYXR0cignbGFuZycpKTtcbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ21vbWVudCcsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplclxufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgUmVxdWVzdEFjdGl2YXRpb25MaW5rIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3JlcXVlc3QtYWN0aXZhdGlvbi1saW5rJztcbmltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvbW91bnQtY29tcG9uZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVxdWVzdC1hY3RpdmF0aW9uLWxpbmstbW91bnQnKSkge1xuICAgIG1vdW50KFJlcXVlc3RBY3RpdmF0aW9uTGluaywgJ3JlcXVlc3QtYWN0aXZhdGlvbi1saW5rLW1vdW50JywgZmFsc2UpO1xuICB9XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6cmVxdWVzdC1hY3RpdmF0aW9uLWxpbmsnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBSZXF1ZXN0UGFzc3dvcmRSZXNldCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9yZXF1ZXN0LXBhc3N3b3JkLXJlc2V0JztcbmltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvbW91bnQtY29tcG9uZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVxdWVzdC1wYXNzd29yZC1yZXNldC1tb3VudCcpKSB7XG4gICAgbW91bnQoUmVxdWVzdFBhc3N3b3JkUmVzZXQsICdyZXF1ZXN0LXBhc3N3b3JkLXJlc2V0LW1vdW50JywgZmFsc2UpO1xuICB9XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6cmVxdWVzdC1wYXNzd29yZC1yZXNldCcsXG4gIGluaXRpYWxpemVyOiBpbml0aWFsaXplcixcbiAgYWZ0ZXI6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IFJlc2V0UGFzc3dvcmRGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3Jlc2V0LXBhc3N3b3JkLWZvcm0nO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9tb3VudC1jb21wb25lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNldC1wYXNzd29yZC1mb3JtLW1vdW50JykpIHtcbiAgICBtb3VudChSZXNldFBhc3N3b3JkRm9ybSwgJ3Jlc2V0LXBhc3N3b3JkLWZvcm0tbW91bnQnLCBmYWxzZSk7XG4gIH1cbn1cblxubWlzYWdvLmFkZEluaXRpYWxpemVyKHtcbiAgbmFtZTogJ2NvbXBvbmVudDpyZXNldC1wYXNzd29yZC1mb3JtJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgU25hY2tiYXIsIHNlbGVjdCB9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3NuYWNrYmFyJztcbmltcG9ydCBtb3VudCBmcm9tICdtaXNhZ28vdXRpbHMvbW91bnQtY29tcG9uZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIG1vdW50KGNvbm5lY3Qoc2VsZWN0KShTbmFja2JhciksICdzbmFja2Jhci1tb3VudCcpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnY29tcG9uZW50OnNuYWNrYmFyJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3NuYWNrYmFyJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgcmVkdWNlciwgeyBpbml0aWFsU3RhdGUgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvc25hY2tiYXInO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICBzdG9yZS5hZGRSZWR1Y2VyKCdzbmFja2JhcicsIHJlZHVjZXIsIGluaXRpYWxTdGF0ZSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdyZWR1Y2VyOnNuYWNrYmFyJyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBiZWZvcmU6ICdzdG9yZSdcbn0pO1xuIiwiaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdGlhbGl6ZXIoKSB7XG4gIHNuYWNrYmFyLmluaXQoc3RvcmUpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnc25hY2tiYXInLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGFmdGVyOiAnc3RvcmUnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgc3RvcmUuaW5pdCgpO1xufVxuXG5taXNhZ28uYWRkSW5pdGlhbGl6ZXIoe1xuICBuYW1lOiAnc3RvcmUnLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ19lbmQnXG59KTtcbiIsImltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCByZWR1Y2VyLCB7IGluaXRpYWxTdGF0ZSB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy90aWNrJztcbmltcG9ydCBzdG9yZSBmcm9tICdtaXNhZ28vc2VydmljZXMvc3RvcmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgc3RvcmUuYWRkUmVkdWNlcigndGljaycsIHJlZHVjZXIsIGluaXRpYWxTdGF0ZSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdyZWR1Y2VyOnRpY2snLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXIsXG4gIGJlZm9yZTogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgeyBkb1RpY2sgfSBmcm9tICdtaXNhZ28vcmVkdWNlcnMvdGljayc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJztcblxuY29uc3QgVElDS19QRVJJT0QgPSA1MCAqIDEwMDA7IC8vZG8gdGhlIHRpY2sgZXZlcnkgNTBzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuICB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgc3RvcmUuZGlzcGF0Y2goZG9UaWNrKCkpO1xuICB9LCBUSUNLX1BFUklPRCk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICd0aWNrLXN0YXJ0JyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgVXNlck1lbnUsIENvbXBhY3RVc2VyTWVudSwgc2VsZWN0IH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlci1tZW51L3Jvb3QnO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9tb3VudC1jb21wb25lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgbW91bnQoY29ubmVjdChzZWxlY3QpKFVzZXJNZW51KSwgJ3VzZXItbWVudS1tb3VudCcpO1xuICBtb3VudChjb25uZWN0KHNlbGVjdCkoQ29tcGFjdFVzZXJNZW51KSwgJ3VzZXItbWVudS1jb21wYWN0LW1vdW50Jyk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICdjb21wb25lbnQ6dXNlci1tZW51JyxcbiAgaW5pdGlhbGl6ZXI6IGluaXRpYWxpemVyLFxuICBhZnRlcjogJ3N0b3JlJ1xufSk7XG4iLCJpbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgaW5jbHVkZSBmcm9tICdtaXNhZ28vc2VydmljZXMvaW5jbHVkZSc7XG5pbXBvcnQgenhjdmJuIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy96eGN2Ym4nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcbiAgenhjdmJuLmluaXQoaW5jbHVkZSk7XG59XG5cbm1pc2Fnby5hZGRJbml0aWFsaXplcih7XG4gIG5hbWU6ICd6eGN2Ym4nLFxuICBpbml0aWFsaXplcjogaW5pdGlhbGl6ZXJcbn0pO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZWZyZXNoKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxuXG4gIGdldE1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2lnbmVkSW4pIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShcbiAgICAgICAgZ2V0dGV4dChcIllvdSBoYXZlIHNpZ25lZCBpbiBhcyAlKHVzZXJuYW1lKXMuIFBsZWFzZSByZWZyZXNoIHRoZSBwYWdlIGJlZm9yZSBjb250aW51aW5nLlwiKSxcbiAgICAgICAge3VzZXJuYW1lOiB0aGlzLnByb3BzLnNpZ25lZEluLnVzZXJuYW1lfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnNpZ25lZE91dCkge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlKFxuICAgICAgICBnZXR0ZXh0KFwiJSh1c2VybmFtZSlzLCB5b3UgaGF2ZSBiZWVuIHNpZ25lZCBvdXQuIFBsZWFzZSByZWZyZXNoIHRoZSBwYWdlIGJlZm9yZSBjb250aW51aW5nLlwiKSxcbiAgICAgICAge3VzZXJuYW1lOiB0aGlzLnByb3BzLnVzZXIudXNlcm5hbWV9LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2lnbmVkSW4gfHwgdGhpcy5wcm9wcy5zaWduZWRPdXQpIHtcbiAgICAgIHJldHVybiBcImF1dGgtbWVzc2FnZSBzaG93XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcImF1dGgtbWVzc2FnZVwiO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cImxlYWRcIj57dGhpcy5nZXRNZXNzYWdlKCl9PC9wPlxuICAgICAgICA8cD5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5yZWZyZXNofT5cbiAgICAgICAgICAgIHtnZXR0ZXh0KFwiUmVsb2FkIHBhZ2VcIil9XG4gICAgICAgICAgPC9idXR0b24+IDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbi14cyBoaWRkZW4tc20gdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAge2dldHRleHQoXCJvciBwcmVzcyBGNSBrZXkuXCIpfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChzdGF0ZSkge1xuICByZXR1cm4ge1xuICAgIHVzZXI6IHN0YXRlLmF1dGgudXNlcixcbiAgICBzaWduZWRJbjogc3RhdGUuYXV0aC5zaWduZWRJbixcbiAgICBzaWduZWRPdXQ6IHN0YXRlLmF1dGguc2lnbmVkT3V0XG4gIH07XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuY29uc3QgQkFTRV9VUkwgPSAkKCdiYXNlJykuYXR0cignaHJlZicpICsgJ3VzZXItYXZhdGFyLyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0U3JjKCkge1xuICAgIGxldCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IDEwMDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgbGV0IHVybCA9IEJBU0VfVVJMO1xuXG4gICAgaWYgKHRoaXMucHJvcHMudXNlciAmJiB0aGlzLnByb3BzLnVzZXIuaWQpIHtcbiAgICAgIC8vIGp1c3QgYXZhdGFyIGhhc2gsIHNpemUgYW5kIHVzZXIgaWRcbiAgICAgIHVybCArPSB0aGlzLnByb3BzLnVzZXIuYXZhdGFyX2hhc2ggKyAnLycgKyBzaXplICsgJy8nICsgdGhpcy5wcm9wcy51c2VyLmlkICsgJy5wbmcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IGFwcGVuZCBhdmF0YXIgc2l6ZSB0byBmaWxlIHRvIHByb2R1Y2Ugbm8tYXZhdGFyIHBsYWNlaG9sZGVyXG4gICAgICB1cmwgKz0gc2l6ZSArICcucG5nJztcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGltZyBzcmM9e3RoaXMuZ2V0U3JjKCl9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCAndXNlci1hdmF0YXInfVxuICAgICAgICAgICAgICAgIHRpdGxlPXtnZXR0ZXh0KFwiVXNlciBhdmF0YXJcIil9Lz47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRSZWFzb25NZXNzYWdlKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBpZiAodGhpcy5wcm9wcy5tZXNzYWdlLmh0bWwpIHtcbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImxlYWRcIlxuICAgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IHRoaXMucHJvcHMubWVzc2FnZS5odG1sfX0gLz47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA8cCBjbGFzc05hbWU9XCJsZWFkXCI+e3RoaXMucHJvcHMubWVzc2FnZS5wbGFpbn08L3A+O1xuICAgIH1cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgZ2V0RXhwaXJhdGlvbk1lc3NhZ2UoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZXhwaXJlcykge1xuICAgICAgaWYgKHRoaXMucHJvcHMuZXhwaXJlcy5pc0FmdGVyKG1vbWVudCgpKSkge1xuICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUoXG4gICAgICAgICAgZ2V0dGV4dChcIlRoaXMgYmFuIGV4cGlyZXMgJShleHBpcmVzX29uKXMuXCIpLFxuICAgICAgICAgIHsnZXhwaXJlc19vbic6IHRoaXMucHJvcHMuZXhwaXJlcy5mcm9tTm93KCl9LFxuICAgICAgICAgIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGdldHRleHQoXCJUaGlzIGJhbiBoYXMgZXhwaXJlZC5cIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiVGhpcyBiYW4gaXMgcGVybWFuZW50LlwiKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cInBhZ2UgcGFnZS1lcnJvciBwYWdlLWVycm9yLWJhbm5lZFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLXBhbmVsXCI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtaWNvblwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPmhpZ2hsaWdodF9vZmY8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgICAgIHt0aGlzLmdldFJlYXNvbk1lc3NhZ2UoKX1cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm1lc3NhZ2UtZm9vdG5vdGVcIj5cbiAgICAgICAgICAgICAge3RoaXMuZ2V0RXhwaXJhdGlvbk1lc3NhZ2UoKX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJ1dHRvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICBsZXQgY2xhc3NOYW1lID0gJ2J0biAnICsgdGhpcy5wcm9wcy5jbGFzc05hbWU7XG4gICAgbGV0IGRpc2FibGVkID0gdGhpcy5wcm9wcy5kaXNhYmxlZDtcblxuICAgIGlmICh0aGlzLnByb3BzLmxvYWRpbmcpIHtcbiAgICAgIGNsYXNzTmFtZSArPSAnIGJ0bi1sb2FkaW5nJztcbiAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxidXR0b24gdHlwZT17dGhpcy5wcm9wcy5vbkNsaWNrID8gJ2J1dHRvbicgOiAnc3VibWl0J31cbiAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cbiAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfT5cbiAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgICAge3RoaXMucHJvcHMubG9hZGluZyA/IDxMb2FkZXIgLz4gOiBudWxsfVxuICAgIDwvYnV0dG9uPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cblxuQnV0dG9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgY2xhc3NOYW1lOiBcImJ0bi1kZWZhdWx0XCIsXG5cbiAgdHlwZTogXCJzdWJtaXRcIixcblxuICBsb2FkaW5nOiBmYWxzZSxcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuXG4gIG9uQ2xpY2s6IG51bGxcbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTG9hZGVyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2xvYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGNhbGxBcGkoYXZhdGFyVHlwZSkge1xuICAgIGlmICh0aGlzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgJ2lzTG9hZGluZyc6IHRydWVcbiAgICB9KTtcblxuICAgIGFqYXgucG9zdCh0aGlzLnByb3BzLnVzZXIuYXZhdGFyX2FwaV91cmwsIHtcbiAgICAgIGF2YXRhcjogYXZhdGFyVHlwZVxuICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBzbmFja2Jhci5zdWNjZXNzKHJlc3BvbnNlLmRldGFpbCk7XG4gICAgICB0aGlzLnByb3BzLnVwZGF0ZUF2YXRhcihyZXNwb25zZS5hdmF0YXJfaGFzaCwgcmVzcG9uc2Uub3B0aW9ucyk7XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAnaXNMb2FkaW5nJzogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0sIChyZWplY3Rpb24pID0+IHtcbiAgICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDApIHtcbiAgICAgICAgc25hY2tiYXIuZXJyb3IocmVqZWN0aW9uLmRldGFpbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbmFja2Jhci5zaG93RXJyb3IocmVqZWN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICdpc0xvYWRpbmcnOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIHNldEdyYXZhdGFyID0gKCkgPT4ge1xuICAgIHRoaXMuY2FsbEFwaSgnZ3JhdmF0YXInKTtcbiAgfTtcblxuICBzZXRHZW5lcmF0ZWQgPSAoKSA9PiB7XG4gICAgdGhpcy5jYWxsQXBpKCdnZW5lcmF0ZWQnKTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRHcmF2YXRhckJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5vcHRpb25zLmdyYXZhdGFyKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLnNldEdyYXZhdGFyfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiPlxuICAgICAgICB7Z2V0dGV4dChcIkRvd25sb2FkIG15IEdyYXZhdGFyXCIpfVxuICAgICAgPC9CdXR0b24+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXZhdGFyUHJldmlldygpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImF2YXRhci1wcmV2aWV3IHByZXZpZXctbG9hZGluZ1wiPlxuICAgICAgICA8QXZhdGFyIHVzZXI9e3RoaXMucHJvcHMudXNlcn0gc2l6ZT1cIjIwMFwiIC8+XG4gICAgICAgIDxMb2FkZXIgLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImF2YXRhci1wcmV2aWV3XCI+XG4gICAgICAgIDxBdmF0YXIgdXNlcj17dGhpcy5wcm9wcy51c2VyfSBzaXplPVwiMjAwXCIgLz5cbiAgICAgIDwvZGl2PjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5IG1vZGFsLWF2YXRhci1pbmRleFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtbWQtNVwiPlxuXG4gICAgICAgICAge3RoaXMuZ2V0QXZhdGFyUHJldmlldygpfVxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbC1tZC03XCI+XG5cbiAgICAgICAgICB7dGhpcy5nZXRHcmF2YXRhckJ1dHRvbigpfVxuXG4gICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLnNldEdlbmVyYXRlZH1cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiPlxuICAgICAgICAgICAge2dldHRleHQoXCJHZW5lcmF0ZSBteSBpbmRpdmlkdWFsIGF2YXRhclwiKX1cbiAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBdmF0YXJJbmRleCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9jaGFuZ2UtYXZhdGFyL2luZGV4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgTG9hZGVyIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL21vZGFsLWxvYWRlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHsgdXBkYXRlQXZhdGFyIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VBdmF0YXJFcnJvciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldEVycm9yUmVhc29uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnJlYXNvbikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxwIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiB0aGlzLnByb3BzLnJlYXNvbn19IC8+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtaWNvblwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgcmVtb3ZlX2NpcmNsZV9vdXRsaW5lXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWJvZHlcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwibGVhZFwiPlxuICAgICAgICAgIHt0aGlzLnByb3BzLm1lc3NhZ2V9XG4gICAgICAgIDwvcD5cbiAgICAgICAge3RoaXMuZ2V0RXJyb3JSZWFzb24oKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgUHJvbWlzZS5hbGwoW1xuICAgICAgYWpheC5nZXQobWlzYWdvLmdldCgndXNlcicpLmF2YXRhcl9hcGlfdXJsKVxuICAgIF0pLnRoZW4oKHJlc29sdXRpb25zKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgJ2NvbXBvbmVudCc6IEF2YXRhckluZGV4LFxuICAgICAgICAnb3B0aW9ucyc6IHJlc29sdXRpb25zWzBdXG4gICAgICB9KTtcbiAgICB9LCAocmVqZWN0aW9uKSA9PiB7XG4gICAgICB0aGlzLnNob3dFcnJvcihyZWplY3Rpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBzaG93RXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGVycm9yXG4gICAgfSk7XG4gIH07XG5cbiAgdXBkYXRlQXZhdGFyID0gKGF2YXRhckhhc2gsIG9wdGlvbnMpID0+IHtcbiAgICBzdG9yZS5kaXNwYXRjaCh1cGRhdGVBdmF0YXIodGhpcy5wcm9wcy51c2VyLCBhdmF0YXJIYXNoKSk7XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICdjb21wb25lbnQnOiBBdmF0YXJJbmRleCxcbiAgICAgIG9wdGlvbnNcbiAgICB9KTtcbiAgfTtcblxuICBzaG93SW5kZXggPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAnY29tcG9uZW50JzogQXZhdGFySW5kZXhcbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRCb2R5KCkge1xuICAgIGlmICh0aGlzLnN0YXRlKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8Q2hhbmdlQXZhdGFyRXJyb3IgbWVzc2FnZT17dGhpcy5zdGF0ZS5lcnJvci5kZXRhaWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uPXt0aGlzLnN0YXRlLmVycm9yLnJlYXNvbn0gLz47XG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIHJldHVybiA8dGhpcy5zdGF0ZS5jb21wb25lbnQgb3B0aW9ucz17dGhpcy5zdGF0ZS5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI9e3RoaXMucHJvcHMudXNlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBdmF0YXI9e3RoaXMudXBkYXRlQXZhdGFyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dJbmRleD17dGhpcy5zaG93SW5kZXh9IC8+O1xuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPExvYWRlciAvPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfVxuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgaWYgKHRoaXMuc3RhdGUgJiYgdGhpcy5zdGF0ZS5lcnJvcikge1xuICAgICAgcmV0dXJuIFwibW9kYWwtZGlhbG9nIG1vZGFsLW1lc3NhZ2UgbW9kYWwtY2hhbmdlLWF2YXRhclwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJtb2RhbC1kaWFsb2cgbW9kYWwtY2hhbmdlLWF2YXRhclwiO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfVxuICAgICAgICAgICAgICAgIHJvbGU9XCJkb2N1bWVudFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtnZXR0ZXh0KFwiQ2xvc2VcIil9PlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwibW9kYWwtdGl0bGVcIj57Z2V0dGV4dChcIkNoYW5nZSB5b3VyIGF2YXRhclwiKX08L2g0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7dGhpcy5nZXRCb2R5KCl9XG5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Qoc3RhdGUpIHtcbiAgcmV0dXJuIHtcbiAgICAndXNlcic6IHN0YXRlLmF1dGgudXNlclxuICB9O1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBpc1ZhbGlkYXRlZCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucHJvcHMudmFsaWRhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpIHtcbiAgICBsZXQgY2xhc3NOYW1lID0gJ2Zvcm0tZ3JvdXAnO1xuICAgIGlmICh0aGlzLmlzVmFsaWRhdGVkKCkpIHtcbiAgICAgIGNsYXNzTmFtZSArPSAnIGhhcy1mZWVkYmFjayc7XG4gICAgICBpZiAodGhpcy5wcm9wcy52YWxpZGF0aW9uID09PSBudWxsKSB7XG4gICAgICAgIGNsYXNzTmFtZSArPSAnIGhhcy1zdWNjZXNzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzTmFtZSArPSAnIGhhcy1lcnJvcic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cblxuICBnZXRGZWVkYmFjaygpIHtcbiAgICBpZiAodGhpcy5wcm9wcy52YWxpZGF0aW9uKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJoZWxwLWJsb2NrIGVycm9yc1wiPlxuICAgICAgICB7dGhpcy5wcm9wcy52YWxpZGF0aW9uLm1hcCgoZXJyb3IsIGkpID0+IHtcbiAgICAgICAgICByZXR1cm4gPHAga2V5PXt0aGlzLnByb3BzLmZvciArICdGZWVkYmFja0l0ZW0nICsgaX0+e2Vycm9yfTwvcD47XG4gICAgICAgIH0pfVxuICAgICAgPC9kaXY+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0RmVlZGJhY2tJY29uKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWRhdGVkKCkpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uIGZvcm0tY29udHJvbC1mZWVkYmFja1wiXG4gICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCIga2V5PXt0aGlzLnByb3BzLmZvciArICdGZWVkYmFja0ljb24nfT5cbiAgICAgICAge3RoaXMucHJvcHMudmFsaWRhdGlvbiA/ICdjbGVhcicgOiAnY2hlY2snfVxuICAgICAgPC9zcGFuPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldEZlZWRiYWNrRGVzY3JpcHRpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZGF0ZWQoKSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxzcGFuIGlkPXt0aGlzLnByb3BzLmZvciArICdfc3RhdHVzJ30gY2xhc3NOYW1lPVwic3Itb25seVwiPlxuICAgICAgICB7dGhpcy5wcm9wcy52YWxpZGF0aW9uID8gZ2V0dGV4dCgnKGVycm9yKScpIDogZ2V0dGV4dCgnKHN1Y2Nlc3MpJyl9XG4gICAgICA8L3NwYW4+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0SGVscFRleHQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuaGVscFRleHQpIHtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgIHJldHVybiA8cCBjbGFzc05hbWU9XCJoZWxwLWJsb2NrXCI+e3RoaXMucHJvcHMuaGVscFRleHR9PC9wPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmdldENsYXNzTmFtZSgpfT5cbiAgICAgIDxsYWJlbCBjbGFzc05hbWU9eydjb250cm9sLWxhYmVsICcgKyAodGhpcy5wcm9wcy5sYWJlbENsYXNzIHx8ICcnKX1cbiAgICAgICAgICAgICBodG1sRm9yPXt0aGlzLnByb3BzLmZvciB8fCAnJ30+XG4gICAgICAgIHt0aGlzLnByb3BzLmxhYmVsfTpcbiAgICAgIDwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jb250cm9sQ2xhc3MgfHwgJyd9PlxuICAgICAgICB7dGhpcy5wcm9wcy5jaGlsZHJlbn1cbiAgICAgICAge3RoaXMuZ2V0RmVlZGJhY2tJY29uKCl9XG4gICAgICAgIHt0aGlzLmdldEZlZWRiYWNrRGVzY3JpcHRpb24oKX1cbiAgICAgICAge3RoaXMuZ2V0RmVlZGJhY2soKX1cbiAgICAgICAge3RoaXMuZ2V0SGVscFRleHQoKX1cbiAgICAgICAge3RoaXMucHJvcHMuZXh0cmEgfHwgbnVsbH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZXF1aXJlZCB9IGZyb20gJ21pc2Fnby91dGlscy92YWxpZGF0b3JzJztcblxubGV0IHZhbGlkYXRlUmVxdWlyZWQgPSByZXF1aXJlZCgpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHZhbGlkYXRlKCkge1xuICAgIGxldCBlcnJvcnMgPSB7fTtcblxuICAgIGxldCB2YWxpZGF0b3JzID0ge1xuICAgICAgcmVxdWlyZWQ6IHRoaXMuc3RhdGUudmFsaWRhdG9ycy5yZXF1aXJlZCB8fCB0aGlzLnN0YXRlLnZhbGlkYXRvcnMsXG4gICAgICBvcHRpb25hbDogdGhpcy5zdGF0ZS52YWxpZGF0b3JzLm9wdGlvbmFsIHx8IHt9XG4gICAgfTtcblxuICAgIGxldCB2YWxpZGF0ZWRGaWVsZHMgPSBbXTtcblxuICAgIC8vIGFkZCByZXF1aXJlZCBmaWVsZHMgdG8gdmFsaWRhdGlvblxuICAgIGZvciAobGV0IG5hbWUgaW4gdmFsaWRhdG9ycy5yZXF1aXJlZCkge1xuICAgICAgaWYgKHZhbGlkYXRvcnMucmVxdWlyZWQuaGFzT3duUHJvcGVydHkobmFtZSkgJiZcbiAgICAgICAgICB2YWxpZGF0b3JzLnJlcXVpcmVkW25hbWVdKSB7XG4gICAgICAgIHZhbGlkYXRlZEZpZWxkcy5wdXNoKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFkZCBvcHRpb25hbCBmaWVsZHMgdG8gdmFsaWRhdGlvblxuICAgIGZvciAobGV0IG5hbWUgaW4gdmFsaWRhdG9ycy5vcHRpb25hbCkge1xuICAgICAgaWYgKHZhbGlkYXRvcnMub3B0aW9uYWwuaGFzT3duUHJvcGVydHkobmFtZSkgJiZcbiAgICAgICAgICB2YWxpZGF0b3JzLm9wdGlvbmFsW25hbWVdKSB7XG4gICAgICAgIHZhbGlkYXRlZEZpZWxkcy5wdXNoKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIGZpZWxkcyB2YWx1ZXNcbiAgICBmb3IgKGxldCBpIGluIHZhbGlkYXRlZEZpZWxkcykge1xuICAgICAgbGV0IG5hbWUgPSB2YWxpZGF0ZWRGaWVsZHNbaV07XG4gICAgICBsZXQgZmllbGRFcnJvcnMgPSB0aGlzLnZhbGlkYXRlRmllbGQobmFtZSwgdGhpcy5zdGF0ZVtuYW1lXSk7XG5cbiAgICAgIGlmIChmaWVsZEVycm9ycyA9PT0gbnVsbCkge1xuICAgICAgICBlcnJvcnNbbmFtZV0gPSBudWxsO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZEVycm9ycykge1xuICAgICAgICBlcnJvcnNbbmFtZV0gPSBmaWVsZEVycm9ycztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgaXNWYWxpZCgpIHtcbiAgICBsZXQgZXJyb3JzID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGZvciAobGV0IGZpZWxkIGluIGVycm9ycykge1xuICAgICAgaWYgKGVycm9ycy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIHtcbiAgICAgICAgaWYgKGVycm9yc1tmaWVsZF0gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhbGlkYXRlRmllbGQobmFtZSwgdmFsdWUpIHtcbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBsZXQgdmFsaWRhdG9ycyA9IHtcbiAgICAgIHJlcXVpcmVkOiAodGhpcy5zdGF0ZS52YWxpZGF0b3JzLnJlcXVpcmVkIHx8IHRoaXMuc3RhdGUudmFsaWRhdG9ycylbbmFtZV0sXG4gICAgICBvcHRpb25hbDogKHRoaXMuc3RhdGUudmFsaWRhdG9ycy5vcHRpb25hbCB8fCB7fSlbbmFtZV1cbiAgICB9O1xuXG4gICAgbGV0IHJlcXVpcmVkRXJyb3IgPSB2YWxpZGF0ZVJlcXVpcmVkKHZhbHVlKSB8fCBmYWxzZTtcblxuICAgIGlmICh2YWxpZGF0b3JzLnJlcXVpcmVkKSB7XG4gICAgICBpZiAocmVxdWlyZWRFcnJvcikge1xuICAgICAgICBlcnJvcnMgPSBbcmVxdWlyZWRFcnJvcl07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpIGluIHZhbGlkYXRvcnMucmVxdWlyZWQpIHtcbiAgICAgICAgICBsZXQgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdG9ycy5yZXF1aXJlZFtpXSh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2godmFsaWRhdGlvbkVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyBlcnJvcnMgOiBudWxsO1xuICAgIH0gZWxzZSBpZiAocmVxdWlyZWRFcnJvciA9PT0gZmFsc2UgJiYgdmFsaWRhdG9ycy5vcHRpb25hbCkge1xuICAgICAgZm9yIChsZXQgaSBpbiB2YWxpZGF0b3JzLm9wdGlvbmFsKSB7XG4gICAgICAgIGxldCB2YWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0b3JzLm9wdGlvbmFsW2ldKHZhbHVlKTtcbiAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgIGVycm9ycy5wdXNoKHZhbGlkYXRpb25FcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyBlcnJvcnMgOiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTsgLy8gZmFsc2UgPT09IGZpZWxkIHdhc24ndCB2YWxpZGF0ZWRcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgYmluZElucHV0ID0gKG5hbWUpID0+IHtcbiAgICByZXR1cm4gKGV2ZW50KSA9PiB7XG4gICAgICBsZXQgbmV3U3RhdGUgPSB7fTtcbiAgICAgIG5ld1N0YXRlW25hbWVdID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgICBsZXQgZm9ybUVycm9ycyA9IHRoaXMuc3RhdGUuZXJyb3JzIHx8IHt9O1xuICAgICAgZm9ybUVycm9yc1tuYW1lXSA9IHRoaXMudmFsaWRhdGVGaWVsZChuYW1lLCBuZXdTdGF0ZVtuYW1lXSk7XG4gICAgICBuZXdTdGF0ZS5lcnJvcnMgPSBmb3JtRXJyb3JzO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgY2xlYW4oKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcyhzdWNjZXNzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaGFuZGxlRXJyb3IocmVqZWN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaGFuZGxlU3VibWl0ID0gKGV2ZW50KSA9PiB7XG4gICAgLy8gd2UgZG9uJ3QgcmVsb2FkIHBhZ2Ugb24gc3VibWlzc2lvbnNcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgaWYgKHRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2xlYW4oKSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7J2lzTG9hZGluZyc6IHRydWV9KTtcbiAgICAgIGxldCBwcm9taXNlID0gdGhpcy5zZW5kKCk7XG5cbiAgICAgIGlmIChwcm9taXNlKSB7XG4gICAgICAgIHByb21pc2UudGhlbigoc3VjY2VzcykgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeydpc0xvYWRpbmcnOiBmYWxzZX0pO1xuICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2VzcyhzdWNjZXNzKTtcbiAgICAgICAgfSwgKHJlamVjdGlvbikgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeydpc0xvYWRpbmcnOiBmYWxzZX0pO1xuICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IocmVqZWN0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsnaXNMb2FkaW5nJzogZmFsc2V9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImxvYWRlclwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJsb2FkZXItc3Bpbm5pbmctd2hlZWxcIj48L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBMb2FkZXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvbG9hZGVyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5IG1vZGFsLWxvYWRlclwiPlxuICAgICAgPExvYWRlciAvPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgenhjdmJuIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy96eGN2Ym4nO1xuXG5leHBvcnQgY29uc3QgU1RZTEVTID0gW1xuICAncHJvZ3Jlc3MtYmFyLWRhbmdlcicsXG4gICdwcm9ncmVzcy1iYXItd2FybmluZycsXG4gICdwcm9ncmVzcy1iYXItd2FybmluZycsXG4gICdwcm9ncmVzcy1iYXItcHJpbWFyeScsXG4gICdwcm9ncmVzcy1iYXItc3VjY2Vzcydcbl07XG5cbmV4cG9ydCBjb25zdCBMQUJFTFMgPSBbXG4gIGdldHRleHQoXCJFbnRlcmVkIHBhc3N3b3JkIGlzIHZlcnkgd2Vhay5cIiksXG4gIGdldHRleHQoXCJFbnRlcmVkIHBhc3N3b3JkIGlzIHdlYWsuXCIpLFxuICBnZXR0ZXh0KFwiRW50ZXJlZCBwYXNzd29yZCBpcyBhdmVyYWdlLlwiKSxcbiAgZ2V0dGV4dChcIkVudGVyZWQgcGFzc3dvcmQgaXMgc3Ryb25nLlwiKSxcbiAgZ2V0dGV4dChcIkVudGVyZWQgcGFzc3dvcmQgaXMgdmVyeSBzdHJvbmcuXCIpXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5fc2NvcmUgPSAwO1xuICAgIHRoaXMuX3Bhc3N3b3JkID0gbnVsbDtcbiAgICB0aGlzLl9pbnB1dHMgPSBbXTtcbiAgfVxuXG4gIGdldFNjb3JlKHBhc3N3b3JkLCBpbnB1dHMpIHtcbiAgICBsZXQgY2FjaGVTdGFsZSA9IGZhbHNlO1xuXG4gICAgaWYgKHBhc3N3b3JkLnRyaW0oKSAhPT0gdGhpcy5fcGFzc3dvcmQpIHtcbiAgICAgIGNhY2hlU3RhbGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpbnB1dHMubGVuZ3RoICE9PSB0aGlzLl9pbnB1dHMubGVuZ3RoKSB7XG4gICAgICBjYWNoZVN0YWxlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXRzLm1hcCgodmFsdWUsIGkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLnRyaW0oKSAhPT0gdGhpcy5faW5wdXRzW2ldKSB7XG4gICAgICAgICAgY2FjaGVTdGFsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjYWNoZVN0YWxlKSB7XG4gICAgICB0aGlzLl9zY29yZSA9IHp4Y3Zibi5zY29yZVBhc3N3b3JkKHBhc3N3b3JkLCBpbnB1dHMpO1xuICAgICAgdGhpcy5fcGFzc3dvcmQgPSBwYXNzd29yZC50cmltKCk7XG4gICAgICB0aGlzLl9pbnB1dHMgPSBpbnB1dHMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50cmltKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2NvcmU7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGxldCBzY29yZSA9IHRoaXMuZ2V0U2NvcmUodGhpcy5wcm9wcy5wYXNzd29yZCwgdGhpcy5wcm9wcy5pbnB1dHMpO1xuXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiaGVscC1ibG9jayBwYXNzd29yZC1zdHJlbmd0aFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwcm9ncmVzc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17XCJwcm9ncmVzcy1iYXIgXCIgKyBTVFlMRVNbc2NvcmVdfVxuICAgICAgICAgICAgIHN0eWxlPXt7d2lkdGg6ICgyMCArICgyMCAqIHNjb3JlKSkgKyAnJSd9fVxuICAgICAgICAgICAgIHJvbGU9XCJwcm9ncmVzcy1iYXJcIlxuICAgICAgICAgICAgIGFyaWEtdmFsdWVub3c9e3Njb3JlfVxuICAgICAgICAgICAgIGFyaWEtdmFsdWVtaW49XCIwXCJcbiAgICAgICAgICAgICBhcmlhLXZhbHVlbWF4PVwiNFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNyLW9ubHlcIj5cbiAgICAgICAgICAgIHtMQUJFTFNbc2NvcmVdfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc21hbGxcIj5cbiAgICAgICAge0xBQkVMU1tzY29yZV19XG4gICAgICA8L3A+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExvYWRlciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9sb2FkZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBSZWdpc3Rlck1vZGFsIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3JlZ2lzdGVyLmpzJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgY2FwdGNoYSBmcm9tICdtaXNhZ28vc2VydmljZXMvY2FwdGNoYSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1vZGFsIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9tb2RhbCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHp4Y3ZibiBmcm9tICdtaXNhZ28vc2VydmljZXMvenhjdmJuJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlLFxuICAgICAgJ2lzTG9hZGVkJzogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBzaG93UmVnaXN0ZXJNb2RhbCA9ICgpID0+IHtcbiAgICBpZiAobWlzYWdvLmdldCgnU0VUVElOR1MnKS5hY2NvdW50X2FjdGl2YXRpb24gPT09ICdjbG9zZWQnKSB7XG4gICAgICBzbmFja2Jhci5pbmZvKGdldHRleHQoXCJOZXcgcmVnaXN0cmF0aW9ucyBhcmUgY3VycmVudGx5IGRpc2FibGVkLlwiKSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmlzTG9hZGVkKSB7XG4gICAgICBtb2RhbC5zaG93KFJlZ2lzdGVyTW9kYWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgJ2lzTG9hZGluZyc6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgIGNhcHRjaGEubG9hZCgpLFxuICAgICAgICB6eGN2Ym4ubG9hZCgpXG4gICAgICBdKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmlzTG9hZGVkKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAnaXNMb2FkaW5nJzogZmFsc2UsXG4gICAgICAgICAgICAnaXNMb2FkZWQnOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbW9kYWwuc2hvdyhSZWdpc3Rlck1vZGFsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICBnZXRDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2xhc3NOYW1lICsgKHRoaXMuc3RhdGUuaXNMb2FkaW5nID8gJyBidG4tbG9hZGluZycgOiAnJyk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXt0aGlzLnNob3dSZWdpc3Rlck1vZGFsfVxuICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17J2J0biAnICsgdGhpcy5nZXRDbGFzc05hbWUoKX1cbiAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRlZH0+XG4gICAgICB7Z2V0dGV4dChcIlJlZ2lzdGVyXCIpfVxuICAgICAge3RoaXMuc3RhdGUuaXNMb2FkaW5nID8gPExvYWRlciAvPiA6IG51bGwgfVxuICAgIDwvYnV0dG9uPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0nO1xuaW1wb3J0IEZvcm1Hcm91cCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtLWdyb3VwJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgUGFzc3dvcmRTdHJlbmd0aCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9wYXNzd29yZC1zdHJlbmd0aCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IGF1dGggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2F1dGgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBjYXB0Y2hhIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9jYXB0Y2hhJztcbmltcG9ydCBtb2RhbCBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9kYWwnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgc2hvd0Jhbm5lZFBhZ2UgZnJvbSAnbWlzYWdvL3V0aWxzL2Jhbm5lZC1wYWdlJztcbmltcG9ydCAqIGFzIHZhbGlkYXRvcnMgZnJvbSAnbWlzYWdvL3V0aWxzL3ZhbGlkYXRvcnMnO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0ZXJGb3JtIGV4dGVuZHMgRm9ybSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcblxuICAgICAgJ3VzZXJuYW1lJzogJycsXG4gICAgICAnZW1haWwnOiAnJyxcbiAgICAgICdwYXNzd29yZCc6ICcnLFxuICAgICAgJ2NhcHRjaGEnOiAnJyxcblxuICAgICAgJ3ZhbGlkYXRvcnMnOiB7XG4gICAgICAgICd1c2VybmFtZSc6IFtcbiAgICAgICAgICB2YWxpZGF0b3JzLnVzZXJuYW1lQ29udGVudCgpLFxuICAgICAgICAgIHZhbGlkYXRvcnMudXNlcm5hbWVNaW5MZW5ndGgobWlzYWdvLmdldCgnU0VUVElOR1MnKSksXG4gICAgICAgICAgdmFsaWRhdG9ycy51c2VybmFtZU1heExlbmd0aChtaXNhZ28uZ2V0KCdTRVRUSU5HUycpKVxuICAgICAgICBdLFxuICAgICAgICAnZW1haWwnOiBbXG4gICAgICAgICAgdmFsaWRhdG9ycy5lbWFpbCgpXG4gICAgICAgIF0sXG4gICAgICAgICdwYXNzd29yZCc6IFtcbiAgICAgICAgICB2YWxpZGF0b3JzLnBhc3N3b3JkTWluTGVuZ3RoKG1pc2Fnby5nZXQoJ1NFVFRJTkdTJykpXG4gICAgICAgIF0sXG4gICAgICAgICdjYXB0Y2hhJzogY2FwdGNoYS52YWxpZGF0b3IoKVxuICAgICAgfSxcblxuICAgICAgJ2Vycm9ycyc6IHt9XG4gICAgfTtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKGdldHRleHQoXCJGb3JtIGNvbnRhaW5zIGVycm9ycy5cIikpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICdlcnJvcnMnOiB0aGlzLnZhbGlkYXRlKClcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdChtaXNhZ28uZ2V0KCdVU0VSU19BUEknKSwge1xuICAgICAgJ3VzZXJuYW1lJzogdGhpcy5zdGF0ZS51c2VybmFtZSxcbiAgICAgICdlbWFpbCc6IHRoaXMuc3RhdGUuZW1haWwsXG4gICAgICAncGFzc3dvcmQnOiB0aGlzLnN0YXRlLnBhc3N3b3JkLFxuICAgICAgJ2NhcHRjaGEnOiB0aGlzLnN0YXRlLmNhcHRjaGFcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVN1Y2Nlc3MoYXBpUmVzcG9uc2UpIHtcbiAgICB0aGlzLnByb3BzLmNhbGxiYWNrKGFwaVJlc3BvbnNlKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDApIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAnZXJyb3JzJzogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5lcnJvcnMsIHJlamVjdGlvbilcbiAgICAgIH0pO1xuICAgICAgc25hY2tiYXIuZXJyb3IoZ2V0dGV4dChcIkZvcm0gY29udGFpbnMgZXJyb3JzLlwiKSk7XG4gICAgfSBlbHNlIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDMgJiYgcmVqZWN0aW9uLmJhbikge1xuICAgICAgc2hvd0Jhbm5lZFBhZ2UocmVqZWN0aW9uLmJhbik7XG4gICAgICBtb2RhbC5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgZ2V0TGVnYWxGb290Tm90ZSgpIHtcbiAgICBpZiAobWlzYWdvLmdldCgnVEVSTVNfT0ZfU0VSVklDRV9VUkwnKSkge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxhIGhyZWY9e21pc2Fnby5nZXQoJ1RFUk1TX09GX1NFUlZJQ0VfVVJMJyl9XG4gICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICAgIHtnZXR0ZXh0KFwiQnkgcmVnaXN0ZXJpbmcgeW91IGFncmVlIHRvIHNpdGUncyB0ZXJtcyBhbmQgY29uZGl0aW9ucy5cIil9XG4gICAgICA8L2E+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1kaWFsb2cgbW9kYWwtcmVnaXN0ZXJcIiByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17Z2V0dGV4dChcIkNsb3NlXCIpfT5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGg0IGNsYXNzTmFtZT1cIm1vZGFsLXRpdGxlXCI+e2dldHRleHQoXCJSZWdpc3RlclwiKX08L2g0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fSBjbGFzc05hbWU9XCJmb3JtLWhvcml6b250YWxcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInR5cGVcIiBzdHlsZT17e2Rpc3BsYXk6ICdub25lJ319IC8+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIHN0eWxlPXt7ZGlzcGxheTogJ25vbmUnfX0gLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWJvZHlcIj5cblxuICAgICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIlVzZXJuYW1lXCIpfSBmb3I9XCJpZF91c2VybmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9XCJjb2wtc20tNFwiIGNvbnRyb2xDbGFzcz1cImNvbC1zbS04XCJcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbj17dGhpcy5zdGF0ZS5lcnJvcnMudXNlcm5hbWV9PlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlkX3VzZXJuYW1lXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJpZF91c2VybmFtZV9zdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCd1c2VybmFtZScpfVxuICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUudXNlcm5hbWV9IC8+XG4gICAgICAgICAgICA8L0Zvcm1Hcm91cD5cblxuICAgICAgICAgICAgPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIkUtbWFpbFwiKX0gZm9yPVwiaWRfZW1haWxcIlxuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiXG4gICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb249e3RoaXMuc3RhdGUuZXJyb3JzLmVtYWlsfT5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJpZF9lbWFpbFwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaWRfZW1haWxfc3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnZW1haWwnKX1cbiAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmVtYWlsfSAvPlxuICAgICAgICAgICAgPC9Gb3JtR3JvdXA+XG5cbiAgICAgICAgICAgIDxGb3JtR3JvdXAgbGFiZWw9e2dldHRleHQoXCJQYXNzd29yZFwiKX0gZm9yPVwiaWRfcGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPVwiY29sLXNtLTRcIiBjb250cm9sQ2xhc3M9XCJjb2wtc20tOFwiXG4gICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb249e3RoaXMuc3RhdGUuZXJyb3JzLnBhc3N3b3JkfVxuICAgICAgICAgICAgICAgICAgICAgICBleHRyYT17PFBhc3N3b3JkU3RyZW5ndGggcGFzc3dvcmQ9e3RoaXMuc3RhdGUucGFzc3dvcmR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM9e1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS51c2VybmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5lbWFpbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXX0gLz59ID5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiaWRfcGFzc3dvcmRcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImlkX3Bhc3N3b3JkX3N0YXR1c1wiXG4gICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3Bhc3N3b3JkJyl9XG4gICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5wYXNzd29yZH0gLz5cbiAgICAgICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgICAgICB7Y2FwdGNoYS5jb21wb25lbnQoe1xuICAgICAgICAgICAgICBmb3JtOiB0aGlzLFxuICAgICAgICAgICAgICBsYWJlbENsYXNzOiBcImNvbC1zbS00XCIsXG4gICAgICAgICAgICAgIGNvbnRyb2xDbGFzczogXCJjb2wtc20tOFwiXG4gICAgICAgICAgICB9KX1cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgICB7dGhpcy5nZXRMZWdhbEZvb3ROb3RlKCl9XG4gICAgICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5XCIgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9PlxuICAgICAgICAgICAgICB7Z2V0dGV4dChcIlJlZ2lzdGVyIGFjY291bnRcIil9XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZ2lzdGVyQ29tcGxldGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRMZWFkKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmFjdGl2YXRpb24gPT09ICd1c2VyJykge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCIlKHVzZXJuYW1lKXMsIHlvdXIgYWNjb3VudCBoYXMgYmVlbiBjcmVhdGVkIGJ1dCB5b3UgbmVlZCB0byBhY3RpdmF0ZSBpdCBiZWZvcmUgeW91IHdpbGwgYmUgYWJsZSB0byBzaWduIGluLlwiKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuYWN0aXZhdGlvbiA9PT0gJ2FkbWluJykge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCIlKHVzZXJuYW1lKXMsIHlvdXIgYWNjb3VudCBoYXMgYmVlbiBjcmVhdGVkIGJ1dCBib2FyZCBhZG1pbmlzdHJhdG9yIHdpbGwgaGF2ZSB0byBhY3RpdmF0ZSBpdCBiZWZvcmUgeW91IHdpbGwgYmUgYWJsZSB0byBzaWduIGluLlwiKTtcbiAgICB9XG4gIH1cblxuICBnZXRTdWJzY3JpcHQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuYWN0aXZhdGlvbiA9PT0gJ3VzZXInKSB7XG4gICAgICByZXR1cm4gZ2V0dGV4dChcIldlIGhhdmUgc2VudCBhbiBlLW1haWwgdG8gJShlbWFpbClzIHdpdGggbGluayB0aGF0IHlvdSBoYXZlIHRvIGNsaWNrIHRvIGFjdGl2YXRlIHlvdXIgYWNjb3VudC5cIik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLmFjdGl2YXRpb24gPT09ICdhZG1pbicpIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiV2Ugd2lsbCBzZW5kIGFuIGUtbWFpbCB0byAlKGVtYWlsKXMgd2hlbiB0aGlzIHRha2VzIHBsYWNlLlwiKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWRpYWxvZyBtb2RhbC1tZXNzYWdlIG1vZGFsLXJlZ2lzdGVyXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17Z2V0dGV4dChcIkNsb3NlXCIpfT5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGg0IGNsYXNzTmFtZT1cIm1vZGFsLXRpdGxlXCI+e2dldHRleHQoXCJSZWdpc3RyYXRpb24gY29tcGxldGVcIil9PC9oND5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtYm9keVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICAgIGluZm9fb3V0bGluZVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1ib2R5XCI+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJsZWFkXCI+XG4gICAgICAgICAgICAgIHtpbnRlcnBvbGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmdldExlYWQoKSxcbiAgICAgICAgICAgICAgICB7J3VzZXJuYW1lJzogdGhpcy5wcm9wcy51c2VybmFtZX0sIHRydWUpfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIHtpbnRlcnBvbGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmdldFN1YnNjcmlwdCgpLFxuICAgICAgICAgICAgICAgIHsnZW1haWwnOiB0aGlzLnByb3BzLmVtYWlsfSwgdHJ1ZSl9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAnY29tcGxldGUnOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGNvbXBsZXRlUmVnaXN0cmF0aW9uID0gKGFwaVJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKGFwaVJlc3BvbnNlLmFjdGl2YXRpb24gPT09ICdhY3RpdmUnKSB7XG4gICAgICBtb2RhbC5oaWRlKCk7XG4gICAgICBhdXRoLnNpZ25JbihhcGlSZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAnY29tcGxldGUnOiBhcGlSZXNwb25zZVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgaWYgKHRoaXMuc3RhdGUuY29tcGxldGUpIHtcbiAgICAgIHJldHVybiA8UmVnaXN0ZXJDb21wbGV0ZSBhY3RpdmF0aW9uPXt0aGlzLnN0YXRlLmNvbXBsZXRlLmFjdGl2YXRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU9e3RoaXMuc3RhdGUuY29tcGxldGUudXNlcm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw9e3RoaXMuc3RhdGUuY29tcGxldGUuZW1haWx9IC8+O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gPFJlZ2lzdGVyRm9ybSBjYWxsYmFjaz17dGhpcy5jb21wbGV0ZVJlZ2lzdHJhdGlvbn0vPjtcbiAgICB9XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2J1dHRvbic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvZm9ybSc7XG5pbXBvcnQgYWpheCBmcm9tICdtaXNhZ28vc2VydmljZXMvYWpheCc7XG5pbXBvcnQgc25hY2tiYXIgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3NuYWNrYmFyJztcbmltcG9ydCAqIGFzIHZhbGlkYXRvcnMgZnJvbSAnbWlzYWdvL3V0aWxzL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHNob3dCYW5uZWRQYWdlIGZyb20gJ21pc2Fnby91dGlscy9iYW5uZWQtcGFnZSc7XG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0TGlua0Zvcm0gZXh0ZW5kcyBGb3JtIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlLFxuXG4gICAgICAnZW1haWwnOiAnJyxcblxuICAgICAgJ3ZhbGlkYXRvcnMnOiB7XG4gICAgICAgICdlbWFpbCc6IFtcbiAgICAgICAgICB2YWxpZGF0b3JzLmVtYWlsKClcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjbGVhbigpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2Jhci5lcnJvcihnZXR0ZXh0KFwiRW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLlwiKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc2VuZCgpIHtcbiAgICByZXR1cm4gYWpheC5wb3N0KG1pc2Fnby5nZXQoJ1NFTkRfQUNUSVZBVElPTl9BUEknKSwge1xuICAgICAgJ2VtYWlsJzogdGhpcy5zdGF0ZS5lbWFpbFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcyhhcGlSZXNwb25zZSkge1xuICAgIHRoaXMucHJvcHMuY2FsbGJhY2soYXBpUmVzcG9uc2UpO1xuICB9XG5cbiAgaGFuZGxlRXJyb3IocmVqZWN0aW9uKSB7XG4gICAgaWYgKFsnYWxyZWFkeV9hY3RpdmUnLCAnaW5hY3RpdmVfYWRtaW4nXS5pbmRleE9mKHJlamVjdGlvbi5jb2RlKSA+IC0xKSB7XG4gICAgICBzbmFja2Jhci5pbmZvKHJlamVjdGlvbi5kZXRhaWwpO1xuICAgIH0gZWxzZSBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAzICYmIHJlamVjdGlvbi5iYW4pIHtcbiAgICAgIHNob3dCYW5uZWRQYWdlKHJlamVjdGlvbi5iYW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwid2VsbCB3ZWxsLWZvcm0gd2VsbC1mb3JtLXJlcXVlc3QtYWN0aXZhdGlvbi1saW5rXCI+XG4gICAgICA8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRyb2wtaW5wdXRcIj5cblxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Z2V0dGV4dChcIllvdXIgZS1tYWlsIGFkZHJlc3NcIil9XG4gICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgnZW1haWwnKX1cbiAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5lbWFpbH0gLz5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8QnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgbG9hZGluZz17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9PlxuICAgICAgICAgIHtnZXR0ZXh0KFwiU2VuZCBsaW5rXCIpfVxuICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaW5rU2VudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldE1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCJBY3RpdmF0aW9uIGxpbmsgd2FzIHNlbnQgdG8gJShlbWFpbClzXCIpLCB7XG4gICAgICBlbWFpbDogdGhpcy5wcm9wcy51c2VyLmVtYWlsXG4gICAgfSwgdHJ1ZSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIndlbGwgd2VsbC1mb3JtIHdlbGwtZm9ybS1yZXF1ZXN0LWFjdGl2YXRpb24tbGluayB3ZWxsLWRvbmVcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZG9uZS1tZXNzYWdlXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPlxuICAgICAgICAgICAgY2hlY2tcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtYm9keVwiPlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAge3RoaXMuZ2V0TWVzc2FnZSgpfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0biBidG4tcHJpbWFyeSBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuY2FsbGJhY2t9PlxuICAgICAgICAgIHtnZXR0ZXh0KFwiUmVxdWVzdCBhbm90aGVyIGxpbmtcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBjb21wbGV0ZTogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICBjb21wbGV0ZSA9IChhcGlSZXNwb25zZSkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgY29tcGxldGU6IGFwaVJlc3BvbnNlXG4gICAgfSk7XG4gIH07XG5cbiAgcmVzZXQgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBjb21wbGV0ZTogZmFsc2VcbiAgICB9KTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGlmICh0aGlzLnN0YXRlLmNvbXBsZXRlKSB7XG4gICAgICByZXR1cm4gPExpbmtTZW50IHVzZXI9e3RoaXMuc3RhdGUuY29tcGxldGV9IGNhbGxiYWNrPXt0aGlzLnJlc2V0fSAvPjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDxSZXF1ZXN0TGlua0Zvcm0gY2FsbGJhY2s9e3RoaXMuY29tcGxldGV9IC8+O1xuICAgIH07XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0nO1xuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgKiBhcyB2YWxpZGF0b3JzIGZyb20gJ21pc2Fnby91dGlscy92YWxpZGF0b3JzJztcbmltcG9ydCBzaG93QmFubmVkUGFnZSBmcm9tICdtaXNhZ28vdXRpbHMvYmFubmVkLXBhZ2UnO1xuXG5leHBvcnQgY2xhc3MgUmVxdWVzdFJlc2V0Rm9ybSBleHRlbmRzIEZvcm0ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAnaXNMb2FkaW5nJzogZmFsc2UsXG5cbiAgICAgICdlbWFpbCc6ICcnLFxuXG4gICAgICAndmFsaWRhdG9ycyc6IHtcbiAgICAgICAgJ2VtYWlsJzogW1xuICAgICAgICAgIHZhbGlkYXRvcnMuZW1haWwoKVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmVycm9yKGdldHRleHQoXCJFbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuXCIpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZW5kKCkge1xuICAgIHJldHVybiBhamF4LnBvc3QobWlzYWdvLmdldCgnU0VORF9QQVNTV09SRF9SRVNFVF9BUEknKSwge1xuICAgICAgJ2VtYWlsJzogdGhpcy5zdGF0ZS5lbWFpbFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcyhhcGlSZXNwb25zZSkge1xuICAgIHRoaXMucHJvcHMuY2FsbGJhY2soYXBpUmVzcG9uc2UpO1xuICB9XG5cbiAgaGFuZGxlRXJyb3IocmVqZWN0aW9uKSB7XG4gICAgaWYgKFsnaW5hY3RpdmVfdXNlcicsICdpbmFjdGl2ZV9hZG1pbiddLmluZGV4T2YocmVqZWN0aW9uLmNvZGUpID4gLTEpIHtcbiAgICAgIHRoaXMucHJvcHMuc2hvd0luYWN0aXZlUGFnZShyZWplY3Rpb24pO1xuICAgIH0gZWxzZSBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDAzICYmIHJlamVjdGlvbi5iYW4pIHtcbiAgICAgIHNob3dCYW5uZWRQYWdlKHJlamVjdGlvbi5iYW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2Jhci5hcGlFcnJvcihyZWplY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwid2VsbCB3ZWxsLWZvcm0gd2VsbC1mb3JtLXJlcXVlc3QtcGFzc3dvcmQtcmVzZXRcIj5cbiAgICAgIDxmb3JtIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udHJvbC1pbnB1dFwiPlxuXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtnZXR0ZXh0KFwiWW91ciBlLW1haWwgYWRkcmVzc1wiKX1cbiAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuYmluZElucHV0KCdlbWFpbCcpfVxuICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmVtYWlsfSAvPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1hcnkgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ30+XG4gICAgICAgICAge2dldHRleHQoXCJTZW5kIGxpbmtcIil9XG4gICAgICAgIDwvQnV0dG9uPlxuXG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpbmtTZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgZ2V0TWVzc2FnZSgpIHtcbiAgICByZXR1cm4gaW50ZXJwb2xhdGUoZ2V0dGV4dChcIlJlc2V0IHBhc3N3b3JkIGxpbmsgd2FzIHNlbnQgdG8gJShlbWFpbClzXCIpLCB7XG4gICAgICBlbWFpbDogdGhpcy5wcm9wcy51c2VyLmVtYWlsXG4gICAgfSwgdHJ1ZSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIndlbGwgd2VsbC1mb3JtIHdlbGwtZm9ybS1yZXF1ZXN0LXBhc3N3b3JkLXJlc2V0IHdlbGwtZG9uZVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJkb25lLW1lc3NhZ2VcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWljb25cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICBjaGVja1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1ib2R5XCI+XG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICB7dGhpcy5nZXRNZXNzYWdlKCl9XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy5jYWxsYmFja30+XG4gICAgICAgICAge2dldHRleHQoXCJSZXF1ZXN0IGFub3RoZXIgbGlua1wiKX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWNjb3VudEluYWN0aXZlUGFnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldEFjdGl2YXRlQnV0dG9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmFjdGl2YXRpb24gPT09ICdpbmFjdGl2ZV91c2VyJykge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxwPlxuICAgICAgICA8YSBocmVmPXttaXNhZ28uZ2V0KCdSRVFVRVNUX0FDVElWQVRJT05fVVJMJyl9PlxuICAgICAgICAgIHtnZXR0ZXh0KFwiQWN0aXZhdGUgeW91ciBhY2NvdW50LlwiKX1cbiAgICAgICAgPC9hPlxuICAgICAgPC9wPjtcbiAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwicGFnZSBwYWdlLW1lc3NhZ2UgcGFnZS1tZXNzYWdlLWluZm8gcGFnZS1mb3Jnb3R0ZW4tcGFzc3dvcmQtaW5hY3RpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1wYW5lbFwiPlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWljb25cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1hdGVyaWFsLWljb25cIj5cbiAgICAgICAgICAgICAgaW5mb19vdXRsaW5lXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtYm9keVwiPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibGVhZFwiPlxuICAgICAgICAgICAgICB7Z2V0dGV4dChcIllvdXIgYWNjb3VudCBpcyBpbmFjdGl2ZS5cIil9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAge3RoaXMucHJvcHMubWVzc2FnZX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIHt0aGlzLmdldEFjdGl2YXRlQnV0dG9uKCl9XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNvbXBsZXRlOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGNvbXBsZXRlID0gKGFwaVJlc3BvbnNlKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBjb21wbGV0ZTogYXBpUmVzcG9uc2VcbiAgICB9KTtcbiAgfTtcblxuICByZXNldCA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGNvbXBsZXRlOiBmYWxzZVxuICAgIH0pO1xuICB9O1xuXG4gIHNob3dJbmFjdGl2ZVBhZ2UoYXBpUmVzcG9uc2UpIHtcbiAgICBSZWFjdERPTS5yZW5kZXIoXG4gICAgICA8QWNjb3VudEluYWN0aXZlUGFnZSBhY3RpdmF0aW9uPXthcGlSZXNwb25zZS5jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT17YXBpUmVzcG9uc2UuZGV0YWlsfSAvPixcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWdlLW1vdW50JylcbiAgICApO1xuICB9XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBpZiAodGhpcy5zdGF0ZS5jb21wbGV0ZSkge1xuICAgICAgcmV0dXJuIDxMaW5rU2VudCB1c2VyPXt0aGlzLnN0YXRlLmNvbXBsZXRlfSBjYWxsYmFjaz17dGhpcy5yZXNldH0gLz47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA8UmVxdWVzdFJlc2V0Rm9ybSBjYWxsYmFjaz17dGhpcy5jb21wbGV0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93SW5hY3RpdmVQYWdlPXt0aGlzLnNob3dJbmFjdGl2ZVBhZ2V9IC8+O1xuICAgIH07XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBGb3JtIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL2Zvcm0nO1xuaW1wb3J0IFNpZ25Jbk1vZGFsIGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3NpZ24taW4uanMnO1xuaW1wb3J0IGFqYXggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2FqYXgnO1xuaW1wb3J0IGF1dGggZnJvbSAnbWlzYWdvL3NlcnZpY2VzL2F1dGgnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtb2RhbCBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9kYWwnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgKiBhcyB2YWxpZGF0b3JzIGZyb20gJ21pc2Fnby91dGlscy92YWxpZGF0b3JzJztcbmltcG9ydCBzaG93QmFubmVkUGFnZSBmcm9tICdtaXNhZ28vdXRpbHMvYmFubmVkLXBhZ2UnO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRQYXNzd29yZEZvcm0gZXh0ZW5kcyBGb3JtIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlLFxuXG4gICAgICAncGFzc3dvcmQnOiAnJyxcblxuICAgICAgJ3ZhbGlkYXRvcnMnOiB7XG4gICAgICAgICdwYXNzd29yZCc6IFtcbiAgICAgICAgICB2YWxpZGF0b3JzLnBhc3N3b3JkTWluTGVuZ3RoKG1pc2Fnby5nZXQoJ1NFVFRJTkdTJykpXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuc3RhdGUucGFzc3dvcmQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICBzbmFja2Jhci5lcnJvcih0aGlzLnN0YXRlLmVycm9ycy5wYXNzd29yZFswXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbmFja2Jhci5lcnJvcihnZXR0ZXh0KFwiRW50ZXIgbmV3IHBhc3N3b3JkLlwiKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc2VuZCgpIHtcbiAgICByZXR1cm4gYWpheC5wb3N0KG1pc2Fnby5nZXQoJ0NIQU5HRV9QQVNTV09SRF9BUEknKSwge1xuICAgICAgJ3Bhc3N3b3JkJzogdGhpcy5zdGF0ZS5wYXNzd29yZFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcyhhcGlSZXNwb25zZSkge1xuICAgIHRoaXMucHJvcHMuY2FsbGJhY2soYXBpUmVzcG9uc2UpO1xuICB9XG5cbiAgaGFuZGxlRXJyb3IocmVqZWN0aW9uKSB7XG4gICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMyAmJiByZWplY3Rpb24uYmFuKSB7XG4gICAgICBzaG93QmFubmVkUGFnZShyZWplY3Rpb24uYmFuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc25hY2tiYXIuYXBpRXJyb3IocmVqZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIndlbGwgd2VsbC1mb3JtIHdlbGwtZm9ybS1yZXNldC1wYXNzd29yZFwiPlxuICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250cm9sLWlucHV0XCI+XG5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtnZXR0ZXh0KFwiRW50ZXIgbmV3IHBhc3N3b3JkXCIpfVxuICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmlzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3Bhc3N3b3JkJyl9XG4gICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUucGFzc3dvcmR9IC8+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeSBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgIGxvYWRpbmc9e3RoaXMuc3RhdGUuaXNMb2FkaW5nfT5cbiAgICAgICAgICB7Z2V0dGV4dChcIkNoYW5nZSBwYXNzd29yZFwiKX1cbiAgICAgICAgPC9CdXR0b24+XG5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRDaGFuZ2VkUGFnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGdldE1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIGludGVycG9sYXRlKGdldHRleHQoXCIlKHVzZXJuYW1lKXMsIHlvdXIgcGFzc3dvcmQgaGFzIGJlZW4gY2hhbmdlZCBzdWNjZXNzZnVsbHkuXCIpLCB7XG4gICAgICB1c2VybmFtZTogdGhpcy5wcm9wcy51c2VyLnVzZXJuYW1lXG4gICAgfSwgdHJ1ZSk7XG4gIH1cblxuICBzaG93U2lnbkluKCkge1xuICAgIG1vZGFsLnNob3coU2lnbkluTW9kYWwpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJwYWdlIHBhZ2UtbWVzc2FnZSBwYWdlLW1lc3NhZ2Utc3VjY2VzcyBwYWdlLWZvcmdvdHRlbi1wYXNzd29yZC1jaGFuZ2VkXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtcGFuZWxcIj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1pY29uXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+XG4gICAgICAgICAgICAgIGNoZWNrXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lc3NhZ2UtYm9keVwiPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibGVhZFwiPlxuICAgICAgICAgICAgICB7dGhpcy5nZXRNZXNzYWdlKCl9XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAge2dldHRleHQoXCJZb3Ugd2lsbCBoYXZlIHRvIHNpZ24gaW4gdXNpbmcgbmV3IHBhc3N3b3JkIGJlZm9yZSBjb250aW51aW5nLlwiKX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4gYnRuLXByaW1hcnlcIiBvbkNsaWNrPXt0aGlzLnNob3dTaWduSW59PlxuICAgICAgICAgICAgICAgIHtnZXR0ZXh0KFwiU2lnbiBpblwiKX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgY29tcGxldGUgPSAoYXBpUmVzcG9uc2UpID0+IHtcbiAgICBhdXRoLnNvZnRTaWduT3V0KCk7XG5cbiAgICAvLyBudWtlIFwicmVkaXJlY3RfdG9cIiBmaWVsZCBzbyB3ZSBkb24ndCBlbmRcbiAgICAvLyBjb21pbmcgYmFjayB0byBlcnJvciBwYWdlIGFmdGVyIHNpZ24gaW5cbiAgICAkKCcjaGlkZGVuLWxvZ2luLWZvcm0gaW5wdXRbbmFtZT1cInJlZGlyZWN0X3RvXCJdJykucmVtb3ZlKCk7XG5cbiAgICBSZWFjdERPTS5yZW5kZXIoXG4gICAgICA8UGFzc3dvcmRDaGFuZ2VkUGFnZSB1c2VyPXthcGlSZXNwb25zZX0gLz4sXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZS1tb3VudCcpXG4gICAgKTtcbiAgfTtcbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8UmVzZXRQYXNzd29yZEZvcm0gY2FsbGJhY2s9e3RoaXMuY29tcGxldGV9IC8+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtaXNhZ28gZnJvbSAnbWlzYWdvL2luZGV4JztcbmltcG9ydCBCdXR0b24gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYnV0dG9uJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgRm9ybSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCBhamF4IGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9hamF4JztcbmltcG9ydCBtb2RhbCBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9kYWwnO1xuaW1wb3J0IHNuYWNrYmFyIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zbmFja2Jhcic7XG5pbXBvcnQgc2hvd0Jhbm5lZFBhZ2UgZnJvbSAnbWlzYWdvL3V0aWxzL2Jhbm5lZC1wYWdlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBGb3JtIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgJ2lzTG9hZGluZyc6IGZhbHNlLFxuICAgICAgJ3Nob3dBY3RpdmF0aW9uJzogZmFsc2UsXG5cbiAgICAgICd1c2VybmFtZSc6ICcnLFxuICAgICAgJ3Bhc3N3b3JkJzogJycsXG5cbiAgICAgICd2YWxpZGF0b3JzJzoge1xuICAgICAgICAndXNlcm5hbWUnOiBbXSxcbiAgICAgICAgJ3Bhc3N3b3JkJzogW11cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgY2xlYW4oKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgc25hY2tiYXIuZXJyb3IoZ2V0dGV4dChcIkZpbGwgb3V0IGJvdGggZmllbGRzLlwiKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNlbmQoKSB7XG4gICAgcmV0dXJuIGFqYXgucG9zdChtaXNhZ28uZ2V0KCdBVVRIX0FQSScpLCB7XG4gICAgICAndXNlcm5hbWUnOiB0aGlzLnN0YXRlLnVzZXJuYW1lLFxuICAgICAgJ3Bhc3N3b3JkJzogdGhpcy5zdGF0ZS5wYXNzd29yZFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VjY2VzcygpIHtcbiAgICBsZXQgZm9ybSA9ICQoJyNoaWRkZW4tbG9naW4tZm9ybScpO1xuXG4gICAgZm9ybS5hcHBlbmQoJzxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJ1c2VybmFtZVwiIC8+Jyk7XG4gICAgZm9ybS5hcHBlbmQoJzxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmRcIiAvPicpO1xuXG4gICAgLy8gZmlsbCBvdXQgZm9ybSB3aXRoIHVzZXIgY3JlZGVudGlhbHMgYW5kIHN1Ym1pdCBpdCwgdGhpcyB3aWxsIHRlbGxcbiAgICAvLyBNaXNhZ28gdG8gcmVkaXJlY3QgdXNlciBiYWNrIHRvIHJpZ2h0IHBhZ2UsIGFuZCB3aWxsIHRyaWdnZXIgYnJvd3NlcidzXG4gICAgLy8ga2V5IHJpbmcgZmVhdHVyZVxuICAgIGZvcm0uZmluZCgnaW5wdXRbdHlwZT1cImhpZGRlblwiXScpLnZhbChhamF4LmdldENzcmZUb2tlbigpKTtcbiAgICBmb3JtLmZpbmQoJ2lucHV0W25hbWU9XCJyZWRpcmVjdF90b1wiXScpLnZhbCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgIGZvcm0uZmluZCgnaW5wdXRbbmFtZT1cInVzZXJuYW1lXCJdJykudmFsKHRoaXMuc3RhdGUudXNlcm5hbWUpO1xuICAgIGZvcm0uZmluZCgnaW5wdXRbbmFtZT1cInBhc3N3b3JkXCJdJykudmFsKHRoaXMuc3RhdGUucGFzc3dvcmQpO1xuICAgIGZvcm0uc3VibWl0KCk7XG5cbiAgICAvLyBrZWVwIGZvcm0gbG9hZGluZ1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgJ2lzTG9hZGluZyc6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlamVjdGlvbikge1xuICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDApIHtcbiAgICAgIGlmIChyZWplY3Rpb24uY29kZSA9PT0gJ2luYWN0aXZlX2FkbWluJykge1xuICAgICAgICBzbmFja2Jhci5pbmZvKHJlamVjdGlvbi5kZXRhaWwpO1xuICAgICAgfSBlbHNlIGlmIChyZWplY3Rpb24uY29kZSA9PT0gJ2luYWN0aXZlX3VzZXInKSB7XG4gICAgICAgIHNuYWNrYmFyLmluZm8ocmVqZWN0aW9uLmRldGFpbCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICdzaG93QWN0aXZhdGlvbic6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHJlamVjdGlvbi5jb2RlID09PSAnYmFubmVkJykge1xuICAgICAgICBzaG93QmFubmVkUGFnZShyZWplY3Rpb24uZGV0YWlsKTtcbiAgICAgICAgbW9kYWwuaGlkZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc25hY2tiYXIuZXJyb3IocmVqZWN0aW9uLmRldGFpbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDMgJiYgcmVqZWN0aW9uLmJhbikge1xuICAgICAgc2hvd0Jhbm5lZFBhZ2UocmVqZWN0aW9uLmJhbik7XG4gICAgICBtb2RhbC5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNuYWNrYmFyLmFwaUVycm9yKHJlamVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0aXZhdGlvbkJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5zaG93QWN0aXZhdGlvbikge1xuICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgcmV0dXJuIDxhIGhyZWY9e21pc2Fnby5nZXQoJ1JFUVVFU1RfQUNUSVZBVElPTl9VUkwnKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJidG4gYnRuLXN1Y2Nlc3MgYnRuLWJsb2NrXCI+XG4gICAgICAgICB7Z2V0dGV4dChcIkFjdGl2YXRlIGFjY291bnRcIil9XG4gICAgICA8L2E+O1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1kaWFsb2cgbW9kYWwtc20gbW9kYWwtc2lnbi1pblwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImRvY3VtZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2dldHRleHQoXCJDbG9zZVwiKX0+XG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJtb2RhbC10aXRsZVwiPntnZXR0ZXh0KFwiU2lnbiBpblwiKX08L2g0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWJvZHlcIj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udHJvbC1pbnB1dFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImlkX3VzZXJuYW1lXCIgY2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtnZXR0ZXh0KFwiVXNlcm5hbWUgb3IgZS1tYWlsXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5iaW5kSW5wdXQoJ3VzZXJuYW1lJyl9XG4gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnVzZXJuYW1lfSAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250cm9sLWlucHV0XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IGlkPVwiaWRfcGFzc3dvcmRcIiBjbGFzc05hbWU9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5zdGF0ZS5pc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtnZXR0ZXh0KFwiUGFzc3dvcmRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmJpbmRJbnB1dCgncGFzc3dvcmQnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUucGFzc3dvcmR9IC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgICAge3RoaXMuZ2V0QWN0aXZhdGlvbkJ1dHRvbigpfVxuICAgICAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJidG4tcHJpbWFyeSBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICBsb2FkaW5nPXt0aGlzLnN0YXRlLmlzTG9hZGluZ30+XG4gICAgICAgICAgICAgIHtnZXR0ZXh0KFwiU2lnbiBpblwiKX1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgPGEgaHJlZj17bWlzYWdvLmdldCgnRk9SR09UVEVOX1BBU1NXT1JEX1VSTCcpfVxuICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiPlxuICAgICAgICAgICAgICAge2dldHRleHQoXCJGb3Jnb3QgcGFzc3dvcmQ/XCIpfVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuY29uc3QgVFlQRVNfQ0xBU1NFUyA9IHtcbiAgJ2luZm8nOiAnYWxlcnQtaW5mbycsXG4gICdzdWNjZXNzJzogJ2FsZXJ0LXN1Y2Nlc3MnLFxuICAnd2FybmluZyc6ICdhbGVydC13YXJuaW5nJyxcbiAgJ2Vycm9yJzogJ2FsZXJ0LWRhbmdlcidcbn07XG4vKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG5leHBvcnQgY2xhc3MgU25hY2tiYXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRTbmFja2JhckNsYXNzKCkge1xuICAgIGxldCBzbmFja2JhckNsYXNzID0gJ2FsZXJ0cy1zbmFja2Jhcic7XG4gICAgaWYgKHRoaXMucHJvcHMuaXNWaXNpYmxlKSB7XG4gICAgICBzbmFja2JhckNsYXNzICs9ICcgaW4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbmFja2JhckNsYXNzICs9ICcgb3V0JztcbiAgICB9XG4gICAgcmV0dXJuIHNuYWNrYmFyQ2xhc3M7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5nZXRTbmFja2JhckNsYXNzKCl9PlxuICAgICAgPHAgY2xhc3NOYW1lPXsnYWxlcnQgJyArIFRZUEVTX0NMQVNTRVNbdGhpcy5wcm9wcy50eXBlXX0+XG4gICAgICAgIHt0aGlzLnByb3BzLm1lc3NhZ2V9XG4gICAgICA8L3A+XG4gICAgPC9kaXY+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuc25hY2tiYXI7XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEF2YXRhciBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9hdmF0YXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBSZWdpc3RlckJ1dHRvbiBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9yZWdpc3Rlci1idXR0b24nOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBTaWduSW5Nb2RhbCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9zaWduLWluLmpzJztcbmltcG9ydCBkcm9wZG93biBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9iaWxlLW5hdmJhci1kcm9wZG93bic7XG5pbXBvcnQgbW9kYWwgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL21vZGFsJztcblxuZXhwb3J0IGNsYXNzIEd1ZXN0TWVudSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHNob3dTaWduSW5Nb2RhbCgpIHtcbiAgICBtb2RhbC5zaG93KFNpZ25Jbk1vZGFsKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDx1bCBjbGFzc05hbWU9XCJkcm9wZG93bi1tZW51IHVzZXItZHJvcGRvd24gZHJvcGRvd24tbWVudS1yaWdodFwiXG4gICAgICAgICAgICAgICByb2xlPVwibWVudVwiPlxuICAgICAgPGxpIGNsYXNzTmFtZT1cImd1ZXN0LXByZXZpZXdcIj5cbiAgICAgICAgPGg0PntnZXR0ZXh0KFwiWW91IGFyZSBicm93c2luZyBhcyBndWVzdC5cIil9PC9oND5cbiAgICAgICAgPHA+XG4gICAgICAgICAge2dldHRleHQoJ1NpZ24gaW4gb3IgcmVnaXN0ZXIgdG8gc3RhcnQgYW5kIHBhcnRpY2lwYXRlIGluIGRpc2N1c3Npb25zLicpfVxuICAgICAgICA8L3A+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wteHMtNlwiPlxuXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5zaG93U2lnbkluTW9kYWx9PlxuICAgICAgICAgICAgICB7Z2V0dGV4dChcIlNpZ24gaW5cIil9XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXhzLTZcIj5cblxuICAgICAgICAgICAgPFJlZ2lzdGVyQnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1wcmltYXJ5IGJ0bi1ibG9ja1wiPlxuICAgICAgICAgICAgICB7Z2V0dGV4dChcIlJlZ2lzdGVyXCIpfVxuICAgICAgICAgICAgPC9SZWdpc3RlckJ1dHRvbj5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbGk+XG4gICAgPC91bD47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgR3Vlc3ROYXYgZXh0ZW5kcyBHdWVzdE1lbnUge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm5hdiBuYXYtZ3Vlc3RcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImJ0biBuYXZiYXItYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5zaG93U2lnbkluTW9kYWx9PlxuICAgICAgICB7Z2V0dGV4dChcIlNpZ24gaW5cIil9XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxSZWdpc3RlckJ1dHRvbiBjbGFzc05hbWU9XCJuYXZiYXItYnRuIGJ0bi1wcmltYXJ5XCI+XG4gICAgICAgIHtnZXR0ZXh0KFwiUmVnaXN0ZXJcIil9XG4gICAgICA8L1JlZ2lzdGVyQnV0dG9uPlxuICAgIDwvZGl2PjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wYWN0R3Vlc3ROYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzaG93R3Vlc3RNZW51KCkge1xuICAgIGRyb3Bkb3duLnNob3coR3Vlc3RNZW51KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e3RoaXMuc2hvd0d1ZXN0TWVudX0+XG4gICAgICA8QXZhdGFyIHNpemU9XCI2NFwiIC8+XG4gICAgPC9idXR0b24+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBHdWVzdE5hdiwgQ29tcGFjdEd1ZXN0TmF2IH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvdXNlci1tZW51L2d1ZXN0LW5hdic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IHsgVXNlck5hdiwgQ29tcGFjdFVzZXJOYXZ9IGZyb20gJ21pc2Fnby9jb21wb25lbnRzL3VzZXItbWVudS91c2VyLW5hdic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5leHBvcnQgY2xhc3MgVXNlck1lbnUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIGlmICh0aGlzLnByb3BzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgcmV0dXJuIDxVc2VyTmF2IHVzZXI9e3RoaXMucHJvcHMudXNlcn0gLz47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA8R3Vlc3ROYXYgLz47XG4gICAgfVxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBhY3RVc2VyTWVudSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgaWYgKHRoaXMucHJvcHMuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICByZXR1cm4gPENvbXBhY3RVc2VyTmF2IHVzZXI9e3RoaXMucHJvcHMudXNlcn0gLz47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA8Q29tcGFjdEd1ZXN0TmF2IC8+O1xuICAgIH1cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Qoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmF1dGg7XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBBdmF0YXIgZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvYXZhdGFyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQ2hhbmdlQXZhdGFyTW9kYWwsIHsgc2VsZWN0IH0gZnJvbSAnbWlzYWdvL2NvbXBvbmVudHMvY2hhbmdlLWF2YXRhci9yb290JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWlzYWdvIGZyb20gJ21pc2Fnby9pbmRleCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IGRyb3Bkb3duIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9tb2JpbGUtbmF2YmFyLWRyb3Bkb3duJztcbmltcG9ydCBtb2RhbCBmcm9tICdtaXNhZ28vc2VydmljZXMvbW9kYWwnO1xuXG5leHBvcnQgY2xhc3MgVXNlck1lbnUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBsb2dvdXQoKSB7XG4gICAgbGV0IGRlY2lzaW9uID0gY29uZmlybShnZXR0ZXh0KFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHNpZ24gb3V0P1wiKSk7XG4gICAgaWYgKGRlY2lzaW9uKSB7XG4gICAgICAkKCcjaGlkZGVuLWxvZ291dC1mb3JtJykuc3VibWl0KCk7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlQXZhdGFyKCkge1xuICAgIG1vZGFsLnNob3coY29ubmVjdChzZWxlY3QpKENoYW5nZUF2YXRhck1vZGFsKSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8dWwgY2xhc3NOYW1lPVwiZHJvcGRvd24tbWVudSB1c2VyLWRyb3Bkb3duIGRyb3Bkb3duLW1lbnUtcmlnaHRcIlxuICAgICAgICAgICAgICAgcm9sZT1cIm1lbnVcIj5cbiAgICAgIDxsaSBjbGFzc05hbWU9XCJkcm9wZG93bi1oZWFkZXJcIj5cbiAgICAgICAgPHN0cm9uZz57dGhpcy5wcm9wcy51c2VyLnVzZXJuYW1lfTwvc3Ryb25nPlxuICAgICAgPC9saT5cbiAgICAgIDxsaSBjbGFzc05hbWU9XCJkaXZpZGVyXCIgLz5cbiAgICAgIDxsaT5cbiAgICAgICAgPGEgaHJlZj17dGhpcy5wcm9wcy51c2VyLmFic29sdXRlX3VybH0+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPmFjY291bnRfY2lyY2xlPC9zcGFuPlxuICAgICAgICAgIHtnZXR0ZXh0KFwiU2VlIHlvdXIgcHJvZmlsZVwiKX1cbiAgICAgICAgPC9hPlxuICAgICAgPC9saT5cbiAgICAgIDxsaT5cbiAgICAgICAgPGEgaHJlZj17bWlzYWdvLmdldCgnVVNFUkNQX1VSTCcpfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXRlcmlhbC1pY29uXCI+ZG9uZV9hbGw8L3NwYW4+XG4gICAgICAgICAge2dldHRleHQoXCJDaGFuZ2Ugb3B0aW9uc1wiKX1cbiAgICAgICAgPC9hPlxuICAgICAgPC9saT5cbiAgICAgIDxsaT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuLWxpbmtcIiBvbkNsaWNrPXt0aGlzLmNoYW5nZUF2YXRhcn0+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF0ZXJpYWwtaWNvblwiPmZhY2U8L3NwYW4+XG4gICAgICAgICAge2dldHRleHQoXCJDaGFuZ2UgYXZhdGFyXCIpfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgICA8bGkgY2xhc3NOYW1lPVwiZGl2aWRlclwiIC8+XG4gICAgICA8bGkgY2xhc3NOYW1lPVwiZHJvcGRvd24tZm9vdGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmxvZ291dH0+XG4gICAgICAgICAgICB7Z2V0dGV4dChcIkxvZyBvdXRcIil9XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVzZXJOYXYgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIHJldHVybiA8dWwgY2xhc3NOYW1lPVwidWwgbmF2IG5hdmJhci1uYXYgbmF2LXVzZXJcIj5cbiAgICAgIDxsaSBjbGFzc05hbWU9XCJkcm9wZG93blwiPlxuICAgICAgICA8YSBocmVmPXt0aGlzLnByb3BzLnVzZXIuYWJzb2x1dGVfdXJsfSBjbGFzc05hbWU9XCJkcm9wZG93bi10b2dnbGVcIlxuICAgICAgICAgICBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICByb2xlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgPEF2YXRhciB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IHNpemU9XCI2NFwiIC8+XG4gICAgICAgIDwvYT5cbiAgICAgICAgPFVzZXJNZW51IHVzZXI9e3RoaXMucHJvcHMudXNlcn0gLz5cbiAgICAgIDwvbGk+XG4gICAgPC91bD47XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0VXNlck1lbnUoc3RhdGUpIHtcbiAgY29uc29sZS5sb2coc3RhdGUpO1xuICByZXR1cm4ge3VzZXI6IHN0YXRlLmF1dGgudXNlcn07XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wYWN0VXNlck5hdiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHNob3dVc2VyTWVudSgpIHtcbiAgICBkcm9wZG93bi5zaG93Q29ubmVjdGVkKCd1c2VyLW1lbnUnLCBjb25uZWN0KHNlbGVjdFVzZXJNZW51KShVc2VyTWVudSkpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICByZXR1cm4gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17dGhpcy5zaG93VXNlck1lbnV9PlxuICAgICAgPEF2YXRhciB1c2VyPXt0aGlzLnByb3BzLnVzZXJ9IHNpemU9XCI2NFwiIC8+XG4gICAgPC9idXR0b24+O1xuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gIH1cbn1cbiIsImltcG9ydCBPcmRlcmVkTGlzdCBmcm9tICdtaXNhZ28vdXRpbHMvb3JkZXJlZC1saXN0JztcblxuZXhwb3J0IGNsYXNzIE1pc2FnbyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2luaXRpYWxpemVycyA9IFtdO1xuICAgIHRoaXMuX2NvbnRleHQgPSB7fTtcbiAgfVxuXG4gIGFkZEluaXRpYWxpemVyKGluaXRpYWxpemVyKSB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZXJzLnB1c2goe1xuICAgICAga2V5OiBpbml0aWFsaXplci5uYW1lLFxuXG4gICAgICBpdGVtOiBpbml0aWFsaXplci5pbml0aWFsaXplcixcblxuICAgICAgYWZ0ZXI6IGluaXRpYWxpemVyLmFmdGVyLFxuICAgICAgYmVmb3JlOiBpbml0aWFsaXplci5iZWZvcmVcbiAgICB9KTtcbiAgfVxuXG4gIGluaXQoY29udGV4dCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuXG4gICAgdmFyIGluaXRPcmRlciA9IG5ldyBPcmRlcmVkTGlzdCh0aGlzLl9pbml0aWFsaXplcnMpLm9yZGVyZWRWYWx1ZXMoKTtcbiAgICBpbml0T3JkZXIuZm9yRWFjaChpbml0aWFsaXplciA9PiB7XG4gICAgICBpbml0aWFsaXplcih0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGNvbnRleHQgYWNjZXNzb3JzXG4gIGhhcyhrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpO1xuICB9XG5cbiAgZ2V0KGtleSwgZmFsbGJhY2spIHtcbiAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHRba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cblxuLy8gY3JlYXRlICBzaW5nbGV0b25cbnZhciBtaXNhZ28gPSBuZXcgTWlzYWdvKCk7XG5cbi8vIGV4cG9zZSBpdCBnbG9iYWxseVxuZ2xvYmFsLm1pc2FnbyA9IG1pc2FnbztcblxuLy8gYW5kIGV4cG9ydCBpdCBmb3IgdGVzdHMgYW5kIHN0dWZmXG5leHBvcnQgZGVmYXVsdCBtaXNhZ287XG4iLCJpbXBvcnQgeyBVUERBVEVfQVZBVEFSIH0gZnJvbSAnbWlzYWdvL3JlZHVjZXJzL3VzZXJzJztcblxuZXhwb3J0IHZhciBpbml0aWFsU3RhdGUgPSB7XG4gIHNpZ25lZEluOiBmYWxzZSxcbiAgc2lnbmVkT3V0OiBmYWxzZVxufTtcblxuZXhwb3J0IGNvbnN0IFNJR05fSU4gPSAnU0lHTl9JTic7XG5leHBvcnQgY29uc3QgU0lHTl9PVVQgPSAnU0lHTl9PVVQnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2lnbkluKHVzZXIpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBTSUdOX0lOLFxuICAgIHVzZXJcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25PdXQoc29mdD1mYWxzZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFNJR05fT1VULFxuICAgIHNvZnRcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXV0aChzdGF0ZT1pbml0aWFsU3RhdGUsIGFjdGlvbj1udWxsKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIFNJR05fSU46XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgc2lnbmVkSW46IGFjdGlvbi51c2VyXG4gICAgICB9KTtcblxuICAgIGNhc2UgU0lHTl9PVVQ6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgICAgICAgaXNBbm9ueW1vdXM6IHRydWUsXG4gICAgICAgIHNpZ25lZE91dDogIWFjdGlvbi5zb2Z0XG4gICAgICB9KTtcblxuICAgIGNhc2UgVVBEQVRFX0FWQVRBUjpcbiAgICAgIGlmIChzdGF0ZS5pc0F1dGhlbnRpY2F0ZWQgJiYgc3RhdGUudXNlci5pZCA9PT0gYWN0aW9uLnVzZXJJZCkge1xuICAgICAgICBsZXQgbmV3U3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSk7XG4gICAgICAgIG5ld1N0YXRlLnVzZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS51c2VyLCB7XG4gICAgICAgICAgJ2F2YXRhcl9oYXNoJzogYWN0aW9uLmF2YXRhckhhc2hcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cbiIsImV4cG9ydCB2YXIgaW5pdGlhbFN0YXRlID0ge1xuICB0eXBlOiAnaW5mbycsXG4gIG1lc3NhZ2U6ICcnLFxuICBpc1Zpc2libGU6IGZhbHNlXG59O1xuXG5leHBvcnQgY29uc3QgU0hPV19TTkFDS0JBUiA9ICdTSE9XX1NOQUNLQkFSJztcbmV4cG9ydCBjb25zdCBISURFX1NOQUNLQkFSID0gJ0hJREVfU05BQ0tCQVInO1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvd1NuYWNrYmFyKG1lc3NhZ2UsIHR5cGUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBTSE9XX1NOQUNLQkFSLFxuICAgIG1lc3NhZ2UsXG4gICAgbWVzc2FnZVR5cGU6IHR5cGVcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhpZGVTbmFja2JhcigpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBISURFX1NOQUNLQkFSXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNuYWNrYmFyKHN0YXRlPWluaXRpYWxTdGF0ZSwgYWN0aW9uPW51bGwpIHtcbiAgaWYgKGFjdGlvbi50eXBlID09PSBTSE9XX1NOQUNLQkFSKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IGFjdGlvbi5tZXNzYWdlVHlwZSxcbiAgICAgIG1lc3NhZ2U6IGFjdGlvbi5tZXNzYWdlLFxuICAgICAgaXNWaXNpYmxlOiB0cnVlXG4gICAgfTtcbiAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gSElERV9TTkFDS0JBUikge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc1Zpc2libGU6IGZhbHNlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG4iLCJleHBvcnQgdmFyIGluaXRpYWxTdGF0ZSA9IHtcbiAgdGljazogMFxufTtcblxuZXhwb3J0IGNvbnN0IFRJQ0sgPSAnVElDSyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkb1RpY2soKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogVElDS1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0aWNrKHN0YXRlPWluaXRpYWxTdGF0ZSwgYWN0aW9uPW51bGwpIHtcbiAgaWYgKGFjdGlvbi50eXBlID09PSBUSUNLKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHRpY2s6IHN0YXRlLnRpY2sgKyAxXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG4iLCJleHBvcnQgY29uc3QgVVBEQVRFX0FWQVRBUiA9ICdVUERBVEVfQVZBVEFSJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUF2YXRhcih1c2VyLCBhdmF0YXJIYXNoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogVVBEQVRFX0FWQVRBUixcbiAgICB1c2VySWQ6IHVzZXIuaWQsXG4gICAgYXZhdGFySGFzaFxuICB9O1xufSIsImV4cG9ydCBjbGFzcyBBamF4IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fY29va2llTmFtZSA9IG51bGw7XG4gICAgdGhpcy5fY3NyZlRva2VuID0gbnVsbDtcbiAgfVxuXG4gIGluaXQoY29va2llTmFtZSkge1xuICAgIHRoaXMuX2Nvb2tpZU5hbWUgPSBjb29raWVOYW1lO1xuICAgIHRoaXMuX2NzcmZUb2tlbiA9IHRoaXMuZ2V0Q3NyZlRva2VuKCk7XG4gIH1cblxuICBnZXRDc3JmVG9rZW4oKSB7XG4gICAgaWYgKGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKHRoaXMuX2Nvb2tpZU5hbWUpICE9PSAtMSkge1xuICAgICAgdmFyIGNvb2tpZVJlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLl9jb29raWVOYW1lICsgJ1xcPShbXjtdKiknKTtcbiAgICAgIHZhciBjb29raWUgPSBkb2N1bWVudC5jb29raWUubWF0Y2goY29va2llUmVnZXgpWzBdO1xuICAgICAgcmV0dXJuIGNvb2tpZSA/IGNvb2tpZS5zcGxpdCgnPScpWzFdIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVxdWVzdChtZXRob2QsIHVybCwgZGF0YSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgeGhyID0ge1xuICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnWC1DU1JGVG9rZW4nOiBzZWxmLl9jc3JmVG9rZW5cbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiBkYXRhIHx8IHt9LFxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbihqcVhIUikge1xuICAgICAgICAgIHZhciByZWplY3Rpb24gPSBqcVhIUi5yZXNwb25zZUpTT04gfHwge307XG5cbiAgICAgICAgICByZWplY3Rpb24uc3RhdHVzID0ganFYSFIuc3RhdHVzO1xuICAgICAgICAgIHJlamVjdGlvbi5zdGF0dXNUZXh0ID0ganFYSFIuc3RhdHVzVGV4dDtcblxuICAgICAgICAgIHJlamVjdChyZWplY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAkLmFqYXgoeGhyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCh1cmwpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdHRVQnLCB1cmwpO1xuICB9XG5cbiAgcG9zdCh1cmwsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQT1NUJywgdXJsLCBkYXRhKTtcbiAgfVxuXG4gIHBhdGNoKHVybCwgZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BBVENIJywgdXJsLCBkYXRhKTtcbiAgfVxuXG4gIHB1dCh1cmwsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQVVQnLCB1cmwsIGRhdGEpO1xuICB9XG5cbiAgZGVsZXRlKHVybCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIHVybCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IEFqYXgoKTtcbiIsImltcG9ydCB7IHNpZ25Jbiwgc2lnbk91dCB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9hdXRoJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBjbGFzcyBBdXRoIHtcbiAgaW5pdChzdG9yZSwgbG9jYWwsIG1vZGFsKSB7XG4gICAgdGhpcy5fc3RvcmUgPSBzdG9yZTtcbiAgICB0aGlzLl9sb2NhbCA9IGxvY2FsO1xuICAgIHRoaXMuX21vZGFsID0gbW9kYWw7XG5cbiAgICAvLyB0ZWxsIG90aGVyIHRhYnMgd2hhdCBhdXRoIHN0YXRlIGlzIGJlY2F1c2Ugd2UgYXJlIG1vc3QgY3VycmVudCB3aXRoIGl0XG4gICAgdGhpcy5zeW5jU2Vzc2lvbigpO1xuXG4gICAgLy8gbGlzdGVuIGZvciBvdGhlciB0YWJzIHRvIHRlbGwgdXMgdGhhdCBzdGF0ZSBjaGFuZ2VkXG4gICAgdGhpcy53YXRjaFN0YXRlKCk7XG4gIH1cblxuICBzeW5jU2Vzc2lvbigpIHtcbiAgICBsZXQgc3RhdGUgPSB0aGlzLl9zdG9yZS5nZXRTdGF0ZSgpLmF1dGg7XG4gICAgaWYgKHN0YXRlLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgdGhpcy5fbG9jYWwuc2V0KCdhdXRoJywge1xuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IHRydWUsXG4gICAgICAgIHVzZXJuYW1lOiBzdGF0ZS51c2VyLnVzZXJuYW1lXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbG9jYWwuc2V0KCdhdXRoJywge1xuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB3YXRjaFN0YXRlKCkge1xuICAgIHRoaXMuX2xvY2FsLndhdGNoKCdhdXRoJywgKG5ld1N0YXRlKSA9PiB7XG4gICAgICBpZiAobmV3U3RhdGUuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHNpZ25Jbih7XG4gICAgICAgICAgdXNlcm5hbWU6IG5ld1N0YXRlLnVzZXJuYW1lXG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKHNpZ25PdXQoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fbW9kYWwuaGlkZSgpO1xuICB9XG5cbiAgc2lnbkluKHVzZXIpIHtcbiAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChzaWduSW4odXNlcikpO1xuICAgIHRoaXMuX2xvY2FsLnNldCgnYXV0aCcsIHtcbiAgICAgIGlzQXV0aGVudGljYXRlZDogdHJ1ZSxcbiAgICAgIHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lXG4gICAgfSk7XG4gICAgdGhpcy5fbW9kYWwuaGlkZSgpO1xuICB9XG5cbiAgc2lnbk91dCgpIHtcbiAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChzaWduT3V0KCkpO1xuICAgIHRoaXMuX2xvY2FsLnNldCgnYXV0aCcsIHtcbiAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLl9tb2RhbC5oaWRlKCk7XG4gIH1cblxuICBzb2Z0U2lnbk91dCgpIHtcbiAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChzaWduT3V0KHRydWUpKTtcbiAgICB0aGlzLl9sb2NhbC5zZXQoJ2F1dGgnLCB7XG4gICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy5fbW9kYWwuaGlkZSgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBBdXRoKCk7IiwiLyogZ2xvYmFsIGdyZWNhcHRjaGEgKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IEZvcm1Hcm91cCBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9mb3JtLWdyb3VwJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBjbGFzcyBCYXNlQ2FwdGNoYSB7XG4gIGluaXQoY29udGV4dCwgYWpheCwgaW5jbHVkZSwgc25hY2tiYXIpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLl9hamF4ID0gYWpheDtcbiAgICB0aGlzLl9pbmNsdWRlID0gaW5jbHVkZTtcbiAgICB0aGlzLl9zbmFja2JhciA9IHNuYWNrYmFyO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0NhcHRjaGEgZXh0ZW5kcyBCYXNlQ2FwdGNoYSB7XG4gIGxvYWQoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgIC8vIGltbWVkaWF0ZWx5IHJlc29sdmUgYXMgd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byB2YWxpZGF0ZVxuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdG9yKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29tcG9uZW50KCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRQUNhcHRjaGEgZXh0ZW5kcyBCYXNlQ2FwdGNoYSB7XG4gIGxvYWQoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzZWxmLl9hamF4LmdldChzZWxmLl9jb250ZXh0LmdldCgnQ0FQVENIQV9BUElfVVJMJykpLnRoZW4oXG4gICAgICBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHNlbGYucXVlc3Rpb24gPSBkYXRhLnF1ZXN0aW9uO1xuICAgICAgICBzZWxmLmhlbHBUZXh0ID0gZGF0YS5oZWxwX3RleHQ7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLl9zbmFja2Jhci5lcnJvcihnZXR0ZXh0KFwiRmFpbGVkIHRvIGxvYWQgQ0FQVENIQS5cIikpO1xuICAgICAgICByZWplY3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdG9yKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgY29tcG9uZW50KGt3YXJncykge1xuICAgIHJldHVybiA8Rm9ybUdyb3VwIGxhYmVsPXt0aGlzLnF1ZXN0aW9ufSBmb3I9XCJpZF9jYXB0Y2hhXCJcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbENsYXNzPXtrd2FyZ3MubGFiZWxDbGFzcyB8fCBcImNvbC1zbS00XCJ9XG4gICAgICAgICAgICAgICAgICAgICAgY29udHJvbENsYXNzPXtrd2FyZ3MuY29udHJvbENsYXNzIHx8IFwiY29sLXNtLThcIn1cbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uPXtrd2FyZ3MuZm9ybS5zdGF0ZS5lcnJvcnMuY2FwdGNoYX1cbiAgICAgICAgICAgICAgICAgICAgICBoZWxwVGV4dD17dGhpcy5oZWxwVGV4dCB8fCBudWxsfT5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaWRfY2FwdGNoYVwiIGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cImlkX2NhcHRjaGFfc3RhdHVzXCJcbiAgICAgICAgICAgICBkaXNhYmxlZD17a3dhcmdzLmZvcm0uc3RhdGUuaXNMb2FkaW5nfVxuICAgICAgICAgICAgIG9uQ2hhbmdlPXtrd2FyZ3MuZm9ybS5iaW5kSW5wdXQoJ2NhcHRjaGEnKX1cbiAgICAgICAgICAgICB2YWx1ZT17a3dhcmdzLmZvcm0uc3RhdGUuY2FwdGNoYX0gLz5cbiAgICA8L0Zvcm1Hcm91cD47XG4gIH1cbiAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbn1cblxuXG5leHBvcnQgY2xhc3MgUmVDYXB0Y2hhQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgZ3JlY2FwdGNoYS5yZW5kZXIoJ3JlY2FwdGNoYScsIHtcbiAgICAgICdzaXRla2V5JzogdGhpcy5wcm9wcy5zaXRlS2V5LFxuICAgICAgJ2NhbGxiYWNrJzogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIC8vIGZpcmUgZmFrZXkgZXZlbnQgdG8gYmluZGluZ1xuICAgICAgICB0aGlzLnByb3BzLmJpbmRpbmcoe1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgdmFsdWU6IHJlc3BvbnNlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgcmV0dXJuIDxkaXYgaWQ9XCJyZWNhcHRjaGFcIiAvPjtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZUNhcHRjaGEgZXh0ZW5kcyBCYXNlQ2FwdGNoYSB7XG4gIGxvYWQoKSB7XG4gICAgdGhpcy5faW5jbHVkZS5pbmNsdWRlKCdodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9hcGkuanMnLCB0cnVlKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICB2YXIgd2FpdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIGdyZWNhcHRjaGEgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHdhaXQoKTtcbiAgICAgICAgICB9LCAyMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHdhaXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRvcigpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIGNvbXBvbmVudChrd2FyZ3MpIHtcbiAgICByZXR1cm4gPEZvcm1Hcm91cCBsYWJlbD17Z2V0dGV4dChcIkNhcHRjaGFcIil9IGZvcj1cImlkX2NhcHRjaGFcIlxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQ2xhc3M9e2t3YXJncy5sYWJlbENsYXNzIHx8IFwiY29sLXNtLTRcIn1cbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sQ2xhc3M9e2t3YXJncy5jb250cm9sQ2xhc3MgfHwgXCJjb2wtc20tOFwifVxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb249e2t3YXJncy5mb3JtLnN0YXRlLmVycm9ycy5jYXB0Y2hhfVxuICAgICAgICAgICAgICAgICAgICAgIGhlbHBUZXh0PXtnZXR0ZXh0KFwiUGxlYXNlIHNvbHZlIHRoZSBxdWljayB0ZXN0LlwiKX0+XG4gICAgICA8UmVDYXB0Y2hhQ29tcG9uZW50IHNpdGVLZXk9e3RoaXMuX2NvbnRleHQuZ2V0KCdTRVRUSU5HUycpLnJlY2FwdGNoYV9zaXRlX2tleX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZz17a3dhcmdzLmZvcm0uYmluZElucHV0KCdjYXB0Y2hhJyl9IC8+XG4gICAgPC9Gb3JtR3JvdXA+O1xuICB9XG4gIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG59XG5cbmV4cG9ydCBjbGFzcyBDYXB0Y2hhIHtcbiAgaW5pdChjb250ZXh0LCBhamF4LCBpbmNsdWRlLCBzbmFja2Jhcikge1xuICAgIHN3aXRjaChjb250ZXh0LmdldCgnU0VUVElOR1MnKS5jYXB0Y2hhX3R5cGUpIHtcbiAgICAgIGNhc2UgJ25vJzpcbiAgICAgICAgdGhpcy5fY2FwdGNoYSA9IG5ldyBOb0NhcHRjaGEoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3FhJzpcbiAgICAgICAgdGhpcy5fY2FwdGNoYSA9IG5ldyBRQUNhcHRjaGEoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JlJzpcbiAgICAgICAgdGhpcy5fY2FwdGNoYSA9IG5ldyBSZUNhcHRjaGEoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5fY2FwdGNoYS5pbml0KGNvbnRleHQsIGFqYXgsIGluY2x1ZGUsIHNuYWNrYmFyKTtcbiAgfVxuXG4gIC8vIGFjY2Vzc29ycyBmb3IgdW5kZXJseWluZyBzdHJhdGVneVxuXG4gIGxvYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhcHRjaGEubG9hZCgpO1xuICB9XG5cbiAgdmFsaWRhdG9yKCkge1xuICAgIHJldHVybiB0aGlzLl9jYXB0Y2hhLnZhbGlkYXRvcigpO1xuICB9XG5cbiAgY29tcG9uZW50KGt3YXJncykge1xuICAgIHJldHVybiB0aGlzLl9jYXB0Y2hhLmNvbXBvbmVudChrd2FyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBDYXB0Y2hhKCk7IiwiZXhwb3J0IGNsYXNzIEluY2x1ZGUge1xuICBpbml0KHN0YXRpY1VybCkge1xuICAgIHRoaXMuX3N0YXRpY1VybCA9IHN0YXRpY1VybDtcbiAgICB0aGlzLl9pbmNsdWRlZCA9IFtdO1xuICB9XG5cbiAgaW5jbHVkZShzY3JpcHQsIHJlbW90ZT1mYWxzZSkge1xuICAgIGlmICh0aGlzLl9pbmNsdWRlZC5pbmRleE9mKHNjcmlwdCkgPT09IC0xKSB7XG4gICAgICB0aGlzLl9pbmNsdWRlZC5wdXNoKHNjcmlwdCk7XG4gICAgICB0aGlzLl9pbmNsdWRlKHNjcmlwdCwgcmVtb3RlKTtcbiAgICB9XG4gIH1cblxuICBfaW5jbHVkZShzY3JpcHQsIHJlbW90ZSkge1xuICAgICQuYWpheCh7XG4gICAgICB1cmw6ICghcmVtb3RlID8gdGhpcy5fc3RhdGljVXJsIDogJycpICsgc2NyaXB0LFxuICAgICAgY2FjaGU6IHRydWUsXG4gICAgICBkYXRhVHlwZTogJ3NjcmlwdCdcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgSW5jbHVkZSgpOyIsImxldCBzdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcblxuZXhwb3J0IGNsYXNzIExvY2FsU3RvcmFnZSB7XG4gIGluaXQocHJlZml4KSB7XG4gICAgdGhpcy5fcHJlZml4ID0gcHJlZml4O1xuICAgIHRoaXMuX3dhdGNoZXJzID0gW107XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIChlKSA9PiB7XG4gICAgICBsZXQgbmV3VmFsdWVKc29uID0gSlNPTi5wYXJzZShlLm5ld1ZhbHVlKTtcbiAgICAgIHRoaXMuX3dhdGNoZXJzLmZvckVhY2goZnVuY3Rpb24od2F0Y2hlcikge1xuICAgICAgICBpZiAod2F0Y2hlci5rZXkgPT09IGUua2V5ICYmIGUub2xkVmFsdWUgIT09IGUubmV3VmFsdWUpIHtcbiAgICAgICAgICB3YXRjaGVyLmNhbGxiYWNrKG5ld1ZhbHVlSnNvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICBzdG9yYWdlLnNldEl0ZW0odGhpcy5fcHJlZml4ICsga2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIGxldCBpdGVtU3RyaW5nID0gc3RvcmFnZS5nZXRJdGVtKHRoaXMuX3ByZWZpeCArIGtleSk7XG4gICAgaWYgKGl0ZW1TdHJpbmcpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGl0ZW1TdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3YXRjaChrZXksIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fd2F0Y2hlcnMucHVzaCh7XG4gICAgICBrZXk6IHRoaXMuX3ByZWZpeCArIGtleSxcbiAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBMb2NhbFN0b3JhZ2UoKTsiLCJpbXBvcnQgbW91bnQgZnJvbSAnbWlzYWdvL3V0aWxzL21vdW50LWNvbXBvbmVudCc7XG5cbmV4cG9ydCBjbGFzcyBNb2JpbGVOYXZiYXJEcm9wZG93biB7XG4gIGluaXQoZWxlbWVudCkge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX2NvbXBvbmVudCA9IG51bGw7XG4gIH1cblxuICBzaG93KGNvbXBvbmVudCkge1xuICAgIGlmICh0aGlzLl9jb21wb25lbnQgPT09IGNvbXBvbmVudCkge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICAgIG1vdW50KGNvbXBvbmVudCwgdGhpcy5fZWxlbWVudC5pZCk7XG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKCdvcGVuJyk7XG4gICAgfVxuICB9XG5cbiAgc2hvd0Nvbm5lY3RlZChuYW1lLCBjb21wb25lbnQpIHtcbiAgICBpZiAodGhpcy5fY29tcG9uZW50ID09PSBuYW1lKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29tcG9uZW50ID0gbmFtZTtcbiAgICAgIG1vdW50KGNvbXBvbmVudCwgdGhpcy5fZWxlbWVudC5pZCwgdHJ1ZSk7XG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKCdvcGVuJyk7XG4gICAgfVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICAkKHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKCdvcGVuJyk7XG4gICAgdGhpcy5fY29tcG9uZW50ID0gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgTW9iaWxlTmF2YmFyRHJvcGRvd24oKTtcbiIsImltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IG1vdW50IGZyb20gJ21pc2Fnby91dGlscy9tb3VudC1jb21wb25lbnQnO1xuXG5leHBvcnQgY2xhc3MgTW9kYWwge1xuICBpbml0KGVsZW1lbnQpIHtcbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcblxuICAgIHRoaXMuX21vZGFsID0gJChlbGVtZW50KS5tb2RhbCh7c2hvdzogZmFsc2V9KTtcblxuICAgIHRoaXMuX21vZGFsLm9uKCdoaWRkZW4uYnMubW9kYWwnLCAoKSA9PiB7XG4gICAgICBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKHRoaXMuX2VsZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgc2hvdyhjb21wb25lbnQpIHtcbiAgICBtb3VudChjb21wb25lbnQsIHRoaXMuX2VsZW1lbnQuaWQpO1xuICAgIHRoaXMuX21vZGFsLm1vZGFsKCdzaG93Jyk7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIHRoaXMuX21vZGFsLm1vZGFsKCdoaWRlJyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IE1vZGFsKCk7XG4iLCJpbXBvcnQgeyBzaG93U25hY2tiYXIsIGhpZGVTbmFja2JhciB9IGZyb20gJ21pc2Fnby9yZWR1Y2Vycy9zbmFja2Jhcic7XG5cbmNvbnN0IEhJREVfQU5JTUFUSU9OX0xFTkdUSCA9IDMwMDtcbmNvbnN0IE1FU1NBR0VfU0hPV19MRU5HVEggPSA1MDAwO1xuXG5leHBvcnQgY2xhc3MgU25hY2tiYXIge1xuICBpbml0KHN0b3JlKSB7XG4gICAgdGhpcy5fc3RvcmUgPSBzdG9yZTtcbiAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgfVxuXG4gIGFsZXJ0KG1lc3NhZ2UsIHR5cGUpIHtcbiAgICBpZiAodGhpcy5fdGltZW91dCkge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKGhpZGVTbmFja2JhcigpKTtcblxuICAgICAgdGhpcy5fdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fdGltZW91dCA9IG51bGw7XG4gICAgICAgIHRoaXMuYWxlcnQobWVzc2FnZSwgdHlwZSk7XG4gICAgICB9LCBISURFX0FOSU1BVElPTl9MRU5HVEgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChzaG93U25hY2tiYXIobWVzc2FnZSwgdHlwZSkpO1xuICAgICAgdGhpcy5fdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goaGlkZVNuYWNrYmFyKCkpO1xuICAgICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgICAgIH0sIE1FU1NBR0VfU0hPV19MRU5HVEgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNob3J0aGFuZHMgZm9yIG1lc3NhZ2UgdHlwZXNcblxuICBpbmZvKG1lc3NhZ2UpIHtcbiAgICB0aGlzLmFsZXJ0KG1lc3NhZ2UsICdpbmZvJyk7XG4gIH1cblxuICBzdWNjZXNzKG1lc3NhZ2UpIHtcbiAgICB0aGlzLmFsZXJ0KG1lc3NhZ2UsICdzdWNjZXNzJyk7XG4gIH1cblxuICB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgICB0aGlzLmFsZXJ0KG1lc3NhZ2UsICd3YXJuaW5nJyk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlKSB7XG4gICAgdGhpcy5hbGVydChtZXNzYWdlLCAnZXJyb3InKTtcbiAgfVxuXG4gIC8vIHNob3J0aGFuZCBmb3IgYXBpIGVycm9yc1xuXG4gIGFwaUVycm9yKHJlamVjdGlvbikge1xuICAgIGxldCBtZXNzYWdlID0gZ2V0dGV4dChcIlVua25vd24gZXJyb3IgaGFzIG9jY3VyZWQuXCIpO1xuXG4gICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDApIHtcbiAgICAgIG1lc3NhZ2UgPSBnZXR0ZXh0KFwiTG9zdCBjb25uZWN0aW9uIHdpdGggYXBwbGljYXRpb24uXCIpO1xuICAgIH1cblxuICAgIGlmIChyZWplY3Rpb24uc3RhdHVzID09PSA0MDAgJiYgcmVqZWN0aW9uLmRldGFpbCkge1xuICAgICAgbWVzc2FnZSA9IHJlamVjdGlvbi5kZXRhaWw7XG4gICAgfVxuXG4gICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDQwMykge1xuICAgICAgbWVzc2FnZSA9IHJlamVjdGlvbi5kZXRhaWw7XG4gICAgICBpZiAobWVzc2FnZSA9PT0gXCJQZXJtaXNzaW9uIGRlbmllZFwiKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBnZXR0ZXh0KFxuICAgICAgICAgIFwiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLlwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICBtZXNzYWdlID0gZ2V0dGV4dChcIkFjdGlvbiBsaW5rIGlzIGludmFsaWQuXCIpO1xuICAgIH1cblxuICAgIHRoaXMuZXJyb3IobWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IFNuYWNrYmFyKCk7XG4iLCJpbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMsIGNyZWF0ZVN0b3JlIH0gZnJvbSAncmVkdXgnO1xuXG5leHBvcnQgY2xhc3MgU3RvcmVXcmFwcGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc3RvcmUgPSBudWxsO1xuICAgIHRoaXMuX3JlZHVjZXJzID0ge307XG4gICAgdGhpcy5faW5pdGlhbFN0YXRlID0ge307XG4gIH1cblxuICBhZGRSZWR1Y2VyKG5hbWUsIHJlZHVjZXIsIGluaXRpYWxTdGF0ZSkge1xuICAgIHRoaXMuX3JlZHVjZXJzW25hbWVdID0gcmVkdWNlcjtcbiAgICB0aGlzLl9pbml0aWFsU3RhdGVbbmFtZV0gPSBpbml0aWFsU3RhdGU7XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuX3N0b3JlID0gY3JlYXRlU3RvcmUoXG4gICAgICBjb21iaW5lUmVkdWNlcnModGhpcy5fcmVkdWNlcnMpLCB0aGlzLl9pbml0aWFsU3RhdGUpO1xuICB9XG5cbiAgZ2V0U3RvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlO1xuICB9XG5cbiAgLy8gU3RvcmUgQVBJXG5cbiAgZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmdldFN0YXRlKCk7XG4gIH1cblxuICBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmUuZGlzcGF0Y2goYWN0aW9uKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgU3RvcmVXcmFwcGVyKCk7XG4iLCIvKiBnbG9iYWwgenhjdmJuICovXG5leHBvcnQgY2xhc3MgWnhjdmJuIHtcbiAgaW5pdChpbmNsdWRlKSB7XG4gICAgdGhpcy5faW5jbHVkZSA9IGluY2x1ZGU7XG4gIH1cblxuICBzY29yZVBhc3N3b3JkKHBhc3N3b3JkLCBpbnB1dHMpIHtcbiAgICAvLyAwLTQgc2NvcmUsIHRoZSBtb3JlIHRoZSBzdHJvbmdlciBwYXNzd29yZFxuICAgIHJldHVybiB6eGN2Ym4ocGFzc3dvcmQsIGlucHV0cykuc2NvcmU7XG4gIH1cblxuICBsb2FkKCkge1xuICAgIGlmICh0eXBlb2YgenhjdmJuID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLl9pbmNsdWRlLmluY2x1ZGUoJ21pc2Fnby9qcy96eGN2Ym4uanMnKTtcbiAgICAgIHJldHVybiB0aGlzLl9sb2FkaW5nUHJvbWlzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fbG9hZGVkUHJvbWlzZSgpO1xuICAgIH1cbiAgfVxuXG4gIF9sb2FkaW5nUHJvbWlzZSgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuICAgICAgdmFyIHdhaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB6eGN2Ym4gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHdhaXQoKTtcbiAgICAgICAgICB9LCAyMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHdhaXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9sb2FkZWRQcm9taXNlKCkge1xuICAgIC8vIHdlIGhhdmUgYWxyZWFkeSBsb2FkZWQgenhjdmJuLmpzLCByZXNvbHZlIGF3YXkhXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgWnhjdmJuKCk7IiwiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBQcm92aWRlciwgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgQmFubmVkUGFnZSBmcm9tICdtaXNhZ28vY29tcG9uZW50cy9iYW5uZWQtcGFnZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1pc2FnbyBmcm9tICdtaXNhZ28vaW5kZXgnO1xuaW1wb3J0IHN0b3JlIGZyb20gJ21pc2Fnby9zZXJ2aWNlcy9zdG9yZSc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG4vKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5sZXQgc2VsZWN0ID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLnRpY2s7XG59O1xuXG5sZXQgUmVkcmF3ZWRCYW5uZWRQYWdlID0gY29ubmVjdChzZWxlY3QpKEJhbm5lZFBhZ2UpO1xuLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYmFuLCBjaGFuZ2VTdGF0ZSkge1xuICBSZWFjdERPTS5yZW5kZXIoXG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIDxQcm92aWRlciBzdG9yZT17c3RvcmUuZ2V0U3RvcmUoKX0+XG4gICAgICA8UmVkcmF3ZWRCYW5uZWRQYWdlIG1lc3NhZ2U9e2Jhbi5tZXNzYWdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzPXtiYW4uZXhwaXJlc19vbiA/IG1vbWVudChiYW4uZXhwaXJlc19vbikgOiBudWxsfSAvPlxuICAgIDwvUHJvdmlkZXI+LFxuICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2UtbW91bnQnKVxuICApO1xuXG4gIGlmICh0eXBlb2YgY2hhbmdlU3RhdGUgPT09ICd1bmRlZmluZWQnIHx8IGNoYW5nZVN0YXRlKSB7XG4gICAgbGV0IGZvcnVtTmFtZSA9IG1pc2Fnby5nZXQoJ1NFVFRJTkdTJykuZm9ydW1fbmFtZTtcbiAgICBkb2N1bWVudC50aXRsZSA9IGdldHRleHQoXCJZb3UgYXJlIGJhbm5lZFwiKSArICcgfCAnICsgZm9ydW1OYW1lO1xuICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7fSwgXCJcIiwgbWlzYWdvLmdldCgnQkFOTkVEX1VSTCcpKTtcbiAgfVxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4JzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgc3RvcmUgZnJvbSAnbWlzYWdvL3NlcnZpY2VzL3N0b3JlJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKENvbXBvbmVudCwgcm9vdEVsZW1lbnRJZCwgY29ubmVjdGVkPXRydWUpIHtcbiAgbGV0IHJvb3RFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocm9vdEVsZW1lbnRJZCk7XG5cbiAgaWYgKHJvb3RFbGVtZW50KSB7XG4gICAgaWYgKGNvbm5lY3RlZCkge1xuICAgICAgUmVhY3RET00ucmVuZGVyKFxuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgIDxQcm92aWRlciBzdG9yZT17c3RvcmUuZ2V0U3RvcmUoKX0+XG4gICAgICAgICAgPENvbXBvbmVudCAvPlxuICAgICAgICA8L1Byb3ZpZGVyPixcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICAgICAgcm9vdEVsZW1lbnRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RE9NLnJlbmRlcihcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICA8Q29tcG9uZW50IC8+LFxuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICAgICAgICByb290RWxlbWVudFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsImNsYXNzIE9yZGVyZWRMaXN0IHtcbiAgICBjb25zdHJ1Y3RvcihpdGVtcykge1xuICAgICAgdGhpcy5pc09yZGVyZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2l0ZW1zID0gaXRlbXMgfHwgW107XG4gICAgfVxuXG4gICAgYWRkKGtleSwgaXRlbSwgb3JkZXIpIHtcbiAgICAgIHRoaXMuX2l0ZW1zLnB1c2goe1xuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgaXRlbTogaXRlbSxcblxuICAgICAgICBhZnRlcjogb3JkZXIgPyBvcmRlci5hZnRlciB8fCBudWxsIDogbnVsbCxcbiAgICAgICAgYmVmb3JlOiBvcmRlciA/IG9yZGVyLmJlZm9yZSB8fCBudWxsIDogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5faXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuX2l0ZW1zW2ldLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zW2ldLml0ZW07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldChrZXkpICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdmFsdWVzKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZXMucHVzaCh0aGlzLl9pdGVtc1tpXS5pdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgb3JkZXIodmFsdWVzX29ubHkpIHtcbiAgICAgIGlmICghdGhpcy5pc09yZGVyZWQpIHtcbiAgICAgICAgdGhpcy5faXRlbXMgPSB0aGlzLl9vcmRlcih0aGlzLl9pdGVtcyk7XG4gICAgICAgIHRoaXMuaXNPcmRlcmVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlc19vbmx5IHx8IHR5cGVvZiB2YWx1ZXNfb25seSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3JkZXJlZFZhbHVlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLm9yZGVyKHRydWUpO1xuICAgIH1cblxuICAgIF9vcmRlcih1bm9yZGVyZWQpIHtcbiAgICAgIC8vIEluZGV4IG9mIHVub3JkZXJlZCBpdGVtc1xuICAgICAgdmFyIGluZGV4ID0gW107XG4gICAgICB1bm9yZGVyZWQuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpbmRleC5wdXNoKGl0ZW0ua2V5KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBPcmRlcmVkIGl0ZW1zXG4gICAgICB2YXIgb3JkZXJlZCA9IFtdO1xuICAgICAgdmFyIG9yZGVyaW5nID0gW107XG5cbiAgICAgIC8vIEZpcnN0IHBhc3M6IHJlZ2lzdGVyIGl0ZW1zIHRoYXRcbiAgICAgIC8vIGRvbid0IHNwZWNpZnkgdGhlaXIgb3JkZXJcbiAgICAgIHVub3JkZXJlZC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGlmICghaXRlbS5hZnRlciAmJiAhaXRlbS5iZWZvcmUpIHtcbiAgICAgICAgICBvcmRlcmVkLnB1c2goaXRlbSk7XG4gICAgICAgICAgb3JkZXJpbmcucHVzaChpdGVtLmtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZWNvbmQgcGFzczogcmVnaXN0ZXIgaXRlbXMgdGhhdFxuICAgICAgLy8gc3BlY2lmeSB0aGVpciBiZWZvcmUgdG8gXCJfZW5kXCJcbiAgICAgIHVub3JkZXJlZC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtLmJlZm9yZSA9PT0gXCJfZW5kXCIpIHtcbiAgICAgICAgICBvcmRlcmVkLnB1c2goaXRlbSk7XG4gICAgICAgICAgb3JkZXJpbmcucHVzaChpdGVtLmtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGlyZCBwYXNzOiBrZWVwIGl0ZXJhdGluZyBpdGVtc1xuICAgICAgLy8gdW50aWwgd2UgaGl0IGl0ZXJhdGlvbnMgbGltaXQgb3IgZmluaXNoXG4gICAgICAvLyBvcmRlcmluZyBsaXN0XG4gICAgICBmdW5jdGlvbiBpbnNlcnRJdGVtKGl0ZW0pIHtcbiAgICAgICAgdmFyIGluc2VydEF0ID0gLTE7XG4gICAgICAgIGlmIChvcmRlcmluZy5pbmRleE9mKGl0ZW0ua2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICBpZiAoaXRlbS5hZnRlcikge1xuICAgICAgICAgICAgaW5zZXJ0QXQgPSBvcmRlcmluZy5pbmRleE9mKGl0ZW0uYWZ0ZXIpO1xuICAgICAgICAgICAgaWYgKGluc2VydEF0ICE9PSAtMSkge1xuICAgICAgICAgICAgICBpbnNlcnRBdCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5iZWZvcmUpIHtcbiAgICAgICAgICAgIGluc2VydEF0ID0gb3JkZXJpbmcuaW5kZXhPZihpdGVtLmJlZm9yZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGluc2VydEF0ICE9PSAtMSkge1xuICAgICAgICAgICAgb3JkZXJlZC5zcGxpY2UoaW5zZXJ0QXQsIDAsIGl0ZW0pO1xuICAgICAgICAgICAgb3JkZXJpbmcuc3BsaWNlKGluc2VydEF0LCAwLCBpdGVtLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBpdGVyYXRpb25zID0gMjAwO1xuICAgICAgd2hpbGUgKGl0ZXJhdGlvbnMgPiAwICYmIGluZGV4Lmxlbmd0aCAhPT0gb3JkZXJpbmcubGVuZ3RoKSB7XG4gICAgICAgIGl0ZXJhdGlvbnMgLT0gMTtcbiAgICAgICAgdW5vcmRlcmVkLmZvckVhY2goaW5zZXJ0SXRlbSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmRlcmVkO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBkZWZhdWx0IE9yZGVyZWRMaXN0O1xuIiwiY29uc3QgRU1BSUwgPSAvXigoW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXSsoXFwuW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFtePD4oKVtcXF1cXC4sOzpcXHNAXFxcIl0rXFwuKStbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdezIsfSkkL2k7XG5jb25zdCBVU0VSTkFNRSA9IG5ldyBSZWdFeHAoJ15bMC05YS16XSskJywgJ2knKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkKCkge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoJC50cmltKHZhbHVlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBnZXR0ZXh0KFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC5cIik7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1haWwobWVzc2FnZSkge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoIUVNQUlMLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZSB8fCBnZXR0ZXh0KFwiRW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLlwiKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaW5MZW5ndGgobGltaXRWYWx1ZSwgbWVzc2FnZSkge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmV0dXJuTWVzc2FnZSA9ICcnO1xuICAgIHZhciBsZW5ndGggPSAkLnRyaW0odmFsdWUpLmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPCBsaW1pdFZhbHVlKSB7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICByZXR1cm5NZXNzYWdlID0gbWVzc2FnZShsaW1pdFZhbHVlLCBsZW5ndGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuTWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICAgIFwiRW5zdXJlIHRoaXMgdmFsdWUgaGFzIGF0IGxlYXN0ICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXIgKGl0IGhhcyAlKHNob3dfdmFsdWUpcykuXCIsXG4gICAgICAgICAgXCJFbnN1cmUgdGhpcyB2YWx1ZSBoYXMgYXQgbGVhc3QgJShsaW1pdF92YWx1ZSlzIGNoYXJhY3RlcnMgKGl0IGhhcyAlKHNob3dfdmFsdWUpcykuXCIsXG4gICAgICAgICAgbGltaXRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUocmV0dXJuTWVzc2FnZSwge1xuICAgICAgICBsaW1pdF92YWx1ZTogbGltaXRWYWx1ZSxcbiAgICAgICAgc2hvd192YWx1ZTogbGVuZ3RoXG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXhMZW5ndGgobGltaXRWYWx1ZSwgbWVzc2FnZSkge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmV0dXJuTWVzc2FnZSA9ICcnO1xuICAgIHZhciBsZW5ndGggPSAkLnRyaW0odmFsdWUpLmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPiBsaW1pdFZhbHVlKSB7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICByZXR1cm5NZXNzYWdlID0gbWVzc2FnZShsaW1pdFZhbHVlLCBsZW5ndGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuTWVzc2FnZSA9IG5nZXR0ZXh0KFxuICAgICAgICAgIFwiRW5zdXJlIHRoaXMgdmFsdWUgaGFzIGF0IG1vc3QgJShsaW1pdF92YWx1ZSlzIGNoYXJhY3RlciAoaXQgaGFzICUoc2hvd192YWx1ZSlzKS5cIixcbiAgICAgICAgICBcIkVuc3VyZSB0aGlzIHZhbHVlIGhhcyBhdCBtb3N0ICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXJzIChpdCBoYXMgJShzaG93X3ZhbHVlKXMpLlwiLFxuICAgICAgICAgIGxpbWl0VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGludGVycG9sYXRlKHJldHVybk1lc3NhZ2UsIHtcbiAgICAgICAgbGltaXRfdmFsdWU6IGxpbWl0VmFsdWUsXG4gICAgICAgIHNob3dfdmFsdWU6IGxlbmd0aFxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlcm5hbWVNaW5MZW5ndGgoc2V0dGluZ3MpIHtcbiAgdmFyIG1lc3NhZ2UgPSBmdW5jdGlvbihsaW1pdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5nZXR0ZXh0KFxuICAgICAgXCJVc2VybmFtZSBtdXN0IGJlIGF0IGxlYXN0ICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXIgbG9uZy5cIixcbiAgICAgIFwiVXNlcm5hbWUgbXVzdCBiZSBhdCBsZWFzdCAlKGxpbWl0X3ZhbHVlKXMgY2hhcmFjdGVycyBsb25nLlwiLFxuICAgICAgbGltaXRWYWx1ZSk7XG4gIH07XG4gIHJldHVybiB0aGlzLm1pbkxlbmd0aChzZXR0aW5ncy51c2VybmFtZV9sZW5ndGhfbWluLCBtZXNzYWdlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZXJuYW1lTWF4TGVuZ3RoKHNldHRpbmdzKSB7XG4gIHZhciBtZXNzYWdlID0gZnVuY3Rpb24obGltaXRWYWx1ZSkge1xuICAgIHJldHVybiBuZ2V0dGV4dChcbiAgICAgIFwiVXNlcm5hbWUgY2Fubm90IGJlIGxvbmdlciB0aGFuICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXIuXCIsXG4gICAgICBcIlVzZXJuYW1lIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAlKGxpbWl0X3ZhbHVlKXMgY2hhcmFjdGVycy5cIixcbiAgICAgIGxpbWl0VmFsdWUpO1xuICB9O1xuICByZXR1cm4gdGhpcy5tYXhMZW5ndGgoc2V0dGluZ3MudXNlcm5hbWVfbGVuZ3RoX21heCwgbWVzc2FnZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VybmFtZUNvbnRlbnQoKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmICghVVNFUk5BTUUudGVzdCgkLnRyaW0odmFsdWUpKSkge1xuICAgICAgcmV0dXJuIGdldHRleHQoXCJVc2VybmFtZSBjYW4gb25seSBjb250YWluIGxhdGluIGFscGhhYmV0IGxldHRlcnMgYW5kIGRpZ2l0cy5cIik7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFzc3dvcmRNaW5MZW5ndGgoc2V0dGluZ3MpIHtcbiAgdmFyIG1lc3NhZ2UgPSBmdW5jdGlvbihsaW1pdFZhbHVlKSB7XG4gICAgcmV0dXJuIG5nZXR0ZXh0KFxuICAgICAgXCJWYWxpZCBwYXNzd29yZCBtdXN0IGJlIGF0IGxlYXN0ICUobGltaXRfdmFsdWUpcyBjaGFyYWN0ZXIgbG9uZy5cIixcbiAgICAgIFwiVmFsaWQgcGFzc3dvcmQgbXVzdCBiZSBhdCBsZWFzdCAlKGxpbWl0X3ZhbHVlKXMgY2hhcmFjdGVycyBsb25nLlwiLFxuICAgICAgbGltaXRWYWx1ZSk7XG4gIH07XG4gIHJldHVybiB0aGlzLm1pbkxlbmd0aChzZXR0aW5ncy5wYXNzd29yZF9sZW5ndGhfbWluLCBtZXNzYWdlKTtcbn0iXX0=